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/11/10 14:50:57 UTC

[01/29] hbase-site git commit: Published site at 5e84997f2ffdbcf5f849d70c30ddbe2db4039ca4.

Repository: hbase-site
Updated Branches:
  refs/heads/asf-site a19d669e4 -> 27f5bfb51


http://git-wip-us.apache.org/repos/asf/hbase-site/blob/27f5bfb5/testdevapidocs/src-html/org/apache/hadoop/hbase/zookeeper/TestZKMainServer.html
----------------------------------------------------------------------
diff --git a/testdevapidocs/src-html/org/apache/hadoop/hbase/zookeeper/TestZKMainServer.html b/testdevapidocs/src-html/org/apache/hadoop/hbase/zookeeper/TestZKMainServer.html
index 2dca6fc..75b0efa 100644
--- a/testdevapidocs/src-html/org/apache/hadoop/hbase/zookeeper/TestZKMainServer.html
+++ b/testdevapidocs/src-html/org/apache/hadoop/hbase/zookeeper/TestZKMainServer.html
@@ -36,101 +36,128 @@
 <span class="sourceLineNo">028</span>import org.apache.hadoop.hbase.HConstants;<a name="line.28"></a>
 <span class="sourceLineNo">029</span>import org.apache.hadoop.hbase.testclassification.SmallTests;<a name="line.29"></a>
 <span class="sourceLineNo">030</span>import org.apache.hadoop.hbase.testclassification.ZKTests;<a name="line.30"></a>
-<span class="sourceLineNo">031</span>import org.junit.ClassRule;<a name="line.31"></a>
-<span class="sourceLineNo">032</span>import org.junit.Test;<a name="line.32"></a>
-<span class="sourceLineNo">033</span>import org.junit.experimental.categories.Category;<a name="line.33"></a>
-<span class="sourceLineNo">034</span><a name="line.34"></a>
-<span class="sourceLineNo">035</span>@Category({ ZKTests.class, SmallTests.class })<a name="line.35"></a>
-<span class="sourceLineNo">036</span>public class TestZKMainServer {<a name="line.36"></a>
-<span class="sourceLineNo">037</span><a name="line.37"></a>
-<span class="sourceLineNo">038</span>  @ClassRule<a name="line.38"></a>
-<span class="sourceLineNo">039</span>  public static final HBaseClassTestRule CLASS_RULE =<a name="line.39"></a>
-<span class="sourceLineNo">040</span>      HBaseClassTestRule.forClass(TestZKMainServer.class);<a name="line.40"></a>
-<span class="sourceLineNo">041</span><a name="line.41"></a>
-<span class="sourceLineNo">042</span>  // ZKMS calls System.exit.  Catch the call and prevent exit using trick described up in<a name="line.42"></a>
-<span class="sourceLineNo">043</span>  // http://stackoverflow.com/questions/309396/java-how-to-test-methods-that-call-system-exit<a name="line.43"></a>
-<span class="sourceLineNo">044</span>  protected static class ExitException extends SecurityException {<a name="line.44"></a>
-<span class="sourceLineNo">045</span>    private static final long serialVersionUID = 1L;<a name="line.45"></a>
-<span class="sourceLineNo">046</span>    private final int status;<a name="line.46"></a>
-<span class="sourceLineNo">047</span>    public ExitException(int status) {<a name="line.47"></a>
-<span class="sourceLineNo">048</span>      super("There is no escape!");<a name="line.48"></a>
-<span class="sourceLineNo">049</span>      this.status = status;<a name="line.49"></a>
-<span class="sourceLineNo">050</span>    }<a name="line.50"></a>
-<span class="sourceLineNo">051</span>  }<a name="line.51"></a>
-<span class="sourceLineNo">052</span><a name="line.52"></a>
-<span class="sourceLineNo">053</span>  private static class NoExitSecurityManager extends SecurityManager {<a name="line.53"></a>
-<span class="sourceLineNo">054</span>    @Override<a name="line.54"></a>
-<span class="sourceLineNo">055</span>    public void checkPermission(Permission perm) {<a name="line.55"></a>
-<span class="sourceLineNo">056</span>      // allow anything.<a name="line.56"></a>
-<span class="sourceLineNo">057</span>    }<a name="line.57"></a>
-<span class="sourceLineNo">058</span><a name="line.58"></a>
-<span class="sourceLineNo">059</span>    @Override<a name="line.59"></a>
-<span class="sourceLineNo">060</span>    public void checkPermission(Permission perm, Object context) {<a name="line.60"></a>
-<span class="sourceLineNo">061</span>      // allow anything.<a name="line.61"></a>
-<span class="sourceLineNo">062</span>    }<a name="line.62"></a>
-<span class="sourceLineNo">063</span><a name="line.63"></a>
-<span class="sourceLineNo">064</span>    @Override<a name="line.64"></a>
-<span class="sourceLineNo">065</span>    public void checkExit(int status) {<a name="line.65"></a>
-<span class="sourceLineNo">066</span>      super.checkExit(status);<a name="line.66"></a>
-<span class="sourceLineNo">067</span>      throw new ExitException(status);<a name="line.67"></a>
-<span class="sourceLineNo">068</span>    }<a name="line.68"></a>
-<span class="sourceLineNo">069</span>  }<a name="line.69"></a>
-<span class="sourceLineNo">070</span><a name="line.70"></a>
-<span class="sourceLineNo">071</span>  /**<a name="line.71"></a>
-<span class="sourceLineNo">072</span>   * We need delete of a znode to work at least.<a name="line.72"></a>
-<span class="sourceLineNo">073</span>   */<a name="line.73"></a>
-<span class="sourceLineNo">074</span>  @Test<a name="line.74"></a>
-<span class="sourceLineNo">075</span>  public void testCommandLineWorks() throws Exception {<a name="line.75"></a>
-<span class="sourceLineNo">076</span>    System.setSecurityManager(new NoExitSecurityManager());<a name="line.76"></a>
-<span class="sourceLineNo">077</span>    HBaseZKTestingUtility htu = new HBaseZKTestingUtility();<a name="line.77"></a>
-<span class="sourceLineNo">078</span>    // Make it long so for sure succeeds.<a name="line.78"></a>
-<span class="sourceLineNo">079</span>    htu.getConfiguration().setInt(HConstants.ZK_SESSION_TIMEOUT, 30000);<a name="line.79"></a>
-<span class="sourceLineNo">080</span>    htu.startMiniZKCluster();<a name="line.80"></a>
-<span class="sourceLineNo">081</span>    try {<a name="line.81"></a>
-<span class="sourceLineNo">082</span>      ZKWatcher zkw = htu.getZooKeeperWatcher();<a name="line.82"></a>
-<span class="sourceLineNo">083</span>      String znode = "/testCommandLineWorks";<a name="line.83"></a>
-<span class="sourceLineNo">084</span>      ZKUtil.createWithParents(zkw, znode, HConstants.EMPTY_BYTE_ARRAY);<a name="line.84"></a>
-<span class="sourceLineNo">085</span>      ZKUtil.checkExists(zkw, znode);<a name="line.85"></a>
-<span class="sourceLineNo">086</span>      boolean exception = false;<a name="line.86"></a>
-<span class="sourceLineNo">087</span>      try {<a name="line.87"></a>
-<span class="sourceLineNo">088</span>        ZKMainServer.main(new String [] {"-server",<a name="line.88"></a>
-<span class="sourceLineNo">089</span>          "localhost:" + htu.getZkCluster().getClientPort(), "delete", znode});<a name="line.89"></a>
-<span class="sourceLineNo">090</span>      } catch (ExitException ee) {<a name="line.90"></a>
-<span class="sourceLineNo">091</span>        // ZKMS calls System.exit which should trigger this exception.<a name="line.91"></a>
-<span class="sourceLineNo">092</span>        exception = true;<a name="line.92"></a>
-<span class="sourceLineNo">093</span>      }<a name="line.93"></a>
-<span class="sourceLineNo">094</span>      assertTrue(exception);<a name="line.94"></a>
-<span class="sourceLineNo">095</span>      assertEquals(-1, ZKUtil.checkExists(zkw, znode));<a name="line.95"></a>
-<span class="sourceLineNo">096</span>    } finally {<a name="line.96"></a>
-<span class="sourceLineNo">097</span>      htu.shutdownMiniZKCluster();<a name="line.97"></a>
-<span class="sourceLineNo">098</span>      System.setSecurityManager(null); // or save and restore original<a name="line.98"></a>
-<span class="sourceLineNo">099</span>    }<a name="line.99"></a>
-<span class="sourceLineNo">100</span>  }<a name="line.100"></a>
-<span class="sourceLineNo">101</span><a name="line.101"></a>
-<span class="sourceLineNo">102</span>  @Test<a name="line.102"></a>
-<span class="sourceLineNo">103</span>  public void testHostPortParse() {<a name="line.103"></a>
-<span class="sourceLineNo">104</span>    ZKMainServer parser = new ZKMainServer();<a name="line.104"></a>
-<span class="sourceLineNo">105</span>    Configuration c = HBaseConfiguration.create();<a name="line.105"></a>
-<span class="sourceLineNo">106</span>    assertEquals("localhost:" + c.get(HConstants.ZOOKEEPER_CLIENT_PORT), parser.parse(c));<a name="line.106"></a>
-<span class="sourceLineNo">107</span>    final String port = "1234";<a name="line.107"></a>
-<span class="sourceLineNo">108</span>    c.set(HConstants.ZOOKEEPER_CLIENT_PORT, port);<a name="line.108"></a>
-<span class="sourceLineNo">109</span>    c.set("hbase.zookeeper.quorum", "example.com");<a name="line.109"></a>
-<span class="sourceLineNo">110</span>    assertEquals("example.com:" + port, parser.parse(c));<a name="line.110"></a>
-<span class="sourceLineNo">111</span>    c.set("hbase.zookeeper.quorum", "example1.com,example2.com,example3.com");<a name="line.111"></a>
-<span class="sourceLineNo">112</span>    String ensemble = parser.parse(c);<a name="line.112"></a>
-<span class="sourceLineNo">113</span>    assertTrue(port, ensemble.matches("(example[1-3]\\.com:1234,){2}example[1-3]\\.com:" + port));<a name="line.113"></a>
-<span class="sourceLineNo">114</span><a name="line.114"></a>
-<span class="sourceLineNo">115</span>    // multiple servers with its own port<a name="line.115"></a>
-<span class="sourceLineNo">116</span>    c.set("hbase.zookeeper.quorum", "example1.com:5678,example2.com:9012,example3.com:3456");<a name="line.116"></a>
-<span class="sourceLineNo">117</span>    ensemble = parser.parse(c);<a name="line.117"></a>
-<span class="sourceLineNo">118</span>    assertEquals(ensemble, "example1.com:5678,example2.com:9012,example3.com:3456");<a name="line.118"></a>
-<span class="sourceLineNo">119</span><a name="line.119"></a>
-<span class="sourceLineNo">120</span>    // some servers without its own port, which will be assigned the default client port<a name="line.120"></a>
-<span class="sourceLineNo">121</span>    c.set("hbase.zookeeper.quorum", "example1.com:5678,example2.com:9012,example3.com");<a name="line.121"></a>
-<span class="sourceLineNo">122</span>    ensemble = parser.parse(c);<a name="line.122"></a>
-<span class="sourceLineNo">123</span>    assertEquals(ensemble, "example1.com:5678,example2.com:9012,example3.com:" + port);<a name="line.123"></a>
-<span class="sourceLineNo">124</span>  }<a name="line.124"></a>
-<span class="sourceLineNo">125</span>}<a name="line.125"></a>
+<span class="sourceLineNo">031</span>import org.junit.Assert;<a name="line.31"></a>
+<span class="sourceLineNo">032</span>import org.junit.ClassRule;<a name="line.32"></a>
+<span class="sourceLineNo">033</span>import org.junit.Test;<a name="line.33"></a>
+<span class="sourceLineNo">034</span>import org.junit.experimental.categories.Category;<a name="line.34"></a>
+<span class="sourceLineNo">035</span><a name="line.35"></a>
+<span class="sourceLineNo">036</span>@Category({ ZKTests.class, SmallTests.class })<a name="line.36"></a>
+<span class="sourceLineNo">037</span>public class TestZKMainServer {<a name="line.37"></a>
+<span class="sourceLineNo">038</span><a name="line.38"></a>
+<span class="sourceLineNo">039</span>  @ClassRule<a name="line.39"></a>
+<span class="sourceLineNo">040</span>  public static final HBaseClassTestRule CLASS_RULE =<a name="line.40"></a>
+<span class="sourceLineNo">041</span>      HBaseClassTestRule.forClass(TestZKMainServer.class);<a name="line.41"></a>
+<span class="sourceLineNo">042</span><a name="line.42"></a>
+<span class="sourceLineNo">043</span>  // ZKMS calls System.exit.  Catch the call and prevent exit using trick described up in<a name="line.43"></a>
+<span class="sourceLineNo">044</span>  // http://stackoverflow.com/questions/309396/java-how-to-test-methods-that-call-system-exit<a name="line.44"></a>
+<span class="sourceLineNo">045</span>  protected static class ExitException extends SecurityException {<a name="line.45"></a>
+<span class="sourceLineNo">046</span>    private static final long serialVersionUID = 1L;<a name="line.46"></a>
+<span class="sourceLineNo">047</span>    private final int status;<a name="line.47"></a>
+<span class="sourceLineNo">048</span>    public ExitException(int status) {<a name="line.48"></a>
+<span class="sourceLineNo">049</span>      super("There is no escape!");<a name="line.49"></a>
+<span class="sourceLineNo">050</span>      this.status = status;<a name="line.50"></a>
+<span class="sourceLineNo">051</span>    }<a name="line.51"></a>
+<span class="sourceLineNo">052</span>  }<a name="line.52"></a>
+<span class="sourceLineNo">053</span><a name="line.53"></a>
+<span class="sourceLineNo">054</span>  private static class NoExitSecurityManager extends SecurityManager {<a name="line.54"></a>
+<span class="sourceLineNo">055</span>    @Override<a name="line.55"></a>
+<span class="sourceLineNo">056</span>    public void checkPermission(Permission perm) {<a name="line.56"></a>
+<span class="sourceLineNo">057</span>      // allow anything.<a name="line.57"></a>
+<span class="sourceLineNo">058</span>    }<a name="line.58"></a>
+<span class="sourceLineNo">059</span><a name="line.59"></a>
+<span class="sourceLineNo">060</span>    @Override<a name="line.60"></a>
+<span class="sourceLineNo">061</span>    public void checkPermission(Permission perm, Object context) {<a name="line.61"></a>
+<span class="sourceLineNo">062</span>      // allow anything.<a name="line.62"></a>
+<span class="sourceLineNo">063</span>    }<a name="line.63"></a>
+<span class="sourceLineNo">064</span><a name="line.64"></a>
+<span class="sourceLineNo">065</span>    @Override<a name="line.65"></a>
+<span class="sourceLineNo">066</span>    public void checkExit(int status) {<a name="line.66"></a>
+<span class="sourceLineNo">067</span>      super.checkExit(status);<a name="line.67"></a>
+<span class="sourceLineNo">068</span>      throw new ExitException(status);<a name="line.68"></a>
+<span class="sourceLineNo">069</span>    }<a name="line.69"></a>
+<span class="sourceLineNo">070</span>  }<a name="line.70"></a>
+<span class="sourceLineNo">071</span><a name="line.71"></a>
+<span class="sourceLineNo">072</span>  /**<a name="line.72"></a>
+<span class="sourceLineNo">073</span>   * We need delete of a znode to work at least.<a name="line.73"></a>
+<span class="sourceLineNo">074</span>   */<a name="line.74"></a>
+<span class="sourceLineNo">075</span>  @Test<a name="line.75"></a>
+<span class="sourceLineNo">076</span>  public void testCommandLineWorks() throws Exception {<a name="line.76"></a>
+<span class="sourceLineNo">077</span>    System.setSecurityManager(new NoExitSecurityManager());<a name="line.77"></a>
+<span class="sourceLineNo">078</span>    HBaseZKTestingUtility htu = new HBaseZKTestingUtility();<a name="line.78"></a>
+<span class="sourceLineNo">079</span>    // Make it long so for sure succeeds.<a name="line.79"></a>
+<span class="sourceLineNo">080</span>    htu.getConfiguration().setInt(HConstants.ZK_SESSION_TIMEOUT, 30000);<a name="line.80"></a>
+<span class="sourceLineNo">081</span>    htu.startMiniZKCluster();<a name="line.81"></a>
+<span class="sourceLineNo">082</span>    try {<a name="line.82"></a>
+<span class="sourceLineNo">083</span>      ZKWatcher zkw = htu.getZooKeeperWatcher();<a name="line.83"></a>
+<span class="sourceLineNo">084</span>      String znode = "/testCommandLineWorks";<a name="line.84"></a>
+<span class="sourceLineNo">085</span>      ZKUtil.createWithParents(zkw, znode, HConstants.EMPTY_BYTE_ARRAY);<a name="line.85"></a>
+<span class="sourceLineNo">086</span>      ZKUtil.checkExists(zkw, znode);<a name="line.86"></a>
+<span class="sourceLineNo">087</span>      boolean exception = false;<a name="line.87"></a>
+<span class="sourceLineNo">088</span>      try {<a name="line.88"></a>
+<span class="sourceLineNo">089</span>        ZKMainServer.main(new String [] {"-server",<a name="line.89"></a>
+<span class="sourceLineNo">090</span>          "localhost:" + htu.getZkCluster().getClientPort(), "delete", znode});<a name="line.90"></a>
+<span class="sourceLineNo">091</span>      } catch (ExitException ee) {<a name="line.91"></a>
+<span class="sourceLineNo">092</span>        // ZKMS calls System.exit which should trigger this exception.<a name="line.92"></a>
+<span class="sourceLineNo">093</span>        exception = true;<a name="line.93"></a>
+<span class="sourceLineNo">094</span>      }<a name="line.94"></a>
+<span class="sourceLineNo">095</span>      assertTrue(exception);<a name="line.95"></a>
+<span class="sourceLineNo">096</span>      assertEquals(-1, ZKUtil.checkExists(zkw, znode));<a name="line.96"></a>
+<span class="sourceLineNo">097</span>    } finally {<a name="line.97"></a>
+<span class="sourceLineNo">098</span>      htu.shutdownMiniZKCluster();<a name="line.98"></a>
+<span class="sourceLineNo">099</span>      System.setSecurityManager(null); // or save and restore original<a name="line.99"></a>
+<span class="sourceLineNo">100</span>    }<a name="line.100"></a>
+<span class="sourceLineNo">101</span>  }<a name="line.101"></a>
+<span class="sourceLineNo">102</span><a name="line.102"></a>
+<span class="sourceLineNo">103</span>  @Test<a name="line.103"></a>
+<span class="sourceLineNo">104</span>  public void testHostPortParse() {<a name="line.104"></a>
+<span class="sourceLineNo">105</span>    ZKMainServer parser = new ZKMainServer();<a name="line.105"></a>
+<span class="sourceLineNo">106</span>    Configuration c = HBaseConfiguration.create();<a name="line.106"></a>
+<span class="sourceLineNo">107</span>    assertEquals("localhost:" + c.get(HConstants.ZOOKEEPER_CLIENT_PORT), parser.parse(c));<a name="line.107"></a>
+<span class="sourceLineNo">108</span>    final String port = "1234";<a name="line.108"></a>
+<span class="sourceLineNo">109</span>    c.set(HConstants.ZOOKEEPER_CLIENT_PORT, port);<a name="line.109"></a>
+<span class="sourceLineNo">110</span>    c.set("hbase.zookeeper.quorum", "example.com");<a name="line.110"></a>
+<span class="sourceLineNo">111</span>    assertEquals("example.com:" + port, parser.parse(c));<a name="line.111"></a>
+<span class="sourceLineNo">112</span>    c.set("hbase.zookeeper.quorum", "example1.com,example2.com,example3.com");<a name="line.112"></a>
+<span class="sourceLineNo">113</span>    String ensemble = parser.parse(c);<a name="line.113"></a>
+<span class="sourceLineNo">114</span>    assertTrue(port, ensemble.matches("(example[1-3]\\.com:1234,){2}example[1-3]\\.com:" + port));<a name="line.114"></a>
+<span class="sourceLineNo">115</span><a name="line.115"></a>
+<span class="sourceLineNo">116</span>    // multiple servers with its own port<a name="line.116"></a>
+<span class="sourceLineNo">117</span>    c.set("hbase.zookeeper.quorum", "example1.com:5678,example2.com:9012,example3.com:3456");<a name="line.117"></a>
+<span class="sourceLineNo">118</span>    ensemble = parser.parse(c);<a name="line.118"></a>
+<span class="sourceLineNo">119</span>    assertEquals(ensemble, "example1.com:5678,example2.com:9012,example3.com:3456");<a name="line.119"></a>
+<span class="sourceLineNo">120</span><a name="line.120"></a>
+<span class="sourceLineNo">121</span>    // some servers without its own port, which will be assigned the default client port<a name="line.121"></a>
+<span class="sourceLineNo">122</span>    c.set("hbase.zookeeper.quorum", "example1.com:5678,example2.com:9012,example3.com");<a name="line.122"></a>
+<span class="sourceLineNo">123</span>    ensemble = parser.parse(c);<a name="line.123"></a>
+<span class="sourceLineNo">124</span>    assertEquals(ensemble, "example1.com:5678,example2.com:9012,example3.com:" + port);<a name="line.124"></a>
+<span class="sourceLineNo">125</span><a name="line.125"></a>
+<span class="sourceLineNo">126</span>    // multiple servers(IPv6) with its own port<a name="line.126"></a>
+<span class="sourceLineNo">127</span>    c.set("hbase.zookeeper.quorum", "[2001:db8:1::242:ac11:2]:2181," +<a name="line.127"></a>
+<span class="sourceLineNo">128</span>                                    "[2001:db8:1::242:ac11:3]:5678");<a name="line.128"></a>
+<span class="sourceLineNo">129</span>    ensemble = parser.parse(c);<a name="line.129"></a>
+<span class="sourceLineNo">130</span>    assertEquals("[2001:db8:1::242:ac11:2]:2181," +<a name="line.130"></a>
+<span class="sourceLineNo">131</span>                 "[2001:db8:1::242:ac11:3]:5678", ensemble);<a name="line.131"></a>
+<span class="sourceLineNo">132</span><a name="line.132"></a>
+<span class="sourceLineNo">133</span>    // some servers(IPv6) without its own port, which will be assigned the default client port<a name="line.133"></a>
+<span class="sourceLineNo">134</span>    c.set("hbase.zookeeper.quorum", "[1001:db8:1::242:ac11:8], [2001:db8:1::242:df23:2]:9876," +<a name="line.134"></a>
+<span class="sourceLineNo">135</span>                                    "[2001:db8:1::242:ac11:3]:5678");<a name="line.135"></a>
+<span class="sourceLineNo">136</span>    ensemble = parser.parse(c);<a name="line.136"></a>
+<span class="sourceLineNo">137</span>    assertEquals("[1001:db8:1::242:ac11:8]:1234, [2001:db8:1::242:df23:2]:9876," +<a name="line.137"></a>
+<span class="sourceLineNo">138</span>                 "[2001:db8:1::242:ac11:3]:5678", ensemble);<a name="line.138"></a>
+<span class="sourceLineNo">139</span><a name="line.139"></a>
+<span class="sourceLineNo">140</span>    //a bad case<a name="line.140"></a>
+<span class="sourceLineNo">141</span>    try {<a name="line.141"></a>
+<span class="sourceLineNo">142</span>      // some servers(IPv6) with an invaild Ipv6 address in it<a name="line.142"></a>
+<span class="sourceLineNo">143</span>      c.set("hbase.zookeeper.quorum", "[1001:db8:1::242:ac11:8], [2001:db8:1::242:df23:2]:9876," +<a name="line.143"></a>
+<span class="sourceLineNo">144</span>              "[1001:db8:1::242:ac11:8:89:67]:5678");<a name="line.144"></a>
+<span class="sourceLineNo">145</span>      ensemble = parser.parse(c);<a name="line.145"></a>
+<span class="sourceLineNo">146</span>      Assert.fail("IPv6 address should be 8 groups.");<a name="line.146"></a>
+<span class="sourceLineNo">147</span>    } catch (IllegalArgumentException e) {<a name="line.147"></a>
+<span class="sourceLineNo">148</span>      //expected<a name="line.148"></a>
+<span class="sourceLineNo">149</span>    }<a name="line.149"></a>
+<span class="sourceLineNo">150</span><a name="line.150"></a>
+<span class="sourceLineNo">151</span>  }<a name="line.151"></a>
+<span class="sourceLineNo">152</span>}<a name="line.152"></a>
 
 
 


[07/29] hbase-site git commit: Published site at 5e84997f2ffdbcf5f849d70c30ddbe2db4039ca4.

Posted by gi...@apache.org.
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/27f5bfb5/testdevapidocs/src-html/org/apache/hadoop/hbase/procedure2/TestProcedureBypass.StuckProcedure.html
----------------------------------------------------------------------
diff --git a/testdevapidocs/src-html/org/apache/hadoop/hbase/procedure2/TestProcedureBypass.StuckProcedure.html b/testdevapidocs/src-html/org/apache/hadoop/hbase/procedure2/TestProcedureBypass.StuckProcedure.html
index 7eb899a..f89b826 100644
--- a/testdevapidocs/src-html/org/apache/hadoop/hbase/procedure2/TestProcedureBypass.StuckProcedure.html
+++ b/testdevapidocs/src-html/org/apache/hadoop/hbase/procedure2/TestProcedureBypass.StuckProcedure.html
@@ -46,226 +46,262 @@
 <span class="sourceLineNo">038</span>import org.slf4j.Logger;<a name="line.38"></a>
 <span class="sourceLineNo">039</span>import org.slf4j.LoggerFactory;<a name="line.39"></a>
 <span class="sourceLineNo">040</span><a name="line.40"></a>
-<span class="sourceLineNo">041</span><a name="line.41"></a>
+<span class="sourceLineNo">041</span>import org.apache.hadoop.hbase.shaded.protobuf.generated.ProcedureProtos;<a name="line.41"></a>
 <span class="sourceLineNo">042</span><a name="line.42"></a>
-<span class="sourceLineNo">043</span>@Category({MasterTests.class, SmallTests.class})<a name="line.43"></a>
-<span class="sourceLineNo">044</span>public class TestProcedureBypass {<a name="line.44"></a>
-<span class="sourceLineNo">045</span><a name="line.45"></a>
-<span class="sourceLineNo">046</span>  @ClassRule public static final HBaseClassTestRule CLASS_RULE = HBaseClassTestRule<a name="line.46"></a>
-<span class="sourceLineNo">047</span>      .forClass(TestProcedureBypass.class);<a name="line.47"></a>
-<span class="sourceLineNo">048</span><a name="line.48"></a>
-<span class="sourceLineNo">049</span>  private static final Logger LOG = LoggerFactory.getLogger(TestProcedureBypass.class);<a name="line.49"></a>
-<span class="sourceLineNo">050</span><a name="line.50"></a>
-<span class="sourceLineNo">051</span>  private static final int PROCEDURE_EXECUTOR_SLOTS = 1;<a name="line.51"></a>
-<span class="sourceLineNo">052</span><a name="line.52"></a>
-<span class="sourceLineNo">053</span>  private static TestProcEnv procEnv;<a name="line.53"></a>
-<span class="sourceLineNo">054</span>  private static ProcedureStore procStore;<a name="line.54"></a>
-<span class="sourceLineNo">055</span><a name="line.55"></a>
-<span class="sourceLineNo">056</span>  private static ProcedureExecutor&lt;TestProcEnv&gt; procExecutor;<a name="line.56"></a>
-<span class="sourceLineNo">057</span><a name="line.57"></a>
-<span class="sourceLineNo">058</span>  private static HBaseCommonTestingUtility htu;<a name="line.58"></a>
-<span class="sourceLineNo">059</span><a name="line.59"></a>
-<span class="sourceLineNo">060</span>  private static FileSystem fs;<a name="line.60"></a>
-<span class="sourceLineNo">061</span>  private static Path testDir;<a name="line.61"></a>
-<span class="sourceLineNo">062</span>  private static Path logDir;<a name="line.62"></a>
-<span class="sourceLineNo">063</span><a name="line.63"></a>
-<span class="sourceLineNo">064</span>  private static class TestProcEnv {<a name="line.64"></a>
-<span class="sourceLineNo">065</span>  }<a name="line.65"></a>
-<span class="sourceLineNo">066</span><a name="line.66"></a>
-<span class="sourceLineNo">067</span>  @BeforeClass<a name="line.67"></a>
-<span class="sourceLineNo">068</span>  public static void setUp() throws Exception {<a name="line.68"></a>
-<span class="sourceLineNo">069</span>    htu = new HBaseCommonTestingUtility();<a name="line.69"></a>
-<span class="sourceLineNo">070</span><a name="line.70"></a>
-<span class="sourceLineNo">071</span>    // NOTE: The executor will be created by each test<a name="line.71"></a>
-<span class="sourceLineNo">072</span>    procEnv = new TestProcEnv();<a name="line.72"></a>
-<span class="sourceLineNo">073</span>    testDir = htu.getDataTestDir();<a name="line.73"></a>
-<span class="sourceLineNo">074</span>    fs = testDir.getFileSystem(htu.getConfiguration());<a name="line.74"></a>
-<span class="sourceLineNo">075</span>    assertTrue(testDir.depth() &gt; 1);<a name="line.75"></a>
-<span class="sourceLineNo">076</span><a name="line.76"></a>
-<span class="sourceLineNo">077</span>    logDir = new Path(testDir, "proc-logs");<a name="line.77"></a>
-<span class="sourceLineNo">078</span>    procStore = ProcedureTestingUtility.createWalStore(htu.getConfiguration(), logDir);<a name="line.78"></a>
-<span class="sourceLineNo">079</span>    procExecutor = new ProcedureExecutor&lt;&gt;(htu.getConfiguration(), procEnv,<a name="line.79"></a>
-<span class="sourceLineNo">080</span>        procStore);<a name="line.80"></a>
-<span class="sourceLineNo">081</span>    procStore.start(PROCEDURE_EXECUTOR_SLOTS);<a name="line.81"></a>
-<span class="sourceLineNo">082</span>    ProcedureTestingUtility<a name="line.82"></a>
-<span class="sourceLineNo">083</span>        .initAndStartWorkers(procExecutor, PROCEDURE_EXECUTOR_SLOTS, true);<a name="line.83"></a>
-<span class="sourceLineNo">084</span>  }<a name="line.84"></a>
-<span class="sourceLineNo">085</span><a name="line.85"></a>
-<span class="sourceLineNo">086</span>  @Test<a name="line.86"></a>
-<span class="sourceLineNo">087</span>  public void testBypassSuspendProcedure() throws Exception {<a name="line.87"></a>
-<span class="sourceLineNo">088</span>    final SuspendProcedure proc = new SuspendProcedure();<a name="line.88"></a>
-<span class="sourceLineNo">089</span>    long id = procExecutor.submitProcedure(proc);<a name="line.89"></a>
-<span class="sourceLineNo">090</span>    Thread.sleep(500);<a name="line.90"></a>
-<span class="sourceLineNo">091</span>    //bypass the procedure<a name="line.91"></a>
-<span class="sourceLineNo">092</span>    assertTrue(procExecutor.bypassProcedure(id, 30000, false, false));<a name="line.92"></a>
-<span class="sourceLineNo">093</span>    htu.waitFor(5000, () -&gt; proc.isSuccess() &amp;&amp; proc.isBypass());<a name="line.93"></a>
-<span class="sourceLineNo">094</span>    LOG.info("{} finished", proc);<a name="line.94"></a>
-<span class="sourceLineNo">095</span>  }<a name="line.95"></a>
-<span class="sourceLineNo">096</span><a name="line.96"></a>
-<span class="sourceLineNo">097</span>  @Test<a name="line.97"></a>
-<span class="sourceLineNo">098</span>  public void testStuckProcedure() throws Exception {<a name="line.98"></a>
-<span class="sourceLineNo">099</span>    final StuckProcedure proc = new StuckProcedure();<a name="line.99"></a>
-<span class="sourceLineNo">100</span>    long id = procExecutor.submitProcedure(proc);<a name="line.100"></a>
-<span class="sourceLineNo">101</span>    Thread.sleep(500);<a name="line.101"></a>
-<span class="sourceLineNo">102</span>    //bypass the procedure<a name="line.102"></a>
-<span class="sourceLineNo">103</span>    assertTrue(procExecutor.bypassProcedure(id, 1000, true, false));<a name="line.103"></a>
-<span class="sourceLineNo">104</span>    //Since the procedure is stuck there, we need to restart the executor to recovery.<a name="line.104"></a>
-<span class="sourceLineNo">105</span>    ProcedureTestingUtility.restart(procExecutor);<a name="line.105"></a>
-<span class="sourceLineNo">106</span>    htu.waitFor(5000, () -&gt; proc.isSuccess() &amp;&amp; proc.isBypass());<a name="line.106"></a>
-<span class="sourceLineNo">107</span>    LOG.info("{} finished", proc);<a name="line.107"></a>
-<span class="sourceLineNo">108</span>  }<a name="line.108"></a>
-<span class="sourceLineNo">109</span><a name="line.109"></a>
-<span class="sourceLineNo">110</span>  @Test<a name="line.110"></a>
-<span class="sourceLineNo">111</span>  public void testBypassingProcedureWithParent() throws Exception {<a name="line.111"></a>
-<span class="sourceLineNo">112</span>    final RootProcedure proc = new RootProcedure();<a name="line.112"></a>
-<span class="sourceLineNo">113</span>    long rootId = procExecutor.submitProcedure(proc);<a name="line.113"></a>
-<span class="sourceLineNo">114</span>    htu.waitFor(5000, () -&gt; procExecutor.getProcedures().stream()<a name="line.114"></a>
-<span class="sourceLineNo">115</span>      .filter(p -&gt; p.getParentProcId() == rootId).collect(Collectors.toList())<a name="line.115"></a>
-<span class="sourceLineNo">116</span>      .size() &gt; 0);<a name="line.116"></a>
-<span class="sourceLineNo">117</span>    SuspendProcedure suspendProcedure = (SuspendProcedure)procExecutor.getProcedures().stream()<a name="line.117"></a>
-<span class="sourceLineNo">118</span>        .filter(p -&gt; p.getParentProcId() == rootId).collect(Collectors.toList()).get(0);<a name="line.118"></a>
-<span class="sourceLineNo">119</span>    assertTrue(procExecutor.bypassProcedure(suspendProcedure.getProcId(), 1000, false, false));<a name="line.119"></a>
-<span class="sourceLineNo">120</span>    htu.waitFor(5000, () -&gt; proc.isSuccess() &amp;&amp; proc.isBypass());<a name="line.120"></a>
-<span class="sourceLineNo">121</span>    LOG.info("{} finished", proc);<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 testBypassingStuckStateMachineProcedure() throws Exception {<a name="line.125"></a>
-<span class="sourceLineNo">126</span>    final StuckStateMachineProcedure proc =<a name="line.126"></a>
-<span class="sourceLineNo">127</span>        new StuckStateMachineProcedure(procEnv, StuckStateMachineState.START);<a name="line.127"></a>
-<span class="sourceLineNo">128</span>    long id = procExecutor.submitProcedure(proc);<a name="line.128"></a>
-<span class="sourceLineNo">129</span>    Thread.sleep(500);<a name="line.129"></a>
-<span class="sourceLineNo">130</span>    // bypass the procedure<a name="line.130"></a>
-<span class="sourceLineNo">131</span>    assertFalse(procExecutor.bypassProcedure(id, 1000, false, false));<a name="line.131"></a>
-<span class="sourceLineNo">132</span>    assertTrue(procExecutor.bypassProcedure(id, 1000, true, false));<a name="line.132"></a>
-<span class="sourceLineNo">133</span><a name="line.133"></a>
-<span class="sourceLineNo">134</span>    htu.waitFor(5000, () -&gt; proc.isSuccess() &amp;&amp; proc.isBypass());<a name="line.134"></a>
-<span class="sourceLineNo">135</span>    LOG.info("{} finished", proc);<a name="line.135"></a>
-<span class="sourceLineNo">136</span>  }<a name="line.136"></a>
-<span class="sourceLineNo">137</span><a name="line.137"></a>
-<span class="sourceLineNo">138</span>  @Test<a name="line.138"></a>
-<span class="sourceLineNo">139</span>  public void testBypassingProcedureWithParentRecursive() throws Exception {<a name="line.139"></a>
-<span class="sourceLineNo">140</span>    final RootProcedure proc = new RootProcedure();<a name="line.140"></a>
-<span class="sourceLineNo">141</span>    long rootId = procExecutor.submitProcedure(proc);<a name="line.141"></a>
-<span class="sourceLineNo">142</span>    htu.waitFor(5000, () -&gt; procExecutor.getProcedures().stream()<a name="line.142"></a>
-<span class="sourceLineNo">143</span>        .filter(p -&gt; p.getParentProcId() == rootId).collect(Collectors.toList())<a name="line.143"></a>
-<span class="sourceLineNo">144</span>        .size() &gt; 0);<a name="line.144"></a>
-<span class="sourceLineNo">145</span>    SuspendProcedure suspendProcedure = (SuspendProcedure)procExecutor.getProcedures().stream()<a name="line.145"></a>
-<span class="sourceLineNo">146</span>        .filter(p -&gt; p.getParentProcId() == rootId).collect(Collectors.toList()).get(0);<a name="line.146"></a>
-<span class="sourceLineNo">147</span>    assertTrue(procExecutor.bypassProcedure(rootId, 1000, false, true));<a name="line.147"></a>
-<span class="sourceLineNo">148</span>    htu.waitFor(5000, () -&gt; proc.isSuccess() &amp;&amp; proc.isBypass());<a name="line.148"></a>
-<span class="sourceLineNo">149</span>    LOG.info("{} finished", proc);<a name="line.149"></a>
-<span class="sourceLineNo">150</span>  }<a name="line.150"></a>
-<span class="sourceLineNo">151</span><a name="line.151"></a>
-<span class="sourceLineNo">152</span>  @AfterClass<a name="line.152"></a>
-<span class="sourceLineNo">153</span>  public static void tearDown() throws Exception {<a name="line.153"></a>
-<span class="sourceLineNo">154</span>    procExecutor.stop();<a name="line.154"></a>
-<span class="sourceLineNo">155</span>    procStore.stop(false);<a name="line.155"></a>
-<span class="sourceLineNo">156</span>    procExecutor.join();<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>  public static class SuspendProcedure extends ProcedureTestingUtility.NoopProcedure&lt;TestProcEnv&gt; {<a name="line.159"></a>
+<span class="sourceLineNo">043</span><a name="line.43"></a>
+<span class="sourceLineNo">044</span>@Category({MasterTests.class, SmallTests.class})<a name="line.44"></a>
+<span class="sourceLineNo">045</span>public class TestProcedureBypass {<a name="line.45"></a>
+<span class="sourceLineNo">046</span><a name="line.46"></a>
+<span class="sourceLineNo">047</span>  @ClassRule public static final HBaseClassTestRule CLASS_RULE = HBaseClassTestRule<a name="line.47"></a>
+<span class="sourceLineNo">048</span>      .forClass(TestProcedureBypass.class);<a name="line.48"></a>
+<span class="sourceLineNo">049</span><a name="line.49"></a>
+<span class="sourceLineNo">050</span>  private static final Logger LOG = LoggerFactory.getLogger(TestProcedureBypass.class);<a name="line.50"></a>
+<span class="sourceLineNo">051</span><a name="line.51"></a>
+<span class="sourceLineNo">052</span>  private static final int PROCEDURE_EXECUTOR_SLOTS = 1;<a name="line.52"></a>
+<span class="sourceLineNo">053</span><a name="line.53"></a>
+<span class="sourceLineNo">054</span>  private static TestProcEnv procEnv;<a name="line.54"></a>
+<span class="sourceLineNo">055</span>  private static ProcedureStore procStore;<a name="line.55"></a>
+<span class="sourceLineNo">056</span><a name="line.56"></a>
+<span class="sourceLineNo">057</span>  private static ProcedureExecutor&lt;TestProcEnv&gt; procExecutor;<a name="line.57"></a>
+<span class="sourceLineNo">058</span><a name="line.58"></a>
+<span class="sourceLineNo">059</span>  private static HBaseCommonTestingUtility htu;<a name="line.59"></a>
+<span class="sourceLineNo">060</span><a name="line.60"></a>
+<span class="sourceLineNo">061</span>  private static FileSystem fs;<a name="line.61"></a>
+<span class="sourceLineNo">062</span>  private static Path testDir;<a name="line.62"></a>
+<span class="sourceLineNo">063</span>  private static Path logDir;<a name="line.63"></a>
+<span class="sourceLineNo">064</span><a name="line.64"></a>
+<span class="sourceLineNo">065</span>  private static class TestProcEnv {<a name="line.65"></a>
+<span class="sourceLineNo">066</span>  }<a name="line.66"></a>
+<span class="sourceLineNo">067</span><a name="line.67"></a>
+<span class="sourceLineNo">068</span>  @BeforeClass<a name="line.68"></a>
+<span class="sourceLineNo">069</span>  public static void setUp() throws Exception {<a name="line.69"></a>
+<span class="sourceLineNo">070</span>    htu = new HBaseCommonTestingUtility();<a name="line.70"></a>
+<span class="sourceLineNo">071</span><a name="line.71"></a>
+<span class="sourceLineNo">072</span>    // NOTE: The executor will be created by each test<a name="line.72"></a>
+<span class="sourceLineNo">073</span>    procEnv = new TestProcEnv();<a name="line.73"></a>
+<span class="sourceLineNo">074</span>    testDir = htu.getDataTestDir();<a name="line.74"></a>
+<span class="sourceLineNo">075</span>    fs = testDir.getFileSystem(htu.getConfiguration());<a name="line.75"></a>
+<span class="sourceLineNo">076</span>    assertTrue(testDir.depth() &gt; 1);<a name="line.76"></a>
+<span class="sourceLineNo">077</span><a name="line.77"></a>
+<span class="sourceLineNo">078</span>    logDir = new Path(testDir, "proc-logs");<a name="line.78"></a>
+<span class="sourceLineNo">079</span>    procStore = ProcedureTestingUtility.createWalStore(htu.getConfiguration(), logDir);<a name="line.79"></a>
+<span class="sourceLineNo">080</span>    procExecutor = new ProcedureExecutor&lt;&gt;(htu.getConfiguration(), procEnv,<a name="line.80"></a>
+<span class="sourceLineNo">081</span>        procStore);<a name="line.81"></a>
+<span class="sourceLineNo">082</span>    procStore.start(PROCEDURE_EXECUTOR_SLOTS);<a name="line.82"></a>
+<span class="sourceLineNo">083</span>    ProcedureTestingUtility<a name="line.83"></a>
+<span class="sourceLineNo">084</span>        .initAndStartWorkers(procExecutor, PROCEDURE_EXECUTOR_SLOTS, true);<a name="line.84"></a>
+<span class="sourceLineNo">085</span>  }<a name="line.85"></a>
+<span class="sourceLineNo">086</span><a name="line.86"></a>
+<span class="sourceLineNo">087</span>  @Test<a name="line.87"></a>
+<span class="sourceLineNo">088</span>  public void testBypassSuspendProcedure() throws Exception {<a name="line.88"></a>
+<span class="sourceLineNo">089</span>    final SuspendProcedure proc = new SuspendProcedure();<a name="line.89"></a>
+<span class="sourceLineNo">090</span>    long id = procExecutor.submitProcedure(proc);<a name="line.90"></a>
+<span class="sourceLineNo">091</span>    Thread.sleep(500);<a name="line.91"></a>
+<span class="sourceLineNo">092</span>    //bypass the procedure<a name="line.92"></a>
+<span class="sourceLineNo">093</span>    assertTrue(procExecutor.bypassProcedure(id, 30000, false, false));<a name="line.93"></a>
+<span class="sourceLineNo">094</span>    htu.waitFor(5000, () -&gt; proc.isSuccess() &amp;&amp; proc.isBypass());<a name="line.94"></a>
+<span class="sourceLineNo">095</span>    LOG.info("{} finished", proc);<a name="line.95"></a>
+<span class="sourceLineNo">096</span>  }<a name="line.96"></a>
+<span class="sourceLineNo">097</span><a name="line.97"></a>
+<span class="sourceLineNo">098</span>  @Test<a name="line.98"></a>
+<span class="sourceLineNo">099</span>  public void testStuckProcedure() throws Exception {<a name="line.99"></a>
+<span class="sourceLineNo">100</span>    final StuckProcedure proc = new StuckProcedure();<a name="line.100"></a>
+<span class="sourceLineNo">101</span>    long id = procExecutor.submitProcedure(proc);<a name="line.101"></a>
+<span class="sourceLineNo">102</span>    Thread.sleep(500);<a name="line.102"></a>
+<span class="sourceLineNo">103</span>    //bypass the procedure<a name="line.103"></a>
+<span class="sourceLineNo">104</span>    assertTrue(procExecutor.bypassProcedure(id, 1000, true, false));<a name="line.104"></a>
+<span class="sourceLineNo">105</span>    //Since the procedure is stuck there, we need to restart the executor to recovery.<a name="line.105"></a>
+<span class="sourceLineNo">106</span>    ProcedureTestingUtility.restart(procExecutor);<a name="line.106"></a>
+<span class="sourceLineNo">107</span>    htu.waitFor(5000, () -&gt; proc.isSuccess() &amp;&amp; proc.isBypass());<a name="line.107"></a>
+<span class="sourceLineNo">108</span>    LOG.info("{} finished", proc);<a name="line.108"></a>
+<span class="sourceLineNo">109</span>  }<a name="line.109"></a>
+<span class="sourceLineNo">110</span><a name="line.110"></a>
+<span class="sourceLineNo">111</span>  @Test<a name="line.111"></a>
+<span class="sourceLineNo">112</span>  public void testBypassingProcedureWithParent() throws Exception {<a name="line.112"></a>
+<span class="sourceLineNo">113</span>    final RootProcedure proc = new RootProcedure();<a name="line.113"></a>
+<span class="sourceLineNo">114</span>    long rootId = procExecutor.submitProcedure(proc);<a name="line.114"></a>
+<span class="sourceLineNo">115</span>    htu.waitFor(5000, () -&gt; procExecutor.getProcedures().stream()<a name="line.115"></a>
+<span class="sourceLineNo">116</span>      .filter(p -&gt; p.getParentProcId() == rootId).collect(Collectors.toList())<a name="line.116"></a>
+<span class="sourceLineNo">117</span>      .size() &gt; 0);<a name="line.117"></a>
+<span class="sourceLineNo">118</span>    SuspendProcedure suspendProcedure = (SuspendProcedure)procExecutor.getProcedures().stream()<a name="line.118"></a>
+<span class="sourceLineNo">119</span>        .filter(p -&gt; p.getParentProcId() == rootId).collect(Collectors.toList()).get(0);<a name="line.119"></a>
+<span class="sourceLineNo">120</span>    assertTrue(procExecutor.bypassProcedure(suspendProcedure.getProcId(), 1000, false, false));<a name="line.120"></a>
+<span class="sourceLineNo">121</span>    htu.waitFor(5000, () -&gt; proc.isSuccess() &amp;&amp; proc.isBypass());<a name="line.121"></a>
+<span class="sourceLineNo">122</span>    LOG.info("{} finished", proc);<a name="line.122"></a>
+<span class="sourceLineNo">123</span>  }<a name="line.123"></a>
+<span class="sourceLineNo">124</span><a name="line.124"></a>
+<span class="sourceLineNo">125</span>  @Test<a name="line.125"></a>
+<span class="sourceLineNo">126</span>  public void testBypassingStuckStateMachineProcedure() throws Exception {<a name="line.126"></a>
+<span class="sourceLineNo">127</span>    final StuckStateMachineProcedure proc =<a name="line.127"></a>
+<span class="sourceLineNo">128</span>        new StuckStateMachineProcedure(procEnv, StuckStateMachineState.START);<a name="line.128"></a>
+<span class="sourceLineNo">129</span>    long id = procExecutor.submitProcedure(proc);<a name="line.129"></a>
+<span class="sourceLineNo">130</span>    Thread.sleep(500);<a name="line.130"></a>
+<span class="sourceLineNo">131</span>    // bypass the procedure<a name="line.131"></a>
+<span class="sourceLineNo">132</span>    assertFalse(procExecutor.bypassProcedure(id, 1000, false, false));<a name="line.132"></a>
+<span class="sourceLineNo">133</span>    assertTrue(procExecutor.bypassProcedure(id, 1000, true, false));<a name="line.133"></a>
+<span class="sourceLineNo">134</span><a name="line.134"></a>
+<span class="sourceLineNo">135</span>    htu.waitFor(5000, () -&gt; proc.isSuccess() &amp;&amp; proc.isBypass());<a name="line.135"></a>
+<span class="sourceLineNo">136</span>    LOG.info("{} finished", proc);<a name="line.136"></a>
+<span class="sourceLineNo">137</span>  }<a name="line.137"></a>
+<span class="sourceLineNo">138</span><a name="line.138"></a>
+<span class="sourceLineNo">139</span>  @Test<a name="line.139"></a>
+<span class="sourceLineNo">140</span>  public void testBypassingProcedureWithParentRecursive() throws Exception {<a name="line.140"></a>
+<span class="sourceLineNo">141</span>    final RootProcedure proc = new RootProcedure();<a name="line.141"></a>
+<span class="sourceLineNo">142</span>    long rootId = procExecutor.submitProcedure(proc);<a name="line.142"></a>
+<span class="sourceLineNo">143</span>    htu.waitFor(5000, () -&gt; procExecutor.getProcedures().stream()<a name="line.143"></a>
+<span class="sourceLineNo">144</span>        .filter(p -&gt; p.getParentProcId() == rootId).collect(Collectors.toList())<a name="line.144"></a>
+<span class="sourceLineNo">145</span>        .size() &gt; 0);<a name="line.145"></a>
+<span class="sourceLineNo">146</span>    SuspendProcedure suspendProcedure = (SuspendProcedure)procExecutor.getProcedures().stream()<a name="line.146"></a>
+<span class="sourceLineNo">147</span>        .filter(p -&gt; p.getParentProcId() == rootId).collect(Collectors.toList()).get(0);<a name="line.147"></a>
+<span class="sourceLineNo">148</span>    assertTrue(procExecutor.bypassProcedure(rootId, 1000, false, true));<a name="line.148"></a>
+<span class="sourceLineNo">149</span>    htu.waitFor(5000, () -&gt; proc.isSuccess() &amp;&amp; proc.isBypass());<a name="line.149"></a>
+<span class="sourceLineNo">150</span>    LOG.info("{} finished", proc);<a name="line.150"></a>
+<span class="sourceLineNo">151</span>  }<a name="line.151"></a>
+<span class="sourceLineNo">152</span><a name="line.152"></a>
+<span class="sourceLineNo">153</span>  @Test<a name="line.153"></a>
+<span class="sourceLineNo">154</span>  public void testBypassingWaitingTimeoutProcedures() throws Exception {<a name="line.154"></a>
+<span class="sourceLineNo">155</span>    final WaitingTimeoutProcedure proc = new WaitingTimeoutProcedure();<a name="line.155"></a>
+<span class="sourceLineNo">156</span>    long id = procExecutor.submitProcedure(proc);<a name="line.156"></a>
+<span class="sourceLineNo">157</span>    Thread.sleep(500);<a name="line.157"></a>
+<span class="sourceLineNo">158</span>    // bypass the procedure<a name="line.158"></a>
+<span class="sourceLineNo">159</span>    assertTrue(procExecutor.bypassProcedure(id, 1000, true, false));<a name="line.159"></a>
 <span class="sourceLineNo">160</span><a name="line.160"></a>
-<span class="sourceLineNo">161</span>    public SuspendProcedure() {<a name="line.161"></a>
-<span class="sourceLineNo">162</span>      super();<a name="line.162"></a>
-<span class="sourceLineNo">163</span>    }<a name="line.163"></a>
+<span class="sourceLineNo">161</span>    htu.waitFor(5000, () -&gt; proc.isSuccess() &amp;&amp; proc.isBypass());<a name="line.161"></a>
+<span class="sourceLineNo">162</span>    LOG.info("{} finished", proc);<a name="line.162"></a>
+<span class="sourceLineNo">163</span>  }<a name="line.163"></a>
 <span class="sourceLineNo">164</span><a name="line.164"></a>
-<span class="sourceLineNo">165</span>    @Override<a name="line.165"></a>
-<span class="sourceLineNo">166</span>    protected Procedure[] execute(final TestProcEnv env)<a name="line.166"></a>
-<span class="sourceLineNo">167</span>        throws ProcedureSuspendedException {<a name="line.167"></a>
-<span class="sourceLineNo">168</span>      // Always suspend the procedure<a name="line.168"></a>
-<span class="sourceLineNo">169</span>      throw new ProcedureSuspendedException();<a name="line.169"></a>
-<span class="sourceLineNo">170</span>    }<a name="line.170"></a>
-<span class="sourceLineNo">171</span>  }<a name="line.171"></a>
-<span class="sourceLineNo">172</span><a name="line.172"></a>
-<span class="sourceLineNo">173</span>  public static class StuckProcedure extends ProcedureTestingUtility.NoopProcedure&lt;TestProcEnv&gt; {<a name="line.173"></a>
-<span class="sourceLineNo">174</span><a name="line.174"></a>
-<span class="sourceLineNo">175</span>    public StuckProcedure() {<a name="line.175"></a>
-<span class="sourceLineNo">176</span>      super();<a name="line.176"></a>
-<span class="sourceLineNo">177</span>    }<a name="line.177"></a>
-<span class="sourceLineNo">178</span><a name="line.178"></a>
-<span class="sourceLineNo">179</span>    @Override<a name="line.179"></a>
-<span class="sourceLineNo">180</span>    protected Procedure[] execute(final TestProcEnv env) {<a name="line.180"></a>
-<span class="sourceLineNo">181</span>      try {<a name="line.181"></a>
-<span class="sourceLineNo">182</span>        Thread.sleep(Long.MAX_VALUE);<a name="line.182"></a>
-<span class="sourceLineNo">183</span>      } catch (Throwable t) {<a name="line.183"></a>
-<span class="sourceLineNo">184</span>        LOG.debug("Sleep is interrupted.", t);<a name="line.184"></a>
-<span class="sourceLineNo">185</span>      }<a name="line.185"></a>
-<span class="sourceLineNo">186</span>      return null;<a name="line.186"></a>
-<span class="sourceLineNo">187</span>    }<a name="line.187"></a>
-<span class="sourceLineNo">188</span><a name="line.188"></a>
-<span class="sourceLineNo">189</span>  }<a name="line.189"></a>
-<span class="sourceLineNo">190</span><a name="line.190"></a>
+<span class="sourceLineNo">165</span>  @AfterClass<a name="line.165"></a>
+<span class="sourceLineNo">166</span>  public static void tearDown() throws Exception {<a name="line.166"></a>
+<span class="sourceLineNo">167</span>    procExecutor.stop();<a name="line.167"></a>
+<span class="sourceLineNo">168</span>    procStore.stop(false);<a name="line.168"></a>
+<span class="sourceLineNo">169</span>    procExecutor.join();<a name="line.169"></a>
+<span class="sourceLineNo">170</span>  }<a name="line.170"></a>
+<span class="sourceLineNo">171</span><a name="line.171"></a>
+<span class="sourceLineNo">172</span>  public static class SuspendProcedure extends ProcedureTestingUtility.NoopProcedure&lt;TestProcEnv&gt; {<a name="line.172"></a>
+<span class="sourceLineNo">173</span><a name="line.173"></a>
+<span class="sourceLineNo">174</span>    public SuspendProcedure() {<a name="line.174"></a>
+<span class="sourceLineNo">175</span>      super();<a name="line.175"></a>
+<span class="sourceLineNo">176</span>    }<a name="line.176"></a>
+<span class="sourceLineNo">177</span><a name="line.177"></a>
+<span class="sourceLineNo">178</span>    @Override<a name="line.178"></a>
+<span class="sourceLineNo">179</span>    protected Procedure[] execute(final TestProcEnv env)<a name="line.179"></a>
+<span class="sourceLineNo">180</span>        throws ProcedureSuspendedException {<a name="line.180"></a>
+<span class="sourceLineNo">181</span>      // Always suspend the procedure<a name="line.181"></a>
+<span class="sourceLineNo">182</span>      throw new ProcedureSuspendedException();<a name="line.182"></a>
+<span class="sourceLineNo">183</span>    }<a name="line.183"></a>
+<span class="sourceLineNo">184</span>  }<a name="line.184"></a>
+<span class="sourceLineNo">185</span><a name="line.185"></a>
+<span class="sourceLineNo">186</span>  public static class StuckProcedure extends ProcedureTestingUtility.NoopProcedure&lt;TestProcEnv&gt; {<a name="line.186"></a>
+<span class="sourceLineNo">187</span><a name="line.187"></a>
+<span class="sourceLineNo">188</span>    public StuckProcedure() {<a name="line.188"></a>
+<span class="sourceLineNo">189</span>      super();<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>  public static class RootProcedure extends ProcedureTestingUtility.NoopProcedure&lt;TestProcEnv&gt; {<a name="line.192"></a>
-<span class="sourceLineNo">193</span>    private boolean childSpwaned = false;<a name="line.193"></a>
-<span class="sourceLineNo">194</span><a name="line.194"></a>
-<span class="sourceLineNo">195</span>    public RootProcedure() {<a name="line.195"></a>
-<span class="sourceLineNo">196</span>      super();<a name="line.196"></a>
-<span class="sourceLineNo">197</span>    }<a name="line.197"></a>
-<span class="sourceLineNo">198</span><a name="line.198"></a>
-<span class="sourceLineNo">199</span>    @Override<a name="line.199"></a>
-<span class="sourceLineNo">200</span>    protected Procedure[] execute(final TestProcEnv env)<a name="line.200"></a>
-<span class="sourceLineNo">201</span>        throws ProcedureSuspendedException {<a name="line.201"></a>
-<span class="sourceLineNo">202</span>      if (!childSpwaned) {<a name="line.202"></a>
-<span class="sourceLineNo">203</span>        childSpwaned = true;<a name="line.203"></a>
-<span class="sourceLineNo">204</span>        return new Procedure[] {new SuspendProcedure()};<a name="line.204"></a>
-<span class="sourceLineNo">205</span>      } else {<a name="line.205"></a>
-<span class="sourceLineNo">206</span>        return null;<a name="line.206"></a>
-<span class="sourceLineNo">207</span>      }<a name="line.207"></a>
-<span class="sourceLineNo">208</span>    }<a name="line.208"></a>
-<span class="sourceLineNo">209</span>  }<a name="line.209"></a>
-<span class="sourceLineNo">210</span><a name="line.210"></a>
+<span class="sourceLineNo">192</span>    @Override<a name="line.192"></a>
+<span class="sourceLineNo">193</span>    protected Procedure[] execute(final TestProcEnv env) {<a name="line.193"></a>
+<span class="sourceLineNo">194</span>      try {<a name="line.194"></a>
+<span class="sourceLineNo">195</span>        Thread.sleep(Long.MAX_VALUE);<a name="line.195"></a>
+<span class="sourceLineNo">196</span>      } catch (Throwable t) {<a name="line.196"></a>
+<span class="sourceLineNo">197</span>        LOG.debug("Sleep is interrupted.", t);<a name="line.197"></a>
+<span class="sourceLineNo">198</span>      }<a name="line.198"></a>
+<span class="sourceLineNo">199</span>      return null;<a name="line.199"></a>
+<span class="sourceLineNo">200</span>    }<a name="line.200"></a>
+<span class="sourceLineNo">201</span><a name="line.201"></a>
+<span class="sourceLineNo">202</span>  }<a name="line.202"></a>
+<span class="sourceLineNo">203</span><a name="line.203"></a>
+<span class="sourceLineNo">204</span><a name="line.204"></a>
+<span class="sourceLineNo">205</span>  public static class RootProcedure extends ProcedureTestingUtility.NoopProcedure&lt;TestProcEnv&gt; {<a name="line.205"></a>
+<span class="sourceLineNo">206</span>    private boolean childSpwaned = false;<a name="line.206"></a>
+<span class="sourceLineNo">207</span><a name="line.207"></a>
+<span class="sourceLineNo">208</span>    public RootProcedure() {<a name="line.208"></a>
+<span class="sourceLineNo">209</span>      super();<a name="line.209"></a>
+<span class="sourceLineNo">210</span>    }<a name="line.210"></a>
 <span class="sourceLineNo">211</span><a name="line.211"></a>
-<span class="sourceLineNo">212</span>  public enum StuckStateMachineState {<a name="line.212"></a>
-<span class="sourceLineNo">213</span>    START, THEN, END<a name="line.213"></a>
-<span class="sourceLineNo">214</span>  }<a name="line.214"></a>
-<span class="sourceLineNo">215</span><a name="line.215"></a>
-<span class="sourceLineNo">216</span>  public static class StuckStateMachineProcedure extends<a name="line.216"></a>
-<span class="sourceLineNo">217</span>      ProcedureTestingUtility.NoopStateMachineProcedure&lt;TestProcEnv, StuckStateMachineState&gt; {<a name="line.217"></a>
-<span class="sourceLineNo">218</span>    private AtomicBoolean stop = new AtomicBoolean(false);<a name="line.218"></a>
-<span class="sourceLineNo">219</span><a name="line.219"></a>
-<span class="sourceLineNo">220</span>    public StuckStateMachineProcedure() {<a name="line.220"></a>
-<span class="sourceLineNo">221</span>      super();<a name="line.221"></a>
-<span class="sourceLineNo">222</span>    }<a name="line.222"></a>
+<span class="sourceLineNo">212</span>    @Override<a name="line.212"></a>
+<span class="sourceLineNo">213</span>    protected Procedure[] execute(final TestProcEnv env)<a name="line.213"></a>
+<span class="sourceLineNo">214</span>        throws ProcedureSuspendedException {<a name="line.214"></a>
+<span class="sourceLineNo">215</span>      if (!childSpwaned) {<a name="line.215"></a>
+<span class="sourceLineNo">216</span>        childSpwaned = true;<a name="line.216"></a>
+<span class="sourceLineNo">217</span>        return new Procedure[] {new SuspendProcedure()};<a name="line.217"></a>
+<span class="sourceLineNo">218</span>      } else {<a name="line.218"></a>
+<span class="sourceLineNo">219</span>        return null;<a name="line.219"></a>
+<span class="sourceLineNo">220</span>      }<a name="line.220"></a>
+<span class="sourceLineNo">221</span>    }<a name="line.221"></a>
+<span class="sourceLineNo">222</span>  }<a name="line.222"></a>
 <span class="sourceLineNo">223</span><a name="line.223"></a>
-<span class="sourceLineNo">224</span>    public StuckStateMachineProcedure(TestProcEnv env, StuckStateMachineState initialState) {<a name="line.224"></a>
-<span class="sourceLineNo">225</span>      super(env, initialState);<a name="line.225"></a>
-<span class="sourceLineNo">226</span>    }<a name="line.226"></a>
-<span class="sourceLineNo">227</span><a name="line.227"></a>
-<span class="sourceLineNo">228</span>    @Override<a name="line.228"></a>
-<span class="sourceLineNo">229</span>    protected Flow executeFromState(TestProcEnv env, StuckStateMachineState tState)<a name="line.229"></a>
-<span class="sourceLineNo">230</span>            throws ProcedureSuspendedException, ProcedureYieldException, InterruptedException {<a name="line.230"></a>
-<span class="sourceLineNo">231</span>      switch (tState) {<a name="line.231"></a>
-<span class="sourceLineNo">232</span>        case START:<a name="line.232"></a>
-<span class="sourceLineNo">233</span>          LOG.info("PHASE 1: START");<a name="line.233"></a>
-<span class="sourceLineNo">234</span>          setNextState(StuckStateMachineState.THEN);<a name="line.234"></a>
-<span class="sourceLineNo">235</span>          return Flow.HAS_MORE_STATE;<a name="line.235"></a>
-<span class="sourceLineNo">236</span>        case THEN:<a name="line.236"></a>
-<span class="sourceLineNo">237</span>          if (stop.get()) {<a name="line.237"></a>
-<span class="sourceLineNo">238</span>            setNextState(StuckStateMachineState.END);<a name="line.238"></a>
-<span class="sourceLineNo">239</span>          }<a name="line.239"></a>
-<span class="sourceLineNo">240</span>          return Flow.HAS_MORE_STATE;<a name="line.240"></a>
-<span class="sourceLineNo">241</span>        case END:<a name="line.241"></a>
-<span class="sourceLineNo">242</span>          return Flow.NO_MORE_STATE;<a name="line.242"></a>
-<span class="sourceLineNo">243</span>        default:<a name="line.243"></a>
-<span class="sourceLineNo">244</span>          throw new UnsupportedOperationException("unhandled state=" + tState);<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">224</span>  public static class WaitingTimeoutProcedure<a name="line.224"></a>
+<span class="sourceLineNo">225</span>      extends ProcedureTestingUtility.NoopProcedure&lt;TestProcEnv&gt; {<a name="line.225"></a>
+<span class="sourceLineNo">226</span>    public WaitingTimeoutProcedure() {<a name="line.226"></a>
+<span class="sourceLineNo">227</span>      super();<a name="line.227"></a>
+<span class="sourceLineNo">228</span>    }<a name="line.228"></a>
+<span class="sourceLineNo">229</span><a name="line.229"></a>
+<span class="sourceLineNo">230</span>    @Override<a name="line.230"></a>
+<span class="sourceLineNo">231</span>    protected Procedure[] execute(final TestProcEnv env)<a name="line.231"></a>
+<span class="sourceLineNo">232</span>        throws ProcedureSuspendedException {<a name="line.232"></a>
+<span class="sourceLineNo">233</span>      // Always suspend the procedure<a name="line.233"></a>
+<span class="sourceLineNo">234</span>      setTimeout(50000);<a name="line.234"></a>
+<span class="sourceLineNo">235</span>      setState(ProcedureProtos.ProcedureState.WAITING_TIMEOUT);<a name="line.235"></a>
+<span class="sourceLineNo">236</span>      skipPersistence();<a name="line.236"></a>
+<span class="sourceLineNo">237</span>      throw new ProcedureSuspendedException();<a name="line.237"></a>
+<span class="sourceLineNo">238</span>    }<a name="line.238"></a>
+<span class="sourceLineNo">239</span><a name="line.239"></a>
+<span class="sourceLineNo">240</span>    @Override<a name="line.240"></a>
+<span class="sourceLineNo">241</span>    protected synchronized boolean setTimeoutFailure(TestProcEnv env) {<a name="line.241"></a>
+<span class="sourceLineNo">242</span>      setState(ProcedureProtos.ProcedureState.RUNNABLE);<a name="line.242"></a>
+<span class="sourceLineNo">243</span>      procExecutor.getScheduler().addFront(this);<a name="line.243"></a>
+<span class="sourceLineNo">244</span>      return false; // 'false' means that this procedure handled the timeout<a name="line.244"></a>
+<span class="sourceLineNo">245</span>    }<a name="line.245"></a>
+<span class="sourceLineNo">246</span>  }<a name="line.246"></a>
 <span class="sourceLineNo">247</span><a name="line.247"></a>
-<span class="sourceLineNo">248</span>    @Override<a name="line.248"></a>
-<span class="sourceLineNo">249</span>    protected StuckStateMachineState getState(int stateId) {<a name="line.249"></a>
-<span class="sourceLineNo">250</span>      return StuckStateMachineState.values()[stateId];<a name="line.250"></a>
-<span class="sourceLineNo">251</span>    }<a name="line.251"></a>
-<span class="sourceLineNo">252</span><a name="line.252"></a>
-<span class="sourceLineNo">253</span>    @Override<a name="line.253"></a>
-<span class="sourceLineNo">254</span>    protected int getStateId(StuckStateMachineState tState) {<a name="line.254"></a>
-<span class="sourceLineNo">255</span>      return tState.ordinal();<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">248</span>  public enum StuckStateMachineState {<a name="line.248"></a>
+<span class="sourceLineNo">249</span>    START, THEN, END<a name="line.249"></a>
+<span class="sourceLineNo">250</span>  }<a name="line.250"></a>
+<span class="sourceLineNo">251</span><a name="line.251"></a>
+<span class="sourceLineNo">252</span>  public static class StuckStateMachineProcedure extends<a name="line.252"></a>
+<span class="sourceLineNo">253</span>      ProcedureTestingUtility.NoopStateMachineProcedure&lt;TestProcEnv, StuckStateMachineState&gt; {<a name="line.253"></a>
+<span class="sourceLineNo">254</span>    private AtomicBoolean stop = new AtomicBoolean(false);<a name="line.254"></a>
+<span class="sourceLineNo">255</span><a name="line.255"></a>
+<span class="sourceLineNo">256</span>    public StuckStateMachineProcedure() {<a name="line.256"></a>
+<span class="sourceLineNo">257</span>      super();<a name="line.257"></a>
+<span class="sourceLineNo">258</span>    }<a name="line.258"></a>
 <span class="sourceLineNo">259</span><a name="line.259"></a>
-<span class="sourceLineNo">260</span>}<a name="line.260"></a>
+<span class="sourceLineNo">260</span>    public StuckStateMachineProcedure(TestProcEnv env, StuckStateMachineState initialState) {<a name="line.260"></a>
+<span class="sourceLineNo">261</span>      super(env, initialState);<a name="line.261"></a>
+<span class="sourceLineNo">262</span>    }<a name="line.262"></a>
+<span class="sourceLineNo">263</span><a name="line.263"></a>
+<span class="sourceLineNo">264</span>    @Override<a name="line.264"></a>
+<span class="sourceLineNo">265</span>    protected Flow executeFromState(TestProcEnv env, StuckStateMachineState tState)<a name="line.265"></a>
+<span class="sourceLineNo">266</span>            throws ProcedureSuspendedException, ProcedureYieldException, InterruptedException {<a name="line.266"></a>
+<span class="sourceLineNo">267</span>      switch (tState) {<a name="line.267"></a>
+<span class="sourceLineNo">268</span>        case START:<a name="line.268"></a>
+<span class="sourceLineNo">269</span>          LOG.info("PHASE 1: START");<a name="line.269"></a>
+<span class="sourceLineNo">270</span>          setNextState(StuckStateMachineState.THEN);<a name="line.270"></a>
+<span class="sourceLineNo">271</span>          return Flow.HAS_MORE_STATE;<a name="line.271"></a>
+<span class="sourceLineNo">272</span>        case THEN:<a name="line.272"></a>
+<span class="sourceLineNo">273</span>          if (stop.get()) {<a name="line.273"></a>
+<span class="sourceLineNo">274</span>            setNextState(StuckStateMachineState.END);<a name="line.274"></a>
+<span class="sourceLineNo">275</span>          }<a name="line.275"></a>
+<span class="sourceLineNo">276</span>          return Flow.HAS_MORE_STATE;<a name="line.276"></a>
+<span class="sourceLineNo">277</span>        case END:<a name="line.277"></a>
+<span class="sourceLineNo">278</span>          return Flow.NO_MORE_STATE;<a name="line.278"></a>
+<span class="sourceLineNo">279</span>        default:<a name="line.279"></a>
+<span class="sourceLineNo">280</span>          throw new UnsupportedOperationException("unhandled state=" + tState);<a name="line.280"></a>
+<span class="sourceLineNo">281</span>      }<a name="line.281"></a>
+<span class="sourceLineNo">282</span>    }<a name="line.282"></a>
+<span class="sourceLineNo">283</span><a name="line.283"></a>
+<span class="sourceLineNo">284</span>    @Override<a name="line.284"></a>
+<span class="sourceLineNo">285</span>    protected StuckStateMachineState getState(int stateId) {<a name="line.285"></a>
+<span class="sourceLineNo">286</span>      return StuckStateMachineState.values()[stateId];<a name="line.286"></a>
+<span class="sourceLineNo">287</span>    }<a name="line.287"></a>
+<span class="sourceLineNo">288</span><a name="line.288"></a>
+<span class="sourceLineNo">289</span>    @Override<a name="line.289"></a>
+<span class="sourceLineNo">290</span>    protected int getStateId(StuckStateMachineState tState) {<a name="line.290"></a>
+<span class="sourceLineNo">291</span>      return tState.ordinal();<a name="line.291"></a>
+<span class="sourceLineNo">292</span>    }<a name="line.292"></a>
+<span class="sourceLineNo">293</span>  }<a name="line.293"></a>
+<span class="sourceLineNo">294</span><a name="line.294"></a>
+<span class="sourceLineNo">295</span><a name="line.295"></a>
+<span class="sourceLineNo">296</span>}<a name="line.296"></a>
 
 
 


[15/29] hbase-site git commit: Published site at 5e84997f2ffdbcf5f849d70c30ddbe2db4039ca4.

Posted by gi...@apache.org.
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/27f5bfb5/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 dd0dd0f..9fd7e0b 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
@@ -975,1128 +975,1136 @@
 <span class="sourceLineNo">967</span>        store.update(procedure);<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>      // If we don't have the lock, we can't re-submit the queue,<a name="line.970"></a>
-<span class="sourceLineNo">971</span>      // since it is already executing. To get rid of the stuck situation, we<a name="line.971"></a>
-<span class="sourceLineNo">972</span>      // need to restart the master. With the procedure set to bypass, the procedureExecutor<a name="line.972"></a>
-<span class="sourceLineNo">973</span>      // will bypass it and won't get stuck again.<a name="line.973"></a>
-<span class="sourceLineNo">974</span>      if (lockEntry != null) {<a name="line.974"></a>
-<span class="sourceLineNo">975</span>        // add the procedure to run queue,<a name="line.975"></a>
-<span class="sourceLineNo">976</span>        scheduler.addFront(procedure);<a name="line.976"></a>
-<span class="sourceLineNo">977</span>        LOG.debug("Bypassing {} and its ancestors successfully, adding to queue", procedure);<a name="line.977"></a>
-<span class="sourceLineNo">978</span>      } else {<a name="line.978"></a>
-<span class="sourceLineNo">979</span>        LOG.debug("Bypassing {} and its ancestors successfully, but since it is already running, "<a name="line.979"></a>
-<span class="sourceLineNo">980</span>            + "skipping add to queue", procedure);<a name="line.980"></a>
-<span class="sourceLineNo">981</span>      }<a name="line.981"></a>
-<span class="sourceLineNo">982</span>      return true;<a name="line.982"></a>
-<span class="sourceLineNo">983</span><a name="line.983"></a>
-<span class="sourceLineNo">984</span>    } finally {<a name="line.984"></a>
-<span class="sourceLineNo">985</span>      if (lockEntry != null) {<a name="line.985"></a>
-<span class="sourceLineNo">986</span>        procExecutionLock.releaseLockEntry(lockEntry);<a name="line.986"></a>
-<span class="sourceLineNo">987</span>      }<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><a name="line.990"></a>
-<span class="sourceLineNo">991</span>  /**<a name="line.991"></a>
-<span class="sourceLineNo">992</span>   * Add a new root-procedure to the executor.<a name="line.992"></a>
-<span class="sourceLineNo">993</span>   * @param proc the new procedure to execute.<a name="line.993"></a>
-<span class="sourceLineNo">994</span>   * @param nonceKey the registered unique identifier for this operation from the client or process.<a name="line.994"></a>
-<span class="sourceLineNo">995</span>   * @return the procedure id, that can be used to monitor the operation<a name="line.995"></a>
-<span class="sourceLineNo">996</span>   */<a name="line.996"></a>
-<span class="sourceLineNo">997</span>  @edu.umd.cs.findbugs.annotations.SuppressWarnings(value="NP_NULL_ON_SOME_PATH",<a name="line.997"></a>
-<span class="sourceLineNo">998</span>      justification = "FindBugs is blind to the check-for-null")<a name="line.998"></a>
-<span class="sourceLineNo">999</span>  public long submitProcedure(Procedure&lt;TEnvironment&gt; proc, NonceKey nonceKey) {<a name="line.999"></a>
-<span class="sourceLineNo">1000</span>    Preconditions.checkArgument(lastProcId.get() &gt;= 0);<a name="line.1000"></a>
-<span class="sourceLineNo">1001</span><a name="line.1001"></a>
-<span class="sourceLineNo">1002</span>    prepareProcedure(proc);<a name="line.1002"></a>
-<span class="sourceLineNo">1003</span><a name="line.1003"></a>
-<span class="sourceLineNo">1004</span>    final Long currentProcId;<a name="line.1004"></a>
-<span class="sourceLineNo">1005</span>    if (nonceKey != null) {<a name="line.1005"></a>
-<span class="sourceLineNo">1006</span>      currentProcId = nonceKeysToProcIdsMap.get(nonceKey);<a name="line.1006"></a>
-<span class="sourceLineNo">1007</span>      Preconditions.checkArgument(currentProcId != null,<a name="line.1007"></a>
-<span class="sourceLineNo">1008</span>        "Expected nonceKey=" + nonceKey + " to be reserved, use registerNonce(); proc=" + proc);<a name="line.1008"></a>
-<span class="sourceLineNo">1009</span>    } else {<a name="line.1009"></a>
-<span class="sourceLineNo">1010</span>      currentProcId = nextProcId();<a name="line.1010"></a>
-<span class="sourceLineNo">1011</span>    }<a name="line.1011"></a>
-<span class="sourceLineNo">1012</span><a name="line.1012"></a>
-<span class="sourceLineNo">1013</span>    // Initialize the procedure<a name="line.1013"></a>
-<span class="sourceLineNo">1014</span>    proc.setNonceKey(nonceKey);<a name="line.1014"></a>
-<span class="sourceLineNo">1015</span>    proc.setProcId(currentProcId.longValue());<a name="line.1015"></a>
-<span class="sourceLineNo">1016</span><a name="line.1016"></a>
-<span class="sourceLineNo">1017</span>    // Commit the transaction<a name="line.1017"></a>
-<span class="sourceLineNo">1018</span>    store.insert(proc, null);<a name="line.1018"></a>
-<span class="sourceLineNo">1019</span>    LOG.debug("Stored {}", proc);<a name="line.1019"></a>
+<span class="sourceLineNo">970</span>      // If state of procedure is WAITING_TIMEOUT, we can directly submit it to the scheduler.<a name="line.970"></a>
+<span class="sourceLineNo">971</span>      // Instead we should remove it from timeout Executor queue and tranfer its state to RUNNABLE<a name="line.971"></a>
+<span class="sourceLineNo">972</span>      if (procedure.getState() == ProcedureState.WAITING_TIMEOUT) {<a name="line.972"></a>
+<span class="sourceLineNo">973</span>        LOG.debug("transform procedure {} from WAITING_TIMEOUT to RUNNABLE", procedure);<a name="line.973"></a>
+<span class="sourceLineNo">974</span>        if (timeoutExecutor.remove(procedure)) {<a name="line.974"></a>
+<span class="sourceLineNo">975</span>          LOG.debug("removed procedure {} from timeoutExecutor", procedure);<a name="line.975"></a>
+<span class="sourceLineNo">976</span>          timeoutExecutor.executeTimedoutProcedure(procedure);<a name="line.976"></a>
+<span class="sourceLineNo">977</span>        }<a name="line.977"></a>
+<span class="sourceLineNo">978</span>      } else if (lockEntry != null) {<a name="line.978"></a>
+<span class="sourceLineNo">979</span>        scheduler.addFront(procedure);<a name="line.979"></a>
+<span class="sourceLineNo">980</span>        LOG.debug("Bypassing {} and its ancestors successfully, adding to queue", procedure);<a name="line.980"></a>
+<span class="sourceLineNo">981</span>      } else {<a name="line.981"></a>
+<span class="sourceLineNo">982</span>        // If we don't have the lock, we can't re-submit the queue,<a name="line.982"></a>
+<span class="sourceLineNo">983</span>        // since it is already executing. To get rid of the stuck situation, we<a name="line.983"></a>
+<span class="sourceLineNo">984</span>        // need to restart the master. With the procedure set to bypass, the procedureExecutor<a name="line.984"></a>
+<span class="sourceLineNo">985</span>        // will bypass it and won't get stuck again.<a name="line.985"></a>
+<span class="sourceLineNo">986</span>        LOG.debug("Bypassing {} and its ancestors successfully, but since it is already running, "<a name="line.986"></a>
+<span class="sourceLineNo">987</span>            + "skipping add to queue",<a name="line.987"></a>
+<span class="sourceLineNo">988</span>          procedure);<a name="line.988"></a>
+<span class="sourceLineNo">989</span>      }<a name="line.989"></a>
+<span class="sourceLineNo">990</span>      return true;<a name="line.990"></a>
+<span class="sourceLineNo">991</span><a name="line.991"></a>
+<span class="sourceLineNo">992</span>    } finally {<a name="line.992"></a>
+<span class="sourceLineNo">993</span>      if (lockEntry != null) {<a name="line.993"></a>
+<span class="sourceLineNo">994</span>        procExecutionLock.releaseLockEntry(lockEntry);<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>  }<a name="line.997"></a>
+<span class="sourceLineNo">998</span><a name="line.998"></a>
+<span class="sourceLineNo">999</span>  /**<a name="line.999"></a>
+<span class="sourceLineNo">1000</span>   * Add a new root-procedure to the executor.<a name="line.1000"></a>
+<span class="sourceLineNo">1001</span>   * @param proc the new procedure to execute.<a name="line.1001"></a>
+<span class="sourceLineNo">1002</span>   * @param nonceKey the registered unique identifier for this operation from the client or process.<a name="line.1002"></a>
+<span class="sourceLineNo">1003</span>   * @return the procedure id, that can be used to monitor the operation<a name="line.1003"></a>
+<span class="sourceLineNo">1004</span>   */<a name="line.1004"></a>
+<span class="sourceLineNo">1005</span>  @edu.umd.cs.findbugs.annotations.SuppressWarnings(value="NP_NULL_ON_SOME_PATH",<a name="line.1005"></a>
+<span class="sourceLineNo">1006</span>      justification = "FindBugs is blind to the check-for-null")<a name="line.1006"></a>
+<span class="sourceLineNo">1007</span>  public long submitProcedure(Procedure&lt;TEnvironment&gt; proc, NonceKey nonceKey) {<a name="line.1007"></a>
+<span class="sourceLineNo">1008</span>    Preconditions.checkArgument(lastProcId.get() &gt;= 0);<a name="line.1008"></a>
+<span class="sourceLineNo">1009</span><a name="line.1009"></a>
+<span class="sourceLineNo">1010</span>    prepareProcedure(proc);<a name="line.1010"></a>
+<span class="sourceLineNo">1011</span><a name="line.1011"></a>
+<span class="sourceLineNo">1012</span>    final Long currentProcId;<a name="line.1012"></a>
+<span class="sourceLineNo">1013</span>    if (nonceKey != null) {<a name="line.1013"></a>
+<span class="sourceLineNo">1014</span>      currentProcId = nonceKeysToProcIdsMap.get(nonceKey);<a name="line.1014"></a>
+<span class="sourceLineNo">1015</span>      Preconditions.checkArgument(currentProcId != null,<a name="line.1015"></a>
+<span class="sourceLineNo">1016</span>        "Expected nonceKey=" + nonceKey + " to be reserved, use registerNonce(); proc=" + proc);<a name="line.1016"></a>
+<span class="sourceLineNo">1017</span>    } else {<a name="line.1017"></a>
+<span class="sourceLineNo">1018</span>      currentProcId = nextProcId();<a name="line.1018"></a>
+<span class="sourceLineNo">1019</span>    }<a name="line.1019"></a>
 <span class="sourceLineNo">1020</span><a name="line.1020"></a>
-<span class="sourceLineNo">1021</span>    // Add the procedure to the executor<a name="line.1021"></a>
-<span class="sourceLineNo">1022</span>    return pushProcedure(proc);<a name="line.1022"></a>
-<span class="sourceLineNo">1023</span>  }<a name="line.1023"></a>
+<span class="sourceLineNo">1021</span>    // Initialize the procedure<a name="line.1021"></a>
+<span class="sourceLineNo">1022</span>    proc.setNonceKey(nonceKey);<a name="line.1022"></a>
+<span class="sourceLineNo">1023</span>    proc.setProcId(currentProcId.longValue());<a name="line.1023"></a>
 <span class="sourceLineNo">1024</span><a name="line.1024"></a>
-<span class="sourceLineNo">1025</span>  /**<a name="line.1025"></a>
-<span class="sourceLineNo">1026</span>   * Add a set of new root-procedure to the executor.<a name="line.1026"></a>
-<span class="sourceLineNo">1027</span>   * @param procs the new procedures to execute.<a name="line.1027"></a>
-<span class="sourceLineNo">1028</span>   */<a name="line.1028"></a>
-<span class="sourceLineNo">1029</span>  // TODO: Do we need to take nonces here?<a name="line.1029"></a>
-<span class="sourceLineNo">1030</span>  public void submitProcedures(Procedure&lt;TEnvironment&gt;[] procs) {<a name="line.1030"></a>
-<span class="sourceLineNo">1031</span>    Preconditions.checkArgument(lastProcId.get() &gt;= 0);<a name="line.1031"></a>
-<span class="sourceLineNo">1032</span>    if (procs == null || procs.length &lt;= 0) {<a name="line.1032"></a>
-<span class="sourceLineNo">1033</span>      return;<a name="line.1033"></a>
-<span class="sourceLineNo">1034</span>    }<a name="line.1034"></a>
-<span class="sourceLineNo">1035</span><a name="line.1035"></a>
-<span class="sourceLineNo">1036</span>    // Prepare procedure<a name="line.1036"></a>
-<span class="sourceLineNo">1037</span>    for (int i = 0; i &lt; procs.length; ++i) {<a name="line.1037"></a>
-<span class="sourceLineNo">1038</span>      prepareProcedure(procs[i]).setProcId(nextProcId());<a name="line.1038"></a>
-<span class="sourceLineNo">1039</span>    }<a name="line.1039"></a>
-<span class="sourceLineNo">1040</span><a name="line.1040"></a>
-<span class="sourceLineNo">1041</span>    // Commit the transaction<a name="line.1041"></a>
-<span class="sourceLineNo">1042</span>    store.insert(procs);<a name="line.1042"></a>
-<span class="sourceLineNo">1043</span>    if (LOG.isDebugEnabled()) {<a name="line.1043"></a>
-<span class="sourceLineNo">1044</span>      LOG.debug("Stored " + Arrays.toString(procs));<a name="line.1044"></a>
-<span class="sourceLineNo">1045</span>    }<a name="line.1045"></a>
-<span class="sourceLineNo">1046</span><a name="line.1046"></a>
-<span class="sourceLineNo">1047</span>    // Add the procedure to the executor<a name="line.1047"></a>
-<span class="sourceLineNo">1048</span>    for (int i = 0; i &lt; procs.length; ++i) {<a name="line.1048"></a>
-<span class="sourceLineNo">1049</span>      pushProcedure(procs[i]);<a name="line.1049"></a>
-<span class="sourceLineNo">1050</span>    }<a name="line.1050"></a>
-<span class="sourceLineNo">1051</span>  }<a name="line.1051"></a>
-<span class="sourceLineNo">1052</span><a name="line.1052"></a>
-<span class="sourceLineNo">1053</span>  private Procedure&lt;TEnvironment&gt; prepareProcedure(Procedure&lt;TEnvironment&gt; proc) {<a name="line.1053"></a>
-<span class="sourceLineNo">1054</span>    Preconditions.checkArgument(proc.getState() == ProcedureState.INITIALIZING);<a name="line.1054"></a>
-<span class="sourceLineNo">1055</span>    Preconditions.checkArgument(!proc.hasParent(), "unexpected parent", proc);<a name="line.1055"></a>
-<span class="sourceLineNo">1056</span>    if (this.checkOwnerSet) {<a name="line.1056"></a>
-<span class="sourceLineNo">1057</span>      Preconditions.checkArgument(proc.hasOwner(), "missing owner");<a name="line.1057"></a>
+<span class="sourceLineNo">1025</span>    // Commit the transaction<a name="line.1025"></a>
+<span class="sourceLineNo">1026</span>    store.insert(proc, null);<a name="line.1026"></a>
+<span class="sourceLineNo">1027</span>    LOG.debug("Stored {}", proc);<a name="line.1027"></a>
+<span class="sourceLineNo">1028</span><a name="line.1028"></a>
+<span class="sourceLineNo">1029</span>    // Add the procedure to the executor<a name="line.1029"></a>
+<span class="sourceLineNo">1030</span>    return pushProcedure(proc);<a name="line.1030"></a>
+<span class="sourceLineNo">1031</span>  }<a name="line.1031"></a>
+<span class="sourceLineNo">1032</span><a name="line.1032"></a>
+<span class="sourceLineNo">1033</span>  /**<a name="line.1033"></a>
+<span class="sourceLineNo">1034</span>   * Add a set of new root-procedure to the executor.<a name="line.1034"></a>
+<span class="sourceLineNo">1035</span>   * @param procs the new procedures to execute.<a name="line.1035"></a>
+<span class="sourceLineNo">1036</span>   */<a name="line.1036"></a>
+<span class="sourceLineNo">1037</span>  // TODO: Do we need to take nonces here?<a name="line.1037"></a>
+<span class="sourceLineNo">1038</span>  public void submitProcedures(Procedure&lt;TEnvironment&gt;[] procs) {<a name="line.1038"></a>
+<span class="sourceLineNo">1039</span>    Preconditions.checkArgument(lastProcId.get() &gt;= 0);<a name="line.1039"></a>
+<span class="sourceLineNo">1040</span>    if (procs == null || procs.length &lt;= 0) {<a name="line.1040"></a>
+<span class="sourceLineNo">1041</span>      return;<a name="line.1041"></a>
+<span class="sourceLineNo">1042</span>    }<a name="line.1042"></a>
+<span class="sourceLineNo">1043</span><a name="line.1043"></a>
+<span class="sourceLineNo">1044</span>    // Prepare procedure<a name="line.1044"></a>
+<span class="sourceLineNo">1045</span>    for (int i = 0; i &lt; procs.length; ++i) {<a name="line.1045"></a>
+<span class="sourceLineNo">1046</span>      prepareProcedure(procs[i]).setProcId(nextProcId());<a name="line.1046"></a>
+<span class="sourceLineNo">1047</span>    }<a name="line.1047"></a>
+<span class="sourceLineNo">1048</span><a name="line.1048"></a>
+<span class="sourceLineNo">1049</span>    // Commit the transaction<a name="line.1049"></a>
+<span class="sourceLineNo">1050</span>    store.insert(procs);<a name="line.1050"></a>
+<span class="sourceLineNo">1051</span>    if (LOG.isDebugEnabled()) {<a name="line.1051"></a>
+<span class="sourceLineNo">1052</span>      LOG.debug("Stored " + Arrays.toString(procs));<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>    // Add the procedure to the executor<a name="line.1055"></a>
+<span class="sourceLineNo">1056</span>    for (int i = 0; i &lt; procs.length; ++i) {<a name="line.1056"></a>
+<span class="sourceLineNo">1057</span>      pushProcedure(procs[i]);<a name="line.1057"></a>
 <span class="sourceLineNo">1058</span>    }<a name="line.1058"></a>
-<span class="sourceLineNo">1059</span>    return proc;<a name="line.1059"></a>
-<span class="sourceLineNo">1060</span>  }<a name="line.1060"></a>
-<span class="sourceLineNo">1061</span><a name="line.1061"></a>
-<span class="sourceLineNo">1062</span>  private long pushProcedure(Procedure&lt;TEnvironment&gt; proc) {<a name="line.1062"></a>
-<span class="sourceLineNo">1063</span>    final long currentProcId = proc.getProcId();<a name="line.1063"></a>
-<span class="sourceLineNo">1064</span><a name="line.1064"></a>
-<span class="sourceLineNo">1065</span>    // Update metrics on start of a procedure<a name="line.1065"></a>
-<span class="sourceLineNo">1066</span>    proc.updateMetricsOnSubmit(getEnvironment());<a name="line.1066"></a>
-<span class="sourceLineNo">1067</span><a name="line.1067"></a>
-<span class="sourceLineNo">1068</span>    // Create the rollback stack for the procedure<a name="line.1068"></a>
-<span class="sourceLineNo">1069</span>    RootProcedureState&lt;TEnvironment&gt; stack = new RootProcedureState&lt;&gt;();<a name="line.1069"></a>
-<span class="sourceLineNo">1070</span>    rollbackStack.put(currentProcId, stack);<a name="line.1070"></a>
-<span class="sourceLineNo">1071</span><a name="line.1071"></a>
-<span class="sourceLineNo">1072</span>    // Submit the new subprocedures<a name="line.1072"></a>
-<span class="sourceLineNo">1073</span>    assert !procedures.containsKey(currentProcId);<a name="line.1073"></a>
-<span class="sourceLineNo">1074</span>    procedures.put(currentProcId, proc);<a name="line.1074"></a>
-<span class="sourceLineNo">1075</span>    sendProcedureAddedNotification(currentProcId);<a name="line.1075"></a>
-<span class="sourceLineNo">1076</span>    scheduler.addBack(proc);<a name="line.1076"></a>
-<span class="sourceLineNo">1077</span>    return proc.getProcId();<a name="line.1077"></a>
-<span class="sourceLineNo">1078</span>  }<a name="line.1078"></a>
+<span class="sourceLineNo">1059</span>  }<a name="line.1059"></a>
+<span class="sourceLineNo">1060</span><a name="line.1060"></a>
+<span class="sourceLineNo">1061</span>  private Procedure&lt;TEnvironment&gt; prepareProcedure(Procedure&lt;TEnvironment&gt; proc) {<a name="line.1061"></a>
+<span class="sourceLineNo">1062</span>    Preconditions.checkArgument(proc.getState() == ProcedureState.INITIALIZING);<a name="line.1062"></a>
+<span class="sourceLineNo">1063</span>    Preconditions.checkArgument(!proc.hasParent(), "unexpected parent", proc);<a name="line.1063"></a>
+<span class="sourceLineNo">1064</span>    if (this.checkOwnerSet) {<a name="line.1064"></a>
+<span class="sourceLineNo">1065</span>      Preconditions.checkArgument(proc.hasOwner(), "missing owner");<a name="line.1065"></a>
+<span class="sourceLineNo">1066</span>    }<a name="line.1066"></a>
+<span class="sourceLineNo">1067</span>    return proc;<a name="line.1067"></a>
+<span class="sourceLineNo">1068</span>  }<a name="line.1068"></a>
+<span class="sourceLineNo">1069</span><a name="line.1069"></a>
+<span class="sourceLineNo">1070</span>  private long pushProcedure(Procedure&lt;TEnvironment&gt; proc) {<a name="line.1070"></a>
+<span class="sourceLineNo">1071</span>    final long currentProcId = proc.getProcId();<a name="line.1071"></a>
+<span class="sourceLineNo">1072</span><a name="line.1072"></a>
+<span class="sourceLineNo">1073</span>    // Update metrics on start of a procedure<a name="line.1073"></a>
+<span class="sourceLineNo">1074</span>    proc.updateMetricsOnSubmit(getEnvironment());<a name="line.1074"></a>
+<span class="sourceLineNo">1075</span><a name="line.1075"></a>
+<span class="sourceLineNo">1076</span>    // Create the rollback stack for the procedure<a name="line.1076"></a>
+<span class="sourceLineNo">1077</span>    RootProcedureState&lt;TEnvironment&gt; stack = new RootProcedureState&lt;&gt;();<a name="line.1077"></a>
+<span class="sourceLineNo">1078</span>    rollbackStack.put(currentProcId, stack);<a name="line.1078"></a>
 <span class="sourceLineNo">1079</span><a name="line.1079"></a>
-<span class="sourceLineNo">1080</span>  /**<a name="line.1080"></a>
-<span class="sourceLineNo">1081</span>   * Send an abort notification the specified procedure.<a name="line.1081"></a>
-<span class="sourceLineNo">1082</span>   * Depending on the procedure implementation the abort can be considered or ignored.<a name="line.1082"></a>
-<span class="sourceLineNo">1083</span>   * @param procId the procedure to abort<a name="line.1083"></a>
-<span class="sourceLineNo">1084</span>   * @return true if the procedure exists and has received the abort, otherwise false.<a name="line.1084"></a>
-<span class="sourceLineNo">1085</span>   */<a name="line.1085"></a>
-<span class="sourceLineNo">1086</span>  public boolean abort(long procId) {<a name="line.1086"></a>
-<span class="sourceLineNo">1087</span>    return abort(procId, true);<a name="line.1087"></a>
-<span class="sourceLineNo">1088</span>  }<a name="line.1088"></a>
-<span class="sourceLineNo">1089</span><a name="line.1089"></a>
-<span class="sourceLineNo">1090</span>  /**<a name="line.1090"></a>
-<span class="sourceLineNo">1091</span>   * Send an abort notification to the specified procedure.<a name="line.1091"></a>
-<span class="sourceLineNo">1092</span>   * Depending on the procedure implementation, the abort can be considered or ignored.<a name="line.1092"></a>
-<span class="sourceLineNo">1093</span>   * @param procId the procedure to abort<a name="line.1093"></a>
-<span class="sourceLineNo">1094</span>   * @param mayInterruptIfRunning if the proc completed at least one step, should it be aborted?<a name="line.1094"></a>
-<span class="sourceLineNo">1095</span>   * @return true if the procedure exists and has received the abort, otherwise false.<a name="line.1095"></a>
-<span class="sourceLineNo">1096</span>   */<a name="line.1096"></a>
-<span class="sourceLineNo">1097</span>  public boolean abort(long procId, boolean mayInterruptIfRunning) {<a name="line.1097"></a>
-<span class="sourceLineNo">1098</span>    Procedure&lt;TEnvironment&gt; proc = procedures.get(procId);<a name="line.1098"></a>
-<span class="sourceLineNo">1099</span>    if (proc != null) {<a name="line.1099"></a>
-<span class="sourceLineNo">1100</span>      if (!mayInterruptIfRunning &amp;&amp; proc.wasExecuted()) {<a name="line.1100"></a>
-<span class="sourceLineNo">1101</span>        return false;<a name="line.1101"></a>
-<span class="sourceLineNo">1102</span>      }<a name="line.1102"></a>
-<span class="sourceLineNo">1103</span>      return proc.abort(getEnvironment());<a name="line.1103"></a>
-<span class="sourceLineNo">1104</span>    }<a name="line.1104"></a>
-<span class="sourceLineNo">1105</span>    return false;<a name="line.1105"></a>
-<span class="sourceLineNo">1106</span>  }<a name="line.1106"></a>
-<span class="sourceLineNo">1107</span><a name="line.1107"></a>
-<span class="sourceLineNo">1108</span>  // ==========================================================================<a name="line.1108"></a>
-<span class="sourceLineNo">1109</span>  //  Executor query helpers<a name="line.1109"></a>
-<span class="sourceLineNo">1110</span>  // ==========================================================================<a name="line.1110"></a>
-<span class="sourceLineNo">1111</span>  public Procedure&lt;TEnvironment&gt; getProcedure(final long procId) {<a name="line.1111"></a>
-<span class="sourceLineNo">1112</span>    return procedures.get(procId);<a name="line.1112"></a>
-<span class="sourceLineNo">1113</span>  }<a name="line.1113"></a>
-<span class="sourceLineNo">1114</span><a name="line.1114"></a>
-<span class="sourceLineNo">1115</span>  public &lt;T extends Procedure&lt;TEnvironment&gt;&gt; T getProcedure(Class&lt;T&gt; clazz, long procId) {<a name="line.1115"></a>
-<span class="sourceLineNo">1116</span>    Procedure&lt;TEnvironment&gt; proc = getProcedure(procId);<a name="line.1116"></a>
-<span class="sourceLineNo">1117</span>    if (clazz.isInstance(proc)) {<a name="line.1117"></a>
-<span class="sourceLineNo">1118</span>      return clazz.cast(proc);<a name="line.1118"></a>
-<span class="sourceLineNo">1119</span>    }<a name="line.1119"></a>
-<span class="sourceLineNo">1120</span>    return null;<a name="line.1120"></a>
+<span class="sourceLineNo">1080</span>    // Submit the new subprocedures<a name="line.1080"></a>
+<span class="sourceLineNo">1081</span>    assert !procedures.containsKey(currentProcId);<a name="line.1081"></a>
+<span class="sourceLineNo">1082</span>    procedures.put(currentProcId, proc);<a name="line.1082"></a>
+<span class="sourceLineNo">1083</span>    sendProcedureAddedNotification(currentProcId);<a name="line.1083"></a>
+<span class="sourceLineNo">1084</span>    scheduler.addBack(proc);<a name="line.1084"></a>
+<span class="sourceLineNo">1085</span>    return proc.getProcId();<a name="line.1085"></a>
+<span class="sourceLineNo">1086</span>  }<a name="line.1086"></a>
+<span class="sourceLineNo">1087</span><a name="line.1087"></a>
+<span class="sourceLineNo">1088</span>  /**<a name="line.1088"></a>
+<span class="sourceLineNo">1089</span>   * Send an abort notification the specified procedure.<a name="line.1089"></a>
+<span class="sourceLineNo">1090</span>   * Depending on the procedure implementation the abort can be considered or ignored.<a name="line.1090"></a>
+<span class="sourceLineNo">1091</span>   * @param procId the procedure to abort<a name="line.1091"></a>
+<span class="sourceLineNo">1092</span>   * @return true if the procedure exists and has received the abort, otherwise false.<a name="line.1092"></a>
+<span class="sourceLineNo">1093</span>   */<a name="line.1093"></a>
+<span class="sourceLineNo">1094</span>  public boolean abort(long procId) {<a name="line.1094"></a>
+<span class="sourceLineNo">1095</span>    return abort(procId, true);<a name="line.1095"></a>
+<span class="sourceLineNo">1096</span>  }<a name="line.1096"></a>
+<span class="sourceLineNo">1097</span><a name="line.1097"></a>
+<span class="sourceLineNo">1098</span>  /**<a name="line.1098"></a>
+<span class="sourceLineNo">1099</span>   * Send an abort notification to the specified procedure.<a name="line.1099"></a>
+<span class="sourceLineNo">1100</span>   * Depending on the procedure implementation, the abort can be considered or ignored.<a name="line.1100"></a>
+<span class="sourceLineNo">1101</span>   * @param procId the procedure to abort<a name="line.1101"></a>
+<span class="sourceLineNo">1102</span>   * @param mayInterruptIfRunning if the proc completed at least one step, should it be aborted?<a name="line.1102"></a>
+<span class="sourceLineNo">1103</span>   * @return true if the procedure exists and has received the abort, otherwise false.<a name="line.1103"></a>
+<span class="sourceLineNo">1104</span>   */<a name="line.1104"></a>
+<span class="sourceLineNo">1105</span>  public boolean abort(long procId, boolean mayInterruptIfRunning) {<a name="line.1105"></a>
+<span class="sourceLineNo">1106</span>    Procedure&lt;TEnvironment&gt; proc = procedures.get(procId);<a name="line.1106"></a>
+<span class="sourceLineNo">1107</span>    if (proc != null) {<a name="line.1107"></a>
+<span class="sourceLineNo">1108</span>      if (!mayInterruptIfRunning &amp;&amp; proc.wasExecuted()) {<a name="line.1108"></a>
+<span class="sourceLineNo">1109</span>        return false;<a name="line.1109"></a>
+<span class="sourceLineNo">1110</span>      }<a name="line.1110"></a>
+<span class="sourceLineNo">1111</span>      return proc.abort(getEnvironment());<a name="line.1111"></a>
+<span class="sourceLineNo">1112</span>    }<a name="line.1112"></a>
+<span class="sourceLineNo">1113</span>    return false;<a name="line.1113"></a>
+<span class="sourceLineNo">1114</span>  }<a name="line.1114"></a>
+<span class="sourceLineNo">1115</span><a name="line.1115"></a>
+<span class="sourceLineNo">1116</span>  // ==========================================================================<a name="line.1116"></a>
+<span class="sourceLineNo">1117</span>  //  Executor query helpers<a name="line.1117"></a>
+<span class="sourceLineNo">1118</span>  // ==========================================================================<a name="line.1118"></a>
+<span class="sourceLineNo">1119</span>  public Procedure&lt;TEnvironment&gt; getProcedure(final long procId) {<a name="line.1119"></a>
+<span class="sourceLineNo">1120</span>    return procedures.get(procId);<a name="line.1120"></a>
 <span class="sourceLineNo">1121</span>  }<a name="line.1121"></a>
 <span class="sourceLineNo">1122</span><a name="line.1122"></a>
-<span class="sourceLineNo">1123</span>  public Procedure&lt;TEnvironment&gt; getResult(long procId) {<a name="line.1123"></a>
-<span class="sourceLineNo">1124</span>    CompletedProcedureRetainer&lt;TEnvironment&gt; retainer = completed.get(procId);<a name="line.1124"></a>
-<span class="sourceLineNo">1125</span>    if (retainer == null) {<a name="line.1125"></a>
-<span class="sourceLineNo">1126</span>      return null;<a name="line.1126"></a>
-<span class="sourceLineNo">1127</span>    } else {<a name="line.1127"></a>
-<span class="sourceLineNo">1128</span>      return retainer.getProcedure();<a name="line.1128"></a>
-<span class="sourceLineNo">1129</span>    }<a name="line.1129"></a>
-<span class="sourceLineNo">1130</span>  }<a name="line.1130"></a>
-<span class="sourceLineNo">1131</span><a name="line.1131"></a>
-<span class="sourceLineNo">1132</span>  /**<a name="line.1132"></a>
-<span class="sourceLineNo">1133</span>   * Return true if the procedure is finished.<a name="line.1133"></a>
-<span class="sourceLineNo">1134</span>   * The state may be "completed successfully" or "failed and rolledback".<a name="line.1134"></a>
-<span class="sourceLineNo">1135</span>   * Use getResult() to check the state or get the result data.<a name="line.1135"></a>
-<span class="sourceLineNo">1136</span>   * @param procId the ID of the procedure to check<a name="line.1136"></a>
-<span class="sourceLineNo">1137</span>   * @return true if the procedure execution is finished, otherwise false.<a name="line.1137"></a>
-<span class="sourceLineNo">1138</span>   */<a name="line.1138"></a>
-<span class="sourceLineNo">1139</span>  public boolean isFinished(final long procId) {<a name="line.1139"></a>
-<span class="sourceLineNo">1140</span>    return !procedures.containsKey(procId);<a name="line.1140"></a>
-<span class="sourceLineNo">1141</span>  }<a name="line.1141"></a>
-<span class="sourceLineNo">1142</span><a name="line.1142"></a>
-<span class="sourceLineNo">1143</span>  /**<a name="line.1143"></a>
-<span class="sourceLineNo">1144</span>   * Return true if the procedure is started.<a name="line.1144"></a>
-<span class="sourceLineNo">1145</span>   * @param procId the ID of the procedure to check<a name="line.1145"></a>
-<span class="sourceLineNo">1146</span>   * @return true if the procedure execution is started, otherwise false.<a name="line.1146"></a>
-<span class="sourceLineNo">1147</span>   */<a name="line.1147"></a>
-<span class="sourceLineNo">1148</span>  public boolean isStarted(long procId) {<a name="line.1148"></a>
-<span class="sourceLineNo">1149</span>    Procedure&lt;?&gt; proc = procedures.get(procId);<a name="line.1149"></a>
-<span class="sourceLineNo">1150</span>    if (proc == null) {<a name="line.1150"></a>
-<span class="sourceLineNo">1151</span>      return completed.get(procId) != null;<a name="line.1151"></a>
-<span class="sourceLineNo">1152</span>    }<a name="line.1152"></a>
-<span class="sourceLineNo">1153</span>    return proc.wasExecuted();<a name="line.1153"></a>
-<span class="sourceLineNo">1154</span>  }<a name="line.1154"></a>
-<span class="sourceLineNo">1155</span><a name="line.1155"></a>
-<span class="sourceLineNo">1156</span>  /**<a name="line.1156"></a>
-<span class="sourceLineNo">1157</span>   * Mark the specified completed procedure, as ready to remove.<a name="line.1157"></a>
-<span class="sourceLineNo">1158</span>   * @param procId the ID of the procedure to remove<a name="line.1158"></a>
-<span class="sourceLineNo">1159</span>   */<a name="line.1159"></a>
-<span class="sourceLineNo">1160</span>  public void removeResult(long procId) {<a name="line.1160"></a>
-<span class="sourceLineNo">1161</span>    CompletedProcedureRetainer&lt;TEnvironment&gt; retainer = completed.get(procId);<a name="line.1161"></a>
-<span class="sourceLineNo">1162</span>    if (retainer == null) {<a name="line.1162"></a>
-<span class="sourceLineNo">1163</span>      assert !procedures.containsKey(procId) : "pid=" + procId + " is still running";<a name="line.1163"></a>
-<span class="sourceLineNo">1164</span>      LOG.debug("pid={} already removed by the cleaner.", procId);<a name="line.1164"></a>
-<span class="sourceLineNo">1165</span>      return;<a name="line.1165"></a>
-<span class="sourceLineNo">1166</span>    }<a name="line.1166"></a>
-<span class="sourceLineNo">1167</span><a name="line.1167"></a>
-<span class="sourceLineNo">1168</span>    // The CompletedProcedureCleaner will take care of deletion, once the TTL is expired.<a name="line.1168"></a>
-<span class="sourceLineNo">1169</span>    retainer.setClientAckTime(EnvironmentEdgeManager.currentTime());<a name="line.1169"></a>
-<span class="sourceLineNo">1170</span>  }<a name="line.1170"></a>
-<span class="sourceLineNo">1171</span><a name="line.1171"></a>
-<span class="sourceLineNo">1172</span>  public Procedure&lt;TEnvironment&gt; getResultOrProcedure(long procId) {<a name="line.1172"></a>
-<span class="sourceLineNo">1173</span>    CompletedProcedureRetainer&lt;TEnvironment&gt; retainer = completed.get(procId);<a name="line.1173"></a>
-<span class="sourceLineNo">1174</span>    if (retainer == null) {<a name="line.1174"></a>
-<span class="sourceLineNo">1175</span>      return procedures.get(procId);<a name="line.1175"></a>
-<span class="sourceLineNo">1176</span>    } else {<a name="line.1176"></a>
-<span class="sourceLineNo">1177</span>      return retainer.getProcedure();<a name="line.1177"></a>
-<span class="sourceLineNo">1178</span>    }<a name="line.1178"></a>
-<span class="sourceLineNo">1179</span>  }<a name="line.1179"></a>
-<span class="sourceLineNo">1180</span><a name="line.1180"></a>
-<span class="sourceLineNo">1181</span>  /**<a name="line.1181"></a>
-<span class="sourceLineNo">1182</span>   * Check if the user is this procedure's owner<a name="line.1182"></a>
-<span class="sourceLineNo">1183</span>   * @param procId the target procedure<a name="line.1183"></a>
-<span class="sourceLineNo">1184</span>   * @param user the user<a name="line.1184"></a>
-<span class="sourceLineNo">1185</span>   * @return true if the user is the owner of the procedure,<a name="line.1185"></a>
-<span class="sourceLineNo">1186</span>   *   false otherwise or the owner is unknown.<a name="line.1186"></a>
-<span class="sourceLineNo">1187</span>   */<a name="line.1187"></a>
-<span class="sourceLineNo">1188</span>  public boolean isProcedureOwner(long procId, User user) {<a name="line.1188"></a>
-<span class="sourceLineNo">1189</span>    if (user == null) {<a name="line.1189"></a>
-<span class="sourceLineNo">1190</span>      return false;<a name="line.1190"></a>
-<span class="sourceLineNo">1191</span>    }<a name="line.1191"></a>
-<span class="sourceLineNo">1192</span>    final Procedure&lt;TEnvironment&gt; runningProc = procedures.get(procId);<a name="line.1192"></a>
-<span class="sourceLineNo">1193</span>    if (runningProc != null) {<a name="line.1193"></a>
-<span class="sourceLineNo">1194</span>      return runningProc.getOwner().equals(user.getShortName());<a name="line.1194"></a>
-<span class="sourceLineNo">1195</span>    }<a name="line.1195"></a>
-<span class="sourceLineNo">1196</span><a name="line.1196"></a>
-<span class="sourceLineNo">1197</span>    final CompletedProcedureRetainer&lt;TEnvironment&gt; retainer = completed.get(procId);<a name="line.1197"></a>
-<span class="sourceLineNo">1198</span>    if (retainer != null) {<a name="line.1198"></a>
-<span class="sourceLineNo">1199</span>      return retainer.getProcedure().getOwner().equals(user.getShortName());<a name="line.1199"></a>
-<span class="sourceLineNo">1200</span>    }<a name="line.1200"></a>
-<span class="sourceLineNo">1201</span><a name="line.1201"></a>
-<span class="sourceLineNo">1202</span>    // Procedure either does not exist or has already completed and got cleaned up.<a name="line.1202"></a>
-<span class="sourceLineNo">1203</span>    // At this time, we cannot check the owner of the procedure<a name="line.1203"></a>
-<span class="sourceLineNo">1204</span>    return false;<a name="line.1204"></a>
-<span class="sourceLineNo">1205</span>  }<a name="line.1205"></a>
-<span class="sourceLineNo">1206</span><a name="line.1206"></a>
-<span class="sourceLineNo">1207</span>  /**<a name="line.1207"></a>
-<span class="sourceLineNo">1208</span>   * Should only be used when starting up, where the procedure workers have not been started.<a name="line.1208"></a>
-<span class="sourceLineNo">1209</span>   * &lt;p/&gt;<a name="line.1209"></a>
-<span class="sourceLineNo">1210</span>   * If the procedure works has been started, the return values maybe changed when you are<a name="line.1210"></a>
-<span class="sourceLineNo">1211</span>   * processing it so usually this is not safe. Use {@link #getProcedures()} below for most cases as<a name="line.1211"></a>
-<span class="sourceLineNo">1212</span>   * it will do a copy, and also include the finished procedures.<a name="line.1212"></a>
-<span class="sourceLineNo">1213</span>   */<a name="line.1213"></a>
-<span class="sourceLineNo">1214</span>  public Collection&lt;Procedure&lt;TEnvironment&gt;&gt; getActiveProceduresNoCopy() {<a name="line.1214"></a>
-<span class="sourceLineNo">1215</span>    return procedures.values();<a name="line.1215"></a>
-<span class="sourceLineNo">1216</span>  }<a name="line.1216"></a>
-<span class="sourceLineNo">1217</span><a name="line.1217"></a>
-<span class="sourceLineNo">1218</span>  /**<a name="line.1218"></a>
-<span class="sourceLineNo">1219</span>   * Get procedures.<a name="line.1219"></a>
-<span class="sourceLineNo">1220</span>   * @return the procedures in a list<a name="line.1220"></a>
+<span class="sourceLineNo">1123</span>  public &lt;T extends Procedure&lt;TEnvironment&gt;&gt; T getProcedure(Class&lt;T&gt; clazz, long procId) {<a name="line.1123"></a>
+<span class="sourceLineNo">1124</span>    Procedure&lt;TEnvironment&gt; proc = getProcedure(procId);<a name="line.1124"></a>
+<span class="sourceLineNo">1125</span>    if (clazz.isInstance(proc)) {<a name="line.1125"></a>
+<span class="sourceLineNo">1126</span>      return clazz.cast(proc);<a name="line.1126"></a>
+<span class="sourceLineNo">1127</span>    }<a name="line.1127"></a>
+<span class="sourceLineNo">1128</span>    return null;<a name="line.1128"></a>
+<span class="sourceLineNo">1129</span>  }<a name="line.1129"></a>
+<span class="sourceLineNo">1130</span><a name="line.1130"></a>
+<span class="sourceLineNo">1131</span>  public Procedure&lt;TEnvironment&gt; getResult(long procId) {<a name="line.1131"></a>
+<span class="sourceLineNo">1132</span>    CompletedProcedureRetainer&lt;TEnvironment&gt; retainer = completed.get(procId);<a name="line.1132"></a>
+<span class="sourceLineNo">1133</span>    if (retainer == null) {<a name="line.1133"></a>
+<span class="sourceLineNo">1134</span>      return null;<a name="line.1134"></a>
+<span class="sourceLineNo">1135</span>    } else {<a name="line.1135"></a>
+<span class="sourceLineNo">1136</span>      return retainer.getProcedure();<a name="line.1136"></a>
+<span class="sourceLineNo">1137</span>    }<a name="line.1137"></a>
+<span class="sourceLineNo">1138</span>  }<a name="line.1138"></a>
+<span class="sourceLineNo">1139</span><a name="line.1139"></a>
+<span class="sourceLineNo">1140</span>  /**<a name="line.1140"></a>
+<span class="sourceLineNo">1141</span>   * Return true if the procedure is finished.<a name="line.1141"></a>
+<span class="sourceLineNo">1142</span>   * The state may be "completed successfully" or "failed and rolledback".<a name="line.1142"></a>
+<span class="sourceLineNo">1143</span>   * Use getResult() to check the state or get the result data.<a name="line.1143"></a>
+<span class="sourceLineNo">1144</span>   * @param procId the ID of the procedure to check<a name="line.1144"></a>
+<span class="sourceLineNo">1145</span>   * @return true if the procedure execution is finished, otherwise false.<a name="line.1145"></a>
+<span class="sourceLineNo">1146</span>   */<a name="line.1146"></a>
+<span class="sourceLineNo">1147</span>  public boolean isFinished(final long procId) {<a name="line.1147"></a>
+<span class="sourceLineNo">1148</span>    return !procedures.containsKey(procId);<a name="line.1148"></a>
+<span class="sourceLineNo">1149</span>  }<a name="line.1149"></a>
+<span class="sourceLineNo">1150</span><a name="line.1150"></a>
+<span class="sourceLineNo">1151</span>  /**<a name="line.1151"></a>
+<span class="sourceLineNo">1152</span>   * Return true if the procedure is started.<a name="line.1152"></a>
+<span class="sourceLineNo">1153</span>   * @param procId the ID of the procedure to check<a name="line.1153"></a>
+<span class="sourceLineNo">1154</span>   * @return true if the procedure execution is started, otherwise false.<a name="line.1154"></a>
+<span class="sourceLineNo">1155</span>   */<a name="line.1155"></a>
+<span class="sourceLineNo">1156</span>  public boolean isStarted(long procId) {<a name="line.1156"></a>
+<span class="sourceLineNo">1157</span>    Procedure&lt;?&gt; proc = procedures.get(procId);<a name="line.1157"></a>
+<span class="sourceLineNo">1158</span>    if (proc == null) {<a name="line.1158"></a>
+<span class="sourceLineNo">1159</span>      return completed.get(procId) != null;<a name="line.1159"></a>
+<span class="sourceLineNo">1160</span>    }<a name="line.1160"></a>
+<span class="sourceLineNo">1161</span>    return proc.wasExecuted();<a name="line.1161"></a>
+<span class="sourceLineNo">1162</span>  }<a name="line.1162"></a>
+<span class="sourceLineNo">1163</span><a name="line.1163"></a>
+<span class="sourceLineNo">1164</span>  /**<a name="line.1164"></a>
+<span class="sourceLineNo">1165</span>   * Mark the specified completed procedure, as ready to remove.<a name="line.1165"></a>
+<span class="sourceLineNo">1166</span>   * @param procId the ID of the procedure to remove<a name="line.1166"></a>
+<span class="sourceLineNo">1167</span>   */<a name="line.1167"></a>
+<span class="sourceLineNo">1168</span>  public void removeResult(long procId) {<a name="line.1168"></a>
+<span class="sourceLineNo">1169</span>    CompletedProcedureRetainer&lt;TEnvironment&gt; retainer = completed.get(procId);<a name="line.1169"></a>
+<span class="sourceLineNo">1170</span>    if (retainer == null) {<a name="line.1170"></a>
+<span class="sourceLineNo">1171</span>      assert !procedures.containsKey(procId) : "pid=" + procId + " is still running";<a name="line.1171"></a>
+<span class="sourceLineNo">1172</span>      LOG.debug("pid={} already removed by the cleaner.", procId);<a name="line.1172"></a>
+<span class="sourceLineNo">1173</span>      return;<a name="line.1173"></a>
+<span class="sourceLineNo">1174</span>    }<a name="line.1174"></a>
+<span class="sourceLineNo">1175</span><a name="line.1175"></a>
+<span class="sourceLineNo">1176</span>    // The CompletedProcedureCleaner will take care of deletion, once the TTL is expired.<a name="line.1176"></a>
+<span class="sourceLineNo">1177</span>    retainer.setClientAckTime(EnvironmentEdgeManager.currentTime());<a name="line.1177"></a>
+<span class="sourceLineNo">1178</span>  }<a name="line.1178"></a>
+<span class="sourceLineNo">1179</span><a name="line.1179"></a>
+<span class="sourceLineNo">1180</span>  public Procedure&lt;TEnvironment&gt; getResultOrProcedure(long procId) {<a name="line.1180"></a>
+<span class="sourceLineNo">1181</span>    CompletedProcedureRetainer&lt;TEnvironment&gt; retainer = completed.get(procId);<a name="line.1181"></a>
+<span class="sourceLineNo">1182</span>    if (retainer == null) {<a name="line.1182"></a>
+<span class="sourceLineNo">1183</span>      return procedures.get(procId);<a name="line.1183"></a>
+<span class="sourceLineNo">1184</span>    } else {<a name="line.1184"></a>
+<span class="sourceLineNo">1185</span>      return retainer.getProcedure();<a name="line.1185"></a>
+<span class="sourceLineNo">1186</span>    }<a name="line.1186"></a>
+<span class="sourceLineNo">1187</span>  }<a name="line.1187"></a>
+<span class="sourceLineNo">1188</span><a name="line.1188"></a>
+<span class="sourceLineNo">1189</span>  /**<a name="line.1189"></a>
+<span class="sourceLineNo">1190</span>   * Check if the user is this procedure's owner<a name="line.1190"></a>
+<span class="sourceLineNo">1191</span>   * @param procId the target procedure<a name="line.1191"></a>
+<span class="sourceLineNo">1192</span>   * @param user the user<a name="line.1192"></a>
+<span class="sourceLineNo">1193</span>   * @return true if the user is the owner of the procedure,<a name="line.1193"></a>
+<span class="sourceLineNo">1194</span>   *   false otherwise or the owner is unknown.<a name="line.1194"></a>
+<span class="sourceLineNo">1195</span>   */<a name="line.1195"></a>
+<span class="sourceLineNo">1196</span>  public boolean isProcedureOwner(long procId, User user) {<a name="line.1196"></a>
+<span class="sourceLineNo">1197</span>    if (user == null) {<a name="line.1197"></a>
+<span class="sourceLineNo">1198</span>      return false;<a name="line.1198"></a>
+<span class="sourceLineNo">1199</span>    }<a name="line.1199"></a>
+<span class="sourceLineNo">1200</span>    final Procedure&lt;TEnvironment&gt; runningProc = procedures.get(procId);<a name="line.1200"></a>
+<span class="sourceLineNo">1201</span>    if (runningProc != null) {<a name="line.1201"></a>
+<span class="sourceLineNo">1202</span>      return runningProc.getOwner().equals(user.getShortName());<a name="line.1202"></a>
+<span class="sourceLineNo">1203</span>    }<a name="line.1203"></a>
+<span class="sourceLineNo">1204</span><a name="line.1204"></a>
+<span class="sourceLineNo">1205</span>    final CompletedProcedureRetainer&lt;TEnvironment&gt; retainer = completed.get(procId);<a name="line.1205"></a>
+<span class="sourceLineNo">1206</span>    if (retainer != null) {<a name="line.1206"></a>
+<span class="sourceLineNo">1207</span>      return retainer.getProcedure().getOwner().equals(user.getShortName());<a name="line.1207"></a>
+<span class="sourceLineNo">1208</span>    }<a name="line.1208"></a>
+<span class="sourceLineNo">1209</span><a name="line.1209"></a>
+<span class="sourceLineNo">1210</span>    // Procedure either does not exist or has already completed and got cleaned up.<a name="line.1210"></a>
+<span class="sourceLineNo">1211</span>    // At this time, we cannot check the owner of the procedure<a name="line.1211"></a>
+<span class="sourceLineNo">1212</span>    return false;<a name="line.1212"></a>
+<span class="sourceLineNo">1213</span>  }<a name="line.1213"></a>
+<span class="sourceLineNo">1214</span><a name="line.1214"></a>
+<span class="sourceLineNo">1215</span>  /**<a name="line.1215"></a>
+<span class="sourceLineNo">1216</span>   * Should only be used when starting up, where the procedure workers have not been started.<a name="line.1216"></a>
+<span class="sourceLineNo">1217</span>   * &lt;p/&gt;<a name="line.1217"></a>
+<span class="sourceLineNo">1218</span>   * If the procedure works has been started, the return values maybe changed when you are<a name="line.1218"></a>
+<span class="sourceLineNo">1219</span>   * processing it so usually this is not safe. Use {@link #getProcedures()} below for most cases as<a name="line.1219"></a>
+<span class="sourceLineNo">1220</span>   * it will do a copy, and also include the finished procedures.<a name="line.1220"></a>
 <span class="sourceLineNo">1221</span>   */<a name="line.1221"></a>
-<span class="sourceLineNo">1222</span>  public List&lt;Procedure&lt;TEnvironment&gt;&gt; getProcedures() {<a name="line.1222"></a>
-<span class="sourceLineNo">1223</span>    List&lt;Procedure&lt;TEnvironment&gt;&gt; procedureList =<a name="line.1223"></a>
-<span class="sourceLineNo">1224</span>      new ArrayList&lt;&gt;(procedures.size() + completed.size());<a name="line.1224"></a>
-<span class="sourceLineNo">1225</span>    procedureList.addAll(procedures.values());<a name="line.1225"></a>
-<span class="sourceLineNo">1226</span>    // Note: The procedure could show up twice in the list with different state, as<a name="line.1226"></a>
-<span class="sourceLineNo">1227</span>    // it could complete after we walk through procedures list and insert into<a name="line.1227"></a>
-<span class="sourceLineNo">1228</span>    // procedureList - it is ok, as we will use the information in the Procedure<a name="line.1228"></a>
-<span class="sourceLineNo">1229</span>    // to figure it out; to prevent this would increase the complexity of the logic.<a name="line.1229"></a>
-<span class="sourceLineNo">1230</span>    completed.values().stream().map(CompletedProcedureRetainer::getProcedure)<a name="line.1230"></a>
-<span class="sourceLineNo">1231</span>      .forEach(procedureList::add);<a name="line.1231"></a>
-<span class="sourceLineNo">1232</span>    return procedureList;<a name="line.1232"></a>
-<span class="sourceLineNo">1233</span>  }<a name="line.1233"></a>
-<span class="sourceLineNo">1234</span><a name="line.1234"></a>
-<span class="sourceLineNo">1235</span>  // ==========================================================================<a name="line.1235"></a>
-<span class="sourceLineNo">1236</span>  //  Listeners helpers<a name="line.1236"></a>
-<span class="sourceLineNo">1237</span>  // ==========================================================================<a name="line.1237"></a>
-<span class="sourceLineNo">1238</span>  public void registerListener(ProcedureExecutorListener listener) {<a name="line.1238"></a>
-<span class="sourceLineNo">1239</span>    this.listeners.add(listener);<a name="line.1239"></a>
-<span class="sourceLineNo">1240</span>  }<a name="line.1240"></a>
-<span class="sourceLineNo">1241</span><a name="line.1241"></a>
-<span class="sourceLineNo">1242</span>  public boolean unregisterListener(ProcedureExecutorListener listener) {<a name="line.1242"></a>
-<span class="sourceLineNo">1243</span>    return this.listeners.remove(listener);<a name="line.1243"></a>
-<span class="sourceLineNo">1244</span>  }<a name="line.1244"></a>
-<span class="sourceLineNo">1245</span><a name="line.1245"></a>
-<span class="sourceLineNo">1246</span>  private void sendProcedureLoadedNotification(final long procId) {<a name="line.1246"></a>
-<span class="sourceLineNo">1247</span>    if (!this.listeners.isEmpty()) {<a name="line.1247"></a>
-<span class="sourceLineNo">1248</span>      for (ProcedureExecutorListener listener: this.listeners) {<a name="line.1248"></a>
-<span class="sourceLineNo">1249</span>        try {<a name="line.1249"></a>
-<span class="sourceLineNo">1250</span>          listener.procedureLoaded(procId);<a name="line.1250"></a>
-<span class="sourceLineNo">1251</span>        } catch (Throwable e) {<a name="line.1251"></a>
-<span class="sourceLineNo">1252</span>          LOG.error("Listener " + listener + " had an error: " + e.getMessage(), e);<a name="line.1252"></a>
-<span class="sourceLineNo">1253</span>        }<a name="line.1253"></a>
-<span class="sourceLineNo">1254</span>      }<a name="line.1254"></a>
-<span class="sourceLineNo">1255</span>    }<a name="line.1255"></a>
-<span class="sourceLineNo">1256</span>  }<a name="line.1256"></a>
-<span class="sourceLineNo">1257</span><a name="line.1257"></a>
-<span class="sourceLineNo">1258</span>  private void sendProcedureAddedNotification(final long procId) {<a name="line.1258"></a>
-<span class="sourceLineNo">1259</span>    if (!this.listeners.isEmpty()) {<a name="line.1259"></a>
-<span class="sourceLineNo">1260</span>      for (ProcedureExecutorListener listener: this.listeners) {<a name="line.1260"></a>
-<span class="sourceLineNo">1261</span>        try {<a name="line.1261"></a>
-<span class="sourceLineNo">1262</span>          listener.procedureAdded(procId);<a name="line.1262"></a>
-<span class="sourceLineNo">1263</span>        } catch (Throwable e) {<a name="line.1263"></a>
-<span class="sourceLineNo">1264</span>          LOG.error("Listener " + listener + " had an error: " + e.getMessage(), e);<a name="line.1264"></a>
-<span class="sourceLineNo">1265</span>        }<a name="line.1265"></a>
-<span class="sourceLineNo">1266</span>      }<a name="line.1266"></a>
-<span class="sourceLineNo">1267</span>    }<a name="line.1267"></a>
-<span class="sourceLineNo">1268</span>  }<a name="line.1268"></a>
-<span class="sourceLineNo">1269</span><a name="line.1269"></a>
-<span class="sourceLineNo">1270</span>  private void sendProcedureFinishedNotification(final long procId) {<a name="line.1270"></a>
-<span class="sourceLineNo">1271</span>    if (!this.listeners.isEmpty()) {<a name="line.1271"></a>
-<span class="sourceLineNo">1272</span>      for (ProcedureExecutorListener listener: this.listeners) {<a name="line.1272"></a>
-<span class="sourceLineNo">1273</span>        try {<a name="line.1273"></a>
-<span class="sourceLineNo">1274</span>          listener.procedureFinished(procId);<a name="line.1274"></a>
-<span class="sourceLineNo">1275</span>        } catch (Throwable e) {<a name="line.1275"></a>
-<span class="sourceLineNo">1276</span>          LOG.error("Listener " + listener + " had an error: " + e.getMessage(), e);<a name="line.1276"></a>
-<span class="sourceLineNo">1277</span>        }<a name="line.1277"></a>
-<span class="sourceLineNo">1278</span>      }<a name="line.1278"></a>
-<span class="sourceLineNo">1279</span>    }<a name="line.1279"></a>
-<span class="sourceLineNo">1280</span>  }<a name="line.1280"></a>
-<span class="sourceLineNo">1281</span><a name="line.1281"></a>
-<span class="sourceLineNo">1282</span>  // ==========================================================================<a name="line.1282"></a>
-<span class="sourceLineNo">1283</span>  //  Procedure IDs helpers<a name="line.1283"></a>
-<span class="sourceLineNo">1284</span>  // ==========================================================================<a name="line.1284"></a>
-<span class="sourceLineNo">1285</span>  private long nextProcId() {<a name="line.1285"></a>
-<span class="sourceLineNo">1286</span>    long procId = lastProcId.incrementAndGet();<a name="line.1286"></a>
-<span class="sourceLineNo">1287</span>    if (procId &lt; 0) {<a name="line.1287"></a>
-<span class="sourceLineNo">1288</span>      while (!lastProcId.compareAndSet(procId, 0)) {<a name="line.1288"></a>
-<span class="sourceLineNo">1289</span>        procId = lastProcId.get();<a name="line.1289"></a>
-<span class="sourceLineNo">1290</span>        if (procId &gt;= 0)<a name="line.1290"></a>
-<span class="sourceLineNo">1291</span>          break;<a name="line.1291"></a>
-<span class="sourceLineNo">1292</span>      }<a name="line.1292"></a>
-<span class="sourceLineNo">1293</span>      while (procedures.containsKey(procId)) {<a name="line.1293"></a>
-<span class="sourceLineNo">1294</span>        procId = lastProcId.incrementAndGet();<a name="line.1294"></a>
-<span class="sourceLineNo">1295</span>      }<a name="line.1295"></a>
-<span class="sourceLineNo">1296</span>    }<a name="line.1296"></a>
-<span class="sourceLineNo">1297</span>    assert procId &gt;= 0 : "Invalid procId " + procId;<a name="line.1297"></a>
-<span class="sourceLineNo">1298</span>    return procId;<a name="line.1298"></a>
-<span class="sourceLineNo">1299</span>  }<a name="line.1299"></a>
-<span class="sourceLineNo">1300</span><a name="line.1300"></a>
-<span class="sourceLineNo">1301</span>  @VisibleForTesting<a name="line.1301"></a>
-<span class="sourceLineNo">1302</span>  protected long getLastProcId() {<a name="line.1302"></a>
-<span class="sourceLineNo">1303</span>    return lastProcId.get();<a name="line.1303"></a>
-<span class="sourceLineNo">1304</span>  }<a name="line.1304"></a>
-<span class="sourceLineNo">1305</span><a name="line.1305"></a>
-<span class="sourceLineNo">1306</span>  @VisibleForTesting<a name="line.1306"></a>
-<span class="sourceLineNo">1307</span>  public Set&lt;Long&gt; getActiveProcIds() {<a name="line.1307"></a>
-<span class="sourceLineNo">1308</span>    return procedures.keySet();<a name="line.1308"></a>
-<span class="sourceLineNo">1309</span>  }<a name="line.1309"></a>
-<span class="sourceLineNo">1310</span><a name="line.1310"></a>
-<span class="sourceLineNo">1311</span>  Long getRootProcedureId(Procedure&lt;TEnvironment&gt; proc) {<a name="line.1311"></a>
-<span class="sourceLineNo">1312</span>    return Procedure.getRootProcedureId(procedures, proc);<a name="line.1312"></a>
-<span class="sourceLineNo">1313</span>  }<a name="line.1313"></a>
-<span class="sourceLineNo">1314</span><a name="line.1314"></a>
-<span class="sourceLineNo">1315</span>  // ==========================================================================<a name="line.1315"></a>
-<span class="sourceLineNo">1316</span>  //  Executions<a name="line.1316"></a>
-<span class="sourceLineNo">1317</span>  // ==========================================================================<a name="line.1317"></a>
-<span class="sourceLineNo">1318</span>  private void executeProcedure(Procedure&lt;TEnvironment&gt; proc) {<a name="line.1318"></a>
-<span class="sourceLineNo">1319</span>    if (proc.isFinished()) {<a name="line.1319"></a>
-<span class="sourceLineNo">1320</span>      LOG.debug("{} is already finished, skipping execution", proc);<a name="line.1320"></a>
-<span class="sourceLineNo">1321</span>      return;<a name="line.1321"></a>
-<span class="sourceLineNo">1322</span>    }<a name="line.1322"></a>
-<span class="sourceLineNo">1323</span>    final Long rootProcId = getRootProcedureId(proc);<a name="line.1323"></a>
-<span class="sourceLineNo">1324</span>    if (rootProcId == null) {<a name="line.1324"></a>
-<span class="sourceLineNo">1325</span>      // The 'proc' was ready to run but the root procedure was rolledback<a name="line.1325"></a>
-<span class="sourceLineNo">1326</span>      LOG.warn("Rollback because parent is done/rolledback proc=" + proc);<a name="line.1326"></a>
-<span class="sourceLineNo">1327</span>      executeRollback(proc);<a name="line.1327"></a>
-<span class="sourceLineNo">1328</span>      return;<a name="line.1328"></a>
-<span class="sourceLineNo">1329</span>    }<a name="line.1329"></a>
-<span class="sourceLineNo">1330</span><a name="line.1330"></a>
-<span class="sourceLineNo">1331</span>    RootProcedureState&lt;TEnvironment&gt; procStack = rollbackStack.get(rootProcId);<a name="line.1331"></a>
-<span class="sourceLineNo">1332</span>    if (procStack == null) {<a name="line.1332"></a>
-<span class="sourceLineNo">1333</span>      LOG.warn("RootProcedureState is null for " + proc.getProcId());<a name="line.1333"></a>
-<span class="sourceLineNo">1334</span>      return;<a name="line.1334"></a>
-<span class="sourceLineNo">1335</span>    }<a name="line.1335"></a>
-<span class="sourceLineNo">1336</span>    do {<a name="line.1336"></a>
-<span class="sourceLineNo">1337</span>      // Try to acquire the execution<a name="line.1337"></a>
-<span class="sourceLineNo">1338</span>      if (!procStack.acquire(proc)) {<a name="line.1338"></a>
-<span class="sourceLineNo">1339</span>        if (procStack.setRollback()) {<a name="line.1339"></a>
-<span class="sourceLineNo">1340</span>          // we have the 'rollback-lock' we can start rollingback<a name="line.1340"></a>
-<span class="sourceLineNo">1341</span>          switch (executeRollback(rootProcId, procStack)) {<a name="line.1341"></a>
-<span class="sourceLineNo">1342</span>            case LOCK_ACQUIRED:<a name="line.1342"></a>
-<span class="sourceLineNo">1343</span>              break;<a name="line.1343"></a>
-<span class="sourceLineNo">1344</span>            case LOCK_YIELD_WAIT:<a name="line.1344"></a>
-<span class="sourceLineNo">1345</span>              procStack.unsetRollback();<a name="line.1345"></a>
-<span class="sourceLineNo">1346</span>              scheduler.yield(proc);<a name="line.1346"></a>
-<span class="sourceLineNo">1347</span>              break;<a name="line.1347"></a>
-<span class="sourceLineNo">1348</span>            case LOCK_EVENT_WAIT:<a name="line.1348"></a>
-<span class="sourceLineNo">1349</span>              LOG.info("LOCK_EVENT_WAIT rollback..." + proc);<a name="line.1349"></a>
-<span class="sourceLineNo">1350</span>              procStack.unsetRollback();<a name="line.1350"></a>
+<span class="sourceLineNo">1222</span>  public Collection&lt;Procedure&lt;TEnvironment&gt;&gt; getActiveProceduresNoCopy() {<a name="line.1222"></a>
+<span class="sourceLineNo">1223</span>    return procedures.values();<a name="line.1223"></a>
+<span class="sourceLineNo">1224</span>  }<a name="line.1224"></a>
+<span class="sourceLineNo">1225</span><a name="line.1225"></a>
+<span class="sourceLineNo">1226</span>  /**<a name="line.1226"></a>
+<span class="sourceLineNo">1227</span>   * Get procedures.<a name="line.1227"></a>
+<span class="sourceLineNo">1228</span>   * @return the procedures in a list<a name="line.1228"></a>
+<span class="sourceLineNo">1229</span>   */<a name="line.1229"></a>
+<span class="sourceLineNo">1230</span>  public List&lt;Procedure&lt;TEnvironment&gt;&gt; getProcedures() {<a name="line.1230"></a>
+<span class="sourceLineNo">1231</span>    List&lt;Procedure&lt;TEnvironment&gt;&gt; procedureList =<a name="line.1231"></a>
+<span class="sourceLineNo">1232</span>      new ArrayList&lt;&gt;(procedures.size() + completed.size());<a name="line.1232"></a>
+<span class="sourceLineNo">1233</span>    procedureList.addAll(procedures.values());<a name="line.1233"></a>
+<span class="sourceLineNo">1234</span>    // Note: The procedure could show up twice in the list with different state, as<a name="line.1234"></a>
+<span class="sourceLineNo">1235</span>    // it could complete after we walk through procedures list and insert into<a name="line.1235"></a>
+<span class="sourceLineNo">1236</span>    // procedureList - it is ok, as we will use the information in the Procedure<a name="line.1236"></a>
+<span class="sourceLineNo">1237</span>    // to figure it out; to prevent this would increase the complexity of the logic.<a name="line.1237"></a>
+<span class="sourceLineNo">1238</span>    completed.values().stream().map(CompletedProcedureRetainer::getProcedure)<a name="line.1238"></a>
+<span class="sourceLineNo">1239</span>      .forEach(procedureList::add);<a name="line.1239"></a>
+<span class="sourceLineNo">1240</span>    return procedureList;<a name="line.1240"></a>
+<span class="sourceLineNo">1241</span>  }<a name="line.1241"></a>
+<span class="sourceLineNo">1242</span><a name="line.1242"></a>
+<span class="sourceLineNo">1243</span>  // ==========================================================================<a name="line.1243"></a>
+<span class="sourceLineNo">1244</span>  //  Listeners helpers<a name="line.1244"></a>
+<span class="sourceLineNo">1245</span>  // ==========================================================================<a name="line.1245"></a>
+<span class="sourceLineNo">1246</span>  public void registerListener(ProcedureExecutorListener listener) {<a name="line.1246"></a>
+<span class="sourceLineNo">1247</span>    this.listeners.add(listener);<a name="line.1247"></a>
+<span class="sourceLineNo">1248</span>  }<a name="line.1248"></a>
+<span class="sourceLineNo">1249</span><a name="line.1249"></a>
+<span class="sourceLineNo">1250</span>  public boolean unregisterListener(ProcedureExecutorListener listener) {<a name="line.1250"></a>
+<span class="sourceLineNo">1251</span>    return this.listeners.remove(listener);<a name="line.1251"></a>
+<span class="sourceLineNo">1252</span>  }<a name="line.1252"></a>
+<span class="sourceLineNo">1253</span><a name="line.1253"></a>
+<span class="sourceLineNo">1254</span>  private void sendProcedureLoadedNotification(final long procId) {<a name="line.1254"></a>
+<span class="sourceLineNo">1255</span>    if (!this.listeners.isEmpty()) {<a name="line.1255"></a>
+<span class="sourceLineNo">1256</span>      for (ProcedureExecutorListener listener: this.listeners) {<a name="line.1256"></a>
+<span class="sourceLineNo">1257</span>        try {<a name="line.1257"></a>
+<span class="sourceLineNo">1258</span>          listener.procedureLoaded(procId);<a name="line.1258"></a>
+<span class="sourceLineNo">1259</span>        } catch (Throwable e) {<a name="line.1259"></a>
+<span class="sourceLineNo">1260</span>          LOG.error("Listener " + listener + " had an error: " + e.getMessage(), e);<a name="line.1260"></a>
+<span class="sourceLineNo">1261</span>        }<a name="line.1261"></a>
+<span class="sourceLineNo">1262</span>      }<a name="line.1262"></a>
+<span class="sourceLineNo">1263</span>    }<a name="line.1263"></a>
+<span class="sourceLineNo">1264</span>  }<a name="line.1264"></a>
+<span class="sourceLineNo">1265</span><a name="line.1265"></a>
+<span class="sourceLineNo">1266</span>  private void sendProcedureAddedNotification(final long procId) {<a name="line.1266"></a>
+<span class="sourceLineNo">1267</span>    if (!this.listeners.isEmpty()) {<a name="line.1267"></a>
+<span class="sourceLineNo">1268</span>      for (ProcedureExecutorListener listener: this.listeners) {<a name="line.1268"></a>
+<span class="sourceLineNo">1269</span>        try {<a name="line.1269"></a>
+<span class="sourceLineNo">1270</span>          listener.procedureAdded(procId);<a name="line.1270"></a>
+<span class="sourceLineNo">1271</span>        } catch (Throwable e) {<a name="line.1271"></a>
+<span class="sourceLineNo">1272</span>          LOG.error("Listener " + listener + " had an error: " + e.getMessage(), e);<a name="line.1272"></a>
+<span class="sourceLineNo">1273</span>        }<a name="line.1273"></a>
+<span class="sourceLineNo">1274</span>      }<a name="line.1274"></a>
+<span class="sourceLineNo">1275</span>    }<a name="line.1275"></a>
+<span class="sourceLineNo">1276</span>  }<a name="line.1276"></a>
+<span class="sourceLineNo">1277</span><a name="line.1277"></a>
+<span class="sourceLineNo">1278</span>  private void sendProcedureFinishedNotification(final long procId) {<a name="line.1278"></a>
+<span class="sourceLineNo">1279</span>    if (!this.listeners.isEmpty()) {<a name="line.1279"></a>
+<span class="sourceLineNo">1280</span>      for (ProcedureExecutorListener listener: this.listeners) {<a name="line.1280"></a>
+<span class="sourceLineNo">1281</span>        try {<a name="line.1281"></a>
+<span class="sourceLineNo">1282</span>          listener.procedureFinished(procId);<a name="line.1282"></a>
+<span class="sourceLineNo">1283</span>        } catch (Throwable e) {<a name="line.1283"></a>
+<span class="sourceLineNo">1284</span>          LOG.error("Listener " + listener + " had an error: " + e.getMessage(), e);<a name="line.1284"></a>
+<span class="sourceLineNo">1285</span>        }<a name="line.1285"></a>
+<span class="sourceLineNo">1286</span>      }<a name="line.1286"></a>
+<span class="sourceLineNo">1287</span>    }<a name="line.1287"></a>
+<span class="sourceLineNo">1288</span>  }<a name="line.1288"></a>
+<span class="sourceLineNo">1289</span><a name="line.1289"></a>
+<span class="sourceLineNo">1290</span>  // ==========================================================================<a name="line.1290"></a>
+<span class="sourceLineNo">1291</span>  //  Procedure IDs helpers<a name="line.1291"></a>
+<span class="sourceLineNo">1292</span>  // ==========================================================================<a name="line.1292"></a>
+<span class="sourceLineNo">1293</span>  private long nextProcId() {<a name="line.1293"></a>
+<span class="sourceLineNo">1294</span>    long procId = lastProcId.incrementAndGet();<a name="line.1294"></a>
+<span class="sourceLineNo">1295</span>    if (procId &lt; 0) {<a name="line.1295"></a>
+<span class="sourceLineNo">1296</span>      while (!lastProcId.compareAndSet(procId, 0)) {<a name="line.1296"></a>
+<span class="sourceLineNo">1297</span>        procId = lastProcId.get();<a name="line.1297"></a>
+<span class="sourceLineNo">1298</span>        if (procId &gt;= 0)<a name="line.1298"></a>
+<span class="sourceLineNo">1299</span>          break;<a name="line.1299"></a>
+<span class="sourceLineNo">1300</span>      }<a name="line.1300"></a>
+<span class="sourceLineNo">1301</span>      while (procedures.containsKey(procId)) {<a name="line.1301"></a>
+<span class="sourceLineNo">1302</span>        procId = lastProcId.incrementAndGet();<a name="line.1302"></a>
+<span class="sourceLineNo">1303</span>      }<a name="line.1303"></a>
+<span class="sourceLineNo">1304</span>    }<a name="line.1304"></a>
+<span class="sourceLineNo">1305</span>    assert procId &gt;= 0 : "Invalid procId " + procId;<a name="line.1305"></a>
+<span class="sourceLineNo">1306</span>    return procId;<a name="line.1306"></a>
+<span class="sourceLineNo">1307</span>  }<a name="line.1307"></a>
+<span class="sourceLineNo">1308</span><a name="line.1308"></a>
+<span class="sourceLineNo">1309</span>  @VisibleForTesting<a name="line.1309"></a>
+<span class="sourceLineNo">1310</span>  protected long getLastProcId() {<a name="line.1310"></a>
+<span class="sourceLineNo">1311</span>    return lastProcId.get();<a name="line.1311"></a>
+<span class="sourceLineNo">1312</span>  }<a name="line.1312"></a>
+<span class="sourceLineNo">1313</span><a name="line.1313"></a>
+<span class="sourceLineNo">1314</span>  @VisibleForTesting<a name="line.1314"></a>
+<span class="sourceLineNo">1315</span>  public Set&lt;Long&gt; getActiveProcIds() {<a name="line.1315"></a>
+<span class="sourceLineNo">1316</span>    return procedures.keySet();<a name="line.1316"></a>
+<span class="sourceLineNo">1317</span>  }<a name="line.1317"></a>
+<span class="sourceLineNo">1318</span><a name="line.1318"></a>
+<span class="sourceLineNo">1319</span>  Long getRootProcedureId(Procedure&lt;TEnvironment&gt; proc) {<a name="line.1319"></a>
+<span class="sourceLineNo">1320</span>    return Procedure.getRootProcedureId(procedures, proc);<a name="line.1320"></a>
+<span class="sourceLineNo">1321</span>  }<a name="line.1321"></a>
+<span class="sourceLineNo">1322</span><a name="line.1322"></a>
+<span class="sourceLineNo">1323</span>  // ==========================================================================<a name="line.1323"></a>
+<span class="sourceLineNo">1324</span>  //  Executions<a name="line.1324"></a>
+<span class="sourceLineNo">1325</span>  // ==========================================================================<a name="line.1325"></a>
+<span class="sourceLineNo">1326</span>  private void executeProcedure(Procedure&lt;TEnvironment&gt; proc) {<a name="line.1326"></a>
+<span class="sourceLineNo">1327</span>    if (proc.isFinished()) {<a name="line.1327"></a>
+<span class="sourceLineNo">1328</span>      LOG.debug("{} is already finished, skipping execution", proc);<a name="line.1328"></a>
+<span class="sourceLineNo">1329</span>      return;<a name="line.1329"></a>
+<span class="sourceLineNo">1330</span>    }<a name="line.1330"></a>
+<span class="sourceLineNo">1331</span>    final Long rootProcId = getRootProcedureId(proc);<a name="line.1331"></a>
+<span class="sourceLineNo">1332</span>    if (rootProcId == null) {<a name="line.1332"></a>
+<span class="sourceLineNo">1333</span>      // The 'proc' was ready to run but the root procedure was rolledback<a name="line.1333"></a>
+<span class="sourceLineNo">1334</span>      LOG.warn("Rollback because parent is done/rolledback proc=" + proc);<a name="line.1334"></a>
+<span class="sourceLineNo">1335</span>      executeRollback(proc);<a name="line.1335"></a>
+<span class="sourceLineNo">1336</span>      return;<a name="line.1336"></a>
+<span class="sourceLineNo">1337</span>    }<a name="line.1337"></a>
+<span class="sourceLineNo">1338</span><a name="line.1338"></a>
+<span class="sourceLineNo">1339</span>    RootProcedureState&lt;TEnvironment&gt; procStack = rollbackStack.get(rootProcId);<a name="line.1339"></a>
+<span class="sourceLineNo">1340</span>    if (procStack == null) {<a name="line.1340"></a>
+<span class="sourceLineNo">1341</span>      LOG.warn("RootProcedureState is null for " + proc.getProcId());<a name="line.1341"></a>
+<span class="sourceLineNo">1342</span>      return;<a name="line.1342"></a>
+<span class="sourceLineNo">1343</span>    }<a name="line.1343"></a>
+<span class="sourceLineNo">1344</span>    do {<a name="line.1344"></a>
+<span class="sourceLineNo">1345</span>      // Try to acquire the execution<a name="line.1345"></a>
+<span class="sourceLineNo">1346</span>      if (!procStack.acquire(proc)) {<a name="line.1346"></a>
+<span class="sourceLineNo">1347</span>        if (procStack.setRollback()) {<a name="line.1347"></a>
+<span class="sourceLineNo">1348</span>          // we have the 'rollback-lock' we can start rollingback<a name="line.1348"></a>
+<span class="sourceLineNo">1349</span>          switch (executeRollback(rootProcId, procStack)) {<a name="line.1349"></a>
+<span class="sourceLineNo">1350</span>            case LOCK_ACQUIRED:<a name="line.1350"></a>
 <span class="sourceLineNo">1351</span>              break;<a name="line.1351"></a>
-<span class="sourceLineNo">1352</span>            default:<a name="line.1352"></a>
-<span class="sourceLineNo">1353</span>              throw new UnsupportedOperationException();<a name="line.1353"></a>
-<span class="sourceLineNo">1354</span>          }<a name="line.1354"></a>
-<span class="sourceLineNo">1355</span>        } else {<a name="line.1355"></a>
-<span class="sourceLineNo">1356</span>          // if we can't rollback means that some child is still running.<a name="line.1356"></a>
-<span class="sourceLineNo">1357</span>          // the rollback will be executed after all the children are done.<a name="line.1357"></a>
-<span class="sourceLineNo">1358</span>          // If the procedure was never executed, remove and mark it as rolledback.<a name="line.1358"></a>
-<span class="sourceLineNo">1359</span>          if (!proc.wasExecuted()) {<a name="line.1359"></a>
-<span class="sourceLineNo">1360</span>            switch (executeRollback(proc)) {<a name="line.1360"></a>
-<span class="sourceLineNo">1361</span>              case LOCK_ACQUIRED:<a name="line.1361"></a>
-<span class="sourceLineNo">1362</span>                break;<a name="line.1362"></a>
-<span class="sourceLineNo">1363</span>              case LOCK_YIELD_WAIT:<a name="line.1363"></a>
-<span class="sourceLineNo">1364</span>                scheduler.yield(proc);<a name="line.1364"></a>
-<span class="sourceLineNo">1365</span>                break;<a name="line.1365"></a>
-<span class="sourceLineNo">1366</span>              case LOCK_EVENT_WAIT:<a name="line.1366"></a>
-<span class="sourceLineNo">1367</span>                LOG.info("LOCK_EVENT_WAIT can't rollback child running?..." + proc);<a name="line.1367"></a>
-<span class="sourceLineNo">1368</span>                break;<a name="line.1368"></a>
-<span class="sourceLineNo">1369</span>              default:<a name="line.1369"></a>
-<span class="sourceLineNo">1370</span>                throw new UnsupportedOperationException();<a name="line.1370"></a>
-<span class="sourceLineNo">1371</span>            }<a name="line.1371"></a>
-<span class="sourceLineNo">1372</span>          }<a name="line.1372"></a>
-<span class="sourceLineNo">1373</span>        }<a name="line.1373"></a>
-<span class="sourceLineNo">1374</span>        break;<a name="line.1374"></a>
-<span class="sourceLineNo">1375</span>      }<a name="line.1375"></a>
-<span class="sourceLineNo">1376</span><a name="line.1376"></a>
-<span class="sourceLineNo">1377</span>      // Execute the procedure<a name="line.1377"></a>
-<span class="sourceLineNo">1378</span>      assert proc.getState() == ProcedureState.RUNNABLE : proc;<a name="line.1378"></a>
-<span class="sourceLineNo">1379</span>      // Note that lock is NOT about concurrency but rather about ensuring<a name="line.1379"></a>
-<span class="sourceLineNo">1380</span>      // ownership of a procedure of an entity such as a region or table<a name="line.1380"></a>
-<span class="sourceLineNo">1381</span>      LockState lockState = acquireLock(proc);<a name="line.1381"></a>
-<span class="sourceLineNo">1382</span>      switch (lockState) {<a name="line.1382"></a>
-<span class="sourceLineNo">1383</span>        case LOCK_ACQUIRED:<a name="line.1383"></a>
-<span class="sourceLineNo">1384</span>          execProcedure(procStack, proc);<a name="line.1384"></a>
-<span class="sourceLineNo">1385</span>          break;<a name="line.1385"></a>
-<span class="sourceLineNo">1386</span>        case LOCK_YIELD_WAIT:<a name="line.1386"></a>
-<span class="sourceLineNo">1387</span>          LOG.info(lockState + " " + proc);<a name="line.1387"></a>
-<span class="sourceLineNo">1388</span>          scheduler.yield(proc);<a name="line.1388"></a>
-<span class="sourceLineNo">1389</span>          break;<a name="line.1389"></a>
-<span class="sourceLineNo">1390</span>        case LOCK_EVENT_WAIT:<a name="line.1390"></a>
-<span class="sourceLineNo">1391</span>          // Someone will wake us up when the lock is available<a name="line.1391"></a>
-<span class="sourceLineNo">1392</span>          LOG.debug(lockState + " " + proc);<a name="line.1392"></a>
+<span class="sourceLineNo">1352</span>            case LOCK_YIELD_WAIT:<a name="line.1352"></a>
+<span class="sourceLineNo">1353</span>              procStack.unsetRollback();<a name="line.1353"></a>
+<span class="sourceLineNo">1354</span>              scheduler.yield(proc);<a name="line.1354"></a>
+<span class="sourceLineNo">1355</span>              break;<a name="line.1355"></a>
+<span class="sourceLineNo">1356</span>            case LOCK_EVENT_WAIT:<a name="line.1356"></a>
+<span class="sourceLineNo">1357</span>              LOG.info("LOCK_EVENT_WAIT rollback..." + proc);<a name="line.1357"></a>
+<span class="sourceLineNo">1358</span>              procStack.unsetRollback();<a name="line.1358"></a>
+<span class="sourceLineNo">1359</span>              break;<a name="line.1359"></a>
+<span class="sourceLineNo">1360</span>            default:<a name="line.1360"></a>
+<span class="sourceLineNo">1361</span>              throw new UnsupportedOperationException();<a name="line.1361"></a>
+<span class="sourceLineNo">1362</span>          }<a name="line.1362"></a>
+<span class="sourceLineNo">1363</span>        } else {<a name="line.1363"></a>
+<span class="sourceLineNo">1364</span>          // if we can't rollback means that some child is still running.<a name="line.1364"></a>
+<span class="sourceLineNo">1365</span>          // the rollback will be executed after all the children are done.<a name="line.1365"></a>
+<span class="sourceLineNo">1366</span>          // If the procedure was never executed, remove and mark it as rolledback.<a name="line.1366"></a>
+<span class="sourceLineNo">1367</span>          if (!proc.wasExecuted()) {<a name="line.1367"></a>
+<span class="sourceLineNo">1368</span>            switch (executeRollback(proc)) {<a name="line.1368"></a>
+<span class="sourceLineNo">1369</span>              case LOCK_ACQUIRED:<a name="line.1369"></a>
+<span class="sourceLineNo">1370</span>                break;<a name="line.1370"></a>
+<span class="sourceLineNo">1371</span>              case LOCK_YIELD_WAIT:<a name="line.1371"></a>
+<span class="sourceLineNo">1372</span>                scheduler.yield(proc);<a name="line.1372"></a>
+<span class="sourceLineNo">1373</span>                break;<a name="line.1373"></a>
+<span class="sourceLineNo">1374</span>              case LOCK_EVENT_WAIT:<a name="line.1374"></a>
+<span class="sourceLineNo">1375</span>                LOG.info("LOCK_EVENT_WAIT can't rollback child running?..." + proc);<a name="line.1375"></a>
+<span class="sourceLineNo">1376</span>                break;<a name="line.1376"></a>
+<span class="sourceLineNo">1377</span>              default:<a name="line.1377"></a>
+<span class="sourceLineNo">1378</span>                throw new UnsupportedOperationException();<a name="line.1378"></a>
+<span class="sourceLineNo">1379</span>            }<a name="line.1379"></a>
+<span class="sourceLineNo">1380</span>          }<a name="line.1380"></a>
+<span class="sourceLineNo">1381</span>        }<a name="line.1381"></a>
+<span class="sourceLineNo">1382</span>        break;<a name="line.1382"></a>
+<span class="sourceLineNo">1383</span>      }<a name="line.1383"></a>
+<span class="sourceLineNo">1384</span><a name="line.1384"></a>
+<span class="sourceLineNo">1385</span>      // Execute the procedure<a name="line.1385"></a>
+<span class="sourceLineNo">1386</span>      assert proc.getState() == ProcedureState.RUNNABLE : proc;<a name="line.1386"></a>
+<span class="sourceLineNo">1387</span>      // Note that lock is NOT about concurrency but rather about ensuring<a name="line.1387"></a>
+<span class="sourceLineNo">1388</span>      // ownership of a procedure of an entity such as a region or table<a name="line.1388"></a>
+<span class="sourceLineNo">1389</span>      LockState lockState = acquireLock(proc);<a name="line.1389"></a>
+<span class="sourceLineNo">1390</span>      switch (lockState) {<a name="line.1390"></a>
+<span class="sourceLineNo">1391</span>        case LOCK_ACQUIRED:<a name="line.1391"></a>
+<span class="sourceLineNo">1392</span>          execProcedure(procStack, proc);<a name="line.1392"></a>
 <span class="sourceLineNo">1393</span>          break;<a name="line.1393"></a>
-<span class="sourceLineNo">1394</span>        default:<a name="line.1394"></a>
-<span class="sourceLineNo">1395</span>          throw new UnsupportedOperationException();<a name="line.1395"></a>
-<span class="sourceLineNo">1396</span>      }<a name="line.1396"></a>
-<span class="sourceLineNo">1397</span>      procStack.release(proc);<a name="line.1397"></a>
-<span class="sourceLineNo">1398</span><a name="line.1398"></a>
-<span class="sourceLineNo">1399</span>      if (proc.isSuccess()) {<a name="line.1399"></a>
-<span class="sourceLineNo">1400</span>        // update metrics on finishing the procedure<a name="line.1400"></a>
-<span class="sourceLineNo">1401</span>        proc.updateMetricsOnFinish(getEnvironment(), proc.elapsedTime(), true);<a name="line.1401"></a>
-<span class="sourceLineNo">1402</span>        LOG.info("Finished " + proc + " in " + StringUtils.humanTimeDiff(proc.elapsedTime()));<a name="line.1402"></a>
-<span class="sourceLineNo">1403</span>        // Finalize the procedure state<a name="line.1403"></a>
-<span class="sourceLineNo">1404</span>        if (proc.getProcId() == rootProcId) {<a name="line.1404"></a>
-<span class="sourceLineNo">1405</span>          procedureFinished(proc);<a name="line.1405"></a>
-<span class="sourceLineNo">1406</span>        } else {<a name="line.1406"></a>
-<span class="sourceLineNo">1407</span>          execCompletionCleanup(proc);<a name="line.1407"></a>
-<span class="sourceLineNo">1408</span>        }<a name="line.1408"></a>
-<span class="sourceLineNo">1409</span>        break;<a name="line.1409"></a>
-<span class="sourceLineNo">1410</span>      }<a name="line.1410"></a>
-<span class="sourceLineNo">1411</span>    } while (procStack.isFailed());<a name="line.1411"></a>
-<span class="sourceLineNo">1412</span>  }<a name="line.1412"></a>
-<span class="sourceLineNo">1413</span><a name="line.1413"></a>
-<span class="sourceLineNo">1414</span>  private LockState acquireLock(Procedure&lt;TEnvironment&gt; proc) {<a name="line.1414"></a>
-<span class="sourceLineNo">1415</span>    TEnvironment env = getEnvironment();<a name="line.1415"></a>
-<span class="sourceLineNo">1416</span>    // if holdLock is true, then maybe we already have the lock, so just return LOCK_ACQUIRED if<a name="line.1416"></a>
-<span class="sourceLineNo">1417</span>    // hasLock is true.<a name="line.1417"></a>
-<span class="sourceLineNo">1418</span>    if (proc.hasLock()) {<a name="line.1418"></a>
-<span class="sourceLineNo">1419</span>      return LockState.LOCK_ACQUIRED;<a name="line.1419"></a>
-<span class="sourceLineNo">1420</span>    }<a name="line.1420"></a>
-<span class="sourceLineNo">1421</span>    return proc.doAcquireLock(env, store);<a name="line.1421"></a>
-<span class="sourceLineNo">1422</span>  }<a name="line.1422"></a>
-<span class="sourceLineNo">1423</span><a name="line.1423"></a>
-<span class="sourceLineNo">1424</span>  private void releaseLock(Procedure&lt;TEnvironment&gt; proc, boolean force) {<a name="line.1424"></a>
-<span class="sourceLineNo">1425</span>    TEnvironment env = getEnvironment();<a name="line.1425"></a>
-<span class="sourceLineNo">1426</span>    // For how the framework works, we know that we will always have the lock<a name="line.1426"></a>
-<span class="sourceLineNo">1427</span>    // when we call releaseLock(), so we can avoid calling proc.hasLock()<a name="line.1427"></a>
-<span class="sourceLineNo">1428</span>    if (force || !proc.holdLock(env) || proc.isFinished()) {<a name="line.1428"></a>
-<span class="sourceLineNo">1429</span>      proc.doReleaseLock(env, store);<a name="line.1429"></a>
-<span class="sourceLineNo">1430</span>    }<a name="line.1430"></a>
-<span class="sourceLineNo">1431</span>  }<a name="line.1431"></a>
-<span class="sourceLineNo">1432</span><a name="line.1432"></a>
-<span class="sourceLineNo">1433</span>  /**<a name="line.1433"></a>
-<span class="sourceLineNo">1434</span>   * Execute the rollback of the full procedure stack. Once the procedure is rolledback, the<a name="line.1434"></a>
-<span class="sourceLineNo">1435</span>   * root-procedure will be visible as finished to user, and the result will be the fatal exception.<a name="line.1435"></a>
-<span class="sourceLineNo">1436</span>   */<a name="line.1436"></a>
-<span class="sourceLineNo">1437</span>  private LockState executeRollback(long rootProcId, RootProcedureState&lt;TEnvironment&gt; procStack) {<a name="line.1437"></a>
-<span class="sourceLineNo">1438</span>    Procedure&lt;TEnvironment&gt; rootProc = procedures.get(rootProcId);<a name="line.1438"></a>
-<span class="sourceLineNo">1439</span>    RemoteProcedureException exception = rootProc.getException();<a name="line.1439"></a>
-<span class="sourceLineNo">1440</span>    // TODO: This needs doc. The root proc doesn't have an exception. Maybe we are<a name="line.1440"></a>
-<span class="sourceLineNo">1441</span>    // rolling back because the subprocedure does. Clarify.<a name="line.1441"></a>
-<span class="sourceLineNo">1442</span>    if (exception == null) {<a name="line.1442"></a>
-<span class="sourceLineNo">1443</span>      exception = procStack.getException();<a name="line.1443"></a>
-<span class="sourceLineNo">1444</span>      rootProc.setFailure(exception);<a name="line.1444"></a>
-<span class="sourceLineNo">1445</span>      store.update(rootProc);<a name="line.1445"></a>
-<span class="sourceLineNo">1446</span>    }<a name="line.1446"></a>
-

<TRUNCATED>

[06/29] hbase-site git commit: Published site at 5e84997f2ffdbcf5f849d70c30ddbe2db4039ca4.

Posted by gi...@apache.org.
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/27f5bfb5/testdevapidocs/src-html/org/apache/hadoop/hbase/procedure2/TestProcedureBypass.StuckStateMachineProcedure.html
----------------------------------------------------------------------
diff --git a/testdevapidocs/src-html/org/apache/hadoop/hbase/procedure2/TestProcedureBypass.StuckStateMachineProcedure.html b/testdevapidocs/src-html/org/apache/hadoop/hbase/procedure2/TestProcedureBypass.StuckStateMachineProcedure.html
index 7eb899a..f89b826 100644
--- a/testdevapidocs/src-html/org/apache/hadoop/hbase/procedure2/TestProcedureBypass.StuckStateMachineProcedure.html
+++ b/testdevapidocs/src-html/org/apache/hadoop/hbase/procedure2/TestProcedureBypass.StuckStateMachineProcedure.html
@@ -46,226 +46,262 @@
 <span class="sourceLineNo">038</span>import org.slf4j.Logger;<a name="line.38"></a>
 <span class="sourceLineNo">039</span>import org.slf4j.LoggerFactory;<a name="line.39"></a>
 <span class="sourceLineNo">040</span><a name="line.40"></a>
-<span class="sourceLineNo">041</span><a name="line.41"></a>
+<span class="sourceLineNo">041</span>import org.apache.hadoop.hbase.shaded.protobuf.generated.ProcedureProtos;<a name="line.41"></a>
 <span class="sourceLineNo">042</span><a name="line.42"></a>
-<span class="sourceLineNo">043</span>@Category({MasterTests.class, SmallTests.class})<a name="line.43"></a>
-<span class="sourceLineNo">044</span>public class TestProcedureBypass {<a name="line.44"></a>
-<span class="sourceLineNo">045</span><a name="line.45"></a>
-<span class="sourceLineNo">046</span>  @ClassRule public static final HBaseClassTestRule CLASS_RULE = HBaseClassTestRule<a name="line.46"></a>
-<span class="sourceLineNo">047</span>      .forClass(TestProcedureBypass.class);<a name="line.47"></a>
-<span class="sourceLineNo">048</span><a name="line.48"></a>
-<span class="sourceLineNo">049</span>  private static final Logger LOG = LoggerFactory.getLogger(TestProcedureBypass.class);<a name="line.49"></a>
-<span class="sourceLineNo">050</span><a name="line.50"></a>
-<span class="sourceLineNo">051</span>  private static final int PROCEDURE_EXECUTOR_SLOTS = 1;<a name="line.51"></a>
-<span class="sourceLineNo">052</span><a name="line.52"></a>
-<span class="sourceLineNo">053</span>  private static TestProcEnv procEnv;<a name="line.53"></a>
-<span class="sourceLineNo">054</span>  private static ProcedureStore procStore;<a name="line.54"></a>
-<span class="sourceLineNo">055</span><a name="line.55"></a>
-<span class="sourceLineNo">056</span>  private static ProcedureExecutor&lt;TestProcEnv&gt; procExecutor;<a name="line.56"></a>
-<span class="sourceLineNo">057</span><a name="line.57"></a>
-<span class="sourceLineNo">058</span>  private static HBaseCommonTestingUtility htu;<a name="line.58"></a>
-<span class="sourceLineNo">059</span><a name="line.59"></a>
-<span class="sourceLineNo">060</span>  private static FileSystem fs;<a name="line.60"></a>
-<span class="sourceLineNo">061</span>  private static Path testDir;<a name="line.61"></a>
-<span class="sourceLineNo">062</span>  private static Path logDir;<a name="line.62"></a>
-<span class="sourceLineNo">063</span><a name="line.63"></a>
-<span class="sourceLineNo">064</span>  private static class TestProcEnv {<a name="line.64"></a>
-<span class="sourceLineNo">065</span>  }<a name="line.65"></a>
-<span class="sourceLineNo">066</span><a name="line.66"></a>
-<span class="sourceLineNo">067</span>  @BeforeClass<a name="line.67"></a>
-<span class="sourceLineNo">068</span>  public static void setUp() throws Exception {<a name="line.68"></a>
-<span class="sourceLineNo">069</span>    htu = new HBaseCommonTestingUtility();<a name="line.69"></a>
-<span class="sourceLineNo">070</span><a name="line.70"></a>
-<span class="sourceLineNo">071</span>    // NOTE: The executor will be created by each test<a name="line.71"></a>
-<span class="sourceLineNo">072</span>    procEnv = new TestProcEnv();<a name="line.72"></a>
-<span class="sourceLineNo">073</span>    testDir = htu.getDataTestDir();<a name="line.73"></a>
-<span class="sourceLineNo">074</span>    fs = testDir.getFileSystem(htu.getConfiguration());<a name="line.74"></a>
-<span class="sourceLineNo">075</span>    assertTrue(testDir.depth() &gt; 1);<a name="line.75"></a>
-<span class="sourceLineNo">076</span><a name="line.76"></a>
-<span class="sourceLineNo">077</span>    logDir = new Path(testDir, "proc-logs");<a name="line.77"></a>
-<span class="sourceLineNo">078</span>    procStore = ProcedureTestingUtility.createWalStore(htu.getConfiguration(), logDir);<a name="line.78"></a>
-<span class="sourceLineNo">079</span>    procExecutor = new ProcedureExecutor&lt;&gt;(htu.getConfiguration(), procEnv,<a name="line.79"></a>
-<span class="sourceLineNo">080</span>        procStore);<a name="line.80"></a>
-<span class="sourceLineNo">081</span>    procStore.start(PROCEDURE_EXECUTOR_SLOTS);<a name="line.81"></a>
-<span class="sourceLineNo">082</span>    ProcedureTestingUtility<a name="line.82"></a>
-<span class="sourceLineNo">083</span>        .initAndStartWorkers(procExecutor, PROCEDURE_EXECUTOR_SLOTS, true);<a name="line.83"></a>
-<span class="sourceLineNo">084</span>  }<a name="line.84"></a>
-<span class="sourceLineNo">085</span><a name="line.85"></a>
-<span class="sourceLineNo">086</span>  @Test<a name="line.86"></a>
-<span class="sourceLineNo">087</span>  public void testBypassSuspendProcedure() throws Exception {<a name="line.87"></a>
-<span class="sourceLineNo">088</span>    final SuspendProcedure proc = new SuspendProcedure();<a name="line.88"></a>
-<span class="sourceLineNo">089</span>    long id = procExecutor.submitProcedure(proc);<a name="line.89"></a>
-<span class="sourceLineNo">090</span>    Thread.sleep(500);<a name="line.90"></a>
-<span class="sourceLineNo">091</span>    //bypass the procedure<a name="line.91"></a>
-<span class="sourceLineNo">092</span>    assertTrue(procExecutor.bypassProcedure(id, 30000, false, false));<a name="line.92"></a>
-<span class="sourceLineNo">093</span>    htu.waitFor(5000, () -&gt; proc.isSuccess() &amp;&amp; proc.isBypass());<a name="line.93"></a>
-<span class="sourceLineNo">094</span>    LOG.info("{} finished", proc);<a name="line.94"></a>
-<span class="sourceLineNo">095</span>  }<a name="line.95"></a>
-<span class="sourceLineNo">096</span><a name="line.96"></a>
-<span class="sourceLineNo">097</span>  @Test<a name="line.97"></a>
-<span class="sourceLineNo">098</span>  public void testStuckProcedure() throws Exception {<a name="line.98"></a>
-<span class="sourceLineNo">099</span>    final StuckProcedure proc = new StuckProcedure();<a name="line.99"></a>
-<span class="sourceLineNo">100</span>    long id = procExecutor.submitProcedure(proc);<a name="line.100"></a>
-<span class="sourceLineNo">101</span>    Thread.sleep(500);<a name="line.101"></a>
-<span class="sourceLineNo">102</span>    //bypass the procedure<a name="line.102"></a>
-<span class="sourceLineNo">103</span>    assertTrue(procExecutor.bypassProcedure(id, 1000, true, false));<a name="line.103"></a>
-<span class="sourceLineNo">104</span>    //Since the procedure is stuck there, we need to restart the executor to recovery.<a name="line.104"></a>
-<span class="sourceLineNo">105</span>    ProcedureTestingUtility.restart(procExecutor);<a name="line.105"></a>
-<span class="sourceLineNo">106</span>    htu.waitFor(5000, () -&gt; proc.isSuccess() &amp;&amp; proc.isBypass());<a name="line.106"></a>
-<span class="sourceLineNo">107</span>    LOG.info("{} finished", proc);<a name="line.107"></a>
-<span class="sourceLineNo">108</span>  }<a name="line.108"></a>
-<span class="sourceLineNo">109</span><a name="line.109"></a>
-<span class="sourceLineNo">110</span>  @Test<a name="line.110"></a>
-<span class="sourceLineNo">111</span>  public void testBypassingProcedureWithParent() throws Exception {<a name="line.111"></a>
-<span class="sourceLineNo">112</span>    final RootProcedure proc = new RootProcedure();<a name="line.112"></a>
-<span class="sourceLineNo">113</span>    long rootId = procExecutor.submitProcedure(proc);<a name="line.113"></a>
-<span class="sourceLineNo">114</span>    htu.waitFor(5000, () -&gt; procExecutor.getProcedures().stream()<a name="line.114"></a>
-<span class="sourceLineNo">115</span>      .filter(p -&gt; p.getParentProcId() == rootId).collect(Collectors.toList())<a name="line.115"></a>
-<span class="sourceLineNo">116</span>      .size() &gt; 0);<a name="line.116"></a>
-<span class="sourceLineNo">117</span>    SuspendProcedure suspendProcedure = (SuspendProcedure)procExecutor.getProcedures().stream()<a name="line.117"></a>
-<span class="sourceLineNo">118</span>        .filter(p -&gt; p.getParentProcId() == rootId).collect(Collectors.toList()).get(0);<a name="line.118"></a>
-<span class="sourceLineNo">119</span>    assertTrue(procExecutor.bypassProcedure(suspendProcedure.getProcId(), 1000, false, false));<a name="line.119"></a>
-<span class="sourceLineNo">120</span>    htu.waitFor(5000, () -&gt; proc.isSuccess() &amp;&amp; proc.isBypass());<a name="line.120"></a>
-<span class="sourceLineNo">121</span>    LOG.info("{} finished", proc);<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 testBypassingStuckStateMachineProcedure() throws Exception {<a name="line.125"></a>
-<span class="sourceLineNo">126</span>    final StuckStateMachineProcedure proc =<a name="line.126"></a>
-<span class="sourceLineNo">127</span>        new StuckStateMachineProcedure(procEnv, StuckStateMachineState.START);<a name="line.127"></a>
-<span class="sourceLineNo">128</span>    long id = procExecutor.submitProcedure(proc);<a name="line.128"></a>
-<span class="sourceLineNo">129</span>    Thread.sleep(500);<a name="line.129"></a>
-<span class="sourceLineNo">130</span>    // bypass the procedure<a name="line.130"></a>
-<span class="sourceLineNo">131</span>    assertFalse(procExecutor.bypassProcedure(id, 1000, false, false));<a name="line.131"></a>
-<span class="sourceLineNo">132</span>    assertTrue(procExecutor.bypassProcedure(id, 1000, true, false));<a name="line.132"></a>
-<span class="sourceLineNo">133</span><a name="line.133"></a>
-<span class="sourceLineNo">134</span>    htu.waitFor(5000, () -&gt; proc.isSuccess() &amp;&amp; proc.isBypass());<a name="line.134"></a>
-<span class="sourceLineNo">135</span>    LOG.info("{} finished", proc);<a name="line.135"></a>
-<span class="sourceLineNo">136</span>  }<a name="line.136"></a>
-<span class="sourceLineNo">137</span><a name="line.137"></a>
-<span class="sourceLineNo">138</span>  @Test<a name="line.138"></a>
-<span class="sourceLineNo">139</span>  public void testBypassingProcedureWithParentRecursive() throws Exception {<a name="line.139"></a>
-<span class="sourceLineNo">140</span>    final RootProcedure proc = new RootProcedure();<a name="line.140"></a>
-<span class="sourceLineNo">141</span>    long rootId = procExecutor.submitProcedure(proc);<a name="line.141"></a>
-<span class="sourceLineNo">142</span>    htu.waitFor(5000, () -&gt; procExecutor.getProcedures().stream()<a name="line.142"></a>
-<span class="sourceLineNo">143</span>        .filter(p -&gt; p.getParentProcId() == rootId).collect(Collectors.toList())<a name="line.143"></a>
-<span class="sourceLineNo">144</span>        .size() &gt; 0);<a name="line.144"></a>
-<span class="sourceLineNo">145</span>    SuspendProcedure suspendProcedure = (SuspendProcedure)procExecutor.getProcedures().stream()<a name="line.145"></a>
-<span class="sourceLineNo">146</span>        .filter(p -&gt; p.getParentProcId() == rootId).collect(Collectors.toList()).get(0);<a name="line.146"></a>
-<span class="sourceLineNo">147</span>    assertTrue(procExecutor.bypassProcedure(rootId, 1000, false, true));<a name="line.147"></a>
-<span class="sourceLineNo">148</span>    htu.waitFor(5000, () -&gt; proc.isSuccess() &amp;&amp; proc.isBypass());<a name="line.148"></a>
-<span class="sourceLineNo">149</span>    LOG.info("{} finished", proc);<a name="line.149"></a>
-<span class="sourceLineNo">150</span>  }<a name="line.150"></a>
-<span class="sourceLineNo">151</span><a name="line.151"></a>
-<span class="sourceLineNo">152</span>  @AfterClass<a name="line.152"></a>
-<span class="sourceLineNo">153</span>  public static void tearDown() throws Exception {<a name="line.153"></a>
-<span class="sourceLineNo">154</span>    procExecutor.stop();<a name="line.154"></a>
-<span class="sourceLineNo">155</span>    procStore.stop(false);<a name="line.155"></a>
-<span class="sourceLineNo">156</span>    procExecutor.join();<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>  public static class SuspendProcedure extends ProcedureTestingUtility.NoopProcedure&lt;TestProcEnv&gt; {<a name="line.159"></a>
+<span class="sourceLineNo">043</span><a name="line.43"></a>
+<span class="sourceLineNo">044</span>@Category({MasterTests.class, SmallTests.class})<a name="line.44"></a>
+<span class="sourceLineNo">045</span>public class TestProcedureBypass {<a name="line.45"></a>
+<span class="sourceLineNo">046</span><a name="line.46"></a>
+<span class="sourceLineNo">047</span>  @ClassRule public static final HBaseClassTestRule CLASS_RULE = HBaseClassTestRule<a name="line.47"></a>
+<span class="sourceLineNo">048</span>      .forClass(TestProcedureBypass.class);<a name="line.48"></a>
+<span class="sourceLineNo">049</span><a name="line.49"></a>
+<span class="sourceLineNo">050</span>  private static final Logger LOG = LoggerFactory.getLogger(TestProcedureBypass.class);<a name="line.50"></a>
+<span class="sourceLineNo">051</span><a name="line.51"></a>
+<span class="sourceLineNo">052</span>  private static final int PROCEDURE_EXECUTOR_SLOTS = 1;<a name="line.52"></a>
+<span class="sourceLineNo">053</span><a name="line.53"></a>
+<span class="sourceLineNo">054</span>  private static TestProcEnv procEnv;<a name="line.54"></a>
+<span class="sourceLineNo">055</span>  private static ProcedureStore procStore;<a name="line.55"></a>
+<span class="sourceLineNo">056</span><a name="line.56"></a>
+<span class="sourceLineNo">057</span>  private static ProcedureExecutor&lt;TestProcEnv&gt; procExecutor;<a name="line.57"></a>
+<span class="sourceLineNo">058</span><a name="line.58"></a>
+<span class="sourceLineNo">059</span>  private static HBaseCommonTestingUtility htu;<a name="line.59"></a>
+<span class="sourceLineNo">060</span><a name="line.60"></a>
+<span class="sourceLineNo">061</span>  private static FileSystem fs;<a name="line.61"></a>
+<span class="sourceLineNo">062</span>  private static Path testDir;<a name="line.62"></a>
+<span class="sourceLineNo">063</span>  private static Path logDir;<a name="line.63"></a>
+<span class="sourceLineNo">064</span><a name="line.64"></a>
+<span class="sourceLineNo">065</span>  private static class TestProcEnv {<a name="line.65"></a>
+<span class="sourceLineNo">066</span>  }<a name="line.66"></a>
+<span class="sourceLineNo">067</span><a name="line.67"></a>
+<span class="sourceLineNo">068</span>  @BeforeClass<a name="line.68"></a>
+<span class="sourceLineNo">069</span>  public static void setUp() throws Exception {<a name="line.69"></a>
+<span class="sourceLineNo">070</span>    htu = new HBaseCommonTestingUtility();<a name="line.70"></a>
+<span class="sourceLineNo">071</span><a name="line.71"></a>
+<span class="sourceLineNo">072</span>    // NOTE: The executor will be created by each test<a name="line.72"></a>
+<span class="sourceLineNo">073</span>    procEnv = new TestProcEnv();<a name="line.73"></a>
+<span class="sourceLineNo">074</span>    testDir = htu.getDataTestDir();<a name="line.74"></a>
+<span class="sourceLineNo">075</span>    fs = testDir.getFileSystem(htu.getConfiguration());<a name="line.75"></a>
+<span class="sourceLineNo">076</span>    assertTrue(testDir.depth() &gt; 1);<a name="line.76"></a>
+<span class="sourceLineNo">077</span><a name="line.77"></a>
+<span class="sourceLineNo">078</span>    logDir = new Path(testDir, "proc-logs");<a name="line.78"></a>
+<span class="sourceLineNo">079</span>    procStore = ProcedureTestingUtility.createWalStore(htu.getConfiguration(), logDir);<a name="line.79"></a>
+<span class="sourceLineNo">080</span>    procExecutor = new ProcedureExecutor&lt;&gt;(htu.getConfiguration(), procEnv,<a name="line.80"></a>
+<span class="sourceLineNo">081</span>        procStore);<a name="line.81"></a>
+<span class="sourceLineNo">082</span>    procStore.start(PROCEDURE_EXECUTOR_SLOTS);<a name="line.82"></a>
+<span class="sourceLineNo">083</span>    ProcedureTestingUtility<a name="line.83"></a>
+<span class="sourceLineNo">084</span>        .initAndStartWorkers(procExecutor, PROCEDURE_EXECUTOR_SLOTS, true);<a name="line.84"></a>
+<span class="sourceLineNo">085</span>  }<a name="line.85"></a>
+<span class="sourceLineNo">086</span><a name="line.86"></a>
+<span class="sourceLineNo">087</span>  @Test<a name="line.87"></a>
+<span class="sourceLineNo">088</span>  public void testBypassSuspendProcedure() throws Exception {<a name="line.88"></a>
+<span class="sourceLineNo">089</span>    final SuspendProcedure proc = new SuspendProcedure();<a name="line.89"></a>
+<span class="sourceLineNo">090</span>    long id = procExecutor.submitProcedure(proc);<a name="line.90"></a>
+<span class="sourceLineNo">091</span>    Thread.sleep(500);<a name="line.91"></a>
+<span class="sourceLineNo">092</span>    //bypass the procedure<a name="line.92"></a>
+<span class="sourceLineNo">093</span>    assertTrue(procExecutor.bypassProcedure(id, 30000, false, false));<a name="line.93"></a>
+<span class="sourceLineNo">094</span>    htu.waitFor(5000, () -&gt; proc.isSuccess() &amp;&amp; proc.isBypass());<a name="line.94"></a>
+<span class="sourceLineNo">095</span>    LOG.info("{} finished", proc);<a name="line.95"></a>
+<span class="sourceLineNo">096</span>  }<a name="line.96"></a>
+<span class="sourceLineNo">097</span><a name="line.97"></a>
+<span class="sourceLineNo">098</span>  @Test<a name="line.98"></a>
+<span class="sourceLineNo">099</span>  public void testStuckProcedure() throws Exception {<a name="line.99"></a>
+<span class="sourceLineNo">100</span>    final StuckProcedure proc = new StuckProcedure();<a name="line.100"></a>
+<span class="sourceLineNo">101</span>    long id = procExecutor.submitProcedure(proc);<a name="line.101"></a>
+<span class="sourceLineNo">102</span>    Thread.sleep(500);<a name="line.102"></a>
+<span class="sourceLineNo">103</span>    //bypass the procedure<a name="line.103"></a>
+<span class="sourceLineNo">104</span>    assertTrue(procExecutor.bypassProcedure(id, 1000, true, false));<a name="line.104"></a>
+<span class="sourceLineNo">105</span>    //Since the procedure is stuck there, we need to restart the executor to recovery.<a name="line.105"></a>
+<span class="sourceLineNo">106</span>    ProcedureTestingUtility.restart(procExecutor);<a name="line.106"></a>
+<span class="sourceLineNo">107</span>    htu.waitFor(5000, () -&gt; proc.isSuccess() &amp;&amp; proc.isBypass());<a name="line.107"></a>
+<span class="sourceLineNo">108</span>    LOG.info("{} finished", proc);<a name="line.108"></a>
+<span class="sourceLineNo">109</span>  }<a name="line.109"></a>
+<span class="sourceLineNo">110</span><a name="line.110"></a>
+<span class="sourceLineNo">111</span>  @Test<a name="line.111"></a>
+<span class="sourceLineNo">112</span>  public void testBypassingProcedureWithParent() throws Exception {<a name="line.112"></a>
+<span class="sourceLineNo">113</span>    final RootProcedure proc = new RootProcedure();<a name="line.113"></a>
+<span class="sourceLineNo">114</span>    long rootId = procExecutor.submitProcedure(proc);<a name="line.114"></a>
+<span class="sourceLineNo">115</span>    htu.waitFor(5000, () -&gt; procExecutor.getProcedures().stream()<a name="line.115"></a>
+<span class="sourceLineNo">116</span>      .filter(p -&gt; p.getParentProcId() == rootId).collect(Collectors.toList())<a name="line.116"></a>
+<span class="sourceLineNo">117</span>      .size() &gt; 0);<a name="line.117"></a>
+<span class="sourceLineNo">118</span>    SuspendProcedure suspendProcedure = (SuspendProcedure)procExecutor.getProcedures().stream()<a name="line.118"></a>
+<span class="sourceLineNo">119</span>        .filter(p -&gt; p.getParentProcId() == rootId).collect(Collectors.toList()).get(0);<a name="line.119"></a>
+<span class="sourceLineNo">120</span>    assertTrue(procExecutor.bypassProcedure(suspendProcedure.getProcId(), 1000, false, false));<a name="line.120"></a>
+<span class="sourceLineNo">121</span>    htu.waitFor(5000, () -&gt; proc.isSuccess() &amp;&amp; proc.isBypass());<a name="line.121"></a>
+<span class="sourceLineNo">122</span>    LOG.info("{} finished", proc);<a name="line.122"></a>
+<span class="sourceLineNo">123</span>  }<a name="line.123"></a>
+<span class="sourceLineNo">124</span><a name="line.124"></a>
+<span class="sourceLineNo">125</span>  @Test<a name="line.125"></a>
+<span class="sourceLineNo">126</span>  public void testBypassingStuckStateMachineProcedure() throws Exception {<a name="line.126"></a>
+<span class="sourceLineNo">127</span>    final StuckStateMachineProcedure proc =<a name="line.127"></a>
+<span class="sourceLineNo">128</span>        new StuckStateMachineProcedure(procEnv, StuckStateMachineState.START);<a name="line.128"></a>
+<span class="sourceLineNo">129</span>    long id = procExecutor.submitProcedure(proc);<a name="line.129"></a>
+<span class="sourceLineNo">130</span>    Thread.sleep(500);<a name="line.130"></a>
+<span class="sourceLineNo">131</span>    // bypass the procedure<a name="line.131"></a>
+<span class="sourceLineNo">132</span>    assertFalse(procExecutor.bypassProcedure(id, 1000, false, false));<a name="line.132"></a>
+<span class="sourceLineNo">133</span>    assertTrue(procExecutor.bypassProcedure(id, 1000, true, false));<a name="line.133"></a>
+<span class="sourceLineNo">134</span><a name="line.134"></a>
+<span class="sourceLineNo">135</span>    htu.waitFor(5000, () -&gt; proc.isSuccess() &amp;&amp; proc.isBypass());<a name="line.135"></a>
+<span class="sourceLineNo">136</span>    LOG.info("{} finished", proc);<a name="line.136"></a>
+<span class="sourceLineNo">137</span>  }<a name="line.137"></a>
+<span class="sourceLineNo">138</span><a name="line.138"></a>
+<span class="sourceLineNo">139</span>  @Test<a name="line.139"></a>
+<span class="sourceLineNo">140</span>  public void testBypassingProcedureWithParentRecursive() throws Exception {<a name="line.140"></a>
+<span class="sourceLineNo">141</span>    final RootProcedure proc = new RootProcedure();<a name="line.141"></a>
+<span class="sourceLineNo">142</span>    long rootId = procExecutor.submitProcedure(proc);<a name="line.142"></a>
+<span class="sourceLineNo">143</span>    htu.waitFor(5000, () -&gt; procExecutor.getProcedures().stream()<a name="line.143"></a>
+<span class="sourceLineNo">144</span>        .filter(p -&gt; p.getParentProcId() == rootId).collect(Collectors.toList())<a name="line.144"></a>
+<span class="sourceLineNo">145</span>        .size() &gt; 0);<a name="line.145"></a>
+<span class="sourceLineNo">146</span>    SuspendProcedure suspendProcedure = (SuspendProcedure)procExecutor.getProcedures().stream()<a name="line.146"></a>
+<span class="sourceLineNo">147</span>        .filter(p -&gt; p.getParentProcId() == rootId).collect(Collectors.toList()).get(0);<a name="line.147"></a>
+<span class="sourceLineNo">148</span>    assertTrue(procExecutor.bypassProcedure(rootId, 1000, false, true));<a name="line.148"></a>
+<span class="sourceLineNo">149</span>    htu.waitFor(5000, () -&gt; proc.isSuccess() &amp;&amp; proc.isBypass());<a name="line.149"></a>
+<span class="sourceLineNo">150</span>    LOG.info("{} finished", proc);<a name="line.150"></a>
+<span class="sourceLineNo">151</span>  }<a name="line.151"></a>
+<span class="sourceLineNo">152</span><a name="line.152"></a>
+<span class="sourceLineNo">153</span>  @Test<a name="line.153"></a>
+<span class="sourceLineNo">154</span>  public void testBypassingWaitingTimeoutProcedures() throws Exception {<a name="line.154"></a>
+<span class="sourceLineNo">155</span>    final WaitingTimeoutProcedure proc = new WaitingTimeoutProcedure();<a name="line.155"></a>
+<span class="sourceLineNo">156</span>    long id = procExecutor.submitProcedure(proc);<a name="line.156"></a>
+<span class="sourceLineNo">157</span>    Thread.sleep(500);<a name="line.157"></a>
+<span class="sourceLineNo">158</span>    // bypass the procedure<a name="line.158"></a>
+<span class="sourceLineNo">159</span>    assertTrue(procExecutor.bypassProcedure(id, 1000, true, false));<a name="line.159"></a>
 <span class="sourceLineNo">160</span><a name="line.160"></a>
-<span class="sourceLineNo">161</span>    public SuspendProcedure() {<a name="line.161"></a>
-<span class="sourceLineNo">162</span>      super();<a name="line.162"></a>
-<span class="sourceLineNo">163</span>    }<a name="line.163"></a>
+<span class="sourceLineNo">161</span>    htu.waitFor(5000, () -&gt; proc.isSuccess() &amp;&amp; proc.isBypass());<a name="line.161"></a>
+<span class="sourceLineNo">162</span>    LOG.info("{} finished", proc);<a name="line.162"></a>
+<span class="sourceLineNo">163</span>  }<a name="line.163"></a>
 <span class="sourceLineNo">164</span><a name="line.164"></a>
-<span class="sourceLineNo">165</span>    @Override<a name="line.165"></a>
-<span class="sourceLineNo">166</span>    protected Procedure[] execute(final TestProcEnv env)<a name="line.166"></a>
-<span class="sourceLineNo">167</span>        throws ProcedureSuspendedException {<a name="line.167"></a>
-<span class="sourceLineNo">168</span>      // Always suspend the procedure<a name="line.168"></a>
-<span class="sourceLineNo">169</span>      throw new ProcedureSuspendedException();<a name="line.169"></a>
-<span class="sourceLineNo">170</span>    }<a name="line.170"></a>
-<span class="sourceLineNo">171</span>  }<a name="line.171"></a>
-<span class="sourceLineNo">172</span><a name="line.172"></a>
-<span class="sourceLineNo">173</span>  public static class StuckProcedure extends ProcedureTestingUtility.NoopProcedure&lt;TestProcEnv&gt; {<a name="line.173"></a>
-<span class="sourceLineNo">174</span><a name="line.174"></a>
-<span class="sourceLineNo">175</span>    public StuckProcedure() {<a name="line.175"></a>
-<span class="sourceLineNo">176</span>      super();<a name="line.176"></a>
-<span class="sourceLineNo">177</span>    }<a name="line.177"></a>
-<span class="sourceLineNo">178</span><a name="line.178"></a>
-<span class="sourceLineNo">179</span>    @Override<a name="line.179"></a>
-<span class="sourceLineNo">180</span>    protected Procedure[] execute(final TestProcEnv env) {<a name="line.180"></a>
-<span class="sourceLineNo">181</span>      try {<a name="line.181"></a>
-<span class="sourceLineNo">182</span>        Thread.sleep(Long.MAX_VALUE);<a name="line.182"></a>
-<span class="sourceLineNo">183</span>      } catch (Throwable t) {<a name="line.183"></a>
-<span class="sourceLineNo">184</span>        LOG.debug("Sleep is interrupted.", t);<a name="line.184"></a>
-<span class="sourceLineNo">185</span>      }<a name="line.185"></a>
-<span class="sourceLineNo">186</span>      return null;<a name="line.186"></a>
-<span class="sourceLineNo">187</span>    }<a name="line.187"></a>
-<span class="sourceLineNo">188</span><a name="line.188"></a>
-<span class="sourceLineNo">189</span>  }<a name="line.189"></a>
-<span class="sourceLineNo">190</span><a name="line.190"></a>
+<span class="sourceLineNo">165</span>  @AfterClass<a name="line.165"></a>
+<span class="sourceLineNo">166</span>  public static void tearDown() throws Exception {<a name="line.166"></a>
+<span class="sourceLineNo">167</span>    procExecutor.stop();<a name="line.167"></a>
+<span class="sourceLineNo">168</span>    procStore.stop(false);<a name="line.168"></a>
+<span class="sourceLineNo">169</span>    procExecutor.join();<a name="line.169"></a>
+<span class="sourceLineNo">170</span>  }<a name="line.170"></a>
+<span class="sourceLineNo">171</span><a name="line.171"></a>
+<span class="sourceLineNo">172</span>  public static class SuspendProcedure extends ProcedureTestingUtility.NoopProcedure&lt;TestProcEnv&gt; {<a name="line.172"></a>
+<span class="sourceLineNo">173</span><a name="line.173"></a>
+<span class="sourceLineNo">174</span>    public SuspendProcedure() {<a name="line.174"></a>
+<span class="sourceLineNo">175</span>      super();<a name="line.175"></a>
+<span class="sourceLineNo">176</span>    }<a name="line.176"></a>
+<span class="sourceLineNo">177</span><a name="line.177"></a>
+<span class="sourceLineNo">178</span>    @Override<a name="line.178"></a>
+<span class="sourceLineNo">179</span>    protected Procedure[] execute(final TestProcEnv env)<a name="line.179"></a>
+<span class="sourceLineNo">180</span>        throws ProcedureSuspendedException {<a name="line.180"></a>
+<span class="sourceLineNo">181</span>      // Always suspend the procedure<a name="line.181"></a>
+<span class="sourceLineNo">182</span>      throw new ProcedureSuspendedException();<a name="line.182"></a>
+<span class="sourceLineNo">183</span>    }<a name="line.183"></a>
+<span class="sourceLineNo">184</span>  }<a name="line.184"></a>
+<span class="sourceLineNo">185</span><a name="line.185"></a>
+<span class="sourceLineNo">186</span>  public static class StuckProcedure extends ProcedureTestingUtility.NoopProcedure&lt;TestProcEnv&gt; {<a name="line.186"></a>
+<span class="sourceLineNo">187</span><a name="line.187"></a>
+<span class="sourceLineNo">188</span>    public StuckProcedure() {<a name="line.188"></a>
+<span class="sourceLineNo">189</span>      super();<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>  public static class RootProcedure extends ProcedureTestingUtility.NoopProcedure&lt;TestProcEnv&gt; {<a name="line.192"></a>
-<span class="sourceLineNo">193</span>    private boolean childSpwaned = false;<a name="line.193"></a>
-<span class="sourceLineNo">194</span><a name="line.194"></a>
-<span class="sourceLineNo">195</span>    public RootProcedure() {<a name="line.195"></a>
-<span class="sourceLineNo">196</span>      super();<a name="line.196"></a>
-<span class="sourceLineNo">197</span>    }<a name="line.197"></a>
-<span class="sourceLineNo">198</span><a name="line.198"></a>
-<span class="sourceLineNo">199</span>    @Override<a name="line.199"></a>
-<span class="sourceLineNo">200</span>    protected Procedure[] execute(final TestProcEnv env)<a name="line.200"></a>
-<span class="sourceLineNo">201</span>        throws ProcedureSuspendedException {<a name="line.201"></a>
-<span class="sourceLineNo">202</span>      if (!childSpwaned) {<a name="line.202"></a>
-<span class="sourceLineNo">203</span>        childSpwaned = true;<a name="line.203"></a>
-<span class="sourceLineNo">204</span>        return new Procedure[] {new SuspendProcedure()};<a name="line.204"></a>
-<span class="sourceLineNo">205</span>      } else {<a name="line.205"></a>
-<span class="sourceLineNo">206</span>        return null;<a name="line.206"></a>
-<span class="sourceLineNo">207</span>      }<a name="line.207"></a>
-<span class="sourceLineNo">208</span>    }<a name="line.208"></a>
-<span class="sourceLineNo">209</span>  }<a name="line.209"></a>
-<span class="sourceLineNo">210</span><a name="line.210"></a>
+<span class="sourceLineNo">192</span>    @Override<a name="line.192"></a>
+<span class="sourceLineNo">193</span>    protected Procedure[] execute(final TestProcEnv env) {<a name="line.193"></a>
+<span class="sourceLineNo">194</span>      try {<a name="line.194"></a>
+<span class="sourceLineNo">195</span>        Thread.sleep(Long.MAX_VALUE);<a name="line.195"></a>
+<span class="sourceLineNo">196</span>      } catch (Throwable t) {<a name="line.196"></a>
+<span class="sourceLineNo">197</span>        LOG.debug("Sleep is interrupted.", t);<a name="line.197"></a>
+<span class="sourceLineNo">198</span>      }<a name="line.198"></a>
+<span class="sourceLineNo">199</span>      return null;<a name="line.199"></a>
+<span class="sourceLineNo">200</span>    }<a name="line.200"></a>
+<span class="sourceLineNo">201</span><a name="line.201"></a>
+<span class="sourceLineNo">202</span>  }<a name="line.202"></a>
+<span class="sourceLineNo">203</span><a name="line.203"></a>
+<span class="sourceLineNo">204</span><a name="line.204"></a>
+<span class="sourceLineNo">205</span>  public static class RootProcedure extends ProcedureTestingUtility.NoopProcedure&lt;TestProcEnv&gt; {<a name="line.205"></a>
+<span class="sourceLineNo">206</span>    private boolean childSpwaned = false;<a name="line.206"></a>
+<span class="sourceLineNo">207</span><a name="line.207"></a>
+<span class="sourceLineNo">208</span>    public RootProcedure() {<a name="line.208"></a>
+<span class="sourceLineNo">209</span>      super();<a name="line.209"></a>
+<span class="sourceLineNo">210</span>    }<a name="line.210"></a>
 <span class="sourceLineNo">211</span><a name="line.211"></a>
-<span class="sourceLineNo">212</span>  public enum StuckStateMachineState {<a name="line.212"></a>
-<span class="sourceLineNo">213</span>    START, THEN, END<a name="line.213"></a>
-<span class="sourceLineNo">214</span>  }<a name="line.214"></a>
-<span class="sourceLineNo">215</span><a name="line.215"></a>
-<span class="sourceLineNo">216</span>  public static class StuckStateMachineProcedure extends<a name="line.216"></a>
-<span class="sourceLineNo">217</span>      ProcedureTestingUtility.NoopStateMachineProcedure&lt;TestProcEnv, StuckStateMachineState&gt; {<a name="line.217"></a>
-<span class="sourceLineNo">218</span>    private AtomicBoolean stop = new AtomicBoolean(false);<a name="line.218"></a>
-<span class="sourceLineNo">219</span><a name="line.219"></a>
-<span class="sourceLineNo">220</span>    public StuckStateMachineProcedure() {<a name="line.220"></a>
-<span class="sourceLineNo">221</span>      super();<a name="line.221"></a>
-<span class="sourceLineNo">222</span>    }<a name="line.222"></a>
+<span class="sourceLineNo">212</span>    @Override<a name="line.212"></a>
+<span class="sourceLineNo">213</span>    protected Procedure[] execute(final TestProcEnv env)<a name="line.213"></a>
+<span class="sourceLineNo">214</span>        throws ProcedureSuspendedException {<a name="line.214"></a>
+<span class="sourceLineNo">215</span>      if (!childSpwaned) {<a name="line.215"></a>
+<span class="sourceLineNo">216</span>        childSpwaned = true;<a name="line.216"></a>
+<span class="sourceLineNo">217</span>        return new Procedure[] {new SuspendProcedure()};<a name="line.217"></a>
+<span class="sourceLineNo">218</span>      } else {<a name="line.218"></a>
+<span class="sourceLineNo">219</span>        return null;<a name="line.219"></a>
+<span class="sourceLineNo">220</span>      }<a name="line.220"></a>
+<span class="sourceLineNo">221</span>    }<a name="line.221"></a>
+<span class="sourceLineNo">222</span>  }<a name="line.222"></a>
 <span class="sourceLineNo">223</span><a name="line.223"></a>
-<span class="sourceLineNo">224</span>    public StuckStateMachineProcedure(TestProcEnv env, StuckStateMachineState initialState) {<a name="line.224"></a>
-<span class="sourceLineNo">225</span>      super(env, initialState);<a name="line.225"></a>
-<span class="sourceLineNo">226</span>    }<a name="line.226"></a>
-<span class="sourceLineNo">227</span><a name="line.227"></a>
-<span class="sourceLineNo">228</span>    @Override<a name="line.228"></a>
-<span class="sourceLineNo">229</span>    protected Flow executeFromState(TestProcEnv env, StuckStateMachineState tState)<a name="line.229"></a>
-<span class="sourceLineNo">230</span>            throws ProcedureSuspendedException, ProcedureYieldException, InterruptedException {<a name="line.230"></a>
-<span class="sourceLineNo">231</span>      switch (tState) {<a name="line.231"></a>
-<span class="sourceLineNo">232</span>        case START:<a name="line.232"></a>
-<span class="sourceLineNo">233</span>          LOG.info("PHASE 1: START");<a name="line.233"></a>
-<span class="sourceLineNo">234</span>          setNextState(StuckStateMachineState.THEN);<a name="line.234"></a>
-<span class="sourceLineNo">235</span>          return Flow.HAS_MORE_STATE;<a name="line.235"></a>
-<span class="sourceLineNo">236</span>        case THEN:<a name="line.236"></a>
-<span class="sourceLineNo">237</span>          if (stop.get()) {<a name="line.237"></a>
-<span class="sourceLineNo">238</span>            setNextState(StuckStateMachineState.END);<a name="line.238"></a>
-<span class="sourceLineNo">239</span>          }<a name="line.239"></a>
-<span class="sourceLineNo">240</span>          return Flow.HAS_MORE_STATE;<a name="line.240"></a>
-<span class="sourceLineNo">241</span>        case END:<a name="line.241"></a>
-<span class="sourceLineNo">242</span>          return Flow.NO_MORE_STATE;<a name="line.242"></a>
-<span class="sourceLineNo">243</span>        default:<a name="line.243"></a>
-<span class="sourceLineNo">244</span>          throw new UnsupportedOperationException("unhandled state=" + tState);<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">224</span>  public static class WaitingTimeoutProcedure<a name="line.224"></a>
+<span class="sourceLineNo">225</span>      extends ProcedureTestingUtility.NoopProcedure&lt;TestProcEnv&gt; {<a name="line.225"></a>
+<span class="sourceLineNo">226</span>    public WaitingTimeoutProcedure() {<a name="line.226"></a>
+<span class="sourceLineNo">227</span>      super();<a name="line.227"></a>
+<span class="sourceLineNo">228</span>    }<a name="line.228"></a>
+<span class="sourceLineNo">229</span><a name="line.229"></a>
+<span class="sourceLineNo">230</span>    @Override<a name="line.230"></a>
+<span class="sourceLineNo">231</span>    protected Procedure[] execute(final TestProcEnv env)<a name="line.231"></a>
+<span class="sourceLineNo">232</span>        throws ProcedureSuspendedException {<a name="line.232"></a>
+<span class="sourceLineNo">233</span>      // Always suspend the procedure<a name="line.233"></a>
+<span class="sourceLineNo">234</span>      setTimeout(50000);<a name="line.234"></a>
+<span class="sourceLineNo">235</span>      setState(ProcedureProtos.ProcedureState.WAITING_TIMEOUT);<a name="line.235"></a>
+<span class="sourceLineNo">236</span>      skipPersistence();<a name="line.236"></a>
+<span class="sourceLineNo">237</span>      throw new ProcedureSuspendedException();<a name="line.237"></a>
+<span class="sourceLineNo">238</span>    }<a name="line.238"></a>
+<span class="sourceLineNo">239</span><a name="line.239"></a>
+<span class="sourceLineNo">240</span>    @Override<a name="line.240"></a>
+<span class="sourceLineNo">241</span>    protected synchronized boolean setTimeoutFailure(TestProcEnv env) {<a name="line.241"></a>
+<span class="sourceLineNo">242</span>      setState(ProcedureProtos.ProcedureState.RUNNABLE);<a name="line.242"></a>
+<span class="sourceLineNo">243</span>      procExecutor.getScheduler().addFront(this);<a name="line.243"></a>
+<span class="sourceLineNo">244</span>      return false; // 'false' means that this procedure handled the timeout<a name="line.244"></a>
+<span class="sourceLineNo">245</span>    }<a name="line.245"></a>
+<span class="sourceLineNo">246</span>  }<a name="line.246"></a>
 <span class="sourceLineNo">247</span><a name="line.247"></a>
-<span class="sourceLineNo">248</span>    @Override<a name="line.248"></a>
-<span class="sourceLineNo">249</span>    protected StuckStateMachineState getState(int stateId) {<a name="line.249"></a>
-<span class="sourceLineNo">250</span>      return StuckStateMachineState.values()[stateId];<a name="line.250"></a>
-<span class="sourceLineNo">251</span>    }<a name="line.251"></a>
-<span class="sourceLineNo">252</span><a name="line.252"></a>
-<span class="sourceLineNo">253</span>    @Override<a name="line.253"></a>
-<span class="sourceLineNo">254</span>    protected int getStateId(StuckStateMachineState tState) {<a name="line.254"></a>
-<span class="sourceLineNo">255</span>      return tState.ordinal();<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">248</span>  public enum StuckStateMachineState {<a name="line.248"></a>
+<span class="sourceLineNo">249</span>    START, THEN, END<a name="line.249"></a>
+<span class="sourceLineNo">250</span>  }<a name="line.250"></a>
+<span class="sourceLineNo">251</span><a name="line.251"></a>
+<span class="sourceLineNo">252</span>  public static class StuckStateMachineProcedure extends<a name="line.252"></a>
+<span class="sourceLineNo">253</span>      ProcedureTestingUtility.NoopStateMachineProcedure&lt;TestProcEnv, StuckStateMachineState&gt; {<a name="line.253"></a>
+<span class="sourceLineNo">254</span>    private AtomicBoolean stop = new AtomicBoolean(false);<a name="line.254"></a>
+<span class="sourceLineNo">255</span><a name="line.255"></a>
+<span class="sourceLineNo">256</span>    public StuckStateMachineProcedure() {<a name="line.256"></a>
+<span class="sourceLineNo">257</span>      super();<a name="line.257"></a>
+<span class="sourceLineNo">258</span>    }<a name="line.258"></a>
 <span class="sourceLineNo">259</span><a name="line.259"></a>
-<span class="sourceLineNo">260</span>}<a name="line.260"></a>
+<span class="sourceLineNo">260</span>    public StuckStateMachineProcedure(TestProcEnv env, StuckStateMachineState initialState) {<a name="line.260"></a>
+<span class="sourceLineNo">261</span>      super(env, initialState);<a name="line.261"></a>
+<span class="sourceLineNo">262</span>    }<a name="line.262"></a>
+<span class="sourceLineNo">263</span><a name="line.263"></a>
+<span class="sourceLineNo">264</span>    @Override<a name="line.264"></a>
+<span class="sourceLineNo">265</span>    protected Flow executeFromState(TestProcEnv env, StuckStateMachineState tState)<a name="line.265"></a>
+<span class="sourceLineNo">266</span>            throws ProcedureSuspendedException, ProcedureYieldException, InterruptedException {<a name="line.266"></a>
+<span class="sourceLineNo">267</span>      switch (tState) {<a name="line.267"></a>
+<span class="sourceLineNo">268</span>        case START:<a name="line.268"></a>
+<span class="sourceLineNo">269</span>          LOG.info("PHASE 1: START");<a name="line.269"></a>
+<span class="sourceLineNo">270</span>          setNextState(StuckStateMachineState.THEN);<a name="line.270"></a>
+<span class="sourceLineNo">271</span>          return Flow.HAS_MORE_STATE;<a name="line.271"></a>
+<span class="sourceLineNo">272</span>        case THEN:<a name="line.272"></a>
+<span class="sourceLineNo">273</span>          if (stop.get()) {<a name="line.273"></a>
+<span class="sourceLineNo">274</span>            setNextState(StuckStateMachineState.END);<a name="line.274"></a>
+<span class="sourceLineNo">275</span>          }<a name="line.275"></a>
+<span class="sourceLineNo">276</span>          return Flow.HAS_MORE_STATE;<a name="line.276"></a>
+<span class="sourceLineNo">277</span>        case END:<a name="line.277"></a>
+<span class="sourceLineNo">278</span>          return Flow.NO_MORE_STATE;<a name="line.278"></a>
+<span class="sourceLineNo">279</span>        default:<a name="line.279"></a>
+<span class="sourceLineNo">280</span>          throw new UnsupportedOperationException("unhandled state=" + tState);<a name="line.280"></a>
+<span class="sourceLineNo">281</span>      }<a name="line.281"></a>
+<span class="sourceLineNo">282</span>    }<a name="line.282"></a>
+<span class="sourceLineNo">283</span><a name="line.283"></a>
+<span class="sourceLineNo">284</span>    @Override<a name="line.284"></a>
+<span class="sourceLineNo">285</span>    protected StuckStateMachineState getState(int stateId) {<a name="line.285"></a>
+<span class="sourceLineNo">286</span>      return StuckStateMachineState.values()[stateId];<a name="line.286"></a>
+<span class="sourceLineNo">287</span>    }<a name="line.287"></a>
+<span class="sourceLineNo">288</span><a name="line.288"></a>
+<span class="sourceLineNo">289</span>    @Override<a name="line.289"></a>
+<span class="sourceLineNo">290</span>    protected int getStateId(StuckStateMachineState tState) {<a name="line.290"></a>
+<span class="sourceLineNo">291</span>      return tState.ordinal();<a name="line.291"></a>
+<span class="sourceLineNo">292</span>    }<a name="line.292"></a>
+<span class="sourceLineNo">293</span>  }<a name="line.293"></a>
+<span class="sourceLineNo">294</span><a name="line.294"></a>
+<span class="sourceLineNo">295</span><a name="line.295"></a>
+<span class="sourceLineNo">296</span>}<a name="line.296"></a>
 
 
 


[02/29] hbase-site git commit: Published site at 5e84997f2ffdbcf5f849d70c30ddbe2db4039ca4.

Posted by gi...@apache.org.
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/27f5bfb5/testdevapidocs/src-html/org/apache/hadoop/hbase/procedure2/TestProcedureBypass.html
----------------------------------------------------------------------
diff --git a/testdevapidocs/src-html/org/apache/hadoop/hbase/procedure2/TestProcedureBypass.html b/testdevapidocs/src-html/org/apache/hadoop/hbase/procedure2/TestProcedureBypass.html
index 7eb899a..f89b826 100644
--- a/testdevapidocs/src-html/org/apache/hadoop/hbase/procedure2/TestProcedureBypass.html
+++ b/testdevapidocs/src-html/org/apache/hadoop/hbase/procedure2/TestProcedureBypass.html
@@ -46,226 +46,262 @@
 <span class="sourceLineNo">038</span>import org.slf4j.Logger;<a name="line.38"></a>
 <span class="sourceLineNo">039</span>import org.slf4j.LoggerFactory;<a name="line.39"></a>
 <span class="sourceLineNo">040</span><a name="line.40"></a>
-<span class="sourceLineNo">041</span><a name="line.41"></a>
+<span class="sourceLineNo">041</span>import org.apache.hadoop.hbase.shaded.protobuf.generated.ProcedureProtos;<a name="line.41"></a>
 <span class="sourceLineNo">042</span><a name="line.42"></a>
-<span class="sourceLineNo">043</span>@Category({MasterTests.class, SmallTests.class})<a name="line.43"></a>
-<span class="sourceLineNo">044</span>public class TestProcedureBypass {<a name="line.44"></a>
-<span class="sourceLineNo">045</span><a name="line.45"></a>
-<span class="sourceLineNo">046</span>  @ClassRule public static final HBaseClassTestRule CLASS_RULE = HBaseClassTestRule<a name="line.46"></a>
-<span class="sourceLineNo">047</span>      .forClass(TestProcedureBypass.class);<a name="line.47"></a>
-<span class="sourceLineNo">048</span><a name="line.48"></a>
-<span class="sourceLineNo">049</span>  private static final Logger LOG = LoggerFactory.getLogger(TestProcedureBypass.class);<a name="line.49"></a>
-<span class="sourceLineNo">050</span><a name="line.50"></a>
-<span class="sourceLineNo">051</span>  private static final int PROCEDURE_EXECUTOR_SLOTS = 1;<a name="line.51"></a>
-<span class="sourceLineNo">052</span><a name="line.52"></a>
-<span class="sourceLineNo">053</span>  private static TestProcEnv procEnv;<a name="line.53"></a>
-<span class="sourceLineNo">054</span>  private static ProcedureStore procStore;<a name="line.54"></a>
-<span class="sourceLineNo">055</span><a name="line.55"></a>
-<span class="sourceLineNo">056</span>  private static ProcedureExecutor&lt;TestProcEnv&gt; procExecutor;<a name="line.56"></a>
-<span class="sourceLineNo">057</span><a name="line.57"></a>
-<span class="sourceLineNo">058</span>  private static HBaseCommonTestingUtility htu;<a name="line.58"></a>
-<span class="sourceLineNo">059</span><a name="line.59"></a>
-<span class="sourceLineNo">060</span>  private static FileSystem fs;<a name="line.60"></a>
-<span class="sourceLineNo">061</span>  private static Path testDir;<a name="line.61"></a>
-<span class="sourceLineNo">062</span>  private static Path logDir;<a name="line.62"></a>
-<span class="sourceLineNo">063</span><a name="line.63"></a>
-<span class="sourceLineNo">064</span>  private static class TestProcEnv {<a name="line.64"></a>
-<span class="sourceLineNo">065</span>  }<a name="line.65"></a>
-<span class="sourceLineNo">066</span><a name="line.66"></a>
-<span class="sourceLineNo">067</span>  @BeforeClass<a name="line.67"></a>
-<span class="sourceLineNo">068</span>  public static void setUp() throws Exception {<a name="line.68"></a>
-<span class="sourceLineNo">069</span>    htu = new HBaseCommonTestingUtility();<a name="line.69"></a>
-<span class="sourceLineNo">070</span><a name="line.70"></a>
-<span class="sourceLineNo">071</span>    // NOTE: The executor will be created by each test<a name="line.71"></a>
-<span class="sourceLineNo">072</span>    procEnv = new TestProcEnv();<a name="line.72"></a>
-<span class="sourceLineNo">073</span>    testDir = htu.getDataTestDir();<a name="line.73"></a>
-<span class="sourceLineNo">074</span>    fs = testDir.getFileSystem(htu.getConfiguration());<a name="line.74"></a>
-<span class="sourceLineNo">075</span>    assertTrue(testDir.depth() &gt; 1);<a name="line.75"></a>
-<span class="sourceLineNo">076</span><a name="line.76"></a>
-<span class="sourceLineNo">077</span>    logDir = new Path(testDir, "proc-logs");<a name="line.77"></a>
-<span class="sourceLineNo">078</span>    procStore = ProcedureTestingUtility.createWalStore(htu.getConfiguration(), logDir);<a name="line.78"></a>
-<span class="sourceLineNo">079</span>    procExecutor = new ProcedureExecutor&lt;&gt;(htu.getConfiguration(), procEnv,<a name="line.79"></a>
-<span class="sourceLineNo">080</span>        procStore);<a name="line.80"></a>
-<span class="sourceLineNo">081</span>    procStore.start(PROCEDURE_EXECUTOR_SLOTS);<a name="line.81"></a>
-<span class="sourceLineNo">082</span>    ProcedureTestingUtility<a name="line.82"></a>
-<span class="sourceLineNo">083</span>        .initAndStartWorkers(procExecutor, PROCEDURE_EXECUTOR_SLOTS, true);<a name="line.83"></a>
-<span class="sourceLineNo">084</span>  }<a name="line.84"></a>
-<span class="sourceLineNo">085</span><a name="line.85"></a>
-<span class="sourceLineNo">086</span>  @Test<a name="line.86"></a>
-<span class="sourceLineNo">087</span>  public void testBypassSuspendProcedure() throws Exception {<a name="line.87"></a>
-<span class="sourceLineNo">088</span>    final SuspendProcedure proc = new SuspendProcedure();<a name="line.88"></a>
-<span class="sourceLineNo">089</span>    long id = procExecutor.submitProcedure(proc);<a name="line.89"></a>
-<span class="sourceLineNo">090</span>    Thread.sleep(500);<a name="line.90"></a>
-<span class="sourceLineNo">091</span>    //bypass the procedure<a name="line.91"></a>
-<span class="sourceLineNo">092</span>    assertTrue(procExecutor.bypassProcedure(id, 30000, false, false));<a name="line.92"></a>
-<span class="sourceLineNo">093</span>    htu.waitFor(5000, () -&gt; proc.isSuccess() &amp;&amp; proc.isBypass());<a name="line.93"></a>
-<span class="sourceLineNo">094</span>    LOG.info("{} finished", proc);<a name="line.94"></a>
-<span class="sourceLineNo">095</span>  }<a name="line.95"></a>
-<span class="sourceLineNo">096</span><a name="line.96"></a>
-<span class="sourceLineNo">097</span>  @Test<a name="line.97"></a>
-<span class="sourceLineNo">098</span>  public void testStuckProcedure() throws Exception {<a name="line.98"></a>
-<span class="sourceLineNo">099</span>    final StuckProcedure proc = new StuckProcedure();<a name="line.99"></a>
-<span class="sourceLineNo">100</span>    long id = procExecutor.submitProcedure(proc);<a name="line.100"></a>
-<span class="sourceLineNo">101</span>    Thread.sleep(500);<a name="line.101"></a>
-<span class="sourceLineNo">102</span>    //bypass the procedure<a name="line.102"></a>
-<span class="sourceLineNo">103</span>    assertTrue(procExecutor.bypassProcedure(id, 1000, true, false));<a name="line.103"></a>
-<span class="sourceLineNo">104</span>    //Since the procedure is stuck there, we need to restart the executor to recovery.<a name="line.104"></a>
-<span class="sourceLineNo">105</span>    ProcedureTestingUtility.restart(procExecutor);<a name="line.105"></a>
-<span class="sourceLineNo">106</span>    htu.waitFor(5000, () -&gt; proc.isSuccess() &amp;&amp; proc.isBypass());<a name="line.106"></a>
-<span class="sourceLineNo">107</span>    LOG.info("{} finished", proc);<a name="line.107"></a>
-<span class="sourceLineNo">108</span>  }<a name="line.108"></a>
-<span class="sourceLineNo">109</span><a name="line.109"></a>
-<span class="sourceLineNo">110</span>  @Test<a name="line.110"></a>
-<span class="sourceLineNo">111</span>  public void testBypassingProcedureWithParent() throws Exception {<a name="line.111"></a>
-<span class="sourceLineNo">112</span>    final RootProcedure proc = new RootProcedure();<a name="line.112"></a>
-<span class="sourceLineNo">113</span>    long rootId = procExecutor.submitProcedure(proc);<a name="line.113"></a>
-<span class="sourceLineNo">114</span>    htu.waitFor(5000, () -&gt; procExecutor.getProcedures().stream()<a name="line.114"></a>
-<span class="sourceLineNo">115</span>      .filter(p -&gt; p.getParentProcId() == rootId).collect(Collectors.toList())<a name="line.115"></a>
-<span class="sourceLineNo">116</span>      .size() &gt; 0);<a name="line.116"></a>
-<span class="sourceLineNo">117</span>    SuspendProcedure suspendProcedure = (SuspendProcedure)procExecutor.getProcedures().stream()<a name="line.117"></a>
-<span class="sourceLineNo">118</span>        .filter(p -&gt; p.getParentProcId() == rootId).collect(Collectors.toList()).get(0);<a name="line.118"></a>
-<span class="sourceLineNo">119</span>    assertTrue(procExecutor.bypassProcedure(suspendProcedure.getProcId(), 1000, false, false));<a name="line.119"></a>
-<span class="sourceLineNo">120</span>    htu.waitFor(5000, () -&gt; proc.isSuccess() &amp;&amp; proc.isBypass());<a name="line.120"></a>
-<span class="sourceLineNo">121</span>    LOG.info("{} finished", proc);<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 testBypassingStuckStateMachineProcedure() throws Exception {<a name="line.125"></a>
-<span class="sourceLineNo">126</span>    final StuckStateMachineProcedure proc =<a name="line.126"></a>
-<span class="sourceLineNo">127</span>        new StuckStateMachineProcedure(procEnv, StuckStateMachineState.START);<a name="line.127"></a>
-<span class="sourceLineNo">128</span>    long id = procExecutor.submitProcedure(proc);<a name="line.128"></a>
-<span class="sourceLineNo">129</span>    Thread.sleep(500);<a name="line.129"></a>
-<span class="sourceLineNo">130</span>    // bypass the procedure<a name="line.130"></a>
-<span class="sourceLineNo">131</span>    assertFalse(procExecutor.bypassProcedure(id, 1000, false, false));<a name="line.131"></a>
-<span class="sourceLineNo">132</span>    assertTrue(procExecutor.bypassProcedure(id, 1000, true, false));<a name="line.132"></a>
-<span class="sourceLineNo">133</span><a name="line.133"></a>
-<span class="sourceLineNo">134</span>    htu.waitFor(5000, () -&gt; proc.isSuccess() &amp;&amp; proc.isBypass());<a name="line.134"></a>
-<span class="sourceLineNo">135</span>    LOG.info("{} finished", proc);<a name="line.135"></a>
-<span class="sourceLineNo">136</span>  }<a name="line.136"></a>
-<span class="sourceLineNo">137</span><a name="line.137"></a>
-<span class="sourceLineNo">138</span>  @Test<a name="line.138"></a>
-<span class="sourceLineNo">139</span>  public void testBypassingProcedureWithParentRecursive() throws Exception {<a name="line.139"></a>
-<span class="sourceLineNo">140</span>    final RootProcedure proc = new RootProcedure();<a name="line.140"></a>
-<span class="sourceLineNo">141</span>    long rootId = procExecutor.submitProcedure(proc);<a name="line.141"></a>
-<span class="sourceLineNo">142</span>    htu.waitFor(5000, () -&gt; procExecutor.getProcedures().stream()<a name="line.142"></a>
-<span class="sourceLineNo">143</span>        .filter(p -&gt; p.getParentProcId() == rootId).collect(Collectors.toList())<a name="line.143"></a>
-<span class="sourceLineNo">144</span>        .size() &gt; 0);<a name="line.144"></a>
-<span class="sourceLineNo">145</span>    SuspendProcedure suspendProcedure = (SuspendProcedure)procExecutor.getProcedures().stream()<a name="line.145"></a>
-<span class="sourceLineNo">146</span>        .filter(p -&gt; p.getParentProcId() == rootId).collect(Collectors.toList()).get(0);<a name="line.146"></a>
-<span class="sourceLineNo">147</span>    assertTrue(procExecutor.bypassProcedure(rootId, 1000, false, true));<a name="line.147"></a>
-<span class="sourceLineNo">148</span>    htu.waitFor(5000, () -&gt; proc.isSuccess() &amp;&amp; proc.isBypass());<a name="line.148"></a>
-<span class="sourceLineNo">149</span>    LOG.info("{} finished", proc);<a name="line.149"></a>
-<span class="sourceLineNo">150</span>  }<a name="line.150"></a>
-<span class="sourceLineNo">151</span><a name="line.151"></a>
-<span class="sourceLineNo">152</span>  @AfterClass<a name="line.152"></a>
-<span class="sourceLineNo">153</span>  public static void tearDown() throws Exception {<a name="line.153"></a>
-<span class="sourceLineNo">154</span>    procExecutor.stop();<a name="line.154"></a>
-<span class="sourceLineNo">155</span>    procStore.stop(false);<a name="line.155"></a>
-<span class="sourceLineNo">156</span>    procExecutor.join();<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>  public static class SuspendProcedure extends ProcedureTestingUtility.NoopProcedure&lt;TestProcEnv&gt; {<a name="line.159"></a>
+<span class="sourceLineNo">043</span><a name="line.43"></a>
+<span class="sourceLineNo">044</span>@Category({MasterTests.class, SmallTests.class})<a name="line.44"></a>
+<span class="sourceLineNo">045</span>public class TestProcedureBypass {<a name="line.45"></a>
+<span class="sourceLineNo">046</span><a name="line.46"></a>
+<span class="sourceLineNo">047</span>  @ClassRule public static final HBaseClassTestRule CLASS_RULE = HBaseClassTestRule<a name="line.47"></a>
+<span class="sourceLineNo">048</span>      .forClass(TestProcedureBypass.class);<a name="line.48"></a>
+<span class="sourceLineNo">049</span><a name="line.49"></a>
+<span class="sourceLineNo">050</span>  private static final Logger LOG = LoggerFactory.getLogger(TestProcedureBypass.class);<a name="line.50"></a>
+<span class="sourceLineNo">051</span><a name="line.51"></a>
+<span class="sourceLineNo">052</span>  private static final int PROCEDURE_EXECUTOR_SLOTS = 1;<a name="line.52"></a>
+<span class="sourceLineNo">053</span><a name="line.53"></a>
+<span class="sourceLineNo">054</span>  private static TestProcEnv procEnv;<a name="line.54"></a>
+<span class="sourceLineNo">055</span>  private static ProcedureStore procStore;<a name="line.55"></a>
+<span class="sourceLineNo">056</span><a name="line.56"></a>
+<span class="sourceLineNo">057</span>  private static ProcedureExecutor&lt;TestProcEnv&gt; procExecutor;<a name="line.57"></a>
+<span class="sourceLineNo">058</span><a name="line.58"></a>
+<span class="sourceLineNo">059</span>  private static HBaseCommonTestingUtility htu;<a name="line.59"></a>
+<span class="sourceLineNo">060</span><a name="line.60"></a>
+<span class="sourceLineNo">061</span>  private static FileSystem fs;<a name="line.61"></a>
+<span class="sourceLineNo">062</span>  private static Path testDir;<a name="line.62"></a>
+<span class="sourceLineNo">063</span>  private static Path logDir;<a name="line.63"></a>
+<span class="sourceLineNo">064</span><a name="line.64"></a>
+<span class="sourceLineNo">065</span>  private static class TestProcEnv {<a name="line.65"></a>
+<span class="sourceLineNo">066</span>  }<a name="line.66"></a>
+<span class="sourceLineNo">067</span><a name="line.67"></a>
+<span class="sourceLineNo">068</span>  @BeforeClass<a name="line.68"></a>
+<span class="sourceLineNo">069</span>  public static void setUp() throws Exception {<a name="line.69"></a>
+<span class="sourceLineNo">070</span>    htu = new HBaseCommonTestingUtility();<a name="line.70"></a>
+<span class="sourceLineNo">071</span><a name="line.71"></a>
+<span class="sourceLineNo">072</span>    // NOTE: The executor will be created by each test<a name="line.72"></a>
+<span class="sourceLineNo">073</span>    procEnv = new TestProcEnv();<a name="line.73"></a>
+<span class="sourceLineNo">074</span>    testDir = htu.getDataTestDir();<a name="line.74"></a>
+<span class="sourceLineNo">075</span>    fs = testDir.getFileSystem(htu.getConfiguration());<a name="line.75"></a>
+<span class="sourceLineNo">076</span>    assertTrue(testDir.depth() &gt; 1);<a name="line.76"></a>
+<span class="sourceLineNo">077</span><a name="line.77"></a>
+<span class="sourceLineNo">078</span>    logDir = new Path(testDir, "proc-logs");<a name="line.78"></a>
+<span class="sourceLineNo">079</span>    procStore = ProcedureTestingUtility.createWalStore(htu.getConfiguration(), logDir);<a name="line.79"></a>
+<span class="sourceLineNo">080</span>    procExecutor = new ProcedureExecutor&lt;&gt;(htu.getConfiguration(), procEnv,<a name="line.80"></a>
+<span class="sourceLineNo">081</span>        procStore);<a name="line.81"></a>
+<span class="sourceLineNo">082</span>    procStore.start(PROCEDURE_EXECUTOR_SLOTS);<a name="line.82"></a>
+<span class="sourceLineNo">083</span>    ProcedureTestingUtility<a name="line.83"></a>
+<span class="sourceLineNo">084</span>        .initAndStartWorkers(procExecutor, PROCEDURE_EXECUTOR_SLOTS, true);<a name="line.84"></a>
+<span class="sourceLineNo">085</span>  }<a name="line.85"></a>
+<span class="sourceLineNo">086</span><a name="line.86"></a>
+<span class="sourceLineNo">087</span>  @Test<a name="line.87"></a>
+<span class="sourceLineNo">088</span>  public void testBypassSuspendProcedure() throws Exception {<a name="line.88"></a>
+<span class="sourceLineNo">089</span>    final SuspendProcedure proc = new SuspendProcedure();<a name="line.89"></a>
+<span class="sourceLineNo">090</span>    long id = procExecutor.submitProcedure(proc);<a name="line.90"></a>
+<span class="sourceLineNo">091</span>    Thread.sleep(500);<a name="line.91"></a>
+<span class="sourceLineNo">092</span>    //bypass the procedure<a name="line.92"></a>
+<span class="sourceLineNo">093</span>    assertTrue(procExecutor.bypassProcedure(id, 30000, false, false));<a name="line.93"></a>
+<span class="sourceLineNo">094</span>    htu.waitFor(5000, () -&gt; proc.isSuccess() &amp;&amp; proc.isBypass());<a name="line.94"></a>
+<span class="sourceLineNo">095</span>    LOG.info("{} finished", proc);<a name="line.95"></a>
+<span class="sourceLineNo">096</span>  }<a name="line.96"></a>
+<span class="sourceLineNo">097</span><a name="line.97"></a>
+<span class="sourceLineNo">098</span>  @Test<a name="line.98"></a>
+<span class="sourceLineNo">099</span>  public void testStuckProcedure() throws Exception {<a name="line.99"></a>
+<span class="sourceLineNo">100</span>    final StuckProcedure proc = new StuckProcedure();<a name="line.100"></a>
+<span class="sourceLineNo">101</span>    long id = procExecutor.submitProcedure(proc);<a name="line.101"></a>
+<span class="sourceLineNo">102</span>    Thread.sleep(500);<a name="line.102"></a>
+<span class="sourceLineNo">103</span>    //bypass the procedure<a name="line.103"></a>
+<span class="sourceLineNo">104</span>    assertTrue(procExecutor.bypassProcedure(id, 1000, true, false));<a name="line.104"></a>
+<span class="sourceLineNo">105</span>    //Since the procedure is stuck there, we need to restart the executor to recovery.<a name="line.105"></a>
+<span class="sourceLineNo">106</span>    ProcedureTestingUtility.restart(procExecutor);<a name="line.106"></a>
+<span class="sourceLineNo">107</span>    htu.waitFor(5000, () -&gt; proc.isSuccess() &amp;&amp; proc.isBypass());<a name="line.107"></a>
+<span class="sourceLineNo">108</span>    LOG.info("{} finished", proc);<a name="line.108"></a>
+<span class="sourceLineNo">109</span>  }<a name="line.109"></a>
+<span class="sourceLineNo">110</span><a name="line.110"></a>
+<span class="sourceLineNo">111</span>  @Test<a name="line.111"></a>
+<span class="sourceLineNo">112</span>  public void testBypassingProcedureWithParent() throws Exception {<a name="line.112"></a>
+<span class="sourceLineNo">113</span>    final RootProcedure proc = new RootProcedure();<a name="line.113"></a>
+<span class="sourceLineNo">114</span>    long rootId = procExecutor.submitProcedure(proc);<a name="line.114"></a>
+<span class="sourceLineNo">115</span>    htu.waitFor(5000, () -&gt; procExecutor.getProcedures().stream()<a name="line.115"></a>
+<span class="sourceLineNo">116</span>      .filter(p -&gt; p.getParentProcId() == rootId).collect(Collectors.toList())<a name="line.116"></a>
+<span class="sourceLineNo">117</span>      .size() &gt; 0);<a name="line.117"></a>
+<span class="sourceLineNo">118</span>    SuspendProcedure suspendProcedure = (SuspendProcedure)procExecutor.getProcedures().stream()<a name="line.118"></a>
+<span class="sourceLineNo">119</span>        .filter(p -&gt; p.getParentProcId() == rootId).collect(Collectors.toList()).get(0);<a name="line.119"></a>
+<span class="sourceLineNo">120</span>    assertTrue(procExecutor.bypassProcedure(suspendProcedure.getProcId(), 1000, false, false));<a name="line.120"></a>
+<span class="sourceLineNo">121</span>    htu.waitFor(5000, () -&gt; proc.isSuccess() &amp;&amp; proc.isBypass());<a name="line.121"></a>
+<span class="sourceLineNo">122</span>    LOG.info("{} finished", proc);<a name="line.122"></a>
+<span class="sourceLineNo">123</span>  }<a name="line.123"></a>
+<span class="sourceLineNo">124</span><a name="line.124"></a>
+<span class="sourceLineNo">125</span>  @Test<a name="line.125"></a>
+<span class="sourceLineNo">126</span>  public void testBypassingStuckStateMachineProcedure() throws Exception {<a name="line.126"></a>
+<span class="sourceLineNo">127</span>    final StuckStateMachineProcedure proc =<a name="line.127"></a>
+<span class="sourceLineNo">128</span>        new StuckStateMachineProcedure(procEnv, StuckStateMachineState.START);<a name="line.128"></a>
+<span class="sourceLineNo">129</span>    long id = procExecutor.submitProcedure(proc);<a name="line.129"></a>
+<span class="sourceLineNo">130</span>    Thread.sleep(500);<a name="line.130"></a>
+<span class="sourceLineNo">131</span>    // bypass the procedure<a name="line.131"></a>
+<span class="sourceLineNo">132</span>    assertFalse(procExecutor.bypassProcedure(id, 1000, false, false));<a name="line.132"></a>
+<span class="sourceLineNo">133</span>    assertTrue(procExecutor.bypassProcedure(id, 1000, true, false));<a name="line.133"></a>
+<span class="sourceLineNo">134</span><a name="line.134"></a>
+<span class="sourceLineNo">135</span>    htu.waitFor(5000, () -&gt; proc.isSuccess() &amp;&amp; proc.isBypass());<a name="line.135"></a>
+<span class="sourceLineNo">136</span>    LOG.info("{} finished", proc);<a name="line.136"></a>
+<span class="sourceLineNo">137</span>  }<a name="line.137"></a>
+<span class="sourceLineNo">138</span><a name="line.138"></a>
+<span class="sourceLineNo">139</span>  @Test<a name="line.139"></a>
+<span class="sourceLineNo">140</span>  public void testBypassingProcedureWithParentRecursive() throws Exception {<a name="line.140"></a>
+<span class="sourceLineNo">141</span>    final RootProcedure proc = new RootProcedure();<a name="line.141"></a>
+<span class="sourceLineNo">142</span>    long rootId = procExecutor.submitProcedure(proc);<a name="line.142"></a>
+<span class="sourceLineNo">143</span>    htu.waitFor(5000, () -&gt; procExecutor.getProcedures().stream()<a name="line.143"></a>
+<span class="sourceLineNo">144</span>        .filter(p -&gt; p.getParentProcId() == rootId).collect(Collectors.toList())<a name="line.144"></a>
+<span class="sourceLineNo">145</span>        .size() &gt; 0);<a name="line.145"></a>
+<span class="sourceLineNo">146</span>    SuspendProcedure suspendProcedure = (SuspendProcedure)procExecutor.getProcedures().stream()<a name="line.146"></a>
+<span class="sourceLineNo">147</span>        .filter(p -&gt; p.getParentProcId() == rootId).collect(Collectors.toList()).get(0);<a name="line.147"></a>
+<span class="sourceLineNo">148</span>    assertTrue(procExecutor.bypassProcedure(rootId, 1000, false, true));<a name="line.148"></a>
+<span class="sourceLineNo">149</span>    htu.waitFor(5000, () -&gt; proc.isSuccess() &amp;&amp; proc.isBypass());<a name="line.149"></a>
+<span class="sourceLineNo">150</span>    LOG.info("{} finished", proc);<a name="line.150"></a>
+<span class="sourceLineNo">151</span>  }<a name="line.151"></a>
+<span class="sourceLineNo">152</span><a name="line.152"></a>
+<span class="sourceLineNo">153</span>  @Test<a name="line.153"></a>
+<span class="sourceLineNo">154</span>  public void testBypassingWaitingTimeoutProcedures() throws Exception {<a name="line.154"></a>
+<span class="sourceLineNo">155</span>    final WaitingTimeoutProcedure proc = new WaitingTimeoutProcedure();<a name="line.155"></a>
+<span class="sourceLineNo">156</span>    long id = procExecutor.submitProcedure(proc);<a name="line.156"></a>
+<span class="sourceLineNo">157</span>    Thread.sleep(500);<a name="line.157"></a>
+<span class="sourceLineNo">158</span>    // bypass the procedure<a name="line.158"></a>
+<span class="sourceLineNo">159</span>    assertTrue(procExecutor.bypassProcedure(id, 1000, true, false));<a name="line.159"></a>
 <span class="sourceLineNo">160</span><a name="line.160"></a>
-<span class="sourceLineNo">161</span>    public SuspendProcedure() {<a name="line.161"></a>
-<span class="sourceLineNo">162</span>      super();<a name="line.162"></a>
-<span class="sourceLineNo">163</span>    }<a name="line.163"></a>
+<span class="sourceLineNo">161</span>    htu.waitFor(5000, () -&gt; proc.isSuccess() &amp;&amp; proc.isBypass());<a name="line.161"></a>
+<span class="sourceLineNo">162</span>    LOG.info("{} finished", proc);<a name="line.162"></a>
+<span class="sourceLineNo">163</span>  }<a name="line.163"></a>
 <span class="sourceLineNo">164</span><a name="line.164"></a>
-<span class="sourceLineNo">165</span>    @Override<a name="line.165"></a>
-<span class="sourceLineNo">166</span>    protected Procedure[] execute(final TestProcEnv env)<a name="line.166"></a>
-<span class="sourceLineNo">167</span>        throws ProcedureSuspendedException {<a name="line.167"></a>
-<span class="sourceLineNo">168</span>      // Always suspend the procedure<a name="line.168"></a>
-<span class="sourceLineNo">169</span>      throw new ProcedureSuspendedException();<a name="line.169"></a>
-<span class="sourceLineNo">170</span>    }<a name="line.170"></a>
-<span class="sourceLineNo">171</span>  }<a name="line.171"></a>
-<span class="sourceLineNo">172</span><a name="line.172"></a>
-<span class="sourceLineNo">173</span>  public static class StuckProcedure extends ProcedureTestingUtility.NoopProcedure&lt;TestProcEnv&gt; {<a name="line.173"></a>
-<span class="sourceLineNo">174</span><a name="line.174"></a>
-<span class="sourceLineNo">175</span>    public StuckProcedure() {<a name="line.175"></a>
-<span class="sourceLineNo">176</span>      super();<a name="line.176"></a>
-<span class="sourceLineNo">177</span>    }<a name="line.177"></a>
-<span class="sourceLineNo">178</span><a name="line.178"></a>
-<span class="sourceLineNo">179</span>    @Override<a name="line.179"></a>
-<span class="sourceLineNo">180</span>    protected Procedure[] execute(final TestProcEnv env) {<a name="line.180"></a>
-<span class="sourceLineNo">181</span>      try {<a name="line.181"></a>
-<span class="sourceLineNo">182</span>        Thread.sleep(Long.MAX_VALUE);<a name="line.182"></a>
-<span class="sourceLineNo">183</span>      } catch (Throwable t) {<a name="line.183"></a>
-<span class="sourceLineNo">184</span>        LOG.debug("Sleep is interrupted.", t);<a name="line.184"></a>
-<span class="sourceLineNo">185</span>      }<a name="line.185"></a>
-<span class="sourceLineNo">186</span>      return null;<a name="line.186"></a>
-<span class="sourceLineNo">187</span>    }<a name="line.187"></a>
-<span class="sourceLineNo">188</span><a name="line.188"></a>
-<span class="sourceLineNo">189</span>  }<a name="line.189"></a>
-<span class="sourceLineNo">190</span><a name="line.190"></a>
+<span class="sourceLineNo">165</span>  @AfterClass<a name="line.165"></a>
+<span class="sourceLineNo">166</span>  public static void tearDown() throws Exception {<a name="line.166"></a>
+<span class="sourceLineNo">167</span>    procExecutor.stop();<a name="line.167"></a>
+<span class="sourceLineNo">168</span>    procStore.stop(false);<a name="line.168"></a>
+<span class="sourceLineNo">169</span>    procExecutor.join();<a name="line.169"></a>
+<span class="sourceLineNo">170</span>  }<a name="line.170"></a>
+<span class="sourceLineNo">171</span><a name="line.171"></a>
+<span class="sourceLineNo">172</span>  public static class SuspendProcedure extends ProcedureTestingUtility.NoopProcedure&lt;TestProcEnv&gt; {<a name="line.172"></a>
+<span class="sourceLineNo">173</span><a name="line.173"></a>
+<span class="sourceLineNo">174</span>    public SuspendProcedure() {<a name="line.174"></a>
+<span class="sourceLineNo">175</span>      super();<a name="line.175"></a>
+<span class="sourceLineNo">176</span>    }<a name="line.176"></a>
+<span class="sourceLineNo">177</span><a name="line.177"></a>
+<span class="sourceLineNo">178</span>    @Override<a name="line.178"></a>
+<span class="sourceLineNo">179</span>    protected Procedure[] execute(final TestProcEnv env)<a name="line.179"></a>
+<span class="sourceLineNo">180</span>        throws ProcedureSuspendedException {<a name="line.180"></a>
+<span class="sourceLineNo">181</span>      // Always suspend the procedure<a name="line.181"></a>
+<span class="sourceLineNo">182</span>      throw new ProcedureSuspendedException();<a name="line.182"></a>
+<span class="sourceLineNo">183</span>    }<a name="line.183"></a>
+<span class="sourceLineNo">184</span>  }<a name="line.184"></a>
+<span class="sourceLineNo">185</span><a name="line.185"></a>
+<span class="sourceLineNo">186</span>  public static class StuckProcedure extends ProcedureTestingUtility.NoopProcedure&lt;TestProcEnv&gt; {<a name="line.186"></a>
+<span class="sourceLineNo">187</span><a name="line.187"></a>
+<span class="sourceLineNo">188</span>    public StuckProcedure() {<a name="line.188"></a>
+<span class="sourceLineNo">189</span>      super();<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>  public static class RootProcedure extends ProcedureTestingUtility.NoopProcedure&lt;TestProcEnv&gt; {<a name="line.192"></a>
-<span class="sourceLineNo">193</span>    private boolean childSpwaned = false;<a name="line.193"></a>
-<span class="sourceLineNo">194</span><a name="line.194"></a>
-<span class="sourceLineNo">195</span>    public RootProcedure() {<a name="line.195"></a>
-<span class="sourceLineNo">196</span>      super();<a name="line.196"></a>
-<span class="sourceLineNo">197</span>    }<a name="line.197"></a>
-<span class="sourceLineNo">198</span><a name="line.198"></a>
-<span class="sourceLineNo">199</span>    @Override<a name="line.199"></a>
-<span class="sourceLineNo">200</span>    protected Procedure[] execute(final TestProcEnv env)<a name="line.200"></a>
-<span class="sourceLineNo">201</span>        throws ProcedureSuspendedException {<a name="line.201"></a>
-<span class="sourceLineNo">202</span>      if (!childSpwaned) {<a name="line.202"></a>
-<span class="sourceLineNo">203</span>        childSpwaned = true;<a name="line.203"></a>
-<span class="sourceLineNo">204</span>        return new Procedure[] {new SuspendProcedure()};<a name="line.204"></a>
-<span class="sourceLineNo">205</span>      } else {<a name="line.205"></a>
-<span class="sourceLineNo">206</span>        return null;<a name="line.206"></a>
-<span class="sourceLineNo">207</span>      }<a name="line.207"></a>
-<span class="sourceLineNo">208</span>    }<a name="line.208"></a>
-<span class="sourceLineNo">209</span>  }<a name="line.209"></a>
-<span class="sourceLineNo">210</span><a name="line.210"></a>
+<span class="sourceLineNo">192</span>    @Override<a name="line.192"></a>
+<span class="sourceLineNo">193</span>    protected Procedure[] execute(final TestProcEnv env) {<a name="line.193"></a>
+<span class="sourceLineNo">194</span>      try {<a name="line.194"></a>
+<span class="sourceLineNo">195</span>        Thread.sleep(Long.MAX_VALUE);<a name="line.195"></a>
+<span class="sourceLineNo">196</span>      } catch (Throwable t) {<a name="line.196"></a>
+<span class="sourceLineNo">197</span>        LOG.debug("Sleep is interrupted.", t);<a name="line.197"></a>
+<span class="sourceLineNo">198</span>      }<a name="line.198"></a>
+<span class="sourceLineNo">199</span>      return null;<a name="line.199"></a>
+<span class="sourceLineNo">200</span>    }<a name="line.200"></a>
+<span class="sourceLineNo">201</span><a name="line.201"></a>
+<span class="sourceLineNo">202</span>  }<a name="line.202"></a>
+<span class="sourceLineNo">203</span><a name="line.203"></a>
+<span class="sourceLineNo">204</span><a name="line.204"></a>
+<span class="sourceLineNo">205</span>  public static class RootProcedure extends ProcedureTestingUtility.NoopProcedure&lt;TestProcEnv&gt; {<a name="line.205"></a>
+<span class="sourceLineNo">206</span>    private boolean childSpwaned = false;<a name="line.206"></a>
+<span class="sourceLineNo">207</span><a name="line.207"></a>
+<span class="sourceLineNo">208</span>    public RootProcedure() {<a name="line.208"></a>
+<span class="sourceLineNo">209</span>      super();<a name="line.209"></a>
+<span class="sourceLineNo">210</span>    }<a name="line.210"></a>
 <span class="sourceLineNo">211</span><a name="line.211"></a>
-<span class="sourceLineNo">212</span>  public enum StuckStateMachineState {<a name="line.212"></a>
-<span class="sourceLineNo">213</span>    START, THEN, END<a name="line.213"></a>
-<span class="sourceLineNo">214</span>  }<a name="line.214"></a>
-<span class="sourceLineNo">215</span><a name="line.215"></a>
-<span class="sourceLineNo">216</span>  public static class StuckStateMachineProcedure extends<a name="line.216"></a>
-<span class="sourceLineNo">217</span>      ProcedureTestingUtility.NoopStateMachineProcedure&lt;TestProcEnv, StuckStateMachineState&gt; {<a name="line.217"></a>
-<span class="sourceLineNo">218</span>    private AtomicBoolean stop = new AtomicBoolean(false);<a name="line.218"></a>
-<span class="sourceLineNo">219</span><a name="line.219"></a>
-<span class="sourceLineNo">220</span>    public StuckStateMachineProcedure() {<a name="line.220"></a>
-<span class="sourceLineNo">221</span>      super();<a name="line.221"></a>
-<span class="sourceLineNo">222</span>    }<a name="line.222"></a>
+<span class="sourceLineNo">212</span>    @Override<a name="line.212"></a>
+<span class="sourceLineNo">213</span>    protected Procedure[] execute(final TestProcEnv env)<a name="line.213"></a>
+<span class="sourceLineNo">214</span>        throws ProcedureSuspendedException {<a name="line.214"></a>
+<span class="sourceLineNo">215</span>      if (!childSpwaned) {<a name="line.215"></a>
+<span class="sourceLineNo">216</span>        childSpwaned = true;<a name="line.216"></a>
+<span class="sourceLineNo">217</span>        return new Procedure[] {new SuspendProcedure()};<a name="line.217"></a>
+<span class="sourceLineNo">218</span>      } else {<a name="line.218"></a>
+<span class="sourceLineNo">219</span>        return null;<a name="line.219"></a>
+<span class="sourceLineNo">220</span>      }<a name="line.220"></a>
+<span class="sourceLineNo">221</span>    }<a name="line.221"></a>
+<span class="sourceLineNo">222</span>  }<a name="line.222"></a>
 <span class="sourceLineNo">223</span><a name="line.223"></a>
-<span class="sourceLineNo">224</span>    public StuckStateMachineProcedure(TestProcEnv env, StuckStateMachineState initialState) {<a name="line.224"></a>
-<span class="sourceLineNo">225</span>      super(env, initialState);<a name="line.225"></a>
-<span class="sourceLineNo">226</span>    }<a name="line.226"></a>
-<span class="sourceLineNo">227</span><a name="line.227"></a>
-<span class="sourceLineNo">228</span>    @Override<a name="line.228"></a>
-<span class="sourceLineNo">229</span>    protected Flow executeFromState(TestProcEnv env, StuckStateMachineState tState)<a name="line.229"></a>
-<span class="sourceLineNo">230</span>            throws ProcedureSuspendedException, ProcedureYieldException, InterruptedException {<a name="line.230"></a>
-<span class="sourceLineNo">231</span>      switch (tState) {<a name="line.231"></a>
-<span class="sourceLineNo">232</span>        case START:<a name="line.232"></a>
-<span class="sourceLineNo">233</span>          LOG.info("PHASE 1: START");<a name="line.233"></a>
-<span class="sourceLineNo">234</span>          setNextState(StuckStateMachineState.THEN);<a name="line.234"></a>
-<span class="sourceLineNo">235</span>          return Flow.HAS_MORE_STATE;<a name="line.235"></a>
-<span class="sourceLineNo">236</span>        case THEN:<a name="line.236"></a>
-<span class="sourceLineNo">237</span>          if (stop.get()) {<a name="line.237"></a>
-<span class="sourceLineNo">238</span>            setNextState(StuckStateMachineState.END);<a name="line.238"></a>
-<span class="sourceLineNo">239</span>          }<a name="line.239"></a>
-<span class="sourceLineNo">240</span>          return Flow.HAS_MORE_STATE;<a name="line.240"></a>
-<span class="sourceLineNo">241</span>        case END:<a name="line.241"></a>
-<span class="sourceLineNo">242</span>          return Flow.NO_MORE_STATE;<a name="line.242"></a>
-<span class="sourceLineNo">243</span>        default:<a name="line.243"></a>
-<span class="sourceLineNo">244</span>          throw new UnsupportedOperationException("unhandled state=" + tState);<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">224</span>  public static class WaitingTimeoutProcedure<a name="line.224"></a>
+<span class="sourceLineNo">225</span>      extends ProcedureTestingUtility.NoopProcedure&lt;TestProcEnv&gt; {<a name="line.225"></a>
+<span class="sourceLineNo">226</span>    public WaitingTimeoutProcedure() {<a name="line.226"></a>
+<span class="sourceLineNo">227</span>      super();<a name="line.227"></a>
+<span class="sourceLineNo">228</span>    }<a name="line.228"></a>
+<span class="sourceLineNo">229</span><a name="line.229"></a>
+<span class="sourceLineNo">230</span>    @Override<a name="line.230"></a>
+<span class="sourceLineNo">231</span>    protected Procedure[] execute(final TestProcEnv env)<a name="line.231"></a>
+<span class="sourceLineNo">232</span>        throws ProcedureSuspendedException {<a name="line.232"></a>
+<span class="sourceLineNo">233</span>      // Always suspend the procedure<a name="line.233"></a>
+<span class="sourceLineNo">234</span>      setTimeout(50000);<a name="line.234"></a>
+<span class="sourceLineNo">235</span>      setState(ProcedureProtos.ProcedureState.WAITING_TIMEOUT);<a name="line.235"></a>
+<span class="sourceLineNo">236</span>      skipPersistence();<a name="line.236"></a>
+<span class="sourceLineNo">237</span>      throw new ProcedureSuspendedException();<a name="line.237"></a>
+<span class="sourceLineNo">238</span>    }<a name="line.238"></a>
+<span class="sourceLineNo">239</span><a name="line.239"></a>
+<span class="sourceLineNo">240</span>    @Override<a name="line.240"></a>
+<span class="sourceLineNo">241</span>    protected synchronized boolean setTimeoutFailure(TestProcEnv env) {<a name="line.241"></a>
+<span class="sourceLineNo">242</span>      setState(ProcedureProtos.ProcedureState.RUNNABLE);<a name="line.242"></a>
+<span class="sourceLineNo">243</span>      procExecutor.getScheduler().addFront(this);<a name="line.243"></a>
+<span class="sourceLineNo">244</span>      return false; // 'false' means that this procedure handled the timeout<a name="line.244"></a>
+<span class="sourceLineNo">245</span>    }<a name="line.245"></a>
+<span class="sourceLineNo">246</span>  }<a name="line.246"></a>
 <span class="sourceLineNo">247</span><a name="line.247"></a>
-<span class="sourceLineNo">248</span>    @Override<a name="line.248"></a>
-<span class="sourceLineNo">249</span>    protected StuckStateMachineState getState(int stateId) {<a name="line.249"></a>
-<span class="sourceLineNo">250</span>      return StuckStateMachineState.values()[stateId];<a name="line.250"></a>
-<span class="sourceLineNo">251</span>    }<a name="line.251"></a>
-<span class="sourceLineNo">252</span><a name="line.252"></a>
-<span class="sourceLineNo">253</span>    @Override<a name="line.253"></a>
-<span class="sourceLineNo">254</span>    protected int getStateId(StuckStateMachineState tState) {<a name="line.254"></a>
-<span class="sourceLineNo">255</span>      return tState.ordinal();<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">248</span>  public enum StuckStateMachineState {<a name="line.248"></a>
+<span class="sourceLineNo">249</span>    START, THEN, END<a name="line.249"></a>
+<span class="sourceLineNo">250</span>  }<a name="line.250"></a>
+<span class="sourceLineNo">251</span><a name="line.251"></a>
+<span class="sourceLineNo">252</span>  public static class StuckStateMachineProcedure extends<a name="line.252"></a>
+<span class="sourceLineNo">253</span>      ProcedureTestingUtility.NoopStateMachineProcedure&lt;TestProcEnv, StuckStateMachineState&gt; {<a name="line.253"></a>
+<span class="sourceLineNo">254</span>    private AtomicBoolean stop = new AtomicBoolean(false);<a name="line.254"></a>
+<span class="sourceLineNo">255</span><a name="line.255"></a>
+<span class="sourceLineNo">256</span>    public StuckStateMachineProcedure() {<a name="line.256"></a>
+<span class="sourceLineNo">257</span>      super();<a name="line.257"></a>
+<span class="sourceLineNo">258</span>    }<a name="line.258"></a>
 <span class="sourceLineNo">259</span><a name="line.259"></a>
-<span class="sourceLineNo">260</span>}<a name="line.260"></a>
+<span class="sourceLineNo">260</span>    public StuckStateMachineProcedure(TestProcEnv env, StuckStateMachineState initialState) {<a name="line.260"></a>
+<span class="sourceLineNo">261</span>      super(env, initialState);<a name="line.261"></a>
+<span class="sourceLineNo">262</span>    }<a name="line.262"></a>
+<span class="sourceLineNo">263</span><a name="line.263"></a>
+<span class="sourceLineNo">264</span>    @Override<a name="line.264"></a>
+<span class="sourceLineNo">265</span>    protected Flow executeFromState(TestProcEnv env, StuckStateMachineState tState)<a name="line.265"></a>
+<span class="sourceLineNo">266</span>            throws ProcedureSuspendedException, ProcedureYieldException, InterruptedException {<a name="line.266"></a>
+<span class="sourceLineNo">267</span>      switch (tState) {<a name="line.267"></a>
+<span class="sourceLineNo">268</span>        case START:<a name="line.268"></a>
+<span class="sourceLineNo">269</span>          LOG.info("PHASE 1: START");<a name="line.269"></a>
+<span class="sourceLineNo">270</span>          setNextState(StuckStateMachineState.THEN);<a name="line.270"></a>
+<span class="sourceLineNo">271</span>          return Flow.HAS_MORE_STATE;<a name="line.271"></a>
+<span class="sourceLineNo">272</span>        case THEN:<a name="line.272"></a>
+<span class="sourceLineNo">273</span>          if (stop.get()) {<a name="line.273"></a>
+<span class="sourceLineNo">274</span>            setNextState(StuckStateMachineState.END);<a name="line.274"></a>
+<span class="sourceLineNo">275</span>          }<a name="line.275"></a>
+<span class="sourceLineNo">276</span>          return Flow.HAS_MORE_STATE;<a name="line.276"></a>
+<span class="sourceLineNo">277</span>        case END:<a name="line.277"></a>
+<span class="sourceLineNo">278</span>          return Flow.NO_MORE_STATE;<a name="line.278"></a>
+<span class="sourceLineNo">279</span>        default:<a name="line.279"></a>
+<span class="sourceLineNo">280</span>          throw new UnsupportedOperationException("unhandled state=" + tState);<a name="line.280"></a>
+<span class="sourceLineNo">281</span>      }<a name="line.281"></a>
+<span class="sourceLineNo">282</span>    }<a name="line.282"></a>
+<span class="sourceLineNo">283</span><a name="line.283"></a>
+<span class="sourceLineNo">284</span>    @Override<a name="line.284"></a>
+<span class="sourceLineNo">285</span>    protected StuckStateMachineState getState(int stateId) {<a name="line.285"></a>
+<span class="sourceLineNo">286</span>      return StuckStateMachineState.values()[stateId];<a name="line.286"></a>
+<span class="sourceLineNo">287</span>    }<a name="line.287"></a>
+<span class="sourceLineNo">288</span><a name="line.288"></a>
+<span class="sourceLineNo">289</span>    @Override<a name="line.289"></a>
+<span class="sourceLineNo">290</span>    protected int getStateId(StuckStateMachineState tState) {<a name="line.290"></a>
+<span class="sourceLineNo">291</span>      return tState.ordinal();<a name="line.291"></a>
+<span class="sourceLineNo">292</span>    }<a name="line.292"></a>
+<span class="sourceLineNo">293</span>  }<a name="line.293"></a>
+<span class="sourceLineNo">294</span><a name="line.294"></a>
+<span class="sourceLineNo">295</span><a name="line.295"></a>
+<span class="sourceLineNo">296</span>}<a name="line.296"></a>
 
 
 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/27f5bfb5/testdevapidocs/src-html/org/apache/hadoop/hbase/zookeeper/TestZKMainServer.ExitException.html
----------------------------------------------------------------------
diff --git a/testdevapidocs/src-html/org/apache/hadoop/hbase/zookeeper/TestZKMainServer.ExitException.html b/testdevapidocs/src-html/org/apache/hadoop/hbase/zookeeper/TestZKMainServer.ExitException.html
index 2dca6fc..75b0efa 100644
--- a/testdevapidocs/src-html/org/apache/hadoop/hbase/zookeeper/TestZKMainServer.ExitException.html
+++ b/testdevapidocs/src-html/org/apache/hadoop/hbase/zookeeper/TestZKMainServer.ExitException.html
@@ -36,101 +36,128 @@
 <span class="sourceLineNo">028</span>import org.apache.hadoop.hbase.HConstants;<a name="line.28"></a>
 <span class="sourceLineNo">029</span>import org.apache.hadoop.hbase.testclassification.SmallTests;<a name="line.29"></a>
 <span class="sourceLineNo">030</span>import org.apache.hadoop.hbase.testclassification.ZKTests;<a name="line.30"></a>
-<span class="sourceLineNo">031</span>import org.junit.ClassRule;<a name="line.31"></a>
-<span class="sourceLineNo">032</span>import org.junit.Test;<a name="line.32"></a>
-<span class="sourceLineNo">033</span>import org.junit.experimental.categories.Category;<a name="line.33"></a>
-<span class="sourceLineNo">034</span><a name="line.34"></a>
-<span class="sourceLineNo">035</span>@Category({ ZKTests.class, SmallTests.class })<a name="line.35"></a>
-<span class="sourceLineNo">036</span>public class TestZKMainServer {<a name="line.36"></a>
-<span class="sourceLineNo">037</span><a name="line.37"></a>
-<span class="sourceLineNo">038</span>  @ClassRule<a name="line.38"></a>
-<span class="sourceLineNo">039</span>  public static final HBaseClassTestRule CLASS_RULE =<a name="line.39"></a>
-<span class="sourceLineNo">040</span>      HBaseClassTestRule.forClass(TestZKMainServer.class);<a name="line.40"></a>
-<span class="sourceLineNo">041</span><a name="line.41"></a>
-<span class="sourceLineNo">042</span>  // ZKMS calls System.exit.  Catch the call and prevent exit using trick described up in<a name="line.42"></a>
-<span class="sourceLineNo">043</span>  // http://stackoverflow.com/questions/309396/java-how-to-test-methods-that-call-system-exit<a name="line.43"></a>
-<span class="sourceLineNo">044</span>  protected static class ExitException extends SecurityException {<a name="line.44"></a>
-<span class="sourceLineNo">045</span>    private static final long serialVersionUID = 1L;<a name="line.45"></a>
-<span class="sourceLineNo">046</span>    private final int status;<a name="line.46"></a>
-<span class="sourceLineNo">047</span>    public ExitException(int status) {<a name="line.47"></a>
-<span class="sourceLineNo">048</span>      super("There is no escape!");<a name="line.48"></a>
-<span class="sourceLineNo">049</span>      this.status = status;<a name="line.49"></a>
-<span class="sourceLineNo">050</span>    }<a name="line.50"></a>
-<span class="sourceLineNo">051</span>  }<a name="line.51"></a>
-<span class="sourceLineNo">052</span><a name="line.52"></a>
-<span class="sourceLineNo">053</span>  private static class NoExitSecurityManager extends SecurityManager {<a name="line.53"></a>
-<span class="sourceLineNo">054</span>    @Override<a name="line.54"></a>
-<span class="sourceLineNo">055</span>    public void checkPermission(Permission perm) {<a name="line.55"></a>
-<span class="sourceLineNo">056</span>      // allow anything.<a name="line.56"></a>
-<span class="sourceLineNo">057</span>    }<a name="line.57"></a>
-<span class="sourceLineNo">058</span><a name="line.58"></a>
-<span class="sourceLineNo">059</span>    @Override<a name="line.59"></a>
-<span class="sourceLineNo">060</span>    public void checkPermission(Permission perm, Object context) {<a name="line.60"></a>
-<span class="sourceLineNo">061</span>      // allow anything.<a name="line.61"></a>
-<span class="sourceLineNo">062</span>    }<a name="line.62"></a>
-<span class="sourceLineNo">063</span><a name="line.63"></a>
-<span class="sourceLineNo">064</span>    @Override<a name="line.64"></a>
-<span class="sourceLineNo">065</span>    public void checkExit(int status) {<a name="line.65"></a>
-<span class="sourceLineNo">066</span>      super.checkExit(status);<a name="line.66"></a>
-<span class="sourceLineNo">067</span>      throw new ExitException(status);<a name="line.67"></a>
-<span class="sourceLineNo">068</span>    }<a name="line.68"></a>
-<span class="sourceLineNo">069</span>  }<a name="line.69"></a>
-<span class="sourceLineNo">070</span><a name="line.70"></a>
-<span class="sourceLineNo">071</span>  /**<a name="line.71"></a>
-<span class="sourceLineNo">072</span>   * We need delete of a znode to work at least.<a name="line.72"></a>
-<span class="sourceLineNo">073</span>   */<a name="line.73"></a>
-<span class="sourceLineNo">074</span>  @Test<a name="line.74"></a>
-<span class="sourceLineNo">075</span>  public void testCommandLineWorks() throws Exception {<a name="line.75"></a>
-<span class="sourceLineNo">076</span>    System.setSecurityManager(new NoExitSecurityManager());<a name="line.76"></a>
-<span class="sourceLineNo">077</span>    HBaseZKTestingUtility htu = new HBaseZKTestingUtility();<a name="line.77"></a>
-<span class="sourceLineNo">078</span>    // Make it long so for sure succeeds.<a name="line.78"></a>
-<span class="sourceLineNo">079</span>    htu.getConfiguration().setInt(HConstants.ZK_SESSION_TIMEOUT, 30000);<a name="line.79"></a>
-<span class="sourceLineNo">080</span>    htu.startMiniZKCluster();<a name="line.80"></a>
-<span class="sourceLineNo">081</span>    try {<a name="line.81"></a>
-<span class="sourceLineNo">082</span>      ZKWatcher zkw = htu.getZooKeeperWatcher();<a name="line.82"></a>
-<span class="sourceLineNo">083</span>      String znode = "/testCommandLineWorks";<a name="line.83"></a>
-<span class="sourceLineNo">084</span>      ZKUtil.createWithParents(zkw, znode, HConstants.EMPTY_BYTE_ARRAY);<a name="line.84"></a>
-<span class="sourceLineNo">085</span>      ZKUtil.checkExists(zkw, znode);<a name="line.85"></a>
-<span class="sourceLineNo">086</span>      boolean exception = false;<a name="line.86"></a>
-<span class="sourceLineNo">087</span>      try {<a name="line.87"></a>
-<span class="sourceLineNo">088</span>        ZKMainServer.main(new String [] {"-server",<a name="line.88"></a>
-<span class="sourceLineNo">089</span>          "localhost:" + htu.getZkCluster().getClientPort(), "delete", znode});<a name="line.89"></a>
-<span class="sourceLineNo">090</span>      } catch (ExitException ee) {<a name="line.90"></a>
-<span class="sourceLineNo">091</span>        // ZKMS calls System.exit which should trigger this exception.<a name="line.91"></a>
-<span class="sourceLineNo">092</span>        exception = true;<a name="line.92"></a>
-<span class="sourceLineNo">093</span>      }<a name="line.93"></a>
-<span class="sourceLineNo">094</span>      assertTrue(exception);<a name="line.94"></a>
-<span class="sourceLineNo">095</span>      assertEquals(-1, ZKUtil.checkExists(zkw, znode));<a name="line.95"></a>
-<span class="sourceLineNo">096</span>    } finally {<a name="line.96"></a>
-<span class="sourceLineNo">097</span>      htu.shutdownMiniZKCluster();<a name="line.97"></a>
-<span class="sourceLineNo">098</span>      System.setSecurityManager(null); // or save and restore original<a name="line.98"></a>
-<span class="sourceLineNo">099</span>    }<a name="line.99"></a>
-<span class="sourceLineNo">100</span>  }<a name="line.100"></a>
-<span class="sourceLineNo">101</span><a name="line.101"></a>
-<span class="sourceLineNo">102</span>  @Test<a name="line.102"></a>
-<span class="sourceLineNo">103</span>  public void testHostPortParse() {<a name="line.103"></a>
-<span class="sourceLineNo">104</span>    ZKMainServer parser = new ZKMainServer();<a name="line.104"></a>
-<span class="sourceLineNo">105</span>    Configuration c = HBaseConfiguration.create();<a name="line.105"></a>
-<span class="sourceLineNo">106</span>    assertEquals("localhost:" + c.get(HConstants.ZOOKEEPER_CLIENT_PORT), parser.parse(c));<a name="line.106"></a>
-<span class="sourceLineNo">107</span>    final String port = "1234";<a name="line.107"></a>
-<span class="sourceLineNo">108</span>    c.set(HConstants.ZOOKEEPER_CLIENT_PORT, port);<a name="line.108"></a>
-<span class="sourceLineNo">109</span>    c.set("hbase.zookeeper.quorum", "example.com");<a name="line.109"></a>
-<span class="sourceLineNo">110</span>    assertEquals("example.com:" + port, parser.parse(c));<a name="line.110"></a>
-<span class="sourceLineNo">111</span>    c.set("hbase.zookeeper.quorum", "example1.com,example2.com,example3.com");<a name="line.111"></a>
-<span class="sourceLineNo">112</span>    String ensemble = parser.parse(c);<a name="line.112"></a>
-<span class="sourceLineNo">113</span>    assertTrue(port, ensemble.matches("(example[1-3]\\.com:1234,){2}example[1-3]\\.com:" + port));<a name="line.113"></a>
-<span class="sourceLineNo">114</span><a name="line.114"></a>
-<span class="sourceLineNo">115</span>    // multiple servers with its own port<a name="line.115"></a>
-<span class="sourceLineNo">116</span>    c.set("hbase.zookeeper.quorum", "example1.com:5678,example2.com:9012,example3.com:3456");<a name="line.116"></a>
-<span class="sourceLineNo">117</span>    ensemble = parser.parse(c);<a name="line.117"></a>
-<span class="sourceLineNo">118</span>    assertEquals(ensemble, "example1.com:5678,example2.com:9012,example3.com:3456");<a name="line.118"></a>
-<span class="sourceLineNo">119</span><a name="line.119"></a>
-<span class="sourceLineNo">120</span>    // some servers without its own port, which will be assigned the default client port<a name="line.120"></a>
-<span class="sourceLineNo">121</span>    c.set("hbase.zookeeper.quorum", "example1.com:5678,example2.com:9012,example3.com");<a name="line.121"></a>
-<span class="sourceLineNo">122</span>    ensemble = parser.parse(c);<a name="line.122"></a>
-<span class="sourceLineNo">123</span>    assertEquals(ensemble, "example1.com:5678,example2.com:9012,example3.com:" + port);<a name="line.123"></a>
-<span class="sourceLineNo">124</span>  }<a name="line.124"></a>
-<span class="sourceLineNo">125</span>}<a name="line.125"></a>
+<span class="sourceLineNo">031</span>import org.junit.Assert;<a name="line.31"></a>
+<span class="sourceLineNo">032</span>import org.junit.ClassRule;<a name="line.32"></a>
+<span class="sourceLineNo">033</span>import org.junit.Test;<a name="line.33"></a>
+<span class="sourceLineNo">034</span>import org.junit.experimental.categories.Category;<a name="line.34"></a>
+<span class="sourceLineNo">035</span><a name="line.35"></a>
+<span class="sourceLineNo">036</span>@Category({ ZKTests.class, SmallTests.class })<a name="line.36"></a>
+<span class="sourceLineNo">037</span>public class TestZKMainServer {<a name="line.37"></a>
+<span class="sourceLineNo">038</span><a name="line.38"></a>
+<span class="sourceLineNo">039</span>  @ClassRule<a name="line.39"></a>
+<span class="sourceLineNo">040</span>  public static final HBaseClassTestRule CLASS_RULE =<a name="line.40"></a>
+<span class="sourceLineNo">041</span>      HBaseClassTestRule.forClass(TestZKMainServer.class);<a name="line.41"></a>
+<span class="sourceLineNo">042</span><a name="line.42"></a>
+<span class="sourceLineNo">043</span>  // ZKMS calls System.exit.  Catch the call and prevent exit using trick described up in<a name="line.43"></a>
+<span class="sourceLineNo">044</span>  // http://stackoverflow.com/questions/309396/java-how-to-test-methods-that-call-system-exit<a name="line.44"></a>
+<span class="sourceLineNo">045</span>  protected static class ExitException extends SecurityException {<a name="line.45"></a>
+<span class="sourceLineNo">046</span>    private static final long serialVersionUID = 1L;<a name="line.46"></a>
+<span class="sourceLineNo">047</span>    private final int status;<a name="line.47"></a>
+<span class="sourceLineNo">048</span>    public ExitException(int status) {<a name="line.48"></a>
+<span class="sourceLineNo">049</span>      super("There is no escape!");<a name="line.49"></a>
+<span class="sourceLineNo">050</span>      this.status = status;<a name="line.50"></a>
+<span class="sourceLineNo">051</span>    }<a name="line.51"></a>
+<span class="sourceLineNo">052</span>  }<a name="line.52"></a>
+<span class="sourceLineNo">053</span><a name="line.53"></a>
+<span class="sourceLineNo">054</span>  private static class NoExitSecurityManager extends SecurityManager {<a name="line.54"></a>
+<span class="sourceLineNo">055</span>    @Override<a name="line.55"></a>
+<span class="sourceLineNo">056</span>    public void checkPermission(Permission perm) {<a name="line.56"></a>
+<span class="sourceLineNo">057</span>      // allow anything.<a name="line.57"></a>
+<span class="sourceLineNo">058</span>    }<a name="line.58"></a>
+<span class="sourceLineNo">059</span><a name="line.59"></a>
+<span class="sourceLineNo">060</span>    @Override<a name="line.60"></a>
+<span class="sourceLineNo">061</span>    public void checkPermission(Permission perm, Object context) {<a name="line.61"></a>
+<span class="sourceLineNo">062</span>      // allow anything.<a name="line.62"></a>
+<span class="sourceLineNo">063</span>    }<a name="line.63"></a>
+<span class="sourceLineNo">064</span><a name="line.64"></a>
+<span class="sourceLineNo">065</span>    @Override<a name="line.65"></a>
+<span class="sourceLineNo">066</span>    public void checkExit(int status) {<a name="line.66"></a>
+<span class="sourceLineNo">067</span>      super.checkExit(status);<a name="line.67"></a>
+<span class="sourceLineNo">068</span>      throw new ExitException(status);<a name="line.68"></a>
+<span class="sourceLineNo">069</span>    }<a name="line.69"></a>
+<span class="sourceLineNo">070</span>  }<a name="line.70"></a>
+<span class="sourceLineNo">071</span><a name="line.71"></a>
+<span class="sourceLineNo">072</span>  /**<a name="line.72"></a>
+<span class="sourceLineNo">073</span>   * We need delete of a znode to work at least.<a name="line.73"></a>
+<span class="sourceLineNo">074</span>   */<a name="line.74"></a>
+<span class="sourceLineNo">075</span>  @Test<a name="line.75"></a>
+<span class="sourceLineNo">076</span>  public void testCommandLineWorks() throws Exception {<a name="line.76"></a>
+<span class="sourceLineNo">077</span>    System.setSecurityManager(new NoExitSecurityManager());<a name="line.77"></a>
+<span class="sourceLineNo">078</span>    HBaseZKTestingUtility htu = new HBaseZKTestingUtility();<a name="line.78"></a>
+<span class="sourceLineNo">079</span>    // Make it long so for sure succeeds.<a name="line.79"></a>
+<span class="sourceLineNo">080</span>    htu.getConfiguration().setInt(HConstants.ZK_SESSION_TIMEOUT, 30000);<a name="line.80"></a>
+<span class="sourceLineNo">081</span>    htu.startMiniZKCluster();<a name="line.81"></a>
+<span class="sourceLineNo">082</span>    try {<a name="line.82"></a>
+<span class="sourceLineNo">083</span>      ZKWatcher zkw = htu.getZooKeeperWatcher();<a name="line.83"></a>
+<span class="sourceLineNo">084</span>      String znode = "/testCommandLineWorks";<a name="line.84"></a>
+<span class="sourceLineNo">085</span>      ZKUtil.createWithParents(zkw, znode, HConstants.EMPTY_BYTE_ARRAY);<a name="line.85"></a>
+<span class="sourceLineNo">086</span>      ZKUtil.checkExists(zkw, znode);<a name="line.86"></a>
+<span class="sourceLineNo">087</span>      boolean exception = false;<a name="line.87"></a>
+<span class="sourceLineNo">088</span>      try {<a name="line.88"></a>
+<span class="sourceLineNo">089</span>        ZKMainServer.main(new String [] {"-server",<a name="line.89"></a>
+<span class="sourceLineNo">090</span>          "localhost:" + htu.getZkCluster().getClientPort(), "delete", znode});<a name="line.90"></a>
+<span class="sourceLineNo">091</span>      } catch (ExitException ee) {<a name="line.91"></a>
+<span class="sourceLineNo">092</span>        // ZKMS calls System.exit which should trigger this exception.<a name="line.92"></a>
+<span class="sourceLineNo">093</span>        exception = true;<a name="line.93"></a>
+<span class="sourceLineNo">094</span>      }<a name="line.94"></a>
+<span class="sourceLineNo">095</span>      assertTrue(exception);<a name="line.95"></a>
+<span class="sourceLineNo">096</span>      assertEquals(-1, ZKUtil.checkExists(zkw, znode));<a name="line.96"></a>
+<span class="sourceLineNo">097</span>    } finally {<a name="line.97"></a>
+<span class="sourceLineNo">098</span>      htu.shutdownMiniZKCluster();<a name="line.98"></a>
+<span class="sourceLineNo">099</span>      System.setSecurityManager(null); // or save and restore original<a name="line.99"></a>
+<span class="sourceLineNo">100</span>    }<a name="line.100"></a>
+<span class="sourceLineNo">101</span>  }<a name="line.101"></a>
+<span class="sourceLineNo">102</span><a name="line.102"></a>
+<span class="sourceLineNo">103</span>  @Test<a name="line.103"></a>
+<span class="sourceLineNo">104</span>  public void testHostPortParse() {<a name="line.104"></a>
+<span class="sourceLineNo">105</span>    ZKMainServer parser = new ZKMainServer();<a name="line.105"></a>
+<span class="sourceLineNo">106</span>    Configuration c = HBaseConfiguration.create();<a name="line.106"></a>
+<span class="sourceLineNo">107</span>    assertEquals("localhost:" + c.get(HConstants.ZOOKEEPER_CLIENT_PORT), parser.parse(c));<a name="line.107"></a>
+<span class="sourceLineNo">108</span>    final String port = "1234";<a name="line.108"></a>
+<span class="sourceLineNo">109</span>    c.set(HConstants.ZOOKEEPER_CLIENT_PORT, port);<a name="line.109"></a>
+<span class="sourceLineNo">110</span>    c.set("hbase.zookeeper.quorum", "example.com");<a name="line.110"></a>
+<span class="sourceLineNo">111</span>    assertEquals("example.com:" + port, parser.parse(c));<a name="line.111"></a>
+<span class="sourceLineNo">112</span>    c.set("hbase.zookeeper.quorum", "example1.com,example2.com,example3.com");<a name="line.112"></a>
+<span class="sourceLineNo">113</span>    String ensemble = parser.parse(c);<a name="line.113"></a>
+<span class="sourceLineNo">114</span>    assertTrue(port, ensemble.matches("(example[1-3]\\.com:1234,){2}example[1-3]\\.com:" + port));<a name="line.114"></a>
+<span class="sourceLineNo">115</span><a name="line.115"></a>
+<span class="sourceLineNo">116</span>    // multiple servers with its own port<a name="line.116"></a>
+<span class="sourceLineNo">117</span>    c.set("hbase.zookeeper.quorum", "example1.com:5678,example2.com:9012,example3.com:3456");<a name="line.117"></a>
+<span class="sourceLineNo">118</span>    ensemble = parser.parse(c);<a name="line.118"></a>
+<span class="sourceLineNo">119</span>    assertEquals(ensemble, "example1.com:5678,example2.com:9012,example3.com:3456");<a name="line.119"></a>
+<span class="sourceLineNo">120</span><a name="line.120"></a>
+<span class="sourceLineNo">121</span>    // some servers without its own port, which will be assigned the default client port<a name="line.121"></a>
+<span class="sourceLineNo">122</span>    c.set("hbase.zookeeper.quorum", "example1.com:5678,example2.com:9012,example3.com");<a name="line.122"></a>
+<span class="sourceLineNo">123</span>    ensemble = parser.parse(c);<a name="line.123"></a>
+<span class="sourceLineNo">124</span>    assertEquals(ensemble, "example1.com:5678,example2.com:9012,example3.com:" + port);<a name="line.124"></a>
+<span class="sourceLineNo">125</span><a name="line.125"></a>
+<span class="sourceLineNo">126</span>    // multiple servers(IPv6) with its own port<a name="line.126"></a>
+<span class="sourceLineNo">127</span>    c.set("hbase.zookeeper.quorum", "[2001:db8:1::242:ac11:2]:2181," +<a name="line.127"></a>
+<span class="sourceLineNo">128</span>                                    "[2001:db8:1::242:ac11:3]:5678");<a name="line.128"></a>
+<span class="sourceLineNo">129</span>    ensemble = parser.parse(c);<a name="line.129"></a>
+<span class="sourceLineNo">130</span>    assertEquals("[2001:db8:1::242:ac11:2]:2181," +<a name="line.130"></a>
+<span class="sourceLineNo">131</span>                 "[2001:db8:1::242:ac11:3]:5678", ensemble);<a name="line.131"></a>
+<span class="sourceLineNo">132</span><a name="line.132"></a>
+<span class="sourceLineNo">133</span>    // some servers(IPv6) without its own port, which will be assigned the default client port<a name="line.133"></a>
+<span class="sourceLineNo">134</span>    c.set("hbase.zookeeper.quorum", "[1001:db8:1::242:ac11:8], [2001:db8:1::242:df23:2]:9876," +<a name="line.134"></a>
+<span class="sourceLineNo">135</span>                                    "[2001:db8:1::242:ac11:3]:5678");<a name="line.135"></a>
+<span class="sourceLineNo">136</span>    ensemble = parser.parse(c);<a name="line.136"></a>
+<span class="sourceLineNo">137</span>    assertEquals("[1001:db8:1::242:ac11:8]:1234, [2001:db8:1::242:df23:2]:9876," +<a name="line.137"></a>
+<span class="sourceLineNo">138</span>                 "[2001:db8:1::242:ac11:3]:5678", ensemble);<a name="line.138"></a>
+<span class="sourceLineNo">139</span><a name="line.139"></a>
+<span class="sourceLineNo">140</span>    //a bad case<a name="line.140"></a>
+<span class="sourceLineNo">141</span>    try {<a name="line.141"></a>
+<span class="sourceLineNo">142</span>      // some servers(IPv6) with an invaild Ipv6 address in it<a name="line.142"></a>
+<span class="sourceLineNo">143</span>      c.set("hbase.zookeeper.quorum", "[1001:db8:1::242:ac11:8], [2001:db8:1::242:df23:2]:9876," +<a name="line.143"></a>
+<span class="sourceLineNo">144</span>              "[1001:db8:1::242:ac11:8:89:67]:5678");<a name="line.144"></a>
+<span class="sourceLineNo">145</span>      ensemble = parser.parse(c);<a name="line.145"></a>
+<span class="sourceLineNo">146</span>      Assert.fail("IPv6 address should be 8 groups.");<a name="line.146"></a>
+<span class="sourceLineNo">147</span>    } catch (IllegalArgumentException e) {<a name="line.147"></a>
+<span class="sourceLineNo">148</span>      //expected<a name="line.148"></a>
+<span class="sourceLineNo">149</span>    }<a name="line.149"></a>
+<span class="sourceLineNo">150</span><a name="line.150"></a>
+<span class="sourceLineNo">151</span>  }<a name="line.151"></a>
+<span class="sourceLineNo">152</span>}<a name="line.152"></a>
 
 
 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/27f5bfb5/testdevapidocs/src-html/org/apache/hadoop/hbase/zookeeper/TestZKMainServer.NoExitSecurityManager.html
----------------------------------------------------------------------
diff --git a/testdevapidocs/src-html/org/apache/hadoop/hbase/zookeeper/TestZKMainServer.NoExitSecurityManager.html b/testdevapidocs/src-html/org/apache/hadoop/hbase/zookeeper/TestZKMainServer.NoExitSecurityManager.html
index 2dca6fc..75b0efa 100644
--- a/testdevapidocs/src-html/org/apache/hadoop/hbase/zookeeper/TestZKMainServer.NoExitSecurityManager.html
+++ b/testdevapidocs/src-html/org/apache/hadoop/hbase/zookeeper/TestZKMainServer.NoExitSecurityManager.html
@@ -36,101 +36,128 @@
 <span class="sourceLineNo">028</span>import org.apache.hadoop.hbase.HConstants;<a name="line.28"></a>
 <span class="sourceLineNo">029</span>import org.apache.hadoop.hbase.testclassification.SmallTests;<a name="line.29"></a>
 <span class="sourceLineNo">030</span>import org.apache.hadoop.hbase.testclassification.ZKTests;<a name="line.30"></a>
-<span class="sourceLineNo">031</span>import org.junit.ClassRule;<a name="line.31"></a>
-<span class="sourceLineNo">032</span>import org.junit.Test;<a name="line.32"></a>
-<span class="sourceLineNo">033</span>import org.junit.experimental.categories.Category;<a name="line.33"></a>
-<span class="sourceLineNo">034</span><a name="line.34"></a>
-<span class="sourceLineNo">035</span>@Category({ ZKTests.class, SmallTests.class })<a name="line.35"></a>
-<span class="sourceLineNo">036</span>public class TestZKMainServer {<a name="line.36"></a>
-<span class="sourceLineNo">037</span><a name="line.37"></a>
-<span class="sourceLineNo">038</span>  @ClassRule<a name="line.38"></a>
-<span class="sourceLineNo">039</span>  public static final HBaseClassTestRule CLASS_RULE =<a name="line.39"></a>
-<span class="sourceLineNo">040</span>      HBaseClassTestRule.forClass(TestZKMainServer.class);<a name="line.40"></a>
-<span class="sourceLineNo">041</span><a name="line.41"></a>
-<span class="sourceLineNo">042</span>  // ZKMS calls System.exit.  Catch the call and prevent exit using trick described up in<a name="line.42"></a>
-<span class="sourceLineNo">043</span>  // http://stackoverflow.com/questions/309396/java-how-to-test-methods-that-call-system-exit<a name="line.43"></a>
-<span class="sourceLineNo">044</span>  protected static class ExitException extends SecurityException {<a name="line.44"></a>
-<span class="sourceLineNo">045</span>    private static final long serialVersionUID = 1L;<a name="line.45"></a>
-<span class="sourceLineNo">046</span>    private final int status;<a name="line.46"></a>
-<span class="sourceLineNo">047</span>    public ExitException(int status) {<a name="line.47"></a>
-<span class="sourceLineNo">048</span>      super("There is no escape!");<a name="line.48"></a>
-<span class="sourceLineNo">049</span>      this.status = status;<a name="line.49"></a>
-<span class="sourceLineNo">050</span>    }<a name="line.50"></a>
-<span class="sourceLineNo">051</span>  }<a name="line.51"></a>
-<span class="sourceLineNo">052</span><a name="line.52"></a>
-<span class="sourceLineNo">053</span>  private static class NoExitSecurityManager extends SecurityManager {<a name="line.53"></a>
-<span class="sourceLineNo">054</span>    @Override<a name="line.54"></a>
-<span class="sourceLineNo">055</span>    public void checkPermission(Permission perm) {<a name="line.55"></a>
-<span class="sourceLineNo">056</span>      // allow anything.<a name="line.56"></a>
-<span class="sourceLineNo">057</span>    }<a name="line.57"></a>
-<span class="sourceLineNo">058</span><a name="line.58"></a>
-<span class="sourceLineNo">059</span>    @Override<a name="line.59"></a>
-<span class="sourceLineNo">060</span>    public void checkPermission(Permission perm, Object context) {<a name="line.60"></a>
-<span class="sourceLineNo">061</span>      // allow anything.<a name="line.61"></a>
-<span class="sourceLineNo">062</span>    }<a name="line.62"></a>
-<span class="sourceLineNo">063</span><a name="line.63"></a>
-<span class="sourceLineNo">064</span>    @Override<a name="line.64"></a>
-<span class="sourceLineNo">065</span>    public void checkExit(int status) {<a name="line.65"></a>
-<span class="sourceLineNo">066</span>      super.checkExit(status);<a name="line.66"></a>
-<span class="sourceLineNo">067</span>      throw new ExitException(status);<a name="line.67"></a>
-<span class="sourceLineNo">068</span>    }<a name="line.68"></a>
-<span class="sourceLineNo">069</span>  }<a name="line.69"></a>
-<span class="sourceLineNo">070</span><a name="line.70"></a>
-<span class="sourceLineNo">071</span>  /**<a name="line.71"></a>
-<span class="sourceLineNo">072</span>   * We need delete of a znode to work at least.<a name="line.72"></a>
-<span class="sourceLineNo">073</span>   */<a name="line.73"></a>
-<span class="sourceLineNo">074</span>  @Test<a name="line.74"></a>
-<span class="sourceLineNo">075</span>  public void testCommandLineWorks() throws Exception {<a name="line.75"></a>
-<span class="sourceLineNo">076</span>    System.setSecurityManager(new NoExitSecurityManager());<a name="line.76"></a>
-<span class="sourceLineNo">077</span>    HBaseZKTestingUtility htu = new HBaseZKTestingUtility();<a name="line.77"></a>
-<span class="sourceLineNo">078</span>    // Make it long so for sure succeeds.<a name="line.78"></a>
-<span class="sourceLineNo">079</span>    htu.getConfiguration().setInt(HConstants.ZK_SESSION_TIMEOUT, 30000);<a name="line.79"></a>
-<span class="sourceLineNo">080</span>    htu.startMiniZKCluster();<a name="line.80"></a>
-<span class="sourceLineNo">081</span>    try {<a name="line.81"></a>
-<span class="sourceLineNo">082</span>      ZKWatcher zkw = htu.getZooKeeperWatcher();<a name="line.82"></a>
-<span class="sourceLineNo">083</span>      String znode = "/testCommandLineWorks";<a name="line.83"></a>
-<span class="sourceLineNo">084</span>      ZKUtil.createWithParents(zkw, znode, HConstants.EMPTY_BYTE_ARRAY);<a name="line.84"></a>
-<span class="sourceLineNo">085</span>      ZKUtil.checkExists(zkw, znode);<a name="line.85"></a>
-<span class="sourceLineNo">086</span>      boolean exception = false;<a name="line.86"></a>
-<span class="sourceLineNo">087</span>      try {<a name="line.87"></a>
-<span class="sourceLineNo">088</span>        ZKMainServer.main(new String [] {"-server",<a name="line.88"></a>
-<span class="sourceLineNo">089</span>          "localhost:" + htu.getZkCluster().getClientPort(), "delete", znode});<a name="line.89"></a>
-<span class="sourceLineNo">090</span>      } catch (ExitException ee) {<a name="line.90"></a>
-<span class="sourceLineNo">091</span>        // ZKMS calls System.exit which should trigger this exception.<a name="line.91"></a>
-<span class="sourceLineNo">092</span>        exception = true;<a name="line.92"></a>
-<span class="sourceLineNo">093</span>      }<a name="line.93"></a>
-<span class="sourceLineNo">094</span>      assertTrue(exception);<a name="line.94"></a>
-<span class="sourceLineNo">095</span>      assertEquals(-1, ZKUtil.checkExists(zkw, znode));<a name="line.95"></a>
-<span class="sourceLineNo">096</span>    } finally {<a name="line.96"></a>
-<span class="sourceLineNo">097</span>      htu.shutdownMiniZKCluster();<a name="line.97"></a>
-<span class="sourceLineNo">098</span>      System.setSecurityManager(null); // or save and restore original<a name="line.98"></a>
-<span class="sourceLineNo">099</span>    }<a name="line.99"></a>
-<span class="sourceLineNo">100</span>  }<a name="line.100"></a>
-<span class="sourceLineNo">101</span><a name="line.101"></a>
-<span class="sourceLineNo">102</span>  @Test<a name="line.102"></a>
-<span class="sourceLineNo">103</span>  public void testHostPortParse() {<a name="line.103"></a>
-<span class="sourceLineNo">104</span>    ZKMainServer parser = new ZKMainServer();<a name="line.104"></a>
-<span class="sourceLineNo">105</span>    Configuration c = HBaseConfiguration.create();<a name="line.105"></a>
-<span class="sourceLineNo">106</span>    assertEquals("localhost:" + c.get(HConstants.ZOOKEEPER_CLIENT_PORT), parser.parse(c));<a name="line.106"></a>
-<span class="sourceLineNo">107</span>    final String port = "1234";<a name="line.107"></a>
-<span class="sourceLineNo">108</span>    c.set(HConstants.ZOOKEEPER_CLIENT_PORT, port);<a name="line.108"></a>
-<span class="sourceLineNo">109</span>    c.set("hbase.zookeeper.quorum", "example.com");<a name="line.109"></a>
-<span class="sourceLineNo">110</span>    assertEquals("example.com:" + port, parser.parse(c));<a name="line.110"></a>
-<span class="sourceLineNo">111</span>    c.set("hbase.zookeeper.quorum", "example1.com,example2.com,example3.com");<a name="line.111"></a>
-<span class="sourceLineNo">112</span>    String ensemble = parser.parse(c);<a name="line.112"></a>
-<span class="sourceLineNo">113</span>    assertTrue(port, ensemble.matches("(example[1-3]\\.com:1234,){2}example[1-3]\\.com:" + port));<a name="line.113"></a>
-<span class="sourceLineNo">114</span><a name="line.114"></a>
-<span class="sourceLineNo">115</span>    // multiple servers with its own port<a name="line.115"></a>
-<span class="sourceLineNo">116</span>    c.set("hbase.zookeeper.quorum", "example1.com:5678,example2.com:9012,example3.com:3456");<a name="line.116"></a>
-<span class="sourceLineNo">117</span>    ensemble = parser.parse(c);<a name="line.117"></a>
-<span class="sourceLineNo">118</span>    assertEquals(ensemble, "example1.com:5678,example2.com:9012,example3.com:3456");<a name="line.118"></a>
-<span class="sourceLineNo">119</span><a name="line.119"></a>
-<span class="sourceLineNo">120</span>    // some servers without its own port, which will be assigned the default client port<a name="line.120"></a>
-<span class="sourceLineNo">121</span>    c.set("hbase.zookeeper.quorum", "example1.com:5678,example2.com:9012,example3.com");<a name="line.121"></a>
-<span class="sourceLineNo">122</span>    ensemble = parser.parse(c);<a name="line.122"></a>
-<span class="sourceLineNo">123</span>    assertEquals(ensemble, "example1.com:5678,example2.com:9012,example3.com:" + port);<a name="line.123"></a>
-<span class="sourceLineNo">124</span>  }<a name="line.124"></a>
-<span class="sourceLineNo">125</span>}<a name="line.125"></a>
+<span class="sourceLineNo">031</span>import org.junit.Assert;<a name="line.31"></a>
+<span class="sourceLineNo">032</span>import org.junit.ClassRule;<a name="line.32"></a>
+<span class="sourceLineNo">033</span>import org.junit.Test;<a name="line.33"></a>
+<span class="sourceLineNo">034</span>import org.junit.experimental.categories.Category;<a name="line.34"></a>
+<span class="sourceLineNo">035</span><a name="line.35"></a>
+<span class="sourceLineNo">036</span>@Category({ ZKTests.class, SmallTests.class })<a name="line.36"></a>
+<span class="sourceLineNo">037</span>public class TestZKMainServer {<a name="line.37"></a>
+<span class="sourceLineNo">038</span><a name="line.38"></a>
+<span class="sourceLineNo">039</span>  @ClassRule<a name="line.39"></a>
+<span class="sourceLineNo">040</span>  public static final HBaseClassTestRule CLASS_RULE =<a name="line.40"></a>
+<span class="sourceLineNo">041</span>      HBaseClassTestRule.forClass(TestZKMainServer.class);<a name="line.41"></a>
+<span class="sourceLineNo">042</span><a name="line.42"></a>
+<span class="sourceLineNo">043</span>  // ZKMS calls System.exit.  Catch the call and prevent exit using trick described up in<a name="line.43"></a>
+<span class="sourceLineNo">044</span>  // http://stackoverflow.com/questions/309396/java-how-to-test-methods-that-call-system-exit<a name="line.44"></a>
+<span class="sourceLineNo">045</span>  protected static class ExitException extends SecurityException {<a name="line.45"></a>
+<span class="sourceLineNo">046</span>    private static final long serialVersionUID = 1L;<a name="line.46"></a>
+<span class="sourceLineNo">047</span>    private final int status;<a name="line.47"></a>
+<span class="sourceLineNo">048</span>    public ExitException(int status) {<a name="line.48"></a>
+<span class="sourceLineNo">049</span>      super("There is no escape!");<a name="line.49"></a>
+<span class="sourceLineNo">050</span>      this.status = status;<a name="line.50"></a>
+<span class="sourceLineNo">051</span>    }<a name="line.51"></a>
+<span class="sourceLineNo">052</span>  }<a name="line.52"></a>
+<span class="sourceLineNo">053</span><a name="line.53"></a>
+<span class="sourceLineNo">054</span>  private static class NoExitSecurityManager extends SecurityManager {<a name="line.54"></a>
+<span class="sourceLineNo">055</span>    @Override<a name="line.55"></a>
+<span class="sourceLineNo">056</span>    public void checkPermission(Permission perm) {<a name="line.56"></a>
+<span class="sourceLineNo">057</span>      // allow anything.<a name="line.57"></a>
+<span class="sourceLineNo">058</span>    }<a name="line.58"></a>
+<span class="sourceLineNo">059</span><a name="line.59"></a>
+<span class="sourceLineNo">060</span>    @Override<a name="line.60"></a>
+<span class="sourceLineNo">061</span>    public void checkPermission(Permission perm, Object context) {<a name="line.61"></a>
+<span class="sourceLineNo">062</span>      // allow anything.<a name="line.62"></a>
+<span class="sourceLineNo">063</span>    }<a name="line.63"></a>
+<span class="sourceLineNo">064</span><a name="line.64"></a>
+<span class="sourceLineNo">065</span>    @Override<a name="line.65"></a>
+<span class="sourceLineNo">066</span>    public void checkExit(int status) {<a name="line.66"></a>
+<span class="sourceLineNo">067</span>      super.checkExit(status);<a name="line.67"></a>
+<span class="sourceLineNo">068</span>      throw new ExitException(status);<a name="line.68"></a>
+<span class="sourceLineNo">069</span>    }<a name="line.69"></a>
+<span class="sourceLineNo">070</span>  }<a name="line.70"></a>
+<span class="sourceLineNo">071</span><a name="line.71"></a>
+<span class="sourceLineNo">072</span>  /**<a name="line.72"></a>
+<span class="sourceLineNo">073</span>   * We need delete of a znode to work at least.<a name="line.73"></a>
+<span class="sourceLineNo">074</span>   */<a name="line.74"></a>
+<span class="sourceLineNo">075</span>  @Test<a name="line.75"></a>
+<span class="sourceLineNo">076</span>  public void testCommandLineWorks() throws Exception {<a name="line.76"></a>
+<span class="sourceLineNo">077</span>    System.setSecurityManager(new NoExitSecurityManager());<a name="line.77"></a>
+<span class="sourceLineNo">078</span>    HBaseZKTestingUtility htu = new HBaseZKTestingUtility();<a name="line.78"></a>
+<span class="sourceLineNo">079</span>    // Make it long so for sure succeeds.<a name="line.79"></a>
+<span class="sourceLineNo">080</span>    htu.getConfiguration().setInt(HConstants.ZK_SESSION_TIMEOUT, 30000);<a name="line.80"></a>
+<span class="sourceLineNo">081</span>    htu.startMiniZKCluster();<a name="line.81"></a>
+<span class="sourceLineNo">082</span>    try {<a name="line.82"></a>
+<span class="sourceLineNo">083</span>      ZKWatcher zkw = htu.getZooKeeperWatcher();<a name="line.83"></a>
+<span class="sourceLineNo">084</span>      String znode = "/testCommandLineWorks";<a name="line.84"></a>
+<span class="sourceLineNo">085</span>      ZKUtil.createWithParents(zkw, znode, HConstants.EMPTY_BYTE_ARRAY);<a name="line.85"></a>
+<span class="sourceLineNo">086</span>      ZKUtil.checkExists(zkw, znode);<a name="line.86"></a>
+<span class="sourceLineNo">087</span>      boolean exception = false;<a name="line.87"></a>
+<span class="sourceLineNo">088</span>      try {<a name="line.88"></a>
+<span class="sourceLineNo">089</span>        ZKMainServer.main(new String [] {"-server",<a name="line.89"></a>
+<span class="sourceLineNo">090</span>          "localhost:" + htu.getZkCluster().getClientPort(), "delete", znode});<a name="line.90"></a>
+<span class="sourceLineNo">091</span>      } catch (ExitException ee) {<a name="line.91"></a>
+<span class="sourceLineNo">092</span>        // ZKMS calls System.exit which should trigger this exception.<a name="line.92"></a>
+<span class="sourceLineNo">093</span>        exception = true;<a name="line.93"></a>
+<span class="sourceLineNo">094</span>      }<a name="line.94"></a>
+<span class="sourceLineNo">095</span>      assertTrue(exception);<a name="line.95"></a>
+<span class="sourceLineNo">096</span>      assertEquals(-1, ZKUtil.checkExists(zkw, znode));<a name="line.96"></a>
+<span class="sourceLineNo">097</span>    } finally {<a name="line.97"></a>
+<span class="sourceLineNo">098</span>      htu.shutdownMiniZKCluster();<a name="line.98"></a>
+<span class="sourceLineNo">099</span>      System.setSecurityManager(null); // or save and restore original<a name="line.99"></a>
+<span class="sourceLineNo">100</span>    }<a name="line.100"></a>
+<span class="sourceLineNo">101</span>  }<a name="line.101"></a>
+<span class="sourceLineNo">102</span><a name="line.102"></a>
+<span class="sourceLineNo">103</span>  @Test<a name="line.103"></a>
+<span class="sourceLineNo">104</span>  public void testHostPortParse() {<a name="line.104"></a>
+<span class="sourceLineNo">105</span>    ZKMainServer parser = new ZKMainServer();<a name="line.105"></a>
+<span class="sourceLineNo">106</span>    Configuration c = HBaseConfiguration.create();<a name="line.106"></a>
+<span class="sourceLineNo">107</span>    assertEquals("localhost:" + c.get(HConstants.ZOOKEEPER_CLIENT_PORT), parser.parse(c));<a name="line.107"></a>
+<span class="sourceLineNo">108</span>    final String port = "1234";<a name="line.108"></a>
+<span class="sourceLineNo">109</span>    c.set(HConstants.ZOOKEEPER_CLIENT_PORT, port);<a name="line.109"></a>
+<span class="sourceLineNo">110</span>    c.set("hbase.zookeeper.quorum", "example.com");<a name="line.110"></a>
+<span class="sourceLineNo">111</span>    assertEquals("example.com:" + port, parser.parse(c));<a name="line.111"></a>
+<span class="sourceLineNo">112</span>    c.set("hbase.zookeeper.quorum", "example1.com,example2.com,example3.com");<a name="line.112"></a>
+<span class="sourceLineNo">113</span>    String ensemble = parser.parse(c);<a name="line.113"></a>
+<span class="sourceLineNo">114</span>    assertTrue(port, ensemble.matches("(example[1-3]\\.com:1234,){2}example[1-3]\\.com:" + port));<a name="line.114"></a>
+<span class="sourceLineNo">115</span><a name="line.115"></a>
+<span class="sourceLineNo">116</span>    // multiple servers with its own port<a name="line.116"></a>
+<span class="sourceLineNo">117</span>    c.set("hbase.zookeeper.quorum", "example1.com:5678,example2.com:9012,example3.com:3456");<a name="line.117"></a>
+<span class="sourceLineNo">118</span>    ensemble = parser.parse(c);<a name="line.118"></a>
+<span class="sourceLineNo">119</span>    assertEquals(ensemble, "example1.com:5678,example2.com:9012,example3.com:3456");<a name="line.119"></a>
+<span class="sourceLineNo">120</span><a name="line.120"></a>
+<span class="sourceLineNo">121</span>    // some servers without its own port, which will be assigned the default client port<a name="line.121"></a>
+<span class="sourceLineNo">122</span>    c.set("hbase.zookeeper.quorum", "example1.com:5678,example2.com:9012,example3.com");<a name="line.122"></a>
+<span class="sourceLineNo">123</span>    ensemble = parser.parse(c);<a name="line.123"></a>
+<span class="sourceLineNo">124</span>    assertEquals(ensemble, "example1.com:5678,example2.com:9012,example3.com:" + port);<a name="line.124"></a>
+<span class="sourceLineNo">125</span><a name="line.125"></a>
+<span class="sourceLineNo">126</span>    // multiple servers(IPv6) with its own port<a name="line.126"></a>
+<span class="sourceLineNo">127</span>    c.set("hbase.zookeeper.quorum", "[2001:db8:1::242:ac11:2]:2181," +<a name="line.127"></a>
+<span class="sourceLineNo">128</span>                                    "[2001:db8:1::242:ac11:3]:5678");<a name="line.128"></a>
+<span class="sourceLineNo">129</span>    ensemble = parser.parse(c);<a name="line.129"></a>
+<span class="sourceLineNo">130</span>    assertEquals("[2001:db8:1::242:ac11:2]:2181," +<a name="line.130"></a>
+<span class="sourceLineNo">131</span>                 "[2001:db8:1::242:ac11:3]:5678", ensemble);<a name="line.131"></a>
+<span class="sourceLineNo">132</span><a name="line.132"></a>
+<span class="sourceLineNo">133</span>    // some servers(IPv6) without its own port, which will be assigned the default client port<a name="line.133"></a>
+<span class="sourceLineNo">134</span>    c.set("hbase.zookeeper.quorum", "[1001:db8:1::242:ac11:8], [2001:db8:1::242:df23:2]:9876," +<a name="line.134"></a>
+<span class="sourceLineNo">135</span>                                    "[2001:db8:1::242:ac11:3]:5678");<a name="line.135"></a>
+<span class="sourceLineNo">136</span>    ensemble = parser.parse(c);<a name="line.136"></a>
+<span class="sourceLineNo">137</span>    assertEquals("[1001:db8:1::242:ac11:8]:1234, [2001:db8:1::242:df23:2]:9876," +<a name="line.137"></a>
+<span class="sourceLineNo">138</span>                 "[2001:db8:1::242:ac11:3]:5678", ensemble);<a name="line.138"></a>
+<span class="sourceLineNo">139</span><a name="line.139"></a>
+<span class="sourceLineNo">140</span>    //a bad case<a name="line.140"></a>
+<span class="sourceLineNo">141</span>    try {<a name="line.141"></a>
+<span class="sourceLineNo">142</span>      // some servers(IPv6) with an invaild Ipv6 address in it<a name="line.142"></a>
+<span class="sourceLineNo">143</span>      c.set("hbase.zookeeper.quorum", "[1001:db8:1::242:ac11:8], [2001:db8:1::242:df23:2]:9876," +<a name="line.143"></a>
+<span class="sourceLineNo">144</span>              "[1001:db8:1::242:ac11:8:89:67]:5678");<a name="line.144"></a>
+<span class="sourceLineNo">145</span>      ensemble = parser.parse(c);<a name="line.145"></a>
+<span class="sourceLineNo">146</span>      Assert.fail("IPv6 address should be 8 groups.");<a name="line.146"></a>
+<span class="sourceLineNo">147</span>    } catch (IllegalArgumentException e) {<a name="line.147"></a>
+<span class="sourceLineNo">148</span>      //expected<a name="line.148"></a>
+<span class="sourceLineNo">149</span>    }<a name="line.149"></a>
+<span class="sourceLineNo">150</span><a name="line.150"></a>
+<span class="sourceLineNo">151</span>  }<a name="line.151"></a>
+<span class="sourceLineNo">152</span>}<a name="line.152"></a>
 
 
 


[13/29] hbase-site git commit: Published site at 5e84997f2ffdbcf5f849d70c30ddbe2db4039ca4.

Posted by gi...@apache.org.
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/27f5bfb5/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 dd0dd0f..9fd7e0b 100644
--- a/devapidocs/src-html/org/apache/hadoop/hbase/procedure2/ProcedureExecutor.html
+++ b/devapidocs/src-html/org/apache/hadoop/hbase/procedure2/ProcedureExecutor.html
@@ -975,1128 +975,1136 @@
 <span class="sourceLineNo">967</span>        store.update(procedure);<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>      // If we don't have the lock, we can't re-submit the queue,<a name="line.970"></a>
-<span class="sourceLineNo">971</span>      // since it is already executing. To get rid of the stuck situation, we<a name="line.971"></a>
-<span class="sourceLineNo">972</span>      // need to restart the master. With the procedure set to bypass, the procedureExecutor<a name="line.972"></a>
-<span class="sourceLineNo">973</span>      // will bypass it and won't get stuck again.<a name="line.973"></a>
-<span class="sourceLineNo">974</span>      if (lockEntry != null) {<a name="line.974"></a>
-<span class="sourceLineNo">975</span>        // add the procedure to run queue,<a name="line.975"></a>
-<span class="sourceLineNo">976</span>        scheduler.addFront(procedure);<a name="line.976"></a>
-<span class="sourceLineNo">977</span>        LOG.debug("Bypassing {} and its ancestors successfully, adding to queue", procedure);<a name="line.977"></a>
-<span class="sourceLineNo">978</span>      } else {<a name="line.978"></a>
-<span class="sourceLineNo">979</span>        LOG.debug("Bypassing {} and its ancestors successfully, but since it is already running, "<a name="line.979"></a>
-<span class="sourceLineNo">980</span>            + "skipping add to queue", procedure);<a name="line.980"></a>
-<span class="sourceLineNo">981</span>      }<a name="line.981"></a>
-<span class="sourceLineNo">982</span>      return true;<a name="line.982"></a>
-<span class="sourceLineNo">983</span><a name="line.983"></a>
-<span class="sourceLineNo">984</span>    } finally {<a name="line.984"></a>
-<span class="sourceLineNo">985</span>      if (lockEntry != null) {<a name="line.985"></a>
-<span class="sourceLineNo">986</span>        procExecutionLock.releaseLockEntry(lockEntry);<a name="line.986"></a>
-<span class="sourceLineNo">987</span>      }<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><a name="line.990"></a>
-<span class="sourceLineNo">991</span>  /**<a name="line.991"></a>
-<span class="sourceLineNo">992</span>   * Add a new root-procedure to the executor.<a name="line.992"></a>
-<span class="sourceLineNo">993</span>   * @param proc the new procedure to execute.<a name="line.993"></a>
-<span class="sourceLineNo">994</span>   * @param nonceKey the registered unique identifier for this operation from the client or process.<a name="line.994"></a>
-<span class="sourceLineNo">995</span>   * @return the procedure id, that can be used to monitor the operation<a name="line.995"></a>
-<span class="sourceLineNo">996</span>   */<a name="line.996"></a>
-<span class="sourceLineNo">997</span>  @edu.umd.cs.findbugs.annotations.SuppressWarnings(value="NP_NULL_ON_SOME_PATH",<a name="line.997"></a>
-<span class="sourceLineNo">998</span>      justification = "FindBugs is blind to the check-for-null")<a name="line.998"></a>
-<span class="sourceLineNo">999</span>  public long submitProcedure(Procedure&lt;TEnvironment&gt; proc, NonceKey nonceKey) {<a name="line.999"></a>
-<span class="sourceLineNo">1000</span>    Preconditions.checkArgument(lastProcId.get() &gt;= 0);<a name="line.1000"></a>
-<span class="sourceLineNo">1001</span><a name="line.1001"></a>
-<span class="sourceLineNo">1002</span>    prepareProcedure(proc);<a name="line.1002"></a>
-<span class="sourceLineNo">1003</span><a name="line.1003"></a>
-<span class="sourceLineNo">1004</span>    final Long currentProcId;<a name="line.1004"></a>
-<span class="sourceLineNo">1005</span>    if (nonceKey != null) {<a name="line.1005"></a>
-<span class="sourceLineNo">1006</span>      currentProcId = nonceKeysToProcIdsMap.get(nonceKey);<a name="line.1006"></a>
-<span class="sourceLineNo">1007</span>      Preconditions.checkArgument(currentProcId != null,<a name="line.1007"></a>
-<span class="sourceLineNo">1008</span>        "Expected nonceKey=" + nonceKey + " to be reserved, use registerNonce(); proc=" + proc);<a name="line.1008"></a>
-<span class="sourceLineNo">1009</span>    } else {<a name="line.1009"></a>
-<span class="sourceLineNo">1010</span>      currentProcId = nextProcId();<a name="line.1010"></a>
-<span class="sourceLineNo">1011</span>    }<a name="line.1011"></a>
-<span class="sourceLineNo">1012</span><a name="line.1012"></a>
-<span class="sourceLineNo">1013</span>    // Initialize the procedure<a name="line.1013"></a>
-<span class="sourceLineNo">1014</span>    proc.setNonceKey(nonceKey);<a name="line.1014"></a>
-<span class="sourceLineNo">1015</span>    proc.setProcId(currentProcId.longValue());<a name="line.1015"></a>
-<span class="sourceLineNo">1016</span><a name="line.1016"></a>
-<span class="sourceLineNo">1017</span>    // Commit the transaction<a name="line.1017"></a>
-<span class="sourceLineNo">1018</span>    store.insert(proc, null);<a name="line.1018"></a>
-<span class="sourceLineNo">1019</span>    LOG.debug("Stored {}", proc);<a name="line.1019"></a>
+<span class="sourceLineNo">970</span>      // If state of procedure is WAITING_TIMEOUT, we can directly submit it to the scheduler.<a name="line.970"></a>
+<span class="sourceLineNo">971</span>      // Instead we should remove it from timeout Executor queue and tranfer its state to RUNNABLE<a name="line.971"></a>
+<span class="sourceLineNo">972</span>      if (procedure.getState() == ProcedureState.WAITING_TIMEOUT) {<a name="line.972"></a>
+<span class="sourceLineNo">973</span>        LOG.debug("transform procedure {} from WAITING_TIMEOUT to RUNNABLE", procedure);<a name="line.973"></a>
+<span class="sourceLineNo">974</span>        if (timeoutExecutor.remove(procedure)) {<a name="line.974"></a>
+<span class="sourceLineNo">975</span>          LOG.debug("removed procedure {} from timeoutExecutor", procedure);<a name="line.975"></a>
+<span class="sourceLineNo">976</span>          timeoutExecutor.executeTimedoutProcedure(procedure);<a name="line.976"></a>
+<span class="sourceLineNo">977</span>        }<a name="line.977"></a>
+<span class="sourceLineNo">978</span>      } else if (lockEntry != null) {<a name="line.978"></a>
+<span class="sourceLineNo">979</span>        scheduler.addFront(procedure);<a name="line.979"></a>
+<span class="sourceLineNo">980</span>        LOG.debug("Bypassing {} and its ancestors successfully, adding to queue", procedure);<a name="line.980"></a>
+<span class="sourceLineNo">981</span>      } else {<a name="line.981"></a>
+<span class="sourceLineNo">982</span>        // If we don't have the lock, we can't re-submit the queue,<a name="line.982"></a>
+<span class="sourceLineNo">983</span>        // since it is already executing. To get rid of the stuck situation, we<a name="line.983"></a>
+<span class="sourceLineNo">984</span>        // need to restart the master. With the procedure set to bypass, the procedureExecutor<a name="line.984"></a>
+<span class="sourceLineNo">985</span>        // will bypass it and won't get stuck again.<a name="line.985"></a>
+<span class="sourceLineNo">986</span>        LOG.debug("Bypassing {} and its ancestors successfully, but since it is already running, "<a name="line.986"></a>
+<span class="sourceLineNo">987</span>            + "skipping add to queue",<a name="line.987"></a>
+<span class="sourceLineNo">988</span>          procedure);<a name="line.988"></a>
+<span class="sourceLineNo">989</span>      }<a name="line.989"></a>
+<span class="sourceLineNo">990</span>      return true;<a name="line.990"></a>
+<span class="sourceLineNo">991</span><a name="line.991"></a>
+<span class="sourceLineNo">992</span>    } finally {<a name="line.992"></a>
+<span class="sourceLineNo">993</span>      if (lockEntry != null) {<a name="line.993"></a>
+<span class="sourceLineNo">994</span>        procExecutionLock.releaseLockEntry(lockEntry);<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>  }<a name="line.997"></a>
+<span class="sourceLineNo">998</span><a name="line.998"></a>
+<span class="sourceLineNo">999</span>  /**<a name="line.999"></a>
+<span class="sourceLineNo">1000</span>   * Add a new root-procedure to the executor.<a name="line.1000"></a>
+<span class="sourceLineNo">1001</span>   * @param proc the new procedure to execute.<a name="line.1001"></a>
+<span class="sourceLineNo">1002</span>   * @param nonceKey the registered unique identifier for this operation from the client or process.<a name="line.1002"></a>
+<span class="sourceLineNo">1003</span>   * @return the procedure id, that can be used to monitor the operation<a name="line.1003"></a>
+<span class="sourceLineNo">1004</span>   */<a name="line.1004"></a>
+<span class="sourceLineNo">1005</span>  @edu.umd.cs.findbugs.annotations.SuppressWarnings(value="NP_NULL_ON_SOME_PATH",<a name="line.1005"></a>
+<span class="sourceLineNo">1006</span>      justification = "FindBugs is blind to the check-for-null")<a name="line.1006"></a>
+<span class="sourceLineNo">1007</span>  public long submitProcedure(Procedure&lt;TEnvironment&gt; proc, NonceKey nonceKey) {<a name="line.1007"></a>
+<span class="sourceLineNo">1008</span>    Preconditions.checkArgument(lastProcId.get() &gt;= 0);<a name="line.1008"></a>
+<span class="sourceLineNo">1009</span><a name="line.1009"></a>
+<span class="sourceLineNo">1010</span>    prepareProcedure(proc);<a name="line.1010"></a>
+<span class="sourceLineNo">1011</span><a name="line.1011"></a>
+<span class="sourceLineNo">1012</span>    final Long currentProcId;<a name="line.1012"></a>
+<span class="sourceLineNo">1013</span>    if (nonceKey != null) {<a name="line.1013"></a>
+<span class="sourceLineNo">1014</span>      currentProcId = nonceKeysToProcIdsMap.get(nonceKey);<a name="line.1014"></a>
+<span class="sourceLineNo">1015</span>      Preconditions.checkArgument(currentProcId != null,<a name="line.1015"></a>
+<span class="sourceLineNo">1016</span>        "Expected nonceKey=" + nonceKey + " to be reserved, use registerNonce(); proc=" + proc);<a name="line.1016"></a>
+<span class="sourceLineNo">1017</span>    } else {<a name="line.1017"></a>
+<span class="sourceLineNo">1018</span>      currentProcId = nextProcId();<a name="line.1018"></a>
+<span class="sourceLineNo">1019</span>    }<a name="line.1019"></a>
 <span class="sourceLineNo">1020</span><a name="line.1020"></a>
-<span class="sourceLineNo">1021</span>    // Add the procedure to the executor<a name="line.1021"></a>
-<span class="sourceLineNo">1022</span>    return pushProcedure(proc);<a name="line.1022"></a>
-<span class="sourceLineNo">1023</span>  }<a name="line.1023"></a>
+<span class="sourceLineNo">1021</span>    // Initialize the procedure<a name="line.1021"></a>
+<span class="sourceLineNo">1022</span>    proc.setNonceKey(nonceKey);<a name="line.1022"></a>
+<span class="sourceLineNo">1023</span>    proc.setProcId(currentProcId.longValue());<a name="line.1023"></a>
 <span class="sourceLineNo">1024</span><a name="line.1024"></a>
-<span class="sourceLineNo">1025</span>  /**<a name="line.1025"></a>
-<span class="sourceLineNo">1026</span>   * Add a set of new root-procedure to the executor.<a name="line.1026"></a>
-<span class="sourceLineNo">1027</span>   * @param procs the new procedures to execute.<a name="line.1027"></a>
-<span class="sourceLineNo">1028</span>   */<a name="line.1028"></a>
-<span class="sourceLineNo">1029</span>  // TODO: Do we need to take nonces here?<a name="line.1029"></a>
-<span class="sourceLineNo">1030</span>  public void submitProcedures(Procedure&lt;TEnvironment&gt;[] procs) {<a name="line.1030"></a>
-<span class="sourceLineNo">1031</span>    Preconditions.checkArgument(lastProcId.get() &gt;= 0);<a name="line.1031"></a>
-<span class="sourceLineNo">1032</span>    if (procs == null || procs.length &lt;= 0) {<a name="line.1032"></a>
-<span class="sourceLineNo">1033</span>      return;<a name="line.1033"></a>
-<span class="sourceLineNo">1034</span>    }<a name="line.1034"></a>
-<span class="sourceLineNo">1035</span><a name="line.1035"></a>
-<span class="sourceLineNo">1036</span>    // Prepare procedure<a name="line.1036"></a>
-<span class="sourceLineNo">1037</span>    for (int i = 0; i &lt; procs.length; ++i) {<a name="line.1037"></a>
-<span class="sourceLineNo">1038</span>      prepareProcedure(procs[i]).setProcId(nextProcId());<a name="line.1038"></a>
-<span class="sourceLineNo">1039</span>    }<a name="line.1039"></a>
-<span class="sourceLineNo">1040</span><a name="line.1040"></a>
-<span class="sourceLineNo">1041</span>    // Commit the transaction<a name="line.1041"></a>
-<span class="sourceLineNo">1042</span>    store.insert(procs);<a name="line.1042"></a>
-<span class="sourceLineNo">1043</span>    if (LOG.isDebugEnabled()) {<a name="line.1043"></a>
-<span class="sourceLineNo">1044</span>      LOG.debug("Stored " + Arrays.toString(procs));<a name="line.1044"></a>
-<span class="sourceLineNo">1045</span>    }<a name="line.1045"></a>
-<span class="sourceLineNo">1046</span><a name="line.1046"></a>
-<span class="sourceLineNo">1047</span>    // Add the procedure to the executor<a name="line.1047"></a>
-<span class="sourceLineNo">1048</span>    for (int i = 0; i &lt; procs.length; ++i) {<a name="line.1048"></a>
-<span class="sourceLineNo">1049</span>      pushProcedure(procs[i]);<a name="line.1049"></a>
-<span class="sourceLineNo">1050</span>    }<a name="line.1050"></a>
-<span class="sourceLineNo">1051</span>  }<a name="line.1051"></a>
-<span class="sourceLineNo">1052</span><a name="line.1052"></a>
-<span class="sourceLineNo">1053</span>  private Procedure&lt;TEnvironment&gt; prepareProcedure(Procedure&lt;TEnvironment&gt; proc) {<a name="line.1053"></a>
-<span class="sourceLineNo">1054</span>    Preconditions.checkArgument(proc.getState() == ProcedureState.INITIALIZING);<a name="line.1054"></a>
-<span class="sourceLineNo">1055</span>    Preconditions.checkArgument(!proc.hasParent(), "unexpected parent", proc);<a name="line.1055"></a>
-<span class="sourceLineNo">1056</span>    if (this.checkOwnerSet) {<a name="line.1056"></a>
-<span class="sourceLineNo">1057</span>      Preconditions.checkArgument(proc.hasOwner(), "missing owner");<a name="line.1057"></a>
+<span class="sourceLineNo">1025</span>    // Commit the transaction<a name="line.1025"></a>
+<span class="sourceLineNo">1026</span>    store.insert(proc, null);<a name="line.1026"></a>
+<span class="sourceLineNo">1027</span>    LOG.debug("Stored {}", proc);<a name="line.1027"></a>
+<span class="sourceLineNo">1028</span><a name="line.1028"></a>
+<span class="sourceLineNo">1029</span>    // Add the procedure to the executor<a name="line.1029"></a>
+<span class="sourceLineNo">1030</span>    return pushProcedure(proc);<a name="line.1030"></a>
+<span class="sourceLineNo">1031</span>  }<a name="line.1031"></a>
+<span class="sourceLineNo">1032</span><a name="line.1032"></a>
+<span class="sourceLineNo">1033</span>  /**<a name="line.1033"></a>
+<span class="sourceLineNo">1034</span>   * Add a set of new root-procedure to the executor.<a name="line.1034"></a>
+<span class="sourceLineNo">1035</span>   * @param procs the new procedures to execute.<a name="line.1035"></a>
+<span class="sourceLineNo">1036</span>   */<a name="line.1036"></a>
+<span class="sourceLineNo">1037</span>  // TODO: Do we need to take nonces here?<a name="line.1037"></a>
+<span class="sourceLineNo">1038</span>  public void submitProcedures(Procedure&lt;TEnvironment&gt;[] procs) {<a name="line.1038"></a>
+<span class="sourceLineNo">1039</span>    Preconditions.checkArgument(lastProcId.get() &gt;= 0);<a name="line.1039"></a>
+<span class="sourceLineNo">1040</span>    if (procs == null || procs.length &lt;= 0) {<a name="line.1040"></a>
+<span class="sourceLineNo">1041</span>      return;<a name="line.1041"></a>
+<span class="sourceLineNo">1042</span>    }<a name="line.1042"></a>
+<span class="sourceLineNo">1043</span><a name="line.1043"></a>
+<span class="sourceLineNo">1044</span>    // Prepare procedure<a name="line.1044"></a>
+<span class="sourceLineNo">1045</span>    for (int i = 0; i &lt; procs.length; ++i) {<a name="line.1045"></a>
+<span class="sourceLineNo">1046</span>      prepareProcedure(procs[i]).setProcId(nextProcId());<a name="line.1046"></a>
+<span class="sourceLineNo">1047</span>    }<a name="line.1047"></a>
+<span class="sourceLineNo">1048</span><a name="line.1048"></a>
+<span class="sourceLineNo">1049</span>    // Commit the transaction<a name="line.1049"></a>
+<span class="sourceLineNo">1050</span>    store.insert(procs);<a name="line.1050"></a>
+<span class="sourceLineNo">1051</span>    if (LOG.isDebugEnabled()) {<a name="line.1051"></a>
+<span class="sourceLineNo">1052</span>      LOG.debug("Stored " + Arrays.toString(procs));<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>    // Add the procedure to the executor<a name="line.1055"></a>
+<span class="sourceLineNo">1056</span>    for (int i = 0; i &lt; procs.length; ++i) {<a name="line.1056"></a>
+<span class="sourceLineNo">1057</span>      pushProcedure(procs[i]);<a name="line.1057"></a>
 <span class="sourceLineNo">1058</span>    }<a name="line.1058"></a>
-<span class="sourceLineNo">1059</span>    return proc;<a name="line.1059"></a>
-<span class="sourceLineNo">1060</span>  }<a name="line.1060"></a>
-<span class="sourceLineNo">1061</span><a name="line.1061"></a>
-<span class="sourceLineNo">1062</span>  private long pushProcedure(Procedure&lt;TEnvironment&gt; proc) {<a name="line.1062"></a>
-<span class="sourceLineNo">1063</span>    final long currentProcId = proc.getProcId();<a name="line.1063"></a>
-<span class="sourceLineNo">1064</span><a name="line.1064"></a>
-<span class="sourceLineNo">1065</span>    // Update metrics on start of a procedure<a name="line.1065"></a>
-<span class="sourceLineNo">1066</span>    proc.updateMetricsOnSubmit(getEnvironment());<a name="line.1066"></a>
-<span class="sourceLineNo">1067</span><a name="line.1067"></a>
-<span class="sourceLineNo">1068</span>    // Create the rollback stack for the procedure<a name="line.1068"></a>
-<span class="sourceLineNo">1069</span>    RootProcedureState&lt;TEnvironment&gt; stack = new RootProcedureState&lt;&gt;();<a name="line.1069"></a>
-<span class="sourceLineNo">1070</span>    rollbackStack.put(currentProcId, stack);<a name="line.1070"></a>
-<span class="sourceLineNo">1071</span><a name="line.1071"></a>
-<span class="sourceLineNo">1072</span>    // Submit the new subprocedures<a name="line.1072"></a>
-<span class="sourceLineNo">1073</span>    assert !procedures.containsKey(currentProcId);<a name="line.1073"></a>
-<span class="sourceLineNo">1074</span>    procedures.put(currentProcId, proc);<a name="line.1074"></a>
-<span class="sourceLineNo">1075</span>    sendProcedureAddedNotification(currentProcId);<a name="line.1075"></a>
-<span class="sourceLineNo">1076</span>    scheduler.addBack(proc);<a name="line.1076"></a>
-<span class="sourceLineNo">1077</span>    return proc.getProcId();<a name="line.1077"></a>
-<span class="sourceLineNo">1078</span>  }<a name="line.1078"></a>
+<span class="sourceLineNo">1059</span>  }<a name="line.1059"></a>
+<span class="sourceLineNo">1060</span><a name="line.1060"></a>
+<span class="sourceLineNo">1061</span>  private Procedure&lt;TEnvironment&gt; prepareProcedure(Procedure&lt;TEnvironment&gt; proc) {<a name="line.1061"></a>
+<span class="sourceLineNo">1062</span>    Preconditions.checkArgument(proc.getState() == ProcedureState.INITIALIZING);<a name="line.1062"></a>
+<span class="sourceLineNo">1063</span>    Preconditions.checkArgument(!proc.hasParent(), "unexpected parent", proc);<a name="line.1063"></a>
+<span class="sourceLineNo">1064</span>    if (this.checkOwnerSet) {<a name="line.1064"></a>
+<span class="sourceLineNo">1065</span>      Preconditions.checkArgument(proc.hasOwner(), "missing owner");<a name="line.1065"></a>
+<span class="sourceLineNo">1066</span>    }<a name="line.1066"></a>
+<span class="sourceLineNo">1067</span>    return proc;<a name="line.1067"></a>
+<span class="sourceLineNo">1068</span>  }<a name="line.1068"></a>
+<span class="sourceLineNo">1069</span><a name="line.1069"></a>
+<span class="sourceLineNo">1070</span>  private long pushProcedure(Procedure&lt;TEnvironment&gt; proc) {<a name="line.1070"></a>
+<span class="sourceLineNo">1071</span>    final long currentProcId = proc.getProcId();<a name="line.1071"></a>
+<span class="sourceLineNo">1072</span><a name="line.1072"></a>
+<span class="sourceLineNo">1073</span>    // Update metrics on start of a procedure<a name="line.1073"></a>
+<span class="sourceLineNo">1074</span>    proc.updateMetricsOnSubmit(getEnvironment());<a name="line.1074"></a>
+<span class="sourceLineNo">1075</span><a name="line.1075"></a>
+<span class="sourceLineNo">1076</span>    // Create the rollback stack for the procedure<a name="line.1076"></a>
+<span class="sourceLineNo">1077</span>    RootProcedureState&lt;TEnvironment&gt; stack = new RootProcedureState&lt;&gt;();<a name="line.1077"></a>
+<span class="sourceLineNo">1078</span>    rollbackStack.put(currentProcId, stack);<a name="line.1078"></a>
 <span class="sourceLineNo">1079</span><a name="line.1079"></a>
-<span class="sourceLineNo">1080</span>  /**<a name="line.1080"></a>
-<span class="sourceLineNo">1081</span>   * Send an abort notification the specified procedure.<a name="line.1081"></a>
-<span class="sourceLineNo">1082</span>   * Depending on the procedure implementation the abort can be considered or ignored.<a name="line.1082"></a>
-<span class="sourceLineNo">1083</span>   * @param procId the procedure to abort<a name="line.1083"></a>
-<span class="sourceLineNo">1084</span>   * @return true if the procedure exists and has received the abort, otherwise false.<a name="line.1084"></a>
-<span class="sourceLineNo">1085</span>   */<a name="line.1085"></a>
-<span class="sourceLineNo">1086</span>  public boolean abort(long procId) {<a name="line.1086"></a>
-<span class="sourceLineNo">1087</span>    return abort(procId, true);<a name="line.1087"></a>
-<span class="sourceLineNo">1088</span>  }<a name="line.1088"></a>
-<span class="sourceLineNo">1089</span><a name="line.1089"></a>
-<span class="sourceLineNo">1090</span>  /**<a name="line.1090"></a>
-<span class="sourceLineNo">1091</span>   * Send an abort notification to the specified procedure.<a name="line.1091"></a>
-<span class="sourceLineNo">1092</span>   * Depending on the procedure implementation, the abort can be considered or ignored.<a name="line.1092"></a>
-<span class="sourceLineNo">1093</span>   * @param procId the procedure to abort<a name="line.1093"></a>
-<span class="sourceLineNo">1094</span>   * @param mayInterruptIfRunning if the proc completed at least one step, should it be aborted?<a name="line.1094"></a>
-<span class="sourceLineNo">1095</span>   * @return true if the procedure exists and has received the abort, otherwise false.<a name="line.1095"></a>
-<span class="sourceLineNo">1096</span>   */<a name="line.1096"></a>
-<span class="sourceLineNo">1097</span>  public boolean abort(long procId, boolean mayInterruptIfRunning) {<a name="line.1097"></a>
-<span class="sourceLineNo">1098</span>    Procedure&lt;TEnvironment&gt; proc = procedures.get(procId);<a name="line.1098"></a>
-<span class="sourceLineNo">1099</span>    if (proc != null) {<a name="line.1099"></a>
-<span class="sourceLineNo">1100</span>      if (!mayInterruptIfRunning &amp;&amp; proc.wasExecuted()) {<a name="line.1100"></a>
-<span class="sourceLineNo">1101</span>        return false;<a name="line.1101"></a>
-<span class="sourceLineNo">1102</span>      }<a name="line.1102"></a>
-<span class="sourceLineNo">1103</span>      return proc.abort(getEnvironment());<a name="line.1103"></a>
-<span class="sourceLineNo">1104</span>    }<a name="line.1104"></a>
-<span class="sourceLineNo">1105</span>    return false;<a name="line.1105"></a>
-<span class="sourceLineNo">1106</span>  }<a name="line.1106"></a>
-<span class="sourceLineNo">1107</span><a name="line.1107"></a>
-<span class="sourceLineNo">1108</span>  // ==========================================================================<a name="line.1108"></a>
-<span class="sourceLineNo">1109</span>  //  Executor query helpers<a name="line.1109"></a>
-<span class="sourceLineNo">1110</span>  // ==========================================================================<a name="line.1110"></a>
-<span class="sourceLineNo">1111</span>  public Procedure&lt;TEnvironment&gt; getProcedure(final long procId) {<a name="line.1111"></a>
-<span class="sourceLineNo">1112</span>    return procedures.get(procId);<a name="line.1112"></a>
-<span class="sourceLineNo">1113</span>  }<a name="line.1113"></a>
-<span class="sourceLineNo">1114</span><a name="line.1114"></a>
-<span class="sourceLineNo">1115</span>  public &lt;T extends Procedure&lt;TEnvironment&gt;&gt; T getProcedure(Class&lt;T&gt; clazz, long procId) {<a name="line.1115"></a>
-<span class="sourceLineNo">1116</span>    Procedure&lt;TEnvironment&gt; proc = getProcedure(procId);<a name="line.1116"></a>
-<span class="sourceLineNo">1117</span>    if (clazz.isInstance(proc)) {<a name="line.1117"></a>
-<span class="sourceLineNo">1118</span>      return clazz.cast(proc);<a name="line.1118"></a>
-<span class="sourceLineNo">1119</span>    }<a name="line.1119"></a>
-<span class="sourceLineNo">1120</span>    return null;<a name="line.1120"></a>
+<span class="sourceLineNo">1080</span>    // Submit the new subprocedures<a name="line.1080"></a>
+<span class="sourceLineNo">1081</span>    assert !procedures.containsKey(currentProcId);<a name="line.1081"></a>
+<span class="sourceLineNo">1082</span>    procedures.put(currentProcId, proc);<a name="line.1082"></a>
+<span class="sourceLineNo">1083</span>    sendProcedureAddedNotification(currentProcId);<a name="line.1083"></a>
+<span class="sourceLineNo">1084</span>    scheduler.addBack(proc);<a name="line.1084"></a>
+<span class="sourceLineNo">1085</span>    return proc.getProcId();<a name="line.1085"></a>
+<span class="sourceLineNo">1086</span>  }<a name="line.1086"></a>
+<span class="sourceLineNo">1087</span><a name="line.1087"></a>
+<span class="sourceLineNo">1088</span>  /**<a name="line.1088"></a>
+<span class="sourceLineNo">1089</span>   * Send an abort notification the specified procedure.<a name="line.1089"></a>
+<span class="sourceLineNo">1090</span>   * Depending on the procedure implementation the abort can be considered or ignored.<a name="line.1090"></a>
+<span class="sourceLineNo">1091</span>   * @param procId the procedure to abort<a name="line.1091"></a>
+<span class="sourceLineNo">1092</span>   * @return true if the procedure exists and has received the abort, otherwise false.<a name="line.1092"></a>
+<span class="sourceLineNo">1093</span>   */<a name="line.1093"></a>
+<span class="sourceLineNo">1094</span>  public boolean abort(long procId) {<a name="line.1094"></a>
+<span class="sourceLineNo">1095</span>    return abort(procId, true);<a name="line.1095"></a>
+<span class="sourceLineNo">1096</span>  }<a name="line.1096"></a>
+<span class="sourceLineNo">1097</span><a name="line.1097"></a>
+<span class="sourceLineNo">1098</span>  /**<a name="line.1098"></a>
+<span class="sourceLineNo">1099</span>   * Send an abort notification to the specified procedure.<a name="line.1099"></a>
+<span class="sourceLineNo">1100</span>   * Depending on the procedure implementation, the abort can be considered or ignored.<a name="line.1100"></a>
+<span class="sourceLineNo">1101</span>   * @param procId the procedure to abort<a name="line.1101"></a>
+<span class="sourceLineNo">1102</span>   * @param mayInterruptIfRunning if the proc completed at least one step, should it be aborted?<a name="line.1102"></a>
+<span class="sourceLineNo">1103</span>   * @return true if the procedure exists and has received the abort, otherwise false.<a name="line.1103"></a>
+<span class="sourceLineNo">1104</span>   */<a name="line.1104"></a>
+<span class="sourceLineNo">1105</span>  public boolean abort(long procId, boolean mayInterruptIfRunning) {<a name="line.1105"></a>
+<span class="sourceLineNo">1106</span>    Procedure&lt;TEnvironment&gt; proc = procedures.get(procId);<a name="line.1106"></a>
+<span class="sourceLineNo">1107</span>    if (proc != null) {<a name="line.1107"></a>
+<span class="sourceLineNo">1108</span>      if (!mayInterruptIfRunning &amp;&amp; proc.wasExecuted()) {<a name="line.1108"></a>
+<span class="sourceLineNo">1109</span>        return false;<a name="line.1109"></a>
+<span class="sourceLineNo">1110</span>      }<a name="line.1110"></a>
+<span class="sourceLineNo">1111</span>      return proc.abort(getEnvironment());<a name="line.1111"></a>
+<span class="sourceLineNo">1112</span>    }<a name="line.1112"></a>
+<span class="sourceLineNo">1113</span>    return false;<a name="line.1113"></a>
+<span class="sourceLineNo">1114</span>  }<a name="line.1114"></a>
+<span class="sourceLineNo">1115</span><a name="line.1115"></a>
+<span class="sourceLineNo">1116</span>  // ==========================================================================<a name="line.1116"></a>
+<span class="sourceLineNo">1117</span>  //  Executor query helpers<a name="line.1117"></a>
+<span class="sourceLineNo">1118</span>  // ==========================================================================<a name="line.1118"></a>
+<span class="sourceLineNo">1119</span>  public Procedure&lt;TEnvironment&gt; getProcedure(final long procId) {<a name="line.1119"></a>
+<span class="sourceLineNo">1120</span>    return procedures.get(procId);<a name="line.1120"></a>
 <span class="sourceLineNo">1121</span>  }<a name="line.1121"></a>
 <span class="sourceLineNo">1122</span><a name="line.1122"></a>
-<span class="sourceLineNo">1123</span>  public Procedure&lt;TEnvironment&gt; getResult(long procId) {<a name="line.1123"></a>
-<span class="sourceLineNo">1124</span>    CompletedProcedureRetainer&lt;TEnvironment&gt; retainer = completed.get(procId);<a name="line.1124"></a>
-<span class="sourceLineNo">1125</span>    if (retainer == null) {<a name="line.1125"></a>
-<span class="sourceLineNo">1126</span>      return null;<a name="line.1126"></a>
-<span class="sourceLineNo">1127</span>    } else {<a name="line.1127"></a>
-<span class="sourceLineNo">1128</span>      return retainer.getProcedure();<a name="line.1128"></a>
-<span class="sourceLineNo">1129</span>    }<a name="line.1129"></a>
-<span class="sourceLineNo">1130</span>  }<a name="line.1130"></a>
-<span class="sourceLineNo">1131</span><a name="line.1131"></a>
-<span class="sourceLineNo">1132</span>  /**<a name="line.1132"></a>
-<span class="sourceLineNo">1133</span>   * Return true if the procedure is finished.<a name="line.1133"></a>
-<span class="sourceLineNo">1134</span>   * The state may be "completed successfully" or "failed and rolledback".<a name="line.1134"></a>
-<span class="sourceLineNo">1135</span>   * Use getResult() to check the state or get the result data.<a name="line.1135"></a>
-<span class="sourceLineNo">1136</span>   * @param procId the ID of the procedure to check<a name="line.1136"></a>
-<span class="sourceLineNo">1137</span>   * @return true if the procedure execution is finished, otherwise false.<a name="line.1137"></a>
-<span class="sourceLineNo">1138</span>   */<a name="line.1138"></a>
-<span class="sourceLineNo">1139</span>  public boolean isFinished(final long procId) {<a name="line.1139"></a>
-<span class="sourceLineNo">1140</span>    return !procedures.containsKey(procId);<a name="line.1140"></a>
-<span class="sourceLineNo">1141</span>  }<a name="line.1141"></a>
-<span class="sourceLineNo">1142</span><a name="line.1142"></a>
-<span class="sourceLineNo">1143</span>  /**<a name="line.1143"></a>
-<span class="sourceLineNo">1144</span>   * Return true if the procedure is started.<a name="line.1144"></a>
-<span class="sourceLineNo">1145</span>   * @param procId the ID of the procedure to check<a name="line.1145"></a>
-<span class="sourceLineNo">1146</span>   * @return true if the procedure execution is started, otherwise false.<a name="line.1146"></a>
-<span class="sourceLineNo">1147</span>   */<a name="line.1147"></a>
-<span class="sourceLineNo">1148</span>  public boolean isStarted(long procId) {<a name="line.1148"></a>
-<span class="sourceLineNo">1149</span>    Procedure&lt;?&gt; proc = procedures.get(procId);<a name="line.1149"></a>
-<span class="sourceLineNo">1150</span>    if (proc == null) {<a name="line.1150"></a>
-<span class="sourceLineNo">1151</span>      return completed.get(procId) != null;<a name="line.1151"></a>
-<span class="sourceLineNo">1152</span>    }<a name="line.1152"></a>
-<span class="sourceLineNo">1153</span>    return proc.wasExecuted();<a name="line.1153"></a>
-<span class="sourceLineNo">1154</span>  }<a name="line.1154"></a>
-<span class="sourceLineNo">1155</span><a name="line.1155"></a>
-<span class="sourceLineNo">1156</span>  /**<a name="line.1156"></a>
-<span class="sourceLineNo">1157</span>   * Mark the specified completed procedure, as ready to remove.<a name="line.1157"></a>
-<span class="sourceLineNo">1158</span>   * @param procId the ID of the procedure to remove<a name="line.1158"></a>
-<span class="sourceLineNo">1159</span>   */<a name="line.1159"></a>
-<span class="sourceLineNo">1160</span>  public void removeResult(long procId) {<a name="line.1160"></a>
-<span class="sourceLineNo">1161</span>    CompletedProcedureRetainer&lt;TEnvironment&gt; retainer = completed.get(procId);<a name="line.1161"></a>
-<span class="sourceLineNo">1162</span>    if (retainer == null) {<a name="line.1162"></a>
-<span class="sourceLineNo">1163</span>      assert !procedures.containsKey(procId) : "pid=" + procId + " is still running";<a name="line.1163"></a>
-<span class="sourceLineNo">1164</span>      LOG.debug("pid={} already removed by the cleaner.", procId);<a name="line.1164"></a>
-<span class="sourceLineNo">1165</span>      return;<a name="line.1165"></a>
-<span class="sourceLineNo">1166</span>    }<a name="line.1166"></a>
-<span class="sourceLineNo">1167</span><a name="line.1167"></a>
-<span class="sourceLineNo">1168</span>    // The CompletedProcedureCleaner will take care of deletion, once the TTL is expired.<a name="line.1168"></a>
-<span class="sourceLineNo">1169</span>    retainer.setClientAckTime(EnvironmentEdgeManager.currentTime());<a name="line.1169"></a>
-<span class="sourceLineNo">1170</span>  }<a name="line.1170"></a>
-<span class="sourceLineNo">1171</span><a name="line.1171"></a>
-<span class="sourceLineNo">1172</span>  public Procedure&lt;TEnvironment&gt; getResultOrProcedure(long procId) {<a name="line.1172"></a>
-<span class="sourceLineNo">1173</span>    CompletedProcedureRetainer&lt;TEnvironment&gt; retainer = completed.get(procId);<a name="line.1173"></a>
-<span class="sourceLineNo">1174</span>    if (retainer == null) {<a name="line.1174"></a>
-<span class="sourceLineNo">1175</span>      return procedures.get(procId);<a name="line.1175"></a>
-<span class="sourceLineNo">1176</span>    } else {<a name="line.1176"></a>
-<span class="sourceLineNo">1177</span>      return retainer.getProcedure();<a name="line.1177"></a>
-<span class="sourceLineNo">1178</span>    }<a name="line.1178"></a>
-<span class="sourceLineNo">1179</span>  }<a name="line.1179"></a>
-<span class="sourceLineNo">1180</span><a name="line.1180"></a>
-<span class="sourceLineNo">1181</span>  /**<a name="line.1181"></a>
-<span class="sourceLineNo">1182</span>   * Check if the user is this procedure's owner<a name="line.1182"></a>
-<span class="sourceLineNo">1183</span>   * @param procId the target procedure<a name="line.1183"></a>
-<span class="sourceLineNo">1184</span>   * @param user the user<a name="line.1184"></a>
-<span class="sourceLineNo">1185</span>   * @return true if the user is the owner of the procedure,<a name="line.1185"></a>
-<span class="sourceLineNo">1186</span>   *   false otherwise or the owner is unknown.<a name="line.1186"></a>
-<span class="sourceLineNo">1187</span>   */<a name="line.1187"></a>
-<span class="sourceLineNo">1188</span>  public boolean isProcedureOwner(long procId, User user) {<a name="line.1188"></a>
-<span class="sourceLineNo">1189</span>    if (user == null) {<a name="line.1189"></a>
-<span class="sourceLineNo">1190</span>      return false;<a name="line.1190"></a>
-<span class="sourceLineNo">1191</span>    }<a name="line.1191"></a>
-<span class="sourceLineNo">1192</span>    final Procedure&lt;TEnvironment&gt; runningProc = procedures.get(procId);<a name="line.1192"></a>
-<span class="sourceLineNo">1193</span>    if (runningProc != null) {<a name="line.1193"></a>
-<span class="sourceLineNo">1194</span>      return runningProc.getOwner().equals(user.getShortName());<a name="line.1194"></a>
-<span class="sourceLineNo">1195</span>    }<a name="line.1195"></a>
-<span class="sourceLineNo">1196</span><a name="line.1196"></a>
-<span class="sourceLineNo">1197</span>    final CompletedProcedureRetainer&lt;TEnvironment&gt; retainer = completed.get(procId);<a name="line.1197"></a>
-<span class="sourceLineNo">1198</span>    if (retainer != null) {<a name="line.1198"></a>
-<span class="sourceLineNo">1199</span>      return retainer.getProcedure().getOwner().equals(user.getShortName());<a name="line.1199"></a>
-<span class="sourceLineNo">1200</span>    }<a name="line.1200"></a>
-<span class="sourceLineNo">1201</span><a name="line.1201"></a>
-<span class="sourceLineNo">1202</span>    // Procedure either does not exist or has already completed and got cleaned up.<a name="line.1202"></a>
-<span class="sourceLineNo">1203</span>    // At this time, we cannot check the owner of the procedure<a name="line.1203"></a>
-<span class="sourceLineNo">1204</span>    return false;<a name="line.1204"></a>
-<span class="sourceLineNo">1205</span>  }<a name="line.1205"></a>
-<span class="sourceLineNo">1206</span><a name="line.1206"></a>
-<span class="sourceLineNo">1207</span>  /**<a name="line.1207"></a>
-<span class="sourceLineNo">1208</span>   * Should only be used when starting up, where the procedure workers have not been started.<a name="line.1208"></a>
-<span class="sourceLineNo">1209</span>   * &lt;p/&gt;<a name="line.1209"></a>
-<span class="sourceLineNo">1210</span>   * If the procedure works has been started, the return values maybe changed when you are<a name="line.1210"></a>
-<span class="sourceLineNo">1211</span>   * processing it so usually this is not safe. Use {@link #getProcedures()} below for most cases as<a name="line.1211"></a>
-<span class="sourceLineNo">1212</span>   * it will do a copy, and also include the finished procedures.<a name="line.1212"></a>
-<span class="sourceLineNo">1213</span>   */<a name="line.1213"></a>
-<span class="sourceLineNo">1214</span>  public Collection&lt;Procedure&lt;TEnvironment&gt;&gt; getActiveProceduresNoCopy() {<a name="line.1214"></a>
-<span class="sourceLineNo">1215</span>    return procedures.values();<a name="line.1215"></a>
-<span class="sourceLineNo">1216</span>  }<a name="line.1216"></a>
-<span class="sourceLineNo">1217</span><a name="line.1217"></a>
-<span class="sourceLineNo">1218</span>  /**<a name="line.1218"></a>
-<span class="sourceLineNo">1219</span>   * Get procedures.<a name="line.1219"></a>
-<span class="sourceLineNo">1220</span>   * @return the procedures in a list<a name="line.1220"></a>
+<span class="sourceLineNo">1123</span>  public &lt;T extends Procedure&lt;TEnvironment&gt;&gt; T getProcedure(Class&lt;T&gt; clazz, long procId) {<a name="line.1123"></a>
+<span class="sourceLineNo">1124</span>    Procedure&lt;TEnvironment&gt; proc = getProcedure(procId);<a name="line.1124"></a>
+<span class="sourceLineNo">1125</span>    if (clazz.isInstance(proc)) {<a name="line.1125"></a>
+<span class="sourceLineNo">1126</span>      return clazz.cast(proc);<a name="line.1126"></a>
+<span class="sourceLineNo">1127</span>    }<a name="line.1127"></a>
+<span class="sourceLineNo">1128</span>    return null;<a name="line.1128"></a>
+<span class="sourceLineNo">1129</span>  }<a name="line.1129"></a>
+<span class="sourceLineNo">1130</span><a name="line.1130"></a>
+<span class="sourceLineNo">1131</span>  public Procedure&lt;TEnvironment&gt; getResult(long procId) {<a name="line.1131"></a>
+<span class="sourceLineNo">1132</span>    CompletedProcedureRetainer&lt;TEnvironment&gt; retainer = completed.get(procId);<a name="line.1132"></a>
+<span class="sourceLineNo">1133</span>    if (retainer == null) {<a name="line.1133"></a>
+<span class="sourceLineNo">1134</span>      return null;<a name="line.1134"></a>
+<span class="sourceLineNo">1135</span>    } else {<a name="line.1135"></a>
+<span class="sourceLineNo">1136</span>      return retainer.getProcedure();<a name="line.1136"></a>
+<span class="sourceLineNo">1137</span>    }<a name="line.1137"></a>
+<span class="sourceLineNo">1138</span>  }<a name="line.1138"></a>
+<span class="sourceLineNo">1139</span><a name="line.1139"></a>
+<span class="sourceLineNo">1140</span>  /**<a name="line.1140"></a>
+<span class="sourceLineNo">1141</span>   * Return true if the procedure is finished.<a name="line.1141"></a>
+<span class="sourceLineNo">1142</span>   * The state may be "completed successfully" or "failed and rolledback".<a name="line.1142"></a>
+<span class="sourceLineNo">1143</span>   * Use getResult() to check the state or get the result data.<a name="line.1143"></a>
+<span class="sourceLineNo">1144</span>   * @param procId the ID of the procedure to check<a name="line.1144"></a>
+<span class="sourceLineNo">1145</span>   * @return true if the procedure execution is finished, otherwise false.<a name="line.1145"></a>
+<span class="sourceLineNo">1146</span>   */<a name="line.1146"></a>
+<span class="sourceLineNo">1147</span>  public boolean isFinished(final long procId) {<a name="line.1147"></a>
+<span class="sourceLineNo">1148</span>    return !procedures.containsKey(procId);<a name="line.1148"></a>
+<span class="sourceLineNo">1149</span>  }<a name="line.1149"></a>
+<span class="sourceLineNo">1150</span><a name="line.1150"></a>
+<span class="sourceLineNo">1151</span>  /**<a name="line.1151"></a>
+<span class="sourceLineNo">1152</span>   * Return true if the procedure is started.<a name="line.1152"></a>
+<span class="sourceLineNo">1153</span>   * @param procId the ID of the procedure to check<a name="line.1153"></a>
+<span class="sourceLineNo">1154</span>   * @return true if the procedure execution is started, otherwise false.<a name="line.1154"></a>
+<span class="sourceLineNo">1155</span>   */<a name="line.1155"></a>
+<span class="sourceLineNo">1156</span>  public boolean isStarted(long procId) {<a name="line.1156"></a>
+<span class="sourceLineNo">1157</span>    Procedure&lt;?&gt; proc = procedures.get(procId);<a name="line.1157"></a>
+<span class="sourceLineNo">1158</span>    if (proc == null) {<a name="line.1158"></a>
+<span class="sourceLineNo">1159</span>      return completed.get(procId) != null;<a name="line.1159"></a>
+<span class="sourceLineNo">1160</span>    }<a name="line.1160"></a>
+<span class="sourceLineNo">1161</span>    return proc.wasExecuted();<a name="line.1161"></a>
+<span class="sourceLineNo">1162</span>  }<a name="line.1162"></a>
+<span class="sourceLineNo">1163</span><a name="line.1163"></a>
+<span class="sourceLineNo">1164</span>  /**<a name="line.1164"></a>
+<span class="sourceLineNo">1165</span>   * Mark the specified completed procedure, as ready to remove.<a name="line.1165"></a>
+<span class="sourceLineNo">1166</span>   * @param procId the ID of the procedure to remove<a name="line.1166"></a>
+<span class="sourceLineNo">1167</span>   */<a name="line.1167"></a>
+<span class="sourceLineNo">1168</span>  public void removeResult(long procId) {<a name="line.1168"></a>
+<span class="sourceLineNo">1169</span>    CompletedProcedureRetainer&lt;TEnvironment&gt; retainer = completed.get(procId);<a name="line.1169"></a>
+<span class="sourceLineNo">1170</span>    if (retainer == null) {<a name="line.1170"></a>
+<span class="sourceLineNo">1171</span>      assert !procedures.containsKey(procId) : "pid=" + procId + " is still running";<a name="line.1171"></a>
+<span class="sourceLineNo">1172</span>      LOG.debug("pid={} already removed by the cleaner.", procId);<a name="line.1172"></a>
+<span class="sourceLineNo">1173</span>      return;<a name="line.1173"></a>
+<span class="sourceLineNo">1174</span>    }<a name="line.1174"></a>
+<span class="sourceLineNo">1175</span><a name="line.1175"></a>
+<span class="sourceLineNo">1176</span>    // The CompletedProcedureCleaner will take care of deletion, once the TTL is expired.<a name="line.1176"></a>
+<span class="sourceLineNo">1177</span>    retainer.setClientAckTime(EnvironmentEdgeManager.currentTime());<a name="line.1177"></a>
+<span class="sourceLineNo">1178</span>  }<a name="line.1178"></a>
+<span class="sourceLineNo">1179</span><a name="line.1179"></a>
+<span class="sourceLineNo">1180</span>  public Procedure&lt;TEnvironment&gt; getResultOrProcedure(long procId) {<a name="line.1180"></a>
+<span class="sourceLineNo">1181</span>    CompletedProcedureRetainer&lt;TEnvironment&gt; retainer = completed.get(procId);<a name="line.1181"></a>
+<span class="sourceLineNo">1182</span>    if (retainer == null) {<a name="line.1182"></a>
+<span class="sourceLineNo">1183</span>      return procedures.get(procId);<a name="line.1183"></a>
+<span class="sourceLineNo">1184</span>    } else {<a name="line.1184"></a>
+<span class="sourceLineNo">1185</span>      return retainer.getProcedure();<a name="line.1185"></a>
+<span class="sourceLineNo">1186</span>    }<a name="line.1186"></a>
+<span class="sourceLineNo">1187</span>  }<a name="line.1187"></a>
+<span class="sourceLineNo">1188</span><a name="line.1188"></a>
+<span class="sourceLineNo">1189</span>  /**<a name="line.1189"></a>
+<span class="sourceLineNo">1190</span>   * Check if the user is this procedure's owner<a name="line.1190"></a>
+<span class="sourceLineNo">1191</span>   * @param procId the target procedure<a name="line.1191"></a>
+<span class="sourceLineNo">1192</span>   * @param user the user<a name="line.1192"></a>
+<span class="sourceLineNo">1193</span>   * @return true if the user is the owner of the procedure,<a name="line.1193"></a>
+<span class="sourceLineNo">1194</span>   *   false otherwise or the owner is unknown.<a name="line.1194"></a>
+<span class="sourceLineNo">1195</span>   */<a name="line.1195"></a>
+<span class="sourceLineNo">1196</span>  public boolean isProcedureOwner(long procId, User user) {<a name="line.1196"></a>
+<span class="sourceLineNo">1197</span>    if (user == null) {<a name="line.1197"></a>
+<span class="sourceLineNo">1198</span>      return false;<a name="line.1198"></a>
+<span class="sourceLineNo">1199</span>    }<a name="line.1199"></a>
+<span class="sourceLineNo">1200</span>    final Procedure&lt;TEnvironment&gt; runningProc = procedures.get(procId);<a name="line.1200"></a>
+<span class="sourceLineNo">1201</span>    if (runningProc != null) {<a name="line.1201"></a>
+<span class="sourceLineNo">1202</span>      return runningProc.getOwner().equals(user.getShortName());<a name="line.1202"></a>
+<span class="sourceLineNo">1203</span>    }<a name="line.1203"></a>
+<span class="sourceLineNo">1204</span><a name="line.1204"></a>
+<span class="sourceLineNo">1205</span>    final CompletedProcedureRetainer&lt;TEnvironment&gt; retainer = completed.get(procId);<a name="line.1205"></a>
+<span class="sourceLineNo">1206</span>    if (retainer != null) {<a name="line.1206"></a>
+<span class="sourceLineNo">1207</span>      return retainer.getProcedure().getOwner().equals(user.getShortName());<a name="line.1207"></a>
+<span class="sourceLineNo">1208</span>    }<a name="line.1208"></a>
+<span class="sourceLineNo">1209</span><a name="line.1209"></a>
+<span class="sourceLineNo">1210</span>    // Procedure either does not exist or has already completed and got cleaned up.<a name="line.1210"></a>
+<span class="sourceLineNo">1211</span>    // At this time, we cannot check the owner of the procedure<a name="line.1211"></a>
+<span class="sourceLineNo">1212</span>    return false;<a name="line.1212"></a>
+<span class="sourceLineNo">1213</span>  }<a name="line.1213"></a>
+<span class="sourceLineNo">1214</span><a name="line.1214"></a>
+<span class="sourceLineNo">1215</span>  /**<a name="line.1215"></a>
+<span class="sourceLineNo">1216</span>   * Should only be used when starting up, where the procedure workers have not been started.<a name="line.1216"></a>
+<span class="sourceLineNo">1217</span>   * &lt;p/&gt;<a name="line.1217"></a>
+<span class="sourceLineNo">1218</span>   * If the procedure works has been started, the return values maybe changed when you are<a name="line.1218"></a>
+<span class="sourceLineNo">1219</span>   * processing it so usually this is not safe. Use {@link #getProcedures()} below for most cases as<a name="line.1219"></a>
+<span class="sourceLineNo">1220</span>   * it will do a copy, and also include the finished procedures.<a name="line.1220"></a>
 <span class="sourceLineNo">1221</span>   */<a name="line.1221"></a>
-<span class="sourceLineNo">1222</span>  public List&lt;Procedure&lt;TEnvironment&gt;&gt; getProcedures() {<a name="line.1222"></a>
-<span class="sourceLineNo">1223</span>    List&lt;Procedure&lt;TEnvironment&gt;&gt; procedureList =<a name="line.1223"></a>
-<span class="sourceLineNo">1224</span>      new ArrayList&lt;&gt;(procedures.size() + completed.size());<a name="line.1224"></a>
-<span class="sourceLineNo">1225</span>    procedureList.addAll(procedures.values());<a name="line.1225"></a>
-<span class="sourceLineNo">1226</span>    // Note: The procedure could show up twice in the list with different state, as<a name="line.1226"></a>
-<span class="sourceLineNo">1227</span>    // it could complete after we walk through procedures list and insert into<a name="line.1227"></a>
-<span class="sourceLineNo">1228</span>    // procedureList - it is ok, as we will use the information in the Procedure<a name="line.1228"></a>
-<span class="sourceLineNo">1229</span>    // to figure it out; to prevent this would increase the complexity of the logic.<a name="line.1229"></a>
-<span class="sourceLineNo">1230</span>    completed.values().stream().map(CompletedProcedureRetainer::getProcedure)<a name="line.1230"></a>
-<span class="sourceLineNo">1231</span>      .forEach(procedureList::add);<a name="line.1231"></a>
-<span class="sourceLineNo">1232</span>    return procedureList;<a name="line.1232"></a>
-<span class="sourceLineNo">1233</span>  }<a name="line.1233"></a>
-<span class="sourceLineNo">1234</span><a name="line.1234"></a>
-<span class="sourceLineNo">1235</span>  // ==========================================================================<a name="line.1235"></a>
-<span class="sourceLineNo">1236</span>  //  Listeners helpers<a name="line.1236"></a>
-<span class="sourceLineNo">1237</span>  // ==========================================================================<a name="line.1237"></a>
-<span class="sourceLineNo">1238</span>  public void registerListener(ProcedureExecutorListener listener) {<a name="line.1238"></a>
-<span class="sourceLineNo">1239</span>    this.listeners.add(listener);<a name="line.1239"></a>
-<span class="sourceLineNo">1240</span>  }<a name="line.1240"></a>
-<span class="sourceLineNo">1241</span><a name="line.1241"></a>
-<span class="sourceLineNo">1242</span>  public boolean unregisterListener(ProcedureExecutorListener listener) {<a name="line.1242"></a>
-<span class="sourceLineNo">1243</span>    return this.listeners.remove(listener);<a name="line.1243"></a>
-<span class="sourceLineNo">1244</span>  }<a name="line.1244"></a>
-<span class="sourceLineNo">1245</span><a name="line.1245"></a>
-<span class="sourceLineNo">1246</span>  private void sendProcedureLoadedNotification(final long procId) {<a name="line.1246"></a>
-<span class="sourceLineNo">1247</span>    if (!this.listeners.isEmpty()) {<a name="line.1247"></a>
-<span class="sourceLineNo">1248</span>      for (ProcedureExecutorListener listener: this.listeners) {<a name="line.1248"></a>
-<span class="sourceLineNo">1249</span>        try {<a name="line.1249"></a>
-<span class="sourceLineNo">1250</span>          listener.procedureLoaded(procId);<a name="line.1250"></a>
-<span class="sourceLineNo">1251</span>        } catch (Throwable e) {<a name="line.1251"></a>
-<span class="sourceLineNo">1252</span>          LOG.error("Listener " + listener + " had an error: " + e.getMessage(), e);<a name="line.1252"></a>
-<span class="sourceLineNo">1253</span>        }<a name="line.1253"></a>
-<span class="sourceLineNo">1254</span>      }<a name="line.1254"></a>
-<span class="sourceLineNo">1255</span>    }<a name="line.1255"></a>
-<span class="sourceLineNo">1256</span>  }<a name="line.1256"></a>
-<span class="sourceLineNo">1257</span><a name="line.1257"></a>
-<span class="sourceLineNo">1258</span>  private void sendProcedureAddedNotification(final long procId) {<a name="line.1258"></a>
-<span class="sourceLineNo">1259</span>    if (!this.listeners.isEmpty()) {<a name="line.1259"></a>
-<span class="sourceLineNo">1260</span>      for (ProcedureExecutorListener listener: this.listeners) {<a name="line.1260"></a>
-<span class="sourceLineNo">1261</span>        try {<a name="line.1261"></a>
-<span class="sourceLineNo">1262</span>          listener.procedureAdded(procId);<a name="line.1262"></a>
-<span class="sourceLineNo">1263</span>        } catch (Throwable e) {<a name="line.1263"></a>
-<span class="sourceLineNo">1264</span>          LOG.error("Listener " + listener + " had an error: " + e.getMessage(), e);<a name="line.1264"></a>
-<span class="sourceLineNo">1265</span>        }<a name="line.1265"></a>
-<span class="sourceLineNo">1266</span>      }<a name="line.1266"></a>
-<span class="sourceLineNo">1267</span>    }<a name="line.1267"></a>
-<span class="sourceLineNo">1268</span>  }<a name="line.1268"></a>
-<span class="sourceLineNo">1269</span><a name="line.1269"></a>
-<span class="sourceLineNo">1270</span>  private void sendProcedureFinishedNotification(final long procId) {<a name="line.1270"></a>
-<span class="sourceLineNo">1271</span>    if (!this.listeners.isEmpty()) {<a name="line.1271"></a>
-<span class="sourceLineNo">1272</span>      for (ProcedureExecutorListener listener: this.listeners) {<a name="line.1272"></a>
-<span class="sourceLineNo">1273</span>        try {<a name="line.1273"></a>
-<span class="sourceLineNo">1274</span>          listener.procedureFinished(procId);<a name="line.1274"></a>
-<span class="sourceLineNo">1275</span>        } catch (Throwable e) {<a name="line.1275"></a>
-<span class="sourceLineNo">1276</span>          LOG.error("Listener " + listener + " had an error: " + e.getMessage(), e);<a name="line.1276"></a>
-<span class="sourceLineNo">1277</span>        }<a name="line.1277"></a>
-<span class="sourceLineNo">1278</span>      }<a name="line.1278"></a>
-<span class="sourceLineNo">1279</span>    }<a name="line.1279"></a>
-<span class="sourceLineNo">1280</span>  }<a name="line.1280"></a>
-<span class="sourceLineNo">1281</span><a name="line.1281"></a>
-<span class="sourceLineNo">1282</span>  // ==========================================================================<a name="line.1282"></a>
-<span class="sourceLineNo">1283</span>  //  Procedure IDs helpers<a name="line.1283"></a>
-<span class="sourceLineNo">1284</span>  // ==========================================================================<a name="line.1284"></a>
-<span class="sourceLineNo">1285</span>  private long nextProcId() {<a name="line.1285"></a>
-<span class="sourceLineNo">1286</span>    long procId = lastProcId.incrementAndGet();<a name="line.1286"></a>
-<span class="sourceLineNo">1287</span>    if (procId &lt; 0) {<a name="line.1287"></a>
-<span class="sourceLineNo">1288</span>      while (!lastProcId.compareAndSet(procId, 0)) {<a name="line.1288"></a>
-<span class="sourceLineNo">1289</span>        procId = lastProcId.get();<a name="line.1289"></a>
-<span class="sourceLineNo">1290</span>        if (procId &gt;= 0)<a name="line.1290"></a>
-<span class="sourceLineNo">1291</span>          break;<a name="line.1291"></a>
-<span class="sourceLineNo">1292</span>      }<a name="line.1292"></a>
-<span class="sourceLineNo">1293</span>      while (procedures.containsKey(procId)) {<a name="line.1293"></a>
-<span class="sourceLineNo">1294</span>        procId = lastProcId.incrementAndGet();<a name="line.1294"></a>
-<span class="sourceLineNo">1295</span>      }<a name="line.1295"></a>
-<span class="sourceLineNo">1296</span>    }<a name="line.1296"></a>
-<span class="sourceLineNo">1297</span>    assert procId &gt;= 0 : "Invalid procId " + procId;<a name="line.1297"></a>
-<span class="sourceLineNo">1298</span>    return procId;<a name="line.1298"></a>
-<span class="sourceLineNo">1299</span>  }<a name="line.1299"></a>
-<span class="sourceLineNo">1300</span><a name="line.1300"></a>
-<span class="sourceLineNo">1301</span>  @VisibleForTesting<a name="line.1301"></a>
-<span class="sourceLineNo">1302</span>  protected long getLastProcId() {<a name="line.1302"></a>
-<span class="sourceLineNo">1303</span>    return lastProcId.get();<a name="line.1303"></a>
-<span class="sourceLineNo">1304</span>  }<a name="line.1304"></a>
-<span class="sourceLineNo">1305</span><a name="line.1305"></a>
-<span class="sourceLineNo">1306</span>  @VisibleForTesting<a name="line.1306"></a>
-<span class="sourceLineNo">1307</span>  public Set&lt;Long&gt; getActiveProcIds() {<a name="line.1307"></a>
-<span class="sourceLineNo">1308</span>    return procedures.keySet();<a name="line.1308"></a>
-<span class="sourceLineNo">1309</span>  }<a name="line.1309"></a>
-<span class="sourceLineNo">1310</span><a name="line.1310"></a>
-<span class="sourceLineNo">1311</span>  Long getRootProcedureId(Procedure&lt;TEnvironment&gt; proc) {<a name="line.1311"></a>
-<span class="sourceLineNo">1312</span>    return Procedure.getRootProcedureId(procedures, proc);<a name="line.1312"></a>
-<span class="sourceLineNo">1313</span>  }<a name="line.1313"></a>
-<span class="sourceLineNo">1314</span><a name="line.1314"></a>
-<span class="sourceLineNo">1315</span>  // ==========================================================================<a name="line.1315"></a>
-<span class="sourceLineNo">1316</span>  //  Executions<a name="line.1316"></a>
-<span class="sourceLineNo">1317</span>  // ==========================================================================<a name="line.1317"></a>
-<span class="sourceLineNo">1318</span>  private void executeProcedure(Procedure&lt;TEnvironment&gt; proc) {<a name="line.1318"></a>
-<span class="sourceLineNo">1319</span>    if (proc.isFinished()) {<a name="line.1319"></a>
-<span class="sourceLineNo">1320</span>      LOG.debug("{} is already finished, skipping execution", proc);<a name="line.1320"></a>
-<span class="sourceLineNo">1321</span>      return;<a name="line.1321"></a>
-<span class="sourceLineNo">1322</span>    }<a name="line.1322"></a>
-<span class="sourceLineNo">1323</span>    final Long rootProcId = getRootProcedureId(proc);<a name="line.1323"></a>
-<span class="sourceLineNo">1324</span>    if (rootProcId == null) {<a name="line.1324"></a>
-<span class="sourceLineNo">1325</span>      // The 'proc' was ready to run but the root procedure was rolledback<a name="line.1325"></a>
-<span class="sourceLineNo">1326</span>      LOG.warn("Rollback because parent is done/rolledback proc=" + proc);<a name="line.1326"></a>
-<span class="sourceLineNo">1327</span>      executeRollback(proc);<a name="line.1327"></a>
-<span class="sourceLineNo">1328</span>      return;<a name="line.1328"></a>
-<span class="sourceLineNo">1329</span>    }<a name="line.1329"></a>
-<span class="sourceLineNo">1330</span><a name="line.1330"></a>
-<span class="sourceLineNo">1331</span>    RootProcedureState&lt;TEnvironment&gt; procStack = rollbackStack.get(rootProcId);<a name="line.1331"></a>
-<span class="sourceLineNo">1332</span>    if (procStack == null) {<a name="line.1332"></a>
-<span class="sourceLineNo">1333</span>      LOG.warn("RootProcedureState is null for " + proc.getProcId());<a name="line.1333"></a>
-<span class="sourceLineNo">1334</span>      return;<a name="line.1334"></a>
-<span class="sourceLineNo">1335</span>    }<a name="line.1335"></a>
-<span class="sourceLineNo">1336</span>    do {<a name="line.1336"></a>
-<span class="sourceLineNo">1337</span>      // Try to acquire the execution<a name="line.1337"></a>
-<span class="sourceLineNo">1338</span>      if (!procStack.acquire(proc)) {<a name="line.1338"></a>
-<span class="sourceLineNo">1339</span>        if (procStack.setRollback()) {<a name="line.1339"></a>
-<span class="sourceLineNo">1340</span>          // we have the 'rollback-lock' we can start rollingback<a name="line.1340"></a>
-<span class="sourceLineNo">1341</span>          switch (executeRollback(rootProcId, procStack)) {<a name="line.1341"></a>
-<span class="sourceLineNo">1342</span>            case LOCK_ACQUIRED:<a name="line.1342"></a>
-<span class="sourceLineNo">1343</span>              break;<a name="line.1343"></a>
-<span class="sourceLineNo">1344</span>            case LOCK_YIELD_WAIT:<a name="line.1344"></a>
-<span class="sourceLineNo">1345</span>              procStack.unsetRollback();<a name="line.1345"></a>
-<span class="sourceLineNo">1346</span>              scheduler.yield(proc);<a name="line.1346"></a>
-<span class="sourceLineNo">1347</span>              break;<a name="line.1347"></a>
-<span class="sourceLineNo">1348</span>            case LOCK_EVENT_WAIT:<a name="line.1348"></a>
-<span class="sourceLineNo">1349</span>              LOG.info("LOCK_EVENT_WAIT rollback..." + proc);<a name="line.1349"></a>
-<span class="sourceLineNo">1350</span>              procStack.unsetRollback();<a name="line.1350"></a>
+<span class="sourceLineNo">1222</span>  public Collection&lt;Procedure&lt;TEnvironment&gt;&gt; getActiveProceduresNoCopy() {<a name="line.1222"></a>
+<span class="sourceLineNo">1223</span>    return procedures.values();<a name="line.1223"></a>
+<span class="sourceLineNo">1224</span>  }<a name="line.1224"></a>
+<span class="sourceLineNo">1225</span><a name="line.1225"></a>
+<span class="sourceLineNo">1226</span>  /**<a name="line.1226"></a>
+<span class="sourceLineNo">1227</span>   * Get procedures.<a name="line.1227"></a>
+<span class="sourceLineNo">1228</span>   * @return the procedures in a list<a name="line.1228"></a>
+<span class="sourceLineNo">1229</span>   */<a name="line.1229"></a>
+<span class="sourceLineNo">1230</span>  public List&lt;Procedure&lt;TEnvironment&gt;&gt; getProcedures() {<a name="line.1230"></a>
+<span class="sourceLineNo">1231</span>    List&lt;Procedure&lt;TEnvironment&gt;&gt; procedureList =<a name="line.1231"></a>
+<span class="sourceLineNo">1232</span>      new ArrayList&lt;&gt;(procedures.size() + completed.size());<a name="line.1232"></a>
+<span class="sourceLineNo">1233</span>    procedureList.addAll(procedures.values());<a name="line.1233"></a>
+<span class="sourceLineNo">1234</span>    // Note: The procedure could show up twice in the list with different state, as<a name="line.1234"></a>
+<span class="sourceLineNo">1235</span>    // it could complete after we walk through procedures list and insert into<a name="line.1235"></a>
+<span class="sourceLineNo">1236</span>    // procedureList - it is ok, as we will use the information in the Procedure<a name="line.1236"></a>
+<span class="sourceLineNo">1237</span>    // to figure it out; to prevent this would increase the complexity of the logic.<a name="line.1237"></a>
+<span class="sourceLineNo">1238</span>    completed.values().stream().map(CompletedProcedureRetainer::getProcedure)<a name="line.1238"></a>
+<span class="sourceLineNo">1239</span>      .forEach(procedureList::add);<a name="line.1239"></a>
+<span class="sourceLineNo">1240</span>    return procedureList;<a name="line.1240"></a>
+<span class="sourceLineNo">1241</span>  }<a name="line.1241"></a>
+<span class="sourceLineNo">1242</span><a name="line.1242"></a>
+<span class="sourceLineNo">1243</span>  // ==========================================================================<a name="line.1243"></a>
+<span class="sourceLineNo">1244</span>  //  Listeners helpers<a name="line.1244"></a>
+<span class="sourceLineNo">1245</span>  // ==========================================================================<a name="line.1245"></a>
+<span class="sourceLineNo">1246</span>  public void registerListener(ProcedureExecutorListener listener) {<a name="line.1246"></a>
+<span class="sourceLineNo">1247</span>    this.listeners.add(listener);<a name="line.1247"></a>
+<span class="sourceLineNo">1248</span>  }<a name="line.1248"></a>
+<span class="sourceLineNo">1249</span><a name="line.1249"></a>
+<span class="sourceLineNo">1250</span>  public boolean unregisterListener(ProcedureExecutorListener listener) {<a name="line.1250"></a>
+<span class="sourceLineNo">1251</span>    return this.listeners.remove(listener);<a name="line.1251"></a>
+<span class="sourceLineNo">1252</span>  }<a name="line.1252"></a>
+<span class="sourceLineNo">1253</span><a name="line.1253"></a>
+<span class="sourceLineNo">1254</span>  private void sendProcedureLoadedNotification(final long procId) {<a name="line.1254"></a>
+<span class="sourceLineNo">1255</span>    if (!this.listeners.isEmpty()) {<a name="line.1255"></a>
+<span class="sourceLineNo">1256</span>      for (ProcedureExecutorListener listener: this.listeners) {<a name="line.1256"></a>
+<span class="sourceLineNo">1257</span>        try {<a name="line.1257"></a>
+<span class="sourceLineNo">1258</span>          listener.procedureLoaded(procId);<a name="line.1258"></a>
+<span class="sourceLineNo">1259</span>        } catch (Throwable e) {<a name="line.1259"></a>
+<span class="sourceLineNo">1260</span>          LOG.error("Listener " + listener + " had an error: " + e.getMessage(), e);<a name="line.1260"></a>
+<span class="sourceLineNo">1261</span>        }<a name="line.1261"></a>
+<span class="sourceLineNo">1262</span>      }<a name="line.1262"></a>
+<span class="sourceLineNo">1263</span>    }<a name="line.1263"></a>
+<span class="sourceLineNo">1264</span>  }<a name="line.1264"></a>
+<span class="sourceLineNo">1265</span><a name="line.1265"></a>
+<span class="sourceLineNo">1266</span>  private void sendProcedureAddedNotification(final long procId) {<a name="line.1266"></a>
+<span class="sourceLineNo">1267</span>    if (!this.listeners.isEmpty()) {<a name="line.1267"></a>
+<span class="sourceLineNo">1268</span>      for (ProcedureExecutorListener listener: this.listeners) {<a name="line.1268"></a>
+<span class="sourceLineNo">1269</span>        try {<a name="line.1269"></a>
+<span class="sourceLineNo">1270</span>          listener.procedureAdded(procId);<a name="line.1270"></a>
+<span class="sourceLineNo">1271</span>        } catch (Throwable e) {<a name="line.1271"></a>
+<span class="sourceLineNo">1272</span>          LOG.error("Listener " + listener + " had an error: " + e.getMessage(), e);<a name="line.1272"></a>
+<span class="sourceLineNo">1273</span>        }<a name="line.1273"></a>
+<span class="sourceLineNo">1274</span>      }<a name="line.1274"></a>
+<span class="sourceLineNo">1275</span>    }<a name="line.1275"></a>
+<span class="sourceLineNo">1276</span>  }<a name="line.1276"></a>
+<span class="sourceLineNo">1277</span><a name="line.1277"></a>
+<span class="sourceLineNo">1278</span>  private void sendProcedureFinishedNotification(final long procId) {<a name="line.1278"></a>
+<span class="sourceLineNo">1279</span>    if (!this.listeners.isEmpty()) {<a name="line.1279"></a>
+<span class="sourceLineNo">1280</span>      for (ProcedureExecutorListener listener: this.listeners) {<a name="line.1280"></a>
+<span class="sourceLineNo">1281</span>        try {<a name="line.1281"></a>
+<span class="sourceLineNo">1282</span>          listener.procedureFinished(procId);<a name="line.1282"></a>
+<span class="sourceLineNo">1283</span>        } catch (Throwable e) {<a name="line.1283"></a>
+<span class="sourceLineNo">1284</span>          LOG.error("Listener " + listener + " had an error: " + e.getMessage(), e);<a name="line.1284"></a>
+<span class="sourceLineNo">1285</span>        }<a name="line.1285"></a>
+<span class="sourceLineNo">1286</span>      }<a name="line.1286"></a>
+<span class="sourceLineNo">1287</span>    }<a name="line.1287"></a>
+<span class="sourceLineNo">1288</span>  }<a name="line.1288"></a>
+<span class="sourceLineNo">1289</span><a name="line.1289"></a>
+<span class="sourceLineNo">1290</span>  // ==========================================================================<a name="line.1290"></a>
+<span class="sourceLineNo">1291</span>  //  Procedure IDs helpers<a name="line.1291"></a>
+<span class="sourceLineNo">1292</span>  // ==========================================================================<a name="line.1292"></a>
+<span class="sourceLineNo">1293</span>  private long nextProcId() {<a name="line.1293"></a>
+<span class="sourceLineNo">1294</span>    long procId = lastProcId.incrementAndGet();<a name="line.1294"></a>
+<span class="sourceLineNo">1295</span>    if (procId &lt; 0) {<a name="line.1295"></a>
+<span class="sourceLineNo">1296</span>      while (!lastProcId.compareAndSet(procId, 0)) {<a name="line.1296"></a>
+<span class="sourceLineNo">1297</span>        procId = lastProcId.get();<a name="line.1297"></a>
+<span class="sourceLineNo">1298</span>        if (procId &gt;= 0)<a name="line.1298"></a>
+<span class="sourceLineNo">1299</span>          break;<a name="line.1299"></a>
+<span class="sourceLineNo">1300</span>      }<a name="line.1300"></a>
+<span class="sourceLineNo">1301</span>      while (procedures.containsKey(procId)) {<a name="line.1301"></a>
+<span class="sourceLineNo">1302</span>        procId = lastProcId.incrementAndGet();<a name="line.1302"></a>
+<span class="sourceLineNo">1303</span>      }<a name="line.1303"></a>
+<span class="sourceLineNo">1304</span>    }<a name="line.1304"></a>
+<span class="sourceLineNo">1305</span>    assert procId &gt;= 0 : "Invalid procId " + procId;<a name="line.1305"></a>
+<span class="sourceLineNo">1306</span>    return procId;<a name="line.1306"></a>
+<span class="sourceLineNo">1307</span>  }<a name="line.1307"></a>
+<span class="sourceLineNo">1308</span><a name="line.1308"></a>
+<span class="sourceLineNo">1309</span>  @VisibleForTesting<a name="line.1309"></a>
+<span class="sourceLineNo">1310</span>  protected long getLastProcId() {<a name="line.1310"></a>
+<span class="sourceLineNo">1311</span>    return lastProcId.get();<a name="line.1311"></a>
+<span class="sourceLineNo">1312</span>  }<a name="line.1312"></a>
+<span class="sourceLineNo">1313</span><a name="line.1313"></a>
+<span class="sourceLineNo">1314</span>  @VisibleForTesting<a name="line.1314"></a>
+<span class="sourceLineNo">1315</span>  public Set&lt;Long&gt; getActiveProcIds() {<a name="line.1315"></a>
+<span class="sourceLineNo">1316</span>    return procedures.keySet();<a name="line.1316"></a>
+<span class="sourceLineNo">1317</span>  }<a name="line.1317"></a>
+<span class="sourceLineNo">1318</span><a name="line.1318"></a>
+<span class="sourceLineNo">1319</span>  Long getRootProcedureId(Procedure&lt;TEnvironment&gt; proc) {<a name="line.1319"></a>
+<span class="sourceLineNo">1320</span>    return Procedure.getRootProcedureId(procedures, proc);<a name="line.1320"></a>
+<span class="sourceLineNo">1321</span>  }<a name="line.1321"></a>
+<span class="sourceLineNo">1322</span><a name="line.1322"></a>
+<span class="sourceLineNo">1323</span>  // ==========================================================================<a name="line.1323"></a>
+<span class="sourceLineNo">1324</span>  //  Executions<a name="line.1324"></a>
+<span class="sourceLineNo">1325</span>  // ==========================================================================<a name="line.1325"></a>
+<span class="sourceLineNo">1326</span>  private void executeProcedure(Procedure&lt;TEnvironment&gt; proc) {<a name="line.1326"></a>
+<span class="sourceLineNo">1327</span>    if (proc.isFinished()) {<a name="line.1327"></a>
+<span class="sourceLineNo">1328</span>      LOG.debug("{} is already finished, skipping execution", proc);<a name="line.1328"></a>
+<span class="sourceLineNo">1329</span>      return;<a name="line.1329"></a>
+<span class="sourceLineNo">1330</span>    }<a name="line.1330"></a>
+<span class="sourceLineNo">1331</span>    final Long rootProcId = getRootProcedureId(proc);<a name="line.1331"></a>
+<span class="sourceLineNo">1332</span>    if (rootProcId == null) {<a name="line.1332"></a>
+<span class="sourceLineNo">1333</span>      // The 'proc' was ready to run but the root procedure was rolledback<a name="line.1333"></a>
+<span class="sourceLineNo">1334</span>      LOG.warn("Rollback because parent is done/rolledback proc=" + proc);<a name="line.1334"></a>
+<span class="sourceLineNo">1335</span>      executeRollback(proc);<a name="line.1335"></a>
+<span class="sourceLineNo">1336</span>      return;<a name="line.1336"></a>
+<span class="sourceLineNo">1337</span>    }<a name="line.1337"></a>
+<span class="sourceLineNo">1338</span><a name="line.1338"></a>
+<span class="sourceLineNo">1339</span>    RootProcedureState&lt;TEnvironment&gt; procStack = rollbackStack.get(rootProcId);<a name="line.1339"></a>
+<span class="sourceLineNo">1340</span>    if (procStack == null) {<a name="line.1340"></a>
+<span class="sourceLineNo">1341</span>      LOG.warn("RootProcedureState is null for " + proc.getProcId());<a name="line.1341"></a>
+<span class="sourceLineNo">1342</span>      return;<a name="line.1342"></a>
+<span class="sourceLineNo">1343</span>    }<a name="line.1343"></a>
+<span class="sourceLineNo">1344</span>    do {<a name="line.1344"></a>
+<span class="sourceLineNo">1345</span>      // Try to acquire the execution<a name="line.1345"></a>
+<span class="sourceLineNo">1346</span>      if (!procStack.acquire(proc)) {<a name="line.1346"></a>
+<span class="sourceLineNo">1347</span>        if (procStack.setRollback()) {<a name="line.1347"></a>
+<span class="sourceLineNo">1348</span>          // we have the 'rollback-lock' we can start rollingback<a name="line.1348"></a>
+<span class="sourceLineNo">1349</span>          switch (executeRollback(rootProcId, procStack)) {<a name="line.1349"></a>
+<span class="sourceLineNo">1350</span>            case LOCK_ACQUIRED:<a name="line.1350"></a>
 <span class="sourceLineNo">1351</span>              break;<a name="line.1351"></a>
-<span class="sourceLineNo">1352</span>            default:<a name="line.1352"></a>
-<span class="sourceLineNo">1353</span>              throw new UnsupportedOperationException();<a name="line.1353"></a>
-<span class="sourceLineNo">1354</span>          }<a name="line.1354"></a>
-<span class="sourceLineNo">1355</span>        } else {<a name="line.1355"></a>
-<span class="sourceLineNo">1356</span>          // if we can't rollback means that some child is still running.<a name="line.1356"></a>
-<span class="sourceLineNo">1357</span>          // the rollback will be executed after all the children are done.<a name="line.1357"></a>
-<span class="sourceLineNo">1358</span>          // If the procedure was never executed, remove and mark it as rolledback.<a name="line.1358"></a>
-<span class="sourceLineNo">1359</span>          if (!proc.wasExecuted()) {<a name="line.1359"></a>
-<span class="sourceLineNo">1360</span>            switch (executeRollback(proc)) {<a name="line.1360"></a>
-<span class="sourceLineNo">1361</span>              case LOCK_ACQUIRED:<a name="line.1361"></a>
-<span class="sourceLineNo">1362</span>                break;<a name="line.1362"></a>
-<span class="sourceLineNo">1363</span>              case LOCK_YIELD_WAIT:<a name="line.1363"></a>
-<span class="sourceLineNo">1364</span>                scheduler.yield(proc);<a name="line.1364"></a>
-<span class="sourceLineNo">1365</span>                break;<a name="line.1365"></a>
-<span class="sourceLineNo">1366</span>              case LOCK_EVENT_WAIT:<a name="line.1366"></a>
-<span class="sourceLineNo">1367</span>                LOG.info("LOCK_EVENT_WAIT can't rollback child running?..." + proc);<a name="line.1367"></a>
-<span class="sourceLineNo">1368</span>                break;<a name="line.1368"></a>
-<span class="sourceLineNo">1369</span>              default:<a name="line.1369"></a>
-<span class="sourceLineNo">1370</span>                throw new UnsupportedOperationException();<a name="line.1370"></a>
-<span class="sourceLineNo">1371</span>            }<a name="line.1371"></a>
-<span class="sourceLineNo">1372</span>          }<a name="line.1372"></a>
-<span class="sourceLineNo">1373</span>        }<a name="line.1373"></a>
-<span class="sourceLineNo">1374</span>        break;<a name="line.1374"></a>
-<span class="sourceLineNo">1375</span>      }<a name="line.1375"></a>
-<span class="sourceLineNo">1376</span><a name="line.1376"></a>
-<span class="sourceLineNo">1377</span>      // Execute the procedure<a name="line.1377"></a>
-<span class="sourceLineNo">1378</span>      assert proc.getState() == ProcedureState.RUNNABLE : proc;<a name="line.1378"></a>
-<span class="sourceLineNo">1379</span>      // Note that lock is NOT about concurrency but rather about ensuring<a name="line.1379"></a>
-<span class="sourceLineNo">1380</span>      // ownership of a procedure of an entity such as a region or table<a name="line.1380"></a>
-<span class="sourceLineNo">1381</span>      LockState lockState = acquireLock(proc);<a name="line.1381"></a>
-<span class="sourceLineNo">1382</span>      switch (lockState) {<a name="line.1382"></a>
-<span class="sourceLineNo">1383</span>        case LOCK_ACQUIRED:<a name="line.1383"></a>
-<span class="sourceLineNo">1384</span>          execProcedure(procStack, proc);<a name="line.1384"></a>
-<span class="sourceLineNo">1385</span>          break;<a name="line.1385"></a>
-<span class="sourceLineNo">1386</span>        case LOCK_YIELD_WAIT:<a name="line.1386"></a>
-<span class="sourceLineNo">1387</span>          LOG.info(lockState + " " + proc);<a name="line.1387"></a>
-<span class="sourceLineNo">1388</span>          scheduler.yield(proc);<a name="line.1388"></a>
-<span class="sourceLineNo">1389</span>          break;<a name="line.1389"></a>
-<span class="sourceLineNo">1390</span>        case LOCK_EVENT_WAIT:<a name="line.1390"></a>
-<span class="sourceLineNo">1391</span>          // Someone will wake us up when the lock is available<a name="line.1391"></a>
-<span class="sourceLineNo">1392</span>          LOG.debug(lockState + " " + proc);<a name="line.1392"></a>
+<span class="sourceLineNo">1352</span>            case LOCK_YIELD_WAIT:<a name="line.1352"></a>
+<span class="sourceLineNo">1353</span>              procStack.unsetRollback();<a name="line.1353"></a>
+<span class="sourceLineNo">1354</span>              scheduler.yield(proc);<a name="line.1354"></a>
+<span class="sourceLineNo">1355</span>              break;<a name="line.1355"></a>
+<span class="sourceLineNo">1356</span>            case LOCK_EVENT_WAIT:<a name="line.1356"></a>
+<span class="sourceLineNo">1357</span>              LOG.info("LOCK_EVENT_WAIT rollback..." + proc);<a name="line.1357"></a>
+<span class="sourceLineNo">1358</span>              procStack.unsetRollback();<a name="line.1358"></a>
+<span class="sourceLineNo">1359</span>              break;<a name="line.1359"></a>
+<span class="sourceLineNo">1360</span>            default:<a name="line.1360"></a>
+<span class="sourceLineNo">1361</span>              throw new UnsupportedOperationException();<a name="line.1361"></a>
+<span class="sourceLineNo">1362</span>          }<a name="line.1362"></a>
+<span class="sourceLineNo">1363</span>        } else {<a name="line.1363"></a>
+<span class="sourceLineNo">1364</span>          // if we can't rollback means that some child is still running.<a name="line.1364"></a>
+<span class="sourceLineNo">1365</span>          // the rollback will be executed after all the children are done.<a name="line.1365"></a>
+<span class="sourceLineNo">1366</span>          // If the procedure was never executed, remove and mark it as rolledback.<a name="line.1366"></a>
+<span class="sourceLineNo">1367</span>          if (!proc.wasExecuted()) {<a name="line.1367"></a>
+<span class="sourceLineNo">1368</span>            switch (executeRollback(proc)) {<a name="line.1368"></a>
+<span class="sourceLineNo">1369</span>              case LOCK_ACQUIRED:<a name="line.1369"></a>
+<span class="sourceLineNo">1370</span>                break;<a name="line.1370"></a>
+<span class="sourceLineNo">1371</span>              case LOCK_YIELD_WAIT:<a name="line.1371"></a>
+<span class="sourceLineNo">1372</span>                scheduler.yield(proc);<a name="line.1372"></a>
+<span class="sourceLineNo">1373</span>                break;<a name="line.1373"></a>
+<span class="sourceLineNo">1374</span>              case LOCK_EVENT_WAIT:<a name="line.1374"></a>
+<span class="sourceLineNo">1375</span>                LOG.info("LOCK_EVENT_WAIT can't rollback child running?..." + proc);<a name="line.1375"></a>
+<span class="sourceLineNo">1376</span>                break;<a name="line.1376"></a>
+<span class="sourceLineNo">1377</span>              default:<a name="line.1377"></a>
+<span class="sourceLineNo">1378</span>                throw new UnsupportedOperationException();<a name="line.1378"></a>
+<span class="sourceLineNo">1379</span>            }<a name="line.1379"></a>
+<span class="sourceLineNo">1380</span>          }<a name="line.1380"></a>
+<span class="sourceLineNo">1381</span>        }<a name="line.1381"></a>
+<span class="sourceLineNo">1382</span>        break;<a name="line.1382"></a>
+<span class="sourceLineNo">1383</span>      }<a name="line.1383"></a>
+<span class="sourceLineNo">1384</span><a name="line.1384"></a>
+<span class="sourceLineNo">1385</span>      // Execute the procedure<a name="line.1385"></a>
+<span class="sourceLineNo">1386</span>      assert proc.getState() == ProcedureState.RUNNABLE : proc;<a name="line.1386"></a>
+<span class="sourceLineNo">1387</span>      // Note that lock is NOT about concurrency but rather about ensuring<a name="line.1387"></a>
+<span class="sourceLineNo">1388</span>      // ownership of a procedure of an entity such as a region or table<a name="line.1388"></a>
+<span class="sourceLineNo">1389</span>      LockState lockState = acquireLock(proc);<a name="line.1389"></a>
+<span class="sourceLineNo">1390</span>      switch (lockState) {<a name="line.1390"></a>
+<span class="sourceLineNo">1391</span>        case LOCK_ACQUIRED:<a name="line.1391"></a>
+<span class="sourceLineNo">1392</span>          execProcedure(procStack, proc);<a name="line.1392"></a>
 <span class="sourceLineNo">1393</span>          break;<a name="line.1393"></a>
-<span class="sourceLineNo">1394</span>        default:<a name="line.1394"></a>
-<span class="sourceLineNo">1395</span>          throw new UnsupportedOperationException();<a name="line.1395"></a>
-<span class="sourceLineNo">1396</span>      }<a name="line.1396"></a>
-<span class="sourceLineNo">1397</span>      procStack.release(proc);<a name="line.1397"></a>
-<span class="sourceLineNo">1398</span><a name="line.1398"></a>
-<span class="sourceLineNo">1399</span>      if (proc.isSuccess()) {<a name="line.1399"></a>
-<span class="sourceLineNo">1400</span>        // update metrics on finishing the procedure<a name="line.1400"></a>
-<span class="sourceLineNo">1401</span>        proc.updateMetricsOnFinish(getEnvironment(), proc.elapsedTime(), true);<a name="line.1401"></a>
-<span class="sourceLineNo">1402</span>        LOG.info("Finished " + proc + " in " + StringUtils.humanTimeDiff(proc.elapsedTime()));<a name="line.1402"></a>
-<span class="sourceLineNo">1403</span>        // Finalize the procedure state<a name="line.1403"></a>
-<span class="sourceLineNo">1404</span>        if (proc.getProcId() == rootProcId) {<a name="line.1404"></a>
-<span class="sourceLineNo">1405</span>          procedureFinished(proc);<a name="line.1405"></a>
-<span class="sourceLineNo">1406</span>        } else {<a name="line.1406"></a>
-<span class="sourceLineNo">1407</span>          execCompletionCleanup(proc);<a name="line.1407"></a>
-<span class="sourceLineNo">1408</span>        }<a name="line.1408"></a>
-<span class="sourceLineNo">1409</span>        break;<a name="line.1409"></a>
-<span class="sourceLineNo">1410</span>      }<a name="line.1410"></a>
-<span class="sourceLineNo">1411</span>    } while (procStack.isFailed());<a name="line.1411"></a>
-<span class="sourceLineNo">1412</span>  }<a name="line.1412"></a>
-<span class="sourceLineNo">1413</span><a name="line.1413"></a>
-<span class="sourceLineNo">1414</span>  private LockState acquireLock(Procedure&lt;TEnvironment&gt; proc) {<a name="line.1414"></a>
-<span class="sourceLineNo">1415</span>    TEnvironment env = getEnvironment();<a name="line.1415"></a>
-<span class="sourceLineNo">1416</span>    // if holdLock is true, then maybe we already have the lock, so just return LOCK_ACQUIRED if<a name="line.1416"></a>
-<span class="sourceLineNo">1417</span>    // hasLock is true.<a name="line.1417"></a>
-<span class="sourceLineNo">1418</span>    if (proc.hasLock()) {<a name="line.1418"></a>
-<span class="sourceLineNo">1419</span>      return LockState.LOCK_ACQUIRED;<a name="line.1419"></a>
-<span class="sourceLineNo">1420</span>    }<a name="line.1420"></a>
-<span class="sourceLineNo">1421</span>    return proc.doAcquireLock(env, store);<a name="line.1421"></a>
-<span class="sourceLineNo">1422</span>  }<a name="line.1422"></a>
-<span class="sourceLineNo">1423</span><a name="line.1423"></a>
-<span class="sourceLineNo">1424</span>  private void releaseLock(Procedure&lt;TEnvironment&gt; proc, boolean force) {<a name="line.1424"></a>
-<span class="sourceLineNo">1425</span>    TEnvironment env = getEnvironment();<a name="line.1425"></a>
-<span class="sourceLineNo">1426</span>    // For how the framework works, we know that we will always have the lock<a name="line.1426"></a>
-<span class="sourceLineNo">1427</span>    // when we call releaseLock(), so we can avoid calling proc.hasLock()<a name="line.1427"></a>
-<span class="sourceLineNo">1428</span>    if (force || !proc.holdLock(env) || proc.isFinished()) {<a name="line.1428"></a>
-<span class="sourceLineNo">1429</span>      proc.doReleaseLock(env, store);<a name="line.1429"></a>
-<span class="sourceLineNo">1430</span>    }<a name="line.1430"></a>
-<span class="sourceLineNo">1431</span>  }<a name="line.1431"></a>
-<span class="sourceLineNo">1432</span><a name="line.1432"></a>
-<span class="sourceLineNo">1433</span>  /**<a name="line.1433"></a>
-<span class="sourceLineNo">1434</span>   * Execute the rollback of the full procedure stack. Once the procedure is rolledback, the<a name="line.1434"></a>
-<span class="sourceLineNo">1435</span>   * root-procedure will be visible as finished to user, and the result will be the fatal exception.<a name="line.1435"></a>
-<span class="sourceLineNo">1436</span>   */<a name="line.1436"></a>
-<span class="sourceLineNo">1437</span>  private LockState executeRollback(long rootProcId, RootProcedureState&lt;TEnvironment&gt; procStack) {<a name="line.1437"></a>
-<span class="sourceLineNo">1438</span>    Procedure&lt;TEnvironment&gt; rootProc = procedures.get(rootProcId);<a name="line.1438"></a>
-<span class="sourceLineNo">1439</span>    RemoteProcedureException exception = rootProc.getException();<a name="line.1439"></a>
-<span class="sourceLineNo">1440</span>    // TODO: This needs doc. The root proc doesn't have an exception. Maybe we are<a name="line.1440"></a>
-<span class="sourceLineNo">1441</span>    // rolling back because the subprocedure does. Clarify.<a name="line.1441"></a>
-<span class="sourceLineNo">1442</span>    if (exception == null) {<a name="line.1442"></a>
-<span class="sourceLineNo">1443</span>      exception = procStack.getException();<a name="line.1443"></a>
-<span class="sourceLineNo">1444</span>      rootProc.setFailure(exception);<a name="line.1444"></a>
-<span class="sourceLineNo">1445</span>      store.update(rootProc);<a name="line.1445"></a>
-<span class="sourceLineNo">1446</span>    }<a name="line.1446"></a>
-<span class="sourceLineNo">1447</span><a name="line.1447"></a>
-<span 

<TRUNCATED>

[29/29] hbase-site git commit: Published site at 5e84997f2ffdbcf5f849d70c30ddbe2db4039ca4.

Posted by gi...@apache.org.
Published site at 5e84997f2ffdbcf5f849d70c30ddbe2db4039ca4.


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

Branch: refs/heads/asf-site
Commit: 27f5bfb51d9cc11fc56c68039c892c926ddb2b08
Parents: a19d669
Author: jenkins <bu...@apache.org>
Authored: Sat Nov 10 14:50:38 2018 +0000
Committer: jenkins <bu...@apache.org>
Committed: Sat Nov 10 14:50:38 2018 +0000

----------------------------------------------------------------------
 acid-semantics.html                             |    4 +-
 apache_hbase_reference_guide.pdf                |    4 +-
 .../hadoop/hbase/mapreduce/CopyTable.html       |   10 +-
 .../hadoop/hbase/mapreduce/CopyTable.html       |  713 ++--
 book.html                                       |    2 +-
 bulk-loads.html                                 |    4 +-
 checkstyle-aggregate.html                       | 3986 +++++++++---------
 checkstyle.rss                                  |    6 +-
 coc.html                                        |    4 +-
 dependencies.html                               |    4 +-
 dependency-convergence.html                     |  217 +-
 dependency-info.html                            |    4 +-
 dependency-management.html                      |  178 +-
 devapidocs/constant-values.html                 |    4 +-
 devapidocs/index-all.html                       |    4 +-
 .../hadoop/hbase/backup/package-tree.html       |    4 +-
 .../hadoop/hbase/client/package-tree.html       |   24 +-
 .../hadoop/hbase/coprocessor/package-tree.html  |    2 +-
 .../hadoop/hbase/executor/package-tree.html     |    2 +-
 .../hadoop/hbase/filter/package-tree.html       |    8 +-
 .../hadoop/hbase/io/hfile/package-tree.html     |    8 +-
 .../apache/hadoop/hbase/ipc/package-tree.html   |    2 +-
 .../hadoop/hbase/mapreduce/CopyTable.html       |   50 +-
 .../hadoop/hbase/mapreduce/package-tree.html    |    4 +-
 .../hbase/master/balancer/package-tree.html     |    2 +-
 .../hadoop/hbase/master/package-tree.html       |    6 +-
 .../procedure/MasterProcedureScheduler.html     |  160 +-
 .../master/procedure/class-use/FairQueue.html   |   10 +-
 .../hbase/master/procedure/class-use/Queue.html |   10 +-
 .../hbase/master/procedure/package-tree.html    |    4 +-
 .../org/apache/hadoop/hbase/package-tree.html   |   16 +-
 ...ProcedureExecutor.KeepAliveWorkerThread.html |    6 +-
 .../ProcedureExecutor.WorkerMonitor.html        |   32 +-
 .../ProcedureExecutor.WorkerThread.html         |   20 +-
 .../hbase/procedure2/ProcedureExecutor.html     |   88 +-
 .../hbase/procedure2/TimeoutExecutorThread.html |    4 +-
 .../hbase/procedure2/class-use/Procedure.html   |    2 +-
 .../hadoop/hbase/procedure2/package-tree.html   |    6 +-
 .../hadoop/hbase/quotas/package-tree.html       |    6 +-
 .../hadoop/hbase/regionserver/package-tree.html |   14 +-
 .../regionserver/querymatcher/package-tree.html |    4 +-
 .../hadoop/hbase/rest/model/package-tree.html   |    2 +-
 .../hbase/security/access/package-tree.html     |    4 +-
 .../hadoop/hbase/security/package-tree.html     |    2 +-
 .../hadoop/hbase/thrift/package-tree.html       |    2 +-
 .../apache/hadoop/hbase/util/package-tree.html  |   12 +-
 .../hbase/zookeeper/ZKConfig.ZKClusterKey.html  |   16 +-
 .../apache/hadoop/hbase/zookeeper/ZKConfig.html |   28 +-
 .../org/apache/hadoop/hbase/Version.html        |    4 +-
 .../hadoop/hbase/mapreduce/CopyTable.html       |  713 ++--
 .../procedure/MasterProcedureScheduler.html     | 1904 ++++-----
 ...ProcedureExecutor.KeepAliveWorkerThread.html | 2200 +++++-----
 ...edureExecutor.ProcedureExecutorListener.html | 2200 +++++-----
 .../procedure2/ProcedureExecutor.Testing.html   | 2200 +++++-----
 .../ProcedureExecutor.WorkerMonitor.html        | 2200 +++++-----
 .../ProcedureExecutor.WorkerThread.html         | 2200 +++++-----
 .../hbase/procedure2/ProcedureExecutor.html     | 2200 +++++-----
 .../hbase/procedure2/TimeoutExecutorThread.html |    2 +-
 .../hbase/zookeeper/ZKConfig.ZKClusterKey.html  |  635 +--
 .../apache/hadoop/hbase/zookeeper/ZKConfig.html |  635 +--
 downloads.html                                  |    4 +-
 export_control.html                             |    4 +-
 index.html                                      |    4 +-
 integration.html                                |    4 +-
 issue-tracking.html                             |    4 +-
 license.html                                    |    4 +-
 mail-lists.html                                 |    4 +-
 metrics.html                                    |    4 +-
 old_news.html                                   |    4 +-
 plugin-management.html                          |    4 +-
 plugins.html                                    |    4 +-
 poweredbyhbase.html                             |    4 +-
 project-info.html                               |    4 +-
 project-reports.html                            |    4 +-
 project-summary.html                            |    4 +-
 pseudo-distributed.html                         |    4 +-
 replication.html                                |    4 +-
 resources.html                                  |    4 +-
 source-repository.html                          |    4 +-
 sponsors.html                                   |    4 +-
 supportingprojects.html                         |    4 +-
 team-list.html                                  |    4 +-
 testdevapidocs/allclasses-frame.html            |    1 +
 testdevapidocs/allclasses-noframe.html          |    1 +
 testdevapidocs/index-all.html                   |   10 +
 .../hadoop/hbase/backup/package-tree.html       |    2 +-
 .../hadoop/hbase/io/hfile/package-tree.html     |    2 +-
 .../org/apache/hadoop/hbase/package-tree.html   |   12 +-
 .../hadoop/hbase/procedure/package-tree.html    |    8 +-
 .../ProcedureTestingUtility.NoopProcedure.html  |    2 +-
 .../TestProcedureBypass.RootProcedure.html      |    8 +-
 .../TestProcedureBypass.StuckProcedure.html     |    6 +-
 ...cedureBypass.StuckStateMachineProcedure.html |   14 +-
 ...tProcedureBypass.StuckStateMachineState.html |   12 +-
 .../TestProcedureBypass.SuspendProcedure.html   |    6 +-
 .../TestProcedureBypass.TestProcEnv.html        |    8 +-
 ...ProcedureBypass.WaitingTimeoutProcedure.html |  358 ++
 .../hbase/procedure2/TestProcedureBypass.html   |   64 +-
 .../hbase/procedure2/TestProcedureCleanup.html  |    4 +-
 .../ProcedureTestingUtility.NoopProcedure.html  |   24 +-
 .../TestProcedureBypass.TestProcEnv.html        |    8 +
 ...ProcedureBypass.WaitingTimeoutProcedure.html |  125 +
 .../hadoop/hbase/procedure2/package-frame.html  |    1 +
 .../hbase/procedure2/package-summary.html       |  132 +-
 .../hadoop/hbase/procedure2/package-tree.html   |    5 +-
 .../hadoop/hbase/regionserver/package-tree.html |    4 +-
 .../apache/hadoop/hbase/wal/package-tree.html   |    2 +-
 .../TestZKMainServer.ExitException.html         |    8 +-
 .../TestZKMainServer.NoExitSecurityManager.html |   10 +-
 .../hbase/zookeeper/TestZKMainServer.html       |   10 +-
 testdevapidocs/overview-tree.html               |    1 +
 .../TestProcedureBypass.RootProcedure.html      |  460 +-
 .../TestProcedureBypass.StuckProcedure.html     |  460 +-
 ...cedureBypass.StuckStateMachineProcedure.html |  460 +-
 ...tProcedureBypass.StuckStateMachineState.html |  460 +-
 .../TestProcedureBypass.SuspendProcedure.html   |  460 +-
 .../TestProcedureBypass.TestProcEnv.html        |  460 +-
 ...ProcedureBypass.WaitingTimeoutProcedure.html |  368 ++
 .../hbase/procedure2/TestProcedureBypass.html   |  460 +-
 .../TestZKMainServer.ExitException.html         |  217 +-
 .../TestZKMainServer.NoExitSecurityManager.html |  217 +-
 .../hbase/zookeeper/TestZKMainServer.html       |  217 +-
 122 files changed, 14706 insertions(+), 13266 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/hbase-site/blob/27f5bfb5/acid-semantics.html
----------------------------------------------------------------------
diff --git a/acid-semantics.html b/acid-semantics.html
index 92f3d5a..58217b5 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="20181109" />
+    <meta name="Date-Revision-yyyymmdd" content="20181110" />
     <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-11-09</li>
+                  <li id="publishDate" class="pull-right">Last Published: 2018-11-10</li>
             </p>
                 </div>
 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/27f5bfb5/apache_hbase_reference_guide.pdf
----------------------------------------------------------------------
diff --git a/apache_hbase_reference_guide.pdf b/apache_hbase_reference_guide.pdf
index deb2ad9..90cc17a 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:20181109143344+00'00')
-/CreationDate (D:20181109144916+00'00')
+/ModDate (D:20181110143224+00'00')
+/CreationDate (D:20181110144714+00'00')
 >>
 endobj
 2 0 obj

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/27f5bfb5/apidocs/org/apache/hadoop/hbase/mapreduce/CopyTable.html
----------------------------------------------------------------------
diff --git a/apidocs/org/apache/hadoop/hbase/mapreduce/CopyTable.html b/apidocs/org/apache/hadoop/hbase/mapreduce/CopyTable.html
index b6e16ae..bc9720d 100644
--- a/apidocs/org/apache/hadoop/hbase/mapreduce/CopyTable.html
+++ b/apidocs/org/apache/hadoop/hbase/mapreduce/CopyTable.html
@@ -119,7 +119,7 @@ var activeTableTab = "activeTableTab";
 <hr>
 <br>
 <pre>@InterfaceAudience.Public
-public class <a href="../../../../../src-html/org/apache/hadoop/hbase/mapreduce/CopyTable.html#line.51">CopyTable</a>
+public class <a href="../../../../../src-html/org/apache/hadoop/hbase/mapreduce/CopyTable.html#line.52">CopyTable</a>
 extends org.apache.hadoop.conf.Configured
 implements org.apache.hadoop.util.Tool</pre>
 <div class="block">Tool used to copy a table to another one which can be on a different setup.
@@ -218,7 +218,7 @@ implements org.apache.hadoop.util.Tool</pre>
 <ul class="blockListLast">
 <li class="blockList">
 <h4>CopyTable</h4>
-<pre>public&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/mapreduce/CopyTable.html#line.51">CopyTable</a>()</pre>
+<pre>public&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/mapreduce/CopyTable.html#line.52">CopyTable</a>()</pre>
 </li>
 </ul>
 </li>
@@ -235,7 +235,7 @@ implements org.apache.hadoop.util.Tool</pre>
 <ul class="blockList">
 <li class="blockList">
 <h4>createSubmittableJob</h4>
-<pre>public&nbsp;org.apache.hadoop.mapreduce.Job&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/mapreduce/CopyTable.html#line.81">createSubmittableJob</a>(<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>[]&nbsp;args)
+<pre>public&nbsp;org.apache.hadoop.mapreduce.Job&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/mapreduce/CopyTable.html#line.82">createSubmittableJob</a>(<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>[]&nbsp;args)
                                                      throws <a href="https://docs.oracle.com/javase/8/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</a></pre>
 <div class="block">Sets up the actual job.</div>
 <dl>
@@ -254,7 +254,7 @@ implements org.apache.hadoop.util.Tool</pre>
 <ul class="blockList">
 <li class="blockList">
 <h4>main</h4>
-<pre>public static&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/mapreduce/CopyTable.html#line.355">main</a>(<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>[]&nbsp;args)
+<pre>public static&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/mapreduce/CopyTable.html#line.356">main</a>(<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>[]&nbsp;args)
                  throws <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Exception.html?is-external=true" title="class or interface in java.lang">Exception</a></pre>
 <div class="block">Main entry point.</div>
 <dl>
@@ -271,7 +271,7 @@ implements org.apache.hadoop.util.Tool</pre>
 <ul class="blockListLast">
 <li class="blockList">
 <h4>run</h4>
-<pre>public&nbsp;int&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/mapreduce/CopyTable.html#line.361">run</a>(<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>[]&nbsp;args)
+<pre>public&nbsp;int&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/mapreduce/CopyTable.html#line.362">run</a>(<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>[]&nbsp;args)
         throws <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Exception.html?is-external=true" title="class or interface in java.lang">Exception</a></pre>
 <dl>
 <dt><span class="overrideSpecifyLabel">Specified by:</span></dt>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/27f5bfb5/apidocs/src-html/org/apache/hadoop/hbase/mapreduce/CopyTable.html
----------------------------------------------------------------------
diff --git a/apidocs/src-html/org/apache/hadoop/hbase/mapreduce/CopyTable.html b/apidocs/src-html/org/apache/hadoop/hbase/mapreduce/CopyTable.html
index 56eaf18..e2ca07a 100644
--- a/apidocs/src-html/org/apache/hadoop/hbase/mapreduce/CopyTable.html
+++ b/apidocs/src-html/org/apache/hadoop/hbase/mapreduce/CopyTable.html
@@ -37,362 +37,363 @@
 <span class="sourceLineNo">029</span>import org.apache.hadoop.hbase.HBaseConfiguration;<a name="line.29"></a>
 <span class="sourceLineNo">030</span>import org.apache.hadoop.hbase.HConstants;<a name="line.30"></a>
 <span class="sourceLineNo">031</span>import org.apache.hadoop.hbase.TableName;<a name="line.31"></a>
-<span class="sourceLineNo">032</span>import org.apache.yetus.audience.InterfaceAudience;<a name="line.32"></a>
-<span class="sourceLineNo">033</span>import org.slf4j.Logger;<a name="line.33"></a>
-<span class="sourceLineNo">034</span>import org.slf4j.LoggerFactory;<a name="line.34"></a>
-<span class="sourceLineNo">035</span>import org.apache.hadoop.hbase.client.Admin;<a name="line.35"></a>
-<span class="sourceLineNo">036</span>import org.apache.hadoop.hbase.client.Connection;<a name="line.36"></a>
-<span class="sourceLineNo">037</span>import org.apache.hadoop.hbase.client.ConnectionFactory;<a name="line.37"></a>
-<span class="sourceLineNo">038</span>import org.apache.hadoop.hbase.client.Scan;<a name="line.38"></a>
-<span class="sourceLineNo">039</span>import org.apache.hadoop.hbase.tool.LoadIncrementalHFiles;<a name="line.39"></a>
-<span class="sourceLineNo">040</span>import org.apache.hadoop.hbase.util.Bytes;<a name="line.40"></a>
-<span class="sourceLineNo">041</span>import org.apache.hadoop.mapreduce.Job;<a name="line.41"></a>
-<span class="sourceLineNo">042</span>import org.apache.hadoop.util.Tool;<a name="line.42"></a>
-<span class="sourceLineNo">043</span>import org.apache.hadoop.util.ToolRunner;<a name="line.43"></a>
-<span class="sourceLineNo">044</span><a name="line.44"></a>
-<span class="sourceLineNo">045</span>/**<a name="line.45"></a>
-<span class="sourceLineNo">046</span> * Tool used to copy a table to another one which can be on a different setup.<a name="line.46"></a>
-<span class="sourceLineNo">047</span> * It is also configurable with a start and time as well as a specification<a name="line.47"></a>
-<span class="sourceLineNo">048</span> * of the region server implementation if different from the local cluster.<a name="line.48"></a>
-<span class="sourceLineNo">049</span> */<a name="line.49"></a>
-<span class="sourceLineNo">050</span>@InterfaceAudience.Public<a name="line.50"></a>
-<span class="sourceLineNo">051</span>public class CopyTable extends Configured implements Tool {<a name="line.51"></a>
-<span class="sourceLineNo">052</span>  private static final Logger LOG = LoggerFactory.getLogger(CopyTable.class);<a name="line.52"></a>
-<span class="sourceLineNo">053</span><a name="line.53"></a>
-<span class="sourceLineNo">054</span>  final static String NAME = "copytable";<a name="line.54"></a>
-<span class="sourceLineNo">055</span>  long startTime = 0;<a name="line.55"></a>
-<span class="sourceLineNo">056</span>  long endTime = HConstants.LATEST_TIMESTAMP;<a name="line.56"></a>
-<span class="sourceLineNo">057</span>  int batch = Integer.MAX_VALUE;<a name="line.57"></a>
-<span class="sourceLineNo">058</span>  int cacheRow = -1;<a name="line.58"></a>
-<span class="sourceLineNo">059</span>  int versions = -1;<a name="line.59"></a>
-<span class="sourceLineNo">060</span>  String tableName = null;<a name="line.60"></a>
-<span class="sourceLineNo">061</span>  String startRow = null;<a name="line.61"></a>
-<span class="sourceLineNo">062</span>  String stopRow = null;<a name="line.62"></a>
-<span class="sourceLineNo">063</span>  String dstTableName = null;<a name="line.63"></a>
-<span class="sourceLineNo">064</span>  String peerAddress = null;<a name="line.64"></a>
-<span class="sourceLineNo">065</span>  String families = null;<a name="line.65"></a>
-<span class="sourceLineNo">066</span>  boolean allCells = false;<a name="line.66"></a>
-<span class="sourceLineNo">067</span>  static boolean shuffle = false;<a name="line.67"></a>
-<span class="sourceLineNo">068</span><a name="line.68"></a>
-<span class="sourceLineNo">069</span>  boolean bulkload = false;<a name="line.69"></a>
-<span class="sourceLineNo">070</span>  Path bulkloadDir = null;<a name="line.70"></a>
-<span class="sourceLineNo">071</span><a name="line.71"></a>
-<span class="sourceLineNo">072</span>  private final static String JOB_NAME_CONF_KEY = "mapreduce.job.name";<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>   * Sets up the actual job.<a name="line.75"></a>
-<span class="sourceLineNo">076</span>   *<a name="line.76"></a>
-<span class="sourceLineNo">077</span>   * @param args  The command line parameters.<a name="line.77"></a>
-<span class="sourceLineNo">078</span>   * @return The newly created job.<a name="line.78"></a>
-<span class="sourceLineNo">079</span>   * @throws IOException When setting up the job fails.<a name="line.79"></a>
-<span class="sourceLineNo">080</span>   */<a name="line.80"></a>
-<span class="sourceLineNo">081</span>  public Job createSubmittableJob(String[] args)<a name="line.81"></a>
-<span class="sourceLineNo">082</span>  throws IOException {<a name="line.82"></a>
-<span class="sourceLineNo">083</span>    if (!doCommandLine(args)) {<a name="line.83"></a>
-<span class="sourceLineNo">084</span>      return null;<a name="line.84"></a>
-<span class="sourceLineNo">085</span>    }<a name="line.85"></a>
-<span class="sourceLineNo">086</span><a name="line.86"></a>
-<span class="sourceLineNo">087</span>    Job job = Job.getInstance(getConf(), getConf().get(JOB_NAME_CONF_KEY, NAME + "_" + tableName));<a name="line.87"></a>
-<span class="sourceLineNo">088</span>    job.setJarByClass(CopyTable.class);<a name="line.88"></a>
-<span class="sourceLineNo">089</span>    Scan scan = new Scan();<a name="line.89"></a>
-<span class="sourceLineNo">090</span><a name="line.90"></a>
-<span class="sourceLineNo">091</span>    scan.setBatch(batch);<a name="line.91"></a>
-<span class="sourceLineNo">092</span>    scan.setCacheBlocks(false);<a name="line.92"></a>
-<span class="sourceLineNo">093</span><a name="line.93"></a>
-<span class="sourceLineNo">094</span>    if (cacheRow &gt; 0) {<a name="line.94"></a>
-<span class="sourceLineNo">095</span>      scan.setCaching(cacheRow);<a name="line.95"></a>
-<span class="sourceLineNo">096</span>    } else {<a name="line.96"></a>
-<span class="sourceLineNo">097</span>      scan.setCaching(getConf().getInt(HConstants.HBASE_CLIENT_SCANNER_CACHING, 100));<a name="line.97"></a>
-<span class="sourceLineNo">098</span>    }<a name="line.98"></a>
-<span class="sourceLineNo">099</span><a name="line.99"></a>
-<span class="sourceLineNo">100</span>    scan.setTimeRange(startTime, endTime);<a name="line.100"></a>
-<span class="sourceLineNo">101</span><a name="line.101"></a>
-<span class="sourceLineNo">102</span>    if (allCells) {<a name="line.102"></a>
-<span class="sourceLineNo">103</span>      scan.setRaw(true);<a name="line.103"></a>
-<span class="sourceLineNo">104</span>    }<a name="line.104"></a>
-<span class="sourceLineNo">105</span>    if (shuffle) {<a name="line.105"></a>
-<span class="sourceLineNo">106</span>      job.getConfiguration().set(TableInputFormat.SHUFFLE_MAPS, "true");<a name="line.106"></a>
-<span class="sourceLineNo">107</span>    }<a name="line.107"></a>
-<span class="sourceLineNo">108</span>    if (versions &gt;= 0) {<a name="line.108"></a>
-<span class="sourceLineNo">109</span>      scan.setMaxVersions(versions);<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>    if (startRow != null) {<a name="line.112"></a>
-<span class="sourceLineNo">113</span>      scan.setStartRow(Bytes.toBytesBinary(startRow));<a name="line.113"></a>
-<span class="sourceLineNo">114</span>    }<a name="line.114"></a>
-<span class="sourceLineNo">115</span><a name="line.115"></a>
-<span class="sourceLineNo">116</span>    if (stopRow != null) {<a name="line.116"></a>
-<span class="sourceLineNo">117</span>      scan.setStopRow(Bytes.toBytesBinary(stopRow));<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>    if(families != null) {<a name="line.120"></a>
-<span class="sourceLineNo">121</span>      String[] fams = families.split(",");<a name="line.121"></a>
-<span class="sourceLineNo">122</span>      Map&lt;String,String&gt; cfRenameMap = new HashMap&lt;&gt;();<a name="line.122"></a>
-<span class="sourceLineNo">123</span>      for(String fam : fams) {<a name="line.123"></a>
-<span class="sourceLineNo">124</span>        String sourceCf;<a name="line.124"></a>
-<span class="sourceLineNo">125</span>        if(fam.contains(":")) {<a name="line.125"></a>
-<span class="sourceLineNo">126</span>            // fam looks like "sourceCfName:destCfName"<a name="line.126"></a>
-<span class="sourceLineNo">127</span>            String[] srcAndDest = fam.split(":", 2);<a name="line.127"></a>
-<span class="sourceLineNo">128</span>            sourceCf = srcAndDest[0];<a name="line.128"></a>
-<span class="sourceLineNo">129</span>            String destCf = srcAndDest[1];<a name="line.129"></a>
-<span class="sourceLineNo">130</span>            cfRenameMap.put(sourceCf, destCf);<a name="line.130"></a>
-<span class="sourceLineNo">131</span>        } else {<a name="line.131"></a>
-<span class="sourceLineNo">132</span>            // fam is just "sourceCf"<a name="line.132"></a>
-<span class="sourceLineNo">133</span>            sourceCf = fam;<a name="line.133"></a>
-<span class="sourceLineNo">134</span>        }<a name="line.134"></a>
-<span class="sourceLineNo">135</span>        scan.addFamily(Bytes.toBytes(sourceCf));<a name="line.135"></a>
-<span class="sourceLineNo">136</span>      }<a name="line.136"></a>
-<span class="sourceLineNo">137</span>      Import.configureCfRenaming(job.getConfiguration(), cfRenameMap);<a name="line.137"></a>
-<span class="sourceLineNo">138</span>    }<a name="line.138"></a>
-<span class="sourceLineNo">139</span>    job.setNumReduceTasks(0);<a name="line.139"></a>
-<span class="sourceLineNo">140</span><a name="line.140"></a>
-<span class="sourceLineNo">141</span>    if (bulkload) {<a name="line.141"></a>
-<span class="sourceLineNo">142</span>      TableMapReduceUtil.initTableMapperJob(tableName, scan, Import.CellImporter.class, null,<a name="line.142"></a>
-<span class="sourceLineNo">143</span>        null, job);<a name="line.143"></a>
-<span class="sourceLineNo">144</span><a name="line.144"></a>
-<span class="sourceLineNo">145</span>      // We need to split the inputs by destination tables so that output of Map can be bulk-loaded.<a name="line.145"></a>
-<span class="sourceLineNo">146</span>      TableInputFormat.configureSplitTable(job, TableName.valueOf(dstTableName));<a name="line.146"></a>
-<span class="sourceLineNo">147</span><a name="line.147"></a>
-<span class="sourceLineNo">148</span>      FileSystem fs = FileSystem.get(getConf());<a name="line.148"></a>
-<span class="sourceLineNo">149</span>      Random rand = new Random();<a name="line.149"></a>
-<span class="sourceLineNo">150</span>      Path root = new Path(fs.getWorkingDirectory(), "copytable");<a name="line.150"></a>
-<span class="sourceLineNo">151</span>      fs.mkdirs(root);<a name="line.151"></a>
-<span class="sourceLineNo">152</span>      while (true) {<a name="line.152"></a>
-<span class="sourceLineNo">153</span>        bulkloadDir = new Path(root, "" + rand.nextLong());<a name="line.153"></a>
-<span class="sourceLineNo">154</span>        if (!fs.exists(bulkloadDir)) {<a name="line.154"></a>
-<span class="sourceLineNo">155</span>          break;<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>      System.out.println("HFiles will be stored at " + this.bulkloadDir);<a name="line.159"></a>
-<span class="sourceLineNo">160</span>      HFileOutputFormat2.setOutputPath(job, bulkloadDir);<a name="line.160"></a>
-<span class="sourceLineNo">161</span>      try (Connection conn = ConnectionFactory.createConnection(getConf());<a name="line.161"></a>
-<span class="sourceLineNo">162</span>          Admin admin = conn.getAdmin()) {<a name="line.162"></a>
-<span class="sourceLineNo">163</span>        HFileOutputFormat2.configureIncrementalLoadMap(job,<a name="line.163"></a>
-<span class="sourceLineNo">164</span>            admin.getDescriptor((TableName.valueOf(dstTableName))));<a name="line.164"></a>
-<span class="sourceLineNo">165</span>      }<a name="line.165"></a>
-<span class="sourceLineNo">166</span>    } else {<a name="line.166"></a>
-<span class="sourceLineNo">167</span>      TableMapReduceUtil.initTableMapperJob(tableName, scan,<a name="line.167"></a>
-<span class="sourceLineNo">168</span>        Import.Importer.class, null, null, job);<a name="line.168"></a>
-<span class="sourceLineNo">169</span><a name="line.169"></a>
-<span class="sourceLineNo">170</span>      TableMapReduceUtil.initTableReducerJob(dstTableName, null, job, null, peerAddress, null,<a name="line.170"></a>
-<span class="sourceLineNo">171</span>        null);<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>    return job;<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>   * @param errorMsg Error message.  Can be null.<a name="line.178"></a>
-<span class="sourceLineNo">179</span>   */<a name="line.179"></a>
-<span class="sourceLineNo">180</span>  private static void printUsage(final String errorMsg) {<a name="line.180"></a>
-<span class="sourceLineNo">181</span>    if (errorMsg != null &amp;&amp; errorMsg.length() &gt; 0) {<a name="line.181"></a>
-<span class="sourceLineNo">182</span>      System.err.println("ERROR: " + errorMsg);<a name="line.182"></a>
-<span class="sourceLineNo">183</span>    }<a name="line.183"></a>
-<span class="sourceLineNo">184</span>    System.err.println("Usage: CopyTable [general options] [--starttime=X] [--endtime=Y] " +<a name="line.184"></a>
-<span class="sourceLineNo">185</span>        "[--new.name=NEW] [--peer.adr=ADR] &lt;tablename&gt;");<a name="line.185"></a>
-<span class="sourceLineNo">186</span>    System.err.println();<a name="line.186"></a>
-<span class="sourceLineNo">187</span>    System.err.println("Options:");<a name="line.187"></a>
-<span class="sourceLineNo">188</span>    System.err.println(" rs.class     hbase.regionserver.class of the peer cluster");<a name="line.188"></a>
-<span class="sourceLineNo">189</span>    System.err.println("              specify if different from current cluster");<a name="line.189"></a>
-<span class="sourceLineNo">190</span>    System.err.println(" rs.impl      hbase.regionserver.impl of the peer cluster");<a name="line.190"></a>
-<span class="sourceLineNo">191</span>    System.err.println(" startrow     the start row");<a name="line.191"></a>
-<span class="sourceLineNo">192</span>    System.err.println(" stoprow      the stop row");<a name="line.192"></a>
-<span class="sourceLineNo">193</span>    System.err.println(" starttime    beginning of the time range (unixtime in millis)");<a name="line.193"></a>
-<span class="sourceLineNo">194</span>    System.err.println("              without endtime means from starttime to forever");<a name="line.194"></a>
-<span class="sourceLineNo">195</span>    System.err.println(" endtime      end of the time range.  Ignored if no starttime specified.");<a name="line.195"></a>
-<span class="sourceLineNo">196</span>    System.err.println(" versions     number of cell versions to copy");<a name="line.196"></a>
-<span class="sourceLineNo">197</span>    System.err.println(" new.name     new table's name");<a name="line.197"></a>
-<span class="sourceLineNo">198</span>    System.err.println(" peer.adr     Address of the peer cluster given in the format");<a name="line.198"></a>
-<span class="sourceLineNo">199</span>    System.err.println("              hbase.zookeeper.quorum:hbase.zookeeper.client"<a name="line.199"></a>
-<span class="sourceLineNo">200</span>        + ".port:zookeeper.znode.parent");<a name="line.200"></a>
-<span class="sourceLineNo">201</span>    System.err.println(" families     comma-separated list of families to copy");<a name="line.201"></a>
-<span class="sourceLineNo">202</span>    System.err.println("              To copy from cf1 to cf2, give sourceCfName:destCfName. ");<a name="line.202"></a>
-<span class="sourceLineNo">203</span>    System.err.println("              To keep the same name, just give \"cfName\"");<a name="line.203"></a>
-<span class="sourceLineNo">204</span>    System.err.println(" all.cells    also copy delete markers and deleted cells");<a name="line.204"></a>
-<span class="sourceLineNo">205</span>    System.err.println(" bulkload     Write input into HFiles and bulk load to the destination "<a name="line.205"></a>
-<span class="sourceLineNo">206</span>        + "table");<a name="line.206"></a>
-<span class="sourceLineNo">207</span>    System.err.println();<a name="line.207"></a>
-<span class="sourceLineNo">208</span>    System.err.println("Args:");<a name="line.208"></a>
-<span class="sourceLineNo">209</span>    System.err.println(" tablename    Name of the table to copy");<a name="line.209"></a>
-<span class="sourceLineNo">210</span>    System.err.println();<a name="line.210"></a>
-<span class="sourceLineNo">211</span>    System.err.println("Examples:");<a name="line.211"></a>
-<span class="sourceLineNo">212</span>    System.err.println(" To copy 'TestTable' to a cluster that uses replication for a 1 hour window:");<a name="line.212"></a>
-<span class="sourceLineNo">213</span>    System.err.println(" $ hbase " +<a name="line.213"></a>
-<span class="sourceLineNo">214</span>        "org.apache.hadoop.hbase.mapreduce.CopyTable --starttime=1265875194289 --endtime=1265878794289 " +<a name="line.214"></a>
-<span class="sourceLineNo">215</span>        "--peer.adr=server1,server2,server3:2181:/hbase --families=myOldCf:myNewCf,cf2,cf3 TestTable ");<a name="line.215"></a>
-<span class="sourceLineNo">216</span>    System.err.println("For performance consider the following general option:\n"<a name="line.216"></a>
-<span class="sourceLineNo">217</span>        + "  It is recommended that you set the following to &gt;=100. A higher value uses more memory but\n"<a name="line.217"></a>
-<span class="sourceLineNo">218</span>        + "  decreases the round trip time to the server and may increase performance.\n"<a name="line.218"></a>
-<span class="sourceLineNo">219</span>        + "    -Dhbase.client.scanner.caching=100\n"<a name="line.219"></a>
-<span class="sourceLineNo">220</span>        + "  The following should always be set to false, to prevent writing data twice, which may produce \n"<a name="line.220"></a>
-<span class="sourceLineNo">221</span>        + "  inaccurate results.\n"<a name="line.221"></a>
-<span class="sourceLineNo">222</span>        + "    -Dmapreduce.map.speculative=false");<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>  private boolean doCommandLine(final String[] args) {<a name="line.225"></a>
-<span class="sourceLineNo">226</span>    // Process command-line args. TODO: Better cmd-line processing<a name="line.226"></a>
-<span class="sourceLineNo">227</span>    // (but hopefully something not as painful as cli options).<a name="line.227"></a>
-<span class="sourceLineNo">228</span>    if (args.length &lt; 1) {<a name="line.228"></a>
-<span class="sourceLineNo">229</span>      printUsage(null);<a name="line.229"></a>
-<span class="sourceLineNo">230</span>      return false;<a name="line.230"></a>
-<span class="sourceLineNo">231</span>    }<a name="line.231"></a>
-<span class="sourceLineNo">232</span>    try {<a name="line.232"></a>
-<span class="sourceLineNo">233</span>      for (int i = 0; i &lt; args.length; i++) {<a name="line.233"></a>
-<span class="sourceLineNo">234</span>        String cmd = args[i];<a name="line.234"></a>
-<span class="sourceLineNo">235</span>        if (cmd.equals("-h") || cmd.startsWith("--h")) {<a name="line.235"></a>
-<span class="sourceLineNo">236</span>          printUsage(null);<a name="line.236"></a>
-<span class="sourceLineNo">237</span>          return false;<a name="line.237"></a>
-<span class="sourceLineNo">238</span>        }<a name="line.238"></a>
-<span class="sourceLineNo">239</span><a name="line.239"></a>
-<span class="sourceLineNo">240</span>        final String startRowArgKey = "--startrow=";<a name="line.240"></a>
-<span class="sourceLineNo">241</span>        if (cmd.startsWith(startRowArgKey)) {<a name="line.241"></a>
-<span class="sourceLineNo">242</span>          startRow = cmd.substring(startRowArgKey.length());<a name="line.242"></a>
-<span class="sourceLineNo">243</span>          continue;<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>        final String stopRowArgKey = "--stoprow=";<a name="line.246"></a>
-<span class="sourceLineNo">247</span>        if (cmd.startsWith(stopRowArgKey)) {<a name="line.247"></a>
-<span class="sourceLineNo">248</span>          stopRow = cmd.substring(stopRowArgKey.length());<a name="line.248"></a>
-<span class="sourceLineNo">249</span>          continue;<a name="line.249"></a>
-<span class="sourceLineNo">250</span>        }<a name="line.250"></a>
-<span class="sourceLineNo">251</span><a name="line.251"></a>
-<span class="sourceLineNo">252</span>        final String startTimeArgKey = "--starttime=";<a name="line.252"></a>
-<span class="sourceLineNo">253</span>        if (cmd.startsWith(startTimeArgKey)) {<a name="line.253"></a>
-<span class="sourceLineNo">254</span>          startTime = Long.parseLong(cmd.substring(startTimeArgKey.length()));<a name="line.254"></a>
-<span class="sourceLineNo">255</span>          continue;<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>        final String endTimeArgKey = "--endtime=";<a name="line.258"></a>
-<span class="sourceLineNo">259</span>        if (cmd.startsWith(endTimeArgKey)) {<a name="line.259"></a>
-<span class="sourceLineNo">260</span>          endTime = Long.parseLong(cmd.substring(endTimeArgKey.length()));<a name="line.260"></a>
-<span class="sourceLineNo">261</span>          continue;<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>        final String batchArgKey = "--batch=";<a name="line.264"></a>
-<span class="sourceLineNo">265</span>        if (cmd.startsWith(batchArgKey)) {<a name="line.265"></a>
-<span class="sourceLineNo">266</span>          batch = Integer.parseInt(cmd.substring(batchArgKey.length()));<a name="line.266"></a>
-<span class="sourceLineNo">267</span>          continue;<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>        final String cacheRowArgKey = "--cacheRow=";<a name="line.270"></a>
-<span class="sourceLineNo">271</span>        if (cmd.startsWith(cacheRowArgKey)) {<a name="line.271"></a>
-<span class="sourceLineNo">272</span>          cacheRow = Integer.parseInt(cmd.substring(cacheRowArgKey.length()));<a name="line.272"></a>
-<span class="sourceLineNo">273</span>          continue;<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>        final String versionsArgKey = "--versions=";<a name="line.276"></a>
-<span class="sourceLineNo">277</span>        if (cmd.startsWith(versionsArgKey)) {<a name="line.277"></a>
-<span class="sourceLineNo">278</span>          versions = Integer.parseInt(cmd.substring(versionsArgKey.length()));<a name="line.278"></a>
-<span class="sourceLineNo">279</span>          continue;<a name="line.279"></a>
-<span class="sourceLineNo">280</span>        }<a name="line.280"></a>
-<span class="sourceLineNo">281</span><a name="line.281"></a>
-<span class="sourceLineNo">282</span>        final String newNameArgKey = "--new.name=";<a name="line.282"></a>
-<span class="sourceLineNo">283</span>        if (cmd.startsWith(newNameArgKey)) {<a name="line.283"></a>
-<span class="sourceLineNo">284</span>          dstTableName = cmd.substring(newNameArgKey.length());<a name="line.284"></a>
-<span class="sourceLineNo">285</span>          continue;<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>        final String peerAdrArgKey = "--peer.adr=";<a name="line.288"></a>
-<span class="sourceLineNo">289</span>        if (cmd.startsWith(peerAdrArgKey)) {<a name="line.289"></a>
-<span class="sourceLineNo">290</span>          peerAddress = cmd.substring(peerAdrArgKey.length());<a name="line.290"></a>
-<span class="sourceLineNo">291</span>          continue;<a name="line.291"></a>
-<span class="sourceLineNo">292</span>        }<a name="line.292"></a>
-<span class="sourceLineNo">293</span><a name="line.293"></a>
-<span class="sourceLineNo">294</span>        final String familiesArgKey = "--families=";<a name="line.294"></a>
-<span class="sourceLineNo">295</span>        if (cmd.startsWith(familiesArgKey)) {<a name="line.295"></a>
-<span class="sourceLineNo">296</span>          families = cmd.substring(familiesArgKey.length());<a name="line.296"></a>
-<span class="sourceLineNo">297</span>          continue;<a name="line.297"></a>
-<span class="sourceLineNo">298</span>        }<a name="line.298"></a>
-<span class="sourceLineNo">299</span><a name="line.299"></a>
-<span class="sourceLineNo">300</span>        if (cmd.startsWith("--all.cells")) {<a name="line.300"></a>
-<span class="sourceLineNo">301</span>          allCells = true;<a name="line.301"></a>
-<span class="sourceLineNo">302</span>          continue;<a name="line.302"></a>
-<span class="sourceLineNo">303</span>        }<a name="line.303"></a>
-<span class="sourceLineNo">304</span><a name="line.304"></a>
-<span class="sourceLineNo">305</span>        if (cmd.startsWith("--bulkload")) {<a name="line.305"></a>
-<span class="sourceLineNo">306</span>          bulkload = true;<a name="line.306"></a>
-<span class="sourceLineNo">307</span>          continue;<a name="line.307"></a>
-<span class="sourceLineNo">308</span>        }<a name="line.308"></a>
-<span class="sourceLineNo">309</span><a name="line.309"></a>
-<span class="sourceLineNo">310</span>        if (cmd.startsWith("--shuffle")) {<a name="line.310"></a>
-<span class="sourceLineNo">311</span>          shuffle = true;<a name="line.311"></a>
-<span class="sourceLineNo">312</span>          continue;<a name="line.312"></a>
-<span class="sourceLineNo">313</span>        }<a name="line.313"></a>
-<span class="sourceLineNo">314</span><a name="line.314"></a>
-<span class="sourceLineNo">315</span>        if (i == args.length-1) {<a name="line.315"></a>
-<span class="sourceLineNo">316</span>          tableName = cmd;<a name="line.316"></a>
-<span class="sourceLineNo">317</span>        } else {<a name="line.317"></a>
-<span class="sourceLineNo">318</span>          printUsage("Invalid argument '" + cmd + "'");<a name="line.318"></a>
-<span class="sourceLineNo">319</span>          return false;<a name="line.319"></a>
-<span class="sourceLineNo">320</span>        }<a name="line.320"></a>
-<span class="sourceLineNo">321</span>      }<a name="line.321"></a>
-<span class="sourceLineNo">322</span>      if (dstTableName == null &amp;&amp; peerAddress == null) {<a name="line.322"></a>
-<span class="sourceLineNo">323</span>        printUsage("At least a new table name or a " +<a name="line.323"></a>
-<span class="sourceLineNo">324</span>            "peer address must be specified");<a name="line.324"></a>
-<span class="sourceLineNo">325</span>        return false;<a name="line.325"></a>
-<span class="sourceLineNo">326</span>      }<a name="line.326"></a>
-<span class="sourceLineNo">327</span>      if ((endTime != 0) &amp;&amp; (startTime &gt; endTime)) {<a name="line.327"></a>
-<span class="sourceLineNo">328</span>        printUsage("Invalid time range filter: starttime=" + startTime + " &gt;  endtime=" + endTime);<a name="line.328"></a>
-<span class="sourceLineNo">329</span>        return false;<a name="line.329"></a>
-<span class="sourceLineNo">330</span>      }<a name="line.330"></a>
-<span class="sourceLineNo">331</span><a name="line.331"></a>
-<span class="sourceLineNo">332</span>      if (bulkload &amp;&amp; peerAddress != null) {<a name="line.332"></a>
-<span class="sourceLineNo">333</span>        printUsage("Remote bulkload is not supported!");<a name="line.333"></a>
-<span class="sourceLineNo">334</span>        return false;<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>      // set dstTableName if necessary<a name="line.337"></a>
-<span class="sourceLineNo">338</span>      if (dstTableName == null) {<a name="line.338"></a>
-<span class="sourceLineNo">339</span>        dstTableName = tableName;<a name="line.339"></a>
-<span class="sourceLineNo">340</span>      }<a name="line.340"></a>
-<span class="sourceLineNo">341</span>    } catch (Exception e) {<a name="line.341"></a>
-<span class="sourceLineNo">342</span>      LOG.error("Failed to parse commandLine arguments", e);<a name="line.342"></a>
-<span class="sourceLineNo">343</span>      printUsage("Can't start because " + e.getMessage());<a name="line.343"></a>
-<span class="sourceLineNo">344</span>      return false;<a name="line.344"></a>
-<span class="sourceLineNo">345</span>    }<a name="line.345"></a>
-<span class="sourceLineNo">346</span>    return true;<a name="line.346"></a>
-<span class="sourceLineNo">347</span>  }<a name="line.347"></a>
-<span class="sourceLineNo">348</span><a name="line.348"></a>
-<span class="sourceLineNo">349</span>  /**<a name="line.349"></a>
-<span class="sourceLineNo">350</span>   * Main entry point.<a name="line.350"></a>
-<span class="sourceLineNo">351</span>   *<a name="line.351"></a>
-<span class="sourceLineNo">352</span>   * @param args  The command line parameters.<a name="line.352"></a>
-<span class="sourceLineNo">353</span>   * @throws Exception When running the job fails.<a name="line.353"></a>
-<span class="sourceLineNo">354</span>   */<a name="line.354"></a>
-<span class="sourceLineNo">355</span>  public static void main(String[] args) throws Exception {<a name="line.355"></a>
-<span class="sourceLineNo">356</span>    int ret = ToolRunner.run(HBaseConfiguration.create(), new CopyTable(), args);<a name="line.356"></a>
-<span class="sourceLineNo">357</span>    System.exit(ret);<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>  @Override<a name="line.360"></a>
-<span class="sourceLineNo">361</span>  public int run(String[] args) throws Exception {<a name="line.361"></a>
-<span class="sourceLineNo">362</span>    Job job = createSubmittableJob(args);<a name="line.362"></a>
-<span class="sourceLineNo">363</span>    if (job == null) return 1;<a name="line.363"></a>
-<span class="sourceLineNo">364</span>    if (!job.waitForCompletion(true)) {<a name="line.364"></a>
-<span class="sourceLineNo">365</span>      LOG.info("Map-reduce job failed!");<a name="line.365"></a>
-<span class="sourceLineNo">366</span>      if (bulkload) {<a name="line.366"></a>
-<span class="sourceLineNo">367</span>        LOG.info("Files are not bulkloaded!");<a name="line.367"></a>
-<span class="sourceLineNo">368</span>      }<a name="line.368"></a>
-<span class="sourceLineNo">369</span>      return 1;<a name="line.369"></a>
-<span class="sourceLineNo">370</span>    }<a name="line.370"></a>
-<span class="sourceLineNo">371</span>    int code = 0;<a name="line.371"></a>
-<span class="sourceLineNo">372</span>    if (bulkload) {<a name="line.372"></a>
-<span class="sourceLineNo">373</span>      code = new LoadIncrementalHFiles(this.getConf()).run(new String[]{this.bulkloadDir.toString(),<a name="line.373"></a>
-<span class="sourceLineNo">374</span>          this.dstTableName});<a name="line.374"></a>
-<span class="sourceLineNo">375</span>      if (code == 0) {<a name="line.375"></a>
-<span class="sourceLineNo">376</span>        // bulkloadDir is deleted only LoadIncrementalHFiles was successful so that one can rerun<a name="line.376"></a>
-<span class="sourceLineNo">377</span>        // LoadIncrementalHFiles.<a name="line.377"></a>
-<span class="sourceLineNo">378</span>        FileSystem fs = FileSystem.get(this.getConf());<a name="line.378"></a>
-<span class="sourceLineNo">379</span>        if (!fs.delete(this.bulkloadDir, true)) {<a name="line.379"></a>
-<span class="sourceLineNo">380</span>          LOG.error("Deleting folder " + bulkloadDir + " failed!");<a name="line.380"></a>
-<span class="sourceLineNo">381</span>          code = 1;<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>    return code;<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">032</span>import org.apache.hadoop.hbase.util.FSUtils;<a name="line.32"></a>
+<span class="sourceLineNo">033</span>import org.apache.yetus.audience.InterfaceAudience;<a name="line.33"></a>
+<span class="sourceLineNo">034</span>import org.slf4j.Logger;<a name="line.34"></a>
+<span class="sourceLineNo">035</span>import org.slf4j.LoggerFactory;<a name="line.35"></a>
+<span class="sourceLineNo">036</span>import org.apache.hadoop.hbase.client.Admin;<a name="line.36"></a>
+<span class="sourceLineNo">037</span>import org.apache.hadoop.hbase.client.Connection;<a name="line.37"></a>
+<span class="sourceLineNo">038</span>import org.apache.hadoop.hbase.client.ConnectionFactory;<a name="line.38"></a>
+<span class="sourceLineNo">039</span>import org.apache.hadoop.hbase.client.Scan;<a name="line.39"></a>
+<span class="sourceLineNo">040</span>import org.apache.hadoop.hbase.tool.LoadIncrementalHFiles;<a name="line.40"></a>
+<span class="sourceLineNo">041</span>import org.apache.hadoop.hbase.util.Bytes;<a name="line.41"></a>
+<span class="sourceLineNo">042</span>import org.apache.hadoop.mapreduce.Job;<a name="line.42"></a>
+<span class="sourceLineNo">043</span>import org.apache.hadoop.util.Tool;<a name="line.43"></a>
+<span class="sourceLineNo">044</span>import org.apache.hadoop.util.ToolRunner;<a name="line.44"></a>
+<span class="sourceLineNo">045</span><a name="line.45"></a>
+<span class="sourceLineNo">046</span>/**<a name="line.46"></a>
+<span class="sourceLineNo">047</span> * Tool used to copy a table to another one which can be on a different setup.<a name="line.47"></a>
+<span class="sourceLineNo">048</span> * It is also configurable with a start and time as well as a specification<a name="line.48"></a>
+<span class="sourceLineNo">049</span> * of the region server implementation if different from the local cluster.<a name="line.49"></a>
+<span class="sourceLineNo">050</span> */<a name="line.50"></a>
+<span class="sourceLineNo">051</span>@InterfaceAudience.Public<a name="line.51"></a>
+<span class="sourceLineNo">052</span>public class CopyTable extends Configured implements Tool {<a name="line.52"></a>
+<span class="sourceLineNo">053</span>  private static final Logger LOG = LoggerFactory.getLogger(CopyTable.class);<a name="line.53"></a>
+<span class="sourceLineNo">054</span><a name="line.54"></a>
+<span class="sourceLineNo">055</span>  final static String NAME = "copytable";<a name="line.55"></a>
+<span class="sourceLineNo">056</span>  long startTime = 0;<a name="line.56"></a>
+<span class="sourceLineNo">057</span>  long endTime = HConstants.LATEST_TIMESTAMP;<a name="line.57"></a>
+<span class="sourceLineNo">058</span>  int batch = Integer.MAX_VALUE;<a name="line.58"></a>
+<span class="sourceLineNo">059</span>  int cacheRow = -1;<a name="line.59"></a>
+<span class="sourceLineNo">060</span>  int versions = -1;<a name="line.60"></a>
+<span class="sourceLineNo">061</span>  String tableName = null;<a name="line.61"></a>
+<span class="sourceLineNo">062</span>  String startRow = null;<a name="line.62"></a>
+<span class="sourceLineNo">063</span>  String stopRow = null;<a name="line.63"></a>
+<span class="sourceLineNo">064</span>  String dstTableName = null;<a name="line.64"></a>
+<span class="sourceLineNo">065</span>  String peerAddress = null;<a name="line.65"></a>
+<span class="sourceLineNo">066</span>  String families = null;<a name="line.66"></a>
+<span class="sourceLineNo">067</span>  boolean allCells = false;<a name="line.67"></a>
+<span class="sourceLineNo">068</span>  static boolean shuffle = false;<a name="line.68"></a>
+<span class="sourceLineNo">069</span><a name="line.69"></a>
+<span class="sourceLineNo">070</span>  boolean bulkload = false;<a name="line.70"></a>
+<span class="sourceLineNo">071</span>  Path bulkloadDir = null;<a name="line.71"></a>
+<span class="sourceLineNo">072</span><a name="line.72"></a>
+<span class="sourceLineNo">073</span>  private final static String JOB_NAME_CONF_KEY = "mapreduce.job.name";<a name="line.73"></a>
+<span class="sourceLineNo">074</span><a name="line.74"></a>
+<span class="sourceLineNo">075</span>  /**<a name="line.75"></a>
+<span class="sourceLineNo">076</span>   * Sets up the actual job.<a name="line.76"></a>
+<span class="sourceLineNo">077</span>   *<a name="line.77"></a>
+<span class="sourceLineNo">078</span>   * @param args  The command line parameters.<a name="line.78"></a>
+<span class="sourceLineNo">079</span>   * @return The newly created job.<a name="line.79"></a>
+<span class="sourceLineNo">080</span>   * @throws IOException When setting up the job fails.<a name="line.80"></a>
+<span class="sourceLineNo">081</span>   */<a name="line.81"></a>
+<span class="sourceLineNo">082</span>  public Job createSubmittableJob(String[] args)<a name="line.82"></a>
+<span class="sourceLineNo">083</span>  throws IOException {<a name="line.83"></a>
+<span class="sourceLineNo">084</span>    if (!doCommandLine(args)) {<a name="line.84"></a>
+<span class="sourceLineNo">085</span>      return null;<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>    Job job = Job.getInstance(getConf(), getConf().get(JOB_NAME_CONF_KEY, NAME + "_" + tableName));<a name="line.88"></a>
+<span class="sourceLineNo">089</span>    job.setJarByClass(CopyTable.class);<a name="line.89"></a>
+<span class="sourceLineNo">090</span>    Scan scan = new Scan();<a name="line.90"></a>
+<span class="sourceLineNo">091</span><a name="line.91"></a>
+<span class="sourceLineNo">092</span>    scan.setBatch(batch);<a name="line.92"></a>
+<span class="sourceLineNo">093</span>    scan.setCacheBlocks(false);<a name="line.93"></a>
+<span class="sourceLineNo">094</span><a name="line.94"></a>
+<span class="sourceLineNo">095</span>    if (cacheRow &gt; 0) {<a name="line.95"></a>
+<span class="sourceLineNo">096</span>      scan.setCaching(cacheRow);<a name="line.96"></a>
+<span class="sourceLineNo">097</span>    } else {<a name="line.97"></a>
+<span class="sourceLineNo">098</span>      scan.setCaching(getConf().getInt(HConstants.HBASE_CLIENT_SCANNER_CACHING, 100));<a name="line.98"></a>
+<span class="sourceLineNo">099</span>    }<a name="line.99"></a>
+<span class="sourceLineNo">100</span><a name="line.100"></a>
+<span class="sourceLineNo">101</span>    scan.setTimeRange(startTime, endTime);<a name="line.101"></a>
+<span class="sourceLineNo">102</span><a name="line.102"></a>
+<span class="sourceLineNo">103</span>    if (allCells) {<a name="line.103"></a>
+<span class="sourceLineNo">104</span>      scan.setRaw(true);<a name="line.104"></a>
+<span class="sourceLineNo">105</span>    }<a name="line.105"></a>
+<span class="sourceLineNo">106</span>    if (shuffle) {<a name="line.106"></a>
+<span class="sourceLineNo">107</span>      job.getConfiguration().set(TableInputFormat.SHUFFLE_MAPS, "true");<a name="line.107"></a>
+<span class="sourceLineNo">108</span>    }<a name="line.108"></a>
+<span class="sourceLineNo">109</span>    if (versions &gt;= 0) {<a name="line.109"></a>
+<span class="sourceLineNo">110</span>      scan.setMaxVersions(versions);<a name="line.110"></a>
+<span class="sourceLineNo">111</span>    }<a name="line.111"></a>
+<span class="sourceLineNo">112</span><a name="line.112"></a>
+<span class="sourceLineNo">113</span>    if (startRow != null) {<a name="line.113"></a>
+<span class="sourceLineNo">114</span>      scan.setStartRow(Bytes.toBytesBinary(startRow));<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>    if (stopRow != null) {<a name="line.117"></a>
+<span class="sourceLineNo">118</span>      scan.setStopRow(Bytes.toBytesBinary(stopRow));<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>    if(families != null) {<a name="line.121"></a>
+<span class="sourceLineNo">122</span>      String[] fams = families.split(",");<a name="line.122"></a>
+<span class="sourceLineNo">123</span>      Map&lt;String,String&gt; cfRenameMap = new HashMap&lt;&gt;();<a name="line.123"></a>
+<span class="sourceLineNo">124</span>      for(String fam : fams) {<a name="line.124"></a>
+<span class="sourceLineNo">125</span>        String sourceCf;<a name="line.125"></a>
+<span class="sourceLineNo">126</span>        if(fam.contains(":")) {<a name="line.126"></a>
+<span class="sourceLineNo">127</span>            // fam looks like "sourceCfName:destCfName"<a name="line.127"></a>
+<span class="sourceLineNo">128</span>            String[] srcAndDest = fam.split(":", 2);<a name="line.128"></a>
+<span class="sourceLineNo">129</span>            sourceCf = srcAndDest[0];<a name="line.129"></a>
+<span class="sourceLineNo">130</span>            String destCf = srcAndDest[1];<a name="line.130"></a>
+<span class="sourceLineNo">131</span>            cfRenameMap.put(sourceCf, destCf);<a name="line.131"></a>
+<span class="sourceLineNo">132</span>        } else {<a name="line.132"></a>
+<span class="sourceLineNo">133</span>            // fam is just "sourceCf"<a name="line.133"></a>
+<span class="sourceLineNo">134</span>            sourceCf = fam;<a name="line.134"></a>
+<span class="sourceLineNo">135</span>        }<a name="line.135"></a>
+<span class="sourceLineNo">136</span>        scan.addFamily(Bytes.toBytes(sourceCf));<a name="line.136"></a>
+<span class="sourceLineNo">137</span>      }<a name="line.137"></a>
+<span class="sourceLineNo">138</span>      Import.configureCfRenaming(job.getConfiguration(), cfRenameMap);<a name="line.138"></a>
+<span class="sourceLineNo">139</span>    }<a name="line.139"></a>
+<span class="sourceLineNo">140</span>    job.setNumReduceTasks(0);<a name="line.140"></a>
+<span class="sourceLineNo">141</span><a name="line.141"></a>
+<span class="sourceLineNo">142</span>    if (bulkload) {<a name="line.142"></a>
+<span class="sourceLineNo">143</span>      TableMapReduceUtil.initTableMapperJob(tableName, scan, Import.CellImporter.class, null, null,<a name="line.143"></a>
+<span class="sourceLineNo">144</span>        job);<a name="line.144"></a>
+<span class="sourceLineNo">145</span><a name="line.145"></a>
+<span class="sourceLineNo">146</span>      // We need to split the inputs by destination tables so that output of Map can be bulk-loaded.<a name="line.146"></a>
+<span class="sourceLineNo">147</span>      TableInputFormat.configureSplitTable(job, TableName.valueOf(dstTableName));<a name="line.147"></a>
+<span class="sourceLineNo">148</span><a name="line.148"></a>
+<span class="sourceLineNo">149</span>      FileSystem fs = FSUtils.getCurrentFileSystem(getConf());<a name="line.149"></a>
+<span class="sourceLineNo">150</span>      Random rand = new Random();<a name="line.150"></a>
+<span class="sourceLineNo">151</span>      Path root = new Path(fs.getWorkingDirectory(), "copytable");<a name="line.151"></a>
+<span class="sourceLineNo">152</span>      fs.mkdirs(root);<a name="line.152"></a>
+<span class="sourceLineNo">153</span>      while (true) {<a name="line.153"></a>
+<span class="sourceLineNo">154</span>        bulkloadDir = new Path(root, "" + rand.nextLong());<a name="line.154"></a>
+<span class="sourceLineNo">155</span>        if (!fs.exists(bulkloadDir)) {<a name="line.155"></a>
+<span class="sourceLineNo">156</span>          break;<a name="line.156"></a>
+<span class="sourceLineNo">157</span>        }<a name="line.157"></a>
+<span class="sourceLineNo">158</span>      }<a name="line.158"></a>
+<span class="sourceLineNo">159</span><a name="line.159"></a>
+<span class="sourceLineNo">160</span>      System.out.println("HFiles will be stored at " + this.bulkloadDir);<a name="line.160"></a>
+<span class="sourceLineNo">161</span>      HFileOutputFormat2.setOutputPath(job, bulkloadDir);<a name="line.161"></a>
+<span class="sourceLineNo">162</span>      try (Connection conn = ConnectionFactory.createConnection(getConf());<a name="line.162"></a>
+<span class="sourceLineNo">163</span>          Admin admin = conn.getAdmin()) {<a name="line.163"></a>
+<span class="sourceLineNo">164</span>        HFileOutputFormat2.configureIncrementalLoadMap(job,<a name="line.164"></a>
+<span class="sourceLineNo">165</span>          admin.getDescriptor((TableName.valueOf(dstTableName))));<a name="line.165"></a>
+<span class="sourceLineNo">166</span>      }<a name="line.166"></a>
+<span class="sourceLineNo">167</span>    } else {<a name="line.167"></a>
+<span class="sourceLineNo">168</span>      TableMapReduceUtil.initTableMapperJob(tableName, scan,<a name="line.168"></a>
+<span class="sourceLineNo">169</span>        Import.Importer.class, null, null, job);<a name="line.169"></a>
+<span class="sourceLineNo">170</span><a name="line.170"></a>
+<span class="sourceLineNo">171</span>      TableMapReduceUtil.initTableReducerJob(dstTableName, null, job, null, peerAddress, null,<a name="line.171"></a>
+<span class="sourceLineNo">172</span>        null);<a name="line.172"></a>
+<span class="sourceLineNo">173</span>    }<a name="line.173"></a>
+<span class="sourceLineNo">174</span><a name="line.174"></a>
+<span class="sourceLineNo">175</span>    return job;<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>  /*<a name="line.178"></a>
+<span class="sourceLineNo">179</span>   * @param errorMsg Error message.  Can be null.<a name="line.179"></a>
+<span class="sourceLineNo">180</span>   */<a name="line.180"></a>
+<span class="sourceLineNo">181</span>  private static void printUsage(final String errorMsg) {<a name="line.181"></a>
+<span class="sourceLineNo">182</span>    if (errorMsg != null &amp;&amp; errorMsg.length() &gt; 0) {<a name="line.182"></a>
+<span class="sourceLineNo">183</span>      System.err.println("ERROR: " + errorMsg);<a name="line.183"></a>
+<span class="sourceLineNo">184</span>    }<a name="line.184"></a>
+<span class="sourceLineNo">185</span>    System.err.println("Usage: CopyTable [general options] [--starttime=X] [--endtime=Y] " +<a name="line.185"></a>
+<span class="sourceLineNo">186</span>        "[--new.name=NEW] [--peer.adr=ADR] &lt;tablename&gt;");<a name="line.186"></a>
+<span class="sourceLineNo">187</span>    System.err.println();<a name="line.187"></a>
+<span class="sourceLineNo">188</span>    System.err.println("Options:");<a name="line.188"></a>
+<span class="sourceLineNo">189</span>    System.err.println(" rs.class     hbase.regionserver.class of the peer cluster");<a name="line.189"></a>
+<span class="sourceLineNo">190</span>    System.err.println("              specify if different from current cluster");<a name="line.190"></a>
+<span class="sourceLineNo">191</span>    System.err.println(" rs.impl      hbase.regionserver.impl of the peer cluster");<a name="line.191"></a>
+<span class="sourceLineNo">192</span>    System.err.println(" startrow     the start row");<a name="line.192"></a>
+<span class="sourceLineNo">193</span>    System.err.println(" stoprow      the stop row");<a name="line.193"></a>
+<span class="sourceLineNo">194</span>    System.err.println(" starttime    beginning of the time range (unixtime in millis)");<a name="line.194"></a>
+<span class="sourceLineNo">195</span>    System.err.println("              without endtime means from starttime to forever");<a name="line.195"></a>
+<span class="sourceLineNo">196</span>    System.err.println(" endtime      end of the time range.  Ignored if no starttime specified.");<a name="line.196"></a>
+<span class="sourceLineNo">197</span>    System.err.println(" versions     number of cell versions to copy");<a name="line.197"></a>
+<span class="sourceLineNo">198</span>    System.err.println(" new.name     new table's name");<a name="line.198"></a>
+<span class="sourceLineNo">199</span>    System.err.println(" peer.adr     Address of the peer cluster given in the format");<a name="line.199"></a>
+<span class="sourceLineNo">200</span>    System.err.println("              hbase.zookeeper.quorum:hbase.zookeeper.client"<a name="line.200"></a>
+<span class="sourceLineNo">201</span>        + ".port:zookeeper.znode.parent");<a name="line.201"></a>
+<span class="sourceLineNo">202</span>    System.err.println(" families     comma-separated list of families to copy");<a name="line.202"></a>
+<span class="sourceLineNo">203</span>    System.err.println("              To copy from cf1 to cf2, give sourceCfName:destCfName. ");<a name="line.203"></a>
+<span class="sourceLineNo">204</span>    System.err.println("              To keep the same name, just give \"cfName\"");<a name="line.204"></a>
+<span class="sourceLineNo">205</span>    System.err.println(" all.cells    also copy delete markers and deleted cells");<a name="line.205"></a>
+<span class="sourceLineNo">206</span>    System.err.println(" bulkload     Write input into HFiles and bulk load to the destination "<a name="line.206"></a>
+<span class="sourceLineNo">207</span>        + "table");<a name="line.207"></a>
+<span class="sourceLineNo">208</span>    System.err.println();<a name="line.208"></a>
+<span class="sourceLineNo">209</span>    System.err.println("Args:");<a name="line.209"></a>
+<span class="sourceLineNo">210</span>    System.err.println(" tablename    Name of the table to copy");<a name="line.210"></a>
+<span class="sourceLineNo">211</span>    System.err.println();<a name="line.211"></a>
+<span class="sourceLineNo">212</span>    System.err.println("Examples:");<a name="line.212"></a>
+<span class="sourceLineNo">213</span>    System.err.println(" To copy 'TestTable' to a cluster that uses replication for a 1 hour window:");<a name="line.213"></a>
+<span class="sourceLineNo">214</span>    System.err.println(" $ hbase " +<a name="line.214"></a>
+<span class="sourceLineNo">215</span>        "org.apache.hadoop.hbase.mapreduce.CopyTable --starttime=1265875194289 --endtime=1265878794289 " +<a name="line.215"></a>
+<span class="sourceLineNo">216</span>        "--peer.adr=server1,server2,server3:2181:/hbase --families=myOldCf:myNewCf,cf2,cf3 TestTable ");<a name="line.216"></a>
+<span class="sourceLineNo">217</span>    System.err.println("For performance consider the following general option:\n"<a name="line.217"></a>
+<span class="sourceLineNo">218</span>        + "  It is recommended that you set the following to &gt;=100. A higher value uses more memory but\n"<a name="line.218"></a>
+<span class="sourceLineNo">219</span>        + "  decreases the round trip time to the server and may increase performance.\n"<a name="line.219"></a>
+<span class="sourceLineNo">220</span>        + "    -Dhbase.client.scanner.caching=100\n"<a name="line.220"></a>
+<span class="sourceLineNo">221</span>        + "  The following should always be set to false, to prevent writing data twice, which may produce \n"<a name="line.221"></a>
+<span class="sourceLineNo">222</span>        + "  inaccurate results.\n"<a name="line.222"></a>
+<span class="sourceLineNo">223</span>        + "    -Dmapreduce.map.speculative=false");<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>  private boolean doCommandLine(final String[] args) {<a name="line.226"></a>
+<span class="sourceLineNo">227</span>    // Process command-line args. TODO: Better cmd-line processing<a name="line.227"></a>
+<span class="sourceLineNo">228</span>    // (but hopefully something not as painful as cli options).<a name="line.228"></a>
+<span class="sourceLineNo">229</span>    if (args.length &lt; 1) {<a name="line.229"></a>
+<span class="sourceLineNo">230</span>      printUsage(null);<a name="line.230"></a>
+<span class="sourceLineNo">231</span>      return false;<a name="line.231"></a>
+<span class="sourceLineNo">232</span>    }<a name="line.232"></a>
+<span class="sourceLineNo">233</span>    try {<a name="line.233"></a>
+<span class="sourceLineNo">234</span>      for (int i = 0; i &lt; args.length; i++) {<a name="line.234"></a>
+<span class="sourceLineNo">235</span>        String cmd = args[i];<a name="line.235"></a>
+<span class="sourceLineNo">236</span>        if (cmd.equals("-h") || cmd.startsWith("--h")) {<a name="line.236"></a>
+<span class="sourceLineNo">237</span>          printUsage(null);<a name="line.237"></a>
+<span class="sourceLineNo">238</span>          return false;<a name="line.238"></a>
+<span class="sourceLineNo">239</span>        }<a name="line.239"></a>
+<span class="sourceLineNo">240</span><a name="line.240"></a>
+<span class="sourceLineNo">241</span>        final String startRowArgKey = "--startrow=";<a name="line.241"></a>
+<span class="sourceLineNo">242</span>        if (cmd.startsWith(startRowArgKey)) {<a name="line.242"></a>
+<span class="sourceLineNo">243</span>          startRow = cmd.substring(startRowArgKey.length());<a name="line.243"></a>
+<span class="sourceLineNo">244</span>          continue;<a name="line.244"></a>
+<span class="sourceLineNo">245</span>        }<a name="line.245"></a>
+<span class="sourceLineNo">246</span><a name="line.246"></a>
+<span class="sourceLineNo">247</span>        final String stopRowArgKey = "--stoprow=";<a name="line.247"></a>
+<span class="sourceLineNo">248</span>        if (cmd.startsWith(stopRowArgKey)) {<a name="line.248"></a>
+<span class="sourceLineNo">249</span>          stopRow = cmd.substring(stopRowArgKey.length());<a name="line.249"></a>
+<span class="sourceLineNo">250</span>          continue;<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>        final String startTimeArgKey = "--starttime=";<a name="line.253"></a>
+<span class="sourceLineNo">254</span>        if (cmd.startsWith(startTimeArgKey)) {<a name="line.254"></a>
+<span class="sourceLineNo">255</span>          startTime = Long.parseLong(cmd.substring(startTimeArgKey.length()));<a name="line.255"></a>
+<span class="sourceLineNo">256</span>          continue;<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>        final String endTimeArgKey = "--endtime=";<a name="line.259"></a>
+<span class="sourceLineNo">260</span>        if (cmd.startsWith(endTimeArgKey)) {<a name="line.260"></a>
+<span class="sourceLineNo">261</span>          endTime = Long.parseLong(cmd.substring(endTimeArgKey.length()));<a name="line.261"></a>
+<span class="sourceLineNo">262</span>          continue;<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>        final String batchArgKey = "--batch=";<a name="line.265"></a>
+<span class="sourceLineNo">266</span>        if (cmd.startsWith(batchArgKey)) {<a name="line.266"></a>
+<span class="sourceLineNo">267</span>          batch = Integer.parseInt(cmd.substring(batchArgKey.length()));<a name="line.267"></a>
+<span class="sourceLineNo">268</span>          continue;<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>        final String cacheRowArgKey = "--cacheRow=";<a name="line.271"></a>
+<span class="sourceLineNo">272</span>        if (cmd.startsWith(cacheRowArgKey)) {<a name="line.272"></a>
+<span class="sourceLineNo">273</span>          cacheRow = Integer.parseInt(cmd.substring(cacheRowArgKey.length()));<a name="line.273"></a>
+<span class="sourceLineNo">274</span>          continue;<a name="line.274"></a>
+<span class="sourceLineNo">275</span>        }<a name="line.275"></a>
+<span class="sourceLineNo">276</span><a name="line.276"></a>
+<span class="sourceLineNo">277</span>        final String versionsArgKey = "--versions=";<a name="line.277"></a>
+<span class="sourceLineNo">278</span>        if (cmd.startsWith(versionsArgKey)) {<a name="line.278"></a>
+<span class="sourceLineNo">279</span>          versions = Integer.parseInt(cmd.substring(versionsArgKey.length()));<a name="line.279"></a>
+<span class="sourceLineNo">280</span>          continue;<a name="line.280"></a>
+<span class="sourceLineNo">281</span>        }<a name="line.281"></a>
+<span class="sourceLineNo">282</span><a name="line.282"></a>
+<span class="sourceLineNo">283</span>        final String newNameArgKey = "--new.name=";<a name="line.283"></a>
+<span class="sourceLineNo">284</span>        if (cmd.startsWith(newNameArgKey)) {<a name="line.284"></a>
+<span class="sourceLineNo">285</span>          dstTableName = cmd.substring(newNameArgKey.length());<a name="line.285"></a>
+<span class="sourceLineNo">286</span>          continue;<a name="line.286"></a>
+<span class="sourceLineNo">287</span>        }<a name="line.287"></a>
+<span class="sourceLineNo">288</span><a name="line.288"></a>
+<span class="sourceLineNo">289</span>        final String peerAdrArgKey = "--peer.adr=";<a name="line.289"></a>
+<span class="sourceLineNo">290</span>        if (cmd.startsWith(peerAdrArgKey)) {<a name="line.290"></a>
+<span class="sourceLineNo">291</span>          peerAddress = cmd.substring(peerAdrArgKey.length());<a name="line.291"></a>
+<span class="sourceLineNo">292</span>          continue;<a name="line.292"></a>
+<span class="sourceLineNo">293</span>        }<a name="line.293"></a>
+<span class="sourceLineNo">294</span><a name="line.294"></a>
+<span class="sourceLineNo">295</span>        final String familiesArgKey = "--families=";<a name="line.295"></a>
+<span class="sourceLineNo">296</span>        if (cmd.startsWith(familiesArgKey)) {<a name="line.296"></a>
+<span class="sourceLineNo">297</span>          families = cmd.substring(familiesArgKey.length());<a name="line.297"></a>
+<span class="sourceLineNo">298</span>          continue;<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>        if (cmd.startsWith("--all.cells")) {<a name="line.301"></a>
+<span class="sourceLineNo">302</span>          allCells = true;<a name="line.302"></a>
+<span class="sourceLineNo">303</span>          continue;<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>        if (cmd.startsWith("--bulkload")) {<a name="line.306"></a>
+<span class="sourceLineNo">307</span>          bulkload = true;<a name="line.307"></a>
+<span class="sourceLineNo">308</span>          continue;<a name="line.308"></a>
+<span class="sourceLineNo">309</span>        }<a name="line.309"></a>
+<span class="sourceLineNo">310</span><a name="line.310"></a>
+<span class="sourceLineNo">311</span>        if (cmd.startsWith("--shuffle")) {<a name="line.311"></a>
+<span class="sourceLineNo">312</span>          shuffle = true;<a name="line.312"></a>
+<span class="sourceLineNo">313</span>          continue;<a name="line.313"></a>
+<span class="sourceLineNo">314</span>        }<a name="line.314"></a>
+<span class="sourceLineNo">315</span><a name="line.315"></a>
+<span class="sourceLineNo">316</span>        if (i == args.length-1) {<a name="line.316"></a>
+<span class="sourceLineNo">317</span>          tableName = cmd;<a name="line.317"></a>
+<span class="sourceLineNo">318</span>        } else {<a name="line.318"></a>
+<span class="sourceLineNo">319</span>          printUsage("Invalid argument '" + cmd + "'");<a name="line.319"></a>
+<span class="sourceLineNo">320</span>          return false;<a name="line.320"></a>
+<span class="sourceLineNo">321</span>        }<a name="line.321"></a>
+<span class="sourceLineNo">322</span>      }<a name="line.322"></a>
+<span class="sourceLineNo">323</span>      if (dstTableName == null &amp;&amp; peerAddress == null) {<a name="line.323"></a>
+<span class="sourceLineNo">324</span>        printUsage("At least a new table name or a " +<a name="line.324"></a>
+<span class="sourceLineNo">325</span>            "peer address must be specified");<a name="line.325"></a>
+<span class="sourceLineNo">326</span>        return false;<a name="line.326"></a>
+<span class="sourceLineNo">327</span>      }<a name="line.327"></a>
+<span class="sourceLineNo">328</span>      if ((endTime != 0) &amp;&amp; (startTime &gt; endTime)) {<a name="line.328"></a>
+<span class="sourceLineNo">329</span>        printUsage("Invalid time range filter: starttime=" + startTime + " &gt;  endtime=" + endTime);<a name="line.329"></a>
+<span class="sourceLineNo">330</span>        return false;<a name="line.330"></a>
+<span class="sourceLineNo">331</span>      }<a name="line.331"></a>
+<span class="sourceLineNo">332</span><a name="line.332"></a>
+<span class="sourceLineNo">333</span>      if (bulkload &amp;&amp; peerAddress != null) {<a name="line.333"></a>
+<span class="sourceLineNo">334</span>        printUsage("Remote bulkload is not supported!");<a name="line.334"></a>
+<span class="sourceLineNo">335</span>        return false;<a name="line.335"></a>
+<span class="sourceLineNo">336</span>      }<a name="line.336"></a>
+<span class="sourceLineNo">337</span><a name="line.337"></a>
+<span class="sourceLineNo">338</span>      // set dstTableName if necessary<a name="line.338"></a>
+<span class="sourceLineNo">339</span>      if (dstTableName == null) {<a name="line.339"></a>
+<span class="sourceLineNo">340</span>        dstTableName = tableName;<a name="line.340"></a>
+<span class="sourceLineNo">341</span>      }<a name="line.341"></a>
+<span class="sourceLineNo">342</span>    } catch (Exception e) {<a name="line.342"></a>
+<span class="sourceLineNo">343</span>      LOG.error("Failed to parse commandLine arguments", e);<a name="line.343"></a>
+<span class="sourceLineNo">344</span>      printUsage("Can't start because " + e.getMessage());<a name="line.344"></a>
+<span class="sourceLineNo">345</span>      return false;<a name="line.345"></a>
+<span class="sourceLineNo">346</span>    }<a name="line.346"></a>
+<span class="sourceLineNo">347</span>    return true;<a name="line.347"></a>
+<span class="sourceLineNo">348</span>  }<a name="line.348"></a>
+<span class="sourceLineNo">349</span><a name="line.349"></a>
+<span class="sourceLineNo">350</span>  /**<a name="line.350"></a>
+<span class="sourceLineNo">351</span>   * Main entry point.<a name="line.351"></a>
+<span class="sourceLineNo">352</span>   *<a name="line.352"></a>
+<span class="sourceLineNo">353</span>   * @param args  The command line parameters.<a name="line.353"></a>
+<span class="sourceLineNo">354</span>   * @throws Exception When running the job fails.<a name="line.354"></a>
+<span class="sourceLineNo">355</span>   */<a name="line.355"></a>
+<span class="sourceLineNo">356</span>  public static void main(String[] args) throws Exception {<a name="line.356"></a>
+<span class="sourceLineNo">357</span>    int ret = ToolRunner.run(HBaseConfiguration.create(), new CopyTable(), args);<a name="line.357"></a>
+<span class="sourceLineNo">358</span>    System.exit(ret);<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>  @Override<a name="line.361"></a>
+<span class="sourceLineNo">362</span>  public int run(String[] args) throws Exception {<a name="line.362"></a>
+<span class="sourceLineNo">363</span>    Job job = createSubmittableJob(args);<a name="line.363"></a>
+<span class="sourceLineNo">364</span>    if (job == null) return 1;<a name="line.364"></a>
+<span class="sourceLineNo">365</span>    if (!job.waitForCompletion(true)) {<a name="line.365"></a>
+<span class="sourceLineNo">366</span>      LOG.info("Map-reduce job failed!");<a name="line.366"></a>
+<span class="sourceLineNo">367</span>      if (bulkload) {<a name="line.367"></a>
+<span class="sourceLineNo">368</span>        LOG.info("Files are not bulkloaded!");<a name="line.368"></a>
+<span class="sourceLineNo">369</span>      }<a name="line.369"></a>
+<span class="sourceLineNo">370</span>      return 1;<a name="line.370"></a>
+<span class="sourceLineNo">371</span>    }<a name="line.371"></a>
+<span class="sourceLineNo">372</span>    int code = 0;<a name="line.372"></a>
+<span class="sourceLineNo">373</span>    if (bulkload) {<a name="line.373"></a>
+<span class="sourceLineNo">374</span>      code = new LoadIncrementalHFiles(this.getConf())<a name="line.374"></a>
+<span class="sourceLineNo">375</span>          .run(new String[] { this.bulkloadDir.toString(), this.dstTableName });<a name="line.375"></a>
+<span class="sourceLineNo">376</span>      if (code == 0) {<a name="line.376"></a>
+<span class="sourceLineNo">377</span>        // bulkloadDir is deleted only LoadIncrementalHFiles was successful so that one can rerun<a name="line.377"></a>
+<span class="sourceLineNo">378</span>        // LoadIncrementalHFiles.<a name="line.378"></a>
+<span class="sourceLineNo">379</span>        FileSystem fs = FSUtils.getCurrentFileSystem(getConf());<a name="line.379"></a>
+<span class="sourceLineNo">380</span>        if (!fs.delete(this.bulkloadDir, true)) {<a name="line.380"></a>
+<span class="sourceLineNo">381</span>          LOG.error("Deleting folder " + bulkloadDir + " failed!");<a name="line.381"></a>
+<span class="sourceLineNo">382</span>          code = 1;<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>    return code;<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>
 
 
 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/27f5bfb5/book.html
----------------------------------------------------------------------
diff --git a/book.html b/book.html
index 9aec55c..5e3f533 100644
--- a/book.html
+++ b/book.html
@@ -41318,7 +41318,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-11-09 14:33:44 UTC
+Last updated 2018-11-10 14:32:24 UTC
 </div>
 </div>
 </body>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/27f5bfb5/bulk-loads.html
----------------------------------------------------------------------
diff --git a/bulk-loads.html b/bulk-loads.html
index 65a62c8..29b149f 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="20181109" />
+    <meta name="Date-Revision-yyyymmdd" content="20181110" />
     <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-11-09</li>
+                  <li id="publishDate" class="pull-right">Last Published: 2018-11-10</li>
             </p>
                 </div>
 


[05/29] hbase-site git commit: Published site at 5e84997f2ffdbcf5f849d70c30ddbe2db4039ca4.

Posted by gi...@apache.org.
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/27f5bfb5/testdevapidocs/src-html/org/apache/hadoop/hbase/procedure2/TestProcedureBypass.StuckStateMachineState.html
----------------------------------------------------------------------
diff --git a/testdevapidocs/src-html/org/apache/hadoop/hbase/procedure2/TestProcedureBypass.StuckStateMachineState.html b/testdevapidocs/src-html/org/apache/hadoop/hbase/procedure2/TestProcedureBypass.StuckStateMachineState.html
index 7eb899a..f89b826 100644
--- a/testdevapidocs/src-html/org/apache/hadoop/hbase/procedure2/TestProcedureBypass.StuckStateMachineState.html
+++ b/testdevapidocs/src-html/org/apache/hadoop/hbase/procedure2/TestProcedureBypass.StuckStateMachineState.html
@@ -46,226 +46,262 @@
 <span class="sourceLineNo">038</span>import org.slf4j.Logger;<a name="line.38"></a>
 <span class="sourceLineNo">039</span>import org.slf4j.LoggerFactory;<a name="line.39"></a>
 <span class="sourceLineNo">040</span><a name="line.40"></a>
-<span class="sourceLineNo">041</span><a name="line.41"></a>
+<span class="sourceLineNo">041</span>import org.apache.hadoop.hbase.shaded.protobuf.generated.ProcedureProtos;<a name="line.41"></a>
 <span class="sourceLineNo">042</span><a name="line.42"></a>
-<span class="sourceLineNo">043</span>@Category({MasterTests.class, SmallTests.class})<a name="line.43"></a>
-<span class="sourceLineNo">044</span>public class TestProcedureBypass {<a name="line.44"></a>
-<span class="sourceLineNo">045</span><a name="line.45"></a>
-<span class="sourceLineNo">046</span>  @ClassRule public static final HBaseClassTestRule CLASS_RULE = HBaseClassTestRule<a name="line.46"></a>
-<span class="sourceLineNo">047</span>      .forClass(TestProcedureBypass.class);<a name="line.47"></a>
-<span class="sourceLineNo">048</span><a name="line.48"></a>
-<span class="sourceLineNo">049</span>  private static final Logger LOG = LoggerFactory.getLogger(TestProcedureBypass.class);<a name="line.49"></a>
-<span class="sourceLineNo">050</span><a name="line.50"></a>
-<span class="sourceLineNo">051</span>  private static final int PROCEDURE_EXECUTOR_SLOTS = 1;<a name="line.51"></a>
-<span class="sourceLineNo">052</span><a name="line.52"></a>
-<span class="sourceLineNo">053</span>  private static TestProcEnv procEnv;<a name="line.53"></a>
-<span class="sourceLineNo">054</span>  private static ProcedureStore procStore;<a name="line.54"></a>
-<span class="sourceLineNo">055</span><a name="line.55"></a>
-<span class="sourceLineNo">056</span>  private static ProcedureExecutor&lt;TestProcEnv&gt; procExecutor;<a name="line.56"></a>
-<span class="sourceLineNo">057</span><a name="line.57"></a>
-<span class="sourceLineNo">058</span>  private static HBaseCommonTestingUtility htu;<a name="line.58"></a>
-<span class="sourceLineNo">059</span><a name="line.59"></a>
-<span class="sourceLineNo">060</span>  private static FileSystem fs;<a name="line.60"></a>
-<span class="sourceLineNo">061</span>  private static Path testDir;<a name="line.61"></a>
-<span class="sourceLineNo">062</span>  private static Path logDir;<a name="line.62"></a>
-<span class="sourceLineNo">063</span><a name="line.63"></a>
-<span class="sourceLineNo">064</span>  private static class TestProcEnv {<a name="line.64"></a>
-<span class="sourceLineNo">065</span>  }<a name="line.65"></a>
-<span class="sourceLineNo">066</span><a name="line.66"></a>
-<span class="sourceLineNo">067</span>  @BeforeClass<a name="line.67"></a>
-<span class="sourceLineNo">068</span>  public static void setUp() throws Exception {<a name="line.68"></a>
-<span class="sourceLineNo">069</span>    htu = new HBaseCommonTestingUtility();<a name="line.69"></a>
-<span class="sourceLineNo">070</span><a name="line.70"></a>
-<span class="sourceLineNo">071</span>    // NOTE: The executor will be created by each test<a name="line.71"></a>
-<span class="sourceLineNo">072</span>    procEnv = new TestProcEnv();<a name="line.72"></a>
-<span class="sourceLineNo">073</span>    testDir = htu.getDataTestDir();<a name="line.73"></a>
-<span class="sourceLineNo">074</span>    fs = testDir.getFileSystem(htu.getConfiguration());<a name="line.74"></a>
-<span class="sourceLineNo">075</span>    assertTrue(testDir.depth() &gt; 1);<a name="line.75"></a>
-<span class="sourceLineNo">076</span><a name="line.76"></a>
-<span class="sourceLineNo">077</span>    logDir = new Path(testDir, "proc-logs");<a name="line.77"></a>
-<span class="sourceLineNo">078</span>    procStore = ProcedureTestingUtility.createWalStore(htu.getConfiguration(), logDir);<a name="line.78"></a>
-<span class="sourceLineNo">079</span>    procExecutor = new ProcedureExecutor&lt;&gt;(htu.getConfiguration(), procEnv,<a name="line.79"></a>
-<span class="sourceLineNo">080</span>        procStore);<a name="line.80"></a>
-<span class="sourceLineNo">081</span>    procStore.start(PROCEDURE_EXECUTOR_SLOTS);<a name="line.81"></a>
-<span class="sourceLineNo">082</span>    ProcedureTestingUtility<a name="line.82"></a>
-<span class="sourceLineNo">083</span>        .initAndStartWorkers(procExecutor, PROCEDURE_EXECUTOR_SLOTS, true);<a name="line.83"></a>
-<span class="sourceLineNo">084</span>  }<a name="line.84"></a>
-<span class="sourceLineNo">085</span><a name="line.85"></a>
-<span class="sourceLineNo">086</span>  @Test<a name="line.86"></a>
-<span class="sourceLineNo">087</span>  public void testBypassSuspendProcedure() throws Exception {<a name="line.87"></a>
-<span class="sourceLineNo">088</span>    final SuspendProcedure proc = new SuspendProcedure();<a name="line.88"></a>
-<span class="sourceLineNo">089</span>    long id = procExecutor.submitProcedure(proc);<a name="line.89"></a>
-<span class="sourceLineNo">090</span>    Thread.sleep(500);<a name="line.90"></a>
-<span class="sourceLineNo">091</span>    //bypass the procedure<a name="line.91"></a>
-<span class="sourceLineNo">092</span>    assertTrue(procExecutor.bypassProcedure(id, 30000, false, false));<a name="line.92"></a>
-<span class="sourceLineNo">093</span>    htu.waitFor(5000, () -&gt; proc.isSuccess() &amp;&amp; proc.isBypass());<a name="line.93"></a>
-<span class="sourceLineNo">094</span>    LOG.info("{} finished", proc);<a name="line.94"></a>
-<span class="sourceLineNo">095</span>  }<a name="line.95"></a>
-<span class="sourceLineNo">096</span><a name="line.96"></a>
-<span class="sourceLineNo">097</span>  @Test<a name="line.97"></a>
-<span class="sourceLineNo">098</span>  public void testStuckProcedure() throws Exception {<a name="line.98"></a>
-<span class="sourceLineNo">099</span>    final StuckProcedure proc = new StuckProcedure();<a name="line.99"></a>
-<span class="sourceLineNo">100</span>    long id = procExecutor.submitProcedure(proc);<a name="line.100"></a>
-<span class="sourceLineNo">101</span>    Thread.sleep(500);<a name="line.101"></a>
-<span class="sourceLineNo">102</span>    //bypass the procedure<a name="line.102"></a>
-<span class="sourceLineNo">103</span>    assertTrue(procExecutor.bypassProcedure(id, 1000, true, false));<a name="line.103"></a>
-<span class="sourceLineNo">104</span>    //Since the procedure is stuck there, we need to restart the executor to recovery.<a name="line.104"></a>
-<span class="sourceLineNo">105</span>    ProcedureTestingUtility.restart(procExecutor);<a name="line.105"></a>
-<span class="sourceLineNo">106</span>    htu.waitFor(5000, () -&gt; proc.isSuccess() &amp;&amp; proc.isBypass());<a name="line.106"></a>
-<span class="sourceLineNo">107</span>    LOG.info("{} finished", proc);<a name="line.107"></a>
-<span class="sourceLineNo">108</span>  }<a name="line.108"></a>
-<span class="sourceLineNo">109</span><a name="line.109"></a>
-<span class="sourceLineNo">110</span>  @Test<a name="line.110"></a>
-<span class="sourceLineNo">111</span>  public void testBypassingProcedureWithParent() throws Exception {<a name="line.111"></a>
-<span class="sourceLineNo">112</span>    final RootProcedure proc = new RootProcedure();<a name="line.112"></a>
-<span class="sourceLineNo">113</span>    long rootId = procExecutor.submitProcedure(proc);<a name="line.113"></a>
-<span class="sourceLineNo">114</span>    htu.waitFor(5000, () -&gt; procExecutor.getProcedures().stream()<a name="line.114"></a>
-<span class="sourceLineNo">115</span>      .filter(p -&gt; p.getParentProcId() == rootId).collect(Collectors.toList())<a name="line.115"></a>
-<span class="sourceLineNo">116</span>      .size() &gt; 0);<a name="line.116"></a>
-<span class="sourceLineNo">117</span>    SuspendProcedure suspendProcedure = (SuspendProcedure)procExecutor.getProcedures().stream()<a name="line.117"></a>
-<span class="sourceLineNo">118</span>        .filter(p -&gt; p.getParentProcId() == rootId).collect(Collectors.toList()).get(0);<a name="line.118"></a>
-<span class="sourceLineNo">119</span>    assertTrue(procExecutor.bypassProcedure(suspendProcedure.getProcId(), 1000, false, false));<a name="line.119"></a>
-<span class="sourceLineNo">120</span>    htu.waitFor(5000, () -&gt; proc.isSuccess() &amp;&amp; proc.isBypass());<a name="line.120"></a>
-<span class="sourceLineNo">121</span>    LOG.info("{} finished", proc);<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 testBypassingStuckStateMachineProcedure() throws Exception {<a name="line.125"></a>
-<span class="sourceLineNo">126</span>    final StuckStateMachineProcedure proc =<a name="line.126"></a>
-<span class="sourceLineNo">127</span>        new StuckStateMachineProcedure(procEnv, StuckStateMachineState.START);<a name="line.127"></a>
-<span class="sourceLineNo">128</span>    long id = procExecutor.submitProcedure(proc);<a name="line.128"></a>
-<span class="sourceLineNo">129</span>    Thread.sleep(500);<a name="line.129"></a>
-<span class="sourceLineNo">130</span>    // bypass the procedure<a name="line.130"></a>
-<span class="sourceLineNo">131</span>    assertFalse(procExecutor.bypassProcedure(id, 1000, false, false));<a name="line.131"></a>
-<span class="sourceLineNo">132</span>    assertTrue(procExecutor.bypassProcedure(id, 1000, true, false));<a name="line.132"></a>
-<span class="sourceLineNo">133</span><a name="line.133"></a>
-<span class="sourceLineNo">134</span>    htu.waitFor(5000, () -&gt; proc.isSuccess() &amp;&amp; proc.isBypass());<a name="line.134"></a>
-<span class="sourceLineNo">135</span>    LOG.info("{} finished", proc);<a name="line.135"></a>
-<span class="sourceLineNo">136</span>  }<a name="line.136"></a>
-<span class="sourceLineNo">137</span><a name="line.137"></a>
-<span class="sourceLineNo">138</span>  @Test<a name="line.138"></a>
-<span class="sourceLineNo">139</span>  public void testBypassingProcedureWithParentRecursive() throws Exception {<a name="line.139"></a>
-<span class="sourceLineNo">140</span>    final RootProcedure proc = new RootProcedure();<a name="line.140"></a>
-<span class="sourceLineNo">141</span>    long rootId = procExecutor.submitProcedure(proc);<a name="line.141"></a>
-<span class="sourceLineNo">142</span>    htu.waitFor(5000, () -&gt; procExecutor.getProcedures().stream()<a name="line.142"></a>
-<span class="sourceLineNo">143</span>        .filter(p -&gt; p.getParentProcId() == rootId).collect(Collectors.toList())<a name="line.143"></a>
-<span class="sourceLineNo">144</span>        .size() &gt; 0);<a name="line.144"></a>
-<span class="sourceLineNo">145</span>    SuspendProcedure suspendProcedure = (SuspendProcedure)procExecutor.getProcedures().stream()<a name="line.145"></a>
-<span class="sourceLineNo">146</span>        .filter(p -&gt; p.getParentProcId() == rootId).collect(Collectors.toList()).get(0);<a name="line.146"></a>
-<span class="sourceLineNo">147</span>    assertTrue(procExecutor.bypassProcedure(rootId, 1000, false, true));<a name="line.147"></a>
-<span class="sourceLineNo">148</span>    htu.waitFor(5000, () -&gt; proc.isSuccess() &amp;&amp; proc.isBypass());<a name="line.148"></a>
-<span class="sourceLineNo">149</span>    LOG.info("{} finished", proc);<a name="line.149"></a>
-<span class="sourceLineNo">150</span>  }<a name="line.150"></a>
-<span class="sourceLineNo">151</span><a name="line.151"></a>
-<span class="sourceLineNo">152</span>  @AfterClass<a name="line.152"></a>
-<span class="sourceLineNo">153</span>  public static void tearDown() throws Exception {<a name="line.153"></a>
-<span class="sourceLineNo">154</span>    procExecutor.stop();<a name="line.154"></a>
-<span class="sourceLineNo">155</span>    procStore.stop(false);<a name="line.155"></a>
-<span class="sourceLineNo">156</span>    procExecutor.join();<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>  public static class SuspendProcedure extends ProcedureTestingUtility.NoopProcedure&lt;TestProcEnv&gt; {<a name="line.159"></a>
+<span class="sourceLineNo">043</span><a name="line.43"></a>
+<span class="sourceLineNo">044</span>@Category({MasterTests.class, SmallTests.class})<a name="line.44"></a>
+<span class="sourceLineNo">045</span>public class TestProcedureBypass {<a name="line.45"></a>
+<span class="sourceLineNo">046</span><a name="line.46"></a>
+<span class="sourceLineNo">047</span>  @ClassRule public static final HBaseClassTestRule CLASS_RULE = HBaseClassTestRule<a name="line.47"></a>
+<span class="sourceLineNo">048</span>      .forClass(TestProcedureBypass.class);<a name="line.48"></a>
+<span class="sourceLineNo">049</span><a name="line.49"></a>
+<span class="sourceLineNo">050</span>  private static final Logger LOG = LoggerFactory.getLogger(TestProcedureBypass.class);<a name="line.50"></a>
+<span class="sourceLineNo">051</span><a name="line.51"></a>
+<span class="sourceLineNo">052</span>  private static final int PROCEDURE_EXECUTOR_SLOTS = 1;<a name="line.52"></a>
+<span class="sourceLineNo">053</span><a name="line.53"></a>
+<span class="sourceLineNo">054</span>  private static TestProcEnv procEnv;<a name="line.54"></a>
+<span class="sourceLineNo">055</span>  private static ProcedureStore procStore;<a name="line.55"></a>
+<span class="sourceLineNo">056</span><a name="line.56"></a>
+<span class="sourceLineNo">057</span>  private static ProcedureExecutor&lt;TestProcEnv&gt; procExecutor;<a name="line.57"></a>
+<span class="sourceLineNo">058</span><a name="line.58"></a>
+<span class="sourceLineNo">059</span>  private static HBaseCommonTestingUtility htu;<a name="line.59"></a>
+<span class="sourceLineNo">060</span><a name="line.60"></a>
+<span class="sourceLineNo">061</span>  private static FileSystem fs;<a name="line.61"></a>
+<span class="sourceLineNo">062</span>  private static Path testDir;<a name="line.62"></a>
+<span class="sourceLineNo">063</span>  private static Path logDir;<a name="line.63"></a>
+<span class="sourceLineNo">064</span><a name="line.64"></a>
+<span class="sourceLineNo">065</span>  private static class TestProcEnv {<a name="line.65"></a>
+<span class="sourceLineNo">066</span>  }<a name="line.66"></a>
+<span class="sourceLineNo">067</span><a name="line.67"></a>
+<span class="sourceLineNo">068</span>  @BeforeClass<a name="line.68"></a>
+<span class="sourceLineNo">069</span>  public static void setUp() throws Exception {<a name="line.69"></a>
+<span class="sourceLineNo">070</span>    htu = new HBaseCommonTestingUtility();<a name="line.70"></a>
+<span class="sourceLineNo">071</span><a name="line.71"></a>
+<span class="sourceLineNo">072</span>    // NOTE: The executor will be created by each test<a name="line.72"></a>
+<span class="sourceLineNo">073</span>    procEnv = new TestProcEnv();<a name="line.73"></a>
+<span class="sourceLineNo">074</span>    testDir = htu.getDataTestDir();<a name="line.74"></a>
+<span class="sourceLineNo">075</span>    fs = testDir.getFileSystem(htu.getConfiguration());<a name="line.75"></a>
+<span class="sourceLineNo">076</span>    assertTrue(testDir.depth() &gt; 1);<a name="line.76"></a>
+<span class="sourceLineNo">077</span><a name="line.77"></a>
+<span class="sourceLineNo">078</span>    logDir = new Path(testDir, "proc-logs");<a name="line.78"></a>
+<span class="sourceLineNo">079</span>    procStore = ProcedureTestingUtility.createWalStore(htu.getConfiguration(), logDir);<a name="line.79"></a>
+<span class="sourceLineNo">080</span>    procExecutor = new ProcedureExecutor&lt;&gt;(htu.getConfiguration(), procEnv,<a name="line.80"></a>
+<span class="sourceLineNo">081</span>        procStore);<a name="line.81"></a>
+<span class="sourceLineNo">082</span>    procStore.start(PROCEDURE_EXECUTOR_SLOTS);<a name="line.82"></a>
+<span class="sourceLineNo">083</span>    ProcedureTestingUtility<a name="line.83"></a>
+<span class="sourceLineNo">084</span>        .initAndStartWorkers(procExecutor, PROCEDURE_EXECUTOR_SLOTS, true);<a name="line.84"></a>
+<span class="sourceLineNo">085</span>  }<a name="line.85"></a>
+<span class="sourceLineNo">086</span><a name="line.86"></a>
+<span class="sourceLineNo">087</span>  @Test<a name="line.87"></a>
+<span class="sourceLineNo">088</span>  public void testBypassSuspendProcedure() throws Exception {<a name="line.88"></a>
+<span class="sourceLineNo">089</span>    final SuspendProcedure proc = new SuspendProcedure();<a name="line.89"></a>
+<span class="sourceLineNo">090</span>    long id = procExecutor.submitProcedure(proc);<a name="line.90"></a>
+<span class="sourceLineNo">091</span>    Thread.sleep(500);<a name="line.91"></a>
+<span class="sourceLineNo">092</span>    //bypass the procedure<a name="line.92"></a>
+<span class="sourceLineNo">093</span>    assertTrue(procExecutor.bypassProcedure(id, 30000, false, false));<a name="line.93"></a>
+<span class="sourceLineNo">094</span>    htu.waitFor(5000, () -&gt; proc.isSuccess() &amp;&amp; proc.isBypass());<a name="line.94"></a>
+<span class="sourceLineNo">095</span>    LOG.info("{} finished", proc);<a name="line.95"></a>
+<span class="sourceLineNo">096</span>  }<a name="line.96"></a>
+<span class="sourceLineNo">097</span><a name="line.97"></a>
+<span class="sourceLineNo">098</span>  @Test<a name="line.98"></a>
+<span class="sourceLineNo">099</span>  public void testStuckProcedure() throws Exception {<a name="line.99"></a>
+<span class="sourceLineNo">100</span>    final StuckProcedure proc = new StuckProcedure();<a name="line.100"></a>
+<span class="sourceLineNo">101</span>    long id = procExecutor.submitProcedure(proc);<a name="line.101"></a>
+<span class="sourceLineNo">102</span>    Thread.sleep(500);<a name="line.102"></a>
+<span class="sourceLineNo">103</span>    //bypass the procedure<a name="line.103"></a>
+<span class="sourceLineNo">104</span>    assertTrue(procExecutor.bypassProcedure(id, 1000, true, false));<a name="line.104"></a>
+<span class="sourceLineNo">105</span>    //Since the procedure is stuck there, we need to restart the executor to recovery.<a name="line.105"></a>
+<span class="sourceLineNo">106</span>    ProcedureTestingUtility.restart(procExecutor);<a name="line.106"></a>
+<span class="sourceLineNo">107</span>    htu.waitFor(5000, () -&gt; proc.isSuccess() &amp;&amp; proc.isBypass());<a name="line.107"></a>
+<span class="sourceLineNo">108</span>    LOG.info("{} finished", proc);<a name="line.108"></a>
+<span class="sourceLineNo">109</span>  }<a name="line.109"></a>
+<span class="sourceLineNo">110</span><a name="line.110"></a>
+<span class="sourceLineNo">111</span>  @Test<a name="line.111"></a>
+<span class="sourceLineNo">112</span>  public void testBypassingProcedureWithParent() throws Exception {<a name="line.112"></a>
+<span class="sourceLineNo">113</span>    final RootProcedure proc = new RootProcedure();<a name="line.113"></a>
+<span class="sourceLineNo">114</span>    long rootId = procExecutor.submitProcedure(proc);<a name="line.114"></a>
+<span class="sourceLineNo">115</span>    htu.waitFor(5000, () -&gt; procExecutor.getProcedures().stream()<a name="line.115"></a>
+<span class="sourceLineNo">116</span>      .filter(p -&gt; p.getParentProcId() == rootId).collect(Collectors.toList())<a name="line.116"></a>
+<span class="sourceLineNo">117</span>      .size() &gt; 0);<a name="line.117"></a>
+<span class="sourceLineNo">118</span>    SuspendProcedure suspendProcedure = (SuspendProcedure)procExecutor.getProcedures().stream()<a name="line.118"></a>
+<span class="sourceLineNo">119</span>        .filter(p -&gt; p.getParentProcId() == rootId).collect(Collectors.toList()).get(0);<a name="line.119"></a>
+<span class="sourceLineNo">120</span>    assertTrue(procExecutor.bypassProcedure(suspendProcedure.getProcId(), 1000, false, false));<a name="line.120"></a>
+<span class="sourceLineNo">121</span>    htu.waitFor(5000, () -&gt; proc.isSuccess() &amp;&amp; proc.isBypass());<a name="line.121"></a>
+<span class="sourceLineNo">122</span>    LOG.info("{} finished", proc);<a name="line.122"></a>
+<span class="sourceLineNo">123</span>  }<a name="line.123"></a>
+<span class="sourceLineNo">124</span><a name="line.124"></a>
+<span class="sourceLineNo">125</span>  @Test<a name="line.125"></a>
+<span class="sourceLineNo">126</span>  public void testBypassingStuckStateMachineProcedure() throws Exception {<a name="line.126"></a>
+<span class="sourceLineNo">127</span>    final StuckStateMachineProcedure proc =<a name="line.127"></a>
+<span class="sourceLineNo">128</span>        new StuckStateMachineProcedure(procEnv, StuckStateMachineState.START);<a name="line.128"></a>
+<span class="sourceLineNo">129</span>    long id = procExecutor.submitProcedure(proc);<a name="line.129"></a>
+<span class="sourceLineNo">130</span>    Thread.sleep(500);<a name="line.130"></a>
+<span class="sourceLineNo">131</span>    // bypass the procedure<a name="line.131"></a>
+<span class="sourceLineNo">132</span>    assertFalse(procExecutor.bypassProcedure(id, 1000, false, false));<a name="line.132"></a>
+<span class="sourceLineNo">133</span>    assertTrue(procExecutor.bypassProcedure(id, 1000, true, false));<a name="line.133"></a>
+<span class="sourceLineNo">134</span><a name="line.134"></a>
+<span class="sourceLineNo">135</span>    htu.waitFor(5000, () -&gt; proc.isSuccess() &amp;&amp; proc.isBypass());<a name="line.135"></a>
+<span class="sourceLineNo">136</span>    LOG.info("{} finished", proc);<a name="line.136"></a>
+<span class="sourceLineNo">137</span>  }<a name="line.137"></a>
+<span class="sourceLineNo">138</span><a name="line.138"></a>
+<span class="sourceLineNo">139</span>  @Test<a name="line.139"></a>
+<span class="sourceLineNo">140</span>  public void testBypassingProcedureWithParentRecursive() throws Exception {<a name="line.140"></a>
+<span class="sourceLineNo">141</span>    final RootProcedure proc = new RootProcedure();<a name="line.141"></a>
+<span class="sourceLineNo">142</span>    long rootId = procExecutor.submitProcedure(proc);<a name="line.142"></a>
+<span class="sourceLineNo">143</span>    htu.waitFor(5000, () -&gt; procExecutor.getProcedures().stream()<a name="line.143"></a>
+<span class="sourceLineNo">144</span>        .filter(p -&gt; p.getParentProcId() == rootId).collect(Collectors.toList())<a name="line.144"></a>
+<span class="sourceLineNo">145</span>        .size() &gt; 0);<a name="line.145"></a>
+<span class="sourceLineNo">146</span>    SuspendProcedure suspendProcedure = (SuspendProcedure)procExecutor.getProcedures().stream()<a name="line.146"></a>
+<span class="sourceLineNo">147</span>        .filter(p -&gt; p.getParentProcId() == rootId).collect(Collectors.toList()).get(0);<a name="line.147"></a>
+<span class="sourceLineNo">148</span>    assertTrue(procExecutor.bypassProcedure(rootId, 1000, false, true));<a name="line.148"></a>
+<span class="sourceLineNo">149</span>    htu.waitFor(5000, () -&gt; proc.isSuccess() &amp;&amp; proc.isBypass());<a name="line.149"></a>
+<span class="sourceLineNo">150</span>    LOG.info("{} finished", proc);<a name="line.150"></a>
+<span class="sourceLineNo">151</span>  }<a name="line.151"></a>
+<span class="sourceLineNo">152</span><a name="line.152"></a>
+<span class="sourceLineNo">153</span>  @Test<a name="line.153"></a>
+<span class="sourceLineNo">154</span>  public void testBypassingWaitingTimeoutProcedures() throws Exception {<a name="line.154"></a>
+<span class="sourceLineNo">155</span>    final WaitingTimeoutProcedure proc = new WaitingTimeoutProcedure();<a name="line.155"></a>
+<span class="sourceLineNo">156</span>    long id = procExecutor.submitProcedure(proc);<a name="line.156"></a>
+<span class="sourceLineNo">157</span>    Thread.sleep(500);<a name="line.157"></a>
+<span class="sourceLineNo">158</span>    // bypass the procedure<a name="line.158"></a>
+<span class="sourceLineNo">159</span>    assertTrue(procExecutor.bypassProcedure(id, 1000, true, false));<a name="line.159"></a>
 <span class="sourceLineNo">160</span><a name="line.160"></a>
-<span class="sourceLineNo">161</span>    public SuspendProcedure() {<a name="line.161"></a>
-<span class="sourceLineNo">162</span>      super();<a name="line.162"></a>
-<span class="sourceLineNo">163</span>    }<a name="line.163"></a>
+<span class="sourceLineNo">161</span>    htu.waitFor(5000, () -&gt; proc.isSuccess() &amp;&amp; proc.isBypass());<a name="line.161"></a>
+<span class="sourceLineNo">162</span>    LOG.info("{} finished", proc);<a name="line.162"></a>
+<span class="sourceLineNo">163</span>  }<a name="line.163"></a>
 <span class="sourceLineNo">164</span><a name="line.164"></a>
-<span class="sourceLineNo">165</span>    @Override<a name="line.165"></a>
-<span class="sourceLineNo">166</span>    protected Procedure[] execute(final TestProcEnv env)<a name="line.166"></a>
-<span class="sourceLineNo">167</span>        throws ProcedureSuspendedException {<a name="line.167"></a>
-<span class="sourceLineNo">168</span>      // Always suspend the procedure<a name="line.168"></a>
-<span class="sourceLineNo">169</span>      throw new ProcedureSuspendedException();<a name="line.169"></a>
-<span class="sourceLineNo">170</span>    }<a name="line.170"></a>
-<span class="sourceLineNo">171</span>  }<a name="line.171"></a>
-<span class="sourceLineNo">172</span><a name="line.172"></a>
-<span class="sourceLineNo">173</span>  public static class StuckProcedure extends ProcedureTestingUtility.NoopProcedure&lt;TestProcEnv&gt; {<a name="line.173"></a>
-<span class="sourceLineNo">174</span><a name="line.174"></a>
-<span class="sourceLineNo">175</span>    public StuckProcedure() {<a name="line.175"></a>
-<span class="sourceLineNo">176</span>      super();<a name="line.176"></a>
-<span class="sourceLineNo">177</span>    }<a name="line.177"></a>
-<span class="sourceLineNo">178</span><a name="line.178"></a>
-<span class="sourceLineNo">179</span>    @Override<a name="line.179"></a>
-<span class="sourceLineNo">180</span>    protected Procedure[] execute(final TestProcEnv env) {<a name="line.180"></a>
-<span class="sourceLineNo">181</span>      try {<a name="line.181"></a>
-<span class="sourceLineNo">182</span>        Thread.sleep(Long.MAX_VALUE);<a name="line.182"></a>
-<span class="sourceLineNo">183</span>      } catch (Throwable t) {<a name="line.183"></a>
-<span class="sourceLineNo">184</span>        LOG.debug("Sleep is interrupted.", t);<a name="line.184"></a>
-<span class="sourceLineNo">185</span>      }<a name="line.185"></a>
-<span class="sourceLineNo">186</span>      return null;<a name="line.186"></a>
-<span class="sourceLineNo">187</span>    }<a name="line.187"></a>
-<span class="sourceLineNo">188</span><a name="line.188"></a>
-<span class="sourceLineNo">189</span>  }<a name="line.189"></a>
-<span class="sourceLineNo">190</span><a name="line.190"></a>
+<span class="sourceLineNo">165</span>  @AfterClass<a name="line.165"></a>
+<span class="sourceLineNo">166</span>  public static void tearDown() throws Exception {<a name="line.166"></a>
+<span class="sourceLineNo">167</span>    procExecutor.stop();<a name="line.167"></a>
+<span class="sourceLineNo">168</span>    procStore.stop(false);<a name="line.168"></a>
+<span class="sourceLineNo">169</span>    procExecutor.join();<a name="line.169"></a>
+<span class="sourceLineNo">170</span>  }<a name="line.170"></a>
+<span class="sourceLineNo">171</span><a name="line.171"></a>
+<span class="sourceLineNo">172</span>  public static class SuspendProcedure extends ProcedureTestingUtility.NoopProcedure&lt;TestProcEnv&gt; {<a name="line.172"></a>
+<span class="sourceLineNo">173</span><a name="line.173"></a>
+<span class="sourceLineNo">174</span>    public SuspendProcedure() {<a name="line.174"></a>
+<span class="sourceLineNo">175</span>      super();<a name="line.175"></a>
+<span class="sourceLineNo">176</span>    }<a name="line.176"></a>
+<span class="sourceLineNo">177</span><a name="line.177"></a>
+<span class="sourceLineNo">178</span>    @Override<a name="line.178"></a>
+<span class="sourceLineNo">179</span>    protected Procedure[] execute(final TestProcEnv env)<a name="line.179"></a>
+<span class="sourceLineNo">180</span>        throws ProcedureSuspendedException {<a name="line.180"></a>
+<span class="sourceLineNo">181</span>      // Always suspend the procedure<a name="line.181"></a>
+<span class="sourceLineNo">182</span>      throw new ProcedureSuspendedException();<a name="line.182"></a>
+<span class="sourceLineNo">183</span>    }<a name="line.183"></a>
+<span class="sourceLineNo">184</span>  }<a name="line.184"></a>
+<span class="sourceLineNo">185</span><a name="line.185"></a>
+<span class="sourceLineNo">186</span>  public static class StuckProcedure extends ProcedureTestingUtility.NoopProcedure&lt;TestProcEnv&gt; {<a name="line.186"></a>
+<span class="sourceLineNo">187</span><a name="line.187"></a>
+<span class="sourceLineNo">188</span>    public StuckProcedure() {<a name="line.188"></a>
+<span class="sourceLineNo">189</span>      super();<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>  public static class RootProcedure extends ProcedureTestingUtility.NoopProcedure&lt;TestProcEnv&gt; {<a name="line.192"></a>
-<span class="sourceLineNo">193</span>    private boolean childSpwaned = false;<a name="line.193"></a>
-<span class="sourceLineNo">194</span><a name="line.194"></a>
-<span class="sourceLineNo">195</span>    public RootProcedure() {<a name="line.195"></a>
-<span class="sourceLineNo">196</span>      super();<a name="line.196"></a>
-<span class="sourceLineNo">197</span>    }<a name="line.197"></a>
-<span class="sourceLineNo">198</span><a name="line.198"></a>
-<span class="sourceLineNo">199</span>    @Override<a name="line.199"></a>
-<span class="sourceLineNo">200</span>    protected Procedure[] execute(final TestProcEnv env)<a name="line.200"></a>
-<span class="sourceLineNo">201</span>        throws ProcedureSuspendedException {<a name="line.201"></a>
-<span class="sourceLineNo">202</span>      if (!childSpwaned) {<a name="line.202"></a>
-<span class="sourceLineNo">203</span>        childSpwaned = true;<a name="line.203"></a>
-<span class="sourceLineNo">204</span>        return new Procedure[] {new SuspendProcedure()};<a name="line.204"></a>
-<span class="sourceLineNo">205</span>      } else {<a name="line.205"></a>
-<span class="sourceLineNo">206</span>        return null;<a name="line.206"></a>
-<span class="sourceLineNo">207</span>      }<a name="line.207"></a>
-<span class="sourceLineNo">208</span>    }<a name="line.208"></a>
-<span class="sourceLineNo">209</span>  }<a name="line.209"></a>
-<span class="sourceLineNo">210</span><a name="line.210"></a>
+<span class="sourceLineNo">192</span>    @Override<a name="line.192"></a>
+<span class="sourceLineNo">193</span>    protected Procedure[] execute(final TestProcEnv env) {<a name="line.193"></a>
+<span class="sourceLineNo">194</span>      try {<a name="line.194"></a>
+<span class="sourceLineNo">195</span>        Thread.sleep(Long.MAX_VALUE);<a name="line.195"></a>
+<span class="sourceLineNo">196</span>      } catch (Throwable t) {<a name="line.196"></a>
+<span class="sourceLineNo">197</span>        LOG.debug("Sleep is interrupted.", t);<a name="line.197"></a>
+<span class="sourceLineNo">198</span>      }<a name="line.198"></a>
+<span class="sourceLineNo">199</span>      return null;<a name="line.199"></a>
+<span class="sourceLineNo">200</span>    }<a name="line.200"></a>
+<span class="sourceLineNo">201</span><a name="line.201"></a>
+<span class="sourceLineNo">202</span>  }<a name="line.202"></a>
+<span class="sourceLineNo">203</span><a name="line.203"></a>
+<span class="sourceLineNo">204</span><a name="line.204"></a>
+<span class="sourceLineNo">205</span>  public static class RootProcedure extends ProcedureTestingUtility.NoopProcedure&lt;TestProcEnv&gt; {<a name="line.205"></a>
+<span class="sourceLineNo">206</span>    private boolean childSpwaned = false;<a name="line.206"></a>
+<span class="sourceLineNo">207</span><a name="line.207"></a>
+<span class="sourceLineNo">208</span>    public RootProcedure() {<a name="line.208"></a>
+<span class="sourceLineNo">209</span>      super();<a name="line.209"></a>
+<span class="sourceLineNo">210</span>    }<a name="line.210"></a>
 <span class="sourceLineNo">211</span><a name="line.211"></a>
-<span class="sourceLineNo">212</span>  public enum StuckStateMachineState {<a name="line.212"></a>
-<span class="sourceLineNo">213</span>    START, THEN, END<a name="line.213"></a>
-<span class="sourceLineNo">214</span>  }<a name="line.214"></a>
-<span class="sourceLineNo">215</span><a name="line.215"></a>
-<span class="sourceLineNo">216</span>  public static class StuckStateMachineProcedure extends<a name="line.216"></a>
-<span class="sourceLineNo">217</span>      ProcedureTestingUtility.NoopStateMachineProcedure&lt;TestProcEnv, StuckStateMachineState&gt; {<a name="line.217"></a>
-<span class="sourceLineNo">218</span>    private AtomicBoolean stop = new AtomicBoolean(false);<a name="line.218"></a>
-<span class="sourceLineNo">219</span><a name="line.219"></a>
-<span class="sourceLineNo">220</span>    public StuckStateMachineProcedure() {<a name="line.220"></a>
-<span class="sourceLineNo">221</span>      super();<a name="line.221"></a>
-<span class="sourceLineNo">222</span>    }<a name="line.222"></a>
+<span class="sourceLineNo">212</span>    @Override<a name="line.212"></a>
+<span class="sourceLineNo">213</span>    protected Procedure[] execute(final TestProcEnv env)<a name="line.213"></a>
+<span class="sourceLineNo">214</span>        throws ProcedureSuspendedException {<a name="line.214"></a>
+<span class="sourceLineNo">215</span>      if (!childSpwaned) {<a name="line.215"></a>
+<span class="sourceLineNo">216</span>        childSpwaned = true;<a name="line.216"></a>
+<span class="sourceLineNo">217</span>        return new Procedure[] {new SuspendProcedure()};<a name="line.217"></a>
+<span class="sourceLineNo">218</span>      } else {<a name="line.218"></a>
+<span class="sourceLineNo">219</span>        return null;<a name="line.219"></a>
+<span class="sourceLineNo">220</span>      }<a name="line.220"></a>
+<span class="sourceLineNo">221</span>    }<a name="line.221"></a>
+<span class="sourceLineNo">222</span>  }<a name="line.222"></a>
 <span class="sourceLineNo">223</span><a name="line.223"></a>
-<span class="sourceLineNo">224</span>    public StuckStateMachineProcedure(TestProcEnv env, StuckStateMachineState initialState) {<a name="line.224"></a>
-<span class="sourceLineNo">225</span>      super(env, initialState);<a name="line.225"></a>
-<span class="sourceLineNo">226</span>    }<a name="line.226"></a>
-<span class="sourceLineNo">227</span><a name="line.227"></a>
-<span class="sourceLineNo">228</span>    @Override<a name="line.228"></a>
-<span class="sourceLineNo">229</span>    protected Flow executeFromState(TestProcEnv env, StuckStateMachineState tState)<a name="line.229"></a>
-<span class="sourceLineNo">230</span>            throws ProcedureSuspendedException, ProcedureYieldException, InterruptedException {<a name="line.230"></a>
-<span class="sourceLineNo">231</span>      switch (tState) {<a name="line.231"></a>
-<span class="sourceLineNo">232</span>        case START:<a name="line.232"></a>
-<span class="sourceLineNo">233</span>          LOG.info("PHASE 1: START");<a name="line.233"></a>
-<span class="sourceLineNo">234</span>          setNextState(StuckStateMachineState.THEN);<a name="line.234"></a>
-<span class="sourceLineNo">235</span>          return Flow.HAS_MORE_STATE;<a name="line.235"></a>
-<span class="sourceLineNo">236</span>        case THEN:<a name="line.236"></a>
-<span class="sourceLineNo">237</span>          if (stop.get()) {<a name="line.237"></a>
-<span class="sourceLineNo">238</span>            setNextState(StuckStateMachineState.END);<a name="line.238"></a>
-<span class="sourceLineNo">239</span>          }<a name="line.239"></a>
-<span class="sourceLineNo">240</span>          return Flow.HAS_MORE_STATE;<a name="line.240"></a>
-<span class="sourceLineNo">241</span>        case END:<a name="line.241"></a>
-<span class="sourceLineNo">242</span>          return Flow.NO_MORE_STATE;<a name="line.242"></a>
-<span class="sourceLineNo">243</span>        default:<a name="line.243"></a>
-<span class="sourceLineNo">244</span>          throw new UnsupportedOperationException("unhandled state=" + tState);<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">224</span>  public static class WaitingTimeoutProcedure<a name="line.224"></a>
+<span class="sourceLineNo">225</span>      extends ProcedureTestingUtility.NoopProcedure&lt;TestProcEnv&gt; {<a name="line.225"></a>
+<span class="sourceLineNo">226</span>    public WaitingTimeoutProcedure() {<a name="line.226"></a>
+<span class="sourceLineNo">227</span>      super();<a name="line.227"></a>
+<span class="sourceLineNo">228</span>    }<a name="line.228"></a>
+<span class="sourceLineNo">229</span><a name="line.229"></a>
+<span class="sourceLineNo">230</span>    @Override<a name="line.230"></a>
+<span class="sourceLineNo">231</span>    protected Procedure[] execute(final TestProcEnv env)<a name="line.231"></a>
+<span class="sourceLineNo">232</span>        throws ProcedureSuspendedException {<a name="line.232"></a>
+<span class="sourceLineNo">233</span>      // Always suspend the procedure<a name="line.233"></a>
+<span class="sourceLineNo">234</span>      setTimeout(50000);<a name="line.234"></a>
+<span class="sourceLineNo">235</span>      setState(ProcedureProtos.ProcedureState.WAITING_TIMEOUT);<a name="line.235"></a>
+<span class="sourceLineNo">236</span>      skipPersistence();<a name="line.236"></a>
+<span class="sourceLineNo">237</span>      throw new ProcedureSuspendedException();<a name="line.237"></a>
+<span class="sourceLineNo">238</span>    }<a name="line.238"></a>
+<span class="sourceLineNo">239</span><a name="line.239"></a>
+<span class="sourceLineNo">240</span>    @Override<a name="line.240"></a>
+<span class="sourceLineNo">241</span>    protected synchronized boolean setTimeoutFailure(TestProcEnv env) {<a name="line.241"></a>
+<span class="sourceLineNo">242</span>      setState(ProcedureProtos.ProcedureState.RUNNABLE);<a name="line.242"></a>
+<span class="sourceLineNo">243</span>      procExecutor.getScheduler().addFront(this);<a name="line.243"></a>
+<span class="sourceLineNo">244</span>      return false; // 'false' means that this procedure handled the timeout<a name="line.244"></a>
+<span class="sourceLineNo">245</span>    }<a name="line.245"></a>
+<span class="sourceLineNo">246</span>  }<a name="line.246"></a>
 <span class="sourceLineNo">247</span><a name="line.247"></a>
-<span class="sourceLineNo">248</span>    @Override<a name="line.248"></a>
-<span class="sourceLineNo">249</span>    protected StuckStateMachineState getState(int stateId) {<a name="line.249"></a>
-<span class="sourceLineNo">250</span>      return StuckStateMachineState.values()[stateId];<a name="line.250"></a>
-<span class="sourceLineNo">251</span>    }<a name="line.251"></a>
-<span class="sourceLineNo">252</span><a name="line.252"></a>
-<span class="sourceLineNo">253</span>    @Override<a name="line.253"></a>
-<span class="sourceLineNo">254</span>    protected int getStateId(StuckStateMachineState tState) {<a name="line.254"></a>
-<span class="sourceLineNo">255</span>      return tState.ordinal();<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">248</span>  public enum StuckStateMachineState {<a name="line.248"></a>
+<span class="sourceLineNo">249</span>    START, THEN, END<a name="line.249"></a>
+<span class="sourceLineNo">250</span>  }<a name="line.250"></a>
+<span class="sourceLineNo">251</span><a name="line.251"></a>
+<span class="sourceLineNo">252</span>  public static class StuckStateMachineProcedure extends<a name="line.252"></a>
+<span class="sourceLineNo">253</span>      ProcedureTestingUtility.NoopStateMachineProcedure&lt;TestProcEnv, StuckStateMachineState&gt; {<a name="line.253"></a>
+<span class="sourceLineNo">254</span>    private AtomicBoolean stop = new AtomicBoolean(false);<a name="line.254"></a>
+<span class="sourceLineNo">255</span><a name="line.255"></a>
+<span class="sourceLineNo">256</span>    public StuckStateMachineProcedure() {<a name="line.256"></a>
+<span class="sourceLineNo">257</span>      super();<a name="line.257"></a>
+<span class="sourceLineNo">258</span>    }<a name="line.258"></a>
 <span class="sourceLineNo">259</span><a name="line.259"></a>
-<span class="sourceLineNo">260</span>}<a name="line.260"></a>
+<span class="sourceLineNo">260</span>    public StuckStateMachineProcedure(TestProcEnv env, StuckStateMachineState initialState) {<a name="line.260"></a>
+<span class="sourceLineNo">261</span>      super(env, initialState);<a name="line.261"></a>
+<span class="sourceLineNo">262</span>    }<a name="line.262"></a>
+<span class="sourceLineNo">263</span><a name="line.263"></a>
+<span class="sourceLineNo">264</span>    @Override<a name="line.264"></a>
+<span class="sourceLineNo">265</span>    protected Flow executeFromState(TestProcEnv env, StuckStateMachineState tState)<a name="line.265"></a>
+<span class="sourceLineNo">266</span>            throws ProcedureSuspendedException, ProcedureYieldException, InterruptedException {<a name="line.266"></a>
+<span class="sourceLineNo">267</span>      switch (tState) {<a name="line.267"></a>
+<span class="sourceLineNo">268</span>        case START:<a name="line.268"></a>
+<span class="sourceLineNo">269</span>          LOG.info("PHASE 1: START");<a name="line.269"></a>
+<span class="sourceLineNo">270</span>          setNextState(StuckStateMachineState.THEN);<a name="line.270"></a>
+<span class="sourceLineNo">271</span>          return Flow.HAS_MORE_STATE;<a name="line.271"></a>
+<span class="sourceLineNo">272</span>        case THEN:<a name="line.272"></a>
+<span class="sourceLineNo">273</span>          if (stop.get()) {<a name="line.273"></a>
+<span class="sourceLineNo">274</span>            setNextState(StuckStateMachineState.END);<a name="line.274"></a>
+<span class="sourceLineNo">275</span>          }<a name="line.275"></a>
+<span class="sourceLineNo">276</span>          return Flow.HAS_MORE_STATE;<a name="line.276"></a>
+<span class="sourceLineNo">277</span>        case END:<a name="line.277"></a>
+<span class="sourceLineNo">278</span>          return Flow.NO_MORE_STATE;<a name="line.278"></a>
+<span class="sourceLineNo">279</span>        default:<a name="line.279"></a>
+<span class="sourceLineNo">280</span>          throw new UnsupportedOperationException("unhandled state=" + tState);<a name="line.280"></a>
+<span class="sourceLineNo">281</span>      }<a name="line.281"></a>
+<span class="sourceLineNo">282</span>    }<a name="line.282"></a>
+<span class="sourceLineNo">283</span><a name="line.283"></a>
+<span class="sourceLineNo">284</span>    @Override<a name="line.284"></a>
+<span class="sourceLineNo">285</span>    protected StuckStateMachineState getState(int stateId) {<a name="line.285"></a>
+<span class="sourceLineNo">286</span>      return StuckStateMachineState.values()[stateId];<a name="line.286"></a>
+<span class="sourceLineNo">287</span>    }<a name="line.287"></a>
+<span class="sourceLineNo">288</span><a name="line.288"></a>
+<span class="sourceLineNo">289</span>    @Override<a name="line.289"></a>
+<span class="sourceLineNo">290</span>    protected int getStateId(StuckStateMachineState tState) {<a name="line.290"></a>
+<span class="sourceLineNo">291</span>      return tState.ordinal();<a name="line.291"></a>
+<span class="sourceLineNo">292</span>    }<a name="line.292"></a>
+<span class="sourceLineNo">293</span>  }<a name="line.293"></a>
+<span class="sourceLineNo">294</span><a name="line.294"></a>
+<span class="sourceLineNo">295</span><a name="line.295"></a>
+<span class="sourceLineNo">296</span>}<a name="line.296"></a>
 
 
 


[20/29] hbase-site git commit: Published site at 5e84997f2ffdbcf5f849d70c30ddbe2db4039ca4.

Posted by gi...@apache.org.
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/27f5bfb5/devapidocs/src-html/org/apache/hadoop/hbase/mapreduce/CopyTable.html
----------------------------------------------------------------------
diff --git a/devapidocs/src-html/org/apache/hadoop/hbase/mapreduce/CopyTable.html b/devapidocs/src-html/org/apache/hadoop/hbase/mapreduce/CopyTable.html
index 56eaf18..e2ca07a 100644
--- a/devapidocs/src-html/org/apache/hadoop/hbase/mapreduce/CopyTable.html
+++ b/devapidocs/src-html/org/apache/hadoop/hbase/mapreduce/CopyTable.html
@@ -37,362 +37,363 @@
 <span class="sourceLineNo">029</span>import org.apache.hadoop.hbase.HBaseConfiguration;<a name="line.29"></a>
 <span class="sourceLineNo">030</span>import org.apache.hadoop.hbase.HConstants;<a name="line.30"></a>
 <span class="sourceLineNo">031</span>import org.apache.hadoop.hbase.TableName;<a name="line.31"></a>
-<span class="sourceLineNo">032</span>import org.apache.yetus.audience.InterfaceAudience;<a name="line.32"></a>
-<span class="sourceLineNo">033</span>import org.slf4j.Logger;<a name="line.33"></a>
-<span class="sourceLineNo">034</span>import org.slf4j.LoggerFactory;<a name="line.34"></a>
-<span class="sourceLineNo">035</span>import org.apache.hadoop.hbase.client.Admin;<a name="line.35"></a>
-<span class="sourceLineNo">036</span>import org.apache.hadoop.hbase.client.Connection;<a name="line.36"></a>
-<span class="sourceLineNo">037</span>import org.apache.hadoop.hbase.client.ConnectionFactory;<a name="line.37"></a>
-<span class="sourceLineNo">038</span>import org.apache.hadoop.hbase.client.Scan;<a name="line.38"></a>
-<span class="sourceLineNo">039</span>import org.apache.hadoop.hbase.tool.LoadIncrementalHFiles;<a name="line.39"></a>
-<span class="sourceLineNo">040</span>import org.apache.hadoop.hbase.util.Bytes;<a name="line.40"></a>
-<span class="sourceLineNo">041</span>import org.apache.hadoop.mapreduce.Job;<a name="line.41"></a>
-<span class="sourceLineNo">042</span>import org.apache.hadoop.util.Tool;<a name="line.42"></a>
-<span class="sourceLineNo">043</span>import org.apache.hadoop.util.ToolRunner;<a name="line.43"></a>
-<span class="sourceLineNo">044</span><a name="line.44"></a>
-<span class="sourceLineNo">045</span>/**<a name="line.45"></a>
-<span class="sourceLineNo">046</span> * Tool used to copy a table to another one which can be on a different setup.<a name="line.46"></a>
-<span class="sourceLineNo">047</span> * It is also configurable with a start and time as well as a specification<a name="line.47"></a>
-<span class="sourceLineNo">048</span> * of the region server implementation if different from the local cluster.<a name="line.48"></a>
-<span class="sourceLineNo">049</span> */<a name="line.49"></a>
-<span class="sourceLineNo">050</span>@InterfaceAudience.Public<a name="line.50"></a>
-<span class="sourceLineNo">051</span>public class CopyTable extends Configured implements Tool {<a name="line.51"></a>
-<span class="sourceLineNo">052</span>  private static final Logger LOG = LoggerFactory.getLogger(CopyTable.class);<a name="line.52"></a>
-<span class="sourceLineNo">053</span><a name="line.53"></a>
-<span class="sourceLineNo">054</span>  final static String NAME = "copytable";<a name="line.54"></a>
-<span class="sourceLineNo">055</span>  long startTime = 0;<a name="line.55"></a>
-<span class="sourceLineNo">056</span>  long endTime = HConstants.LATEST_TIMESTAMP;<a name="line.56"></a>
-<span class="sourceLineNo">057</span>  int batch = Integer.MAX_VALUE;<a name="line.57"></a>
-<span class="sourceLineNo">058</span>  int cacheRow = -1;<a name="line.58"></a>
-<span class="sourceLineNo">059</span>  int versions = -1;<a name="line.59"></a>
-<span class="sourceLineNo">060</span>  String tableName = null;<a name="line.60"></a>
-<span class="sourceLineNo">061</span>  String startRow = null;<a name="line.61"></a>
-<span class="sourceLineNo">062</span>  String stopRow = null;<a name="line.62"></a>
-<span class="sourceLineNo">063</span>  String dstTableName = null;<a name="line.63"></a>
-<span class="sourceLineNo">064</span>  String peerAddress = null;<a name="line.64"></a>
-<span class="sourceLineNo">065</span>  String families = null;<a name="line.65"></a>
-<span class="sourceLineNo">066</span>  boolean allCells = false;<a name="line.66"></a>
-<span class="sourceLineNo">067</span>  static boolean shuffle = false;<a name="line.67"></a>
-<span class="sourceLineNo">068</span><a name="line.68"></a>
-<span class="sourceLineNo">069</span>  boolean bulkload = false;<a name="line.69"></a>
-<span class="sourceLineNo">070</span>  Path bulkloadDir = null;<a name="line.70"></a>
-<span class="sourceLineNo">071</span><a name="line.71"></a>
-<span class="sourceLineNo">072</span>  private final static String JOB_NAME_CONF_KEY = "mapreduce.job.name";<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>   * Sets up the actual job.<a name="line.75"></a>
-<span class="sourceLineNo">076</span>   *<a name="line.76"></a>
-<span class="sourceLineNo">077</span>   * @param args  The command line parameters.<a name="line.77"></a>
-<span class="sourceLineNo">078</span>   * @return The newly created job.<a name="line.78"></a>
-<span class="sourceLineNo">079</span>   * @throws IOException When setting up the job fails.<a name="line.79"></a>
-<span class="sourceLineNo">080</span>   */<a name="line.80"></a>
-<span class="sourceLineNo">081</span>  public Job createSubmittableJob(String[] args)<a name="line.81"></a>
-<span class="sourceLineNo">082</span>  throws IOException {<a name="line.82"></a>
-<span class="sourceLineNo">083</span>    if (!doCommandLine(args)) {<a name="line.83"></a>
-<span class="sourceLineNo">084</span>      return null;<a name="line.84"></a>
-<span class="sourceLineNo">085</span>    }<a name="line.85"></a>
-<span class="sourceLineNo">086</span><a name="line.86"></a>
-<span class="sourceLineNo">087</span>    Job job = Job.getInstance(getConf(), getConf().get(JOB_NAME_CONF_KEY, NAME + "_" + tableName));<a name="line.87"></a>
-<span class="sourceLineNo">088</span>    job.setJarByClass(CopyTable.class);<a name="line.88"></a>
-<span class="sourceLineNo">089</span>    Scan scan = new Scan();<a name="line.89"></a>
-<span class="sourceLineNo">090</span><a name="line.90"></a>
-<span class="sourceLineNo">091</span>    scan.setBatch(batch);<a name="line.91"></a>
-<span class="sourceLineNo">092</span>    scan.setCacheBlocks(false);<a name="line.92"></a>
-<span class="sourceLineNo">093</span><a name="line.93"></a>
-<span class="sourceLineNo">094</span>    if (cacheRow &gt; 0) {<a name="line.94"></a>
-<span class="sourceLineNo">095</span>      scan.setCaching(cacheRow);<a name="line.95"></a>
-<span class="sourceLineNo">096</span>    } else {<a name="line.96"></a>
-<span class="sourceLineNo">097</span>      scan.setCaching(getConf().getInt(HConstants.HBASE_CLIENT_SCANNER_CACHING, 100));<a name="line.97"></a>
-<span class="sourceLineNo">098</span>    }<a name="line.98"></a>
-<span class="sourceLineNo">099</span><a name="line.99"></a>
-<span class="sourceLineNo">100</span>    scan.setTimeRange(startTime, endTime);<a name="line.100"></a>
-<span class="sourceLineNo">101</span><a name="line.101"></a>
-<span class="sourceLineNo">102</span>    if (allCells) {<a name="line.102"></a>
-<span class="sourceLineNo">103</span>      scan.setRaw(true);<a name="line.103"></a>
-<span class="sourceLineNo">104</span>    }<a name="line.104"></a>
-<span class="sourceLineNo">105</span>    if (shuffle) {<a name="line.105"></a>
-<span class="sourceLineNo">106</span>      job.getConfiguration().set(TableInputFormat.SHUFFLE_MAPS, "true");<a name="line.106"></a>
-<span class="sourceLineNo">107</span>    }<a name="line.107"></a>
-<span class="sourceLineNo">108</span>    if (versions &gt;= 0) {<a name="line.108"></a>
-<span class="sourceLineNo">109</span>      scan.setMaxVersions(versions);<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>    if (startRow != null) {<a name="line.112"></a>
-<span class="sourceLineNo">113</span>      scan.setStartRow(Bytes.toBytesBinary(startRow));<a name="line.113"></a>
-<span class="sourceLineNo">114</span>    }<a name="line.114"></a>
-<span class="sourceLineNo">115</span><a name="line.115"></a>
-<span class="sourceLineNo">116</span>    if (stopRow != null) {<a name="line.116"></a>
-<span class="sourceLineNo">117</span>      scan.setStopRow(Bytes.toBytesBinary(stopRow));<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>    if(families != null) {<a name="line.120"></a>
-<span class="sourceLineNo">121</span>      String[] fams = families.split(",");<a name="line.121"></a>
-<span class="sourceLineNo">122</span>      Map&lt;String,String&gt; cfRenameMap = new HashMap&lt;&gt;();<a name="line.122"></a>
-<span class="sourceLineNo">123</span>      for(String fam : fams) {<a name="line.123"></a>
-<span class="sourceLineNo">124</span>        String sourceCf;<a name="line.124"></a>
-<span class="sourceLineNo">125</span>        if(fam.contains(":")) {<a name="line.125"></a>
-<span class="sourceLineNo">126</span>            // fam looks like "sourceCfName:destCfName"<a name="line.126"></a>
-<span class="sourceLineNo">127</span>            String[] srcAndDest = fam.split(":", 2);<a name="line.127"></a>
-<span class="sourceLineNo">128</span>            sourceCf = srcAndDest[0];<a name="line.128"></a>
-<span class="sourceLineNo">129</span>            String destCf = srcAndDest[1];<a name="line.129"></a>
-<span class="sourceLineNo">130</span>            cfRenameMap.put(sourceCf, destCf);<a name="line.130"></a>
-<span class="sourceLineNo">131</span>        } else {<a name="line.131"></a>
-<span class="sourceLineNo">132</span>            // fam is just "sourceCf"<a name="line.132"></a>
-<span class="sourceLineNo">133</span>            sourceCf = fam;<a name="line.133"></a>
-<span class="sourceLineNo">134</span>        }<a name="line.134"></a>
-<span class="sourceLineNo">135</span>        scan.addFamily(Bytes.toBytes(sourceCf));<a name="line.135"></a>
-<span class="sourceLineNo">136</span>      }<a name="line.136"></a>
-<span class="sourceLineNo">137</span>      Import.configureCfRenaming(job.getConfiguration(), cfRenameMap);<a name="line.137"></a>
-<span class="sourceLineNo">138</span>    }<a name="line.138"></a>
-<span class="sourceLineNo">139</span>    job.setNumReduceTasks(0);<a name="line.139"></a>
-<span class="sourceLineNo">140</span><a name="line.140"></a>
-<span class="sourceLineNo">141</span>    if (bulkload) {<a name="line.141"></a>
-<span class="sourceLineNo">142</span>      TableMapReduceUtil.initTableMapperJob(tableName, scan, Import.CellImporter.class, null,<a name="line.142"></a>
-<span class="sourceLineNo">143</span>        null, job);<a name="line.143"></a>
-<span class="sourceLineNo">144</span><a name="line.144"></a>
-<span class="sourceLineNo">145</span>      // We need to split the inputs by destination tables so that output of Map can be bulk-loaded.<a name="line.145"></a>
-<span class="sourceLineNo">146</span>      TableInputFormat.configureSplitTable(job, TableName.valueOf(dstTableName));<a name="line.146"></a>
-<span class="sourceLineNo">147</span><a name="line.147"></a>
-<span class="sourceLineNo">148</span>      FileSystem fs = FileSystem.get(getConf());<a name="line.148"></a>
-<span class="sourceLineNo">149</span>      Random rand = new Random();<a name="line.149"></a>
-<span class="sourceLineNo">150</span>      Path root = new Path(fs.getWorkingDirectory(), "copytable");<a name="line.150"></a>
-<span class="sourceLineNo">151</span>      fs.mkdirs(root);<a name="line.151"></a>
-<span class="sourceLineNo">152</span>      while (true) {<a name="line.152"></a>
-<span class="sourceLineNo">153</span>        bulkloadDir = new Path(root, "" + rand.nextLong());<a name="line.153"></a>
-<span class="sourceLineNo">154</span>        if (!fs.exists(bulkloadDir)) {<a name="line.154"></a>
-<span class="sourceLineNo">155</span>          break;<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>      System.out.println("HFiles will be stored at " + this.bulkloadDir);<a name="line.159"></a>
-<span class="sourceLineNo">160</span>      HFileOutputFormat2.setOutputPath(job, bulkloadDir);<a name="line.160"></a>
-<span class="sourceLineNo">161</span>      try (Connection conn = ConnectionFactory.createConnection(getConf());<a name="line.161"></a>
-<span class="sourceLineNo">162</span>          Admin admin = conn.getAdmin()) {<a name="line.162"></a>
-<span class="sourceLineNo">163</span>        HFileOutputFormat2.configureIncrementalLoadMap(job,<a name="line.163"></a>
-<span class="sourceLineNo">164</span>            admin.getDescriptor((TableName.valueOf(dstTableName))));<a name="line.164"></a>
-<span class="sourceLineNo">165</span>      }<a name="line.165"></a>
-<span class="sourceLineNo">166</span>    } else {<a name="line.166"></a>
-<span class="sourceLineNo">167</span>      TableMapReduceUtil.initTableMapperJob(tableName, scan,<a name="line.167"></a>
-<span class="sourceLineNo">168</span>        Import.Importer.class, null, null, job);<a name="line.168"></a>
-<span class="sourceLineNo">169</span><a name="line.169"></a>
-<span class="sourceLineNo">170</span>      TableMapReduceUtil.initTableReducerJob(dstTableName, null, job, null, peerAddress, null,<a name="line.170"></a>
-<span class="sourceLineNo">171</span>        null);<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>    return job;<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>   * @param errorMsg Error message.  Can be null.<a name="line.178"></a>
-<span class="sourceLineNo">179</span>   */<a name="line.179"></a>
-<span class="sourceLineNo">180</span>  private static void printUsage(final String errorMsg) {<a name="line.180"></a>
-<span class="sourceLineNo">181</span>    if (errorMsg != null &amp;&amp; errorMsg.length() &gt; 0) {<a name="line.181"></a>
-<span class="sourceLineNo">182</span>      System.err.println("ERROR: " + errorMsg);<a name="line.182"></a>
-<span class="sourceLineNo">183</span>    }<a name="line.183"></a>
-<span class="sourceLineNo">184</span>    System.err.println("Usage: CopyTable [general options] [--starttime=X] [--endtime=Y] " +<a name="line.184"></a>
-<span class="sourceLineNo">185</span>        "[--new.name=NEW] [--peer.adr=ADR] &lt;tablename&gt;");<a name="line.185"></a>
-<span class="sourceLineNo">186</span>    System.err.println();<a name="line.186"></a>
-<span class="sourceLineNo">187</span>    System.err.println("Options:");<a name="line.187"></a>
-<span class="sourceLineNo">188</span>    System.err.println(" rs.class     hbase.regionserver.class of the peer cluster");<a name="line.188"></a>
-<span class="sourceLineNo">189</span>    System.err.println("              specify if different from current cluster");<a name="line.189"></a>
-<span class="sourceLineNo">190</span>    System.err.println(" rs.impl      hbase.regionserver.impl of the peer cluster");<a name="line.190"></a>
-<span class="sourceLineNo">191</span>    System.err.println(" startrow     the start row");<a name="line.191"></a>
-<span class="sourceLineNo">192</span>    System.err.println(" stoprow      the stop row");<a name="line.192"></a>
-<span class="sourceLineNo">193</span>    System.err.println(" starttime    beginning of the time range (unixtime in millis)");<a name="line.193"></a>
-<span class="sourceLineNo">194</span>    System.err.println("              without endtime means from starttime to forever");<a name="line.194"></a>
-<span class="sourceLineNo">195</span>    System.err.println(" endtime      end of the time range.  Ignored if no starttime specified.");<a name="line.195"></a>
-<span class="sourceLineNo">196</span>    System.err.println(" versions     number of cell versions to copy");<a name="line.196"></a>
-<span class="sourceLineNo">197</span>    System.err.println(" new.name     new table's name");<a name="line.197"></a>
-<span class="sourceLineNo">198</span>    System.err.println(" peer.adr     Address of the peer cluster given in the format");<a name="line.198"></a>
-<span class="sourceLineNo">199</span>    System.err.println("              hbase.zookeeper.quorum:hbase.zookeeper.client"<a name="line.199"></a>
-<span class="sourceLineNo">200</span>        + ".port:zookeeper.znode.parent");<a name="line.200"></a>
-<span class="sourceLineNo">201</span>    System.err.println(" families     comma-separated list of families to copy");<a name="line.201"></a>
-<span class="sourceLineNo">202</span>    System.err.println("              To copy from cf1 to cf2, give sourceCfName:destCfName. ");<a name="line.202"></a>
-<span class="sourceLineNo">203</span>    System.err.println("              To keep the same name, just give \"cfName\"");<a name="line.203"></a>
-<span class="sourceLineNo">204</span>    System.err.println(" all.cells    also copy delete markers and deleted cells");<a name="line.204"></a>
-<span class="sourceLineNo">205</span>    System.err.println(" bulkload     Write input into HFiles and bulk load to the destination "<a name="line.205"></a>
-<span class="sourceLineNo">206</span>        + "table");<a name="line.206"></a>
-<span class="sourceLineNo">207</span>    System.err.println();<a name="line.207"></a>
-<span class="sourceLineNo">208</span>    System.err.println("Args:");<a name="line.208"></a>
-<span class="sourceLineNo">209</span>    System.err.println(" tablename    Name of the table to copy");<a name="line.209"></a>
-<span class="sourceLineNo">210</span>    System.err.println();<a name="line.210"></a>
-<span class="sourceLineNo">211</span>    System.err.println("Examples:");<a name="line.211"></a>
-<span class="sourceLineNo">212</span>    System.err.println(" To copy 'TestTable' to a cluster that uses replication for a 1 hour window:");<a name="line.212"></a>
-<span class="sourceLineNo">213</span>    System.err.println(" $ hbase " +<a name="line.213"></a>
-<span class="sourceLineNo">214</span>        "org.apache.hadoop.hbase.mapreduce.CopyTable --starttime=1265875194289 --endtime=1265878794289 " +<a name="line.214"></a>
-<span class="sourceLineNo">215</span>        "--peer.adr=server1,server2,server3:2181:/hbase --families=myOldCf:myNewCf,cf2,cf3 TestTable ");<a name="line.215"></a>
-<span class="sourceLineNo">216</span>    System.err.println("For performance consider the following general option:\n"<a name="line.216"></a>
-<span class="sourceLineNo">217</span>        + "  It is recommended that you set the following to &gt;=100. A higher value uses more memory but\n"<a name="line.217"></a>
-<span class="sourceLineNo">218</span>        + "  decreases the round trip time to the server and may increase performance.\n"<a name="line.218"></a>
-<span class="sourceLineNo">219</span>        + "    -Dhbase.client.scanner.caching=100\n"<a name="line.219"></a>
-<span class="sourceLineNo">220</span>        + "  The following should always be set to false, to prevent writing data twice, which may produce \n"<a name="line.220"></a>
-<span class="sourceLineNo">221</span>        + "  inaccurate results.\n"<a name="line.221"></a>
-<span class="sourceLineNo">222</span>        + "    -Dmapreduce.map.speculative=false");<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>  private boolean doCommandLine(final String[] args) {<a name="line.225"></a>
-<span class="sourceLineNo">226</span>    // Process command-line args. TODO: Better cmd-line processing<a name="line.226"></a>
-<span class="sourceLineNo">227</span>    // (but hopefully something not as painful as cli options).<a name="line.227"></a>
-<span class="sourceLineNo">228</span>    if (args.length &lt; 1) {<a name="line.228"></a>
-<span class="sourceLineNo">229</span>      printUsage(null);<a name="line.229"></a>
-<span class="sourceLineNo">230</span>      return false;<a name="line.230"></a>
-<span class="sourceLineNo">231</span>    }<a name="line.231"></a>
-<span class="sourceLineNo">232</span>    try {<a name="line.232"></a>
-<span class="sourceLineNo">233</span>      for (int i = 0; i &lt; args.length; i++) {<a name="line.233"></a>
-<span class="sourceLineNo">234</span>        String cmd = args[i];<a name="line.234"></a>
-<span class="sourceLineNo">235</span>        if (cmd.equals("-h") || cmd.startsWith("--h")) {<a name="line.235"></a>
-<span class="sourceLineNo">236</span>          printUsage(null);<a name="line.236"></a>
-<span class="sourceLineNo">237</span>          return false;<a name="line.237"></a>
-<span class="sourceLineNo">238</span>        }<a name="line.238"></a>
-<span class="sourceLineNo">239</span><a name="line.239"></a>
-<span class="sourceLineNo">240</span>        final String startRowArgKey = "--startrow=";<a name="line.240"></a>
-<span class="sourceLineNo">241</span>        if (cmd.startsWith(startRowArgKey)) {<a name="line.241"></a>
-<span class="sourceLineNo">242</span>          startRow = cmd.substring(startRowArgKey.length());<a name="line.242"></a>
-<span class="sourceLineNo">243</span>          continue;<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>        final String stopRowArgKey = "--stoprow=";<a name="line.246"></a>
-<span class="sourceLineNo">247</span>        if (cmd.startsWith(stopRowArgKey)) {<a name="line.247"></a>
-<span class="sourceLineNo">248</span>          stopRow = cmd.substring(stopRowArgKey.length());<a name="line.248"></a>
-<span class="sourceLineNo">249</span>          continue;<a name="line.249"></a>
-<span class="sourceLineNo">250</span>        }<a name="line.250"></a>
-<span class="sourceLineNo">251</span><a name="line.251"></a>
-<span class="sourceLineNo">252</span>        final String startTimeArgKey = "--starttime=";<a name="line.252"></a>
-<span class="sourceLineNo">253</span>        if (cmd.startsWith(startTimeArgKey)) {<a name="line.253"></a>
-<span class="sourceLineNo">254</span>          startTime = Long.parseLong(cmd.substring(startTimeArgKey.length()));<a name="line.254"></a>
-<span class="sourceLineNo">255</span>          continue;<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>        final String endTimeArgKey = "--endtime=";<a name="line.258"></a>
-<span class="sourceLineNo">259</span>        if (cmd.startsWith(endTimeArgKey)) {<a name="line.259"></a>
-<span class="sourceLineNo">260</span>          endTime = Long.parseLong(cmd.substring(endTimeArgKey.length()));<a name="line.260"></a>
-<span class="sourceLineNo">261</span>          continue;<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>        final String batchArgKey = "--batch=";<a name="line.264"></a>
-<span class="sourceLineNo">265</span>        if (cmd.startsWith(batchArgKey)) {<a name="line.265"></a>
-<span class="sourceLineNo">266</span>          batch = Integer.parseInt(cmd.substring(batchArgKey.length()));<a name="line.266"></a>
-<span class="sourceLineNo">267</span>          continue;<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>        final String cacheRowArgKey = "--cacheRow=";<a name="line.270"></a>
-<span class="sourceLineNo">271</span>        if (cmd.startsWith(cacheRowArgKey)) {<a name="line.271"></a>
-<span class="sourceLineNo">272</span>          cacheRow = Integer.parseInt(cmd.substring(cacheRowArgKey.length()));<a name="line.272"></a>
-<span class="sourceLineNo">273</span>          continue;<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>        final String versionsArgKey = "--versions=";<a name="line.276"></a>
-<span class="sourceLineNo">277</span>        if (cmd.startsWith(versionsArgKey)) {<a name="line.277"></a>
-<span class="sourceLineNo">278</span>          versions = Integer.parseInt(cmd.substring(versionsArgKey.length()));<a name="line.278"></a>
-<span class="sourceLineNo">279</span>          continue;<a name="line.279"></a>
-<span class="sourceLineNo">280</span>        }<a name="line.280"></a>
-<span class="sourceLineNo">281</span><a name="line.281"></a>
-<span class="sourceLineNo">282</span>        final String newNameArgKey = "--new.name=";<a name="line.282"></a>
-<span class="sourceLineNo">283</span>        if (cmd.startsWith(newNameArgKey)) {<a name="line.283"></a>
-<span class="sourceLineNo">284</span>          dstTableName = cmd.substring(newNameArgKey.length());<a name="line.284"></a>
-<span class="sourceLineNo">285</span>          continue;<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>        final String peerAdrArgKey = "--peer.adr=";<a name="line.288"></a>
-<span class="sourceLineNo">289</span>        if (cmd.startsWith(peerAdrArgKey)) {<a name="line.289"></a>
-<span class="sourceLineNo">290</span>          peerAddress = cmd.substring(peerAdrArgKey.length());<a name="line.290"></a>
-<span class="sourceLineNo">291</span>          continue;<a name="line.291"></a>
-<span class="sourceLineNo">292</span>        }<a name="line.292"></a>
-<span class="sourceLineNo">293</span><a name="line.293"></a>
-<span class="sourceLineNo">294</span>        final String familiesArgKey = "--families=";<a name="line.294"></a>
-<span class="sourceLineNo">295</span>        if (cmd.startsWith(familiesArgKey)) {<a name="line.295"></a>
-<span class="sourceLineNo">296</span>          families = cmd.substring(familiesArgKey.length());<a name="line.296"></a>
-<span class="sourceLineNo">297</span>          continue;<a name="line.297"></a>
-<span class="sourceLineNo">298</span>        }<a name="line.298"></a>
-<span class="sourceLineNo">299</span><a name="line.299"></a>
-<span class="sourceLineNo">300</span>        if (cmd.startsWith("--all.cells")) {<a name="line.300"></a>
-<span class="sourceLineNo">301</span>          allCells = true;<a name="line.301"></a>
-<span class="sourceLineNo">302</span>          continue;<a name="line.302"></a>
-<span class="sourceLineNo">303</span>        }<a name="line.303"></a>
-<span class="sourceLineNo">304</span><a name="line.304"></a>
-<span class="sourceLineNo">305</span>        if (cmd.startsWith("--bulkload")) {<a name="line.305"></a>
-<span class="sourceLineNo">306</span>          bulkload = true;<a name="line.306"></a>
-<span class="sourceLineNo">307</span>          continue;<a name="line.307"></a>
-<span class="sourceLineNo">308</span>        }<a name="line.308"></a>
-<span class="sourceLineNo">309</span><a name="line.309"></a>
-<span class="sourceLineNo">310</span>        if (cmd.startsWith("--shuffle")) {<a name="line.310"></a>
-<span class="sourceLineNo">311</span>          shuffle = true;<a name="line.311"></a>
-<span class="sourceLineNo">312</span>          continue;<a name="line.312"></a>
-<span class="sourceLineNo">313</span>        }<a name="line.313"></a>
-<span class="sourceLineNo">314</span><a name="line.314"></a>
-<span class="sourceLineNo">315</span>        if (i == args.length-1) {<a name="line.315"></a>
-<span class="sourceLineNo">316</span>          tableName = cmd;<a name="line.316"></a>
-<span class="sourceLineNo">317</span>        } else {<a name="line.317"></a>
-<span class="sourceLineNo">318</span>          printUsage("Invalid argument '" + cmd + "'");<a name="line.318"></a>
-<span class="sourceLineNo">319</span>          return false;<a name="line.319"></a>
-<span class="sourceLineNo">320</span>        }<a name="line.320"></a>
-<span class="sourceLineNo">321</span>      }<a name="line.321"></a>
-<span class="sourceLineNo">322</span>      if (dstTableName == null &amp;&amp; peerAddress == null) {<a name="line.322"></a>
-<span class="sourceLineNo">323</span>        printUsage("At least a new table name or a " +<a name="line.323"></a>
-<span class="sourceLineNo">324</span>            "peer address must be specified");<a name="line.324"></a>
-<span class="sourceLineNo">325</span>        return false;<a name="line.325"></a>
-<span class="sourceLineNo">326</span>      }<a name="line.326"></a>
-<span class="sourceLineNo">327</span>      if ((endTime != 0) &amp;&amp; (startTime &gt; endTime)) {<a name="line.327"></a>
-<span class="sourceLineNo">328</span>        printUsage("Invalid time range filter: starttime=" + startTime + " &gt;  endtime=" + endTime);<a name="line.328"></a>
-<span class="sourceLineNo">329</span>        return false;<a name="line.329"></a>
-<span class="sourceLineNo">330</span>      }<a name="line.330"></a>
-<span class="sourceLineNo">331</span><a name="line.331"></a>
-<span class="sourceLineNo">332</span>      if (bulkload &amp;&amp; peerAddress != null) {<a name="line.332"></a>
-<span class="sourceLineNo">333</span>        printUsage("Remote bulkload is not supported!");<a name="line.333"></a>
-<span class="sourceLineNo">334</span>        return false;<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>      // set dstTableName if necessary<a name="line.337"></a>
-<span class="sourceLineNo">338</span>      if (dstTableName == null) {<a name="line.338"></a>
-<span class="sourceLineNo">339</span>        dstTableName = tableName;<a name="line.339"></a>
-<span class="sourceLineNo">340</span>      }<a name="line.340"></a>
-<span class="sourceLineNo">341</span>    } catch (Exception e) {<a name="line.341"></a>
-<span class="sourceLineNo">342</span>      LOG.error("Failed to parse commandLine arguments", e);<a name="line.342"></a>
-<span class="sourceLineNo">343</span>      printUsage("Can't start because " + e.getMessage());<a name="line.343"></a>
-<span class="sourceLineNo">344</span>      return false;<a name="line.344"></a>
-<span class="sourceLineNo">345</span>    }<a name="line.345"></a>
-<span class="sourceLineNo">346</span>    return true;<a name="line.346"></a>
-<span class="sourceLineNo">347</span>  }<a name="line.347"></a>
-<span class="sourceLineNo">348</span><a name="line.348"></a>
-<span class="sourceLineNo">349</span>  /**<a name="line.349"></a>
-<span class="sourceLineNo">350</span>   * Main entry point.<a name="line.350"></a>
-<span class="sourceLineNo">351</span>   *<a name="line.351"></a>
-<span class="sourceLineNo">352</span>   * @param args  The command line parameters.<a name="line.352"></a>
-<span class="sourceLineNo">353</span>   * @throws Exception When running the job fails.<a name="line.353"></a>
-<span class="sourceLineNo">354</span>   */<a name="line.354"></a>
-<span class="sourceLineNo">355</span>  public static void main(String[] args) throws Exception {<a name="line.355"></a>
-<span class="sourceLineNo">356</span>    int ret = ToolRunner.run(HBaseConfiguration.create(), new CopyTable(), args);<a name="line.356"></a>
-<span class="sourceLineNo">357</span>    System.exit(ret);<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>  @Override<a name="line.360"></a>
-<span class="sourceLineNo">361</span>  public int run(String[] args) throws Exception {<a name="line.361"></a>
-<span class="sourceLineNo">362</span>    Job job = createSubmittableJob(args);<a name="line.362"></a>
-<span class="sourceLineNo">363</span>    if (job == null) return 1;<a name="line.363"></a>
-<span class="sourceLineNo">364</span>    if (!job.waitForCompletion(true)) {<a name="line.364"></a>
-<span class="sourceLineNo">365</span>      LOG.info("Map-reduce job failed!");<a name="line.365"></a>
-<span class="sourceLineNo">366</span>      if (bulkload) {<a name="line.366"></a>
-<span class="sourceLineNo">367</span>        LOG.info("Files are not bulkloaded!");<a name="line.367"></a>
-<span class="sourceLineNo">368</span>      }<a name="line.368"></a>
-<span class="sourceLineNo">369</span>      return 1;<a name="line.369"></a>
-<span class="sourceLineNo">370</span>    }<a name="line.370"></a>
-<span class="sourceLineNo">371</span>    int code = 0;<a name="line.371"></a>
-<span class="sourceLineNo">372</span>    if (bulkload) {<a name="line.372"></a>
-<span class="sourceLineNo">373</span>      code = new LoadIncrementalHFiles(this.getConf()).run(new String[]{this.bulkloadDir.toString(),<a name="line.373"></a>
-<span class="sourceLineNo">374</span>          this.dstTableName});<a name="line.374"></a>
-<span class="sourceLineNo">375</span>      if (code == 0) {<a name="line.375"></a>
-<span class="sourceLineNo">376</span>        // bulkloadDir is deleted only LoadIncrementalHFiles was successful so that one can rerun<a name="line.376"></a>
-<span class="sourceLineNo">377</span>        // LoadIncrementalHFiles.<a name="line.377"></a>
-<span class="sourceLineNo">378</span>        FileSystem fs = FileSystem.get(this.getConf());<a name="line.378"></a>
-<span class="sourceLineNo">379</span>        if (!fs.delete(this.bulkloadDir, true)) {<a name="line.379"></a>
-<span class="sourceLineNo">380</span>          LOG.error("Deleting folder " + bulkloadDir + " failed!");<a name="line.380"></a>
-<span class="sourceLineNo">381</span>          code = 1;<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>    return code;<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">032</span>import org.apache.hadoop.hbase.util.FSUtils;<a name="line.32"></a>
+<span class="sourceLineNo">033</span>import org.apache.yetus.audience.InterfaceAudience;<a name="line.33"></a>
+<span class="sourceLineNo">034</span>import org.slf4j.Logger;<a name="line.34"></a>
+<span class="sourceLineNo">035</span>import org.slf4j.LoggerFactory;<a name="line.35"></a>
+<span class="sourceLineNo">036</span>import org.apache.hadoop.hbase.client.Admin;<a name="line.36"></a>
+<span class="sourceLineNo">037</span>import org.apache.hadoop.hbase.client.Connection;<a name="line.37"></a>
+<span class="sourceLineNo">038</span>import org.apache.hadoop.hbase.client.ConnectionFactory;<a name="line.38"></a>
+<span class="sourceLineNo">039</span>import org.apache.hadoop.hbase.client.Scan;<a name="line.39"></a>
+<span class="sourceLineNo">040</span>import org.apache.hadoop.hbase.tool.LoadIncrementalHFiles;<a name="line.40"></a>
+<span class="sourceLineNo">041</span>import org.apache.hadoop.hbase.util.Bytes;<a name="line.41"></a>
+<span class="sourceLineNo">042</span>import org.apache.hadoop.mapreduce.Job;<a name="line.42"></a>
+<span class="sourceLineNo">043</span>import org.apache.hadoop.util.Tool;<a name="line.43"></a>
+<span class="sourceLineNo">044</span>import org.apache.hadoop.util.ToolRunner;<a name="line.44"></a>
+<span class="sourceLineNo">045</span><a name="line.45"></a>
+<span class="sourceLineNo">046</span>/**<a name="line.46"></a>
+<span class="sourceLineNo">047</span> * Tool used to copy a table to another one which can be on a different setup.<a name="line.47"></a>
+<span class="sourceLineNo">048</span> * It is also configurable with a start and time as well as a specification<a name="line.48"></a>
+<span class="sourceLineNo">049</span> * of the region server implementation if different from the local cluster.<a name="line.49"></a>
+<span class="sourceLineNo">050</span> */<a name="line.50"></a>
+<span class="sourceLineNo">051</span>@InterfaceAudience.Public<a name="line.51"></a>
+<span class="sourceLineNo">052</span>public class CopyTable extends Configured implements Tool {<a name="line.52"></a>
+<span class="sourceLineNo">053</span>  private static final Logger LOG = LoggerFactory.getLogger(CopyTable.class);<a name="line.53"></a>
+<span class="sourceLineNo">054</span><a name="line.54"></a>
+<span class="sourceLineNo">055</span>  final static String NAME = "copytable";<a name="line.55"></a>
+<span class="sourceLineNo">056</span>  long startTime = 0;<a name="line.56"></a>
+<span class="sourceLineNo">057</span>  long endTime = HConstants.LATEST_TIMESTAMP;<a name="line.57"></a>
+<span class="sourceLineNo">058</span>  int batch = Integer.MAX_VALUE;<a name="line.58"></a>
+<span class="sourceLineNo">059</span>  int cacheRow = -1;<a name="line.59"></a>
+<span class="sourceLineNo">060</span>  int versions = -1;<a name="line.60"></a>
+<span class="sourceLineNo">061</span>  String tableName = null;<a name="line.61"></a>
+<span class="sourceLineNo">062</span>  String startRow = null;<a name="line.62"></a>
+<span class="sourceLineNo">063</span>  String stopRow = null;<a name="line.63"></a>
+<span class="sourceLineNo">064</span>  String dstTableName = null;<a name="line.64"></a>
+<span class="sourceLineNo">065</span>  String peerAddress = null;<a name="line.65"></a>
+<span class="sourceLineNo">066</span>  String families = null;<a name="line.66"></a>
+<span class="sourceLineNo">067</span>  boolean allCells = false;<a name="line.67"></a>
+<span class="sourceLineNo">068</span>  static boolean shuffle = false;<a name="line.68"></a>
+<span class="sourceLineNo">069</span><a name="line.69"></a>
+<span class="sourceLineNo">070</span>  boolean bulkload = false;<a name="line.70"></a>
+<span class="sourceLineNo">071</span>  Path bulkloadDir = null;<a name="line.71"></a>
+<span class="sourceLineNo">072</span><a name="line.72"></a>
+<span class="sourceLineNo">073</span>  private final static String JOB_NAME_CONF_KEY = "mapreduce.job.name";<a name="line.73"></a>
+<span class="sourceLineNo">074</span><a name="line.74"></a>
+<span class="sourceLineNo">075</span>  /**<a name="line.75"></a>
+<span class="sourceLineNo">076</span>   * Sets up the actual job.<a name="line.76"></a>
+<span class="sourceLineNo">077</span>   *<a name="line.77"></a>
+<span class="sourceLineNo">078</span>   * @param args  The command line parameters.<a name="line.78"></a>
+<span class="sourceLineNo">079</span>   * @return The newly created job.<a name="line.79"></a>
+<span class="sourceLineNo">080</span>   * @throws IOException When setting up the job fails.<a name="line.80"></a>
+<span class="sourceLineNo">081</span>   */<a name="line.81"></a>
+<span class="sourceLineNo">082</span>  public Job createSubmittableJob(String[] args)<a name="line.82"></a>
+<span class="sourceLineNo">083</span>  throws IOException {<a name="line.83"></a>
+<span class="sourceLineNo">084</span>    if (!doCommandLine(args)) {<a name="line.84"></a>
+<span class="sourceLineNo">085</span>      return null;<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>    Job job = Job.getInstance(getConf(), getConf().get(JOB_NAME_CONF_KEY, NAME + "_" + tableName));<a name="line.88"></a>
+<span class="sourceLineNo">089</span>    job.setJarByClass(CopyTable.class);<a name="line.89"></a>
+<span class="sourceLineNo">090</span>    Scan scan = new Scan();<a name="line.90"></a>
+<span class="sourceLineNo">091</span><a name="line.91"></a>
+<span class="sourceLineNo">092</span>    scan.setBatch(batch);<a name="line.92"></a>
+<span class="sourceLineNo">093</span>    scan.setCacheBlocks(false);<a name="line.93"></a>
+<span class="sourceLineNo">094</span><a name="line.94"></a>
+<span class="sourceLineNo">095</span>    if (cacheRow &gt; 0) {<a name="line.95"></a>
+<span class="sourceLineNo">096</span>      scan.setCaching(cacheRow);<a name="line.96"></a>
+<span class="sourceLineNo">097</span>    } else {<a name="line.97"></a>
+<span class="sourceLineNo">098</span>      scan.setCaching(getConf().getInt(HConstants.HBASE_CLIENT_SCANNER_CACHING, 100));<a name="line.98"></a>
+<span class="sourceLineNo">099</span>    }<a name="line.99"></a>
+<span class="sourceLineNo">100</span><a name="line.100"></a>
+<span class="sourceLineNo">101</span>    scan.setTimeRange(startTime, endTime);<a name="line.101"></a>
+<span class="sourceLineNo">102</span><a name="line.102"></a>
+<span class="sourceLineNo">103</span>    if (allCells) {<a name="line.103"></a>
+<span class="sourceLineNo">104</span>      scan.setRaw(true);<a name="line.104"></a>
+<span class="sourceLineNo">105</span>    }<a name="line.105"></a>
+<span class="sourceLineNo">106</span>    if (shuffle) {<a name="line.106"></a>
+<span class="sourceLineNo">107</span>      job.getConfiguration().set(TableInputFormat.SHUFFLE_MAPS, "true");<a name="line.107"></a>
+<span class="sourceLineNo">108</span>    }<a name="line.108"></a>
+<span class="sourceLineNo">109</span>    if (versions &gt;= 0) {<a name="line.109"></a>
+<span class="sourceLineNo">110</span>      scan.setMaxVersions(versions);<a name="line.110"></a>
+<span class="sourceLineNo">111</span>    }<a name="line.111"></a>
+<span class="sourceLineNo">112</span><a name="line.112"></a>
+<span class="sourceLineNo">113</span>    if (startRow != null) {<a name="line.113"></a>
+<span class="sourceLineNo">114</span>      scan.setStartRow(Bytes.toBytesBinary(startRow));<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>    if (stopRow != null) {<a name="line.117"></a>
+<span class="sourceLineNo">118</span>      scan.setStopRow(Bytes.toBytesBinary(stopRow));<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>    if(families != null) {<a name="line.121"></a>
+<span class="sourceLineNo">122</span>      String[] fams = families.split(",");<a name="line.122"></a>
+<span class="sourceLineNo">123</span>      Map&lt;String,String&gt; cfRenameMap = new HashMap&lt;&gt;();<a name="line.123"></a>
+<span class="sourceLineNo">124</span>      for(String fam : fams) {<a name="line.124"></a>
+<span class="sourceLineNo">125</span>        String sourceCf;<a name="line.125"></a>
+<span class="sourceLineNo">126</span>        if(fam.contains(":")) {<a name="line.126"></a>
+<span class="sourceLineNo">127</span>            // fam looks like "sourceCfName:destCfName"<a name="line.127"></a>
+<span class="sourceLineNo">128</span>            String[] srcAndDest = fam.split(":", 2);<a name="line.128"></a>
+<span class="sourceLineNo">129</span>            sourceCf = srcAndDest[0];<a name="line.129"></a>
+<span class="sourceLineNo">130</span>            String destCf = srcAndDest[1];<a name="line.130"></a>
+<span class="sourceLineNo">131</span>            cfRenameMap.put(sourceCf, destCf);<a name="line.131"></a>
+<span class="sourceLineNo">132</span>        } else {<a name="line.132"></a>
+<span class="sourceLineNo">133</span>            // fam is just "sourceCf"<a name="line.133"></a>
+<span class="sourceLineNo">134</span>            sourceCf = fam;<a name="line.134"></a>
+<span class="sourceLineNo">135</span>        }<a name="line.135"></a>
+<span class="sourceLineNo">136</span>        scan.addFamily(Bytes.toBytes(sourceCf));<a name="line.136"></a>
+<span class="sourceLineNo">137</span>      }<a name="line.137"></a>
+<span class="sourceLineNo">138</span>      Import.configureCfRenaming(job.getConfiguration(), cfRenameMap);<a name="line.138"></a>
+<span class="sourceLineNo">139</span>    }<a name="line.139"></a>
+<span class="sourceLineNo">140</span>    job.setNumReduceTasks(0);<a name="line.140"></a>
+<span class="sourceLineNo">141</span><a name="line.141"></a>
+<span class="sourceLineNo">142</span>    if (bulkload) {<a name="line.142"></a>
+<span class="sourceLineNo">143</span>      TableMapReduceUtil.initTableMapperJob(tableName, scan, Import.CellImporter.class, null, null,<a name="line.143"></a>
+<span class="sourceLineNo">144</span>        job);<a name="line.144"></a>
+<span class="sourceLineNo">145</span><a name="line.145"></a>
+<span class="sourceLineNo">146</span>      // We need to split the inputs by destination tables so that output of Map can be bulk-loaded.<a name="line.146"></a>
+<span class="sourceLineNo">147</span>      TableInputFormat.configureSplitTable(job, TableName.valueOf(dstTableName));<a name="line.147"></a>
+<span class="sourceLineNo">148</span><a name="line.148"></a>
+<span class="sourceLineNo">149</span>      FileSystem fs = FSUtils.getCurrentFileSystem(getConf());<a name="line.149"></a>
+<span class="sourceLineNo">150</span>      Random rand = new Random();<a name="line.150"></a>
+<span class="sourceLineNo">151</span>      Path root = new Path(fs.getWorkingDirectory(), "copytable");<a name="line.151"></a>
+<span class="sourceLineNo">152</span>      fs.mkdirs(root);<a name="line.152"></a>
+<span class="sourceLineNo">153</span>      while (true) {<a name="line.153"></a>
+<span class="sourceLineNo">154</span>        bulkloadDir = new Path(root, "" + rand.nextLong());<a name="line.154"></a>
+<span class="sourceLineNo">155</span>        if (!fs.exists(bulkloadDir)) {<a name="line.155"></a>
+<span class="sourceLineNo">156</span>          break;<a name="line.156"></a>
+<span class="sourceLineNo">157</span>        }<a name="line.157"></a>
+<span class="sourceLineNo">158</span>      }<a name="line.158"></a>
+<span class="sourceLineNo">159</span><a name="line.159"></a>
+<span class="sourceLineNo">160</span>      System.out.println("HFiles will be stored at " + this.bulkloadDir);<a name="line.160"></a>
+<span class="sourceLineNo">161</span>      HFileOutputFormat2.setOutputPath(job, bulkloadDir);<a name="line.161"></a>
+<span class="sourceLineNo">162</span>      try (Connection conn = ConnectionFactory.createConnection(getConf());<a name="line.162"></a>
+<span class="sourceLineNo">163</span>          Admin admin = conn.getAdmin()) {<a name="line.163"></a>
+<span class="sourceLineNo">164</span>        HFileOutputFormat2.configureIncrementalLoadMap(job,<a name="line.164"></a>
+<span class="sourceLineNo">165</span>          admin.getDescriptor((TableName.valueOf(dstTableName))));<a name="line.165"></a>
+<span class="sourceLineNo">166</span>      }<a name="line.166"></a>
+<span class="sourceLineNo">167</span>    } else {<a name="line.167"></a>
+<span class="sourceLineNo">168</span>      TableMapReduceUtil.initTableMapperJob(tableName, scan,<a name="line.168"></a>
+<span class="sourceLineNo">169</span>        Import.Importer.class, null, null, job);<a name="line.169"></a>
+<span class="sourceLineNo">170</span><a name="line.170"></a>
+<span class="sourceLineNo">171</span>      TableMapReduceUtil.initTableReducerJob(dstTableName, null, job, null, peerAddress, null,<a name="line.171"></a>
+<span class="sourceLineNo">172</span>        null);<a name="line.172"></a>
+<span class="sourceLineNo">173</span>    }<a name="line.173"></a>
+<span class="sourceLineNo">174</span><a name="line.174"></a>
+<span class="sourceLineNo">175</span>    return job;<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>  /*<a name="line.178"></a>
+<span class="sourceLineNo">179</span>   * @param errorMsg Error message.  Can be null.<a name="line.179"></a>
+<span class="sourceLineNo">180</span>   */<a name="line.180"></a>
+<span class="sourceLineNo">181</span>  private static void printUsage(final String errorMsg) {<a name="line.181"></a>
+<span class="sourceLineNo">182</span>    if (errorMsg != null &amp;&amp; errorMsg.length() &gt; 0) {<a name="line.182"></a>
+<span class="sourceLineNo">183</span>      System.err.println("ERROR: " + errorMsg);<a name="line.183"></a>
+<span class="sourceLineNo">184</span>    }<a name="line.184"></a>
+<span class="sourceLineNo">185</span>    System.err.println("Usage: CopyTable [general options] [--starttime=X] [--endtime=Y] " +<a name="line.185"></a>
+<span class="sourceLineNo">186</span>        "[--new.name=NEW] [--peer.adr=ADR] &lt;tablename&gt;");<a name="line.186"></a>
+<span class="sourceLineNo">187</span>    System.err.println();<a name="line.187"></a>
+<span class="sourceLineNo">188</span>    System.err.println("Options:");<a name="line.188"></a>
+<span class="sourceLineNo">189</span>    System.err.println(" rs.class     hbase.regionserver.class of the peer cluster");<a name="line.189"></a>
+<span class="sourceLineNo">190</span>    System.err.println("              specify if different from current cluster");<a name="line.190"></a>
+<span class="sourceLineNo">191</span>    System.err.println(" rs.impl      hbase.regionserver.impl of the peer cluster");<a name="line.191"></a>
+<span class="sourceLineNo">192</span>    System.err.println(" startrow     the start row");<a name="line.192"></a>
+<span class="sourceLineNo">193</span>    System.err.println(" stoprow      the stop row");<a name="line.193"></a>
+<span class="sourceLineNo">194</span>    System.err.println(" starttime    beginning of the time range (unixtime in millis)");<a name="line.194"></a>
+<span class="sourceLineNo">195</span>    System.err.println("              without endtime means from starttime to forever");<a name="line.195"></a>
+<span class="sourceLineNo">196</span>    System.err.println(" endtime      end of the time range.  Ignored if no starttime specified.");<a name="line.196"></a>
+<span class="sourceLineNo">197</span>    System.err.println(" versions     number of cell versions to copy");<a name="line.197"></a>
+<span class="sourceLineNo">198</span>    System.err.println(" new.name     new table's name");<a name="line.198"></a>
+<span class="sourceLineNo">199</span>    System.err.println(" peer.adr     Address of the peer cluster given in the format");<a name="line.199"></a>
+<span class="sourceLineNo">200</span>    System.err.println("              hbase.zookeeper.quorum:hbase.zookeeper.client"<a name="line.200"></a>
+<span class="sourceLineNo">201</span>        + ".port:zookeeper.znode.parent");<a name="line.201"></a>
+<span class="sourceLineNo">202</span>    System.err.println(" families     comma-separated list of families to copy");<a name="line.202"></a>
+<span class="sourceLineNo">203</span>    System.err.println("              To copy from cf1 to cf2, give sourceCfName:destCfName. ");<a name="line.203"></a>
+<span class="sourceLineNo">204</span>    System.err.println("              To keep the same name, just give \"cfName\"");<a name="line.204"></a>
+<span class="sourceLineNo">205</span>    System.err.println(" all.cells    also copy delete markers and deleted cells");<a name="line.205"></a>
+<span class="sourceLineNo">206</span>    System.err.println(" bulkload     Write input into HFiles and bulk load to the destination "<a name="line.206"></a>
+<span class="sourceLineNo">207</span>        + "table");<a name="line.207"></a>
+<span class="sourceLineNo">208</span>    System.err.println();<a name="line.208"></a>
+<span class="sourceLineNo">209</span>    System.err.println("Args:");<a name="line.209"></a>
+<span class="sourceLineNo">210</span>    System.err.println(" tablename    Name of the table to copy");<a name="line.210"></a>
+<span class="sourceLineNo">211</span>    System.err.println();<a name="line.211"></a>
+<span class="sourceLineNo">212</span>    System.err.println("Examples:");<a name="line.212"></a>
+<span class="sourceLineNo">213</span>    System.err.println(" To copy 'TestTable' to a cluster that uses replication for a 1 hour window:");<a name="line.213"></a>
+<span class="sourceLineNo">214</span>    System.err.println(" $ hbase " +<a name="line.214"></a>
+<span class="sourceLineNo">215</span>        "org.apache.hadoop.hbase.mapreduce.CopyTable --starttime=1265875194289 --endtime=1265878794289 " +<a name="line.215"></a>
+<span class="sourceLineNo">216</span>        "--peer.adr=server1,server2,server3:2181:/hbase --families=myOldCf:myNewCf,cf2,cf3 TestTable ");<a name="line.216"></a>
+<span class="sourceLineNo">217</span>    System.err.println("For performance consider the following general option:\n"<a name="line.217"></a>
+<span class="sourceLineNo">218</span>        + "  It is recommended that you set the following to &gt;=100. A higher value uses more memory but\n"<a name="line.218"></a>
+<span class="sourceLineNo">219</span>        + "  decreases the round trip time to the server and may increase performance.\n"<a name="line.219"></a>
+<span class="sourceLineNo">220</span>        + "    -Dhbase.client.scanner.caching=100\n"<a name="line.220"></a>
+<span class="sourceLineNo">221</span>        + "  The following should always be set to false, to prevent writing data twice, which may produce \n"<a name="line.221"></a>
+<span class="sourceLineNo">222</span>        + "  inaccurate results.\n"<a name="line.222"></a>
+<span class="sourceLineNo">223</span>        + "    -Dmapreduce.map.speculative=false");<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>  private boolean doCommandLine(final String[] args) {<a name="line.226"></a>
+<span class="sourceLineNo">227</span>    // Process command-line args. TODO: Better cmd-line processing<a name="line.227"></a>
+<span class="sourceLineNo">228</span>    // (but hopefully something not as painful as cli options).<a name="line.228"></a>
+<span class="sourceLineNo">229</span>    if (args.length &lt; 1) {<a name="line.229"></a>
+<span class="sourceLineNo">230</span>      printUsage(null);<a name="line.230"></a>
+<span class="sourceLineNo">231</span>      return false;<a name="line.231"></a>
+<span class="sourceLineNo">232</span>    }<a name="line.232"></a>
+<span class="sourceLineNo">233</span>    try {<a name="line.233"></a>
+<span class="sourceLineNo">234</span>      for (int i = 0; i &lt; args.length; i++) {<a name="line.234"></a>
+<span class="sourceLineNo">235</span>        String cmd = args[i];<a name="line.235"></a>
+<span class="sourceLineNo">236</span>        if (cmd.equals("-h") || cmd.startsWith("--h")) {<a name="line.236"></a>
+<span class="sourceLineNo">237</span>          printUsage(null);<a name="line.237"></a>
+<span class="sourceLineNo">238</span>          return false;<a name="line.238"></a>
+<span class="sourceLineNo">239</span>        }<a name="line.239"></a>
+<span class="sourceLineNo">240</span><a name="line.240"></a>
+<span class="sourceLineNo">241</span>        final String startRowArgKey = "--startrow=";<a name="line.241"></a>
+<span class="sourceLineNo">242</span>        if (cmd.startsWith(startRowArgKey)) {<a name="line.242"></a>
+<span class="sourceLineNo">243</span>          startRow = cmd.substring(startRowArgKey.length());<a name="line.243"></a>
+<span class="sourceLineNo">244</span>          continue;<a name="line.244"></a>
+<span class="sourceLineNo">245</span>        }<a name="line.245"></a>
+<span class="sourceLineNo">246</span><a name="line.246"></a>
+<span class="sourceLineNo">247</span>        final String stopRowArgKey = "--stoprow=";<a name="line.247"></a>
+<span class="sourceLineNo">248</span>        if (cmd.startsWith(stopRowArgKey)) {<a name="line.248"></a>
+<span class="sourceLineNo">249</span>          stopRow = cmd.substring(stopRowArgKey.length());<a name="line.249"></a>
+<span class="sourceLineNo">250</span>          continue;<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>        final String startTimeArgKey = "--starttime=";<a name="line.253"></a>
+<span class="sourceLineNo">254</span>        if (cmd.startsWith(startTimeArgKey)) {<a name="line.254"></a>
+<span class="sourceLineNo">255</span>          startTime = Long.parseLong(cmd.substring(startTimeArgKey.length()));<a name="line.255"></a>
+<span class="sourceLineNo">256</span>          continue;<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>        final String endTimeArgKey = "--endtime=";<a name="line.259"></a>
+<span class="sourceLineNo">260</span>        if (cmd.startsWith(endTimeArgKey)) {<a name="line.260"></a>
+<span class="sourceLineNo">261</span>          endTime = Long.parseLong(cmd.substring(endTimeArgKey.length()));<a name="line.261"></a>
+<span class="sourceLineNo">262</span>          continue;<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>        final String batchArgKey = "--batch=";<a name="line.265"></a>
+<span class="sourceLineNo">266</span>        if (cmd.startsWith(batchArgKey)) {<a name="line.266"></a>
+<span class="sourceLineNo">267</span>          batch = Integer.parseInt(cmd.substring(batchArgKey.length()));<a name="line.267"></a>
+<span class="sourceLineNo">268</span>          continue;<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>        final String cacheRowArgKey = "--cacheRow=";<a name="line.271"></a>
+<span class="sourceLineNo">272</span>        if (cmd.startsWith(cacheRowArgKey)) {<a name="line.272"></a>
+<span class="sourceLineNo">273</span>          cacheRow = Integer.parseInt(cmd.substring(cacheRowArgKey.length()));<a name="line.273"></a>
+<span class="sourceLineNo">274</span>          continue;<a name="line.274"></a>
+<span class="sourceLineNo">275</span>        }<a name="line.275"></a>
+<span class="sourceLineNo">276</span><a name="line.276"></a>
+<span class="sourceLineNo">277</span>        final String versionsArgKey = "--versions=";<a name="line.277"></a>
+<span class="sourceLineNo">278</span>        if (cmd.startsWith(versionsArgKey)) {<a name="line.278"></a>
+<span class="sourceLineNo">279</span>          versions = Integer.parseInt(cmd.substring(versionsArgKey.length()));<a name="line.279"></a>
+<span class="sourceLineNo">280</span>          continue;<a name="line.280"></a>
+<span class="sourceLineNo">281</span>        }<a name="line.281"></a>
+<span class="sourceLineNo">282</span><a name="line.282"></a>
+<span class="sourceLineNo">283</span>        final String newNameArgKey = "--new.name=";<a name="line.283"></a>
+<span class="sourceLineNo">284</span>        if (cmd.startsWith(newNameArgKey)) {<a name="line.284"></a>
+<span class="sourceLineNo">285</span>          dstTableName = cmd.substring(newNameArgKey.length());<a name="line.285"></a>
+<span class="sourceLineNo">286</span>          continue;<a name="line.286"></a>
+<span class="sourceLineNo">287</span>        }<a name="line.287"></a>
+<span class="sourceLineNo">288</span><a name="line.288"></a>
+<span class="sourceLineNo">289</span>        final String peerAdrArgKey = "--peer.adr=";<a name="line.289"></a>
+<span class="sourceLineNo">290</span>        if (cmd.startsWith(peerAdrArgKey)) {<a name="line.290"></a>
+<span class="sourceLineNo">291</span>          peerAddress = cmd.substring(peerAdrArgKey.length());<a name="line.291"></a>
+<span class="sourceLineNo">292</span>          continue;<a name="line.292"></a>
+<span class="sourceLineNo">293</span>        }<a name="line.293"></a>
+<span class="sourceLineNo">294</span><a name="line.294"></a>
+<span class="sourceLineNo">295</span>        final String familiesArgKey = "--families=";<a name="line.295"></a>
+<span class="sourceLineNo">296</span>        if (cmd.startsWith(familiesArgKey)) {<a name="line.296"></a>
+<span class="sourceLineNo">297</span>          families = cmd.substring(familiesArgKey.length());<a name="line.297"></a>
+<span class="sourceLineNo">298</span>          continue;<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>        if (cmd.startsWith("--all.cells")) {<a name="line.301"></a>
+<span class="sourceLineNo">302</span>          allCells = true;<a name="line.302"></a>
+<span class="sourceLineNo">303</span>          continue;<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>        if (cmd.startsWith("--bulkload")) {<a name="line.306"></a>
+<span class="sourceLineNo">307</span>          bulkload = true;<a name="line.307"></a>
+<span class="sourceLineNo">308</span>          continue;<a name="line.308"></a>
+<span class="sourceLineNo">309</span>        }<a name="line.309"></a>
+<span class="sourceLineNo">310</span><a name="line.310"></a>
+<span class="sourceLineNo">311</span>        if (cmd.startsWith("--shuffle")) {<a name="line.311"></a>
+<span class="sourceLineNo">312</span>          shuffle = true;<a name="line.312"></a>
+<span class="sourceLineNo">313</span>          continue;<a name="line.313"></a>
+<span class="sourceLineNo">314</span>        }<a name="line.314"></a>
+<span class="sourceLineNo">315</span><a name="line.315"></a>
+<span class="sourceLineNo">316</span>        if (i == args.length-1) {<a name="line.316"></a>
+<span class="sourceLineNo">317</span>          tableName = cmd;<a name="line.317"></a>
+<span class="sourceLineNo">318</span>        } else {<a name="line.318"></a>
+<span class="sourceLineNo">319</span>          printUsage("Invalid argument '" + cmd + "'");<a name="line.319"></a>
+<span class="sourceLineNo">320</span>          return false;<a name="line.320"></a>
+<span class="sourceLineNo">321</span>        }<a name="line.321"></a>
+<span class="sourceLineNo">322</span>      }<a name="line.322"></a>
+<span class="sourceLineNo">323</span>      if (dstTableName == null &amp;&amp; peerAddress == null) {<a name="line.323"></a>
+<span class="sourceLineNo">324</span>        printUsage("At least a new table name or a " +<a name="line.324"></a>
+<span class="sourceLineNo">325</span>            "peer address must be specified");<a name="line.325"></a>
+<span class="sourceLineNo">326</span>        return false;<a name="line.326"></a>
+<span class="sourceLineNo">327</span>      }<a name="line.327"></a>
+<span class="sourceLineNo">328</span>      if ((endTime != 0) &amp;&amp; (startTime &gt; endTime)) {<a name="line.328"></a>
+<span class="sourceLineNo">329</span>        printUsage("Invalid time range filter: starttime=" + startTime + " &gt;  endtime=" + endTime);<a name="line.329"></a>
+<span class="sourceLineNo">330</span>        return false;<a name="line.330"></a>
+<span class="sourceLineNo">331</span>      }<a name="line.331"></a>
+<span class="sourceLineNo">332</span><a name="line.332"></a>
+<span class="sourceLineNo">333</span>      if (bulkload &amp;&amp; peerAddress != null) {<a name="line.333"></a>
+<span class="sourceLineNo">334</span>        printUsage("Remote bulkload is not supported!");<a name="line.334"></a>
+<span class="sourceLineNo">335</span>        return false;<a name="line.335"></a>
+<span class="sourceLineNo">336</span>      }<a name="line.336"></a>
+<span class="sourceLineNo">337</span><a name="line.337"></a>
+<span class="sourceLineNo">338</span>      // set dstTableName if necessary<a name="line.338"></a>
+<span class="sourceLineNo">339</span>      if (dstTableName == null) {<a name="line.339"></a>
+<span class="sourceLineNo">340</span>        dstTableName = tableName;<a name="line.340"></a>
+<span class="sourceLineNo">341</span>      }<a name="line.341"></a>
+<span class="sourceLineNo">342</span>    } catch (Exception e) {<a name="line.342"></a>
+<span class="sourceLineNo">343</span>      LOG.error("Failed to parse commandLine arguments", e);<a name="line.343"></a>
+<span class="sourceLineNo">344</span>      printUsage("Can't start because " + e.getMessage());<a name="line.344"></a>
+<span class="sourceLineNo">345</span>      return false;<a name="line.345"></a>
+<span class="sourceLineNo">346</span>    }<a name="line.346"></a>
+<span class="sourceLineNo">347</span>    return true;<a name="line.347"></a>
+<span class="sourceLineNo">348</span>  }<a name="line.348"></a>
+<span class="sourceLineNo">349</span><a name="line.349"></a>
+<span class="sourceLineNo">350</span>  /**<a name="line.350"></a>
+<span class="sourceLineNo">351</span>   * Main entry point.<a name="line.351"></a>
+<span class="sourceLineNo">352</span>   *<a name="line.352"></a>
+<span class="sourceLineNo">353</span>   * @param args  The command line parameters.<a name="line.353"></a>
+<span class="sourceLineNo">354</span>   * @throws Exception When running the job fails.<a name="line.354"></a>
+<span class="sourceLineNo">355</span>   */<a name="line.355"></a>
+<span class="sourceLineNo">356</span>  public static void main(String[] args) throws Exception {<a name="line.356"></a>
+<span class="sourceLineNo">357</span>    int ret = ToolRunner.run(HBaseConfiguration.create(), new CopyTable(), args);<a name="line.357"></a>
+<span class="sourceLineNo">358</span>    System.exit(ret);<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>  @Override<a name="line.361"></a>
+<span class="sourceLineNo">362</span>  public int run(String[] args) throws Exception {<a name="line.362"></a>
+<span class="sourceLineNo">363</span>    Job job = createSubmittableJob(args);<a name="line.363"></a>
+<span class="sourceLineNo">364</span>    if (job == null) return 1;<a name="line.364"></a>
+<span class="sourceLineNo">365</span>    if (!job.waitForCompletion(true)) {<a name="line.365"></a>
+<span class="sourceLineNo">366</span>      LOG.info("Map-reduce job failed!");<a name="line.366"></a>
+<span class="sourceLineNo">367</span>      if (bulkload) {<a name="line.367"></a>
+<span class="sourceLineNo">368</span>        LOG.info("Files are not bulkloaded!");<a name="line.368"></a>
+<span class="sourceLineNo">369</span>      }<a name="line.369"></a>
+<span class="sourceLineNo">370</span>      return 1;<a name="line.370"></a>
+<span class="sourceLineNo">371</span>    }<a name="line.371"></a>
+<span class="sourceLineNo">372</span>    int code = 0;<a name="line.372"></a>
+<span class="sourceLineNo">373</span>    if (bulkload) {<a name="line.373"></a>
+<span class="sourceLineNo">374</span>      code = new LoadIncrementalHFiles(this.getConf())<a name="line.374"></a>
+<span class="sourceLineNo">375</span>          .run(new String[] { this.bulkloadDir.toString(), this.dstTableName });<a name="line.375"></a>
+<span class="sourceLineNo">376</span>      if (code == 0) {<a name="line.376"></a>
+<span class="sourceLineNo">377</span>        // bulkloadDir is deleted only LoadIncrementalHFiles was successful so that one can rerun<a name="line.377"></a>
+<span class="sourceLineNo">378</span>        // LoadIncrementalHFiles.<a name="line.378"></a>
+<span class="sourceLineNo">379</span>        FileSystem fs = FSUtils.getCurrentFileSystem(getConf());<a name="line.379"></a>
+<span class="sourceLineNo">380</span>        if (!fs.delete(this.bulkloadDir, true)) {<a name="line.380"></a>
+<span class="sourceLineNo">381</span>          LOG.error("Deleting folder " + bulkloadDir + " failed!");<a name="line.381"></a>
+<span class="sourceLineNo">382</span>          code = 1;<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>    return code;<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>
 
 
 


[14/29] hbase-site git commit: Published site at 5e84997f2ffdbcf5f849d70c30ddbe2db4039ca4.

Posted by gi...@apache.org.
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/27f5bfb5/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 dd0dd0f..9fd7e0b 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
@@ -975,1128 +975,1136 @@
 <span class="sourceLineNo">967</span>        store.update(procedure);<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>      // If we don't have the lock, we can't re-submit the queue,<a name="line.970"></a>
-<span class="sourceLineNo">971</span>      // since it is already executing. To get rid of the stuck situation, we<a name="line.971"></a>
-<span class="sourceLineNo">972</span>      // need to restart the master. With the procedure set to bypass, the procedureExecutor<a name="line.972"></a>
-<span class="sourceLineNo">973</span>      // will bypass it and won't get stuck again.<a name="line.973"></a>
-<span class="sourceLineNo">974</span>      if (lockEntry != null) {<a name="line.974"></a>
-<span class="sourceLineNo">975</span>        // add the procedure to run queue,<a name="line.975"></a>
-<span class="sourceLineNo">976</span>        scheduler.addFront(procedure);<a name="line.976"></a>
-<span class="sourceLineNo">977</span>        LOG.debug("Bypassing {} and its ancestors successfully, adding to queue", procedure);<a name="line.977"></a>
-<span class="sourceLineNo">978</span>      } else {<a name="line.978"></a>
-<span class="sourceLineNo">979</span>        LOG.debug("Bypassing {} and its ancestors successfully, but since it is already running, "<a name="line.979"></a>
-<span class="sourceLineNo">980</span>            + "skipping add to queue", procedure);<a name="line.980"></a>
-<span class="sourceLineNo">981</span>      }<a name="line.981"></a>
-<span class="sourceLineNo">982</span>      return true;<a name="line.982"></a>
-<span class="sourceLineNo">983</span><a name="line.983"></a>
-<span class="sourceLineNo">984</span>    } finally {<a name="line.984"></a>
-<span class="sourceLineNo">985</span>      if (lockEntry != null) {<a name="line.985"></a>
-<span class="sourceLineNo">986</span>        procExecutionLock.releaseLockEntry(lockEntry);<a name="line.986"></a>
-<span class="sourceLineNo">987</span>      }<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><a name="line.990"></a>
-<span class="sourceLineNo">991</span>  /**<a name="line.991"></a>
-<span class="sourceLineNo">992</span>   * Add a new root-procedure to the executor.<a name="line.992"></a>
-<span class="sourceLineNo">993</span>   * @param proc the new procedure to execute.<a name="line.993"></a>
-<span class="sourceLineNo">994</span>   * @param nonceKey the registered unique identifier for this operation from the client or process.<a name="line.994"></a>
-<span class="sourceLineNo">995</span>   * @return the procedure id, that can be used to monitor the operation<a name="line.995"></a>
-<span class="sourceLineNo">996</span>   */<a name="line.996"></a>
-<span class="sourceLineNo">997</span>  @edu.umd.cs.findbugs.annotations.SuppressWarnings(value="NP_NULL_ON_SOME_PATH",<a name="line.997"></a>
-<span class="sourceLineNo">998</span>      justification = "FindBugs is blind to the check-for-null")<a name="line.998"></a>
-<span class="sourceLineNo">999</span>  public long submitProcedure(Procedure&lt;TEnvironment&gt; proc, NonceKey nonceKey) {<a name="line.999"></a>
-<span class="sourceLineNo">1000</span>    Preconditions.checkArgument(lastProcId.get() &gt;= 0);<a name="line.1000"></a>
-<span class="sourceLineNo">1001</span><a name="line.1001"></a>
-<span class="sourceLineNo">1002</span>    prepareProcedure(proc);<a name="line.1002"></a>
-<span class="sourceLineNo">1003</span><a name="line.1003"></a>
-<span class="sourceLineNo">1004</span>    final Long currentProcId;<a name="line.1004"></a>
-<span class="sourceLineNo">1005</span>    if (nonceKey != null) {<a name="line.1005"></a>
-<span class="sourceLineNo">1006</span>      currentProcId = nonceKeysToProcIdsMap.get(nonceKey);<a name="line.1006"></a>
-<span class="sourceLineNo">1007</span>      Preconditions.checkArgument(currentProcId != null,<a name="line.1007"></a>
-<span class="sourceLineNo">1008</span>        "Expected nonceKey=" + nonceKey + " to be reserved, use registerNonce(); proc=" + proc);<a name="line.1008"></a>
-<span class="sourceLineNo">1009</span>    } else {<a name="line.1009"></a>
-<span class="sourceLineNo">1010</span>      currentProcId = nextProcId();<a name="line.1010"></a>
-<span class="sourceLineNo">1011</span>    }<a name="line.1011"></a>
-<span class="sourceLineNo">1012</span><a name="line.1012"></a>
-<span class="sourceLineNo">1013</span>    // Initialize the procedure<a name="line.1013"></a>
-<span class="sourceLineNo">1014</span>    proc.setNonceKey(nonceKey);<a name="line.1014"></a>
-<span class="sourceLineNo">1015</span>    proc.setProcId(currentProcId.longValue());<a name="line.1015"></a>
-<span class="sourceLineNo">1016</span><a name="line.1016"></a>
-<span class="sourceLineNo">1017</span>    // Commit the transaction<a name="line.1017"></a>
-<span class="sourceLineNo">1018</span>    store.insert(proc, null);<a name="line.1018"></a>
-<span class="sourceLineNo">1019</span>    LOG.debug("Stored {}", proc);<a name="line.1019"></a>
+<span class="sourceLineNo">970</span>      // If state of procedure is WAITING_TIMEOUT, we can directly submit it to the scheduler.<a name="line.970"></a>
+<span class="sourceLineNo">971</span>      // Instead we should remove it from timeout Executor queue and tranfer its state to RUNNABLE<a name="line.971"></a>
+<span class="sourceLineNo">972</span>      if (procedure.getState() == ProcedureState.WAITING_TIMEOUT) {<a name="line.972"></a>
+<span class="sourceLineNo">973</span>        LOG.debug("transform procedure {} from WAITING_TIMEOUT to RUNNABLE", procedure);<a name="line.973"></a>
+<span class="sourceLineNo">974</span>        if (timeoutExecutor.remove(procedure)) {<a name="line.974"></a>
+<span class="sourceLineNo">975</span>          LOG.debug("removed procedure {} from timeoutExecutor", procedure);<a name="line.975"></a>
+<span class="sourceLineNo">976</span>          timeoutExecutor.executeTimedoutProcedure(procedure);<a name="line.976"></a>
+<span class="sourceLineNo">977</span>        }<a name="line.977"></a>
+<span class="sourceLineNo">978</span>      } else if (lockEntry != null) {<a name="line.978"></a>
+<span class="sourceLineNo">979</span>        scheduler.addFront(procedure);<a name="line.979"></a>
+<span class="sourceLineNo">980</span>        LOG.debug("Bypassing {} and its ancestors successfully, adding to queue", procedure);<a name="line.980"></a>
+<span class="sourceLineNo">981</span>      } else {<a name="line.981"></a>
+<span class="sourceLineNo">982</span>        // If we don't have the lock, we can't re-submit the queue,<a name="line.982"></a>
+<span class="sourceLineNo">983</span>        // since it is already executing. To get rid of the stuck situation, we<a name="line.983"></a>
+<span class="sourceLineNo">984</span>        // need to restart the master. With the procedure set to bypass, the procedureExecutor<a name="line.984"></a>
+<span class="sourceLineNo">985</span>        // will bypass it and won't get stuck again.<a name="line.985"></a>
+<span class="sourceLineNo">986</span>        LOG.debug("Bypassing {} and its ancestors successfully, but since it is already running, "<a name="line.986"></a>
+<span class="sourceLineNo">987</span>            + "skipping add to queue",<a name="line.987"></a>
+<span class="sourceLineNo">988</span>          procedure);<a name="line.988"></a>
+<span class="sourceLineNo">989</span>      }<a name="line.989"></a>
+<span class="sourceLineNo">990</span>      return true;<a name="line.990"></a>
+<span class="sourceLineNo">991</span><a name="line.991"></a>
+<span class="sourceLineNo">992</span>    } finally {<a name="line.992"></a>
+<span class="sourceLineNo">993</span>      if (lockEntry != null) {<a name="line.993"></a>
+<span class="sourceLineNo">994</span>        procExecutionLock.releaseLockEntry(lockEntry);<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>  }<a name="line.997"></a>
+<span class="sourceLineNo">998</span><a name="line.998"></a>
+<span class="sourceLineNo">999</span>  /**<a name="line.999"></a>
+<span class="sourceLineNo">1000</span>   * Add a new root-procedure to the executor.<a name="line.1000"></a>
+<span class="sourceLineNo">1001</span>   * @param proc the new procedure to execute.<a name="line.1001"></a>
+<span class="sourceLineNo">1002</span>   * @param nonceKey the registered unique identifier for this operation from the client or process.<a name="line.1002"></a>
+<span class="sourceLineNo">1003</span>   * @return the procedure id, that can be used to monitor the operation<a name="line.1003"></a>
+<span class="sourceLineNo">1004</span>   */<a name="line.1004"></a>
+<span class="sourceLineNo">1005</span>  @edu.umd.cs.findbugs.annotations.SuppressWarnings(value="NP_NULL_ON_SOME_PATH",<a name="line.1005"></a>
+<span class="sourceLineNo">1006</span>      justification = "FindBugs is blind to the check-for-null")<a name="line.1006"></a>
+<span class="sourceLineNo">1007</span>  public long submitProcedure(Procedure&lt;TEnvironment&gt; proc, NonceKey nonceKey) {<a name="line.1007"></a>
+<span class="sourceLineNo">1008</span>    Preconditions.checkArgument(lastProcId.get() &gt;= 0);<a name="line.1008"></a>
+<span class="sourceLineNo">1009</span><a name="line.1009"></a>
+<span class="sourceLineNo">1010</span>    prepareProcedure(proc);<a name="line.1010"></a>
+<span class="sourceLineNo">1011</span><a name="line.1011"></a>
+<span class="sourceLineNo">1012</span>    final Long currentProcId;<a name="line.1012"></a>
+<span class="sourceLineNo">1013</span>    if (nonceKey != null) {<a name="line.1013"></a>
+<span class="sourceLineNo">1014</span>      currentProcId = nonceKeysToProcIdsMap.get(nonceKey);<a name="line.1014"></a>
+<span class="sourceLineNo">1015</span>      Preconditions.checkArgument(currentProcId != null,<a name="line.1015"></a>
+<span class="sourceLineNo">1016</span>        "Expected nonceKey=" + nonceKey + " to be reserved, use registerNonce(); proc=" + proc);<a name="line.1016"></a>
+<span class="sourceLineNo">1017</span>    } else {<a name="line.1017"></a>
+<span class="sourceLineNo">1018</span>      currentProcId = nextProcId();<a name="line.1018"></a>
+<span class="sourceLineNo">1019</span>    }<a name="line.1019"></a>
 <span class="sourceLineNo">1020</span><a name="line.1020"></a>
-<span class="sourceLineNo">1021</span>    // Add the procedure to the executor<a name="line.1021"></a>
-<span class="sourceLineNo">1022</span>    return pushProcedure(proc);<a name="line.1022"></a>
-<span class="sourceLineNo">1023</span>  }<a name="line.1023"></a>
+<span class="sourceLineNo">1021</span>    // Initialize the procedure<a name="line.1021"></a>
+<span class="sourceLineNo">1022</span>    proc.setNonceKey(nonceKey);<a name="line.1022"></a>
+<span class="sourceLineNo">1023</span>    proc.setProcId(currentProcId.longValue());<a name="line.1023"></a>
 <span class="sourceLineNo">1024</span><a name="line.1024"></a>
-<span class="sourceLineNo">1025</span>  /**<a name="line.1025"></a>
-<span class="sourceLineNo">1026</span>   * Add a set of new root-procedure to the executor.<a name="line.1026"></a>
-<span class="sourceLineNo">1027</span>   * @param procs the new procedures to execute.<a name="line.1027"></a>
-<span class="sourceLineNo">1028</span>   */<a name="line.1028"></a>
-<span class="sourceLineNo">1029</span>  // TODO: Do we need to take nonces here?<a name="line.1029"></a>
-<span class="sourceLineNo">1030</span>  public void submitProcedures(Procedure&lt;TEnvironment&gt;[] procs) {<a name="line.1030"></a>
-<span class="sourceLineNo">1031</span>    Preconditions.checkArgument(lastProcId.get() &gt;= 0);<a name="line.1031"></a>
-<span class="sourceLineNo">1032</span>    if (procs == null || procs.length &lt;= 0) {<a name="line.1032"></a>
-<span class="sourceLineNo">1033</span>      return;<a name="line.1033"></a>
-<span class="sourceLineNo">1034</span>    }<a name="line.1034"></a>
-<span class="sourceLineNo">1035</span><a name="line.1035"></a>
-<span class="sourceLineNo">1036</span>    // Prepare procedure<a name="line.1036"></a>
-<span class="sourceLineNo">1037</span>    for (int i = 0; i &lt; procs.length; ++i) {<a name="line.1037"></a>
-<span class="sourceLineNo">1038</span>      prepareProcedure(procs[i]).setProcId(nextProcId());<a name="line.1038"></a>
-<span class="sourceLineNo">1039</span>    }<a name="line.1039"></a>
-<span class="sourceLineNo">1040</span><a name="line.1040"></a>
-<span class="sourceLineNo">1041</span>    // Commit the transaction<a name="line.1041"></a>
-<span class="sourceLineNo">1042</span>    store.insert(procs);<a name="line.1042"></a>
-<span class="sourceLineNo">1043</span>    if (LOG.isDebugEnabled()) {<a name="line.1043"></a>
-<span class="sourceLineNo">1044</span>      LOG.debug("Stored " + Arrays.toString(procs));<a name="line.1044"></a>
-<span class="sourceLineNo">1045</span>    }<a name="line.1045"></a>
-<span class="sourceLineNo">1046</span><a name="line.1046"></a>
-<span class="sourceLineNo">1047</span>    // Add the procedure to the executor<a name="line.1047"></a>
-<span class="sourceLineNo">1048</span>    for (int i = 0; i &lt; procs.length; ++i) {<a name="line.1048"></a>
-<span class="sourceLineNo">1049</span>      pushProcedure(procs[i]);<a name="line.1049"></a>
-<span class="sourceLineNo">1050</span>    }<a name="line.1050"></a>
-<span class="sourceLineNo">1051</span>  }<a name="line.1051"></a>
-<span class="sourceLineNo">1052</span><a name="line.1052"></a>
-<span class="sourceLineNo">1053</span>  private Procedure&lt;TEnvironment&gt; prepareProcedure(Procedure&lt;TEnvironment&gt; proc) {<a name="line.1053"></a>
-<span class="sourceLineNo">1054</span>    Preconditions.checkArgument(proc.getState() == ProcedureState.INITIALIZING);<a name="line.1054"></a>
-<span class="sourceLineNo">1055</span>    Preconditions.checkArgument(!proc.hasParent(), "unexpected parent", proc);<a name="line.1055"></a>
-<span class="sourceLineNo">1056</span>    if (this.checkOwnerSet) {<a name="line.1056"></a>
-<span class="sourceLineNo">1057</span>      Preconditions.checkArgument(proc.hasOwner(), "missing owner");<a name="line.1057"></a>
+<span class="sourceLineNo">1025</span>    // Commit the transaction<a name="line.1025"></a>
+<span class="sourceLineNo">1026</span>    store.insert(proc, null);<a name="line.1026"></a>
+<span class="sourceLineNo">1027</span>    LOG.debug("Stored {}", proc);<a name="line.1027"></a>
+<span class="sourceLineNo">1028</span><a name="line.1028"></a>
+<span class="sourceLineNo">1029</span>    // Add the procedure to the executor<a name="line.1029"></a>
+<span class="sourceLineNo">1030</span>    return pushProcedure(proc);<a name="line.1030"></a>
+<span class="sourceLineNo">1031</span>  }<a name="line.1031"></a>
+<span class="sourceLineNo">1032</span><a name="line.1032"></a>
+<span class="sourceLineNo">1033</span>  /**<a name="line.1033"></a>
+<span class="sourceLineNo">1034</span>   * Add a set of new root-procedure to the executor.<a name="line.1034"></a>
+<span class="sourceLineNo">1035</span>   * @param procs the new procedures to execute.<a name="line.1035"></a>
+<span class="sourceLineNo">1036</span>   */<a name="line.1036"></a>
+<span class="sourceLineNo">1037</span>  // TODO: Do we need to take nonces here?<a name="line.1037"></a>
+<span class="sourceLineNo">1038</span>  public void submitProcedures(Procedure&lt;TEnvironment&gt;[] procs) {<a name="line.1038"></a>
+<span class="sourceLineNo">1039</span>    Preconditions.checkArgument(lastProcId.get() &gt;= 0);<a name="line.1039"></a>
+<span class="sourceLineNo">1040</span>    if (procs == null || procs.length &lt;= 0) {<a name="line.1040"></a>
+<span class="sourceLineNo">1041</span>      return;<a name="line.1041"></a>
+<span class="sourceLineNo">1042</span>    }<a name="line.1042"></a>
+<span class="sourceLineNo">1043</span><a name="line.1043"></a>
+<span class="sourceLineNo">1044</span>    // Prepare procedure<a name="line.1044"></a>
+<span class="sourceLineNo">1045</span>    for (int i = 0; i &lt; procs.length; ++i) {<a name="line.1045"></a>
+<span class="sourceLineNo">1046</span>      prepareProcedure(procs[i]).setProcId(nextProcId());<a name="line.1046"></a>
+<span class="sourceLineNo">1047</span>    }<a name="line.1047"></a>
+<span class="sourceLineNo">1048</span><a name="line.1048"></a>
+<span class="sourceLineNo">1049</span>    // Commit the transaction<a name="line.1049"></a>
+<span class="sourceLineNo">1050</span>    store.insert(procs);<a name="line.1050"></a>
+<span class="sourceLineNo">1051</span>    if (LOG.isDebugEnabled()) {<a name="line.1051"></a>
+<span class="sourceLineNo">1052</span>      LOG.debug("Stored " + Arrays.toString(procs));<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>    // Add the procedure to the executor<a name="line.1055"></a>
+<span class="sourceLineNo">1056</span>    for (int i = 0; i &lt; procs.length; ++i) {<a name="line.1056"></a>
+<span class="sourceLineNo">1057</span>      pushProcedure(procs[i]);<a name="line.1057"></a>
 <span class="sourceLineNo">1058</span>    }<a name="line.1058"></a>
-<span class="sourceLineNo">1059</span>    return proc;<a name="line.1059"></a>
-<span class="sourceLineNo">1060</span>  }<a name="line.1060"></a>
-<span class="sourceLineNo">1061</span><a name="line.1061"></a>
-<span class="sourceLineNo">1062</span>  private long pushProcedure(Procedure&lt;TEnvironment&gt; proc) {<a name="line.1062"></a>
-<span class="sourceLineNo">1063</span>    final long currentProcId = proc.getProcId();<a name="line.1063"></a>
-<span class="sourceLineNo">1064</span><a name="line.1064"></a>
-<span class="sourceLineNo">1065</span>    // Update metrics on start of a procedure<a name="line.1065"></a>
-<span class="sourceLineNo">1066</span>    proc.updateMetricsOnSubmit(getEnvironment());<a name="line.1066"></a>
-<span class="sourceLineNo">1067</span><a name="line.1067"></a>
-<span class="sourceLineNo">1068</span>    // Create the rollback stack for the procedure<a name="line.1068"></a>
-<span class="sourceLineNo">1069</span>    RootProcedureState&lt;TEnvironment&gt; stack = new RootProcedureState&lt;&gt;();<a name="line.1069"></a>
-<span class="sourceLineNo">1070</span>    rollbackStack.put(currentProcId, stack);<a name="line.1070"></a>
-<span class="sourceLineNo">1071</span><a name="line.1071"></a>
-<span class="sourceLineNo">1072</span>    // Submit the new subprocedures<a name="line.1072"></a>
-<span class="sourceLineNo">1073</span>    assert !procedures.containsKey(currentProcId);<a name="line.1073"></a>
-<span class="sourceLineNo">1074</span>    procedures.put(currentProcId, proc);<a name="line.1074"></a>
-<span class="sourceLineNo">1075</span>    sendProcedureAddedNotification(currentProcId);<a name="line.1075"></a>
-<span class="sourceLineNo">1076</span>    scheduler.addBack(proc);<a name="line.1076"></a>
-<span class="sourceLineNo">1077</span>    return proc.getProcId();<a name="line.1077"></a>
-<span class="sourceLineNo">1078</span>  }<a name="line.1078"></a>
+<span class="sourceLineNo">1059</span>  }<a name="line.1059"></a>
+<span class="sourceLineNo">1060</span><a name="line.1060"></a>
+<span class="sourceLineNo">1061</span>  private Procedure&lt;TEnvironment&gt; prepareProcedure(Procedure&lt;TEnvironment&gt; proc) {<a name="line.1061"></a>
+<span class="sourceLineNo">1062</span>    Preconditions.checkArgument(proc.getState() == ProcedureState.INITIALIZING);<a name="line.1062"></a>
+<span class="sourceLineNo">1063</span>    Preconditions.checkArgument(!proc.hasParent(), "unexpected parent", proc);<a name="line.1063"></a>
+<span class="sourceLineNo">1064</span>    if (this.checkOwnerSet) {<a name="line.1064"></a>
+<span class="sourceLineNo">1065</span>      Preconditions.checkArgument(proc.hasOwner(), "missing owner");<a name="line.1065"></a>
+<span class="sourceLineNo">1066</span>    }<a name="line.1066"></a>
+<span class="sourceLineNo">1067</span>    return proc;<a name="line.1067"></a>
+<span class="sourceLineNo">1068</span>  }<a name="line.1068"></a>
+<span class="sourceLineNo">1069</span><a name="line.1069"></a>
+<span class="sourceLineNo">1070</span>  private long pushProcedure(Procedure&lt;TEnvironment&gt; proc) {<a name="line.1070"></a>
+<span class="sourceLineNo">1071</span>    final long currentProcId = proc.getProcId();<a name="line.1071"></a>
+<span class="sourceLineNo">1072</span><a name="line.1072"></a>
+<span class="sourceLineNo">1073</span>    // Update metrics on start of a procedure<a name="line.1073"></a>
+<span class="sourceLineNo">1074</span>    proc.updateMetricsOnSubmit(getEnvironment());<a name="line.1074"></a>
+<span class="sourceLineNo">1075</span><a name="line.1075"></a>
+<span class="sourceLineNo">1076</span>    // Create the rollback stack for the procedure<a name="line.1076"></a>
+<span class="sourceLineNo">1077</span>    RootProcedureState&lt;TEnvironment&gt; stack = new RootProcedureState&lt;&gt;();<a name="line.1077"></a>
+<span class="sourceLineNo">1078</span>    rollbackStack.put(currentProcId, stack);<a name="line.1078"></a>
 <span class="sourceLineNo">1079</span><a name="line.1079"></a>
-<span class="sourceLineNo">1080</span>  /**<a name="line.1080"></a>
-<span class="sourceLineNo">1081</span>   * Send an abort notification the specified procedure.<a name="line.1081"></a>
-<span class="sourceLineNo">1082</span>   * Depending on the procedure implementation the abort can be considered or ignored.<a name="line.1082"></a>
-<span class="sourceLineNo">1083</span>   * @param procId the procedure to abort<a name="line.1083"></a>
-<span class="sourceLineNo">1084</span>   * @return true if the procedure exists and has received the abort, otherwise false.<a name="line.1084"></a>
-<span class="sourceLineNo">1085</span>   */<a name="line.1085"></a>
-<span class="sourceLineNo">1086</span>  public boolean abort(long procId) {<a name="line.1086"></a>
-<span class="sourceLineNo">1087</span>    return abort(procId, true);<a name="line.1087"></a>
-<span class="sourceLineNo">1088</span>  }<a name="line.1088"></a>
-<span class="sourceLineNo">1089</span><a name="line.1089"></a>
-<span class="sourceLineNo">1090</span>  /**<a name="line.1090"></a>
-<span class="sourceLineNo">1091</span>   * Send an abort notification to the specified procedure.<a name="line.1091"></a>
-<span class="sourceLineNo">1092</span>   * Depending on the procedure implementation, the abort can be considered or ignored.<a name="line.1092"></a>
-<span class="sourceLineNo">1093</span>   * @param procId the procedure to abort<a name="line.1093"></a>
-<span class="sourceLineNo">1094</span>   * @param mayInterruptIfRunning if the proc completed at least one step, should it be aborted?<a name="line.1094"></a>
-<span class="sourceLineNo">1095</span>   * @return true if the procedure exists and has received the abort, otherwise false.<a name="line.1095"></a>
-<span class="sourceLineNo">1096</span>   */<a name="line.1096"></a>
-<span class="sourceLineNo">1097</span>  public boolean abort(long procId, boolean mayInterruptIfRunning) {<a name="line.1097"></a>
-<span class="sourceLineNo">1098</span>    Procedure&lt;TEnvironment&gt; proc = procedures.get(procId);<a name="line.1098"></a>
-<span class="sourceLineNo">1099</span>    if (proc != null) {<a name="line.1099"></a>
-<span class="sourceLineNo">1100</span>      if (!mayInterruptIfRunning &amp;&amp; proc.wasExecuted()) {<a name="line.1100"></a>
-<span class="sourceLineNo">1101</span>        return false;<a name="line.1101"></a>
-<span class="sourceLineNo">1102</span>      }<a name="line.1102"></a>
-<span class="sourceLineNo">1103</span>      return proc.abort(getEnvironment());<a name="line.1103"></a>
-<span class="sourceLineNo">1104</span>    }<a name="line.1104"></a>
-<span class="sourceLineNo">1105</span>    return false;<a name="line.1105"></a>
-<span class="sourceLineNo">1106</span>  }<a name="line.1106"></a>
-<span class="sourceLineNo">1107</span><a name="line.1107"></a>
-<span class="sourceLineNo">1108</span>  // ==========================================================================<a name="line.1108"></a>
-<span class="sourceLineNo">1109</span>  //  Executor query helpers<a name="line.1109"></a>
-<span class="sourceLineNo">1110</span>  // ==========================================================================<a name="line.1110"></a>
-<span class="sourceLineNo">1111</span>  public Procedure&lt;TEnvironment&gt; getProcedure(final long procId) {<a name="line.1111"></a>
-<span class="sourceLineNo">1112</span>    return procedures.get(procId);<a name="line.1112"></a>
-<span class="sourceLineNo">1113</span>  }<a name="line.1113"></a>
-<span class="sourceLineNo">1114</span><a name="line.1114"></a>
-<span class="sourceLineNo">1115</span>  public &lt;T extends Procedure&lt;TEnvironment&gt;&gt; T getProcedure(Class&lt;T&gt; clazz, long procId) {<a name="line.1115"></a>
-<span class="sourceLineNo">1116</span>    Procedure&lt;TEnvironment&gt; proc = getProcedure(procId);<a name="line.1116"></a>
-<span class="sourceLineNo">1117</span>    if (clazz.isInstance(proc)) {<a name="line.1117"></a>
-<span class="sourceLineNo">1118</span>      return clazz.cast(proc);<a name="line.1118"></a>
-<span class="sourceLineNo">1119</span>    }<a name="line.1119"></a>
-<span class="sourceLineNo">1120</span>    return null;<a name="line.1120"></a>
+<span class="sourceLineNo">1080</span>    // Submit the new subprocedures<a name="line.1080"></a>
+<span class="sourceLineNo">1081</span>    assert !procedures.containsKey(currentProcId);<a name="line.1081"></a>
+<span class="sourceLineNo">1082</span>    procedures.put(currentProcId, proc);<a name="line.1082"></a>
+<span class="sourceLineNo">1083</span>    sendProcedureAddedNotification(currentProcId);<a name="line.1083"></a>
+<span class="sourceLineNo">1084</span>    scheduler.addBack(proc);<a name="line.1084"></a>
+<span class="sourceLineNo">1085</span>    return proc.getProcId();<a name="line.1085"></a>
+<span class="sourceLineNo">1086</span>  }<a name="line.1086"></a>
+<span class="sourceLineNo">1087</span><a name="line.1087"></a>
+<span class="sourceLineNo">1088</span>  /**<a name="line.1088"></a>
+<span class="sourceLineNo">1089</span>   * Send an abort notification the specified procedure.<a name="line.1089"></a>
+<span class="sourceLineNo">1090</span>   * Depending on the procedure implementation the abort can be considered or ignored.<a name="line.1090"></a>
+<span class="sourceLineNo">1091</span>   * @param procId the procedure to abort<a name="line.1091"></a>
+<span class="sourceLineNo">1092</span>   * @return true if the procedure exists and has received the abort, otherwise false.<a name="line.1092"></a>
+<span class="sourceLineNo">1093</span>   */<a name="line.1093"></a>
+<span class="sourceLineNo">1094</span>  public boolean abort(long procId) {<a name="line.1094"></a>
+<span class="sourceLineNo">1095</span>    return abort(procId, true);<a name="line.1095"></a>
+<span class="sourceLineNo">1096</span>  }<a name="line.1096"></a>
+<span class="sourceLineNo">1097</span><a name="line.1097"></a>
+<span class="sourceLineNo">1098</span>  /**<a name="line.1098"></a>
+<span class="sourceLineNo">1099</span>   * Send an abort notification to the specified procedure.<a name="line.1099"></a>
+<span class="sourceLineNo">1100</span>   * Depending on the procedure implementation, the abort can be considered or ignored.<a name="line.1100"></a>
+<span class="sourceLineNo">1101</span>   * @param procId the procedure to abort<a name="line.1101"></a>
+<span class="sourceLineNo">1102</span>   * @param mayInterruptIfRunning if the proc completed at least one step, should it be aborted?<a name="line.1102"></a>
+<span class="sourceLineNo">1103</span>   * @return true if the procedure exists and has received the abort, otherwise false.<a name="line.1103"></a>
+<span class="sourceLineNo">1104</span>   */<a name="line.1104"></a>
+<span class="sourceLineNo">1105</span>  public boolean abort(long procId, boolean mayInterruptIfRunning) {<a name="line.1105"></a>
+<span class="sourceLineNo">1106</span>    Procedure&lt;TEnvironment&gt; proc = procedures.get(procId);<a name="line.1106"></a>
+<span class="sourceLineNo">1107</span>    if (proc != null) {<a name="line.1107"></a>
+<span class="sourceLineNo">1108</span>      if (!mayInterruptIfRunning &amp;&amp; proc.wasExecuted()) {<a name="line.1108"></a>
+<span class="sourceLineNo">1109</span>        return false;<a name="line.1109"></a>
+<span class="sourceLineNo">1110</span>      }<a name="line.1110"></a>
+<span class="sourceLineNo">1111</span>      return proc.abort(getEnvironment());<a name="line.1111"></a>
+<span class="sourceLineNo">1112</span>    }<a name="line.1112"></a>
+<span class="sourceLineNo">1113</span>    return false;<a name="line.1113"></a>
+<span class="sourceLineNo">1114</span>  }<a name="line.1114"></a>
+<span class="sourceLineNo">1115</span><a name="line.1115"></a>
+<span class="sourceLineNo">1116</span>  // ==========================================================================<a name="line.1116"></a>
+<span class="sourceLineNo">1117</span>  //  Executor query helpers<a name="line.1117"></a>
+<span class="sourceLineNo">1118</span>  // ==========================================================================<a name="line.1118"></a>
+<span class="sourceLineNo">1119</span>  public Procedure&lt;TEnvironment&gt; getProcedure(final long procId) {<a name="line.1119"></a>
+<span class="sourceLineNo">1120</span>    return procedures.get(procId);<a name="line.1120"></a>
 <span class="sourceLineNo">1121</span>  }<a name="line.1121"></a>
 <span class="sourceLineNo">1122</span><a name="line.1122"></a>
-<span class="sourceLineNo">1123</span>  public Procedure&lt;TEnvironment&gt; getResult(long procId) {<a name="line.1123"></a>
-<span class="sourceLineNo">1124</span>    CompletedProcedureRetainer&lt;TEnvironment&gt; retainer = completed.get(procId);<a name="line.1124"></a>
-<span class="sourceLineNo">1125</span>    if (retainer == null) {<a name="line.1125"></a>
-<span class="sourceLineNo">1126</span>      return null;<a name="line.1126"></a>
-<span class="sourceLineNo">1127</span>    } else {<a name="line.1127"></a>
-<span class="sourceLineNo">1128</span>      return retainer.getProcedure();<a name="line.1128"></a>
-<span class="sourceLineNo">1129</span>    }<a name="line.1129"></a>
-<span class="sourceLineNo">1130</span>  }<a name="line.1130"></a>
-<span class="sourceLineNo">1131</span><a name="line.1131"></a>
-<span class="sourceLineNo">1132</span>  /**<a name="line.1132"></a>
-<span class="sourceLineNo">1133</span>   * Return true if the procedure is finished.<a name="line.1133"></a>
-<span class="sourceLineNo">1134</span>   * The state may be "completed successfully" or "failed and rolledback".<a name="line.1134"></a>
-<span class="sourceLineNo">1135</span>   * Use getResult() to check the state or get the result data.<a name="line.1135"></a>
-<span class="sourceLineNo">1136</span>   * @param procId the ID of the procedure to check<a name="line.1136"></a>
-<span class="sourceLineNo">1137</span>   * @return true if the procedure execution is finished, otherwise false.<a name="line.1137"></a>
-<span class="sourceLineNo">1138</span>   */<a name="line.1138"></a>
-<span class="sourceLineNo">1139</span>  public boolean isFinished(final long procId) {<a name="line.1139"></a>
-<span class="sourceLineNo">1140</span>    return !procedures.containsKey(procId);<a name="line.1140"></a>
-<span class="sourceLineNo">1141</span>  }<a name="line.1141"></a>
-<span class="sourceLineNo">1142</span><a name="line.1142"></a>
-<span class="sourceLineNo">1143</span>  /**<a name="line.1143"></a>
-<span class="sourceLineNo">1144</span>   * Return true if the procedure is started.<a name="line.1144"></a>
-<span class="sourceLineNo">1145</span>   * @param procId the ID of the procedure to check<a name="line.1145"></a>
-<span class="sourceLineNo">1146</span>   * @return true if the procedure execution is started, otherwise false.<a name="line.1146"></a>
-<span class="sourceLineNo">1147</span>   */<a name="line.1147"></a>
-<span class="sourceLineNo">1148</span>  public boolean isStarted(long procId) {<a name="line.1148"></a>
-<span class="sourceLineNo">1149</span>    Procedure&lt;?&gt; proc = procedures.get(procId);<a name="line.1149"></a>
-<span class="sourceLineNo">1150</span>    if (proc == null) {<a name="line.1150"></a>
-<span class="sourceLineNo">1151</span>      return completed.get(procId) != null;<a name="line.1151"></a>
-<span class="sourceLineNo">1152</span>    }<a name="line.1152"></a>
-<span class="sourceLineNo">1153</span>    return proc.wasExecuted();<a name="line.1153"></a>
-<span class="sourceLineNo">1154</span>  }<a name="line.1154"></a>
-<span class="sourceLineNo">1155</span><a name="line.1155"></a>
-<span class="sourceLineNo">1156</span>  /**<a name="line.1156"></a>
-<span class="sourceLineNo">1157</span>   * Mark the specified completed procedure, as ready to remove.<a name="line.1157"></a>
-<span class="sourceLineNo">1158</span>   * @param procId the ID of the procedure to remove<a name="line.1158"></a>
-<span class="sourceLineNo">1159</span>   */<a name="line.1159"></a>
-<span class="sourceLineNo">1160</span>  public void removeResult(long procId) {<a name="line.1160"></a>
-<span class="sourceLineNo">1161</span>    CompletedProcedureRetainer&lt;TEnvironment&gt; retainer = completed.get(procId);<a name="line.1161"></a>
-<span class="sourceLineNo">1162</span>    if (retainer == null) {<a name="line.1162"></a>
-<span class="sourceLineNo">1163</span>      assert !procedures.containsKey(procId) : "pid=" + procId + " is still running";<a name="line.1163"></a>
-<span class="sourceLineNo">1164</span>      LOG.debug("pid={} already removed by the cleaner.", procId);<a name="line.1164"></a>
-<span class="sourceLineNo">1165</span>      return;<a name="line.1165"></a>
-<span class="sourceLineNo">1166</span>    }<a name="line.1166"></a>
-<span class="sourceLineNo">1167</span><a name="line.1167"></a>
-<span class="sourceLineNo">1168</span>    // The CompletedProcedureCleaner will take care of deletion, once the TTL is expired.<a name="line.1168"></a>
-<span class="sourceLineNo">1169</span>    retainer.setClientAckTime(EnvironmentEdgeManager.currentTime());<a name="line.1169"></a>
-<span class="sourceLineNo">1170</span>  }<a name="line.1170"></a>
-<span class="sourceLineNo">1171</span><a name="line.1171"></a>
-<span class="sourceLineNo">1172</span>  public Procedure&lt;TEnvironment&gt; getResultOrProcedure(long procId) {<a name="line.1172"></a>
-<span class="sourceLineNo">1173</span>    CompletedProcedureRetainer&lt;TEnvironment&gt; retainer = completed.get(procId);<a name="line.1173"></a>
-<span class="sourceLineNo">1174</span>    if (retainer == null) {<a name="line.1174"></a>
-<span class="sourceLineNo">1175</span>      return procedures.get(procId);<a name="line.1175"></a>
-<span class="sourceLineNo">1176</span>    } else {<a name="line.1176"></a>
-<span class="sourceLineNo">1177</span>      return retainer.getProcedure();<a name="line.1177"></a>
-<span class="sourceLineNo">1178</span>    }<a name="line.1178"></a>
-<span class="sourceLineNo">1179</span>  }<a name="line.1179"></a>
-<span class="sourceLineNo">1180</span><a name="line.1180"></a>
-<span class="sourceLineNo">1181</span>  /**<a name="line.1181"></a>
-<span class="sourceLineNo">1182</span>   * Check if the user is this procedure's owner<a name="line.1182"></a>
-<span class="sourceLineNo">1183</span>   * @param procId the target procedure<a name="line.1183"></a>
-<span class="sourceLineNo">1184</span>   * @param user the user<a name="line.1184"></a>
-<span class="sourceLineNo">1185</span>   * @return true if the user is the owner of the procedure,<a name="line.1185"></a>
-<span class="sourceLineNo">1186</span>   *   false otherwise or the owner is unknown.<a name="line.1186"></a>
-<span class="sourceLineNo">1187</span>   */<a name="line.1187"></a>
-<span class="sourceLineNo">1188</span>  public boolean isProcedureOwner(long procId, User user) {<a name="line.1188"></a>
-<span class="sourceLineNo">1189</span>    if (user == null) {<a name="line.1189"></a>
-<span class="sourceLineNo">1190</span>      return false;<a name="line.1190"></a>
-<span class="sourceLineNo">1191</span>    }<a name="line.1191"></a>
-<span class="sourceLineNo">1192</span>    final Procedure&lt;TEnvironment&gt; runningProc = procedures.get(procId);<a name="line.1192"></a>
-<span class="sourceLineNo">1193</span>    if (runningProc != null) {<a name="line.1193"></a>
-<span class="sourceLineNo">1194</span>      return runningProc.getOwner().equals(user.getShortName());<a name="line.1194"></a>
-<span class="sourceLineNo">1195</span>    }<a name="line.1195"></a>
-<span class="sourceLineNo">1196</span><a name="line.1196"></a>
-<span class="sourceLineNo">1197</span>    final CompletedProcedureRetainer&lt;TEnvironment&gt; retainer = completed.get(procId);<a name="line.1197"></a>
-<span class="sourceLineNo">1198</span>    if (retainer != null) {<a name="line.1198"></a>
-<span class="sourceLineNo">1199</span>      return retainer.getProcedure().getOwner().equals(user.getShortName());<a name="line.1199"></a>
-<span class="sourceLineNo">1200</span>    }<a name="line.1200"></a>
-<span class="sourceLineNo">1201</span><a name="line.1201"></a>
-<span class="sourceLineNo">1202</span>    // Procedure either does not exist or has already completed and got cleaned up.<a name="line.1202"></a>
-<span class="sourceLineNo">1203</span>    // At this time, we cannot check the owner of the procedure<a name="line.1203"></a>
-<span class="sourceLineNo">1204</span>    return false;<a name="line.1204"></a>
-<span class="sourceLineNo">1205</span>  }<a name="line.1205"></a>
-<span class="sourceLineNo">1206</span><a name="line.1206"></a>
-<span class="sourceLineNo">1207</span>  /**<a name="line.1207"></a>
-<span class="sourceLineNo">1208</span>   * Should only be used when starting up, where the procedure workers have not been started.<a name="line.1208"></a>
-<span class="sourceLineNo">1209</span>   * &lt;p/&gt;<a name="line.1209"></a>
-<span class="sourceLineNo">1210</span>   * If the procedure works has been started, the return values maybe changed when you are<a name="line.1210"></a>
-<span class="sourceLineNo">1211</span>   * processing it so usually this is not safe. Use {@link #getProcedures()} below for most cases as<a name="line.1211"></a>
-<span class="sourceLineNo">1212</span>   * it will do a copy, and also include the finished procedures.<a name="line.1212"></a>
-<span class="sourceLineNo">1213</span>   */<a name="line.1213"></a>
-<span class="sourceLineNo">1214</span>  public Collection&lt;Procedure&lt;TEnvironment&gt;&gt; getActiveProceduresNoCopy() {<a name="line.1214"></a>
-<span class="sourceLineNo">1215</span>    return procedures.values();<a name="line.1215"></a>
-<span class="sourceLineNo">1216</span>  }<a name="line.1216"></a>
-<span class="sourceLineNo">1217</span><a name="line.1217"></a>
-<span class="sourceLineNo">1218</span>  /**<a name="line.1218"></a>
-<span class="sourceLineNo">1219</span>   * Get procedures.<a name="line.1219"></a>
-<span class="sourceLineNo">1220</span>   * @return the procedures in a list<a name="line.1220"></a>
+<span class="sourceLineNo">1123</span>  public &lt;T extends Procedure&lt;TEnvironment&gt;&gt; T getProcedure(Class&lt;T&gt; clazz, long procId) {<a name="line.1123"></a>
+<span class="sourceLineNo">1124</span>    Procedure&lt;TEnvironment&gt; proc = getProcedure(procId);<a name="line.1124"></a>
+<span class="sourceLineNo">1125</span>    if (clazz.isInstance(proc)) {<a name="line.1125"></a>
+<span class="sourceLineNo">1126</span>      return clazz.cast(proc);<a name="line.1126"></a>
+<span class="sourceLineNo">1127</span>    }<a name="line.1127"></a>
+<span class="sourceLineNo">1128</span>    return null;<a name="line.1128"></a>
+<span class="sourceLineNo">1129</span>  }<a name="line.1129"></a>
+<span class="sourceLineNo">1130</span><a name="line.1130"></a>
+<span class="sourceLineNo">1131</span>  public Procedure&lt;TEnvironment&gt; getResult(long procId) {<a name="line.1131"></a>
+<span class="sourceLineNo">1132</span>    CompletedProcedureRetainer&lt;TEnvironment&gt; retainer = completed.get(procId);<a name="line.1132"></a>
+<span class="sourceLineNo">1133</span>    if (retainer == null) {<a name="line.1133"></a>
+<span class="sourceLineNo">1134</span>      return null;<a name="line.1134"></a>
+<span class="sourceLineNo">1135</span>    } else {<a name="line.1135"></a>
+<span class="sourceLineNo">1136</span>      return retainer.getProcedure();<a name="line.1136"></a>
+<span class="sourceLineNo">1137</span>    }<a name="line.1137"></a>
+<span class="sourceLineNo">1138</span>  }<a name="line.1138"></a>
+<span class="sourceLineNo">1139</span><a name="line.1139"></a>
+<span class="sourceLineNo">1140</span>  /**<a name="line.1140"></a>
+<span class="sourceLineNo">1141</span>   * Return true if the procedure is finished.<a name="line.1141"></a>
+<span class="sourceLineNo">1142</span>   * The state may be "completed successfully" or "failed and rolledback".<a name="line.1142"></a>
+<span class="sourceLineNo">1143</span>   * Use getResult() to check the state or get the result data.<a name="line.1143"></a>
+<span class="sourceLineNo">1144</span>   * @param procId the ID of the procedure to check<a name="line.1144"></a>
+<span class="sourceLineNo">1145</span>   * @return true if the procedure execution is finished, otherwise false.<a name="line.1145"></a>
+<span class="sourceLineNo">1146</span>   */<a name="line.1146"></a>
+<span class="sourceLineNo">1147</span>  public boolean isFinished(final long procId) {<a name="line.1147"></a>
+<span class="sourceLineNo">1148</span>    return !procedures.containsKey(procId);<a name="line.1148"></a>
+<span class="sourceLineNo">1149</span>  }<a name="line.1149"></a>
+<span class="sourceLineNo">1150</span><a name="line.1150"></a>
+<span class="sourceLineNo">1151</span>  /**<a name="line.1151"></a>
+<span class="sourceLineNo">1152</span>   * Return true if the procedure is started.<a name="line.1152"></a>
+<span class="sourceLineNo">1153</span>   * @param procId the ID of the procedure to check<a name="line.1153"></a>
+<span class="sourceLineNo">1154</span>   * @return true if the procedure execution is started, otherwise false.<a name="line.1154"></a>
+<span class="sourceLineNo">1155</span>   */<a name="line.1155"></a>
+<span class="sourceLineNo">1156</span>  public boolean isStarted(long procId) {<a name="line.1156"></a>
+<span class="sourceLineNo">1157</span>    Procedure&lt;?&gt; proc = procedures.get(procId);<a name="line.1157"></a>
+<span class="sourceLineNo">1158</span>    if (proc == null) {<a name="line.1158"></a>
+<span class="sourceLineNo">1159</span>      return completed.get(procId) != null;<a name="line.1159"></a>
+<span class="sourceLineNo">1160</span>    }<a name="line.1160"></a>
+<span class="sourceLineNo">1161</span>    return proc.wasExecuted();<a name="line.1161"></a>
+<span class="sourceLineNo">1162</span>  }<a name="line.1162"></a>
+<span class="sourceLineNo">1163</span><a name="line.1163"></a>
+<span class="sourceLineNo">1164</span>  /**<a name="line.1164"></a>
+<span class="sourceLineNo">1165</span>   * Mark the specified completed procedure, as ready to remove.<a name="line.1165"></a>
+<span class="sourceLineNo">1166</span>   * @param procId the ID of the procedure to remove<a name="line.1166"></a>
+<span class="sourceLineNo">1167</span>   */<a name="line.1167"></a>
+<span class="sourceLineNo">1168</span>  public void removeResult(long procId) {<a name="line.1168"></a>
+<span class="sourceLineNo">1169</span>    CompletedProcedureRetainer&lt;TEnvironment&gt; retainer = completed.get(procId);<a name="line.1169"></a>
+<span class="sourceLineNo">1170</span>    if (retainer == null) {<a name="line.1170"></a>
+<span class="sourceLineNo">1171</span>      assert !procedures.containsKey(procId) : "pid=" + procId + " is still running";<a name="line.1171"></a>
+<span class="sourceLineNo">1172</span>      LOG.debug("pid={} already removed by the cleaner.", procId);<a name="line.1172"></a>
+<span class="sourceLineNo">1173</span>      return;<a name="line.1173"></a>
+<span class="sourceLineNo">1174</span>    }<a name="line.1174"></a>
+<span class="sourceLineNo">1175</span><a name="line.1175"></a>
+<span class="sourceLineNo">1176</span>    // The CompletedProcedureCleaner will take care of deletion, once the TTL is expired.<a name="line.1176"></a>
+<span class="sourceLineNo">1177</span>    retainer.setClientAckTime(EnvironmentEdgeManager.currentTime());<a name="line.1177"></a>
+<span class="sourceLineNo">1178</span>  }<a name="line.1178"></a>
+<span class="sourceLineNo">1179</span><a name="line.1179"></a>
+<span class="sourceLineNo">1180</span>  public Procedure&lt;TEnvironment&gt; getResultOrProcedure(long procId) {<a name="line.1180"></a>
+<span class="sourceLineNo">1181</span>    CompletedProcedureRetainer&lt;TEnvironment&gt; retainer = completed.get(procId);<a name="line.1181"></a>
+<span class="sourceLineNo">1182</span>    if (retainer == null) {<a name="line.1182"></a>
+<span class="sourceLineNo">1183</span>      return procedures.get(procId);<a name="line.1183"></a>
+<span class="sourceLineNo">1184</span>    } else {<a name="line.1184"></a>
+<span class="sourceLineNo">1185</span>      return retainer.getProcedure();<a name="line.1185"></a>
+<span class="sourceLineNo">1186</span>    }<a name="line.1186"></a>
+<span class="sourceLineNo">1187</span>  }<a name="line.1187"></a>
+<span class="sourceLineNo">1188</span><a name="line.1188"></a>
+<span class="sourceLineNo">1189</span>  /**<a name="line.1189"></a>
+<span class="sourceLineNo">1190</span>   * Check if the user is this procedure's owner<a name="line.1190"></a>
+<span class="sourceLineNo">1191</span>   * @param procId the target procedure<a name="line.1191"></a>
+<span class="sourceLineNo">1192</span>   * @param user the user<a name="line.1192"></a>
+<span class="sourceLineNo">1193</span>   * @return true if the user is the owner of the procedure,<a name="line.1193"></a>
+<span class="sourceLineNo">1194</span>   *   false otherwise or the owner is unknown.<a name="line.1194"></a>
+<span class="sourceLineNo">1195</span>   */<a name="line.1195"></a>
+<span class="sourceLineNo">1196</span>  public boolean isProcedureOwner(long procId, User user) {<a name="line.1196"></a>
+<span class="sourceLineNo">1197</span>    if (user == null) {<a name="line.1197"></a>
+<span class="sourceLineNo">1198</span>      return false;<a name="line.1198"></a>
+<span class="sourceLineNo">1199</span>    }<a name="line.1199"></a>
+<span class="sourceLineNo">1200</span>    final Procedure&lt;TEnvironment&gt; runningProc = procedures.get(procId);<a name="line.1200"></a>
+<span class="sourceLineNo">1201</span>    if (runningProc != null) {<a name="line.1201"></a>
+<span class="sourceLineNo">1202</span>      return runningProc.getOwner().equals(user.getShortName());<a name="line.1202"></a>
+<span class="sourceLineNo">1203</span>    }<a name="line.1203"></a>
+<span class="sourceLineNo">1204</span><a name="line.1204"></a>
+<span class="sourceLineNo">1205</span>    final CompletedProcedureRetainer&lt;TEnvironment&gt; retainer = completed.get(procId);<a name="line.1205"></a>
+<span class="sourceLineNo">1206</span>    if (retainer != null) {<a name="line.1206"></a>
+<span class="sourceLineNo">1207</span>      return retainer.getProcedure().getOwner().equals(user.getShortName());<a name="line.1207"></a>
+<span class="sourceLineNo">1208</span>    }<a name="line.1208"></a>
+<span class="sourceLineNo">1209</span><a name="line.1209"></a>
+<span class="sourceLineNo">1210</span>    // Procedure either does not exist or has already completed and got cleaned up.<a name="line.1210"></a>
+<span class="sourceLineNo">1211</span>    // At this time, we cannot check the owner of the procedure<a name="line.1211"></a>
+<span class="sourceLineNo">1212</span>    return false;<a name="line.1212"></a>
+<span class="sourceLineNo">1213</span>  }<a name="line.1213"></a>
+<span class="sourceLineNo">1214</span><a name="line.1214"></a>
+<span class="sourceLineNo">1215</span>  /**<a name="line.1215"></a>
+<span class="sourceLineNo">1216</span>   * Should only be used when starting up, where the procedure workers have not been started.<a name="line.1216"></a>
+<span class="sourceLineNo">1217</span>   * &lt;p/&gt;<a name="line.1217"></a>
+<span class="sourceLineNo">1218</span>   * If the procedure works has been started, the return values maybe changed when you are<a name="line.1218"></a>
+<span class="sourceLineNo">1219</span>   * processing it so usually this is not safe. Use {@link #getProcedures()} below for most cases as<a name="line.1219"></a>
+<span class="sourceLineNo">1220</span>   * it will do a copy, and also include the finished procedures.<a name="line.1220"></a>
 <span class="sourceLineNo">1221</span>   */<a name="line.1221"></a>
-<span class="sourceLineNo">1222</span>  public List&lt;Procedure&lt;TEnvironment&gt;&gt; getProcedures() {<a name="line.1222"></a>
-<span class="sourceLineNo">1223</span>    List&lt;Procedure&lt;TEnvironment&gt;&gt; procedureList =<a name="line.1223"></a>
-<span class="sourceLineNo">1224</span>      new ArrayList&lt;&gt;(procedures.size() + completed.size());<a name="line.1224"></a>
-<span class="sourceLineNo">1225</span>    procedureList.addAll(procedures.values());<a name="line.1225"></a>
-<span class="sourceLineNo">1226</span>    // Note: The procedure could show up twice in the list with different state, as<a name="line.1226"></a>
-<span class="sourceLineNo">1227</span>    // it could complete after we walk through procedures list and insert into<a name="line.1227"></a>
-<span class="sourceLineNo">1228</span>    // procedureList - it is ok, as we will use the information in the Procedure<a name="line.1228"></a>
-<span class="sourceLineNo">1229</span>    // to figure it out; to prevent this would increase the complexity of the logic.<a name="line.1229"></a>
-<span class="sourceLineNo">1230</span>    completed.values().stream().map(CompletedProcedureRetainer::getProcedure)<a name="line.1230"></a>
-<span class="sourceLineNo">1231</span>      .forEach(procedureList::add);<a name="line.1231"></a>
-<span class="sourceLineNo">1232</span>    return procedureList;<a name="line.1232"></a>
-<span class="sourceLineNo">1233</span>  }<a name="line.1233"></a>
-<span class="sourceLineNo">1234</span><a name="line.1234"></a>
-<span class="sourceLineNo">1235</span>  // ==========================================================================<a name="line.1235"></a>
-<span class="sourceLineNo">1236</span>  //  Listeners helpers<a name="line.1236"></a>
-<span class="sourceLineNo">1237</span>  // ==========================================================================<a name="line.1237"></a>
-<span class="sourceLineNo">1238</span>  public void registerListener(ProcedureExecutorListener listener) {<a name="line.1238"></a>
-<span class="sourceLineNo">1239</span>    this.listeners.add(listener);<a name="line.1239"></a>
-<span class="sourceLineNo">1240</span>  }<a name="line.1240"></a>
-<span class="sourceLineNo">1241</span><a name="line.1241"></a>
-<span class="sourceLineNo">1242</span>  public boolean unregisterListener(ProcedureExecutorListener listener) {<a name="line.1242"></a>
-<span class="sourceLineNo">1243</span>    return this.listeners.remove(listener);<a name="line.1243"></a>
-<span class="sourceLineNo">1244</span>  }<a name="line.1244"></a>
-<span class="sourceLineNo">1245</span><a name="line.1245"></a>
-<span class="sourceLineNo">1246</span>  private void sendProcedureLoadedNotification(final long procId) {<a name="line.1246"></a>
-<span class="sourceLineNo">1247</span>    if (!this.listeners.isEmpty()) {<a name="line.1247"></a>
-<span class="sourceLineNo">1248</span>      for (ProcedureExecutorListener listener: this.listeners) {<a name="line.1248"></a>
-<span class="sourceLineNo">1249</span>        try {<a name="line.1249"></a>
-<span class="sourceLineNo">1250</span>          listener.procedureLoaded(procId);<a name="line.1250"></a>
-<span class="sourceLineNo">1251</span>        } catch (Throwable e) {<a name="line.1251"></a>
-<span class="sourceLineNo">1252</span>          LOG.error("Listener " + listener + " had an error: " + e.getMessage(), e);<a name="line.1252"></a>
-<span class="sourceLineNo">1253</span>        }<a name="line.1253"></a>
-<span class="sourceLineNo">1254</span>      }<a name="line.1254"></a>
-<span class="sourceLineNo">1255</span>    }<a name="line.1255"></a>
-<span class="sourceLineNo">1256</span>  }<a name="line.1256"></a>
-<span class="sourceLineNo">1257</span><a name="line.1257"></a>
-<span class="sourceLineNo">1258</span>  private void sendProcedureAddedNotification(final long procId) {<a name="line.1258"></a>
-<span class="sourceLineNo">1259</span>    if (!this.listeners.isEmpty()) {<a name="line.1259"></a>
-<span class="sourceLineNo">1260</span>      for (ProcedureExecutorListener listener: this.listeners) {<a name="line.1260"></a>
-<span class="sourceLineNo">1261</span>        try {<a name="line.1261"></a>
-<span class="sourceLineNo">1262</span>          listener.procedureAdded(procId);<a name="line.1262"></a>
-<span class="sourceLineNo">1263</span>        } catch (Throwable e) {<a name="line.1263"></a>
-<span class="sourceLineNo">1264</span>          LOG.error("Listener " + listener + " had an error: " + e.getMessage(), e);<a name="line.1264"></a>
-<span class="sourceLineNo">1265</span>        }<a name="line.1265"></a>
-<span class="sourceLineNo">1266</span>      }<a name="line.1266"></a>
-<span class="sourceLineNo">1267</span>    }<a name="line.1267"></a>
-<span class="sourceLineNo">1268</span>  }<a name="line.1268"></a>
-<span class="sourceLineNo">1269</span><a name="line.1269"></a>
-<span class="sourceLineNo">1270</span>  private void sendProcedureFinishedNotification(final long procId) {<a name="line.1270"></a>
-<span class="sourceLineNo">1271</span>    if (!this.listeners.isEmpty()) {<a name="line.1271"></a>
-<span class="sourceLineNo">1272</span>      for (ProcedureExecutorListener listener: this.listeners) {<a name="line.1272"></a>
-<span class="sourceLineNo">1273</span>        try {<a name="line.1273"></a>
-<span class="sourceLineNo">1274</span>          listener.procedureFinished(procId);<a name="line.1274"></a>
-<span class="sourceLineNo">1275</span>        } catch (Throwable e) {<a name="line.1275"></a>
-<span class="sourceLineNo">1276</span>          LOG.error("Listener " + listener + " had an error: " + e.getMessage(), e);<a name="line.1276"></a>
-<span class="sourceLineNo">1277</span>        }<a name="line.1277"></a>
-<span class="sourceLineNo">1278</span>      }<a name="line.1278"></a>
-<span class="sourceLineNo">1279</span>    }<a name="line.1279"></a>
-<span class="sourceLineNo">1280</span>  }<a name="line.1280"></a>
-<span class="sourceLineNo">1281</span><a name="line.1281"></a>
-<span class="sourceLineNo">1282</span>  // ==========================================================================<a name="line.1282"></a>
-<span class="sourceLineNo">1283</span>  //  Procedure IDs helpers<a name="line.1283"></a>
-<span class="sourceLineNo">1284</span>  // ==========================================================================<a name="line.1284"></a>
-<span class="sourceLineNo">1285</span>  private long nextProcId() {<a name="line.1285"></a>
-<span class="sourceLineNo">1286</span>    long procId = lastProcId.incrementAndGet();<a name="line.1286"></a>
-<span class="sourceLineNo">1287</span>    if (procId &lt; 0) {<a name="line.1287"></a>
-<span class="sourceLineNo">1288</span>      while (!lastProcId.compareAndSet(procId, 0)) {<a name="line.1288"></a>
-<span class="sourceLineNo">1289</span>        procId = lastProcId.get();<a name="line.1289"></a>
-<span class="sourceLineNo">1290</span>        if (procId &gt;= 0)<a name="line.1290"></a>
-<span class="sourceLineNo">1291</span>          break;<a name="line.1291"></a>
-<span class="sourceLineNo">1292</span>      }<a name="line.1292"></a>
-<span class="sourceLineNo">1293</span>      while (procedures.containsKey(procId)) {<a name="line.1293"></a>
-<span class="sourceLineNo">1294</span>        procId = lastProcId.incrementAndGet();<a name="line.1294"></a>
-<span class="sourceLineNo">1295</span>      }<a name="line.1295"></a>
-<span class="sourceLineNo">1296</span>    }<a name="line.1296"></a>
-<span class="sourceLineNo">1297</span>    assert procId &gt;= 0 : "Invalid procId " + procId;<a name="line.1297"></a>
-<span class="sourceLineNo">1298</span>    return procId;<a name="line.1298"></a>
-<span class="sourceLineNo">1299</span>  }<a name="line.1299"></a>
-<span class="sourceLineNo">1300</span><a name="line.1300"></a>
-<span class="sourceLineNo">1301</span>  @VisibleForTesting<a name="line.1301"></a>
-<span class="sourceLineNo">1302</span>  protected long getLastProcId() {<a name="line.1302"></a>
-<span class="sourceLineNo">1303</span>    return lastProcId.get();<a name="line.1303"></a>
-<span class="sourceLineNo">1304</span>  }<a name="line.1304"></a>
-<span class="sourceLineNo">1305</span><a name="line.1305"></a>
-<span class="sourceLineNo">1306</span>  @VisibleForTesting<a name="line.1306"></a>
-<span class="sourceLineNo">1307</span>  public Set&lt;Long&gt; getActiveProcIds() {<a name="line.1307"></a>
-<span class="sourceLineNo">1308</span>    return procedures.keySet();<a name="line.1308"></a>
-<span class="sourceLineNo">1309</span>  }<a name="line.1309"></a>
-<span class="sourceLineNo">1310</span><a name="line.1310"></a>
-<span class="sourceLineNo">1311</span>  Long getRootProcedureId(Procedure&lt;TEnvironment&gt; proc) {<a name="line.1311"></a>
-<span class="sourceLineNo">1312</span>    return Procedure.getRootProcedureId(procedures, proc);<a name="line.1312"></a>
-<span class="sourceLineNo">1313</span>  }<a name="line.1313"></a>
-<span class="sourceLineNo">1314</span><a name="line.1314"></a>
-<span class="sourceLineNo">1315</span>  // ==========================================================================<a name="line.1315"></a>
-<span class="sourceLineNo">1316</span>  //  Executions<a name="line.1316"></a>
-<span class="sourceLineNo">1317</span>  // ==========================================================================<a name="line.1317"></a>
-<span class="sourceLineNo">1318</span>  private void executeProcedure(Procedure&lt;TEnvironment&gt; proc) {<a name="line.1318"></a>
-<span class="sourceLineNo">1319</span>    if (proc.isFinished()) {<a name="line.1319"></a>
-<span class="sourceLineNo">1320</span>      LOG.debug("{} is already finished, skipping execution", proc);<a name="line.1320"></a>
-<span class="sourceLineNo">1321</span>      return;<a name="line.1321"></a>
-<span class="sourceLineNo">1322</span>    }<a name="line.1322"></a>
-<span class="sourceLineNo">1323</span>    final Long rootProcId = getRootProcedureId(proc);<a name="line.1323"></a>
-<span class="sourceLineNo">1324</span>    if (rootProcId == null) {<a name="line.1324"></a>
-<span class="sourceLineNo">1325</span>      // The 'proc' was ready to run but the root procedure was rolledback<a name="line.1325"></a>
-<span class="sourceLineNo">1326</span>      LOG.warn("Rollback because parent is done/rolledback proc=" + proc);<a name="line.1326"></a>
-<span class="sourceLineNo">1327</span>      executeRollback(proc);<a name="line.1327"></a>
-<span class="sourceLineNo">1328</span>      return;<a name="line.1328"></a>
-<span class="sourceLineNo">1329</span>    }<a name="line.1329"></a>
-<span class="sourceLineNo">1330</span><a name="line.1330"></a>
-<span class="sourceLineNo">1331</span>    RootProcedureState&lt;TEnvironment&gt; procStack = rollbackStack.get(rootProcId);<a name="line.1331"></a>
-<span class="sourceLineNo">1332</span>    if (procStack == null) {<a name="line.1332"></a>
-<span class="sourceLineNo">1333</span>      LOG.warn("RootProcedureState is null for " + proc.getProcId());<a name="line.1333"></a>
-<span class="sourceLineNo">1334</span>      return;<a name="line.1334"></a>
-<span class="sourceLineNo">1335</span>    }<a name="line.1335"></a>
-<span class="sourceLineNo">1336</span>    do {<a name="line.1336"></a>
-<span class="sourceLineNo">1337</span>      // Try to acquire the execution<a name="line.1337"></a>
-<span class="sourceLineNo">1338</span>      if (!procStack.acquire(proc)) {<a name="line.1338"></a>
-<span class="sourceLineNo">1339</span>        if (procStack.setRollback()) {<a name="line.1339"></a>
-<span class="sourceLineNo">1340</span>          // we have the 'rollback-lock' we can start rollingback<a name="line.1340"></a>
-<span class="sourceLineNo">1341</span>          switch (executeRollback(rootProcId, procStack)) {<a name="line.1341"></a>
-<span class="sourceLineNo">1342</span>            case LOCK_ACQUIRED:<a name="line.1342"></a>
-<span class="sourceLineNo">1343</span>              break;<a name="line.1343"></a>
-<span class="sourceLineNo">1344</span>            case LOCK_YIELD_WAIT:<a name="line.1344"></a>
-<span class="sourceLineNo">1345</span>              procStack.unsetRollback();<a name="line.1345"></a>
-<span class="sourceLineNo">1346</span>              scheduler.yield(proc);<a name="line.1346"></a>
-<span class="sourceLineNo">1347</span>              break;<a name="line.1347"></a>
-<span class="sourceLineNo">1348</span>            case LOCK_EVENT_WAIT:<a name="line.1348"></a>
-<span class="sourceLineNo">1349</span>              LOG.info("LOCK_EVENT_WAIT rollback..." + proc);<a name="line.1349"></a>
-<span class="sourceLineNo">1350</span>              procStack.unsetRollback();<a name="line.1350"></a>
+<span class="sourceLineNo">1222</span>  public Collection&lt;Procedure&lt;TEnvironment&gt;&gt; getActiveProceduresNoCopy() {<a name="line.1222"></a>
+<span class="sourceLineNo">1223</span>    return procedures.values();<a name="line.1223"></a>
+<span class="sourceLineNo">1224</span>  }<a name="line.1224"></a>
+<span class="sourceLineNo">1225</span><a name="line.1225"></a>
+<span class="sourceLineNo">1226</span>  /**<a name="line.1226"></a>
+<span class="sourceLineNo">1227</span>   * Get procedures.<a name="line.1227"></a>
+<span class="sourceLineNo">1228</span>   * @return the procedures in a list<a name="line.1228"></a>
+<span class="sourceLineNo">1229</span>   */<a name="line.1229"></a>
+<span class="sourceLineNo">1230</span>  public List&lt;Procedure&lt;TEnvironment&gt;&gt; getProcedures() {<a name="line.1230"></a>
+<span class="sourceLineNo">1231</span>    List&lt;Procedure&lt;TEnvironment&gt;&gt; procedureList =<a name="line.1231"></a>
+<span class="sourceLineNo">1232</span>      new ArrayList&lt;&gt;(procedures.size() + completed.size());<a name="line.1232"></a>
+<span class="sourceLineNo">1233</span>    procedureList.addAll(procedures.values());<a name="line.1233"></a>
+<span class="sourceLineNo">1234</span>    // Note: The procedure could show up twice in the list with different state, as<a name="line.1234"></a>
+<span class="sourceLineNo">1235</span>    // it could complete after we walk through procedures list and insert into<a name="line.1235"></a>
+<span class="sourceLineNo">1236</span>    // procedureList - it is ok, as we will use the information in the Procedure<a name="line.1236"></a>
+<span class="sourceLineNo">1237</span>    // to figure it out; to prevent this would increase the complexity of the logic.<a name="line.1237"></a>
+<span class="sourceLineNo">1238</span>    completed.values().stream().map(CompletedProcedureRetainer::getProcedure)<a name="line.1238"></a>
+<span class="sourceLineNo">1239</span>      .forEach(procedureList::add);<a name="line.1239"></a>
+<span class="sourceLineNo">1240</span>    return procedureList;<a name="line.1240"></a>
+<span class="sourceLineNo">1241</span>  }<a name="line.1241"></a>
+<span class="sourceLineNo">1242</span><a name="line.1242"></a>
+<span class="sourceLineNo">1243</span>  // ==========================================================================<a name="line.1243"></a>
+<span class="sourceLineNo">1244</span>  //  Listeners helpers<a name="line.1244"></a>
+<span class="sourceLineNo">1245</span>  // ==========================================================================<a name="line.1245"></a>
+<span class="sourceLineNo">1246</span>  public void registerListener(ProcedureExecutorListener listener) {<a name="line.1246"></a>
+<span class="sourceLineNo">1247</span>    this.listeners.add(listener);<a name="line.1247"></a>
+<span class="sourceLineNo">1248</span>  }<a name="line.1248"></a>
+<span class="sourceLineNo">1249</span><a name="line.1249"></a>
+<span class="sourceLineNo">1250</span>  public boolean unregisterListener(ProcedureExecutorListener listener) {<a name="line.1250"></a>
+<span class="sourceLineNo">1251</span>    return this.listeners.remove(listener);<a name="line.1251"></a>
+<span class="sourceLineNo">1252</span>  }<a name="line.1252"></a>
+<span class="sourceLineNo">1253</span><a name="line.1253"></a>
+<span class="sourceLineNo">1254</span>  private void sendProcedureLoadedNotification(final long procId) {<a name="line.1254"></a>
+<span class="sourceLineNo">1255</span>    if (!this.listeners.isEmpty()) {<a name="line.1255"></a>
+<span class="sourceLineNo">1256</span>      for (ProcedureExecutorListener listener: this.listeners) {<a name="line.1256"></a>
+<span class="sourceLineNo">1257</span>        try {<a name="line.1257"></a>
+<span class="sourceLineNo">1258</span>          listener.procedureLoaded(procId);<a name="line.1258"></a>
+<span class="sourceLineNo">1259</span>        } catch (Throwable e) {<a name="line.1259"></a>
+<span class="sourceLineNo">1260</span>          LOG.error("Listener " + listener + " had an error: " + e.getMessage(), e);<a name="line.1260"></a>
+<span class="sourceLineNo">1261</span>        }<a name="line.1261"></a>
+<span class="sourceLineNo">1262</span>      }<a name="line.1262"></a>
+<span class="sourceLineNo">1263</span>    }<a name="line.1263"></a>
+<span class="sourceLineNo">1264</span>  }<a name="line.1264"></a>
+<span class="sourceLineNo">1265</span><a name="line.1265"></a>
+<span class="sourceLineNo">1266</span>  private void sendProcedureAddedNotification(final long procId) {<a name="line.1266"></a>
+<span class="sourceLineNo">1267</span>    if (!this.listeners.isEmpty()) {<a name="line.1267"></a>
+<span class="sourceLineNo">1268</span>      for (ProcedureExecutorListener listener: this.listeners) {<a name="line.1268"></a>
+<span class="sourceLineNo">1269</span>        try {<a name="line.1269"></a>
+<span class="sourceLineNo">1270</span>          listener.procedureAdded(procId);<a name="line.1270"></a>
+<span class="sourceLineNo">1271</span>        } catch (Throwable e) {<a name="line.1271"></a>
+<span class="sourceLineNo">1272</span>          LOG.error("Listener " + listener + " had an error: " + e.getMessage(), e);<a name="line.1272"></a>
+<span class="sourceLineNo">1273</span>        }<a name="line.1273"></a>
+<span class="sourceLineNo">1274</span>      }<a name="line.1274"></a>
+<span class="sourceLineNo">1275</span>    }<a name="line.1275"></a>
+<span class="sourceLineNo">1276</span>  }<a name="line.1276"></a>
+<span class="sourceLineNo">1277</span><a name="line.1277"></a>
+<span class="sourceLineNo">1278</span>  private void sendProcedureFinishedNotification(final long procId) {<a name="line.1278"></a>
+<span class="sourceLineNo">1279</span>    if (!this.listeners.isEmpty()) {<a name="line.1279"></a>
+<span class="sourceLineNo">1280</span>      for (ProcedureExecutorListener listener: this.listeners) {<a name="line.1280"></a>
+<span class="sourceLineNo">1281</span>        try {<a name="line.1281"></a>
+<span class="sourceLineNo">1282</span>          listener.procedureFinished(procId);<a name="line.1282"></a>
+<span class="sourceLineNo">1283</span>        } catch (Throwable e) {<a name="line.1283"></a>
+<span class="sourceLineNo">1284</span>          LOG.error("Listener " + listener + " had an error: " + e.getMessage(), e);<a name="line.1284"></a>
+<span class="sourceLineNo">1285</span>        }<a name="line.1285"></a>
+<span class="sourceLineNo">1286</span>      }<a name="line.1286"></a>
+<span class="sourceLineNo">1287</span>    }<a name="line.1287"></a>
+<span class="sourceLineNo">1288</span>  }<a name="line.1288"></a>
+<span class="sourceLineNo">1289</span><a name="line.1289"></a>
+<span class="sourceLineNo">1290</span>  // ==========================================================================<a name="line.1290"></a>
+<span class="sourceLineNo">1291</span>  //  Procedure IDs helpers<a name="line.1291"></a>
+<span class="sourceLineNo">1292</span>  // ==========================================================================<a name="line.1292"></a>
+<span class="sourceLineNo">1293</span>  private long nextProcId() {<a name="line.1293"></a>
+<span class="sourceLineNo">1294</span>    long procId = lastProcId.incrementAndGet();<a name="line.1294"></a>
+<span class="sourceLineNo">1295</span>    if (procId &lt; 0) {<a name="line.1295"></a>
+<span class="sourceLineNo">1296</span>      while (!lastProcId.compareAndSet(procId, 0)) {<a name="line.1296"></a>
+<span class="sourceLineNo">1297</span>        procId = lastProcId.get();<a name="line.1297"></a>
+<span class="sourceLineNo">1298</span>        if (procId &gt;= 0)<a name="line.1298"></a>
+<span class="sourceLineNo">1299</span>          break;<a name="line.1299"></a>
+<span class="sourceLineNo">1300</span>      }<a name="line.1300"></a>
+<span class="sourceLineNo">1301</span>      while (procedures.containsKey(procId)) {<a name="line.1301"></a>
+<span class="sourceLineNo">1302</span>        procId = lastProcId.incrementAndGet();<a name="line.1302"></a>
+<span class="sourceLineNo">1303</span>      }<a name="line.1303"></a>
+<span class="sourceLineNo">1304</span>    }<a name="line.1304"></a>
+<span class="sourceLineNo">1305</span>    assert procId &gt;= 0 : "Invalid procId " + procId;<a name="line.1305"></a>
+<span class="sourceLineNo">1306</span>    return procId;<a name="line.1306"></a>
+<span class="sourceLineNo">1307</span>  }<a name="line.1307"></a>
+<span class="sourceLineNo">1308</span><a name="line.1308"></a>
+<span class="sourceLineNo">1309</span>  @VisibleForTesting<a name="line.1309"></a>
+<span class="sourceLineNo">1310</span>  protected long getLastProcId() {<a name="line.1310"></a>
+<span class="sourceLineNo">1311</span>    return lastProcId.get();<a name="line.1311"></a>
+<span class="sourceLineNo">1312</span>  }<a name="line.1312"></a>
+<span class="sourceLineNo">1313</span><a name="line.1313"></a>
+<span class="sourceLineNo">1314</span>  @VisibleForTesting<a name="line.1314"></a>
+<span class="sourceLineNo">1315</span>  public Set&lt;Long&gt; getActiveProcIds() {<a name="line.1315"></a>
+<span class="sourceLineNo">1316</span>    return procedures.keySet();<a name="line.1316"></a>
+<span class="sourceLineNo">1317</span>  }<a name="line.1317"></a>
+<span class="sourceLineNo">1318</span><a name="line.1318"></a>
+<span class="sourceLineNo">1319</span>  Long getRootProcedureId(Procedure&lt;TEnvironment&gt; proc) {<a name="line.1319"></a>
+<span class="sourceLineNo">1320</span>    return Procedure.getRootProcedureId(procedures, proc);<a name="line.1320"></a>
+<span class="sourceLineNo">1321</span>  }<a name="line.1321"></a>
+<span class="sourceLineNo">1322</span><a name="line.1322"></a>
+<span class="sourceLineNo">1323</span>  // ==========================================================================<a name="line.1323"></a>
+<span class="sourceLineNo">1324</span>  //  Executions<a name="line.1324"></a>
+<span class="sourceLineNo">1325</span>  // ==========================================================================<a name="line.1325"></a>
+<span class="sourceLineNo">1326</span>  private void executeProcedure(Procedure&lt;TEnvironment&gt; proc) {<a name="line.1326"></a>
+<span class="sourceLineNo">1327</span>    if (proc.isFinished()) {<a name="line.1327"></a>
+<span class="sourceLineNo">1328</span>      LOG.debug("{} is already finished, skipping execution", proc);<a name="line.1328"></a>
+<span class="sourceLineNo">1329</span>      return;<a name="line.1329"></a>
+<span class="sourceLineNo">1330</span>    }<a name="line.1330"></a>
+<span class="sourceLineNo">1331</span>    final Long rootProcId = getRootProcedureId(proc);<a name="line.1331"></a>
+<span class="sourceLineNo">1332</span>    if (rootProcId == null) {<a name="line.1332"></a>
+<span class="sourceLineNo">1333</span>      // The 'proc' was ready to run but the root procedure was rolledback<a name="line.1333"></a>
+<span class="sourceLineNo">1334</span>      LOG.warn("Rollback because parent is done/rolledback proc=" + proc);<a name="line.1334"></a>
+<span class="sourceLineNo">1335</span>      executeRollback(proc);<a name="line.1335"></a>
+<span class="sourceLineNo">1336</span>      return;<a name="line.1336"></a>
+<span class="sourceLineNo">1337</span>    }<a name="line.1337"></a>
+<span class="sourceLineNo">1338</span><a name="line.1338"></a>
+<span class="sourceLineNo">1339</span>    RootProcedureState&lt;TEnvironment&gt; procStack = rollbackStack.get(rootProcId);<a name="line.1339"></a>
+<span class="sourceLineNo">1340</span>    if (procStack == null) {<a name="line.1340"></a>
+<span class="sourceLineNo">1341</span>      LOG.warn("RootProcedureState is null for " + proc.getProcId());<a name="line.1341"></a>
+<span class="sourceLineNo">1342</span>      return;<a name="line.1342"></a>
+<span class="sourceLineNo">1343</span>    }<a name="line.1343"></a>
+<span class="sourceLineNo">1344</span>    do {<a name="line.1344"></a>
+<span class="sourceLineNo">1345</span>      // Try to acquire the execution<a name="line.1345"></a>
+<span class="sourceLineNo">1346</span>      if (!procStack.acquire(proc)) {<a name="line.1346"></a>
+<span class="sourceLineNo">1347</span>        if (procStack.setRollback()) {<a name="line.1347"></a>
+<span class="sourceLineNo">1348</span>          // we have the 'rollback-lock' we can start rollingback<a name="line.1348"></a>
+<span class="sourceLineNo">1349</span>          switch (executeRollback(rootProcId, procStack)) {<a name="line.1349"></a>
+<span class="sourceLineNo">1350</span>            case LOCK_ACQUIRED:<a name="line.1350"></a>
 <span class="sourceLineNo">1351</span>              break;<a name="line.1351"></a>
-<span class="sourceLineNo">1352</span>            default:<a name="line.1352"></a>
-<span class="sourceLineNo">1353</span>              throw new UnsupportedOperationException();<a name="line.1353"></a>
-<span class="sourceLineNo">1354</span>          }<a name="line.1354"></a>
-<span class="sourceLineNo">1355</span>        } else {<a name="line.1355"></a>
-<span class="sourceLineNo">1356</span>          // if we can't rollback means that some child is still running.<a name="line.1356"></a>
-<span class="sourceLineNo">1357</span>          // the rollback will be executed after all the children are done.<a name="line.1357"></a>
-<span class="sourceLineNo">1358</span>          // If the procedure was never executed, remove and mark it as rolledback.<a name="line.1358"></a>
-<span class="sourceLineNo">1359</span>          if (!proc.wasExecuted()) {<a name="line.1359"></a>
-<span class="sourceLineNo">1360</span>            switch (executeRollback(proc)) {<a name="line.1360"></a>
-<span class="sourceLineNo">1361</span>              case LOCK_ACQUIRED:<a name="line.1361"></a>
-<span class="sourceLineNo">1362</span>                break;<a name="line.1362"></a>
-<span class="sourceLineNo">1363</span>              case LOCK_YIELD_WAIT:<a name="line.1363"></a>
-<span class="sourceLineNo">1364</span>                scheduler.yield(proc);<a name="line.1364"></a>
-<span class="sourceLineNo">1365</span>                break;<a name="line.1365"></a>
-<span class="sourceLineNo">1366</span>              case LOCK_EVENT_WAIT:<a name="line.1366"></a>
-<span class="sourceLineNo">1367</span>                LOG.info("LOCK_EVENT_WAIT can't rollback child running?..." + proc);<a name="line.1367"></a>
-<span class="sourceLineNo">1368</span>                break;<a name="line.1368"></a>
-<span class="sourceLineNo">1369</span>              default:<a name="line.1369"></a>
-<span class="sourceLineNo">1370</span>                throw new UnsupportedOperationException();<a name="line.1370"></a>
-<span class="sourceLineNo">1371</span>            }<a name="line.1371"></a>
-<span class="sourceLineNo">1372</span>          }<a name="line.1372"></a>
-<span class="sourceLineNo">1373</span>        }<a name="line.1373"></a>
-<span class="sourceLineNo">1374</span>        break;<a name="line.1374"></a>
-<span class="sourceLineNo">1375</span>      }<a name="line.1375"></a>
-<span class="sourceLineNo">1376</span><a name="line.1376"></a>
-<span class="sourceLineNo">1377</span>      // Execute the procedure<a name="line.1377"></a>
-<span class="sourceLineNo">1378</span>      assert proc.getState() == ProcedureState.RUNNABLE : proc;<a name="line.1378"></a>
-<span class="sourceLineNo">1379</span>      // Note that lock is NOT about concurrency but rather about ensuring<a name="line.1379"></a>
-<span class="sourceLineNo">1380</span>      // ownership of a procedure of an entity such as a region or table<a name="line.1380"></a>
-<span class="sourceLineNo">1381</span>      LockState lockState = acquireLock(proc);<a name="line.1381"></a>
-<span class="sourceLineNo">1382</span>      switch (lockState) {<a name="line.1382"></a>
-<span class="sourceLineNo">1383</span>        case LOCK_ACQUIRED:<a name="line.1383"></a>
-<span class="sourceLineNo">1384</span>          execProcedure(procStack, proc);<a name="line.1384"></a>
-<span class="sourceLineNo">1385</span>          break;<a name="line.1385"></a>
-<span class="sourceLineNo">1386</span>        case LOCK_YIELD_WAIT:<a name="line.1386"></a>
-<span class="sourceLineNo">1387</span>          LOG.info(lockState + " " + proc);<a name="line.1387"></a>
-<span class="sourceLineNo">1388</span>          scheduler.yield(proc);<a name="line.1388"></a>
-<span class="sourceLineNo">1389</span>          break;<a name="line.1389"></a>
-<span class="sourceLineNo">1390</span>        case LOCK_EVENT_WAIT:<a name="line.1390"></a>
-<span class="sourceLineNo">1391</span>          // Someone will wake us up when the lock is available<a name="line.1391"></a>
-<span class="sourceLineNo">1392</span>          LOG.debug(lockState + " " + proc);<a name="line.1392"></a>
+<span class="sourceLineNo">1352</span>            case LOCK_YIELD_WAIT:<a name="line.1352"></a>
+<span class="sourceLineNo">1353</span>              procStack.unsetRollback();<a name="line.1353"></a>
+<span class="sourceLineNo">1354</span>              scheduler.yield(proc);<a name="line.1354"></a>
+<span class="sourceLineNo">1355</span>              break;<a name="line.1355"></a>
+<span class="sourceLineNo">1356</span>            case LOCK_EVENT_WAIT:<a name="line.1356"></a>
+<span class="sourceLineNo">1357</span>              LOG.info("LOCK_EVENT_WAIT rollback..." + proc);<a name="line.1357"></a>
+<span class="sourceLineNo">1358</span>              procStack.unsetRollback();<a name="line.1358"></a>
+<span class="sourceLineNo">1359</span>              break;<a name="line.1359"></a>
+<span class="sourceLineNo">1360</span>            default:<a name="line.1360"></a>
+<span class="sourceLineNo">1361</span>              throw new UnsupportedOperationException();<a name="line.1361"></a>
+<span class="sourceLineNo">1362</span>          }<a name="line.1362"></a>
+<span class="sourceLineNo">1363</span>        } else {<a name="line.1363"></a>
+<span class="sourceLineNo">1364</span>          // if we can't rollback means that some child is still running.<a name="line.1364"></a>
+<span class="sourceLineNo">1365</span>          // the rollback will be executed after all the children are done.<a name="line.1365"></a>
+<span class="sourceLineNo">1366</span>          // If the procedure was never executed, remove and mark it as rolledback.<a name="line.1366"></a>
+<span class="sourceLineNo">1367</span>          if (!proc.wasExecuted()) {<a name="line.1367"></a>
+<span class="sourceLineNo">1368</span>            switch (executeRollback(proc)) {<a name="line.1368"></a>
+<span class="sourceLineNo">1369</span>              case LOCK_ACQUIRED:<a name="line.1369"></a>
+<span class="sourceLineNo">1370</span>                break;<a name="line.1370"></a>
+<span class="sourceLineNo">1371</span>              case LOCK_YIELD_WAIT:<a name="line.1371"></a>
+<span class="sourceLineNo">1372</span>                scheduler.yield(proc);<a name="line.1372"></a>
+<span class="sourceLineNo">1373</span>                break;<a name="line.1373"></a>
+<span class="sourceLineNo">1374</span>              case LOCK_EVENT_WAIT:<a name="line.1374"></a>
+<span class="sourceLineNo">1375</span>                LOG.info("LOCK_EVENT_WAIT can't rollback child running?..." + proc);<a name="line.1375"></a>
+<span class="sourceLineNo">1376</span>                break;<a name="line.1376"></a>
+<span class="sourceLineNo">1377</span>              default:<a name="line.1377"></a>
+<span class="sourceLineNo">1378</span>                throw new UnsupportedOperationException();<a name="line.1378"></a>
+<span class="sourceLineNo">1379</span>            }<a name="line.1379"></a>
+<span class="sourceLineNo">1380</span>          }<a name="line.1380"></a>
+<span class="sourceLineNo">1381</span>        }<a name="line.1381"></a>
+<span class="sourceLineNo">1382</span>        break;<a name="line.1382"></a>
+<span class="sourceLineNo">1383</span>      }<a name="line.1383"></a>
+<span class="sourceLineNo">1384</span><a name="line.1384"></a>
+<span class="sourceLineNo">1385</span>      // Execute the procedure<a name="line.1385"></a>
+<span class="sourceLineNo">1386</span>      assert proc.getState() == ProcedureState.RUNNABLE : proc;<a name="line.1386"></a>
+<span class="sourceLineNo">1387</span>      // Note that lock is NOT about concurrency but rather about ensuring<a name="line.1387"></a>
+<span class="sourceLineNo">1388</span>      // ownership of a procedure of an entity such as a region or table<a name="line.1388"></a>
+<span class="sourceLineNo">1389</span>      LockState lockState = acquireLock(proc);<a name="line.1389"></a>
+<span class="sourceLineNo">1390</span>      switch (lockState) {<a name="line.1390"></a>
+<span class="sourceLineNo">1391</span>        case LOCK_ACQUIRED:<a name="line.1391"></a>
+<span class="sourceLineNo">1392</span>          execProcedure(procStack, proc);<a name="line.1392"></a>
 <span class="sourceLineNo">1393</span>          break;<a name="line.1393"></a>
-<span class="sourceLineNo">1394</span>        default:<a name="line.1394"></a>
-<span class="sourceLineNo">1395</span>          throw new UnsupportedOperationException();<a name="line.1395"></a>
-<span class="sourceLineNo">1396</span>      }<a name="line.1396"></a>
-<span class="sourceLineNo">1397</span>      procStack.release(proc);<a name="line.1397"></a>
-<span class="sourceLineNo">1398</span><a name="line.1398"></a>
-<span class="sourceLineNo">1399</span>      if (proc.isSuccess()) {<a name="line.1399"></a>
-<span class="sourceLineNo">1400</span>        // update metrics on finishing the procedure<a name="line.1400"></a>
-<span class="sourceLineNo">1401</span>        proc.updateMetricsOnFinish(getEnvironment(), proc.elapsedTime(), true);<a name="line.1401"></a>
-<span class="sourceLineNo">1402</span>        LOG.info("Finished " + proc + " in " + StringUtils.humanTimeDiff(proc.elapsedTime()));<a name="line.1402"></a>
-<span class="sourceLineNo">1403</span>        // Finalize the procedure state<a name="line.1403"></a>
-<span class="sourceLineNo">1404</span>        if (proc.getProcId() == rootProcId) {<a name="line.1404"></a>
-<span class="sourceLineNo">1405</span>          procedureFinished(proc);<a name="line.1405"></a>
-<span class="sourceLineNo">1406</span>        } else {<a name="line.1406"></a>
-<span class="sourceLineNo">1407</span>          execCompletionCleanup(proc);<a name="line.1407"></a>
-<span class="sourceLineNo">1408</span>        }<a name="line.1408"></a>
-<span class="sourceLineNo">1409</span>        break;<a name="line.1409"></a>
-<span class="sourceLineNo">1410</span>      }<a name="line.1410"></a>
-<span class="sourceLineNo">1411</span>    } while (procStack.isFailed());<a name="line.1411"></a>
-<span class="sourceLineNo">1412</span>  }<a name="line.1412"></a>
-<span class="sourceLineNo">1413</span><a name="line.1413"></a>
-<span class="sourceLineNo">1414</span>  private LockState acquireLock(Procedure&lt;TEnvironment&gt; proc) {<a name="line.1414"></a>
-<span class="sourceLineNo">1415</span>    TEnvironment env = getEnvironment();<a name="line.1415"></a>
-<span class="sourceLineNo">1416</span>    // if holdLock is true, then maybe we already have the lock, so just return LOCK_ACQUIRED if<a name="line.1416"></a>
-<span class="sourceLineNo">1417</span>    // hasLock is true.<a name="line.1417"></a>
-<span class="sourceLineNo">1418</span>    if (proc.hasLock()) {<a name="line.1418"></a>
-<span class="sourceLineNo">1419</span>      return LockState.LOCK_ACQUIRED;<a name="line.1419"></a>
-<span class="sourceLineNo">1420</span>    }<a name="line.1420"></a>
-<span class="sourceLineNo">1421</span>    return proc.doAcquireLock(env, store);<a name="line.1421"></a>
-<span class="sourceLineNo">1422</span>  }<a name="line.1422"></a>
-<span class="sourceLineNo">1423</span><a name="line.1423"></a>
-<span class="sourceLineNo">1424</span>  private void releaseLock(Procedure&lt;TEnvironment&gt; proc, boolean force) {<a name="line.1424"></a>
-<span class="sourceLineNo">1425</span>    TEnvironment env = getEnvironment();<a name="line.1425"></a>
-<span class="sourceLineNo">1426</span>    // For how the framework works, we know that we will always have the lock<a name="line.1426"></a>
-<span class="sourceLineNo">1427</span>    // when we call releaseLock(), so we can avoid calling proc.hasLock()<a name="line.1427"></a>
-<span class="sourceLineNo">1428</span>    if (force || !proc.holdLock(env) || proc.isFinished()) {<a name="line.1428"></a>
-<span class="sourceLineNo">1429</span>      proc.doReleaseLock(env, store);<a name="line.1429"></a>
-<span class="sourceLineNo">1430</span>    }<a name="line.1430"></a>
-<span class="sourceLineNo">1431</span>  }<a name="line.1431"></a>
-<span class="sourceLineNo">1432</span><a name="line.1432"></a>
-<span class="sourceLineNo">1433</span>  /**<a name="line.1433"></a>
-<span class="sourceLineNo">1434</span>   * Execute the rollback of the full procedure stack. Once the procedure is rolledback, the<a name="line.1434"></a>
-<span class="sourceLineNo">1435</span>   * root-procedure will be visible as finished to user, and the result will be the fatal exception.<a name="line.1435"></a>
-<span class="sourceLineNo">1436</span>   */<a name="line.1436"></a>
-<span class="sourceLineNo">1437</span>  private LockState executeRollback(long rootProcId, RootProcedureState&lt;TEnvironment&gt; procStack) {<a name="line.1437"></a>
-<span class="sourceLineNo">1438</span>    Procedure&lt;TEnvironment&gt; rootProc = procedures.get(rootProcId);<a name="line.1438"></a>
-<span class="sourceLineNo">1439</span>    RemoteProcedureException exception = rootProc.getException();<a name="line.1439"></a>
-<span class="sourceLineNo">1440</span>    // TODO: This needs doc. The root proc doesn't have an exception. Maybe we are<a name="line.1440"></a>
-<span class="sourceLineNo">1441</span>    // rolling back because the subprocedure does. Clarify.<a name="line.1441"></a>
-<span class="sourceLineNo">1442</span>    if (exception == null) {<a name="line.1442"></a>
-<span class="sourceLineNo">1443</span>      exception = procStack.getException();<a name="line.1443"></a>
-<span class="sourceLineNo">1444</span>      rootProc.setFailure(exception);<a name="line.1444"></a>
-<span class="sourceLineNo">1445</span>      store.update(rootProc);<a name="line.1445"></a>
-<span class="sourceLineNo">1446</span>    }<a name="line.1446"></a>
-<span

<TRUNCATED>

[09/29] hbase-site git commit: Published site at 5e84997f2ffdbcf5f849d70c30ddbe2db4039ca4.

Posted by gi...@apache.org.
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/27f5bfb5/testdevapidocs/org/apache/hadoop/hbase/procedure2/TestProcedureBypass.html
----------------------------------------------------------------------
diff --git a/testdevapidocs/org/apache/hadoop/hbase/procedure2/TestProcedureBypass.html b/testdevapidocs/org/apache/hadoop/hbase/procedure2/TestProcedureBypass.html
index 9ad4207..f04703c 100644
--- a/testdevapidocs/org/apache/hadoop/hbase/procedure2/TestProcedureBypass.html
+++ b/testdevapidocs/org/apache/hadoop/hbase/procedure2/TestProcedureBypass.html
@@ -18,7 +18,7 @@
     catch(err) {
     }
 //-->
-var methods = {"i0":9,"i1":9,"i2":10,"i3":10,"i4":10,"i5":10,"i6":10};
+var methods = {"i0":9,"i1":9,"i2":10,"i3":10,"i4":10,"i5":10,"i6":10,"i7":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/procedure2/TestProcedureBypass.html#line.44">TestProcedureBypass</a>
+<pre>public class <a href="../../../../../src-html/org/apache/hadoop/hbase/procedure2/TestProcedureBypass.html#line.45">TestProcedureBypass</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>
@@ -153,6 +153,10 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <td class="colFirst"><code>private static class&nbsp;</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/procedure2/TestProcedureBypass.TestProcEnv.html" title="class in org.apache.hadoop.hbase.procedure2">TestProcedureBypass.TestProcEnv</a></span></code>&nbsp;</td>
 </tr>
+<tr class="altColor">
+<td class="colFirst"><code>static class&nbsp;</code></td>
+<td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/procedure2/TestProcedureBypass.WaitingTimeoutProcedure.html" title="class in org.apache.hadoop.hbase.procedure2">TestProcedureBypass.WaitingTimeoutProcedure</a></span></code>&nbsp;</td>
+</tr>
 </table>
 </li>
 </ul>
@@ -262,10 +266,14 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 </tr>
 <tr id="i5" class="rowColor">
 <td class="colFirst"><code>void</code></td>
-<td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/procedure2/TestProcedureBypass.html#testBypassSuspendProcedure--">testBypassSuspendProcedure</a></span>()</code>&nbsp;</td>
+<td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/procedure2/TestProcedureBypass.html#testBypassingWaitingTimeoutProcedures--">testBypassingWaitingTimeoutProcedures</a></span>()</code>&nbsp;</td>
 </tr>
 <tr id="i6" class="altColor">
 <td class="colFirst"><code>void</code></td>
+<td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/procedure2/TestProcedureBypass.html#testBypassSuspendProcedure--">testBypassSuspendProcedure</a></span>()</code>&nbsp;</td>
+</tr>
+<tr id="i7" class="rowColor">
+<td class="colFirst"><code>void</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/procedure2/TestProcedureBypass.html#testStuckProcedure--">testStuckProcedure</a></span>()</code>&nbsp;</td>
 </tr>
 </table>
@@ -296,7 +304,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/procedure2/TestProcedureBypass.html#line.46">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/procedure2/TestProcedureBypass.html#line.47">CLASS_RULE</a></pre>
 </li>
 </ul>
 <a name="LOG">
@@ -305,7 +313,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>LOG</h4>
-<pre>private static final&nbsp;org.slf4j.Logger <a href="../../../../../src-html/org/apache/hadoop/hbase/procedure2/TestProcedureBypass.html#line.49">LOG</a></pre>
+<pre>private static final&nbsp;org.slf4j.Logger <a href="../../../../../src-html/org/apache/hadoop/hbase/procedure2/TestProcedureBypass.html#line.50">LOG</a></pre>
 </li>
 </ul>
 <a name="PROCEDURE_EXECUTOR_SLOTS">
@@ -314,7 +322,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>PROCEDURE_EXECUTOR_SLOTS</h4>
-<pre>private static final&nbsp;int <a href="../../../../../src-html/org/apache/hadoop/hbase/procedure2/TestProcedureBypass.html#line.51">PROCEDURE_EXECUTOR_SLOTS</a></pre>
+<pre>private static final&nbsp;int <a href="../../../../../src-html/org/apache/hadoop/hbase/procedure2/TestProcedureBypass.html#line.52">PROCEDURE_EXECUTOR_SLOTS</a></pre>
 <dl>
 <dt><span class="seeLabel">See Also:</span></dt>
 <dd><a href="../../../../../constant-values.html#org.apache.hadoop.hbase.procedure2.TestProcedureBypass.PROCEDURE_EXECUTOR_SLOTS">Constant Field Values</a></dd>
@@ -327,7 +335,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>procEnv</h4>
-<pre>private static&nbsp;<a href="../../../../../org/apache/hadoop/hbase/procedure2/TestProcedureBypass.TestProcEnv.html" title="class in org.apache.hadoop.hbase.procedure2">TestProcedureBypass.TestProcEnv</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/procedure2/TestProcedureBypass.html#line.53">procEnv</a></pre>
+<pre>private static&nbsp;<a href="../../../../../org/apache/hadoop/hbase/procedure2/TestProcedureBypass.TestProcEnv.html" title="class in org.apache.hadoop.hbase.procedure2">TestProcedureBypass.TestProcEnv</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/procedure2/TestProcedureBypass.html#line.54">procEnv</a></pre>
 </li>
 </ul>
 <a name="procStore">
@@ -336,7 +344,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>procStore</h4>
-<pre>private static&nbsp;org.apache.hadoop.hbase.procedure2.store.ProcedureStore <a href="../../../../../src-html/org/apache/hadoop/hbase/procedure2/TestProcedureBypass.html#line.54">procStore</a></pre>
+<pre>private static&nbsp;org.apache.hadoop.hbase.procedure2.store.ProcedureStore <a href="../../../../../src-html/org/apache/hadoop/hbase/procedure2/TestProcedureBypass.html#line.55">procStore</a></pre>
 </li>
 </ul>
 <a name="procExecutor">
@@ -345,7 +353,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>procExecutor</h4>
-<pre>private static&nbsp;org.apache.hadoop.hbase.procedure2.ProcedureExecutor&lt;<a href="../../../../../org/apache/hadoop/hbase/procedure2/TestProcedureBypass.TestProcEnv.html" title="class in org.apache.hadoop.hbase.procedure2">TestProcedureBypass.TestProcEnv</a>&gt; <a href="../../../../../src-html/org/apache/hadoop/hbase/procedure2/TestProcedureBypass.html#line.56">procExecutor</a></pre>
+<pre>private static&nbsp;org.apache.hadoop.hbase.procedure2.ProcedureExecutor&lt;<a href="../../../../../org/apache/hadoop/hbase/procedure2/TestProcedureBypass.TestProcEnv.html" title="class in org.apache.hadoop.hbase.procedure2">TestProcedureBypass.TestProcEnv</a>&gt; <a href="../../../../../src-html/org/apache/hadoop/hbase/procedure2/TestProcedureBypass.html#line.57">procExecutor</a></pre>
 </li>
 </ul>
 <a name="htu">
@@ -354,7 +362,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>htu</h4>
-<pre>private static&nbsp;<a href="../../../../../org/apache/hadoop/hbase/HBaseCommonTestingUtility.html" title="class in org.apache.hadoop.hbase">HBaseCommonTestingUtility</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/procedure2/TestProcedureBypass.html#line.58">htu</a></pre>
+<pre>private static&nbsp;<a href="../../../../../org/apache/hadoop/hbase/HBaseCommonTestingUtility.html" title="class in org.apache.hadoop.hbase">HBaseCommonTestingUtility</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/procedure2/TestProcedureBypass.html#line.59">htu</a></pre>
 </li>
 </ul>
 <a name="fs">
@@ -363,7 +371,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>fs</h4>
-<pre>private static&nbsp;org.apache.hadoop.fs.FileSystem <a href="../../../../../src-html/org/apache/hadoop/hbase/procedure2/TestProcedureBypass.html#line.60">fs</a></pre>
+<pre>private static&nbsp;org.apache.hadoop.fs.FileSystem <a href="../../../../../src-html/org/apache/hadoop/hbase/procedure2/TestProcedureBypass.html#line.61">fs</a></pre>
 </li>
 </ul>
 <a name="testDir">
@@ -372,7 +380,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>testDir</h4>
-<pre>private static&nbsp;org.apache.hadoop.fs.Path <a href="../../../../../src-html/org/apache/hadoop/hbase/procedure2/TestProcedureBypass.html#line.61">testDir</a></pre>
+<pre>private static&nbsp;org.apache.hadoop.fs.Path <a href="../../../../../src-html/org/apache/hadoop/hbase/procedure2/TestProcedureBypass.html#line.62">testDir</a></pre>
 </li>
 </ul>
 <a name="logDir">
@@ -381,7 +389,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockListLast">
 <li class="blockList">
 <h4>logDir</h4>
-<pre>private static&nbsp;org.apache.hadoop.fs.Path <a href="../../../../../src-html/org/apache/hadoop/hbase/procedure2/TestProcedureBypass.html#line.62">logDir</a></pre>
+<pre>private static&nbsp;org.apache.hadoop.fs.Path <a href="../../../../../src-html/org/apache/hadoop/hbase/procedure2/TestProcedureBypass.html#line.63">logDir</a></pre>
 </li>
 </ul>
 </li>
@@ -398,7 +406,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockListLast">
 <li class="blockList">
 <h4>TestProcedureBypass</h4>
-<pre>public&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/procedure2/TestProcedureBypass.html#line.44">TestProcedureBypass</a>()</pre>
+<pre>public&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/procedure2/TestProcedureBypass.html#line.45">TestProcedureBypass</a>()</pre>
 </li>
 </ul>
 </li>
@@ -415,7 +423,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>setUp</h4>
-<pre>public static&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/procedure2/TestProcedureBypass.html#line.68">setUp</a>()
+<pre>public static&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/procedure2/TestProcedureBypass.html#line.69">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>
@@ -429,7 +437,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>testBypassSuspendProcedure</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/procedure2/TestProcedureBypass.html#line.87">testBypassSuspendProcedure</a>()
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/procedure2/TestProcedureBypass.html#line.88">testBypassSuspendProcedure</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>
@@ -443,7 +451,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>testStuckProcedure</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/procedure2/TestProcedureBypass.html#line.98">testStuckProcedure</a>()
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/procedure2/TestProcedureBypass.html#line.99">testStuckProcedure</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 +465,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>testBypassingProcedureWithParent</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/procedure2/TestProcedureBypass.html#line.111">testBypassingProcedureWithParent</a>()
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/procedure2/TestProcedureBypass.html#line.112">testBypassingProcedureWithParent</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 +479,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>testBypassingStuckStateMachineProcedure</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/procedure2/TestProcedureBypass.html#line.125">testBypassingStuckStateMachineProcedure</a>()
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/procedure2/TestProcedureBypass.html#line.126">testBypassingStuckStateMachineProcedure</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 +493,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>testBypassingProcedureWithParentRecursive</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/procedure2/TestProcedureBypass.html#line.139">testBypassingProcedureWithParentRecursive</a>()
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/procedure2/TestProcedureBypass.html#line.140">testBypassingProcedureWithParentRecursive</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>
@@ -493,13 +501,27 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 </dl>
 </li>
 </ul>
+<a name="testBypassingWaitingTimeoutProcedures--">
+<!--   -->
+</a>
+<ul class="blockList">
+<li class="blockList">
+<h4>testBypassingWaitingTimeoutProcedures</h4>
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/procedure2/TestProcedureBypass.html#line.154">testBypassingWaitingTimeoutProcedures</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>
+<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>
 <a name="tearDown--">
 <!--   -->
 </a>
 <ul class="blockListLast">
 <li class="blockList">
 <h4>tearDown</h4>
-<pre>public static&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/procedure2/TestProcedureBypass.html#line.153">tearDown</a>()
+<pre>public static&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/procedure2/TestProcedureBypass.html#line.166">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>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/27f5bfb5/testdevapidocs/org/apache/hadoop/hbase/procedure2/TestProcedureCleanup.html
----------------------------------------------------------------------
diff --git a/testdevapidocs/org/apache/hadoop/hbase/procedure2/TestProcedureCleanup.html b/testdevapidocs/org/apache/hadoop/hbase/procedure2/TestProcedureCleanup.html
index 58b3600..54b2a1a 100644
--- a/testdevapidocs/org/apache/hadoop/hbase/procedure2/TestProcedureCleanup.html
+++ b/testdevapidocs/org/apache/hadoop/hbase/procedure2/TestProcedureCleanup.html
@@ -49,7 +49,7 @@ var activeTableTab = "activeTableTab";
 </div>
 <div class="subNav">
 <ul class="navList">
-<li><a href="../../../../../org/apache/hadoop/hbase/procedure2/TestProcedureBypass.TestProcEnv.html" title="class in org.apache.hadoop.hbase.procedure2"><span class="typeNameLink">Prev&nbsp;Class</span></a></li>
+<li><a href="../../../../../org/apache/hadoop/hbase/procedure2/TestProcedureBypass.WaitingTimeoutProcedure.html" title="class in org.apache.hadoop.hbase.procedure2"><span class="typeNameLink">Prev&nbsp;Class</span></a></li>
 <li><a href="../../../../../org/apache/hadoop/hbase/procedure2/TestProcedureCleanup.ExchangeProcedure.html" title="class in org.apache.hadoop.hbase.procedure2"><span class="typeNameLink">Next&nbsp;Class</span></a></li>
 </ul>
 <ul class="navList">
@@ -527,7 +527,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 </div>
 <div class="subNav">
 <ul class="navList">
-<li><a href="../../../../../org/apache/hadoop/hbase/procedure2/TestProcedureBypass.TestProcEnv.html" title="class in org.apache.hadoop.hbase.procedure2"><span class="typeNameLink">Prev&nbsp;Class</span></a></li>
+<li><a href="../../../../../org/apache/hadoop/hbase/procedure2/TestProcedureBypass.WaitingTimeoutProcedure.html" title="class in org.apache.hadoop.hbase.procedure2"><span class="typeNameLink">Prev&nbsp;Class</span></a></li>
 <li><a href="../../../../../org/apache/hadoop/hbase/procedure2/TestProcedureCleanup.ExchangeProcedure.html" title="class in org.apache.hadoop.hbase.procedure2"><span class="typeNameLink">Next&nbsp;Class</span></a></li>
 </ul>
 <ul class="navList">

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/27f5bfb5/testdevapidocs/org/apache/hadoop/hbase/procedure2/class-use/ProcedureTestingUtility.NoopProcedure.html
----------------------------------------------------------------------
diff --git a/testdevapidocs/org/apache/hadoop/hbase/procedure2/class-use/ProcedureTestingUtility.NoopProcedure.html b/testdevapidocs/org/apache/hadoop/hbase/procedure2/class-use/ProcedureTestingUtility.NoopProcedure.html
index 20b111c..126b9a9 100644
--- a/testdevapidocs/org/apache/hadoop/hbase/procedure2/class-use/ProcedureTestingUtility.NoopProcedure.html
+++ b/testdevapidocs/org/apache/hadoop/hbase/procedure2/class-use/ProcedureTestingUtility.NoopProcedure.html
@@ -224,22 +224,26 @@
 </tr>
 <tr class="altColor">
 <td class="colFirst"><code>static class&nbsp;</code></td>
-<td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/procedure2/TestProcedureCleanup.ExchangeProcedure.html" title="class in org.apache.hadoop.hbase.procedure2">TestProcedureCleanup.ExchangeProcedure</a></span></code>&nbsp;</td>
+<td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/procedure2/TestProcedureBypass.WaitingTimeoutProcedure.html" title="class in org.apache.hadoop.hbase.procedure2">TestProcedureBypass.WaitingTimeoutProcedure</a></span></code>&nbsp;</td>
 </tr>
 <tr class="rowColor">
 <td class="colFirst"><code>static class&nbsp;</code></td>
-<td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/procedure2/TestProcedureCleanup.RootProcedure.html" title="class in org.apache.hadoop.hbase.procedure2">TestProcedureCleanup.RootProcedure</a></span></code>&nbsp;</td>
+<td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/procedure2/TestProcedureCleanup.ExchangeProcedure.html" title="class in org.apache.hadoop.hbase.procedure2">TestProcedureCleanup.ExchangeProcedure</a></span></code>&nbsp;</td>
 </tr>
 <tr class="altColor">
 <td class="colFirst"><code>static class&nbsp;</code></td>
-<td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/procedure2/TestProcedureCleanup.SuspendProcedure.html" title="class in org.apache.hadoop.hbase.procedure2">TestProcedureCleanup.SuspendProcedure</a></span></code>&nbsp;</td>
+<td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/procedure2/TestProcedureCleanup.RootProcedure.html" title="class in org.apache.hadoop.hbase.procedure2">TestProcedureCleanup.RootProcedure</a></span></code>&nbsp;</td>
 </tr>
 <tr class="rowColor">
 <td class="colFirst"><code>static class&nbsp;</code></td>
-<td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/procedure2/TestProcedureCleanup.WaitProcedure.html" title="class in org.apache.hadoop.hbase.procedure2">TestProcedureCleanup.WaitProcedure</a></span></code>&nbsp;</td>
+<td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/procedure2/TestProcedureCleanup.SuspendProcedure.html" title="class in org.apache.hadoop.hbase.procedure2">TestProcedureCleanup.SuspendProcedure</a></span></code>&nbsp;</td>
 </tr>
 <tr class="altColor">
 <td class="colFirst"><code>static class&nbsp;</code></td>
+<td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/procedure2/TestProcedureCleanup.WaitProcedure.html" title="class in org.apache.hadoop.hbase.procedure2">TestProcedureCleanup.WaitProcedure</a></span></code>&nbsp;</td>
+</tr>
+<tr class="rowColor">
+<td class="colFirst"><code>static class&nbsp;</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/procedure2/TestProcedureEvents.TestTimeoutEventProcedure.html" title="class in org.apache.hadoop.hbase.procedure2">TestProcedureEvents.TestTimeoutEventProcedure</a></span></code>
 <div class="block">This Event+Procedure exhibits following behavior:
  
@@ -248,27 +252,27 @@
        If had enough timeouts, abort the procedure.</div>
 </td>
 </tr>
-<tr class="rowColor">
+<tr class="altColor">
 <td class="colFirst"><code>static class&nbsp;</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/procedure2/TestProcedureExecutor.BusyWaitProcedure.html" title="class in org.apache.hadoop.hbase.procedure2">TestProcedureExecutor.BusyWaitProcedure</a></span></code>&nbsp;</td>
 </tr>
-<tr class="altColor">
+<tr class="rowColor">
 <td class="colFirst"><code>static class&nbsp;</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/procedure2/TestProcedureRollbackAIOOB.ParentProcedure.html" title="class in org.apache.hadoop.hbase.procedure2">TestProcedureRollbackAIOOB.ParentProcedure</a></span></code>&nbsp;</td>
 </tr>
-<tr class="rowColor">
+<tr class="altColor">
 <td class="colFirst"><code>static class&nbsp;</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/procedure2/TestProcedureRollbackAIOOB.SubProcedure.html" title="class in org.apache.hadoop.hbase.procedure2">TestProcedureRollbackAIOOB.SubProcedure</a></span></code>&nbsp;</td>
 </tr>
-<tr class="altColor">
+<tr class="rowColor">
 <td class="colFirst"><code>static class&nbsp;</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/procedure2/TestProcedureSchedulerConcurrency.TestProcedureWithEvent.html" title="class in org.apache.hadoop.hbase.procedure2">TestProcedureSchedulerConcurrency.TestProcedureWithEvent</a></span></code>&nbsp;</td>
 </tr>
-<tr class="rowColor">
+<tr class="altColor">
 <td class="colFirst"><code>static class&nbsp;</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/procedure2/TestProcedureUtil.TestProcedureNoDefaultConstructor.html" title="class in org.apache.hadoop.hbase.procedure2">TestProcedureUtil.TestProcedureNoDefaultConstructor</a></span></code>&nbsp;</td>
 </tr>
-<tr class="altColor">
+<tr class="rowColor">
 <td class="colFirst"><code>static class&nbsp;</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/procedure2/TestStateMachineProcedure.SimpleChildProcedure.html" title="class in org.apache.hadoop.hbase.procedure2">TestStateMachineProcedure.SimpleChildProcedure</a></span></code>&nbsp;</td>
 </tr>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/27f5bfb5/testdevapidocs/org/apache/hadoop/hbase/procedure2/class-use/TestProcedureBypass.TestProcEnv.html
----------------------------------------------------------------------
diff --git a/testdevapidocs/org/apache/hadoop/hbase/procedure2/class-use/TestProcedureBypass.TestProcEnv.html b/testdevapidocs/org/apache/hadoop/hbase/procedure2/class-use/TestProcedureBypass.TestProcEnv.html
index 8040429..7741d6f 100644
--- a/testdevapidocs/org/apache/hadoop/hbase/procedure2/class-use/TestProcedureBypass.TestProcEnv.html
+++ b/testdevapidocs/org/apache/hadoop/hbase/procedure2/class-use/TestProcedureBypass.TestProcEnv.html
@@ -141,10 +141,18 @@
 <td class="colLast"><span class="typeNameLabel">TestProcedureBypass.RootProcedure.</span><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/procedure2/TestProcedureBypass.RootProcedure.html#execute-org.apache.hadoop.hbase.procedure2.TestProcedureBypass.TestProcEnv-">execute</a></span>(<a href="../../../../../../org/apache/hadoop/hbase/procedure2/TestProcedureBypass.TestProcEnv.html" title="class in org.apache.hadoop.hbase.procedure2">TestProcedureBypass.TestProcEnv</a>&nbsp;env)</code>&nbsp;</td>
 </tr>
 <tr class="rowColor">
+<td class="colFirst"><code>protected org.apache.hadoop.hbase.procedure2.Procedure[]</code></td>
+<td class="colLast"><span class="typeNameLabel">TestProcedureBypass.WaitingTimeoutProcedure.</span><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/procedure2/TestProcedureBypass.WaitingTimeoutProcedure.html#execute-org.apache.hadoop.hbase.procedure2.TestProcedureBypass.TestProcEnv-">execute</a></span>(<a href="../../../../../../org/apache/hadoop/hbase/procedure2/TestProcedureBypass.TestProcEnv.html" title="class in org.apache.hadoop.hbase.procedure2">TestProcedureBypass.TestProcEnv</a>&nbsp;env)</code>&nbsp;</td>
+</tr>
+<tr class="altColor">
 <td class="colFirst"><code>protected org.apache.hadoop.hbase.procedure2.StateMachineProcedure.Flow</code></td>
 <td class="colLast"><span class="typeNameLabel">TestProcedureBypass.StuckStateMachineProcedure.</span><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/procedure2/TestProcedureBypass.StuckStateMachineProcedure.html#executeFromState-org.apache.hadoop.hbase.procedure2.TestProcedureBypass.TestProcEnv-org.apache.hadoop.hbase.procedure2.TestProcedureBypass.StuckStateMachineState-">executeFromState</a></span>(<a href="../../../../../../org/apache/hadoop/hbase/procedure2/TestProcedureBypass.TestProcEnv.html" title="class in org.apache.hadoop.hbase.procedure2">TestProcedureBypass.TestProcEnv</a>&nbsp;env,
                 <a href="../../../../../../org/apache/hadoop/hbase/procedure2/TestProcedureBypass.StuckStateMachineState.html" title="enum in org.apache.hadoop.hbase.procedure2">TestProcedureBypass.StuckStateMachineState</a>&nbsp;tState)</code>&nbsp;</td>
 </tr>
+<tr class="rowColor">
+<td class="colFirst"><code>protected boolean</code></td>
+<td class="colLast"><span class="typeNameLabel">TestProcedureBypass.WaitingTimeoutProcedure.</span><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/procedure2/TestProcedureBypass.WaitingTimeoutProcedure.html#setTimeoutFailure-org.apache.hadoop.hbase.procedure2.TestProcedureBypass.TestProcEnv-">setTimeoutFailure</a></span>(<a href="../../../../../../org/apache/hadoop/hbase/procedure2/TestProcedureBypass.TestProcEnv.html" title="class in org.apache.hadoop.hbase.procedure2">TestProcedureBypass.TestProcEnv</a>&nbsp;env)</code>&nbsp;</td>
+</tr>
 </tbody>
 </table>
 <table class="useSummary" border="0" cellpadding="3" cellspacing="0" summary="Use table, listing constructors, and an explanation">

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

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/27f5bfb5/testdevapidocs/org/apache/hadoop/hbase/procedure2/package-frame.html
----------------------------------------------------------------------
diff --git a/testdevapidocs/org/apache/hadoop/hbase/procedure2/package-frame.html b/testdevapidocs/org/apache/hadoop/hbase/procedure2/package-frame.html
index b82a9ce..90e577c 100644
--- a/testdevapidocs/org/apache/hadoop/hbase/procedure2/package-frame.html
+++ b/testdevapidocs/org/apache/hadoop/hbase/procedure2/package-frame.html
@@ -34,6 +34,7 @@
 <li><a href="TestProcedureBypass.StuckStateMachineProcedure.html" title="class in org.apache.hadoop.hbase.procedure2" target="classFrame">TestProcedureBypass.StuckStateMachineProcedure</a></li>
 <li><a href="TestProcedureBypass.SuspendProcedure.html" title="class in org.apache.hadoop.hbase.procedure2" target="classFrame">TestProcedureBypass.SuspendProcedure</a></li>
 <li><a href="TestProcedureBypass.TestProcEnv.html" title="class in org.apache.hadoop.hbase.procedure2" target="classFrame">TestProcedureBypass.TestProcEnv</a></li>
+<li><a href="TestProcedureBypass.WaitingTimeoutProcedure.html" title="class in org.apache.hadoop.hbase.procedure2" target="classFrame">TestProcedureBypass.WaitingTimeoutProcedure</a></li>
 <li><a href="TestProcedureCleanup.html" title="class in org.apache.hadoop.hbase.procedure2" target="classFrame">TestProcedureCleanup</a></li>
 <li><a href="TestProcedureCleanup.ExchangeProcedure.html" title="class in org.apache.hadoop.hbase.procedure2" target="classFrame">TestProcedureCleanup.ExchangeProcedure</a></li>
 <li><a href="TestProcedureCleanup.RootProcedure.html" title="class in org.apache.hadoop.hbase.procedure2" target="classFrame">TestProcedureCleanup.RootProcedure</a></li>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/27f5bfb5/testdevapidocs/org/apache/hadoop/hbase/procedure2/package-summary.html
----------------------------------------------------------------------
diff --git a/testdevapidocs/org/apache/hadoop/hbase/procedure2/package-summary.html b/testdevapidocs/org/apache/hadoop/hbase/procedure2/package-summary.html
index 4091171..9cb3c9d 100644
--- a/testdevapidocs/org/apache/hadoop/hbase/procedure2/package-summary.html
+++ b/testdevapidocs/org/apache/hadoop/hbase/procedure2/package-summary.html
@@ -167,30 +167,34 @@
 <td class="colLast">&nbsp;</td>
 </tr>
 <tr class="rowColor">
-<td class="colFirst"><a href="../../../../../org/apache/hadoop/hbase/procedure2/TestProcedureCleanup.html" title="class in org.apache.hadoop.hbase.procedure2">TestProcedureCleanup</a></td>
+<td class="colFirst"><a href="../../../../../org/apache/hadoop/hbase/procedure2/TestProcedureBypass.WaitingTimeoutProcedure.html" title="class in org.apache.hadoop.hbase.procedure2">TestProcedureBypass.WaitingTimeoutProcedure</a></td>
 <td class="colLast">&nbsp;</td>
 </tr>
 <tr class="altColor">
-<td class="colFirst"><a href="../../../../../org/apache/hadoop/hbase/procedure2/TestProcedureCleanup.ExchangeProcedure.html" title="class in org.apache.hadoop.hbase.procedure2">TestProcedureCleanup.ExchangeProcedure</a></td>
+<td class="colFirst"><a href="../../../../../org/apache/hadoop/hbase/procedure2/TestProcedureCleanup.html" title="class in org.apache.hadoop.hbase.procedure2">TestProcedureCleanup</a></td>
 <td class="colLast">&nbsp;</td>
 </tr>
 <tr class="rowColor">
-<td class="colFirst"><a href="../../../../../org/apache/hadoop/hbase/procedure2/TestProcedureCleanup.RootProcedure.html" title="class in org.apache.hadoop.hbase.procedure2">TestProcedureCleanup.RootProcedure</a></td>
+<td class="colFirst"><a href="../../../../../org/apache/hadoop/hbase/procedure2/TestProcedureCleanup.ExchangeProcedure.html" title="class in org.apache.hadoop.hbase.procedure2">TestProcedureCleanup.ExchangeProcedure</a></td>
 <td class="colLast">&nbsp;</td>
 </tr>
 <tr class="altColor">
-<td class="colFirst"><a href="../../../../../org/apache/hadoop/hbase/procedure2/TestProcedureCleanup.SuspendProcedure.html" title="class in org.apache.hadoop.hbase.procedure2">TestProcedureCleanup.SuspendProcedure</a></td>
+<td class="colFirst"><a href="../../../../../org/apache/hadoop/hbase/procedure2/TestProcedureCleanup.RootProcedure.html" title="class in org.apache.hadoop.hbase.procedure2">TestProcedureCleanup.RootProcedure</a></td>
 <td class="colLast">&nbsp;</td>
 </tr>
 <tr class="rowColor">
-<td class="colFirst"><a href="../../../../../org/apache/hadoop/hbase/procedure2/TestProcedureCleanup.WaitProcedure.html" title="class in org.apache.hadoop.hbase.procedure2">TestProcedureCleanup.WaitProcedure</a></td>
+<td class="colFirst"><a href="../../../../../org/apache/hadoop/hbase/procedure2/TestProcedureCleanup.SuspendProcedure.html" title="class in org.apache.hadoop.hbase.procedure2">TestProcedureCleanup.SuspendProcedure</a></td>
 <td class="colLast">&nbsp;</td>
 </tr>
 <tr class="altColor">
+<td class="colFirst"><a href="../../../../../org/apache/hadoop/hbase/procedure2/TestProcedureCleanup.WaitProcedure.html" title="class in org.apache.hadoop.hbase.procedure2">TestProcedureCleanup.WaitProcedure</a></td>
+<td class="colLast">&nbsp;</td>
+</tr>
+<tr class="rowColor">
 <td class="colFirst"><a href="../../../../../org/apache/hadoop/hbase/procedure2/TestProcedureEvents.html" title="class in org.apache.hadoop.hbase.procedure2">TestProcedureEvents</a></td>
 <td class="colLast">&nbsp;</td>
 </tr>
-<tr class="altColor">
+<tr class="rowColor">
 <td class="colFirst"><a href="../../../../../org/apache/hadoop/hbase/procedure2/TestProcedureEvents.TestTimeoutEventProcedure.html" title="class in org.apache.hadoop.hbase.procedure2">TestProcedureEvents.TestTimeoutEventProcedure</a></td>
 <td class="colLast">
 <div class="block">This Event+Procedure exhibits following behavior:
@@ -200,248 +204,248 @@
        If had enough timeouts, abort the procedure.</div>
 </td>
 </tr>
-<tr class="rowColor">
+<tr class="altColor">
 <td class="colFirst"><a href="../../../../../org/apache/hadoop/hbase/procedure2/TestProcedureExecution.html" title="class in org.apache.hadoop.hbase.procedure2">TestProcedureExecution</a></td>
 <td class="colLast">&nbsp;</td>
 </tr>
-<tr class="altColor">
+<tr class="rowColor">
 <td class="colFirst"><a href="../../../../../org/apache/hadoop/hbase/procedure2/TestProcedureExecution.TestFaultyRollback.html" title="class in org.apache.hadoop.hbase.procedure2">TestProcedureExecution.TestFaultyRollback</a></td>
 <td class="colLast">&nbsp;</td>
 </tr>
-<tr class="rowColor">
+<tr class="altColor">
 <td class="colFirst"><a href="../../../../../org/apache/hadoop/hbase/procedure2/TestProcedureExecution.TestSequentialProcedure.html" title="class in org.apache.hadoop.hbase.procedure2">TestProcedureExecution.TestSequentialProcedure</a></td>
 <td class="colLast">&nbsp;</td>
 </tr>
-<tr class="altColor">
+<tr class="rowColor">
 <td class="colFirst"><a href="../../../../../org/apache/hadoop/hbase/procedure2/TestProcedureExecution.TestWaitingProcedure.html" title="class in org.apache.hadoop.hbase.procedure2">TestProcedureExecution.TestWaitingProcedure</a></td>
 <td class="colLast">&nbsp;</td>
 </tr>
-<tr class="rowColor">
+<tr class="altColor">
 <td class="colFirst"><a href="../../../../../org/apache/hadoop/hbase/procedure2/TestProcedureExecution.TestWaitingProcedure.TestWaitChild.html" title="class in org.apache.hadoop.hbase.procedure2">TestProcedureExecution.TestWaitingProcedure.TestWaitChild</a></td>
 <td class="colLast">&nbsp;</td>
 </tr>
-<tr class="altColor">
+<tr class="rowColor">
 <td class="colFirst"><a href="../../../../../org/apache/hadoop/hbase/procedure2/TestProcedureExecutor.html" title="class in org.apache.hadoop.hbase.procedure2">TestProcedureExecutor</a></td>
 <td class="colLast">&nbsp;</td>
 </tr>
-<tr class="rowColor">
+<tr class="altColor">
 <td class="colFirst"><a href="../../../../../org/apache/hadoop/hbase/procedure2/TestProcedureExecutor.BusyWaitProcedure.html" title="class in org.apache.hadoop.hbase.procedure2">TestProcedureExecutor.BusyWaitProcedure</a></td>
 <td class="colLast">&nbsp;</td>
 </tr>
-<tr class="altColor">
+<tr class="rowColor">
 <td class="colFirst"><a href="../../../../../org/apache/hadoop/hbase/procedure2/TestProcedureExecutor.TestProcEnv.html" title="class in org.apache.hadoop.hbase.procedure2">TestProcedureExecutor.TestProcEnv</a></td>
 <td class="colLast">&nbsp;</td>
 </tr>
-<tr class="rowColor">
+<tr class="altColor">
 <td class="colFirst"><a href="../../../../../org/apache/hadoop/hbase/procedure2/TestProcedureInMemoryChore.html" title="class in org.apache.hadoop.hbase.procedure2">TestProcedureInMemoryChore</a></td>
 <td class="colLast">&nbsp;</td>
 </tr>
-<tr class="altColor">
+<tr class="rowColor">
 <td class="colFirst"><a href="../../../../../org/apache/hadoop/hbase/procedure2/TestProcedureInMemoryChore.TestLatchChore.html" title="class in org.apache.hadoop.hbase.procedure2">TestProcedureInMemoryChore.TestLatchChore</a></td>
 <td class="colLast">&nbsp;</td>
 </tr>
-<tr class="rowColor">
+<tr class="altColor">
 <td class="colFirst"><a href="../../../../../org/apache/hadoop/hbase/procedure2/TestProcedureInMemoryChore.TestProcEnv.html" title="class in org.apache.hadoop.hbase.procedure2">TestProcedureInMemoryChore.TestProcEnv</a></td>
 <td class="colLast">&nbsp;</td>
 </tr>
-<tr class="altColor">
+<tr class="rowColor">
 <td class="colFirst"><a href="../../../../../org/apache/hadoop/hbase/procedure2/TestProcedureMetrics.html" title="class in org.apache.hadoop.hbase.procedure2">TestProcedureMetrics</a></td>
 <td class="colLast">&nbsp;</td>
 </tr>
-<tr class="rowColor">
+<tr class="altColor">
 <td class="colFirst"><a href="../../../../../org/apache/hadoop/hbase/procedure2/TestProcedureMetrics.ProcedureMetrics.html" title="class in org.apache.hadoop.hbase.procedure2">TestProcedureMetrics.ProcedureMetrics</a></td>
 <td class="colLast">&nbsp;</td>
 </tr>
-<tr class="altColor">
+<tr class="rowColor">
 <td class="colFirst"><a href="../../../../../org/apache/hadoop/hbase/procedure2/TestProcedureMetrics.TestProcEnv.html" title="class in org.apache.hadoop.hbase.procedure2">TestProcedureMetrics.TestProcEnv</a></td>
 <td class="colLast">&nbsp;</td>
 </tr>
-<tr class="rowColor">
+<tr class="altColor">
 <td class="colFirst"><a href="../../../../../org/apache/hadoop/hbase/procedure2/TestProcedureNonce.html" title="class in org.apache.hadoop.hbase.procedure2">TestProcedureNonce</a></td>
 <td class="colLast">&nbsp;</td>
 </tr>
-<tr class="altColor">
+<tr class="rowColor">
 <td class="colFirst"><a href="../../../../../org/apache/hadoop/hbase/procedure2/TestProcedureNonce.TestProcEnv.html" title="class in org.apache.hadoop.hbase.procedure2">TestProcedureNonce.TestProcEnv</a></td>
 <td class="colLast">&nbsp;</td>
 </tr>
-<tr class="rowColor">
+<tr class="altColor">
 <td class="colFirst"><a href="../../../../../org/apache/hadoop/hbase/procedure2/TestProcedureNonce.TestSingleStepProcedure.html" title="class in org.apache.hadoop.hbase.procedure2">TestProcedureNonce.TestSingleStepProcedure</a></td>
 <td class="colLast">&nbsp;</td>
 </tr>
-<tr class="altColor">
+<tr class="rowColor">
 <td class="colFirst"><a href="../../../../../org/apache/hadoop/hbase/procedure2/TestProcedureRecovery.html" title="class in org.apache.hadoop.hbase.procedure2">TestProcedureRecovery</a></td>
 <td class="colLast">&nbsp;</td>
 </tr>
-<tr class="rowColor">
+<tr class="altColor">
 <td class="colFirst"><a href="../../../../../org/apache/hadoop/hbase/procedure2/TestProcedureRecovery.BaseTestStepProcedure.html" title="class in org.apache.hadoop.hbase.procedure2">TestProcedureRecovery.BaseTestStepProcedure</a></td>
 <td class="colLast">&nbsp;</td>
 </tr>
-<tr class="altColor">
+<tr class="rowColor">
 <td class="colFirst"><a href="../../../../../org/apache/hadoop/hbase/procedure2/TestProcedureRecovery.TestMultiStepProcedure.html" title="class in org.apache.hadoop.hbase.procedure2">TestProcedureRecovery.TestMultiStepProcedure</a></td>
 <td class="colLast">&nbsp;</td>
 </tr>
-<tr class="rowColor">
+<tr class="altColor">
 <td class="colFirst"><a href="../../../../../org/apache/hadoop/hbase/procedure2/TestProcedureRecovery.TestMultiStepProcedure.Step1Procedure.html" title="class in org.apache.hadoop.hbase.procedure2">TestProcedureRecovery.TestMultiStepProcedure.Step1Procedure</a></td>
 <td class="colLast">&nbsp;</td>
 </tr>
-<tr class="altColor">
+<tr class="rowColor">
 <td class="colFirst"><a href="../../../../../org/apache/hadoop/hbase/procedure2/TestProcedureRecovery.TestMultiStepProcedure.Step2Procedure.html" title="class in org.apache.hadoop.hbase.procedure2">TestProcedureRecovery.TestMultiStepProcedure.Step2Procedure</a></td>
 <td class="colLast">&nbsp;</td>
 </tr>
-<tr class="rowColor">
+<tr class="altColor">
 <td class="colFirst"><a href="../../../../../org/apache/hadoop/hbase/procedure2/TestProcedureRecovery.TestProcEnv.html" title="class in org.apache.hadoop.hbase.procedure2">TestProcedureRecovery.TestProcEnv</a></td>
 <td class="colLast">&nbsp;</td>
 </tr>
-<tr class="altColor">
+<tr class="rowColor">
 <td class="colFirst"><a href="../../../../../org/apache/hadoop/hbase/procedure2/TestProcedureRecovery.TestSingleStepProcedure.html" title="class in org.apache.hadoop.hbase.procedure2">TestProcedureRecovery.TestSingleStepProcedure</a></td>
 <td class="colLast">&nbsp;</td>
 </tr>
-<tr class="rowColor">
+<tr class="altColor">
 <td class="colFirst"><a href="../../../../../org/apache/hadoop/hbase/procedure2/TestProcedureRecovery.TestStateMachineProcedure.html" title="class in org.apache.hadoop.hbase.procedure2">TestProcedureRecovery.TestStateMachineProcedure</a></td>
 <td class="colLast">&nbsp;</td>
 </tr>
-<tr class="altColor">
+<tr class="rowColor">
 <td class="colFirst"><a href="../../../../../org/apache/hadoop/hbase/procedure2/TestProcedureReplayOrder.html" title="class in org.apache.hadoop.hbase.procedure2">TestProcedureReplayOrder</a></td>
 <td class="colLast">
 <div class="block">For now we do not guarantee this, we will restore the locks when restarting ProcedureExecutor so
  we should use lock to obtain the correct order.</div>
 </td>
 </tr>
-<tr class="rowColor">
+<tr class="altColor">
 <td class="colFirst"><a href="../../../../../org/apache/hadoop/hbase/procedure2/TestProcedureReplayOrder.TestProcedure.html" title="class in org.apache.hadoop.hbase.procedure2">TestProcedureReplayOrder.TestProcedure</a></td>
 <td class="colLast">&nbsp;</td>
 </tr>
-<tr class="altColor">
+<tr class="rowColor">
 <td class="colFirst"><a href="../../../../../org/apache/hadoop/hbase/procedure2/TestProcedureReplayOrder.TestProcedureEnv.html" title="class in org.apache.hadoop.hbase.procedure2">TestProcedureReplayOrder.TestProcedureEnv</a></td>
 <td class="colLast">&nbsp;</td>
 </tr>
-<tr class="rowColor">
+<tr class="altColor">
 <td class="colFirst"><a href="../../../../../org/apache/hadoop/hbase/procedure2/TestProcedureReplayOrder.TestSingleStepProcedure.html" title="class in org.apache.hadoop.hbase.procedure2">TestProcedureReplayOrder.TestSingleStepProcedure</a></td>
 <td class="colLast">&nbsp;</td>
 </tr>
-<tr class="altColor">
+<tr class="rowColor">
 <td class="colFirst"><a href="../../../../../org/apache/hadoop/hbase/procedure2/TestProcedureReplayOrder.TestTwoStepProcedure.html" title="class in org.apache.hadoop.hbase.procedure2">TestProcedureReplayOrder.TestTwoStepProcedure</a></td>
 <td class="colLast">&nbsp;</td>
 </tr>
-<tr class="rowColor">
+<tr class="altColor">
 <td class="colFirst"><a href="../../../../../org/apache/hadoop/hbase/procedure2/TestProcedureRollbackAIOOB.html" title="class in org.apache.hadoop.hbase.procedure2">TestProcedureRollbackAIOOB</a></td>
 <td class="colLast">
 <div class="block">Testcase for HBASE-20973</div>
 </td>
 </tr>
-<tr class="altColor">
+<tr class="rowColor">
 <td class="colFirst"><a href="../../../../../org/apache/hadoop/hbase/procedure2/TestProcedureRollbackAIOOB.ParentProcedure.html" title="class in org.apache.hadoop.hbase.procedure2">TestProcedureRollbackAIOOB.ParentProcedure</a></td>
 <td class="colLast">&nbsp;</td>
 </tr>
-<tr class="rowColor">
+<tr class="altColor">
 <td class="colFirst"><a href="../../../../../org/apache/hadoop/hbase/procedure2/TestProcedureRollbackAIOOB.SubProcedure.html" title="class in org.apache.hadoop.hbase.procedure2">TestProcedureRollbackAIOOB.SubProcedure</a></td>
 <td class="colLast">&nbsp;</td>
 </tr>
-<tr class="altColor">
+<tr class="rowColor">
 <td class="colFirst"><a href="../../../../../org/apache/hadoop/hbase/procedure2/TestProcedureSchedulerConcurrency.html" title="class in org.apache.hadoop.hbase.procedure2">TestProcedureSchedulerConcurrency</a></td>
 <td class="colLast">&nbsp;</td>
 </tr>
-<tr class="rowColor">
+<tr class="altColor">
 <td class="colFirst"><a href="../../../../../org/apache/hadoop/hbase/procedure2/TestProcedureSchedulerConcurrency.TestProcedureWithEvent.html" title="class in org.apache.hadoop.hbase.procedure2">TestProcedureSchedulerConcurrency.TestProcedureWithEvent</a></td>
 <td class="colLast">&nbsp;</td>
 </tr>
-<tr class="altColor">
+<tr class="rowColor">
 <td class="colFirst"><a href="../../../../../org/apache/hadoop/hbase/procedure2/TestProcedureSkipPersistence.html" title="class in org.apache.hadoop.hbase.procedure2">TestProcedureSkipPersistence</a></td>
 <td class="colLast">&nbsp;</td>
 </tr>
-<tr class="altColor">
+<tr class="rowColor">
 <td class="colFirst"><a href="../../../../../org/apache/hadoop/hbase/procedure2/TestProcedureSkipPersistence.TestProcedure.html" title="class in org.apache.hadoop.hbase.procedure2">TestProcedureSkipPersistence.TestProcedure</a></td>
 <td class="colLast">&nbsp;</td>
 </tr>
-<tr class="rowColor">
+<tr class="altColor">
 <td class="colFirst"><a href="../../../../../org/apache/hadoop/hbase/procedure2/TestProcedureSuspended.html" title="class in org.apache.hadoop.hbase.procedure2">TestProcedureSuspended</a></td>
 <td class="colLast">&nbsp;</td>
 </tr>
-<tr class="altColor">
+<tr class="rowColor">
 <td class="colFirst"><a href="../../../../../org/apache/hadoop/hbase/procedure2/TestProcedureSuspended.TestLockProcedure.html" title="class in org.apache.hadoop.hbase.procedure2">TestProcedureSuspended.TestLockProcedure</a></td>
 <td class="colLast">&nbsp;</td>
 </tr>
-<tr class="rowColor">
+<tr class="altColor">
 <td class="colFirst"><a href="../../../../../org/apache/hadoop/hbase/procedure2/TestProcedureSuspended.TestProcEnv.html" title="class in org.apache.hadoop.hbase.procedure2">TestProcedureSuspended.TestProcEnv</a></td>
 <td class="colLast">&nbsp;</td>
 </tr>
-<tr class="altColor">
+<tr class="rowColor">
 <td class="colFirst"><a href="../../../../../org/apache/hadoop/hbase/procedure2/TestProcedureToString.html" title="class in org.apache.hadoop.hbase.procedure2">TestProcedureToString</a></td>
 <td class="colLast">&nbsp;</td>
 </tr>
-<tr class="rowColor">
+<tr class="altColor">
 <td class="colFirst"><a href="../../../../../org/apache/hadoop/hbase/procedure2/TestProcedureToString.BasicProcedure.html" title="class in org.apache.hadoop.hbase.procedure2">TestProcedureToString.BasicProcedure</a></td>
 <td class="colLast">
 <div class="block">A do-nothing basic procedure just for testing toString.</div>
 </td>
 </tr>
-<tr class="altColor">
+<tr class="rowColor">
 <td class="colFirst"><a href="../../../../../org/apache/hadoop/hbase/procedure2/TestProcedureToString.BasicProcedureEnv.html" title="class in org.apache.hadoop.hbase.procedure2">TestProcedureToString.BasicProcedureEnv</a></td>
 <td class="colLast">
 <div class="block">A do-nothing environment for BasicProcedure.</div>
 </td>
 </tr>
-<tr class="rowColor">
+<tr class="altColor">
 <td class="colFirst"><a href="../../../../../org/apache/hadoop/hbase/procedure2/TestProcedureToString.DoublingStateStringBasicProcedure.html" title="class in org.apache.hadoop.hbase.procedure2">TestProcedureToString.DoublingStateStringBasicProcedure</a></td>
 <td class="colLast">
 <div class="block">A do-nothing basic procedure that overrides the toStringState method.</div>
 </td>
 </tr>
-<tr class="altColor">
+<tr class="rowColor">
 <td class="colFirst"><a href="../../../../../org/apache/hadoop/hbase/procedure2/TestProcedureToString.SimpleStateMachineProcedure.html" title="class in org.apache.hadoop.hbase.procedure2">TestProcedureToString.SimpleStateMachineProcedure</a></td>
 <td class="colLast">
 <div class="block">Do-nothing SimpleMachineProcedure for checking its toString.</div>
 </td>
 </tr>
-<tr class="rowColor">
+<tr class="altColor">
 <td class="colFirst"><a href="../../../../../org/apache/hadoop/hbase/procedure2/TestProcedureUtil.html" title="class in org.apache.hadoop.hbase.procedure2">TestProcedureUtil</a></td>
 <td class="colLast">&nbsp;</td>
 </tr>
-<tr class="altColor">
+<tr class="rowColor">
 <td class="colFirst"><a href="../../../../../org/apache/hadoop/hbase/procedure2/TestProcedureUtil.TestProcedureNoDefaultConstructor.html" title="class in org.apache.hadoop.hbase.procedure2">TestProcedureUtil.TestProcedureNoDefaultConstructor</a></td>
 <td class="colLast">&nbsp;</td>
 </tr>
-<tr class="rowColor">
+<tr class="altColor">
 <td class="colFirst"><a href="../../../../../org/apache/hadoop/hbase/procedure2/TestStateMachineProcedure.html" title="class in org.apache.hadoop.hbase.procedure2">TestStateMachineProcedure</a></td>
 <td class="colLast">&nbsp;</td>
 </tr>
-<tr class="altColor">
+<tr class="rowColor">
 <td class="colFirst"><a href="../../../../../org/apache/hadoop/hbase/procedure2/TestStateMachineProcedure.SimpleChildProcedure.html" title="class in org.apache.hadoop.hbase.procedure2">TestStateMachineProcedure.SimpleChildProcedure</a></td>
 <td class="colLast">&nbsp;</td>
 </tr>
-<tr class="rowColor">
+<tr class="altColor">
 <td class="colFirst"><a href="../../../../../org/apache/hadoop/hbase/procedure2/TestStateMachineProcedure.TestProcEnv.html" title="class in org.apache.hadoop.hbase.procedure2">TestStateMachineProcedure.TestProcEnv</a></td>
 <td class="colLast">&nbsp;</td>
 </tr>
-<tr class="altColor">
+<tr class="rowColor">
 <td class="colFirst"><a href="../../../../../org/apache/hadoop/hbase/procedure2/TestStateMachineProcedure.TestSMProcedure.html" title="class in org.apache.hadoop.hbase.procedure2">TestStateMachineProcedure.TestSMProcedure</a></td>
 <td class="colLast">&nbsp;</td>
 </tr>
-<tr class="rowColor">
+<tr class="altColor">
 <td class="colFirst"><a href="../../../../../org/apache/hadoop/hbase/procedure2/TestStateMachineProcedure.TestSMProcedureBadRollback.html" title="class in org.apache.hadoop.hbase.procedure2">TestStateMachineProcedure.TestSMProcedureBadRollback</a></td>
 <td class="colLast">&nbsp;</td>
 </tr>
-<tr class="altColor">
+<tr class="rowColor">
 <td class="colFirst"><a href="../../../../../org/apache/hadoop/hbase/procedure2/TestYieldProcedures.html" title="class in org.apache.hadoop.hbase.procedure2">TestYieldProcedures</a></td>
 <td class="colLast">&nbsp;</td>
 </tr>
-<tr class="rowColor">
+<tr class="altColor">
 <td class="colFirst"><a href="../../../../../org/apache/hadoop/hbase/procedure2/TestYieldProcedures.TestProcEnv.html" title="class in org.apache.hadoop.hbase.procedure2">TestYieldProcedures.TestProcEnv</a></td>
 <td class="colLast">&nbsp;</td>
 </tr>
-<tr class="altColor">
+<tr class="rowColor">
 <td class="colFirst"><a href="../../../../../org/apache/hadoop/hbase/procedure2/TestYieldProcedures.TestScheduler.html" title="class in org.apache.hadoop.hbase.procedure2">TestYieldProcedures.TestScheduler</a></td>
 <td class="colLast">&nbsp;</td>
 </tr>
-<tr class="rowColor">
+<tr class="altColor">
 <td class="colFirst"><a href="../../../../../org/apache/hadoop/hbase/procedure2/TestYieldProcedures.TestStateMachineProcedure.html" title="class in org.apache.hadoop.hbase.procedure2">TestYieldProcedures.TestStateMachineProcedure</a></td>
 <td class="colLast">&nbsp;</td>
 </tr>
-<tr class="altColor">
+<tr class="rowColor">
 <td class="colFirst"><a href="../../../../../org/apache/hadoop/hbase/procedure2/TestYieldProcedures.TestStateMachineProcedure.ExecutionInfo.html" title="class in org.apache.hadoop.hbase.procedure2">TestYieldProcedures.TestStateMachineProcedure.ExecutionInfo</a></td>
 <td class="colLast">&nbsp;</td>
 </tr>
-<tr class="rowColor">
+<tr class="altColor">
 <td class="colFirst"><a href="../../../../../org/apache/hadoop/hbase/procedure2/TestYieldProcedures.TestYieldProcedure.html" title="class in org.apache.hadoop.hbase.procedure2">TestYieldProcedures.TestYieldProcedure</a></td>
 <td class="colLast">&nbsp;</td>
 </tr>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/27f5bfb5/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 300aafe..2d8c701 100644
--- a/testdevapidocs/org/apache/hadoop/hbase/procedure2/package-tree.html
+++ b/testdevapidocs/org/apache/hadoop/hbase/procedure2/package-tree.html
@@ -111,6 +111,7 @@
 <li type="circle">org.apache.hadoop.hbase.procedure2.<a href="../../../../../org/apache/hadoop/hbase/procedure2/TestProcedureBypass.RootProcedure.html" title="class in org.apache.hadoop.hbase.procedure2"><span class="typeNameLink">TestProcedureBypass.RootProcedure</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.procedure2.<a href="../../../../../org/apache/hadoop/hbase/procedure2/TestProcedureBypass.StuckProcedure.html" title="class in org.apache.hadoop.hbase.procedure2"><span class="typeNameLink">TestProcedureBypass.StuckProcedure</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.procedure2.<a href="../../../../../org/apache/hadoop/hbase/procedure2/TestProcedureBypass.SuspendProcedure.html" title="class in org.apache.hadoop.hbase.procedure2"><span class="typeNameLink">TestProcedureBypass.SuspendProcedure</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.procedure2.<a href="../../../../../org/apache/hadoop/hbase/procedure2/TestProcedureBypass.WaitingTimeoutProcedure.html" title="class in org.apache.hadoop.hbase.procedure2"><span class="typeNameLink">TestProcedureBypass.WaitingTimeoutProcedure</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.procedure2.<a href="../../../../../org/apache/hadoop/hbase/procedure2/TestProcedureCleanup.ExchangeProcedure.html" title="class in org.apache.hadoop.hbase.procedure2"><span class="typeNameLink">TestProcedureCleanup.ExchangeProcedure</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.procedure2.<a href="../../../../../org/apache/hadoop/hbase/procedure2/TestProcedureCleanup.RootProcedure.html" title="class in org.apache.hadoop.hbase.procedure2"><span class="typeNameLink">TestProcedureCleanup.RootProcedure</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.procedure2.<a href="../../../../../org/apache/hadoop/hbase/procedure2/TestProcedureCleanup.SuspendProcedure.html" title="class in org.apache.hadoop.hbase.procedure2"><span class="typeNameLink">TestProcedureCleanup.SuspendProcedure</span></a></li>
@@ -233,10 +234,10 @@
 <ul>
 <li type="circle">java.lang.<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Enum.html?is-external=true" title="class or interface in java.lang"><span class="typeNameLink">Enum</span></a>&lt;E&gt; (implements java.lang.<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Comparable.html?is-external=true" title="class or interface in java.lang">Comparable</a>&lt;T&gt;, java.io.<a href="https://docs.oracle.com/javase/8/docs/api/java/io/Serializable.html?is-external=true" 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/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>
 </ul>
 </li>
 </ul>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/27f5bfb5/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 057d9b4..a99bc3f 100644
--- a/testdevapidocs/org/apache/hadoop/hbase/regionserver/package-tree.html
+++ b/testdevapidocs/org/apache/hadoop/hbase/regionserver/package-tree.html
@@ -701,11 +701,11 @@
 <ul>
 <li type="circle">java.lang.<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Enum.html?is-external=true" title="class or interface in java.lang"><span class="typeNameLink">Enum</span></a>&lt;E&gt; (implements java.lang.<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Comparable.html?is-external=true" title="class or interface in java.lang">Comparable</a>&lt;T&gt;, java.io.<a href="https://docs.oracle.com/javase/8/docs/api/java/io/Serializable.html?is-external=true" 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/TestAtomicOperation.TestStep.html" title="enum in org.apache.hadoop.hbase.regionserver"><span class="typeNameLink">TestAtomicOperation.TestStep</span></a></li>
-<li type="circle">org.apache.hadoop.hbase.regionserver.<a href="../../../../../org/apache/hadoop/hbase/regionserver/TestCacheOnWriteInSchema.CacheOnWriteType.html" title="enum in org.apache.hadoop.hbase.regionserver"><span class="typeNameLink">TestCacheOnWriteInSchema.CacheOnWriteType</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.regionserver.<a href="../../../../../org/apache/hadoop/hbase/regionserver/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/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/TestAtomicOperation.TestStep.html" title="enum in org.apache.hadoop.hbase.regionserver"><span class="typeNameLink">TestAtomicOperation.TestStep</span></a></li>
 </ul>
 </li>
 </ul>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/27f5bfb5/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 9e0700e..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/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>
 <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>
 </ul>
 </li>
 </ul>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/27f5bfb5/testdevapidocs/org/apache/hadoop/hbase/zookeeper/TestZKMainServer.ExitException.html
----------------------------------------------------------------------
diff --git a/testdevapidocs/org/apache/hadoop/hbase/zookeeper/TestZKMainServer.ExitException.html b/testdevapidocs/org/apache/hadoop/hbase/zookeeper/TestZKMainServer.ExitException.html
index 3ed3940..5826426 100644
--- a/testdevapidocs/org/apache/hadoop/hbase/zookeeper/TestZKMainServer.ExitException.html
+++ b/testdevapidocs/org/apache/hadoop/hbase/zookeeper/TestZKMainServer.ExitException.html
@@ -131,7 +131,7 @@
 </dl>
 <hr>
 <br>
-<pre>protected static class <a href="../../../../../src-html/org/apache/hadoop/hbase/zookeeper/TestZKMainServer.html#line.44">TestZKMainServer.ExitException</a>
+<pre>protected static class <a href="../../../../../src-html/org/apache/hadoop/hbase/zookeeper/TestZKMainServer.html#line.45">TestZKMainServer.ExitException</a>
 extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/SecurityException.html?is-external=true" title="class or interface in java.lang">SecurityException</a></pre>
 <dl>
 <dt><span class="seeLabel">See Also:</span></dt>
@@ -223,7 +223,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/SecurityExc
 <ul class="blockList">
 <li class="blockList">
 <h4>serialVersionUID</h4>
-<pre>private static final&nbsp;long <a href="../../../../../src-html/org/apache/hadoop/hbase/zookeeper/TestZKMainServer.ExitException.html#line.45">serialVersionUID</a></pre>
+<pre>private static final&nbsp;long <a href="../../../../../src-html/org/apache/hadoop/hbase/zookeeper/TestZKMainServer.ExitException.html#line.46">serialVersionUID</a></pre>
 <dl>
 <dt><span class="seeLabel">See Also:</span></dt>
 <dd><a href="../../../../../constant-values.html#org.apache.hadoop.hbase.zookeeper.TestZKMainServer.ExitException.serialVersionUID">Constant Field Values</a></dd>
@@ -236,7 +236,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/SecurityExc
 <ul class="blockListLast">
 <li class="blockList">
 <h4>status</h4>
-<pre>private final&nbsp;int <a href="../../../../../src-html/org/apache/hadoop/hbase/zookeeper/TestZKMainServer.ExitException.html#line.46">status</a></pre>
+<pre>private final&nbsp;int <a href="../../../../../src-html/org/apache/hadoop/hbase/zookeeper/TestZKMainServer.ExitException.html#line.47">status</a></pre>
 </li>
 </ul>
 </li>
@@ -253,7 +253,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/SecurityExc
 <ul class="blockListLast">
 <li class="blockList">
 <h4>ExitException</h4>
-<pre>public&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/zookeeper/TestZKMainServer.ExitException.html#line.47">ExitException</a>(int&nbsp;status)</pre>
+<pre>public&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/zookeeper/TestZKMainServer.ExitException.html#line.48">ExitException</a>(int&nbsp;status)</pre>
 </li>
 </ul>
 </li>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/27f5bfb5/testdevapidocs/org/apache/hadoop/hbase/zookeeper/TestZKMainServer.NoExitSecurityManager.html
----------------------------------------------------------------------
diff --git a/testdevapidocs/org/apache/hadoop/hbase/zookeeper/TestZKMainServer.NoExitSecurityManager.html b/testdevapidocs/org/apache/hadoop/hbase/zookeeper/TestZKMainServer.NoExitSecurityManager.html
index d3b957b..660fd36 100644
--- a/testdevapidocs/org/apache/hadoop/hbase/zookeeper/TestZKMainServer.NoExitSecurityManager.html
+++ b/testdevapidocs/org/apache/hadoop/hbase/zookeeper/TestZKMainServer.NoExitSecurityManager.html
@@ -118,7 +118,7 @@ var activeTableTab = "activeTableTab";
 </dl>
 <hr>
 <br>
-<pre>private static class <a href="../../../../../src-html/org/apache/hadoop/hbase/zookeeper/TestZKMainServer.html#line.53">TestZKMainServer.NoExitSecurityManager</a>
+<pre>private static class <a href="../../../../../src-html/org/apache/hadoop/hbase/zookeeper/TestZKMainServer.html#line.54">TestZKMainServer.NoExitSecurityManager</a>
 extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/SecurityManager.html?is-external=true" title="class or interface in java.lang">SecurityManager</a></pre>
 </li>
 </ul>
@@ -220,7 +220,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/SecurityMan
 <ul class="blockListLast">
 <li class="blockList">
 <h4>NoExitSecurityManager</h4>
-<pre>private&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/zookeeper/TestZKMainServer.NoExitSecurityManager.html#line.53">NoExitSecurityManager</a>()</pre>
+<pre>private&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/zookeeper/TestZKMainServer.NoExitSecurityManager.html#line.54">NoExitSecurityManager</a>()</pre>
 </li>
 </ul>
 </li>
@@ -237,7 +237,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/SecurityMan
 <ul class="blockList">
 <li class="blockList">
 <h4>checkPermission</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/zookeeper/TestZKMainServer.NoExitSecurityManager.html#line.55">checkPermission</a>(<a href="https://docs.oracle.com/javase/8/docs/api/java/security/Permission.html?is-external=true" title="class or interface in java.security">Permission</a>&nbsp;perm)</pre>
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/zookeeper/TestZKMainServer.NoExitSecurityManager.html#line.56">checkPermission</a>(<a href="https://docs.oracle.com/javase/8/docs/api/java/security/Permission.html?is-external=true" title="class or interface in java.security">Permission</a>&nbsp;perm)</pre>
 <dl>
 <dt><span class="overrideSpecifyLabel">Overrides:</span></dt>
 <dd><code><a href="https://docs.oracle.com/javase/8/docs/api/java/lang/SecurityManager.html?is-external=true#checkPermission-java.security.Permission-" title="class or interface in java.lang">checkPermission</a></code>&nbsp;in class&nbsp;<code><a href="https://docs.oracle.com/javase/8/docs/api/java/lang/SecurityManager.html?is-external=true" title="class or interface in java.lang">SecurityManager</a></code></dd>
@@ -250,7 +250,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/SecurityMan
 <ul class="blockList">
 <li class="blockList">
 <h4>checkPermission</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/zookeeper/TestZKMainServer.NoExitSecurityManager.html#line.60">checkPermission</a>(<a href="https://docs.oracle.com/javase/8/docs/api/java/security/Permission.html?is-external=true" title="class or interface in java.security">Permission</a>&nbsp;perm,
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/zookeeper/TestZKMainServer.NoExitSecurityManager.html#line.61">checkPermission</a>(<a href="https://docs.oracle.com/javase/8/docs/api/java/security/Permission.html?is-external=true" title="class or interface in java.security">Permission</a>&nbsp;perm,
                             <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html?is-external=true" title="class or interface in java.lang">Object</a>&nbsp;context)</pre>
 <dl>
 <dt><span class="overrideSpecifyLabel">Overrides:</span></dt>
@@ -264,7 +264,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/SecurityMan
 <ul class="blockListLast">
 <li class="blockList">
 <h4>checkExit</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/zookeeper/TestZKMainServer.NoExitSecurityManager.html#line.65">checkExit</a>(int&nbsp;status)</pre>
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/zookeeper/TestZKMainServer.NoExitSecurityManager.html#line.66">checkExit</a>(int&nbsp;status)</pre>
 <dl>
 <dt><span class="overrideSpecifyLabel">Overrides:</span></dt>
 <dd><code><a href="https://docs.oracle.com/javase/8/docs/api/java/lang/SecurityManager.html?is-external=true#checkExit-int-" title="class or interface in java.lang">checkExit</a></code>&nbsp;in class&nbsp;<code><a href="https://docs.oracle.com/javase/8/docs/api/java/lang/SecurityManager.html?is-external=true" title="class or interface in java.lang">SecurityManager</a></code></dd>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/27f5bfb5/testdevapidocs/org/apache/hadoop/hbase/zookeeper/TestZKMainServer.html
----------------------------------------------------------------------
diff --git a/testdevapidocs/org/apache/hadoop/hbase/zookeeper/TestZKMainServer.html b/testdevapidocs/org/apache/hadoop/hbase/zookeeper/TestZKMainServer.html
index 52c0fde..42d3063 100644
--- a/testdevapidocs/org/apache/hadoop/hbase/zookeeper/TestZKMainServer.html
+++ b/testdevapidocs/org/apache/hadoop/hbase/zookeeper/TestZKMainServer.html
@@ -109,7 +109,7 @@ var activeTableTab = "activeTableTab";
 <li class="blockList">
 <hr>
 <br>
-<pre>public class <a href="../../../../../src-html/org/apache/hadoop/hbase/zookeeper/TestZKMainServer.html#line.36">TestZKMainServer</a>
+<pre>public class <a href="../../../../../src-html/org/apache/hadoop/hbase/zookeeper/TestZKMainServer.html#line.37">TestZKMainServer</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>
@@ -226,7 +226,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockListLast">
 <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/zookeeper/TestZKMainServer.html#line.39">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/zookeeper/TestZKMainServer.html#line.40">CLASS_RULE</a></pre>
 </li>
 </ul>
 </li>
@@ -243,7 +243,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockListLast">
 <li class="blockList">
 <h4>TestZKMainServer</h4>
-<pre>public&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/zookeeper/TestZKMainServer.html#line.36">TestZKMainServer</a>()</pre>
+<pre>public&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/zookeeper/TestZKMainServer.html#line.37">TestZKMainServer</a>()</pre>
 </li>
 </ul>
 </li>
@@ -260,7 +260,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>testCommandLineWorks</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/zookeeper/TestZKMainServer.html#line.75">testCommandLineWorks</a>()
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/zookeeper/TestZKMainServer.html#line.76">testCommandLineWorks</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">We need delete of a znode to work at least.</div>
 <dl>
@@ -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>testHostPortParse</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/zookeeper/TestZKMainServer.html#line.103">testHostPortParse</a>()</pre>
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/zookeeper/TestZKMainServer.html#line.104">testHostPortParse</a>()</pre>
 </li>
 </ul>
 </li>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/27f5bfb5/testdevapidocs/overview-tree.html
----------------------------------------------------------------------
diff --git a/testdevapidocs/overview-tree.html b/testdevapidocs/overview-tree.html
index e2d2d2c..0f516c9 100644
--- a/testdevapidocs/overview-tree.html
+++ b/testdevapidocs/overview-tree.html
@@ -1768,6 +1768,7 @@
 <li type="circle">org.apache.hadoop.hbase.procedure2.<a href="org/apache/hadoop/hbase/procedure2/TestProcedureBypass.RootProcedure.html" title="class in org.apache.hadoop.hbase.procedure2"><span class="typeNameLink">TestProcedureBypass.RootProcedure</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.procedure2.<a href="org/apache/hadoop/hbase/procedure2/TestProcedureBypass.StuckProcedure.html" title="class in org.apache.hadoop.hbase.procedure2"><span class="typeNameLink">TestProcedureBypass.StuckProcedure</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.procedure2.<a href="org/apache/hadoop/hbase/procedure2/TestProcedureBypass.SuspendProcedure.html" title="class in org.apache.hadoop.hbase.procedure2"><span class="typeNameLink">TestProcedureBypass.SuspendProcedure</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.procedure2.<a href="org/apache/hadoop/hbase/procedure2/TestProcedureBypass.WaitingTimeoutProcedure.html" title="class in org.apache.hadoop.hbase.procedure2"><span class="typeNameLink">TestProcedureBypass.WaitingTimeoutProcedure</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.procedure2.<a href="org/apache/hadoop/hbase/procedure2/TestProcedureCleanup.ExchangeProcedure.html" title="class in org.apache.hadoop.hbase.procedure2"><span class="typeNameLink">TestProcedureCleanup.ExchangeProcedure</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.procedure2.<a href="org/apache/hadoop/hbase/procedure2/TestProcedureCleanup.RootProcedure.html" title="class in org.apache.hadoop.hbase.procedure2"><span class="typeNameLink">TestProcedureCleanup.RootProcedure</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.procedure2.<a href="org/apache/hadoop/hbase/procedure2/TestProcedureCleanup.SuspendProcedure.html" title="class in org.apache.hadoop.hbase.procedure2"><span class="typeNameLink">TestProcedureCleanup.SuspendProcedure</span></a></li>


[25/29] hbase-site git commit: Published site at 5e84997f2ffdbcf5f849d70c30ddbe2db4039ca4.

Posted by gi...@apache.org.
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/27f5bfb5/dependency-info.html
----------------------------------------------------------------------
diff --git a/dependency-info.html b/dependency-info.html
index f0af957..c6c7f71 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="20181109" />
+    <meta name="Date-Revision-yyyymmdd" content="20181110" />
     <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-11-09</li>
+                  <li id="publishDate" class="pull-right">Last Published: 2018-11-10</li>
             </p>
                 </div>
 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/27f5bfb5/dependency-management.html
----------------------------------------------------------------------
diff --git a/dependency-management.html b/dependency-management.html
index 132517c..eb5391c 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="20181109" />
+    <meta name="Date-Revision-yyyymmdd" content="20181110" />
     <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" />
@@ -352,510 +352,516 @@
 <td>jar</td>
 <td><a class="externalLink" href="http://www.apache.org/licenses/LICENSE-2.0.txt">The Apache Software License, Version 2.0</a></td></tr>
 <tr class="b">
+<td>commons-validator</td>
+<td><a class="externalLink" href="http://commons.apache.org/proper/commons-validator/">commons-validator</a></td>
+<td>1.6</td>
+<td>jar</td>
+<td><a class="externalLink" href="https://www.apache.org/licenses/LICENSE-2.0.txt">Apache License, Version 2.0</a></td></tr>
+<tr class="a">
 <td>io.dropwizard.metrics</td>
 <td><a class="externalLink" href="http://metrics.codahale.com/metrics-core/">metrics-core</a></td>
 <td>3.2.1</td>
 <td>jar</td>
 <td><a class="externalLink" href="http://www.apache.org/licenses/LICENSE-2.0.html">Apache License 2.0</a></td></tr>
-<tr class="a">
+<tr class="b">
 <td>javax.servlet</td>
 <td><a class="externalLink" href="http://servlet-spec.java.net">javax.servlet-api</a></td>
 <td>3.1.0</td>
 <td>jar</td>
 <td><a class="externalLink" href="https://glassfish.dev.java.net/nonav/public/CDDL+GPL.html">CDDL + GPLv2 with classpath exception</a></td></tr>
-<tr class="b">
+<tr class="a">
 <td>javax.servlet.jsp</td>
 <td><a class="externalLink" href="http://jsp.java.net">javax.servlet.jsp-api</a></td>
 <td>2.3.1</td>
 <td>jar</td>
 <td><a class="externalLink" href="http://glassfish.dev.java.net/nonav/public/CDDL+GPL.html">CDDL + GPLv2 with classpath exception</a></td></tr>
-<tr class="a">
+<tr class="b">
 <td>javax.ws.rs</td>
 <td><a class="externalLink" href="http://jax-rs-spec.java.net">javax.ws.rs-api</a></td>
 <td>2.0.1</td>
 <td>jar</td>
 <td><a class="externalLink" href="http://glassfish.java.net/public/CDDL+GPL_1_1.html">CDDL 1.1</a>, <a class="externalLink" href="http://glassfish.java.net/public/CDDL+GPL_1_1.html">GPL2 w/ CPE</a></td></tr>
-<tr class="b">
+<tr class="a">
 <td>javax.xml.bind</td>
 <td><a class="externalLink" href="http://jaxb.java.net/">jaxb-api</a></td>
 <td>2.2.12</td>
 <td>jar</td>
 <td><a class="externalLink" href="https://glassfish.java.net/public/CDDL+GPL_1_1.html">CDDL 1.1</a>, <a class="externalLink" href="https://glassfish.java.net/public/CDDL+GPL_1_1.html">GPL2 w/ CPE</a></td></tr>
-<tr class="a">
+<tr class="b">
 <td>jline</td>
 <td><a class="externalLink" href="http://jline.sourceforge.net">jline</a></td>
 <td>0.9.94</td>
 <td>jar</td>
 <td>LICENSE.txt</td></tr>
-<tr class="b">
+<tr class="a">
 <td>junit</td>
 <td><a class="externalLink" href="http://junit.org">junit</a></td>
 <td>4.12</td>
 <td>jar</td>
 <td><a class="externalLink" href="http://www.eclipse.org/legal/epl-v10.html">Eclipse Public License 1.0</a></td></tr>
-<tr class="a">
+<tr class="b">
 <td>log4j</td>
 <td><a class="externalLink" href="http://logging.apache.org/log4j/1.2/">log4j</a></td>
 <td>1.2.17</td>
 <td>jar</td>
 <td><a class="externalLink" href="http://www.apache.org/licenses/LICENSE-2.0.txt">The Apache Software License, Version 2.0</a></td></tr>
-<tr class="b">
+<tr class="a">
 <td>net.spy</td>
 <td><a class="externalLink" href="http://www.couchbase.org/code/couchbase/java">spymemcached</a></td>
 <td>2.12.2</td>
 <td>jar</td>
 <td><a class="externalLink" href="http://www.apache.org/licenses/LICENSE-2.0.txt">The Apache Software License, Version 2.0</a></td></tr>
-<tr class="a">
+<tr class="b">
 <td>org.apache.avro</td>
 <td><a class="externalLink" href="http://avro.apache.org">avro</a></td>
 <td>1.7.7</td>
 <td>jar</td>
 <td><a class="externalLink" href="http://www.apache.org/licenses/LICENSE-2.0.txt">The Apache Software License, Version 2.0</a></td></tr>
-<tr class="b">
+<tr class="a">
 <td>org.apache.commons</td>
 <td><a class="externalLink" href="http://commons.apache.org/proper/commons-crypto/">commons-crypto</a></td>
 <td>1.0.0</td>
 <td>jar</td>
 <td><a class="externalLink" href="http://www.apache.org/licenses/LICENSE-2.0.txt">Apache License, Version 2.0</a></td></tr>
-<tr class="a">
+<tr class="b">
 <td>org.apache.commons</td>
 <td><a class="externalLink" href="http://commons.apache.org/proper/commons-lang/">commons-lang3</a></td>
 <td>3.6</td>
 <td>jar</td>
 <td><a class="externalLink" href="https://www.apache.org/licenses/LICENSE-2.0.txt">Apache License, Version 2.0</a></td></tr>
-<tr class="b">
+<tr class="a">
 <td>org.apache.commons</td>
 <td><a class="externalLink" href="http://commons.apache.org/proper/commons-math/">commons-math3</a></td>
 <td>3.6.1</td>
 <td>jar</td>
 <td><a class="externalLink" href="http://www.apache.org/licenses/LICENSE-2.0.txt">Apache License, Version 2.0</a></td></tr>
-<tr class="a">
+<tr class="b">
 <td>org.apache.curator</td>
 <td><a class="externalLink" href="http://curator.apache.org/curator-client">curator-client</a></td>
 <td>4.0.0</td>
 <td>jar</td>
 <td><a class="externalLink" href="http://www.apache.org/licenses/LICENSE-2.0.txt">The Apache Software License, Version 2.0</a></td></tr>
-<tr class="b">
+<tr class="a">
 <td>org.apache.curator</td>
 <td><a class="externalLink" href="http://curator.apache.org/curator-framework">curator-framework</a></td>
 <td>4.0.0</td>
 <td>jar</td>
 <td><a class="externalLink" href="http://www.apache.org/licenses/LICENSE-2.0.txt">The Apache Software License, Version 2.0</a></td></tr>
-<tr class="a">
+<tr class="b">
 <td>org.apache.curator</td>
 <td><a class="externalLink" href="http://curator.apache.org/curator-recipes">curator-recipes</a></td>
 <td>4.0.0</td>
 <td>jar</td>
 <td><a class="externalLink" href="http://www.apache.org/licenses/LICENSE-2.0.txt">The Apache Software License, Version 2.0</a></td></tr>
-<tr class="b">
+<tr class="a">
 <td>org.apache.hadoop</td>
 <td>hadoop-auth</td>
 <td>2.7.7</td>
 <td>jar</td>
 <td><a class="externalLink" href="http://www.apache.org/licenses/LICENSE-2.0.txt">Apache License, Version 2.0</a></td></tr>
-<tr class="a">
+<tr class="b">
 <td>org.apache.hadoop</td>
 <td>hadoop-client</td>
 <td>2.7.7</td>
 <td>jar</td>
 <td><a class="externalLink" href="http://www.apache.org/licenses/LICENSE-2.0.txt">Apache License, Version 2.0</a></td></tr>
-<tr class="b">
+<tr class="a">
 <td>org.apache.hadoop</td>
 <td>hadoop-common</td>
 <td>2.7.7</td>
 <td>jar</td>
 <td><a class="externalLink" href="http://www.apache.org/licenses/LICENSE-2.0.txt">Apache License, Version 2.0</a></td></tr>
-<tr class="a">
+<tr class="b">
 <td>org.apache.hadoop</td>
 <td>hadoop-hdfs</td>
 <td>2.7.7</td>
 <td>jar</td>
 <td><a class="externalLink" href="http://www.apache.org/licenses/LICENSE-2.0.txt">Apache License, Version 2.0</a></td></tr>
-<tr class="b">
+<tr class="a">
 <td>org.apache.hadoop</td>
 <td>hadoop-mapreduce-client-core</td>
 <td>2.7.7</td>
 <td>jar</td>
 <td><a class="externalLink" href="http://www.apache.org/licenses/LICENSE-2.0.txt">Apache License, Version 2.0</a></td></tr>
-<tr class="a">
+<tr class="b">
 <td>org.apache.hadoop</td>
 <td>hadoop-mapreduce-client-jobclient</td>
 <td>2.7.7</td>
 <td>jar</td>
 <td><a class="externalLink" href="http://www.apache.org/licenses/LICENSE-2.0.txt">Apache License, Version 2.0</a></td></tr>
-<tr class="b">
+<tr class="a">
 <td>org.apache.hadoop</td>
 <td>hadoop-minicluster</td>
 <td>2.7.7</td>
 <td>jar</td>
 <td><a class="externalLink" href="http://www.apache.org/licenses/LICENSE-2.0.txt">Apache License, Version 2.0</a></td></tr>
-<tr class="a">
+<tr class="b">
 <td>org.apache.hbase</td>
 <td><a class="externalLink" href="http://hbase.apache.org/hbase-annotations">hbase-annotations</a></td>
 <td>3.0.0-SNAPSHOT</td>
 <td>test-jar</td>
 <td><a class="externalLink" href="https://www.apache.org/licenses/LICENSE-2.0.txt">Apache License, Version 2.0</a></td></tr>
-<tr class="b">
+<tr class="a">
 <td>org.apache.hbase</td>
 <td><a class="externalLink" href="http://hbase.apache.org/hbase-build-configuration/hbase-backup">hbase-backup</a></td>
 <td>3.0.0-SNAPSHOT</td>
 <td>jar</td>
 <td><a class="externalLink" href="https://www.apache.org/licenses/LICENSE-2.0.txt">Apache License, Version 2.0</a></td></tr>
-<tr class="a">
+<tr class="b">
 <td>org.apache.hbase</td>
 <td><a class="externalLink" href="http://hbase.apache.org/hbase-build-configuration/hbase-client">hbase-client</a></td>
 <td>3.0.0-SNAPSHOT</td>
 <td>jar</td>
 <td><a class="externalLink" href="https://www.apache.org/licenses/LICENSE-2.0.txt">Apache License, Version 2.0</a></td></tr>
-<tr class="b">
+<tr class="a">
 <td>org.apache.hbase</td>
 <td><a class="externalLink" href="http://hbase.apache.org/hbase-build-configuration/hbase-common">hbase-common</a></td>
 <td>3.0.0-SNAPSHOT</td>
 <td>jar</td>
 <td><a class="externalLink" href="https://www.apache.org/licenses/LICENSE-2.0.txt">Apache License, Version 2.0</a></td></tr>
-<tr class="a">
+<tr class="b">
 <td>org.apache.hbase</td>
 <td><a class="externalLink" href="http://hbase.apache.org/hbase-build-configuration/hbase-endpoint">hbase-endpoint</a></td>
 <td>3.0.0-SNAPSHOT</td>
 <td>jar</td>
 <td><a class="externalLink" href="https://www.apache.org/licenses/LICENSE-2.0.txt">Apache License, Version 2.0</a></td></tr>
-<tr class="b">
+<tr class="a">
 <td>org.apache.hbase</td>
 <td><a class="externalLink" href="http://hbase.apache.org/hbase-build-support/hbase-error-prone">hbase-error-prone</a></td>
 <td>3.0.0-SNAPSHOT</td>
 <td>jar</td>
 <td><a class="externalLink" href="https://www.apache.org/licenses/LICENSE-2.0.txt">Apache License, Version 2.0</a></td></tr>
-<tr class="a">
+<tr class="b">
 <td>org.apache.hbase</td>
 <td><a class="externalLink" href="http://hbase.apache.org/hbase-build-configuration/hbase-examples">hbase-examples</a></td>
 <td>3.0.0-SNAPSHOT</td>
 <td>jar</td>
 <td><a class="externalLink" href="https://www.apache.org/licenses/LICENSE-2.0.txt">Apache License, Version 2.0</a></td></tr>
-<tr class="b">
+<tr class="a">
 <td>org.apache.hbase</td>
 <td><a class="externalLink" href="http://hbase.apache.org/hbase-build-configuration/hbase-external-blockcache">hbase-external-blockcache</a></td>
 <td>3.0.0-SNAPSHOT</td>
 <td>jar</td>
 <td><a class="externalLink" href="https://www.apache.org/licenses/LICENSE-2.0.txt">Apache License, Version 2.0</a></td></tr>
-<tr class="a">
+<tr class="b">
 <td>org.apache.hbase</td>
 <td><a class="externalLink" href="http://hbase.apache.org/hbase-build-configuration/hbase-hadoop-compat">hbase-hadoop-compat</a></td>
 <td>3.0.0-SNAPSHOT</td>
 <td>jar</td>
 <td><a class="externalLink" href="https://www.apache.org/licenses/LICENSE-2.0.txt">Apache License, Version 2.0</a></td></tr>
-<tr class="b">
+<tr class="a">
 <td>org.apache.hbase</td>
 <td><a class="externalLink" href="http://hbase.apache.org/hbase-build-configuration/hbase-hadoop2-compat">hbase-hadoop2-compat</a></td>
 <td>3.0.0-SNAPSHOT</td>
 <td>jar</td>
 <td><a class="externalLink" href="https://www.apache.org/licenses/LICENSE-2.0.txt">Apache License, Version 2.0</a></td></tr>
-<tr class="a">
+<tr class="b">
 <td>org.apache.hbase</td>
 <td><a class="externalLink" href="http://hbase.apache.org/hbase-build-configuration/hbase-http">hbase-http</a></td>
 <td>3.0.0-SNAPSHOT</td>
 <td>jar</td>
 <td><a class="externalLink" href="https://www.apache.org/licenses/LICENSE-2.0.txt">Apache License, Version 2.0</a></td></tr>
-<tr class="b">
+<tr class="a">
 <td>org.apache.hbase</td>
 <td><a class="externalLink" href="http://hbase.apache.org/hbase-build-configuration/hbase-mapreduce">hbase-mapreduce</a></td>
 <td>3.0.0-SNAPSHOT</td>
 <td>jar</td>
 <td><a class="externalLink" href="https://www.apache.org/licenses/LICENSE-2.0.txt">Apache License, Version 2.0</a></td></tr>
-<tr class="a">
+<tr class="b">
 <td>org.apache.hbase</td>
 <td><a class="externalLink" href="http://hbase.apache.org/hbase-build-configuration/hbase-metrics">hbase-metrics</a></td>
 <td>3.0.0-SNAPSHOT</td>
 <td>jar</td>
 <td><a class="externalLink" href="https://www.apache.org/licenses/LICENSE-2.0.txt">Apache License, Version 2.0</a></td></tr>
-<tr class="b">
+<tr class="a">
 <td>org.apache.hbase</td>
 <td><a class="externalLink" href="http://hbase.apache.org/hbase-build-configuration/hbase-metrics-api">hbase-metrics-api</a></td>
 <td>3.0.0-SNAPSHOT</td>
 <td>jar</td>
 <td><a class="externalLink" href="https://www.apache.org/licenses/LICENSE-2.0.txt">Apache License, Version 2.0</a></td></tr>
-<tr class="a">
+<tr class="b">
 <td>org.apache.hbase</td>
 <td><a class="externalLink" href="http://hbase.apache.org/hbase-build-configuration/hbase-procedure">hbase-procedure</a></td>
 <td>3.0.0-SNAPSHOT</td>
 <td>jar</td>
 <td><a class="externalLink" href="https://www.apache.org/licenses/LICENSE-2.0.txt">Apache License, Version 2.0</a></td></tr>
-<tr class="b">
+<tr class="a">
 <td>org.apache.hbase</td>
 <td><a class="externalLink" href="http://hbase.apache.org/hbase-build-configuration/hbase-procedure">hbase-procedure</a></td>
 <td>3.0.0-SNAPSHOT</td>
 <td>test-jar</td>
 <td><a class="externalLink" href="https://www.apache.org/licenses/LICENSE-2.0.txt">Apache License, Version 2.0</a></td></tr>
-<tr class="a">
+<tr class="b">
 <td>org.apache.hbase</td>
 <td><a class="externalLink" href="http://hbase.apache.org/hbase-build-configuration/hbase-protocol">hbase-protocol</a></td>
 <td>3.0.0-SNAPSHOT</td>
 <td>jar</td>
 <td><a class="externalLink" href="https://www.apache.org/licenses/LICENSE-2.0.txt">Apache License, Version 2.0</a></td></tr>
-<tr class="b">
+<tr class="a">
 <td>org.apache.hbase</td>
 <td><a class="externalLink" href="http://hbase.apache.org/hbase-build-configuration/hbase-protocol-shaded">hbase-protocol-shaded</a></td>
 <td>3.0.0-SNAPSHOT</td>
 <td>jar</td>
 <td><a class="externalLink" href="https://www.apache.org/licenses/LICENSE-2.0.txt">Apache License, Version 2.0</a></td></tr>
-<tr class="a">
+<tr class="b">
 <td>org.apache.hbase</td>
 <td><a class="externalLink" href="http://hbase.apache.org/hbase-build-configuration/hbase-replication">hbase-replication</a></td>
 <td>3.0.0-SNAPSHOT</td>
 <td>jar</td>
 <td><a class="externalLink" href="https://www.apache.org/licenses/LICENSE-2.0.txt">Apache License, Version 2.0</a></td></tr>
-<tr class="b">
+<tr class="a">
 <td>org.apache.hbase</td>
 <td><a class="externalLink" href="http://hbase.apache.org/hbase-build-configuration/hbase-resource-bundle">hbase-resource-bundle</a></td>
 <td>3.0.0-SNAPSHOT</td>
 <td>jar</td>
 <td><a class="externalLink" href="https://www.apache.org/licenses/LICENSE-2.0.txt">Apache License, Version 2.0</a></td></tr>
-<tr class="a">
+<tr class="b">
 <td>org.apache.hbase</td>
 <td><a class="externalLink" href="http://hbase.apache.org/hbase-build-configuration/hbase-rest">hbase-rest</a></td>
 <td>3.0.0-SNAPSHOT</td>
 <td>jar</td>
 <td><a class="externalLink" href="https://www.apache.org/licenses/LICENSE-2.0.txt">Apache License, Version 2.0</a></td></tr>
-<tr class="b">
+<tr class="a">
 <td>org.apache.hbase</td>
 <td><a class="externalLink" href="http://hbase.apache.org/hbase-build-configuration/hbase-rsgroup">hbase-rsgroup</a></td>
 <td>3.0.0-SNAPSHOT</td>
 <td>jar</td>
 <td><a class="externalLink" href="https://www.apache.org/licenses/LICENSE-2.0.txt">Apache License, Version 2.0</a></td></tr>
-<tr class="a">
+<tr class="b">
 <td>org.apache.hbase</td>
 <td><a class="externalLink" href="http://hbase.apache.org/hbase-build-configuration/hbase-server">hbase-server</a></td>
 <td>3.0.0-SNAPSHOT</td>
 <td>jar</td>
 <td><a class="externalLink" href="https://www.apache.org/licenses/LICENSE-2.0.txt">Apache License, Version 2.0</a></td></tr>
-<tr class="b">
+<tr class="a">
 <td>org.apache.hbase</td>
 <td><a class="externalLink" href="http://hbase.apache.org/hbase-build-configuration/hbase-shaded/hbase-shaded-client">hbase-shaded-client</a></td>
 <td>3.0.0-SNAPSHOT</td>
 <td>jar</td>
 <td><a class="externalLink" href="https://www.apache.org/licenses/LICENSE-2.0.txt">Apache License, Version 2.0</a></td></tr>
-<tr class="a">
+<tr class="b">
 <td>org.apache.hbase</td>
 <td><a class="externalLink" href="http://hbase.apache.org/hbase-build-configuration/hbase-shaded/hbase-shaded-client-byo-hadoop">hbase-shaded-client-byo-hadoop</a></td>
 <td>3.0.0-SNAPSHOT</td>
 <td>jar</td>
 <td><a class="externalLink" href="https://www.apache.org/licenses/LICENSE-2.0.txt">Apache License, Version 2.0</a></td></tr>
-<tr class="b">
+<tr class="a">
 <td>org.apache.hbase</td>
 <td><a class="externalLink" href="http://hbase.apache.org/hbase-build-configuration/hbase-shaded/hbase-shaded-mapreduce">hbase-shaded-mapreduce</a></td>
 <td>3.0.0-SNAPSHOT</td>
 <td>jar</td>
 <td><a class="externalLink" href="https://www.apache.org/licenses/LICENSE-2.0.txt">Apache License, Version 2.0</a></td></tr>
-<tr class="a">
+<tr class="b">
 <td>org.apache.hbase</td>
 <td><a class="externalLink" href="http://hbase.apache.org/hbase-build-configuration/hbase-shell">hbase-shell</a></td>
 <td>3.0.0-SNAPSHOT</td>
 <td>jar</td>
 <td><a class="externalLink" href="https://www.apache.org/licenses/LICENSE-2.0.txt">Apache License, Version 2.0</a></td></tr>
-<tr class="b">
+<tr class="a">
 <td>org.apache.hbase</td>
 <td><a class="externalLink" href="http://hbase.apache.org/hbase-build-configuration/hbase-thrift">hbase-thrift</a></td>
 <td>3.0.0-SNAPSHOT</td>
 <td>jar</td>
 <td><a class="externalLink" href="https://www.apache.org/licenses/LICENSE-2.0.txt">Apache License, Version 2.0</a></td></tr>
-<tr class="a">
+<tr class="b">
 <td>org.apache.hbase</td>
 <td><a class="externalLink" href="http://hbase.apache.org/hbase-build-configuration/hbase-zookeeper">hbase-zookeeper</a></td>
 <td>3.0.0-SNAPSHOT</td>
 <td>jar</td>
 <td><a class="externalLink" href="https://www.apache.org/licenses/LICENSE-2.0.txt">Apache License, Version 2.0</a></td></tr>
-<tr class="b">
+<tr class="a">
 <td>org.apache.hbase.thirdparty</td>
 <td><a class="externalLink" href="http://hbase.apache.org/hbase-shaded-miscellaneous">hbase-shaded-miscellaneous</a></td>
 <td>2.1.0</td>
 <td>jar</td>
 <td><a class="externalLink" href="https://www.apache.org/licenses/LICENSE-2.0.txt">Apache License, Version 2.0</a></td></tr>
-<tr class="a">
+<tr class="b">
 <td>org.apache.hbase.thirdparty</td>
 <td><a class="externalLink" href="http://hbase.apache.org/hbase-shaded-netty">hbase-shaded-netty</a></td>
 <td>2.1.0</td>
 <td>jar</td>
 <td><a class="externalLink" href="https://www.apache.org/licenses/LICENSE-2.0.txt">Apache License, Version 2.0</a></td></tr>
-<tr class="b">
+<tr class="a">
 <td>org.apache.hbase.thirdparty</td>
 <td><a class="externalLink" href="http://hbase.apache.org/hbase-shaded-protobuf">hbase-shaded-protobuf</a></td>
 <td>2.1.0</td>
 <td>jar</td>
 <td><a class="externalLink" href="https://www.apache.org/licenses/LICENSE-2.0.txt">Apache License, Version 2.0</a></td></tr>
-<tr class="a">
+<tr class="b">
 <td>org.apache.htrace</td>
 <td><a class="externalLink" href="http://incubator.apache.org/projects/htrace.html">htrace-core4</a></td>
 <td>4.2.0-incubating</td>
 <td>jar</td>
 <td><a class="externalLink" href="http://www.apache.org/licenses/LICENSE-2.0.txt">Apache License, Version 2.0</a></td></tr>
-<tr class="b">
+<tr class="a">
 <td>org.apache.httpcomponents</td>
 <td><a class="externalLink" href="http://hc.apache.org/httpcomponents-client">httpclient</a></td>
 <td>4.5.3</td>
 <td>jar</td>
 <td><a class="externalLink" href="http://www.apache.org/licenses/LICENSE-2.0.txt">Apache License, Version 2.0</a></td></tr>
-<tr class="a">
+<tr class="b">
 <td>org.apache.httpcomponents</td>
 <td><a class="externalLink" href="http://hc.apache.org/httpcomponents-core-ga">httpcore</a></td>
 <td>4.4.6</td>
 <td>jar</td>
 <td><a class="externalLink" href="http://www.apache.org/licenses/LICENSE-2.0.txt">Apache License, Version 2.0</a></td></tr>
-<tr class="b">
+<tr class="a">
 <td>org.apache.kerby</td>
 <td><a class="externalLink" href="http://directory.apache.org/kerby/kerby-kerb/kerb-client">kerb-client</a></td>
 <td>1.0.1</td>
 <td>jar</td>
 <td><a class="externalLink" href="https://www.apache.org/licenses/LICENSE-2.0.txt">Apache License, Version 2.0</a></td></tr>
-<tr class="a">
+<tr class="b">
 <td>org.apache.kerby</td>
 <td><a class="externalLink" href="http://directory.apache.org/kerby/kerby-kerb/kerb-core">kerb-core</a></td>
 <td>1.0.1</td>
 <td>jar</td>
 <td><a class="externalLink" href="https://www.apache.org/licenses/LICENSE-2.0.txt">Apache License, Version 2.0</a></td></tr>
-<tr class="b">
+<tr class="a">
 <td>org.apache.kerby</td>
 <td><a class="externalLink" href="http://directory.apache.org/kerby/kerby-kerb/kerb-simplekdc">kerb-simplekdc</a></td>
 <td>1.0.1</td>
 <td>jar</td>
 <td><a class="externalLink" href="https://www.apache.org/licenses/LICENSE-2.0.txt">Apache License, Version 2.0</a></td></tr>
-<tr class="a">
+<tr class="b">
 <td>org.apache.thrift</td>
 <td><a class="externalLink" href="http://thrift.apache.org">libthrift</a></td>
 <td>0.9.3</td>
 <td>jar</td>
 <td><a class="externalLink" href="http://www.apache.org/licenses/LICENSE-2.0.txt">The Apache Software License, Version 2.0</a></td></tr>
-<tr class="b">
+<tr class="a">
 <td>org.apache.yetus</td>
 <td><a class="externalLink" href="https://yetus.apache.org/audience-annotations">audience-annotations</a></td>
 <td>0.5.0</td>
 <td>jar</td>
 <td><a class="externalLink" href="http://www.apache.org/licenses/LICENSE-2.0.txt">Apache License, Version 2.0</a></td></tr>
-<tr class="a">
+<tr class="b">
 <td>org.apache.zookeeper</td>
 <td>zookeeper</td>
 <td>3.4.10</td>
 <td>jar</td>
 <td><a class="externalLink" href="http://www.apache.org/licenses/LICENSE-2.0.txt">The Apache Software License, Version 2.0</a></td></tr>
-<tr class="b">
+<tr class="a">
 <td>org.codehaus.jettison</td>
 <td><a class="externalLink" href="https://github.com/jettison-json/jettison">jettison</a></td>
 <td>1.3.8</td>
 <td>jar</td>
 <td><a class="externalLink" href="http://www.apache.org/licenses/LICENSE-2.0">Apache License, Version 2.0</a></td></tr>
-<tr class="a">
+<tr class="b">
 <td>org.eclipse.jetty</td>
 <td><a class="externalLink" href="http://www.eclipse.org/jetty">jetty-http</a></td>
 <td>9.3.25.v20180904</td>
 <td>jar</td>
 <td><a class="externalLink" href="http://www.apache.org/licenses/LICENSE-2.0">Apache Software License - Version 2.0</a>, <a class="externalLink" href="http://www.eclipse.org/org/documents/epl-v10.php">Eclipse Public License - Version 1.0</a></td></tr>
-<tr class="b">
+<tr class="a">
 <td>org.eclipse.jetty</td>
 <td><a class="externalLink" href="http://www.eclipse.org/jetty">jetty-io</a></td>
 <td>9.3.25.v20180904</td>
 <td>jar</td>
 <td><a class="externalLink" href="http://www.apache.org/licenses/LICENSE-2.0">Apache Software License - Version 2.0</a>, <a class="externalLink" href="http://www.eclipse.org/org/documents/epl-v10.php">Eclipse Public License - Version 1.0</a></td></tr>
-<tr class="a">
+<tr class="b">
 <td>org.eclipse.jetty</td>
 <td><a class="externalLink" href="http://www.eclipse.org/jetty">jetty-jmx</a></td>
 <td>9.3.25.v20180904</td>
 <td>jar</td>
 <td><a class="externalLink" href="http://www.apache.org/licenses/LICENSE-2.0">Apache Software License - Version 2.0</a>, <a class="externalLink" href="http://www.eclipse.org/org/documents/epl-v10.php">Eclipse Public License - Version 1.0</a></td></tr>
-<tr class="b">
+<tr class="a">
 <td>org.eclipse.jetty</td>
 <td><a class="externalLink" href="http://www.eclipse.org/jetty">jetty-security</a></td>
 <td>9.3.25.v20180904</td>
 <td>jar</td>
 <td><a class="externalLink" href="http://www.apache.org/licenses/LICENSE-2.0">Apache Software License - Version 2.0</a>, <a class="externalLink" href="http://www.eclipse.org/org/documents/epl-v10.php">Eclipse Public License - Version 1.0</a></td></tr>
-<tr class="a">
+<tr class="b">
 <td>org.eclipse.jetty</td>
 <td><a class="externalLink" href="http://www.eclipse.org/jetty">jetty-server</a></td>
 <td>9.3.25.v20180904</td>
 <td>jar</td>
 <td><a class="externalLink" href="http://www.apache.org/licenses/LICENSE-2.0">Apache Software License - Version 2.0</a>, <a class="externalLink" href="http://www.eclipse.org/org/documents/epl-v10.php">Eclipse Public License - Version 1.0</a></td></tr>
-<tr class="b">
+<tr class="a">
 <td>org.eclipse.jetty</td>
 <td><a class="externalLink" href="http://www.eclipse.org/jetty">jetty-servlet</a></td>
 <td>9.3.25.v20180904</td>
 <td>jar</td>
 <td><a class="externalLink" href="http://www.apache.org/licenses/LICENSE-2.0">Apache Software License - Version 2.0</a>, <a class="externalLink" href="http://www.eclipse.org/org/documents/epl-v10.php">Eclipse Public License - Version 1.0</a></td></tr>
-<tr class="a">
+<tr class="b">
 <td>org.eclipse.jetty</td>
 <td><a class="externalLink" href="http://www.eclipse.org/jetty">jetty-util</a></td>
 <td>9.3.25.v20180904</td>
 <td>jar</td>
 <td><a class="externalLink" href="http://www.apache.org/licenses/LICENSE-2.0">Apache Software License - Version 2.0</a>, <a class="externalLink" href="http://www.eclipse.org/org/documents/epl-v10.php">Eclipse Public License - Version 1.0</a></td></tr>
-<tr class="b">
+<tr class="a">
 <td>org.eclipse.jetty</td>
 <td><a class="externalLink" href="http://www.eclipse.org/jetty">jetty-util-ajax</a></td>
 <td>9.3.25.v20180904</td>
 <td>jar</td>
 <td><a class="externalLink" href="http://www.apache.org/licenses/LICENSE-2.0">Apache Software License - Version 2.0</a>, <a class="externalLink" href="http://www.eclipse.org/org/documents/epl-v10.php">Eclipse Public License - Version 1.0</a></td></tr>
-<tr class="a">
+<tr class="b">
 <td>org.eclipse.jetty</td>
 <td><a class="externalLink" href="http://www.eclipse.org/jetty">jetty-webapp</a></td>
 <td>9.3.25.v20180904</td>
 <td>jar</td>
 <td><a class="externalLink" href="http://www.apache.org/licenses/LICENSE-2.0">Apache Software License - Version 2.0</a>, <a class="externalLink" href="http://www.eclipse.org/org/documents/epl-v10.php">Eclipse Public License - Version 1.0</a></td></tr>
-<tr class="b">
+<tr class="a">
 <td>org.glassfish</td>
 <td><a class="externalLink" href="http://uel.java.net">javax.el</a></td>
 <td>3.0.1-b08</td>
 <td>jar</td>
 <td><a class="externalLink" href="https://glassfish.dev.java.net/nonav/public/CDDL+GPL.html">CDDL + GPLv2 with classpath exception</a></td></tr>
-<tr class="a">
+<tr class="b">
 <td>org.glassfish.jersey.containers</td>
 <td><a class="externalLink" href="https://jersey.java.net/project/jersey-container-servlet-core/">jersey-container-servlet-core</a></td>
 <td>2.25.1</td>
 <td>jar</td>
 <td><a class="externalLink" href="http://glassfish.java.net/public/CDDL+GPL_1_1.html">CDDL+GPL License</a></td></tr>
-<tr class="b">
+<tr class="a">
 <td>org.glassfish.jersey.core</td>
 <td><a class="externalLink" href="https://jersey.java.net/jersey-client/">jersey-client</a></td>
 <td>2.25.1</td>
 <td>jar</td>
 <td><a class="externalLink" href="http://glassfish.java.net/public/CDDL+GPL_1_1.html">CDDL+GPL License</a></td></tr>
-<tr class="a">
+<tr class="b">
 <td>org.glassfish.jersey.core</td>
 <td><a class="externalLink" href="https://jersey.java.net/jersey-server/">jersey-server</a></td>
 <td>2.25.1</td>
 <td>jar</td>
 <td><a class="externalLink" href="http://glassfish.java.net/public/CDDL+GPL_1_1.html">CDDL+GPL License</a></td></tr>
-<tr class="b">
+<tr class="a">
 <td>org.glassfish.web</td>
 <td><a class="externalLink" href="http://jsp.java.net">javax.servlet.jsp</a></td>
 <td>2.3.2</td>
 <td>jar</td>
 <td><a class="externalLink" href="http://glassfish.dev.java.net/nonav/public/CDDL+GPL.html">CDDL + GPLv2 with classpath exception</a></td></tr>
-<tr class="a">
+<tr class="b">
 <td>org.jamon</td>
 <td><a class="externalLink" href="http://www.jamon.org/jamon-java-parent/jamon-runtime/">jamon-runtime</a></td>
 <td>2.4.1</td>
 <td>jar</td>
 <td><a class="externalLink" href="http://www.mozilla.org/MPL/2.0">Mozilla Public License Version 2.0</a></td></tr>
-<tr class="b">
+<tr class="a">
 <td>org.jruby</td>
 <td><a class="externalLink" href="https://github.com/jruby/jruby/jruby-artifacts/jruby-complete">jruby-complete</a></td>
 <td>9.1.13.0</td>
 <td>jar</td>
 <td><a class="externalLink" href="http://www.gnu.org/licenses/gpl-2.0-standalone.html">GPL 2</a>, <a class="externalLink" href="http://www.gnu.org/licenses/lgpl-2.1-standalone.html">LGPL 2.1</a>, <a class="externalLink" href="http://www.eclipse.org/legal/epl-v10.html">EPL</a></td></tr>
-<tr class="a">
+<tr class="b">
 <td>org.jruby.jcodings</td>
 <td><a class="externalLink" href="http://nexus.sonatype.org/oss-repository-hosting.html/jcodings">jcodings</a></td>
 <td>1.0.18</td>
 <td>jar</td>
 <td><a class="externalLink" href="http://www.opensource.org/licenses/mit-license.php">MIT License</a></td></tr>
-<tr class="b">
+<tr class="a">
 <td>org.jruby.joni</td>
 <td><a class="externalLink" href="http://nexus.sonatype.org/oss-repository-hosting.html/joni">joni</a></td>
 <td>2.1.11</td>
 <td>jar</td>
 <td><a class="externalLink" href="http://www.opensource.org/licenses/mit-license.php">MIT License</a></td></tr>
-<tr class="a">
+<tr class="b">
 <td>org.slf4j</td>
 <td><a class="externalLink" href="http://www.slf4j.org">slf4j-api</a></td>
 <td>1.7.25</td>
 <td>jar</td>
 <td><a class="externalLink" href="http://www.opensource.org/licenses/mit-license.php">MIT License</a></td></tr>
-<tr class="b">
+<tr class="a">
 <td>org.slf4j</td>
 <td><a class="externalLink" href="http://www.slf4j.org">slf4j-log4j12</a></td>
 <td>1.7.25</td>
@@ -1003,7 +1009,7 @@
                         <a href="https://www.apache.org/">The Apache Software Foundation</a>.
             All rights reserved.      
                     
-                  <li id="publishDate" class="pull-right">Last Published: 2018-11-09</li>
+                  <li id="publishDate" class="pull-right">Last Published: 2018-11-10</li>
             </p>
                 </div>
 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/27f5bfb5/devapidocs/constant-values.html
----------------------------------------------------------------------
diff --git a/devapidocs/constant-values.html b/devapidocs/constant-values.html
index 8dd569d..e087293 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>"Fri Nov  9 14:44:22 UTC 2018"</code></td>
+<td class="colLast"><code>"Sat Nov 10 14:42:20 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>"2006cc481839aabfb5ea846c19b440b9"</code></td>
+<td class="colLast"><code>"d1955f217a8fc07afafee2a3d8d27ec7"</code></td>
 </tr>
 <tr class="rowColor">
 <td class="colFirst"><a name="org.apache.hadoop.hbase.Version.url">

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/27f5bfb5/devapidocs/index-all.html
----------------------------------------------------------------------
diff --git a/devapidocs/index-all.html b/devapidocs/index-all.html
index 9b76024..dd24e0a 100644
--- a/devapidocs/index-all.html
+++ b/devapidocs/index-all.html
@@ -2636,7 +2636,7 @@
 <dd>
 <div class="block">Add the given context to the rolling tuner stats.</div>
 </dd>
-<dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/master/procedure/MasterProcedureScheduler.html#addToRunQueue-org.apache.hadoop.hbase.master.procedure.FairQueue-org.apache.hadoop.hbase.master.procedure.Queue-">addToRunQueue(FairQueue&lt;T&gt;, Queue&lt;T&gt;)</a></span> - Static method in class org.apache.hadoop.hbase.master.procedure.<a href="org/apache/hadoop/hbase/master/procedure/MasterProcedureScheduler.html" title="class in org.apache.hadoop.hbase.master.procedure">MasterProcedureScheduler</a></dt>
+<dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/master/procedure/MasterProcedureScheduler.html#addToRunQueue-org.apache.hadoop.hbase.master.procedure.FairQueue-org.apache.hadoop.hbase.master.procedure.Queue-java.util.function.Supplier-">addToRunQueue(FairQueue&lt;T&gt;, Queue&lt;T&gt;, Supplier&lt;String&gt;)</a></span> - Static method in class org.apache.hadoop.hbase.master.procedure.<a href="org/apache/hadoop/hbase/master/procedure/MasterProcedureScheduler.html" title="class in org.apache.hadoop.hbase.master.procedure">MasterProcedureScheduler</a></dt>
 <dd>&nbsp;</dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/regionserver/AbstractMemStore.html#addToScanners-java.util.List-long-java.util.List-">addToScanners(List&lt;? extends Segment&gt;, long, List&lt;KeyValueScanner&gt;)</a></span> - Static method in class org.apache.hadoop.hbase.regionserver.<a href="org/apache/hadoop/hbase/regionserver/AbstractMemStore.html" title="class in org.apache.hadoop.hbase.regionserver">AbstractMemStore</a></dt>
 <dd>&nbsp;</dd>
@@ -93115,7 +93115,7 @@ service.</div>
 <dd>&nbsp;</dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/master/assignment/RegionStates.html#removeFromOfflineRegions-org.apache.hadoop.hbase.client.RegionInfo-">removeFromOfflineRegions(RegionInfo)</a></span> - Method in class org.apache.hadoop.hbase.master.assignment.<a href="org/apache/hadoop/hbase/master/assignment/RegionStates.html" title="class in org.apache.hadoop.hbase.master.assignment">RegionStates</a></dt>
 <dd>&nbsp;</dd>
-<dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/master/procedure/MasterProcedureScheduler.html#removeFromRunQueue-org.apache.hadoop.hbase.master.procedure.FairQueue-org.apache.hadoop.hbase.master.procedure.Queue-">removeFromRunQueue(FairQueue&lt;T&gt;, Queue&lt;T&gt;)</a></span> - Static method in class org.apache.hadoop.hbase.master.procedure.<a href="org/apache/hadoop/hbase/master/procedure/MasterProcedureScheduler.html" title="class in org.apache.hadoop.hbase.master.procedure">MasterProcedureScheduler</a></dt>
+<dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/master/procedure/MasterProcedureScheduler.html#removeFromRunQueue-org.apache.hadoop.hbase.master.procedure.FairQueue-org.apache.hadoop.hbase.master.procedure.Queue-java.util.function.Supplier-">removeFromRunQueue(FairQueue&lt;T&gt;, Queue&lt;T&gt;, Supplier&lt;String&gt;)</a></span> - Static method in class org.apache.hadoop.hbase.master.procedure.<a href="org/apache/hadoop/hbase/master/procedure/MasterProcedureScheduler.html" title="class in org.apache.hadoop.hbase.master.procedure">MasterProcedureScheduler</a></dt>
 <dd>&nbsp;</dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/master/procedure/DeleteNamespaceProcedure.html#removeFromZKNamespaceManager-org.apache.hadoop.hbase.master.procedure.MasterProcedureEnv-java.lang.String-">removeFromZKNamespaceManager(MasterProcedureEnv, String)</a></span> - Static method in class org.apache.hadoop.hbase.master.procedure.<a href="org/apache/hadoop/hbase/master/procedure/DeleteNamespaceProcedure.html" title="class in org.apache.hadoop.hbase.master.procedure">DeleteNamespaceProcedure</a></dt>
 <dd>

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

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

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

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

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/27f5bfb5/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 10277ab..da5fdda 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.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/HFileBlock.Writer.State.html" title="enum in org.apache.hadoop.hbase.io.hfile"><span class="typeNameLink">HFileBlock.Writer.State</span></a></li>
-<li type="circle">org.apache.hadoop.hbase.io.hfile.<a href="../../../../../../org/apache/hadoop/hbase/io/hfile/CacheConfig.ExternalBlockCaches.html" title="enum in org.apache.hadoop.hbase.io.hfile"><span class="typeNameLink">CacheConfig.ExternalBlockCaches</span></a></li>
-<li type="circle">org.apache.hadoop.hbase.io.hfile.<a href="../../../../../../org/apache/hadoop/hbase/io/hfile/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/HFileBlock.Writer.State.html" title="enum in org.apache.hadoop.hbase.io.hfile"><span class="typeNameLink">HFileBlock.Writer.State</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.io.hfile.<a href="../../../../../../org/apache/hadoop/hbase/io/hfile/Cacheable.MemoryType.html" title="enum in org.apache.hadoop.hbase.io.hfile"><span class="typeNameLink">Cacheable.MemoryType</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.io.hfile.<a href="../../../../../../org/apache/hadoop/hbase/io/hfile/BlockType.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/CacheConfig.ExternalBlockCaches.html" title="enum in org.apache.hadoop.hbase.io.hfile"><span class="typeNameLink">CacheConfig.ExternalBlockCaches</span></a></li>
 </ul>
 </li>
 </ul>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/27f5bfb5/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..df0adf0 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/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>
 <li type="circle">org.apache.hadoop.hbase.ipc.<a href="../../../../../org/apache/hadoop/hbase/ipc/CallEvent.Type.html" title="enum in org.apache.hadoop.hbase.ipc"><span class="typeNameLink">CallEvent.Type</span></a></li>
-<li type="circle">org.apache.hadoop.hbase.ipc.<a href="../../../../../org/apache/hadoop/hbase/ipc/MetricsHBaseServerSourceFactoryImpl.SourceStorage.html" title="enum in org.apache.hadoop.hbase.ipc"><span class="typeNameLink">MetricsHBaseServerSourceFactoryImpl.SourceStorage</span></a></li>
 </ul>
 </li>
 </ul>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/27f5bfb5/devapidocs/org/apache/hadoop/hbase/mapreduce/CopyTable.html
----------------------------------------------------------------------
diff --git a/devapidocs/org/apache/hadoop/hbase/mapreduce/CopyTable.html b/devapidocs/org/apache/hadoop/hbase/mapreduce/CopyTable.html
index d34e7ae..14a0c98 100644
--- a/devapidocs/org/apache/hadoop/hbase/mapreduce/CopyTable.html
+++ b/devapidocs/org/apache/hadoop/hbase/mapreduce/CopyTable.html
@@ -119,7 +119,7 @@ var activeTableTab = "activeTableTab";
 <hr>
 <br>
 <pre>@InterfaceAudience.Public
-public class <a href="../../../../../src-html/org/apache/hadoop/hbase/mapreduce/CopyTable.html#line.51">CopyTable</a>
+public class <a href="../../../../../src-html/org/apache/hadoop/hbase/mapreduce/CopyTable.html#line.52">CopyTable</a>
 extends org.apache.hadoop.conf.Configured
 implements org.apache.hadoop.util.Tool</pre>
 <div class="block">Tool used to copy a table to another one which can be on a different setup.
@@ -313,7 +313,7 @@ implements org.apache.hadoop.util.Tool</pre>
 <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/mapreduce/CopyTable.html#line.52">LOG</a></pre>
+<pre>private static final&nbsp;org.slf4j.Logger <a href="../../../../../src-html/org/apache/hadoop/hbase/mapreduce/CopyTable.html#line.53">LOG</a></pre>
 </li>
 </ul>
 <a name="NAME">
@@ -322,7 +322,7 @@ implements org.apache.hadoop.util.Tool</pre>
 <ul class="blockList">
 <li class="blockList">
 <h4>NAME</h4>
-<pre>static final&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/mapreduce/CopyTable.html#line.54">NAME</a></pre>
+<pre>static final&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/mapreduce/CopyTable.html#line.55">NAME</a></pre>
 <dl>
 <dt><span class="seeLabel">See Also:</span></dt>
 <dd><a href="../../../../../constant-values.html#org.apache.hadoop.hbase.mapreduce.CopyTable.NAME">Constant Field Values</a></dd>
@@ -335,7 +335,7 @@ implements org.apache.hadoop.util.Tool</pre>
 <ul class="blockList">
 <li class="blockList">
 <h4>startTime</h4>
-<pre>long <a href="../../../../../src-html/org/apache/hadoop/hbase/mapreduce/CopyTable.html#line.55">startTime</a></pre>
+<pre>long <a href="../../../../../src-html/org/apache/hadoop/hbase/mapreduce/CopyTable.html#line.56">startTime</a></pre>
 </li>
 </ul>
 <a name="endTime">
@@ -344,7 +344,7 @@ implements org.apache.hadoop.util.Tool</pre>
 <ul class="blockList">
 <li class="blockList">
 <h4>endTime</h4>
-<pre>long <a href="../../../../../src-html/org/apache/hadoop/hbase/mapreduce/CopyTable.html#line.56">endTime</a></pre>
+<pre>long <a href="../../../../../src-html/org/apache/hadoop/hbase/mapreduce/CopyTable.html#line.57">endTime</a></pre>
 </li>
 </ul>
 <a name="batch">
@@ -353,7 +353,7 @@ implements org.apache.hadoop.util.Tool</pre>
 <ul class="blockList">
 <li class="blockList">
 <h4>batch</h4>
-<pre>int <a href="../../../../../src-html/org/apache/hadoop/hbase/mapreduce/CopyTable.html#line.57">batch</a></pre>
+<pre>int <a href="../../../../../src-html/org/apache/hadoop/hbase/mapreduce/CopyTable.html#line.58">batch</a></pre>
 </li>
 </ul>
 <a name="cacheRow">
@@ -362,7 +362,7 @@ implements org.apache.hadoop.util.Tool</pre>
 <ul class="blockList">
 <li class="blockList">
 <h4>cacheRow</h4>
-<pre>int <a href="../../../../../src-html/org/apache/hadoop/hbase/mapreduce/CopyTable.html#line.58">cacheRow</a></pre>
+<pre>int <a href="../../../../../src-html/org/apache/hadoop/hbase/mapreduce/CopyTable.html#line.59">cacheRow</a></pre>
 </li>
 </ul>
 <a name="versions">
@@ -371,7 +371,7 @@ implements org.apache.hadoop.util.Tool</pre>
 <ul class="blockList">
 <li class="blockList">
 <h4>versions</h4>
-<pre>int <a href="../../../../../src-html/org/apache/hadoop/hbase/mapreduce/CopyTable.html#line.59">versions</a></pre>
+<pre>int <a href="../../../../../src-html/org/apache/hadoop/hbase/mapreduce/CopyTable.html#line.60">versions</a></pre>
 </li>
 </ul>
 <a name="tableName">
@@ -380,7 +380,7 @@ implements org.apache.hadoop.util.Tool</pre>
 <ul class="blockList">
 <li class="blockList">
 <h4>tableName</h4>
-<pre><a href="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/mapreduce/CopyTable.html#line.60">tableName</a></pre>
+<pre><a href="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/mapreduce/CopyTable.html#line.61">tableName</a></pre>
 </li>
 </ul>
 <a name="startRow">
@@ -389,7 +389,7 @@ implements org.apache.hadoop.util.Tool</pre>
 <ul class="blockList">
 <li class="blockList">
 <h4>startRow</h4>
-<pre><a href="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/mapreduce/CopyTable.html#line.61">startRow</a></pre>
+<pre><a href="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/mapreduce/CopyTable.html#line.62">startRow</a></pre>
 </li>
 </ul>
 <a name="stopRow">
@@ -398,7 +398,7 @@ implements org.apache.hadoop.util.Tool</pre>
 <ul class="blockList">
 <li class="blockList">
 <h4>stopRow</h4>
-<pre><a href="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/mapreduce/CopyTable.html#line.62">stopRow</a></pre>
+<pre><a href="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/mapreduce/CopyTable.html#line.63">stopRow</a></pre>
 </li>
 </ul>
 <a name="dstTableName">
@@ -407,7 +407,7 @@ implements org.apache.hadoop.util.Tool</pre>
 <ul class="blockList">
 <li class="blockList">
 <h4>dstTableName</h4>
-<pre><a href="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/mapreduce/CopyTable.html#line.63">dstTableName</a></pre>
+<pre><a href="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/mapreduce/CopyTable.html#line.64">dstTableName</a></pre>
 </li>
 </ul>
 <a name="peerAddress">
@@ -416,7 +416,7 @@ implements org.apache.hadoop.util.Tool</pre>
 <ul class="blockList">
 <li class="blockList">
 <h4>peerAddress</h4>
-<pre><a href="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/mapreduce/CopyTable.html#line.64">peerAddress</a></pre>
+<pre><a href="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/mapreduce/CopyTable.html#line.65">peerAddress</a></pre>
 </li>
 </ul>
 <a name="families">
@@ -425,7 +425,7 @@ implements org.apache.hadoop.util.Tool</pre>
 <ul class="blockList">
 <li class="blockList">
 <h4>families</h4>
-<pre><a href="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/mapreduce/CopyTable.html#line.65">families</a></pre>
+<pre><a href="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/mapreduce/CopyTable.html#line.66">families</a></pre>
 </li>
 </ul>
 <a name="allCells">
@@ -434,7 +434,7 @@ implements org.apache.hadoop.util.Tool</pre>
 <ul class="blockList">
 <li class="blockList">
 <h4>allCells</h4>
-<pre>boolean <a href="../../../../../src-html/org/apache/hadoop/hbase/mapreduce/CopyTable.html#line.66">allCells</a></pre>
+<pre>boolean <a href="../../../../../src-html/org/apache/hadoop/hbase/mapreduce/CopyTable.html#line.67">allCells</a></pre>
 </li>
 </ul>
 <a name="shuffle">
@@ -443,7 +443,7 @@ implements org.apache.hadoop.util.Tool</pre>
 <ul class="blockList">
 <li class="blockList">
 <h4>shuffle</h4>
-<pre>static&nbsp;boolean <a href="../../../../../src-html/org/apache/hadoop/hbase/mapreduce/CopyTable.html#line.67">shuffle</a></pre>
+<pre>static&nbsp;boolean <a href="../../../../../src-html/org/apache/hadoop/hbase/mapreduce/CopyTable.html#line.68">shuffle</a></pre>
 </li>
 </ul>
 <a name="bulkload">
@@ -452,7 +452,7 @@ implements org.apache.hadoop.util.Tool</pre>
 <ul class="blockList">
 <li class="blockList">
 <h4>bulkload</h4>
-<pre>boolean <a href="../../../../../src-html/org/apache/hadoop/hbase/mapreduce/CopyTable.html#line.69">bulkload</a></pre>
+<pre>boolean <a href="../../../../../src-html/org/apache/hadoop/hbase/mapreduce/CopyTable.html#line.70">bulkload</a></pre>
 </li>
 </ul>
 <a name="bulkloadDir">
@@ -461,7 +461,7 @@ implements org.apache.hadoop.util.Tool</pre>
 <ul class="blockList">
 <li class="blockList">
 <h4>bulkloadDir</h4>
-<pre>org.apache.hadoop.fs.Path <a href="../../../../../src-html/org/apache/hadoop/hbase/mapreduce/CopyTable.html#line.70">bulkloadDir</a></pre>
+<pre>org.apache.hadoop.fs.Path <a href="../../../../../src-html/org/apache/hadoop/hbase/mapreduce/CopyTable.html#line.71">bulkloadDir</a></pre>
 </li>
 </ul>
 <a name="JOB_NAME_CONF_KEY">
@@ -470,7 +470,7 @@ implements org.apache.hadoop.util.Tool</pre>
 <ul class="blockListLast">
 <li class="blockList">
 <h4>JOB_NAME_CONF_KEY</h4>
-<pre>private static final&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/mapreduce/CopyTable.html#line.72">JOB_NAME_CONF_KEY</a></pre>
+<pre>private static final&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/mapreduce/CopyTable.html#line.73">JOB_NAME_CONF_KEY</a></pre>
 <dl>
 <dt><span class="seeLabel">See Also:</span></dt>
 <dd><a href="../../../../../constant-values.html#org.apache.hadoop.hbase.mapreduce.CopyTable.JOB_NAME_CONF_KEY">Constant Field Values</a></dd>
@@ -491,7 +491,7 @@ implements org.apache.hadoop.util.Tool</pre>
 <ul class="blockListLast">
 <li class="blockList">
 <h4>CopyTable</h4>
-<pre>public&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/mapreduce/CopyTable.html#line.51">CopyTable</a>()</pre>
+<pre>public&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/mapreduce/CopyTable.html#line.52">CopyTable</a>()</pre>
 </li>
 </ul>
 </li>
@@ -508,7 +508,7 @@ implements org.apache.hadoop.util.Tool</pre>
 <ul class="blockList">
 <li class="blockList">
 <h4>createSubmittableJob</h4>
-<pre>public&nbsp;org.apache.hadoop.mapreduce.Job&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/mapreduce/CopyTable.html#line.81">createSubmittableJob</a>(<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>[]&nbsp;args)
+<pre>public&nbsp;org.apache.hadoop.mapreduce.Job&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/mapreduce/CopyTable.html#line.82">createSubmittableJob</a>(<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>[]&nbsp;args)
                                                      throws <a href="https://docs.oracle.com/javase/8/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</a></pre>
 <div class="block">Sets up the actual job.</div>
 <dl>
@@ -527,7 +527,7 @@ implements org.apache.hadoop.util.Tool</pre>
 <ul class="blockList">
 <li class="blockList">
 <h4>printUsage</h4>
-<pre>private static&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/mapreduce/CopyTable.html#line.180">printUsage</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;errorMsg)</pre>
+<pre>private static&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/mapreduce/CopyTable.html#line.181">printUsage</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;errorMsg)</pre>
 </li>
 </ul>
 <a name="doCommandLine-java.lang.String:A-">
@@ -536,7 +536,7 @@ implements org.apache.hadoop.util.Tool</pre>
 <ul class="blockList">
 <li class="blockList">
 <h4>doCommandLine</h4>
-<pre>private&nbsp;boolean&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/mapreduce/CopyTable.html#line.225">doCommandLine</a>(<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>[]&nbsp;args)</pre>
+<pre>private&nbsp;boolean&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/mapreduce/CopyTable.html#line.226">doCommandLine</a>(<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>[]&nbsp;args)</pre>
 </li>
 </ul>
 <a name="main-java.lang.String:A-">
@@ -545,7 +545,7 @@ implements org.apache.hadoop.util.Tool</pre>
 <ul class="blockList">
 <li class="blockList">
 <h4>main</h4>
-<pre>public static&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/mapreduce/CopyTable.html#line.355">main</a>(<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>[]&nbsp;args)
+<pre>public static&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/mapreduce/CopyTable.html#line.356">main</a>(<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>[]&nbsp;args)
                  throws <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Exception.html?is-external=true" title="class or interface in java.lang">Exception</a></pre>
 <div class="block">Main entry point.</div>
 <dl>
@@ -562,7 +562,7 @@ implements org.apache.hadoop.util.Tool</pre>
 <ul class="blockListLast">
 <li class="blockList">
 <h4>run</h4>
-<pre>public&nbsp;int&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/mapreduce/CopyTable.html#line.361">run</a>(<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>[]&nbsp;args)
+<pre>public&nbsp;int&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/mapreduce/CopyTable.html#line.362">run</a>(<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>[]&nbsp;args)
         throws <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Exception.html?is-external=true" title="class or interface in java.lang">Exception</a></pre>
 <dl>
 <dt><span class="overrideSpecifyLabel">Specified by:</span></dt>

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

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/27f5bfb5/devapidocs/org/apache/hadoop/hbase/master/balancer/package-tree.html
----------------------------------------------------------------------
diff --git a/devapidocs/org/apache/hadoop/hbase/master/balancer/package-tree.html b/devapidocs/org/apache/hadoop/hbase/master/balancer/package-tree.html
index 1799704..abd92a9 100644
--- a/devapidocs/org/apache/hadoop/hbase/master/balancer/package-tree.html
+++ b/devapidocs/org/apache/hadoop/hbase/master/balancer/package-tree.html
@@ -198,8 +198,8 @@
 <ul>
 <li type="circle">java.lang.<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Enum.html?is-external=true" title="class or interface in java.lang"><span class="typeNameLink">Enum</span></a>&lt;E&gt; (implements java.lang.<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Comparable.html?is-external=true" title="class or interface in java.lang">Comparable</a>&lt;T&gt;, java.io.<a href="https://docs.oracle.com/javase/8/docs/api/java/io/Serializable.html?is-external=true" title="class or interface in java.io">Serializable</a>)
 <ul>
-<li type="circle">org.apache.hadoop.hbase.master.balancer.<a href="../../../../../../org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.Cluster.Action.Type.html" title="enum in org.apache.hadoop.hbase.master.balancer"><span class="typeNameLink">BaseLoadBalancer.Cluster.Action.Type</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.master.balancer.<a href="../../../../../../org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.Cluster.LocalityType.html" title="enum in org.apache.hadoop.hbase.master.balancer"><span class="typeNameLink">BaseLoadBalancer.Cluster.LocalityType</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.master.balancer.<a href="../../../../../../org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.Cluster.Action.Type.html" title="enum in org.apache.hadoop.hbase.master.balancer"><span class="typeNameLink">BaseLoadBalancer.Cluster.Action.Type</span></a></li>
 </ul>
 </li>
 </ul>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/27f5bfb5/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 b995fc1..30b6470 100644
--- a/devapidocs/org/apache/hadoop/hbase/master/package-tree.html
+++ b/devapidocs/org/apache/hadoop/hbase/master/package-tree.html
@@ -347,11 +347,11 @@
 <ul>
 <li type="circle">java.lang.<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Enum.html?is-external=true" title="class or interface in java.lang"><span class="typeNameLink">Enum</span></a>&lt;E&gt; (implements java.lang.<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Comparable.html?is-external=true" title="class or interface in java.lang">Comparable</a>&lt;T&gt;, java.io.<a href="https://docs.oracle.com/javase/8/docs/api/java/io/Serializable.html?is-external=true" 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/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/SplitLogManager.ResubmitDirective.html" title="enum in org.apache.hadoop.hbase.master"><span class="typeNameLink">SplitLogManager.ResubmitDirective</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.master.<a href="../../../../../org/apache/hadoop/hbase/master/MetricsMasterSourceFactoryImpl.FactoryStorage.html" title="enum in org.apache.hadoop.hbase.master"><span class="typeNameLink">MetricsMasterSourceFactoryImpl.FactoryStorage</span></a></li>
-<li type="circle">org.apache.hadoop.hbase.master.<a href="../../../../../org/apache/hadoop/hbase/master/RegionState.State.html" title="enum in org.apache.hadoop.hbase.master"><span class="typeNameLink">RegionState.State</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.master.<a href="../../../../../org/apache/hadoop/hbase/master/MasterRpcServices.BalanceSwitchMode.html" title="enum in org.apache.hadoop.hbase.master"><span class="typeNameLink">MasterRpcServices.BalanceSwitchMode</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.master.<a href="../../../../../org/apache/hadoop/hbase/master/SplitLogManager.TerminationStatus.html" title="enum in org.apache.hadoop.hbase.master"><span class="typeNameLink">SplitLogManager.TerminationStatus</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.master.<a href="../../../../../org/apache/hadoop/hbase/master/RegionState.State.html" title="enum in org.apache.hadoop.hbase.master"><span class="typeNameLink">RegionState.State</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.master.<a href="../../../../../org/apache/hadoop/hbase/master/SplitLogManager.ResubmitDirective.html" title="enum in org.apache.hadoop.hbase.master"><span class="typeNameLink">SplitLogManager.ResubmitDirective</span></a></li>
 </ul>
 </li>
 </ul>


[23/29] hbase-site git commit: Published site at 5e84997f2ffdbcf5f849d70c30ddbe2db4039ca4.

Posted by gi...@apache.org.
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/27f5bfb5/devapidocs/org/apache/hadoop/hbase/master/procedure/class-use/FairQueue.html
----------------------------------------------------------------------
diff --git a/devapidocs/org/apache/hadoop/hbase/master/procedure/class-use/FairQueue.html b/devapidocs/org/apache/hadoop/hbase/master/procedure/class-use/FairQueue.html
index fd4726c..4650b29 100644
--- a/devapidocs/org/apache/hadoop/hbase/master/procedure/class-use/FairQueue.html
+++ b/devapidocs/org/apache/hadoop/hbase/master/procedure/class-use/FairQueue.html
@@ -129,8 +129,9 @@
 <tbody>
 <tr class="altColor">
 <td class="colFirst"><code>private static &lt;T extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Comparable.html?is-external=true" title="class or interface in java.lang">Comparable</a>&lt;T&gt;&gt;<br>void</code></td>
-<td class="colLast"><span class="typeNameLabel">MasterProcedureScheduler.</span><code><span class="memberNameLink"><a href="../../../../../../../org/apache/hadoop/hbase/master/procedure/MasterProcedureScheduler.html#addToRunQueue-org.apache.hadoop.hbase.master.procedure.FairQueue-org.apache.hadoop.hbase.master.procedure.Queue-">addToRunQueue</a></span>(<a href="../../../../../../../org/apache/hadoop/hbase/master/procedure/FairQueue.html" title="class in org.apache.hadoop.hbase.master.procedure">FairQueue</a>&lt;T&gt;&nbsp;fairq,
-             <a href="../../../../../../../org/apache/hadoop/hbase/master/procedure/Queue.html" title="class in org.apache.hadoop.hbase.master.procedure">Queue</a>&lt;T&gt;&nbsp;queue)</code>&nbsp;</td>
+<td class="colLast"><span class="typeNameLabel">MasterProcedureScheduler.</span><code><span class="memberNameLink"><a href="../../../../../../../org/apache/hadoop/hbase/master/procedure/MasterProcedureScheduler.html#addToRunQueue-org.apache.hadoop.hbase.master.procedure.FairQueue-org.apache.hadoop.hbase.master.procedure.Queue-java.util.function.Supplier-">addToRunQueue</a></span>(<a href="../../../../../../../org/apache/hadoop/hbase/master/procedure/FairQueue.html" title="class in org.apache.hadoop.hbase.master.procedure">FairQueue</a>&lt;T&gt;&nbsp;fairq,
+             <a href="../../../../../../../org/apache/hadoop/hbase/master/procedure/Queue.html" title="class in org.apache.hadoop.hbase.master.procedure">Queue</a>&lt;T&gt;&nbsp;queue,
+             <a href="https://docs.oracle.com/javase/8/docs/api/java/util/function/Supplier.html?is-external=true" title="class or interface in java.util.function">Supplier</a>&lt;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&gt;&nbsp;reason)</code>&nbsp;</td>
 </tr>
 <tr class="rowColor">
 <td class="colFirst"><code>private &lt;T extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Comparable.html?is-external=true" title="class or interface in java.lang">Comparable</a>&lt;T&gt;,TNode extends <a href="../../../../../../../org/apache/hadoop/hbase/master/procedure/Queue.html" title="class in org.apache.hadoop.hbase.master.procedure">Queue</a>&lt;T&gt;&gt;<br>void</code></td>
@@ -151,8 +152,9 @@
 </tr>
 <tr class="altColor">
 <td class="colFirst"><code>private static &lt;T extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Comparable.html?is-external=true" title="class or interface in java.lang">Comparable</a>&lt;T&gt;&gt;<br>void</code></td>
-<td class="colLast"><span class="typeNameLabel">MasterProcedureScheduler.</span><code><span class="memberNameLink"><a href="../../../../../../../org/apache/hadoop/hbase/master/procedure/MasterProcedureScheduler.html#removeFromRunQueue-org.apache.hadoop.hbase.master.procedure.FairQueue-org.apache.hadoop.hbase.master.procedure.Queue-">removeFromRunQueue</a></span>(<a href="../../../../../../../org/apache/hadoop/hbase/master/procedure/FairQueue.html" title="class in org.apache.hadoop.hbase.master.procedure">FairQueue</a>&lt;T&gt;&nbsp;fairq,
-                  <a href="../../../../../../../org/apache/hadoop/hbase/master/procedure/Queue.html" title="class in org.apache.hadoop.hbase.master.procedure">Queue</a>&lt;T&gt;&nbsp;queue)</code>&nbsp;</td>
+<td class="colLast"><span class="typeNameLabel">MasterProcedureScheduler.</span><code><span class="memberNameLink"><a href="../../../../../../../org/apache/hadoop/hbase/master/procedure/MasterProcedureScheduler.html#removeFromRunQueue-org.apache.hadoop.hbase.master.procedure.FairQueue-org.apache.hadoop.hbase.master.procedure.Queue-java.util.function.Supplier-">removeFromRunQueue</a></span>(<a href="../../../../../../../org/apache/hadoop/hbase/master/procedure/FairQueue.html" title="class in org.apache.hadoop.hbase.master.procedure">FairQueue</a>&lt;T&gt;&nbsp;fairq,
+                  <a href="../../../../../../../org/apache/hadoop/hbase/master/procedure/Queue.html" title="class in org.apache.hadoop.hbase.master.procedure">Queue</a>&lt;T&gt;&nbsp;queue,
+                  <a href="https://docs.oracle.com/javase/8/docs/api/java/util/function/Supplier.html?is-external=true" title="class or interface in java.util.function">Supplier</a>&lt;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&gt;&nbsp;reason)</code>&nbsp;</td>
 </tr>
 </tbody>
 </table>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/27f5bfb5/devapidocs/org/apache/hadoop/hbase/master/procedure/class-use/Queue.html
----------------------------------------------------------------------
diff --git a/devapidocs/org/apache/hadoop/hbase/master/procedure/class-use/Queue.html b/devapidocs/org/apache/hadoop/hbase/master/procedure/class-use/Queue.html
index 78b52de..b34653c 100644
--- a/devapidocs/org/apache/hadoop/hbase/master/procedure/class-use/Queue.html
+++ b/devapidocs/org/apache/hadoop/hbase/master/procedure/class-use/Queue.html
@@ -179,8 +179,9 @@
 </tr>
 <tr class="rowColor">
 <td class="colFirst"><code>private static &lt;T extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Comparable.html?is-external=true" title="class or interface in java.lang">Comparable</a>&lt;T&gt;&gt;<br>void</code></td>
-<td class="colLast"><span class="typeNameLabel">MasterProcedureScheduler.</span><code><span class="memberNameLink"><a href="../../../../../../../org/apache/hadoop/hbase/master/procedure/MasterProcedureScheduler.html#addToRunQueue-org.apache.hadoop.hbase.master.procedure.FairQueue-org.apache.hadoop.hbase.master.procedure.Queue-">addToRunQueue</a></span>(<a href="../../../../../../../org/apache/hadoop/hbase/master/procedure/FairQueue.html" title="class in org.apache.hadoop.hbase.master.procedure">FairQueue</a>&lt;T&gt;&nbsp;fairq,
-             <a href="../../../../../../../org/apache/hadoop/hbase/master/procedure/Queue.html" title="class in org.apache.hadoop.hbase.master.procedure">Queue</a>&lt;T&gt;&nbsp;queue)</code>&nbsp;</td>
+<td class="colLast"><span class="typeNameLabel">MasterProcedureScheduler.</span><code><span class="memberNameLink"><a href="../../../../../../../org/apache/hadoop/hbase/master/procedure/MasterProcedureScheduler.html#addToRunQueue-org.apache.hadoop.hbase.master.procedure.FairQueue-org.apache.hadoop.hbase.master.procedure.Queue-java.util.function.Supplier-">addToRunQueue</a></span>(<a href="../../../../../../../org/apache/hadoop/hbase/master/procedure/FairQueue.html" title="class in org.apache.hadoop.hbase.master.procedure">FairQueue</a>&lt;T&gt;&nbsp;fairq,
+             <a href="../../../../../../../org/apache/hadoop/hbase/master/procedure/Queue.html" title="class in org.apache.hadoop.hbase.master.procedure">Queue</a>&lt;T&gt;&nbsp;queue,
+             <a href="https://docs.oracle.com/javase/8/docs/api/java/util/function/Supplier.html?is-external=true" title="class or interface in java.util.function">Supplier</a>&lt;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&gt;&nbsp;reason)</code>&nbsp;</td>
 </tr>
 <tr class="altColor">
 <td class="colFirst"><code>int</code></td>
@@ -208,8 +209,9 @@
 </tr>
 <tr class="rowColor">
 <td class="colFirst"><code>private static &lt;T extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Comparable.html?is-external=true" title="class or interface in java.lang">Comparable</a>&lt;T&gt;&gt;<br>void</code></td>
-<td class="colLast"><span class="typeNameLabel">MasterProcedureScheduler.</span><code><span class="memberNameLink"><a href="../../../../../../../org/apache/hadoop/hbase/master/procedure/MasterProcedureScheduler.html#removeFromRunQueue-org.apache.hadoop.hbase.master.procedure.FairQueue-org.apache.hadoop.hbase.master.procedure.Queue-">removeFromRunQueue</a></span>(<a href="../../../../../../../org/apache/hadoop/hbase/master/procedure/FairQueue.html" title="class in org.apache.hadoop.hbase.master.procedure">FairQueue</a>&lt;T&gt;&nbsp;fairq,
-                  <a href="../../../../../../../org/apache/hadoop/hbase/master/procedure/Queue.html" title="class in org.apache.hadoop.hbase.master.procedure">Queue</a>&lt;T&gt;&nbsp;queue)</code>&nbsp;</td>
+<td class="colLast"><span class="typeNameLabel">MasterProcedureScheduler.</span><code><span class="memberNameLink"><a href="../../../../../../../org/apache/hadoop/hbase/master/procedure/MasterProcedureScheduler.html#removeFromRunQueue-org.apache.hadoop.hbase.master.procedure.FairQueue-org.apache.hadoop.hbase.master.procedure.Queue-java.util.function.Supplier-">removeFromRunQueue</a></span>(<a href="../../../../../../../org/apache/hadoop/hbase/master/procedure/FairQueue.html" title="class in org.apache.hadoop.hbase.master.procedure">FairQueue</a>&lt;T&gt;&nbsp;fairq,
+                  <a href="../../../../../../../org/apache/hadoop/hbase/master/procedure/Queue.html" title="class in org.apache.hadoop.hbase.master.procedure">Queue</a>&lt;T&gt;&nbsp;queue,
+                  <a href="https://docs.oracle.com/javase/8/docs/api/java/util/function/Supplier.html?is-external=true" title="class or interface in java.util.function">Supplier</a>&lt;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&gt;&nbsp;reason)</code>&nbsp;</td>
 </tr>
 </tbody>
 </table>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/27f5bfb5/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 4a6979a..8079e92 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/ServerProcedureInterface.ServerOperationType.html" title="enum in org.apache.hadoop.hbase.master.procedure"><span class="typeNameLink">ServerProcedureInterface.ServerOperationType</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.master.procedure.<a href="../../../../../../org/apache/hadoop/hbase/master/procedure/MetaProcedureInterface.MetaOperationType.html" title="enum in org.apache.hadoop.hbase.master.procedure"><span class="typeNameLink">MetaProcedureInterface.MetaOperationType</span></a></li>
-<li type="circle">org.apache.hadoop.hbase.master.procedure.<a href="../../../../../../org/apache/hadoop/hbase/master/procedure/PeerProcedureInterface.PeerOperationType.html" title="enum in org.apache.hadoop.hbase.master.procedure"><span class="typeNameLink">PeerProcedureInterface.PeerOperationType</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.master.procedure.<a href="../../../../../../org/apache/hadoop/hbase/master/procedure/TableProcedureInterface.TableOperationType.html" title="enum in org.apache.hadoop.hbase.master.procedure"><span class="typeNameLink">TableProcedureInterface.TableOperationType</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.master.procedure.<a href="../../../../../../org/apache/hadoop/hbase/master/procedure/ServerProcedureInterface.ServerOperationType.html" title="enum in org.apache.hadoop.hbase.master.procedure"><span class="typeNameLink">ServerProcedureInterface.ServerOperationType</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.master.procedure.<a href="../../../../../../org/apache/hadoop/hbase/master/procedure/PeerProcedureInterface.PeerOperationType.html" title="enum in org.apache.hadoop.hbase.master.procedure"><span class="typeNameLink">PeerProcedureInterface.PeerOperationType</span></a></li>
 </ul>
 </li>
 </ul>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/27f5bfb5/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 73f1f8d..f72460b 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/Cell.Type.html" title="enum in org.apache.hadoop.hbase"><span class="typeNameLink">Cell.Type</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.<a href="../../../../org/apache/hadoop/hbase/Coprocessor.State.html" title="enum in org.apache.hadoop.hbase"><span class="typeNameLink">Coprocessor.State</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.<a href="../../../../org/apache/hadoop/hbase/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/MetaTableAccessor.QueryType.html" title="enum in org.apache.hadoop.hbase"><span class="typeNameLink">MetaTableAccessor.QueryType</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.<a href="../../../../org/apache/hadoop/hbase/Cell.Type.html" title="enum in org.apache.hadoop.hbase"><span class="typeNameLink">Cell.Type</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.<a href="../../../../org/apache/hadoop/hbase/KeyValue.Type.html" title="enum in org.apache.hadoop.hbase"><span class="typeNameLink">KeyValue.Type</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.<a href="../../../../org/apache/hadoop/hbase/Size.Unit.html" title="enum in org.apache.hadoop.hbase"><span class="typeNameLink">Size.Unit</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.<a href="../../../../org/apache/hadoop/hbase/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/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/MemoryCompactionPolicy.html" title="enum in org.apache.hadoop.hbase"><span class="typeNameLink">MemoryCompactionPolicy</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.<a href="../../../../org/apache/hadoop/hbase/ClusterMetrics.Option.html" title="enum in org.apache.hadoop.hbase"><span class="typeNameLink">ClusterMetrics.Option</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.<a href="../../../../org/apache/hadoop/hbase/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/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/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/HConstants.OperationStatusCode.html" title="enum in org.apache.hadoop.hbase"><span class="typeNameLink">HConstants.OperationStatusCode</span></a></li>
-<li type="circle">org.apache.hadoop.hbase.<a href="../../../../org/apache/hadoop/hbase/KeepDeletedCells.html" title="enum in org.apache.hadoop.hbase"><span class="typeNameLink">KeepDeletedCells</span></a></li>
-<li type="circle">org.apache.hadoop.hbase.<a href="../../../../org/apache/hadoop/hbase/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/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/27f5bfb5/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 9bc84d1..d4ecb17 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.1992">ProcedureExecutor.KeepAliveWorkerThread</a>
+<pre>private final class <a href="../../../../../src-html/org/apache/hadoop/hbase/procedure2/ProcedureExecutor.html#line.2000">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.1994">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.2002">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.1999">keepAlive</a>(long&nbsp;lastUpdate)</pre>
+<pre>protected&nbsp;boolean&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/procedure2/ProcedureExecutor.KeepAliveWorkerThread.html#line.2007">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/27f5bfb5/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 df3d27d..6ad1509 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.2012">ProcedureExecutor.WorkerMonitor</a>
+<pre>private final class <a href="../../../../../src-html/org/apache/hadoop/hbase/procedure2/ProcedureExecutor.html#line.2020">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.2013">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.2021">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.2015">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.2023">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.2017">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.2025">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.2019">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.2027">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.2021">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.2029">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.2023">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.2031">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.2025">addWorkerStuckPercentage</a></pre>
+<pre>private&nbsp;float <a href="../../../../../src-html/org/apache/hadoop/hbase/procedure2/ProcedureExecutor.WorkerMonitor.html#line.2033">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.2026">timeoutInterval</a></pre>
+<pre>private&nbsp;int <a href="../../../../../src-html/org/apache/hadoop/hbase/procedure2/ProcedureExecutor.WorkerMonitor.html#line.2034">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.2027">stuckThreshold</a></pre>
+<pre>private&nbsp;int <a href="../../../../../src-html/org/apache/hadoop/hbase/procedure2/ProcedureExecutor.WorkerMonitor.html#line.2035">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.2029">WorkerMonitor</a>()</pre>
+<pre>public&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/procedure2/ProcedureExecutor.WorkerMonitor.html#line.2037">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.2034">run</a>()</pre>
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/procedure2/ProcedureExecutor.WorkerMonitor.html#line.2042">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.2042">checkForStuckWorkers</a>()</pre>
+<pre>private&nbsp;int&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/procedure2/ProcedureExecutor.WorkerMonitor.html#line.2050">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.2058">checkThreadCount</a>(int&nbsp;stuckCount)</pre>
+<pre>private&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/procedure2/ProcedureExecutor.WorkerMonitor.html#line.2066">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.2077">refreshConfig</a>()</pre>
+<pre>private&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/procedure2/ProcedureExecutor.WorkerMonitor.html#line.2085">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.2087">getTimeoutInterval</a>()</pre>
+<pre>public&nbsp;int&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/procedure2/ProcedureExecutor.WorkerMonitor.html#line.2095">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/27f5bfb5/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 77ea5fa..43f18ab 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.1913">ProcedureExecutor.WorkerThread</a>
+<pre>private class <a href="../../../../../src-html/org/apache/hadoop/hbase/procedure2/ProcedureExecutor.html#line.1921">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.1914">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.1922">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.1915">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.1923">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.1917">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.1925">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.1921">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.1929">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.1927">sendStopSignal</a>()</pre>
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/procedure2/ProcedureExecutor.WorkerThread.html#line.1935">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.1931">run</a>()</pre>
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/procedure2/ProcedureExecutor.WorkerThread.html#line.1939">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.1972">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.1980">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.1980">getCurrentRunTime</a>()</pre>
+<pre>public&nbsp;long&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/procedure2/ProcedureExecutor.WorkerThread.html#line.1988">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.1985">keepAlive</a>(long&nbsp;lastUpdate)</pre>
+<pre>protected&nbsp;boolean&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/procedure2/ProcedureExecutor.WorkerThread.html#line.1993">keepAlive</a>(long&nbsp;lastUpdate)</pre>
 </li>
 </ul>
 </li>


[26/29] hbase-site git commit: Published site at 5e84997f2ffdbcf5f849d70c30ddbe2db4039ca4.

Posted by gi...@apache.org.
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/27f5bfb5/dependency-convergence.html
----------------------------------------------------------------------
diff --git a/dependency-convergence.html b/dependency-convergence.html
index 6c1f282..206dd46 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="20181109" />
+    <meta name="Date-Revision-yyyymmdd" content="20181110" />
     <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" />
@@ -295,19 +295,19 @@
 <td>42</td></tr>
 <tr class="a">
 <th>Number of dependencies (NOD):</th>
-<td>252</td></tr>
+<td>254</td></tr>
 <tr class="b">
 <th>Number of unique artifacts (NOA):</th>
-<td>259</td></tr>
+<td>262</td></tr>
 <tr class="a">
 <th>Number of version-conflicting artifacts (NOC):</th>
-<td>6</td></tr>
+<td>7</td></tr>
 <tr class="b">
 <th>Number of SNAPSHOT artifacts (NOS):</th>
 <td>0</td></tr>
 <tr class="a">
 <th>Convergence (NOD/NOA):</th>
-<td><img alt="[Error]" src="images/icon_error_sml.gif" />&#160;<b>97 %</b></td></tr>
+<td><img alt="[Error]" src="images/icon_error_sml.gif" />&#160;<b>96 %</b></td></tr>
 <tr class="b">
 <th>Ready for release (100% convergence and no SNAPSHOTS):</th>
 <td><img alt="[Error]" src="images/icon_error_sml.gif" />&#160;<b>Error</b><br />You do not have 100% convergence.</td></tr></table></div>
@@ -358,78 +358,151 @@
 <td width="25%">3.2.1</td>
 <td>
 <ol style="list-style-type: decimal">
-<li>org.apache.hbase:hbase-assembly:pom:3.0.0-SNAPSHOT<br />\-&#160;org.apache.hbase:hbase-server:jar:3.0.0-SNAPSHOT:compile<br />&#160;&#160;&#160;\-&#160;org.apache.hadoop:hadoop-common:jar:2.7.7:compile<br />&#160;&#160;&#160;&#160;&#160;&#160;\-&#160;commons-configuration:commons-configuration:jar:1.6:compile<br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;\-&#160;(commons-collections:commons-collections:jar:3.2.1:compile - omitted for conflict with 3.2.2)<br /></li><br />
-<li>org.apache.hbase:hbase-backup:jar:3.0.0-SNAPSHOT<br />\-&#160;org.apache.hadoop:hadoop-common:jar:2.7.7:compile<br />&#160;&#160;&#160;\-&#160;commons-configuration:commons-configuration:jar:1.6:compile<br />&#160;&#160;&#160;&#160;&#160;&#160;\-&#160;(commons-collections:commons-collections:jar:3.2.1:compile - omitted for conflict with 3.2.2)<br /></li><br />
+<li>org.apache.hbase:hbase-assembly:pom:3.0.0-SNAPSHOT<br />\-&#160;org.apache.hbase:hbase-server:jar:3.0.0-SNAPSHOT:compile<br />&#160;&#160;&#160;+-&#160;org.apache.hbase:hbase-common:jar:3.0.0-SNAPSHOT:compile<br />&#160;&#160;&#160;|&#160;&#160;\-&#160;commons-validator:commons-validator:jar:1.6:compile<br />&#160;&#160;&#160;|&#160;&#160;&#160;&#160;&#160;\-&#160;commons-beanutils:commons-beanutils:jar:1.9.2:compile<br />&#160;&#160;&#160;|&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;\-&#160;(commons-collections:commons-collections:jar:3.2.1:compile - omitted for conflict with 3.2.2)<br />&#160;&#160;&#160;\-&#160;org.apache.hadoop:hadoop-common:jar:2.7.7:compile<br />&#160;&#160;&#160;&#160;&#160;&#160;\-&#160;commons-configuration:commons-configuration:jar:1.6:compile<br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;\-&#160;(commons-collections:commons-collections:jar:3.2.1:compile - omitted for conflict with 3.2.2)<br /></li><br />
+<li>org.apache.hbase:hbase-backup:jar:3.0.0-SNAPSHOT<br />+-&#160;org.apache.hbase:hbase-common:jar:3.0.0-SNAPSHOT:compile<br />|&#160;&#160;\-&#160;commons-validator:commons-validator:jar:1.6:compile<br />|&#160;&#160;&#160;&#160;&#160;\-&#160;commons-beanutils:commons-beanutils:jar:1.9.2:compile<br />|&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;\-&#160;(commons-collections:commons-collections:jar:3.2.1:compile - omitted for conflict with 3.2.2)<br />\-&#160;org.apache.hadoop:hadoop-common:jar:2.7.7:compile<br />&#160;&#160;&#160;\-&#160;commons-configuration:commons-configuration:jar:1.6:compile<br />&#160;&#160;&#160;&#160;&#160;&#160;\-&#160;(commons-collections:commons-collections:jar:3.2.1:compile - omitted for conflict with 3.2.2)<br /></li><br />
 <li>org.apache.hbase:hbase-client-project:jar:3.0.0-SNAPSHOT<br />\-&#160;org.apache.hbase:hbase-common:jar:3.0.0-SNAPSHOT:compile<br />&#160;&#160;&#160;\-&#160;org.apache.hadoop:hadoop-common:jar:2.7.7:compile<br />&#160;&#160;&#160;&#160;&#160;&#160;\-&#160;commons-configuration:commons-configuration:jar:1.6:compile<br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;\-&#160;(commons-collections:commons-collections:jar:3.2.1:compile - omitted for conflict with 3.2.2)<br /></li><br />
-<li>org.apache.hbase:hbase-client:jar:3.0.0-SNAPSHOT<br />\-&#160;org.apache.hadoop:hadoop-common:jar:2.7.7:compile<br />&#160;&#160;&#160;\-&#160;commons-configuration:commons-configuration:jar:1.6:compile<br />&#160;&#160;&#160;&#160;&#160;&#160;\-&#160;(commons-collections:commons-collections:jar:3.2.1:compile - omitted for conflict with 3.2.2)<br /></li><br />
-<li>org.apache.hbase:hbase-common:jar:3.0.0-SNAPSHOT<br />\-&#160;org.apache.hadoop:hadoop-common:jar:2.7.7:compile<br />&#160;&#160;&#160;\-&#160;commons-configuration:commons-configuration:jar:1.6:compile<br />&#160;&#160;&#160;&#160;&#160;&#160;\-&#160;(commons-collections:commons-collections:jar:3.2.1:compile - omitted for conflict with 3.2.2)<br /></li><br />
-<li>org.apache.hbase:hbase-endpoint:jar:3.0.0-SNAPSHOT<br />+-&#160;org.apache.hadoop:hadoop-minikdc:jar:2.7.7:test<br />|&#160;&#160;+-&#160;org.apache.directory.server:apacheds-core-api:jar:2.0.0-M15:test<br />|&#160;&#160;|&#160;&#160;+-&#160;org.apache.directory.api:api-ldap-codec-core:jar:1.0.0-M20:test<br />|&#160;&#160;|&#160;&#160;|&#160;&#160;\-&#160;(commons-collections:commons-collections:jar:3.2.1:test - omitted for conflict with 3.2.2)<br />|&#160;&#160;|&#160;&#160;\-&#160;org.apache.directory.api:api-ldap-model:jar:1.0.0-M20:test<br />|&#160;&#160;|&#160;&#160;&#160;&#160;&#160;\-&#160;(commons-collections:commons-collections:jar:3.2.1:test - omitted for conflict with 3.2.2)<br />|&#160;&#160;+-&#160;org.apache.directory.server:apacheds-interceptor-kerberos:jar:2.0.0-M15:test<br />|&#160;&#160;|&#160;&#160;\-&#160;org.apache.directory.server:apacheds-core:jar:2.0.0-M15:test<br />|&#160;&#160;|&#160;&#160;&#160;&#160;&#160;+-&#160;org.apache.directory.server:apacheds-i
 nterceptors-authn:jar:2.0.0-M15:test<br />|&#160;&#160;|&#160;&#160;&#160;&#160;&#160;|&#160;&#160;\-&#160;(commons-collections:commons-collections:jar:3.2.1:test - omitted for conflict with 3.2.2)<br />|&#160;&#160;|&#160;&#160;&#160;&#160;&#160;\-&#160;org.apache.directory.server:apacheds-interceptors-exception:jar:2.0.0-M15:test<br />|&#160;&#160;|&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;\-&#160;(commons-collections:commons-collections:jar:3.2.1:test - omitted for conflict with 3.2.2)<br />|&#160;&#160;+-&#160;org.apache.directory.server:apacheds-ldif-partition:jar:2.0.0-M15:test<br />|&#160;&#160;|&#160;&#160;\-&#160;org.apache.directory.server:apacheds-xdbm-partition:jar:2.0.0-M15:test<br />|&#160;&#160;|&#160;&#160;&#160;&#160;&#160;\-&#160;(commons-collections:commons-collections:jar:3.2.1:test - omitted for conflict with 3.2.2)<br />|&#160;&#160;+-&#160;org.apache.directory.server:apacheds-mavibot-partition:jar:2.0.0-M15:test<br />|&#160;&#160;|&#160;&#160;\-&#160;org
 .apache.directory.mavibot:mavibot:jar:1.0.0-M1:test<br />|&#160;&#160;|&#160;&#160;&#160;&#160;&#160;\-&#160;(commons-collections:commons-collections:jar:3.2.1:test - omitted for conflict with 3.2.2)<br />|&#160;&#160;\-&#160;org.apache.directory.api:api-all:jar:1.0.0-M20:test<br />|&#160;&#160;&#160;&#160;&#160;\-&#160;(commons-collections:commons-collections:jar:3.2.1:test - omitted for conflict with 3.2.2)<br />\-&#160;org.apache.hadoop:hadoop-common:jar:2.7.7:compile<br />&#160;&#160;&#160;\-&#160;commons-configuration:commons-configuration:jar:1.6:compile<br />&#160;&#160;&#160;&#160;&#160;&#160;\-&#160;(commons-collections:commons-collections:jar:3.2.1:compile - omitted for conflict with 3.2.2)<br /></li><br />
-<li>org.apache.hbase:hbase-examples:jar:3.0.0-SNAPSHOT<br />\-&#160;org.apache.hadoop:hadoop-common:jar:2.7.7:compile<br />&#160;&#160;&#160;\-&#160;commons-configuration:commons-configuration:jar:1.6:compile<br />&#160;&#160;&#160;&#160;&#160;&#160;\-&#160;(commons-collections:commons-collections:jar:3.2.1:compile - omitted for conflict with 3.2.2)<br /></li><br />
-<li>org.apache.hbase:hbase-external-blockcache:jar:3.0.0-SNAPSHOT<br />\-&#160;org.apache.hadoop:hadoop-common:jar:2.7.7:compile<br />&#160;&#160;&#160;\-&#160;commons-configuration:commons-configuration:jar:1.6:compile<br />&#160;&#160;&#160;&#160;&#160;&#160;\-&#160;(commons-collections:commons-collections:jar:3.2.1:compile - omitted for conflict with 3.2.2)<br /></li><br />
-<li>org.apache.hbase:hbase-hadoop-compat:jar:3.0.0-SNAPSHOT<br />\-&#160;org.apache.hbase:hbase-metrics-api:jar:3.0.0-SNAPSHOT:compile<br />&#160;&#160;&#160;\-&#160;org.apache.hbase:hbase-common:jar:3.0.0-SNAPSHOT:compile<br />&#160;&#160;&#160;&#160;&#160;&#160;\-&#160;org.apache.hadoop:hadoop-common:jar:2.7.7:compile<br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;\-&#160;commons-configuration:commons-configuration:jar:1.6:compile<br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;\-&#160;(commons-collections:commons-collections:jar:3.2.1:compile - omitted for conflict with 3.2.2)<br /></li><br />
-<li>org.apache.hbase:hbase-hadoop2-compat:jar:3.0.0-SNAPSHOT<br />\-&#160;org.apache.hadoop:hadoop-common:jar:2.7.7:compile<br />&#160;&#160;&#160;\-&#160;commons-configuration:commons-configuration:jar:1.6:compile<br />&#160;&#160;&#160;&#160;&#160;&#160;\-&#160;(commons-collections:commons-collections:jar:3.2.1:compile - omitted for conflict with 3.2.2)<br /></li><br />
-<li>org.apache.hbase:hbase-http:jar:3.0.0-SNAPSHOT<br />\-&#160;org.apache.hadoop:hadoop-common:jar:2.7.7:compile<br />&#160;&#160;&#160;\-&#160;commons-configuration:commons-configuration:jar:1.6:compile<br />&#160;&#160;&#160;&#160;&#160;&#160;\-&#160;(commons-collections:commons-collections:jar:3.2.1:compile - omitted for conflict with 3.2.2)<br /></li><br />
-<li>org.apache.hbase:hbase-it:jar:3.0.0-SNAPSHOT<br />+-&#160;org.apache.hadoop:hadoop-common:jar:2.7.7:compile<br />|&#160;&#160;\-&#160;commons-configuration:commons-configuration:jar:1.6:compile<br />|&#160;&#160;&#160;&#160;&#160;\-&#160;(commons-collections:commons-collections:jar:3.2.1:compile - omitted for conflict with 3.2.2)<br />\-&#160;org.apache.hadoop:hadoop-minikdc:jar:2.7.7:test<br />&#160;&#160;&#160;+-&#160;org.apache.directory.server:apacheds-core-api:jar:2.0.0-M15:test<br />&#160;&#160;&#160;|&#160;&#160;+-&#160;org.apache.directory.api:api-ldap-codec-core:jar:1.0.0-M20:test<br />&#160;&#160;&#160;|&#160;&#160;|&#160;&#160;\-&#160;(commons-collections:commons-collections:jar:3.2.1:test - omitted for conflict with 3.2.2)<br />&#160;&#160;&#160;|&#160;&#160;\-&#160;org.apache.directory.api:api-ldap-model:jar:1.0.0-M20:test<br />&#160;&#160;&#160;|&#160;&#160;&#160;&#160;&#160;\-&#160;(commons-collections:commons-collections:jar:3.2.1:test - omitted for conflict with
  3.2.2)<br />&#160;&#160;&#160;+-&#160;org.apache.directory.server:apacheds-interceptor-kerberos:jar:2.0.0-M15:test<br />&#160;&#160;&#160;|&#160;&#160;\-&#160;org.apache.directory.server:apacheds-core:jar:2.0.0-M15:test<br />&#160;&#160;&#160;|&#160;&#160;&#160;&#160;&#160;+-&#160;org.apache.directory.server:apacheds-interceptors-authn:jar:2.0.0-M15:test<br />&#160;&#160;&#160;|&#160;&#160;&#160;&#160;&#160;|&#160;&#160;\-&#160;(commons-collections:commons-collections:jar:3.2.1:test - omitted for conflict with 3.2.2)<br />&#160;&#160;&#160;|&#160;&#160;&#160;&#160;&#160;\-&#160;org.apache.directory.server:apacheds-interceptors-exception:jar:2.0.0-M15:test<br />&#160;&#160;&#160;|&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;\-&#160;(commons-collections:commons-collections:jar:3.2.1:test - omitted for conflict with 3.2.2)<br />&#160;&#160;&#160;+-&#160;org.apache.directory.server:apacheds-ldif-partition:jar:2.0.0-M15:test<br />&#160;&#160;&#160;|&#160;&#160;\-&#160;org.apache.dire
 ctory.server:apacheds-xdbm-partition:jar:2.0.0-M15:test<br />&#160;&#160;&#160;|&#160;&#160;&#160;&#160;&#160;\-&#160;(commons-collections:commons-collections:jar:3.2.1:test - omitted for conflict with 3.2.2)<br />&#160;&#160;&#160;+-&#160;org.apache.directory.server:apacheds-mavibot-partition:jar:2.0.0-M15:test<br />&#160;&#160;&#160;|&#160;&#160;\-&#160;org.apache.directory.mavibot:mavibot:jar:1.0.0-M1:test<br />&#160;&#160;&#160;|&#160;&#160;&#160;&#160;&#160;\-&#160;(commons-collections:commons-collections:jar:3.2.1:test - omitted for conflict with 3.2.2)<br />&#160;&#160;&#160;\-&#160;org.apache.directory.api:api-all:jar:1.0.0-M20:test<br />&#160;&#160;&#160;&#160;&#160;&#160;\-&#160;(commons-collections:commons-collections:jar:3.2.1:test - omitted for conflict with 3.2.2)<br /></li><br />
-<li>org.apache.hbase:hbase-mapreduce:jar:3.0.0-SNAPSHOT<br />\-&#160;org.apache.hadoop:hadoop-common:jar:2.7.7:compile<br />&#160;&#160;&#160;\-&#160;commons-configuration:commons-configuration:jar:1.6:compile<br />&#160;&#160;&#160;&#160;&#160;&#160;\-&#160;(commons-collections:commons-collections:jar:3.2.1:compile - omitted for conflict with 3.2.2)<br /></li><br />
-<li>org.apache.hbase:hbase-metrics-api:jar:3.0.0-SNAPSHOT<br />\-&#160;org.apache.hbase:hbase-common:jar:3.0.0-SNAPSHOT:compile<br />&#160;&#160;&#160;\-&#160;org.apache.hadoop:hadoop-common:jar:2.7.7:compile<br />&#160;&#160;&#160;&#160;&#160;&#160;\-&#160;commons-configuration:commons-configuration:jar:1.6:compile<br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;\-&#160;(commons-collections:commons-collections:jar:3.2.1:compile - omitted for conflict with 3.2.2)<br /></li><br />
-<li>org.apache.hbase:hbase-metrics:jar:3.0.0-SNAPSHOT<br />\-&#160;org.apache.hbase:hbase-common:jar:3.0.0-SNAPSHOT:compile<br />&#160;&#160;&#160;\-&#160;org.apache.hadoop:hadoop-common:jar:2.7.7:compile<br />&#160;&#160;&#160;&#160;&#160;&#160;\-&#160;commons-configuration:commons-configuration:jar:1.6:compile<br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;\-&#160;(commons-collections:commons-collections:jar:3.2.1:compile - omitted for conflict with 3.2.2)<br /></li><br />
-<li>org.apache.hbase:hbase-procedure:jar:3.0.0-SNAPSHOT<br />\-&#160;org.apache.hadoop:hadoop-common:jar:2.7.7:compile<br />&#160;&#160;&#160;\-&#160;commons-configuration:commons-configuration:jar:1.6:compile<br />&#160;&#160;&#160;&#160;&#160;&#160;\-&#160;(commons-collections:commons-collections:jar:3.2.1:compile - omitted for conflict with 3.2.2)<br /></li><br />
-<li>org.apache.hbase:hbase-replication:jar:3.0.0-SNAPSHOT<br />\-&#160;org.apache.hadoop:hadoop-common:jar:2.7.7:compile<br />&#160;&#160;&#160;\-&#160;commons-configuration:commons-configuration:jar:1.6:compile<br />&#160;&#160;&#160;&#160;&#160;&#160;\-&#160;(commons-collections:commons-collections:jar:3.2.1:compile - omitted for conflict with 3.2.2)<br /></li><br />
-<li>org.apache.hbase:hbase-rest:jar:3.0.0-SNAPSHOT<br />\-&#160;org.apache.hadoop:hadoop-common:jar:2.7.7:compile<br />&#160;&#160;&#160;\-&#160;commons-configuration:commons-configuration:jar:1.6:compile<br />&#160;&#160;&#160;&#160;&#160;&#160;\-&#160;(commons-collections:commons-collections:jar:3.2.1:compile - omitted for conflict with 3.2.2)<br /></li><br />
-<li>org.apache.hbase:hbase-rsgroup:jar:3.0.0-SNAPSHOT<br />\-&#160;org.apache.hadoop:hadoop-common:jar:2.7.7:compile<br />&#160;&#160;&#160;\-&#160;commons-configuration:commons-configuration:jar:1.6:compile<br />&#160;&#160;&#160;&#160;&#160;&#160;\-&#160;(commons-collections:commons-collections:jar:3.2.1:compile - omitted for conflict with 3.2.2)<br /></li><br />
-<li>org.apache.hbase:hbase-server:jar:3.0.0-SNAPSHOT<br />+-&#160;org.apache.hadoop:hadoop-minikdc:jar:2.7.7:test<br />|&#160;&#160;+-&#160;org.apache.directory.server:apacheds-core-api:jar:2.0.0-M15:test<br />|&#160;&#160;|&#160;&#160;+-&#160;org.apache.directory.api:api-ldap-codec-core:jar:1.0.0-M20:test<br />|&#160;&#160;|&#160;&#160;|&#160;&#160;\-&#160;(commons-collections:commons-collections:jar:3.2.1:test - omitted for conflict with 3.2.2)<br />|&#160;&#160;|&#160;&#160;\-&#160;org.apache.directory.api:api-ldap-model:jar:1.0.0-M20:test<br />|&#160;&#160;|&#160;&#160;&#160;&#160;&#160;\-&#160;(commons-collections:commons-collections:jar:3.2.1:test - omitted for conflict with 3.2.2)<br />|&#160;&#160;+-&#160;org.apache.directory.server:apacheds-interceptor-kerberos:jar:2.0.0-M15:test<br />|&#160;&#160;|&#160;&#160;\-&#160;org.apache.directory.server:apacheds-core:jar:2.0.0-M15:test<br />|&#160;&#160;|&#160;&#160;&#160;&#160;&#160;+-&#160;org.apache.directory.server:apacheds-int
 erceptors-authn:jar:2.0.0-M15:test<br />|&#160;&#160;|&#160;&#160;&#160;&#160;&#160;|&#160;&#160;\-&#160;(commons-collections:commons-collections:jar:3.2.1:test - omitted for conflict with 3.2.2)<br />|&#160;&#160;|&#160;&#160;&#160;&#160;&#160;\-&#160;org.apache.directory.server:apacheds-interceptors-exception:jar:2.0.0-M15:test<br />|&#160;&#160;|&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;\-&#160;(commons-collections:commons-collections:jar:3.2.1:test - omitted for conflict with 3.2.2)<br />|&#160;&#160;+-&#160;org.apache.directory.server:apacheds-ldif-partition:jar:2.0.0-M15:test<br />|&#160;&#160;|&#160;&#160;\-&#160;org.apache.directory.server:apacheds-xdbm-partition:jar:2.0.0-M15:test<br />|&#160;&#160;|&#160;&#160;&#160;&#160;&#160;\-&#160;(commons-collections:commons-collections:jar:3.2.1:test - omitted for conflict with 3.2.2)<br />|&#160;&#160;+-&#160;org.apache.directory.server:apacheds-mavibot-partition:jar:2.0.0-M15:test<br />|&#160;&#160;|&#160;&#160;\-&#160;org.a
 pache.directory.mavibot:mavibot:jar:1.0.0-M1:test<br />|&#160;&#160;|&#160;&#160;&#160;&#160;&#160;\-&#160;(commons-collections:commons-collections:jar:3.2.1:test - omitted for conflict with 3.2.2)<br />|&#160;&#160;\-&#160;org.apache.directory.api:api-all:jar:1.0.0-M20:test<br />|&#160;&#160;&#160;&#160;&#160;\-&#160;(commons-collections:commons-collections:jar:3.2.1:test - omitted for conflict with 3.2.2)<br />\-&#160;org.apache.hadoop:hadoop-common:jar:2.7.7:compile<br />&#160;&#160;&#160;\-&#160;commons-configuration:commons-configuration:jar:1.6:compile<br />&#160;&#160;&#160;&#160;&#160;&#160;\-&#160;(commons-collections:commons-collections:jar:3.2.1:compile - omitted for conflict with 3.2.2)<br /></li><br />
-<li>org.apache.hbase:hbase-shaded-check-invariants:pom:3.0.0-SNAPSHOT<br />\-&#160;org.apache.hbase:hbase-shaded-mapreduce:jar:3.0.0-SNAPSHOT:compile<br />&#160;&#160;&#160;\-&#160;org.apache.hbase:hbase-mapreduce:jar:3.0.0-SNAPSHOT:compile<br />&#160;&#160;&#160;&#160;&#160;&#160;\-&#160;org.apache.hadoop:hadoop-common:jar:2.7.7:compile<br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;\-&#160;commons-configuration:commons-configuration:jar:1.6:compile<br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;\-&#160;(commons-collections:commons-collections:jar:3.2.1:compile - omitted for conflict with 3.2.2)<br /></li><br />
-<li>org.apache.hbase:hbase-shaded-client-byo-hadoop:jar:3.0.0-SNAPSHOT<br />\-&#160;org.apache.hbase:hbase-client:jar:3.0.0-SNAPSHOT:compile<br />&#160;&#160;&#160;\-&#160;org.apache.hadoop:hadoop-common:jar:2.7.7:compile<br />&#160;&#160;&#160;&#160;&#160;&#160;\-&#160;commons-configuration:commons-configuration:jar:1.6:compile<br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;\-&#160;(commons-collections:commons-collections:jar:3.2.1:compile - omitted for conflict with 3.2.2)<br /></li><br />
+<li>org.apache.hbase:hbase-client:jar:3.0.0-SNAPSHOT<br />+-&#160;org.apache.hbase:hbase-common:jar:3.0.0-SNAPSHOT:compile<br />|&#160;&#160;\-&#160;commons-validator:commons-validator:jar:1.6:compile<br />|&#160;&#160;&#160;&#160;&#160;\-&#160;commons-beanutils:commons-beanutils:jar:1.9.2:compile<br />|&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;\-&#160;(commons-collections:commons-collections:jar:3.2.1:compile - omitted for conflict with 3.2.2)<br />\-&#160;org.apache.hadoop:hadoop-common:jar:2.7.7:compile<br />&#160;&#160;&#160;\-&#160;commons-configuration:commons-configuration:jar:1.6:compile<br />&#160;&#160;&#160;&#160;&#160;&#160;\-&#160;(commons-collections:commons-collections:jar:3.2.1:compile - omitted for conflict with 3.2.2)<br /></li><br />
+<li>org.apache.hbase:hbase-common:jar:3.0.0-SNAPSHOT<br />+-&#160;commons-validator:commons-validator:jar:1.6:compile<br />|&#160;&#160;\-&#160;commons-beanutils:commons-beanutils:jar:1.9.2:compile<br />|&#160;&#160;&#160;&#160;&#160;\-&#160;(commons-collections:commons-collections:jar:3.2.1:compile - omitted for conflict with 3.2.2)<br />\-&#160;org.apache.hadoop:hadoop-common:jar:2.7.7:compile<br />&#160;&#160;&#160;\-&#160;commons-configuration:commons-configuration:jar:1.6:compile<br />&#160;&#160;&#160;&#160;&#160;&#160;\-&#160;(commons-collections:commons-collections:jar:3.2.1:compile - omitted for conflict with 3.2.2)<br /></li><br />
+<li>org.apache.hbase:hbase-endpoint:jar:3.0.0-SNAPSHOT<br />+-&#160;org.apache.hbase:hbase-common:jar:3.0.0-SNAPSHOT:compile<br />|&#160;&#160;\-&#160;commons-validator:commons-validator:jar:1.6:compile<br />|&#160;&#160;&#160;&#160;&#160;\-&#160;commons-beanutils:commons-beanutils:jar:1.9.2:compile<br />|&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;\-&#160;(commons-collections:commons-collections:jar:3.2.1:compile - omitted for conflict with 3.2.2)<br />+-&#160;org.apache.hadoop:hadoop-minikdc:jar:2.7.7:test<br />|&#160;&#160;+-&#160;org.apache.directory.server:apacheds-core-api:jar:2.0.0-M15:test<br />|&#160;&#160;|&#160;&#160;+-&#160;org.apache.directory.api:api-ldap-codec-core:jar:1.0.0-M20:test<br />|&#160;&#160;|&#160;&#160;|&#160;&#160;\-&#160;(commons-collections:commons-collections:jar:3.2.1:test - omitted for conflict with 3.2.2)<br />|&#160;&#160;|&#160;&#160;\-&#160;org.apache.directory.api:api-ldap-model:jar:1.0.0-M20:test<br />|&#160;&#160;|&#160;&#160;&#160;&#160;&
 #160;\-&#160;(commons-collections:commons-collections:jar:3.2.1:test - omitted for conflict with 3.2.2)<br />|&#160;&#160;+-&#160;org.apache.directory.server:apacheds-interceptor-kerberos:jar:2.0.0-M15:test<br />|&#160;&#160;|&#160;&#160;\-&#160;org.apache.directory.server:apacheds-core:jar:2.0.0-M15:test<br />|&#160;&#160;|&#160;&#160;&#160;&#160;&#160;+-&#160;org.apache.directory.server:apacheds-interceptors-authn:jar:2.0.0-M15:test<br />|&#160;&#160;|&#160;&#160;&#160;&#160;&#160;|&#160;&#160;\-&#160;(commons-collections:commons-collections:jar:3.2.1:test - omitted for conflict with 3.2.2)<br />|&#160;&#160;|&#160;&#160;&#160;&#160;&#160;\-&#160;org.apache.directory.server:apacheds-interceptors-exception:jar:2.0.0-M15:test<br />|&#160;&#160;|&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;\-&#160;(commons-collections:commons-collections:jar:3.2.1:test - omitted for conflict with 3.2.2)<br />|&#160;&#160;+-&#160;org.apache.directory.server:apacheds-ldif-partition:jar:2.0.0-M15:tes
 t<br />|&#160;&#160;|&#160;&#160;\-&#160;org.apache.directory.server:apacheds-xdbm-partition:jar:2.0.0-M15:test<br />|&#160;&#160;|&#160;&#160;&#160;&#160;&#160;\-&#160;(commons-collections:commons-collections:jar:3.2.1:test - omitted for conflict with 3.2.2)<br />|&#160;&#160;+-&#160;org.apache.directory.server:apacheds-mavibot-partition:jar:2.0.0-M15:test<br />|&#160;&#160;|&#160;&#160;\-&#160;org.apache.directory.mavibot:mavibot:jar:1.0.0-M1:test<br />|&#160;&#160;|&#160;&#160;&#160;&#160;&#160;\-&#160;(commons-collections:commons-collections:jar:3.2.1:test - omitted for conflict with 3.2.2)<br />|&#160;&#160;\-&#160;org.apache.directory.api:api-all:jar:1.0.0-M20:test<br />|&#160;&#160;&#160;&#160;&#160;\-&#160;(commons-collections:commons-collections:jar:3.2.1:test - omitted for conflict with 3.2.2)<br />\-&#160;org.apache.hadoop:hadoop-common:jar:2.7.7:compile<br />&#160;&#160;&#160;\-&#160;commons-configuration:commons-configuration:jar:1.6:compile<br />&#160;&#160;&#160;&#160
 ;&#160;&#160;\-&#160;(commons-collections:commons-collections:jar:3.2.1:compile - omitted for conflict with 3.2.2)<br /></li><br />
+<li>org.apache.hbase:hbase-examples:jar:3.0.0-SNAPSHOT<br />+-&#160;org.apache.hbase:hbase-common:jar:3.0.0-SNAPSHOT:compile<br />|&#160;&#160;\-&#160;commons-validator:commons-validator:jar:1.6:compile<br />|&#160;&#160;&#160;&#160;&#160;\-&#160;commons-beanutils:commons-beanutils:jar:1.9.2:compile<br />|&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;\-&#160;(commons-collections:commons-collections:jar:3.2.1:compile - omitted for conflict with 3.2.2)<br />\-&#160;org.apache.hadoop:hadoop-common:jar:2.7.7:compile<br />&#160;&#160;&#160;\-&#160;commons-configuration:commons-configuration:jar:1.6:compile<br />&#160;&#160;&#160;&#160;&#160;&#160;\-&#160;(commons-collections:commons-collections:jar:3.2.1:compile - omitted for conflict with 3.2.2)<br /></li><br />
+<li>org.apache.hbase:hbase-external-blockcache:jar:3.0.0-SNAPSHOT<br />+-&#160;org.apache.hbase:hbase-common:jar:3.0.0-SNAPSHOT:compile<br />|&#160;&#160;\-&#160;commons-validator:commons-validator:jar:1.6:compile<br />|&#160;&#160;&#160;&#160;&#160;\-&#160;commons-beanutils:commons-beanutils:jar:1.9.2:compile<br />|&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;\-&#160;(commons-collections:commons-collections:jar:3.2.1:compile - omitted for conflict with 3.2.2)<br />\-&#160;org.apache.hadoop:hadoop-common:jar:2.7.7:compile<br />&#160;&#160;&#160;\-&#160;commons-configuration:commons-configuration:jar:1.6:compile<br />&#160;&#160;&#160;&#160;&#160;&#160;\-&#160;(commons-collections:commons-collections:jar:3.2.1:compile - omitted for conflict with 3.2.2)<br /></li><br />
+<li>org.apache.hbase:hbase-hadoop-compat:jar:3.0.0-SNAPSHOT<br />\-&#160;org.apache.hbase:hbase-metrics-api:jar:3.0.0-SNAPSHOT:compile<br />&#160;&#160;&#160;\-&#160;org.apache.hbase:hbase-common:jar:3.0.0-SNAPSHOT:compile<br />&#160;&#160;&#160;&#160;&#160;&#160;+-&#160;commons-validator:commons-validator:jar:1.6:compile<br />&#160;&#160;&#160;&#160;&#160;&#160;|&#160;&#160;\-&#160;commons-beanutils:commons-beanutils:jar:1.9.2:compile<br />&#160;&#160;&#160;&#160;&#160;&#160;|&#160;&#160;&#160;&#160;&#160;\-&#160;(commons-collections:commons-collections:jar:3.2.1:compile - omitted for conflict with 3.2.2)<br />&#160;&#160;&#160;&#160;&#160;&#160;\-&#160;org.apache.hadoop:hadoop-common:jar:2.7.7:compile<br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;\-&#160;commons-configuration:commons-configuration:jar:1.6:compile<br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;\-&#160;(commons-collections:commons-collections:jar:3.2.1:compile - omitted for
  conflict with 3.2.2)<br /></li><br />
+<li>org.apache.hbase:hbase-hadoop2-compat:jar:3.0.0-SNAPSHOT<br />+-&#160;org.apache.hbase:hbase-common:jar:3.0.0-SNAPSHOT:compile<br />|&#160;&#160;\-&#160;commons-validator:commons-validator:jar:1.6:compile<br />|&#160;&#160;&#160;&#160;&#160;\-&#160;commons-beanutils:commons-beanutils:jar:1.9.2:compile<br />|&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;\-&#160;(commons-collections:commons-collections:jar:3.2.1:compile - omitted for conflict with 3.2.2)<br />\-&#160;org.apache.hadoop:hadoop-common:jar:2.7.7:compile<br />&#160;&#160;&#160;\-&#160;commons-configuration:commons-configuration:jar:1.6:compile<br />&#160;&#160;&#160;&#160;&#160;&#160;\-&#160;(commons-collections:commons-collections:jar:3.2.1:compile - omitted for conflict with 3.2.2)<br /></li><br />
+<li>org.apache.hbase:hbase-http:jar:3.0.0-SNAPSHOT<br />+-&#160;org.apache.hbase:hbase-common:jar:3.0.0-SNAPSHOT:compile<br />|&#160;&#160;\-&#160;commons-validator:commons-validator:jar:1.6:compile<br />|&#160;&#160;&#160;&#160;&#160;\-&#160;commons-beanutils:commons-beanutils:jar:1.9.2:compile<br />|&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;\-&#160;(commons-collections:commons-collections:jar:3.2.1:compile - omitted for conflict with 3.2.2)<br />\-&#160;org.apache.hadoop:hadoop-common:jar:2.7.7:compile<br />&#160;&#160;&#160;\-&#160;commons-configuration:commons-configuration:jar:1.6:compile<br />&#160;&#160;&#160;&#160;&#160;&#160;\-&#160;(commons-collections:commons-collections:jar:3.2.1:compile - omitted for conflict with 3.2.2)<br /></li><br />
+<li>org.apache.hbase:hbase-it:jar:3.0.0-SNAPSHOT<br />+-&#160;org.apache.hbase:hbase-common:jar:3.0.0-SNAPSHOT:compile<br />|&#160;&#160;\-&#160;commons-validator:commons-validator:jar:1.6:compile<br />|&#160;&#160;&#160;&#160;&#160;\-&#160;commons-beanutils:commons-beanutils:jar:1.9.2:compile<br />|&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;\-&#160;(commons-collections:commons-collections:jar:3.2.1:compile - omitted for conflict with 3.2.2)<br />+-&#160;org.apache.hadoop:hadoop-common:jar:2.7.7:compile<br />|&#160;&#160;\-&#160;commons-configuration:commons-configuration:jar:1.6:compile<br />|&#160;&#160;&#160;&#160;&#160;\-&#160;(commons-collections:commons-collections:jar:3.2.1:compile - omitted for conflict with 3.2.2)<br />\-&#160;org.apache.hadoop:hadoop-minikdc:jar:2.7.7:test<br />&#160;&#160;&#160;+-&#160;org.apache.directory.server:apacheds-core-api:jar:2.0.0-M15:test<br />&#160;&#160;&#160;|&#160;&#160;+-&#160;org.apache.directory.api:api-ldap-codec-core:jar:1.0.0-M20
 :test<br />&#160;&#160;&#160;|&#160;&#160;|&#160;&#160;\-&#160;(commons-collections:commons-collections:jar:3.2.1:test - omitted for conflict with 3.2.2)<br />&#160;&#160;&#160;|&#160;&#160;\-&#160;org.apache.directory.api:api-ldap-model:jar:1.0.0-M20:test<br />&#160;&#160;&#160;|&#160;&#160;&#160;&#160;&#160;\-&#160;(commons-collections:commons-collections:jar:3.2.1:test - omitted for conflict with 3.2.2)<br />&#160;&#160;&#160;+-&#160;org.apache.directory.server:apacheds-interceptor-kerberos:jar:2.0.0-M15:test<br />&#160;&#160;&#160;|&#160;&#160;\-&#160;org.apache.directory.server:apacheds-core:jar:2.0.0-M15:test<br />&#160;&#160;&#160;|&#160;&#160;&#160;&#160;&#160;+-&#160;org.apache.directory.server:apacheds-interceptors-authn:jar:2.0.0-M15:test<br />&#160;&#160;&#160;|&#160;&#160;&#160;&#160;&#160;|&#160;&#160;\-&#160;(commons-collections:commons-collections:jar:3.2.1:test - omitted for conflict with 3.2.2)<br />&#160;&#160;&#160;|&#160;&#160;&#160;&#160;&#160;\-&#160;org.apach
 e.directory.server:apacheds-interceptors-exception:jar:2.0.0-M15:test<br />&#160;&#160;&#160;|&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;\-&#160;(commons-collections:commons-collections:jar:3.2.1:test - omitted for conflict with 3.2.2)<br />&#160;&#160;&#160;+-&#160;org.apache.directory.server:apacheds-ldif-partition:jar:2.0.0-M15:test<br />&#160;&#160;&#160;|&#160;&#160;\-&#160;org.apache.directory.server:apacheds-xdbm-partition:jar:2.0.0-M15:test<br />&#160;&#160;&#160;|&#160;&#160;&#160;&#160;&#160;\-&#160;(commons-collections:commons-collections:jar:3.2.1:test - omitted for conflict with 3.2.2)<br />&#160;&#160;&#160;+-&#160;org.apache.directory.server:apacheds-mavibot-partition:jar:2.0.0-M15:test<br />&#160;&#160;&#160;|&#160;&#160;\-&#160;org.apache.directory.mavibot:mavibot:jar:1.0.0-M1:test<br />&#160;&#160;&#160;|&#160;&#160;&#160;&#160;&#160;\-&#160;(commons-collections:commons-collections:jar:3.2.1:test - omitted for conflict with 3.2.2)<br />&#160;&#160;&#160;\-&#16
 0;org.apache.directory.api:api-all:jar:1.0.0-M20:test<br />&#160;&#160;&#160;&#160;&#160;&#160;\-&#160;(commons-collections:commons-collections:jar:3.2.1:test - omitted for conflict with 3.2.2)<br /></li><br />
+<li>org.apache.hbase:hbase-mapreduce:jar:3.0.0-SNAPSHOT<br />+-&#160;org.apache.hbase:hbase-common:jar:3.0.0-SNAPSHOT:compile<br />|&#160;&#160;\-&#160;commons-validator:commons-validator:jar:1.6:compile<br />|&#160;&#160;&#160;&#160;&#160;\-&#160;commons-beanutils:commons-beanutils:jar:1.9.2:compile<br />|&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;\-&#160;(commons-collections:commons-collections:jar:3.2.1:compile - omitted for conflict with 3.2.2)<br />\-&#160;org.apache.hadoop:hadoop-common:jar:2.7.7:compile<br />&#160;&#160;&#160;\-&#160;commons-configuration:commons-configuration:jar:1.6:compile<br />&#160;&#160;&#160;&#160;&#160;&#160;\-&#160;(commons-collections:commons-collections:jar:3.2.1:compile - omitted for conflict with 3.2.2)<br /></li><br />
+<li>org.apache.hbase:hbase-metrics-api:jar:3.0.0-SNAPSHOT<br />\-&#160;org.apache.hbase:hbase-common:jar:3.0.0-SNAPSHOT:compile<br />&#160;&#160;&#160;+-&#160;commons-validator:commons-validator:jar:1.6:compile<br />&#160;&#160;&#160;|&#160;&#160;\-&#160;commons-beanutils:commons-beanutils:jar:1.9.2:compile<br />&#160;&#160;&#160;|&#160;&#160;&#160;&#160;&#160;\-&#160;(commons-collections:commons-collections:jar:3.2.1:compile - omitted for conflict with 3.2.2)<br />&#160;&#160;&#160;\-&#160;org.apache.hadoop:hadoop-common:jar:2.7.7:compile<br />&#160;&#160;&#160;&#160;&#160;&#160;\-&#160;commons-configuration:commons-configuration:jar:1.6:compile<br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;\-&#160;(commons-collections:commons-collections:jar:3.2.1:compile - omitted for conflict with 3.2.2)<br /></li><br />
+<li>org.apache.hbase:hbase-metrics:jar:3.0.0-SNAPSHOT<br />\-&#160;org.apache.hbase:hbase-common:jar:3.0.0-SNAPSHOT:compile<br />&#160;&#160;&#160;+-&#160;commons-validator:commons-validator:jar:1.6:compile<br />&#160;&#160;&#160;|&#160;&#160;\-&#160;commons-beanutils:commons-beanutils:jar:1.9.2:compile<br />&#160;&#160;&#160;|&#160;&#160;&#160;&#160;&#160;\-&#160;(commons-collections:commons-collections:jar:3.2.1:compile - omitted for conflict with 3.2.2)<br />&#160;&#160;&#160;\-&#160;org.apache.hadoop:hadoop-common:jar:2.7.7:compile<br />&#160;&#160;&#160;&#160;&#160;&#160;\-&#160;commons-configuration:commons-configuration:jar:1.6:compile<br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;\-&#160;(commons-collections:commons-collections:jar:3.2.1:compile - omitted for conflict with 3.2.2)<br /></li><br />
+<li>org.apache.hbase:hbase-procedure:jar:3.0.0-SNAPSHOT<br />+-&#160;org.apache.hbase:hbase-common:jar:3.0.0-SNAPSHOT:compile<br />|&#160;&#160;\-&#160;commons-validator:commons-validator:jar:1.6:compile<br />|&#160;&#160;&#160;&#160;&#160;\-&#160;commons-beanutils:commons-beanutils:jar:1.9.2:compile<br />|&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;\-&#160;(commons-collections:commons-collections:jar:3.2.1:compile - omitted for conflict with 3.2.2)<br />\-&#160;org.apache.hadoop:hadoop-common:jar:2.7.7:compile<br />&#160;&#160;&#160;\-&#160;commons-configuration:commons-configuration:jar:1.6:compile<br />&#160;&#160;&#160;&#160;&#160;&#160;\-&#160;(commons-collections:commons-collections:jar:3.2.1:compile - omitted for conflict with 3.2.2)<br /></li><br />
+<li>org.apache.hbase:hbase-replication:jar:3.0.0-SNAPSHOT<br />+-&#160;org.apache.hbase:hbase-common:jar:3.0.0-SNAPSHOT:compile<br />|&#160;&#160;\-&#160;commons-validator:commons-validator:jar:1.6:compile<br />|&#160;&#160;&#160;&#160;&#160;\-&#160;commons-beanutils:commons-beanutils:jar:1.9.2:compile<br />|&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;\-&#160;(commons-collections:commons-collections:jar:3.2.1:compile - omitted for conflict with 3.2.2)<br />\-&#160;org.apache.hadoop:hadoop-common:jar:2.7.7:compile<br />&#160;&#160;&#160;\-&#160;commons-configuration:commons-configuration:jar:1.6:compile<br />&#160;&#160;&#160;&#160;&#160;&#160;\-&#160;(commons-collections:commons-collections:jar:3.2.1:compile - omitted for conflict with 3.2.2)<br /></li><br />
+<li>org.apache.hbase:hbase-rest:jar:3.0.0-SNAPSHOT<br />+-&#160;org.apache.hbase:hbase-common:jar:3.0.0-SNAPSHOT:compile<br />|&#160;&#160;\-&#160;commons-validator:commons-validator:jar:1.6:compile<br />|&#160;&#160;&#160;&#160;&#160;\-&#160;commons-beanutils:commons-beanutils:jar:1.9.2:compile<br />|&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;\-&#160;(commons-collections:commons-collections:jar:3.2.1:compile - omitted for conflict with 3.2.2)<br />\-&#160;org.apache.hadoop:hadoop-common:jar:2.7.7:compile<br />&#160;&#160;&#160;\-&#160;commons-configuration:commons-configuration:jar:1.6:compile<br />&#160;&#160;&#160;&#160;&#160;&#160;\-&#160;(commons-collections:commons-collections:jar:3.2.1:compile - omitted for conflict with 3.2.2)<br /></li><br />
+<li>org.apache.hbase:hbase-rsgroup:jar:3.0.0-SNAPSHOT<br />+-&#160;org.apache.hbase:hbase-common:jar:3.0.0-SNAPSHOT:compile<br />|&#160;&#160;\-&#160;commons-validator:commons-validator:jar:1.6:compile<br />|&#160;&#160;&#160;&#160;&#160;\-&#160;commons-beanutils:commons-beanutils:jar:1.9.2:compile<br />|&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;\-&#160;(commons-collections:commons-collections:jar:3.2.1:compile - omitted for conflict with 3.2.2)<br />\-&#160;org.apache.hadoop:hadoop-common:jar:2.7.7:compile<br />&#160;&#160;&#160;\-&#160;commons-configuration:commons-configuration:jar:1.6:compile<br />&#160;&#160;&#160;&#160;&#160;&#160;\-&#160;(commons-collections:commons-collections:jar:3.2.1:compile - omitted for conflict with 3.2.2)<br /></li><br />
+<li>org.apache.hbase:hbase-server:jar:3.0.0-SNAPSHOT<br />+-&#160;org.apache.hbase:hbase-common:jar:3.0.0-SNAPSHOT:compile<br />|&#160;&#160;\-&#160;commons-validator:commons-validator:jar:1.6:compile<br />|&#160;&#160;&#160;&#160;&#160;\-&#160;commons-beanutils:commons-beanutils:jar:1.9.2:compile<br />|&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;\-&#160;(commons-collections:commons-collections:jar:3.2.1:compile - omitted for conflict with 3.2.2)<br />+-&#160;org.apache.hadoop:hadoop-minikdc:jar:2.7.7:test<br />|&#160;&#160;+-&#160;org.apache.directory.server:apacheds-core-api:jar:2.0.0-M15:test<br />|&#160;&#160;|&#160;&#160;+-&#160;org.apache.directory.api:api-ldap-codec-core:jar:1.0.0-M20:test<br />|&#160;&#160;|&#160;&#160;|&#160;&#160;\-&#160;(commons-collections:commons-collections:jar:3.2.1:test - omitted for conflict with 3.2.2)<br />|&#160;&#160;|&#160;&#160;\-&#160;org.apache.directory.api:api-ldap-model:jar:1.0.0-M20:test<br />|&#160;&#160;|&#160;&#160;&#160;&#160;&#1
 60;\-&#160;(commons-collections:commons-collections:jar:3.2.1:test - omitted for conflict with 3.2.2)<br />|&#160;&#160;+-&#160;org.apache.directory.server:apacheds-interceptor-kerberos:jar:2.0.0-M15:test<br />|&#160;&#160;|&#160;&#160;\-&#160;org.apache.directory.server:apacheds-core:jar:2.0.0-M15:test<br />|&#160;&#160;|&#160;&#160;&#160;&#160;&#160;+-&#160;org.apache.directory.server:apacheds-interceptors-authn:jar:2.0.0-M15:test<br />|&#160;&#160;|&#160;&#160;&#160;&#160;&#160;|&#160;&#160;\-&#160;(commons-collections:commons-collections:jar:3.2.1:test - omitted for conflict with 3.2.2)<br />|&#160;&#160;|&#160;&#160;&#160;&#160;&#160;\-&#160;org.apache.directory.server:apacheds-interceptors-exception:jar:2.0.0-M15:test<br />|&#160;&#160;|&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;\-&#160;(commons-collections:commons-collections:jar:3.2.1:test - omitted for conflict with 3.2.2)<br />|&#160;&#160;+-&#160;org.apache.directory.server:apacheds-ldif-partition:jar:2.0.0-M15:test<
 br />|&#160;&#160;|&#160;&#160;\-&#160;org.apache.directory.server:apacheds-xdbm-partition:jar:2.0.0-M15:test<br />|&#160;&#160;|&#160;&#160;&#160;&#160;&#160;\-&#160;(commons-collections:commons-collections:jar:3.2.1:test - omitted for conflict with 3.2.2)<br />|&#160;&#160;+-&#160;org.apache.directory.server:apacheds-mavibot-partition:jar:2.0.0-M15:test<br />|&#160;&#160;|&#160;&#160;\-&#160;org.apache.directory.mavibot:mavibot:jar:1.0.0-M1:test<br />|&#160;&#160;|&#160;&#160;&#160;&#160;&#160;\-&#160;(commons-collections:commons-collections:jar:3.2.1:test - omitted for conflict with 3.2.2)<br />|&#160;&#160;\-&#160;org.apache.directory.api:api-all:jar:1.0.0-M20:test<br />|&#160;&#160;&#160;&#160;&#160;\-&#160;(commons-collections:commons-collections:jar:3.2.1:test - omitted for conflict with 3.2.2)<br />\-&#160;org.apache.hadoop:hadoop-common:jar:2.7.7:compile<br />&#160;&#160;&#160;\-&#160;commons-configuration:commons-configuration:jar:1.6:compile<br />&#160;&#160;&#160;&#160;&
 #160;&#160;\-&#160;(commons-collections:commons-collections:jar:3.2.1:compile - omitted for conflict with 3.2.2)<br /></li><br />
+<li>org.apache.hbase:hbase-shaded-check-invariants:pom:3.0.0-SNAPSHOT<br />\-&#160;org.apache.hbase:hbase-shaded-mapreduce:jar:3.0.0-SNAPSHOT:compile<br />&#160;&#160;&#160;\-&#160;org.apache.hbase:hbase-mapreduce:jar:3.0.0-SNAPSHOT:compile<br />&#160;&#160;&#160;&#160;&#160;&#160;+-&#160;org.apache.hbase:hbase-common:jar:3.0.0-SNAPSHOT:compile<br />&#160;&#160;&#160;&#160;&#160;&#160;|&#160;&#160;\-&#160;commons-validator:commons-validator:jar:1.6:compile<br />&#160;&#160;&#160;&#160;&#160;&#160;|&#160;&#160;&#160;&#160;&#160;\-&#160;commons-beanutils:commons-beanutils:jar:1.9.2:compile<br />&#160;&#160;&#160;&#160;&#160;&#160;|&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;\-&#160;(commons-collections:commons-collections:jar:3.2.1:compile - omitted for conflict with 3.2.2)<br />&#160;&#160;&#160;&#160;&#160;&#160;\-&#160;org.apache.hadoop:hadoop-common:jar:2.7.7:compile<br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;\-&#160;commons-configuration:commons-configuration:
 jar:1.6:compile<br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;\-&#160;(commons-collections:commons-collections:jar:3.2.1:compile - omitted for conflict with 3.2.2)<br /></li><br />
+<li>org.apache.hbase:hbase-shaded-client-byo-hadoop:jar:3.0.0-SNAPSHOT<br />\-&#160;org.apache.hbase:hbase-client:jar:3.0.0-SNAPSHOT:compile<br />&#160;&#160;&#160;+-&#160;org.apache.hbase:hbase-common:jar:3.0.0-SNAPSHOT:compile<br />&#160;&#160;&#160;|&#160;&#160;\-&#160;commons-validator:commons-validator:jar:1.6:compile<br />&#160;&#160;&#160;|&#160;&#160;&#160;&#160;&#160;\-&#160;commons-beanutils:commons-beanutils:jar:1.9.2:compile<br />&#160;&#160;&#160;|&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;\-&#160;(commons-collections:commons-collections:jar:3.2.1:compile - omitted for conflict with 3.2.2)<br />&#160;&#160;&#160;\-&#160;org.apache.hadoop:hadoop-common:jar:2.7.7:compile<br />&#160;&#160;&#160;&#160;&#160;&#160;\-&#160;commons-configuration:commons-configuration:jar:1.6:compile<br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;\-&#160;(commons-collections:commons-collections:jar:3.2.1:compile - omitted for conflict with 3.2.2)<br /></li><br />
 <li>org.apache.hbase:hbase-shaded-client-project:jar:3.0.0-SNAPSHOT<br />\-&#160;org.apache.hbase:hbase-shaded-client:jar:3.0.0-SNAPSHOT:compile<br />&#160;&#160;&#160;\-&#160;org.apache.hbase:hbase-client:jar:3.0.0-SNAPSHOT:compile<br />&#160;&#160;&#160;&#160;&#160;&#160;\-&#160;org.apache.hadoop:hadoop-common:jar:2.7.7:compile<br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;\-&#160;commons-configuration:commons-configuration:jar:1.6:compile<br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;\-&#160;(commons-collections:commons-collections:jar:3.2.1:compile - omitted for conflict with 3.2.2)<br /></li><br />
-<li>org.apache.hbase:hbase-shaded-client:jar:3.0.0-SNAPSHOT<br />\-&#160;org.apache.hbase:hbase-client:jar:3.0.0-SNAPSHOT:compile<br />&#160;&#160;&#160;\-&#160;org.apache.hadoop:hadoop-common:jar:2.7.7:compile<br />&#160;&#160;&#160;&#160;&#160;&#160;\-&#160;commons-configuration:commons-configuration:jar:1.6:compile<br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;\-&#160;(commons-collections:commons-collections:jar:3.2.1:compile - omitted for conflict with 3.2.2)<br /></li><br />
-<li>org.apache.hbase:hbase-shaded-mapreduce:jar:3.0.0-SNAPSHOT<br />\-&#160;org.apache.hadoop:hadoop-common:jar:2.7.7:provided (scope not updated to compile)<br />&#160;&#160;&#160;\-&#160;commons-configuration:commons-configuration:jar:1.6:provided<br />&#160;&#160;&#160;&#160;&#160;&#160;\-&#160;(commons-collections:commons-collections:jar:3.2.1:provided - omitted for conflict with 3.2.2)<br /></li><br />
-<li>org.apache.hbase:hbase-shaded-with-hadoop-check-invariants:pom:3.0.0-SNAPSHOT<br />\-&#160;org.apache.hbase:hbase-shaded-client:jar:3.0.0-SNAPSHOT:compile<br />&#160;&#160;&#160;\-&#160;org.apache.hbase:hbase-client:jar:3.0.0-SNAPSHOT:compile<br />&#160;&#160;&#160;&#160;&#160;&#160;\-&#160;org.apache.hadoop:hadoop-common:jar:2.7.7:compile<br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;\-&#160;commons-configuration:commons-configuration:jar:1.6:compile<br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;\-&#160;(commons-collections:commons-collections:jar:3.2.1:compile - omitted for conflict with 3.2.2)<br /></li><br />
-<li>org.apache.hbase:hbase-shell:jar:3.0.0-SNAPSHOT<br />+-&#160;org.apache.hadoop:hadoop-common:jar:2.7.7:compile<br />|&#160;&#160;\-&#160;commons-configuration:commons-configuration:jar:1.6:compile<br />|&#160;&#160;&#160;&#160;&#160;\-&#160;(commons-collections:commons-collections:jar:3.2.1:compile - omitted for conflict with 3.2.2)<br />\-&#160;org.apache.hadoop:hadoop-minikdc:jar:2.7.7:test<br />&#160;&#160;&#160;+-&#160;org.apache.directory.server:apacheds-core-api:jar:2.0.0-M15:test<br />&#160;&#160;&#160;|&#160;&#160;+-&#160;org.apache.directory.api:api-ldap-codec-core:jar:1.0.0-M20:test<br />&#160;&#160;&#160;|&#160;&#160;|&#160;&#160;\-&#160;(commons-collections:commons-collections:jar:3.2.1:test - omitted for conflict with 3.2.2)<br />&#160;&#160;&#160;|&#160;&#160;\-&#160;org.apache.directory.api:api-ldap-model:jar:1.0.0-M20:test<br />&#160;&#160;&#160;|&#160;&#160;&#160;&#160;&#160;\-&#160;(commons-collections:commons-collections:jar:3.2.1:test - omitted for conflict w
 ith 3.2.2)<br />&#160;&#160;&#160;+-&#160;org.apache.directory.server:apacheds-interceptor-kerberos:jar:2.0.0-M15:test<br />&#160;&#160;&#160;|&#160;&#160;\-&#160;org.apache.directory.server:apacheds-core:jar:2.0.0-M15:test<br />&#160;&#160;&#160;|&#160;&#160;&#160;&#160;&#160;+-&#160;org.apache.directory.server:apacheds-interceptors-authn:jar:2.0.0-M15:test<br />&#160;&#160;&#160;|&#160;&#160;&#160;&#160;&#160;|&#160;&#160;\-&#160;(commons-collections:commons-collections:jar:3.2.1:test - omitted for conflict with 3.2.2)<br />&#160;&#160;&#160;|&#160;&#160;&#160;&#160;&#160;\-&#160;org.apache.directory.server:apacheds-interceptors-exception:jar:2.0.0-M15:test<br />&#160;&#160;&#160;|&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;\-&#160;(commons-collections:commons-collections:jar:3.2.1:test - omitted for conflict with 3.2.2)<br />&#160;&#160;&#160;+-&#160;org.apache.directory.server:apacheds-ldif-partition:jar:2.0.0-M15:test<br />&#160;&#160;&#160;|&#160;&#160;\-&#160;org.apache.d
 irectory.server:apacheds-xdbm-partition:jar:2.0.0-M15:test<br />&#160;&#160;&#160;|&#160;&#160;&#160;&#160;&#160;\-&#160;(commons-collections:commons-collections:jar:3.2.1:test - omitted for conflict with 3.2.2)<br />&#160;&#160;&#160;+-&#160;org.apache.directory.server:apacheds-mavibot-partition:jar:2.0.0-M15:test<br />&#160;&#160;&#160;|&#160;&#160;\-&#160;org.apache.directory.mavibot:mavibot:jar:1.0.0-M1:test<br />&#160;&#160;&#160;|&#160;&#160;&#160;&#160;&#160;\-&#160;(commons-collections:commons-collections:jar:3.2.1:test - omitted for conflict with 3.2.2)<br />&#160;&#160;&#160;\-&#160;org.apache.directory.api:api-all:jar:1.0.0-M20:test<br />&#160;&#160;&#160;&#160;&#160;&#160;\-&#160;(commons-collections:commons-collections:jar:3.2.1:test - omitted for conflict with 3.2.2)<br /></li><br />
-<li>org.apache.hbase:hbase-testing-util:jar:3.0.0-SNAPSHOT<br />+-&#160;org.apache.hadoop:hadoop-common:jar:2.7.7:compile<br />|&#160;&#160;\-&#160;commons-configuration:commons-configuration:jar:1.6:compile<br />|&#160;&#160;&#160;&#160;&#160;\-&#160;(commons-collections:commons-collections:jar:3.2.1:compile - omitted for conflict with 3.2.2)<br />\-&#160;org.apache.hadoop:hadoop-minikdc:jar:2.7.7:test<br />&#160;&#160;&#160;+-&#160;org.apache.directory.server:apacheds-core-api:jar:2.0.0-M15:test<br />&#160;&#160;&#160;|&#160;&#160;+-&#160;org.apache.directory.api:api-ldap-codec-core:jar:1.0.0-M20:test<br />&#160;&#160;&#160;|&#160;&#160;|&#160;&#160;\-&#160;(commons-collections:commons-collections:jar:3.2.1:test - omitted for conflict with 3.2.2)<br />&#160;&#160;&#160;|&#160;&#160;\-&#160;org.apache.directory.api:api-ldap-model:jar:1.0.0-M20:test<br />&#160;&#160;&#160;|&#160;&#160;&#160;&#160;&#160;\-&#160;(commons-collections:commons-collections:jar:3.2.1:test - omitted for con
 flict with 3.2.2)<br />&#160;&#160;&#160;+-&#160;org.apache.directory.server:apacheds-interceptor-kerberos:jar:2.0.0-M15:test<br />&#160;&#160;&#160;|&#160;&#160;\-&#160;org.apache.directory.server:apacheds-core:jar:2.0.0-M15:test<br />&#160;&#160;&#160;|&#160;&#160;&#160;&#160;&#160;+-&#160;org.apache.directory.server:apacheds-interceptors-authn:jar:2.0.0-M15:test<br />&#160;&#160;&#160;|&#160;&#160;&#160;&#160;&#160;|&#160;&#160;\-&#160;(commons-collections:commons-collections:jar:3.2.1:test - omitted for conflict with 3.2.2)<br />&#160;&#160;&#160;|&#160;&#160;&#160;&#160;&#160;\-&#160;org.apache.directory.server:apacheds-interceptors-exception:jar:2.0.0-M15:test<br />&#160;&#160;&#160;|&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;\-&#160;(commons-collections:commons-collections:jar:3.2.1:test - omitted for conflict with 3.2.2)<br />&#160;&#160;&#160;+-&#160;org.apache.directory.server:apacheds-ldif-partition:jar:2.0.0-M15:test<br />&#160;&#160;&#160;|&#160;&#160;\-&#160;org.a
 pache.directory.server:apacheds-xdbm-partition:jar:2.0.0-M15:test<br />&#160;&#160;&#160;|&#160;&#160;&#160;&#160;&#160;\-&#160;(commons-collections:commons-collections:jar:3.2.1:test - omitted for conflict with 3.2.2)<br />&#160;&#160;&#160;+-&#160;org.apache.directory.server:apacheds-mavibot-partition:jar:2.0.0-M15:test<br />&#160;&#160;&#160;|&#160;&#160;\-&#160;org.apache.directory.mavibot:mavibot:jar:1.0.0-M1:test<br />&#160;&#160;&#160;|&#160;&#160;&#160;&#160;&#160;\-&#160;(commons-collections:commons-collections:jar:3.2.1:test - omitted for conflict with 3.2.2)<br />&#160;&#160;&#160;\-&#160;org.apache.directory.api:api-all:jar:1.0.0-M20:test<br />&#160;&#160;&#160;&#160;&#160;&#160;\-&#160;(commons-collections:commons-collections:jar:3.2.1:test - omitted for conflict with 3.2.2)<br /></li><br />
-<li>org.apache.hbase:hbase-thrift:jar:3.0.0-SNAPSHOT<br />\-&#160;org.apache.hadoop:hadoop-common:jar:2.7.7:compile<br />&#160;&#160;&#160;\-&#160;commons-configuration:commons-configuration:jar:1.6:compile<br />&#160;&#160;&#160;&#160;&#160;&#160;\-&#160;(commons-collections:commons-collections:jar:3.2.1:compile - omitted for conflict with 3.2.2)<br /></li><br />
-<li>org.apache.hbase:hbase-zookeeper:jar:3.0.0-SNAPSHOT<br />\-&#160;org.apache.hadoop:hadoop-common:jar:2.7.7:compile<br />&#160;&#160;&#160;\-&#160;commons-configuration:commons-configuration:jar:1.6:compile<br />&#160;&#160;&#160;&#160;&#160;&#160;\-&#160;(commons-collections:commons-collections:jar:3.2.1:compile - omitted for conflict with 3.2.2)<br /></li><br /></ol></td></tr>
+<li>org.apache.hbase:hbase-shaded-client:jar:3.0.0-SNAPSHOT<br />\-&#160;org.apache.hbase:hbase-client:jar:3.0.0-SNAPSHOT:compile<br />&#160;&#160;&#160;+-&#160;org.apache.hbase:hbase-common:jar:3.0.0-SNAPSHOT:compile<br />&#160;&#160;&#160;|&#160;&#160;\-&#160;commons-validator:commons-validator:jar:1.6:compile<br />&#160;&#160;&#160;|&#160;&#160;&#160;&#160;&#160;\-&#160;commons-beanutils:commons-beanutils:jar:1.9.2:compile<br />&#160;&#160;&#160;|&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;\-&#160;(commons-collections:commons-collections:jar:3.2.1:compile - omitted for conflict with 3.2.2)<br />&#160;&#160;&#160;\-&#160;org.apache.hadoop:hadoop-common:jar:2.7.7:compile<br />&#160;&#160;&#160;&#160;&#160;&#160;\-&#160;commons-configuration:commons-configuration:jar:1.6:compile<br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;\-&#160;(commons-collections:commons-collections:jar:3.2.1:compile - omitted for conflict with 3.2.2)<br /></li><br />
+<li>org.apache.hbase:hbase-shaded-mapreduce:jar:3.0.0-SNAPSHOT<br />+-&#160;org.apache.hbase:hbase-mapreduce:jar:3.0.0-SNAPSHOT:compile<br />|&#160;&#160;\-&#160;org.apache.hbase:hbase-common:jar:3.0.0-SNAPSHOT:compile<br />|&#160;&#160;&#160;&#160;&#160;\-&#160;commons-validator:commons-validator:jar:1.6:compile<br />|&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;\-&#160;commons-beanutils:commons-beanutils:jar:1.9.2:compile<br />|&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;\-&#160;(commons-collections:commons-collections:jar:3.2.1:compile - omitted for conflict with 3.2.2)<br />\-&#160;org.apache.hadoop:hadoop-common:jar:2.7.7:provided (scope not updated to compile)<br />&#160;&#160;&#160;\-&#160;commons-configuration:commons-configuration:jar:1.6:provided<br />&#160;&#160;&#160;&#160;&#160;&#160;\-&#160;(commons-collections:commons-collections:jar:3.2.1:provided - omitted for conflict with 3.2.2)<br /></li><br />
+<li>org.apache.hbase:hbase-shaded-with-hadoop-check-invariants:pom:3.0.0-SNAPSHOT<br />\-&#160;org.apache.hbase:hbase-shaded-client:jar:3.0.0-SNAPSHOT:compile<br />&#160;&#160;&#160;\-&#160;org.apache.hbase:hbase-client:jar:3.0.0-SNAPSHOT:compile<br />&#160;&#160;&#160;&#160;&#160;&#160;+-&#160;org.apache.hbase:hbase-common:jar:3.0.0-SNAPSHOT:compile<br />&#160;&#160;&#160;&#160;&#160;&#160;|&#160;&#160;\-&#160;commons-validator:commons-validator:jar:1.6:compile<br />&#160;&#160;&#160;&#160;&#160;&#160;|&#160;&#160;&#160;&#160;&#160;\-&#160;commons-beanutils:commons-beanutils:jar:1.9.2:compile<br />&#160;&#160;&#160;&#160;&#160;&#160;|&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;\-&#160;(commons-collections:commons-collections:jar:3.2.1:compile - omitted for conflict with 3.2.2)<br />&#160;&#160;&#160;&#160;&#160;&#160;\-&#160;org.apache.hadoop:hadoop-common:jar:2.7.7:compile<br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;\-&#160;commons-configuration:commons-configur
 ation:jar:1.6:compile<br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;\-&#160;(commons-collections:commons-collections:jar:3.2.1:compile - omitted for conflict with 3.2.2)<br /></li><br />
+<li>org.apache.hbase:hbase-shell:jar:3.0.0-SNAPSHOT<br />+-&#160;org.apache.hbase:hbase-common:jar:3.0.0-SNAPSHOT:compile<br />|&#160;&#160;\-&#160;commons-validator:commons-validator:jar:1.6:compile<br />|&#160;&#160;&#160;&#160;&#160;\-&#160;commons-beanutils:commons-beanutils:jar:1.9.2:compile<br />|&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;\-&#160;(commons-collections:commons-collections:jar:3.2.1:compile - omitted for conflict with 3.2.2)<br />+-&#160;org.apache.hadoop:hadoop-common:jar:2.7.7:compile<br />|&#160;&#160;\-&#160;commons-configuration:commons-configuration:jar:1.6:compile<br />|&#160;&#160;&#160;&#160;&#160;\-&#160;(commons-collections:commons-collections:jar:3.2.1:compile - omitted for conflict with 3.2.2)<br />\-&#160;org.apache.hadoop:hadoop-minikdc:jar:2.7.7:test<br />&#160;&#160;&#160;+-&#160;org.apache.directory.server:apacheds-core-api:jar:2.0.0-M15:test<br />&#160;&#160;&#160;|&#160;&#160;+-&#160;org.apache.directory.api:api-ldap-codec-core:jar:1.0.0-
 M20:test<br />&#160;&#160;&#160;|&#160;&#160;|&#160;&#160;\-&#160;(commons-collections:commons-collections:jar:3.2.1:test - omitted for conflict with 3.2.2)<br />&#160;&#160;&#160;|&#160;&#160;\-&#160;org.apache.directory.api:api-ldap-model:jar:1.0.0-M20:test<br />&#160;&#160;&#160;|&#160;&#160;&#160;&#160;&#160;\-&#160;(commons-collections:commons-collections:jar:3.2.1:test - omitted for conflict with 3.2.2)<br />&#160;&#160;&#160;+-&#160;org.apache.directory.server:apacheds-interceptor-kerberos:jar:2.0.0-M15:test<br />&#160;&#160;&#160;|&#160;&#160;\-&#160;org.apache.directory.server:apacheds-core:jar:2.0.0-M15:test<br />&#160;&#160;&#160;|&#160;&#160;&#160;&#160;&#160;+-&#160;org.apache.directory.server:apacheds-interceptors-authn:jar:2.0.0-M15:test<br />&#160;&#160;&#160;|&#160;&#160;&#160;&#160;&#160;|&#160;&#160;\-&#160;(commons-collections:commons-collections:jar:3.2.1:test - omitted for conflict with 3.2.2)<br />&#160;&#160;&#160;|&#160;&#160;&#160;&#160;&#160;\-&#160;org.ap
 ache.directory.server:apacheds-interceptors-exception:jar:2.0.0-M15:test<br />&#160;&#160;&#160;|&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;\-&#160;(commons-collections:commons-collections:jar:3.2.1:test - omitted for conflict with 3.2.2)<br />&#160;&#160;&#160;+-&#160;org.apache.directory.server:apacheds-ldif-partition:jar:2.0.0-M15:test<br />&#160;&#160;&#160;|&#160;&#160;\-&#160;org.apache.directory.server:apacheds-xdbm-partition:jar:2.0.0-M15:test<br />&#160;&#160;&#160;|&#160;&#160;&#160;&#160;&#160;\-&#160;(commons-collections:commons-collections:jar:3.2.1:test - omitted for conflict with 3.2.2)<br />&#160;&#160;&#160;+-&#160;org.apache.directory.server:apacheds-mavibot-partition:jar:2.0.0-M15:test<br />&#160;&#160;&#160;|&#160;&#160;\-&#160;org.apache.directory.mavibot:mavibot:jar:1.0.0-M1:test<br />&#160;&#160;&#160;|&#160;&#160;&#160;&#160;&#160;\-&#160;(commons-collections:commons-collections:jar:3.2.1:test - omitted for conflict with 3.2.2)<br />&#160;&#160;&#160;\-&
 #160;org.apache.directory.api:api-all:jar:1.0.0-M20:test<br />&#160;&#160;&#160;&#160;&#160;&#160;\-&#160;(commons-collections:commons-collections:jar:3.2.1:test - omitted for conflict with 3.2.2)<br /></li><br />
+<li>org.apache.hbase:hbase-testing-util:jar:3.0.0-SNAPSHOT<br />+-&#160;org.apache.hbase:hbase-common:jar:3.0.0-SNAPSHOT:compile<br />|&#160;&#160;\-&#160;commons-validator:commons-validator:jar:1.6:compile<br />|&#160;&#160;&#160;&#160;&#160;\-&#160;commons-beanutils:commons-beanutils:jar:1.9.2:compile<br />|&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;\-&#160;(commons-collections:commons-collections:jar:3.2.1:compile - omitted for conflict with 3.2.2)<br />+-&#160;org.apache.hadoop:hadoop-common:jar:2.7.7:compile<br />|&#160;&#160;\-&#160;commons-configuration:commons-configuration:jar:1.6:compile<br />|&#160;&#160;&#160;&#160;&#160;\-&#160;(commons-collections:commons-collections:jar:3.2.1:compile - omitted for conflict with 3.2.2)<br />\-&#160;org.apache.hadoop:hadoop-minikdc:jar:2.7.7:test<br />&#160;&#160;&#160;+-&#160;org.apache.directory.server:apacheds-core-api:jar:2.0.0-M15:test<br />&#160;&#160;&#160;|&#160;&#160;+-&#160;org.apache.directory.api:api-ldap-codec-core:jar
 :1.0.0-M20:test<br />&#160;&#160;&#160;|&#160;&#160;|&#160;&#160;\-&#160;(commons-collections:commons-collections:jar:3.2.1:test - omitted for conflict with 3.2.2)<br />&#160;&#160;&#160;|&#160;&#160;\-&#160;org.apache.directory.api:api-ldap-model:jar:1.0.0-M20:test<br />&#160;&#160;&#160;|&#160;&#160;&#160;&#160;&#160;\-&#160;(commons-collections:commons-collections:jar:3.2.1:test - omitted for conflict with 3.2.2)<br />&#160;&#160;&#160;+-&#160;org.apache.directory.server:apacheds-interceptor-kerberos:jar:2.0.0-M15:test<br />&#160;&#160;&#160;|&#160;&#160;\-&#160;org.apache.directory.server:apacheds-core:jar:2.0.0-M15:test<br />&#160;&#160;&#160;|&#160;&#160;&#160;&#160;&#160;+-&#160;org.apache.directory.server:apacheds-interceptors-authn:jar:2.0.0-M15:test<br />&#160;&#160;&#160;|&#160;&#160;&#160;&#160;&#160;|&#160;&#160;\-&#160;(commons-collections:commons-collections:jar:3.2.1:test - omitted for conflict with 3.2.2)<br />&#160;&#160;&#160;|&#160;&#160;&#160;&#160;&#160;\-&#160
 ;org.apache.directory.server:apacheds-interceptors-exception:jar:2.0.0-M15:test<br />&#160;&#160;&#160;|&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;\-&#160;(commons-collections:commons-collections:jar:3.2.1:test - omitted for conflict with 3.2.2)<br />&#160;&#160;&#160;+-&#160;org.apache.directory.server:apacheds-ldif-partition:jar:2.0.0-M15:test<br />&#160;&#160;&#160;|&#160;&#160;\-&#160;org.apache.directory.server:apacheds-xdbm-partition:jar:2.0.0-M15:test<br />&#160;&#160;&#160;|&#160;&#160;&#160;&#160;&#160;\-&#160;(commons-collections:commons-collections:jar:3.2.1:test - omitted for conflict with 3.2.2)<br />&#160;&#160;&#160;+-&#160;org.apache.directory.server:apacheds-mavibot-partition:jar:2.0.0-M15:test<br />&#160;&#160;&#160;|&#160;&#160;\-&#160;org.apache.directory.mavibot:mavibot:jar:1.0.0-M1:test<br />&#160;&#160;&#160;|&#160;&#160;&#160;&#160;&#160;\-&#160;(commons-collections:commons-collections:jar:3.2.1:test - omitted for conflict with 3.2.2)<br />&#160;&#160;&#
 160;\-&#160;org.apache.directory.api:api-all:jar:1.0.0-M20:test<br />&#160;&#160;&#160;&#160;&#160;&#160;\-&#160;(commons-collections:commons-collections:jar:3.2.1:test - omitted for conflict with 3.2.2)<br /></li><br />
+<li>org.apache.hbase:hbase-thrift:jar:3.0.0-SNAPSHOT<br />+-&#160;org.apache.hbase:hbase-common:jar:3.0.0-SNAPSHOT:compile<br />|&#160;&#160;\-&#160;commons-validator:commons-validator:jar:1.6:compile<br />|&#160;&#160;&#160;&#160;&#160;\-&#160;commons-beanutils:commons-beanutils:jar:1.9.2:compile<br />|&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;\-&#160;(commons-collections:commons-collections:jar:3.2.1:compile - omitted for conflict with 3.2.2)<br />\-&#160;org.apache.hadoop:hadoop-common:jar:2.7.7:compile<br />&#160;&#160;&#160;\-&#160;commons-configuration:commons-configuration:jar:1.6:compile<br />&#160;&#160;&#160;&#160;&#160;&#160;\-&#160;(commons-collections:commons-collections:jar:3.2.1:compile - omitted for conflict with 3.2.2)<br /></li><br />
+<li>org.apache.hbase:hbase-zookeeper:jar:3.0.0-SNAPSHOT<br />+-&#160;org.apache.hbase:hbase-common:jar:3.0.0-SNAPSHOT:compile<br />|&#160;&#160;\-&#160;commons-validator:commons-validator:jar:1.6:compile<br />|&#160;&#160;&#160;&#160;&#160;\-&#160;commons-beanutils:commons-beanutils:jar:1.9.2:compile<br />|&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;\-&#160;(commons-collections:commons-collections:jar:3.2.1:compile - omitted for conflict with 3.2.2)<br />\-&#160;org.apache.hadoop:hadoop-common:jar:2.7.7:compile<br />&#160;&#160;&#160;\-&#160;commons-configuration:commons-configuration:jar:1.6:compile<br />&#160;&#160;&#160;&#160;&#160;&#160;\-&#160;(commons-collections:commons-collections:jar:3.2.1:compile - omitted for conflict with 3.2.2)<br /></li><br /></ol></td></tr>
 <tr class="a">
 <td width="25%">3.2.2</td>
 <td>
 <ol style="list-style-type: decimal">
-<li>org.apache.hbase:hbase-assembly:pom:3.0.0-SNAPSHOT<br />+-&#160;org.apache.hbase:hbase-server:jar:3.0.0-SNAPSHOT:compile<br />|&#160;&#160;\-&#160;org.apache.hadoop:hadoop-common:jar:2.7.7:compile<br />|&#160;&#160;&#160;&#160;&#160;\-&#160;commons-collections:commons-collections:jar:3.2.2:compile<br />\-&#160;org.apache.hbase:hbase-testing-util:jar:3.0.0-SNAPSHOT:test<br />&#160;&#160;&#160;\-&#160;org.apache.hadoop:hadoop-minicluster:jar:2.7.7:test<br />&#160;&#160;&#160;&#160;&#160;&#160;+-&#160;org.apache.hadoop:hadoop-common:test-jar:tests:2.7.7:test<br />&#160;&#160;&#160;&#160;&#160;&#160;|&#160;&#160;\-&#160;(commons-collections:commons-collections:jar:3.2.2:test - omitted for duplicate)<br />&#160;&#160;&#160;&#160;&#160;&#160;\-&#160;org.apache.hadoop:hadoop-yarn-server-tests:test-jar:tests:2.7.7:test<br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;\-&#160;org.apache.hadoop:hadoop-yarn-server-resourcemanager:jar:2.7.7:test<br />&#160;&#160;&#160;&#160;&#160;
 &#160;&#160;&#160;&#160;&#160;&#160;&#160;\-&#160;org.apache.hadoop:hadoop-yarn-server-applicationhistoryservice:jar:2.7.7:test<br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;\-&#160;(commons-collections:commons-collections:jar:3.2.2:test - omitted for duplicate)<br /></li><br />
-<li>org.apache.hbase:hbase-backup:jar:3.0.0-SNAPSHOT<br />+-&#160;org.apache.hbase:hbase-testing-util:jar:3.0.0-SNAPSHOT:test<br />|&#160;&#160;\-&#160;org.apache.hadoop:hadoop-minicluster:jar:2.7.7:test<br />|&#160;&#160;&#160;&#160;&#160;+-&#160;org.apache.hadoop:hadoop-common:test-jar:tests:2.7.7:test<br />|&#160;&#160;&#160;&#160;&#160;|&#160;&#160;\-&#160;(commons-collections:commons-collections:jar:3.2.2:test - omitted for duplicate)<br />|&#160;&#160;&#160;&#160;&#160;\-&#160;org.apache.hadoop:hadoop-yarn-server-tests:test-jar:tests:2.7.7:test<br />|&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;\-&#160;org.apache.hadoop:hadoop-yarn-server-resourcemanager:jar:2.7.7:test<br />|&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;\-&#160;org.apache.hadoop:hadoop-yarn-server-applicationhistoryservice:jar:2.7.7:test<br />|&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;\-&#160;(commons-collections:commons-collections:jar:3.2.2:tes
 t - omitted for duplicate)<br />\-&#160;org.apache.hadoop:hadoop-common:jar:2.7.7:compile<br />&#160;&#160;&#160;\-&#160;commons-collections:commons-collections:jar:3.2.2:compile<br /></li><br />
-<li>org.apache.hbase:hbase-client-project:jar:3.0.0-SNAPSHOT<br />+-&#160;org.apache.hbase:hbase-testing-util:jar:3.0.0-SNAPSHOT:test<br />|&#160;&#160;\-&#160;org.apache.hadoop:hadoop-minicluster:jar:2.7.7:test<br />|&#160;&#160;&#160;&#160;&#160;+-&#160;org.apache.hadoop:hadoop-common:test-jar:tests:2.7.7:test<br />|&#160;&#160;&#160;&#160;&#160;|&#160;&#160;\-&#160;(commons-collections:commons-collections:jar:3.2.2:test - omitted for duplicate)<br />|&#160;&#160;&#160;&#160;&#160;\-&#160;org.apache.hadoop:hadoop-yarn-server-tests:test-jar:tests:2.7.7:test<br />|&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;\-&#160;org.apache.hadoop:hadoop-yarn-server-resourcemanager:jar:2.7.7:test<br />|&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;\-&#160;org.apache.hadoop:hadoop-yarn-server-applicationhistoryservice:jar:2.7.7:test<br />|&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;\-&#160;(commons-collections:commons-collections:jar:3
 .2.2:test - omitted for duplicate)<br />\-&#160;org.apache.hbase:hbase-common:jar:3.0.0-SNAPSHOT:compile<br />&#160;&#160;&#160;\-&#160;org.apache.hadoop:hadoop-common:jar:2.7.7:compile<br />&#160;&#160;&#160;&#160;&#160;&#160;\-&#160;commons-collections:commons-collections:jar:3.2.2:compile<br /></li><br />
-<li>org.apache.hbase:hbase-client:jar:3.0.0-SNAPSHOT<br />\-&#160;org.apache.hadoop:hadoop-common:jar:2.7.7:compile<br />&#160;&#160;&#160;\-&#160;commons-collections:commons-collections:jar:3.2.2:compile<br /></li><br />
-<li>org.apache.hbase:hbase-common:jar:3.0.0-SNAPSHOT<br />\-&#160;org.apache.hadoop:hadoop-common:jar:2.7.7:compile<br />&#160;&#160;&#160;\-&#160;commons-collections:commons-collections:jar:3.2.2:compile<br /></li><br />
-<li>org.apache.hbase:hbase-endpoint:jar:3.0.0-SNAPSHOT<br />+-&#160;org.apache.hadoop:hadoop-common:jar:2.7.7:compile<br />|&#160;&#160;\-&#160;commons-collections:commons-collections:jar:3.2.2:compile<br />\-&#160;org.apache.hadoop:hadoop-minicluster:jar:2.7.7:test<br />&#160;&#160;&#160;+-&#160;org.apache.hadoop:hadoop-common:test-jar:tests:2.7.7:test<br />&#160;&#160;&#160;|&#160;&#160;\-&#160;(commons-collections:commons-collections:jar:3.2.2:test - omitted for duplicate)<br />&#160;&#160;&#160;\-&#160;org.apache.hadoop:hadoop-yarn-server-tests:test-jar:tests:2.7.7:test<br />&#160;&#160;&#160;&#160;&#160;&#160;\-&#160;org.apache.hadoop:hadoop-yarn-server-resourcemanager:jar:2.7.7:test<br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;\-&#160;org.apache.hadoop:hadoop-yarn-server-applicationhistoryservice:jar:2.7.7:test<br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;\-&#160;(commons-collections:commons-collections:jar:3.2.2:test - omitted for
  duplicate)<br /></li><br />
-<li>org.apache.hbase:hbase-examples:jar:3.0.0-SNAPSHOT<br />+-&#160;org.apache.hbase:hbase-testing-util:jar:3.0.0-SNAPSHOT:test<br />|&#160;&#160;\-&#160;org.apache.hadoop:hadoop-minicluster:jar:2.7.7:test<br />|&#160;&#160;&#160;&#160;&#160;+-&#160;org.apache.hadoop:hadoop-common:test-jar:tests:2.7.7:test<br />|&#160;&#160;&#160;&#160;&#160;|&#160;&#160;\-&#160;(commons-collections:commons-collections:jar:3.2.2:test - omitted for duplicate)<br />|&#160;&#160;&#160;&#160;&#160;\-&#160;org.apache.hadoop:hadoop-yarn-server-tests:test-jar:tests:2.7.7:test<br />|&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;\-&#160;org.apache.hadoop:hadoop-yarn-server-resourcemanager:jar:2.7.7:test<br />|&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;\-&#160;org.apache.hadoop:hadoop-yarn-server-applicationhistoryservice:jar:2.7.7:test<br />|&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;\-&#160;(commons-collections:commons-collections:jar:3.2.2:t
 est - omitted for duplicate)<br />\-&#160;org.apache.hadoop:hadoop-common:jar:2.7.7:compile<br />&#160;&#160;&#160;\-&#160;commons-collections:commons-collections:jar:3.2.2:compile<br /></li><br />
-<li>org.apache.hbase:hbase-external-blockcache:jar:3.0.0-SNAPSHOT<br />\-&#160;org.apache.hadoop:hadoop-common:jar:2.7.7:compile<br />&#160;&#160;&#160;\-&#160;commons-collections:commons-collections:jar:3.2.2:compile<br /></li><br />
-<li>org.apache.hbase:hbase-hadoop-compat:jar:3.0.0-SNAPSHOT<br />\-&#160;org.apache.hbase:hbase-metrics-api:jar:3.0.0-SNAPSHOT:compile<br />&#160;&#160;&#160;\-&#160;org.apache.hbase:hbase-common:jar:3.0.0-SNAPSHOT:compile<br />&#160;&#160;&#160;&#160;&#160;&#160;\-&#160;org.apache.hadoop:hadoop-common:jar:2.7.7:compile<br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;\-&#160;commons-collections:commons-collections:jar:3.2.2:compile<br /></li><br />
-<li>org.apache.hbase:hbase-hadoop2-compat:jar:3.0.0-SNAPSHOT<br />\-&#160;org.apache.hadoop:hadoop-common:jar:2.7.7:compile<br />&#160;&#160;&#160;\-&#160;commons-collections:commons-collections:jar:3.2.2:compile<br /></li><br />
-<li>org.apache.hbase:hbase-http:jar:3.0.0-SNAPSHOT<br />+-&#160;org.apache.hadoop:hadoop-common:jar:2.7.7:compile<br />|&#160;&#160;\-&#160;commons-collections:commons-collections:jar:3.2.2:compile<br />\-&#160;org.apache.hadoop:hadoop-minicluster:jar:2.7.7:test<br />&#160;&#160;&#160;+-&#160;org.apache.hadoop:hadoop-common:test-jar:tests:2.7.7:test<br />&#160;&#160;&#160;|&#160;&#160;\-&#160;(commons-collections:commons-collections:jar:3.2.2:test - omitted for duplicate)<br />&#160;&#160;&#160;\-&#160;org.apache.hadoop:hadoop-yarn-server-tests:test-jar:tests:2.7.7:test<br />&#160;&#160;&#160;&#160;&#160;&#160;\-&#160;org.apache.hadoop:hadoop-yarn-server-resourcemanager:jar:2.7.7:test<br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;\-&#160;org.apache.hadoop:hadoop-yarn-server-applicationhistoryservice:jar:2.7.7:test<br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;\-&#160;(commons-collections:commons-collections:jar:3.2.2:test - omitted for dup
 licate)<br /></li><br />
-<li>org.apache.hbase:hbase-it:jar:3.0.0-SNAPSHOT<br />+-&#160;org.apache.hbase:hbase-testing-util:jar:3.0.0-SNAPSHOT:test<br />|&#160;&#160;\-&#160;org.apache.hadoop:hadoop-minicluster:jar:2.7.7:test<br />|&#160;&#160;&#160;&#160;&#160;+-&#160;org.apache.hadoop:hadoop-common:test-jar:tests:2.7.7:test<br />|&#160;&#160;&#160;&#160;&#160;|&#160;&#160;\-&#160;(commons-collections:commons-collections:jar:3.2.2:test - omitted for duplicate)<br />|&#160;&#160;&#160;&#160;&#160;\-&#160;org.apache.hadoop:hadoop-yarn-server-tests:test-jar:tests:2.7.7:test<br />|&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;\-&#160;org.apache.hadoop:hadoop-yarn-server-resourcemanager:jar:2.7.7:test<br />|&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;\-&#160;org.apache.hadoop:hadoop-yarn-server-applicationhistoryservice:jar:2.7.7:test<br />|&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;\-&#160;(commons-collections:commons-collections:jar:3.2.2:test - 
 omitted for duplicate)<br />\-&#160;org.apache.hadoop:hadoop-common:jar:2.7.7:compile<br />&#160;&#160;&#160;\-&#160;commons-collections:commons-collections:jar:3.2.2:compile<br /></li><br />
-<li>org.apache.hbase:hbase-mapreduce:jar:3.0.0-SNAPSHOT<br />+-&#160;org.apache.hadoop:hadoop-common:jar:2.7.7:compile<br />|&#160;&#160;\-&#160;commons-collections:commons-collections:jar:3.2.2:compile<br />\-&#160;org.apache.hadoop:hadoop-minicluster:jar:2.7.7:test<br />&#160;&#160;&#160;+-&#160;org.apache.hadoop:hadoop-common:test-jar:tests:2.7.7:test<br />&#160;&#160;&#160;|&#160;&#160;\-&#160;(commons-collections:commons-collections:jar:3.2.2:test - omitted for duplicate)<br />&#160;&#160;&#160;\-&#160;org.apache.hadoop:hadoop-yarn-server-tests:test-jar:tests:2.7.7:test<br />&#160;&#160;&#160;&#160;&#160;&#160;\-&#160;org.apache.hadoop:hadoop-yarn-server-resourcemanager:jar:2.7.7:test<br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;\-&#160;org.apache.hadoop:hadoop-yarn-server-applicationhistoryservice:jar:2.7.7:test<br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;\-&#160;(commons-collections:commons-collections:jar:3.2.2:test - omitted fo
 r duplicate)<br /></li><br />
-<li>org.apache.hbase:hbase-metrics-api:jar:3.0.0-SNAPSHOT<br />\-&#160;org.apache.hbase:hbase-common:jar:3.0.0-SNAPSHOT:compile<br />&#160;&#160;&#160;\-&#160;org.apache.hadoop:hadoop-common:jar:2.7.7:compile<br />&#160;&#160;&#160;&#160;&#160;&#160;\-&#160;commons-collections:commons-collections:jar:3.2.2:compile<br /></li><br />
-<li>org.apache.hbase:hbase-metrics:jar:3.0.0-SNAPSHOT<br />\-&#160;org.apache.hbase:hbase-common:jar:3.0.0-SNAPSHOT:compile<br />&#160;&#160;&#160;\-&#160;org.apache.hadoop:hadoop-common:jar:2.7.7:compile<br />&#160;&#160;&#160;&#160;&#160;&#160;\-&#160;commons-collections:commons-collections:jar:3.2.2:compile<br /></li><br />
-<li>org.apache.hbase:hbase-procedure:jar:3.0.0-SNAPSHOT<br />\-&#160;org.apache.hadoop:hadoop-common:jar:2.7.7:compile<br />&#160;&#160;&#160;\-&#160;commons-collections:commons-collections:jar:3.2.2:compile<br /></li><br />
-<li>org.apache.hbase:hbase-replication:jar:3.0.0-SNAPSHOT<br />\-&#160;org.apache.hadoop:hadoop-common:jar:2.7.7:compile<br />&#160;&#160;&#160;\-&#160;commons-collections:commons-collections:jar:3.2.2:compile<br /></li><br />
-<li>org.apache.hbase:hbase-rest:jar:3.0.0-SNAPSHOT<br />+-&#160;org.apache.hbase:hbase-testing-util:jar:3.0.0-SNAPSHOT:test<br />|&#160;&#160;\-&#160;org.apache.hadoop:hadoop-minicluster:jar:2.7.7:test<br />|&#160;&#160;&#160;&#160;&#160;+-&#160;org.apache.hadoop:hadoop-common:test-jar:tests:2.7.7:test<br />|&#160;&#160;&#160;&#160;&#160;|&#160;&#160;\-&#160;(commons-collections:commons-collections:jar:3.2.2:test - omitted for duplicate)<br />|&#160;&#160;&#160;&#160;&#160;\-&#160;org.apache.hadoop:hadoop-yarn-server-tests:test-jar:tests:2.7.7:test<br />|&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;\-&#160;org.apache.hadoop:hadoop-yarn-server-resourcemanager:jar:2.7.7:test<br />|&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;\-&#160;org.apache.hadoop:hadoop-yarn-server-applicationhistoryservice:jar:2.7.7:test<br />|&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;\-&#160;(commons-collections:commons-collections:jar:3.2.2:test 
 - omitted for duplicate)<br />\-&#160;org.apache.hadoop:hadoop-common:jar:2.7.7:compile<br />&#160;&#160;&#160;\-&#160;commons-collections:commons-collections:jar:3.2.2:compile<br /></li><br />
-<li>org.apache.hbase:hbase-rsgroup:jar:3.0.0-SNAPSHOT<br />+-&#160;org.apache.hbase:hbase-testing-util:jar:3.0.0-SNAPSHOT:test<br />|&#160;&#160;\-&#160;org.apache.hadoop:hadoop-minicluster:jar:2.7.7:test<br />|&#160;&#160;&#160;&#160;&#160;+-&#160;org.apache.hadoop:hadoop-common:test-jar:tests:2.7.7:test<br />|&#160;&#160;&#160;&#160;&#160;|&#160;&#160;\-&#160;(commons-collections:commons-collections:jar:3.2.2:test - omitted for duplicate)<br />|&#160;&#160;&#160;&#160;&#160;\-&#160;org.apache.hadoop:hadoop-yarn-server-tests:test-jar:tests:2.7.7:test<br />|&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;\-&#160;org.apache.hadoop:hadoop-yarn-server-resourcemanager:jar:2.7.7:test<br />|&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;\-&#160;org.apache.hadoop:hadoop-yarn-server-applicationhistoryservice:jar:2.7.7:test<br />|&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;\-&#160;(commons-collections:commons-collections:jar:3.2.2:te
 st - omitted for duplicate)<br />\-&#160;org.apache.hadoop:hadoop-common:jar:2.7.7:compile<br />&#160;&#160;&#160;\-&#160;commons-collections:commons-collections:jar:3.2.2:compile<br /></li><br />
-<li>org.apache.hbase:hbase-server:jar:3.0.0-SNAPSHOT<br />+-&#160;org.apache.hadoop:hadoop-common:jar:2.7.7:compile<br />|&#160;&#160;\-&#160;commons-collections:commons-collections:jar:3.2.2:compile<br />\-&#160;org.apache.hadoop:hadoop-minicluster:jar:2.7.7:test<br />&#160;&#160;&#160;+-&#160;org.apache.hadoop:hadoop-common:test-jar:tests:2.7.7:test<br />&#160;&#160;&#160;|&#160;&#160;\-&#160;(commons-collections:commons-collections:jar:3.2.2:test - omitted for duplicate)<br />&#160;&#160;&#160;\-&#160;org.apache.hadoop:hadoop-yarn-server-tests:test-jar:tests:2.7.7:test<br />&#160;&#160;&#160;&#160;&#160;&#160;\-&#160;org.apache.hadoop:hadoop-yarn-server-resourcemanager:jar:2.7.7:test<br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;\-&#160;org.apache.hadoop:hadoop-yarn-server-applicationhistoryservice:jar:2.7.7:test<br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;\-&#160;(commons-collections:commons-collections:jar:3.2.2:test - omitted for d
 uplicate)<br /></li><br />
-<li>org.apache.hbase:hbase-shaded-check-invariants:pom:3.0.0-SNAPSHOT<br />\-&#160;org.apache.hbase:hbase-shaded-mapreduce:jar:3.0.0-SNAPSHOT:compile<br />&#160;&#160;&#160;\-&#160;org.apache.hbase:hbase-mapreduce:jar:3.0.0-SNAPSHOT:compile<br />&#160;&#160;&#160;&#160;&#160;&#160;\-&#160;org.apache.hadoop:hadoop-common:jar:2.7.7:compile<br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;\-&#160;commons-collections:commons-collections:jar:3.2.2:compile<br /></li><br />
-<li>org.apache.hbase:hbase-shaded-client-byo-hadoop:jar:3.0.0-SNAPSHOT<br />\-&#160;org.apache.hbase:hbase-client:jar:3.0.0-SNAPSHOT:compile<br />&#160;&#160;&#160;\-&#160;org.apache.hadoop:hadoop-common:jar:2.7.7:compile<br />&#160;&#160;&#160;&#160;&#160;&#160;\-&#160;commons-collections:commons-collections:jar:3.2.2:compile<br /></li><br />
-<li>org.apache.hbase:hbase-shaded-client-project:jar:3.0.0-SNAPSHOT<br />+-&#160;org.apache.hbase:hbase-testing-util:jar:3.0.0-SNAPSHOT:test<br />|&#160;&#160;\-&#160;org.apache.hadoop:hadoop-minicluster:jar:2.7.7:test<br />|&#160;&#160;&#160;&#160;&#160;+-&#160;org.apache.hadoop:hadoop-common:test-jar:tests:2.7.7:test<br />|&#160;&#160;&#160;&#160;&#160;|&#160;&#160;\-&#160;(commons-collections:commons-collections:jar:3.2.2:test - omitted for duplicate)<br />|&#160;&#160;&#160;&#160;&#160;\-&#160;org.apache.hadoop:hadoop-yarn-server-tests:test-jar:tests:2.7.7:test<br />|&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;\-&#160;org.apache.hadoop:hadoop-yarn-server-resourcemanager:jar:2.7.7:test<br />|&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;\-&#160;org.apache.hadoop:hadoop-yarn-server-applicationhistoryservice:jar:2.7.7:test<br />|&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;\-&#160;(commons-collections:commons-collection
 s:jar:3.2.2:test - omitted for duplicate)<br />\-&#160;org.apache.hbase:hbase-shaded-client:jar:3.0.0-SNAPSHOT:compile<br />&#160;&#160;&#160;\-&#160;org.apache.hbase:hbase-client:jar:3.0.0-SNAPSHOT:compile<br />&#160;&#160;&#160;&#160;&#160;&#160;\-&#160;org.apache.hadoop:hadoop-common:jar:2.7.7:compile<br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;\-&#160;commons-collections:commons-collections:jar:3.2.2:compile<br /></li><br />
-<li>org.apache.hbase:hbase-shaded-client:jar:3.0.0-SNAPSHOT<br />\-&#160;org.apache.hbase:hbase-client:jar:3.0.0-SNAPSHOT:compile<br />&#160;&#160;&#160;\-&#160;org.apache.hadoop:hadoop-common:jar:2.7.7:compile<br />&#160;&#160;&#160;&#160;&#160;&#160;\-&#160;commons-collections:commons-collections:jar:3.2.2:compile<br /></li><br />
-<li>org.apache.hbase:hbase-shaded-mapreduce:jar:3.0.0-SNAPSHOT<br />\-&#160;org.apache.hadoop:hadoop-common:jar:2.7.7:provided (scope not updated to compile)<br />&#160;&#160;&#160;\-&#160;commons-collections:commons-collections:jar:3.2.2:provided<br /></li><br />
-<li>org.apache.hbase:hbase-shaded-with-hadoop-check-invariants:pom:3.0.0-SNAPSHOT<br />\-&#160;org.apache.hbase:hbase-shaded-client:jar:3.0.0-SNAPSHOT:compile<br />&#160;&#160;&#160;\-&#160;org.apache.hbase:hbase-client:jar:3.0.0-SNAPSHOT:compile<br />&#160;&#160;&#160;&#160;&#160;&#160;\-&#160;org.apache.hadoop:hadoop-common:jar:2.7.7:compile<br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;\-&#160;commons-collections:commons-collections:jar:3.2.2:compile<br /></li><br />
-<li>org.apache.hbase:hbase-shell:jar:3.0.0-SNAPSHOT<br />+-&#160;org.apache.hadoop:hadoop-common:jar:2.7.7:compile<br />|&#160;&#160;\-&#160;commons-collections:commons-collections:jar:3.2.2:compile<br />\-&#160;org.apache.hadoop:hadoop-minicluster:jar:2.7.7:test<br />&#160;&#160;&#160;+-&#160;org.apache.hadoop:hadoop-common:test-jar:tests:2.7.7:test<br />&#160;&#160;&#160;|&#160;&#160;\-&#160;(commons-collections:commons-collections:jar:3.2.2:test - omitted for duplicate)<br />&#160;&#160;&#160;\-&#160;org.apache.hadoop:hadoop-yarn-server-tests:test-jar:tests:2.7.7:test<br />&#160;&#160;&#160;&#160;&#160;&#160;\-&#160;org.apache.hadoop:hadoop-yarn-server-resourcemanager:jar:2.7.7:test<br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;\-&#160;org.apache.hadoop:hadoop-yarn-server-applicationhistoryservice:jar:2.7.7:test<br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;\-&#160;(commons-collections:commons-collections:jar:3.2.2:test - omitted for du
 plicate)<br /></li><br />
-<li>org.apache.hbase:hbase-testing-util:jar:3.0.0-SNAPSHOT<br />+-&#160;org.apache.hadoop:hadoop-common:jar:2.7.7:compile<br />|&#160;&#160;\-&#160;commons-collections:commons-collections:jar:3.2.2:compile<br />\-&#160;org.apache.hadoop:hadoop-minicluster:jar:2.7.7:compile<br />&#160;&#160;&#160;+-&#160;org.apache.hadoop:hadoop-common:test-jar:tests:2.7.7:compile<br />&#160;&#160;&#160;|&#160;&#160;\-&#160;(commons-collections:commons-collections:jar:3.2.2:compile - omitted for duplicate)<br />&#160;&#160;&#160;\-&#160;org.apache.hadoop:hadoop-yarn-server-tests:test-jar:tests:2.7.7:compile<br />&#160;&#160;&#160;&#160;&#160;&#160;\-&#160;org.apache.hadoop:hadoop-yarn-server-resourcemanager:jar:2.7.7:compile<br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;\-&#160;org.apache.hadoop:hadoop-yarn-server-applicationhistoryservice:jar:2.7.7:compile<br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;\-&#160;(commons-collections:commons-collections:jar:3.
 2.2:compile - omitted for duplicate)<br /></li><br />
-<li>org.apache.hbase:hbase-thrift:jar:3.0.0-SNAPSHOT<br />+-&#160;org.apache.hadoop:hadoop-common:jar:2.7.7:compile<br />|&#160;&#160;\-&#160;commons-collections:commons-collections:jar:3.2.2:compile<br />\-&#160;org.apache.hadoop:hadoop-minicluster:jar:2.7.7:test<br />&#160;&#160;&#160;+-&#160;org.apache.hadoop:hadoop-common:test-jar:tests:2.7.7:test<br />&#160;&#160;&#160;|&#160;&#160;\-&#160;(commons-collections:commons-collections:jar:3.2.2:test - omitted for duplicate)<br />&#160;&#160;&#160;\-&#160;org.apache.hadoop:hadoop-yarn-server-tests:test-jar:tests:2.7.7:test<br />&#160;&#160;&#160;&#160;&#160;&#160;\-&#160;org.apache.hadoop:hadoop-yarn-server-resourcemanager:jar:2.7.7:test<br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;\-&#160;org.apache.hadoop:hadoop-yarn-server-applicationhistoryservice:jar:2.7.7:test<br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;\-&#160;(commons-collections:commons-collections:jar:3.2.2:test - omitted for d
 uplicate)<br /></li><br />
-<li>org.apache.hbase:hbase-zookeeper:jar:3.0.0-SNAPSHOT<br />\-&#160;org.apache.hadoop:hadoop-common:jar:2.7.7:compile<br />&#160;&#160;&#160;\-&#160;commons-collections:commons-collections:jar:3.2.2:compile<br /></li><br /></ol></td></tr></table></td></tr></table></div>
+<li>org.apache.hbase:hbase-assembly:pom:3.0.0-SNAPSHOT<br />+-&#160;org.apache.hbase:hbase-server:jar:3.0.0-SNAPSHOT:compile<br />|&#160;&#160;+-&#160;org.apache.hbase:hbase-common:jar:3.0.0-SNAPSHOT:compile<br />|&#160;&#160;|&#160;&#160;\-&#160;commons-validator:commons-validator:jar:1.6:compile<br />|&#160;&#160;|&#160;&#160;&#160;&#160;&#160;\-&#160;(commons-collections:commons-collections:jar:3.2.2:compile - omitted for duplicate)<br />|&#160;&#160;\-&#160;org.apache.hadoop:hadoop-common:jar:2.7.7:compile<br />|&#160;&#160;&#160;&#160;&#160;\-&#160;commons-collections:commons-collections:jar:3.2.2:compile<br />\-&#160;org.apache.hbase:hbase-testing-util:jar:3.0.0-SNAPSHOT:test<br />&#160;&#160;&#160;\-&#160;org.apache.hadoop:hadoop-minicluster:jar:2.7.7:test<br />&#160;&#160;&#160;&#160;&#160;&#160;+-&#160;org.apache.hadoop:hadoop-common:test-jar:tests:2.7.7:test<br />&#160;&#160;&#160;&#160;&#160;&#160;|&#160;&#160;\-&#160;(commons-collections:commons-collections:jar:3.2.2:tes
 t - omitted for duplicate)<br />&#160;&#160;&#160;&#160;&#160;&#160;\-&#160;org.apache.hadoop:hadoop-yarn-server-tests:test-jar:tests:2.7.7:test<br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;\-&#160;org.apache.hadoop:hadoop-yarn-server-resourcemanager:jar:2.7.7:test<br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;\-&#160;org.apache.hadoop:hadoop-yarn-server-applicationhistoryservice:jar:2.7.7:test<br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;\-&#160;(commons-collections:commons-collections:jar:3.2.2:test - omitted for duplicate)<br /></li><br />
+<li>org.apache.hbase:hbase-backup:jar:3.0.0-SNAPSHOT<br />+-&#160;org.apache.hbase:hbase-common:jar:3.0.0-SNAPSHOT:compile<br />|&#160;&#160;\-&#160;commons-validator:commons-validator:jar:1.6:compile<br />|&#160;&#160;&#160;&#160;&#160;\-&#160;(commons-collections:commons-collections:jar:3.2.2:compile - omitted for duplicate)<br />+-&#160;org.apache.hbase:hbase-testing-util:jar:3.0.0-SNAPSHOT:test<br />|&#160;&#160;\-&#160;org.apache.hadoop:hadoop-minicluster:jar:2.7.7:test<br />|&#160;&#160;&#160;&#160;&#160;+-&#160;org.apache.hadoop:hadoop-common:test-jar:tests:2.7.7:test<br />|&#160;&#160;&#160;&#160;&#160;|&#160;&#160;\-&#160;(commons-collections:commons-collections:jar:3.2.2:test - omitted for duplicate)<br />|&#160;&#160;&#160;&#160;&#160;\-&#160;org.apache.hadoop:hadoop-yarn-server-tests:test-jar:tests:2.7.7:test<br />|&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;\-&#160;org.apache.hadoop:hadoop-yarn-server-resourcemanager:jar:2.7.7:test<br />|&#160;&#160;&#160;&#160;&#16
 0;&#160;&#160;&#160;&#160;&#160;&#160;\-&#160;org.apache.hadoop:hadoop-yarn-server-applicationhistoryservice:jar:2.7.7:test<br />|&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;\-&#160;(commons-collections:commons-collections:jar:3.2.2:test - omitted for duplicate)<br />\-&#160;org.apache.hadoop:hadoop-common:jar:2.7.7:compile<br />&#160;&#160;&#160;\-&#160;commons-collections:commons-collections:jar:3.2.2:compile<br /></li><br />
+<li>org.apache.hbase:hbase-client-project:jar:3.0.0-SNAPSHOT<br />+-&#160;org.apache.hbase:hbase-testing-util:jar:3.0.0-SNAPSHOT:test<br />|&#160;&#160;\-&#160;org.apache.hadoop:hadoop-minicluster:jar:2.7.7:test<br />|&#160;&#160;&#160;&#160;&#160;+-&#160;org.apache.hadoop:hadoop-common:test-jar:tests:2.7.7:test<br />|&#160;&#160;&#160;&#160;&#160;|&#160;&#160;\-&#160;(commons-collections:commons-collections:jar:3.2.2:test - omitted for duplicate)<br />|&#160;&#160;&#160;&#160;&#160;\-&#160;org.apache.hadoop:hadoop-yarn-server-tests:test-jar:tests:2.7.7:test<br />|&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;\-&#160;org.apache.hadoop:hadoop-yarn-server-resourcemanager:jar:2.7.7:test<br />|&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;\-&#160;org.apache.hadoop:hadoop-yarn-server-applicationhistoryservice:jar:2.7.7:test<br />|&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;\-&#160;(commons-collections:commons-collections:jar:3
 .2.2:test - omitted for duplicate)<br />\-&#160;org.apache.hbase:hbase-common:jar:3.0.0-SNAPSHOT:compile<br />&#160;&#160;&#160;+-&#160;commons-validator:commons-validator:jar:1.6:compile<br />&#160;&#160;&#160;|&#160;&#160;+-&#160;commons-beanutils:commons-beanutils:jar:1.9.2:compile<br />&#160;&#160;&#160;|&#160;&#160;|&#160;&#160;\-&#160;(commons-collections:commons-collections:jar:3.2.2:compile - omitted for duplicate)<br />&#160;&#160;&#160;|&#160;&#160;\-&#160;commons-collections:commons-collections:jar:3.2.2:compile<br />&#160;&#160;&#160;\-&#160;org.apache.hadoop:hadoop-common:jar:2.7.7:compile<br />&#160;&#160;&#160;&#160;&#160;&#160;\-&#160;(commons-collections:commons-collections:jar:3.2.2:compile - omitted for duplicate)<br /></li><br />
+<li>org.apache.hbase:hbase-client:jar:3.0.0-SNAPSHOT<br />+-&#160;org.apache.hbase:hbase-common:jar:3.0.0-SNAPSHOT:compile<br />|&#160;&#160;\

<TRUNCATED>

[18/29] hbase-site git commit: Published site at 5e84997f2ffdbcf5f849d70c30ddbe2db4039ca4.

Posted by gi...@apache.org.
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/27f5bfb5/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 dd0dd0f..9fd7e0b 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
@@ -975,1128 +975,1136 @@
 <span class="sourceLineNo">967</span>        store.update(procedure);<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>      // If we don't have the lock, we can't re-submit the queue,<a name="line.970"></a>
-<span class="sourceLineNo">971</span>      // since it is already executing. To get rid of the stuck situation, we<a name="line.971"></a>
-<span class="sourceLineNo">972</span>      // need to restart the master. With the procedure set to bypass, the procedureExecutor<a name="line.972"></a>
-<span class="sourceLineNo">973</span>      // will bypass it and won't get stuck again.<a name="line.973"></a>
-<span class="sourceLineNo">974</span>      if (lockEntry != null) {<a name="line.974"></a>
-<span class="sourceLineNo">975</span>        // add the procedure to run queue,<a name="line.975"></a>
-<span class="sourceLineNo">976</span>        scheduler.addFront(procedure);<a name="line.976"></a>
-<span class="sourceLineNo">977</span>        LOG.debug("Bypassing {} and its ancestors successfully, adding to queue", procedure);<a name="line.977"></a>
-<span class="sourceLineNo">978</span>      } else {<a name="line.978"></a>
-<span class="sourceLineNo">979</span>        LOG.debug("Bypassing {} and its ancestors successfully, but since it is already running, "<a name="line.979"></a>
-<span class="sourceLineNo">980</span>            + "skipping add to queue", procedure);<a name="line.980"></a>
-<span class="sourceLineNo">981</span>      }<a name="line.981"></a>
-<span class="sourceLineNo">982</span>      return true;<a name="line.982"></a>
-<span class="sourceLineNo">983</span><a name="line.983"></a>
-<span class="sourceLineNo">984</span>    } finally {<a name="line.984"></a>
-<span class="sourceLineNo">985</span>      if (lockEntry != null) {<a name="line.985"></a>
-<span class="sourceLineNo">986</span>        procExecutionLock.releaseLockEntry(lockEntry);<a name="line.986"></a>
-<span class="sourceLineNo">987</span>      }<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><a name="line.990"></a>
-<span class="sourceLineNo">991</span>  /**<a name="line.991"></a>
-<span class="sourceLineNo">992</span>   * Add a new root-procedure to the executor.<a name="line.992"></a>
-<span class="sourceLineNo">993</span>   * @param proc the new procedure to execute.<a name="line.993"></a>
-<span class="sourceLineNo">994</span>   * @param nonceKey the registered unique identifier for this operation from the client or process.<a name="line.994"></a>
-<span class="sourceLineNo">995</span>   * @return the procedure id, that can be used to monitor the operation<a name="line.995"></a>
-<span class="sourceLineNo">996</span>   */<a name="line.996"></a>
-<span class="sourceLineNo">997</span>  @edu.umd.cs.findbugs.annotations.SuppressWarnings(value="NP_NULL_ON_SOME_PATH",<a name="line.997"></a>
-<span class="sourceLineNo">998</span>      justification = "FindBugs is blind to the check-for-null")<a name="line.998"></a>
-<span class="sourceLineNo">999</span>  public long submitProcedure(Procedure&lt;TEnvironment&gt; proc, NonceKey nonceKey) {<a name="line.999"></a>
-<span class="sourceLineNo">1000</span>    Preconditions.checkArgument(lastProcId.get() &gt;= 0);<a name="line.1000"></a>
-<span class="sourceLineNo">1001</span><a name="line.1001"></a>
-<span class="sourceLineNo">1002</span>    prepareProcedure(proc);<a name="line.1002"></a>
-<span class="sourceLineNo">1003</span><a name="line.1003"></a>
-<span class="sourceLineNo">1004</span>    final Long currentProcId;<a name="line.1004"></a>
-<span class="sourceLineNo">1005</span>    if (nonceKey != null) {<a name="line.1005"></a>
-<span class="sourceLineNo">1006</span>      currentProcId = nonceKeysToProcIdsMap.get(nonceKey);<a name="line.1006"></a>
-<span class="sourceLineNo">1007</span>      Preconditions.checkArgument(currentProcId != null,<a name="line.1007"></a>
-<span class="sourceLineNo">1008</span>        "Expected nonceKey=" + nonceKey + " to be reserved, use registerNonce(); proc=" + proc);<a name="line.1008"></a>
-<span class="sourceLineNo">1009</span>    } else {<a name="line.1009"></a>
-<span class="sourceLineNo">1010</span>      currentProcId = nextProcId();<a name="line.1010"></a>
-<span class="sourceLineNo">1011</span>    }<a name="line.1011"></a>
-<span class="sourceLineNo">1012</span><a name="line.1012"></a>
-<span class="sourceLineNo">1013</span>    // Initialize the procedure<a name="line.1013"></a>
-<span class="sourceLineNo">1014</span>    proc.setNonceKey(nonceKey);<a name="line.1014"></a>
-<span class="sourceLineNo">1015</span>    proc.setProcId(currentProcId.longValue());<a name="line.1015"></a>
-<span class="sourceLineNo">1016</span><a name="line.1016"></a>
-<span class="sourceLineNo">1017</span>    // Commit the transaction<a name="line.1017"></a>
-<span class="sourceLineNo">1018</span>    store.insert(proc, null);<a name="line.1018"></a>
-<span class="sourceLineNo">1019</span>    LOG.debug("Stored {}", proc);<a name="line.1019"></a>
+<span class="sourceLineNo">970</span>      // If state of procedure is WAITING_TIMEOUT, we can directly submit it to the scheduler.<a name="line.970"></a>
+<span class="sourceLineNo">971</span>      // Instead we should remove it from timeout Executor queue and tranfer its state to RUNNABLE<a name="line.971"></a>
+<span class="sourceLineNo">972</span>      if (procedure.getState() == ProcedureState.WAITING_TIMEOUT) {<a name="line.972"></a>
+<span class="sourceLineNo">973</span>        LOG.debug("transform procedure {} from WAITING_TIMEOUT to RUNNABLE", procedure);<a name="line.973"></a>
+<span class="sourceLineNo">974</span>        if (timeoutExecutor.remove(procedure)) {<a name="line.974"></a>
+<span class="sourceLineNo">975</span>          LOG.debug("removed procedure {} from timeoutExecutor", procedure);<a name="line.975"></a>
+<span class="sourceLineNo">976</span>          timeoutExecutor.executeTimedoutProcedure(procedure);<a name="line.976"></a>
+<span class="sourceLineNo">977</span>        }<a name="line.977"></a>
+<span class="sourceLineNo">978</span>      } else if (lockEntry != null) {<a name="line.978"></a>
+<span class="sourceLineNo">979</span>        scheduler.addFront(procedure);<a name="line.979"></a>
+<span class="sourceLineNo">980</span>        LOG.debug("Bypassing {} and its ancestors successfully, adding to queue", procedure);<a name="line.980"></a>
+<span class="sourceLineNo">981</span>      } else {<a name="line.981"></a>
+<span class="sourceLineNo">982</span>        // If we don't have the lock, we can't re-submit the queue,<a name="line.982"></a>
+<span class="sourceLineNo">983</span>        // since it is already executing. To get rid of the stuck situation, we<a name="line.983"></a>
+<span class="sourceLineNo">984</span>        // need to restart the master. With the procedure set to bypass, the procedureExecutor<a name="line.984"></a>
+<span class="sourceLineNo">985</span>        // will bypass it and won't get stuck again.<a name="line.985"></a>
+<span class="sourceLineNo">986</span>        LOG.debug("Bypassing {} and its ancestors successfully, but since it is already running, "<a name="line.986"></a>
+<span class="sourceLineNo">987</span>            + "skipping add to queue",<a name="line.987"></a>
+<span class="sourceLineNo">988</span>          procedure);<a name="line.988"></a>
+<span class="sourceLineNo">989</span>      }<a name="line.989"></a>
+<span class="sourceLineNo">990</span>      return true;<a name="line.990"></a>
+<span class="sourceLineNo">991</span><a name="line.991"></a>
+<span class="sourceLineNo">992</span>    } finally {<a name="line.992"></a>
+<span class="sourceLineNo">993</span>      if (lockEntry != null) {<a name="line.993"></a>
+<span class="sourceLineNo">994</span>        procExecutionLock.releaseLockEntry(lockEntry);<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>  }<a name="line.997"></a>
+<span class="sourceLineNo">998</span><a name="line.998"></a>
+<span class="sourceLineNo">999</span>  /**<a name="line.999"></a>
+<span class="sourceLineNo">1000</span>   * Add a new root-procedure to the executor.<a name="line.1000"></a>
+<span class="sourceLineNo">1001</span>   * @param proc the new procedure to execute.<a name="line.1001"></a>
+<span class="sourceLineNo">1002</span>   * @param nonceKey the registered unique identifier for this operation from the client or process.<a name="line.1002"></a>
+<span class="sourceLineNo">1003</span>   * @return the procedure id, that can be used to monitor the operation<a name="line.1003"></a>
+<span class="sourceLineNo">1004</span>   */<a name="line.1004"></a>
+<span class="sourceLineNo">1005</span>  @edu.umd.cs.findbugs.annotations.SuppressWarnings(value="NP_NULL_ON_SOME_PATH",<a name="line.1005"></a>
+<span class="sourceLineNo">1006</span>      justification = "FindBugs is blind to the check-for-null")<a name="line.1006"></a>
+<span class="sourceLineNo">1007</span>  public long submitProcedure(Procedure&lt;TEnvironment&gt; proc, NonceKey nonceKey) {<a name="line.1007"></a>
+<span class="sourceLineNo">1008</span>    Preconditions.checkArgument(lastProcId.get() &gt;= 0);<a name="line.1008"></a>
+<span class="sourceLineNo">1009</span><a name="line.1009"></a>
+<span class="sourceLineNo">1010</span>    prepareProcedure(proc);<a name="line.1010"></a>
+<span class="sourceLineNo">1011</span><a name="line.1011"></a>
+<span class="sourceLineNo">1012</span>    final Long currentProcId;<a name="line.1012"></a>
+<span class="sourceLineNo">1013</span>    if (nonceKey != null) {<a name="line.1013"></a>
+<span class="sourceLineNo">1014</span>      currentProcId = nonceKeysToProcIdsMap.get(nonceKey);<a name="line.1014"></a>
+<span class="sourceLineNo">1015</span>      Preconditions.checkArgument(currentProcId != null,<a name="line.1015"></a>
+<span class="sourceLineNo">1016</span>        "Expected nonceKey=" + nonceKey + " to be reserved, use registerNonce(); proc=" + proc);<a name="line.1016"></a>
+<span class="sourceLineNo">1017</span>    } else {<a name="line.1017"></a>
+<span class="sourceLineNo">1018</span>      currentProcId = nextProcId();<a name="line.1018"></a>
+<span class="sourceLineNo">1019</span>    }<a name="line.1019"></a>
 <span class="sourceLineNo">1020</span><a name="line.1020"></a>
-<span class="sourceLineNo">1021</span>    // Add the procedure to the executor<a name="line.1021"></a>
-<span class="sourceLineNo">1022</span>    return pushProcedure(proc);<a name="line.1022"></a>
-<span class="sourceLineNo">1023</span>  }<a name="line.1023"></a>
+<span class="sourceLineNo">1021</span>    // Initialize the procedure<a name="line.1021"></a>
+<span class="sourceLineNo">1022</span>    proc.setNonceKey(nonceKey);<a name="line.1022"></a>
+<span class="sourceLineNo">1023</span>    proc.setProcId(currentProcId.longValue());<a name="line.1023"></a>
 <span class="sourceLineNo">1024</span><a name="line.1024"></a>
-<span class="sourceLineNo">1025</span>  /**<a name="line.1025"></a>
-<span class="sourceLineNo">1026</span>   * Add a set of new root-procedure to the executor.<a name="line.1026"></a>
-<span class="sourceLineNo">1027</span>   * @param procs the new procedures to execute.<a name="line.1027"></a>
-<span class="sourceLineNo">1028</span>   */<a name="line.1028"></a>
-<span class="sourceLineNo">1029</span>  // TODO: Do we need to take nonces here?<a name="line.1029"></a>
-<span class="sourceLineNo">1030</span>  public void submitProcedures(Procedure&lt;TEnvironment&gt;[] procs) {<a name="line.1030"></a>
-<span class="sourceLineNo">1031</span>    Preconditions.checkArgument(lastProcId.get() &gt;= 0);<a name="line.1031"></a>
-<span class="sourceLineNo">1032</span>    if (procs == null || procs.length &lt;= 0) {<a name="line.1032"></a>
-<span class="sourceLineNo">1033</span>      return;<a name="line.1033"></a>
-<span class="sourceLineNo">1034</span>    }<a name="line.1034"></a>
-<span class="sourceLineNo">1035</span><a name="line.1035"></a>
-<span class="sourceLineNo">1036</span>    // Prepare procedure<a name="line.1036"></a>
-<span class="sourceLineNo">1037</span>    for (int i = 0; i &lt; procs.length; ++i) {<a name="line.1037"></a>
-<span class="sourceLineNo">1038</span>      prepareProcedure(procs[i]).setProcId(nextProcId());<a name="line.1038"></a>
-<span class="sourceLineNo">1039</span>    }<a name="line.1039"></a>
-<span class="sourceLineNo">1040</span><a name="line.1040"></a>
-<span class="sourceLineNo">1041</span>    // Commit the transaction<a name="line.1041"></a>
-<span class="sourceLineNo">1042</span>    store.insert(procs);<a name="line.1042"></a>
-<span class="sourceLineNo">1043</span>    if (LOG.isDebugEnabled()) {<a name="line.1043"></a>
-<span class="sourceLineNo">1044</span>      LOG.debug("Stored " + Arrays.toString(procs));<a name="line.1044"></a>
-<span class="sourceLineNo">1045</span>    }<a name="line.1045"></a>
-<span class="sourceLineNo">1046</span><a name="line.1046"></a>
-<span class="sourceLineNo">1047</span>    // Add the procedure to the executor<a name="line.1047"></a>
-<span class="sourceLineNo">1048</span>    for (int i = 0; i &lt; procs.length; ++i) {<a name="line.1048"></a>
-<span class="sourceLineNo">1049</span>      pushProcedure(procs[i]);<a name="line.1049"></a>
-<span class="sourceLineNo">1050</span>    }<a name="line.1050"></a>
-<span class="sourceLineNo">1051</span>  }<a name="line.1051"></a>
-<span class="sourceLineNo">1052</span><a name="line.1052"></a>
-<span class="sourceLineNo">1053</span>  private Procedure&lt;TEnvironment&gt; prepareProcedure(Procedure&lt;TEnvironment&gt; proc) {<a name="line.1053"></a>
-<span class="sourceLineNo">1054</span>    Preconditions.checkArgument(proc.getState() == ProcedureState.INITIALIZING);<a name="line.1054"></a>
-<span class="sourceLineNo">1055</span>    Preconditions.checkArgument(!proc.hasParent(), "unexpected parent", proc);<a name="line.1055"></a>
-<span class="sourceLineNo">1056</span>    if (this.checkOwnerSet) {<a name="line.1056"></a>
-<span class="sourceLineNo">1057</span>      Preconditions.checkArgument(proc.hasOwner(), "missing owner");<a name="line.1057"></a>
+<span class="sourceLineNo">1025</span>    // Commit the transaction<a name="line.1025"></a>
+<span class="sourceLineNo">1026</span>    store.insert(proc, null);<a name="line.1026"></a>
+<span class="sourceLineNo">1027</span>    LOG.debug("Stored {}", proc);<a name="line.1027"></a>
+<span class="sourceLineNo">1028</span><a name="line.1028"></a>
+<span class="sourceLineNo">1029</span>    // Add the procedure to the executor<a name="line.1029"></a>
+<span class="sourceLineNo">1030</span>    return pushProcedure(proc);<a name="line.1030"></a>
+<span class="sourceLineNo">1031</span>  }<a name="line.1031"></a>
+<span class="sourceLineNo">1032</span><a name="line.1032"></a>
+<span class="sourceLineNo">1033</span>  /**<a name="line.1033"></a>
+<span class="sourceLineNo">1034</span>   * Add a set of new root-procedure to the executor.<a name="line.1034"></a>
+<span class="sourceLineNo">1035</span>   * @param procs the new procedures to execute.<a name="line.1035"></a>
+<span class="sourceLineNo">1036</span>   */<a name="line.1036"></a>
+<span class="sourceLineNo">1037</span>  // TODO: Do we need to take nonces here?<a name="line.1037"></a>
+<span class="sourceLineNo">1038</span>  public void submitProcedures(Procedure&lt;TEnvironment&gt;[] procs) {<a name="line.1038"></a>
+<span class="sourceLineNo">1039</span>    Preconditions.checkArgument(lastProcId.get() &gt;= 0);<a name="line.1039"></a>
+<span class="sourceLineNo">1040</span>    if (procs == null || procs.length &lt;= 0) {<a name="line.1040"></a>
+<span class="sourceLineNo">1041</span>      return;<a name="line.1041"></a>
+<span class="sourceLineNo">1042</span>    }<a name="line.1042"></a>
+<span class="sourceLineNo">1043</span><a name="line.1043"></a>
+<span class="sourceLineNo">1044</span>    // Prepare procedure<a name="line.1044"></a>
+<span class="sourceLineNo">1045</span>    for (int i = 0; i &lt; procs.length; ++i) {<a name="line.1045"></a>
+<span class="sourceLineNo">1046</span>      prepareProcedure(procs[i]).setProcId(nextProcId());<a name="line.1046"></a>
+<span class="sourceLineNo">1047</span>    }<a name="line.1047"></a>
+<span class="sourceLineNo">1048</span><a name="line.1048"></a>
+<span class="sourceLineNo">1049</span>    // Commit the transaction<a name="line.1049"></a>
+<span class="sourceLineNo">1050</span>    store.insert(procs);<a name="line.1050"></a>
+<span class="sourceLineNo">1051</span>    if (LOG.isDebugEnabled()) {<a name="line.1051"></a>
+<span class="sourceLineNo">1052</span>      LOG.debug("Stored " + Arrays.toString(procs));<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>    // Add the procedure to the executor<a name="line.1055"></a>
+<span class="sourceLineNo">1056</span>    for (int i = 0; i &lt; procs.length; ++i) {<a name="line.1056"></a>
+<span class="sourceLineNo">1057</span>      pushProcedure(procs[i]);<a name="line.1057"></a>
 <span class="sourceLineNo">1058</span>    }<a name="line.1058"></a>
-<span class="sourceLineNo">1059</span>    return proc;<a name="line.1059"></a>
-<span class="sourceLineNo">1060</span>  }<a name="line.1060"></a>
-<span class="sourceLineNo">1061</span><a name="line.1061"></a>
-<span class="sourceLineNo">1062</span>  private long pushProcedure(Procedure&lt;TEnvironment&gt; proc) {<a name="line.1062"></a>
-<span class="sourceLineNo">1063</span>    final long currentProcId = proc.getProcId();<a name="line.1063"></a>
-<span class="sourceLineNo">1064</span><a name="line.1064"></a>
-<span class="sourceLineNo">1065</span>    // Update metrics on start of a procedure<a name="line.1065"></a>
-<span class="sourceLineNo">1066</span>    proc.updateMetricsOnSubmit(getEnvironment());<a name="line.1066"></a>
-<span class="sourceLineNo">1067</span><a name="line.1067"></a>
-<span class="sourceLineNo">1068</span>    // Create the rollback stack for the procedure<a name="line.1068"></a>
-<span class="sourceLineNo">1069</span>    RootProcedureState&lt;TEnvironment&gt; stack = new RootProcedureState&lt;&gt;();<a name="line.1069"></a>
-<span class="sourceLineNo">1070</span>    rollbackStack.put(currentProcId, stack);<a name="line.1070"></a>
-<span class="sourceLineNo">1071</span><a name="line.1071"></a>
-<span class="sourceLineNo">1072</span>    // Submit the new subprocedures<a name="line.1072"></a>
-<span class="sourceLineNo">1073</span>    assert !procedures.containsKey(currentProcId);<a name="line.1073"></a>
-<span class="sourceLineNo">1074</span>    procedures.put(currentProcId, proc);<a name="line.1074"></a>
-<span class="sourceLineNo">1075</span>    sendProcedureAddedNotification(currentProcId);<a name="line.1075"></a>
-<span class="sourceLineNo">1076</span>    scheduler.addBack(proc);<a name="line.1076"></a>
-<span class="sourceLineNo">1077</span>    return proc.getProcId();<a name="line.1077"></a>
-<span class="sourceLineNo">1078</span>  }<a name="line.1078"></a>
+<span class="sourceLineNo">1059</span>  }<a name="line.1059"></a>
+<span class="sourceLineNo">1060</span><a name="line.1060"></a>
+<span class="sourceLineNo">1061</span>  private Procedure&lt;TEnvironment&gt; prepareProcedure(Procedure&lt;TEnvironment&gt; proc) {<a name="line.1061"></a>
+<span class="sourceLineNo">1062</span>    Preconditions.checkArgument(proc.getState() == ProcedureState.INITIALIZING);<a name="line.1062"></a>
+<span class="sourceLineNo">1063</span>    Preconditions.checkArgument(!proc.hasParent(), "unexpected parent", proc);<a name="line.1063"></a>
+<span class="sourceLineNo">1064</span>    if (this.checkOwnerSet) {<a name="line.1064"></a>
+<span class="sourceLineNo">1065</span>      Preconditions.checkArgument(proc.hasOwner(), "missing owner");<a name="line.1065"></a>
+<span class="sourceLineNo">1066</span>    }<a name="line.1066"></a>
+<span class="sourceLineNo">1067</span>    return proc;<a name="line.1067"></a>
+<span class="sourceLineNo">1068</span>  }<a name="line.1068"></a>
+<span class="sourceLineNo">1069</span><a name="line.1069"></a>
+<span class="sourceLineNo">1070</span>  private long pushProcedure(Procedure&lt;TEnvironment&gt; proc) {<a name="line.1070"></a>
+<span class="sourceLineNo">1071</span>    final long currentProcId = proc.getProcId();<a name="line.1071"></a>
+<span class="sourceLineNo">1072</span><a name="line.1072"></a>
+<span class="sourceLineNo">1073</span>    // Update metrics on start of a procedure<a name="line.1073"></a>
+<span class="sourceLineNo">1074</span>    proc.updateMetricsOnSubmit(getEnvironment());<a name="line.1074"></a>
+<span class="sourceLineNo">1075</span><a name="line.1075"></a>
+<span class="sourceLineNo">1076</span>    // Create the rollback stack for the procedure<a name="line.1076"></a>
+<span class="sourceLineNo">1077</span>    RootProcedureState&lt;TEnvironment&gt; stack = new RootProcedureState&lt;&gt;();<a name="line.1077"></a>
+<span class="sourceLineNo">1078</span>    rollbackStack.put(currentProcId, stack);<a name="line.1078"></a>
 <span class="sourceLineNo">1079</span><a name="line.1079"></a>
-<span class="sourceLineNo">1080</span>  /**<a name="line.1080"></a>
-<span class="sourceLineNo">1081</span>   * Send an abort notification the specified procedure.<a name="line.1081"></a>
-<span class="sourceLineNo">1082</span>   * Depending on the procedure implementation the abort can be considered or ignored.<a name="line.1082"></a>
-<span class="sourceLineNo">1083</span>   * @param procId the procedure to abort<a name="line.1083"></a>
-<span class="sourceLineNo">1084</span>   * @return true if the procedure exists and has received the abort, otherwise false.<a name="line.1084"></a>
-<span class="sourceLineNo">1085</span>   */<a name="line.1085"></a>
-<span class="sourceLineNo">1086</span>  public boolean abort(long procId) {<a name="line.1086"></a>
-<span class="sourceLineNo">1087</span>    return abort(procId, true);<a name="line.1087"></a>
-<span class="sourceLineNo">1088</span>  }<a name="line.1088"></a>
-<span class="sourceLineNo">1089</span><a name="line.1089"></a>
-<span class="sourceLineNo">1090</span>  /**<a name="line.1090"></a>
-<span class="sourceLineNo">1091</span>   * Send an abort notification to the specified procedure.<a name="line.1091"></a>
-<span class="sourceLineNo">1092</span>   * Depending on the procedure implementation, the abort can be considered or ignored.<a name="line.1092"></a>
-<span class="sourceLineNo">1093</span>   * @param procId the procedure to abort<a name="line.1093"></a>
-<span class="sourceLineNo">1094</span>   * @param mayInterruptIfRunning if the proc completed at least one step, should it be aborted?<a name="line.1094"></a>
-<span class="sourceLineNo">1095</span>   * @return true if the procedure exists and has received the abort, otherwise false.<a name="line.1095"></a>
-<span class="sourceLineNo">1096</span>   */<a name="line.1096"></a>
-<span class="sourceLineNo">1097</span>  public boolean abort(long procId, boolean mayInterruptIfRunning) {<a name="line.1097"></a>
-<span class="sourceLineNo">1098</span>    Procedure&lt;TEnvironment&gt; proc = procedures.get(procId);<a name="line.1098"></a>
-<span class="sourceLineNo">1099</span>    if (proc != null) {<a name="line.1099"></a>
-<span class="sourceLineNo">1100</span>      if (!mayInterruptIfRunning &amp;&amp; proc.wasExecuted()) {<a name="line.1100"></a>
-<span class="sourceLineNo">1101</span>        return false;<a name="line.1101"></a>
-<span class="sourceLineNo">1102</span>      }<a name="line.1102"></a>
-<span class="sourceLineNo">1103</span>      return proc.abort(getEnvironment());<a name="line.1103"></a>
-<span class="sourceLineNo">1104</span>    }<a name="line.1104"></a>
-<span class="sourceLineNo">1105</span>    return false;<a name="line.1105"></a>
-<span class="sourceLineNo">1106</span>  }<a name="line.1106"></a>
-<span class="sourceLineNo">1107</span><a name="line.1107"></a>
-<span class="sourceLineNo">1108</span>  // ==========================================================================<a name="line.1108"></a>
-<span class="sourceLineNo">1109</span>  //  Executor query helpers<a name="line.1109"></a>
-<span class="sourceLineNo">1110</span>  // ==========================================================================<a name="line.1110"></a>
-<span class="sourceLineNo">1111</span>  public Procedure&lt;TEnvironment&gt; getProcedure(final long procId) {<a name="line.1111"></a>
-<span class="sourceLineNo">1112</span>    return procedures.get(procId);<a name="line.1112"></a>
-<span class="sourceLineNo">1113</span>  }<a name="line.1113"></a>
-<span class="sourceLineNo">1114</span><a name="line.1114"></a>
-<span class="sourceLineNo">1115</span>  public &lt;T extends Procedure&lt;TEnvironment&gt;&gt; T getProcedure(Class&lt;T&gt; clazz, long procId) {<a name="line.1115"></a>
-<span class="sourceLineNo">1116</span>    Procedure&lt;TEnvironment&gt; proc = getProcedure(procId);<a name="line.1116"></a>
-<span class="sourceLineNo">1117</span>    if (clazz.isInstance(proc)) {<a name="line.1117"></a>
-<span class="sourceLineNo">1118</span>      return clazz.cast(proc);<a name="line.1118"></a>
-<span class="sourceLineNo">1119</span>    }<a name="line.1119"></a>
-<span class="sourceLineNo">1120</span>    return null;<a name="line.1120"></a>
+<span class="sourceLineNo">1080</span>    // Submit the new subprocedures<a name="line.1080"></a>
+<span class="sourceLineNo">1081</span>    assert !procedures.containsKey(currentProcId);<a name="line.1081"></a>
+<span class="sourceLineNo">1082</span>    procedures.put(currentProcId, proc);<a name="line.1082"></a>
+<span class="sourceLineNo">1083</span>    sendProcedureAddedNotification(currentProcId);<a name="line.1083"></a>
+<span class="sourceLineNo">1084</span>    scheduler.addBack(proc);<a name="line.1084"></a>
+<span class="sourceLineNo">1085</span>    return proc.getProcId();<a name="line.1085"></a>
+<span class="sourceLineNo">1086</span>  }<a name="line.1086"></a>
+<span class="sourceLineNo">1087</span><a name="line.1087"></a>
+<span class="sourceLineNo">1088</span>  /**<a name="line.1088"></a>
+<span class="sourceLineNo">1089</span>   * Send an abort notification the specified procedure.<a name="line.1089"></a>
+<span class="sourceLineNo">1090</span>   * Depending on the procedure implementation the abort can be considered or ignored.<a name="line.1090"></a>
+<span class="sourceLineNo">1091</span>   * @param procId the procedure to abort<a name="line.1091"></a>
+<span class="sourceLineNo">1092</span>   * @return true if the procedure exists and has received the abort, otherwise false.<a name="line.1092"></a>
+<span class="sourceLineNo">1093</span>   */<a name="line.1093"></a>
+<span class="sourceLineNo">1094</span>  public boolean abort(long procId) {<a name="line.1094"></a>
+<span class="sourceLineNo">1095</span>    return abort(procId, true);<a name="line.1095"></a>
+<span class="sourceLineNo">1096</span>  }<a name="line.1096"></a>
+<span class="sourceLineNo">1097</span><a name="line.1097"></a>
+<span class="sourceLineNo">1098</span>  /**<a name="line.1098"></a>
+<span class="sourceLineNo">1099</span>   * Send an abort notification to the specified procedure.<a name="line.1099"></a>
+<span class="sourceLineNo">1100</span>   * Depending on the procedure implementation, the abort can be considered or ignored.<a name="line.1100"></a>
+<span class="sourceLineNo">1101</span>   * @param procId the procedure to abort<a name="line.1101"></a>
+<span class="sourceLineNo">1102</span>   * @param mayInterruptIfRunning if the proc completed at least one step, should it be aborted?<a name="line.1102"></a>
+<span class="sourceLineNo">1103</span>   * @return true if the procedure exists and has received the abort, otherwise false.<a name="line.1103"></a>
+<span class="sourceLineNo">1104</span>   */<a name="line.1104"></a>
+<span class="sourceLineNo">1105</span>  public boolean abort(long procId, boolean mayInterruptIfRunning) {<a name="line.1105"></a>
+<span class="sourceLineNo">1106</span>    Procedure&lt;TEnvironment&gt; proc = procedures.get(procId);<a name="line.1106"></a>
+<span class="sourceLineNo">1107</span>    if (proc != null) {<a name="line.1107"></a>
+<span class="sourceLineNo">1108</span>      if (!mayInterruptIfRunning &amp;&amp; proc.wasExecuted()) {<a name="line.1108"></a>
+<span class="sourceLineNo">1109</span>        return false;<a name="line.1109"></a>
+<span class="sourceLineNo">1110</span>      }<a name="line.1110"></a>
+<span class="sourceLineNo">1111</span>      return proc.abort(getEnvironment());<a name="line.1111"></a>
+<span class="sourceLineNo">1112</span>    }<a name="line.1112"></a>
+<span class="sourceLineNo">1113</span>    return false;<a name="line.1113"></a>
+<span class="sourceLineNo">1114</span>  }<a name="line.1114"></a>
+<span class="sourceLineNo">1115</span><a name="line.1115"></a>
+<span class="sourceLineNo">1116</span>  // ==========================================================================<a name="line.1116"></a>
+<span class="sourceLineNo">1117</span>  //  Executor query helpers<a name="line.1117"></a>
+<span class="sourceLineNo">1118</span>  // ==========================================================================<a name="line.1118"></a>
+<span class="sourceLineNo">1119</span>  public Procedure&lt;TEnvironment&gt; getProcedure(final long procId) {<a name="line.1119"></a>
+<span class="sourceLineNo">1120</span>    return procedures.get(procId);<a name="line.1120"></a>
 <span class="sourceLineNo">1121</span>  }<a name="line.1121"></a>
 <span class="sourceLineNo">1122</span><a name="line.1122"></a>
-<span class="sourceLineNo">1123</span>  public Procedure&lt;TEnvironment&gt; getResult(long procId) {<a name="line.1123"></a>
-<span class="sourceLineNo">1124</span>    CompletedProcedureRetainer&lt;TEnvironment&gt; retainer = completed.get(procId);<a name="line.1124"></a>
-<span class="sourceLineNo">1125</span>    if (retainer == null) {<a name="line.1125"></a>
-<span class="sourceLineNo">1126</span>      return null;<a name="line.1126"></a>
-<span class="sourceLineNo">1127</span>    } else {<a name="line.1127"></a>
-<span class="sourceLineNo">1128</span>      return retainer.getProcedure();<a name="line.1128"></a>
-<span class="sourceLineNo">1129</span>    }<a name="line.1129"></a>
-<span class="sourceLineNo">1130</span>  }<a name="line.1130"></a>
-<span class="sourceLineNo">1131</span><a name="line.1131"></a>
-<span class="sourceLineNo">1132</span>  /**<a name="line.1132"></a>
-<span class="sourceLineNo">1133</span>   * Return true if the procedure is finished.<a name="line.1133"></a>
-<span class="sourceLineNo">1134</span>   * The state may be "completed successfully" or "failed and rolledback".<a name="line.1134"></a>
-<span class="sourceLineNo">1135</span>   * Use getResult() to check the state or get the result data.<a name="line.1135"></a>
-<span class="sourceLineNo">1136</span>   * @param procId the ID of the procedure to check<a name="line.1136"></a>
-<span class="sourceLineNo">1137</span>   * @return true if the procedure execution is finished, otherwise false.<a name="line.1137"></a>
-<span class="sourceLineNo">1138</span>   */<a name="line.1138"></a>
-<span class="sourceLineNo">1139</span>  public boolean isFinished(final long procId) {<a name="line.1139"></a>
-<span class="sourceLineNo">1140</span>    return !procedures.containsKey(procId);<a name="line.1140"></a>
-<span class="sourceLineNo">1141</span>  }<a name="line.1141"></a>
-<span class="sourceLineNo">1142</span><a name="line.1142"></a>
-<span class="sourceLineNo">1143</span>  /**<a name="line.1143"></a>
-<span class="sourceLineNo">1144</span>   * Return true if the procedure is started.<a name="line.1144"></a>
-<span class="sourceLineNo">1145</span>   * @param procId the ID of the procedure to check<a name="line.1145"></a>
-<span class="sourceLineNo">1146</span>   * @return true if the procedure execution is started, otherwise false.<a name="line.1146"></a>
-<span class="sourceLineNo">1147</span>   */<a name="line.1147"></a>
-<span class="sourceLineNo">1148</span>  public boolean isStarted(long procId) {<a name="line.1148"></a>
-<span class="sourceLineNo">1149</span>    Procedure&lt;?&gt; proc = procedures.get(procId);<a name="line.1149"></a>
-<span class="sourceLineNo">1150</span>    if (proc == null) {<a name="line.1150"></a>
-<span class="sourceLineNo">1151</span>      return completed.get(procId) != null;<a name="line.1151"></a>
-<span class="sourceLineNo">1152</span>    }<a name="line.1152"></a>
-<span class="sourceLineNo">1153</span>    return proc.wasExecuted();<a name="line.1153"></a>
-<span class="sourceLineNo">1154</span>  }<a name="line.1154"></a>
-<span class="sourceLineNo">1155</span><a name="line.1155"></a>
-<span class="sourceLineNo">1156</span>  /**<a name="line.1156"></a>
-<span class="sourceLineNo">1157</span>   * Mark the specified completed procedure, as ready to remove.<a name="line.1157"></a>
-<span class="sourceLineNo">1158</span>   * @param procId the ID of the procedure to remove<a name="line.1158"></a>
-<span class="sourceLineNo">1159</span>   */<a name="line.1159"></a>
-<span class="sourceLineNo">1160</span>  public void removeResult(long procId) {<a name="line.1160"></a>
-<span class="sourceLineNo">1161</span>    CompletedProcedureRetainer&lt;TEnvironment&gt; retainer = completed.get(procId);<a name="line.1161"></a>
-<span class="sourceLineNo">1162</span>    if (retainer == null) {<a name="line.1162"></a>
-<span class="sourceLineNo">1163</span>      assert !procedures.containsKey(procId) : "pid=" + procId + " is still running";<a name="line.1163"></a>
-<span class="sourceLineNo">1164</span>      LOG.debug("pid={} already removed by the cleaner.", procId);<a name="line.1164"></a>
-<span class="sourceLineNo">1165</span>      return;<a name="line.1165"></a>
-<span class="sourceLineNo">1166</span>    }<a name="line.1166"></a>
-<span class="sourceLineNo">1167</span><a name="line.1167"></a>
-<span class="sourceLineNo">1168</span>    // The CompletedProcedureCleaner will take care of deletion, once the TTL is expired.<a name="line.1168"></a>
-<span class="sourceLineNo">1169</span>    retainer.setClientAckTime(EnvironmentEdgeManager.currentTime());<a name="line.1169"></a>
-<span class="sourceLineNo">1170</span>  }<a name="line.1170"></a>
-<span class="sourceLineNo">1171</span><a name="line.1171"></a>
-<span class="sourceLineNo">1172</span>  public Procedure&lt;TEnvironment&gt; getResultOrProcedure(long procId) {<a name="line.1172"></a>
-<span class="sourceLineNo">1173</span>    CompletedProcedureRetainer&lt;TEnvironment&gt; retainer = completed.get(procId);<a name="line.1173"></a>
-<span class="sourceLineNo">1174</span>    if (retainer == null) {<a name="line.1174"></a>
-<span class="sourceLineNo">1175</span>      return procedures.get(procId);<a name="line.1175"></a>
-<span class="sourceLineNo">1176</span>    } else {<a name="line.1176"></a>
-<span class="sourceLineNo">1177</span>      return retainer.getProcedure();<a name="line.1177"></a>
-<span class="sourceLineNo">1178</span>    }<a name="line.1178"></a>
-<span class="sourceLineNo">1179</span>  }<a name="line.1179"></a>
-<span class="sourceLineNo">1180</span><a name="line.1180"></a>
-<span class="sourceLineNo">1181</span>  /**<a name="line.1181"></a>
-<span class="sourceLineNo">1182</span>   * Check if the user is this procedure's owner<a name="line.1182"></a>
-<span class="sourceLineNo">1183</span>   * @param procId the target procedure<a name="line.1183"></a>
-<span class="sourceLineNo">1184</span>   * @param user the user<a name="line.1184"></a>
-<span class="sourceLineNo">1185</span>   * @return true if the user is the owner of the procedure,<a name="line.1185"></a>
-<span class="sourceLineNo">1186</span>   *   false otherwise or the owner is unknown.<a name="line.1186"></a>
-<span class="sourceLineNo">1187</span>   */<a name="line.1187"></a>
-<span class="sourceLineNo">1188</span>  public boolean isProcedureOwner(long procId, User user) {<a name="line.1188"></a>
-<span class="sourceLineNo">1189</span>    if (user == null) {<a name="line.1189"></a>
-<span class="sourceLineNo">1190</span>      return false;<a name="line.1190"></a>
-<span class="sourceLineNo">1191</span>    }<a name="line.1191"></a>
-<span class="sourceLineNo">1192</span>    final Procedure&lt;TEnvironment&gt; runningProc = procedures.get(procId);<a name="line.1192"></a>
-<span class="sourceLineNo">1193</span>    if (runningProc != null) {<a name="line.1193"></a>
-<span class="sourceLineNo">1194</span>      return runningProc.getOwner().equals(user.getShortName());<a name="line.1194"></a>
-<span class="sourceLineNo">1195</span>    }<a name="line.1195"></a>
-<span class="sourceLineNo">1196</span><a name="line.1196"></a>
-<span class="sourceLineNo">1197</span>    final CompletedProcedureRetainer&lt;TEnvironment&gt; retainer = completed.get(procId);<a name="line.1197"></a>
-<span class="sourceLineNo">1198</span>    if (retainer != null) {<a name="line.1198"></a>
-<span class="sourceLineNo">1199</span>      return retainer.getProcedure().getOwner().equals(user.getShortName());<a name="line.1199"></a>
-<span class="sourceLineNo">1200</span>    }<a name="line.1200"></a>
-<span class="sourceLineNo">1201</span><a name="line.1201"></a>
-<span class="sourceLineNo">1202</span>    // Procedure either does not exist or has already completed and got cleaned up.<a name="line.1202"></a>
-<span class="sourceLineNo">1203</span>    // At this time, we cannot check the owner of the procedure<a name="line.1203"></a>
-<span class="sourceLineNo">1204</span>    return false;<a name="line.1204"></a>
-<span class="sourceLineNo">1205</span>  }<a name="line.1205"></a>
-<span class="sourceLineNo">1206</span><a name="line.1206"></a>
-<span class="sourceLineNo">1207</span>  /**<a name="line.1207"></a>
-<span class="sourceLineNo">1208</span>   * Should only be used when starting up, where the procedure workers have not been started.<a name="line.1208"></a>
-<span class="sourceLineNo">1209</span>   * &lt;p/&gt;<a name="line.1209"></a>
-<span class="sourceLineNo">1210</span>   * If the procedure works has been started, the return values maybe changed when you are<a name="line.1210"></a>
-<span class="sourceLineNo">1211</span>   * processing it so usually this is not safe. Use {@link #getProcedures()} below for most cases as<a name="line.1211"></a>
-<span class="sourceLineNo">1212</span>   * it will do a copy, and also include the finished procedures.<a name="line.1212"></a>
-<span class="sourceLineNo">1213</span>   */<a name="line.1213"></a>
-<span class="sourceLineNo">1214</span>  public Collection&lt;Procedure&lt;TEnvironment&gt;&gt; getActiveProceduresNoCopy() {<a name="line.1214"></a>
-<span class="sourceLineNo">1215</span>    return procedures.values();<a name="line.1215"></a>
-<span class="sourceLineNo">1216</span>  }<a name="line.1216"></a>
-<span class="sourceLineNo">1217</span><a name="line.1217"></a>
-<span class="sourceLineNo">1218</span>  /**<a name="line.1218"></a>
-<span class="sourceLineNo">1219</span>   * Get procedures.<a name="line.1219"></a>
-<span class="sourceLineNo">1220</span>   * @return the procedures in a list<a name="line.1220"></a>
+<span class="sourceLineNo">1123</span>  public &lt;T extends Procedure&lt;TEnvironment&gt;&gt; T getProcedure(Class&lt;T&gt; clazz, long procId) {<a name="line.1123"></a>
+<span class="sourceLineNo">1124</span>    Procedure&lt;TEnvironment&gt; proc = getProcedure(procId);<a name="line.1124"></a>
+<span class="sourceLineNo">1125</span>    if (clazz.isInstance(proc)) {<a name="line.1125"></a>
+<span class="sourceLineNo">1126</span>      return clazz.cast(proc);<a name="line.1126"></a>
+<span class="sourceLineNo">1127</span>    }<a name="line.1127"></a>
+<span class="sourceLineNo">1128</span>    return null;<a name="line.1128"></a>
+<span class="sourceLineNo">1129</span>  }<a name="line.1129"></a>
+<span class="sourceLineNo">1130</span><a name="line.1130"></a>
+<span class="sourceLineNo">1131</span>  public Procedure&lt;TEnvironment&gt; getResult(long procId) {<a name="line.1131"></a>
+<span class="sourceLineNo">1132</span>    CompletedProcedureRetainer&lt;TEnvironment&gt; retainer = completed.get(procId);<a name="line.1132"></a>
+<span class="sourceLineNo">1133</span>    if (retainer == null) {<a name="line.1133"></a>
+<span class="sourceLineNo">1134</span>      return null;<a name="line.1134"></a>
+<span class="sourceLineNo">1135</span>    } else {<a name="line.1135"></a>
+<span class="sourceLineNo">1136</span>      return retainer.getProcedure();<a name="line.1136"></a>
+<span class="sourceLineNo">1137</span>    }<a name="line.1137"></a>
+<span class="sourceLineNo">1138</span>  }<a name="line.1138"></a>
+<span class="sourceLineNo">1139</span><a name="line.1139"></a>
+<span class="sourceLineNo">1140</span>  /**<a name="line.1140"></a>
+<span class="sourceLineNo">1141</span>   * Return true if the procedure is finished.<a name="line.1141"></a>
+<span class="sourceLineNo">1142</span>   * The state may be "completed successfully" or "failed and rolledback".<a name="line.1142"></a>
+<span class="sourceLineNo">1143</span>   * Use getResult() to check the state or get the result data.<a name="line.1143"></a>
+<span class="sourceLineNo">1144</span>   * @param procId the ID of the procedure to check<a name="line.1144"></a>
+<span class="sourceLineNo">1145</span>   * @return true if the procedure execution is finished, otherwise false.<a name="line.1145"></a>
+<span class="sourceLineNo">1146</span>   */<a name="line.1146"></a>
+<span class="sourceLineNo">1147</span>  public boolean isFinished(final long procId) {<a name="line.1147"></a>
+<span class="sourceLineNo">1148</span>    return !procedures.containsKey(procId);<a name="line.1148"></a>
+<span class="sourceLineNo">1149</span>  }<a name="line.1149"></a>
+<span class="sourceLineNo">1150</span><a name="line.1150"></a>
+<span class="sourceLineNo">1151</span>  /**<a name="line.1151"></a>
+<span class="sourceLineNo">1152</span>   * Return true if the procedure is started.<a name="line.1152"></a>
+<span class="sourceLineNo">1153</span>   * @param procId the ID of the procedure to check<a name="line.1153"></a>
+<span class="sourceLineNo">1154</span>   * @return true if the procedure execution is started, otherwise false.<a name="line.1154"></a>
+<span class="sourceLineNo">1155</span>   */<a name="line.1155"></a>
+<span class="sourceLineNo">1156</span>  public boolean isStarted(long procId) {<a name="line.1156"></a>
+<span class="sourceLineNo">1157</span>    Procedure&lt;?&gt; proc = procedures.get(procId);<a name="line.1157"></a>
+<span class="sourceLineNo">1158</span>    if (proc == null) {<a name="line.1158"></a>
+<span class="sourceLineNo">1159</span>      return completed.get(procId) != null;<a name="line.1159"></a>
+<span class="sourceLineNo">1160</span>    }<a name="line.1160"></a>
+<span class="sourceLineNo">1161</span>    return proc.wasExecuted();<a name="line.1161"></a>
+<span class="sourceLineNo">1162</span>  }<a name="line.1162"></a>
+<span class="sourceLineNo">1163</span><a name="line.1163"></a>
+<span class="sourceLineNo">1164</span>  /**<a name="line.1164"></a>
+<span class="sourceLineNo">1165</span>   * Mark the specified completed procedure, as ready to remove.<a name="line.1165"></a>
+<span class="sourceLineNo">1166</span>   * @param procId the ID of the procedure to remove<a name="line.1166"></a>
+<span class="sourceLineNo">1167</span>   */<a name="line.1167"></a>
+<span class="sourceLineNo">1168</span>  public void removeResult(long procId) {<a name="line.1168"></a>
+<span class="sourceLineNo">1169</span>    CompletedProcedureRetainer&lt;TEnvironment&gt; retainer = completed.get(procId);<a name="line.1169"></a>
+<span class="sourceLineNo">1170</span>    if (retainer == null) {<a name="line.1170"></a>
+<span class="sourceLineNo">1171</span>      assert !procedures.containsKey(procId) : "pid=" + procId + " is still running";<a name="line.1171"></a>
+<span class="sourceLineNo">1172</span>      LOG.debug("pid={} already removed by the cleaner.", procId);<a name="line.1172"></a>
+<span class="sourceLineNo">1173</span>      return;<a name="line.1173"></a>
+<span class="sourceLineNo">1174</span>    }<a name="line.1174"></a>
+<span class="sourceLineNo">1175</span><a name="line.1175"></a>
+<span class="sourceLineNo">1176</span>    // The CompletedProcedureCleaner will take care of deletion, once the TTL is expired.<a name="line.1176"></a>
+<span class="sourceLineNo">1177</span>    retainer.setClientAckTime(EnvironmentEdgeManager.currentTime());<a name="line.1177"></a>
+<span class="sourceLineNo">1178</span>  }<a name="line.1178"></a>
+<span class="sourceLineNo">1179</span><a name="line.1179"></a>
+<span class="sourceLineNo">1180</span>  public Procedure&lt;TEnvironment&gt; getResultOrProcedure(long procId) {<a name="line.1180"></a>
+<span class="sourceLineNo">1181</span>    CompletedProcedureRetainer&lt;TEnvironment&gt; retainer = completed.get(procId);<a name="line.1181"></a>
+<span class="sourceLineNo">1182</span>    if (retainer == null) {<a name="line.1182"></a>
+<span class="sourceLineNo">1183</span>      return procedures.get(procId);<a name="line.1183"></a>
+<span class="sourceLineNo">1184</span>    } else {<a name="line.1184"></a>
+<span class="sourceLineNo">1185</span>      return retainer.getProcedure();<a name="line.1185"></a>
+<span class="sourceLineNo">1186</span>    }<a name="line.1186"></a>
+<span class="sourceLineNo">1187</span>  }<a name="line.1187"></a>
+<span class="sourceLineNo">1188</span><a name="line.1188"></a>
+<span class="sourceLineNo">1189</span>  /**<a name="line.1189"></a>
+<span class="sourceLineNo">1190</span>   * Check if the user is this procedure's owner<a name="line.1190"></a>
+<span class="sourceLineNo">1191</span>   * @param procId the target procedure<a name="line.1191"></a>
+<span class="sourceLineNo">1192</span>   * @param user the user<a name="line.1192"></a>
+<span class="sourceLineNo">1193</span>   * @return true if the user is the owner of the procedure,<a name="line.1193"></a>
+<span class="sourceLineNo">1194</span>   *   false otherwise or the owner is unknown.<a name="line.1194"></a>
+<span class="sourceLineNo">1195</span>   */<a name="line.1195"></a>
+<span class="sourceLineNo">1196</span>  public boolean isProcedureOwner(long procId, User user) {<a name="line.1196"></a>
+<span class="sourceLineNo">1197</span>    if (user == null) {<a name="line.1197"></a>
+<span class="sourceLineNo">1198</span>      return false;<a name="line.1198"></a>
+<span class="sourceLineNo">1199</span>    }<a name="line.1199"></a>
+<span class="sourceLineNo">1200</span>    final Procedure&lt;TEnvironment&gt; runningProc = procedures.get(procId);<a name="line.1200"></a>
+<span class="sourceLineNo">1201</span>    if (runningProc != null) {<a name="line.1201"></a>
+<span class="sourceLineNo">1202</span>      return runningProc.getOwner().equals(user.getShortName());<a name="line.1202"></a>
+<span class="sourceLineNo">1203</span>    }<a name="line.1203"></a>
+<span class="sourceLineNo">1204</span><a name="line.1204"></a>
+<span class="sourceLineNo">1205</span>    final CompletedProcedureRetainer&lt;TEnvironment&gt; retainer = completed.get(procId);<a name="line.1205"></a>
+<span class="sourceLineNo">1206</span>    if (retainer != null) {<a name="line.1206"></a>
+<span class="sourceLineNo">1207</span>      return retainer.getProcedure().getOwner().equals(user.getShortName());<a name="line.1207"></a>
+<span class="sourceLineNo">1208</span>    }<a name="line.1208"></a>
+<span class="sourceLineNo">1209</span><a name="line.1209"></a>
+<span class="sourceLineNo">1210</span>    // Procedure either does not exist or has already completed and got cleaned up.<a name="line.1210"></a>
+<span class="sourceLineNo">1211</span>    // At this time, we cannot check the owner of the procedure<a name="line.1211"></a>
+<span class="sourceLineNo">1212</span>    return false;<a name="line.1212"></a>
+<span class="sourceLineNo">1213</span>  }<a name="line.1213"></a>
+<span class="sourceLineNo">1214</span><a name="line.1214"></a>
+<span class="sourceLineNo">1215</span>  /**<a name="line.1215"></a>
+<span class="sourceLineNo">1216</span>   * Should only be used when starting up, where the procedure workers have not been started.<a name="line.1216"></a>
+<span class="sourceLineNo">1217</span>   * &lt;p/&gt;<a name="line.1217"></a>
+<span class="sourceLineNo">1218</span>   * If the procedure works has been started, the return values maybe changed when you are<a name="line.1218"></a>
+<span class="sourceLineNo">1219</span>   * processing it so usually this is not safe. Use {@link #getProcedures()} below for most cases as<a name="line.1219"></a>
+<span class="sourceLineNo">1220</span>   * it will do a copy, and also include the finished procedures.<a name="line.1220"></a>
 <span class="sourceLineNo">1221</span>   */<a name="line.1221"></a>
-<span class="sourceLineNo">1222</span>  public List&lt;Procedure&lt;TEnvironment&gt;&gt; getProcedures() {<a name="line.1222"></a>
-<span class="sourceLineNo">1223</span>    List&lt;Procedure&lt;TEnvironment&gt;&gt; procedureList =<a name="line.1223"></a>
-<span class="sourceLineNo">1224</span>      new ArrayList&lt;&gt;(procedures.size() + completed.size());<a name="line.1224"></a>
-<span class="sourceLineNo">1225</span>    procedureList.addAll(procedures.values());<a name="line.1225"></a>
-<span class="sourceLineNo">1226</span>    // Note: The procedure could show up twice in the list with different state, as<a name="line.1226"></a>
-<span class="sourceLineNo">1227</span>    // it could complete after we walk through procedures list and insert into<a name="line.1227"></a>
-<span class="sourceLineNo">1228</span>    // procedureList - it is ok, as we will use the information in the Procedure<a name="line.1228"></a>
-<span class="sourceLineNo">1229</span>    // to figure it out; to prevent this would increase the complexity of the logic.<a name="line.1229"></a>
-<span class="sourceLineNo">1230</span>    completed.values().stream().map(CompletedProcedureRetainer::getProcedure)<a name="line.1230"></a>
-<span class="sourceLineNo">1231</span>      .forEach(procedureList::add);<a name="line.1231"></a>
-<span class="sourceLineNo">1232</span>    return procedureList;<a name="line.1232"></a>
-<span class="sourceLineNo">1233</span>  }<a name="line.1233"></a>
-<span class="sourceLineNo">1234</span><a name="line.1234"></a>
-<span class="sourceLineNo">1235</span>  // ==========================================================================<a name="line.1235"></a>
-<span class="sourceLineNo">1236</span>  //  Listeners helpers<a name="line.1236"></a>
-<span class="sourceLineNo">1237</span>  // ==========================================================================<a name="line.1237"></a>
-<span class="sourceLineNo">1238</span>  public void registerListener(ProcedureExecutorListener listener) {<a name="line.1238"></a>
-<span class="sourceLineNo">1239</span>    this.listeners.add(listener);<a name="line.1239"></a>
-<span class="sourceLineNo">1240</span>  }<a name="line.1240"></a>
-<span class="sourceLineNo">1241</span><a name="line.1241"></a>
-<span class="sourceLineNo">1242</span>  public boolean unregisterListener(ProcedureExecutorListener listener) {<a name="line.1242"></a>
-<span class="sourceLineNo">1243</span>    return this.listeners.remove(listener);<a name="line.1243"></a>
-<span class="sourceLineNo">1244</span>  }<a name="line.1244"></a>
-<span class="sourceLineNo">1245</span><a name="line.1245"></a>
-<span class="sourceLineNo">1246</span>  private void sendProcedureLoadedNotification(final long procId) {<a name="line.1246"></a>
-<span class="sourceLineNo">1247</span>    if (!this.listeners.isEmpty()) {<a name="line.1247"></a>
-<span class="sourceLineNo">1248</span>      for (ProcedureExecutorListener listener: this.listeners) {<a name="line.1248"></a>
-<span class="sourceLineNo">1249</span>        try {<a name="line.1249"></a>
-<span class="sourceLineNo">1250</span>          listener.procedureLoaded(procId);<a name="line.1250"></a>
-<span class="sourceLineNo">1251</span>        } catch (Throwable e) {<a name="line.1251"></a>
-<span class="sourceLineNo">1252</span>          LOG.error("Listener " + listener + " had an error: " + e.getMessage(), e);<a name="line.1252"></a>
-<span class="sourceLineNo">1253</span>        }<a name="line.1253"></a>
-<span class="sourceLineNo">1254</span>      }<a name="line.1254"></a>
-<span class="sourceLineNo">1255</span>    }<a name="line.1255"></a>
-<span class="sourceLineNo">1256</span>  }<a name="line.1256"></a>
-<span class="sourceLineNo">1257</span><a name="line.1257"></a>
-<span class="sourceLineNo">1258</span>  private void sendProcedureAddedNotification(final long procId) {<a name="line.1258"></a>
-<span class="sourceLineNo">1259</span>    if (!this.listeners.isEmpty()) {<a name="line.1259"></a>
-<span class="sourceLineNo">1260</span>      for (ProcedureExecutorListener listener: this.listeners) {<a name="line.1260"></a>
-<span class="sourceLineNo">1261</span>        try {<a name="line.1261"></a>
-<span class="sourceLineNo">1262</span>          listener.procedureAdded(procId);<a name="line.1262"></a>
-<span class="sourceLineNo">1263</span>        } catch (Throwable e) {<a name="line.1263"></a>
-<span class="sourceLineNo">1264</span>          LOG.error("Listener " + listener + " had an error: " + e.getMessage(), e);<a name="line.1264"></a>
-<span class="sourceLineNo">1265</span>        }<a name="line.1265"></a>
-<span class="sourceLineNo">1266</span>      }<a name="line.1266"></a>
-<span class="sourceLineNo">1267</span>    }<a name="line.1267"></a>
-<span class="sourceLineNo">1268</span>  }<a name="line.1268"></a>
-<span class="sourceLineNo">1269</span><a name="line.1269"></a>
-<span class="sourceLineNo">1270</span>  private void sendProcedureFinishedNotification(final long procId) {<a name="line.1270"></a>
-<span class="sourceLineNo">1271</span>    if (!this.listeners.isEmpty()) {<a name="line.1271"></a>
-<span class="sourceLineNo">1272</span>      for (ProcedureExecutorListener listener: this.listeners) {<a name="line.1272"></a>
-<span class="sourceLineNo">1273</span>        try {<a name="line.1273"></a>
-<span class="sourceLineNo">1274</span>          listener.procedureFinished(procId);<a name="line.1274"></a>
-<span class="sourceLineNo">1275</span>        } catch (Throwable e) {<a name="line.1275"></a>
-<span class="sourceLineNo">1276</span>          LOG.error("Listener " + listener + " had an error: " + e.getMessage(), e);<a name="line.1276"></a>
-<span class="sourceLineNo">1277</span>        }<a name="line.1277"></a>
-<span class="sourceLineNo">1278</span>      }<a name="line.1278"></a>
-<span class="sourceLineNo">1279</span>    }<a name="line.1279"></a>
-<span class="sourceLineNo">1280</span>  }<a name="line.1280"></a>
-<span class="sourceLineNo">1281</span><a name="line.1281"></a>
-<span class="sourceLineNo">1282</span>  // ==========================================================================<a name="line.1282"></a>
-<span class="sourceLineNo">1283</span>  //  Procedure IDs helpers<a name="line.1283"></a>
-<span class="sourceLineNo">1284</span>  // ==========================================================================<a name="line.1284"></a>
-<span class="sourceLineNo">1285</span>  private long nextProcId() {<a name="line.1285"></a>
-<span class="sourceLineNo">1286</span>    long procId = lastProcId.incrementAndGet();<a name="line.1286"></a>
-<span class="sourceLineNo">1287</span>    if (procId &lt; 0) {<a name="line.1287"></a>
-<span class="sourceLineNo">1288</span>      while (!lastProcId.compareAndSet(procId, 0)) {<a name="line.1288"></a>
-<span class="sourceLineNo">1289</span>        procId = lastProcId.get();<a name="line.1289"></a>
-<span class="sourceLineNo">1290</span>        if (procId &gt;= 0)<a name="line.1290"></a>
-<span class="sourceLineNo">1291</span>          break;<a name="line.1291"></a>
-<span class="sourceLineNo">1292</span>      }<a name="line.1292"></a>
-<span class="sourceLineNo">1293</span>      while (procedures.containsKey(procId)) {<a name="line.1293"></a>
-<span class="sourceLineNo">1294</span>        procId = lastProcId.incrementAndGet();<a name="line.1294"></a>
-<span class="sourceLineNo">1295</span>      }<a name="line.1295"></a>
-<span class="sourceLineNo">1296</span>    }<a name="line.1296"></a>
-<span class="sourceLineNo">1297</span>    assert procId &gt;= 0 : "Invalid procId " + procId;<a name="line.1297"></a>
-<span class="sourceLineNo">1298</span>    return procId;<a name="line.1298"></a>
-<span class="sourceLineNo">1299</span>  }<a name="line.1299"></a>
-<span class="sourceLineNo">1300</span><a name="line.1300"></a>
-<span class="sourceLineNo">1301</span>  @VisibleForTesting<a name="line.1301"></a>
-<span class="sourceLineNo">1302</span>  protected long getLastProcId() {<a name="line.1302"></a>
-<span class="sourceLineNo">1303</span>    return lastProcId.get();<a name="line.1303"></a>
-<span class="sourceLineNo">1304</span>  }<a name="line.1304"></a>
-<span class="sourceLineNo">1305</span><a name="line.1305"></a>
-<span class="sourceLineNo">1306</span>  @VisibleForTesting<a name="line.1306"></a>
-<span class="sourceLineNo">1307</span>  public Set&lt;Long&gt; getActiveProcIds() {<a name="line.1307"></a>
-<span class="sourceLineNo">1308</span>    return procedures.keySet();<a name="line.1308"></a>
-<span class="sourceLineNo">1309</span>  }<a name="line.1309"></a>
-<span class="sourceLineNo">1310</span><a name="line.1310"></a>
-<span class="sourceLineNo">1311</span>  Long getRootProcedureId(Procedure&lt;TEnvironment&gt; proc) {<a name="line.1311"></a>
-<span class="sourceLineNo">1312</span>    return Procedure.getRootProcedureId(procedures, proc);<a name="line.1312"></a>
-<span class="sourceLineNo">1313</span>  }<a name="line.1313"></a>
-<span class="sourceLineNo">1314</span><a name="line.1314"></a>
-<span class="sourceLineNo">1315</span>  // ==========================================================================<a name="line.1315"></a>
-<span class="sourceLineNo">1316</span>  //  Executions<a name="line.1316"></a>
-<span class="sourceLineNo">1317</span>  // ==========================================================================<a name="line.1317"></a>
-<span class="sourceLineNo">1318</span>  private void executeProcedure(Procedure&lt;TEnvironment&gt; proc) {<a name="line.1318"></a>
-<span class="sourceLineNo">1319</span>    if (proc.isFinished()) {<a name="line.1319"></a>
-<span class="sourceLineNo">1320</span>      LOG.debug("{} is already finished, skipping execution", proc);<a name="line.1320"></a>
-<span class="sourceLineNo">1321</span>      return;<a name="line.1321"></a>
-<span class="sourceLineNo">1322</span>    }<a name="line.1322"></a>
-<span class="sourceLineNo">1323</span>    final Long rootProcId = getRootProcedureId(proc);<a name="line.1323"></a>
-<span class="sourceLineNo">1324</span>    if (rootProcId == null) {<a name="line.1324"></a>
-<span class="sourceLineNo">1325</span>      // The 'proc' was ready to run but the root procedure was rolledback<a name="line.1325"></a>
-<span class="sourceLineNo">1326</span>      LOG.warn("Rollback because parent is done/rolledback proc=" + proc);<a name="line.1326"></a>
-<span class="sourceLineNo">1327</span>      executeRollback(proc);<a name="line.1327"></a>
-<span class="sourceLineNo">1328</span>      return;<a name="line.1328"></a>
-<span class="sourceLineNo">1329</span>    }<a name="line.1329"></a>
-<span class="sourceLineNo">1330</span><a name="line.1330"></a>
-<span class="sourceLineNo">1331</span>    RootProcedureState&lt;TEnvironment&gt; procStack = rollbackStack.get(rootProcId);<a name="line.1331"></a>
-<span class="sourceLineNo">1332</span>    if (procStack == null) {<a name="line.1332"></a>
-<span class="sourceLineNo">1333</span>      LOG.warn("RootProcedureState is null for " + proc.getProcId());<a name="line.1333"></a>
-<span class="sourceLineNo">1334</span>      return;<a name="line.1334"></a>
-<span class="sourceLineNo">1335</span>    }<a name="line.1335"></a>
-<span class="sourceLineNo">1336</span>    do {<a name="line.1336"></a>
-<span class="sourceLineNo">1337</span>      // Try to acquire the execution<a name="line.1337"></a>
-<span class="sourceLineNo">1338</span>      if (!procStack.acquire(proc)) {<a name="line.1338"></a>
-<span class="sourceLineNo">1339</span>        if (procStack.setRollback()) {<a name="line.1339"></a>
-<span class="sourceLineNo">1340</span>          // we have the 'rollback-lock' we can start rollingback<a name="line.1340"></a>
-<span class="sourceLineNo">1341</span>          switch (executeRollback(rootProcId, procStack)) {<a name="line.1341"></a>
-<span class="sourceLineNo">1342</span>            case LOCK_ACQUIRED:<a name="line.1342"></a>
-<span class="sourceLineNo">1343</span>              break;<a name="line.1343"></a>
-<span class="sourceLineNo">1344</span>            case LOCK_YIELD_WAIT:<a name="line.1344"></a>
-<span class="sourceLineNo">1345</span>              procStack.unsetRollback();<a name="line.1345"></a>
-<span class="sourceLineNo">1346</span>              scheduler.yield(proc);<a name="line.1346"></a>
-<span class="sourceLineNo">1347</span>              break;<a name="line.1347"></a>
-<span class="sourceLineNo">1348</span>            case LOCK_EVENT_WAIT:<a name="line.1348"></a>
-<span class="sourceLineNo">1349</span>              LOG.info("LOCK_EVENT_WAIT rollback..." + proc);<a name="line.1349"></a>
-<span class="sourceLineNo">1350</span>              procStack.unsetRollback();<a name="line.1350"></a>
+<span class="sourceLineNo">1222</span>  public Collection&lt;Procedure&lt;TEnvironment&gt;&gt; getActiveProceduresNoCopy() {<a name="line.1222"></a>
+<span class="sourceLineNo">1223</span>    return procedures.values();<a name="line.1223"></a>
+<span class="sourceLineNo">1224</span>  }<a name="line.1224"></a>
+<span class="sourceLineNo">1225</span><a name="line.1225"></a>
+<span class="sourceLineNo">1226</span>  /**<a name="line.1226"></a>
+<span class="sourceLineNo">1227</span>   * Get procedures.<a name="line.1227"></a>
+<span class="sourceLineNo">1228</span>   * @return the procedures in a list<a name="line.1228"></a>
+<span class="sourceLineNo">1229</span>   */<a name="line.1229"></a>
+<span class="sourceLineNo">1230</span>  public List&lt;Procedure&lt;TEnvironment&gt;&gt; getProcedures() {<a name="line.1230"></a>
+<span class="sourceLineNo">1231</span>    List&lt;Procedure&lt;TEnvironment&gt;&gt; procedureList =<a name="line.1231"></a>
+<span class="sourceLineNo">1232</span>      new ArrayList&lt;&gt;(procedures.size() + completed.size());<a name="line.1232"></a>
+<span class="sourceLineNo">1233</span>    procedureList.addAll(procedures.values());<a name="line.1233"></a>
+<span class="sourceLineNo">1234</span>    // Note: The procedure could show up twice in the list with different state, as<a name="line.1234"></a>
+<span class="sourceLineNo">1235</span>    // it could complete after we walk through procedures list and insert into<a name="line.1235"></a>
+<span class="sourceLineNo">1236</span>    // procedureList - it is ok, as we will use the information in the Procedure<a name="line.1236"></a>
+<span class="sourceLineNo">1237</span>    // to figure it out; to prevent this would increase the complexity of the logic.<a name="line.1237"></a>
+<span class="sourceLineNo">1238</span>    completed.values().stream().map(CompletedProcedureRetainer::getProcedure)<a name="line.1238"></a>
+<span class="sourceLineNo">1239</span>      .forEach(procedureList::add);<a name="line.1239"></a>
+<span class="sourceLineNo">1240</span>    return procedureList;<a name="line.1240"></a>
+<span class="sourceLineNo">1241</span>  }<a name="line.1241"></a>
+<span class="sourceLineNo">1242</span><a name="line.1242"></a>
+<span class="sourceLineNo">1243</span>  // ==========================================================================<a name="line.1243"></a>
+<span class="sourceLineNo">1244</span>  //  Listeners helpers<a name="line.1244"></a>
+<span class="sourceLineNo">1245</span>  // ==========================================================================<a name="line.1245"></a>
+<span class="sourceLineNo">1246</span>  public void registerListener(ProcedureExecutorListener listener) {<a name="line.1246"></a>
+<span class="sourceLineNo">1247</span>    this.listeners.add(listener);<a name="line.1247"></a>
+<span class="sourceLineNo">1248</span>  }<a name="line.1248"></a>
+<span class="sourceLineNo">1249</span><a name="line.1249"></a>
+<span class="sourceLineNo">1250</span>  public boolean unregisterListener(ProcedureExecutorListener listener) {<a name="line.1250"></a>
+<span class="sourceLineNo">1251</span>    return this.listeners.remove(listener);<a name="line.1251"></a>
+<span class="sourceLineNo">1252</span>  }<a name="line.1252"></a>
+<span class="sourceLineNo">1253</span><a name="line.1253"></a>
+<span class="sourceLineNo">1254</span>  private void sendProcedureLoadedNotification(final long procId) {<a name="line.1254"></a>
+<span class="sourceLineNo">1255</span>    if (!this.listeners.isEmpty()) {<a name="line.1255"></a>
+<span class="sourceLineNo">1256</span>      for (ProcedureExecutorListener listener: this.listeners) {<a name="line.1256"></a>
+<span class="sourceLineNo">1257</span>        try {<a name="line.1257"></a>
+<span class="sourceLineNo">1258</span>          listener.procedureLoaded(procId);<a name="line.1258"></a>
+<span class="sourceLineNo">1259</span>        } catch (Throwable e) {<a name="line.1259"></a>
+<span class="sourceLineNo">1260</span>          LOG.error("Listener " + listener + " had an error: " + e.getMessage(), e);<a name="line.1260"></a>
+<span class="sourceLineNo">1261</span>        }<a name="line.1261"></a>
+<span class="sourceLineNo">1262</span>      }<a name="line.1262"></a>
+<span class="sourceLineNo">1263</span>    }<a name="line.1263"></a>
+<span class="sourceLineNo">1264</span>  }<a name="line.1264"></a>
+<span class="sourceLineNo">1265</span><a name="line.1265"></a>
+<span class="sourceLineNo">1266</span>  private void sendProcedureAddedNotification(final long procId) {<a name="line.1266"></a>
+<span class="sourceLineNo">1267</span>    if (!this.listeners.isEmpty()) {<a name="line.1267"></a>
+<span class="sourceLineNo">1268</span>      for (ProcedureExecutorListener listener: this.listeners) {<a name="line.1268"></a>
+<span class="sourceLineNo">1269</span>        try {<a name="line.1269"></a>
+<span class="sourceLineNo">1270</span>          listener.procedureAdded(procId);<a name="line.1270"></a>
+<span class="sourceLineNo">1271</span>        } catch (Throwable e) {<a name="line.1271"></a>
+<span class="sourceLineNo">1272</span>          LOG.error("Listener " + listener + " had an error: " + e.getMessage(), e);<a name="line.1272"></a>
+<span class="sourceLineNo">1273</span>        }<a name="line.1273"></a>
+<span class="sourceLineNo">1274</span>      }<a name="line.1274"></a>
+<span class="sourceLineNo">1275</span>    }<a name="line.1275"></a>
+<span class="sourceLineNo">1276</span>  }<a name="line.1276"></a>
+<span class="sourceLineNo">1277</span><a name="line.1277"></a>
+<span class="sourceLineNo">1278</span>  private void sendProcedureFinishedNotification(final long procId) {<a name="line.1278"></a>
+<span class="sourceLineNo">1279</span>    if (!this.listeners.isEmpty()) {<a name="line.1279"></a>
+<span class="sourceLineNo">1280</span>      for (ProcedureExecutorListener listener: this.listeners) {<a name="line.1280"></a>
+<span class="sourceLineNo">1281</span>        try {<a name="line.1281"></a>
+<span class="sourceLineNo">1282</span>          listener.procedureFinished(procId);<a name="line.1282"></a>
+<span class="sourceLineNo">1283</span>        } catch (Throwable e) {<a name="line.1283"></a>
+<span class="sourceLineNo">1284</span>          LOG.error("Listener " + listener + " had an error: " + e.getMessage(), e);<a name="line.1284"></a>
+<span class="sourceLineNo">1285</span>        }<a name="line.1285"></a>
+<span class="sourceLineNo">1286</span>      }<a name="line.1286"></a>
+<span class="sourceLineNo">1287</span>    }<a name="line.1287"></a>
+<span class="sourceLineNo">1288</span>  }<a name="line.1288"></a>
+<span class="sourceLineNo">1289</span><a name="line.1289"></a>
+<span class="sourceLineNo">1290</span>  // ==========================================================================<a name="line.1290"></a>
+<span class="sourceLineNo">1291</span>  //  Procedure IDs helpers<a name="line.1291"></a>
+<span class="sourceLineNo">1292</span>  // ==========================================================================<a name="line.1292"></a>
+<span class="sourceLineNo">1293</span>  private long nextProcId() {<a name="line.1293"></a>
+<span class="sourceLineNo">1294</span>    long procId = lastProcId.incrementAndGet();<a name="line.1294"></a>
+<span class="sourceLineNo">1295</span>    if (procId &lt; 0) {<a name="line.1295"></a>
+<span class="sourceLineNo">1296</span>      while (!lastProcId.compareAndSet(procId, 0)) {<a name="line.1296"></a>
+<span class="sourceLineNo">1297</span>        procId = lastProcId.get();<a name="line.1297"></a>
+<span class="sourceLineNo">1298</span>        if (procId &gt;= 0)<a name="line.1298"></a>
+<span class="sourceLineNo">1299</span>          break;<a name="line.1299"></a>
+<span class="sourceLineNo">1300</span>      }<a name="line.1300"></a>
+<span class="sourceLineNo">1301</span>      while (procedures.containsKey(procId)) {<a name="line.1301"></a>
+<span class="sourceLineNo">1302</span>        procId = lastProcId.incrementAndGet();<a name="line.1302"></a>
+<span class="sourceLineNo">1303</span>      }<a name="line.1303"></a>
+<span class="sourceLineNo">1304</span>    }<a name="line.1304"></a>
+<span class="sourceLineNo">1305</span>    assert procId &gt;= 0 : "Invalid procId " + procId;<a name="line.1305"></a>
+<span class="sourceLineNo">1306</span>    return procId;<a name="line.1306"></a>
+<span class="sourceLineNo">1307</span>  }<a name="line.1307"></a>
+<span class="sourceLineNo">1308</span><a name="line.1308"></a>
+<span class="sourceLineNo">1309</span>  @VisibleForTesting<a name="line.1309"></a>
+<span class="sourceLineNo">1310</span>  protected long getLastProcId() {<a name="line.1310"></a>
+<span class="sourceLineNo">1311</span>    return lastProcId.get();<a name="line.1311"></a>
+<span class="sourceLineNo">1312</span>  }<a name="line.1312"></a>
+<span class="sourceLineNo">1313</span><a name="line.1313"></a>
+<span class="sourceLineNo">1314</span>  @VisibleForTesting<a name="line.1314"></a>
+<span class="sourceLineNo">1315</span>  public Set&lt;Long&gt; getActiveProcIds() {<a name="line.1315"></a>
+<span class="sourceLineNo">1316</span>    return procedures.keySet();<a name="line.1316"></a>
+<span class="sourceLineNo">1317</span>  }<a name="line.1317"></a>
+<span class="sourceLineNo">1318</span><a name="line.1318"></a>
+<span class="sourceLineNo">1319</span>  Long getRootProcedureId(Procedure&lt;TEnvironment&gt; proc) {<a name="line.1319"></a>
+<span class="sourceLineNo">1320</span>    return Procedure.getRootProcedureId(procedures, proc);<a name="line.1320"></a>
+<span class="sourceLineNo">1321</span>  }<a name="line.1321"></a>
+<span class="sourceLineNo">1322</span><a name="line.1322"></a>
+<span class="sourceLineNo">1323</span>  // ==========================================================================<a name="line.1323"></a>
+<span class="sourceLineNo">1324</span>  //  Executions<a name="line.1324"></a>
+<span class="sourceLineNo">1325</span>  // ==========================================================================<a name="line.1325"></a>
+<span class="sourceLineNo">1326</span>  private void executeProcedure(Procedure&lt;TEnvironment&gt; proc) {<a name="line.1326"></a>
+<span class="sourceLineNo">1327</span>    if (proc.isFinished()) {<a name="line.1327"></a>
+<span class="sourceLineNo">1328</span>      LOG.debug("{} is already finished, skipping execution", proc);<a name="line.1328"></a>
+<span class="sourceLineNo">1329</span>      return;<a name="line.1329"></a>
+<span class="sourceLineNo">1330</span>    }<a name="line.1330"></a>
+<span class="sourceLineNo">1331</span>    final Long rootProcId = getRootProcedureId(proc);<a name="line.1331"></a>
+<span class="sourceLineNo">1332</span>    if (rootProcId == null) {<a name="line.1332"></a>
+<span class="sourceLineNo">1333</span>      // The 'proc' was ready to run but the root procedure was rolledback<a name="line.1333"></a>
+<span class="sourceLineNo">1334</span>      LOG.warn("Rollback because parent is done/rolledback proc=" + proc);<a name="line.1334"></a>
+<span class="sourceLineNo">1335</span>      executeRollback(proc);<a name="line.1335"></a>
+<span class="sourceLineNo">1336</span>      return;<a name="line.1336"></a>
+<span class="sourceLineNo">1337</span>    }<a name="line.1337"></a>
+<span class="sourceLineNo">1338</span><a name="line.1338"></a>
+<span class="sourceLineNo">1339</span>    RootProcedureState&lt;TEnvironment&gt; procStack = rollbackStack.get(rootProcId);<a name="line.1339"></a>
+<span class="sourceLineNo">1340</span>    if (procStack == null) {<a name="line.1340"></a>
+<span class="sourceLineNo">1341</span>      LOG.warn("RootProcedureState is null for " + proc.getProcId());<a name="line.1341"></a>
+<span class="sourceLineNo">1342</span>      return;<a name="line.1342"></a>
+<span class="sourceLineNo">1343</span>    }<a name="line.1343"></a>
+<span class="sourceLineNo">1344</span>    do {<a name="line.1344"></a>
+<span class="sourceLineNo">1345</span>      // Try to acquire the execution<a name="line.1345"></a>
+<span class="sourceLineNo">1346</span>      if (!procStack.acquire(proc)) {<a name="line.1346"></a>
+<span class="sourceLineNo">1347</span>        if (procStack.setRollback()) {<a name="line.1347"></a>
+<span class="sourceLineNo">1348</span>          // we have the 'rollback-lock' we can start rollingback<a name="line.1348"></a>
+<span class="sourceLineNo">1349</span>          switch (executeRollback(rootProcId, procStack)) {<a name="line.1349"></a>
+<span class="sourceLineNo">1350</span>            case LOCK_ACQUIRED:<a name="line.1350"></a>
 <span class="sourceLineNo">1351</span>              break;<a name="line.1351"></a>
-<span class="sourceLineNo">1352</span>            default:<a name="line.1352"></a>
-<span class="sourceLineNo">1353</span>              throw new UnsupportedOperationException();<a name="line.1353"></a>
-<span class="sourceLineNo">1354</span>          }<a name="line.1354"></a>
-<span class="sourceLineNo">1355</span>        } else {<a name="line.1355"></a>
-<span class="sourceLineNo">1356</span>          // if we can't rollback means that some child is still running.<a name="line.1356"></a>
-<span class="sourceLineNo">1357</span>          // the rollback will be executed after all the children are done.<a name="line.1357"></a>
-<span class="sourceLineNo">1358</span>          // If the procedure was never executed, remove and mark it as rolledback.<a name="line.1358"></a>
-<span class="sourceLineNo">1359</span>          if (!proc.wasExecuted()) {<a name="line.1359"></a>
-<span class="sourceLineNo">1360</span>            switch (executeRollback(proc)) {<a name="line.1360"></a>
-<span class="sourceLineNo">1361</span>              case LOCK_ACQUIRED:<a name="line.1361"></a>
-<span class="sourceLineNo">1362</span>                break;<a name="line.1362"></a>
-<span class="sourceLineNo">1363</span>              case LOCK_YIELD_WAIT:<a name="line.1363"></a>
-<span class="sourceLineNo">1364</span>                scheduler.yield(proc);<a name="line.1364"></a>
-<span class="sourceLineNo">1365</span>                break;<a name="line.1365"></a>
-<span class="sourceLineNo">1366</span>              case LOCK_EVENT_WAIT:<a name="line.1366"></a>
-<span class="sourceLineNo">1367</span>                LOG.info("LOCK_EVENT_WAIT can't rollback child running?..." + proc);<a name="line.1367"></a>
-<span class="sourceLineNo">1368</span>                break;<a name="line.1368"></a>
-<span class="sourceLineNo">1369</span>              default:<a name="line.1369"></a>
-<span class="sourceLineNo">1370</span>                throw new UnsupportedOperationException();<a name="line.1370"></a>
-<span class="sourceLineNo">1371</span>            }<a name="line.1371"></a>
-<span class="sourceLineNo">1372</span>          }<a name="line.1372"></a>
-<span class="sourceLineNo">1373</span>        }<a name="line.1373"></a>
-<span class="sourceLineNo">1374</span>        break;<a name="line.1374"></a>
-<span class="sourceLineNo">1375</span>      }<a name="line.1375"></a>
-<span class="sourceLineNo">1376</span><a name="line.1376"></a>
-<span class="sourceLineNo">1377</span>      // Execute the procedure<a name="line.1377"></a>
-<span class="sourceLineNo">1378</span>      assert proc.getState() == ProcedureState.RUNNABLE : proc;<a name="line.1378"></a>
-<span class="sourceLineNo">1379</span>      // Note that lock is NOT about concurrency but rather about ensuring<a name="line.1379"></a>
-<span class="sourceLineNo">1380</span>      // ownership of a procedure of an entity such as a region or table<a name="line.1380"></a>
-<span class="sourceLineNo">1381</span>      LockState lockState = acquireLock(proc);<a name="line.1381"></a>
-<span class="sourceLineNo">1382</span>      switch (lockState) {<a name="line.1382"></a>
-<span class="sourceLineNo">1383</span>        case LOCK_ACQUIRED:<a name="line.1383"></a>
-<span class="sourceLineNo">1384</span>          execProcedure(procStack, proc);<a name="line.1384"></a>
-<span class="sourceLineNo">1385</span>          break;<a name="line.1385"></a>
-<span class="sourceLineNo">1386</span>        case LOCK_YIELD_WAIT:<a name="line.1386"></a>
-<span class="sourceLineNo">1387</span>          LOG.info(lockState + " " + proc);<a name="line.1387"></a>
-<span class="sourceLineNo">1388</span>          scheduler.yield(proc);<a name="line.1388"></a>
-<span class="sourceLineNo">1389</span>          break;<a name="line.1389"></a>
-<span class="sourceLineNo">1390</span>        case LOCK_EVENT_WAIT:<a name="line.1390"></a>
-<span class="sourceLineNo">1391</span>          // Someone will wake us up when the lock is available<a name="line.1391"></a>
-<span class="sourceLineNo">1392</span>          LOG.debug(lockState + " " + proc);<a name="line.1392"></a>
+<span class="sourceLineNo">1352</span>            case LOCK_YIELD_WAIT:<a name="line.1352"></a>
+<span class="sourceLineNo">1353</span>              procStack.unsetRollback();<a name="line.1353"></a>
+<span class="sourceLineNo">1354</span>              scheduler.yield(proc);<a name="line.1354"></a>
+<span class="sourceLineNo">1355</span>              break;<a name="line.1355"></a>
+<span class="sourceLineNo">1356</span>            case LOCK_EVENT_WAIT:<a name="line.1356"></a>
+<span class="sourceLineNo">1357</span>              LOG.info("LOCK_EVENT_WAIT rollback..." + proc);<a name="line.1357"></a>
+<span class="sourceLineNo">1358</span>              procStack.unsetRollback();<a name="line.1358"></a>
+<span class="sourceLineNo">1359</span>              break;<a name="line.1359"></a>
+<span class="sourceLineNo">1360</span>            default:<a name="line.1360"></a>
+<span class="sourceLineNo">1361</span>              throw new UnsupportedOperationException();<a name="line.1361"></a>
+<span class="sourceLineNo">1362</span>          }<a name="line.1362"></a>
+<span class="sourceLineNo">1363</span>        } else {<a name="line.1363"></a>
+<span class="sourceLineNo">1364</span>          // if we can't rollback means that some child is still running.<a name="line.1364"></a>
+<span class="sourceLineNo">1365</span>          // the rollback will be executed after all the children are done.<a name="line.1365"></a>
+<span class="sourceLineNo">1366</span>          // If the procedure was never executed, remove and mark it as rolledback.<a name="line.1366"></a>
+<span class="sourceLineNo">1367</span>          if (!proc.wasExecuted()) {<a name="line.1367"></a>
+<span class="sourceLineNo">1368</span>            switch (executeRollback(proc)) {<a name="line.1368"></a>
+<span class="sourceLineNo">1369</span>              case LOCK_ACQUIRED:<a name="line.1369"></a>
+<span class="sourceLineNo">1370</span>                break;<a name="line.1370"></a>
+<span class="sourceLineNo">1371</span>              case LOCK_YIELD_WAIT:<a name="line.1371"></a>
+<span class="sourceLineNo">1372</span>                scheduler.yield(proc);<a name="line.1372"></a>
+<span class="sourceLineNo">1373</span>                break;<a name="line.1373"></a>
+<span class="sourceLineNo">1374</span>              case LOCK_EVENT_WAIT:<a name="line.1374"></a>
+<span class="sourceLineNo">1375</span>                LOG.info("LOCK_EVENT_WAIT can't rollback child running?..." + proc);<a name="line.1375"></a>
+<span class="sourceLineNo">1376</span>                break;<a name="line.1376"></a>
+<span class="sourceLineNo">1377</span>              default:<a name="line.1377"></a>
+<span class="sourceLineNo">1378</span>                throw new UnsupportedOperationException();<a name="line.1378"></a>
+<span class="sourceLineNo">1379</span>            }<a name="line.1379"></a>
+<span class="sourceLineNo">1380</span>          }<a name="line.1380"></a>
+<span class="sourceLineNo">1381</span>        }<a name="line.1381"></a>
+<span class="sourceLineNo">1382</span>        break;<a name="line.1382"></a>
+<span class="sourceLineNo">1383</span>      }<a name="line.1383"></a>
+<span class="sourceLineNo">1384</span><a name="line.1384"></a>
+<span class="sourceLineNo">1385</span>      // Execute the procedure<a name="line.1385"></a>
+<span class="sourceLineNo">1386</span>      assert proc.getState() == ProcedureState.RUNNABLE : proc;<a name="line.1386"></a>
+<span class="sourceLineNo">1387</span>      // Note that lock is NOT about concurrency but rather about ensuring<a name="line.1387"></a>
+<span class="sourceLineNo">1388</span>      // ownership of a procedure of an entity such as a region or table<a name="line.1388"></a>
+<span class="sourceLineNo">1389</span>      LockState lockState = acquireLock(proc);<a name="line.1389"></a>
+<span class="sourceLineNo">1390</span>      switch (lockState) {<a name="line.1390"></a>
+<span class="sourceLineNo">1391</span>        case LOCK_ACQUIRED:<a name="line.1391"></a>
+<span class="sourceLineNo">1392</span>          execProcedure(procStack, proc);<a name="line.1392"></a>
 <span class="sourceLineNo">1393</span>          break;<a name="line.1393"></a>
-<span class="sourceLineNo">1394</span>        default:<a name="line.1394"></a>
-<span class="sourceLineNo">1395</span>          throw new UnsupportedOperationException();<a name="line.1395"></a>
-<span class="sourceLineNo">1396</span>      }<a name="line.1396"></a>
-<span class="sourceLineNo">1397</span>      procStack.release(proc);<a name="line.1397"></a>
-<span class="sourceLineNo">1398</span><a name="line.1398"></a>
-<span class="sourceLineNo">1399</span>      if (proc.isSuccess()) {<a name="line.1399"></a>
-<span class="sourceLineNo">1400</span>        // update metrics on finishing the procedure<a name="line.1400"></a>
-<span class="sourceLineNo">1401</span>        proc.updateMetricsOnFinish(getEnvironment(), proc.elapsedTime(), true);<a name="line.1401"></a>
-<span class="sourceLineNo">1402</span>        LOG.info("Finished " + proc + " in " + StringUtils.humanTimeDiff(proc.elapsedTime()));<a name="line.1402"></a>
-<span class="sourceLineNo">1403</span>        // Finalize the procedure state<a name="line.1403"></a>
-<span class="sourceLineNo">1404</span>        if (proc.getProcId() == rootProcId) {<a name="line.1404"></a>
-<span class="sourceLineNo">1405</span>          procedureFinished(proc);<a name="line.1405"></a>
-<span class="sourceLineNo">1406</span>        } else {<a name="line.1406"></a>
-<span class="sourceLineNo">1407</span>          execCompletionCleanup(proc);<a name="line.1407"></a>
-<span class="sourceLineNo">1408</span>        }<a name="line.1408"></a>
-<span class="sourceLineNo">1409</span>        break;<a name="line.1409"></a>
-<span class="sourceLineNo">1410</span>      }<a name="line.1410"></a>
-<span class="sourceLineNo">1411</span>    } while (procStack.isFailed());<a name="line.1411"></a>
-<span class="sourceLineNo">1412</span>  }<a name="line.1412"></a>
-<span class="sourceLineNo">1413</span><a name="line.1413"></a>
-<span class="sourceLineNo">1414</span>  private LockState acquireLock(Procedure&lt;TEnvironment&gt; proc) {<a name="line.1414"></a>
-<span class="sourceLineNo">1415</span>    TEnvironment env = getEnvironment();<a name="line.1415"></a>
-<span class="sourceLineNo">1416</span>    // if holdLock is true, then maybe we already have the lock, so just return LOCK_ACQUIRED if<a name="line.1416"></a>
-<span class="sourceLineNo">1417</span>    // hasLock is true.<a name="line.1417"></a>
-<span class="sourceLineNo">1418</span>    if (proc.hasLock()) {<a name="line.1418"></a>
-<span class="sourceLineNo">1419</span>      return LockState.LOCK_ACQUIRED;<a name="line.1419"></a>
-<span class="sourceLineNo">1420</span>    }<a name="line.1420"></a>
-<span class="sourceLineNo">1421</span>    return proc.doAcquireLock(env, store);<a name="line.1421"></a>
-<span class="sourceLineNo">1422</span>  }<a name="line.1422"></a>
-<span class="sourceLineNo">1423</span><a name="line.1423"></a>
-<span class="sourceLineNo">1424</span>  private void releaseLock(Procedure&lt;TEnvironment&gt; proc, boolean force) {<a name="line.1424"></a>
-<span class="sourceLineNo">1425</span>    TEnvironment env = getEnvironment();<a name="line.1425"></a>
-<span class="sourceLineNo">1426</span>    // For how the framework works, we know that we will always have the lock<a name="line.1426"></a>
-<span class="sourceLineNo">1427</span>    // when we call releaseLock(), so we can avoid calling proc.hasLock()<a name="line.1427"></a>
-<span class="sourceLineNo">1428</span>    if (force || !proc.holdLock(env) || proc.isFinished()) {<a name="line.1428"></a>
-<span class="sourceLineNo">1429</span>      proc.doReleaseLock(env, store);<a name="line.1429"></a>
-<span class="sourceLineNo">1430</span>    }<a name="line.1430"></a>
-<span class="sourceLineNo">1431</span>  }<a name="line.1431"></a>
-<span class="sourceLineNo">1432</span><a name="line.1432"></a>
-<span class="sourceLineNo">1433</span>  /**<a name="line.1433"></a>
-<span class="sourceLineNo">1434</span>   * Execute the rollback of the full procedure stack. Once the procedure is rolledback, the<a name="line.1434"></a>
-<span class="sourceLineNo">1435</span>   * root-procedure will be visible as finished to user, and the result will be the fatal exception.<a name="line.1435"></a>
-<span class="sourceLineNo">1436</span>   */<a name="line.1436"></a>
-<span class="sourceLineNo">1437</span>  private LockState executeRollback(long rootProcId, RootProcedureState&lt;TEnvironment&gt; procStack) {<a name="line.1437"></a>
-<span class="sourceLineNo">1438</span>    Procedure&lt;TEnvironment&gt; rootProc = procedures.get(rootProcId);<a name="line.1438"></a>
-<span class="sourceLineNo">1439</span>    RemoteProcedureException exception = rootProc.getException();<a name="line.1439"></a>
-<span class="sourceLineNo">1440</span>    // TODO: This needs doc. The root proc doesn't have an exception. Maybe we are<a name="line.1440"></a>
-<span class="sourceLineNo">1441</span>    // rolling back because the subprocedure does. Clarify.<a name="line.1441"></a>
-<span class="sourceLineNo">1442</span>    if (exception == null) {<a name="line.1442"></a>
-<span class="sourceLineNo">1443</span>      exception = procStack.getException();<a name="line.1443"></a>
-<span class="sourceLineNo">1444</span>      rootProc.setFailure(exception);<a name="line.1444"></a>
-<span class="sourceLineNo">1445</span>      store.update(rootProc);<a name="line.1445"></a>
-<span class="sourceLineNo">14

<TRUNCATED>

[04/29] hbase-site git commit: Published site at 5e84997f2ffdbcf5f849d70c30ddbe2db4039ca4.

Posted by gi...@apache.org.
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/27f5bfb5/testdevapidocs/src-html/org/apache/hadoop/hbase/procedure2/TestProcedureBypass.SuspendProcedure.html
----------------------------------------------------------------------
diff --git a/testdevapidocs/src-html/org/apache/hadoop/hbase/procedure2/TestProcedureBypass.SuspendProcedure.html b/testdevapidocs/src-html/org/apache/hadoop/hbase/procedure2/TestProcedureBypass.SuspendProcedure.html
index 7eb899a..f89b826 100644
--- a/testdevapidocs/src-html/org/apache/hadoop/hbase/procedure2/TestProcedureBypass.SuspendProcedure.html
+++ b/testdevapidocs/src-html/org/apache/hadoop/hbase/procedure2/TestProcedureBypass.SuspendProcedure.html
@@ -46,226 +46,262 @@
 <span class="sourceLineNo">038</span>import org.slf4j.Logger;<a name="line.38"></a>
 <span class="sourceLineNo">039</span>import org.slf4j.LoggerFactory;<a name="line.39"></a>
 <span class="sourceLineNo">040</span><a name="line.40"></a>
-<span class="sourceLineNo">041</span><a name="line.41"></a>
+<span class="sourceLineNo">041</span>import org.apache.hadoop.hbase.shaded.protobuf.generated.ProcedureProtos;<a name="line.41"></a>
 <span class="sourceLineNo">042</span><a name="line.42"></a>
-<span class="sourceLineNo">043</span>@Category({MasterTests.class, SmallTests.class})<a name="line.43"></a>
-<span class="sourceLineNo">044</span>public class TestProcedureBypass {<a name="line.44"></a>
-<span class="sourceLineNo">045</span><a name="line.45"></a>
-<span class="sourceLineNo">046</span>  @ClassRule public static final HBaseClassTestRule CLASS_RULE = HBaseClassTestRule<a name="line.46"></a>
-<span class="sourceLineNo">047</span>      .forClass(TestProcedureBypass.class);<a name="line.47"></a>
-<span class="sourceLineNo">048</span><a name="line.48"></a>
-<span class="sourceLineNo">049</span>  private static final Logger LOG = LoggerFactory.getLogger(TestProcedureBypass.class);<a name="line.49"></a>
-<span class="sourceLineNo">050</span><a name="line.50"></a>
-<span class="sourceLineNo">051</span>  private static final int PROCEDURE_EXECUTOR_SLOTS = 1;<a name="line.51"></a>
-<span class="sourceLineNo">052</span><a name="line.52"></a>
-<span class="sourceLineNo">053</span>  private static TestProcEnv procEnv;<a name="line.53"></a>
-<span class="sourceLineNo">054</span>  private static ProcedureStore procStore;<a name="line.54"></a>
-<span class="sourceLineNo">055</span><a name="line.55"></a>
-<span class="sourceLineNo">056</span>  private static ProcedureExecutor&lt;TestProcEnv&gt; procExecutor;<a name="line.56"></a>
-<span class="sourceLineNo">057</span><a name="line.57"></a>
-<span class="sourceLineNo">058</span>  private static HBaseCommonTestingUtility htu;<a name="line.58"></a>
-<span class="sourceLineNo">059</span><a name="line.59"></a>
-<span class="sourceLineNo">060</span>  private static FileSystem fs;<a name="line.60"></a>
-<span class="sourceLineNo">061</span>  private static Path testDir;<a name="line.61"></a>
-<span class="sourceLineNo">062</span>  private static Path logDir;<a name="line.62"></a>
-<span class="sourceLineNo">063</span><a name="line.63"></a>
-<span class="sourceLineNo">064</span>  private static class TestProcEnv {<a name="line.64"></a>
-<span class="sourceLineNo">065</span>  }<a name="line.65"></a>
-<span class="sourceLineNo">066</span><a name="line.66"></a>
-<span class="sourceLineNo">067</span>  @BeforeClass<a name="line.67"></a>
-<span class="sourceLineNo">068</span>  public static void setUp() throws Exception {<a name="line.68"></a>
-<span class="sourceLineNo">069</span>    htu = new HBaseCommonTestingUtility();<a name="line.69"></a>
-<span class="sourceLineNo">070</span><a name="line.70"></a>
-<span class="sourceLineNo">071</span>    // NOTE: The executor will be created by each test<a name="line.71"></a>
-<span class="sourceLineNo">072</span>    procEnv = new TestProcEnv();<a name="line.72"></a>
-<span class="sourceLineNo">073</span>    testDir = htu.getDataTestDir();<a name="line.73"></a>
-<span class="sourceLineNo">074</span>    fs = testDir.getFileSystem(htu.getConfiguration());<a name="line.74"></a>
-<span class="sourceLineNo">075</span>    assertTrue(testDir.depth() &gt; 1);<a name="line.75"></a>
-<span class="sourceLineNo">076</span><a name="line.76"></a>
-<span class="sourceLineNo">077</span>    logDir = new Path(testDir, "proc-logs");<a name="line.77"></a>
-<span class="sourceLineNo">078</span>    procStore = ProcedureTestingUtility.createWalStore(htu.getConfiguration(), logDir);<a name="line.78"></a>
-<span class="sourceLineNo">079</span>    procExecutor = new ProcedureExecutor&lt;&gt;(htu.getConfiguration(), procEnv,<a name="line.79"></a>
-<span class="sourceLineNo">080</span>        procStore);<a name="line.80"></a>
-<span class="sourceLineNo">081</span>    procStore.start(PROCEDURE_EXECUTOR_SLOTS);<a name="line.81"></a>
-<span class="sourceLineNo">082</span>    ProcedureTestingUtility<a name="line.82"></a>
-<span class="sourceLineNo">083</span>        .initAndStartWorkers(procExecutor, PROCEDURE_EXECUTOR_SLOTS, true);<a name="line.83"></a>
-<span class="sourceLineNo">084</span>  }<a name="line.84"></a>
-<span class="sourceLineNo">085</span><a name="line.85"></a>
-<span class="sourceLineNo">086</span>  @Test<a name="line.86"></a>
-<span class="sourceLineNo">087</span>  public void testBypassSuspendProcedure() throws Exception {<a name="line.87"></a>
-<span class="sourceLineNo">088</span>    final SuspendProcedure proc = new SuspendProcedure();<a name="line.88"></a>
-<span class="sourceLineNo">089</span>    long id = procExecutor.submitProcedure(proc);<a name="line.89"></a>
-<span class="sourceLineNo">090</span>    Thread.sleep(500);<a name="line.90"></a>
-<span class="sourceLineNo">091</span>    //bypass the procedure<a name="line.91"></a>
-<span class="sourceLineNo">092</span>    assertTrue(procExecutor.bypassProcedure(id, 30000, false, false));<a name="line.92"></a>
-<span class="sourceLineNo">093</span>    htu.waitFor(5000, () -&gt; proc.isSuccess() &amp;&amp; proc.isBypass());<a name="line.93"></a>
-<span class="sourceLineNo">094</span>    LOG.info("{} finished", proc);<a name="line.94"></a>
-<span class="sourceLineNo">095</span>  }<a name="line.95"></a>
-<span class="sourceLineNo">096</span><a name="line.96"></a>
-<span class="sourceLineNo">097</span>  @Test<a name="line.97"></a>
-<span class="sourceLineNo">098</span>  public void testStuckProcedure() throws Exception {<a name="line.98"></a>
-<span class="sourceLineNo">099</span>    final StuckProcedure proc = new StuckProcedure();<a name="line.99"></a>
-<span class="sourceLineNo">100</span>    long id = procExecutor.submitProcedure(proc);<a name="line.100"></a>
-<span class="sourceLineNo">101</span>    Thread.sleep(500);<a name="line.101"></a>
-<span class="sourceLineNo">102</span>    //bypass the procedure<a name="line.102"></a>
-<span class="sourceLineNo">103</span>    assertTrue(procExecutor.bypassProcedure(id, 1000, true, false));<a name="line.103"></a>
-<span class="sourceLineNo">104</span>    //Since the procedure is stuck there, we need to restart the executor to recovery.<a name="line.104"></a>
-<span class="sourceLineNo">105</span>    ProcedureTestingUtility.restart(procExecutor);<a name="line.105"></a>
-<span class="sourceLineNo">106</span>    htu.waitFor(5000, () -&gt; proc.isSuccess() &amp;&amp; proc.isBypass());<a name="line.106"></a>
-<span class="sourceLineNo">107</span>    LOG.info("{} finished", proc);<a name="line.107"></a>
-<span class="sourceLineNo">108</span>  }<a name="line.108"></a>
-<span class="sourceLineNo">109</span><a name="line.109"></a>
-<span class="sourceLineNo">110</span>  @Test<a name="line.110"></a>
-<span class="sourceLineNo">111</span>  public void testBypassingProcedureWithParent() throws Exception {<a name="line.111"></a>
-<span class="sourceLineNo">112</span>    final RootProcedure proc = new RootProcedure();<a name="line.112"></a>
-<span class="sourceLineNo">113</span>    long rootId = procExecutor.submitProcedure(proc);<a name="line.113"></a>
-<span class="sourceLineNo">114</span>    htu.waitFor(5000, () -&gt; procExecutor.getProcedures().stream()<a name="line.114"></a>
-<span class="sourceLineNo">115</span>      .filter(p -&gt; p.getParentProcId() == rootId).collect(Collectors.toList())<a name="line.115"></a>
-<span class="sourceLineNo">116</span>      .size() &gt; 0);<a name="line.116"></a>
-<span class="sourceLineNo">117</span>    SuspendProcedure suspendProcedure = (SuspendProcedure)procExecutor.getProcedures().stream()<a name="line.117"></a>
-<span class="sourceLineNo">118</span>        .filter(p -&gt; p.getParentProcId() == rootId).collect(Collectors.toList()).get(0);<a name="line.118"></a>
-<span class="sourceLineNo">119</span>    assertTrue(procExecutor.bypassProcedure(suspendProcedure.getProcId(), 1000, false, false));<a name="line.119"></a>
-<span class="sourceLineNo">120</span>    htu.waitFor(5000, () -&gt; proc.isSuccess() &amp;&amp; proc.isBypass());<a name="line.120"></a>
-<span class="sourceLineNo">121</span>    LOG.info("{} finished", proc);<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 testBypassingStuckStateMachineProcedure() throws Exception {<a name="line.125"></a>
-<span class="sourceLineNo">126</span>    final StuckStateMachineProcedure proc =<a name="line.126"></a>
-<span class="sourceLineNo">127</span>        new StuckStateMachineProcedure(procEnv, StuckStateMachineState.START);<a name="line.127"></a>
-<span class="sourceLineNo">128</span>    long id = procExecutor.submitProcedure(proc);<a name="line.128"></a>
-<span class="sourceLineNo">129</span>    Thread.sleep(500);<a name="line.129"></a>
-<span class="sourceLineNo">130</span>    // bypass the procedure<a name="line.130"></a>
-<span class="sourceLineNo">131</span>    assertFalse(procExecutor.bypassProcedure(id, 1000, false, false));<a name="line.131"></a>
-<span class="sourceLineNo">132</span>    assertTrue(procExecutor.bypassProcedure(id, 1000, true, false));<a name="line.132"></a>
-<span class="sourceLineNo">133</span><a name="line.133"></a>
-<span class="sourceLineNo">134</span>    htu.waitFor(5000, () -&gt; proc.isSuccess() &amp;&amp; proc.isBypass());<a name="line.134"></a>
-<span class="sourceLineNo">135</span>    LOG.info("{} finished", proc);<a name="line.135"></a>
-<span class="sourceLineNo">136</span>  }<a name="line.136"></a>
-<span class="sourceLineNo">137</span><a name="line.137"></a>
-<span class="sourceLineNo">138</span>  @Test<a name="line.138"></a>
-<span class="sourceLineNo">139</span>  public void testBypassingProcedureWithParentRecursive() throws Exception {<a name="line.139"></a>
-<span class="sourceLineNo">140</span>    final RootProcedure proc = new RootProcedure();<a name="line.140"></a>
-<span class="sourceLineNo">141</span>    long rootId = procExecutor.submitProcedure(proc);<a name="line.141"></a>
-<span class="sourceLineNo">142</span>    htu.waitFor(5000, () -&gt; procExecutor.getProcedures().stream()<a name="line.142"></a>
-<span class="sourceLineNo">143</span>        .filter(p -&gt; p.getParentProcId() == rootId).collect(Collectors.toList())<a name="line.143"></a>
-<span class="sourceLineNo">144</span>        .size() &gt; 0);<a name="line.144"></a>
-<span class="sourceLineNo">145</span>    SuspendProcedure suspendProcedure = (SuspendProcedure)procExecutor.getProcedures().stream()<a name="line.145"></a>
-<span class="sourceLineNo">146</span>        .filter(p -&gt; p.getParentProcId() == rootId).collect(Collectors.toList()).get(0);<a name="line.146"></a>
-<span class="sourceLineNo">147</span>    assertTrue(procExecutor.bypassProcedure(rootId, 1000, false, true));<a name="line.147"></a>
-<span class="sourceLineNo">148</span>    htu.waitFor(5000, () -&gt; proc.isSuccess() &amp;&amp; proc.isBypass());<a name="line.148"></a>
-<span class="sourceLineNo">149</span>    LOG.info("{} finished", proc);<a name="line.149"></a>
-<span class="sourceLineNo">150</span>  }<a name="line.150"></a>
-<span class="sourceLineNo">151</span><a name="line.151"></a>
-<span class="sourceLineNo">152</span>  @AfterClass<a name="line.152"></a>
-<span class="sourceLineNo">153</span>  public static void tearDown() throws Exception {<a name="line.153"></a>
-<span class="sourceLineNo">154</span>    procExecutor.stop();<a name="line.154"></a>
-<span class="sourceLineNo">155</span>    procStore.stop(false);<a name="line.155"></a>
-<span class="sourceLineNo">156</span>    procExecutor.join();<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>  public static class SuspendProcedure extends ProcedureTestingUtility.NoopProcedure&lt;TestProcEnv&gt; {<a name="line.159"></a>
+<span class="sourceLineNo">043</span><a name="line.43"></a>
+<span class="sourceLineNo">044</span>@Category({MasterTests.class, SmallTests.class})<a name="line.44"></a>
+<span class="sourceLineNo">045</span>public class TestProcedureBypass {<a name="line.45"></a>
+<span class="sourceLineNo">046</span><a name="line.46"></a>
+<span class="sourceLineNo">047</span>  @ClassRule public static final HBaseClassTestRule CLASS_RULE = HBaseClassTestRule<a name="line.47"></a>
+<span class="sourceLineNo">048</span>      .forClass(TestProcedureBypass.class);<a name="line.48"></a>
+<span class="sourceLineNo">049</span><a name="line.49"></a>
+<span class="sourceLineNo">050</span>  private static final Logger LOG = LoggerFactory.getLogger(TestProcedureBypass.class);<a name="line.50"></a>
+<span class="sourceLineNo">051</span><a name="line.51"></a>
+<span class="sourceLineNo">052</span>  private static final int PROCEDURE_EXECUTOR_SLOTS = 1;<a name="line.52"></a>
+<span class="sourceLineNo">053</span><a name="line.53"></a>
+<span class="sourceLineNo">054</span>  private static TestProcEnv procEnv;<a name="line.54"></a>
+<span class="sourceLineNo">055</span>  private static ProcedureStore procStore;<a name="line.55"></a>
+<span class="sourceLineNo">056</span><a name="line.56"></a>
+<span class="sourceLineNo">057</span>  private static ProcedureExecutor&lt;TestProcEnv&gt; procExecutor;<a name="line.57"></a>
+<span class="sourceLineNo">058</span><a name="line.58"></a>
+<span class="sourceLineNo">059</span>  private static HBaseCommonTestingUtility htu;<a name="line.59"></a>
+<span class="sourceLineNo">060</span><a name="line.60"></a>
+<span class="sourceLineNo">061</span>  private static FileSystem fs;<a name="line.61"></a>
+<span class="sourceLineNo">062</span>  private static Path testDir;<a name="line.62"></a>
+<span class="sourceLineNo">063</span>  private static Path logDir;<a name="line.63"></a>
+<span class="sourceLineNo">064</span><a name="line.64"></a>
+<span class="sourceLineNo">065</span>  private static class TestProcEnv {<a name="line.65"></a>
+<span class="sourceLineNo">066</span>  }<a name="line.66"></a>
+<span class="sourceLineNo">067</span><a name="line.67"></a>
+<span class="sourceLineNo">068</span>  @BeforeClass<a name="line.68"></a>
+<span class="sourceLineNo">069</span>  public static void setUp() throws Exception {<a name="line.69"></a>
+<span class="sourceLineNo">070</span>    htu = new HBaseCommonTestingUtility();<a name="line.70"></a>
+<span class="sourceLineNo">071</span><a name="line.71"></a>
+<span class="sourceLineNo">072</span>    // NOTE: The executor will be created by each test<a name="line.72"></a>
+<span class="sourceLineNo">073</span>    procEnv = new TestProcEnv();<a name="line.73"></a>
+<span class="sourceLineNo">074</span>    testDir = htu.getDataTestDir();<a name="line.74"></a>
+<span class="sourceLineNo">075</span>    fs = testDir.getFileSystem(htu.getConfiguration());<a name="line.75"></a>
+<span class="sourceLineNo">076</span>    assertTrue(testDir.depth() &gt; 1);<a name="line.76"></a>
+<span class="sourceLineNo">077</span><a name="line.77"></a>
+<span class="sourceLineNo">078</span>    logDir = new Path(testDir, "proc-logs");<a name="line.78"></a>
+<span class="sourceLineNo">079</span>    procStore = ProcedureTestingUtility.createWalStore(htu.getConfiguration(), logDir);<a name="line.79"></a>
+<span class="sourceLineNo">080</span>    procExecutor = new ProcedureExecutor&lt;&gt;(htu.getConfiguration(), procEnv,<a name="line.80"></a>
+<span class="sourceLineNo">081</span>        procStore);<a name="line.81"></a>
+<span class="sourceLineNo">082</span>    procStore.start(PROCEDURE_EXECUTOR_SLOTS);<a name="line.82"></a>
+<span class="sourceLineNo">083</span>    ProcedureTestingUtility<a name="line.83"></a>
+<span class="sourceLineNo">084</span>        .initAndStartWorkers(procExecutor, PROCEDURE_EXECUTOR_SLOTS, true);<a name="line.84"></a>
+<span class="sourceLineNo">085</span>  }<a name="line.85"></a>
+<span class="sourceLineNo">086</span><a name="line.86"></a>
+<span class="sourceLineNo">087</span>  @Test<a name="line.87"></a>
+<span class="sourceLineNo">088</span>  public void testBypassSuspendProcedure() throws Exception {<a name="line.88"></a>
+<span class="sourceLineNo">089</span>    final SuspendProcedure proc = new SuspendProcedure();<a name="line.89"></a>
+<span class="sourceLineNo">090</span>    long id = procExecutor.submitProcedure(proc);<a name="line.90"></a>
+<span class="sourceLineNo">091</span>    Thread.sleep(500);<a name="line.91"></a>
+<span class="sourceLineNo">092</span>    //bypass the procedure<a name="line.92"></a>
+<span class="sourceLineNo">093</span>    assertTrue(procExecutor.bypassProcedure(id, 30000, false, false));<a name="line.93"></a>
+<span class="sourceLineNo">094</span>    htu.waitFor(5000, () -&gt; proc.isSuccess() &amp;&amp; proc.isBypass());<a name="line.94"></a>
+<span class="sourceLineNo">095</span>    LOG.info("{} finished", proc);<a name="line.95"></a>
+<span class="sourceLineNo">096</span>  }<a name="line.96"></a>
+<span class="sourceLineNo">097</span><a name="line.97"></a>
+<span class="sourceLineNo">098</span>  @Test<a name="line.98"></a>
+<span class="sourceLineNo">099</span>  public void testStuckProcedure() throws Exception {<a name="line.99"></a>
+<span class="sourceLineNo">100</span>    final StuckProcedure proc = new StuckProcedure();<a name="line.100"></a>
+<span class="sourceLineNo">101</span>    long id = procExecutor.submitProcedure(proc);<a name="line.101"></a>
+<span class="sourceLineNo">102</span>    Thread.sleep(500);<a name="line.102"></a>
+<span class="sourceLineNo">103</span>    //bypass the procedure<a name="line.103"></a>
+<span class="sourceLineNo">104</span>    assertTrue(procExecutor.bypassProcedure(id, 1000, true, false));<a name="line.104"></a>
+<span class="sourceLineNo">105</span>    //Since the procedure is stuck there, we need to restart the executor to recovery.<a name="line.105"></a>
+<span class="sourceLineNo">106</span>    ProcedureTestingUtility.restart(procExecutor);<a name="line.106"></a>
+<span class="sourceLineNo">107</span>    htu.waitFor(5000, () -&gt; proc.isSuccess() &amp;&amp; proc.isBypass());<a name="line.107"></a>
+<span class="sourceLineNo">108</span>    LOG.info("{} finished", proc);<a name="line.108"></a>
+<span class="sourceLineNo">109</span>  }<a name="line.109"></a>
+<span class="sourceLineNo">110</span><a name="line.110"></a>
+<span class="sourceLineNo">111</span>  @Test<a name="line.111"></a>
+<span class="sourceLineNo">112</span>  public void testBypassingProcedureWithParent() throws Exception {<a name="line.112"></a>
+<span class="sourceLineNo">113</span>    final RootProcedure proc = new RootProcedure();<a name="line.113"></a>
+<span class="sourceLineNo">114</span>    long rootId = procExecutor.submitProcedure(proc);<a name="line.114"></a>
+<span class="sourceLineNo">115</span>    htu.waitFor(5000, () -&gt; procExecutor.getProcedures().stream()<a name="line.115"></a>
+<span class="sourceLineNo">116</span>      .filter(p -&gt; p.getParentProcId() == rootId).collect(Collectors.toList())<a name="line.116"></a>
+<span class="sourceLineNo">117</span>      .size() &gt; 0);<a name="line.117"></a>
+<span class="sourceLineNo">118</span>    SuspendProcedure suspendProcedure = (SuspendProcedure)procExecutor.getProcedures().stream()<a name="line.118"></a>
+<span class="sourceLineNo">119</span>        .filter(p -&gt; p.getParentProcId() == rootId).collect(Collectors.toList()).get(0);<a name="line.119"></a>
+<span class="sourceLineNo">120</span>    assertTrue(procExecutor.bypassProcedure(suspendProcedure.getProcId(), 1000, false, false));<a name="line.120"></a>
+<span class="sourceLineNo">121</span>    htu.waitFor(5000, () -&gt; proc.isSuccess() &amp;&amp; proc.isBypass());<a name="line.121"></a>
+<span class="sourceLineNo">122</span>    LOG.info("{} finished", proc);<a name="line.122"></a>
+<span class="sourceLineNo">123</span>  }<a name="line.123"></a>
+<span class="sourceLineNo">124</span><a name="line.124"></a>
+<span class="sourceLineNo">125</span>  @Test<a name="line.125"></a>
+<span class="sourceLineNo">126</span>  public void testBypassingStuckStateMachineProcedure() throws Exception {<a name="line.126"></a>
+<span class="sourceLineNo">127</span>    final StuckStateMachineProcedure proc =<a name="line.127"></a>
+<span class="sourceLineNo">128</span>        new StuckStateMachineProcedure(procEnv, StuckStateMachineState.START);<a name="line.128"></a>
+<span class="sourceLineNo">129</span>    long id = procExecutor.submitProcedure(proc);<a name="line.129"></a>
+<span class="sourceLineNo">130</span>    Thread.sleep(500);<a name="line.130"></a>
+<span class="sourceLineNo">131</span>    // bypass the procedure<a name="line.131"></a>
+<span class="sourceLineNo">132</span>    assertFalse(procExecutor.bypassProcedure(id, 1000, false, false));<a name="line.132"></a>
+<span class="sourceLineNo">133</span>    assertTrue(procExecutor.bypassProcedure(id, 1000, true, false));<a name="line.133"></a>
+<span class="sourceLineNo">134</span><a name="line.134"></a>
+<span class="sourceLineNo">135</span>    htu.waitFor(5000, () -&gt; proc.isSuccess() &amp;&amp; proc.isBypass());<a name="line.135"></a>
+<span class="sourceLineNo">136</span>    LOG.info("{} finished", proc);<a name="line.136"></a>
+<span class="sourceLineNo">137</span>  }<a name="line.137"></a>
+<span class="sourceLineNo">138</span><a name="line.138"></a>
+<span class="sourceLineNo">139</span>  @Test<a name="line.139"></a>
+<span class="sourceLineNo">140</span>  public void testBypassingProcedureWithParentRecursive() throws Exception {<a name="line.140"></a>
+<span class="sourceLineNo">141</span>    final RootProcedure proc = new RootProcedure();<a name="line.141"></a>
+<span class="sourceLineNo">142</span>    long rootId = procExecutor.submitProcedure(proc);<a name="line.142"></a>
+<span class="sourceLineNo">143</span>    htu.waitFor(5000, () -&gt; procExecutor.getProcedures().stream()<a name="line.143"></a>
+<span class="sourceLineNo">144</span>        .filter(p -&gt; p.getParentProcId() == rootId).collect(Collectors.toList())<a name="line.144"></a>
+<span class="sourceLineNo">145</span>        .size() &gt; 0);<a name="line.145"></a>
+<span class="sourceLineNo">146</span>    SuspendProcedure suspendProcedure = (SuspendProcedure)procExecutor.getProcedures().stream()<a name="line.146"></a>
+<span class="sourceLineNo">147</span>        .filter(p -&gt; p.getParentProcId() == rootId).collect(Collectors.toList()).get(0);<a name="line.147"></a>
+<span class="sourceLineNo">148</span>    assertTrue(procExecutor.bypassProcedure(rootId, 1000, false, true));<a name="line.148"></a>
+<span class="sourceLineNo">149</span>    htu.waitFor(5000, () -&gt; proc.isSuccess() &amp;&amp; proc.isBypass());<a name="line.149"></a>
+<span class="sourceLineNo">150</span>    LOG.info("{} finished", proc);<a name="line.150"></a>
+<span class="sourceLineNo">151</span>  }<a name="line.151"></a>
+<span class="sourceLineNo">152</span><a name="line.152"></a>
+<span class="sourceLineNo">153</span>  @Test<a name="line.153"></a>
+<span class="sourceLineNo">154</span>  public void testBypassingWaitingTimeoutProcedures() throws Exception {<a name="line.154"></a>
+<span class="sourceLineNo">155</span>    final WaitingTimeoutProcedure proc = new WaitingTimeoutProcedure();<a name="line.155"></a>
+<span class="sourceLineNo">156</span>    long id = procExecutor.submitProcedure(proc);<a name="line.156"></a>
+<span class="sourceLineNo">157</span>    Thread.sleep(500);<a name="line.157"></a>
+<span class="sourceLineNo">158</span>    // bypass the procedure<a name="line.158"></a>
+<span class="sourceLineNo">159</span>    assertTrue(procExecutor.bypassProcedure(id, 1000, true, false));<a name="line.159"></a>
 <span class="sourceLineNo">160</span><a name="line.160"></a>
-<span class="sourceLineNo">161</span>    public SuspendProcedure() {<a name="line.161"></a>
-<span class="sourceLineNo">162</span>      super();<a name="line.162"></a>
-<span class="sourceLineNo">163</span>    }<a name="line.163"></a>
+<span class="sourceLineNo">161</span>    htu.waitFor(5000, () -&gt; proc.isSuccess() &amp;&amp; proc.isBypass());<a name="line.161"></a>
+<span class="sourceLineNo">162</span>    LOG.info("{} finished", proc);<a name="line.162"></a>
+<span class="sourceLineNo">163</span>  }<a name="line.163"></a>
 <span class="sourceLineNo">164</span><a name="line.164"></a>
-<span class="sourceLineNo">165</span>    @Override<a name="line.165"></a>
-<span class="sourceLineNo">166</span>    protected Procedure[] execute(final TestProcEnv env)<a name="line.166"></a>
-<span class="sourceLineNo">167</span>        throws ProcedureSuspendedException {<a name="line.167"></a>
-<span class="sourceLineNo">168</span>      // Always suspend the procedure<a name="line.168"></a>
-<span class="sourceLineNo">169</span>      throw new ProcedureSuspendedException();<a name="line.169"></a>
-<span class="sourceLineNo">170</span>    }<a name="line.170"></a>
-<span class="sourceLineNo">171</span>  }<a name="line.171"></a>
-<span class="sourceLineNo">172</span><a name="line.172"></a>
-<span class="sourceLineNo">173</span>  public static class StuckProcedure extends ProcedureTestingUtility.NoopProcedure&lt;TestProcEnv&gt; {<a name="line.173"></a>
-<span class="sourceLineNo">174</span><a name="line.174"></a>
-<span class="sourceLineNo">175</span>    public StuckProcedure() {<a name="line.175"></a>
-<span class="sourceLineNo">176</span>      super();<a name="line.176"></a>
-<span class="sourceLineNo">177</span>    }<a name="line.177"></a>
-<span class="sourceLineNo">178</span><a name="line.178"></a>
-<span class="sourceLineNo">179</span>    @Override<a name="line.179"></a>
-<span class="sourceLineNo">180</span>    protected Procedure[] execute(final TestProcEnv env) {<a name="line.180"></a>
-<span class="sourceLineNo">181</span>      try {<a name="line.181"></a>
-<span class="sourceLineNo">182</span>        Thread.sleep(Long.MAX_VALUE);<a name="line.182"></a>
-<span class="sourceLineNo">183</span>      } catch (Throwable t) {<a name="line.183"></a>
-<span class="sourceLineNo">184</span>        LOG.debug("Sleep is interrupted.", t);<a name="line.184"></a>
-<span class="sourceLineNo">185</span>      }<a name="line.185"></a>
-<span class="sourceLineNo">186</span>      return null;<a name="line.186"></a>
-<span class="sourceLineNo">187</span>    }<a name="line.187"></a>
-<span class="sourceLineNo">188</span><a name="line.188"></a>
-<span class="sourceLineNo">189</span>  }<a name="line.189"></a>
-<span class="sourceLineNo">190</span><a name="line.190"></a>
+<span class="sourceLineNo">165</span>  @AfterClass<a name="line.165"></a>
+<span class="sourceLineNo">166</span>  public static void tearDown() throws Exception {<a name="line.166"></a>
+<span class="sourceLineNo">167</span>    procExecutor.stop();<a name="line.167"></a>
+<span class="sourceLineNo">168</span>    procStore.stop(false);<a name="line.168"></a>
+<span class="sourceLineNo">169</span>    procExecutor.join();<a name="line.169"></a>
+<span class="sourceLineNo">170</span>  }<a name="line.170"></a>
+<span class="sourceLineNo">171</span><a name="line.171"></a>
+<span class="sourceLineNo">172</span>  public static class SuspendProcedure extends ProcedureTestingUtility.NoopProcedure&lt;TestProcEnv&gt; {<a name="line.172"></a>
+<span class="sourceLineNo">173</span><a name="line.173"></a>
+<span class="sourceLineNo">174</span>    public SuspendProcedure() {<a name="line.174"></a>
+<span class="sourceLineNo">175</span>      super();<a name="line.175"></a>
+<span class="sourceLineNo">176</span>    }<a name="line.176"></a>
+<span class="sourceLineNo">177</span><a name="line.177"></a>
+<span class="sourceLineNo">178</span>    @Override<a name="line.178"></a>
+<span class="sourceLineNo">179</span>    protected Procedure[] execute(final TestProcEnv env)<a name="line.179"></a>
+<span class="sourceLineNo">180</span>        throws ProcedureSuspendedException {<a name="line.180"></a>
+<span class="sourceLineNo">181</span>      // Always suspend the procedure<a name="line.181"></a>
+<span class="sourceLineNo">182</span>      throw new ProcedureSuspendedException();<a name="line.182"></a>
+<span class="sourceLineNo">183</span>    }<a name="line.183"></a>
+<span class="sourceLineNo">184</span>  }<a name="line.184"></a>
+<span class="sourceLineNo">185</span><a name="line.185"></a>
+<span class="sourceLineNo">186</span>  public static class StuckProcedure extends ProcedureTestingUtility.NoopProcedure&lt;TestProcEnv&gt; {<a name="line.186"></a>
+<span class="sourceLineNo">187</span><a name="line.187"></a>
+<span class="sourceLineNo">188</span>    public StuckProcedure() {<a name="line.188"></a>
+<span class="sourceLineNo">189</span>      super();<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>  public static class RootProcedure extends ProcedureTestingUtility.NoopProcedure&lt;TestProcEnv&gt; {<a name="line.192"></a>
-<span class="sourceLineNo">193</span>    private boolean childSpwaned = false;<a name="line.193"></a>
-<span class="sourceLineNo">194</span><a name="line.194"></a>
-<span class="sourceLineNo">195</span>    public RootProcedure() {<a name="line.195"></a>
-<span class="sourceLineNo">196</span>      super();<a name="line.196"></a>
-<span class="sourceLineNo">197</span>    }<a name="line.197"></a>
-<span class="sourceLineNo">198</span><a name="line.198"></a>
-<span class="sourceLineNo">199</span>    @Override<a name="line.199"></a>
-<span class="sourceLineNo">200</span>    protected Procedure[] execute(final TestProcEnv env)<a name="line.200"></a>
-<span class="sourceLineNo">201</span>        throws ProcedureSuspendedException {<a name="line.201"></a>
-<span class="sourceLineNo">202</span>      if (!childSpwaned) {<a name="line.202"></a>
-<span class="sourceLineNo">203</span>        childSpwaned = true;<a name="line.203"></a>
-<span class="sourceLineNo">204</span>        return new Procedure[] {new SuspendProcedure()};<a name="line.204"></a>
-<span class="sourceLineNo">205</span>      } else {<a name="line.205"></a>
-<span class="sourceLineNo">206</span>        return null;<a name="line.206"></a>
-<span class="sourceLineNo">207</span>      }<a name="line.207"></a>
-<span class="sourceLineNo">208</span>    }<a name="line.208"></a>
-<span class="sourceLineNo">209</span>  }<a name="line.209"></a>
-<span class="sourceLineNo">210</span><a name="line.210"></a>
+<span class="sourceLineNo">192</span>    @Override<a name="line.192"></a>
+<span class="sourceLineNo">193</span>    protected Procedure[] execute(final TestProcEnv env) {<a name="line.193"></a>
+<span class="sourceLineNo">194</span>      try {<a name="line.194"></a>
+<span class="sourceLineNo">195</span>        Thread.sleep(Long.MAX_VALUE);<a name="line.195"></a>
+<span class="sourceLineNo">196</span>      } catch (Throwable t) {<a name="line.196"></a>
+<span class="sourceLineNo">197</span>        LOG.debug("Sleep is interrupted.", t);<a name="line.197"></a>
+<span class="sourceLineNo">198</span>      }<a name="line.198"></a>
+<span class="sourceLineNo">199</span>      return null;<a name="line.199"></a>
+<span class="sourceLineNo">200</span>    }<a name="line.200"></a>
+<span class="sourceLineNo">201</span><a name="line.201"></a>
+<span class="sourceLineNo">202</span>  }<a name="line.202"></a>
+<span class="sourceLineNo">203</span><a name="line.203"></a>
+<span class="sourceLineNo">204</span><a name="line.204"></a>
+<span class="sourceLineNo">205</span>  public static class RootProcedure extends ProcedureTestingUtility.NoopProcedure&lt;TestProcEnv&gt; {<a name="line.205"></a>
+<span class="sourceLineNo">206</span>    private boolean childSpwaned = false;<a name="line.206"></a>
+<span class="sourceLineNo">207</span><a name="line.207"></a>
+<span class="sourceLineNo">208</span>    public RootProcedure() {<a name="line.208"></a>
+<span class="sourceLineNo">209</span>      super();<a name="line.209"></a>
+<span class="sourceLineNo">210</span>    }<a name="line.210"></a>
 <span class="sourceLineNo">211</span><a name="line.211"></a>
-<span class="sourceLineNo">212</span>  public enum StuckStateMachineState {<a name="line.212"></a>
-<span class="sourceLineNo">213</span>    START, THEN, END<a name="line.213"></a>
-<span class="sourceLineNo">214</span>  }<a name="line.214"></a>
-<span class="sourceLineNo">215</span><a name="line.215"></a>
-<span class="sourceLineNo">216</span>  public static class StuckStateMachineProcedure extends<a name="line.216"></a>
-<span class="sourceLineNo">217</span>      ProcedureTestingUtility.NoopStateMachineProcedure&lt;TestProcEnv, StuckStateMachineState&gt; {<a name="line.217"></a>
-<span class="sourceLineNo">218</span>    private AtomicBoolean stop = new AtomicBoolean(false);<a name="line.218"></a>
-<span class="sourceLineNo">219</span><a name="line.219"></a>
-<span class="sourceLineNo">220</span>    public StuckStateMachineProcedure() {<a name="line.220"></a>
-<span class="sourceLineNo">221</span>      super();<a name="line.221"></a>
-<span class="sourceLineNo">222</span>    }<a name="line.222"></a>
+<span class="sourceLineNo">212</span>    @Override<a name="line.212"></a>
+<span class="sourceLineNo">213</span>    protected Procedure[] execute(final TestProcEnv env)<a name="line.213"></a>
+<span class="sourceLineNo">214</span>        throws ProcedureSuspendedException {<a name="line.214"></a>
+<span class="sourceLineNo">215</span>      if (!childSpwaned) {<a name="line.215"></a>
+<span class="sourceLineNo">216</span>        childSpwaned = true;<a name="line.216"></a>
+<span class="sourceLineNo">217</span>        return new Procedure[] {new SuspendProcedure()};<a name="line.217"></a>
+<span class="sourceLineNo">218</span>      } else {<a name="line.218"></a>
+<span class="sourceLineNo">219</span>        return null;<a name="line.219"></a>
+<span class="sourceLineNo">220</span>      }<a name="line.220"></a>
+<span class="sourceLineNo">221</span>    }<a name="line.221"></a>
+<span class="sourceLineNo">222</span>  }<a name="line.222"></a>
 <span class="sourceLineNo">223</span><a name="line.223"></a>
-<span class="sourceLineNo">224</span>    public StuckStateMachineProcedure(TestProcEnv env, StuckStateMachineState initialState) {<a name="line.224"></a>
-<span class="sourceLineNo">225</span>      super(env, initialState);<a name="line.225"></a>
-<span class="sourceLineNo">226</span>    }<a name="line.226"></a>
-<span class="sourceLineNo">227</span><a name="line.227"></a>
-<span class="sourceLineNo">228</span>    @Override<a name="line.228"></a>
-<span class="sourceLineNo">229</span>    protected Flow executeFromState(TestProcEnv env, StuckStateMachineState tState)<a name="line.229"></a>
-<span class="sourceLineNo">230</span>            throws ProcedureSuspendedException, ProcedureYieldException, InterruptedException {<a name="line.230"></a>
-<span class="sourceLineNo">231</span>      switch (tState) {<a name="line.231"></a>
-<span class="sourceLineNo">232</span>        case START:<a name="line.232"></a>
-<span class="sourceLineNo">233</span>          LOG.info("PHASE 1: START");<a name="line.233"></a>
-<span class="sourceLineNo">234</span>          setNextState(StuckStateMachineState.THEN);<a name="line.234"></a>
-<span class="sourceLineNo">235</span>          return Flow.HAS_MORE_STATE;<a name="line.235"></a>
-<span class="sourceLineNo">236</span>        case THEN:<a name="line.236"></a>
-<span class="sourceLineNo">237</span>          if (stop.get()) {<a name="line.237"></a>
-<span class="sourceLineNo">238</span>            setNextState(StuckStateMachineState.END);<a name="line.238"></a>
-<span class="sourceLineNo">239</span>          }<a name="line.239"></a>
-<span class="sourceLineNo">240</span>          return Flow.HAS_MORE_STATE;<a name="line.240"></a>
-<span class="sourceLineNo">241</span>        case END:<a name="line.241"></a>
-<span class="sourceLineNo">242</span>          return Flow.NO_MORE_STATE;<a name="line.242"></a>
-<span class="sourceLineNo">243</span>        default:<a name="line.243"></a>
-<span class="sourceLineNo">244</span>          throw new UnsupportedOperationException("unhandled state=" + tState);<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">224</span>  public static class WaitingTimeoutProcedure<a name="line.224"></a>
+<span class="sourceLineNo">225</span>      extends ProcedureTestingUtility.NoopProcedure&lt;TestProcEnv&gt; {<a name="line.225"></a>
+<span class="sourceLineNo">226</span>    public WaitingTimeoutProcedure() {<a name="line.226"></a>
+<span class="sourceLineNo">227</span>      super();<a name="line.227"></a>
+<span class="sourceLineNo">228</span>    }<a name="line.228"></a>
+<span class="sourceLineNo">229</span><a name="line.229"></a>
+<span class="sourceLineNo">230</span>    @Override<a name="line.230"></a>
+<span class="sourceLineNo">231</span>    protected Procedure[] execute(final TestProcEnv env)<a name="line.231"></a>
+<span class="sourceLineNo">232</span>        throws ProcedureSuspendedException {<a name="line.232"></a>
+<span class="sourceLineNo">233</span>      // Always suspend the procedure<a name="line.233"></a>
+<span class="sourceLineNo">234</span>      setTimeout(50000);<a name="line.234"></a>
+<span class="sourceLineNo">235</span>      setState(ProcedureProtos.ProcedureState.WAITING_TIMEOUT);<a name="line.235"></a>
+<span class="sourceLineNo">236</span>      skipPersistence();<a name="line.236"></a>
+<span class="sourceLineNo">237</span>      throw new ProcedureSuspendedException();<a name="line.237"></a>
+<span class="sourceLineNo">238</span>    }<a name="line.238"></a>
+<span class="sourceLineNo">239</span><a name="line.239"></a>
+<span class="sourceLineNo">240</span>    @Override<a name="line.240"></a>
+<span class="sourceLineNo">241</span>    protected synchronized boolean setTimeoutFailure(TestProcEnv env) {<a name="line.241"></a>
+<span class="sourceLineNo">242</span>      setState(ProcedureProtos.ProcedureState.RUNNABLE);<a name="line.242"></a>
+<span class="sourceLineNo">243</span>      procExecutor.getScheduler().addFront(this);<a name="line.243"></a>
+<span class="sourceLineNo">244</span>      return false; // 'false' means that this procedure handled the timeout<a name="line.244"></a>
+<span class="sourceLineNo">245</span>    }<a name="line.245"></a>
+<span class="sourceLineNo">246</span>  }<a name="line.246"></a>
 <span class="sourceLineNo">247</span><a name="line.247"></a>
-<span class="sourceLineNo">248</span>    @Override<a name="line.248"></a>
-<span class="sourceLineNo">249</span>    protected StuckStateMachineState getState(int stateId) {<a name="line.249"></a>
-<span class="sourceLineNo">250</span>      return StuckStateMachineState.values()[stateId];<a name="line.250"></a>
-<span class="sourceLineNo">251</span>    }<a name="line.251"></a>
-<span class="sourceLineNo">252</span><a name="line.252"></a>
-<span class="sourceLineNo">253</span>    @Override<a name="line.253"></a>
-<span class="sourceLineNo">254</span>    protected int getStateId(StuckStateMachineState tState) {<a name="line.254"></a>
-<span class="sourceLineNo">255</span>      return tState.ordinal();<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">248</span>  public enum StuckStateMachineState {<a name="line.248"></a>
+<span class="sourceLineNo">249</span>    START, THEN, END<a name="line.249"></a>
+<span class="sourceLineNo">250</span>  }<a name="line.250"></a>
+<span class="sourceLineNo">251</span><a name="line.251"></a>
+<span class="sourceLineNo">252</span>  public static class StuckStateMachineProcedure extends<a name="line.252"></a>
+<span class="sourceLineNo">253</span>      ProcedureTestingUtility.NoopStateMachineProcedure&lt;TestProcEnv, StuckStateMachineState&gt; {<a name="line.253"></a>
+<span class="sourceLineNo">254</span>    private AtomicBoolean stop = new AtomicBoolean(false);<a name="line.254"></a>
+<span class="sourceLineNo">255</span><a name="line.255"></a>
+<span class="sourceLineNo">256</span>    public StuckStateMachineProcedure() {<a name="line.256"></a>
+<span class="sourceLineNo">257</span>      super();<a name="line.257"></a>
+<span class="sourceLineNo">258</span>    }<a name="line.258"></a>
 <span class="sourceLineNo">259</span><a name="line.259"></a>
-<span class="sourceLineNo">260</span>}<a name="line.260"></a>
+<span class="sourceLineNo">260</span>    public StuckStateMachineProcedure(TestProcEnv env, StuckStateMachineState initialState) {<a name="line.260"></a>
+<span class="sourceLineNo">261</span>      super(env, initialState);<a name="line.261"></a>
+<span class="sourceLineNo">262</span>    }<a name="line.262"></a>
+<span class="sourceLineNo">263</span><a name="line.263"></a>
+<span class="sourceLineNo">264</span>    @Override<a name="line.264"></a>
+<span class="sourceLineNo">265</span>    protected Flow executeFromState(TestProcEnv env, StuckStateMachineState tState)<a name="line.265"></a>
+<span class="sourceLineNo">266</span>            throws ProcedureSuspendedException, ProcedureYieldException, InterruptedException {<a name="line.266"></a>
+<span class="sourceLineNo">267</span>      switch (tState) {<a name="line.267"></a>
+<span class="sourceLineNo">268</span>        case START:<a name="line.268"></a>
+<span class="sourceLineNo">269</span>          LOG.info("PHASE 1: START");<a name="line.269"></a>
+<span class="sourceLineNo">270</span>          setNextState(StuckStateMachineState.THEN);<a name="line.270"></a>
+<span class="sourceLineNo">271</span>          return Flow.HAS_MORE_STATE;<a name="line.271"></a>
+<span class="sourceLineNo">272</span>        case THEN:<a name="line.272"></a>
+<span class="sourceLineNo">273</span>          if (stop.get()) {<a name="line.273"></a>
+<span class="sourceLineNo">274</span>            setNextState(StuckStateMachineState.END);<a name="line.274"></a>
+<span class="sourceLineNo">275</span>          }<a name="line.275"></a>
+<span class="sourceLineNo">276</span>          return Flow.HAS_MORE_STATE;<a name="line.276"></a>
+<span class="sourceLineNo">277</span>        case END:<a name="line.277"></a>
+<span class="sourceLineNo">278</span>          return Flow.NO_MORE_STATE;<a name="line.278"></a>
+<span class="sourceLineNo">279</span>        default:<a name="line.279"></a>
+<span class="sourceLineNo">280</span>          throw new UnsupportedOperationException("unhandled state=" + tState);<a name="line.280"></a>
+<span class="sourceLineNo">281</span>      }<a name="line.281"></a>
+<span class="sourceLineNo">282</span>    }<a name="line.282"></a>
+<span class="sourceLineNo">283</span><a name="line.283"></a>
+<span class="sourceLineNo">284</span>    @Override<a name="line.284"></a>
+<span class="sourceLineNo">285</span>    protected StuckStateMachineState getState(int stateId) {<a name="line.285"></a>
+<span class="sourceLineNo">286</span>      return StuckStateMachineState.values()[stateId];<a name="line.286"></a>
+<span class="sourceLineNo">287</span>    }<a name="line.287"></a>
+<span class="sourceLineNo">288</span><a name="line.288"></a>
+<span class="sourceLineNo">289</span>    @Override<a name="line.289"></a>
+<span class="sourceLineNo">290</span>    protected int getStateId(StuckStateMachineState tState) {<a name="line.290"></a>
+<span class="sourceLineNo">291</span>      return tState.ordinal();<a name="line.291"></a>
+<span class="sourceLineNo">292</span>    }<a name="line.292"></a>
+<span class="sourceLineNo">293</span>  }<a name="line.293"></a>
+<span class="sourceLineNo">294</span><a name="line.294"></a>
+<span class="sourceLineNo">295</span><a name="line.295"></a>
+<span class="sourceLineNo">296</span>}<a name="line.296"></a>
 
 
 


[24/29] hbase-site git commit: Published site at 5e84997f2ffdbcf5f849d70c30ddbe2db4039ca4.

Posted by gi...@apache.org.
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/27f5bfb5/devapidocs/org/apache/hadoop/hbase/master/procedure/MasterProcedureScheduler.html
----------------------------------------------------------------------
diff --git a/devapidocs/org/apache/hadoop/hbase/master/procedure/MasterProcedureScheduler.html b/devapidocs/org/apache/hadoop/hbase/master/procedure/MasterProcedureScheduler.html
index 9b4ec28..596214e 100644
--- a/devapidocs/org/apache/hadoop/hbase/master/procedure/MasterProcedureScheduler.html
+++ b/devapidocs/org/apache/hadoop/hbase/master/procedure/MasterProcedureScheduler.html
@@ -119,7 +119,7 @@ var activeTableTab = "activeTableTab";
 <hr>
 <br>
 <pre>@InterfaceAudience.Private
-public class <a href="../../../../../../src-html/org/apache/hadoop/hbase/master/procedure/MasterProcedureScheduler.html#line.96">MasterProcedureScheduler</a>
+public class <a href="../../../../../../src-html/org/apache/hadoop/hbase/master/procedure/MasterProcedureScheduler.html#line.97">MasterProcedureScheduler</a>
 extends <a href="../../../../../../org/apache/hadoop/hbase/procedure2/AbstractProcedureScheduler.html" title="class in org.apache.hadoop.hbase.procedure2">AbstractProcedureScheduler</a></pre>
 <div class="block">ProcedureScheduler for the Master Procedures.
  This ProcedureScheduler tries to provide to the ProcedureExecutor procedures
@@ -276,8 +276,9 @@ extends <a href="../../../../../../org/apache/hadoop/hbase/procedure2/AbstractPr
 </tr>
 <tr id="i0" class="altColor">
 <td class="colFirst"><code>private static &lt;T extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Comparable.html?is-external=true" title="class or interface in java.lang">Comparable</a>&lt;T&gt;&gt;<br>void</code></td>
-<td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/master/procedure/MasterProcedureScheduler.html#addToRunQueue-org.apache.hadoop.hbase.master.procedure.FairQueue-org.apache.hadoop.hbase.master.procedure.Queue-">addToRunQueue</a></span>(<a href="../../../../../../org/apache/hadoop/hbase/master/procedure/FairQueue.html" title="class in org.apache.hadoop.hbase.master.procedure">FairQueue</a>&lt;T&gt;&nbsp;fairq,
-             <a href="../../../../../../org/apache/hadoop/hbase/master/procedure/Queue.html" title="class in org.apache.hadoop.hbase.master.procedure">Queue</a>&lt;T&gt;&nbsp;queue)</code>&nbsp;</td>
+<td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/master/procedure/MasterProcedureScheduler.html#addToRunQueue-org.apache.hadoop.hbase.master.procedure.FairQueue-org.apache.hadoop.hbase.master.procedure.Queue-java.util.function.Supplier-">addToRunQueue</a></span>(<a href="../../../../../../org/apache/hadoop/hbase/master/procedure/FairQueue.html" title="class in org.apache.hadoop.hbase.master.procedure">FairQueue</a>&lt;T&gt;&nbsp;fairq,
+             <a href="../../../../../../org/apache/hadoop/hbase/master/procedure/Queue.html" title="class in org.apache.hadoop.hbase.master.procedure">Queue</a>&lt;T&gt;&nbsp;queue,
+             <a href="https://docs.oracle.com/javase/8/docs/api/java/util/function/Supplier.html?is-external=true" title="class or interface in java.util.function">Supplier</a>&lt;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&gt;&nbsp;reason)</code>&nbsp;</td>
 </tr>
 <tr id="i1" class="rowColor">
 <td class="colFirst"><code>void</code></td>
@@ -430,8 +431,9 @@ extends <a href="../../../../../../org/apache/hadoop/hbase/procedure2/AbstractPr
 </tr>
 <tr id="i30" class="altColor">
 <td class="colFirst"><code>private static &lt;T extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Comparable.html?is-external=true" title="class or interface in java.lang">Comparable</a>&lt;T&gt;&gt;<br>void</code></td>
-<td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/master/procedure/MasterProcedureScheduler.html#removeFromRunQueue-org.apache.hadoop.hbase.master.procedure.FairQueue-org.apache.hadoop.hbase.master.procedure.Queue-">removeFromRunQueue</a></span>(<a href="../../../../../../org/apache/hadoop/hbase/master/procedure/FairQueue.html" title="class in org.apache.hadoop.hbase.master.procedure">FairQueue</a>&lt;T&gt;&nbsp;fairq,
-                  <a href="../../../../../../org/apache/hadoop/hbase/master/procedure/Queue.html" title="class in org.apache.hadoop.hbase.master.procedure">Queue</a>&lt;T&gt;&nbsp;queue)</code>&nbsp;</td>
+<td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/master/procedure/MasterProcedureScheduler.html#removeFromRunQueue-org.apache.hadoop.hbase.master.procedure.FairQueue-org.apache.hadoop.hbase.master.procedure.Queue-java.util.function.Supplier-">removeFromRunQueue</a></span>(<a href="../../../../../../org/apache/hadoop/hbase/master/procedure/FairQueue.html" title="class in org.apache.hadoop.hbase.master.procedure">FairQueue</a>&lt;T&gt;&nbsp;fairq,
+                  <a href="../../../../../../org/apache/hadoop/hbase/master/procedure/Queue.html" title="class in org.apache.hadoop.hbase.master.procedure">Queue</a>&lt;T&gt;&nbsp;queue,
+                  <a href="https://docs.oracle.com/javase/8/docs/api/java/util/function/Supplier.html?is-external=true" title="class or interface in java.util.function">Supplier</a>&lt;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&gt;&nbsp;reason)</code>&nbsp;</td>
 </tr>
 <tr id="i31" class="rowColor">
 <td class="colFirst"><code>private void</code></td>
@@ -619,7 +621,7 @@ extends <a href="../../../../../../org/apache/hadoop/hbase/procedure2/AbstractPr
 <ul class="blockList">
 <li class="blockList">
 <h4>LOG</h4>
-<pre>private static final&nbsp;org.slf4j.Logger <a href="../../../../../../src-html/org/apache/hadoop/hbase/master/procedure/MasterProcedureScheduler.html#line.97">LOG</a></pre>
+<pre>private static final&nbsp;org.slf4j.Logger <a href="../../../../../../src-html/org/apache/hadoop/hbase/master/procedure/MasterProcedureScheduler.html#line.98">LOG</a></pre>
 </li>
 </ul>
 <a name="SERVER_QUEUE_KEY_COMPARATOR">
@@ -628,7 +630,7 @@ extends <a href="../../../../../../org/apache/hadoop/hbase/procedure2/AbstractPr
 <ul class="blockList">
 <li class="blockList">
 <h4>SERVER_QUEUE_KEY_COMPARATOR</h4>
-<pre>private static final&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/util/AvlUtil.AvlKeyComparator.html" title="interface in org.apache.hadoop.hbase.util">AvlUtil.AvlKeyComparator</a>&lt;<a href="../../../../../../org/apache/hadoop/hbase/master/procedure/ServerQueue.html" title="class in org.apache.hadoop.hbase.master.procedure">ServerQueue</a>&gt; <a href="../../../../../../src-html/org/apache/hadoop/hbase/master/procedure/MasterProcedureScheduler.html#line.99">SERVER_QUEUE_KEY_COMPARATOR</a></pre>
+<pre>private static final&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/util/AvlUtil.AvlKeyComparator.html" title="interface in org.apache.hadoop.hbase.util">AvlUtil.AvlKeyComparator</a>&lt;<a href="../../../../../../org/apache/hadoop/hbase/master/procedure/ServerQueue.html" title="class in org.apache.hadoop.hbase.master.procedure">ServerQueue</a>&gt; <a href="../../../../../../src-html/org/apache/hadoop/hbase/master/procedure/MasterProcedureScheduler.html#line.100">SERVER_QUEUE_KEY_COMPARATOR</a></pre>
 </li>
 </ul>
 <a name="TABLE_QUEUE_KEY_COMPARATOR">
@@ -637,7 +639,7 @@ extends <a href="../../../../../../org/apache/hadoop/hbase/procedure2/AbstractPr
 <ul class="blockList">
 <li class="blockList">
 <h4>TABLE_QUEUE_KEY_COMPARATOR</h4>
-<pre>private static final&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/util/AvlUtil.AvlKeyComparator.html" title="interface in org.apache.hadoop.hbase.util">AvlUtil.AvlKeyComparator</a>&lt;<a href="../../../../../../org/apache/hadoop/hbase/master/procedure/TableQueue.html" title="class in org.apache.hadoop.hbase.master.procedure">TableQueue</a>&gt; <a href="../../../../../../src-html/org/apache/hadoop/hbase/master/procedure/MasterProcedureScheduler.html#line.101">TABLE_QUEUE_KEY_COMPARATOR</a></pre>
+<pre>private static final&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/util/AvlUtil.AvlKeyComparator.html" title="interface in org.apache.hadoop.hbase.util">AvlUtil.AvlKeyComparator</a>&lt;<a href="../../../../../../org/apache/hadoop/hbase/master/procedure/TableQueue.html" title="class in org.apache.hadoop.hbase.master.procedure">TableQueue</a>&gt; <a href="../../../../../../src-html/org/apache/hadoop/hbase/master/procedure/MasterProcedureScheduler.html#line.102">TABLE_QUEUE_KEY_COMPARATOR</a></pre>
 </li>
 </ul>
 <a name="PEER_QUEUE_KEY_COMPARATOR">
@@ -646,7 +648,7 @@ extends <a href="../../../../../../org/apache/hadoop/hbase/procedure2/AbstractPr
 <ul class="blockList">
 <li class="blockList">
 <h4>PEER_QUEUE_KEY_COMPARATOR</h4>
-<pre>private static final&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/util/AvlUtil.AvlKeyComparator.html" title="interface in org.apache.hadoop.hbase.util">AvlUtil.AvlKeyComparator</a>&lt;<a href="../../../../../../org/apache/hadoop/hbase/master/procedure/PeerQueue.html" title="class in org.apache.hadoop.hbase.master.procedure">PeerQueue</a>&gt; <a href="../../../../../../src-html/org/apache/hadoop/hbase/master/procedure/MasterProcedureScheduler.html#line.103">PEER_QUEUE_KEY_COMPARATOR</a></pre>
+<pre>private static final&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/util/AvlUtil.AvlKeyComparator.html" title="interface in org.apache.hadoop.hbase.util">AvlUtil.AvlKeyComparator</a>&lt;<a href="../../../../../../org/apache/hadoop/hbase/master/procedure/PeerQueue.html" title="class in org.apache.hadoop.hbase.master.procedure">PeerQueue</a>&gt; <a href="../../../../../../src-html/org/apache/hadoop/hbase/master/procedure/MasterProcedureScheduler.html#line.104">PEER_QUEUE_KEY_COMPARATOR</a></pre>
 </li>
 </ul>
 <a name="META_QUEUE_KEY_COMPARATOR">
@@ -655,7 +657,7 @@ extends <a href="../../../../../../org/apache/hadoop/hbase/procedure2/AbstractPr
 <ul class="blockList">
 <li class="blockList">
 <h4>META_QUEUE_KEY_COMPARATOR</h4>
-<pre>private static final&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/util/AvlUtil.AvlKeyComparator.html" title="interface in org.apache.hadoop.hbase.util">AvlUtil.AvlKeyComparator</a>&lt;<a href="../../../../../../org/apache/hadoop/hbase/master/procedure/MetaQueue.html" title="class in org.apache.hadoop.hbase.master.procedure">MetaQueue</a>&gt; <a href="../../../../../../src-html/org/apache/hadoop/hbase/master/procedure/MasterProcedureScheduler.html#line.105">META_QUEUE_KEY_COMPARATOR</a></pre>
+<pre>private static final&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/util/AvlUtil.AvlKeyComparator.html" title="interface in org.apache.hadoop.hbase.util">AvlUtil.AvlKeyComparator</a>&lt;<a href="../../../../../../org/apache/hadoop/hbase/master/procedure/MetaQueue.html" title="class in org.apache.hadoop.hbase.master.procedure">MetaQueue</a>&gt; <a href="../../../../../../src-html/org/apache/hadoop/hbase/master/procedure/MasterProcedureScheduler.html#line.106">META_QUEUE_KEY_COMPARATOR</a></pre>
 </li>
 </ul>
 <a name="serverRunQueue">
@@ -664,7 +666,7 @@ extends <a href="../../../../../../org/apache/hadoop/hbase/procedure2/AbstractPr
 <ul class="blockList">
 <li class="blockList">
 <h4>serverRunQueue</h4>
-<pre>private final&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/master/procedure/FairQueue.html" title="class in org.apache.hadoop.hbase.master.procedure">FairQueue</a>&lt;<a href="../../../../../../org/apache/hadoop/hbase/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a>&gt; <a href="../../../../../../src-html/org/apache/hadoop/hbase/master/procedure/MasterProcedureScheduler.html#line.108">serverRunQueue</a></pre>
+<pre>private final&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/master/procedure/FairQueue.html" title="class in org.apache.hadoop.hbase.master.procedure">FairQueue</a>&lt;<a href="../../../../../../org/apache/hadoop/hbase/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a>&gt; <a href="../../../../../../src-html/org/apache/hadoop/hbase/master/procedure/MasterProcedureScheduler.html#line.109">serverRunQueue</a></pre>
 </li>
 </ul>
 <a name="tableRunQueue">
@@ -673,7 +675,7 @@ extends <a href="../../../../../../org/apache/hadoop/hbase/procedure2/AbstractPr
 <ul class="blockList">
 <li class="blockList">
 <h4>tableRunQueue</h4>
-<pre>private final&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/master/procedure/FairQueue.html" title="class in org.apache.hadoop.hbase.master.procedure">FairQueue</a>&lt;<a href="../../../../../../org/apache/hadoop/hbase/TableName.html" title="class in org.apache.hadoop.hbase">TableName</a>&gt; <a href="../../../../../../src-html/org/apache/hadoop/hbase/master/procedure/MasterProcedureScheduler.html#line.109">tableRunQueue</a></pre>
+<pre>private final&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/master/procedure/FairQueue.html" title="class in org.apache.hadoop.hbase.master.procedure">FairQueue</a>&lt;<a href="../../../../../../org/apache/hadoop/hbase/TableName.html" title="class in org.apache.hadoop.hbase">TableName</a>&gt; <a href="../../../../../../src-html/org/apache/hadoop/hbase/master/procedure/MasterProcedureScheduler.html#line.110">tableRunQueue</a></pre>
 </li>
 </ul>
 <a name="peerRunQueue">
@@ -682,7 +684,7 @@ extends <a href="../../../../../../org/apache/hadoop/hbase/procedure2/AbstractPr
 <ul class="blockList">
 <li class="blockList">
 <h4>peerRunQueue</h4>
-<pre>private final&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/master/procedure/FairQueue.html" title="class in org.apache.hadoop.hbase.master.procedure">FairQueue</a>&lt;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&gt; <a href="../../../../../../src-html/org/apache/hadoop/hbase/master/procedure/MasterProcedureScheduler.html#line.110">peerRunQueue</a></pre>
+<pre>private final&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/master/procedure/FairQueue.html" title="class in org.apache.hadoop.hbase.master.procedure">FairQueue</a>&lt;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&gt; <a href="../../../../../../src-html/org/apache/hadoop/hbase/master/procedure/MasterProcedureScheduler.html#line.111">peerRunQueue</a></pre>
 </li>
 </ul>
 <a name="metaRunQueue">
@@ -691,7 +693,7 @@ extends <a href="../../../../../../org/apache/hadoop/hbase/procedure2/AbstractPr
 <ul class="blockList">
 <li class="blockList">
 <h4>metaRunQueue</h4>
-<pre>private final&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/master/procedure/FairQueue.html" title="class in org.apache.hadoop.hbase.master.procedure">FairQueue</a>&lt;<a href="../../../../../../org/apache/hadoop/hbase/TableName.html" title="class in org.apache.hadoop.hbase">TableName</a>&gt; <a href="../../../../../../src-html/org/apache/hadoop/hbase/master/procedure/MasterProcedureScheduler.html#line.111">metaRunQueue</a></pre>
+<pre>private final&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/master/procedure/FairQueue.html" title="class in org.apache.hadoop.hbase.master.procedure">FairQueue</a>&lt;<a href="../../../../../../org/apache/hadoop/hbase/TableName.html" title="class in org.apache.hadoop.hbase">TableName</a>&gt; <a href="../../../../../../src-html/org/apache/hadoop/hbase/master/procedure/MasterProcedureScheduler.html#line.112">metaRunQueue</a></pre>
 </li>
 </ul>
 <a name="serverBuckets">
@@ -700,7 +702,7 @@ extends <a href="../../../../../../org/apache/hadoop/hbase/procedure2/AbstractPr
 <ul class="blockList">
 <li class="blockList">
 <h4>serverBuckets</h4>
-<pre>private final&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/master/procedure/ServerQueue.html" title="class in org.apache.hadoop.hbase.master.procedure">ServerQueue</a>[] <a href="../../../../../../src-html/org/apache/hadoop/hbase/master/procedure/MasterProcedureScheduler.html#line.113">serverBuckets</a></pre>
+<pre>private final&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/master/procedure/ServerQueue.html" title="class in org.apache.hadoop.hbase.master.procedure">ServerQueue</a>[] <a href="../../../../../../src-html/org/apache/hadoop/hbase/master/procedure/MasterProcedureScheduler.html#line.114">serverBuckets</a></pre>
 </li>
 </ul>
 <a name="tableMap">
@@ -709,7 +711,7 @@ extends <a href="../../../../../../org/apache/hadoop/hbase/procedure2/AbstractPr
 <ul class="blockList">
 <li class="blockList">
 <h4>tableMap</h4>
-<pre>private&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/master/procedure/TableQueue.html" title="class in org.apache.hadoop.hbase.master.procedure">TableQueue</a> <a href="../../../../../../src-html/org/apache/hadoop/hbase/master/procedure/MasterProcedureScheduler.html#line.114">tableMap</a></pre>
+<pre>private&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/master/procedure/TableQueue.html" title="class in org.apache.hadoop.hbase.master.procedure">TableQueue</a> <a href="../../../../../../src-html/org/apache/hadoop/hbase/master/procedure/MasterProcedureScheduler.html#line.115">tableMap</a></pre>
 </li>
 </ul>
 <a name="peerMap">
@@ -718,7 +720,7 @@ extends <a href="../../../../../../org/apache/hadoop/hbase/procedure2/AbstractPr
 <ul class="blockList">
 <li class="blockList">
 <h4>peerMap</h4>
-<pre>private&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/master/procedure/PeerQueue.html" title="class in org.apache.hadoop.hbase.master.procedure">PeerQueue</a> <a href="../../../../../../src-html/org/apache/hadoop/hbase/master/procedure/MasterProcedureScheduler.html#line.115">peerMap</a></pre>
+<pre>private&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/master/procedure/PeerQueue.html" title="class in org.apache.hadoop.hbase.master.procedure">PeerQueue</a> <a href="../../../../../../src-html/org/apache/hadoop/hbase/master/procedure/MasterProcedureScheduler.html#line.116">peerMap</a></pre>
 </li>
 </ul>
 <a name="metaMap">
@@ -727,7 +729,7 @@ extends <a href="../../../../../../org/apache/hadoop/hbase/procedure2/AbstractPr
 <ul class="blockList">
 <li class="blockList">
 <h4>metaMap</h4>
-<pre>private&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/master/procedure/MetaQueue.html" title="class in org.apache.hadoop.hbase.master.procedure">MetaQueue</a> <a href="../../../../../../src-html/org/apache/hadoop/hbase/master/procedure/MasterProcedureScheduler.html#line.116">metaMap</a></pre>
+<pre>private&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/master/procedure/MetaQueue.html" title="class in org.apache.hadoop.hbase.master.procedure">MetaQueue</a> <a href="../../../../../../src-html/org/apache/hadoop/hbase/master/procedure/MasterProcedureScheduler.html#line.117">metaMap</a></pre>
 </li>
 </ul>
 <a name="locking">
@@ -736,7 +738,7 @@ extends <a href="../../../../../../org/apache/hadoop/hbase/procedure2/AbstractPr
 <ul class="blockListLast">
 <li class="blockList">
 <h4>locking</h4>
-<pre>private final&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/master/procedure/SchemaLocking.html" title="class in org.apache.hadoop.hbase.master.procedure">SchemaLocking</a> <a href="../../../../../../src-html/org/apache/hadoop/hbase/master/procedure/MasterProcedureScheduler.html#line.118">locking</a></pre>
+<pre>private final&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/master/procedure/SchemaLocking.html" title="class in org.apache.hadoop.hbase.master.procedure">SchemaLocking</a> <a href="../../../../../../src-html/org/apache/hadoop/hbase/master/procedure/MasterProcedureScheduler.html#line.119">locking</a></pre>
 </li>
 </ul>
 </li>
@@ -753,7 +755,7 @@ extends <a href="../../../../../../org/apache/hadoop/hbase/procedure2/AbstractPr
 <ul class="blockListLast">
 <li class="blockList">
 <h4>MasterProcedureScheduler</h4>
-<pre>public&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/procedure/MasterProcedureScheduler.html#line.120">MasterProcedureScheduler</a>(<a href="https://docs.oracle.com/javase/8/docs/api/java/util/function/Function.html?is-external=true" title="class or interface in java.util.function">Function</a>&lt;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Long.html?is-external=true" title="class or interface in java.lang">Long</a>,<a href="../../../../../../org/apache/hadoop/hbase/procedure2/Procedure.html" title="class in org.apache.hadoop.hbase.procedure2">Procedure</a>&lt;?&gt;&gt;&nbsp;procedureRetriever)</pre>
+<pre>public&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/procedure/MasterProcedureScheduler.html#line.121">MasterProcedureScheduler</a>(<a href="https://docs.oracle.com/javase/8/docs/api/java/util/function/Function.html?is-external=true" title="class or interface in java.util.function">Function</a>&lt;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Long.html?is-external=true" title="class or interface in java.lang">Long</a>,<a href="../../../../../../org/apache/hadoop/hbase/procedure2/Procedure.html" title="class in org.apache.hadoop.hbase.procedure2">Procedure</a>&lt;?&gt;&gt;&nbsp;procedureRetriever)</pre>
 </li>
 </ul>
 </li>
@@ -770,7 +772,7 @@ extends <a href="../../../../../../org/apache/hadoop/hbase/procedure2/AbstractPr
 <ul class="blockList">
 <li class="blockList">
 <h4>yield</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/procedure/MasterProcedureScheduler.html#line.125">yield</a>(<a href="../../../../../../org/apache/hadoop/hbase/procedure2/Procedure.html" title="class in org.apache.hadoop.hbase.procedure2">Procedure</a>&nbsp;proc)</pre>
+<pre>public&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/procedure/MasterProcedureScheduler.html#line.126">yield</a>(<a href="../../../../../../org/apache/hadoop/hbase/procedure2/Procedure.html" title="class in org.apache.hadoop.hbase.procedure2">Procedure</a>&nbsp;proc)</pre>
 <div class="block"><span class="descfrmTypeLabel">Description copied from interface:&nbsp;<code><a href="../../../../../../org/apache/hadoop/hbase/procedure2/ProcedureScheduler.html#yield-org.apache.hadoop.hbase.procedure2.Procedure-">ProcedureScheduler</a></code></span></div>
 <div class="block">The procedure can't run at the moment.
  add it back to the queue, giving priority to someone else.</div>
@@ -786,7 +788,7 @@ extends <a href="../../../../../../org/apache/hadoop/hbase/procedure2/AbstractPr
 <ul class="blockList">
 <li class="blockList">
 <h4>enqueue</h4>
-<pre>protected&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/procedure/MasterProcedureScheduler.html#line.130">enqueue</a>(<a href="../../../../../../org/apache/hadoop/hbase/procedure2/Procedure.html" title="class in org.apache.hadoop.hbase.procedure2">Procedure</a>&nbsp;proc,
+<pre>protected&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/procedure/MasterProcedureScheduler.html#line.131">enqueue</a>(<a href="../../../../../../org/apache/hadoop/hbase/procedure2/Procedure.html" title="class in org.apache.hadoop.hbase.procedure2">Procedure</a>&nbsp;proc,
                        boolean&nbsp;addFront)</pre>
 <div class="block"><span class="descfrmTypeLabel">Description copied from class:&nbsp;<code><a href="../../../../../../org/apache/hadoop/hbase/procedure2/AbstractProcedureScheduler.html#enqueue-org.apache.hadoop.hbase.procedure2.Procedure-boolean-">AbstractProcedureScheduler</a></code></span></div>
 <div class="block">Add the procedure to the queue.
@@ -806,7 +808,7 @@ extends <a href="../../../../../../org/apache/hadoop/hbase/procedure2/AbstractPr
 <ul class="blockList">
 <li class="blockList">
 <h4>doAdd</h4>
-<pre>private&nbsp;&lt;T extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Comparable.html?is-external=true" title="class or interface in java.lang">Comparable</a>&lt;T&gt;&gt;&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/procedure/MasterProcedureScheduler.html#line.150">doAdd</a>(<a href="../../../../../../org/apache/hadoop/hbase/master/procedure/FairQueue.html" title="class in org.apache.hadoop.hbase.master.procedure">FairQueue</a>&lt;T&gt;&nbsp;fairq,
+<pre>private&nbsp;&lt;T extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Comparable.html?is-external=true" title="class or interface in java.lang">Comparable</a>&lt;T&gt;&gt;&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/procedure/MasterProcedureScheduler.html#line.151">doAdd</a>(<a href="../../../../../../org/apache/hadoop/hbase/master/procedure/FairQueue.html" title="class in org.apache.hadoop.hbase.master.procedure">FairQueue</a>&lt;T&gt;&nbsp;fairq,
                                              <a href="../../../../../../org/apache/hadoop/hbase/master/procedure/Queue.html" title="class in org.apache.hadoop.hbase.master.procedure">Queue</a>&lt;T&gt;&nbsp;queue,
                                              <a href="../../../../../../org/apache/hadoop/hbase/procedure2/Procedure.html" title="class in org.apache.hadoop.hbase.procedure2">Procedure</a>&lt;?&gt;&nbsp;proc,
                                              boolean&nbsp;addFront)</pre>
@@ -818,7 +820,7 @@ extends <a href="../../../../../../org/apache/hadoop/hbase/procedure2/AbstractPr
 <ul class="blockList">
 <li class="blockList">
 <h4>queueHasRunnables</h4>
-<pre>protected&nbsp;boolean&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/procedure/MasterProcedureScheduler.html#line.165">queueHasRunnables</a>()</pre>
+<pre>protected&nbsp;boolean&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/procedure/MasterProcedureScheduler.html#line.175">queueHasRunnables</a>()</pre>
 <div class="block"><span class="descfrmTypeLabel">Description copied from class:&nbsp;<code><a href="../../../../../../org/apache/hadoop/hbase/procedure2/AbstractProcedureScheduler.html#queueHasRunnables--">AbstractProcedureScheduler</a></code></span></div>
 <div class="block">Returns true if there are procedures available to process.
  NOTE: this method is called with the sched lock held.</div>
@@ -836,7 +838,7 @@ extends <a href="../../../../../../org/apache/hadoop/hbase/procedure2/AbstractPr
 <ul class="blockList">
 <li class="blockList">
 <h4>dequeue</h4>
-<pre>protected&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/procedure2/Procedure.html" title="class in org.apache.hadoop.hbase.procedure2">Procedure</a>&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/procedure/MasterProcedureScheduler.html#line.171">dequeue</a>()</pre>
+<pre>protected&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/procedure2/Procedure.html" title="class in org.apache.hadoop.hbase.procedure2">Procedure</a>&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/procedure/MasterProcedureScheduler.html#line.181">dequeue</a>()</pre>
 <div class="block"><span class="descfrmTypeLabel">Description copied from class:&nbsp;<code><a href="../../../../../../org/apache/hadoop/hbase/procedure2/AbstractProcedureScheduler.html#dequeue--">AbstractProcedureScheduler</a></code></span></div>
 <div class="block">Fetch one Procedure from the queue
  NOTE: this method is called with the sched lock held.</div>
@@ -854,7 +856,7 @@ extends <a href="../../../../../../org/apache/hadoop/hbase/procedure2/AbstractPr
 <ul class="blockList">
 <li class="blockList">
 <h4>isLockReady</h4>
-<pre>private&nbsp;&lt;T extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Comparable.html?is-external=true" title="class or interface in java.lang">Comparable</a>&lt;T&gt;&gt;&nbsp;boolean&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/procedure/MasterProcedureScheduler.html#line.189">isLockReady</a>(<a href="../../../../../../org/apache/hadoop/hbase/procedure2/Procedure.html" title="class in org.apache.hadoop.hbase.procedure2">Procedure</a>&lt;?&gt;&nbsp;proc,
+<pre>private&nbsp;&lt;T extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Comparable.html?is-external=true" title="class or interface in java.lang">Comparable</a>&lt;T&gt;&gt;&nbsp;boolean&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/procedure/MasterProcedureScheduler.html#line.199">isLockReady</a>(<a href="../../../../../../org/apache/hadoop/hbase/procedure2/Procedure.html" title="class in org.apache.hadoop.hbase.procedure2">Procedure</a>&lt;?&gt;&nbsp;proc,
                                                       <a href="../../../../../../org/apache/hadoop/hbase/master/procedure/Queue.html" title="class in org.apache.hadoop.hbase.master.procedure">Queue</a>&lt;T&gt;&nbsp;rq)</pre>
 </li>
 </ul>
@@ -864,7 +866,7 @@ extends <a href="../../../../../../org/apache/hadoop/hbase/procedure2/AbstractPr
 <ul class="blockList">
 <li class="blockList">
 <h4>doPoll</h4>
-<pre>private&nbsp;&lt;T extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Comparable.html?is-external=true" title="class or interface in java.lang">Comparable</a>&lt;T&gt;&gt;&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/procedure2/Procedure.html" title="class in org.apache.hadoop.hbase.procedure2">Procedure</a>&lt;?&gt;&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/procedure/MasterProcedureScheduler.html#line.201">doPoll</a>(<a href="../../../../../../org/apache/hadoop/hbase/master/procedure/FairQueue.html" title="class in org.apache.hadoop.hbase.master.procedure">FairQueue</a>&lt;T&gt;&nbsp;fairq)</pre>
+<pre>private&nbsp;&lt;T extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Comparable.html?is-external=true" title="class or interface in java.lang">Comparable</a>&lt;T&gt;&gt;&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/procedure2/Procedure.html" title="class in org.apache.hadoop.hbase.procedure2">Procedure</a>&lt;?&gt;&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/procedure/MasterProcedureScheduler.html#line.211">doPoll</a>(<a href="../../../../../../org/apache/hadoop/hbase/master/procedure/FairQueue.html" title="class in org.apache.hadoop.hbase.master.procedure">FairQueue</a>&lt;T&gt;&nbsp;fairq)</pre>
 </li>
 </ul>
 <a name="getLocks--">
@@ -873,7 +875,7 @@ extends <a href="../../../../../../org/apache/hadoop/hbase/procedure2/AbstractPr
 <ul class="blockList">
 <li class="blockList">
 <h4>getLocks</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/LockedResource.html" title="class in org.apache.hadoop.hbase.procedure2">LockedResource</a>&gt;&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/procedure/MasterProcedureScheduler.html#line.226">getLocks</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/LockedResource.html" title="class in org.apache.hadoop.hbase.procedure2">LockedResource</a>&gt;&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/procedure/MasterProcedureScheduler.html#line.236">getLocks</a>()</pre>
 <div class="block"><span class="descfrmTypeLabel">Description copied from interface:&nbsp;<code><a href="../../../../../../org/apache/hadoop/hbase/procedure2/ProcedureScheduler.html#getLocks--">ProcedureScheduler</a></code></span></div>
 <div class="block">List lock queues.</div>
 <dl>
@@ -888,7 +890,7 @@ extends <a href="../../../../../../org/apache/hadoop/hbase/procedure2/AbstractPr
 <ul class="blockList">
 <li class="blockList">
 <h4>getLockResource</h4>
-<pre>public&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/procedure2/LockedResource.html" title="class in org.apache.hadoop.hbase.procedure2">LockedResource</a>&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/procedure/MasterProcedureScheduler.html#line.236">getLockResource</a>(<a href="../../../../../../org/apache/hadoop/hbase/procedure2/LockedResourceType.html" title="enum in org.apache.hadoop.hbase.procedure2">LockedResourceType</a>&nbsp;resourceType,
+<pre>public&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/procedure2/LockedResource.html" title="class in org.apache.hadoop.hbase.procedure2">LockedResource</a>&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/procedure/MasterProcedureScheduler.html#line.246">getLockResource</a>(<a href="../../../../../../org/apache/hadoop/hbase/procedure2/LockedResourceType.html" title="enum in org.apache.hadoop.hbase.procedure2">LockedResourceType</a>&nbsp;resourceType,
                                       <a href="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;resourceName)</pre>
 <dl>
 <dt><span class="returnLabel">Returns:</span></dt>
@@ -902,7 +904,7 @@ extends <a href="../../../../../../org/apache/hadoop/hbase/procedure2/AbstractPr
 <ul class="blockList">
 <li class="blockList">
 <h4>clear</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/procedure/MasterProcedureScheduler.html#line.246">clear</a>()</pre>
+<pre>public&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/procedure/MasterProcedureScheduler.html#line.256">clear</a>()</pre>
 <div class="block"><span class="descfrmTypeLabel">Description copied from interface:&nbsp;<code><a href="../../../../../../org/apache/hadoop/hbase/procedure2/ProcedureScheduler.html#clear--">ProcedureScheduler</a></code></span></div>
 <div class="block">Clear current state of scheduler such that it is equivalent to newly created scheduler.
  Used for testing failure and recovery. To emulate server crash/restart,
@@ -915,7 +917,7 @@ extends <a href="../../../../../../org/apache/hadoop/hbase/procedure2/AbstractPr
 <ul class="blockList">
 <li class="blockList">
 <h4>clearQueue</h4>
-<pre>private&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/procedure/MasterProcedureScheduler.html#line.256">clearQueue</a>()</pre>
+<pre>private&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/procedure/MasterProcedureScheduler.html#line.266">clearQueue</a>()</pre>
 </li>
 </ul>
 <a name="clear-org.apache.hadoop.hbase.master.procedure.Queue-org.apache.hadoop.hbase.master.procedure.FairQueue-org.apache.hadoop.hbase.util.AvlUtil.AvlKeyComparator-">
@@ -926,7 +928,7 @@ extends <a href="../../../../../../org/apache/hadoop/hbase/procedure2/AbstractPr
 <ul class="blockList">
 <li class="blockList">
 <h4>clear</h4>
-<pre>private&nbsp;&lt;T extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Comparable.html?is-external=true" title="class or interface in java.lang">Comparable</a>&lt;T&gt;,TNode extends <a href="../../../../../../org/apache/hadoop/hbase/master/procedure/Queue.html" title="class in org.apache.hadoop.hbase.master.procedure">Queue</a>&lt;T&gt;&gt;&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/procedure/MasterProcedureScheduler.html#line.274">clear</a>(TNode&nbsp;treeMap,
+<pre>private&nbsp;&lt;T extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Comparable.html?is-external=true" title="class or interface in java.lang">Comparable</a>&lt;T&gt;,TNode extends <a href="../../../../../../org/apache/hadoop/hbase/master/procedure/Queue.html" title="class in org.apache.hadoop.hbase.master.procedure">Queue</a>&lt;T&gt;&gt;&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/procedure/MasterProcedureScheduler.html#line.284">clear</a>(TNode&nbsp;treeMap,
                                                                     <a href="../../../../../../org/apache/hadoop/hbase/master/procedure/FairQueue.html" title="class in org.apache.hadoop.hbase.master.procedure">FairQueue</a>&lt;T&gt;&nbsp;fairq,
                                                                     <a href="../../../../../../org/apache/hadoop/hbase/util/AvlUtil.AvlKeyComparator.html" title="interface in org.apache.hadoop.hbase.util">AvlUtil.AvlKeyComparator</a>&lt;TNode&gt;&nbsp;comparator)</pre>
 </li>
@@ -937,7 +939,7 @@ extends <a href="../../../../../../org/apache/hadoop/hbase/procedure2/AbstractPr
 <ul class="blockList">
 <li class="blockList">
 <h4>queueSize</h4>
-<pre>private&nbsp;int&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/procedure/MasterProcedureScheduler.html#line.283">queueSize</a>(<a href="../../../../../../org/apache/hadoop/hbase/master/procedure/Queue.html" title="class in org.apache.hadoop.hbase.master.procedure">Queue</a>&lt;?&gt;&nbsp;head)</pre>
+<pre>private&nbsp;int&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/procedure/MasterProcedureScheduler.html#line.295">queueSize</a>(<a href="../../../../../../org/apache/hadoop/hbase/master/procedure/Queue.html" title="class in org.apache.hadoop.hbase.master.procedure">Queue</a>&lt;?&gt;&nbsp;head)</pre>
 </li>
 </ul>
 <a name="queueSize--">
@@ -946,7 +948,7 @@ extends <a href="../../../../../../org/apache/hadoop/hbase/procedure2/AbstractPr
 <ul class="blockList">
 <li class="blockList">
 <h4>queueSize</h4>
-<pre>protected&nbsp;int&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/procedure/MasterProcedureScheduler.html#line.293">queueSize</a>()</pre>
+<pre>protected&nbsp;int&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/procedure/MasterProcedureScheduler.html#line.305">queueSize</a>()</pre>
 <div class="block"><span class="descfrmTypeLabel">Description copied from class:&nbsp;<code><a href="../../../../../../org/apache/hadoop/hbase/procedure2/AbstractProcedureScheduler.html#queueSize--">AbstractProcedureScheduler</a></code></span></div>
 <div class="block">Returns the number of elements in this queue.
  NOTE: this method is called with the sched lock held.</div>
@@ -964,7 +966,7 @@ extends <a href="../../../../../../org/apache/hadoop/hbase/procedure2/AbstractPr
 <ul class="blockList">
 <li class="blockList">
 <h4>completionCleanup</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/procedure/MasterProcedureScheduler.html#line.305">completionCleanup</a>(<a href="../../../../../../org/apache/hadoop/hbase/procedure2/Procedure.html" title="class in org.apache.hadoop.hbase.procedure2">Procedure</a>&nbsp;proc)</pre>
+<pre>public&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/procedure/MasterProcedureScheduler.html#line.317">completionCleanup</a>(<a href="../../../../../../org/apache/hadoop/hbase/procedure2/Procedure.html" title="class in org.apache.hadoop.hbase.procedure2">Procedure</a>&nbsp;proc)</pre>
 <div class="block"><span class="descfrmTypeLabel">Description copied from interface:&nbsp;<code><a href="../../../../../../org/apache/hadoop/hbase/procedure2/ProcedureScheduler.html#completionCleanup-org.apache.hadoop.hbase.procedure2.Procedure-">ProcedureScheduler</a></code></span></div>
 <div class="block">The procedure in execution completed.
  This can be implemented to perform cleanups.</div>
@@ -974,24 +976,26 @@ extends <a href="../../../../../../org/apache/hadoop/hbase/procedure2/AbstractPr
 </dl>
 </li>
 </ul>
-<a name="addToRunQueue-org.apache.hadoop.hbase.master.procedure.FairQueue-org.apache.hadoop.hbase.master.procedure.Queue-">
+<a name="addToRunQueue-org.apache.hadoop.hbase.master.procedure.FairQueue-org.apache.hadoop.hbase.master.procedure.Queue-java.util.function.Supplier-">
 <!--   -->
 </a>
 <ul class="blockList">
 <li class="blockList">
 <h4>addToRunQueue</h4>
-<pre>private static&nbsp;&lt;T extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Comparable.html?is-external=true" title="class or interface in java.lang">Comparable</a>&lt;T&gt;&gt;&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/procedure/MasterProcedureScheduler.html#line.336">addToRunQueue</a>(<a href="../../../../../../org/apache/hadoop/hbase/master/procedure/FairQueue.html" title="class in org.apache.hadoop.hbase.master.procedure">FairQueue</a>&lt;T&gt;&nbsp;fairq,
-                                                            <a href="../../../../../../org/apache/hadoop/hbase/master/procedure/Queue.html" title="class in org.apache.hadoop.hbase.master.procedure">Queue</a>&lt;T&gt;&nbsp;queue)</pre>
+<pre>private static&nbsp;&lt;T extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Comparable.html?is-external=true" title="class or interface in java.lang">Comparable</a>&lt;T&gt;&gt;&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/procedure/MasterProcedureScheduler.html#line.348">addToRunQueue</a>(<a href="../../../../../../org/apache/hadoop/hbase/master/procedure/FairQueue.html" title="class in org.apache.hadoop.hbase.master.procedure">FairQueue</a>&lt;T&gt;&nbsp;fairq,
+                                                            <a href="../../../../../../org/apache/hadoop/hbase/master/procedure/Queue.html" title="class in org.apache.hadoop.hbase.master.procedure">Queue</a>&lt;T&gt;&nbsp;queue,
+                                                            <a href="https://docs.oracle.com/javase/8/docs/api/java/util/function/Supplier.html?is-external=true" title="class or interface in java.util.function">Supplier</a>&lt;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&gt;&nbsp;reason)</pre>
 </li>
 </ul>
-<a name="removeFromRunQueue-org.apache.hadoop.hbase.master.procedure.FairQueue-org.apache.hadoop.hbase.master.procedure.Queue-">
+<a name="removeFromRunQueue-org.apache.hadoop.hbase.master.procedure.FairQueue-org.apache.hadoop.hbase.master.procedure.Queue-java.util.function.Supplier-">
 <!--   -->
 </a>
 <ul class="blockList">
 <li class="blockList">
 <h4>removeFromRunQueue</h4>
-<pre>private static&nbsp;&lt;T extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Comparable.html?is-external=true" title="class or interface in java.lang">Comparable</a>&lt;T&gt;&gt;&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/procedure/MasterProcedureScheduler.html#line.342">removeFromRunQueue</a>(<a href="../../../../../../org/apache/hadoop/hbase/master/procedure/FairQueue.html" title="class in org.apache.hadoop.hbase.master.procedure">FairQueue</a>&lt;T&gt;&nbsp;fairq,
-                                                                 <a href="../../../../../../org/apache/hadoop/hbase/master/procedure/Queue.html" title="class in org.apache.hadoop.hbase.master.procedure">Queue</a>&lt;T&gt;&nbsp;queue)</pre>
+<pre>private static&nbsp;&lt;T extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Comparable.html?is-external=true" title="class or interface in java.lang">Comparable</a>&lt;T&gt;&gt;&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/procedure/MasterProcedureScheduler.html#line.358">removeFromRunQueue</a>(<a href="../../../../../../org/apache/hadoop/hbase/master/procedure/FairQueue.html" title="class in org.apache.hadoop.hbase.master.procedure">FairQueue</a>&lt;T&gt;&nbsp;fairq,
+                                                                 <a href="../../../../../../org/apache/hadoop/hbase/master/procedure/Queue.html" title="class in org.apache.hadoop.hbase.master.procedure">Queue</a>&lt;T&gt;&nbsp;queue,
+                                                                 <a href="https://docs.oracle.com/javase/8/docs/api/java/util/function/Supplier.html?is-external=true" title="class or interface in java.util.function">Supplier</a>&lt;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&gt;&nbsp;reason)</pre>
 </li>
 </ul>
 <a name="getTableQueue-org.apache.hadoop.hbase.TableName-">
@@ -1000,7 +1004,7 @@ extends <a href="../../../../../../org/apache/hadoop/hbase/procedure2/AbstractPr
 <ul class="blockList">
 <li class="blockList">
 <h4>getTableQueue</h4>
-<pre>private&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/master/procedure/TableQueue.html" title="class in org.apache.hadoop.hbase.master.procedure">TableQueue</a>&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/procedure/MasterProcedureScheduler.html#line.352">getTableQueue</a>(<a href="../../../../../../org/apache/hadoop/hbase/TableName.html" title="class in org.apache.hadoop.hbase">TableName</a>&nbsp;tableName)</pre>
+<pre>private&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/master/procedure/TableQueue.html" title="class in org.apache.hadoop.hbase.master.procedure">TableQueue</a>&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/procedure/MasterProcedureScheduler.html#line.371">getTableQueue</a>(<a href="../../../../../../org/apache/hadoop/hbase/TableName.html" title="class in org.apache.hadoop.hbase">TableName</a>&nbsp;tableName)</pre>
 </li>
 </ul>
 <a name="removeTableQueue-org.apache.hadoop.hbase.TableName-">
@@ -1009,7 +1013,7 @@ extends <a href="../../../../../../org/apache/hadoop/hbase/procedure2/AbstractPr
 <ul class="blockList">
 <li class="blockList">
 <h4>removeTableQueue</h4>
-<pre>private&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/procedure/MasterProcedureScheduler.html#line.362">removeTableQueue</a>(<a href="../../../../../../org/apache/hadoop/hbase/TableName.html" title="class in org.apache.hadoop.hbase">TableName</a>&nbsp;tableName)</pre>
+<pre>private&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/procedure/MasterProcedureScheduler.html#line.381">removeTableQueue</a>(<a href="../../../../../../org/apache/hadoop/hbase/TableName.html" title="class in org.apache.hadoop.hbase">TableName</a>&nbsp;tableName)</pre>
 </li>
 </ul>
 <a name="isTableProcedure-org.apache.hadoop.hbase.procedure2.Procedure-">
@@ -1018,7 +1022,7 @@ extends <a href="../../../../../../org/apache/hadoop/hbase/procedure2/AbstractPr
 <ul class="blockList">
 <li class="blockList">
 <h4>isTableProcedure</h4>
-<pre>private static&nbsp;boolean&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/procedure/MasterProcedureScheduler.html#line.367">isTableProcedure</a>(<a href="../../../../../../org/apache/hadoop/hbase/procedure2/Procedure.html" title="class in org.apache.hadoop.hbase.procedure2">Procedure</a>&lt;?&gt;&nbsp;proc)</pre>
+<pre>private static&nbsp;boolean&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/procedure/MasterProcedureScheduler.html#line.386">isTableProcedure</a>(<a href="../../../../../../org/apache/hadoop/hbase/procedure2/Procedure.html" title="class in org.apache.hadoop.hbase.procedure2">Procedure</a>&lt;?&gt;&nbsp;proc)</pre>
 </li>
 </ul>
 <a name="getTableName-org.apache.hadoop.hbase.procedure2.Procedure-">
@@ -1027,7 +1031,7 @@ extends <a href="../../../../../../org/apache/hadoop/hbase/procedure2/AbstractPr
 <ul class="blockList">
 <li class="blockList">
 <h4>getTableName</h4>
-<pre>private static&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/TableName.html" title="class in org.apache.hadoop.hbase">TableName</a>&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/procedure/MasterProcedureScheduler.html#line.371">getTableName</a>(<a href="../../../../../../org/apache/hadoop/hbase/procedure2/Procedure.html" title="class in org.apache.hadoop.hbase.procedure2">Procedure</a>&lt;?&gt;&nbsp;proc)</pre>
+<pre>private static&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/TableName.html" title="class in org.apache.hadoop.hbase">TableName</a>&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/procedure/MasterProcedureScheduler.html#line.390">getTableName</a>(<a href="../../../../../../org/apache/hadoop/hbase/procedure2/Procedure.html" title="class in org.apache.hadoop.hbase.procedure2">Procedure</a>&lt;?&gt;&nbsp;proc)</pre>
 </li>
 </ul>
 <a name="getServerQueue-org.apache.hadoop.hbase.ServerName-org.apache.hadoop.hbase.master.procedure.ServerProcedureInterface-">
@@ -1036,7 +1040,7 @@ extends <a href="../../../../../../org/apache/hadoop/hbase/procedure2/AbstractPr
 <ul class="blockList">
 <li class="blockList">
 <h4>getServerQueue</h4>
-<pre>private&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/master/procedure/ServerQueue.html" title="class in org.apache.hadoop.hbase.master.procedure">ServerQueue</a>&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/procedure/MasterProcedureScheduler.html#line.378">getServerQueue</a>(<a href="../../../../../../org/apache/hadoop/hbase/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a>&nbsp;serverName,
+<pre>private&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/master/procedure/ServerQueue.html" title="class in org.apache.hadoop.hbase.master.procedure">ServerQueue</a>&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/procedure/MasterProcedureScheduler.html#line.397">getServerQueue</a>(<a href="../../../../../../org/apache/hadoop/hbase/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a>&nbsp;serverName,
                                    <a href="../../../../../../org/apache/hadoop/hbase/master/procedure/ServerProcedureInterface.html" title="interface in org.apache.hadoop.hbase.master.procedure">ServerProcedureInterface</a>&nbsp;proc)</pre>
 </li>
 </ul>
@@ -1046,7 +1050,7 @@ extends <a href="../../../../../../org/apache/hadoop/hbase/procedure2/AbstractPr
 <ul class="blockList">
 <li class="blockList">
 <h4>removeServerQueue</h4>
-<pre>private&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/procedure/MasterProcedureScheduler.html#line.395">removeServerQueue</a>(<a href="../../../../../../org/apache/hadoop/hbase/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a>&nbsp;serverName)</pre>
+<pre>private&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/procedure/MasterProcedureScheduler.html#line.414">removeServerQueue</a>(<a href="../../../../../../org/apache/hadoop/hbase/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a>&nbsp;serverName)</pre>
 </li>
 </ul>
 <a name="tryCleanupServerQueue-org.apache.hadoop.hbase.ServerName-org.apache.hadoop.hbase.procedure2.Procedure-">
@@ -1055,7 +1059,7 @@ extends <a href="../../../../../../org/apache/hadoop/hbase/procedure2/AbstractPr
 <ul class="blockList">
 <li class="blockList">
 <h4>tryCleanupServerQueue</h4>
-<pre>private&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/procedure/MasterProcedureScheduler.html#line.402">tryCleanupServerQueue</a>(<a href="../../../../../../org/apache/hadoop/hbase/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a>&nbsp;serverName,
+<pre>private&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/procedure/MasterProcedureScheduler.html#line.421">tryCleanupServerQueue</a>(<a href="../../../../../../org/apache/hadoop/hbase/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a>&nbsp;serverName,
                                    <a href="../../../../../../org/apache/hadoop/hbase/procedure2/Procedure.html" title="class in org.apache.hadoop.hbase.procedure2">Procedure</a>&lt;?&gt;&nbsp;proc)</pre>
 </li>
 </ul>
@@ -1065,7 +1069,7 @@ extends <a href="../../../../../../org/apache/hadoop/hbase/procedure2/AbstractPr
 <ul class="blockList">
 <li class="blockList">
 <h4>getBucketIndex</h4>
-<pre>private static&nbsp;int&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/procedure/MasterProcedureScheduler.html#line.421">getBucketIndex</a>(<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html?is-external=true" title="class or interface in java.lang">Object</a>[]&nbsp;buckets,
+<pre>private static&nbsp;int&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/procedure/MasterProcedureScheduler.html#line.441">getBucketIndex</a>(<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html?is-external=true" title="class or interface in java.lang">Object</a>[]&nbsp;buckets,
                                   int&nbsp;hashCode)</pre>
 </li>
 </ul>
@@ -1075,7 +1079,7 @@ extends <a href="../../../../../../org/apache/hadoop/hbase/procedure2/AbstractPr
 <ul class="blockList">
 <li class="blockList">
 <h4>isServerProcedure</h4>
-<pre>private static&nbsp;boolean&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/procedure/MasterProcedureScheduler.html#line.425">isServerProcedure</a>(<a href="../../../../../../org/apache/hadoop/hbase/procedure2/Procedure.html" title="class in org.apache.hadoop.hbase.procedure2">Procedure</a>&lt;?&gt;&nbsp;proc)</pre>
+<pre>private static&nbsp;boolean&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/procedure/MasterProcedureScheduler.html#line.445">isServerProcedure</a>(<a href="../../../../../../org/apache/hadoop/hbase/procedure2/Procedure.html" title="class in org.apache.hadoop.hbase.procedure2">Procedure</a>&lt;?&gt;&nbsp;proc)</pre>
 </li>
 </ul>
 <a name="getServerName-org.apache.hadoop.hbase.procedure2.Procedure-">
@@ -1084,7 +1088,7 @@ extends <a href="../../../../../../org/apache/hadoop/hbase/procedure2/AbstractPr
 <ul class="blockList">
 <li class="blockList">
 <h4>getServerName</h4>
-<pre>private static&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a>&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/procedure/MasterProcedureScheduler.html#line.429">getServerName</a>(<a href="../../../../../../org/apache/hadoop/hbase/procedure2/Procedure.html" title="class in org.apache.hadoop.hbase.procedure2">Procedure</a>&lt;?&gt;&nbsp;proc)</pre>
+<pre>private static&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a>&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/procedure/MasterProcedureScheduler.html#line.449">getServerName</a>(<a href="../../../../../../org/apache/hadoop/hbase/procedure2/Procedure.html" title="class in org.apache.hadoop.hbase.procedure2">Procedure</a>&lt;?&gt;&nbsp;proc)</pre>
 </li>
 </ul>
 <a name="getPeerQueue-java.lang.String-">
@@ -1093,7 +1097,7 @@ extends <a href="../../../../../../org/apache/hadoop/hbase/procedure2/AbstractPr
 <ul class="blockList">
 <li class="blockList">
 <h4>getPeerQueue</h4>
-<pre>private&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/master/procedure/PeerQueue.html" title="class in org.apache.hadoop.hbase.master.procedure">PeerQueue</a>&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/procedure/MasterProcedureScheduler.html#line.436">getPeerQueue</a>(<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;peerId)</pre>
+<pre>private&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/master/procedure/PeerQueue.html" title="class in org.apache.hadoop.hbase.master.procedure">PeerQueue</a>&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/procedure/MasterProcedureScheduler.html#line.456">getPeerQueue</a>(<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;peerId)</pre>
 </li>
 </ul>
 <a name="removePeerQueue-java.lang.String-">
@@ -1102,7 +1106,7 @@ extends <a href="../../../../../../org/apache/hadoop/hbase/procedure2/AbstractPr
 <ul class="blockList">
 <li class="blockList">
 <h4>removePeerQueue</h4>
-<pre>private&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/procedure/MasterProcedureScheduler.html#line.446">removePeerQueue</a>(<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;peerId)</pre>
+<pre>private&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/procedure/MasterProcedureScheduler.html#line.466">removePeerQueue</a>(<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;peerId)</pre>
 </li>
 </ul>
 <a name="tryCleanupPeerQueue-java.lang.String-org.apache.hadoop.hbase.procedure2.Procedure-">
@@ -1111,7 +1115,7 @@ extends <a href="../../../../../../org/apache/hadoop/hbase/procedure2/AbstractPr
 <ul class="blockList">
 <li class="blockList">
 <h4>tryCleanupPeerQueue</h4>
-<pre>private&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/procedure/MasterProcedureScheduler.html#line.451">tryCleanupPeerQueue</a>(<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;peerId,
+<pre>private&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/procedure/MasterProcedureScheduler.html#line.471">tryCleanupPeerQueue</a>(<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;peerId,
                                  <a href="../../../../../../org/apache/hadoop/hbase/procedure2/Procedure.html" title="class in org.apache.hadoop.hbase.procedure2">Procedure</a>&lt;?&gt;&nbsp;procedure)</pre>
 </li>
 </ul>
@@ -1121,7 +1125,7 @@ extends <a href="../../../../../../org/apache/hadoop/hbase/procedure2/AbstractPr
 <ul class="blockList">
 <li class="blockList">
 <h4>isPeerProcedure</h4>
-<pre>private static&nbsp;boolean&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/procedure/MasterProcedureScheduler.html#line.469">isPeerProcedure</a>(<a href="../../../../../../org/apache/hadoop/hbase/procedure2/Procedure.html" title="class in org.apache.hadoop.hbase.procedure2">Procedure</a>&lt;?&gt;&nbsp;proc)</pre>
+<pre>private static&nbsp;boolean&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/procedure/MasterProcedureScheduler.html#line.490">isPeerProcedure</a>(<a href="../../../../../../org/apache/hadoop/hbase/procedure2/Procedure.html" title="class in org.apache.hadoop.hbase.procedure2">Procedure</a>&lt;?&gt;&nbsp;proc)</pre>
 </li>
 </ul>
 <a name="getPeerId-org.apache.hadoop.hbase.procedure2.Procedure-">
@@ -1130,7 +1134,7 @@ extends <a href="../../../../../../org/apache/hadoop/hbase/procedure2/AbstractPr
 <ul class="blockList">
 <li class="blockList">
 <h4>getPeerId</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>&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/procedure/MasterProcedureScheduler.html#line.473">getPeerId</a>(<a href="../../../../../../org/apache/hadoop/hbase/procedure2/Procedure.html" title="class in org.apache.hadoop.hbase.procedure2">Procedure</a>&lt;?&gt;&nbsp;proc)</pre>
+<pre>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>&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/procedure/MasterProcedureScheduler.html#line.494">getPeerId</a>(<a href="../../../../../../org/apache/hadoop/hbase/procedure2/Procedure.html" title="class in org.apache.hadoop.hbase.procedure2">Procedure</a>&lt;?&gt;&nbsp;proc)</pre>
 </li>
 </ul>
 <a name="getMetaQueue--">
@@ -1139,7 +1143,7 @@ extends <a href="../../../../../../org/apache/hadoop/hbase/procedure2/AbstractPr
 <ul class="blockList">
 <li class="blockList">
 <h4>getMetaQueue</h4>
-<pre>private&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/master/procedure/MetaQueue.html" title="class in org.apache.hadoop.hbase.master.procedure">MetaQueue</a>&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/procedure/MasterProcedureScheduler.html#line.480">getMetaQueue</a>()</pre>
+<pre>private&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/master/procedure/MetaQueue.html" title="class in org.apache.hadoop.hbase.master.procedure">MetaQueue</a>&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/procedure/MasterProcedureScheduler.html#line.501">getMetaQueue</a>()</pre>
 </li>
 </ul>
 <a name="isMetaProcedure-org.apache.hadoop.hbase.procedure2.Procedure-">
@@ -1148,7 +1152,7 @@ extends <a href="../../../../../../org/apache/hadoop/hbase/procedure2/AbstractPr
 <ul class="blockList">
 <li class="blockList">
 <h4>isMetaProcedure</h4>
-<pre>private static&nbsp;boolean&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/procedure/MasterProcedureScheduler.html#line.490">isMetaProcedure</a>(<a href="../../../../../../org/apache/hadoop/hbase/procedure2/Procedure.html" title="class in org.apache.hadoop.hbase.procedure2">Procedure</a>&lt;?&gt;&nbsp;proc)</pre>
+<pre>private static&nbsp;boolean&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/procedure/MasterProcedureScheduler.html#line.511">isMetaProcedure</a>(<a href="../../../../../../org/apache/hadoop/hbase/procedure2/Procedure.html" title="class in org.apache.hadoop.hbase.procedure2">Procedure</a>&lt;?&gt;&nbsp;proc)</pre>
 </li>
 </ul>
 <a name="logLockedResource-org.apache.hadoop.hbase.procedure2.LockedResourceType-java.lang.String-">
@@ -1157,7 +1161,7 @@ extends <a href="../../../../../../org/apache/hadoop/hbase/procedure2/AbstractPr
 <ul class="blockList">
 <li class="blockList">
 <h4>logLockedResource</h4>
-<pre>private&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/procedure/MasterProcedureScheduler.html#line.499">logLockedResource</a>(<a href="../../../../../../org/apache/hadoop/hbase/procedure2/LockedResourceType.html" title="enum in org.apache.hadoop.hbase.procedure2">LockedResourceType</a>&nbsp;resourceType,
+<pre>private&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/procedure/MasterProcedureScheduler.html#line.520">logLockedResource</a>(<a href="../../../../../../org/apache/hadoop/hbase/procedure2/LockedResourceType.html" title="enum in org.apache.hadoop.hbase.procedure2">LockedResourceType</a>&nbsp;resourceType,
                                <a href="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;resourceName)</pre>
 <div class="block">Get lock info for a resource of specified type and name and log details</div>
 </li>
@@ -1168,7 +1172,7 @@ extends <a href="../../../../../../org/apache/hadoop/hbase/procedure2/AbstractPr
 <ul class="blockList">
 <li class="blockList">
 <h4>waitTableExclusiveLock</h4>
-<pre>public&nbsp;boolean&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/procedure/MasterProcedureScheduler.html#line.524">waitTableExclusiveLock</a>(<a href="../../../../../../org/apache/hadoop/hbase/procedure2/Procedure.html" title="class in org.apache.hadoop.hbase.procedure2">Procedure</a>&lt;?&gt;&nbsp;procedure,
+<pre>public&nbsp;boolean&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/procedure/MasterProcedureScheduler.html#line.545">waitTableExclusiveLock</a>(<a href="../../../../../../org/apache/hadoop/hbase/procedure2/Procedure.html" title="class in org.apache.hadoop.hbase.procedure2">Procedure</a>&lt;?&gt;&nbsp;procedure,
                                       <a href="../../../../../../org/apache/hadoop/hbase/TableName.html" title="class in org.apache.hadoop.hbase">TableName</a>&nbsp;table)</pre>
 <div class="block">Suspend the procedure if the specified table is already locked.
  Other operations in the table-queue will be executed after the lock is released.</div>
@@ -1187,7 +1191,7 @@ extends <a href="../../../../../../org/apache/hadoop/hbase/procedure2/AbstractPr
 <ul class="blockList">
 <li class="blockList">
 <h4>wakeTableExclusiveLock</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/procedure/MasterProcedureScheduler.html#line.553">wakeTableExclusiveLock</a>(<a href="../../../../../../org/apache/hadoop/hbase/procedure2/Procedure.html" title="class in org.apache.hadoop.hbase.procedure2">Procedure</a>&lt;?&gt;&nbsp;procedure,
+<pre>public&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/procedure/MasterProcedureScheduler.html#line.575">wakeTableExclusiveLock</a>(<a href="../../../../../../org/apache/hadoop/hbase/procedure2/Procedure.html" title="class in org.apache.hadoop.hbase.procedure2">Procedure</a>&lt;?&gt;&nbsp;procedure,
                                    <a href="../../../../../../org/apache/hadoop/hbase/TableName.html" title="class in org.apache.hadoop.hbase">TableName</a>&nbsp;table)</pre>
 <div class="block">Wake the procedures waiting for the specified table</div>
 <dl>
@@ -1203,7 +1207,7 @@ extends <a href="../../../../../../org/apache/hadoop/hbase/procedure2/AbstractPr
 <ul class="blockList">
 <li class="blockList">
 <h4>waitTableSharedLock</h4>
-<pre>public&nbsp;boolean&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/procedure/MasterProcedureScheduler.html#line.579">waitTableSharedLock</a>(<a href="../../../../../../org/apache/hadoop/hbase/procedure2/Procedure.html" title="class in org.apache.hadoop.hbase.procedure2">Procedure</a>&lt;?&gt;&nbsp;procedure,
+<pre>public&nbsp;boolean&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/procedure/MasterProcedureScheduler.html#line.602">waitTableSharedLock</a>(<a href="../../../../../../org/apache/hadoop/hbase/procedure2/Procedure.html" title="class in org.apache.hadoop.hbase.procedure2">Procedure</a>&lt;?&gt;&nbsp;procedure,
                                    <a href="../../../../../../org/apache/hadoop/hbase/TableName.html" title="class in org.apache.hadoop.hbase">TableName</a>&nbsp;table)</pre>
 <div class="block">Suspend the procedure if the specified table is already locked.
  other "read" operations in the table-queue may be executed concurrently,</div>
@@ -1222,7 +1226,7 @@ extends <a href="../../../../../../org/apache/hadoop/hbase/procedure2/AbstractPr
 <ul class="blockList">
 <li class="blockList">
 <h4>waitTableQueueSharedLock</h4>
-<pre>private&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/master/procedure/TableQueue.html" title="class in org.apache.hadoop.hbase.master.procedure">TableQueue</a>&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/procedure/MasterProcedureScheduler.html#line.583">waitTableQueueSharedLock</a>(<a href="../../../../../../org/apache/hadoop/hbase/procedure2/Procedure.html" title="class in org.apache.hadoop.hbase.procedure2">Procedure</a>&lt;?&gt;&nbsp;procedure,
+<pre>private&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/master/procedure/TableQueue.html" title="class in org.apache.hadoop.hbase.master.procedure">TableQueue</a>&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/procedure/MasterProcedureScheduler.html#line.606">waitTableQueueSharedLock</a>(<a href="../../../../../../org/apache/hadoop/hbase/procedure2/Procedure.html" title="class in org.apache.hadoop.hbase.procedure2">Procedure</a>&lt;?&gt;&nbsp;procedure,
                                             <a href="../../../../../../org/apache/hadoop/hbase/TableName.html" title="class in org.apache.hadoop.hbase">TableName</a>&nbsp;table)</pre>
 </li>
 </ul>
@@ -1232,7 +1236,7 @@ extends <a href="../../../../../../org/apache/hadoop/hbase/procedure2/AbstractPr
 <ul class="blockList">
 <li class="blockList">
 <h4>wakeTableSharedLock</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/procedure/MasterProcedureScheduler.html#line.610">wakeTableSharedLock</a>(<a href="../../../../../../org/apache/hadoop/hbase/procedure2/Procedure.html" title="class in org.apache.hadoop.hbase.procedure2">Procedure</a>&lt;?&gt;&nbsp;procedure,
+<pre>public&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/procedure/MasterProcedureScheduler.html#line.633">wakeTableSharedLock</a>(<a href="../../../../../../org/apache/hadoop/hbase/procedure2/Procedure.html" title="class in org.apache.hadoop.hbase.procedure2">Procedure</a>&lt;?&gt;&nbsp;procedure,
                                 <a href="../../../../../../org/apache/hadoop/hbase/TableName.html" title="class in org.apache.hadoop.hbase">TableName</a>&nbsp;table)</pre>
 <div class="block">Wake the procedures waiting for the specified table</div>
 <dl>
@@ -1248,7 +1252,7 @@ extends <a href="../../../../../../org/apache/hadoop/hbase/procedure2/AbstractPr
 <ul class="blockList">
 <li class="blockList">
 <h4>markTableAsDeleted</h4>
-<pre>boolean&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/procedure/MasterProcedureScheduler.html#line.639">markTableAsDeleted</a>(<a href="../../../../../../org/apache/hadoop/hbase/TableName.html" title="class in org.apache.hadoop.hbase">TableName</a>&nbsp;table,
+<pre>boolean&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/procedure/MasterProcedureScheduler.html#line.663">markTableAsDeleted</a>(<a href="../../../../../../org/apache/hadoop/hbase/TableName.html" title="class in org.apache.hadoop.hbase">TableName</a>&nbsp;table,
                            <a href="../../../../../../org/apache/hadoop/hbase/procedure2/Procedure.html" title="class in org.apache.hadoop.hbase.procedure2">Procedure</a>&lt;?&gt;&nbsp;procedure)</pre>
 <div class="block">Tries to remove the queue and the table-lock of the specified table.
  If there are new operations pending (e.g. a new create),
@@ -1269,7 +1273,7 @@ extends <a href="../../../../../../org/apache/hadoop/hbase/procedure2/AbstractPr
 <ul class="blockList">
 <li class="blockList">
 <h4>waitRegion</h4>
-<pre>public&nbsp;boolean&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/procedure/MasterProcedureScheduler.html#line.671">waitRegion</a>(<a href="../../../../../../org/apache/hadoop/hbase/procedure2/Procedure.html" title="class in org.apache.hadoop.hbase.procedure2">Procedure</a>&lt;?&gt;&nbsp;procedure,
+<pre>public&nbsp;boolean&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/procedure/MasterProcedureScheduler.html#line.695">waitRegion</a>(<a href="../../../../../../org/apache/hadoop/hbase/procedure2/Procedure.html" title="class in org.apache.hadoop.hbase.procedure2">Procedure</a>&lt;?&gt;&nbsp;procedure,
                           <a href="../../../../../../org/apache/hadoop/hbase/client/RegionInfo.html" title="interface in org.apache.hadoop.hbase.client">RegionInfo</a>&nbsp;regionInfo)</pre>
 <div class="block">Suspend the procedure if the specified region is already locked.</div>
 <dl>
@@ -1287,7 +1291,7 @@ extends <a href="../../../../../../org/apache/hadoop/hbase/procedure2/AbstractPr
 <ul class="blockList">
 <li class="blockList">
 <h4>waitRegions</h4>
-<pre>public&nbsp;boolean&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/procedure/MasterProcedureScheduler.html#line.682">waitRegions</a>(<a href="../../../../../../org/apache/hadoop/hbase/procedure2/Procedure.html" title="class in org.apache.hadoop.hbase.procedure2">Procedure</a>&lt;?&gt;&nbsp;procedure,
+<pre>public&nbsp;boolean&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/procedure/MasterProcedureScheduler.html#line.706">waitRegions</a>(<a href="../../../../../../org/apache/hadoop/hbase/procedure2/Procedure.html" title="class in org.apache.hadoop.hbase.procedure2">Procedure</a>&lt;?&gt;&nbsp;procedure,
                            <a href="../../../../../../org/apache/hadoop/hbase/TableName.html" title="class in org.apache.hadoop.hbase">TableName</a>&nbsp;table,
                            <a href="../../../../../../org/apache/hadoop/hbase/client/RegionInfo.html" title="interface in org.apache.hadoop.hbase.client">RegionInfo</a>...&nbsp;regionInfo)</pre>
 <div class="block">Suspend the procedure if the specified set of regions are already locked.</div>
@@ -1307,7 +1311,7 @@ extends <a href="../../../../../../org/apache/hadoop/hbase/procedure2/AbstractPr
 <ul class="blockList">
 <li class="blockList">
 <h4>wakeRegion</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/procedure/MasterProcedureScheduler.html#line.730">wakeRegion</a>(<a href="../../../../../../org/apache/hadoop/hbase/procedure2/Procedure.html" title="class in org.apache.hadoop.hbase.procedure2">Procedure</a>&lt;?&gt;&nbsp;procedure,
+<pre>public&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/procedure/MasterProcedureScheduler.html#line.754">wakeRegion</a>(<a href="../../../../../../org/apache/hadoop/hbase/procedure2/Procedure.html" title="class in org.apache.hadoop.hbase.procedure2">Procedure</a>&lt;?&gt;&nbsp;procedure,
                        <a href="../../../../../../org/apache/hadoop/hbase/client/RegionInfo.html" title="interface in org.apache.hadoop.hbase.client">RegionInfo</a>&nbsp;regionInfo)</pre>
 <div class="block">Wake the procedures waiting for the specified region</div>
 <dl>
@@ -1323,7 +1327,7 @@ extends <a href="../../../../../../org/apache/hadoop/hbase/procedure2/AbstractPr
 <ul class="blockList">
 <li class="blockList">
 <h4>wakeRegions</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/procedure/MasterProcedureScheduler.html#line.739">wakeRegions</a>(<a href="../../../../../../org/apache/hadoop/hbase/procedure2/Procedure.html" title="class in org.apache.hadoop.hbase.procedure2">Procedure</a>&lt;?&gt;&nbsp;procedure,
+<pre>public&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/procedure/MasterProcedureScheduler.html#line.763">wakeRegions</a>(<a href="../../../../../../org/apache/hadoop/hbase/procedure2/Procedure.html" title="class in org.apache.hadoop.hbase.procedure2">Procedure</a>&lt;?&gt;&nbsp;procedure,
                         <a href="../../../../../../org/apache/hadoop/hbase/TableName.html" title="class in org.apache.hadoop.hbase">TableName</a>&nbsp;table,
                         <a href="../../../../../../org/apache/hadoop/hbase/client/RegionInfo.html" title="interface in org.apache.hadoop.hbase.client">RegionInfo</a>...&nbsp;regionInfo)</pre>
 <div class="block">Wake the procedures waiting for the specified regions</div>
@@ -1340,7 +1344,7 @@ extends <a href="../../../../../../org/apache/hadoop/hbase/procedure2/AbstractPr
 <ul class="blockList">
 <li class="blockList">
 <h4>waitNamespaceExclusiveLock</h4>
-<pre>public&nbsp;boolean&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/procedure/MasterProcedureScheduler.html#line.783">waitNamespaceExclusiveLock</a>(<a href="../../../../../../org/apache/hadoop/hbase/procedure2/Procedure.html" title="class in org.apache.hadoop.hbase.procedure2">Procedure</a>&lt;?&gt;&nbsp;procedure,
+<pre>public&nbsp;boolean&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/procedure/MasterProcedureScheduler.html#line.807">waitNamespaceExclusiveLock</a>(<a href="../../../../../../org/apache/hadoop/hbase/procedure2/Procedure.html" title="class in org.apache.hadoop.hbase.procedure2">Procedure</a>&lt;?&gt;&nbsp;procedure,
                                           <a href="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;namespace)</pre>
 <div class="block">Suspend the procedure if the specified namespace is already locked.</div>
 <dl>
@@ -1360,7 +1364,7 @@ extends <a href="../../../../../../org/apache/hadoop/hbase/procedure2/AbstractPr
 <ul class="blockList">
 <li class="blockList">
 <h4>wakeNamespaceExclusiveLock</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/procedure/MasterProcedureScheduler.html#line.814">wakeNamespaceExclusiveLock</a>(<a href="../../../../../../org/apache/hadoop/hbase/procedure2/Procedure.html" title="class in org.apache.hadoop.hbase.procedure2">Procedure</a>&lt;?&gt;&nbsp;procedure,
+<pre>public&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/procedure/MasterProcedureScheduler.html#line.838">wakeNamespaceExclusiveLock</a>(<a href="../../../../../../org/apache/hadoop/hbase/procedure2/Procedure.html" title="class in org.apache.hadoop.hbase.procedure2">Procedure</a>&lt;?&gt;&nbsp;procedure,
                                        <a href="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;namespace)</pre>
 <div class="block">Wake the procedures waiting for the specified namespace</div>
 <dl>
@@ -1378,7 +1382,7 @@ extends <a href="../../../../../../org/apache/hadoop/hbase/procedure2/AbstractPr
 <ul class="blockList">
 <li class="blockList">
 <h4>waitServerExclusiveLock</h4>
-<pre>public&nbsp;boolean&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/procedure/MasterProcedureScheduler.html#line.844">waitServerExclusiveLock</a>(<a href="../../../../../../org/apache/hadoop/hbase/procedure2/Procedure.html" title="class in org.apache.hadoop.hbase.procedure2">Procedure</a>&lt;?&gt;&nbsp;procedure,
+<pre>public&nbsp;boolean&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/procedure/MasterProcedureScheduler.html#line.869">waitServerExclusiveLock</a>(<a href="../../../../../../org/apache/hadoop/hbase/procedure2/Procedure.html" title="class in org.apache.hadoop.hbase.procedure2">Procedure</a>&lt;?&gt;&nbsp;procedure,
                                        <a href="../../../../../../org/apache/hadoop/hbase/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a>&nbsp;serverName)</pre>
 <div class="block">Try to acquire the exclusive lock on the specified server.</div>
 <dl>
@@ -1398,7 +1402,7 @@ extends <a href="../../../../../../org/apache/hadoop/hbase/procedure2/AbstractPr
 <ul class="blockList">
 <li class="blockList">
 <h4>wakeServerExclusiveLock</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/procedure/MasterProcedureScheduler.html#line.872">wakeServerExclusiveLock</a>(<a href="../../../../../../org/apache/hadoop/hbase/procedure2/Procedure.html" title="class in org.apache.hadoop.hbase.procedure2">Procedure</a>&lt;?&gt;&nbsp;procedure,
+<pre>public&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/procedure/MasterProcedureScheduler.html#line.898">wakeServerExclusiveLock</a>(<a href="../../../../../../org/apache/hadoop/hbase/procedure2/Procedure.html" title="class in org.apache.hadoop.hbase.procedure2">Procedure</a>&lt;?&gt;&nbsp;procedure,
                                     <a href="../../../../../../org/apache/hadoop/hbase/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a>&nbsp;serverName)</pre>
 <div class="block">Wake the procedures waiting for the specified server</div>
 <dl>
@@ -1416,7 +1420,7 @@ extends <a href="../../../../../../org/apache/hadoop/hbase/procedure2/AbstractPr
 <ul class="blockList">
 <li class="blockList">
 <h4>waitPeerExclusiveLock</h4>
-<pre>public&nbsp;boolean&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/procedure/MasterProcedureScheduler.html#line.901">waitPeerExclusiveLock</a>(<a href="../../../../../../org/apache/hadoop/hbase/procedure2/Procedure.html" title="class in org.apache.hadoop.hbase.procedure2">Procedure</a>&lt;?&gt;&nbsp;procedure,
+<pre>public&nbsp;boolean&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/procedure/MasterProcedureScheduler.html#line.927">waitPeerExclusiveLock</a>(<a href="../../../../../../org/apache/hadoop/hbase/procedure2/Procedure.html" title="class in org.apache.hadoop.hbase.procedure2">Procedure</a>&lt;?&gt;&nbsp;procedure,
                                      <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;peerId)</pre>
 <div class="block">Try to acquire the exclusive lock on the specified peer.</div>
 <dl>
@@ -1436,7 +1440,7 @@ extends <a href="../../../../../../org/apache/hadoop/hbase/procedure2/AbstractPr
 <ul class="blockList">
 <li class="blockList">
 <h4>wakePeerExclusiveLock</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/procedure/MasterProcedureScheduler.html#line.923">wakePeerExclusiveLock</a>(<a href="../../../../../../org/apache/hadoop/hbase/procedure2/Procedure.html" title="class in org.apache.hadoop.hbase.procedure2">Procedure</a>&lt;?&gt;&nbsp;procedure,
+<pre>public&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/procedure/MasterProcedureScheduler.html#line.950">wakePeerExclusiveLock</a>(<a href="../../../../../../org/apache/hadoop/hbase/procedure2/Procedure.html" title="class in org.apache.hadoop.hbase.procedure2">Procedure</a>&lt;?&gt;&nbsp;procedure,
                                   <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;peerId)</pre>
 <div class="block">Wake the procedures waiting for the specified peer</div>
 <dl>
@@ -1455,7 +1459,7 @@ extends <a href="../../../../../../org/apache/hadoop/hbase/procedure2/AbstractPr
 <li class="blockList">
 <h4>waitMetaExclusiveLock</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;boolean&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/procedure/MasterProcedureScheduler.html#line.949">waitMetaExclusiveLock</a>(<a href="../../../../../../org/apache/hadoop/hbase/procedure2/Procedure.html" title="class in org.apache.hadoop.hbase.procedure2">Procedure</a>&lt;?&gt;&nbsp;procedure)</pre>
+public&nbsp;boolean&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/procedure/MasterProcedureScheduler.html#line.977">waitMetaExclusiveLock</a>(<a href="../../../../../../org/apache/hadoop/hbase/procedure2/Procedure.html" title="class in org.apache.hadoop.hbase.procedure2">Procedure</a>&lt;?&gt;&nbsp;procedure)</pre>
 <div class="block"><span class="deprecatedLabel">Deprecated.</span>&nbsp;<span class="deprecationComment">only used for <a href="../../../../../../org/apache/hadoop/hbase/master/procedure/RecoverMetaProcedure.html" title="class in org.apache.hadoop.hbase.master.procedure"><code>RecoverMetaProcedure</code></a>. Should be removed along with
              <a href="../../../../../../org/apache/hadoop/hbase/master/procedure/RecoverMetaProcedure.html" title="class in org.apache.hadoop.hbase.master.procedure"><code>RecoverMetaProcedure</code></a>.</span></div>
 <div class="block">Try to acquire the exclusive lock on meta.</div>
@@ -1476,7 +1480,7 @@ public&nbsp;boolean&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/h
 <li class="blockList">
 <h4>wakeMetaExclusiveLock</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;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/procedure/MasterProcedureScheduler.html#line.973">wakeMetaExclusiveLock</a>(<a href="../../../../../../org/apache/hadoop/hbase/procedure2/Procedure.html" title="class in org.apache.hadoop.hbase.procedure2">Procedure</a>&lt;?&gt;&nbsp;procedure)</pre>
+public&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/procedure/MasterProcedureScheduler.html#line.1001">wakeMetaExclusiveLock</a>(<a href="../../../../../../org/apache/hadoop/hbase/procedure2/Procedure.html" title="class in org.apache.hadoop.hbase.procedure2">Procedure</a>&lt;?&gt;&nbsp;procedure)</pre>
 <div class="block"><span class="deprecatedLabel">Deprecated.</span>&nbsp;<span class="deprecationComment">only used for <a href="../../../../../../org/apache/hadoop/hbase/master/procedure/RecoverMetaProcedure.html" title="class in org.apache.hadoop.hbase.master.procedure"><code>RecoverMetaProcedure</code></a>. Should be removed along with
              <a href="../../../../../../org/apache/hadoop/hbase/master/procedure/RecoverMetaProcedure.html" title="class in org.apache.hadoop.hbase.master.procedure"><code>RecoverMetaProcedure</code></a>.</span></div>
 <div class="block">Wake the procedures waiting for meta.</div>
@@ -1494,7 +1498,7 @@ public&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbas
 <ul class="blockListLast">
 <li class="blockList">
 <h4>dumpLocks</h4>
-<pre>public&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/procedure/MasterProcedureScheduler.html#line.990">dumpLocks</a>()
+<pre>public&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/procedure/MasterProcedureScheduler.html#line.1018">dumpLocks</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 debugging. Expensive.</div>
 <dl>


[21/29] hbase-site git commit: Published site at 5e84997f2ffdbcf5f849d70c30ddbe2db4039ca4.

Posted by gi...@apache.org.
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/27f5bfb5/devapidocs/org/apache/hadoop/hbase/zookeeper/ZKConfig.ZKClusterKey.html
----------------------------------------------------------------------
diff --git a/devapidocs/org/apache/hadoop/hbase/zookeeper/ZKConfig.ZKClusterKey.html b/devapidocs/org/apache/hadoop/hbase/zookeeper/ZKConfig.ZKClusterKey.html
index 5265f2e..54b3cbb 100644
--- a/devapidocs/org/apache/hadoop/hbase/zookeeper/ZKConfig.ZKClusterKey.html
+++ b/devapidocs/org/apache/hadoop/hbase/zookeeper/ZKConfig.ZKClusterKey.html
@@ -113,7 +113,7 @@ var activeTableTab = "activeTableTab";
 </dl>
 <hr>
 <br>
-<pre>public static class <a href="../../../../../src-html/org/apache/hadoop/hbase/zookeeper/ZKConfig.html#line.291">ZKConfig.ZKClusterKey</a>
+<pre>public static class <a href="../../../../../src-html/org/apache/hadoop/hbase/zookeeper/ZKConfig.html#line.316">ZKConfig.ZKClusterKey</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>
@@ -219,7 +219,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>quorumString</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/zookeeper/ZKConfig.ZKClusterKey.html#line.292">quorumString</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/zookeeper/ZKConfig.ZKClusterKey.html#line.317">quorumString</a></pre>
 </li>
 </ul>
 <a name="clientPort">
@@ -228,7 +228,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>clientPort</h4>
-<pre>private&nbsp;int <a href="../../../../../src-html/org/apache/hadoop/hbase/zookeeper/ZKConfig.ZKClusterKey.html#line.293">clientPort</a></pre>
+<pre>private&nbsp;int <a href="../../../../../src-html/org/apache/hadoop/hbase/zookeeper/ZKConfig.ZKClusterKey.html#line.318">clientPort</a></pre>
 </li>
 </ul>
 <a name="znodeParent">
@@ -237,7 +237,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockListLast">
 <li class="blockList">
 <h4>znodeParent</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/zookeeper/ZKConfig.ZKClusterKey.html#line.294">znodeParent</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/zookeeper/ZKConfig.ZKClusterKey.html#line.319">znodeParent</a></pre>
 </li>
 </ul>
 </li>
@@ -254,7 +254,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockListLast">
 <li class="blockList">
 <h4>ZKClusterKey</h4>
-<pre><a href="../../../../../src-html/org/apache/hadoop/hbase/zookeeper/ZKConfig.ZKClusterKey.html#line.296">ZKClusterKey</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;quorumString,
+<pre><a href="../../../../../src-html/org/apache/hadoop/hbase/zookeeper/ZKConfig.ZKClusterKey.html#line.321">ZKClusterKey</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;quorumString,
              int&nbsp;clientPort,
              <a href="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;znodeParent)</pre>
 </li>
@@ -273,7 +273,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>getQuorumString</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/zookeeper/ZKConfig.ZKClusterKey.html#line.302">getQuorumString</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/zookeeper/ZKConfig.ZKClusterKey.html#line.327">getQuorumString</a>()</pre>
 </li>
 </ul>
 <a name="getClientPort--">
@@ -282,7 +282,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>getClientPort</h4>
-<pre>public&nbsp;int&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/zookeeper/ZKConfig.ZKClusterKey.html#line.306">getClientPort</a>()</pre>
+<pre>public&nbsp;int&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/zookeeper/ZKConfig.ZKClusterKey.html#line.331">getClientPort</a>()</pre>
 </li>
 </ul>
 <a name="getZnodeParent--">
@@ -291,7 +291,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockListLast">
 <li class="blockList">
 <h4>getZnodeParent</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/zookeeper/ZKConfig.ZKClusterKey.html#line.310">getZnodeParent</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/zookeeper/ZKConfig.ZKClusterKey.html#line.335">getZnodeParent</a>()</pre>
 </li>
 </ul>
 </li>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/27f5bfb5/devapidocs/org/apache/hadoop/hbase/zookeeper/ZKConfig.html
----------------------------------------------------------------------
diff --git a/devapidocs/org/apache/hadoop/hbase/zookeeper/ZKConfig.html b/devapidocs/org/apache/hadoop/hbase/zookeeper/ZKConfig.html
index b1a0fd3..fc56ff3 100644
--- a/devapidocs/org/apache/hadoop/hbase/zookeeper/ZKConfig.html
+++ b/devapidocs/org/apache/hadoop/hbase/zookeeper/ZKConfig.html
@@ -110,7 +110,7 @@ var activeTableTab = "activeTableTab";
 <hr>
 <br>
 <pre>@InterfaceAudience.Private
-public final class <a href="../../../../../src-html/org/apache/hadoop/hbase/zookeeper/ZKConfig.html#line.40">ZKConfig</a>
+public final class <a href="../../../../../src-html/org/apache/hadoop/hbase/zookeeper/ZKConfig.html#line.41">ZKConfig</a>
 extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html?is-external=true" title="class or interface in java.lang">Object</a></pre>
 <div class="block">Utility methods for reading, and building the ZooKeeper configuration.
 
@@ -293,7 +293,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockListLast">
 <li class="blockList">
 <h4>VARIABLE_START</h4>
-<pre>private static final&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/zookeeper/ZKConfig.html#line.42">VARIABLE_START</a></pre>
+<pre>private static final&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/zookeeper/ZKConfig.html#line.43">VARIABLE_START</a></pre>
 <dl>
 <dt><span class="seeLabel">See Also:</span></dt>
 <dd><a href="../../../../../constant-values.html#org.apache.hadoop.hbase.zookeeper.ZKConfig.VARIABLE_START">Constant Field Values</a></dd>
@@ -314,7 +314,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockListLast">
 <li class="blockList">
 <h4>ZKConfig</h4>
-<pre>private&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/zookeeper/ZKConfig.html#line.44">ZKConfig</a>()</pre>
+<pre>private&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/zookeeper/ZKConfig.html#line.45">ZKConfig</a>()</pre>
 </li>
 </ul>
 </li>
@@ -331,7 +331,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>makeZKProps</h4>
-<pre>public static&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/util/Properties.html?is-external=true" title="class or interface in java.util">Properties</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/zookeeper/ZKConfig.html#line.54">makeZKProps</a>(org.apache.hadoop.conf.Configuration&nbsp;conf)</pre>
+<pre>public static&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/util/Properties.html?is-external=true" title="class or interface in java.util">Properties</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/zookeeper/ZKConfig.html#line.55">makeZKProps</a>(org.apache.hadoop.conf.Configuration&nbsp;conf)</pre>
 <div class="block">Make a Properties object holding ZooKeeper config.
  Parses the corresponding config options from the HBase XML configs
  and generates the appropriate ZooKeeper properties.</div>
@@ -349,7 +349,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>makeZKPropsFromHbaseConfig</h4>
-<pre>private static&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/util/Properties.html?is-external=true" title="class or interface in java.util">Properties</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/zookeeper/ZKConfig.html#line.66">makeZKPropsFromHbaseConfig</a>(org.apache.hadoop.conf.Configuration&nbsp;conf)</pre>
+<pre>private static&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/util/Properties.html?is-external=true" title="class or interface in java.util">Properties</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/zookeeper/ZKConfig.html#line.67">makeZKPropsFromHbaseConfig</a>(org.apache.hadoop.conf.Configuration&nbsp;conf)</pre>
 <div class="block">Make a Properties object holding ZooKeeper config.
  Parses the corresponding config options from the HBase XML configs
  and generates the appropriate ZooKeeper properties.</div>
@@ -367,7 +367,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>getZKQuorumServersStringFromHbaseConfig</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>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/zookeeper/ZKConfig.html#line.121">getZKQuorumServersStringFromHbaseConfig</a>(org.apache.hadoop.conf.Configuration&nbsp;conf)</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>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/zookeeper/ZKConfig.html#line.122">getZKQuorumServersStringFromHbaseConfig</a>(org.apache.hadoop.conf.Configuration&nbsp;conf)</pre>
 <div class="block">Return the ZK Quorum servers string given the specified configuration</div>
 <dl>
 <dt><span class="paramLabel">Parameters:</span></dt>
@@ -383,7 +383,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>getZKQuorumServersString</h4>
-<pre>public static&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/zookeeper/ZKConfig.html#line.135">getZKQuorumServersString</a>(org.apache.hadoop.conf.Configuration&nbsp;conf)</pre>
+<pre>public static&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/zookeeper/ZKConfig.html#line.136">getZKQuorumServersString</a>(org.apache.hadoop.conf.Configuration&nbsp;conf)</pre>
 <div class="block">Return the ZK Quorum servers string given the specified configuration.</div>
 <dl>
 <dt><span class="returnLabel">Returns:</span></dt>
@@ -397,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>buildZKQuorumServerString</h4>
-<pre>public static&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/zookeeper/ZKConfig.html#line.146">buildZKQuorumServerString</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;serverHosts,
+<pre>public static&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/zookeeper/ZKConfig.html#line.147">buildZKQuorumServerString</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;serverHosts,
                                                <a href="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;clientPort)</pre>
 <div class="block">Build the ZK quorum server string with "server:clientport" list, separated by ','</div>
 <dl>
@@ -415,7 +415,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>validateClusterKey</h4>
-<pre>public static&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/zookeeper/ZKConfig.html#line.179">validateClusterKey</a>(<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;key)
+<pre>public static&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/zookeeper/ZKConfig.html#line.204">validateClusterKey</a>(<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;key)
                                throws <a href="https://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">Verifies that the given key matches the expected format for a ZooKeeper cluster key.
  The Quorum for the ZK cluster can have one the following formats (see examples below):
@@ -442,7 +442,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>transformClusterKey</h4>
-<pre>public static&nbsp;<a href="../../../../../org/apache/hadoop/hbase/zookeeper/ZKConfig.ZKClusterKey.html" title="class in org.apache.hadoop.hbase.zookeeper">ZKConfig.ZKClusterKey</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/zookeeper/ZKConfig.html#line.191">transformClusterKey</a>(<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;key)
+<pre>public static&nbsp;<a href="../../../../../org/apache/hadoop/hbase/zookeeper/ZKConfig.ZKClusterKey.html" title="class in org.apache.hadoop.hbase.zookeeper">ZKConfig.ZKClusterKey</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/zookeeper/ZKConfig.html#line.216">transformClusterKey</a>(<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;key)
                                                  throws <a href="https://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">Separate the given key into the three configurations it should contain:
  hbase.zookeeper.quorum, hbase.zookeeper.client.port
@@ -463,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>getZooKeeperClusterKey</h4>
-<pre>public static&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/zookeeper/ZKConfig.html#line.245">getZooKeeperClusterKey</a>(org.apache.hadoop.conf.Configuration&nbsp;conf)</pre>
+<pre>public static&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/zookeeper/ZKConfig.html#line.270">getZooKeeperClusterKey</a>(org.apache.hadoop.conf.Configuration&nbsp;conf)</pre>
 <div class="block">Get the key to the ZK ensemble for this configuration without
  adding a name at the end</div>
 <dl>
@@ -480,7 +480,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>getZooKeeperClusterKey</h4>
-<pre>public static&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/zookeeper/ZKConfig.html#line.256">getZooKeeperClusterKey</a>(org.apache.hadoop.conf.Configuration&nbsp;conf,
+<pre>public static&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/zookeeper/ZKConfig.html#line.281">getZooKeeperClusterKey</a>(org.apache.hadoop.conf.Configuration&nbsp;conf,
                                             <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;name)</pre>
 <div class="block">Get the key to the ZK ensemble for this configuration and append
  a name at the end</div>
@@ -499,7 +499,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>standardizeZKQuorumServerString</h4>
-<pre>public static&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/zookeeper/ZKConfig.html#line.278">standardizeZKQuorumServerString</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;quorumStringInput,
+<pre>public static&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/zookeeper/ZKConfig.html#line.303">standardizeZKQuorumServerString</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;quorumStringInput,
                                                      <a href="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;clientPort)</pre>
 <div class="block">Standardize the ZK quorum string: make it a "server:clientport" list, separated by ','</div>
 <dl>
@@ -517,7 +517,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockListLast">
 <li class="blockList">
 <h4>getClientZKQuorumServersString</h4>
-<pre>public static&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/zookeeper/ZKConfig.html#line.320">getClientZKQuorumServersString</a>(org.apache.hadoop.conf.Configuration&nbsp;conf)</pre>
+<pre>public static&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/zookeeper/ZKConfig.html#line.345">getClientZKQuorumServersString</a>(org.apache.hadoop.conf.Configuration&nbsp;conf)</pre>
 <div class="block">Get the client ZK Quorum servers string</div>
 <dl>
 <dt><span class="paramLabel">Parameters:</span></dt>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/27f5bfb5/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 bd4c042..12c0220 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 = "Fri Nov  9 14:44:22 UTC 2018";<a name="line.13"></a>
+<span class="sourceLineNo">013</span>  public static final String date = "Sat Nov 10 14:42:20 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 = "2006cc481839aabfb5ea846c19b440b9";<a name="line.15"></a>
+<span class="sourceLineNo">015</span>  public static final String srcChecksum = "d1955f217a8fc07afafee2a3d8d27ec7";<a name="line.15"></a>
 <span class="sourceLineNo">016</span>}<a name="line.16"></a>
 
 


[16/29] hbase-site git commit: Published site at 5e84997f2ffdbcf5f849d70c30ddbe2db4039ca4.

Posted by gi...@apache.org.
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/27f5bfb5/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 dd0dd0f..9fd7e0b 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
@@ -975,1128 +975,1136 @@
 <span class="sourceLineNo">967</span>        store.update(procedure);<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>      // If we don't have the lock, we can't re-submit the queue,<a name="line.970"></a>
-<span class="sourceLineNo">971</span>      // since it is already executing. To get rid of the stuck situation, we<a name="line.971"></a>
-<span class="sourceLineNo">972</span>      // need to restart the master. With the procedure set to bypass, the procedureExecutor<a name="line.972"></a>
-<span class="sourceLineNo">973</span>      // will bypass it and won't get stuck again.<a name="line.973"></a>
-<span class="sourceLineNo">974</span>      if (lockEntry != null) {<a name="line.974"></a>
-<span class="sourceLineNo">975</span>        // add the procedure to run queue,<a name="line.975"></a>
-<span class="sourceLineNo">976</span>        scheduler.addFront(procedure);<a name="line.976"></a>
-<span class="sourceLineNo">977</span>        LOG.debug("Bypassing {} and its ancestors successfully, adding to queue", procedure);<a name="line.977"></a>
-<span class="sourceLineNo">978</span>      } else {<a name="line.978"></a>
-<span class="sourceLineNo">979</span>        LOG.debug("Bypassing {} and its ancestors successfully, but since it is already running, "<a name="line.979"></a>
-<span class="sourceLineNo">980</span>            + "skipping add to queue", procedure);<a name="line.980"></a>
-<span class="sourceLineNo">981</span>      }<a name="line.981"></a>
-<span class="sourceLineNo">982</span>      return true;<a name="line.982"></a>
-<span class="sourceLineNo">983</span><a name="line.983"></a>
-<span class="sourceLineNo">984</span>    } finally {<a name="line.984"></a>
-<span class="sourceLineNo">985</span>      if (lockEntry != null) {<a name="line.985"></a>
-<span class="sourceLineNo">986</span>        procExecutionLock.releaseLockEntry(lockEntry);<a name="line.986"></a>
-<span class="sourceLineNo">987</span>      }<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><a name="line.990"></a>
-<span class="sourceLineNo">991</span>  /**<a name="line.991"></a>
-<span class="sourceLineNo">992</span>   * Add a new root-procedure to the executor.<a name="line.992"></a>
-<span class="sourceLineNo">993</span>   * @param proc the new procedure to execute.<a name="line.993"></a>
-<span class="sourceLineNo">994</span>   * @param nonceKey the registered unique identifier for this operation from the client or process.<a name="line.994"></a>
-<span class="sourceLineNo">995</span>   * @return the procedure id, that can be used to monitor the operation<a name="line.995"></a>
-<span class="sourceLineNo">996</span>   */<a name="line.996"></a>
-<span class="sourceLineNo">997</span>  @edu.umd.cs.findbugs.annotations.SuppressWarnings(value="NP_NULL_ON_SOME_PATH",<a name="line.997"></a>
-<span class="sourceLineNo">998</span>      justification = "FindBugs is blind to the check-for-null")<a name="line.998"></a>
-<span class="sourceLineNo">999</span>  public long submitProcedure(Procedure&lt;TEnvironment&gt; proc, NonceKey nonceKey) {<a name="line.999"></a>
-<span class="sourceLineNo">1000</span>    Preconditions.checkArgument(lastProcId.get() &gt;= 0);<a name="line.1000"></a>
-<span class="sourceLineNo">1001</span><a name="line.1001"></a>
-<span class="sourceLineNo">1002</span>    prepareProcedure(proc);<a name="line.1002"></a>
-<span class="sourceLineNo">1003</span><a name="line.1003"></a>
-<span class="sourceLineNo">1004</span>    final Long currentProcId;<a name="line.1004"></a>
-<span class="sourceLineNo">1005</span>    if (nonceKey != null) {<a name="line.1005"></a>
-<span class="sourceLineNo">1006</span>      currentProcId = nonceKeysToProcIdsMap.get(nonceKey);<a name="line.1006"></a>
-<span class="sourceLineNo">1007</span>      Preconditions.checkArgument(currentProcId != null,<a name="line.1007"></a>
-<span class="sourceLineNo">1008</span>        "Expected nonceKey=" + nonceKey + " to be reserved, use registerNonce(); proc=" + proc);<a name="line.1008"></a>
-<span class="sourceLineNo">1009</span>    } else {<a name="line.1009"></a>
-<span class="sourceLineNo">1010</span>      currentProcId = nextProcId();<a name="line.1010"></a>
-<span class="sourceLineNo">1011</span>    }<a name="line.1011"></a>
-<span class="sourceLineNo">1012</span><a name="line.1012"></a>
-<span class="sourceLineNo">1013</span>    // Initialize the procedure<a name="line.1013"></a>
-<span class="sourceLineNo">1014</span>    proc.setNonceKey(nonceKey);<a name="line.1014"></a>
-<span class="sourceLineNo">1015</span>    proc.setProcId(currentProcId.longValue());<a name="line.1015"></a>
-<span class="sourceLineNo">1016</span><a name="line.1016"></a>
-<span class="sourceLineNo">1017</span>    // Commit the transaction<a name="line.1017"></a>
-<span class="sourceLineNo">1018</span>    store.insert(proc, null);<a name="line.1018"></a>
-<span class="sourceLineNo">1019</span>    LOG.debug("Stored {}", proc);<a name="line.1019"></a>
+<span class="sourceLineNo">970</span>      // If state of procedure is WAITING_TIMEOUT, we can directly submit it to the scheduler.<a name="line.970"></a>
+<span class="sourceLineNo">971</span>      // Instead we should remove it from timeout Executor queue and tranfer its state to RUNNABLE<a name="line.971"></a>
+<span class="sourceLineNo">972</span>      if (procedure.getState() == ProcedureState.WAITING_TIMEOUT) {<a name="line.972"></a>
+<span class="sourceLineNo">973</span>        LOG.debug("transform procedure {} from WAITING_TIMEOUT to RUNNABLE", procedure);<a name="line.973"></a>
+<span class="sourceLineNo">974</span>        if (timeoutExecutor.remove(procedure)) {<a name="line.974"></a>
+<span class="sourceLineNo">975</span>          LOG.debug("removed procedure {} from timeoutExecutor", procedure);<a name="line.975"></a>
+<span class="sourceLineNo">976</span>          timeoutExecutor.executeTimedoutProcedure(procedure);<a name="line.976"></a>
+<span class="sourceLineNo">977</span>        }<a name="line.977"></a>
+<span class="sourceLineNo">978</span>      } else if (lockEntry != null) {<a name="line.978"></a>
+<span class="sourceLineNo">979</span>        scheduler.addFront(procedure);<a name="line.979"></a>
+<span class="sourceLineNo">980</span>        LOG.debug("Bypassing {} and its ancestors successfully, adding to queue", procedure);<a name="line.980"></a>
+<span class="sourceLineNo">981</span>      } else {<a name="line.981"></a>
+<span class="sourceLineNo">982</span>        // If we don't have the lock, we can't re-submit the queue,<a name="line.982"></a>
+<span class="sourceLineNo">983</span>        // since it is already executing. To get rid of the stuck situation, we<a name="line.983"></a>
+<span class="sourceLineNo">984</span>        // need to restart the master. With the procedure set to bypass, the procedureExecutor<a name="line.984"></a>
+<span class="sourceLineNo">985</span>        // will bypass it and won't get stuck again.<a name="line.985"></a>
+<span class="sourceLineNo">986</span>        LOG.debug("Bypassing {} and its ancestors successfully, but since it is already running, "<a name="line.986"></a>
+<span class="sourceLineNo">987</span>            + "skipping add to queue",<a name="line.987"></a>
+<span class="sourceLineNo">988</span>          procedure);<a name="line.988"></a>
+<span class="sourceLineNo">989</span>      }<a name="line.989"></a>
+<span class="sourceLineNo">990</span>      return true;<a name="line.990"></a>
+<span class="sourceLineNo">991</span><a name="line.991"></a>
+<span class="sourceLineNo">992</span>    } finally {<a name="line.992"></a>
+<span class="sourceLineNo">993</span>      if (lockEntry != null) {<a name="line.993"></a>
+<span class="sourceLineNo">994</span>        procExecutionLock.releaseLockEntry(lockEntry);<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>  }<a name="line.997"></a>
+<span class="sourceLineNo">998</span><a name="line.998"></a>
+<span class="sourceLineNo">999</span>  /**<a name="line.999"></a>
+<span class="sourceLineNo">1000</span>   * Add a new root-procedure to the executor.<a name="line.1000"></a>
+<span class="sourceLineNo">1001</span>   * @param proc the new procedure to execute.<a name="line.1001"></a>
+<span class="sourceLineNo">1002</span>   * @param nonceKey the registered unique identifier for this operation from the client or process.<a name="line.1002"></a>
+<span class="sourceLineNo">1003</span>   * @return the procedure id, that can be used to monitor the operation<a name="line.1003"></a>
+<span class="sourceLineNo">1004</span>   */<a name="line.1004"></a>
+<span class="sourceLineNo">1005</span>  @edu.umd.cs.findbugs.annotations.SuppressWarnings(value="NP_NULL_ON_SOME_PATH",<a name="line.1005"></a>
+<span class="sourceLineNo">1006</span>      justification = "FindBugs is blind to the check-for-null")<a name="line.1006"></a>
+<span class="sourceLineNo">1007</span>  public long submitProcedure(Procedure&lt;TEnvironment&gt; proc, NonceKey nonceKey) {<a name="line.1007"></a>
+<span class="sourceLineNo">1008</span>    Preconditions.checkArgument(lastProcId.get() &gt;= 0);<a name="line.1008"></a>
+<span class="sourceLineNo">1009</span><a name="line.1009"></a>
+<span class="sourceLineNo">1010</span>    prepareProcedure(proc);<a name="line.1010"></a>
+<span class="sourceLineNo">1011</span><a name="line.1011"></a>
+<span class="sourceLineNo">1012</span>    final Long currentProcId;<a name="line.1012"></a>
+<span class="sourceLineNo">1013</span>    if (nonceKey != null) {<a name="line.1013"></a>
+<span class="sourceLineNo">1014</span>      currentProcId = nonceKeysToProcIdsMap.get(nonceKey);<a name="line.1014"></a>
+<span class="sourceLineNo">1015</span>      Preconditions.checkArgument(currentProcId != null,<a name="line.1015"></a>
+<span class="sourceLineNo">1016</span>        "Expected nonceKey=" + nonceKey + " to be reserved, use registerNonce(); proc=" + proc);<a name="line.1016"></a>
+<span class="sourceLineNo">1017</span>    } else {<a name="line.1017"></a>
+<span class="sourceLineNo">1018</span>      currentProcId = nextProcId();<a name="line.1018"></a>
+<span class="sourceLineNo">1019</span>    }<a name="line.1019"></a>
 <span class="sourceLineNo">1020</span><a name="line.1020"></a>
-<span class="sourceLineNo">1021</span>    // Add the procedure to the executor<a name="line.1021"></a>
-<span class="sourceLineNo">1022</span>    return pushProcedure(proc);<a name="line.1022"></a>
-<span class="sourceLineNo">1023</span>  }<a name="line.1023"></a>
+<span class="sourceLineNo">1021</span>    // Initialize the procedure<a name="line.1021"></a>
+<span class="sourceLineNo">1022</span>    proc.setNonceKey(nonceKey);<a name="line.1022"></a>
+<span class="sourceLineNo">1023</span>    proc.setProcId(currentProcId.longValue());<a name="line.1023"></a>
 <span class="sourceLineNo">1024</span><a name="line.1024"></a>
-<span class="sourceLineNo">1025</span>  /**<a name="line.1025"></a>
-<span class="sourceLineNo">1026</span>   * Add a set of new root-procedure to the executor.<a name="line.1026"></a>
-<span class="sourceLineNo">1027</span>   * @param procs the new procedures to execute.<a name="line.1027"></a>
-<span class="sourceLineNo">1028</span>   */<a name="line.1028"></a>
-<span class="sourceLineNo">1029</span>  // TODO: Do we need to take nonces here?<a name="line.1029"></a>
-<span class="sourceLineNo">1030</span>  public void submitProcedures(Procedure&lt;TEnvironment&gt;[] procs) {<a name="line.1030"></a>
-<span class="sourceLineNo">1031</span>    Preconditions.checkArgument(lastProcId.get() &gt;= 0);<a name="line.1031"></a>
-<span class="sourceLineNo">1032</span>    if (procs == null || procs.length &lt;= 0) {<a name="line.1032"></a>
-<span class="sourceLineNo">1033</span>      return;<a name="line.1033"></a>
-<span class="sourceLineNo">1034</span>    }<a name="line.1034"></a>
-<span class="sourceLineNo">1035</span><a name="line.1035"></a>
-<span class="sourceLineNo">1036</span>    // Prepare procedure<a name="line.1036"></a>
-<span class="sourceLineNo">1037</span>    for (int i = 0; i &lt; procs.length; ++i) {<a name="line.1037"></a>
-<span class="sourceLineNo">1038</span>      prepareProcedure(procs[i]).setProcId(nextProcId());<a name="line.1038"></a>
-<span class="sourceLineNo">1039</span>    }<a name="line.1039"></a>
-<span class="sourceLineNo">1040</span><a name="line.1040"></a>
-<span class="sourceLineNo">1041</span>    // Commit the transaction<a name="line.1041"></a>
-<span class="sourceLineNo">1042</span>    store.insert(procs);<a name="line.1042"></a>
-<span class="sourceLineNo">1043</span>    if (LOG.isDebugEnabled()) {<a name="line.1043"></a>
-<span class="sourceLineNo">1044</span>      LOG.debug("Stored " + Arrays.toString(procs));<a name="line.1044"></a>
-<span class="sourceLineNo">1045</span>    }<a name="line.1045"></a>
-<span class="sourceLineNo">1046</span><a name="line.1046"></a>
-<span class="sourceLineNo">1047</span>    // Add the procedure to the executor<a name="line.1047"></a>
-<span class="sourceLineNo">1048</span>    for (int i = 0; i &lt; procs.length; ++i) {<a name="line.1048"></a>
-<span class="sourceLineNo">1049</span>      pushProcedure(procs[i]);<a name="line.1049"></a>
-<span class="sourceLineNo">1050</span>    }<a name="line.1050"></a>
-<span class="sourceLineNo">1051</span>  }<a name="line.1051"></a>
-<span class="sourceLineNo">1052</span><a name="line.1052"></a>
-<span class="sourceLineNo">1053</span>  private Procedure&lt;TEnvironment&gt; prepareProcedure(Procedure&lt;TEnvironment&gt; proc) {<a name="line.1053"></a>
-<span class="sourceLineNo">1054</span>    Preconditions.checkArgument(proc.getState() == ProcedureState.INITIALIZING);<a name="line.1054"></a>
-<span class="sourceLineNo">1055</span>    Preconditions.checkArgument(!proc.hasParent(), "unexpected parent", proc);<a name="line.1055"></a>
-<span class="sourceLineNo">1056</span>    if (this.checkOwnerSet) {<a name="line.1056"></a>
-<span class="sourceLineNo">1057</span>      Preconditions.checkArgument(proc.hasOwner(), "missing owner");<a name="line.1057"></a>
+<span class="sourceLineNo">1025</span>    // Commit the transaction<a name="line.1025"></a>
+<span class="sourceLineNo">1026</span>    store.insert(proc, null);<a name="line.1026"></a>
+<span class="sourceLineNo">1027</span>    LOG.debug("Stored {}", proc);<a name="line.1027"></a>
+<span class="sourceLineNo">1028</span><a name="line.1028"></a>
+<span class="sourceLineNo">1029</span>    // Add the procedure to the executor<a name="line.1029"></a>
+<span class="sourceLineNo">1030</span>    return pushProcedure(proc);<a name="line.1030"></a>
+<span class="sourceLineNo">1031</span>  }<a name="line.1031"></a>
+<span class="sourceLineNo">1032</span><a name="line.1032"></a>
+<span class="sourceLineNo">1033</span>  /**<a name="line.1033"></a>
+<span class="sourceLineNo">1034</span>   * Add a set of new root-procedure to the executor.<a name="line.1034"></a>
+<span class="sourceLineNo">1035</span>   * @param procs the new procedures to execute.<a name="line.1035"></a>
+<span class="sourceLineNo">1036</span>   */<a name="line.1036"></a>
+<span class="sourceLineNo">1037</span>  // TODO: Do we need to take nonces here?<a name="line.1037"></a>
+<span class="sourceLineNo">1038</span>  public void submitProcedures(Procedure&lt;TEnvironment&gt;[] procs) {<a name="line.1038"></a>
+<span class="sourceLineNo">1039</span>    Preconditions.checkArgument(lastProcId.get() &gt;= 0);<a name="line.1039"></a>
+<span class="sourceLineNo">1040</span>    if (procs == null || procs.length &lt;= 0) {<a name="line.1040"></a>
+<span class="sourceLineNo">1041</span>      return;<a name="line.1041"></a>
+<span class="sourceLineNo">1042</span>    }<a name="line.1042"></a>
+<span class="sourceLineNo">1043</span><a name="line.1043"></a>
+<span class="sourceLineNo">1044</span>    // Prepare procedure<a name="line.1044"></a>
+<span class="sourceLineNo">1045</span>    for (int i = 0; i &lt; procs.length; ++i) {<a name="line.1045"></a>
+<span class="sourceLineNo">1046</span>      prepareProcedure(procs[i]).setProcId(nextProcId());<a name="line.1046"></a>
+<span class="sourceLineNo">1047</span>    }<a name="line.1047"></a>
+<span class="sourceLineNo">1048</span><a name="line.1048"></a>
+<span class="sourceLineNo">1049</span>    // Commit the transaction<a name="line.1049"></a>
+<span class="sourceLineNo">1050</span>    store.insert(procs);<a name="line.1050"></a>
+<span class="sourceLineNo">1051</span>    if (LOG.isDebugEnabled()) {<a name="line.1051"></a>
+<span class="sourceLineNo">1052</span>      LOG.debug("Stored " + Arrays.toString(procs));<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>    // Add the procedure to the executor<a name="line.1055"></a>
+<span class="sourceLineNo">1056</span>    for (int i = 0; i &lt; procs.length; ++i) {<a name="line.1056"></a>
+<span class="sourceLineNo">1057</span>      pushProcedure(procs[i]);<a name="line.1057"></a>
 <span class="sourceLineNo">1058</span>    }<a name="line.1058"></a>
-<span class="sourceLineNo">1059</span>    return proc;<a name="line.1059"></a>
-<span class="sourceLineNo">1060</span>  }<a name="line.1060"></a>
-<span class="sourceLineNo">1061</span><a name="line.1061"></a>
-<span class="sourceLineNo">1062</span>  private long pushProcedure(Procedure&lt;TEnvironment&gt; proc) {<a name="line.1062"></a>
-<span class="sourceLineNo">1063</span>    final long currentProcId = proc.getProcId();<a name="line.1063"></a>
-<span class="sourceLineNo">1064</span><a name="line.1064"></a>
-<span class="sourceLineNo">1065</span>    // Update metrics on start of a procedure<a name="line.1065"></a>
-<span class="sourceLineNo">1066</span>    proc.updateMetricsOnSubmit(getEnvironment());<a name="line.1066"></a>
-<span class="sourceLineNo">1067</span><a name="line.1067"></a>
-<span class="sourceLineNo">1068</span>    // Create the rollback stack for the procedure<a name="line.1068"></a>
-<span class="sourceLineNo">1069</span>    RootProcedureState&lt;TEnvironment&gt; stack = new RootProcedureState&lt;&gt;();<a name="line.1069"></a>
-<span class="sourceLineNo">1070</span>    rollbackStack.put(currentProcId, stack);<a name="line.1070"></a>
-<span class="sourceLineNo">1071</span><a name="line.1071"></a>
-<span class="sourceLineNo">1072</span>    // Submit the new subprocedures<a name="line.1072"></a>
-<span class="sourceLineNo">1073</span>    assert !procedures.containsKey(currentProcId);<a name="line.1073"></a>
-<span class="sourceLineNo">1074</span>    procedures.put(currentProcId, proc);<a name="line.1074"></a>
-<span class="sourceLineNo">1075</span>    sendProcedureAddedNotification(currentProcId);<a name="line.1075"></a>
-<span class="sourceLineNo">1076</span>    scheduler.addBack(proc);<a name="line.1076"></a>
-<span class="sourceLineNo">1077</span>    return proc.getProcId();<a name="line.1077"></a>
-<span class="sourceLineNo">1078</span>  }<a name="line.1078"></a>
+<span class="sourceLineNo">1059</span>  }<a name="line.1059"></a>
+<span class="sourceLineNo">1060</span><a name="line.1060"></a>
+<span class="sourceLineNo">1061</span>  private Procedure&lt;TEnvironment&gt; prepareProcedure(Procedure&lt;TEnvironment&gt; proc) {<a name="line.1061"></a>
+<span class="sourceLineNo">1062</span>    Preconditions.checkArgument(proc.getState() == ProcedureState.INITIALIZING);<a name="line.1062"></a>
+<span class="sourceLineNo">1063</span>    Preconditions.checkArgument(!proc.hasParent(), "unexpected parent", proc);<a name="line.1063"></a>
+<span class="sourceLineNo">1064</span>    if (this.checkOwnerSet) {<a name="line.1064"></a>
+<span class="sourceLineNo">1065</span>      Preconditions.checkArgument(proc.hasOwner(), "missing owner");<a name="line.1065"></a>
+<span class="sourceLineNo">1066</span>    }<a name="line.1066"></a>
+<span class="sourceLineNo">1067</span>    return proc;<a name="line.1067"></a>
+<span class="sourceLineNo">1068</span>  }<a name="line.1068"></a>
+<span class="sourceLineNo">1069</span><a name="line.1069"></a>
+<span class="sourceLineNo">1070</span>  private long pushProcedure(Procedure&lt;TEnvironment&gt; proc) {<a name="line.1070"></a>
+<span class="sourceLineNo">1071</span>    final long currentProcId = proc.getProcId();<a name="line.1071"></a>
+<span class="sourceLineNo">1072</span><a name="line.1072"></a>
+<span class="sourceLineNo">1073</span>    // Update metrics on start of a procedure<a name="line.1073"></a>
+<span class="sourceLineNo">1074</span>    proc.updateMetricsOnSubmit(getEnvironment());<a name="line.1074"></a>
+<span class="sourceLineNo">1075</span><a name="line.1075"></a>
+<span class="sourceLineNo">1076</span>    // Create the rollback stack for the procedure<a name="line.1076"></a>
+<span class="sourceLineNo">1077</span>    RootProcedureState&lt;TEnvironment&gt; stack = new RootProcedureState&lt;&gt;();<a name="line.1077"></a>
+<span class="sourceLineNo">1078</span>    rollbackStack.put(currentProcId, stack);<a name="line.1078"></a>
 <span class="sourceLineNo">1079</span><a name="line.1079"></a>
-<span class="sourceLineNo">1080</span>  /**<a name="line.1080"></a>
-<span class="sourceLineNo">1081</span>   * Send an abort notification the specified procedure.<a name="line.1081"></a>
-<span class="sourceLineNo">1082</span>   * Depending on the procedure implementation the abort can be considered or ignored.<a name="line.1082"></a>
-<span class="sourceLineNo">1083</span>   * @param procId the procedure to abort<a name="line.1083"></a>
-<span class="sourceLineNo">1084</span>   * @return true if the procedure exists and has received the abort, otherwise false.<a name="line.1084"></a>
-<span class="sourceLineNo">1085</span>   */<a name="line.1085"></a>
-<span class="sourceLineNo">1086</span>  public boolean abort(long procId) {<a name="line.1086"></a>
-<span class="sourceLineNo">1087</span>    return abort(procId, true);<a name="line.1087"></a>
-<span class="sourceLineNo">1088</span>  }<a name="line.1088"></a>
-<span class="sourceLineNo">1089</span><a name="line.1089"></a>
-<span class="sourceLineNo">1090</span>  /**<a name="line.1090"></a>
-<span class="sourceLineNo">1091</span>   * Send an abort notification to the specified procedure.<a name="line.1091"></a>
-<span class="sourceLineNo">1092</span>   * Depending on the procedure implementation, the abort can be considered or ignored.<a name="line.1092"></a>
-<span class="sourceLineNo">1093</span>   * @param procId the procedure to abort<a name="line.1093"></a>
-<span class="sourceLineNo">1094</span>   * @param mayInterruptIfRunning if the proc completed at least one step, should it be aborted?<a name="line.1094"></a>
-<span class="sourceLineNo">1095</span>   * @return true if the procedure exists and has received the abort, otherwise false.<a name="line.1095"></a>
-<span class="sourceLineNo">1096</span>   */<a name="line.1096"></a>
-<span class="sourceLineNo">1097</span>  public boolean abort(long procId, boolean mayInterruptIfRunning) {<a name="line.1097"></a>
-<span class="sourceLineNo">1098</span>    Procedure&lt;TEnvironment&gt; proc = procedures.get(procId);<a name="line.1098"></a>
-<span class="sourceLineNo">1099</span>    if (proc != null) {<a name="line.1099"></a>
-<span class="sourceLineNo">1100</span>      if (!mayInterruptIfRunning &amp;&amp; proc.wasExecuted()) {<a name="line.1100"></a>
-<span class="sourceLineNo">1101</span>        return false;<a name="line.1101"></a>
-<span class="sourceLineNo">1102</span>      }<a name="line.1102"></a>
-<span class="sourceLineNo">1103</span>      return proc.abort(getEnvironment());<a name="line.1103"></a>
-<span class="sourceLineNo">1104</span>    }<a name="line.1104"></a>
-<span class="sourceLineNo">1105</span>    return false;<a name="line.1105"></a>
-<span class="sourceLineNo">1106</span>  }<a name="line.1106"></a>
-<span class="sourceLineNo">1107</span><a name="line.1107"></a>
-<span class="sourceLineNo">1108</span>  // ==========================================================================<a name="line.1108"></a>
-<span class="sourceLineNo">1109</span>  //  Executor query helpers<a name="line.1109"></a>
-<span class="sourceLineNo">1110</span>  // ==========================================================================<a name="line.1110"></a>
-<span class="sourceLineNo">1111</span>  public Procedure&lt;TEnvironment&gt; getProcedure(final long procId) {<a name="line.1111"></a>
-<span class="sourceLineNo">1112</span>    return procedures.get(procId);<a name="line.1112"></a>
-<span class="sourceLineNo">1113</span>  }<a name="line.1113"></a>
-<span class="sourceLineNo">1114</span><a name="line.1114"></a>
-<span class="sourceLineNo">1115</span>  public &lt;T extends Procedure&lt;TEnvironment&gt;&gt; T getProcedure(Class&lt;T&gt; clazz, long procId) {<a name="line.1115"></a>
-<span class="sourceLineNo">1116</span>    Procedure&lt;TEnvironment&gt; proc = getProcedure(procId);<a name="line.1116"></a>
-<span class="sourceLineNo">1117</span>    if (clazz.isInstance(proc)) {<a name="line.1117"></a>
-<span class="sourceLineNo">1118</span>      return clazz.cast(proc);<a name="line.1118"></a>
-<span class="sourceLineNo">1119</span>    }<a name="line.1119"></a>
-<span class="sourceLineNo">1120</span>    return null;<a name="line.1120"></a>
+<span class="sourceLineNo">1080</span>    // Submit the new subprocedures<a name="line.1080"></a>
+<span class="sourceLineNo">1081</span>    assert !procedures.containsKey(currentProcId);<a name="line.1081"></a>
+<span class="sourceLineNo">1082</span>    procedures.put(currentProcId, proc);<a name="line.1082"></a>
+<span class="sourceLineNo">1083</span>    sendProcedureAddedNotification(currentProcId);<a name="line.1083"></a>
+<span class="sourceLineNo">1084</span>    scheduler.addBack(proc);<a name="line.1084"></a>
+<span class="sourceLineNo">1085</span>    return proc.getProcId();<a name="line.1085"></a>
+<span class="sourceLineNo">1086</span>  }<a name="line.1086"></a>
+<span class="sourceLineNo">1087</span><a name="line.1087"></a>
+<span class="sourceLineNo">1088</span>  /**<a name="line.1088"></a>
+<span class="sourceLineNo">1089</span>   * Send an abort notification the specified procedure.<a name="line.1089"></a>
+<span class="sourceLineNo">1090</span>   * Depending on the procedure implementation the abort can be considered or ignored.<a name="line.1090"></a>
+<span class="sourceLineNo">1091</span>   * @param procId the procedure to abort<a name="line.1091"></a>
+<span class="sourceLineNo">1092</span>   * @return true if the procedure exists and has received the abort, otherwise false.<a name="line.1092"></a>
+<span class="sourceLineNo">1093</span>   */<a name="line.1093"></a>
+<span class="sourceLineNo">1094</span>  public boolean abort(long procId) {<a name="line.1094"></a>
+<span class="sourceLineNo">1095</span>    return abort(procId, true);<a name="line.1095"></a>
+<span class="sourceLineNo">1096</span>  }<a name="line.1096"></a>
+<span class="sourceLineNo">1097</span><a name="line.1097"></a>
+<span class="sourceLineNo">1098</span>  /**<a name="line.1098"></a>
+<span class="sourceLineNo">1099</span>   * Send an abort notification to the specified procedure.<a name="line.1099"></a>
+<span class="sourceLineNo">1100</span>   * Depending on the procedure implementation, the abort can be considered or ignored.<a name="line.1100"></a>
+<span class="sourceLineNo">1101</span>   * @param procId the procedure to abort<a name="line.1101"></a>
+<span class="sourceLineNo">1102</span>   * @param mayInterruptIfRunning if the proc completed at least one step, should it be aborted?<a name="line.1102"></a>
+<span class="sourceLineNo">1103</span>   * @return true if the procedure exists and has received the abort, otherwise false.<a name="line.1103"></a>
+<span class="sourceLineNo">1104</span>   */<a name="line.1104"></a>
+<span class="sourceLineNo">1105</span>  public boolean abort(long procId, boolean mayInterruptIfRunning) {<a name="line.1105"></a>
+<span class="sourceLineNo">1106</span>    Procedure&lt;TEnvironment&gt; proc = procedures.get(procId);<a name="line.1106"></a>
+<span class="sourceLineNo">1107</span>    if (proc != null) {<a name="line.1107"></a>
+<span class="sourceLineNo">1108</span>      if (!mayInterruptIfRunning &amp;&amp; proc.wasExecuted()) {<a name="line.1108"></a>
+<span class="sourceLineNo">1109</span>        return false;<a name="line.1109"></a>
+<span class="sourceLineNo">1110</span>      }<a name="line.1110"></a>
+<span class="sourceLineNo">1111</span>      return proc.abort(getEnvironment());<a name="line.1111"></a>
+<span class="sourceLineNo">1112</span>    }<a name="line.1112"></a>
+<span class="sourceLineNo">1113</span>    return false;<a name="line.1113"></a>
+<span class="sourceLineNo">1114</span>  }<a name="line.1114"></a>
+<span class="sourceLineNo">1115</span><a name="line.1115"></a>
+<span class="sourceLineNo">1116</span>  // ==========================================================================<a name="line.1116"></a>
+<span class="sourceLineNo">1117</span>  //  Executor query helpers<a name="line.1117"></a>
+<span class="sourceLineNo">1118</span>  // ==========================================================================<a name="line.1118"></a>
+<span class="sourceLineNo">1119</span>  public Procedure&lt;TEnvironment&gt; getProcedure(final long procId) {<a name="line.1119"></a>
+<span class="sourceLineNo">1120</span>    return procedures.get(procId);<a name="line.1120"></a>
 <span class="sourceLineNo">1121</span>  }<a name="line.1121"></a>
 <span class="sourceLineNo">1122</span><a name="line.1122"></a>
-<span class="sourceLineNo">1123</span>  public Procedure&lt;TEnvironment&gt; getResult(long procId) {<a name="line.1123"></a>
-<span class="sourceLineNo">1124</span>    CompletedProcedureRetainer&lt;TEnvironment&gt; retainer = completed.get(procId);<a name="line.1124"></a>
-<span class="sourceLineNo">1125</span>    if (retainer == null) {<a name="line.1125"></a>
-<span class="sourceLineNo">1126</span>      return null;<a name="line.1126"></a>
-<span class="sourceLineNo">1127</span>    } else {<a name="line.1127"></a>
-<span class="sourceLineNo">1128</span>      return retainer.getProcedure();<a name="line.1128"></a>
-<span class="sourceLineNo">1129</span>    }<a name="line.1129"></a>
-<span class="sourceLineNo">1130</span>  }<a name="line.1130"></a>
-<span class="sourceLineNo">1131</span><a name="line.1131"></a>
-<span class="sourceLineNo">1132</span>  /**<a name="line.1132"></a>
-<span class="sourceLineNo">1133</span>   * Return true if the procedure is finished.<a name="line.1133"></a>
-<span class="sourceLineNo">1134</span>   * The state may be "completed successfully" or "failed and rolledback".<a name="line.1134"></a>
-<span class="sourceLineNo">1135</span>   * Use getResult() to check the state or get the result data.<a name="line.1135"></a>
-<span class="sourceLineNo">1136</span>   * @param procId the ID of the procedure to check<a name="line.1136"></a>
-<span class="sourceLineNo">1137</span>   * @return true if the procedure execution is finished, otherwise false.<a name="line.1137"></a>
-<span class="sourceLineNo">1138</span>   */<a name="line.1138"></a>
-<span class="sourceLineNo">1139</span>  public boolean isFinished(final long procId) {<a name="line.1139"></a>
-<span class="sourceLineNo">1140</span>    return !procedures.containsKey(procId);<a name="line.1140"></a>
-<span class="sourceLineNo">1141</span>  }<a name="line.1141"></a>
-<span class="sourceLineNo">1142</span><a name="line.1142"></a>
-<span class="sourceLineNo">1143</span>  /**<a name="line.1143"></a>
-<span class="sourceLineNo">1144</span>   * Return true if the procedure is started.<a name="line.1144"></a>
-<span class="sourceLineNo">1145</span>   * @param procId the ID of the procedure to check<a name="line.1145"></a>
-<span class="sourceLineNo">1146</span>   * @return true if the procedure execution is started, otherwise false.<a name="line.1146"></a>
-<span class="sourceLineNo">1147</span>   */<a name="line.1147"></a>
-<span class="sourceLineNo">1148</span>  public boolean isStarted(long procId) {<a name="line.1148"></a>
-<span class="sourceLineNo">1149</span>    Procedure&lt;?&gt; proc = procedures.get(procId);<a name="line.1149"></a>
-<span class="sourceLineNo">1150</span>    if (proc == null) {<a name="line.1150"></a>
-<span class="sourceLineNo">1151</span>      return completed.get(procId) != null;<a name="line.1151"></a>
-<span class="sourceLineNo">1152</span>    }<a name="line.1152"></a>
-<span class="sourceLineNo">1153</span>    return proc.wasExecuted();<a name="line.1153"></a>
-<span class="sourceLineNo">1154</span>  }<a name="line.1154"></a>
-<span class="sourceLineNo">1155</span><a name="line.1155"></a>
-<span class="sourceLineNo">1156</span>  /**<a name="line.1156"></a>
-<span class="sourceLineNo">1157</span>   * Mark the specified completed procedure, as ready to remove.<a name="line.1157"></a>
-<span class="sourceLineNo">1158</span>   * @param procId the ID of the procedure to remove<a name="line.1158"></a>
-<span class="sourceLineNo">1159</span>   */<a name="line.1159"></a>
-<span class="sourceLineNo">1160</span>  public void removeResult(long procId) {<a name="line.1160"></a>
-<span class="sourceLineNo">1161</span>    CompletedProcedureRetainer&lt;TEnvironment&gt; retainer = completed.get(procId);<a name="line.1161"></a>
-<span class="sourceLineNo">1162</span>    if (retainer == null) {<a name="line.1162"></a>
-<span class="sourceLineNo">1163</span>      assert !procedures.containsKey(procId) : "pid=" + procId + " is still running";<a name="line.1163"></a>
-<span class="sourceLineNo">1164</span>      LOG.debug("pid={} already removed by the cleaner.", procId);<a name="line.1164"></a>
-<span class="sourceLineNo">1165</span>      return;<a name="line.1165"></a>
-<span class="sourceLineNo">1166</span>    }<a name="line.1166"></a>
-<span class="sourceLineNo">1167</span><a name="line.1167"></a>
-<span class="sourceLineNo">1168</span>    // The CompletedProcedureCleaner will take care of deletion, once the TTL is expired.<a name="line.1168"></a>
-<span class="sourceLineNo">1169</span>    retainer.setClientAckTime(EnvironmentEdgeManager.currentTime());<a name="line.1169"></a>
-<span class="sourceLineNo">1170</span>  }<a name="line.1170"></a>
-<span class="sourceLineNo">1171</span><a name="line.1171"></a>
-<span class="sourceLineNo">1172</span>  public Procedure&lt;TEnvironment&gt; getResultOrProcedure(long procId) {<a name="line.1172"></a>
-<span class="sourceLineNo">1173</span>    CompletedProcedureRetainer&lt;TEnvironment&gt; retainer = completed.get(procId);<a name="line.1173"></a>
-<span class="sourceLineNo">1174</span>    if (retainer == null) {<a name="line.1174"></a>
-<span class="sourceLineNo">1175</span>      return procedures.get(procId);<a name="line.1175"></a>
-<span class="sourceLineNo">1176</span>    } else {<a name="line.1176"></a>
-<span class="sourceLineNo">1177</span>      return retainer.getProcedure();<a name="line.1177"></a>
-<span class="sourceLineNo">1178</span>    }<a name="line.1178"></a>
-<span class="sourceLineNo">1179</span>  }<a name="line.1179"></a>
-<span class="sourceLineNo">1180</span><a name="line.1180"></a>
-<span class="sourceLineNo">1181</span>  /**<a name="line.1181"></a>
-<span class="sourceLineNo">1182</span>   * Check if the user is this procedure's owner<a name="line.1182"></a>
-<span class="sourceLineNo">1183</span>   * @param procId the target procedure<a name="line.1183"></a>
-<span class="sourceLineNo">1184</span>   * @param user the user<a name="line.1184"></a>
-<span class="sourceLineNo">1185</span>   * @return true if the user is the owner of the procedure,<a name="line.1185"></a>
-<span class="sourceLineNo">1186</span>   *   false otherwise or the owner is unknown.<a name="line.1186"></a>
-<span class="sourceLineNo">1187</span>   */<a name="line.1187"></a>
-<span class="sourceLineNo">1188</span>  public boolean isProcedureOwner(long procId, User user) {<a name="line.1188"></a>
-<span class="sourceLineNo">1189</span>    if (user == null) {<a name="line.1189"></a>
-<span class="sourceLineNo">1190</span>      return false;<a name="line.1190"></a>
-<span class="sourceLineNo">1191</span>    }<a name="line.1191"></a>
-<span class="sourceLineNo">1192</span>    final Procedure&lt;TEnvironment&gt; runningProc = procedures.get(procId);<a name="line.1192"></a>
-<span class="sourceLineNo">1193</span>    if (runningProc != null) {<a name="line.1193"></a>
-<span class="sourceLineNo">1194</span>      return runningProc.getOwner().equals(user.getShortName());<a name="line.1194"></a>
-<span class="sourceLineNo">1195</span>    }<a name="line.1195"></a>
-<span class="sourceLineNo">1196</span><a name="line.1196"></a>
-<span class="sourceLineNo">1197</span>    final CompletedProcedureRetainer&lt;TEnvironment&gt; retainer = completed.get(procId);<a name="line.1197"></a>
-<span class="sourceLineNo">1198</span>    if (retainer != null) {<a name="line.1198"></a>
-<span class="sourceLineNo">1199</span>      return retainer.getProcedure().getOwner().equals(user.getShortName());<a name="line.1199"></a>
-<span class="sourceLineNo">1200</span>    }<a name="line.1200"></a>
-<span class="sourceLineNo">1201</span><a name="line.1201"></a>
-<span class="sourceLineNo">1202</span>    // Procedure either does not exist or has already completed and got cleaned up.<a name="line.1202"></a>
-<span class="sourceLineNo">1203</span>    // At this time, we cannot check the owner of the procedure<a name="line.1203"></a>
-<span class="sourceLineNo">1204</span>    return false;<a name="line.1204"></a>
-<span class="sourceLineNo">1205</span>  }<a name="line.1205"></a>
-<span class="sourceLineNo">1206</span><a name="line.1206"></a>
-<span class="sourceLineNo">1207</span>  /**<a name="line.1207"></a>
-<span class="sourceLineNo">1208</span>   * Should only be used when starting up, where the procedure workers have not been started.<a name="line.1208"></a>
-<span class="sourceLineNo">1209</span>   * &lt;p/&gt;<a name="line.1209"></a>
-<span class="sourceLineNo">1210</span>   * If the procedure works has been started, the return values maybe changed when you are<a name="line.1210"></a>
-<span class="sourceLineNo">1211</span>   * processing it so usually this is not safe. Use {@link #getProcedures()} below for most cases as<a name="line.1211"></a>
-<span class="sourceLineNo">1212</span>   * it will do a copy, and also include the finished procedures.<a name="line.1212"></a>
-<span class="sourceLineNo">1213</span>   */<a name="line.1213"></a>
-<span class="sourceLineNo">1214</span>  public Collection&lt;Procedure&lt;TEnvironment&gt;&gt; getActiveProceduresNoCopy() {<a name="line.1214"></a>
-<span class="sourceLineNo">1215</span>    return procedures.values();<a name="line.1215"></a>
-<span class="sourceLineNo">1216</span>  }<a name="line.1216"></a>
-<span class="sourceLineNo">1217</span><a name="line.1217"></a>
-<span class="sourceLineNo">1218</span>  /**<a name="line.1218"></a>
-<span class="sourceLineNo">1219</span>   * Get procedures.<a name="line.1219"></a>
-<span class="sourceLineNo">1220</span>   * @return the procedures in a list<a name="line.1220"></a>
+<span class="sourceLineNo">1123</span>  public &lt;T extends Procedure&lt;TEnvironment&gt;&gt; T getProcedure(Class&lt;T&gt; clazz, long procId) {<a name="line.1123"></a>
+<span class="sourceLineNo">1124</span>    Procedure&lt;TEnvironment&gt; proc = getProcedure(procId);<a name="line.1124"></a>
+<span class="sourceLineNo">1125</span>    if (clazz.isInstance(proc)) {<a name="line.1125"></a>
+<span class="sourceLineNo">1126</span>      return clazz.cast(proc);<a name="line.1126"></a>
+<span class="sourceLineNo">1127</span>    }<a name="line.1127"></a>
+<span class="sourceLineNo">1128</span>    return null;<a name="line.1128"></a>
+<span class="sourceLineNo">1129</span>  }<a name="line.1129"></a>
+<span class="sourceLineNo">1130</span><a name="line.1130"></a>
+<span class="sourceLineNo">1131</span>  public Procedure&lt;TEnvironment&gt; getResult(long procId) {<a name="line.1131"></a>
+<span class="sourceLineNo">1132</span>    CompletedProcedureRetainer&lt;TEnvironment&gt; retainer = completed.get(procId);<a name="line.1132"></a>
+<span class="sourceLineNo">1133</span>    if (retainer == null) {<a name="line.1133"></a>
+<span class="sourceLineNo">1134</span>      return null;<a name="line.1134"></a>
+<span class="sourceLineNo">1135</span>    } else {<a name="line.1135"></a>
+<span class="sourceLineNo">1136</span>      return retainer.getProcedure();<a name="line.1136"></a>
+<span class="sourceLineNo">1137</span>    }<a name="line.1137"></a>
+<span class="sourceLineNo">1138</span>  }<a name="line.1138"></a>
+<span class="sourceLineNo">1139</span><a name="line.1139"></a>
+<span class="sourceLineNo">1140</span>  /**<a name="line.1140"></a>
+<span class="sourceLineNo">1141</span>   * Return true if the procedure is finished.<a name="line.1141"></a>
+<span class="sourceLineNo">1142</span>   * The state may be "completed successfully" or "failed and rolledback".<a name="line.1142"></a>
+<span class="sourceLineNo">1143</span>   * Use getResult() to check the state or get the result data.<a name="line.1143"></a>
+<span class="sourceLineNo">1144</span>   * @param procId the ID of the procedure to check<a name="line.1144"></a>
+<span class="sourceLineNo">1145</span>   * @return true if the procedure execution is finished, otherwise false.<a name="line.1145"></a>
+<span class="sourceLineNo">1146</span>   */<a name="line.1146"></a>
+<span class="sourceLineNo">1147</span>  public boolean isFinished(final long procId) {<a name="line.1147"></a>
+<span class="sourceLineNo">1148</span>    return !procedures.containsKey(procId);<a name="line.1148"></a>
+<span class="sourceLineNo">1149</span>  }<a name="line.1149"></a>
+<span class="sourceLineNo">1150</span><a name="line.1150"></a>
+<span class="sourceLineNo">1151</span>  /**<a name="line.1151"></a>
+<span class="sourceLineNo">1152</span>   * Return true if the procedure is started.<a name="line.1152"></a>
+<span class="sourceLineNo">1153</span>   * @param procId the ID of the procedure to check<a name="line.1153"></a>
+<span class="sourceLineNo">1154</span>   * @return true if the procedure execution is started, otherwise false.<a name="line.1154"></a>
+<span class="sourceLineNo">1155</span>   */<a name="line.1155"></a>
+<span class="sourceLineNo">1156</span>  public boolean isStarted(long procId) {<a name="line.1156"></a>
+<span class="sourceLineNo">1157</span>    Procedure&lt;?&gt; proc = procedures.get(procId);<a name="line.1157"></a>
+<span class="sourceLineNo">1158</span>    if (proc == null) {<a name="line.1158"></a>
+<span class="sourceLineNo">1159</span>      return completed.get(procId) != null;<a name="line.1159"></a>
+<span class="sourceLineNo">1160</span>    }<a name="line.1160"></a>
+<span class="sourceLineNo">1161</span>    return proc.wasExecuted();<a name="line.1161"></a>
+<span class="sourceLineNo">1162</span>  }<a name="line.1162"></a>
+<span class="sourceLineNo">1163</span><a name="line.1163"></a>
+<span class="sourceLineNo">1164</span>  /**<a name="line.1164"></a>
+<span class="sourceLineNo">1165</span>   * Mark the specified completed procedure, as ready to remove.<a name="line.1165"></a>
+<span class="sourceLineNo">1166</span>   * @param procId the ID of the procedure to remove<a name="line.1166"></a>
+<span class="sourceLineNo">1167</span>   */<a name="line.1167"></a>
+<span class="sourceLineNo">1168</span>  public void removeResult(long procId) {<a name="line.1168"></a>
+<span class="sourceLineNo">1169</span>    CompletedProcedureRetainer&lt;TEnvironment&gt; retainer = completed.get(procId);<a name="line.1169"></a>
+<span class="sourceLineNo">1170</span>    if (retainer == null) {<a name="line.1170"></a>
+<span class="sourceLineNo">1171</span>      assert !procedures.containsKey(procId) : "pid=" + procId + " is still running";<a name="line.1171"></a>
+<span class="sourceLineNo">1172</span>      LOG.debug("pid={} already removed by the cleaner.", procId);<a name="line.1172"></a>
+<span class="sourceLineNo">1173</span>      return;<a name="line.1173"></a>
+<span class="sourceLineNo">1174</span>    }<a name="line.1174"></a>
+<span class="sourceLineNo">1175</span><a name="line.1175"></a>
+<span class="sourceLineNo">1176</span>    // The CompletedProcedureCleaner will take care of deletion, once the TTL is expired.<a name="line.1176"></a>
+<span class="sourceLineNo">1177</span>    retainer.setClientAckTime(EnvironmentEdgeManager.currentTime());<a name="line.1177"></a>
+<span class="sourceLineNo">1178</span>  }<a name="line.1178"></a>
+<span class="sourceLineNo">1179</span><a name="line.1179"></a>
+<span class="sourceLineNo">1180</span>  public Procedure&lt;TEnvironment&gt; getResultOrProcedure(long procId) {<a name="line.1180"></a>
+<span class="sourceLineNo">1181</span>    CompletedProcedureRetainer&lt;TEnvironment&gt; retainer = completed.get(procId);<a name="line.1181"></a>
+<span class="sourceLineNo">1182</span>    if (retainer == null) {<a name="line.1182"></a>
+<span class="sourceLineNo">1183</span>      return procedures.get(procId);<a name="line.1183"></a>
+<span class="sourceLineNo">1184</span>    } else {<a name="line.1184"></a>
+<span class="sourceLineNo">1185</span>      return retainer.getProcedure();<a name="line.1185"></a>
+<span class="sourceLineNo">1186</span>    }<a name="line.1186"></a>
+<span class="sourceLineNo">1187</span>  }<a name="line.1187"></a>
+<span class="sourceLineNo">1188</span><a name="line.1188"></a>
+<span class="sourceLineNo">1189</span>  /**<a name="line.1189"></a>
+<span class="sourceLineNo">1190</span>   * Check if the user is this procedure's owner<a name="line.1190"></a>
+<span class="sourceLineNo">1191</span>   * @param procId the target procedure<a name="line.1191"></a>
+<span class="sourceLineNo">1192</span>   * @param user the user<a name="line.1192"></a>
+<span class="sourceLineNo">1193</span>   * @return true if the user is the owner of the procedure,<a name="line.1193"></a>
+<span class="sourceLineNo">1194</span>   *   false otherwise or the owner is unknown.<a name="line.1194"></a>
+<span class="sourceLineNo">1195</span>   */<a name="line.1195"></a>
+<span class="sourceLineNo">1196</span>  public boolean isProcedureOwner(long procId, User user) {<a name="line.1196"></a>
+<span class="sourceLineNo">1197</span>    if (user == null) {<a name="line.1197"></a>
+<span class="sourceLineNo">1198</span>      return false;<a name="line.1198"></a>
+<span class="sourceLineNo">1199</span>    }<a name="line.1199"></a>
+<span class="sourceLineNo">1200</span>    final Procedure&lt;TEnvironment&gt; runningProc = procedures.get(procId);<a name="line.1200"></a>
+<span class="sourceLineNo">1201</span>    if (runningProc != null) {<a name="line.1201"></a>
+<span class="sourceLineNo">1202</span>      return runningProc.getOwner().equals(user.getShortName());<a name="line.1202"></a>
+<span class="sourceLineNo">1203</span>    }<a name="line.1203"></a>
+<span class="sourceLineNo">1204</span><a name="line.1204"></a>
+<span class="sourceLineNo">1205</span>    final CompletedProcedureRetainer&lt;TEnvironment&gt; retainer = completed.get(procId);<a name="line.1205"></a>
+<span class="sourceLineNo">1206</span>    if (retainer != null) {<a name="line.1206"></a>
+<span class="sourceLineNo">1207</span>      return retainer.getProcedure().getOwner().equals(user.getShortName());<a name="line.1207"></a>
+<span class="sourceLineNo">1208</span>    }<a name="line.1208"></a>
+<span class="sourceLineNo">1209</span><a name="line.1209"></a>
+<span class="sourceLineNo">1210</span>    // Procedure either does not exist or has already completed and got cleaned up.<a name="line.1210"></a>
+<span class="sourceLineNo">1211</span>    // At this time, we cannot check the owner of the procedure<a name="line.1211"></a>
+<span class="sourceLineNo">1212</span>    return false;<a name="line.1212"></a>
+<span class="sourceLineNo">1213</span>  }<a name="line.1213"></a>
+<span class="sourceLineNo">1214</span><a name="line.1214"></a>
+<span class="sourceLineNo">1215</span>  /**<a name="line.1215"></a>
+<span class="sourceLineNo">1216</span>   * Should only be used when starting up, where the procedure workers have not been started.<a name="line.1216"></a>
+<span class="sourceLineNo">1217</span>   * &lt;p/&gt;<a name="line.1217"></a>
+<span class="sourceLineNo">1218</span>   * If the procedure works has been started, the return values maybe changed when you are<a name="line.1218"></a>
+<span class="sourceLineNo">1219</span>   * processing it so usually this is not safe. Use {@link #getProcedures()} below for most cases as<a name="line.1219"></a>
+<span class="sourceLineNo">1220</span>   * it will do a copy, and also include the finished procedures.<a name="line.1220"></a>
 <span class="sourceLineNo">1221</span>   */<a name="line.1221"></a>
-<span class="sourceLineNo">1222</span>  public List&lt;Procedure&lt;TEnvironment&gt;&gt; getProcedures() {<a name="line.1222"></a>
-<span class="sourceLineNo">1223</span>    List&lt;Procedure&lt;TEnvironment&gt;&gt; procedureList =<a name="line.1223"></a>
-<span class="sourceLineNo">1224</span>      new ArrayList&lt;&gt;(procedures.size() + completed.size());<a name="line.1224"></a>
-<span class="sourceLineNo">1225</span>    procedureList.addAll(procedures.values());<a name="line.1225"></a>
-<span class="sourceLineNo">1226</span>    // Note: The procedure could show up twice in the list with different state, as<a name="line.1226"></a>
-<span class="sourceLineNo">1227</span>    // it could complete after we walk through procedures list and insert into<a name="line.1227"></a>
-<span class="sourceLineNo">1228</span>    // procedureList - it is ok, as we will use the information in the Procedure<a name="line.1228"></a>
-<span class="sourceLineNo">1229</span>    // to figure it out; to prevent this would increase the complexity of the logic.<a name="line.1229"></a>
-<span class="sourceLineNo">1230</span>    completed.values().stream().map(CompletedProcedureRetainer::getProcedure)<a name="line.1230"></a>
-<span class="sourceLineNo">1231</span>      .forEach(procedureList::add);<a name="line.1231"></a>
-<span class="sourceLineNo">1232</span>    return procedureList;<a name="line.1232"></a>
-<span class="sourceLineNo">1233</span>  }<a name="line.1233"></a>
-<span class="sourceLineNo">1234</span><a name="line.1234"></a>
-<span class="sourceLineNo">1235</span>  // ==========================================================================<a name="line.1235"></a>
-<span class="sourceLineNo">1236</span>  //  Listeners helpers<a name="line.1236"></a>
-<span class="sourceLineNo">1237</span>  // ==========================================================================<a name="line.1237"></a>
-<span class="sourceLineNo">1238</span>  public void registerListener(ProcedureExecutorListener listener) {<a name="line.1238"></a>
-<span class="sourceLineNo">1239</span>    this.listeners.add(listener);<a name="line.1239"></a>
-<span class="sourceLineNo">1240</span>  }<a name="line.1240"></a>
-<span class="sourceLineNo">1241</span><a name="line.1241"></a>
-<span class="sourceLineNo">1242</span>  public boolean unregisterListener(ProcedureExecutorListener listener) {<a name="line.1242"></a>
-<span class="sourceLineNo">1243</span>    return this.listeners.remove(listener);<a name="line.1243"></a>
-<span class="sourceLineNo">1244</span>  }<a name="line.1244"></a>
-<span class="sourceLineNo">1245</span><a name="line.1245"></a>
-<span class="sourceLineNo">1246</span>  private void sendProcedureLoadedNotification(final long procId) {<a name="line.1246"></a>
-<span class="sourceLineNo">1247</span>    if (!this.listeners.isEmpty()) {<a name="line.1247"></a>
-<span class="sourceLineNo">1248</span>      for (ProcedureExecutorListener listener: this.listeners) {<a name="line.1248"></a>
-<span class="sourceLineNo">1249</span>        try {<a name="line.1249"></a>
-<span class="sourceLineNo">1250</span>          listener.procedureLoaded(procId);<a name="line.1250"></a>
-<span class="sourceLineNo">1251</span>        } catch (Throwable e) {<a name="line.1251"></a>
-<span class="sourceLineNo">1252</span>          LOG.error("Listener " + listener + " had an error: " + e.getMessage(), e);<a name="line.1252"></a>
-<span class="sourceLineNo">1253</span>        }<a name="line.1253"></a>
-<span class="sourceLineNo">1254</span>      }<a name="line.1254"></a>
-<span class="sourceLineNo">1255</span>    }<a name="line.1255"></a>
-<span class="sourceLineNo">1256</span>  }<a name="line.1256"></a>
-<span class="sourceLineNo">1257</span><a name="line.1257"></a>
-<span class="sourceLineNo">1258</span>  private void sendProcedureAddedNotification(final long procId) {<a name="line.1258"></a>
-<span class="sourceLineNo">1259</span>    if (!this.listeners.isEmpty()) {<a name="line.1259"></a>
-<span class="sourceLineNo">1260</span>      for (ProcedureExecutorListener listener: this.listeners) {<a name="line.1260"></a>
-<span class="sourceLineNo">1261</span>        try {<a name="line.1261"></a>
-<span class="sourceLineNo">1262</span>          listener.procedureAdded(procId);<a name="line.1262"></a>
-<span class="sourceLineNo">1263</span>        } catch (Throwable e) {<a name="line.1263"></a>
-<span class="sourceLineNo">1264</span>          LOG.error("Listener " + listener + " had an error: " + e.getMessage(), e);<a name="line.1264"></a>
-<span class="sourceLineNo">1265</span>        }<a name="line.1265"></a>
-<span class="sourceLineNo">1266</span>      }<a name="line.1266"></a>
-<span class="sourceLineNo">1267</span>    }<a name="line.1267"></a>
-<span class="sourceLineNo">1268</span>  }<a name="line.1268"></a>
-<span class="sourceLineNo">1269</span><a name="line.1269"></a>
-<span class="sourceLineNo">1270</span>  private void sendProcedureFinishedNotification(final long procId) {<a name="line.1270"></a>
-<span class="sourceLineNo">1271</span>    if (!this.listeners.isEmpty()) {<a name="line.1271"></a>
-<span class="sourceLineNo">1272</span>      for (ProcedureExecutorListener listener: this.listeners) {<a name="line.1272"></a>
-<span class="sourceLineNo">1273</span>        try {<a name="line.1273"></a>
-<span class="sourceLineNo">1274</span>          listener.procedureFinished(procId);<a name="line.1274"></a>
-<span class="sourceLineNo">1275</span>        } catch (Throwable e) {<a name="line.1275"></a>
-<span class="sourceLineNo">1276</span>          LOG.error("Listener " + listener + " had an error: " + e.getMessage(), e);<a name="line.1276"></a>
-<span class="sourceLineNo">1277</span>        }<a name="line.1277"></a>
-<span class="sourceLineNo">1278</span>      }<a name="line.1278"></a>
-<span class="sourceLineNo">1279</span>    }<a name="line.1279"></a>
-<span class="sourceLineNo">1280</span>  }<a name="line.1280"></a>
-<span class="sourceLineNo">1281</span><a name="line.1281"></a>
-<span class="sourceLineNo">1282</span>  // ==========================================================================<a name="line.1282"></a>
-<span class="sourceLineNo">1283</span>  //  Procedure IDs helpers<a name="line.1283"></a>
-<span class="sourceLineNo">1284</span>  // ==========================================================================<a name="line.1284"></a>
-<span class="sourceLineNo">1285</span>  private long nextProcId() {<a name="line.1285"></a>
-<span class="sourceLineNo">1286</span>    long procId = lastProcId.incrementAndGet();<a name="line.1286"></a>
-<span class="sourceLineNo">1287</span>    if (procId &lt; 0) {<a name="line.1287"></a>
-<span class="sourceLineNo">1288</span>      while (!lastProcId.compareAndSet(procId, 0)) {<a name="line.1288"></a>
-<span class="sourceLineNo">1289</span>        procId = lastProcId.get();<a name="line.1289"></a>
-<span class="sourceLineNo">1290</span>        if (procId &gt;= 0)<a name="line.1290"></a>
-<span class="sourceLineNo">1291</span>          break;<a name="line.1291"></a>
-<span class="sourceLineNo">1292</span>      }<a name="line.1292"></a>
-<span class="sourceLineNo">1293</span>      while (procedures.containsKey(procId)) {<a name="line.1293"></a>
-<span class="sourceLineNo">1294</span>        procId = lastProcId.incrementAndGet();<a name="line.1294"></a>
-<span class="sourceLineNo">1295</span>      }<a name="line.1295"></a>
-<span class="sourceLineNo">1296</span>    }<a name="line.1296"></a>
-<span class="sourceLineNo">1297</span>    assert procId &gt;= 0 : "Invalid procId " + procId;<a name="line.1297"></a>
-<span class="sourceLineNo">1298</span>    return procId;<a name="line.1298"></a>
-<span class="sourceLineNo">1299</span>  }<a name="line.1299"></a>
-<span class="sourceLineNo">1300</span><a name="line.1300"></a>
-<span class="sourceLineNo">1301</span>  @VisibleForTesting<a name="line.1301"></a>
-<span class="sourceLineNo">1302</span>  protected long getLastProcId() {<a name="line.1302"></a>
-<span class="sourceLineNo">1303</span>    return lastProcId.get();<a name="line.1303"></a>
-<span class="sourceLineNo">1304</span>  }<a name="line.1304"></a>
-<span class="sourceLineNo">1305</span><a name="line.1305"></a>
-<span class="sourceLineNo">1306</span>  @VisibleForTesting<a name="line.1306"></a>
-<span class="sourceLineNo">1307</span>  public Set&lt;Long&gt; getActiveProcIds() {<a name="line.1307"></a>
-<span class="sourceLineNo">1308</span>    return procedures.keySet();<a name="line.1308"></a>
-<span class="sourceLineNo">1309</span>  }<a name="line.1309"></a>
-<span class="sourceLineNo">1310</span><a name="line.1310"></a>
-<span class="sourceLineNo">1311</span>  Long getRootProcedureId(Procedure&lt;TEnvironment&gt; proc) {<a name="line.1311"></a>
-<span class="sourceLineNo">1312</span>    return Procedure.getRootProcedureId(procedures, proc);<a name="line.1312"></a>
-<span class="sourceLineNo">1313</span>  }<a name="line.1313"></a>
-<span class="sourceLineNo">1314</span><a name="line.1314"></a>
-<span class="sourceLineNo">1315</span>  // ==========================================================================<a name="line.1315"></a>
-<span class="sourceLineNo">1316</span>  //  Executions<a name="line.1316"></a>
-<span class="sourceLineNo">1317</span>  // ==========================================================================<a name="line.1317"></a>
-<span class="sourceLineNo">1318</span>  private void executeProcedure(Procedure&lt;TEnvironment&gt; proc) {<a name="line.1318"></a>
-<span class="sourceLineNo">1319</span>    if (proc.isFinished()) {<a name="line.1319"></a>
-<span class="sourceLineNo">1320</span>      LOG.debug("{} is already finished, skipping execution", proc);<a name="line.1320"></a>
-<span class="sourceLineNo">1321</span>      return;<a name="line.1321"></a>
-<span class="sourceLineNo">1322</span>    }<a name="line.1322"></a>
-<span class="sourceLineNo">1323</span>    final Long rootProcId = getRootProcedureId(proc);<a name="line.1323"></a>
-<span class="sourceLineNo">1324</span>    if (rootProcId == null) {<a name="line.1324"></a>
-<span class="sourceLineNo">1325</span>      // The 'proc' was ready to run but the root procedure was rolledback<a name="line.1325"></a>
-<span class="sourceLineNo">1326</span>      LOG.warn("Rollback because parent is done/rolledback proc=" + proc);<a name="line.1326"></a>
-<span class="sourceLineNo">1327</span>      executeRollback(proc);<a name="line.1327"></a>
-<span class="sourceLineNo">1328</span>      return;<a name="line.1328"></a>
-<span class="sourceLineNo">1329</span>    }<a name="line.1329"></a>
-<span class="sourceLineNo">1330</span><a name="line.1330"></a>
-<span class="sourceLineNo">1331</span>    RootProcedureState&lt;TEnvironment&gt; procStack = rollbackStack.get(rootProcId);<a name="line.1331"></a>
-<span class="sourceLineNo">1332</span>    if (procStack == null) {<a name="line.1332"></a>
-<span class="sourceLineNo">1333</span>      LOG.warn("RootProcedureState is null for " + proc.getProcId());<a name="line.1333"></a>
-<span class="sourceLineNo">1334</span>      return;<a name="line.1334"></a>
-<span class="sourceLineNo">1335</span>    }<a name="line.1335"></a>
-<span class="sourceLineNo">1336</span>    do {<a name="line.1336"></a>
-<span class="sourceLineNo">1337</span>      // Try to acquire the execution<a name="line.1337"></a>
-<span class="sourceLineNo">1338</span>      if (!procStack.acquire(proc)) {<a name="line.1338"></a>
-<span class="sourceLineNo">1339</span>        if (procStack.setRollback()) {<a name="line.1339"></a>
-<span class="sourceLineNo">1340</span>          // we have the 'rollback-lock' we can start rollingback<a name="line.1340"></a>
-<span class="sourceLineNo">1341</span>          switch (executeRollback(rootProcId, procStack)) {<a name="line.1341"></a>
-<span class="sourceLineNo">1342</span>            case LOCK_ACQUIRED:<a name="line.1342"></a>
-<span class="sourceLineNo">1343</span>              break;<a name="line.1343"></a>
-<span class="sourceLineNo">1344</span>            case LOCK_YIELD_WAIT:<a name="line.1344"></a>
-<span class="sourceLineNo">1345</span>              procStack.unsetRollback();<a name="line.1345"></a>
-<span class="sourceLineNo">1346</span>              scheduler.yield(proc);<a name="line.1346"></a>
-<span class="sourceLineNo">1347</span>              break;<a name="line.1347"></a>
-<span class="sourceLineNo">1348</span>            case LOCK_EVENT_WAIT:<a name="line.1348"></a>
-<span class="sourceLineNo">1349</span>              LOG.info("LOCK_EVENT_WAIT rollback..." + proc);<a name="line.1349"></a>
-<span class="sourceLineNo">1350</span>              procStack.unsetRollback();<a name="line.1350"></a>
+<span class="sourceLineNo">1222</span>  public Collection&lt;Procedure&lt;TEnvironment&gt;&gt; getActiveProceduresNoCopy() {<a name="line.1222"></a>
+<span class="sourceLineNo">1223</span>    return procedures.values();<a name="line.1223"></a>
+<span class="sourceLineNo">1224</span>  }<a name="line.1224"></a>
+<span class="sourceLineNo">1225</span><a name="line.1225"></a>
+<span class="sourceLineNo">1226</span>  /**<a name="line.1226"></a>
+<span class="sourceLineNo">1227</span>   * Get procedures.<a name="line.1227"></a>
+<span class="sourceLineNo">1228</span>   * @return the procedures in a list<a name="line.1228"></a>
+<span class="sourceLineNo">1229</span>   */<a name="line.1229"></a>
+<span class="sourceLineNo">1230</span>  public List&lt;Procedure&lt;TEnvironment&gt;&gt; getProcedures() {<a name="line.1230"></a>
+<span class="sourceLineNo">1231</span>    List&lt;Procedure&lt;TEnvironment&gt;&gt; procedureList =<a name="line.1231"></a>
+<span class="sourceLineNo">1232</span>      new ArrayList&lt;&gt;(procedures.size() + completed.size());<a name="line.1232"></a>
+<span class="sourceLineNo">1233</span>    procedureList.addAll(procedures.values());<a name="line.1233"></a>
+<span class="sourceLineNo">1234</span>    // Note: The procedure could show up twice in the list with different state, as<a name="line.1234"></a>
+<span class="sourceLineNo">1235</span>    // it could complete after we walk through procedures list and insert into<a name="line.1235"></a>
+<span class="sourceLineNo">1236</span>    // procedureList - it is ok, as we will use the information in the Procedure<a name="line.1236"></a>
+<span class="sourceLineNo">1237</span>    // to figure it out; to prevent this would increase the complexity of the logic.<a name="line.1237"></a>
+<span class="sourceLineNo">1238</span>    completed.values().stream().map(CompletedProcedureRetainer::getProcedure)<a name="line.1238"></a>
+<span class="sourceLineNo">1239</span>      .forEach(procedureList::add);<a name="line.1239"></a>
+<span class="sourceLineNo">1240</span>    return procedureList;<a name="line.1240"></a>
+<span class="sourceLineNo">1241</span>  }<a name="line.1241"></a>
+<span class="sourceLineNo">1242</span><a name="line.1242"></a>
+<span class="sourceLineNo">1243</span>  // ==========================================================================<a name="line.1243"></a>
+<span class="sourceLineNo">1244</span>  //  Listeners helpers<a name="line.1244"></a>
+<span class="sourceLineNo">1245</span>  // ==========================================================================<a name="line.1245"></a>
+<span class="sourceLineNo">1246</span>  public void registerListener(ProcedureExecutorListener listener) {<a name="line.1246"></a>
+<span class="sourceLineNo">1247</span>    this.listeners.add(listener);<a name="line.1247"></a>
+<span class="sourceLineNo">1248</span>  }<a name="line.1248"></a>
+<span class="sourceLineNo">1249</span><a name="line.1249"></a>
+<span class="sourceLineNo">1250</span>  public boolean unregisterListener(ProcedureExecutorListener listener) {<a name="line.1250"></a>
+<span class="sourceLineNo">1251</span>    return this.listeners.remove(listener);<a name="line.1251"></a>
+<span class="sourceLineNo">1252</span>  }<a name="line.1252"></a>
+<span class="sourceLineNo">1253</span><a name="line.1253"></a>
+<span class="sourceLineNo">1254</span>  private void sendProcedureLoadedNotification(final long procId) {<a name="line.1254"></a>
+<span class="sourceLineNo">1255</span>    if (!this.listeners.isEmpty()) {<a name="line.1255"></a>
+<span class="sourceLineNo">1256</span>      for (ProcedureExecutorListener listener: this.listeners) {<a name="line.1256"></a>
+<span class="sourceLineNo">1257</span>        try {<a name="line.1257"></a>
+<span class="sourceLineNo">1258</span>          listener.procedureLoaded(procId);<a name="line.1258"></a>
+<span class="sourceLineNo">1259</span>        } catch (Throwable e) {<a name="line.1259"></a>
+<span class="sourceLineNo">1260</span>          LOG.error("Listener " + listener + " had an error: " + e.getMessage(), e);<a name="line.1260"></a>
+<span class="sourceLineNo">1261</span>        }<a name="line.1261"></a>
+<span class="sourceLineNo">1262</span>      }<a name="line.1262"></a>
+<span class="sourceLineNo">1263</span>    }<a name="line.1263"></a>
+<span class="sourceLineNo">1264</span>  }<a name="line.1264"></a>
+<span class="sourceLineNo">1265</span><a name="line.1265"></a>
+<span class="sourceLineNo">1266</span>  private void sendProcedureAddedNotification(final long procId) {<a name="line.1266"></a>
+<span class="sourceLineNo">1267</span>    if (!this.listeners.isEmpty()) {<a name="line.1267"></a>
+<span class="sourceLineNo">1268</span>      for (ProcedureExecutorListener listener: this.listeners) {<a name="line.1268"></a>
+<span class="sourceLineNo">1269</span>        try {<a name="line.1269"></a>
+<span class="sourceLineNo">1270</span>          listener.procedureAdded(procId);<a name="line.1270"></a>
+<span class="sourceLineNo">1271</span>        } catch (Throwable e) {<a name="line.1271"></a>
+<span class="sourceLineNo">1272</span>          LOG.error("Listener " + listener + " had an error: " + e.getMessage(), e);<a name="line.1272"></a>
+<span class="sourceLineNo">1273</span>        }<a name="line.1273"></a>
+<span class="sourceLineNo">1274</span>      }<a name="line.1274"></a>
+<span class="sourceLineNo">1275</span>    }<a name="line.1275"></a>
+<span class="sourceLineNo">1276</span>  }<a name="line.1276"></a>
+<span class="sourceLineNo">1277</span><a name="line.1277"></a>
+<span class="sourceLineNo">1278</span>  private void sendProcedureFinishedNotification(final long procId) {<a name="line.1278"></a>
+<span class="sourceLineNo">1279</span>    if (!this.listeners.isEmpty()) {<a name="line.1279"></a>
+<span class="sourceLineNo">1280</span>      for (ProcedureExecutorListener listener: this.listeners) {<a name="line.1280"></a>
+<span class="sourceLineNo">1281</span>        try {<a name="line.1281"></a>
+<span class="sourceLineNo">1282</span>          listener.procedureFinished(procId);<a name="line.1282"></a>
+<span class="sourceLineNo">1283</span>        } catch (Throwable e) {<a name="line.1283"></a>
+<span class="sourceLineNo">1284</span>          LOG.error("Listener " + listener + " had an error: " + e.getMessage(), e);<a name="line.1284"></a>
+<span class="sourceLineNo">1285</span>        }<a name="line.1285"></a>
+<span class="sourceLineNo">1286</span>      }<a name="line.1286"></a>
+<span class="sourceLineNo">1287</span>    }<a name="line.1287"></a>
+<span class="sourceLineNo">1288</span>  }<a name="line.1288"></a>
+<span class="sourceLineNo">1289</span><a name="line.1289"></a>
+<span class="sourceLineNo">1290</span>  // ==========================================================================<a name="line.1290"></a>
+<span class="sourceLineNo">1291</span>  //  Procedure IDs helpers<a name="line.1291"></a>
+<span class="sourceLineNo">1292</span>  // ==========================================================================<a name="line.1292"></a>
+<span class="sourceLineNo">1293</span>  private long nextProcId() {<a name="line.1293"></a>
+<span class="sourceLineNo">1294</span>    long procId = lastProcId.incrementAndGet();<a name="line.1294"></a>
+<span class="sourceLineNo">1295</span>    if (procId &lt; 0) {<a name="line.1295"></a>
+<span class="sourceLineNo">1296</span>      while (!lastProcId.compareAndSet(procId, 0)) {<a name="line.1296"></a>
+<span class="sourceLineNo">1297</span>        procId = lastProcId.get();<a name="line.1297"></a>
+<span class="sourceLineNo">1298</span>        if (procId &gt;= 0)<a name="line.1298"></a>
+<span class="sourceLineNo">1299</span>          break;<a name="line.1299"></a>
+<span class="sourceLineNo">1300</span>      }<a name="line.1300"></a>
+<span class="sourceLineNo">1301</span>      while (procedures.containsKey(procId)) {<a name="line.1301"></a>
+<span class="sourceLineNo">1302</span>        procId = lastProcId.incrementAndGet();<a name="line.1302"></a>
+<span class="sourceLineNo">1303</span>      }<a name="line.1303"></a>
+<span class="sourceLineNo">1304</span>    }<a name="line.1304"></a>
+<span class="sourceLineNo">1305</span>    assert procId &gt;= 0 : "Invalid procId " + procId;<a name="line.1305"></a>
+<span class="sourceLineNo">1306</span>    return procId;<a name="line.1306"></a>
+<span class="sourceLineNo">1307</span>  }<a name="line.1307"></a>
+<span class="sourceLineNo">1308</span><a name="line.1308"></a>
+<span class="sourceLineNo">1309</span>  @VisibleForTesting<a name="line.1309"></a>
+<span class="sourceLineNo">1310</span>  protected long getLastProcId() {<a name="line.1310"></a>
+<span class="sourceLineNo">1311</span>    return lastProcId.get();<a name="line.1311"></a>
+<span class="sourceLineNo">1312</span>  }<a name="line.1312"></a>
+<span class="sourceLineNo">1313</span><a name="line.1313"></a>
+<span class="sourceLineNo">1314</span>  @VisibleForTesting<a name="line.1314"></a>
+<span class="sourceLineNo">1315</span>  public Set&lt;Long&gt; getActiveProcIds() {<a name="line.1315"></a>
+<span class="sourceLineNo">1316</span>    return procedures.keySet();<a name="line.1316"></a>
+<span class="sourceLineNo">1317</span>  }<a name="line.1317"></a>
+<span class="sourceLineNo">1318</span><a name="line.1318"></a>
+<span class="sourceLineNo">1319</span>  Long getRootProcedureId(Procedure&lt;TEnvironment&gt; proc) {<a name="line.1319"></a>
+<span class="sourceLineNo">1320</span>    return Procedure.getRootProcedureId(procedures, proc);<a name="line.1320"></a>
+<span class="sourceLineNo">1321</span>  }<a name="line.1321"></a>
+<span class="sourceLineNo">1322</span><a name="line.1322"></a>
+<span class="sourceLineNo">1323</span>  // ==========================================================================<a name="line.1323"></a>
+<span class="sourceLineNo">1324</span>  //  Executions<a name="line.1324"></a>
+<span class="sourceLineNo">1325</span>  // ==========================================================================<a name="line.1325"></a>
+<span class="sourceLineNo">1326</span>  private void executeProcedure(Procedure&lt;TEnvironment&gt; proc) {<a name="line.1326"></a>
+<span class="sourceLineNo">1327</span>    if (proc.isFinished()) {<a name="line.1327"></a>
+<span class="sourceLineNo">1328</span>      LOG.debug("{} is already finished, skipping execution", proc);<a name="line.1328"></a>
+<span class="sourceLineNo">1329</span>      return;<a name="line.1329"></a>
+<span class="sourceLineNo">1330</span>    }<a name="line.1330"></a>
+<span class="sourceLineNo">1331</span>    final Long rootProcId = getRootProcedureId(proc);<a name="line.1331"></a>
+<span class="sourceLineNo">1332</span>    if (rootProcId == null) {<a name="line.1332"></a>
+<span class="sourceLineNo">1333</span>      // The 'proc' was ready to run but the root procedure was rolledback<a name="line.1333"></a>
+<span class="sourceLineNo">1334</span>      LOG.warn("Rollback because parent is done/rolledback proc=" + proc);<a name="line.1334"></a>
+<span class="sourceLineNo">1335</span>      executeRollback(proc);<a name="line.1335"></a>
+<span class="sourceLineNo">1336</span>      return;<a name="line.1336"></a>
+<span class="sourceLineNo">1337</span>    }<a name="line.1337"></a>
+<span class="sourceLineNo">1338</span><a name="line.1338"></a>
+<span class="sourceLineNo">1339</span>    RootProcedureState&lt;TEnvironment&gt; procStack = rollbackStack.get(rootProcId);<a name="line.1339"></a>
+<span class="sourceLineNo">1340</span>    if (procStack == null) {<a name="line.1340"></a>
+<span class="sourceLineNo">1341</span>      LOG.warn("RootProcedureState is null for " + proc.getProcId());<a name="line.1341"></a>
+<span class="sourceLineNo">1342</span>      return;<a name="line.1342"></a>
+<span class="sourceLineNo">1343</span>    }<a name="line.1343"></a>
+<span class="sourceLineNo">1344</span>    do {<a name="line.1344"></a>
+<span class="sourceLineNo">1345</span>      // Try to acquire the execution<a name="line.1345"></a>
+<span class="sourceLineNo">1346</span>      if (!procStack.acquire(proc)) {<a name="line.1346"></a>
+<span class="sourceLineNo">1347</span>        if (procStack.setRollback()) {<a name="line.1347"></a>
+<span class="sourceLineNo">1348</span>          // we have the 'rollback-lock' we can start rollingback<a name="line.1348"></a>
+<span class="sourceLineNo">1349</span>          switch (executeRollback(rootProcId, procStack)) {<a name="line.1349"></a>
+<span class="sourceLineNo">1350</span>            case LOCK_ACQUIRED:<a name="line.1350"></a>
 <span class="sourceLineNo">1351</span>              break;<a name="line.1351"></a>
-<span class="sourceLineNo">1352</span>            default:<a name="line.1352"></a>
-<span class="sourceLineNo">1353</span>              throw new UnsupportedOperationException();<a name="line.1353"></a>
-<span class="sourceLineNo">1354</span>          }<a name="line.1354"></a>
-<span class="sourceLineNo">1355</span>        } else {<a name="line.1355"></a>
-<span class="sourceLineNo">1356</span>          // if we can't rollback means that some child is still running.<a name="line.1356"></a>
-<span class="sourceLineNo">1357</span>          // the rollback will be executed after all the children are done.<a name="line.1357"></a>
-<span class="sourceLineNo">1358</span>          // If the procedure was never executed, remove and mark it as rolledback.<a name="line.1358"></a>
-<span class="sourceLineNo">1359</span>          if (!proc.wasExecuted()) {<a name="line.1359"></a>
-<span class="sourceLineNo">1360</span>            switch (executeRollback(proc)) {<a name="line.1360"></a>
-<span class="sourceLineNo">1361</span>              case LOCK_ACQUIRED:<a name="line.1361"></a>
-<span class="sourceLineNo">1362</span>                break;<a name="line.1362"></a>
-<span class="sourceLineNo">1363</span>              case LOCK_YIELD_WAIT:<a name="line.1363"></a>
-<span class="sourceLineNo">1364</span>                scheduler.yield(proc);<a name="line.1364"></a>
-<span class="sourceLineNo">1365</span>                break;<a name="line.1365"></a>
-<span class="sourceLineNo">1366</span>              case LOCK_EVENT_WAIT:<a name="line.1366"></a>
-<span class="sourceLineNo">1367</span>                LOG.info("LOCK_EVENT_WAIT can't rollback child running?..." + proc);<a name="line.1367"></a>
-<span class="sourceLineNo">1368</span>                break;<a name="line.1368"></a>
-<span class="sourceLineNo">1369</span>              default:<a name="line.1369"></a>
-<span class="sourceLineNo">1370</span>                throw new UnsupportedOperationException();<a name="line.1370"></a>
-<span class="sourceLineNo">1371</span>            }<a name="line.1371"></a>
-<span class="sourceLineNo">1372</span>          }<a name="line.1372"></a>
-<span class="sourceLineNo">1373</span>        }<a name="line.1373"></a>
-<span class="sourceLineNo">1374</span>        break;<a name="line.1374"></a>
-<span class="sourceLineNo">1375</span>      }<a name="line.1375"></a>
-<span class="sourceLineNo">1376</span><a name="line.1376"></a>
-<span class="sourceLineNo">1377</span>      // Execute the procedure<a name="line.1377"></a>
-<span class="sourceLineNo">1378</span>      assert proc.getState() == ProcedureState.RUNNABLE : proc;<a name="line.1378"></a>
-<span class="sourceLineNo">1379</span>      // Note that lock is NOT about concurrency but rather about ensuring<a name="line.1379"></a>
-<span class="sourceLineNo">1380</span>      // ownership of a procedure of an entity such as a region or table<a name="line.1380"></a>
-<span class="sourceLineNo">1381</span>      LockState lockState = acquireLock(proc);<a name="line.1381"></a>
-<span class="sourceLineNo">1382</span>      switch (lockState) {<a name="line.1382"></a>
-<span class="sourceLineNo">1383</span>        case LOCK_ACQUIRED:<a name="line.1383"></a>
-<span class="sourceLineNo">1384</span>          execProcedure(procStack, proc);<a name="line.1384"></a>
-<span class="sourceLineNo">1385</span>          break;<a name="line.1385"></a>
-<span class="sourceLineNo">1386</span>        case LOCK_YIELD_WAIT:<a name="line.1386"></a>
-<span class="sourceLineNo">1387</span>          LOG.info(lockState + " " + proc);<a name="line.1387"></a>
-<span class="sourceLineNo">1388</span>          scheduler.yield(proc);<a name="line.1388"></a>
-<span class="sourceLineNo">1389</span>          break;<a name="line.1389"></a>
-<span class="sourceLineNo">1390</span>        case LOCK_EVENT_WAIT:<a name="line.1390"></a>
-<span class="sourceLineNo">1391</span>          // Someone will wake us up when the lock is available<a name="line.1391"></a>
-<span class="sourceLineNo">1392</span>          LOG.debug(lockState + " " + proc);<a name="line.1392"></a>
+<span class="sourceLineNo">1352</span>            case LOCK_YIELD_WAIT:<a name="line.1352"></a>
+<span class="sourceLineNo">1353</span>              procStack.unsetRollback();<a name="line.1353"></a>
+<span class="sourceLineNo">1354</span>              scheduler.yield(proc);<a name="line.1354"></a>
+<span class="sourceLineNo">1355</span>              break;<a name="line.1355"></a>
+<span class="sourceLineNo">1356</span>            case LOCK_EVENT_WAIT:<a name="line.1356"></a>
+<span class="sourceLineNo">1357</span>              LOG.info("LOCK_EVENT_WAIT rollback..." + proc);<a name="line.1357"></a>
+<span class="sourceLineNo">1358</span>              procStack.unsetRollback();<a name="line.1358"></a>
+<span class="sourceLineNo">1359</span>              break;<a name="line.1359"></a>
+<span class="sourceLineNo">1360</span>            default:<a name="line.1360"></a>
+<span class="sourceLineNo">1361</span>              throw new UnsupportedOperationException();<a name="line.1361"></a>
+<span class="sourceLineNo">1362</span>          }<a name="line.1362"></a>
+<span class="sourceLineNo">1363</span>        } else {<a name="line.1363"></a>
+<span class="sourceLineNo">1364</span>          // if we can't rollback means that some child is still running.<a name="line.1364"></a>
+<span class="sourceLineNo">1365</span>          // the rollback will be executed after all the children are done.<a name="line.1365"></a>
+<span class="sourceLineNo">1366</span>          // If the procedure was never executed, remove and mark it as rolledback.<a name="line.1366"></a>
+<span class="sourceLineNo">1367</span>          if (!proc.wasExecuted()) {<a name="line.1367"></a>
+<span class="sourceLineNo">1368</span>            switch (executeRollback(proc)) {<a name="line.1368"></a>
+<span class="sourceLineNo">1369</span>              case LOCK_ACQUIRED:<a name="line.1369"></a>
+<span class="sourceLineNo">1370</span>                break;<a name="line.1370"></a>
+<span class="sourceLineNo">1371</span>              case LOCK_YIELD_WAIT:<a name="line.1371"></a>
+<span class="sourceLineNo">1372</span>                scheduler.yield(proc);<a name="line.1372"></a>
+<span class="sourceLineNo">1373</span>                break;<a name="line.1373"></a>
+<span class="sourceLineNo">1374</span>              case LOCK_EVENT_WAIT:<a name="line.1374"></a>
+<span class="sourceLineNo">1375</span>                LOG.info("LOCK_EVENT_WAIT can't rollback child running?..." + proc);<a name="line.1375"></a>
+<span class="sourceLineNo">1376</span>                break;<a name="line.1376"></a>
+<span class="sourceLineNo">1377</span>              default:<a name="line.1377"></a>
+<span class="sourceLineNo">1378</span>                throw new UnsupportedOperationException();<a name="line.1378"></a>
+<span class="sourceLineNo">1379</span>            }<a name="line.1379"></a>
+<span class="sourceLineNo">1380</span>          }<a name="line.1380"></a>
+<span class="sourceLineNo">1381</span>        }<a name="line.1381"></a>
+<span class="sourceLineNo">1382</span>        break;<a name="line.1382"></a>
+<span class="sourceLineNo">1383</span>      }<a name="line.1383"></a>
+<span class="sourceLineNo">1384</span><a name="line.1384"></a>
+<span class="sourceLineNo">1385</span>      // Execute the procedure<a name="line.1385"></a>
+<span class="sourceLineNo">1386</span>      assert proc.getState() == ProcedureState.RUNNABLE : proc;<a name="line.1386"></a>
+<span class="sourceLineNo">1387</span>      // Note that lock is NOT about concurrency but rather about ensuring<a name="line.1387"></a>
+<span class="sourceLineNo">1388</span>      // ownership of a procedure of an entity such as a region or table<a name="line.1388"></a>
+<span class="sourceLineNo">1389</span>      LockState lockState = acquireLock(proc);<a name="line.1389"></a>
+<span class="sourceLineNo">1390</span>      switch (lockState) {<a name="line.1390"></a>
+<span class="sourceLineNo">1391</span>        case LOCK_ACQUIRED:<a name="line.1391"></a>
+<span class="sourceLineNo">1392</span>          execProcedure(procStack, proc);<a name="line.1392"></a>
 <span class="sourceLineNo">1393</span>          break;<a name="line.1393"></a>
-<span class="sourceLineNo">1394</span>        default:<a name="line.1394"></a>
-<span class="sourceLineNo">1395</span>          throw new UnsupportedOperationException();<a name="line.1395"></a>
-<span class="sourceLineNo">1396</span>      }<a name="line.1396"></a>
-<span class="sourceLineNo">1397</span>      procStack.release(proc);<a name="line.1397"></a>
-<span class="sourceLineNo">1398</span><a name="line.1398"></a>
-<span class="sourceLineNo">1399</span>      if (proc.isSuccess()) {<a name="line.1399"></a>
-<span class="sourceLineNo">1400</span>        // update metrics on finishing the procedure<a name="line.1400"></a>
-<span class="sourceLineNo">1401</span>        proc.updateMetricsOnFinish(getEnvironment(), proc.elapsedTime(), true);<a name="line.1401"></a>
-<span class="sourceLineNo">1402</span>        LOG.info("Finished " + proc + " in " + StringUtils.humanTimeDiff(proc.elapsedTime()));<a name="line.1402"></a>
-<span class="sourceLineNo">1403</span>        // Finalize the procedure state<a name="line.1403"></a>
-<span class="sourceLineNo">1404</span>        if (proc.getProcId() == rootProcId) {<a name="line.1404"></a>
-<span class="sourceLineNo">1405</span>          procedureFinished(proc);<a name="line.1405"></a>
-<span class="sourceLineNo">1406</span>        } else {<a name="line.1406"></a>
-<span class="sourceLineNo">1407</span>          execCompletionCleanup(proc);<a name="line.1407"></a>
-<span class="sourceLineNo">1408</span>        }<a name="line.1408"></a>
-<span class="sourceLineNo">1409</span>        break;<a name="line.1409"></a>
-<span class="sourceLineNo">1410</span>      }<a name="line.1410"></a>
-<span class="sourceLineNo">1411</span>    } while (procStack.isFailed());<a name="line.1411"></a>
-<span class="sourceLineNo">1412</span>  }<a name="line.1412"></a>
-<span class="sourceLineNo">1413</span><a name="line.1413"></a>
-<span class="sourceLineNo">1414</span>  private LockState acquireLock(Procedure&lt;TEnvironment&gt; proc) {<a name="line.1414"></a>
-<span class="sourceLineNo">1415</span>    TEnvironment env = getEnvironment();<a name="line.1415"></a>
-<span class="sourceLineNo">1416</span>    // if holdLock is true, then maybe we already have the lock, so just return LOCK_ACQUIRED if<a name="line.1416"></a>
-<span class="sourceLineNo">1417</span>    // hasLock is true.<a name="line.1417"></a>
-<span class="sourceLineNo">1418</span>    if (proc.hasLock()) {<a name="line.1418"></a>
-<span class="sourceLineNo">1419</span>      return LockState.LOCK_ACQUIRED;<a name="line.1419"></a>
-<span class="sourceLineNo">1420</span>    }<a name="line.1420"></a>
-<span class="sourceLineNo">1421</span>    return proc.doAcquireLock(env, store);<a name="line.1421"></a>
-<span class="sourceLineNo">1422</span>  }<a name="line.1422"></a>
-<span class="sourceLineNo">1423</span><a name="line.1423"></a>
-<span class="sourceLineNo">1424</span>  private void releaseLock(Procedure&lt;TEnvironment&gt; proc, boolean force) {<a name="line.1424"></a>
-<span class="sourceLineNo">1425</span>    TEnvironment env = getEnvironment();<a name="line.1425"></a>
-<span class="sourceLineNo">1426</span>    // For how the framework works, we know that we will always have the lock<a name="line.1426"></a>
-<span class="sourceLineNo">1427</span>    // when we call releaseLock(), so we can avoid calling proc.hasLock()<a name="line.1427"></a>
-<span class="sourceLineNo">1428</span>    if (force || !proc.holdLock(env) || proc.isFinished()) {<a name="line.1428"></a>
-<span class="sourceLineNo">1429</span>      proc.doReleaseLock(env, store);<a name="line.1429"></a>
-<span class="sourceLineNo">1430</span>    }<a name="line.1430"></a>
-<span class="sourceLineNo">1431</span>  }<a name="line.1431"></a>
-<span class="sourceLineNo">1432</span><a name="line.1432"></a>
-<span class="sourceLineNo">1433</span>  /**<a name="line.1433"></a>
-<span class="sourceLineNo">1434</span>   * Execute the rollback of the full procedure stack. Once the procedure is rolledback, the<a name="line.1434"></a>
-<span class="sourceLineNo">1435</span>   * root-procedure will be visible as finished to user, and the result will be the fatal exception.<a name="line.1435"></a>
-<span class="sourceLineNo">1436</span>   */<a name="line.1436"></a>
-<span class="sourceLineNo">1437</span>  private LockState executeRollback(long rootProcId, RootProcedureState&lt;TEnvironment&gt; procStack) {<a name="line.1437"></a>
-<span class="sourceLineNo">1438</span>    Procedure&lt;TEnvironment&gt; rootProc = procedures.get(rootProcId);<a name="line.1438"></a>
-<span class="sourceLineNo">1439</span>    RemoteProcedureException exception = rootProc.getException();<a name="line.1439"></a>
-<span class="sourceLineNo">1440</span>    // TODO: This needs doc. The root proc doesn't have an exception. Maybe we are<a name="line.1440"></a>
-<span class="sourceLineNo">1441</span>    // rolling back because the subprocedure does. Clarify.<a name="line.1441"></a>
-<span class="sourceLineNo">1442</span>    if (exception == null) {<a name="line.1442"></a>
-<span class="sourceLineNo">1443</span>      exception = procStack.getException();<a name="line.1443"></a>
-<span class="sourceLineNo">1444</span>      rootProc.setFailure(exception);<a name="line.1444"></a>
-<span class="sourceLineNo">1445</span>      store.update(rootProc);<a name="line.1445"></a>
-<span class="sourceLineNo">1446</span>    }<a name="line.1446"></a>
-<span class="sourceLineNo">144

<TRUNCATED>

[22/29] hbase-site git commit: Published site at 5e84997f2ffdbcf5f849d70c30ddbe2db4039ca4.

Posted by gi...@apache.org.
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/27f5bfb5/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 20228d3..060f6b0 100644
--- a/devapidocs/org/apache/hadoop/hbase/procedure2/ProcedureExecutor.html
+++ b/devapidocs/org/apache/hadoop/hbase/procedure2/ProcedureExecutor.html
@@ -1576,7 +1576,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.999">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.1007">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>
@@ -1594,7 +1594,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.1030">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.1038">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>
@@ -1608,7 +1608,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.1053">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.1061">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-">
@@ -1617,7 +1617,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.1062">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.1070">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-">
@@ -1626,7 +1626,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.1086">abort</a>(long&nbsp;procId)</pre>
+<pre>public&nbsp;boolean&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/procedure2/ProcedureExecutor.html#line.1094">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>
@@ -1643,7 +1643,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.1097">abort</a>(long&nbsp;procId,
+<pre>public&nbsp;boolean&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/procedure2/ProcedureExecutor.html#line.1105">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>
@@ -1662,7 +1662,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.1111">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.1119">getProcedure</a>(long&nbsp;procId)</pre>
 </li>
 </ul>
 <a name="getProcedure-java.lang.Class-long-">
@@ -1671,7 +1671,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.1115">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.1123">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>
@@ -1681,7 +1681,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.1123">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.1131">getResult</a>(long&nbsp;procId)</pre>
 </li>
 </ul>
 <a name="isFinished-long-">
@@ -1690,7 +1690,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.1139">isFinished</a>(long&nbsp;procId)</pre>
+<pre>public&nbsp;boolean&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/procedure2/ProcedureExecutor.html#line.1147">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>
@@ -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>isStarted</h4>
-<pre>public&nbsp;boolean&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/procedure2/ProcedureExecutor.html#line.1148">isStarted</a>(long&nbsp;procId)</pre>
+<pre>public&nbsp;boolean&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/procedure2/ProcedureExecutor.html#line.1156">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>
@@ -1724,7 +1724,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.1160">removeResult</a>(long&nbsp;procId)</pre>
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/procedure2/ProcedureExecutor.html#line.1168">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>
@@ -1738,7 +1738,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.1172">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.1180">getResultOrProcedure</a>(long&nbsp;procId)</pre>
 </li>
 </ul>
 <a name="isProcedureOwner-long-org.apache.hadoop.hbase.security.User-">
@@ -1747,7 +1747,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.1188">isProcedureOwner</a>(long&nbsp;procId,
+<pre>public&nbsp;boolean&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/procedure2/ProcedureExecutor.html#line.1196">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>
@@ -1766,7 +1766,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.1214">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.1222">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
@@ -1780,7 +1780,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.1222">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.1230">getProcedures</a>()</pre>
 <div class="block">Get procedures.</div>
 <dl>
 <dt><span class="returnLabel">Returns:</span></dt>
@@ -1794,7 +1794,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.1238">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.1246">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-">
@@ -1803,7 +1803,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.1242">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.1250">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-">
@@ -1812,7 +1812,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.1246">sendProcedureLoadedNotification</a>(long&nbsp;procId)</pre>
+<pre>private&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/procedure2/ProcedureExecutor.html#line.1254">sendProcedureLoadedNotification</a>(long&nbsp;procId)</pre>
 </li>
 </ul>
 <a name="sendProcedureAddedNotification-long-">
@@ -1821,7 +1821,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.1258">sendProcedureAddedNotification</a>(long&nbsp;procId)</pre>
+<pre>private&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/procedure2/ProcedureExecutor.html#line.1266">sendProcedureAddedNotification</a>(long&nbsp;procId)</pre>
 </li>
 </ul>
 <a name="sendProcedureFinishedNotification-long-">
@@ -1830,7 +1830,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.1270">sendProcedureFinishedNotification</a>(long&nbsp;procId)</pre>
+<pre>private&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/procedure2/ProcedureExecutor.html#line.1278">sendProcedureFinishedNotification</a>(long&nbsp;procId)</pre>
 </li>
 </ul>
 <a name="nextProcId--">
@@ -1839,7 +1839,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.1285">nextProcId</a>()</pre>
+<pre>private&nbsp;long&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/procedure2/ProcedureExecutor.html#line.1293">nextProcId</a>()</pre>
 </li>
 </ul>
 <a name="getLastProcId--">
@@ -1848,7 +1848,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.1302">getLastProcId</a>()</pre>
+<pre>protected&nbsp;long&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/procedure2/ProcedureExecutor.html#line.1310">getLastProcId</a>()</pre>
 </li>
 </ul>
 <a name="getActiveProcIds--">
@@ -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>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.1307">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.1315">getActiveProcIds</a>()</pre>
 </li>
 </ul>
 <a name="getRootProcedureId-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>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.1311">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.1319">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-">
@@ -1875,7 +1875,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.1318">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.1326">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-">
@@ -1884,7 +1884,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.1414">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.1422">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-">
@@ -1893,7 +1893,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.1424">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.1432">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>
@@ -1903,7 +1903,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.1437">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.1445">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>
@@ -1915,7 +1915,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>cleanupAfterRollbackOneStep</h4>
-<pre>private&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/procedure2/ProcedureExecutor.html#line.1526">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.1534">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-">
@@ -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>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.1556">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.1564">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>
@@ -1936,7 +1936,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.1584">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.1592">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-">
@@ -1945,7 +1945,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>execProcedure</h4>
-<pre>private&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/procedure2/ProcedureExecutor.html#line.1618">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.1626">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>
@@ -1982,7 +1982,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.1746">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.1754">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-">
@@ -1991,7 +1991,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.1752">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.1760">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>
@@ -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>submitChildrenProcedures</h4>
-<pre>private&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/procedure2/ProcedureExecutor.html#line.1788">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.1796">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-">
@@ -2011,7 +2011,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.1798">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.1806">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>
@@ -2021,7 +2021,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.1817">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.1825">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>
@@ -2032,7 +2032,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.1843">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.1851">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>
@@ -2042,7 +2042,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.1852">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.1860">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-">
@@ -2051,7 +2051,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.1869">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.1877">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-">
@@ -2060,7 +2060,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>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.1896">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.1904">getProcStack</a>(long&nbsp;rootProcId)</pre>
 </li>
 </ul>
 <a name="getProcedureScheduler--">
@@ -2069,7 +2069,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>getProcedureScheduler</h4>
-<pre><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.1901">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.1909">getProcedureScheduler</a>()</pre>
 </li>
 </ul>
 <a name="getCompletedSize--">
@@ -2078,7 +2078,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockListLast">
 <li class="blockList">
 <h4>getCompletedSize</h4>
-<pre>int&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/procedure2/ProcedureExecutor.html#line.1906">getCompletedSize</a>()</pre>
+<pre>int&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/procedure2/ProcedureExecutor.html#line.1914">getCompletedSize</a>()</pre>
 </li>
 </ul>
 </li>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/27f5bfb5/devapidocs/org/apache/hadoop/hbase/procedure2/TimeoutExecutorThread.html
----------------------------------------------------------------------
diff --git a/devapidocs/org/apache/hadoop/hbase/procedure2/TimeoutExecutorThread.html b/devapidocs/org/apache/hadoop/hbase/procedure2/TimeoutExecutorThread.html
index b2c67ae..44d1b9f 100644
--- a/devapidocs/org/apache/hadoop/hbase/procedure2/TimeoutExecutorThread.html
+++ b/devapidocs/org/apache/hadoop/hbase/procedure2/TimeoutExecutorThread.html
@@ -237,7 +237,7 @@ extends <a href="../../../../../org/apache/hadoop/hbase/procedure2/StoppableThre
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/procedure2/TimeoutExecutorThread.html#executeInMemoryChore-org.apache.hadoop.hbase.procedure2.ProcedureInMemoryChore-">executeInMemoryChore</a></span>(<a href="../../../../../org/apache/hadoop/hbase/procedure2/ProcedureInMemoryChore.html" title="class in org.apache.hadoop.hbase.procedure2">ProcedureInMemoryChore</a>&lt;<a href="../../../../../org/apache/hadoop/hbase/procedure2/TimeoutExecutorThread.html" title="type parameter in TimeoutExecutorThread">TEnvironment</a>&gt;&nbsp;chore)</code>&nbsp;</td>
 </tr>
 <tr id="i5" class="rowColor">
-<td class="colFirst"><code>private void</code></td>
+<td class="colFirst"><code>protected void</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/procedure2/TimeoutExecutorThread.html#executeTimedoutProcedure-org.apache.hadoop.hbase.procedure2.Procedure-">executeTimedoutProcedure</a></span>(<a href="../../../../../org/apache/hadoop/hbase/procedure2/Procedure.html" title="class in org.apache.hadoop.hbase.procedure2">Procedure</a>&lt;<a href="../../../../../org/apache/hadoop/hbase/procedure2/TimeoutExecutorThread.html" title="type parameter in TimeoutExecutorThread">TEnvironment</a>&gt;&nbsp;proc)</code>&nbsp;</td>
 </tr>
 <tr id="i6" class="altColor">
@@ -429,7 +429,7 @@ extends <a href="../../../../../org/apache/hadoop/hbase/procedure2/StoppableThre
 <ul class="blockListLast">
 <li class="blockList">
 <h4>executeTimedoutProcedure</h4>
-<pre>private&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/procedure2/TimeoutExecutorThread.html#line.129">executeTimedoutProcedure</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/TimeoutExecutorThread.html" title="type parameter in TimeoutExecutorThread">TEnvironment</a>&gt;&nbsp;proc)</pre>
+<pre>protected&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/procedure2/TimeoutExecutorThread.html#line.129">executeTimedoutProcedure</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/TimeoutExecutorThread.html" title="type parameter in TimeoutExecutorThread">TEnvironment</a>&gt;&nbsp;proc)</pre>
 </li>
 </ul>
 </li>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/27f5bfb5/devapidocs/org/apache/hadoop/hbase/procedure2/class-use/Procedure.html
----------------------------------------------------------------------
diff --git a/devapidocs/org/apache/hadoop/hbase/procedure2/class-use/Procedure.html b/devapidocs/org/apache/hadoop/hbase/procedure2/class-use/Procedure.html
index d85b8c2..7af5930 100644
--- a/devapidocs/org/apache/hadoop/hbase/procedure2/class-use/Procedure.html
+++ b/devapidocs/org/apache/hadoop/hbase/procedure2/class-use/Procedure.html
@@ -1432,7 +1432,7 @@
 </td>
 </tr>
 <tr class="rowColor">
-<td class="colFirst"><code>private void</code></td>
+<td class="colFirst"><code>protected void</code></td>
 <td class="colLast"><span class="typeNameLabel">TimeoutExecutorThread.</span><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/procedure2/TimeoutExecutorThread.html#executeTimedoutProcedure-org.apache.hadoop.hbase.procedure2.Procedure-">executeTimedoutProcedure</a></span>(<a href="../../../../../../org/apache/hadoop/hbase/procedure2/Procedure.html" title="class in org.apache.hadoop.hbase.procedure2">Procedure</a>&lt;<a href="../../../../../../org/apache/hadoop/hbase/procedure2/TimeoutExecutorThread.html" title="type parameter in TimeoutExecutorThread">TEnvironment</a>&gt;&nbsp;proc)</code>&nbsp;</td>
 </tr>
 <tr class="altColor">

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

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/27f5bfb5/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 21878a9..7f97d92 100644
--- a/devapidocs/org/apache/hadoop/hbase/quotas/package-tree.html
+++ b/devapidocs/org/apache/hadoop/hbase/quotas/package-tree.html
@@ -229,12 +229,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.quotas.<a href="../../../../../org/apache/hadoop/hbase/quotas/QuotaType.html" title="enum in org.apache.hadoop.hbase.quotas"><span class="typeNameLink">QuotaType</span></a></li>
-<li type="circle">org.apache.hadoop.hbase.quotas.<a href="../../../../../org/apache/hadoop/hbase/quotas/OperationQuota.OperationType.html" title="enum in org.apache.hadoop.hbase.quotas"><span class="typeNameLink">OperationQuota.OperationType</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.quotas.<a href="../../../../../org/apache/hadoop/hbase/quotas/ThrottlingException.Type.html" title="enum in org.apache.hadoop.hbase.quotas"><span class="typeNameLink">ThrottlingException.Type</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.quotas.<a href="../../../../../org/apache/hadoop/hbase/quotas/RpcThrottlingException.Type.html" title="enum in org.apache.hadoop.hbase.quotas"><span class="typeNameLink">RpcThrottlingException.Type</span></a></li>
-<li type="circle">org.apache.hadoop.hbase.quotas.<a href="../../../../../org/apache/hadoop/hbase/quotas/ThrottleType.html" title="enum in org.apache.hadoop.hbase.quotas"><span class="typeNameLink">ThrottleType</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.quotas.<a href="../../../../../org/apache/hadoop/hbase/quotas/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/ThrottleType.html" title="enum in org.apache.hadoop.hbase.quotas"><span class="typeNameLink">ThrottleType</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.quotas.<a href="../../../../../org/apache/hadoop/hbase/quotas/OperationQuota.OperationType.html" title="enum in org.apache.hadoop.hbase.quotas"><span class="typeNameLink">OperationQuota.OperationType</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.quotas.<a href="../../../../../org/apache/hadoop/hbase/quotas/QuotaType.html" title="enum in org.apache.hadoop.hbase.quotas"><span class="typeNameLink">QuotaType</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.quotas.<a href="../../../../../org/apache/hadoop/hbase/quotas/SpaceViolationPolicy.html" title="enum in org.apache.hadoop.hbase.quotas"><span class="typeNameLink">SpaceViolationPolicy</span></a></li>
 </ul>
 </li>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/27f5bfb5/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 0df09d0..aea92e3 100644
--- a/devapidocs/org/apache/hadoop/hbase/regionserver/package-tree.html
+++ b/devapidocs/org/apache/hadoop/hbase/regionserver/package-tree.html
@@ -716,20 +716,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/Region.Operation.html" title="enum in org.apache.hadoop.hbase.regionserver"><span class="typeNameLink">Region.Operation</span></a></li>
-<li type="circle">org.apache.hadoop.hbase.regionserver.<a href="../../../../../org/apache/hadoop/hbase/regionserver/DefaultHeapMemoryTuner.StepDirection.html" title="enum in org.apache.hadoop.hbase.regionserver"><span class="typeNameLink">DefaultHeapMemoryTuner.StepDirection</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.regionserver.<a href="../../../../../org/apache/hadoop/hbase/regionserver/ChunkCreator.ChunkType.html" title="enum in org.apache.hadoop.hbase.regionserver"><span class="typeNameLink">ChunkCreator.ChunkType</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.regionserver.<a href="../../../../../org/apache/hadoop/hbase/regionserver/FlushType.html" title="enum in org.apache.hadoop.hbase.regionserver"><span class="typeNameLink">FlushType</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.regionserver.<a href="../../../../../org/apache/hadoop/hbase/regionserver/ScanType.html" title="enum in org.apache.hadoop.hbase.regionserver"><span class="typeNameLink">ScanType</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.regionserver.<a href="../../../../../org/apache/hadoop/hbase/regionserver/BloomType.html" title="enum in org.apache.hadoop.hbase.regionserver"><span class="typeNameLink">BloomType</span></a></li>
-<li type="circle">org.apache.hadoop.hbase.regionserver.<a href="../../../../../org/apache/hadoop/hbase/regionserver/ScannerContext.NextState.html" title="enum in org.apache.hadoop.hbase.regionserver"><span class="typeNameLink">ScannerContext.NextState</span></a></li>
-<li type="circle">org.apache.hadoop.hbase.regionserver.<a href="../../../../../org/apache/hadoop/hbase/regionserver/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.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/MetricsRegionServerSourceFactoryImpl.FactoryStorage.html" title="enum in org.apache.hadoop.hbase.regionserver"><span class="typeNameLink">MetricsRegionServerSourceFactoryImpl.FactoryStorage</span></a></li>
-<li type="circle">org.apache.hadoop.hbase.regionserver.<a href="../../../../../org/apache/hadoop/hbase/regionserver/FlushType.html" title="enum in org.apache.hadoop.hbase.regionserver"><span class="typeNameLink">FlushType</span></a></li>
-<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/HRegion.FlushResult.Result.html" title="enum in org.apache.hadoop.hbase.regionserver"><span class="typeNameLink">HRegion.FlushResult.Result</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.regionserver.<a href="../../../../../org/apache/hadoop/hbase/regionserver/SplitLogWorker.TaskExecutor.Status.html" title="enum in org.apache.hadoop.hbase.regionserver"><span class="typeNameLink">SplitLogWorker.TaskExecutor.Status</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.regionserver.<a href="../../../../../org/apache/hadoop/hbase/regionserver/ScannerContext.NextState.html" title="enum in org.apache.hadoop.hbase.regionserver"><span class="typeNameLink">ScannerContext.NextState</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.regionserver.<a href="../../../../../org/apache/hadoop/hbase/regionserver/TimeRangeTracker.Type.html" title="enum in org.apache.hadoop.hbase.regionserver"><span class="typeNameLink">TimeRangeTracker.Type</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.regionserver.<a href="../../../../../org/apache/hadoop/hbase/regionserver/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/CompactingMemStore.IndexType.html" title="enum in org.apache.hadoop.hbase.regionserver"><span class="typeNameLink">CompactingMemStore.IndexType</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.regionserver.<a href="../../../../../org/apache/hadoop/hbase/regionserver/Region.Operation.html" title="enum in org.apache.hadoop.hbase.regionserver"><span class="typeNameLink">Region.Operation</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.regionserver.<a href="../../../../../org/apache/hadoop/hbase/regionserver/MemStoreCompactionStrategy.Action.html" title="enum in org.apache.hadoop.hbase.regionserver"><span class="typeNameLink">MemStoreCompactionStrategy.Action</span></a></li>
-<li type="circle">org.apache.hadoop.hbase.regionserver.<a href="../../../../../org/apache/hadoop/hbase/regionserver/TimeRangeTracker.Type.html" title="enum in org.apache.hadoop.hbase.regionserver"><span class="typeNameLink">TimeRangeTracker.Type</span></a></li>
 </ul>
 </li>
 </ul>

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

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/27f5bfb5/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 c20ff47..034077c 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.FilterType.html" title="enum in org.apache.hadoop.hbase.rest.model"><span class="typeNameLink">ScannerModel.FilterModel.FilterType</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.rest.model.<a href="../../../../../../org/apache/hadoop/hbase/rest/model/ScannerModel.FilterModel.ByteArrayComparableModel.ComparatorType.html" title="enum in org.apache.hadoop.hbase.rest.model"><span class="typeNameLink">ScannerModel.FilterModel.ByteArrayComparableModel.ComparatorType</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.rest.model.<a href="../../../../../../org/apache/hadoop/hbase/rest/model/ScannerModel.FilterModel.FilterType.html" title="enum in org.apache.hadoop.hbase.rest.model"><span class="typeNameLink">ScannerModel.FilterModel.FilterType</span></a></li>
 </ul>
 </li>
 </ul>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/27f5bfb5/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 69f2dc6..8a2815f 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/Permission.Action.html" title="enum in org.apache.hadoop.hbase.security.access"><span class="typeNameLink">Permission.Action</span></a></li>
-<li type="circle">org.apache.hadoop.hbase.security.access.<a href="../../../../../../org/apache/hadoop/hbase/security/access/AccessController.OpType.html" title="enum in org.apache.hadoop.hbase.security.access"><span class="typeNameLink">AccessController.OpType</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.security.access.<a href="../../../../../../org/apache/hadoop/hbase/security/access/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>
+<li type="circle">org.apache.hadoop.hbase.security.access.<a href="../../../../../../org/apache/hadoop/hbase/security/access/Permission.Action.html" title="enum in org.apache.hadoop.hbase.security.access"><span class="typeNameLink">Permission.Action</span></a></li>
 </ul>
 </li>
 </ul>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/27f5bfb5/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 29d7634..7ba3a64 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/AuthMethod.html" title="enum in org.apache.hadoop.hbase.security"><span class="typeNameLink">AuthMethod</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.security.<a href="../../../../../org/apache/hadoop/hbase/security/SaslStatus.html" title="enum in org.apache.hadoop.hbase.security"><span class="typeNameLink">SaslStatus</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.security.<a href="../../../../../org/apache/hadoop/hbase/security/SaslUtil.QualityOfProtection.html" title="enum in org.apache.hadoop.hbase.security"><span class="typeNameLink">SaslUtil.QualityOfProtection</span></a></li>
-<li type="circle">org.apache.hadoop.hbase.security.<a href="../../../../../org/apache/hadoop/hbase/security/AuthMethod.html" title="enum in org.apache.hadoop.hbase.security"><span class="typeNameLink">AuthMethod</span></a></li>
 </ul>
 </li>
 </ul>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/27f5bfb5/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 81a90a9..03e1383 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/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>
 <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>
 </ul>
 </li>
 </ul>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/27f5bfb5/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 dd95a88..18b030a 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/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.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/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/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/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/PrettyPrinter.Unit.html" title="enum in org.apache.hadoop.hbase.util"><span class="typeNameLink">PrettyPrinter.Unit</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.util.<a href="../../../../../org/apache/hadoop/hbase/util/IdReadWriteLock.ReferenceType.html" title="enum in org.apache.hadoop.hbase.util"><span class="typeNameLink">IdReadWriteLock.ReferenceType</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.util.<a href="../../../../../org/apache/hadoop/hbase/util/PoolMap.PoolType.html" title="enum in org.apache.hadoop.hbase.util"><span class="typeNameLink">PoolMap.PoolType</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.util.<a href="../../../../../org/apache/hadoop/hbase/util/Bytes.LexicographicalComparerHolder.UnsafeComparer.html" title="enum in org.apache.hadoop.hbase.util"><span class="typeNameLink">Bytes.LexicographicalComparerHolder.UnsafeComparer</span></a> (implements org.apache.hadoop.hbase.util.<a href="../../../../../org/apache/hadoop/hbase/util/Bytes.Comparer.html" title="interface in org.apache.hadoop.hbase.util">Bytes.Comparer</a>&lt;T&gt;)</li>
+<li type="circle">org.apache.hadoop.hbase.util.<a href="../../../../../org/apache/hadoop/hbase/util/ChecksumType.html" title="enum in org.apache.hadoop.hbase.util"><span class="typeNameLink">ChecksumType</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.util.<a href="../../../../../org/apache/hadoop/hbase/util/HBaseFsck.ErrorReporter.ERROR_CODE.html" title="enum in org.apache.hadoop.hbase.util"><span class="typeNameLink">HBaseFsck.ErrorReporter.ERROR_CODE</span></a></li>
 </ul>
 </li>
 </ul>


[08/29] hbase-site git commit: Published site at 5e84997f2ffdbcf5f849d70c30ddbe2db4039ca4.

Posted by gi...@apache.org.
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/27f5bfb5/testdevapidocs/src-html/org/apache/hadoop/hbase/procedure2/TestProcedureBypass.RootProcedure.html
----------------------------------------------------------------------
diff --git a/testdevapidocs/src-html/org/apache/hadoop/hbase/procedure2/TestProcedureBypass.RootProcedure.html b/testdevapidocs/src-html/org/apache/hadoop/hbase/procedure2/TestProcedureBypass.RootProcedure.html
index 7eb899a..f89b826 100644
--- a/testdevapidocs/src-html/org/apache/hadoop/hbase/procedure2/TestProcedureBypass.RootProcedure.html
+++ b/testdevapidocs/src-html/org/apache/hadoop/hbase/procedure2/TestProcedureBypass.RootProcedure.html
@@ -46,226 +46,262 @@
 <span class="sourceLineNo">038</span>import org.slf4j.Logger;<a name="line.38"></a>
 <span class="sourceLineNo">039</span>import org.slf4j.LoggerFactory;<a name="line.39"></a>
 <span class="sourceLineNo">040</span><a name="line.40"></a>
-<span class="sourceLineNo">041</span><a name="line.41"></a>
+<span class="sourceLineNo">041</span>import org.apache.hadoop.hbase.shaded.protobuf.generated.ProcedureProtos;<a name="line.41"></a>
 <span class="sourceLineNo">042</span><a name="line.42"></a>
-<span class="sourceLineNo">043</span>@Category({MasterTests.class, SmallTests.class})<a name="line.43"></a>
-<span class="sourceLineNo">044</span>public class TestProcedureBypass {<a name="line.44"></a>
-<span class="sourceLineNo">045</span><a name="line.45"></a>
-<span class="sourceLineNo">046</span>  @ClassRule public static final HBaseClassTestRule CLASS_RULE = HBaseClassTestRule<a name="line.46"></a>
-<span class="sourceLineNo">047</span>      .forClass(TestProcedureBypass.class);<a name="line.47"></a>
-<span class="sourceLineNo">048</span><a name="line.48"></a>
-<span class="sourceLineNo">049</span>  private static final Logger LOG = LoggerFactory.getLogger(TestProcedureBypass.class);<a name="line.49"></a>
-<span class="sourceLineNo">050</span><a name="line.50"></a>
-<span class="sourceLineNo">051</span>  private static final int PROCEDURE_EXECUTOR_SLOTS = 1;<a name="line.51"></a>
-<span class="sourceLineNo">052</span><a name="line.52"></a>
-<span class="sourceLineNo">053</span>  private static TestProcEnv procEnv;<a name="line.53"></a>
-<span class="sourceLineNo">054</span>  private static ProcedureStore procStore;<a name="line.54"></a>
-<span class="sourceLineNo">055</span><a name="line.55"></a>
-<span class="sourceLineNo">056</span>  private static ProcedureExecutor&lt;TestProcEnv&gt; procExecutor;<a name="line.56"></a>
-<span class="sourceLineNo">057</span><a name="line.57"></a>
-<span class="sourceLineNo">058</span>  private static HBaseCommonTestingUtility htu;<a name="line.58"></a>
-<span class="sourceLineNo">059</span><a name="line.59"></a>
-<span class="sourceLineNo">060</span>  private static FileSystem fs;<a name="line.60"></a>
-<span class="sourceLineNo">061</span>  private static Path testDir;<a name="line.61"></a>
-<span class="sourceLineNo">062</span>  private static Path logDir;<a name="line.62"></a>
-<span class="sourceLineNo">063</span><a name="line.63"></a>
-<span class="sourceLineNo">064</span>  private static class TestProcEnv {<a name="line.64"></a>
-<span class="sourceLineNo">065</span>  }<a name="line.65"></a>
-<span class="sourceLineNo">066</span><a name="line.66"></a>
-<span class="sourceLineNo">067</span>  @BeforeClass<a name="line.67"></a>
-<span class="sourceLineNo">068</span>  public static void setUp() throws Exception {<a name="line.68"></a>
-<span class="sourceLineNo">069</span>    htu = new HBaseCommonTestingUtility();<a name="line.69"></a>
-<span class="sourceLineNo">070</span><a name="line.70"></a>
-<span class="sourceLineNo">071</span>    // NOTE: The executor will be created by each test<a name="line.71"></a>
-<span class="sourceLineNo">072</span>    procEnv = new TestProcEnv();<a name="line.72"></a>
-<span class="sourceLineNo">073</span>    testDir = htu.getDataTestDir();<a name="line.73"></a>
-<span class="sourceLineNo">074</span>    fs = testDir.getFileSystem(htu.getConfiguration());<a name="line.74"></a>
-<span class="sourceLineNo">075</span>    assertTrue(testDir.depth() &gt; 1);<a name="line.75"></a>
-<span class="sourceLineNo">076</span><a name="line.76"></a>
-<span class="sourceLineNo">077</span>    logDir = new Path(testDir, "proc-logs");<a name="line.77"></a>
-<span class="sourceLineNo">078</span>    procStore = ProcedureTestingUtility.createWalStore(htu.getConfiguration(), logDir);<a name="line.78"></a>
-<span class="sourceLineNo">079</span>    procExecutor = new ProcedureExecutor&lt;&gt;(htu.getConfiguration(), procEnv,<a name="line.79"></a>
-<span class="sourceLineNo">080</span>        procStore);<a name="line.80"></a>
-<span class="sourceLineNo">081</span>    procStore.start(PROCEDURE_EXECUTOR_SLOTS);<a name="line.81"></a>
-<span class="sourceLineNo">082</span>    ProcedureTestingUtility<a name="line.82"></a>
-<span class="sourceLineNo">083</span>        .initAndStartWorkers(procExecutor, PROCEDURE_EXECUTOR_SLOTS, true);<a name="line.83"></a>
-<span class="sourceLineNo">084</span>  }<a name="line.84"></a>
-<span class="sourceLineNo">085</span><a name="line.85"></a>
-<span class="sourceLineNo">086</span>  @Test<a name="line.86"></a>
-<span class="sourceLineNo">087</span>  public void testBypassSuspendProcedure() throws Exception {<a name="line.87"></a>
-<span class="sourceLineNo">088</span>    final SuspendProcedure proc = new SuspendProcedure();<a name="line.88"></a>
-<span class="sourceLineNo">089</span>    long id = procExecutor.submitProcedure(proc);<a name="line.89"></a>
-<span class="sourceLineNo">090</span>    Thread.sleep(500);<a name="line.90"></a>
-<span class="sourceLineNo">091</span>    //bypass the procedure<a name="line.91"></a>
-<span class="sourceLineNo">092</span>    assertTrue(procExecutor.bypassProcedure(id, 30000, false, false));<a name="line.92"></a>
-<span class="sourceLineNo">093</span>    htu.waitFor(5000, () -&gt; proc.isSuccess() &amp;&amp; proc.isBypass());<a name="line.93"></a>
-<span class="sourceLineNo">094</span>    LOG.info("{} finished", proc);<a name="line.94"></a>
-<span class="sourceLineNo">095</span>  }<a name="line.95"></a>
-<span class="sourceLineNo">096</span><a name="line.96"></a>
-<span class="sourceLineNo">097</span>  @Test<a name="line.97"></a>
-<span class="sourceLineNo">098</span>  public void testStuckProcedure() throws Exception {<a name="line.98"></a>
-<span class="sourceLineNo">099</span>    final StuckProcedure proc = new StuckProcedure();<a name="line.99"></a>
-<span class="sourceLineNo">100</span>    long id = procExecutor.submitProcedure(proc);<a name="line.100"></a>
-<span class="sourceLineNo">101</span>    Thread.sleep(500);<a name="line.101"></a>
-<span class="sourceLineNo">102</span>    //bypass the procedure<a name="line.102"></a>
-<span class="sourceLineNo">103</span>    assertTrue(procExecutor.bypassProcedure(id, 1000, true, false));<a name="line.103"></a>
-<span class="sourceLineNo">104</span>    //Since the procedure is stuck there, we need to restart the executor to recovery.<a name="line.104"></a>
-<span class="sourceLineNo">105</span>    ProcedureTestingUtility.restart(procExecutor);<a name="line.105"></a>
-<span class="sourceLineNo">106</span>    htu.waitFor(5000, () -&gt; proc.isSuccess() &amp;&amp; proc.isBypass());<a name="line.106"></a>
-<span class="sourceLineNo">107</span>    LOG.info("{} finished", proc);<a name="line.107"></a>
-<span class="sourceLineNo">108</span>  }<a name="line.108"></a>
-<span class="sourceLineNo">109</span><a name="line.109"></a>
-<span class="sourceLineNo">110</span>  @Test<a name="line.110"></a>
-<span class="sourceLineNo">111</span>  public void testBypassingProcedureWithParent() throws Exception {<a name="line.111"></a>
-<span class="sourceLineNo">112</span>    final RootProcedure proc = new RootProcedure();<a name="line.112"></a>
-<span class="sourceLineNo">113</span>    long rootId = procExecutor.submitProcedure(proc);<a name="line.113"></a>
-<span class="sourceLineNo">114</span>    htu.waitFor(5000, () -&gt; procExecutor.getProcedures().stream()<a name="line.114"></a>
-<span class="sourceLineNo">115</span>      .filter(p -&gt; p.getParentProcId() == rootId).collect(Collectors.toList())<a name="line.115"></a>
-<span class="sourceLineNo">116</span>      .size() &gt; 0);<a name="line.116"></a>
-<span class="sourceLineNo">117</span>    SuspendProcedure suspendProcedure = (SuspendProcedure)procExecutor.getProcedures().stream()<a name="line.117"></a>
-<span class="sourceLineNo">118</span>        .filter(p -&gt; p.getParentProcId() == rootId).collect(Collectors.toList()).get(0);<a name="line.118"></a>
-<span class="sourceLineNo">119</span>    assertTrue(procExecutor.bypassProcedure(suspendProcedure.getProcId(), 1000, false, false));<a name="line.119"></a>
-<span class="sourceLineNo">120</span>    htu.waitFor(5000, () -&gt; proc.isSuccess() &amp;&amp; proc.isBypass());<a name="line.120"></a>
-<span class="sourceLineNo">121</span>    LOG.info("{} finished", proc);<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 testBypassingStuckStateMachineProcedure() throws Exception {<a name="line.125"></a>
-<span class="sourceLineNo">126</span>    final StuckStateMachineProcedure proc =<a name="line.126"></a>
-<span class="sourceLineNo">127</span>        new StuckStateMachineProcedure(procEnv, StuckStateMachineState.START);<a name="line.127"></a>
-<span class="sourceLineNo">128</span>    long id = procExecutor.submitProcedure(proc);<a name="line.128"></a>
-<span class="sourceLineNo">129</span>    Thread.sleep(500);<a name="line.129"></a>
-<span class="sourceLineNo">130</span>    // bypass the procedure<a name="line.130"></a>
-<span class="sourceLineNo">131</span>    assertFalse(procExecutor.bypassProcedure(id, 1000, false, false));<a name="line.131"></a>
-<span class="sourceLineNo">132</span>    assertTrue(procExecutor.bypassProcedure(id, 1000, true, false));<a name="line.132"></a>
-<span class="sourceLineNo">133</span><a name="line.133"></a>
-<span class="sourceLineNo">134</span>    htu.waitFor(5000, () -&gt; proc.isSuccess() &amp;&amp; proc.isBypass());<a name="line.134"></a>
-<span class="sourceLineNo">135</span>    LOG.info("{} finished", proc);<a name="line.135"></a>
-<span class="sourceLineNo">136</span>  }<a name="line.136"></a>
-<span class="sourceLineNo">137</span><a name="line.137"></a>
-<span class="sourceLineNo">138</span>  @Test<a name="line.138"></a>
-<span class="sourceLineNo">139</span>  public void testBypassingProcedureWithParentRecursive() throws Exception {<a name="line.139"></a>
-<span class="sourceLineNo">140</span>    final RootProcedure proc = new RootProcedure();<a name="line.140"></a>
-<span class="sourceLineNo">141</span>    long rootId = procExecutor.submitProcedure(proc);<a name="line.141"></a>
-<span class="sourceLineNo">142</span>    htu.waitFor(5000, () -&gt; procExecutor.getProcedures().stream()<a name="line.142"></a>
-<span class="sourceLineNo">143</span>        .filter(p -&gt; p.getParentProcId() == rootId).collect(Collectors.toList())<a name="line.143"></a>
-<span class="sourceLineNo">144</span>        .size() &gt; 0);<a name="line.144"></a>
-<span class="sourceLineNo">145</span>    SuspendProcedure suspendProcedure = (SuspendProcedure)procExecutor.getProcedures().stream()<a name="line.145"></a>
-<span class="sourceLineNo">146</span>        .filter(p -&gt; p.getParentProcId() == rootId).collect(Collectors.toList()).get(0);<a name="line.146"></a>
-<span class="sourceLineNo">147</span>    assertTrue(procExecutor.bypassProcedure(rootId, 1000, false, true));<a name="line.147"></a>
-<span class="sourceLineNo">148</span>    htu.waitFor(5000, () -&gt; proc.isSuccess() &amp;&amp; proc.isBypass());<a name="line.148"></a>
-<span class="sourceLineNo">149</span>    LOG.info("{} finished", proc);<a name="line.149"></a>
-<span class="sourceLineNo">150</span>  }<a name="line.150"></a>
-<span class="sourceLineNo">151</span><a name="line.151"></a>
-<span class="sourceLineNo">152</span>  @AfterClass<a name="line.152"></a>
-<span class="sourceLineNo">153</span>  public static void tearDown() throws Exception {<a name="line.153"></a>
-<span class="sourceLineNo">154</span>    procExecutor.stop();<a name="line.154"></a>
-<span class="sourceLineNo">155</span>    procStore.stop(false);<a name="line.155"></a>
-<span class="sourceLineNo">156</span>    procExecutor.join();<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>  public static class SuspendProcedure extends ProcedureTestingUtility.NoopProcedure&lt;TestProcEnv&gt; {<a name="line.159"></a>
+<span class="sourceLineNo">043</span><a name="line.43"></a>
+<span class="sourceLineNo">044</span>@Category({MasterTests.class, SmallTests.class})<a name="line.44"></a>
+<span class="sourceLineNo">045</span>public class TestProcedureBypass {<a name="line.45"></a>
+<span class="sourceLineNo">046</span><a name="line.46"></a>
+<span class="sourceLineNo">047</span>  @ClassRule public static final HBaseClassTestRule CLASS_RULE = HBaseClassTestRule<a name="line.47"></a>
+<span class="sourceLineNo">048</span>      .forClass(TestProcedureBypass.class);<a name="line.48"></a>
+<span class="sourceLineNo">049</span><a name="line.49"></a>
+<span class="sourceLineNo">050</span>  private static final Logger LOG = LoggerFactory.getLogger(TestProcedureBypass.class);<a name="line.50"></a>
+<span class="sourceLineNo">051</span><a name="line.51"></a>
+<span class="sourceLineNo">052</span>  private static final int PROCEDURE_EXECUTOR_SLOTS = 1;<a name="line.52"></a>
+<span class="sourceLineNo">053</span><a name="line.53"></a>
+<span class="sourceLineNo">054</span>  private static TestProcEnv procEnv;<a name="line.54"></a>
+<span class="sourceLineNo">055</span>  private static ProcedureStore procStore;<a name="line.55"></a>
+<span class="sourceLineNo">056</span><a name="line.56"></a>
+<span class="sourceLineNo">057</span>  private static ProcedureExecutor&lt;TestProcEnv&gt; procExecutor;<a name="line.57"></a>
+<span class="sourceLineNo">058</span><a name="line.58"></a>
+<span class="sourceLineNo">059</span>  private static HBaseCommonTestingUtility htu;<a name="line.59"></a>
+<span class="sourceLineNo">060</span><a name="line.60"></a>
+<span class="sourceLineNo">061</span>  private static FileSystem fs;<a name="line.61"></a>
+<span class="sourceLineNo">062</span>  private static Path testDir;<a name="line.62"></a>
+<span class="sourceLineNo">063</span>  private static Path logDir;<a name="line.63"></a>
+<span class="sourceLineNo">064</span><a name="line.64"></a>
+<span class="sourceLineNo">065</span>  private static class TestProcEnv {<a name="line.65"></a>
+<span class="sourceLineNo">066</span>  }<a name="line.66"></a>
+<span class="sourceLineNo">067</span><a name="line.67"></a>
+<span class="sourceLineNo">068</span>  @BeforeClass<a name="line.68"></a>
+<span class="sourceLineNo">069</span>  public static void setUp() throws Exception {<a name="line.69"></a>
+<span class="sourceLineNo">070</span>    htu = new HBaseCommonTestingUtility();<a name="line.70"></a>
+<span class="sourceLineNo">071</span><a name="line.71"></a>
+<span class="sourceLineNo">072</span>    // NOTE: The executor will be created by each test<a name="line.72"></a>
+<span class="sourceLineNo">073</span>    procEnv = new TestProcEnv();<a name="line.73"></a>
+<span class="sourceLineNo">074</span>    testDir = htu.getDataTestDir();<a name="line.74"></a>
+<span class="sourceLineNo">075</span>    fs = testDir.getFileSystem(htu.getConfiguration());<a name="line.75"></a>
+<span class="sourceLineNo">076</span>    assertTrue(testDir.depth() &gt; 1);<a name="line.76"></a>
+<span class="sourceLineNo">077</span><a name="line.77"></a>
+<span class="sourceLineNo">078</span>    logDir = new Path(testDir, "proc-logs");<a name="line.78"></a>
+<span class="sourceLineNo">079</span>    procStore = ProcedureTestingUtility.createWalStore(htu.getConfiguration(), logDir);<a name="line.79"></a>
+<span class="sourceLineNo">080</span>    procExecutor = new ProcedureExecutor&lt;&gt;(htu.getConfiguration(), procEnv,<a name="line.80"></a>
+<span class="sourceLineNo">081</span>        procStore);<a name="line.81"></a>
+<span class="sourceLineNo">082</span>    procStore.start(PROCEDURE_EXECUTOR_SLOTS);<a name="line.82"></a>
+<span class="sourceLineNo">083</span>    ProcedureTestingUtility<a name="line.83"></a>
+<span class="sourceLineNo">084</span>        .initAndStartWorkers(procExecutor, PROCEDURE_EXECUTOR_SLOTS, true);<a name="line.84"></a>
+<span class="sourceLineNo">085</span>  }<a name="line.85"></a>
+<span class="sourceLineNo">086</span><a name="line.86"></a>
+<span class="sourceLineNo">087</span>  @Test<a name="line.87"></a>
+<span class="sourceLineNo">088</span>  public void testBypassSuspendProcedure() throws Exception {<a name="line.88"></a>
+<span class="sourceLineNo">089</span>    final SuspendProcedure proc = new SuspendProcedure();<a name="line.89"></a>
+<span class="sourceLineNo">090</span>    long id = procExecutor.submitProcedure(proc);<a name="line.90"></a>
+<span class="sourceLineNo">091</span>    Thread.sleep(500);<a name="line.91"></a>
+<span class="sourceLineNo">092</span>    //bypass the procedure<a name="line.92"></a>
+<span class="sourceLineNo">093</span>    assertTrue(procExecutor.bypassProcedure(id, 30000, false, false));<a name="line.93"></a>
+<span class="sourceLineNo">094</span>    htu.waitFor(5000, () -&gt; proc.isSuccess() &amp;&amp; proc.isBypass());<a name="line.94"></a>
+<span class="sourceLineNo">095</span>    LOG.info("{} finished", proc);<a name="line.95"></a>
+<span class="sourceLineNo">096</span>  }<a name="line.96"></a>
+<span class="sourceLineNo">097</span><a name="line.97"></a>
+<span class="sourceLineNo">098</span>  @Test<a name="line.98"></a>
+<span class="sourceLineNo">099</span>  public void testStuckProcedure() throws Exception {<a name="line.99"></a>
+<span class="sourceLineNo">100</span>    final StuckProcedure proc = new StuckProcedure();<a name="line.100"></a>
+<span class="sourceLineNo">101</span>    long id = procExecutor.submitProcedure(proc);<a name="line.101"></a>
+<span class="sourceLineNo">102</span>    Thread.sleep(500);<a name="line.102"></a>
+<span class="sourceLineNo">103</span>    //bypass the procedure<a name="line.103"></a>
+<span class="sourceLineNo">104</span>    assertTrue(procExecutor.bypassProcedure(id, 1000, true, false));<a name="line.104"></a>
+<span class="sourceLineNo">105</span>    //Since the procedure is stuck there, we need to restart the executor to recovery.<a name="line.105"></a>
+<span class="sourceLineNo">106</span>    ProcedureTestingUtility.restart(procExecutor);<a name="line.106"></a>
+<span class="sourceLineNo">107</span>    htu.waitFor(5000, () -&gt; proc.isSuccess() &amp;&amp; proc.isBypass());<a name="line.107"></a>
+<span class="sourceLineNo">108</span>    LOG.info("{} finished", proc);<a name="line.108"></a>
+<span class="sourceLineNo">109</span>  }<a name="line.109"></a>
+<span class="sourceLineNo">110</span><a name="line.110"></a>
+<span class="sourceLineNo">111</span>  @Test<a name="line.111"></a>
+<span class="sourceLineNo">112</span>  public void testBypassingProcedureWithParent() throws Exception {<a name="line.112"></a>
+<span class="sourceLineNo">113</span>    final RootProcedure proc = new RootProcedure();<a name="line.113"></a>
+<span class="sourceLineNo">114</span>    long rootId = procExecutor.submitProcedure(proc);<a name="line.114"></a>
+<span class="sourceLineNo">115</span>    htu.waitFor(5000, () -&gt; procExecutor.getProcedures().stream()<a name="line.115"></a>
+<span class="sourceLineNo">116</span>      .filter(p -&gt; p.getParentProcId() == rootId).collect(Collectors.toList())<a name="line.116"></a>
+<span class="sourceLineNo">117</span>      .size() &gt; 0);<a name="line.117"></a>
+<span class="sourceLineNo">118</span>    SuspendProcedure suspendProcedure = (SuspendProcedure)procExecutor.getProcedures().stream()<a name="line.118"></a>
+<span class="sourceLineNo">119</span>        .filter(p -&gt; p.getParentProcId() == rootId).collect(Collectors.toList()).get(0);<a name="line.119"></a>
+<span class="sourceLineNo">120</span>    assertTrue(procExecutor.bypassProcedure(suspendProcedure.getProcId(), 1000, false, false));<a name="line.120"></a>
+<span class="sourceLineNo">121</span>    htu.waitFor(5000, () -&gt; proc.isSuccess() &amp;&amp; proc.isBypass());<a name="line.121"></a>
+<span class="sourceLineNo">122</span>    LOG.info("{} finished", proc);<a name="line.122"></a>
+<span class="sourceLineNo">123</span>  }<a name="line.123"></a>
+<span class="sourceLineNo">124</span><a name="line.124"></a>
+<span class="sourceLineNo">125</span>  @Test<a name="line.125"></a>
+<span class="sourceLineNo">126</span>  public void testBypassingStuckStateMachineProcedure() throws Exception {<a name="line.126"></a>
+<span class="sourceLineNo">127</span>    final StuckStateMachineProcedure proc =<a name="line.127"></a>
+<span class="sourceLineNo">128</span>        new StuckStateMachineProcedure(procEnv, StuckStateMachineState.START);<a name="line.128"></a>
+<span class="sourceLineNo">129</span>    long id = procExecutor.submitProcedure(proc);<a name="line.129"></a>
+<span class="sourceLineNo">130</span>    Thread.sleep(500);<a name="line.130"></a>
+<span class="sourceLineNo">131</span>    // bypass the procedure<a name="line.131"></a>
+<span class="sourceLineNo">132</span>    assertFalse(procExecutor.bypassProcedure(id, 1000, false, false));<a name="line.132"></a>
+<span class="sourceLineNo">133</span>    assertTrue(procExecutor.bypassProcedure(id, 1000, true, false));<a name="line.133"></a>
+<span class="sourceLineNo">134</span><a name="line.134"></a>
+<span class="sourceLineNo">135</span>    htu.waitFor(5000, () -&gt; proc.isSuccess() &amp;&amp; proc.isBypass());<a name="line.135"></a>
+<span class="sourceLineNo">136</span>    LOG.info("{} finished", proc);<a name="line.136"></a>
+<span class="sourceLineNo">137</span>  }<a name="line.137"></a>
+<span class="sourceLineNo">138</span><a name="line.138"></a>
+<span class="sourceLineNo">139</span>  @Test<a name="line.139"></a>
+<span class="sourceLineNo">140</span>  public void testBypassingProcedureWithParentRecursive() throws Exception {<a name="line.140"></a>
+<span class="sourceLineNo">141</span>    final RootProcedure proc = new RootProcedure();<a name="line.141"></a>
+<span class="sourceLineNo">142</span>    long rootId = procExecutor.submitProcedure(proc);<a name="line.142"></a>
+<span class="sourceLineNo">143</span>    htu.waitFor(5000, () -&gt; procExecutor.getProcedures().stream()<a name="line.143"></a>
+<span class="sourceLineNo">144</span>        .filter(p -&gt; p.getParentProcId() == rootId).collect(Collectors.toList())<a name="line.144"></a>
+<span class="sourceLineNo">145</span>        .size() &gt; 0);<a name="line.145"></a>
+<span class="sourceLineNo">146</span>    SuspendProcedure suspendProcedure = (SuspendProcedure)procExecutor.getProcedures().stream()<a name="line.146"></a>
+<span class="sourceLineNo">147</span>        .filter(p -&gt; p.getParentProcId() == rootId).collect(Collectors.toList()).get(0);<a name="line.147"></a>
+<span class="sourceLineNo">148</span>    assertTrue(procExecutor.bypassProcedure(rootId, 1000, false, true));<a name="line.148"></a>
+<span class="sourceLineNo">149</span>    htu.waitFor(5000, () -&gt; proc.isSuccess() &amp;&amp; proc.isBypass());<a name="line.149"></a>
+<span class="sourceLineNo">150</span>    LOG.info("{} finished", proc);<a name="line.150"></a>
+<span class="sourceLineNo">151</span>  }<a name="line.151"></a>
+<span class="sourceLineNo">152</span><a name="line.152"></a>
+<span class="sourceLineNo">153</span>  @Test<a name="line.153"></a>
+<span class="sourceLineNo">154</span>  public void testBypassingWaitingTimeoutProcedures() throws Exception {<a name="line.154"></a>
+<span class="sourceLineNo">155</span>    final WaitingTimeoutProcedure proc = new WaitingTimeoutProcedure();<a name="line.155"></a>
+<span class="sourceLineNo">156</span>    long id = procExecutor.submitProcedure(proc);<a name="line.156"></a>
+<span class="sourceLineNo">157</span>    Thread.sleep(500);<a name="line.157"></a>
+<span class="sourceLineNo">158</span>    // bypass the procedure<a name="line.158"></a>
+<span class="sourceLineNo">159</span>    assertTrue(procExecutor.bypassProcedure(id, 1000, true, false));<a name="line.159"></a>
 <span class="sourceLineNo">160</span><a name="line.160"></a>
-<span class="sourceLineNo">161</span>    public SuspendProcedure() {<a name="line.161"></a>
-<span class="sourceLineNo">162</span>      super();<a name="line.162"></a>
-<span class="sourceLineNo">163</span>    }<a name="line.163"></a>
+<span class="sourceLineNo">161</span>    htu.waitFor(5000, () -&gt; proc.isSuccess() &amp;&amp; proc.isBypass());<a name="line.161"></a>
+<span class="sourceLineNo">162</span>    LOG.info("{} finished", proc);<a name="line.162"></a>
+<span class="sourceLineNo">163</span>  }<a name="line.163"></a>
 <span class="sourceLineNo">164</span><a name="line.164"></a>
-<span class="sourceLineNo">165</span>    @Override<a name="line.165"></a>
-<span class="sourceLineNo">166</span>    protected Procedure[] execute(final TestProcEnv env)<a name="line.166"></a>
-<span class="sourceLineNo">167</span>        throws ProcedureSuspendedException {<a name="line.167"></a>
-<span class="sourceLineNo">168</span>      // Always suspend the procedure<a name="line.168"></a>
-<span class="sourceLineNo">169</span>      throw new ProcedureSuspendedException();<a name="line.169"></a>
-<span class="sourceLineNo">170</span>    }<a name="line.170"></a>
-<span class="sourceLineNo">171</span>  }<a name="line.171"></a>
-<span class="sourceLineNo">172</span><a name="line.172"></a>
-<span class="sourceLineNo">173</span>  public static class StuckProcedure extends ProcedureTestingUtility.NoopProcedure&lt;TestProcEnv&gt; {<a name="line.173"></a>
-<span class="sourceLineNo">174</span><a name="line.174"></a>
-<span class="sourceLineNo">175</span>    public StuckProcedure() {<a name="line.175"></a>
-<span class="sourceLineNo">176</span>      super();<a name="line.176"></a>
-<span class="sourceLineNo">177</span>    }<a name="line.177"></a>
-<span class="sourceLineNo">178</span><a name="line.178"></a>
-<span class="sourceLineNo">179</span>    @Override<a name="line.179"></a>
-<span class="sourceLineNo">180</span>    protected Procedure[] execute(final TestProcEnv env) {<a name="line.180"></a>
-<span class="sourceLineNo">181</span>      try {<a name="line.181"></a>
-<span class="sourceLineNo">182</span>        Thread.sleep(Long.MAX_VALUE);<a name="line.182"></a>
-<span class="sourceLineNo">183</span>      } catch (Throwable t) {<a name="line.183"></a>
-<span class="sourceLineNo">184</span>        LOG.debug("Sleep is interrupted.", t);<a name="line.184"></a>
-<span class="sourceLineNo">185</span>      }<a name="line.185"></a>
-<span class="sourceLineNo">186</span>      return null;<a name="line.186"></a>
-<span class="sourceLineNo">187</span>    }<a name="line.187"></a>
-<span class="sourceLineNo">188</span><a name="line.188"></a>
-<span class="sourceLineNo">189</span>  }<a name="line.189"></a>
-<span class="sourceLineNo">190</span><a name="line.190"></a>
+<span class="sourceLineNo">165</span>  @AfterClass<a name="line.165"></a>
+<span class="sourceLineNo">166</span>  public static void tearDown() throws Exception {<a name="line.166"></a>
+<span class="sourceLineNo">167</span>    procExecutor.stop();<a name="line.167"></a>
+<span class="sourceLineNo">168</span>    procStore.stop(false);<a name="line.168"></a>
+<span class="sourceLineNo">169</span>    procExecutor.join();<a name="line.169"></a>
+<span class="sourceLineNo">170</span>  }<a name="line.170"></a>
+<span class="sourceLineNo">171</span><a name="line.171"></a>
+<span class="sourceLineNo">172</span>  public static class SuspendProcedure extends ProcedureTestingUtility.NoopProcedure&lt;TestProcEnv&gt; {<a name="line.172"></a>
+<span class="sourceLineNo">173</span><a name="line.173"></a>
+<span class="sourceLineNo">174</span>    public SuspendProcedure() {<a name="line.174"></a>
+<span class="sourceLineNo">175</span>      super();<a name="line.175"></a>
+<span class="sourceLineNo">176</span>    }<a name="line.176"></a>
+<span class="sourceLineNo">177</span><a name="line.177"></a>
+<span class="sourceLineNo">178</span>    @Override<a name="line.178"></a>
+<span class="sourceLineNo">179</span>    protected Procedure[] execute(final TestProcEnv env)<a name="line.179"></a>
+<span class="sourceLineNo">180</span>        throws ProcedureSuspendedException {<a name="line.180"></a>
+<span class="sourceLineNo">181</span>      // Always suspend the procedure<a name="line.181"></a>
+<span class="sourceLineNo">182</span>      throw new ProcedureSuspendedException();<a name="line.182"></a>
+<span class="sourceLineNo">183</span>    }<a name="line.183"></a>
+<span class="sourceLineNo">184</span>  }<a name="line.184"></a>
+<span class="sourceLineNo">185</span><a name="line.185"></a>
+<span class="sourceLineNo">186</span>  public static class StuckProcedure extends ProcedureTestingUtility.NoopProcedure&lt;TestProcEnv&gt; {<a name="line.186"></a>
+<span class="sourceLineNo">187</span><a name="line.187"></a>
+<span class="sourceLineNo">188</span>    public StuckProcedure() {<a name="line.188"></a>
+<span class="sourceLineNo">189</span>      super();<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>  public static class RootProcedure extends ProcedureTestingUtility.NoopProcedure&lt;TestProcEnv&gt; {<a name="line.192"></a>
-<span class="sourceLineNo">193</span>    private boolean childSpwaned = false;<a name="line.193"></a>
-<span class="sourceLineNo">194</span><a name="line.194"></a>
-<span class="sourceLineNo">195</span>    public RootProcedure() {<a name="line.195"></a>
-<span class="sourceLineNo">196</span>      super();<a name="line.196"></a>
-<span class="sourceLineNo">197</span>    }<a name="line.197"></a>
-<span class="sourceLineNo">198</span><a name="line.198"></a>
-<span class="sourceLineNo">199</span>    @Override<a name="line.199"></a>
-<span class="sourceLineNo">200</span>    protected Procedure[] execute(final TestProcEnv env)<a name="line.200"></a>
-<span class="sourceLineNo">201</span>        throws ProcedureSuspendedException {<a name="line.201"></a>
-<span class="sourceLineNo">202</span>      if (!childSpwaned) {<a name="line.202"></a>
-<span class="sourceLineNo">203</span>        childSpwaned = true;<a name="line.203"></a>
-<span class="sourceLineNo">204</span>        return new Procedure[] {new SuspendProcedure()};<a name="line.204"></a>
-<span class="sourceLineNo">205</span>      } else {<a name="line.205"></a>
-<span class="sourceLineNo">206</span>        return null;<a name="line.206"></a>
-<span class="sourceLineNo">207</span>      }<a name="line.207"></a>
-<span class="sourceLineNo">208</span>    }<a name="line.208"></a>
-<span class="sourceLineNo">209</span>  }<a name="line.209"></a>
-<span class="sourceLineNo">210</span><a name="line.210"></a>
+<span class="sourceLineNo">192</span>    @Override<a name="line.192"></a>
+<span class="sourceLineNo">193</span>    protected Procedure[] execute(final TestProcEnv env) {<a name="line.193"></a>
+<span class="sourceLineNo">194</span>      try {<a name="line.194"></a>
+<span class="sourceLineNo">195</span>        Thread.sleep(Long.MAX_VALUE);<a name="line.195"></a>
+<span class="sourceLineNo">196</span>      } catch (Throwable t) {<a name="line.196"></a>
+<span class="sourceLineNo">197</span>        LOG.debug("Sleep is interrupted.", t);<a name="line.197"></a>
+<span class="sourceLineNo">198</span>      }<a name="line.198"></a>
+<span class="sourceLineNo">199</span>      return null;<a name="line.199"></a>
+<span class="sourceLineNo">200</span>    }<a name="line.200"></a>
+<span class="sourceLineNo">201</span><a name="line.201"></a>
+<span class="sourceLineNo">202</span>  }<a name="line.202"></a>
+<span class="sourceLineNo">203</span><a name="line.203"></a>
+<span class="sourceLineNo">204</span><a name="line.204"></a>
+<span class="sourceLineNo">205</span>  public static class RootProcedure extends ProcedureTestingUtility.NoopProcedure&lt;TestProcEnv&gt; {<a name="line.205"></a>
+<span class="sourceLineNo">206</span>    private boolean childSpwaned = false;<a name="line.206"></a>
+<span class="sourceLineNo">207</span><a name="line.207"></a>
+<span class="sourceLineNo">208</span>    public RootProcedure() {<a name="line.208"></a>
+<span class="sourceLineNo">209</span>      super();<a name="line.209"></a>
+<span class="sourceLineNo">210</span>    }<a name="line.210"></a>
 <span class="sourceLineNo">211</span><a name="line.211"></a>
-<span class="sourceLineNo">212</span>  public enum StuckStateMachineState {<a name="line.212"></a>
-<span class="sourceLineNo">213</span>    START, THEN, END<a name="line.213"></a>
-<span class="sourceLineNo">214</span>  }<a name="line.214"></a>
-<span class="sourceLineNo">215</span><a name="line.215"></a>
-<span class="sourceLineNo">216</span>  public static class StuckStateMachineProcedure extends<a name="line.216"></a>
-<span class="sourceLineNo">217</span>      ProcedureTestingUtility.NoopStateMachineProcedure&lt;TestProcEnv, StuckStateMachineState&gt; {<a name="line.217"></a>
-<span class="sourceLineNo">218</span>    private AtomicBoolean stop = new AtomicBoolean(false);<a name="line.218"></a>
-<span class="sourceLineNo">219</span><a name="line.219"></a>
-<span class="sourceLineNo">220</span>    public StuckStateMachineProcedure() {<a name="line.220"></a>
-<span class="sourceLineNo">221</span>      super();<a name="line.221"></a>
-<span class="sourceLineNo">222</span>    }<a name="line.222"></a>
+<span class="sourceLineNo">212</span>    @Override<a name="line.212"></a>
+<span class="sourceLineNo">213</span>    protected Procedure[] execute(final TestProcEnv env)<a name="line.213"></a>
+<span class="sourceLineNo">214</span>        throws ProcedureSuspendedException {<a name="line.214"></a>
+<span class="sourceLineNo">215</span>      if (!childSpwaned) {<a name="line.215"></a>
+<span class="sourceLineNo">216</span>        childSpwaned = true;<a name="line.216"></a>
+<span class="sourceLineNo">217</span>        return new Procedure[] {new SuspendProcedure()};<a name="line.217"></a>
+<span class="sourceLineNo">218</span>      } else {<a name="line.218"></a>
+<span class="sourceLineNo">219</span>        return null;<a name="line.219"></a>
+<span class="sourceLineNo">220</span>      }<a name="line.220"></a>
+<span class="sourceLineNo">221</span>    }<a name="line.221"></a>
+<span class="sourceLineNo">222</span>  }<a name="line.222"></a>
 <span class="sourceLineNo">223</span><a name="line.223"></a>
-<span class="sourceLineNo">224</span>    public StuckStateMachineProcedure(TestProcEnv env, StuckStateMachineState initialState) {<a name="line.224"></a>
-<span class="sourceLineNo">225</span>      super(env, initialState);<a name="line.225"></a>
-<span class="sourceLineNo">226</span>    }<a name="line.226"></a>
-<span class="sourceLineNo">227</span><a name="line.227"></a>
-<span class="sourceLineNo">228</span>    @Override<a name="line.228"></a>
-<span class="sourceLineNo">229</span>    protected Flow executeFromState(TestProcEnv env, StuckStateMachineState tState)<a name="line.229"></a>
-<span class="sourceLineNo">230</span>            throws ProcedureSuspendedException, ProcedureYieldException, InterruptedException {<a name="line.230"></a>
-<span class="sourceLineNo">231</span>      switch (tState) {<a name="line.231"></a>
-<span class="sourceLineNo">232</span>        case START:<a name="line.232"></a>
-<span class="sourceLineNo">233</span>          LOG.info("PHASE 1: START");<a name="line.233"></a>
-<span class="sourceLineNo">234</span>          setNextState(StuckStateMachineState.THEN);<a name="line.234"></a>
-<span class="sourceLineNo">235</span>          return Flow.HAS_MORE_STATE;<a name="line.235"></a>
-<span class="sourceLineNo">236</span>        case THEN:<a name="line.236"></a>
-<span class="sourceLineNo">237</span>          if (stop.get()) {<a name="line.237"></a>
-<span class="sourceLineNo">238</span>            setNextState(StuckStateMachineState.END);<a name="line.238"></a>
-<span class="sourceLineNo">239</span>          }<a name="line.239"></a>
-<span class="sourceLineNo">240</span>          return Flow.HAS_MORE_STATE;<a name="line.240"></a>
-<span class="sourceLineNo">241</span>        case END:<a name="line.241"></a>
-<span class="sourceLineNo">242</span>          return Flow.NO_MORE_STATE;<a name="line.242"></a>
-<span class="sourceLineNo">243</span>        default:<a name="line.243"></a>
-<span class="sourceLineNo">244</span>          throw new UnsupportedOperationException("unhandled state=" + tState);<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">224</span>  public static class WaitingTimeoutProcedure<a name="line.224"></a>
+<span class="sourceLineNo">225</span>      extends ProcedureTestingUtility.NoopProcedure&lt;TestProcEnv&gt; {<a name="line.225"></a>
+<span class="sourceLineNo">226</span>    public WaitingTimeoutProcedure() {<a name="line.226"></a>
+<span class="sourceLineNo">227</span>      super();<a name="line.227"></a>
+<span class="sourceLineNo">228</span>    }<a name="line.228"></a>
+<span class="sourceLineNo">229</span><a name="line.229"></a>
+<span class="sourceLineNo">230</span>    @Override<a name="line.230"></a>
+<span class="sourceLineNo">231</span>    protected Procedure[] execute(final TestProcEnv env)<a name="line.231"></a>
+<span class="sourceLineNo">232</span>        throws ProcedureSuspendedException {<a name="line.232"></a>
+<span class="sourceLineNo">233</span>      // Always suspend the procedure<a name="line.233"></a>
+<span class="sourceLineNo">234</span>      setTimeout(50000);<a name="line.234"></a>
+<span class="sourceLineNo">235</span>      setState(ProcedureProtos.ProcedureState.WAITING_TIMEOUT);<a name="line.235"></a>
+<span class="sourceLineNo">236</span>      skipPersistence();<a name="line.236"></a>
+<span class="sourceLineNo">237</span>      throw new ProcedureSuspendedException();<a name="line.237"></a>
+<span class="sourceLineNo">238</span>    }<a name="line.238"></a>
+<span class="sourceLineNo">239</span><a name="line.239"></a>
+<span class="sourceLineNo">240</span>    @Override<a name="line.240"></a>
+<span class="sourceLineNo">241</span>    protected synchronized boolean setTimeoutFailure(TestProcEnv env) {<a name="line.241"></a>
+<span class="sourceLineNo">242</span>      setState(ProcedureProtos.ProcedureState.RUNNABLE);<a name="line.242"></a>
+<span class="sourceLineNo">243</span>      procExecutor.getScheduler().addFront(this);<a name="line.243"></a>
+<span class="sourceLineNo">244</span>      return false; // 'false' means that this procedure handled the timeout<a name="line.244"></a>
+<span class="sourceLineNo">245</span>    }<a name="line.245"></a>
+<span class="sourceLineNo">246</span>  }<a name="line.246"></a>
 <span class="sourceLineNo">247</span><a name="line.247"></a>
-<span class="sourceLineNo">248</span>    @Override<a name="line.248"></a>
-<span class="sourceLineNo">249</span>    protected StuckStateMachineState getState(int stateId) {<a name="line.249"></a>
-<span class="sourceLineNo">250</span>      return StuckStateMachineState.values()[stateId];<a name="line.250"></a>
-<span class="sourceLineNo">251</span>    }<a name="line.251"></a>
-<span class="sourceLineNo">252</span><a name="line.252"></a>
-<span class="sourceLineNo">253</span>    @Override<a name="line.253"></a>
-<span class="sourceLineNo">254</span>    protected int getStateId(StuckStateMachineState tState) {<a name="line.254"></a>
-<span class="sourceLineNo">255</span>      return tState.ordinal();<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">248</span>  public enum StuckStateMachineState {<a name="line.248"></a>
+<span class="sourceLineNo">249</span>    START, THEN, END<a name="line.249"></a>
+<span class="sourceLineNo">250</span>  }<a name="line.250"></a>
+<span class="sourceLineNo">251</span><a name="line.251"></a>
+<span class="sourceLineNo">252</span>  public static class StuckStateMachineProcedure extends<a name="line.252"></a>
+<span class="sourceLineNo">253</span>      ProcedureTestingUtility.NoopStateMachineProcedure&lt;TestProcEnv, StuckStateMachineState&gt; {<a name="line.253"></a>
+<span class="sourceLineNo">254</span>    private AtomicBoolean stop = new AtomicBoolean(false);<a name="line.254"></a>
+<span class="sourceLineNo">255</span><a name="line.255"></a>
+<span class="sourceLineNo">256</span>    public StuckStateMachineProcedure() {<a name="line.256"></a>
+<span class="sourceLineNo">257</span>      super();<a name="line.257"></a>
+<span class="sourceLineNo">258</span>    }<a name="line.258"></a>
 <span class="sourceLineNo">259</span><a name="line.259"></a>
-<span class="sourceLineNo">260</span>}<a name="line.260"></a>
+<span class="sourceLineNo">260</span>    public StuckStateMachineProcedure(TestProcEnv env, StuckStateMachineState initialState) {<a name="line.260"></a>
+<span class="sourceLineNo">261</span>      super(env, initialState);<a name="line.261"></a>
+<span class="sourceLineNo">262</span>    }<a name="line.262"></a>
+<span class="sourceLineNo">263</span><a name="line.263"></a>
+<span class="sourceLineNo">264</span>    @Override<a name="line.264"></a>
+<span class="sourceLineNo">265</span>    protected Flow executeFromState(TestProcEnv env, StuckStateMachineState tState)<a name="line.265"></a>
+<span class="sourceLineNo">266</span>            throws ProcedureSuspendedException, ProcedureYieldException, InterruptedException {<a name="line.266"></a>
+<span class="sourceLineNo">267</span>      switch (tState) {<a name="line.267"></a>
+<span class="sourceLineNo">268</span>        case START:<a name="line.268"></a>
+<span class="sourceLineNo">269</span>          LOG.info("PHASE 1: START");<a name="line.269"></a>
+<span class="sourceLineNo">270</span>          setNextState(StuckStateMachineState.THEN);<a name="line.270"></a>
+<span class="sourceLineNo">271</span>          return Flow.HAS_MORE_STATE;<a name="line.271"></a>
+<span class="sourceLineNo">272</span>        case THEN:<a name="line.272"></a>
+<span class="sourceLineNo">273</span>          if (stop.get()) {<a name="line.273"></a>
+<span class="sourceLineNo">274</span>            setNextState(StuckStateMachineState.END);<a name="line.274"></a>
+<span class="sourceLineNo">275</span>          }<a name="line.275"></a>
+<span class="sourceLineNo">276</span>          return Flow.HAS_MORE_STATE;<a name="line.276"></a>
+<span class="sourceLineNo">277</span>        case END:<a name="line.277"></a>
+<span class="sourceLineNo">278</span>          return Flow.NO_MORE_STATE;<a name="line.278"></a>
+<span class="sourceLineNo">279</span>        default:<a name="line.279"></a>
+<span class="sourceLineNo">280</span>          throw new UnsupportedOperationException("unhandled state=" + tState);<a name="line.280"></a>
+<span class="sourceLineNo">281</span>      }<a name="line.281"></a>
+<span class="sourceLineNo">282</span>    }<a name="line.282"></a>
+<span class="sourceLineNo">283</span><a name="line.283"></a>
+<span class="sourceLineNo">284</span>    @Override<a name="line.284"></a>
+<span class="sourceLineNo">285</span>    protected StuckStateMachineState getState(int stateId) {<a name="line.285"></a>
+<span class="sourceLineNo">286</span>      return StuckStateMachineState.values()[stateId];<a name="line.286"></a>
+<span class="sourceLineNo">287</span>    }<a name="line.287"></a>
+<span class="sourceLineNo">288</span><a name="line.288"></a>
+<span class="sourceLineNo">289</span>    @Override<a name="line.289"></a>
+<span class="sourceLineNo">290</span>    protected int getStateId(StuckStateMachineState tState) {<a name="line.290"></a>
+<span class="sourceLineNo">291</span>      return tState.ordinal();<a name="line.291"></a>
+<span class="sourceLineNo">292</span>    }<a name="line.292"></a>
+<span class="sourceLineNo">293</span>  }<a name="line.293"></a>
+<span class="sourceLineNo">294</span><a name="line.294"></a>
+<span class="sourceLineNo">295</span><a name="line.295"></a>
+<span class="sourceLineNo">296</span>}<a name="line.296"></a>
 
 
 


[11/29] hbase-site git commit: Published site at 5e84997f2ffdbcf5f849d70c30ddbe2db4039ca4.

Posted by gi...@apache.org.
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/27f5bfb5/devapidocs/src-html/org/apache/hadoop/hbase/zookeeper/ZKConfig.html
----------------------------------------------------------------------
diff --git a/devapidocs/src-html/org/apache/hadoop/hbase/zookeeper/ZKConfig.html b/devapidocs/src-html/org/apache/hadoop/hbase/zookeeper/ZKConfig.html
index 6c6f61c..b62c8a9 100644
--- a/devapidocs/src-html/org/apache/hadoop/hbase/zookeeper/ZKConfig.html
+++ b/devapidocs/src-html/org/apache/hadoop/hbase/zookeeper/ZKConfig.html
@@ -30,315 +30,340 @@
 <span class="sourceLineNo">022</span>import java.util.Map.Entry;<a name="line.22"></a>
 <span class="sourceLineNo">023</span>import java.util.Properties;<a name="line.23"></a>
 <span class="sourceLineNo">024</span><a name="line.24"></a>
-<span class="sourceLineNo">025</span>import org.apache.hadoop.conf.Configuration;<a name="line.25"></a>
-<span class="sourceLineNo">026</span>import org.apache.hadoop.hbase.HConstants;<a name="line.26"></a>
-<span class="sourceLineNo">027</span>import org.apache.hadoop.util.StringUtils;<a name="line.27"></a>
-<span class="sourceLineNo">028</span>import org.apache.yetus.audience.InterfaceAudience;<a name="line.28"></a>
-<span class="sourceLineNo">029</span><a name="line.29"></a>
-<span class="sourceLineNo">030</span>import org.apache.hbase.thirdparty.com.google.common.annotations.VisibleForTesting;<a name="line.30"></a>
-<span class="sourceLineNo">031</span><a name="line.31"></a>
-<span class="sourceLineNo">032</span>/**<a name="line.32"></a>
-<span class="sourceLineNo">033</span> * Utility methods for reading, and building the ZooKeeper configuration.<a name="line.33"></a>
-<span class="sourceLineNo">034</span> *<a name="line.34"></a>
-<span class="sourceLineNo">035</span> * The order and priority for reading the config are as follows:<a name="line.35"></a>
-<span class="sourceLineNo">036</span> * (1). Property with "hbase.zookeeper.property." prefix from HBase XML<a name="line.36"></a>
-<span class="sourceLineNo">037</span> * (2). other zookeeper related properties in HBASE XML<a name="line.37"></a>
-<span class="sourceLineNo">038</span> */<a name="line.38"></a>
-<span class="sourceLineNo">039</span>@InterfaceAudience.Private<a name="line.39"></a>
-<span class="sourceLineNo">040</span>public final class ZKConfig {<a name="line.40"></a>
-<span class="sourceLineNo">041</span><a name="line.41"></a>
-<span class="sourceLineNo">042</span>  private static final String VARIABLE_START = "${";<a name="line.42"></a>
-<span class="sourceLineNo">043</span><a name="line.43"></a>
-<span class="sourceLineNo">044</span>  private ZKConfig() {<a name="line.44"></a>
-<span class="sourceLineNo">045</span>  }<a name="line.45"></a>
-<span class="sourceLineNo">046</span><a name="line.46"></a>
-<span class="sourceLineNo">047</span>  /**<a name="line.47"></a>
-<span class="sourceLineNo">048</span>   * Make a Properties object holding ZooKeeper config.<a name="line.48"></a>
-<span class="sourceLineNo">049</span>   * Parses the corresponding config options from the HBase XML configs<a name="line.49"></a>
-<span class="sourceLineNo">050</span>   * and generates the appropriate ZooKeeper properties.<a name="line.50"></a>
-<span class="sourceLineNo">051</span>   * @param conf Configuration to read from.<a name="line.51"></a>
-<span class="sourceLineNo">052</span>   * @return Properties holding mappings representing ZooKeeper config file.<a name="line.52"></a>
-<span class="sourceLineNo">053</span>   */<a name="line.53"></a>
-<span class="sourceLineNo">054</span>  public static Properties makeZKProps(Configuration conf) {<a name="line.54"></a>
-<span class="sourceLineNo">055</span>    return makeZKPropsFromHbaseConfig(conf);<a name="line.55"></a>
-<span class="sourceLineNo">056</span>  }<a name="line.56"></a>
-<span class="sourceLineNo">057</span><a name="line.57"></a>
-<span class="sourceLineNo">058</span>  /**<a name="line.58"></a>
-<span class="sourceLineNo">059</span>   * Make a Properties object holding ZooKeeper config.<a name="line.59"></a>
-<span class="sourceLineNo">060</span>   * Parses the corresponding config options from the HBase XML configs<a name="line.60"></a>
-<span class="sourceLineNo">061</span>   * and generates the appropriate ZooKeeper properties.<a name="line.61"></a>
-<span class="sourceLineNo">062</span>   *<a name="line.62"></a>
-<span class="sourceLineNo">063</span>   * @param conf Configuration to read from.<a name="line.63"></a>
-<span class="sourceLineNo">064</span>   * @return Properties holding mappings representing ZooKeeper config file.<a name="line.64"></a>
-<span class="sourceLineNo">065</span>   */<a name="line.65"></a>
-<span class="sourceLineNo">066</span>  private static Properties makeZKPropsFromHbaseConfig(Configuration conf) {<a name="line.66"></a>
-<span class="sourceLineNo">067</span>    Properties zkProperties = new Properties();<a name="line.67"></a>
-<span class="sourceLineNo">068</span><a name="line.68"></a>
-<span class="sourceLineNo">069</span>    // Directly map all of the hbase.zookeeper.property.KEY properties.<a name="line.69"></a>
-<span class="sourceLineNo">070</span>    // Synchronize on conf so no loading of configs while we iterate<a name="line.70"></a>
-<span class="sourceLineNo">071</span>    synchronized (conf) {<a name="line.71"></a>
-<span class="sourceLineNo">072</span>      for (Entry&lt;String, String&gt; entry : conf) {<a name="line.72"></a>
-<span class="sourceLineNo">073</span>        String key = entry.getKey();<a name="line.73"></a>
-<span class="sourceLineNo">074</span>        if (key.startsWith(HConstants.ZK_CFG_PROPERTY_PREFIX)) {<a name="line.74"></a>
-<span class="sourceLineNo">075</span>          String zkKey = key.substring(HConstants.ZK_CFG_PROPERTY_PREFIX_LEN);<a name="line.75"></a>
-<span class="sourceLineNo">076</span>          String value = entry.getValue();<a name="line.76"></a>
-<span class="sourceLineNo">077</span>          // If the value has variables substitutions, need to do a get.<a name="line.77"></a>
-<span class="sourceLineNo">078</span>          if (value.contains(VARIABLE_START)) {<a name="line.78"></a>
-<span class="sourceLineNo">079</span>            value = conf.get(key);<a name="line.79"></a>
-<span class="sourceLineNo">080</span>          }<a name="line.80"></a>
-<span class="sourceLineNo">081</span>          zkProperties.setProperty(zkKey, value);<a name="line.81"></a>
-<span class="sourceLineNo">082</span>        }<a name="line.82"></a>
-<span class="sourceLineNo">083</span>      }<a name="line.83"></a>
-<span class="sourceLineNo">084</span>    }<a name="line.84"></a>
-<span class="sourceLineNo">085</span><a name="line.85"></a>
-<span class="sourceLineNo">086</span>    // If clientPort is not set, assign the default.<a name="line.86"></a>
-<span class="sourceLineNo">087</span>    if (zkProperties.getProperty(HConstants.CLIENT_PORT_STR) == null) {<a name="line.87"></a>
-<span class="sourceLineNo">088</span>      zkProperties.put(HConstants.CLIENT_PORT_STR,<a name="line.88"></a>
-<span class="sourceLineNo">089</span>          HConstants.DEFAULT_ZOOKEEPER_CLIENT_PORT);<a name="line.89"></a>
-<span class="sourceLineNo">090</span>    }<a name="line.90"></a>
-<span class="sourceLineNo">091</span><a name="line.91"></a>
-<span class="sourceLineNo">092</span>    // Create the server.X properties.<a name="line.92"></a>
-<span class="sourceLineNo">093</span>    int peerPort = conf.getInt("hbase.zookeeper.peerport", 2888);<a name="line.93"></a>
-<span class="sourceLineNo">094</span>    int leaderPort = conf.getInt("hbase.zookeeper.leaderport", 3888);<a name="line.94"></a>
-<span class="sourceLineNo">095</span><a name="line.95"></a>
-<span class="sourceLineNo">096</span>    final String[] serverHosts = conf.getStrings(HConstants.ZOOKEEPER_QUORUM,<a name="line.96"></a>
-<span class="sourceLineNo">097</span>                                                 HConstants.LOCALHOST);<a name="line.97"></a>
-<span class="sourceLineNo">098</span>    String serverHost;<a name="line.98"></a>
-<span class="sourceLineNo">099</span>    String address;<a name="line.99"></a>
-<span class="sourceLineNo">100</span>    String key;<a name="line.100"></a>
-<span class="sourceLineNo">101</span>    for (int i = 0; i &lt; serverHosts.length; ++i) {<a name="line.101"></a>
-<span class="sourceLineNo">102</span>      if (serverHosts[i].contains(":")) {<a name="line.102"></a>
-<span class="sourceLineNo">103</span>        serverHost = serverHosts[i].substring(0, serverHosts[i].indexOf(':'));<a name="line.103"></a>
-<span class="sourceLineNo">104</span>      } else {<a name="line.104"></a>
-<span class="sourceLineNo">105</span>        serverHost = serverHosts[i];<a name="line.105"></a>
-<span class="sourceLineNo">106</span>      }<a name="line.106"></a>
-<span class="sourceLineNo">107</span>      address = serverHost + ":" + peerPort + ":" + leaderPort;<a name="line.107"></a>
-<span class="sourceLineNo">108</span>      key = "server." + i;<a name="line.108"></a>
-<span class="sourceLineNo">109</span>      zkProperties.put(key, address);<a name="line.109"></a>
-<span class="sourceLineNo">110</span>    }<a name="line.110"></a>
-<span class="sourceLineNo">111</span><a name="line.111"></a>
-<span class="sourceLineNo">112</span>    return zkProperties;<a name="line.112"></a>
-<span class="sourceLineNo">113</span>  }<a name="line.113"></a>
-<span class="sourceLineNo">114</span><a name="line.114"></a>
-<span class="sourceLineNo">115</span>  /**<a name="line.115"></a>
-<span class="sourceLineNo">116</span>   * Return the ZK Quorum servers string given the specified configuration<a name="line.116"></a>
-<span class="sourceLineNo">117</span>   *<a name="line.117"></a>
-<span class="sourceLineNo">118</span>   * @param conf<a name="line.118"></a>
-<span class="sourceLineNo">119</span>   * @return Quorum servers String<a name="line.119"></a>
-<span class="sourceLineNo">120</span>   */<a name="line.120"></a>
-<span class="sourceLineNo">121</span>  private static String getZKQuorumServersStringFromHbaseConfig(Configuration conf) {<a name="line.121"></a>
-<span class="sourceLineNo">122</span>    String defaultClientPort = Integer.toString(<a name="line.122"></a>
-<span class="sourceLineNo">123</span>        conf.getInt(HConstants.ZOOKEEPER_CLIENT_PORT, HConstants.DEFAULT_ZOOKEEPER_CLIENT_PORT));<a name="line.123"></a>
-<span class="sourceLineNo">124</span><a name="line.124"></a>
-<span class="sourceLineNo">125</span>    // Build the ZK quorum server string with "server:clientport" list, separated by ','<a name="line.125"></a>
-<span class="sourceLineNo">126</span>    final String[] serverHosts =<a name="line.126"></a>
-<span class="sourceLineNo">127</span>        conf.getStrings(HConstants.ZOOKEEPER_QUORUM, HConstants.LOCALHOST);<a name="line.127"></a>
-<span class="sourceLineNo">128</span>    return buildZKQuorumServerString(serverHosts, defaultClientPort);<a name="line.128"></a>
-<span class="sourceLineNo">129</span>  }<a name="line.129"></a>
-<span class="sourceLineNo">130</span><a name="line.130"></a>
-<span class="sourceLineNo">131</span>  /**<a name="line.131"></a>
-<span class="sourceLineNo">132</span>   * Return the ZK Quorum servers string given the specified configuration.<a name="line.132"></a>
-<span class="sourceLineNo">133</span>   * @return Quorum servers<a name="line.133"></a>
-<span class="sourceLineNo">134</span>   */<a name="line.134"></a>
-<span class="sourceLineNo">135</span>  public static String getZKQuorumServersString(Configuration conf) {<a name="line.135"></a>
-<span class="sourceLineNo">136</span>    return getZKQuorumServersStringFromHbaseConfig(conf);<a name="line.136"></a>
-<span class="sourceLineNo">137</span>  }<a name="line.137"></a>
-<span class="sourceLineNo">138</span><a name="line.138"></a>
-<span class="sourceLineNo">139</span>  /**<a name="line.139"></a>
-<span class="sourceLineNo">140</span>   * Build the ZK quorum server string with "server:clientport" list, separated by ','<a name="line.140"></a>
-<span class="sourceLineNo">141</span>   *<a name="line.141"></a>
-<span class="sourceLineNo">142</span>   * @param serverHosts a list of servers for ZK quorum<a name="line.142"></a>
-<span class="sourceLineNo">143</span>   * @param clientPort the default client port<a name="line.143"></a>
-<span class="sourceLineNo">144</span>   * @return the string for a list of "server:port" separated by ","<a name="line.144"></a>
-<span class="sourceLineNo">145</span>   */<a name="line.145"></a>
-<span class="sourceLineNo">146</span>  public static String buildZKQuorumServerString(String[] serverHosts, String clientPort) {<a name="line.146"></a>
-<span class="sourceLineNo">147</span>    StringBuilder quorumStringBuilder = new StringBuilder();<a name="line.147"></a>
-<span class="sourceLineNo">148</span>    String serverHost;<a name="line.148"></a>
-<span class="sourceLineNo">149</span>    for (int i = 0; i &lt; serverHosts.length; ++i) {<a name="line.149"></a>
-<span class="sourceLineNo">150</span>      if (serverHosts[i].contains(":")) {<a name="line.150"></a>
-<span class="sourceLineNo">151</span>        serverHost = serverHosts[i]; // just use the port specified from the input<a name="line.151"></a>
-<span class="sourceLineNo">152</span>      } else {<a name="line.152"></a>
-<span class="sourceLineNo">153</span>        serverHost = serverHosts[i] + ":" + clientPort;<a name="line.153"></a>
-<span class="sourceLineNo">154</span>      }<a name="line.154"></a>
-<span class="sourceLineNo">155</span>      if (i &gt; 0) {<a name="line.155"></a>
-<span class="sourceLineNo">156</span>        quorumStringBuilder.append(',');<a name="line.156"></a>
-<span class="sourceLineNo">157</span>      }<a name="line.157"></a>
-<span class="sourceLineNo">158</span>      quorumStringBuilder.append(serverHost);<a name="line.158"></a>
-<span class="sourceLineNo">159</span>    }<a name="line.159"></a>
-<span class="sourceLineNo">160</span>    return quorumStringBuilder.toString();<a name="line.160"></a>
-<span class="sourceLineNo">161</span>  }<a name="line.161"></a>
-<span class="sourceLineNo">162</span><a name="line.162"></a>
-<span class="sourceLineNo">163</span>  /**<a name="line.163"></a>
-<span class="sourceLineNo">164</span>   * Verifies that the given key matches the expected format for a ZooKeeper cluster key.<a name="line.164"></a>
-<span class="sourceLineNo">165</span>   * The Quorum for the ZK cluster can have one the following formats (see examples below):<a name="line.165"></a>
-<span class="sourceLineNo">166</span>   *<a name="line.166"></a>
-<span class="sourceLineNo">167</span>   * &lt;ol&gt;<a name="line.167"></a>
-<span class="sourceLineNo">168</span>   *   &lt;li&gt;s1,s2,s3 (no client port in the list, the client port could be obtained from<a name="line.168"></a>
-<span class="sourceLineNo">169</span>   *       clientPort)&lt;/li&gt;<a name="line.169"></a>
-<span class="sourceLineNo">170</span>   *   &lt;li&gt;s1:p1,s2:p2,s3:p3 (with client port, which could be same or different for each server,<a name="line.170"></a>
-<span class="sourceLineNo">171</span>   *       in this case, the clientPort would be ignored)&lt;/li&gt;<a name="line.171"></a>
-<span class="sourceLineNo">172</span>   *   &lt;li&gt;s1:p1,s2,s3:p3 (mix of (1) and (2) - if port is not specified in a server, it would use<a name="line.172"></a>
-<span class="sourceLineNo">173</span>   *       the clientPort; otherwise, it would use the specified port)&lt;/li&gt;<a name="line.173"></a>
-<span class="sourceLineNo">174</span>   * &lt;/ol&gt;<a name="line.174"></a>
-<span class="sourceLineNo">175</span>   *<a name="line.175"></a>
-<span class="sourceLineNo">176</span>   * @param key the cluster key to validate<a name="line.176"></a>
-<span class="sourceLineNo">177</span>   * @throws IOException if the key could not be parsed<a name="line.177"></a>
-<span class="sourceLineNo">178</span>   */<a name="line.178"></a>
-<span class="sourceLineNo">179</span>  public static void validateClusterKey(String key) throws IOException {<a name="line.179"></a>
-<span class="sourceLineNo">180</span>    transformClusterKey(key);<a name="line.180"></a>
-<span class="sourceLineNo">181</span>  }<a name="line.181"></a>
-<span class="sourceLineNo">182</span><a name="line.182"></a>
-<span class="sourceLineNo">183</span>  /**<a name="line.183"></a>
-<span class="sourceLineNo">184</span>   * Separate the given key into the three configurations it should contain:<a name="line.184"></a>
-<span class="sourceLineNo">185</span>   * hbase.zookeeper.quorum, hbase.zookeeper.client.port<a name="line.185"></a>
-<span class="sourceLineNo">186</span>   * and zookeeper.znode.parent<a name="line.186"></a>
-<span class="sourceLineNo">187</span>   * @param key<a name="line.187"></a>
-<span class="sourceLineNo">188</span>   * @return the three configuration in the described order<a name="line.188"></a>
-<span class="sourceLineNo">189</span>   * @throws IOException<a name="line.189"></a>
-<span class="sourceLineNo">190</span>   */<a name="line.190"></a>
-<span class="sourceLineNo">191</span>  public static ZKClusterKey transformClusterKey(String key) throws IOException {<a name="line.191"></a>
-<span class="sourceLineNo">192</span>    String[] parts = key.split(":");<a name="line.192"></a>
-<span class="sourceLineNo">193</span><a name="line.193"></a>
-<span class="sourceLineNo">194</span>    if (parts.length == 3) {<a name="line.194"></a>
-<span class="sourceLineNo">195</span>      if (!parts[2].matches("/.*[^/]")) {<a name="line.195"></a>
-<span class="sourceLineNo">196</span>        throw new IOException("Cluster key passed " + key + " is invalid, the format should be:" +<a name="line.196"></a>
-<span class="sourceLineNo">197</span>            HConstants.ZOOKEEPER_QUORUM + ":" + HConstants.ZOOKEEPER_CLIENT_PORT + ":"<a name="line.197"></a>
-<span class="sourceLineNo">198</span>            + HConstants.ZOOKEEPER_ZNODE_PARENT);<a name="line.198"></a>
-<span class="sourceLineNo">199</span>      }<a name="line.199"></a>
-<span class="sourceLineNo">200</span>      return new ZKClusterKey(parts [0], Integer.parseInt(parts [1]), parts [2]);<a name="line.200"></a>
-<span class="sourceLineNo">201</span>    }<a name="line.201"></a>
-<span class="sourceLineNo">202</span><a name="line.202"></a>
-<span class="sourceLineNo">203</span>    if (parts.length &gt; 3) {<a name="line.203"></a>
-<span class="sourceLineNo">204</span>      // The quorum could contain client port in server:clientport format, try to transform more.<a name="line.204"></a>
-<span class="sourceLineNo">205</span>      String zNodeParent = parts [parts.length - 1];<a name="line.205"></a>
-<span class="sourceLineNo">206</span>      if (!zNodeParent.matches("/.*[^/]")) {<a name="line.206"></a>
-<span class="sourceLineNo">207</span>        throw new IOException("Cluster key passed " + key + " is invalid, the format should be:"<a name="line.207"></a>
-<span class="sourceLineNo">208</span>            + HConstants.ZOOKEEPER_QUORUM + ":" + HConstants.ZOOKEEPER_CLIENT_PORT + ":"<a name="line.208"></a>
-<span class="sourceLineNo">209</span>            + HConstants.ZOOKEEPER_ZNODE_PARENT);<a name="line.209"></a>
-<span class="sourceLineNo">210</span>      }<a name="line.210"></a>
-<span class="sourceLineNo">211</span><a name="line.211"></a>
-<span class="sourceLineNo">212</span>      String clientPort = parts [parts.length - 2];<a name="line.212"></a>
-<span class="sourceLineNo">213</span><a name="line.213"></a>
-<span class="sourceLineNo">214</span>      // The first part length is the total length minus the lengths of other parts and minus 2 ":"<a name="line.214"></a>
-<span class="sourceLineNo">215</span>      int endQuorumIndex = key.length() - zNodeParent.length() - clientPort.length() - 2;<a name="line.215"></a>
-<span class="sourceLineNo">216</span>      String quorumStringInput = key.substring(0, endQuorumIndex);<a name="line.216"></a>
-<span class="sourceLineNo">217</span>      String[] serverHosts = quorumStringInput.split(",");<a name="line.217"></a>
+<span class="sourceLineNo">025</span>import org.apache.commons.validator.routines.InetAddressValidator;<a name="line.25"></a>
+<span class="sourceLineNo">026</span>import org.apache.hadoop.conf.Configuration;<a name="line.26"></a>
+<span class="sourceLineNo">027</span>import org.apache.hadoop.hbase.HConstants;<a name="line.27"></a>
+<span class="sourceLineNo">028</span>import org.apache.hadoop.util.StringUtils;<a name="line.28"></a>
+<span class="sourceLineNo">029</span>import org.apache.yetus.audience.InterfaceAudience;<a name="line.29"></a>
+<span class="sourceLineNo">030</span><a name="line.30"></a>
+<span class="sourceLineNo">031</span>import org.apache.hbase.thirdparty.com.google.common.annotations.VisibleForTesting;<a name="line.31"></a>
+<span class="sourceLineNo">032</span><a name="line.32"></a>
+<span class="sourceLineNo">033</span>/**<a name="line.33"></a>
+<span class="sourceLineNo">034</span> * Utility methods for reading, and building the ZooKeeper configuration.<a name="line.34"></a>
+<span class="sourceLineNo">035</span> *<a name="line.35"></a>
+<span class="sourceLineNo">036</span> * The order and priority for reading the config are as follows:<a name="line.36"></a>
+<span class="sourceLineNo">037</span> * (1). Property with "hbase.zookeeper.property." prefix from HBase XML<a name="line.37"></a>
+<span class="sourceLineNo">038</span> * (2). other zookeeper related properties in HBASE XML<a name="line.38"></a>
+<span class="sourceLineNo">039</span> */<a name="line.39"></a>
+<span class="sourceLineNo">040</span>@InterfaceAudience.Private<a name="line.40"></a>
+<span class="sourceLineNo">041</span>public final class ZKConfig {<a name="line.41"></a>
+<span class="sourceLineNo">042</span><a name="line.42"></a>
+<span class="sourceLineNo">043</span>  private static final String VARIABLE_START = "${";<a name="line.43"></a>
+<span class="sourceLineNo">044</span><a name="line.44"></a>
+<span class="sourceLineNo">045</span>  private ZKConfig() {<a name="line.45"></a>
+<span class="sourceLineNo">046</span>  }<a name="line.46"></a>
+<span class="sourceLineNo">047</span><a name="line.47"></a>
+<span class="sourceLineNo">048</span>  /**<a name="line.48"></a>
+<span class="sourceLineNo">049</span>   * Make a Properties object holding ZooKeeper config.<a name="line.49"></a>
+<span class="sourceLineNo">050</span>   * Parses the corresponding config options from the HBase XML configs<a name="line.50"></a>
+<span class="sourceLineNo">051</span>   * and generates the appropriate ZooKeeper properties.<a name="line.51"></a>
+<span class="sourceLineNo">052</span>   * @param conf Configuration to read from.<a name="line.52"></a>
+<span class="sourceLineNo">053</span>   * @return Properties holding mappings representing ZooKeeper config file.<a name="line.53"></a>
+<span class="sourceLineNo">054</span>   */<a name="line.54"></a>
+<span class="sourceLineNo">055</span>  public static Properties makeZKProps(Configuration conf) {<a name="line.55"></a>
+<span class="sourceLineNo">056</span>    return makeZKPropsFromHbaseConfig(conf);<a name="line.56"></a>
+<span class="sourceLineNo">057</span>  }<a name="line.57"></a>
+<span class="sourceLineNo">058</span><a name="line.58"></a>
+<span class="sourceLineNo">059</span>  /**<a name="line.59"></a>
+<span class="sourceLineNo">060</span>   * Make a Properties object holding ZooKeeper config.<a name="line.60"></a>
+<span class="sourceLineNo">061</span>   * Parses the corresponding config options from the HBase XML configs<a name="line.61"></a>
+<span class="sourceLineNo">062</span>   * and generates the appropriate ZooKeeper properties.<a name="line.62"></a>
+<span class="sourceLineNo">063</span>   *<a name="line.63"></a>
+<span class="sourceLineNo">064</span>   * @param conf Configuration to read from.<a name="line.64"></a>
+<span class="sourceLineNo">065</span>   * @return Properties holding mappings representing ZooKeeper config file.<a name="line.65"></a>
+<span class="sourceLineNo">066</span>   */<a name="line.66"></a>
+<span class="sourceLineNo">067</span>  private static Properties makeZKPropsFromHbaseConfig(Configuration conf) {<a name="line.67"></a>
+<span class="sourceLineNo">068</span>    Properties zkProperties = new Properties();<a name="line.68"></a>
+<span class="sourceLineNo">069</span><a name="line.69"></a>
+<span class="sourceLineNo">070</span>    // Directly map all of the hbase.zookeeper.property.KEY properties.<a name="line.70"></a>
+<span class="sourceLineNo">071</span>    // Synchronize on conf so no loading of configs while we iterate<a name="line.71"></a>
+<span class="sourceLineNo">072</span>    synchronized (conf) {<a name="line.72"></a>
+<span class="sourceLineNo">073</span>      for (Entry&lt;String, String&gt; entry : conf) {<a name="line.73"></a>
+<span class="sourceLineNo">074</span>        String key = entry.getKey();<a name="line.74"></a>
+<span class="sourceLineNo">075</span>        if (key.startsWith(HConstants.ZK_CFG_PROPERTY_PREFIX)) {<a name="line.75"></a>
+<span class="sourceLineNo">076</span>          String zkKey = key.substring(HConstants.ZK_CFG_PROPERTY_PREFIX_LEN);<a name="line.76"></a>
+<span class="sourceLineNo">077</span>          String value = entry.getValue();<a name="line.77"></a>
+<span class="sourceLineNo">078</span>          // If the value has variables substitutions, need to do a get.<a name="line.78"></a>
+<span class="sourceLineNo">079</span>          if (value.contains(VARIABLE_START)) {<a name="line.79"></a>
+<span class="sourceLineNo">080</span>            value = conf.get(key);<a name="line.80"></a>
+<span class="sourceLineNo">081</span>          }<a name="line.81"></a>
+<span class="sourceLineNo">082</span>          zkProperties.setProperty(zkKey, value);<a name="line.82"></a>
+<span class="sourceLineNo">083</span>        }<a name="line.83"></a>
+<span class="sourceLineNo">084</span>      }<a name="line.84"></a>
+<span class="sourceLineNo">085</span>    }<a name="line.85"></a>
+<span class="sourceLineNo">086</span><a name="line.86"></a>
+<span class="sourceLineNo">087</span>    // If clientPort is not set, assign the default.<a name="line.87"></a>
+<span class="sourceLineNo">088</span>    if (zkProperties.getProperty(HConstants.CLIENT_PORT_STR) == null) {<a name="line.88"></a>
+<span class="sourceLineNo">089</span>      zkProperties.put(HConstants.CLIENT_PORT_STR,<a name="line.89"></a>
+<span class="sourceLineNo">090</span>          HConstants.DEFAULT_ZOOKEEPER_CLIENT_PORT);<a name="line.90"></a>
+<span class="sourceLineNo">091</span>    }<a name="line.91"></a>
+<span class="sourceLineNo">092</span><a name="line.92"></a>
+<span class="sourceLineNo">093</span>    // Create the server.X properties.<a name="line.93"></a>
+<span class="sourceLineNo">094</span>    int peerPort = conf.getInt("hbase.zookeeper.peerport", 2888);<a name="line.94"></a>
+<span class="sourceLineNo">095</span>    int leaderPort = conf.getInt("hbase.zookeeper.leaderport", 3888);<a name="line.95"></a>
+<span class="sourceLineNo">096</span><a name="line.96"></a>
+<span class="sourceLineNo">097</span>    final String[] serverHosts = conf.getStrings(HConstants.ZOOKEEPER_QUORUM,<a name="line.97"></a>
+<span class="sourceLineNo">098</span>                                                 HConstants.LOCALHOST);<a name="line.98"></a>
+<span class="sourceLineNo">099</span>    String serverHost;<a name="line.99"></a>
+<span class="sourceLineNo">100</span>    String address;<a name="line.100"></a>
+<span class="sourceLineNo">101</span>    String key;<a name="line.101"></a>
+<span class="sourceLineNo">102</span>    for (int i = 0; i &lt; serverHosts.length; ++i) {<a name="line.102"></a>
+<span class="sourceLineNo">103</span>      if (serverHosts[i].contains(":")) {<a name="line.103"></a>
+<span class="sourceLineNo">104</span>        serverHost = serverHosts[i].substring(0, serverHosts[i].indexOf(':'));<a name="line.104"></a>
+<span class="sourceLineNo">105</span>      } else {<a name="line.105"></a>
+<span class="sourceLineNo">106</span>        serverHost = serverHosts[i];<a name="line.106"></a>
+<span class="sourceLineNo">107</span>      }<a name="line.107"></a>
+<span class="sourceLineNo">108</span>      address = serverHost + ":" + peerPort + ":" + leaderPort;<a name="line.108"></a>
+<span class="sourceLineNo">109</span>      key = "server." + i;<a name="line.109"></a>
+<span class="sourceLineNo">110</span>      zkProperties.put(key, address);<a name="line.110"></a>
+<span class="sourceLineNo">111</span>    }<a name="line.111"></a>
+<span class="sourceLineNo">112</span><a name="line.112"></a>
+<span class="sourceLineNo">113</span>    return zkProperties;<a name="line.113"></a>
+<span class="sourceLineNo">114</span>  }<a name="line.114"></a>
+<span class="sourceLineNo">115</span><a name="line.115"></a>
+<span class="sourceLineNo">116</span>  /**<a name="line.116"></a>
+<span class="sourceLineNo">117</span>   * Return the ZK Quorum servers string given the specified configuration<a name="line.117"></a>
+<span class="sourceLineNo">118</span>   *<a name="line.118"></a>
+<span class="sourceLineNo">119</span>   * @param conf<a name="line.119"></a>
+<span class="sourceLineNo">120</span>   * @return Quorum servers String<a name="line.120"></a>
+<span class="sourceLineNo">121</span>   */<a name="line.121"></a>
+<span class="sourceLineNo">122</span>  private static String getZKQuorumServersStringFromHbaseConfig(Configuration conf) {<a name="line.122"></a>
+<span class="sourceLineNo">123</span>    String defaultClientPort = Integer.toString(<a name="line.123"></a>
+<span class="sourceLineNo">124</span>        conf.getInt(HConstants.ZOOKEEPER_CLIENT_PORT, HConstants.DEFAULT_ZOOKEEPER_CLIENT_PORT));<a name="line.124"></a>
+<span class="sourceLineNo">125</span><a name="line.125"></a>
+<span class="sourceLineNo">126</span>    // Build the ZK quorum server string with "server:clientport" list, separated by ','<a name="line.126"></a>
+<span class="sourceLineNo">127</span>    final String[] serverHosts =<a name="line.127"></a>
+<span class="sourceLineNo">128</span>        conf.getStrings(HConstants.ZOOKEEPER_QUORUM, HConstants.LOCALHOST);<a name="line.128"></a>
+<span class="sourceLineNo">129</span>    return buildZKQuorumServerString(serverHosts, defaultClientPort);<a name="line.129"></a>
+<span class="sourceLineNo">130</span>  }<a name="line.130"></a>
+<span class="sourceLineNo">131</span><a name="line.131"></a>
+<span class="sourceLineNo">132</span>  /**<a name="line.132"></a>
+<span class="sourceLineNo">133</span>   * Return the ZK Quorum servers string given the specified configuration.<a name="line.133"></a>
+<span class="sourceLineNo">134</span>   * @return Quorum servers<a name="line.134"></a>
+<span class="sourceLineNo">135</span>   */<a name="line.135"></a>
+<span class="sourceLineNo">136</span>  public static String getZKQuorumServersString(Configuration conf) {<a name="line.136"></a>
+<span class="sourceLineNo">137</span>    return getZKQuorumServersStringFromHbaseConfig(conf);<a name="line.137"></a>
+<span class="sourceLineNo">138</span>  }<a name="line.138"></a>
+<span class="sourceLineNo">139</span><a name="line.139"></a>
+<span class="sourceLineNo">140</span>  /**<a name="line.140"></a>
+<span class="sourceLineNo">141</span>   * Build the ZK quorum server string with "server:clientport" list, separated by ','<a name="line.141"></a>
+<span class="sourceLineNo">142</span>   *<a name="line.142"></a>
+<span class="sourceLineNo">143</span>   * @param serverHosts a list of servers for ZK quorum<a name="line.143"></a>
+<span class="sourceLineNo">144</span>   * @param clientPort the default client port<a name="line.144"></a>
+<span class="sourceLineNo">145</span>   * @return the string for a list of "server:port" separated by ","<a name="line.145"></a>
+<span class="sourceLineNo">146</span>   */<a name="line.146"></a>
+<span class="sourceLineNo">147</span>  public static String buildZKQuorumServerString(String[] serverHosts, String clientPort) {<a name="line.147"></a>
+<span class="sourceLineNo">148</span>    StringBuilder quorumStringBuilder = new StringBuilder();<a name="line.148"></a>
+<span class="sourceLineNo">149</span>    String serverHost;<a name="line.149"></a>
+<span class="sourceLineNo">150</span>    InetAddressValidator validator = new InetAddressValidator();<a name="line.150"></a>
+<span class="sourceLineNo">151</span>    for (int i = 0; i &lt; serverHosts.length; ++i) {<a name="line.151"></a>
+<span class="sourceLineNo">152</span>      if (serverHosts[i].startsWith("[")) {<a name="line.152"></a>
+<span class="sourceLineNo">153</span>        int index = serverHosts[i].indexOf("]");<a name="line.153"></a>
+<span class="sourceLineNo">154</span>        if (index &lt; 0) {<a name="line.154"></a>
+<span class="sourceLineNo">155</span>          throw new IllegalArgumentException(serverHosts[i]<a name="line.155"></a>
+<span class="sourceLineNo">156</span>                  + " starts with '[' but has no matching ']:'");<a name="line.156"></a>
+<span class="sourceLineNo">157</span>        }<a name="line.157"></a>
+<span class="sourceLineNo">158</span>        if (index + 2 == serverHosts[i].length()) {<a name="line.158"></a>
+<span class="sourceLineNo">159</span>          throw new IllegalArgumentException(serverHosts[i]<a name="line.159"></a>
+<span class="sourceLineNo">160</span>                  + " doesn't have a port after colon");<a name="line.160"></a>
+<span class="sourceLineNo">161</span>        }<a name="line.161"></a>
+<span class="sourceLineNo">162</span>        //check the IPv6 address e.g. [2001:db8::1]<a name="line.162"></a>
+<span class="sourceLineNo">163</span>        String serverHostWithoutBracket = serverHosts[i].substring(1, index);<a name="line.163"></a>
+<span class="sourceLineNo">164</span>        if (!validator.isValidInet6Address(serverHostWithoutBracket)) {<a name="line.164"></a>
+<span class="sourceLineNo">165</span>          throw new IllegalArgumentException(serverHosts[i]<a name="line.165"></a>
+<span class="sourceLineNo">166</span>                  + " is not a valid IPv6 address");<a name="line.166"></a>
+<span class="sourceLineNo">167</span>        }<a name="line.167"></a>
+<span class="sourceLineNo">168</span>        serverHost = serverHosts[i];<a name="line.168"></a>
+<span class="sourceLineNo">169</span>        if ((index + 1 == serverHosts[i].length())) {<a name="line.169"></a>
+<span class="sourceLineNo">170</span>          serverHost = serverHosts[i] + ":" + clientPort;<a name="line.170"></a>
+<span class="sourceLineNo">171</span>        }<a name="line.171"></a>
+<span class="sourceLineNo">172</span>      } else {<a name="line.172"></a>
+<span class="sourceLineNo">173</span>        if (serverHosts[i].contains(":")) {<a name="line.173"></a>
+<span class="sourceLineNo">174</span>          serverHost = serverHosts[i]; // just use the port specified from the input<a name="line.174"></a>
+<span class="sourceLineNo">175</span>        } else {<a name="line.175"></a>
+<span class="sourceLineNo">176</span>          serverHost = serverHosts[i] + ":" + clientPort;<a name="line.176"></a>
+<span class="sourceLineNo">177</span>        }<a name="line.177"></a>
+<span class="sourceLineNo">178</span>      }<a name="line.178"></a>
+<span class="sourceLineNo">179</span><a name="line.179"></a>
+<span class="sourceLineNo">180</span>      if (i &gt; 0) {<a name="line.180"></a>
+<span class="sourceLineNo">181</span>        quorumStringBuilder.append(',');<a name="line.181"></a>
+<span class="sourceLineNo">182</span>      }<a name="line.182"></a>
+<span class="sourceLineNo">183</span>      quorumStringBuilder.append(serverHost);<a name="line.183"></a>
+<span class="sourceLineNo">184</span>    }<a name="line.184"></a>
+<span class="sourceLineNo">185</span>    return quorumStringBuilder.toString();<a name="line.185"></a>
+<span class="sourceLineNo">186</span>  }<a name="line.186"></a>
+<span class="sourceLineNo">187</span><a name="line.187"></a>
+<span class="sourceLineNo">188</span>  /**<a name="line.188"></a>
+<span class="sourceLineNo">189</span>   * Verifies that the given key matches the expected format for a ZooKeeper cluster key.<a name="line.189"></a>
+<span class="sourceLineNo">190</span>   * The Quorum for the ZK cluster can have one the following formats (see examples below):<a name="line.190"></a>
+<span class="sourceLineNo">191</span>   *<a name="line.191"></a>
+<span class="sourceLineNo">192</span>   * &lt;ol&gt;<a name="line.192"></a>
+<span class="sourceLineNo">193</span>   *   &lt;li&gt;s1,s2,s3 (no client port in the list, the client port could be obtained from<a name="line.193"></a>
+<span class="sourceLineNo">194</span>   *       clientPort)&lt;/li&gt;<a name="line.194"></a>
+<span class="sourceLineNo">195</span>   *   &lt;li&gt;s1:p1,s2:p2,s3:p3 (with client port, which could be same or different for each server,<a name="line.195"></a>
+<span class="sourceLineNo">196</span>   *       in this case, the clientPort would be ignored)&lt;/li&gt;<a name="line.196"></a>
+<span class="sourceLineNo">197</span>   *   &lt;li&gt;s1:p1,s2,s3:p3 (mix of (1) and (2) - if port is not specified in a server, it would use<a name="line.197"></a>
+<span class="sourceLineNo">198</span>   *       the clientPort; otherwise, it would use the specified port)&lt;/li&gt;<a name="line.198"></a>
+<span class="sourceLineNo">199</span>   * &lt;/ol&gt;<a name="line.199"></a>
+<span class="sourceLineNo">200</span>   *<a name="line.200"></a>
+<span class="sourceLineNo">201</span>   * @param key the cluster key to validate<a name="line.201"></a>
+<span class="sourceLineNo">202</span>   * @throws IOException if the key could not be parsed<a name="line.202"></a>
+<span class="sourceLineNo">203</span>   */<a name="line.203"></a>
+<span class="sourceLineNo">204</span>  public static void validateClusterKey(String key) throws IOException {<a name="line.204"></a>
+<span class="sourceLineNo">205</span>    transformClusterKey(key);<a name="line.205"></a>
+<span class="sourceLineNo">206</span>  }<a name="line.206"></a>
+<span class="sourceLineNo">207</span><a name="line.207"></a>
+<span class="sourceLineNo">208</span>  /**<a name="line.208"></a>
+<span class="sourceLineNo">209</span>   * Separate the given key into the three configurations it should contain:<a name="line.209"></a>
+<span class="sourceLineNo">210</span>   * hbase.zookeeper.quorum, hbase.zookeeper.client.port<a name="line.210"></a>
+<span class="sourceLineNo">211</span>   * and zookeeper.znode.parent<a name="line.211"></a>
+<span class="sourceLineNo">212</span>   * @param key<a name="line.212"></a>
+<span class="sourceLineNo">213</span>   * @return the three configuration in the described order<a name="line.213"></a>
+<span class="sourceLineNo">214</span>   * @throws IOException<a name="line.214"></a>
+<span class="sourceLineNo">215</span>   */<a name="line.215"></a>
+<span class="sourceLineNo">216</span>  public static ZKClusterKey transformClusterKey(String key) throws IOException {<a name="line.216"></a>
+<span class="sourceLineNo">217</span>    String[] parts = key.split(":");<a name="line.217"></a>
 <span class="sourceLineNo">218</span><a name="line.218"></a>
-<span class="sourceLineNo">219</span>      // The common case is that every server has its own client port specified - this means<a name="line.219"></a>
-<span class="sourceLineNo">220</span>      // that (total parts - the ZNodeParent part - the ClientPort part) is equal to<a name="line.220"></a>
-<span class="sourceLineNo">221</span>      // (the number of "," + 1) - "+ 1" because the last server has no ",".<a name="line.221"></a>
-<span class="sourceLineNo">222</span>      if ((parts.length - 2) == (serverHosts.length + 1)) {<a name="line.222"></a>
-<span class="sourceLineNo">223</span>        return new ZKClusterKey(quorumStringInput, Integer.parseInt(clientPort), zNodeParent);<a name="line.223"></a>
+<span class="sourceLineNo">219</span>    if (parts.length == 3) {<a name="line.219"></a>
+<span class="sourceLineNo">220</span>      if (!parts[2].matches("/.*[^/]")) {<a name="line.220"></a>
+<span class="sourceLineNo">221</span>        throw new IOException("Cluster key passed " + key + " is invalid, the format should be:" +<a name="line.221"></a>
+<span class="sourceLineNo">222</span>            HConstants.ZOOKEEPER_QUORUM + ":" + HConstants.ZOOKEEPER_CLIENT_PORT + ":"<a name="line.222"></a>
+<span class="sourceLineNo">223</span>            + HConstants.ZOOKEEPER_ZNODE_PARENT);<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>      // For the uncommon case that some servers has no port specified, we need to build the<a name="line.226"></a>
-<span class="sourceLineNo">227</span>      // server:clientport list using default client port for servers without specified port.<a name="line.227"></a>
-<span class="sourceLineNo">228</span>      return new ZKClusterKey(<a name="line.228"></a>
-<span class="sourceLineNo">229</span>          buildZKQuorumServerString(serverHosts, clientPort),<a name="line.229"></a>
-<span class="sourceLineNo">230</span>          Integer.parseInt(clientPort),<a name="line.230"></a>
-<span class="sourceLineNo">231</span>          zNodeParent);<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>    throw new IOException("Cluster key passed " + key + " is invalid, the format should be:" +<a name="line.234"></a>
-<span class="sourceLineNo">235</span>        HConstants.ZOOKEEPER_QUORUM + ":" + HConstants.ZOOKEEPER_CLIENT_PORT + ":"<a name="line.235"></a>
-<span class="sourceLineNo">236</span>        + HConstants.ZOOKEEPER_ZNODE_PARENT);<a name="line.236"></a>
-<span class="sourceLineNo">237</span>  }<a name="line.237"></a>
+<span class="sourceLineNo">225</span>      return new ZKClusterKey(parts [0], Integer.parseInt(parts [1]), parts [2]);<a name="line.225"></a>
+<span class="sourceLineNo">226</span>    }<a name="line.226"></a>
+<span class="sourceLineNo">227</span><a name="line.227"></a>
+<span class="sourceLineNo">228</span>    if (parts.length &gt; 3) {<a name="line.228"></a>
+<span class="sourceLineNo">229</span>      // The quorum could contain client port in server:clientport format, try to transform more.<a name="line.229"></a>
+<span class="sourceLineNo">230</span>      String zNodeParent = parts [parts.length - 1];<a name="line.230"></a>
+<span class="sourceLineNo">231</span>      if (!zNodeParent.matches("/.*[^/]")) {<a name="line.231"></a>
+<span class="sourceLineNo">232</span>        throw new IOException("Cluster key passed " + key + " is invalid, the format should be:"<a name="line.232"></a>
+<span class="sourceLineNo">233</span>            + HConstants.ZOOKEEPER_QUORUM + ":" + HConstants.ZOOKEEPER_CLIENT_PORT + ":"<a name="line.233"></a>
+<span class="sourceLineNo">234</span>            + HConstants.ZOOKEEPER_ZNODE_PARENT);<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>      String clientPort = parts [parts.length - 2];<a name="line.237"></a>
 <span class="sourceLineNo">238</span><a name="line.238"></a>
-<span class="sourceLineNo">239</span>  /**<a name="line.239"></a>
-<span class="sourceLineNo">240</span>   * Get the key to the ZK ensemble for this configuration without<a name="line.240"></a>
-<span class="sourceLineNo">241</span>   * adding a name at the end<a name="line.241"></a>
-<span class="sourceLineNo">242</span>   * @param conf Configuration to use to build the key<a name="line.242"></a>
-<span class="sourceLineNo">243</span>   * @return ensemble key without a name<a name="line.243"></a>
-<span class="sourceLineNo">244</span>   */<a name="line.244"></a>
-<span class="sourceLineNo">245</span>  public static String getZooKeeperClusterKey(Configuration conf) {<a name="line.245"></a>
-<span class="sourceLineNo">246</span>    return getZooKeeperClusterKey(conf, null);<a name="line.246"></a>
-<span class="sourceLineNo">247</span>  }<a name="line.247"></a>
-<span class="sourceLineNo">248</span><a name="line.248"></a>
-<span class="sourceLineNo">249</span>  /**<a name="line.249"></a>
-<span class="sourceLineNo">250</span>   * Get the key to the ZK ensemble for this configuration and append<a name="line.250"></a>
-<span class="sourceLineNo">251</span>   * a name at the end<a name="line.251"></a>
-<span class="sourceLineNo">252</span>   * @param conf Configuration to use to build the key<a name="line.252"></a>
-<span class="sourceLineNo">253</span>   * @param name Name that should be appended at the end if not empty or null<a name="line.253"></a>
-<span class="sourceLineNo">254</span>   * @return ensemble key with a name (if any)<a name="line.254"></a>
-<span class="sourceLineNo">255</span>   */<a name="line.255"></a>
-<span class="sourceLineNo">256</span>  public static String getZooKeeperClusterKey(Configuration conf, String name) {<a name="line.256"></a>
-<span class="sourceLineNo">257</span>    String ensemble = conf.get(HConstants.ZOOKEEPER_QUORUM).replaceAll(<a name="line.257"></a>
-<span class="sourceLineNo">258</span>        "[\\t\\n\\x0B\\f\\r]", "");<a name="line.258"></a>
-<span class="sourceLineNo">259</span>    StringBuilder builder = new StringBuilder(ensemble);<a name="line.259"></a>
-<span class="sourceLineNo">260</span>    builder.append(":");<a name="line.260"></a>
-<span class="sourceLineNo">261</span>    builder.append(conf.get(HConstants.ZOOKEEPER_CLIENT_PORT));<a name="line.261"></a>
-<span class="sourceLineNo">262</span>    builder.append(":");<a name="line.262"></a>
-<span class="sourceLineNo">263</span>    builder.append(conf.get(HConstants.ZOOKEEPER_ZNODE_PARENT));<a name="line.263"></a>
-<span class="sourceLineNo">264</span>    if (name != null &amp;&amp; !name.isEmpty()) {<a name="line.264"></a>
-<span class="sourceLineNo">265</span>      builder.append(",");<a name="line.265"></a>
-<span class="sourceLineNo">266</span>      builder.append(name);<a name="line.266"></a>
-<span class="sourceLineNo">267</span>    }<a name="line.267"></a>
-<span class="sourceLineNo">268</span>    return builder.toString();<a name="line.268"></a>
-<span class="sourceLineNo">269</span>  }<a name="line.269"></a>
-<span class="sourceLineNo">270</span><a name="line.270"></a>
-<span class="sourceLineNo">271</span>  /**<a name="line.271"></a>
-<span class="sourceLineNo">272</span>   * Standardize the ZK quorum string: make it a "server:clientport" list, separated by ','<a name="line.272"></a>
-<span class="sourceLineNo">273</span>   * @param quorumStringInput a string contains a list of servers for ZK quorum<a name="line.273"></a>
-<span class="sourceLineNo">274</span>   * @param clientPort the default client port<a name="line.274"></a>
-<span class="sourceLineNo">275</span>   * @return the string for a list of "server:port" separated by ","<a name="line.275"></a>
-<span class="sourceLineNo">276</span>   */<a name="line.276"></a>
-<span class="sourceLineNo">277</span>  @VisibleForTesting<a name="line.277"></a>
-<span class="sourceLineNo">278</span>  public static String standardizeZKQuorumServerString(String quorumStringInput,<a name="line.278"></a>
-<span class="sourceLineNo">279</span>      String clientPort) {<a name="line.279"></a>
-<span class="sourceLineNo">280</span>    String[] serverHosts = quorumStringInput.split(",");<a name="line.280"></a>
-<span class="sourceLineNo">281</span>    return buildZKQuorumServerString(serverHosts, clientPort);<a name="line.281"></a>
-<span class="sourceLineNo">282</span>  }<a name="line.282"></a>
-<span class="sourceLineNo">283</span><a name="line.283"></a>
-<span class="sourceLineNo">284</span>  // The Quorum for the ZK cluster can have one the following format (see examples below):<a name="line.284"></a>
-<span class="sourceLineNo">285</span>  // (1). s1,s2,s3 (no client port in the list, the client port could be obtained from clientPort)<a name="line.285"></a>
-<span class="sourceLineNo">286</span>  // (2). s1:p1,s2:p2,s3:p3 (with client port, which could be same or different for each server,<a name="line.286"></a>
-<span class="sourceLineNo">287</span>  //      in this case, the clientPort would be ignored)<a name="line.287"></a>
-<span class="sourceLineNo">288</span>  // (3). s1:p1,s2,s3:p3 (mix of (1) and (2) - if port is not specified in a server, it would use<a name="line.288"></a>
-<span class="sourceLineNo">289</span>  //      the clientPort; otherwise, it would use the specified port)<a name="line.289"></a>
-<span class="sourceLineNo">290</span>  @VisibleForTesting<a name="line.290"></a>
-<span class="sourceLineNo">291</span>  public static class ZKClusterKey {<a name="line.291"></a>
-<span class="sourceLineNo">292</span>    private String quorumString;<a name="line.292"></a>
-<span class="sourceLineNo">293</span>    private int clientPort;<a name="line.293"></a>
-<span class="sourceLineNo">294</span>    private String znodeParent;<a name="line.294"></a>
+<span class="sourceLineNo">239</span>      // The first part length is the total length minus the lengths of other parts and minus 2 ":"<a name="line.239"></a>
+<span class="sourceLineNo">240</span>      int endQuorumIndex = key.length() - zNodeParent.length() - clientPort.length() - 2;<a name="line.240"></a>
+<span class="sourceLineNo">241</span>      String quorumStringInput = key.substring(0, endQuorumIndex);<a name="line.241"></a>
+<span class="sourceLineNo">242</span>      String[] serverHosts = quorumStringInput.split(",");<a name="line.242"></a>
+<span class="sourceLineNo">243</span><a name="line.243"></a>
+<span class="sourceLineNo">244</span>      // The common case is that every server has its own client port specified - this means<a name="line.244"></a>
+<span class="sourceLineNo">245</span>      // that (total parts - the ZNodeParent part - the ClientPort part) is equal to<a name="line.245"></a>
+<span class="sourceLineNo">246</span>      // (the number of "," + 1) - "+ 1" because the last server has no ",".<a name="line.246"></a>
+<span class="sourceLineNo">247</span>      if ((parts.length - 2) == (serverHosts.length + 1)) {<a name="line.247"></a>
+<span class="sourceLineNo">248</span>        return new ZKClusterKey(quorumStringInput, Integer.parseInt(clientPort), zNodeParent);<a name="line.248"></a>
+<span class="sourceLineNo">249</span>      }<a name="line.249"></a>
+<span class="sourceLineNo">250</span><a name="line.250"></a>
+<span class="sourceLineNo">251</span>      // For the uncommon case that some servers has no port specified, we need to build the<a name="line.251"></a>
+<span class="sourceLineNo">252</span>      // server:clientport list using default client port for servers without specified port.<a name="line.252"></a>
+<span class="sourceLineNo">253</span>      return new ZKClusterKey(<a name="line.253"></a>
+<span class="sourceLineNo">254</span>          buildZKQuorumServerString(serverHosts, clientPort),<a name="line.254"></a>
+<span class="sourceLineNo">255</span>          Integer.parseInt(clientPort),<a name="line.255"></a>
+<span class="sourceLineNo">256</span>          zNodeParent);<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>    throw new IOException("Cluster key passed " + key + " is invalid, the format should be:" +<a name="line.259"></a>
+<span class="sourceLineNo">260</span>        HConstants.ZOOKEEPER_QUORUM + ":" + HConstants.ZOOKEEPER_CLIENT_PORT + ":"<a name="line.260"></a>
+<span class="sourceLineNo">261</span>        + HConstants.ZOOKEEPER_ZNODE_PARENT);<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>   * Get the key to the ZK ensemble for this configuration without<a name="line.265"></a>
+<span class="sourceLineNo">266</span>   * adding a name at the end<a name="line.266"></a>
+<span class="sourceLineNo">267</span>   * @param conf Configuration to use to build the key<a name="line.267"></a>
+<span class="sourceLineNo">268</span>   * @return ensemble key without a name<a name="line.268"></a>
+<span class="sourceLineNo">269</span>   */<a name="line.269"></a>
+<span class="sourceLineNo">270</span>  public static String getZooKeeperClusterKey(Configuration conf) {<a name="line.270"></a>
+<span class="sourceLineNo">271</span>    return getZooKeeperClusterKey(conf, null);<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>   * Get the key to the ZK ensemble for this configuration and append<a name="line.275"></a>
+<span class="sourceLineNo">276</span>   * a name at the end<a name="line.276"></a>
+<span class="sourceLineNo">277</span>   * @param conf Configuration to use to build the key<a name="line.277"></a>
+<span class="sourceLineNo">278</span>   * @param name Name that should be appended at the end if not empty or null<a name="line.278"></a>
+<span class="sourceLineNo">279</span>   * @return ensemble key with a name (if any)<a name="line.279"></a>
+<span class="sourceLineNo">280</span>   */<a name="line.280"></a>
+<span class="sourceLineNo">281</span>  public static String getZooKeeperClusterKey(Configuration conf, String name) {<a name="line.281"></a>
+<span class="sourceLineNo">282</span>    String ensemble = conf.get(HConstants.ZOOKEEPER_QUORUM).replaceAll(<a name="line.282"></a>
+<span class="sourceLineNo">283</span>        "[\\t\\n\\x0B\\f\\r]", "");<a name="line.283"></a>
+<span class="sourceLineNo">284</span>    StringBuilder builder = new StringBuilder(ensemble);<a name="line.284"></a>
+<span class="sourceLineNo">285</span>    builder.append(":");<a name="line.285"></a>
+<span class="sourceLineNo">286</span>    builder.append(conf.get(HConstants.ZOOKEEPER_CLIENT_PORT));<a name="line.286"></a>
+<span class="sourceLineNo">287</span>    builder.append(":");<a name="line.287"></a>
+<span class="sourceLineNo">288</span>    builder.append(conf.get(HConstants.ZOOKEEPER_ZNODE_PARENT));<a name="line.288"></a>
+<span class="sourceLineNo">289</span>    if (name != null &amp;&amp; !name.isEmpty()) {<a name="line.289"></a>
+<span class="sourceLineNo">290</span>      builder.append(",");<a name="line.290"></a>
+<span class="sourceLineNo">291</span>      builder.append(name);<a name="line.291"></a>
+<span class="sourceLineNo">292</span>    }<a name="line.292"></a>
+<span class="sourceLineNo">293</span>    return builder.toString();<a name="line.293"></a>
+<span class="sourceLineNo">294</span>  }<a name="line.294"></a>
 <span class="sourceLineNo">295</span><a name="line.295"></a>
-<span class="sourceLineNo">296</span>    ZKClusterKey(String quorumString, int clientPort, String znodeParent) {<a name="line.296"></a>
-<span class="sourceLineNo">297</span>      this.quorumString = quorumString;<a name="line.297"></a>
-<span class="sourceLineNo">298</span>      this.clientPort = clientPort;<a name="line.298"></a>
-<span class="sourceLineNo">299</span>      this.znodeParent = znodeParent;<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>    public String getQuorumString() {<a name="line.302"></a>
-<span class="sourceLineNo">303</span>      return quorumString;<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>    public int getClientPort() {<a name="line.306"></a>
-<span class="sourceLineNo">307</span>      return clientPort;<a name="line.307"></a>
-<span class="sourceLineNo">308</span>    }<a name="line.308"></a>
-<span class="sourceLineNo">309</span><a name="line.309"></a>
-<span class="sourceLineNo">310</span>    public String getZnodeParent() {<a name="line.310"></a>
-<span class="sourceLineNo">311</span>      return znodeParent;<a name="line.311"></a>
-<span class="sourceLineNo">312</span>    }<a name="line.312"></a>
-<span class="sourceLineNo">313</span>  }<a name="line.313"></a>
-<span class="sourceLineNo">314</span><a name="line.314"></a>
-<span class="sourceLineNo">315</span>  /**<a name="line.315"></a>
-<span class="sourceLineNo">316</span>   * Get the client ZK Quorum servers string<a name="line.316"></a>
-<span class="sourceLineNo">317</span>   * @param conf the configuration to read<a name="line.317"></a>
-<span class="sourceLineNo">318</span>   * @return Client quorum servers, or null if not specified<a name="line.318"></a>
-<span class="sourceLineNo">319</span>   */<a name="line.319"></a>
-<span class="sourceLineNo">320</span>  public static String getClientZKQuorumServersString(Configuration conf) {<a name="line.320"></a>
-<span class="sourceLineNo">321</span>    String clientQuromServers = conf.get(HConstants.CLIENT_ZOOKEEPER_QUORUM);<a name="line.321"></a>
-<span class="sourceLineNo">322</span>    if (clientQuromServers == null) {<a name="line.322"></a>
-<span class="sourceLineNo">323</span>      return null;<a name="line.323"></a>
-<span class="sourceLineNo">324</span>    }<a name="line.324"></a>
-<span class="sourceLineNo">325</span>    int defaultClientPort =<a name="line.325"></a>
-<span class="sourceLineNo">326</span>        conf.getInt(HConstants.ZOOKEEPER_CLIENT_PORT, HConstants.DEFAULT_ZOOKEEPER_CLIENT_PORT);<a name="line.326"></a>
-<span class="sourceLineNo">327</span>    String clientZkClientPort =<a name="line.327"></a>
-<span class="sourceLineNo">328</span>        Integer.toString(conf.getInt(HConstants.CLIENT_ZOOKEEPER_CLIENT_PORT, defaultClientPort));<a name="line.328"></a>
-<span class="sourceLineNo">329</span>    // Build the ZK quorum server string with "server:clientport" list, separated by ','<a name="line.329"></a>
-<span class="sourceLineNo">330</span>    final String[] serverHosts = StringUtils.getStrings(clientQuromServers);<a name="line.330"></a>
-<span class="sourceLineNo">331</span>    return buildZKQuorumServerString(serverHosts, clientZkClientPort);<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">296</span>  /**<a name="line.296"></a>
+<span class="sourceLineNo">297</span>   * Standardize the ZK quorum string: make it a "server:clientport" list, separated by ','<a name="line.297"></a>
+<span class="sourceLineNo">298</span>   * @param quorumStringInput a string contains a list of servers for ZK quorum<a name="line.298"></a>
+<span class="sourceLineNo">299</span>   * @param clientPort the default client port<a name="line.299"></a>
+<span class="sourceLineNo">300</span>   * @return the string for a list of "server:port" separated by ","<a name="line.300"></a>
+<span class="sourceLineNo">301</span>   */<a name="line.301"></a>
+<span class="sourceLineNo">302</span>  @VisibleForTesting<a name="line.302"></a>
+<span class="sourceLineNo">303</span>  public static String standardizeZKQuorumServerString(String quorumStringInput,<a name="line.303"></a>
+<span class="sourceLineNo">304</span>      String clientPort) {<a name="line.304"></a>
+<span class="sourceLineNo">305</span>    String[] serverHosts = quorumStringInput.split(",");<a name="line.305"></a>
+<span class="sourceLineNo">306</span>    return buildZKQuorumServerString(serverHosts, clientPort);<a name="line.306"></a>
+<span class="sourceLineNo">307</span>  }<a name="line.307"></a>
+<span class="sourceLineNo">308</span><a name="line.308"></a>
+<span class="sourceLineNo">309</span>  // The Quorum for the ZK cluster can have one the following format (see examples below):<a name="line.309"></a>
+<span class="sourceLineNo">310</span>  // (1). s1,s2,s3 (no client port in the list, the client port could be obtained from clientPort)<a name="line.310"></a>
+<span class="sourceLineNo">311</span>  // (2). s1:p1,s2:p2,s3:p3 (with client port, which could be same or different for each server,<a name="line.311"></a>
+<span class="sourceLineNo">312</span>  //      in this case, the clientPort would be ignored)<a name="line.312"></a>
+<span class="sourceLineNo">313</span>  // (3). s1:p1,s2,s3:p3 (mix of (1) and (2) - if port is not specified in a server, it would use<a name="line.313"></a>
+<span class="sourceLineNo">314</span>  //      the clientPort; otherwise, it would use the specified port)<a name="line.314"></a>
+<span class="sourceLineNo">315</span>  @VisibleForTesting<a name="line.315"></a>
+<span class="sourceLineNo">316</span>  public static class ZKClusterKey {<a name="line.316"></a>
+<span class="sourceLineNo">317</span>    private String quorumString;<a name="line.317"></a>
+<span class="sourceLineNo">318</span>    private int clientPort;<a name="line.318"></a>
+<span class="sourceLineNo">319</span>    private String znodeParent;<a name="line.319"></a>
+<span class="sourceLineNo">320</span><a name="line.320"></a>
+<span class="sourceLineNo">321</span>    ZKClusterKey(String quorumString, int clientPort, String znodeParent) {<a name="line.321"></a>
+<span class="sourceLineNo">322</span>      this.quorumString = quorumString;<a name="line.322"></a>
+<span class="sourceLineNo">323</span>      this.clientPort = clientPort;<a name="line.323"></a>
+<span class="sourceLineNo">324</span>      this.znodeParent = znodeParent;<a name="line.324"></a>
+<span class="sourceLineNo">325</span>    }<a name="line.325"></a>
+<span class="sourceLineNo">326</span><a name="line.326"></a>
+<span class="sourceLineNo">327</span>    public String getQuorumString() {<a name="line.327"></a>
+<span class="sourceLineNo">328</span>      return quorumString;<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>    public int getClientPort() {<a name="line.331"></a>
+<span class="sourceLineNo">332</span>      return clientPort;<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>    public String getZnodeParent() {<a name="line.335"></a>
+<span class="sourceLineNo">336</span>      return znodeParent;<a name="line.336"></a>
+<span class="sourceLineNo">337</span>    }<a name="line.337"></a>
+<span class="sourceLineNo">338</span>  }<a name="line.338"></a>
+<span class="sourceLineNo">339</span><a name="line.339"></a>
+<span class="sourceLineNo">340</span>  /**<a name="line.340"></a>
+<span class="sourceLineNo">341</span>   * Get the client ZK Quorum servers string<a name="line.341"></a>
+<span class="sourceLineNo">342</span>   * @param conf the configuration to read<a name="line.342"></a>
+<span class="sourceLineNo">343</span>   * @return Client quorum servers, or null if not specified<a name="line.343"></a>
+<span class="sourceLineNo">344</span>   */<a name="line.344"></a>
+<span class="sourceLineNo">345</span>  public static String getClientZKQuorumServersString(Configuration conf) {<a name="line.345"></a>
+<span class="sourceLineNo">346</span>    String clientQuromServers = conf.get(HConstants.CLIENT_ZOOKEEPER_QUORUM);<a name="line.346"></a>
+<span class="sourceLineNo">347</span>    if (clientQuromServers == null) {<a name="line.347"></a>
+<span class="sourceLineNo">348</span>      return null;<a name="line.348"></a>
+<span class="sourceLineNo">349</span>    }<a name="line.349"></a>
+<span class="sourceLineNo">350</span>    int defaultClientPort =<a name="line.350"></a>
+<span class="sourceLineNo">351</span>        conf.getInt(HConstants.ZOOKEEPER_CLIENT_PORT, HConstants.DEFAULT_ZOOKEEPER_CLIENT_PORT);<a name="line.351"></a>
+<span class="sourceLineNo">352</span>    String clientZkClientPort =<a name="line.352"></a>
+<span class="sourceLineNo">353</span>        Integer.toString(conf.getInt(HConstants.CLIENT_ZOOKEEPER_CLIENT_PORT, defaultClientPort));<a name="line.353"></a>
+<span class="sourceLineNo">354</span>    // Build the ZK quorum server string with "server:clientport" list, separated by ','<a name="line.354"></a>
+<span class="sourceLineNo">355</span>    final String[] serverHosts = StringUtils.getStrings(clientQuromServers);<a name="line.355"></a>
+<span class="sourceLineNo">356</span>    return buildZKQuorumServerString(serverHosts, clientZkClientPort);<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>
 
 
 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/27f5bfb5/downloads.html
----------------------------------------------------------------------
diff --git a/downloads.html b/downloads.html
index 8f92eb6..fcabc8d 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="20181109" />
+    <meta name="Date-Revision-yyyymmdd" content="20181110" />
     <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-11-09</li>
+                  <li id="publishDate" class="pull-right">Last Published: 2018-11-10</li>
             </p>
                 </div>
 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/27f5bfb5/export_control.html
----------------------------------------------------------------------
diff --git a/export_control.html b/export_control.html
index fb43b1d..47c7203 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="20181109" />
+    <meta name="Date-Revision-yyyymmdd" content="20181110" />
     <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-11-09</li>
+                  <li id="publishDate" class="pull-right">Last Published: 2018-11-10</li>
             </p>
                 </div>
 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/27f5bfb5/index.html
----------------------------------------------------------------------
diff --git a/index.html b/index.html
index 87d7251..8772cc6 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="20181109" />
+    <meta name="Date-Revision-yyyymmdd" content="20181110" />
     <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-11-09</li>
+                  <li id="publishDate" class="pull-right">Last Published: 2018-11-10</li>
             </p>
                 </div>
 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/27f5bfb5/integration.html
----------------------------------------------------------------------
diff --git a/integration.html b/integration.html
index ec0c037..3236231 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="20181109" />
+    <meta name="Date-Revision-yyyymmdd" content="20181110" />
     <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-11-09</li>
+                  <li id="publishDate" class="pull-right">Last Published: 2018-11-10</li>
             </p>
                 </div>
 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/27f5bfb5/issue-tracking.html
----------------------------------------------------------------------
diff --git a/issue-tracking.html b/issue-tracking.html
index ef6a84b..8d188c3 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="20181109" />
+    <meta name="Date-Revision-yyyymmdd" content="20181110" />
     <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-11-09</li>
+                  <li id="publishDate" class="pull-right">Last Published: 2018-11-10</li>
             </p>
                 </div>
 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/27f5bfb5/license.html
----------------------------------------------------------------------
diff --git a/license.html b/license.html
index ff7d666..8cbdce9 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="20181109" />
+    <meta name="Date-Revision-yyyymmdd" content="20181110" />
     <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-11-09</li>
+                  <li id="publishDate" class="pull-right">Last Published: 2018-11-10</li>
             </p>
                 </div>
 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/27f5bfb5/mail-lists.html
----------------------------------------------------------------------
diff --git a/mail-lists.html b/mail-lists.html
index 74de6b3..f6b914f 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="20181109" />
+    <meta name="Date-Revision-yyyymmdd" content="20181110" />
     <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-11-09</li>
+                  <li id="publishDate" class="pull-right">Last Published: 2018-11-10</li>
             </p>
                 </div>
 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/27f5bfb5/metrics.html
----------------------------------------------------------------------
diff --git a/metrics.html b/metrics.html
index 6584319..a3e36d5 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="20181109" />
+    <meta name="Date-Revision-yyyymmdd" content="20181110" />
     <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-11-09</li>
+                  <li id="publishDate" class="pull-right">Last Published: 2018-11-10</li>
             </p>
                 </div>
 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/27f5bfb5/old_news.html
----------------------------------------------------------------------
diff --git a/old_news.html b/old_news.html
index 4df4f31..2eb0f8a 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="20181109" />
+    <meta name="Date-Revision-yyyymmdd" content="20181110" />
     <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-11-09</li>
+                  <li id="publishDate" class="pull-right">Last Published: 2018-11-10</li>
             </p>
                 </div>
 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/27f5bfb5/plugin-management.html
----------------------------------------------------------------------
diff --git a/plugin-management.html b/plugin-management.html
index c66e3ac..2037b72 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="20181109" />
+    <meta name="Date-Revision-yyyymmdd" content="20181110" />
     <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-11-09</li>
+                  <li id="publishDate" class="pull-right">Last Published: 2018-11-10</li>
             </p>
                 </div>
 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/27f5bfb5/plugins.html
----------------------------------------------------------------------
diff --git a/plugins.html b/plugins.html
index 02af71a..809996b 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="20181109" />
+    <meta name="Date-Revision-yyyymmdd" content="20181110" />
     <meta http-equiv="Content-Language" content="en" />
     <title>Apache HBase &#x2013; Project Plugins</title>
     <link rel="stylesheet" href="./css/apache-maven-fluido-1.4-HBase.min.css" />
@@ -381,7 +381,7 @@
                         <a href="https://www.apache.org/">The Apache Software Foundation</a>.
             All rights reserved.      
                     
-                  <li id="publishDate" class="pull-right">Last Published: 2018-11-09</li>
+                  <li id="publishDate" class="pull-right">Last Published: 2018-11-10</li>
             </p>
                 </div>
 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/27f5bfb5/poweredbyhbase.html
----------------------------------------------------------------------
diff --git a/poweredbyhbase.html b/poweredbyhbase.html
index e77127a..5e5c3e9 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="20181109" />
+    <meta name="Date-Revision-yyyymmdd" content="20181110" />
     <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-11-09</li>
+                  <li id="publishDate" class="pull-right">Last Published: 2018-11-10</li>
             </p>
                 </div>
 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/27f5bfb5/project-info.html
----------------------------------------------------------------------
diff --git a/project-info.html b/project-info.html
index f860a0d..df10ed2 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="20181109" />
+    <meta name="Date-Revision-yyyymmdd" content="20181110" />
     <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-11-09</li>
+                  <li id="publishDate" class="pull-right">Last Published: 2018-11-10</li>
             </p>
                 </div>
 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/27f5bfb5/project-reports.html
----------------------------------------------------------------------
diff --git a/project-reports.html b/project-reports.html
index 4524c10..1abf38a 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="20181109" />
+    <meta name="Date-Revision-yyyymmdd" content="20181110" />
     <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-11-09</li>
+                  <li id="publishDate" class="pull-right">Last Published: 2018-11-10</li>
             </p>
                 </div>
 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/27f5bfb5/project-summary.html
----------------------------------------------------------------------
diff --git a/project-summary.html b/project-summary.html
index 00fc50b..ab4004b 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="20181109" />
+    <meta name="Date-Revision-yyyymmdd" content="20181110" />
     <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-11-09</li>
+                  <li id="publishDate" class="pull-right">Last Published: 2018-11-10</li>
             </p>
                 </div>
 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/27f5bfb5/pseudo-distributed.html
----------------------------------------------------------------------
diff --git a/pseudo-distributed.html b/pseudo-distributed.html
index d33fad8..6662013 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="20181109" />
+    <meta name="Date-Revision-yyyymmdd" content="20181110" />
     <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-11-09</li>
+                  <li id="publishDate" class="pull-right">Last Published: 2018-11-10</li>
             </p>
                 </div>
 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/27f5bfb5/replication.html
----------------------------------------------------------------------
diff --git a/replication.html b/replication.html
index c6aea72..8be4424 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="20181109" />
+    <meta name="Date-Revision-yyyymmdd" content="20181110" />
     <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-11-09</li>
+                  <li id="publishDate" class="pull-right">Last Published: 2018-11-10</li>
             </p>
                 </div>
 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/27f5bfb5/resources.html
----------------------------------------------------------------------
diff --git a/resources.html b/resources.html
index 86d048d..e3c5a3f 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="20181109" />
+    <meta name="Date-Revision-yyyymmdd" content="20181110" />
     <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-11-09</li>
+                  <li id="publishDate" class="pull-right">Last Published: 2018-11-10</li>
             </p>
                 </div>
 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/27f5bfb5/source-repository.html
----------------------------------------------------------------------
diff --git a/source-repository.html b/source-repository.html
index 65f39d1..7c0f8cd 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="20181109" />
+    <meta name="Date-Revision-yyyymmdd" content="20181110" />
     <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-11-09</li>
+                  <li id="publishDate" class="pull-right">Last Published: 2018-11-10</li>
             </p>
                 </div>
 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/27f5bfb5/sponsors.html
----------------------------------------------------------------------
diff --git a/sponsors.html b/sponsors.html
index f405cc9..49c02ed 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="20181109" />
+    <meta name="Date-Revision-yyyymmdd" content="20181110" />
     <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-11-09</li>
+                  <li id="publishDate" class="pull-right">Last Published: 2018-11-10</li>
             </p>
                 </div>
 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/27f5bfb5/supportingprojects.html
----------------------------------------------------------------------
diff --git a/supportingprojects.html b/supportingprojects.html
index 1f523f1..562dd9f 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="20181109" />
+    <meta name="Date-Revision-yyyymmdd" content="20181110" />
     <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-11-09</li>
+                  <li id="publishDate" class="pull-right">Last Published: 2018-11-10</li>
             </p>
                 </div>
 


[03/29] hbase-site git commit: Published site at 5e84997f2ffdbcf5f849d70c30ddbe2db4039ca4.

Posted by gi...@apache.org.
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/27f5bfb5/testdevapidocs/src-html/org/apache/hadoop/hbase/procedure2/TestProcedureBypass.TestProcEnv.html
----------------------------------------------------------------------
diff --git a/testdevapidocs/src-html/org/apache/hadoop/hbase/procedure2/TestProcedureBypass.TestProcEnv.html b/testdevapidocs/src-html/org/apache/hadoop/hbase/procedure2/TestProcedureBypass.TestProcEnv.html
index 7eb899a..f89b826 100644
--- a/testdevapidocs/src-html/org/apache/hadoop/hbase/procedure2/TestProcedureBypass.TestProcEnv.html
+++ b/testdevapidocs/src-html/org/apache/hadoop/hbase/procedure2/TestProcedureBypass.TestProcEnv.html
@@ -46,226 +46,262 @@
 <span class="sourceLineNo">038</span>import org.slf4j.Logger;<a name="line.38"></a>
 <span class="sourceLineNo">039</span>import org.slf4j.LoggerFactory;<a name="line.39"></a>
 <span class="sourceLineNo">040</span><a name="line.40"></a>
-<span class="sourceLineNo">041</span><a name="line.41"></a>
+<span class="sourceLineNo">041</span>import org.apache.hadoop.hbase.shaded.protobuf.generated.ProcedureProtos;<a name="line.41"></a>
 <span class="sourceLineNo">042</span><a name="line.42"></a>
-<span class="sourceLineNo">043</span>@Category({MasterTests.class, SmallTests.class})<a name="line.43"></a>
-<span class="sourceLineNo">044</span>public class TestProcedureBypass {<a name="line.44"></a>
-<span class="sourceLineNo">045</span><a name="line.45"></a>
-<span class="sourceLineNo">046</span>  @ClassRule public static final HBaseClassTestRule CLASS_RULE = HBaseClassTestRule<a name="line.46"></a>
-<span class="sourceLineNo">047</span>      .forClass(TestProcedureBypass.class);<a name="line.47"></a>
-<span class="sourceLineNo">048</span><a name="line.48"></a>
-<span class="sourceLineNo">049</span>  private static final Logger LOG = LoggerFactory.getLogger(TestProcedureBypass.class);<a name="line.49"></a>
-<span class="sourceLineNo">050</span><a name="line.50"></a>
-<span class="sourceLineNo">051</span>  private static final int PROCEDURE_EXECUTOR_SLOTS = 1;<a name="line.51"></a>
-<span class="sourceLineNo">052</span><a name="line.52"></a>
-<span class="sourceLineNo">053</span>  private static TestProcEnv procEnv;<a name="line.53"></a>
-<span class="sourceLineNo">054</span>  private static ProcedureStore procStore;<a name="line.54"></a>
-<span class="sourceLineNo">055</span><a name="line.55"></a>
-<span class="sourceLineNo">056</span>  private static ProcedureExecutor&lt;TestProcEnv&gt; procExecutor;<a name="line.56"></a>
-<span class="sourceLineNo">057</span><a name="line.57"></a>
-<span class="sourceLineNo">058</span>  private static HBaseCommonTestingUtility htu;<a name="line.58"></a>
-<span class="sourceLineNo">059</span><a name="line.59"></a>
-<span class="sourceLineNo">060</span>  private static FileSystem fs;<a name="line.60"></a>
-<span class="sourceLineNo">061</span>  private static Path testDir;<a name="line.61"></a>
-<span class="sourceLineNo">062</span>  private static Path logDir;<a name="line.62"></a>
-<span class="sourceLineNo">063</span><a name="line.63"></a>
-<span class="sourceLineNo">064</span>  private static class TestProcEnv {<a name="line.64"></a>
-<span class="sourceLineNo">065</span>  }<a name="line.65"></a>
-<span class="sourceLineNo">066</span><a name="line.66"></a>
-<span class="sourceLineNo">067</span>  @BeforeClass<a name="line.67"></a>
-<span class="sourceLineNo">068</span>  public static void setUp() throws Exception {<a name="line.68"></a>
-<span class="sourceLineNo">069</span>    htu = new HBaseCommonTestingUtility();<a name="line.69"></a>
-<span class="sourceLineNo">070</span><a name="line.70"></a>
-<span class="sourceLineNo">071</span>    // NOTE: The executor will be created by each test<a name="line.71"></a>
-<span class="sourceLineNo">072</span>    procEnv = new TestProcEnv();<a name="line.72"></a>
-<span class="sourceLineNo">073</span>    testDir = htu.getDataTestDir();<a name="line.73"></a>
-<span class="sourceLineNo">074</span>    fs = testDir.getFileSystem(htu.getConfiguration());<a name="line.74"></a>
-<span class="sourceLineNo">075</span>    assertTrue(testDir.depth() &gt; 1);<a name="line.75"></a>
-<span class="sourceLineNo">076</span><a name="line.76"></a>
-<span class="sourceLineNo">077</span>    logDir = new Path(testDir, "proc-logs");<a name="line.77"></a>
-<span class="sourceLineNo">078</span>    procStore = ProcedureTestingUtility.createWalStore(htu.getConfiguration(), logDir);<a name="line.78"></a>
-<span class="sourceLineNo">079</span>    procExecutor = new ProcedureExecutor&lt;&gt;(htu.getConfiguration(), procEnv,<a name="line.79"></a>
-<span class="sourceLineNo">080</span>        procStore);<a name="line.80"></a>
-<span class="sourceLineNo">081</span>    procStore.start(PROCEDURE_EXECUTOR_SLOTS);<a name="line.81"></a>
-<span class="sourceLineNo">082</span>    ProcedureTestingUtility<a name="line.82"></a>
-<span class="sourceLineNo">083</span>        .initAndStartWorkers(procExecutor, PROCEDURE_EXECUTOR_SLOTS, true);<a name="line.83"></a>
-<span class="sourceLineNo">084</span>  }<a name="line.84"></a>
-<span class="sourceLineNo">085</span><a name="line.85"></a>
-<span class="sourceLineNo">086</span>  @Test<a name="line.86"></a>
-<span class="sourceLineNo">087</span>  public void testBypassSuspendProcedure() throws Exception {<a name="line.87"></a>
-<span class="sourceLineNo">088</span>    final SuspendProcedure proc = new SuspendProcedure();<a name="line.88"></a>
-<span class="sourceLineNo">089</span>    long id = procExecutor.submitProcedure(proc);<a name="line.89"></a>
-<span class="sourceLineNo">090</span>    Thread.sleep(500);<a name="line.90"></a>
-<span class="sourceLineNo">091</span>    //bypass the procedure<a name="line.91"></a>
-<span class="sourceLineNo">092</span>    assertTrue(procExecutor.bypassProcedure(id, 30000, false, false));<a name="line.92"></a>
-<span class="sourceLineNo">093</span>    htu.waitFor(5000, () -&gt; proc.isSuccess() &amp;&amp; proc.isBypass());<a name="line.93"></a>
-<span class="sourceLineNo">094</span>    LOG.info("{} finished", proc);<a name="line.94"></a>
-<span class="sourceLineNo">095</span>  }<a name="line.95"></a>
-<span class="sourceLineNo">096</span><a name="line.96"></a>
-<span class="sourceLineNo">097</span>  @Test<a name="line.97"></a>
-<span class="sourceLineNo">098</span>  public void testStuckProcedure() throws Exception {<a name="line.98"></a>
-<span class="sourceLineNo">099</span>    final StuckProcedure proc = new StuckProcedure();<a name="line.99"></a>
-<span class="sourceLineNo">100</span>    long id = procExecutor.submitProcedure(proc);<a name="line.100"></a>
-<span class="sourceLineNo">101</span>    Thread.sleep(500);<a name="line.101"></a>
-<span class="sourceLineNo">102</span>    //bypass the procedure<a name="line.102"></a>
-<span class="sourceLineNo">103</span>    assertTrue(procExecutor.bypassProcedure(id, 1000, true, false));<a name="line.103"></a>
-<span class="sourceLineNo">104</span>    //Since the procedure is stuck there, we need to restart the executor to recovery.<a name="line.104"></a>
-<span class="sourceLineNo">105</span>    ProcedureTestingUtility.restart(procExecutor);<a name="line.105"></a>
-<span class="sourceLineNo">106</span>    htu.waitFor(5000, () -&gt; proc.isSuccess() &amp;&amp; proc.isBypass());<a name="line.106"></a>
-<span class="sourceLineNo">107</span>    LOG.info("{} finished", proc);<a name="line.107"></a>
-<span class="sourceLineNo">108</span>  }<a name="line.108"></a>
-<span class="sourceLineNo">109</span><a name="line.109"></a>
-<span class="sourceLineNo">110</span>  @Test<a name="line.110"></a>
-<span class="sourceLineNo">111</span>  public void testBypassingProcedureWithParent() throws Exception {<a name="line.111"></a>
-<span class="sourceLineNo">112</span>    final RootProcedure proc = new RootProcedure();<a name="line.112"></a>
-<span class="sourceLineNo">113</span>    long rootId = procExecutor.submitProcedure(proc);<a name="line.113"></a>
-<span class="sourceLineNo">114</span>    htu.waitFor(5000, () -&gt; procExecutor.getProcedures().stream()<a name="line.114"></a>
-<span class="sourceLineNo">115</span>      .filter(p -&gt; p.getParentProcId() == rootId).collect(Collectors.toList())<a name="line.115"></a>
-<span class="sourceLineNo">116</span>      .size() &gt; 0);<a name="line.116"></a>
-<span class="sourceLineNo">117</span>    SuspendProcedure suspendProcedure = (SuspendProcedure)procExecutor.getProcedures().stream()<a name="line.117"></a>
-<span class="sourceLineNo">118</span>        .filter(p -&gt; p.getParentProcId() == rootId).collect(Collectors.toList()).get(0);<a name="line.118"></a>
-<span class="sourceLineNo">119</span>    assertTrue(procExecutor.bypassProcedure(suspendProcedure.getProcId(), 1000, false, false));<a name="line.119"></a>
-<span class="sourceLineNo">120</span>    htu.waitFor(5000, () -&gt; proc.isSuccess() &amp;&amp; proc.isBypass());<a name="line.120"></a>
-<span class="sourceLineNo">121</span>    LOG.info("{} finished", proc);<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 testBypassingStuckStateMachineProcedure() throws Exception {<a name="line.125"></a>
-<span class="sourceLineNo">126</span>    final StuckStateMachineProcedure proc =<a name="line.126"></a>
-<span class="sourceLineNo">127</span>        new StuckStateMachineProcedure(procEnv, StuckStateMachineState.START);<a name="line.127"></a>
-<span class="sourceLineNo">128</span>    long id = procExecutor.submitProcedure(proc);<a name="line.128"></a>
-<span class="sourceLineNo">129</span>    Thread.sleep(500);<a name="line.129"></a>
-<span class="sourceLineNo">130</span>    // bypass the procedure<a name="line.130"></a>
-<span class="sourceLineNo">131</span>    assertFalse(procExecutor.bypassProcedure(id, 1000, false, false));<a name="line.131"></a>
-<span class="sourceLineNo">132</span>    assertTrue(procExecutor.bypassProcedure(id, 1000, true, false));<a name="line.132"></a>
-<span class="sourceLineNo">133</span><a name="line.133"></a>
-<span class="sourceLineNo">134</span>    htu.waitFor(5000, () -&gt; proc.isSuccess() &amp;&amp; proc.isBypass());<a name="line.134"></a>
-<span class="sourceLineNo">135</span>    LOG.info("{} finished", proc);<a name="line.135"></a>
-<span class="sourceLineNo">136</span>  }<a name="line.136"></a>
-<span class="sourceLineNo">137</span><a name="line.137"></a>
-<span class="sourceLineNo">138</span>  @Test<a name="line.138"></a>
-<span class="sourceLineNo">139</span>  public void testBypassingProcedureWithParentRecursive() throws Exception {<a name="line.139"></a>
-<span class="sourceLineNo">140</span>    final RootProcedure proc = new RootProcedure();<a name="line.140"></a>
-<span class="sourceLineNo">141</span>    long rootId = procExecutor.submitProcedure(proc);<a name="line.141"></a>
-<span class="sourceLineNo">142</span>    htu.waitFor(5000, () -&gt; procExecutor.getProcedures().stream()<a name="line.142"></a>
-<span class="sourceLineNo">143</span>        .filter(p -&gt; p.getParentProcId() == rootId).collect(Collectors.toList())<a name="line.143"></a>
-<span class="sourceLineNo">144</span>        .size() &gt; 0);<a name="line.144"></a>
-<span class="sourceLineNo">145</span>    SuspendProcedure suspendProcedure = (SuspendProcedure)procExecutor.getProcedures().stream()<a name="line.145"></a>
-<span class="sourceLineNo">146</span>        .filter(p -&gt; p.getParentProcId() == rootId).collect(Collectors.toList()).get(0);<a name="line.146"></a>
-<span class="sourceLineNo">147</span>    assertTrue(procExecutor.bypassProcedure(rootId, 1000, false, true));<a name="line.147"></a>
-<span class="sourceLineNo">148</span>    htu.waitFor(5000, () -&gt; proc.isSuccess() &amp;&amp; proc.isBypass());<a name="line.148"></a>
-<span class="sourceLineNo">149</span>    LOG.info("{} finished", proc);<a name="line.149"></a>
-<span class="sourceLineNo">150</span>  }<a name="line.150"></a>
-<span class="sourceLineNo">151</span><a name="line.151"></a>
-<span class="sourceLineNo">152</span>  @AfterClass<a name="line.152"></a>
-<span class="sourceLineNo">153</span>  public static void tearDown() throws Exception {<a name="line.153"></a>
-<span class="sourceLineNo">154</span>    procExecutor.stop();<a name="line.154"></a>
-<span class="sourceLineNo">155</span>    procStore.stop(false);<a name="line.155"></a>
-<span class="sourceLineNo">156</span>    procExecutor.join();<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>  public static class SuspendProcedure extends ProcedureTestingUtility.NoopProcedure&lt;TestProcEnv&gt; {<a name="line.159"></a>
+<span class="sourceLineNo">043</span><a name="line.43"></a>
+<span class="sourceLineNo">044</span>@Category({MasterTests.class, SmallTests.class})<a name="line.44"></a>
+<span class="sourceLineNo">045</span>public class TestProcedureBypass {<a name="line.45"></a>
+<span class="sourceLineNo">046</span><a name="line.46"></a>
+<span class="sourceLineNo">047</span>  @ClassRule public static final HBaseClassTestRule CLASS_RULE = HBaseClassTestRule<a name="line.47"></a>
+<span class="sourceLineNo">048</span>      .forClass(TestProcedureBypass.class);<a name="line.48"></a>
+<span class="sourceLineNo">049</span><a name="line.49"></a>
+<span class="sourceLineNo">050</span>  private static final Logger LOG = LoggerFactory.getLogger(TestProcedureBypass.class);<a name="line.50"></a>
+<span class="sourceLineNo">051</span><a name="line.51"></a>
+<span class="sourceLineNo">052</span>  private static final int PROCEDURE_EXECUTOR_SLOTS = 1;<a name="line.52"></a>
+<span class="sourceLineNo">053</span><a name="line.53"></a>
+<span class="sourceLineNo">054</span>  private static TestProcEnv procEnv;<a name="line.54"></a>
+<span class="sourceLineNo">055</span>  private static ProcedureStore procStore;<a name="line.55"></a>
+<span class="sourceLineNo">056</span><a name="line.56"></a>
+<span class="sourceLineNo">057</span>  private static ProcedureExecutor&lt;TestProcEnv&gt; procExecutor;<a name="line.57"></a>
+<span class="sourceLineNo">058</span><a name="line.58"></a>
+<span class="sourceLineNo">059</span>  private static HBaseCommonTestingUtility htu;<a name="line.59"></a>
+<span class="sourceLineNo">060</span><a name="line.60"></a>
+<span class="sourceLineNo">061</span>  private static FileSystem fs;<a name="line.61"></a>
+<span class="sourceLineNo">062</span>  private static Path testDir;<a name="line.62"></a>
+<span class="sourceLineNo">063</span>  private static Path logDir;<a name="line.63"></a>
+<span class="sourceLineNo">064</span><a name="line.64"></a>
+<span class="sourceLineNo">065</span>  private static class TestProcEnv {<a name="line.65"></a>
+<span class="sourceLineNo">066</span>  }<a name="line.66"></a>
+<span class="sourceLineNo">067</span><a name="line.67"></a>
+<span class="sourceLineNo">068</span>  @BeforeClass<a name="line.68"></a>
+<span class="sourceLineNo">069</span>  public static void setUp() throws Exception {<a name="line.69"></a>
+<span class="sourceLineNo">070</span>    htu = new HBaseCommonTestingUtility();<a name="line.70"></a>
+<span class="sourceLineNo">071</span><a name="line.71"></a>
+<span class="sourceLineNo">072</span>    // NOTE: The executor will be created by each test<a name="line.72"></a>
+<span class="sourceLineNo">073</span>    procEnv = new TestProcEnv();<a name="line.73"></a>
+<span class="sourceLineNo">074</span>    testDir = htu.getDataTestDir();<a name="line.74"></a>
+<span class="sourceLineNo">075</span>    fs = testDir.getFileSystem(htu.getConfiguration());<a name="line.75"></a>
+<span class="sourceLineNo">076</span>    assertTrue(testDir.depth() &gt; 1);<a name="line.76"></a>
+<span class="sourceLineNo">077</span><a name="line.77"></a>
+<span class="sourceLineNo">078</span>    logDir = new Path(testDir, "proc-logs");<a name="line.78"></a>
+<span class="sourceLineNo">079</span>    procStore = ProcedureTestingUtility.createWalStore(htu.getConfiguration(), logDir);<a name="line.79"></a>
+<span class="sourceLineNo">080</span>    procExecutor = new ProcedureExecutor&lt;&gt;(htu.getConfiguration(), procEnv,<a name="line.80"></a>
+<span class="sourceLineNo">081</span>        procStore);<a name="line.81"></a>
+<span class="sourceLineNo">082</span>    procStore.start(PROCEDURE_EXECUTOR_SLOTS);<a name="line.82"></a>
+<span class="sourceLineNo">083</span>    ProcedureTestingUtility<a name="line.83"></a>
+<span class="sourceLineNo">084</span>        .initAndStartWorkers(procExecutor, PROCEDURE_EXECUTOR_SLOTS, true);<a name="line.84"></a>
+<span class="sourceLineNo">085</span>  }<a name="line.85"></a>
+<span class="sourceLineNo">086</span><a name="line.86"></a>
+<span class="sourceLineNo">087</span>  @Test<a name="line.87"></a>
+<span class="sourceLineNo">088</span>  public void testBypassSuspendProcedure() throws Exception {<a name="line.88"></a>
+<span class="sourceLineNo">089</span>    final SuspendProcedure proc = new SuspendProcedure();<a name="line.89"></a>
+<span class="sourceLineNo">090</span>    long id = procExecutor.submitProcedure(proc);<a name="line.90"></a>
+<span class="sourceLineNo">091</span>    Thread.sleep(500);<a name="line.91"></a>
+<span class="sourceLineNo">092</span>    //bypass the procedure<a name="line.92"></a>
+<span class="sourceLineNo">093</span>    assertTrue(procExecutor.bypassProcedure(id, 30000, false, false));<a name="line.93"></a>
+<span class="sourceLineNo">094</span>    htu.waitFor(5000, () -&gt; proc.isSuccess() &amp;&amp; proc.isBypass());<a name="line.94"></a>
+<span class="sourceLineNo">095</span>    LOG.info("{} finished", proc);<a name="line.95"></a>
+<span class="sourceLineNo">096</span>  }<a name="line.96"></a>
+<span class="sourceLineNo">097</span><a name="line.97"></a>
+<span class="sourceLineNo">098</span>  @Test<a name="line.98"></a>
+<span class="sourceLineNo">099</span>  public void testStuckProcedure() throws Exception {<a name="line.99"></a>
+<span class="sourceLineNo">100</span>    final StuckProcedure proc = new StuckProcedure();<a name="line.100"></a>
+<span class="sourceLineNo">101</span>    long id = procExecutor.submitProcedure(proc);<a name="line.101"></a>
+<span class="sourceLineNo">102</span>    Thread.sleep(500);<a name="line.102"></a>
+<span class="sourceLineNo">103</span>    //bypass the procedure<a name="line.103"></a>
+<span class="sourceLineNo">104</span>    assertTrue(procExecutor.bypassProcedure(id, 1000, true, false));<a name="line.104"></a>
+<span class="sourceLineNo">105</span>    //Since the procedure is stuck there, we need to restart the executor to recovery.<a name="line.105"></a>
+<span class="sourceLineNo">106</span>    ProcedureTestingUtility.restart(procExecutor);<a name="line.106"></a>
+<span class="sourceLineNo">107</span>    htu.waitFor(5000, () -&gt; proc.isSuccess() &amp;&amp; proc.isBypass());<a name="line.107"></a>
+<span class="sourceLineNo">108</span>    LOG.info("{} finished", proc);<a name="line.108"></a>
+<span class="sourceLineNo">109</span>  }<a name="line.109"></a>
+<span class="sourceLineNo">110</span><a name="line.110"></a>
+<span class="sourceLineNo">111</span>  @Test<a name="line.111"></a>
+<span class="sourceLineNo">112</span>  public void testBypassingProcedureWithParent() throws Exception {<a name="line.112"></a>
+<span class="sourceLineNo">113</span>    final RootProcedure proc = new RootProcedure();<a name="line.113"></a>
+<span class="sourceLineNo">114</span>    long rootId = procExecutor.submitProcedure(proc);<a name="line.114"></a>
+<span class="sourceLineNo">115</span>    htu.waitFor(5000, () -&gt; procExecutor.getProcedures().stream()<a name="line.115"></a>
+<span class="sourceLineNo">116</span>      .filter(p -&gt; p.getParentProcId() == rootId).collect(Collectors.toList())<a name="line.116"></a>
+<span class="sourceLineNo">117</span>      .size() &gt; 0);<a name="line.117"></a>
+<span class="sourceLineNo">118</span>    SuspendProcedure suspendProcedure = (SuspendProcedure)procExecutor.getProcedures().stream()<a name="line.118"></a>
+<span class="sourceLineNo">119</span>        .filter(p -&gt; p.getParentProcId() == rootId).collect(Collectors.toList()).get(0);<a name="line.119"></a>
+<span class="sourceLineNo">120</span>    assertTrue(procExecutor.bypassProcedure(suspendProcedure.getProcId(), 1000, false, false));<a name="line.120"></a>
+<span class="sourceLineNo">121</span>    htu.waitFor(5000, () -&gt; proc.isSuccess() &amp;&amp; proc.isBypass());<a name="line.121"></a>
+<span class="sourceLineNo">122</span>    LOG.info("{} finished", proc);<a name="line.122"></a>
+<span class="sourceLineNo">123</span>  }<a name="line.123"></a>
+<span class="sourceLineNo">124</span><a name="line.124"></a>
+<span class="sourceLineNo">125</span>  @Test<a name="line.125"></a>
+<span class="sourceLineNo">126</span>  public void testBypassingStuckStateMachineProcedure() throws Exception {<a name="line.126"></a>
+<span class="sourceLineNo">127</span>    final StuckStateMachineProcedure proc =<a name="line.127"></a>
+<span class="sourceLineNo">128</span>        new StuckStateMachineProcedure(procEnv, StuckStateMachineState.START);<a name="line.128"></a>
+<span class="sourceLineNo">129</span>    long id = procExecutor.submitProcedure(proc);<a name="line.129"></a>
+<span class="sourceLineNo">130</span>    Thread.sleep(500);<a name="line.130"></a>
+<span class="sourceLineNo">131</span>    // bypass the procedure<a name="line.131"></a>
+<span class="sourceLineNo">132</span>    assertFalse(procExecutor.bypassProcedure(id, 1000, false, false));<a name="line.132"></a>
+<span class="sourceLineNo">133</span>    assertTrue(procExecutor.bypassProcedure(id, 1000, true, false));<a name="line.133"></a>
+<span class="sourceLineNo">134</span><a name="line.134"></a>
+<span class="sourceLineNo">135</span>    htu.waitFor(5000, () -&gt; proc.isSuccess() &amp;&amp; proc.isBypass());<a name="line.135"></a>
+<span class="sourceLineNo">136</span>    LOG.info("{} finished", proc);<a name="line.136"></a>
+<span class="sourceLineNo">137</span>  }<a name="line.137"></a>
+<span class="sourceLineNo">138</span><a name="line.138"></a>
+<span class="sourceLineNo">139</span>  @Test<a name="line.139"></a>
+<span class="sourceLineNo">140</span>  public void testBypassingProcedureWithParentRecursive() throws Exception {<a name="line.140"></a>
+<span class="sourceLineNo">141</span>    final RootProcedure proc = new RootProcedure();<a name="line.141"></a>
+<span class="sourceLineNo">142</span>    long rootId = procExecutor.submitProcedure(proc);<a name="line.142"></a>
+<span class="sourceLineNo">143</span>    htu.waitFor(5000, () -&gt; procExecutor.getProcedures().stream()<a name="line.143"></a>
+<span class="sourceLineNo">144</span>        .filter(p -&gt; p.getParentProcId() == rootId).collect(Collectors.toList())<a name="line.144"></a>
+<span class="sourceLineNo">145</span>        .size() &gt; 0);<a name="line.145"></a>
+<span class="sourceLineNo">146</span>    SuspendProcedure suspendProcedure = (SuspendProcedure)procExecutor.getProcedures().stream()<a name="line.146"></a>
+<span class="sourceLineNo">147</span>        .filter(p -&gt; p.getParentProcId() == rootId).collect(Collectors.toList()).get(0);<a name="line.147"></a>
+<span class="sourceLineNo">148</span>    assertTrue(procExecutor.bypassProcedure(rootId, 1000, false, true));<a name="line.148"></a>
+<span class="sourceLineNo">149</span>    htu.waitFor(5000, () -&gt; proc.isSuccess() &amp;&amp; proc.isBypass());<a name="line.149"></a>
+<span class="sourceLineNo">150</span>    LOG.info("{} finished", proc);<a name="line.150"></a>
+<span class="sourceLineNo">151</span>  }<a name="line.151"></a>
+<span class="sourceLineNo">152</span><a name="line.152"></a>
+<span class="sourceLineNo">153</span>  @Test<a name="line.153"></a>
+<span class="sourceLineNo">154</span>  public void testBypassingWaitingTimeoutProcedures() throws Exception {<a name="line.154"></a>
+<span class="sourceLineNo">155</span>    final WaitingTimeoutProcedure proc = new WaitingTimeoutProcedure();<a name="line.155"></a>
+<span class="sourceLineNo">156</span>    long id = procExecutor.submitProcedure(proc);<a name="line.156"></a>
+<span class="sourceLineNo">157</span>    Thread.sleep(500);<a name="line.157"></a>
+<span class="sourceLineNo">158</span>    // bypass the procedure<a name="line.158"></a>
+<span class="sourceLineNo">159</span>    assertTrue(procExecutor.bypassProcedure(id, 1000, true, false));<a name="line.159"></a>
 <span class="sourceLineNo">160</span><a name="line.160"></a>
-<span class="sourceLineNo">161</span>    public SuspendProcedure() {<a name="line.161"></a>
-<span class="sourceLineNo">162</span>      super();<a name="line.162"></a>
-<span class="sourceLineNo">163</span>    }<a name="line.163"></a>
+<span class="sourceLineNo">161</span>    htu.waitFor(5000, () -&gt; proc.isSuccess() &amp;&amp; proc.isBypass());<a name="line.161"></a>
+<span class="sourceLineNo">162</span>    LOG.info("{} finished", proc);<a name="line.162"></a>
+<span class="sourceLineNo">163</span>  }<a name="line.163"></a>
 <span class="sourceLineNo">164</span><a name="line.164"></a>
-<span class="sourceLineNo">165</span>    @Override<a name="line.165"></a>
-<span class="sourceLineNo">166</span>    protected Procedure[] execute(final TestProcEnv env)<a name="line.166"></a>
-<span class="sourceLineNo">167</span>        throws ProcedureSuspendedException {<a name="line.167"></a>
-<span class="sourceLineNo">168</span>      // Always suspend the procedure<a name="line.168"></a>
-<span class="sourceLineNo">169</span>      throw new ProcedureSuspendedException();<a name="line.169"></a>
-<span class="sourceLineNo">170</span>    }<a name="line.170"></a>
-<span class="sourceLineNo">171</span>  }<a name="line.171"></a>
-<span class="sourceLineNo">172</span><a name="line.172"></a>
-<span class="sourceLineNo">173</span>  public static class StuckProcedure extends ProcedureTestingUtility.NoopProcedure&lt;TestProcEnv&gt; {<a name="line.173"></a>
-<span class="sourceLineNo">174</span><a name="line.174"></a>
-<span class="sourceLineNo">175</span>    public StuckProcedure() {<a name="line.175"></a>
-<span class="sourceLineNo">176</span>      super();<a name="line.176"></a>
-<span class="sourceLineNo">177</span>    }<a name="line.177"></a>
-<span class="sourceLineNo">178</span><a name="line.178"></a>
-<span class="sourceLineNo">179</span>    @Override<a name="line.179"></a>
-<span class="sourceLineNo">180</span>    protected Procedure[] execute(final TestProcEnv env) {<a name="line.180"></a>
-<span class="sourceLineNo">181</span>      try {<a name="line.181"></a>
-<span class="sourceLineNo">182</span>        Thread.sleep(Long.MAX_VALUE);<a name="line.182"></a>
-<span class="sourceLineNo">183</span>      } catch (Throwable t) {<a name="line.183"></a>
-<span class="sourceLineNo">184</span>        LOG.debug("Sleep is interrupted.", t);<a name="line.184"></a>
-<span class="sourceLineNo">185</span>      }<a name="line.185"></a>
-<span class="sourceLineNo">186</span>      return null;<a name="line.186"></a>
-<span class="sourceLineNo">187</span>    }<a name="line.187"></a>
-<span class="sourceLineNo">188</span><a name="line.188"></a>
-<span class="sourceLineNo">189</span>  }<a name="line.189"></a>
-<span class="sourceLineNo">190</span><a name="line.190"></a>
+<span class="sourceLineNo">165</span>  @AfterClass<a name="line.165"></a>
+<span class="sourceLineNo">166</span>  public static void tearDown() throws Exception {<a name="line.166"></a>
+<span class="sourceLineNo">167</span>    procExecutor.stop();<a name="line.167"></a>
+<span class="sourceLineNo">168</span>    procStore.stop(false);<a name="line.168"></a>
+<span class="sourceLineNo">169</span>    procExecutor.join();<a name="line.169"></a>
+<span class="sourceLineNo">170</span>  }<a name="line.170"></a>
+<span class="sourceLineNo">171</span><a name="line.171"></a>
+<span class="sourceLineNo">172</span>  public static class SuspendProcedure extends ProcedureTestingUtility.NoopProcedure&lt;TestProcEnv&gt; {<a name="line.172"></a>
+<span class="sourceLineNo">173</span><a name="line.173"></a>
+<span class="sourceLineNo">174</span>    public SuspendProcedure() {<a name="line.174"></a>
+<span class="sourceLineNo">175</span>      super();<a name="line.175"></a>
+<span class="sourceLineNo">176</span>    }<a name="line.176"></a>
+<span class="sourceLineNo">177</span><a name="line.177"></a>
+<span class="sourceLineNo">178</span>    @Override<a name="line.178"></a>
+<span class="sourceLineNo">179</span>    protected Procedure[] execute(final TestProcEnv env)<a name="line.179"></a>
+<span class="sourceLineNo">180</span>        throws ProcedureSuspendedException {<a name="line.180"></a>
+<span class="sourceLineNo">181</span>      // Always suspend the procedure<a name="line.181"></a>
+<span class="sourceLineNo">182</span>      throw new ProcedureSuspendedException();<a name="line.182"></a>
+<span class="sourceLineNo">183</span>    }<a name="line.183"></a>
+<span class="sourceLineNo">184</span>  }<a name="line.184"></a>
+<span class="sourceLineNo">185</span><a name="line.185"></a>
+<span class="sourceLineNo">186</span>  public static class StuckProcedure extends ProcedureTestingUtility.NoopProcedure&lt;TestProcEnv&gt; {<a name="line.186"></a>
+<span class="sourceLineNo">187</span><a name="line.187"></a>
+<span class="sourceLineNo">188</span>    public StuckProcedure() {<a name="line.188"></a>
+<span class="sourceLineNo">189</span>      super();<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>  public static class RootProcedure extends ProcedureTestingUtility.NoopProcedure&lt;TestProcEnv&gt; {<a name="line.192"></a>
-<span class="sourceLineNo">193</span>    private boolean childSpwaned = false;<a name="line.193"></a>
-<span class="sourceLineNo">194</span><a name="line.194"></a>
-<span class="sourceLineNo">195</span>    public RootProcedure() {<a name="line.195"></a>
-<span class="sourceLineNo">196</span>      super();<a name="line.196"></a>
-<span class="sourceLineNo">197</span>    }<a name="line.197"></a>
-<span class="sourceLineNo">198</span><a name="line.198"></a>
-<span class="sourceLineNo">199</span>    @Override<a name="line.199"></a>
-<span class="sourceLineNo">200</span>    protected Procedure[] execute(final TestProcEnv env)<a name="line.200"></a>
-<span class="sourceLineNo">201</span>        throws ProcedureSuspendedException {<a name="line.201"></a>
-<span class="sourceLineNo">202</span>      if (!childSpwaned) {<a name="line.202"></a>
-<span class="sourceLineNo">203</span>        childSpwaned = true;<a name="line.203"></a>
-<span class="sourceLineNo">204</span>        return new Procedure[] {new SuspendProcedure()};<a name="line.204"></a>
-<span class="sourceLineNo">205</span>      } else {<a name="line.205"></a>
-<span class="sourceLineNo">206</span>        return null;<a name="line.206"></a>
-<span class="sourceLineNo">207</span>      }<a name="line.207"></a>
-<span class="sourceLineNo">208</span>    }<a name="line.208"></a>
-<span class="sourceLineNo">209</span>  }<a name="line.209"></a>
-<span class="sourceLineNo">210</span><a name="line.210"></a>
+<span class="sourceLineNo">192</span>    @Override<a name="line.192"></a>
+<span class="sourceLineNo">193</span>    protected Procedure[] execute(final TestProcEnv env) {<a name="line.193"></a>
+<span class="sourceLineNo">194</span>      try {<a name="line.194"></a>
+<span class="sourceLineNo">195</span>        Thread.sleep(Long.MAX_VALUE);<a name="line.195"></a>
+<span class="sourceLineNo">196</span>      } catch (Throwable t) {<a name="line.196"></a>
+<span class="sourceLineNo">197</span>        LOG.debug("Sleep is interrupted.", t);<a name="line.197"></a>
+<span class="sourceLineNo">198</span>      }<a name="line.198"></a>
+<span class="sourceLineNo">199</span>      return null;<a name="line.199"></a>
+<span class="sourceLineNo">200</span>    }<a name="line.200"></a>
+<span class="sourceLineNo">201</span><a name="line.201"></a>
+<span class="sourceLineNo">202</span>  }<a name="line.202"></a>
+<span class="sourceLineNo">203</span><a name="line.203"></a>
+<span class="sourceLineNo">204</span><a name="line.204"></a>
+<span class="sourceLineNo">205</span>  public static class RootProcedure extends ProcedureTestingUtility.NoopProcedure&lt;TestProcEnv&gt; {<a name="line.205"></a>
+<span class="sourceLineNo">206</span>    private boolean childSpwaned = false;<a name="line.206"></a>
+<span class="sourceLineNo">207</span><a name="line.207"></a>
+<span class="sourceLineNo">208</span>    public RootProcedure() {<a name="line.208"></a>
+<span class="sourceLineNo">209</span>      super();<a name="line.209"></a>
+<span class="sourceLineNo">210</span>    }<a name="line.210"></a>
 <span class="sourceLineNo">211</span><a name="line.211"></a>
-<span class="sourceLineNo">212</span>  public enum StuckStateMachineState {<a name="line.212"></a>
-<span class="sourceLineNo">213</span>    START, THEN, END<a name="line.213"></a>
-<span class="sourceLineNo">214</span>  }<a name="line.214"></a>
-<span class="sourceLineNo">215</span><a name="line.215"></a>
-<span class="sourceLineNo">216</span>  public static class StuckStateMachineProcedure extends<a name="line.216"></a>
-<span class="sourceLineNo">217</span>      ProcedureTestingUtility.NoopStateMachineProcedure&lt;TestProcEnv, StuckStateMachineState&gt; {<a name="line.217"></a>
-<span class="sourceLineNo">218</span>    private AtomicBoolean stop = new AtomicBoolean(false);<a name="line.218"></a>
-<span class="sourceLineNo">219</span><a name="line.219"></a>
-<span class="sourceLineNo">220</span>    public StuckStateMachineProcedure() {<a name="line.220"></a>
-<span class="sourceLineNo">221</span>      super();<a name="line.221"></a>
-<span class="sourceLineNo">222</span>    }<a name="line.222"></a>
+<span class="sourceLineNo">212</span>    @Override<a name="line.212"></a>
+<span class="sourceLineNo">213</span>    protected Procedure[] execute(final TestProcEnv env)<a name="line.213"></a>
+<span class="sourceLineNo">214</span>        throws ProcedureSuspendedException {<a name="line.214"></a>
+<span class="sourceLineNo">215</span>      if (!childSpwaned) {<a name="line.215"></a>
+<span class="sourceLineNo">216</span>        childSpwaned = true;<a name="line.216"></a>
+<span class="sourceLineNo">217</span>        return new Procedure[] {new SuspendProcedure()};<a name="line.217"></a>
+<span class="sourceLineNo">218</span>      } else {<a name="line.218"></a>
+<span class="sourceLineNo">219</span>        return null;<a name="line.219"></a>
+<span class="sourceLineNo">220</span>      }<a name="line.220"></a>
+<span class="sourceLineNo">221</span>    }<a name="line.221"></a>
+<span class="sourceLineNo">222</span>  }<a name="line.222"></a>
 <span class="sourceLineNo">223</span><a name="line.223"></a>
-<span class="sourceLineNo">224</span>    public StuckStateMachineProcedure(TestProcEnv env, StuckStateMachineState initialState) {<a name="line.224"></a>
-<span class="sourceLineNo">225</span>      super(env, initialState);<a name="line.225"></a>
-<span class="sourceLineNo">226</span>    }<a name="line.226"></a>
-<span class="sourceLineNo">227</span><a name="line.227"></a>
-<span class="sourceLineNo">228</span>    @Override<a name="line.228"></a>
-<span class="sourceLineNo">229</span>    protected Flow executeFromState(TestProcEnv env, StuckStateMachineState tState)<a name="line.229"></a>
-<span class="sourceLineNo">230</span>            throws ProcedureSuspendedException, ProcedureYieldException, InterruptedException {<a name="line.230"></a>
-<span class="sourceLineNo">231</span>      switch (tState) {<a name="line.231"></a>
-<span class="sourceLineNo">232</span>        case START:<a name="line.232"></a>
-<span class="sourceLineNo">233</span>          LOG.info("PHASE 1: START");<a name="line.233"></a>
-<span class="sourceLineNo">234</span>          setNextState(StuckStateMachineState.THEN);<a name="line.234"></a>
-<span class="sourceLineNo">235</span>          return Flow.HAS_MORE_STATE;<a name="line.235"></a>
-<span class="sourceLineNo">236</span>        case THEN:<a name="line.236"></a>
-<span class="sourceLineNo">237</span>          if (stop.get()) {<a name="line.237"></a>
-<span class="sourceLineNo">238</span>            setNextState(StuckStateMachineState.END);<a name="line.238"></a>
-<span class="sourceLineNo">239</span>          }<a name="line.239"></a>
-<span class="sourceLineNo">240</span>          return Flow.HAS_MORE_STATE;<a name="line.240"></a>
-<span class="sourceLineNo">241</span>        case END:<a name="line.241"></a>
-<span class="sourceLineNo">242</span>          return Flow.NO_MORE_STATE;<a name="line.242"></a>
-<span class="sourceLineNo">243</span>        default:<a name="line.243"></a>
-<span class="sourceLineNo">244</span>          throw new UnsupportedOperationException("unhandled state=" + tState);<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">224</span>  public static class WaitingTimeoutProcedure<a name="line.224"></a>
+<span class="sourceLineNo">225</span>      extends ProcedureTestingUtility.NoopProcedure&lt;TestProcEnv&gt; {<a name="line.225"></a>
+<span class="sourceLineNo">226</span>    public WaitingTimeoutProcedure() {<a name="line.226"></a>
+<span class="sourceLineNo">227</span>      super();<a name="line.227"></a>
+<span class="sourceLineNo">228</span>    }<a name="line.228"></a>
+<span class="sourceLineNo">229</span><a name="line.229"></a>
+<span class="sourceLineNo">230</span>    @Override<a name="line.230"></a>
+<span class="sourceLineNo">231</span>    protected Procedure[] execute(final TestProcEnv env)<a name="line.231"></a>
+<span class="sourceLineNo">232</span>        throws ProcedureSuspendedException {<a name="line.232"></a>
+<span class="sourceLineNo">233</span>      // Always suspend the procedure<a name="line.233"></a>
+<span class="sourceLineNo">234</span>      setTimeout(50000);<a name="line.234"></a>
+<span class="sourceLineNo">235</span>      setState(ProcedureProtos.ProcedureState.WAITING_TIMEOUT);<a name="line.235"></a>
+<span class="sourceLineNo">236</span>      skipPersistence();<a name="line.236"></a>
+<span class="sourceLineNo">237</span>      throw new ProcedureSuspendedException();<a name="line.237"></a>
+<span class="sourceLineNo">238</span>    }<a name="line.238"></a>
+<span class="sourceLineNo">239</span><a name="line.239"></a>
+<span class="sourceLineNo">240</span>    @Override<a name="line.240"></a>
+<span class="sourceLineNo">241</span>    protected synchronized boolean setTimeoutFailure(TestProcEnv env) {<a name="line.241"></a>
+<span class="sourceLineNo">242</span>      setState(ProcedureProtos.ProcedureState.RUNNABLE);<a name="line.242"></a>
+<span class="sourceLineNo">243</span>      procExecutor.getScheduler().addFront(this);<a name="line.243"></a>
+<span class="sourceLineNo">244</span>      return false; // 'false' means that this procedure handled the timeout<a name="line.244"></a>
+<span class="sourceLineNo">245</span>    }<a name="line.245"></a>
+<span class="sourceLineNo">246</span>  }<a name="line.246"></a>
 <span class="sourceLineNo">247</span><a name="line.247"></a>
-<span class="sourceLineNo">248</span>    @Override<a name="line.248"></a>
-<span class="sourceLineNo">249</span>    protected StuckStateMachineState getState(int stateId) {<a name="line.249"></a>
-<span class="sourceLineNo">250</span>      return StuckStateMachineState.values()[stateId];<a name="line.250"></a>
-<span class="sourceLineNo">251</span>    }<a name="line.251"></a>
-<span class="sourceLineNo">252</span><a name="line.252"></a>
-<span class="sourceLineNo">253</span>    @Override<a name="line.253"></a>
-<span class="sourceLineNo">254</span>    protected int getStateId(StuckStateMachineState tState) {<a name="line.254"></a>
-<span class="sourceLineNo">255</span>      return tState.ordinal();<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">248</span>  public enum StuckStateMachineState {<a name="line.248"></a>
+<span class="sourceLineNo">249</span>    START, THEN, END<a name="line.249"></a>
+<span class="sourceLineNo">250</span>  }<a name="line.250"></a>
+<span class="sourceLineNo">251</span><a name="line.251"></a>
+<span class="sourceLineNo">252</span>  public static class StuckStateMachineProcedure extends<a name="line.252"></a>
+<span class="sourceLineNo">253</span>      ProcedureTestingUtility.NoopStateMachineProcedure&lt;TestProcEnv, StuckStateMachineState&gt; {<a name="line.253"></a>
+<span class="sourceLineNo">254</span>    private AtomicBoolean stop = new AtomicBoolean(false);<a name="line.254"></a>
+<span class="sourceLineNo">255</span><a name="line.255"></a>
+<span class="sourceLineNo">256</span>    public StuckStateMachineProcedure() {<a name="line.256"></a>
+<span class="sourceLineNo">257</span>      super();<a name="line.257"></a>
+<span class="sourceLineNo">258</span>    }<a name="line.258"></a>
 <span class="sourceLineNo">259</span><a name="line.259"></a>
-<span class="sourceLineNo">260</span>}<a name="line.260"></a>
+<span class="sourceLineNo">260</span>    public StuckStateMachineProcedure(TestProcEnv env, StuckStateMachineState initialState) {<a name="line.260"></a>
+<span class="sourceLineNo">261</span>      super(env, initialState);<a name="line.261"></a>
+<span class="sourceLineNo">262</span>    }<a name="line.262"></a>
+<span class="sourceLineNo">263</span><a name="line.263"></a>
+<span class="sourceLineNo">264</span>    @Override<a name="line.264"></a>
+<span class="sourceLineNo">265</span>    protected Flow executeFromState(TestProcEnv env, StuckStateMachineState tState)<a name="line.265"></a>
+<span class="sourceLineNo">266</span>            throws ProcedureSuspendedException, ProcedureYieldException, InterruptedException {<a name="line.266"></a>
+<span class="sourceLineNo">267</span>      switch (tState) {<a name="line.267"></a>
+<span class="sourceLineNo">268</span>        case START:<a name="line.268"></a>
+<span class="sourceLineNo">269</span>          LOG.info("PHASE 1: START");<a name="line.269"></a>
+<span class="sourceLineNo">270</span>          setNextState(StuckStateMachineState.THEN);<a name="line.270"></a>
+<span class="sourceLineNo">271</span>          return Flow.HAS_MORE_STATE;<a name="line.271"></a>
+<span class="sourceLineNo">272</span>        case THEN:<a name="line.272"></a>
+<span class="sourceLineNo">273</span>          if (stop.get()) {<a name="line.273"></a>
+<span class="sourceLineNo">274</span>            setNextState(StuckStateMachineState.END);<a name="line.274"></a>
+<span class="sourceLineNo">275</span>          }<a name="line.275"></a>
+<span class="sourceLineNo">276</span>          return Flow.HAS_MORE_STATE;<a name="line.276"></a>
+<span class="sourceLineNo">277</span>        case END:<a name="line.277"></a>
+<span class="sourceLineNo">278</span>          return Flow.NO_MORE_STATE;<a name="line.278"></a>
+<span class="sourceLineNo">279</span>        default:<a name="line.279"></a>
+<span class="sourceLineNo">280</span>          throw new UnsupportedOperationException("unhandled state=" + tState);<a name="line.280"></a>
+<span class="sourceLineNo">281</span>      }<a name="line.281"></a>
+<span class="sourceLineNo">282</span>    }<a name="line.282"></a>
+<span class="sourceLineNo">283</span><a name="line.283"></a>
+<span class="sourceLineNo">284</span>    @Override<a name="line.284"></a>
+<span class="sourceLineNo">285</span>    protected StuckStateMachineState getState(int stateId) {<a name="line.285"></a>
+<span class="sourceLineNo">286</span>      return StuckStateMachineState.values()[stateId];<a name="line.286"></a>
+<span class="sourceLineNo">287</span>    }<a name="line.287"></a>
+<span class="sourceLineNo">288</span><a name="line.288"></a>
+<span class="sourceLineNo">289</span>    @Override<a name="line.289"></a>
+<span class="sourceLineNo">290</span>    protected int getStateId(StuckStateMachineState tState) {<a name="line.290"></a>
+<span class="sourceLineNo">291</span>      return tState.ordinal();<a name="line.291"></a>
+<span class="sourceLineNo">292</span>    }<a name="line.292"></a>
+<span class="sourceLineNo">293</span>  }<a name="line.293"></a>
+<span class="sourceLineNo">294</span><a name="line.294"></a>
+<span class="sourceLineNo">295</span><a name="line.295"></a>
+<span class="sourceLineNo">296</span>}<a name="line.296"></a>
 
 
 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/27f5bfb5/testdevapidocs/src-html/org/apache/hadoop/hbase/procedure2/TestProcedureBypass.WaitingTimeoutProcedure.html
----------------------------------------------------------------------
diff --git a/testdevapidocs/src-html/org/apache/hadoop/hbase/procedure2/TestProcedureBypass.WaitingTimeoutProcedure.html b/testdevapidocs/src-html/org/apache/hadoop/hbase/procedure2/TestProcedureBypass.WaitingTimeoutProcedure.html
new file mode 100644
index 0000000..f89b826
--- /dev/null
+++ b/testdevapidocs/src-html/org/apache/hadoop/hbase/procedure2/TestProcedureBypass.WaitingTimeoutProcedure.html
@@ -0,0 +1,368 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
+<html lang="en">
+<head>
+<title>Source code</title>
+<link rel="stylesheet" type="text/css" href="../../../../../../stylesheet.css" title="Style">
+</head>
+<body>
+<div class="sourceContainer">
+<pre><span class="sourceLineNo">001</span>/**<a name="line.1"></a>
+<span class="sourceLineNo">002</span> * Licensed to the Apache Software Foundation (ASF) under one<a name="line.2"></a>
+<span class="sourceLineNo">003</span> * or more contributor license agreements.  See the NOTICE file<a name="line.3"></a>
+<span class="sourceLineNo">004</span> * distributed with this work for additional information<a name="line.4"></a>
+<span class="sourceLineNo">005</span> * regarding copyright ownership.  The ASF licenses this file<a name="line.5"></a>
+<span class="sourceLineNo">006</span> * to you under the Apache License, Version 2.0 (the<a name="line.6"></a>
+<span class="sourceLineNo">007</span> * "License"); you may not use this file except in compliance<a name="line.7"></a>
+<span class="sourceLineNo">008</span> * with the License.  You may obtain a copy of the License at<a name="line.8"></a>
+<span class="sourceLineNo">009</span> *<a name="line.9"></a>
+<span class="sourceLineNo">010</span> *     http://www.apache.org/licenses/LICENSE-2.0<a name="line.10"></a>
+<span class="sourceLineNo">011</span> *<a name="line.11"></a>
+<span class="sourceLineNo">012</span> * Unless required by applicable law or agreed to in writing, software<a name="line.12"></a>
+<span class="sourceLineNo">013</span> * distributed under the License is distributed on an "AS IS" BASIS,<a name="line.13"></a>
+<span class="sourceLineNo">014</span> * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.<a name="line.14"></a>
+<span class="sourceLineNo">015</span> * See the License for the specific language governing permissions and<a name="line.15"></a>
+<span class="sourceLineNo">016</span> * limitations under the License.<a name="line.16"></a>
+<span class="sourceLineNo">017</span> */<a name="line.17"></a>
+<span class="sourceLineNo">018</span>package org.apache.hadoop.hbase.procedure2;<a name="line.18"></a>
+<span class="sourceLineNo">019</span><a name="line.19"></a>
+<span class="sourceLineNo">020</span>import static org.junit.Assert.assertFalse;<a name="line.20"></a>
+<span class="sourceLineNo">021</span>import static org.junit.Assert.assertTrue;<a name="line.21"></a>
+<span class="sourceLineNo">022</span><a name="line.22"></a>
+<span class="sourceLineNo">023</span>import java.util.concurrent.atomic.AtomicBoolean;<a name="line.23"></a>
+<span class="sourceLineNo">024</span>import java.util.stream.Collectors;<a name="line.24"></a>
+<span class="sourceLineNo">025</span><a name="line.25"></a>
+<span class="sourceLineNo">026</span>import org.apache.hadoop.fs.FileSystem;<a name="line.26"></a>
+<span class="sourceLineNo">027</span>import org.apache.hadoop.fs.Path;<a name="line.27"></a>
+<span class="sourceLineNo">028</span>import org.apache.hadoop.hbase.HBaseClassTestRule;<a name="line.28"></a>
+<span class="sourceLineNo">029</span>import org.apache.hadoop.hbase.HBaseCommonTestingUtility;<a name="line.29"></a>
+<span class="sourceLineNo">030</span>import org.apache.hadoop.hbase.procedure2.store.ProcedureStore;<a name="line.30"></a>
+<span class="sourceLineNo">031</span>import org.apache.hadoop.hbase.testclassification.MasterTests;<a name="line.31"></a>
+<span class="sourceLineNo">032</span>import org.apache.hadoop.hbase.testclassification.SmallTests;<a name="line.32"></a>
+<span class="sourceLineNo">033</span>import org.junit.AfterClass;<a name="line.33"></a>
+<span class="sourceLineNo">034</span>import org.junit.BeforeClass;<a name="line.34"></a>
+<span class="sourceLineNo">035</span>import org.junit.ClassRule;<a name="line.35"></a>
+<span class="sourceLineNo">036</span>import org.junit.Test;<a name="line.36"></a>
+<span class="sourceLineNo">037</span>import org.junit.experimental.categories.Category;<a name="line.37"></a>
+<span class="sourceLineNo">038</span>import org.slf4j.Logger;<a name="line.38"></a>
+<span class="sourceLineNo">039</span>import org.slf4j.LoggerFactory;<a name="line.39"></a>
+<span class="sourceLineNo">040</span><a name="line.40"></a>
+<span class="sourceLineNo">041</span>import org.apache.hadoop.hbase.shaded.protobuf.generated.ProcedureProtos;<a name="line.41"></a>
+<span class="sourceLineNo">042</span><a name="line.42"></a>
+<span class="sourceLineNo">043</span><a name="line.43"></a>
+<span class="sourceLineNo">044</span>@Category({MasterTests.class, SmallTests.class})<a name="line.44"></a>
+<span class="sourceLineNo">045</span>public class TestProcedureBypass {<a name="line.45"></a>
+<span class="sourceLineNo">046</span><a name="line.46"></a>
+<span class="sourceLineNo">047</span>  @ClassRule public static final HBaseClassTestRule CLASS_RULE = HBaseClassTestRule<a name="line.47"></a>
+<span class="sourceLineNo">048</span>      .forClass(TestProcedureBypass.class);<a name="line.48"></a>
+<span class="sourceLineNo">049</span><a name="line.49"></a>
+<span class="sourceLineNo">050</span>  private static final Logger LOG = LoggerFactory.getLogger(TestProcedureBypass.class);<a name="line.50"></a>
+<span class="sourceLineNo">051</span><a name="line.51"></a>
+<span class="sourceLineNo">052</span>  private static final int PROCEDURE_EXECUTOR_SLOTS = 1;<a name="line.52"></a>
+<span class="sourceLineNo">053</span><a name="line.53"></a>
+<span class="sourceLineNo">054</span>  private static TestProcEnv procEnv;<a name="line.54"></a>
+<span class="sourceLineNo">055</span>  private static ProcedureStore procStore;<a name="line.55"></a>
+<span class="sourceLineNo">056</span><a name="line.56"></a>
+<span class="sourceLineNo">057</span>  private static ProcedureExecutor&lt;TestProcEnv&gt; procExecutor;<a name="line.57"></a>
+<span class="sourceLineNo">058</span><a name="line.58"></a>
+<span class="sourceLineNo">059</span>  private static HBaseCommonTestingUtility htu;<a name="line.59"></a>
+<span class="sourceLineNo">060</span><a name="line.60"></a>
+<span class="sourceLineNo">061</span>  private static FileSystem fs;<a name="line.61"></a>
+<span class="sourceLineNo">062</span>  private static Path testDir;<a name="line.62"></a>
+<span class="sourceLineNo">063</span>  private static Path logDir;<a name="line.63"></a>
+<span class="sourceLineNo">064</span><a name="line.64"></a>
+<span class="sourceLineNo">065</span>  private static class TestProcEnv {<a name="line.65"></a>
+<span class="sourceLineNo">066</span>  }<a name="line.66"></a>
+<span class="sourceLineNo">067</span><a name="line.67"></a>
+<span class="sourceLineNo">068</span>  @BeforeClass<a name="line.68"></a>
+<span class="sourceLineNo">069</span>  public static void setUp() throws Exception {<a name="line.69"></a>
+<span class="sourceLineNo">070</span>    htu = new HBaseCommonTestingUtility();<a name="line.70"></a>
+<span class="sourceLineNo">071</span><a name="line.71"></a>
+<span class="sourceLineNo">072</span>    // NOTE: The executor will be created by each test<a name="line.72"></a>
+<span class="sourceLineNo">073</span>    procEnv = new TestProcEnv();<a name="line.73"></a>
+<span class="sourceLineNo">074</span>    testDir = htu.getDataTestDir();<a name="line.74"></a>
+<span class="sourceLineNo">075</span>    fs = testDir.getFileSystem(htu.getConfiguration());<a name="line.75"></a>
+<span class="sourceLineNo">076</span>    assertTrue(testDir.depth() &gt; 1);<a name="line.76"></a>
+<span class="sourceLineNo">077</span><a name="line.77"></a>
+<span class="sourceLineNo">078</span>    logDir = new Path(testDir, "proc-logs");<a name="line.78"></a>
+<span class="sourceLineNo">079</span>    procStore = ProcedureTestingUtility.createWalStore(htu.getConfiguration(), logDir);<a name="line.79"></a>
+<span class="sourceLineNo">080</span>    procExecutor = new ProcedureExecutor&lt;&gt;(htu.getConfiguration(), procEnv,<a name="line.80"></a>
+<span class="sourceLineNo">081</span>        procStore);<a name="line.81"></a>
+<span class="sourceLineNo">082</span>    procStore.start(PROCEDURE_EXECUTOR_SLOTS);<a name="line.82"></a>
+<span class="sourceLineNo">083</span>    ProcedureTestingUtility<a name="line.83"></a>
+<span class="sourceLineNo">084</span>        .initAndStartWorkers(procExecutor, PROCEDURE_EXECUTOR_SLOTS, true);<a name="line.84"></a>
+<span class="sourceLineNo">085</span>  }<a name="line.85"></a>
+<span class="sourceLineNo">086</span><a name="line.86"></a>
+<span class="sourceLineNo">087</span>  @Test<a name="line.87"></a>
+<span class="sourceLineNo">088</span>  public void testBypassSuspendProcedure() throws Exception {<a name="line.88"></a>
+<span class="sourceLineNo">089</span>    final SuspendProcedure proc = new SuspendProcedure();<a name="line.89"></a>
+<span class="sourceLineNo">090</span>    long id = procExecutor.submitProcedure(proc);<a name="line.90"></a>
+<span class="sourceLineNo">091</span>    Thread.sleep(500);<a name="line.91"></a>
+<span class="sourceLineNo">092</span>    //bypass the procedure<a name="line.92"></a>
+<span class="sourceLineNo">093</span>    assertTrue(procExecutor.bypassProcedure(id, 30000, false, false));<a name="line.93"></a>
+<span class="sourceLineNo">094</span>    htu.waitFor(5000, () -&gt; proc.isSuccess() &amp;&amp; proc.isBypass());<a name="line.94"></a>
+<span class="sourceLineNo">095</span>    LOG.info("{} finished", proc);<a name="line.95"></a>
+<span class="sourceLineNo">096</span>  }<a name="line.96"></a>
+<span class="sourceLineNo">097</span><a name="line.97"></a>
+<span class="sourceLineNo">098</span>  @Test<a name="line.98"></a>
+<span class="sourceLineNo">099</span>  public void testStuckProcedure() throws Exception {<a name="line.99"></a>
+<span class="sourceLineNo">100</span>    final StuckProcedure proc = new StuckProcedure();<a name="line.100"></a>
+<span class="sourceLineNo">101</span>    long id = procExecutor.submitProcedure(proc);<a name="line.101"></a>
+<span class="sourceLineNo">102</span>    Thread.sleep(500);<a name="line.102"></a>
+<span class="sourceLineNo">103</span>    //bypass the procedure<a name="line.103"></a>
+<span class="sourceLineNo">104</span>    assertTrue(procExecutor.bypassProcedure(id, 1000, true, false));<a name="line.104"></a>
+<span class="sourceLineNo">105</span>    //Since the procedure is stuck there, we need to restart the executor to recovery.<a name="line.105"></a>
+<span class="sourceLineNo">106</span>    ProcedureTestingUtility.restart(procExecutor);<a name="line.106"></a>
+<span class="sourceLineNo">107</span>    htu.waitFor(5000, () -&gt; proc.isSuccess() &amp;&amp; proc.isBypass());<a name="line.107"></a>
+<span class="sourceLineNo">108</span>    LOG.info("{} finished", proc);<a name="line.108"></a>
+<span class="sourceLineNo">109</span>  }<a name="line.109"></a>
+<span class="sourceLineNo">110</span><a name="line.110"></a>
+<span class="sourceLineNo">111</span>  @Test<a name="line.111"></a>
+<span class="sourceLineNo">112</span>  public void testBypassingProcedureWithParent() throws Exception {<a name="line.112"></a>
+<span class="sourceLineNo">113</span>    final RootProcedure proc = new RootProcedure();<a name="line.113"></a>
+<span class="sourceLineNo">114</span>    long rootId = procExecutor.submitProcedure(proc);<a name="line.114"></a>
+<span class="sourceLineNo">115</span>    htu.waitFor(5000, () -&gt; procExecutor.getProcedures().stream()<a name="line.115"></a>
+<span class="sourceLineNo">116</span>      .filter(p -&gt; p.getParentProcId() == rootId).collect(Collectors.toList())<a name="line.116"></a>
+<span class="sourceLineNo">117</span>      .size() &gt; 0);<a name="line.117"></a>
+<span class="sourceLineNo">118</span>    SuspendProcedure suspendProcedure = (SuspendProcedure)procExecutor.getProcedures().stream()<a name="line.118"></a>
+<span class="sourceLineNo">119</span>        .filter(p -&gt; p.getParentProcId() == rootId).collect(Collectors.toList()).get(0);<a name="line.119"></a>
+<span class="sourceLineNo">120</span>    assertTrue(procExecutor.bypassProcedure(suspendProcedure.getProcId(), 1000, false, false));<a name="line.120"></a>
+<span class="sourceLineNo">121</span>    htu.waitFor(5000, () -&gt; proc.isSuccess() &amp;&amp; proc.isBypass());<a name="line.121"></a>
+<span class="sourceLineNo">122</span>    LOG.info("{} finished", proc);<a name="line.122"></a>
+<span class="sourceLineNo">123</span>  }<a name="line.123"></a>
+<span class="sourceLineNo">124</span><a name="line.124"></a>
+<span class="sourceLineNo">125</span>  @Test<a name="line.125"></a>
+<span class="sourceLineNo">126</span>  public void testBypassingStuckStateMachineProcedure() throws Exception {<a name="line.126"></a>
+<span class="sourceLineNo">127</span>    final StuckStateMachineProcedure proc =<a name="line.127"></a>
+<span class="sourceLineNo">128</span>        new StuckStateMachineProcedure(procEnv, StuckStateMachineState.START);<a name="line.128"></a>
+<span class="sourceLineNo">129</span>    long id = procExecutor.submitProcedure(proc);<a name="line.129"></a>
+<span class="sourceLineNo">130</span>    Thread.sleep(500);<a name="line.130"></a>
+<span class="sourceLineNo">131</span>    // bypass the procedure<a name="line.131"></a>
+<span class="sourceLineNo">132</span>    assertFalse(procExecutor.bypassProcedure(id, 1000, false, false));<a name="line.132"></a>
+<span class="sourceLineNo">133</span>    assertTrue(procExecutor.bypassProcedure(id, 1000, true, false));<a name="line.133"></a>
+<span class="sourceLineNo">134</span><a name="line.134"></a>
+<span class="sourceLineNo">135</span>    htu.waitFor(5000, () -&gt; proc.isSuccess() &amp;&amp; proc.isBypass());<a name="line.135"></a>
+<span class="sourceLineNo">136</span>    LOG.info("{} finished", proc);<a name="line.136"></a>
+<span class="sourceLineNo">137</span>  }<a name="line.137"></a>
+<span class="sourceLineNo">138</span><a name="line.138"></a>
+<span class="sourceLineNo">139</span>  @Test<a name="line.139"></a>
+<span class="sourceLineNo">140</span>  public void testBypassingProcedureWithParentRecursive() throws Exception {<a name="line.140"></a>
+<span class="sourceLineNo">141</span>    final RootProcedure proc = new RootProcedure();<a name="line.141"></a>
+<span class="sourceLineNo">142</span>    long rootId = procExecutor.submitProcedure(proc);<a name="line.142"></a>
+<span class="sourceLineNo">143</span>    htu.waitFor(5000, () -&gt; procExecutor.getProcedures().stream()<a name="line.143"></a>
+<span class="sourceLineNo">144</span>        .filter(p -&gt; p.getParentProcId() == rootId).collect(Collectors.toList())<a name="line.144"></a>
+<span class="sourceLineNo">145</span>        .size() &gt; 0);<a name="line.145"></a>
+<span class="sourceLineNo">146</span>    SuspendProcedure suspendProcedure = (SuspendProcedure)procExecutor.getProcedures().stream()<a name="line.146"></a>
+<span class="sourceLineNo">147</span>        .filter(p -&gt; p.getParentProcId() == rootId).collect(Collectors.toList()).get(0);<a name="line.147"></a>
+<span class="sourceLineNo">148</span>    assertTrue(procExecutor.bypassProcedure(rootId, 1000, false, true));<a name="line.148"></a>
+<span class="sourceLineNo">149</span>    htu.waitFor(5000, () -&gt; proc.isSuccess() &amp;&amp; proc.isBypass());<a name="line.149"></a>
+<span class="sourceLineNo">150</span>    LOG.info("{} finished", proc);<a name="line.150"></a>
+<span class="sourceLineNo">151</span>  }<a name="line.151"></a>
+<span class="sourceLineNo">152</span><a name="line.152"></a>
+<span class="sourceLineNo">153</span>  @Test<a name="line.153"></a>
+<span class="sourceLineNo">154</span>  public void testBypassingWaitingTimeoutProcedures() throws Exception {<a name="line.154"></a>
+<span class="sourceLineNo">155</span>    final WaitingTimeoutProcedure proc = new WaitingTimeoutProcedure();<a name="line.155"></a>
+<span class="sourceLineNo">156</span>    long id = procExecutor.submitProcedure(proc);<a name="line.156"></a>
+<span class="sourceLineNo">157</span>    Thread.sleep(500);<a name="line.157"></a>
+<span class="sourceLineNo">158</span>    // bypass the procedure<a name="line.158"></a>
+<span class="sourceLineNo">159</span>    assertTrue(procExecutor.bypassProcedure(id, 1000, true, false));<a name="line.159"></a>
+<span class="sourceLineNo">160</span><a name="line.160"></a>
+<span class="sourceLineNo">161</span>    htu.waitFor(5000, () -&gt; proc.isSuccess() &amp;&amp; proc.isBypass());<a name="line.161"></a>
+<span class="sourceLineNo">162</span>    LOG.info("{} finished", proc);<a name="line.162"></a>
+<span class="sourceLineNo">163</span>  }<a name="line.163"></a>
+<span class="sourceLineNo">164</span><a name="line.164"></a>
+<span class="sourceLineNo">165</span>  @AfterClass<a name="line.165"></a>
+<span class="sourceLineNo">166</span>  public static void tearDown() throws Exception {<a name="line.166"></a>
+<span class="sourceLineNo">167</span>    procExecutor.stop();<a name="line.167"></a>
+<span class="sourceLineNo">168</span>    procStore.stop(false);<a name="line.168"></a>
+<span class="sourceLineNo">169</span>    procExecutor.join();<a name="line.169"></a>
+<span class="sourceLineNo">170</span>  }<a name="line.170"></a>
+<span class="sourceLineNo">171</span><a name="line.171"></a>
+<span class="sourceLineNo">172</span>  public static class SuspendProcedure extends ProcedureTestingUtility.NoopProcedure&lt;TestProcEnv&gt; {<a name="line.172"></a>
+<span class="sourceLineNo">173</span><a name="line.173"></a>
+<span class="sourceLineNo">174</span>    public SuspendProcedure() {<a name="line.174"></a>
+<span class="sourceLineNo">175</span>      super();<a name="line.175"></a>
+<span class="sourceLineNo">176</span>    }<a name="line.176"></a>
+<span class="sourceLineNo">177</span><a name="line.177"></a>
+<span class="sourceLineNo">178</span>    @Override<a name="line.178"></a>
+<span class="sourceLineNo">179</span>    protected Procedure[] execute(final TestProcEnv env)<a name="line.179"></a>
+<span class="sourceLineNo">180</span>        throws ProcedureSuspendedException {<a name="line.180"></a>
+<span class="sourceLineNo">181</span>      // Always suspend the procedure<a name="line.181"></a>
+<span class="sourceLineNo">182</span>      throw new ProcedureSuspendedException();<a name="line.182"></a>
+<span class="sourceLineNo">183</span>    }<a name="line.183"></a>
+<span class="sourceLineNo">184</span>  }<a name="line.184"></a>
+<span class="sourceLineNo">185</span><a name="line.185"></a>
+<span class="sourceLineNo">186</span>  public static class StuckProcedure extends ProcedureTestingUtility.NoopProcedure&lt;TestProcEnv&gt; {<a name="line.186"></a>
+<span class="sourceLineNo">187</span><a name="line.187"></a>
+<span class="sourceLineNo">188</span>    public StuckProcedure() {<a name="line.188"></a>
+<span class="sourceLineNo">189</span>      super();<a name="line.189"></a>
+<span class="sourceLineNo">190</span>    }<a name="line.190"></a>
+<span class="sourceLineNo">191</span><a name="line.191"></a>
+<span class="sourceLineNo">192</span>    @Override<a name="line.192"></a>
+<span class="sourceLineNo">193</span>    protected Procedure[] execute(final TestProcEnv env) {<a name="line.193"></a>
+<span class="sourceLineNo">194</span>      try {<a name="line.194"></a>
+<span class="sourceLineNo">195</span>        Thread.sleep(Long.MAX_VALUE);<a name="line.195"></a>
+<span class="sourceLineNo">196</span>      } catch (Throwable t) {<a name="line.196"></a>
+<span class="sourceLineNo">197</span>        LOG.debug("Sleep is interrupted.", t);<a name="line.197"></a>
+<span class="sourceLineNo">198</span>      }<a name="line.198"></a>
+<span class="sourceLineNo">199</span>      return null;<a name="line.199"></a>
+<span class="sourceLineNo">200</span>    }<a name="line.200"></a>
+<span class="sourceLineNo">201</span><a name="line.201"></a>
+<span class="sourceLineNo">202</span>  }<a name="line.202"></a>
+<span class="sourceLineNo">203</span><a name="line.203"></a>
+<span class="sourceLineNo">204</span><a name="line.204"></a>
+<span class="sourceLineNo">205</span>  public static class RootProcedure extends ProcedureTestingUtility.NoopProcedure&lt;TestProcEnv&gt; {<a name="line.205"></a>
+<span class="sourceLineNo">206</span>    private boolean childSpwaned = false;<a name="line.206"></a>
+<span class="sourceLineNo">207</span><a name="line.207"></a>
+<span class="sourceLineNo">208</span>    public RootProcedure() {<a name="line.208"></a>
+<span class="sourceLineNo">209</span>      super();<a name="line.209"></a>
+<span class="sourceLineNo">210</span>    }<a name="line.210"></a>
+<span class="sourceLineNo">211</span><a name="line.211"></a>
+<span class="sourceLineNo">212</span>    @Override<a name="line.212"></a>
+<span class="sourceLineNo">213</span>    protected Procedure[] execute(final TestProcEnv env)<a name="line.213"></a>
+<span class="sourceLineNo">214</span>        throws ProcedureSuspendedException {<a name="line.214"></a>
+<span class="sourceLineNo">215</span>      if (!childSpwaned) {<a name="line.215"></a>
+<span class="sourceLineNo">216</span>        childSpwaned = true;<a name="line.216"></a>
+<span class="sourceLineNo">217</span>        return new Procedure[] {new SuspendProcedure()};<a name="line.217"></a>
+<span class="sourceLineNo">218</span>      } else {<a name="line.218"></a>
+<span class="sourceLineNo">219</span>        return null;<a name="line.219"></a>
+<span class="sourceLineNo">220</span>      }<a name="line.220"></a>
+<span class="sourceLineNo">221</span>    }<a name="line.221"></a>
+<span class="sourceLineNo">222</span>  }<a name="line.222"></a>
+<span class="sourceLineNo">223</span><a name="line.223"></a>
+<span class="sourceLineNo">224</span>  public static class WaitingTimeoutProcedure<a name="line.224"></a>
+<span class="sourceLineNo">225</span>      extends ProcedureTestingUtility.NoopProcedure&lt;TestProcEnv&gt; {<a name="line.225"></a>
+<span class="sourceLineNo">226</span>    public WaitingTimeoutProcedure() {<a name="line.226"></a>
+<span class="sourceLineNo">227</span>      super();<a name="line.227"></a>
+<span class="sourceLineNo">228</span>    }<a name="line.228"></a>
+<span class="sourceLineNo">229</span><a name="line.229"></a>
+<span class="sourceLineNo">230</span>    @Override<a name="line.230"></a>
+<span class="sourceLineNo">231</span>    protected Procedure[] execute(final TestProcEnv env)<a name="line.231"></a>
+<span class="sourceLineNo">232</span>        throws ProcedureSuspendedException {<a name="line.232"></a>
+<span class="sourceLineNo">233</span>      // Always suspend the procedure<a name="line.233"></a>
+<span class="sourceLineNo">234</span>      setTimeout(50000);<a name="line.234"></a>
+<span class="sourceLineNo">235</span>      setState(ProcedureProtos.ProcedureState.WAITING_TIMEOUT);<a name="line.235"></a>
+<span class="sourceLineNo">236</span>      skipPersistence();<a name="line.236"></a>
+<span class="sourceLineNo">237</span>      throw new ProcedureSuspendedException();<a name="line.237"></a>
+<span class="sourceLineNo">238</span>    }<a name="line.238"></a>
+<span class="sourceLineNo">239</span><a name="line.239"></a>
+<span class="sourceLineNo">240</span>    @Override<a name="line.240"></a>
+<span class="sourceLineNo">241</span>    protected synchronized boolean setTimeoutFailure(TestProcEnv env) {<a name="line.241"></a>
+<span class="sourceLineNo">242</span>      setState(ProcedureProtos.ProcedureState.RUNNABLE);<a name="line.242"></a>
+<span class="sourceLineNo">243</span>      procExecutor.getScheduler().addFront(this);<a name="line.243"></a>
+<span class="sourceLineNo">244</span>      return false; // 'false' means that this procedure handled the timeout<a name="line.244"></a>
+<span class="sourceLineNo">245</span>    }<a name="line.245"></a>
+<span class="sourceLineNo">246</span>  }<a name="line.246"></a>
+<span class="sourceLineNo">247</span><a name="line.247"></a>
+<span class="sourceLineNo">248</span>  public enum StuckStateMachineState {<a name="line.248"></a>
+<span class="sourceLineNo">249</span>    START, THEN, END<a name="line.249"></a>
+<span class="sourceLineNo">250</span>  }<a name="line.250"></a>
+<span class="sourceLineNo">251</span><a name="line.251"></a>
+<span class="sourceLineNo">252</span>  public static class StuckStateMachineProcedure extends<a name="line.252"></a>
+<span class="sourceLineNo">253</span>      ProcedureTestingUtility.NoopStateMachineProcedure&lt;TestProcEnv, StuckStateMachineState&gt; {<a name="line.253"></a>
+<span class="sourceLineNo">254</span>    private AtomicBoolean stop = new AtomicBoolean(false);<a name="line.254"></a>
+<span class="sourceLineNo">255</span><a name="line.255"></a>
+<span class="sourceLineNo">256</span>    public StuckStateMachineProcedure() {<a name="line.256"></a>
+<span class="sourceLineNo">257</span>      super();<a name="line.257"></a>
+<span class="sourceLineNo">258</span>    }<a name="line.258"></a>
+<span class="sourceLineNo">259</span><a name="line.259"></a>
+<span class="sourceLineNo">260</span>    public StuckStateMachineProcedure(TestProcEnv env, StuckStateMachineState initialState) {<a name="line.260"></a>
+<span class="sourceLineNo">261</span>      super(env, initialState);<a name="line.261"></a>
+<span class="sourceLineNo">262</span>    }<a name="line.262"></a>
+<span class="sourceLineNo">263</span><a name="line.263"></a>
+<span class="sourceLineNo">264</span>    @Override<a name="line.264"></a>
+<span class="sourceLineNo">265</span>    protected Flow executeFromState(TestProcEnv env, StuckStateMachineState tState)<a name="line.265"></a>
+<span class="sourceLineNo">266</span>            throws ProcedureSuspendedException, ProcedureYieldException, InterruptedException {<a name="line.266"></a>
+<span class="sourceLineNo">267</span>      switch (tState) {<a name="line.267"></a>
+<span class="sourceLineNo">268</span>        case START:<a name="line.268"></a>
+<span class="sourceLineNo">269</span>          LOG.info("PHASE 1: START");<a name="line.269"></a>
+<span class="sourceLineNo">270</span>          setNextState(StuckStateMachineState.THEN);<a name="line.270"></a>
+<span class="sourceLineNo">271</span>          return Flow.HAS_MORE_STATE;<a name="line.271"></a>
+<span class="sourceLineNo">272</span>        case THEN:<a name="line.272"></a>
+<span class="sourceLineNo">273</span>          if (stop.get()) {<a name="line.273"></a>
+<span class="sourceLineNo">274</span>            setNextState(StuckStateMachineState.END);<a name="line.274"></a>
+<span class="sourceLineNo">275</span>          }<a name="line.275"></a>
+<span class="sourceLineNo">276</span>          return Flow.HAS_MORE_STATE;<a name="line.276"></a>
+<span class="sourceLineNo">277</span>        case END:<a name="line.277"></a>
+<span class="sourceLineNo">278</span>          return Flow.NO_MORE_STATE;<a name="line.278"></a>
+<span class="sourceLineNo">279</span>        default:<a name="line.279"></a>
+<span class="sourceLineNo">280</span>          throw new UnsupportedOperationException("unhandled state=" + tState);<a name="line.280"></a>
+<span class="sourceLineNo">281</span>      }<a name="line.281"></a>
+<span class="sourceLineNo">282</span>    }<a name="line.282"></a>
+<span class="sourceLineNo">283</span><a name="line.283"></a>
+<span class="sourceLineNo">284</span>    @Override<a name="line.284"></a>
+<span class="sourceLineNo">285</span>    protected StuckStateMachineState getState(int stateId) {<a name="line.285"></a>
+<span class="sourceLineNo">286</span>      return StuckStateMachineState.values()[stateId];<a name="line.286"></a>
+<span class="sourceLineNo">287</span>    }<a name="line.287"></a>
+<span class="sourceLineNo">288</span><a name="line.288"></a>
+<span class="sourceLineNo">289</span>    @Override<a name="line.289"></a>
+<span class="sourceLineNo">290</span>    protected int getStateId(StuckStateMachineState tState) {<a name="line.290"></a>
+<span class="sourceLineNo">291</span>      return tState.ordinal();<a name="line.291"></a>
+<span class="sourceLineNo">292</span>    }<a name="line.292"></a>
+<span class="sourceLineNo">293</span>  }<a name="line.293"></a>
+<span class="sourceLineNo">294</span><a name="line.294"></a>
+<span class="sourceLineNo">295</span><a name="line.295"></a>
+<span class="sourceLineNo">296</span>}<a name="line.296"></a>
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+</pre>
+</div>
+</body>
+</html>


[10/29] hbase-site git commit: Published site at 5e84997f2ffdbcf5f849d70c30ddbe2db4039ca4.

Posted by gi...@apache.org.
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/27f5bfb5/team-list.html
----------------------------------------------------------------------
diff --git a/team-list.html b/team-list.html
index aa6196b..35410e4 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="20181109" />
+    <meta name="Date-Revision-yyyymmdd" content="20181110" />
     <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-11-09</li>
+                  <li id="publishDate" class="pull-right">Last Published: 2018-11-10</li>
             </p>
                 </div>
 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/27f5bfb5/testdevapidocs/allclasses-frame.html
----------------------------------------------------------------------
diff --git a/testdevapidocs/allclasses-frame.html b/testdevapidocs/allclasses-frame.html
index 5cc6e6c..4a2a962 100644
--- a/testdevapidocs/allclasses-frame.html
+++ b/testdevapidocs/allclasses-frame.html
@@ -1671,6 +1671,7 @@
 <li><a href="org/apache/hadoop/hbase/procedure2/TestProcedureBypass.StuckStateMachineState.html" title="enum in org.apache.hadoop.hbase.procedure2" target="classFrame">TestProcedureBypass.StuckStateMachineState</a></li>
 <li><a href="org/apache/hadoop/hbase/procedure2/TestProcedureBypass.SuspendProcedure.html" title="class in org.apache.hadoop.hbase.procedure2" target="classFrame">TestProcedureBypass.SuspendProcedure</a></li>
 <li><a href="org/apache/hadoop/hbase/procedure2/TestProcedureBypass.TestProcEnv.html" title="class in org.apache.hadoop.hbase.procedure2" target="classFrame">TestProcedureBypass.TestProcEnv</a></li>
+<li><a href="org/apache/hadoop/hbase/procedure2/TestProcedureBypass.WaitingTimeoutProcedure.html" title="class in org.apache.hadoop.hbase.procedure2" target="classFrame">TestProcedureBypass.WaitingTimeoutProcedure</a></li>
 <li><a href="org/apache/hadoop/hbase/procedure2/TestProcedureCleanup.html" title="class in org.apache.hadoop.hbase.procedure2" target="classFrame">TestProcedureCleanup</a></li>
 <li><a href="org/apache/hadoop/hbase/procedure2/TestProcedureCleanup.ExchangeProcedure.html" title="class in org.apache.hadoop.hbase.procedure2" target="classFrame">TestProcedureCleanup.ExchangeProcedure</a></li>
 <li><a href="org/apache/hadoop/hbase/procedure2/TestProcedureCleanup.RootProcedure.html" title="class in org.apache.hadoop.hbase.procedure2" target="classFrame">TestProcedureCleanup.RootProcedure</a></li>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/27f5bfb5/testdevapidocs/allclasses-noframe.html
----------------------------------------------------------------------
diff --git a/testdevapidocs/allclasses-noframe.html b/testdevapidocs/allclasses-noframe.html
index c2d15a8..d09b572 100644
--- a/testdevapidocs/allclasses-noframe.html
+++ b/testdevapidocs/allclasses-noframe.html
@@ -1671,6 +1671,7 @@
 <li><a href="org/apache/hadoop/hbase/procedure2/TestProcedureBypass.StuckStateMachineState.html" title="enum in org.apache.hadoop.hbase.procedure2">TestProcedureBypass.StuckStateMachineState</a></li>
 <li><a href="org/apache/hadoop/hbase/procedure2/TestProcedureBypass.SuspendProcedure.html" title="class in org.apache.hadoop.hbase.procedure2">TestProcedureBypass.SuspendProcedure</a></li>
 <li><a href="org/apache/hadoop/hbase/procedure2/TestProcedureBypass.TestProcEnv.html" title="class in org.apache.hadoop.hbase.procedure2">TestProcedureBypass.TestProcEnv</a></li>
+<li><a href="org/apache/hadoop/hbase/procedure2/TestProcedureBypass.WaitingTimeoutProcedure.html" title="class in org.apache.hadoop.hbase.procedure2">TestProcedureBypass.WaitingTimeoutProcedure</a></li>
 <li><a href="org/apache/hadoop/hbase/procedure2/TestProcedureCleanup.html" title="class in org.apache.hadoop.hbase.procedure2">TestProcedureCleanup</a></li>
 <li><a href="org/apache/hadoop/hbase/procedure2/TestProcedureCleanup.ExchangeProcedure.html" title="class in org.apache.hadoop.hbase.procedure2">TestProcedureCleanup.ExchangeProcedure</a></li>
 <li><a href="org/apache/hadoop/hbase/procedure2/TestProcedureCleanup.RootProcedure.html" title="class in org.apache.hadoop.hbase.procedure2">TestProcedureCleanup.RootProcedure</a></li>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/27f5bfb5/testdevapidocs/index-all.html
----------------------------------------------------------------------
diff --git a/testdevapidocs/index-all.html b/testdevapidocs/index-all.html
index c5e2ca4..7fd1751 100644
--- a/testdevapidocs/index-all.html
+++ b/testdevapidocs/index-all.html
@@ -13668,6 +13668,8 @@
 <dd>&nbsp;</dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/procedure2/TestProcedureBypass.SuspendProcedure.html#execute-org.apache.hadoop.hbase.procedure2.TestProcedureBypass.TestProcEnv-">execute(TestProcedureBypass.TestProcEnv)</a></span> - Method in class org.apache.hadoop.hbase.procedure2.<a href="org/apache/hadoop/hbase/procedure2/TestProcedureBypass.SuspendProcedure.html" title="class in org.apache.hadoop.hbase.procedure2">TestProcedureBypass.SuspendProcedure</a></dt>
 <dd>&nbsp;</dd>
+<dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/procedure2/TestProcedureBypass.WaitingTimeoutProcedure.html#execute-org.apache.hadoop.hbase.procedure2.TestProcedureBypass.TestProcEnv-">execute(TestProcedureBypass.TestProcEnv)</a></span> - Method in class org.apache.hadoop.hbase.procedure2.<a href="org/apache/hadoop/hbase/procedure2/TestProcedureBypass.WaitingTimeoutProcedure.html" title="class in org.apache.hadoop.hbase.procedure2">TestProcedureBypass.WaitingTimeoutProcedure</a></dt>
+<dd>&nbsp;</dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/procedure2/TestProcedureCleanup.ExchangeProcedure.html#execute-java.lang.Void-">execute(Void)</a></span> - Method in class org.apache.hadoop.hbase.procedure2.<a href="org/apache/hadoop/hbase/procedure2/TestProcedureCleanup.ExchangeProcedure.html" title="class in org.apache.hadoop.hbase.procedure2">TestProcedureCleanup.ExchangeProcedure</a></dt>
 <dd>&nbsp;</dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/procedure2/TestProcedureCleanup.RootProcedure.html#execute-java.lang.Void-">execute(Void)</a></span> - Method in class org.apache.hadoop.hbase.procedure2.<a href="org/apache/hadoop/hbase/procedure2/TestProcedureCleanup.RootProcedure.html" title="class in org.apache.hadoop.hbase.procedure2">TestProcedureCleanup.RootProcedure</a></dt>
@@ -37386,6 +37388,8 @@
 <dd>&nbsp;</dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/util/TimeOffsetEnvironmentEdge.html#setTimeOffset-long-">setTimeOffset(long)</a></span> - Method in class org.apache.hadoop.hbase.util.<a href="org/apache/hadoop/hbase/util/TimeOffsetEnvironmentEdge.html" title="class in org.apache.hadoop.hbase.util">TimeOffsetEnvironmentEdge</a></dt>
 <dd>&nbsp;</dd>
+<dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/procedure2/TestProcedureBypass.WaitingTimeoutProcedure.html#setTimeoutFailure-org.apache.hadoop.hbase.procedure2.TestProcedureBypass.TestProcEnv-">setTimeoutFailure(TestProcedureBypass.TestProcEnv)</a></span> - Method in class org.apache.hadoop.hbase.procedure2.<a href="org/apache/hadoop/hbase/procedure2/TestProcedureBypass.WaitingTimeoutProcedure.html" title="class in org.apache.hadoop.hbase.procedure2">TestProcedureBypass.WaitingTimeoutProcedure</a></dt>
+<dd>&nbsp;</dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/procedure2/TestProcedureEvents.TestTimeoutEventProcedure.html#setTimeoutFailure-org.apache.hadoop.hbase.procedure2.TestProcedureEvents.TestProcEnv-">setTimeoutFailure(TestProcedureEvents.TestProcEnv)</a></span> - Method in class org.apache.hadoop.hbase.procedure2.<a href="org/apache/hadoop/hbase/procedure2/TestProcedureEvents.TestTimeoutEventProcedure.html" title="class in org.apache.hadoop.hbase.procedure2">TestProcedureEvents.TestTimeoutEventProcedure</a></dt>
 <dd>&nbsp;</dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/procedure2/TestProcedureSkipPersistence.TestProcedure.html#setTimeoutFailure-org.apache.hadoop.hbase.procedure2.TestProcedureSkipPersistence.ProcEnv-">setTimeoutFailure(TestProcedureSkipPersistence.ProcEnv)</a></span> - Method in class org.apache.hadoop.hbase.procedure2.<a href="org/apache/hadoop/hbase/procedure2/TestProcedureSkipPersistence.TestProcedure.html" title="class in org.apache.hadoop.hbase.procedure2">TestProcedureSkipPersistence.TestProcedure</a></dt>
@@ -47384,6 +47388,8 @@
 <dd>&nbsp;</dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/procedure2/TestProcedureBypass.html#testBypassingStuckStateMachineProcedure--">testBypassingStuckStateMachineProcedure()</a></span> - Method in class org.apache.hadoop.hbase.procedure2.<a href="org/apache/hadoop/hbase/procedure2/TestProcedureBypass.html" title="class in org.apache.hadoop.hbase.procedure2">TestProcedureBypass</a></dt>
 <dd>&nbsp;</dd>
+<dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/procedure2/TestProcedureBypass.html#testBypassingWaitingTimeoutProcedures--">testBypassingWaitingTimeoutProcedures()</a></span> - Method in class org.apache.hadoop.hbase.procedure2.<a href="org/apache/hadoop/hbase/procedure2/TestProcedureBypass.html" title="class in org.apache.hadoop.hbase.procedure2">TestProcedureBypass</a></dt>
+<dd>&nbsp;</dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/client/TestHbck.html#testBypassProcedure--">testBypassProcedure()</a></span> - Method in class org.apache.hadoop.hbase.client.<a href="org/apache/hadoop/hbase/client/TestHbck.html" title="class in org.apache.hadoop.hbase.client">TestHbck</a></dt>
 <dd>&nbsp;</dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/procedure2/TestProcedureBypass.html#testBypassSuspendProcedure--">testBypassSuspendProcedure()</a></span> - Method in class org.apache.hadoop.hbase.procedure2.<a href="org/apache/hadoop/hbase/procedure2/TestProcedureBypass.html" title="class in org.apache.hadoop.hbase.procedure2">TestProcedureBypass</a></dt>
@@ -58614,6 +58620,8 @@
 <dd>&nbsp;</dd>
 <dt><a href="org/apache/hadoop/hbase/procedure2/TestProcedureBypass.TestProcEnv.html" title="class in org.apache.hadoop.hbase.procedure2"><span class="typeNameLink">TestProcedureBypass.TestProcEnv</span></a> - Class in <a href="org/apache/hadoop/hbase/procedure2/package-summary.html">org.apache.hadoop.hbase.procedure2</a></dt>
 <dd>&nbsp;</dd>
+<dt><a href="org/apache/hadoop/hbase/procedure2/TestProcedureBypass.WaitingTimeoutProcedure.html" title="class in org.apache.hadoop.hbase.procedure2"><span class="typeNameLink">TestProcedureBypass.WaitingTimeoutProcedure</span></a> - Class in <a href="org/apache/hadoop/hbase/procedure2/package-summary.html">org.apache.hadoop.hbase.procedure2</a></dt>
+<dd>&nbsp;</dd>
 <dt><a href="org/apache/hadoop/hbase/procedure2/TestProcedureCleanup.html" title="class in org.apache.hadoop.hbase.procedure2"><span class="typeNameLink">TestProcedureCleanup</span></a> - Class in <a href="org/apache/hadoop/hbase/procedure2/package-summary.html">org.apache.hadoop.hbase.procedure2</a></dt>
 <dd>&nbsp;</dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/procedure2/TestProcedureCleanup.html#TestProcedureCleanup--">TestProcedureCleanup()</a></span> - Constructor for class org.apache.hadoop.hbase.procedure2.<a href="org/apache/hadoop/hbase/procedure2/TestProcedureCleanup.html" title="class in org.apache.hadoop.hbase.procedure2">TestProcedureCleanup</a></dt>
@@ -70741,6 +70749,8 @@ the order they are declared.</div>
 <dd>&nbsp;</dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/procedure2/TestForceUpdateProcedure.WaitingProcedure.html#WaitingProcedure--">WaitingProcedure()</a></span> - Constructor for class org.apache.hadoop.hbase.procedure2.<a href="org/apache/hadoop/hbase/procedure2/TestForceUpdateProcedure.WaitingProcedure.html" title="class in org.apache.hadoop.hbase.procedure2">TestForceUpdateProcedure.WaitingProcedure</a></dt>
 <dd>&nbsp;</dd>
+<dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/procedure2/TestProcedureBypass.WaitingTimeoutProcedure.html#WaitingTimeoutProcedure--">WaitingTimeoutProcedure()</a></span> - Constructor for class org.apache.hadoop.hbase.procedure2.<a href="org/apache/hadoop/hbase/procedure2/TestProcedureBypass.WaitingTimeoutProcedure.html" title="class in org.apache.hadoop.hbase.procedure2">TestProcedureBypass.WaitingTimeoutProcedure</a></dt>
+<dd>&nbsp;</dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/HBaseTestingUtility.html#waitLabelAvailable-long-java.lang.String...-">waitLabelAvailable(long, String...)</a></span> - Method in class org.apache.hadoop.hbase.<a href="org/apache/hadoop/hbase/HBaseTestingUtility.html" title="class in org.apache.hadoop.hbase">HBaseTestingUtility</a></dt>
 <dd>
 <div class="block">Wait until labels is ready in VisibilityLabelsCache.</div>

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

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/27f5bfb5/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 e3d7919..2be4b47 100644
--- a/testdevapidocs/org/apache/hadoop/hbase/package-tree.html
+++ b/testdevapidocs/org/apache/hadoop/hbase/package-tree.html
@@ -579,15 +579,15 @@
 <ul>
 <li type="circle">java.lang.<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Enum.html?is-external=true" title="class or interface in java.lang"><span class="typeNameLink">Enum</span></a>&lt;E&gt; (implements java.lang.<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Comparable.html?is-external=true" title="class or interface in java.lang">Comparable</a>&lt;T&gt;, java.io.<a href="https://docs.oracle.com/javase/8/docs/api/java/io/Serializable.html?is-external=true" title="class or interface in java.io">Serializable</a>)
 <ul>
-<li type="circle">org.apache.hadoop.hbase.<a href="../../../../org/apache/hadoop/hbase/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.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/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/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/RESTApiClusterManager.Service.html" title="enum in org.apache.hadoop.hbase"><span class="typeNameLink">RESTApiClusterManager.Service</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.<a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.Counter.html" title="enum in org.apache.hadoop.hbase"><span class="typeNameLink">PerformanceEvaluation.Counter</span></a></li>
-<li type="circle">org.apache.hadoop.hbase.<a href="../../../../org/apache/hadoop/hbase/HBaseClusterManager.CommandProvider.Operation.html" title="enum in org.apache.hadoop.hbase"><span class="typeNameLink">HBaseClusterManager.CommandProvider.Operation</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.<a href="../../../../org/apache/hadoop/hbase/IntegrationTestDDLMasterFailover.ACTION.html" title="enum in org.apache.hadoop.hbase"><span class="typeNameLink">IntegrationTestDDLMasterFailover.ACTION</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.<a href="../../../../org/apache/hadoop/hbase/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/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/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/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/HBaseClusterManager.CommandProvider.Operation.html" title="enum in org.apache.hadoop.hbase"><span class="typeNameLink">HBaseClusterManager.CommandProvider.Operation</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.<a href="../../../../org/apache/hadoop/hbase/ResourceChecker.Phase.html" title="enum in org.apache.hadoop.hbase"><span class="typeNameLink">ResourceChecker.Phase</span></a></li>
 </ul>
 </li>
 </ul>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/27f5bfb5/testdevapidocs/org/apache/hadoop/hbase/procedure/package-tree.html
----------------------------------------------------------------------
diff --git a/testdevapidocs/org/apache/hadoop/hbase/procedure/package-tree.html b/testdevapidocs/org/apache/hadoop/hbase/procedure/package-tree.html
index 28973e0..a1c9b1d 100644
--- a/testdevapidocs/org/apache/hadoop/hbase/procedure/package-tree.html
+++ b/testdevapidocs/org/apache/hadoop/hbase/procedure/package-tree.html
@@ -81,14 +81,14 @@
 <ul>
 <li type="circle">java.lang.<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html?is-external=true" title="class or interface in java.lang"><span class="typeNameLink">Object</span></a>
 <ul>
-<li type="circle">org.apache.hadoop.hbase.procedure2.Procedure&lt;TEnvironment&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;)
+<li type="circle">org.apache.hadoop.hbase.procedure.Procedure (implements java.util.concurrent.<a href="https://docs.oracle.com/javase/8/docs/api/java/util/concurrent/Callable.html?is-external=true" title="class or interface in java.util.concurrent">Callable</a>&lt;V&gt;, org.apache.hadoop.hbase.errorhandling.ForeignExceptionListener)
 <ul>
-<li type="circle">org.apache.hadoop.hbase.procedure.<a href="../../../../../org/apache/hadoop/hbase/procedure/TestProcedureDescriber.TestProcedure.html" title="class in org.apache.hadoop.hbase.procedure"><span class="typeNameLink">TestProcedureDescriber.TestProcedure</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.procedure.<a href="../../../../../org/apache/hadoop/hbase/procedure/TestProcedure.LatchedProcedure.html" title="class in org.apache.hadoop.hbase.procedure"><span class="typeNameLink">TestProcedure.LatchedProcedure</span></a></li>
 </ul>
 </li>
-<li type="circle">org.apache.hadoop.hbase.procedure.Procedure (implements java.util.concurrent.<a href="https://docs.oracle.com/javase/8/docs/api/java/util/concurrent/Callable.html?is-external=true" title="class or interface in java.util.concurrent">Callable</a>&lt;V&gt;, org.apache.hadoop.hbase.errorhandling.ForeignExceptionListener)
+<li type="circle">org.apache.hadoop.hbase.procedure2.Procedure&lt;TEnvironment&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;)
 <ul>
-<li type="circle">org.apache.hadoop.hbase.procedure.<a href="../../../../../org/apache/hadoop/hbase/procedure/TestProcedure.LatchedProcedure.html" title="class in org.apache.hadoop.hbase.procedure"><span class="typeNameLink">TestProcedure.LatchedProcedure</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.procedure.<a href="../../../../../org/apache/hadoop/hbase/procedure/TestProcedureDescriber.TestProcedure.html" title="class in org.apache.hadoop.hbase.procedure"><span class="typeNameLink">TestProcedureDescriber.TestProcedure</span></a></li>
 </ul>
 </li>
 <li type="circle">org.apache.hadoop.hbase.procedure.ProcedureManager

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/27f5bfb5/testdevapidocs/org/apache/hadoop/hbase/procedure2/ProcedureTestingUtility.NoopProcedure.html
----------------------------------------------------------------------
diff --git a/testdevapidocs/org/apache/hadoop/hbase/procedure2/ProcedureTestingUtility.NoopProcedure.html b/testdevapidocs/org/apache/hadoop/hbase/procedure2/ProcedureTestingUtility.NoopProcedure.html
index 8814edb..685cb5b 100644
--- a/testdevapidocs/org/apache/hadoop/hbase/procedure2/ProcedureTestingUtility.NoopProcedure.html
+++ b/testdevapidocs/org/apache/hadoop/hbase/procedure2/ProcedureTestingUtility.NoopProcedure.html
@@ -118,7 +118,7 @@ var activeTableTab = "activeTableTab";
 </dl>
 <dl>
 <dt>Direct Known Subclasses:</dt>
-<dd><a href="../../../../../org/apache/hadoop/hbase/procedure2/ProcedureTestingUtility.TestProcedure.html" title="class in org.apache.hadoop.hbase.procedure2">ProcedureTestingUtility.TestProcedure</a>, <a href="../../../../../org/apache/hadoop/hbase/procedure2/TestForceUpdateProcedure.ExchangeProcedure.html" title="class in org.apache.hadoop.hbase.procedure2">TestForceUpdateProcedure.ExchangeProcedure</a>, <a href="../../../../../org/apache/hadoop/hbase/procedure2/TestForceUpdateProcedure.NoopNoAckProcedure.html" title="class in org.apache.hadoop.hbase.procedure2">TestForceUpdateProcedure.NoopNoAckProcedure</a>, <a href="../../../../../org/apache/hadoop/hbase/procedure2/TestForceUpdateProcedure.ParentProcedure.html" title="class in org.apache.hadoop.hbase.procedure2">TestForceUpdateProcedure.ParentProcedure</a>, <a href="../../../../../org/apache/hadoop/hbase/procedure2/TestForceUpdateProcedure.WaitingProcedure.html" title="class in org.apache.hadoop.hbase.procedure2">TestForceUpdat
 eProcedure.WaitingProcedure</a>, <a href="../../../../../org/apache/hadoop/hbase/client/TestHbck.SuspendProcedure.html" title="class in org.apache.hadoop.hbase.client">TestHbck.SuspendProcedure</a>, <a href="../../../../../org/apache/hadoop/hbase/procedure2/TestProcedureBypass.RootProcedure.html" title="class in org.apache.hadoop.hbase.procedure2">TestProcedureBypass.RootProcedure</a>, <a href="../../../../../org/apache/hadoop/hbase/procedure2/TestProcedureBypass.StuckProcedure.html" title="class in org.apache.hadoop.hbase.procedure2">TestProcedureBypass.StuckProcedure</a>, <a href="../../../../../org/apache/hadoop/hbase/procedure2/TestProcedureBypass.SuspendProcedure.html" title="class in org.apache.hadoop.hbase.procedure2">TestProcedureBypass.SuspendProcedure</a>, <a href="../../../../../org/apache/hadoop/hbase/procedure2/TestProcedureCleanup.ExchangeProcedure.html" title="class in org.apache.hadoop.hbase.procedure2">TestProcedureCleanup.ExchangeProcedure</a>, <a href="../../../..
 /../org/apache/hadoop/hbase/procedure2/TestProcedureCleanup.RootProcedure.html" title="class in org.apache.hadoop.hbase.procedure2">TestProcedureCleanup.RootProcedure</a>, <a href="../../../../../org/apache/hadoop/hbase/procedure2/TestProcedureCleanup.SuspendProcedure.html" title="class in org.apache.hadoop.hbase.procedure2">TestProcedureCleanup.SuspendProcedure</a>, <a href="../../../../../org/apache/hadoop/hbase/procedure2/TestProcedureCleanup.WaitProcedure.html" title="class in org.apache.hadoop.hbase.procedure2">TestProcedureCleanup.WaitProcedure</a>, <a href="../../../../../org/apache/hadoop/hbase/procedure2/TestProcedureEvents.TestTimeoutEventProcedure.html" title="class in org.apache.hadoop.hbase.procedure2">TestProcedureEvents.TestTimeoutEventProcedure</a>, <a href="../../../../../org/apache/hadoop/hbase/procedure2/TestProcedureExecutor.BusyWaitProcedure.html" title="class in org.apache.hadoop.hbase.procedure2">TestProcedureExecutor.BusyWaitProcedure</a>, <a href="../../../.
 ./../org/apache/hadoop/hbase/procedure2/TestProcedureRollbackAIOOB.ParentProcedure.html" title="class in org.apache.hadoop.hbase.procedure2">TestProcedureRollbackAIOOB.ParentProcedure</a>, <a href="../../../../../org/apache/hadoop/hbase/procedure2/TestProcedureRollbackAIOOB.SubProcedure.html" title="class in org.apache.hadoop.hbase.procedure2">TestProcedureRollbackAIOOB.SubProcedure</a>, <a href="../../../../../org/apache/hadoop/hbase/procedure2/TestProcedureSchedulerConcurrency.TestProcedureWithEvent.html" title="class in org.apache.hadoop.hbase.procedure2">TestProcedureSchedulerConcurrency.TestProcedureWithEvent</a>, <a href="../../../../../org/apache/hadoop/hbase/master/procedure/TestSchedulerQueueDeadLock.TableExclusiveProcedure.html" title="class in org.apache.hadoop.hbase.master.procedure">TestSchedulerQueueDeadLock.TableExclusiveProcedure</a>, <a href="../../../../../org/apache/hadoop/hbase/master/procedure/TestSchedulerQueueDeadLock.TableShardParentProcedure.html" title="cla
 ss in org.apache.hadoop.hbase.master.procedure">TestSchedulerQueueDeadLock.TableShardParentProcedure</a>, <a href="../../../../../org/apache/hadoop/hbase/master/procedure/TestSchedulerQueueDeadLock.TableSharedProcedure.html" title="class in org.apache.hadoop.hbase.master.procedure">TestSchedulerQueueDeadLock.TableSharedProcedure</a>, <a href="../../../../../org/apache/hadoop/hbase/procedure2/TestStateMachineProcedure.SimpleChildProcedure.html" title="class in org.apache.hadoop.hbase.procedure2">TestStateMachineProcedure.SimpleChildProcedure</a></dd>
+<dd><a href="../../../../../org/apache/hadoop/hbase/procedure2/ProcedureTestingUtility.TestProcedure.html" title="class in org.apache.hadoop.hbase.procedure2">ProcedureTestingUtility.TestProcedure</a>, <a href="../../../../../org/apache/hadoop/hbase/procedure2/TestForceUpdateProcedure.ExchangeProcedure.html" title="class in org.apache.hadoop.hbase.procedure2">TestForceUpdateProcedure.ExchangeProcedure</a>, <a href="../../../../../org/apache/hadoop/hbase/procedure2/TestForceUpdateProcedure.NoopNoAckProcedure.html" title="class in org.apache.hadoop.hbase.procedure2">TestForceUpdateProcedure.NoopNoAckProcedure</a>, <a href="../../../../../org/apache/hadoop/hbase/procedure2/TestForceUpdateProcedure.ParentProcedure.html" title="class in org.apache.hadoop.hbase.procedure2">TestForceUpdateProcedure.ParentProcedure</a>, <a href="../../../../../org/apache/hadoop/hbase/procedure2/TestForceUpdateProcedure.WaitingProcedure.html" title="class in org.apache.hadoop.hbase.procedure2">TestForceUpdat
 eProcedure.WaitingProcedure</a>, <a href="../../../../../org/apache/hadoop/hbase/client/TestHbck.SuspendProcedure.html" title="class in org.apache.hadoop.hbase.client">TestHbck.SuspendProcedure</a>, <a href="../../../../../org/apache/hadoop/hbase/procedure2/TestProcedureBypass.RootProcedure.html" title="class in org.apache.hadoop.hbase.procedure2">TestProcedureBypass.RootProcedure</a>, <a href="../../../../../org/apache/hadoop/hbase/procedure2/TestProcedureBypass.StuckProcedure.html" title="class in org.apache.hadoop.hbase.procedure2">TestProcedureBypass.StuckProcedure</a>, <a href="../../../../../org/apache/hadoop/hbase/procedure2/TestProcedureBypass.SuspendProcedure.html" title="class in org.apache.hadoop.hbase.procedure2">TestProcedureBypass.SuspendProcedure</a>, <a href="../../../../../org/apache/hadoop/hbase/procedure2/TestProcedureBypass.WaitingTimeoutProcedure.html" title="class in org.apache.hadoop.hbase.procedure2">TestProcedureBypass.WaitingTimeoutProcedure</a>, <a href=".
 ./../../../../org/apache/hadoop/hbase/procedure2/TestProcedureCleanup.ExchangeProcedure.html" title="class in org.apache.hadoop.hbase.procedure2">TestProcedureCleanup.ExchangeProcedure</a>, <a href="../../../../../org/apache/hadoop/hbase/procedure2/TestProcedureCleanup.RootProcedure.html" title="class in org.apache.hadoop.hbase.procedure2">TestProcedureCleanup.RootProcedure</a>, <a href="../../../../../org/apache/hadoop/hbase/procedure2/TestProcedureCleanup.SuspendProcedure.html" title="class in org.apache.hadoop.hbase.procedure2">TestProcedureCleanup.SuspendProcedure</a>, <a href="../../../../../org/apache/hadoop/hbase/procedure2/TestProcedureCleanup.WaitProcedure.html" title="class in org.apache.hadoop.hbase.procedure2">TestProcedureCleanup.WaitProcedure</a>, <a href="../../../../../org/apache/hadoop/hbase/procedure2/TestProcedureEvents.TestTimeoutEventProcedure.html" title="class in org.apache.hadoop.hbase.procedure2">TestProcedureEvents.TestTimeoutEventProcedure</a>, <a href="..
 /../../../../org/apache/hadoop/hbase/procedure2/TestProcedureExecutor.BusyWaitProcedure.html" title="class in org.apache.hadoop.hbase.procedure2">TestProcedureExecutor.BusyWaitProcedure</a>, <a href="../../../../../org/apache/hadoop/hbase/procedure2/TestProcedureRollbackAIOOB.ParentProcedure.html" title="class in org.apache.hadoop.hbase.procedure2">TestProcedureRollbackAIOOB.ParentProcedure</a>, <a href="../../../../../org/apache/hadoop/hbase/procedure2/TestProcedureRollbackAIOOB.SubProcedure.html" title="class in org.apache.hadoop.hbase.procedure2">TestProcedureRollbackAIOOB.SubProcedure</a>, <a href="../../../../../org/apache/hadoop/hbase/procedure2/TestProcedureSchedulerConcurrency.TestProcedureWithEvent.html" title="class in org.apache.hadoop.hbase.procedure2">TestProcedureSchedulerConcurrency.TestProcedureWithEvent</a>, <a href="../../../../../org/apache/hadoop/hbase/master/procedure/TestSchedulerQueueDeadLock.TableExclusiveProcedure.html" title="class in org.apache.hadoop.hbas
 e.master.procedure">TestSchedulerQueueDeadLock.TableExclusiveProcedure</a>, <a href="../../../../../org/apache/hadoop/hbase/master/procedure/TestSchedulerQueueDeadLock.TableShardParentProcedure.html" title="class in org.apache.hadoop.hbase.master.procedure">TestSchedulerQueueDeadLock.TableShardParentProcedure</a>, <a href="../../../../../org/apache/hadoop/hbase/master/procedure/TestSchedulerQueueDeadLock.TableSharedProcedure.html" title="class in org.apache.hadoop.hbase.master.procedure">TestSchedulerQueueDeadLock.TableSharedProcedure</a>, <a href="../../../../../org/apache/hadoop/hbase/procedure2/TestStateMachineProcedure.SimpleChildProcedure.html" title="class in org.apache.hadoop.hbase.procedure2">TestStateMachineProcedure.SimpleChildProcedure</a></dd>
 </dl>
 <dl>
 <dt>Enclosing class:</dt>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/27f5bfb5/testdevapidocs/org/apache/hadoop/hbase/procedure2/TestProcedureBypass.RootProcedure.html
----------------------------------------------------------------------
diff --git a/testdevapidocs/org/apache/hadoop/hbase/procedure2/TestProcedureBypass.RootProcedure.html b/testdevapidocs/org/apache/hadoop/hbase/procedure2/TestProcedureBypass.RootProcedure.html
index 1d9fb39..3ce72ba 100644
--- a/testdevapidocs/org/apache/hadoop/hbase/procedure2/TestProcedureBypass.RootProcedure.html
+++ b/testdevapidocs/org/apache/hadoop/hbase/procedure2/TestProcedureBypass.RootProcedure.html
@@ -127,7 +127,7 @@ var activeTableTab = "activeTableTab";
 </dl>
 <hr>
 <br>
-<pre>public static class <a href="../../../../../src-html/org/apache/hadoop/hbase/procedure2/TestProcedureBypass.html#line.192">TestProcedureBypass.RootProcedure</a>
+<pre>public static class <a href="../../../../../src-html/org/apache/hadoop/hbase/procedure2/TestProcedureBypass.html#line.205">TestProcedureBypass.RootProcedure</a>
 extends <a href="../../../../../org/apache/hadoop/hbase/procedure2/ProcedureTestingUtility.NoopProcedure.html" title="class in org.apache.hadoop.hbase.procedure2">ProcedureTestingUtility.NoopProcedure</a>&lt;<a href="../../../../../org/apache/hadoop/hbase/procedure2/TestProcedureBypass.TestProcEnv.html" title="class in org.apache.hadoop.hbase.procedure2">TestProcedureBypass.TestProcEnv</a>&gt;</pre>
 </li>
 </ul>
@@ -251,7 +251,7 @@ extends <a href="../../../../../org/apache/hadoop/hbase/procedure2/ProcedureTest
 <ul class="blockListLast">
 <li class="blockList">
 <h4>childSpwaned</h4>
-<pre>private&nbsp;boolean <a href="../../../../../src-html/org/apache/hadoop/hbase/procedure2/TestProcedureBypass.RootProcedure.html#line.193">childSpwaned</a></pre>
+<pre>private&nbsp;boolean <a href="../../../../../src-html/org/apache/hadoop/hbase/procedure2/TestProcedureBypass.RootProcedure.html#line.206">childSpwaned</a></pre>
 </li>
 </ul>
 </li>
@@ -268,7 +268,7 @@ extends <a href="../../../../../org/apache/hadoop/hbase/procedure2/ProcedureTest
 <ul class="blockListLast">
 <li class="blockList">
 <h4>RootProcedure</h4>
-<pre>public&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/procedure2/TestProcedureBypass.RootProcedure.html#line.195">RootProcedure</a>()</pre>
+<pre>public&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/procedure2/TestProcedureBypass.RootProcedure.html#line.208">RootProcedure</a>()</pre>
 </li>
 </ul>
 </li>
@@ -285,7 +285,7 @@ extends <a href="../../../../../org/apache/hadoop/hbase/procedure2/ProcedureTest
 <ul class="blockListLast">
 <li class="blockList">
 <h4>execute</h4>
-<pre>protected&nbsp;org.apache.hadoop.hbase.procedure2.Procedure[]&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/procedure2/TestProcedureBypass.RootProcedure.html#line.200">execute</a>(<a href="../../../../../org/apache/hadoop/hbase/procedure2/TestProcedureBypass.TestProcEnv.html" title="class in org.apache.hadoop.hbase.procedure2">TestProcedureBypass.TestProcEnv</a>&nbsp;env)
+<pre>protected&nbsp;org.apache.hadoop.hbase.procedure2.Procedure[]&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/procedure2/TestProcedureBypass.RootProcedure.html#line.213">execute</a>(<a href="../../../../../org/apache/hadoop/hbase/procedure2/TestProcedureBypass.TestProcEnv.html" title="class in org.apache.hadoop.hbase.procedure2">TestProcedureBypass.TestProcEnv</a>&nbsp;env)
                                                           throws org.apache.hadoop.hbase.procedure2.ProcedureSuspendedException</pre>
 <dl>
 <dt><span class="overrideSpecifyLabel">Overrides:</span></dt>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/27f5bfb5/testdevapidocs/org/apache/hadoop/hbase/procedure2/TestProcedureBypass.StuckProcedure.html
----------------------------------------------------------------------
diff --git a/testdevapidocs/org/apache/hadoop/hbase/procedure2/TestProcedureBypass.StuckProcedure.html b/testdevapidocs/org/apache/hadoop/hbase/procedure2/TestProcedureBypass.StuckProcedure.html
index cce604f..4b7246e 100644
--- a/testdevapidocs/org/apache/hadoop/hbase/procedure2/TestProcedureBypass.StuckProcedure.html
+++ b/testdevapidocs/org/apache/hadoop/hbase/procedure2/TestProcedureBypass.StuckProcedure.html
@@ -127,7 +127,7 @@ var activeTableTab = "activeTableTab";
 </dl>
 <hr>
 <br>
-<pre>public static class <a href="../../../../../src-html/org/apache/hadoop/hbase/procedure2/TestProcedureBypass.html#line.173">TestProcedureBypass.StuckProcedure</a>
+<pre>public static class <a href="../../../../../src-html/org/apache/hadoop/hbase/procedure2/TestProcedureBypass.html#line.186">TestProcedureBypass.StuckProcedure</a>
 extends <a href="../../../../../org/apache/hadoop/hbase/procedure2/ProcedureTestingUtility.NoopProcedure.html" title="class in org.apache.hadoop.hbase.procedure2">ProcedureTestingUtility.NoopProcedure</a>&lt;<a href="../../../../../org/apache/hadoop/hbase/procedure2/TestProcedureBypass.TestProcEnv.html" title="class in org.apache.hadoop.hbase.procedure2">TestProcedureBypass.TestProcEnv</a>&gt;</pre>
 </li>
 </ul>
@@ -240,7 +240,7 @@ extends <a href="../../../../../org/apache/hadoop/hbase/procedure2/ProcedureTest
 <ul class="blockListLast">
 <li class="blockList">
 <h4>StuckProcedure</h4>
-<pre>public&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/procedure2/TestProcedureBypass.StuckProcedure.html#line.175">StuckProcedure</a>()</pre>
+<pre>public&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/procedure2/TestProcedureBypass.StuckProcedure.html#line.188">StuckProcedure</a>()</pre>
 </li>
 </ul>
 </li>
@@ -257,7 +257,7 @@ extends <a href="../../../../../org/apache/hadoop/hbase/procedure2/ProcedureTest
 <ul class="blockListLast">
 <li class="blockList">
 <h4>execute</h4>
-<pre>protected&nbsp;org.apache.hadoop.hbase.procedure2.Procedure[]&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/procedure2/TestProcedureBypass.StuckProcedure.html#line.180">execute</a>(<a href="../../../../../org/apache/hadoop/hbase/procedure2/TestProcedureBypass.TestProcEnv.html" title="class in org.apache.hadoop.hbase.procedure2">TestProcedureBypass.TestProcEnv</a>&nbsp;env)</pre>
+<pre>protected&nbsp;org.apache.hadoop.hbase.procedure2.Procedure[]&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/procedure2/TestProcedureBypass.StuckProcedure.html#line.193">execute</a>(<a href="../../../../../org/apache/hadoop/hbase/procedure2/TestProcedureBypass.TestProcEnv.html" title="class in org.apache.hadoop.hbase.procedure2">TestProcedureBypass.TestProcEnv</a>&nbsp;env)</pre>
 <dl>
 <dt><span class="overrideSpecifyLabel">Overrides:</span></dt>
 <dd><code><a href="../../../../../org/apache/hadoop/hbase/procedure2/ProcedureTestingUtility.NoopProcedure.html#execute-TEnv-">execute</a></code>&nbsp;in class&nbsp;<code><a href="../../../../../org/apache/hadoop/hbase/procedure2/ProcedureTestingUtility.NoopProcedure.html" title="class in org.apache.hadoop.hbase.procedure2">ProcedureTestingUtility.NoopProcedure</a>&lt;<a href="../../../../../org/apache/hadoop/hbase/procedure2/TestProcedureBypass.TestProcEnv.html" title="class in org.apache.hadoop.hbase.procedure2">TestProcedureBypass.TestProcEnv</a>&gt;</code></dd>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/27f5bfb5/testdevapidocs/org/apache/hadoop/hbase/procedure2/TestProcedureBypass.StuckStateMachineProcedure.html
----------------------------------------------------------------------
diff --git a/testdevapidocs/org/apache/hadoop/hbase/procedure2/TestProcedureBypass.StuckStateMachineProcedure.html b/testdevapidocs/org/apache/hadoop/hbase/procedure2/TestProcedureBypass.StuckStateMachineProcedure.html
index 1f9715c..d54fe22 100644
--- a/testdevapidocs/org/apache/hadoop/hbase/procedure2/TestProcedureBypass.StuckStateMachineProcedure.html
+++ b/testdevapidocs/org/apache/hadoop/hbase/procedure2/TestProcedureBypass.StuckStateMachineProcedure.html
@@ -132,7 +132,7 @@ var activeTableTab = "activeTableTab";
 </dl>
 <hr>
 <br>
-<pre>public static class <a href="../../../../../src-html/org/apache/hadoop/hbase/procedure2/TestProcedureBypass.html#line.216">TestProcedureBypass.StuckStateMachineProcedure</a>
+<pre>public static class <a href="../../../../../src-html/org/apache/hadoop/hbase/procedure2/TestProcedureBypass.html#line.252">TestProcedureBypass.StuckStateMachineProcedure</a>
 extends <a href="../../../../../org/apache/hadoop/hbase/procedure2/ProcedureTestingUtility.NoopStateMachineProcedure.html" title="class in org.apache.hadoop.hbase.procedure2">ProcedureTestingUtility.NoopStateMachineProcedure</a>&lt;<a href="../../../../../org/apache/hadoop/hbase/procedure2/TestProcedureBypass.TestProcEnv.html" title="class in org.apache.hadoop.hbase.procedure2">TestProcedureBypass.TestProcEnv</a>,<a href="../../../../../org/apache/hadoop/hbase/procedure2/TestProcedureBypass.StuckStateMachineState.html" title="enum in org.apache.hadoop.hbase.procedure2">TestProcedureBypass.StuckStateMachineState</a>&gt;</pre>
 </li>
 </ul>
@@ -290,7 +290,7 @@ extends <a href="../../../../../org/apache/hadoop/hbase/procedure2/ProcedureTest
 <ul class="blockListLast">
 <li class="blockList">
 <h4>stop</h4>
-<pre>private&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/util/concurrent/atomic/AtomicBoolean.html?is-external=true" title="class or interface in java.util.concurrent.atomic">AtomicBoolean</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/procedure2/TestProcedureBypass.StuckStateMachineProcedure.html#line.218">stop</a></pre>
+<pre>private&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/util/concurrent/atomic/AtomicBoolean.html?is-external=true" title="class or interface in java.util.concurrent.atomic">AtomicBoolean</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/procedure2/TestProcedureBypass.StuckStateMachineProcedure.html#line.254">stop</a></pre>
 </li>
 </ul>
 </li>
@@ -307,7 +307,7 @@ extends <a href="../../../../../org/apache/hadoop/hbase/procedure2/ProcedureTest
 <ul class="blockList">
 <li class="blockList">
 <h4>StuckStateMachineProcedure</h4>
-<pre>public&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/procedure2/TestProcedureBypass.StuckStateMachineProcedure.html#line.220">StuckStateMachineProcedure</a>()</pre>
+<pre>public&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/procedure2/TestProcedureBypass.StuckStateMachineProcedure.html#line.256">StuckStateMachineProcedure</a>()</pre>
 </li>
 </ul>
 <a name="StuckStateMachineProcedure-org.apache.hadoop.hbase.procedure2.TestProcedureBypass.TestProcEnv-org.apache.hadoop.hbase.procedure2.TestProcedureBypass.StuckStateMachineState-">
@@ -316,7 +316,7 @@ extends <a href="../../../../../org/apache/hadoop/hbase/procedure2/ProcedureTest
 <ul class="blockListLast">
 <li class="blockList">
 <h4>StuckStateMachineProcedure</h4>
-<pre>public&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/procedure2/TestProcedureBypass.StuckStateMachineProcedure.html#line.224">StuckStateMachineProcedure</a>(<a href="../../../../../org/apache/hadoop/hbase/procedure2/TestProcedureBypass.TestProcEnv.html" title="class in org.apache.hadoop.hbase.procedure2">TestProcedureBypass.TestProcEnv</a>&nbsp;env,
+<pre>public&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/procedure2/TestProcedureBypass.StuckStateMachineProcedure.html#line.260">StuckStateMachineProcedure</a>(<a href="../../../../../org/apache/hadoop/hbase/procedure2/TestProcedureBypass.TestProcEnv.html" title="class in org.apache.hadoop.hbase.procedure2">TestProcedureBypass.TestProcEnv</a>&nbsp;env,
                                   <a href="../../../../../org/apache/hadoop/hbase/procedure2/TestProcedureBypass.StuckStateMachineState.html" title="enum in org.apache.hadoop.hbase.procedure2">TestProcedureBypass.StuckStateMachineState</a>&nbsp;initialState)</pre>
 </li>
 </ul>
@@ -334,7 +334,7 @@ extends <a href="../../../../../org/apache/hadoop/hbase/procedure2/ProcedureTest
 <ul class="blockList">
 <li class="blockList">
 <h4>executeFromState</h4>
-<pre>protected&nbsp;org.apache.hadoop.hbase.procedure2.StateMachineProcedure.Flow&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/procedure2/TestProcedureBypass.StuckStateMachineProcedure.html#line.229">executeFromState</a>(<a href="../../../../../org/apache/hadoop/hbase/procedure2/TestProcedureBypass.TestProcEnv.html" title="class in org.apache.hadoop.hbase.procedure2">TestProcedureBypass.TestProcEnv</a>&nbsp;env,
+<pre>protected&nbsp;org.apache.hadoop.hbase.procedure2.StateMachineProcedure.Flow&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/procedure2/TestProcedureBypass.StuckStateMachineProcedure.html#line.265">executeFromState</a>(<a href="../../../../../org/apache/hadoop/hbase/procedure2/TestProcedureBypass.TestProcEnv.html" title="class in org.apache.hadoop.hbase.procedure2">TestProcedureBypass.TestProcEnv</a>&nbsp;env,
                                                                                          <a href="../../../../../org/apache/hadoop/hbase/procedure2/TestProcedureBypass.StuckStateMachineState.html" title="enum in org.apache.hadoop.hbase.procedure2">TestProcedureBypass.StuckStateMachineState</a>&nbsp;tState)
                                                                                   throws org.apache.hadoop.hbase.procedure2.ProcedureSuspendedException,
                                                                                          org.apache.hadoop.hbase.procedure2.ProcedureYieldException,
@@ -355,7 +355,7 @@ extends <a href="../../../../../org/apache/hadoop/hbase/procedure2/ProcedureTest
 <ul class="blockList">
 <li class="blockList">
 <h4>getState</h4>
-<pre>protected&nbsp;<a href="../../../../../org/apache/hadoop/hbase/procedure2/TestProcedureBypass.StuckStateMachineState.html" title="enum in org.apache.hadoop.hbase.procedure2">TestProcedureBypass.StuckStateMachineState</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/procedure2/TestProcedureBypass.StuckStateMachineProcedure.html#line.249">getState</a>(int&nbsp;stateId)</pre>
+<pre>protected&nbsp;<a href="../../../../../org/apache/hadoop/hbase/procedure2/TestProcedureBypass.StuckStateMachineState.html" title="enum in org.apache.hadoop.hbase.procedure2">TestProcedureBypass.StuckStateMachineState</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/procedure2/TestProcedureBypass.StuckStateMachineProcedure.html#line.285">getState</a>(int&nbsp;stateId)</pre>
 <dl>
 <dt><span class="overrideSpecifyLabel">Overrides:</span></dt>
 <dd><code><a href="../../../../../org/apache/hadoop/hbase/procedure2/ProcedureTestingUtility.NoopStateMachineProcedure.html#getState-int-">getState</a></code>&nbsp;in class&nbsp;<code><a href="../../../../../org/apache/hadoop/hbase/procedure2/ProcedureTestingUtility.NoopStateMachineProcedure.html" title="class in org.apache.hadoop.hbase.procedure2">ProcedureTestingUtility.NoopStateMachineProcedure</a>&lt;<a href="../../../../../org/apache/hadoop/hbase/procedure2/TestProcedureBypass.TestProcEnv.html" title="class in org.apache.hadoop.hbase.procedure2">TestProcedureBypass.TestProcEnv</a>,<a href="../../../../../org/apache/hadoop/hbase/procedure2/TestProcedureBypass.StuckStateMachineState.html" title="enum in org.apache.hadoop.hbase.procedure2">TestProcedureBypass.StuckStateMachineState</a>&gt;</code></dd>
@@ -368,7 +368,7 @@ extends <a href="../../../../../org/apache/hadoop/hbase/procedure2/ProcedureTest
 <ul class="blockListLast">
 <li class="blockList">
 <h4>getStateId</h4>
-<pre>protected&nbsp;int&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/procedure2/TestProcedureBypass.StuckStateMachineProcedure.html#line.254">getStateId</a>(<a href="../../../../../org/apache/hadoop/hbase/procedure2/TestProcedureBypass.StuckStateMachineState.html" title="enum in org.apache.hadoop.hbase.procedure2">TestProcedureBypass.StuckStateMachineState</a>&nbsp;tState)</pre>
+<pre>protected&nbsp;int&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/procedure2/TestProcedureBypass.StuckStateMachineProcedure.html#line.290">getStateId</a>(<a href="../../../../../org/apache/hadoop/hbase/procedure2/TestProcedureBypass.StuckStateMachineState.html" title="enum in org.apache.hadoop.hbase.procedure2">TestProcedureBypass.StuckStateMachineState</a>&nbsp;tState)</pre>
 <dl>
 <dt><span class="overrideSpecifyLabel">Overrides:</span></dt>
 <dd><code><a href="../../../../../org/apache/hadoop/hbase/procedure2/ProcedureTestingUtility.NoopStateMachineProcedure.html#getStateId-TState-">getStateId</a></code>&nbsp;in class&nbsp;<code><a href="../../../../../org/apache/hadoop/hbase/procedure2/ProcedureTestingUtility.NoopStateMachineProcedure.html" title="class in org.apache.hadoop.hbase.procedure2">ProcedureTestingUtility.NoopStateMachineProcedure</a>&lt;<a href="../../../../../org/apache/hadoop/hbase/procedure2/TestProcedureBypass.TestProcEnv.html" title="class in org.apache.hadoop.hbase.procedure2">TestProcedureBypass.TestProcEnv</a>,<a href="../../../../../org/apache/hadoop/hbase/procedure2/TestProcedureBypass.StuckStateMachineState.html" title="enum in org.apache.hadoop.hbase.procedure2">TestProcedureBypass.StuckStateMachineState</a>&gt;</code></dd>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/27f5bfb5/testdevapidocs/org/apache/hadoop/hbase/procedure2/TestProcedureBypass.StuckStateMachineState.html
----------------------------------------------------------------------
diff --git a/testdevapidocs/org/apache/hadoop/hbase/procedure2/TestProcedureBypass.StuckStateMachineState.html b/testdevapidocs/org/apache/hadoop/hbase/procedure2/TestProcedureBypass.StuckStateMachineState.html
index e68fc44..9dffc92 100644
--- a/testdevapidocs/org/apache/hadoop/hbase/procedure2/TestProcedureBypass.StuckStateMachineState.html
+++ b/testdevapidocs/org/apache/hadoop/hbase/procedure2/TestProcedureBypass.StuckStateMachineState.html
@@ -122,7 +122,7 @@ var activeTableTab = "activeTableTab";
 </dl>
 <hr>
 <br>
-<pre>public static enum <a href="../../../../../src-html/org/apache/hadoop/hbase/procedure2/TestProcedureBypass.html#line.212">TestProcedureBypass.StuckStateMachineState</a>
+<pre>public static enum <a href="../../../../../src-html/org/apache/hadoop/hbase/procedure2/TestProcedureBypass.html#line.248">TestProcedureBypass.StuckStateMachineState</a>
 extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Enum.html?is-external=true" title="class or interface in java.lang">Enum</a>&lt;<a href="../../../../../org/apache/hadoop/hbase/procedure2/TestProcedureBypass.StuckStateMachineState.html" title="enum in org.apache.hadoop.hbase.procedure2">TestProcedureBypass.StuckStateMachineState</a>&gt;</pre>
 </li>
 </ul>
@@ -213,7 +213,7 @@ the order they are declared.</div>
 <ul class="blockList">
 <li class="blockList">
 <h4>START</h4>
-<pre>public static final&nbsp;<a href="../../../../../org/apache/hadoop/hbase/procedure2/TestProcedureBypass.StuckStateMachineState.html" title="enum in org.apache.hadoop.hbase.procedure2">TestProcedureBypass.StuckStateMachineState</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/procedure2/TestProcedureBypass.StuckStateMachineState.html#line.213">START</a></pre>
+<pre>public static final&nbsp;<a href="../../../../../org/apache/hadoop/hbase/procedure2/TestProcedureBypass.StuckStateMachineState.html" title="enum in org.apache.hadoop.hbase.procedure2">TestProcedureBypass.StuckStateMachineState</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/procedure2/TestProcedureBypass.StuckStateMachineState.html#line.249">START</a></pre>
 </li>
 </ul>
 <a name="THEN">
@@ -222,7 +222,7 @@ the order they are declared.</div>
 <ul class="blockList">
 <li class="blockList">
 <h4>THEN</h4>
-<pre>public static final&nbsp;<a href="../../../../../org/apache/hadoop/hbase/procedure2/TestProcedureBypass.StuckStateMachineState.html" title="enum in org.apache.hadoop.hbase.procedure2">TestProcedureBypass.StuckStateMachineState</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/procedure2/TestProcedureBypass.StuckStateMachineState.html#line.213">THEN</a></pre>
+<pre>public static final&nbsp;<a href="../../../../../org/apache/hadoop/hbase/procedure2/TestProcedureBypass.StuckStateMachineState.html" title="enum in org.apache.hadoop.hbase.procedure2">TestProcedureBypass.StuckStateMachineState</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/procedure2/TestProcedureBypass.StuckStateMachineState.html#line.249">THEN</a></pre>
 </li>
 </ul>
 <a name="END">
@@ -231,7 +231,7 @@ the order they are declared.</div>
 <ul class="blockListLast">
 <li class="blockList">
 <h4>END</h4>
-<pre>public static final&nbsp;<a href="../../../../../org/apache/hadoop/hbase/procedure2/TestProcedureBypass.StuckStateMachineState.html" title="enum in org.apache.hadoop.hbase.procedure2">TestProcedureBypass.StuckStateMachineState</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/procedure2/TestProcedureBypass.StuckStateMachineState.html#line.213">END</a></pre>
+<pre>public static final&nbsp;<a href="../../../../../org/apache/hadoop/hbase/procedure2/TestProcedureBypass.StuckStateMachineState.html" title="enum in org.apache.hadoop.hbase.procedure2">TestProcedureBypass.StuckStateMachineState</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/procedure2/TestProcedureBypass.StuckStateMachineState.html#line.249">END</a></pre>
 </li>
 </ul>
 </li>
@@ -248,7 +248,7 @@ the order they are declared.</div>
 <ul class="blockList">
 <li class="blockList">
 <h4>values</h4>
-<pre>public static&nbsp;<a href="../../../../../org/apache/hadoop/hbase/procedure2/TestProcedureBypass.StuckStateMachineState.html" title="enum in org.apache.hadoop.hbase.procedure2">TestProcedureBypass.StuckStateMachineState</a>[]&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/procedure2/TestProcedureBypass.StuckStateMachineState.html#line.212">values</a>()</pre>
+<pre>public static&nbsp;<a href="../../../../../org/apache/hadoop/hbase/procedure2/TestProcedureBypass.StuckStateMachineState.html" title="enum in org.apache.hadoop.hbase.procedure2">TestProcedureBypass.StuckStateMachineState</a>[]&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/procedure2/TestProcedureBypass.StuckStateMachineState.html#line.248">values</a>()</pre>
 <div class="block">Returns an array containing the constants of this enum type, in
 the order they are declared.  This method may be used to iterate
 over the constants as follows:
@@ -268,7 +268,7 @@ for (TestProcedureBypass.StuckStateMachineState c : TestProcedureBypass.StuckSta
 <ul class="blockListLast">
 <li class="blockList">
 <h4>valueOf</h4>
-<pre>public static&nbsp;<a href="../../../../../org/apache/hadoop/hbase/procedure2/TestProcedureBypass.StuckStateMachineState.html" title="enum in org.apache.hadoop.hbase.procedure2">TestProcedureBypass.StuckStateMachineState</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/procedure2/TestProcedureBypass.StuckStateMachineState.html#line.212">valueOf</a>(<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;name)</pre>
+<pre>public static&nbsp;<a href="../../../../../org/apache/hadoop/hbase/procedure2/TestProcedureBypass.StuckStateMachineState.html" title="enum in org.apache.hadoop.hbase.procedure2">TestProcedureBypass.StuckStateMachineState</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/procedure2/TestProcedureBypass.StuckStateMachineState.html#line.248">valueOf</a>(<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;name)</pre>
 <div class="block">Returns the enum constant of this type with the specified name.
 The string must match <i>exactly</i> an identifier used to declare an
 enum constant in this type.  (Extraneous whitespace characters are 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/27f5bfb5/testdevapidocs/org/apache/hadoop/hbase/procedure2/TestProcedureBypass.SuspendProcedure.html
----------------------------------------------------------------------
diff --git a/testdevapidocs/org/apache/hadoop/hbase/procedure2/TestProcedureBypass.SuspendProcedure.html b/testdevapidocs/org/apache/hadoop/hbase/procedure2/TestProcedureBypass.SuspendProcedure.html
index 725211f..e4e7e3a 100644
--- a/testdevapidocs/org/apache/hadoop/hbase/procedure2/TestProcedureBypass.SuspendProcedure.html
+++ b/testdevapidocs/org/apache/hadoop/hbase/procedure2/TestProcedureBypass.SuspendProcedure.html
@@ -127,7 +127,7 @@ var activeTableTab = "activeTableTab";
 </dl>
 <hr>
 <br>
-<pre>public static class <a href="../../../../../src-html/org/apache/hadoop/hbase/procedure2/TestProcedureBypass.html#line.159">TestProcedureBypass.SuspendProcedure</a>
+<pre>public static class <a href="../../../../../src-html/org/apache/hadoop/hbase/procedure2/TestProcedureBypass.html#line.172">TestProcedureBypass.SuspendProcedure</a>
 extends <a href="../../../../../org/apache/hadoop/hbase/procedure2/ProcedureTestingUtility.NoopProcedure.html" title="class in org.apache.hadoop.hbase.procedure2">ProcedureTestingUtility.NoopProcedure</a>&lt;<a href="../../../../../org/apache/hadoop/hbase/procedure2/TestProcedureBypass.TestProcEnv.html" title="class in org.apache.hadoop.hbase.procedure2">TestProcedureBypass.TestProcEnv</a>&gt;</pre>
 </li>
 </ul>
@@ -240,7 +240,7 @@ extends <a href="../../../../../org/apache/hadoop/hbase/procedure2/ProcedureTest
 <ul class="blockListLast">
 <li class="blockList">
 <h4>SuspendProcedure</h4>
-<pre>public&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/procedure2/TestProcedureBypass.SuspendProcedure.html#line.161">SuspendProcedure</a>()</pre>
+<pre>public&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/procedure2/TestProcedureBypass.SuspendProcedure.html#line.174">SuspendProcedure</a>()</pre>
 </li>
 </ul>
 </li>
@@ -257,7 +257,7 @@ extends <a href="../../../../../org/apache/hadoop/hbase/procedure2/ProcedureTest
 <ul class="blockListLast">
 <li class="blockList">
 <h4>execute</h4>
-<pre>protected&nbsp;org.apache.hadoop.hbase.procedure2.Procedure[]&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/procedure2/TestProcedureBypass.SuspendProcedure.html#line.166">execute</a>(<a href="../../../../../org/apache/hadoop/hbase/procedure2/TestProcedureBypass.TestProcEnv.html" title="class in org.apache.hadoop.hbase.procedure2">TestProcedureBypass.TestProcEnv</a>&nbsp;env)
+<pre>protected&nbsp;org.apache.hadoop.hbase.procedure2.Procedure[]&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/procedure2/TestProcedureBypass.SuspendProcedure.html#line.179">execute</a>(<a href="../../../../../org/apache/hadoop/hbase/procedure2/TestProcedureBypass.TestProcEnv.html" title="class in org.apache.hadoop.hbase.procedure2">TestProcedureBypass.TestProcEnv</a>&nbsp;env)
                                                           throws org.apache.hadoop.hbase.procedure2.ProcedureSuspendedException</pre>
 <dl>
 <dt><span class="overrideSpecifyLabel">Overrides:</span></dt>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/27f5bfb5/testdevapidocs/org/apache/hadoop/hbase/procedure2/TestProcedureBypass.TestProcEnv.html
----------------------------------------------------------------------
diff --git a/testdevapidocs/org/apache/hadoop/hbase/procedure2/TestProcedureBypass.TestProcEnv.html b/testdevapidocs/org/apache/hadoop/hbase/procedure2/TestProcedureBypass.TestProcEnv.html
index 4b5d1fc..ddbe920 100644
--- a/testdevapidocs/org/apache/hadoop/hbase/procedure2/TestProcedureBypass.TestProcEnv.html
+++ b/testdevapidocs/org/apache/hadoop/hbase/procedure2/TestProcedureBypass.TestProcEnv.html
@@ -44,7 +44,7 @@
 <div class="subNav">
 <ul class="navList">
 <li><a href="../../../../../org/apache/hadoop/hbase/procedure2/TestProcedureBypass.SuspendProcedure.html" title="class in org.apache.hadoop.hbase.procedure2"><span class="typeNameLink">Prev&nbsp;Class</span></a></li>
-<li><a href="../../../../../org/apache/hadoop/hbase/procedure2/TestProcedureCleanup.html" title="class in org.apache.hadoop.hbase.procedure2"><span class="typeNameLink">Next&nbsp;Class</span></a></li>
+<li><a href="../../../../../org/apache/hadoop/hbase/procedure2/TestProcedureBypass.WaitingTimeoutProcedure.html" title="class in org.apache.hadoop.hbase.procedure2"><span class="typeNameLink">Next&nbsp;Class</span></a></li>
 </ul>
 <ul class="navList">
 <li><a href="../../../../../index.html?org/apache/hadoop/hbase/procedure2/TestProcedureBypass.TestProcEnv.html" target="_top">Frames</a></li>
@@ -107,7 +107,7 @@
 </dl>
 <hr>
 <br>
-<pre>private static class <a href="../../../../../src-html/org/apache/hadoop/hbase/procedure2/TestProcedureBypass.html#line.64">TestProcedureBypass.TestProcEnv</a>
+<pre>private static class <a href="../../../../../src-html/org/apache/hadoop/hbase/procedure2/TestProcedureBypass.html#line.65">TestProcedureBypass.TestProcEnv</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>
@@ -167,7 +167,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockListLast">
 <li class="blockList">
 <h4>TestProcEnv</h4>
-<pre>private&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/procedure2/TestProcedureBypass.TestProcEnv.html#line.64">TestProcEnv</a>()</pre>
+<pre>private&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/procedure2/TestProcedureBypass.TestProcEnv.html#line.65">TestProcEnv</a>()</pre>
 </li>
 </ul>
 </li>
@@ -199,7 +199,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <div class="subNav">
 <ul class="navList">
 <li><a href="../../../../../org/apache/hadoop/hbase/procedure2/TestProcedureBypass.SuspendProcedure.html" title="class in org.apache.hadoop.hbase.procedure2"><span class="typeNameLink">Prev&nbsp;Class</span></a></li>
-<li><a href="../../../../../org/apache/hadoop/hbase/procedure2/TestProcedureCleanup.html" title="class in org.apache.hadoop.hbase.procedure2"><span class="typeNameLink">Next&nbsp;Class</span></a></li>
+<li><a href="../../../../../org/apache/hadoop/hbase/procedure2/TestProcedureBypass.WaitingTimeoutProcedure.html" title="class in org.apache.hadoop.hbase.procedure2"><span class="typeNameLink">Next&nbsp;Class</span></a></li>
 </ul>
 <ul class="navList">
 <li><a href="../../../../../index.html?org/apache/hadoop/hbase/procedure2/TestProcedureBypass.TestProcEnv.html" target="_top">Frames</a></li>

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


[19/29] hbase-site git commit: Published site at 5e84997f2ffdbcf5f849d70c30ddbe2db4039ca4.

Posted by gi...@apache.org.
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/27f5bfb5/devapidocs/src-html/org/apache/hadoop/hbase/master/procedure/MasterProcedureScheduler.html
----------------------------------------------------------------------
diff --git a/devapidocs/src-html/org/apache/hadoop/hbase/master/procedure/MasterProcedureScheduler.html b/devapidocs/src-html/org/apache/hadoop/hbase/master/procedure/MasterProcedureScheduler.html
index d861bcd..437a019 100644
--- a/devapidocs/src-html/org/apache/hadoop/hbase/master/procedure/MasterProcedureScheduler.html
+++ b/devapidocs/src-html/org/apache/hadoop/hbase/master/procedure/MasterProcedureScheduler.html
@@ -29,982 +29,1010 @@
 <span class="sourceLineNo">021</span>import java.util.Arrays;<a name="line.21"></a>
 <span class="sourceLineNo">022</span>import java.util.List;<a name="line.22"></a>
 <span class="sourceLineNo">023</span>import java.util.function.Function;<a name="line.23"></a>
-<span class="sourceLineNo">024</span>import org.apache.hadoop.hbase.ServerName;<a name="line.24"></a>
-<span class="sourceLineNo">025</span>import org.apache.hadoop.hbase.TableExistsException;<a name="line.25"></a>
-<span class="sourceLineNo">026</span>import org.apache.hadoop.hbase.TableName;<a name="line.26"></a>
-<span class="sourceLineNo">027</span>import org.apache.hadoop.hbase.TableNotFoundException;<a name="line.27"></a>
-<span class="sourceLineNo">028</span>import org.apache.hadoop.hbase.client.RegionInfo;<a name="line.28"></a>
-<span class="sourceLineNo">029</span>import org.apache.hadoop.hbase.master.procedure.TableProcedureInterface.TableOperationType;<a name="line.29"></a>
-<span class="sourceLineNo">030</span>import org.apache.hadoop.hbase.procedure2.AbstractProcedureScheduler;<a name="line.30"></a>
-<span class="sourceLineNo">031</span>import org.apache.hadoop.hbase.procedure2.LockAndQueue;<a name="line.31"></a>
-<span class="sourceLineNo">032</span>import org.apache.hadoop.hbase.procedure2.LockStatus;<a name="line.32"></a>
-<span class="sourceLineNo">033</span>import org.apache.hadoop.hbase.procedure2.LockedResource;<a name="line.33"></a>
-<span class="sourceLineNo">034</span>import org.apache.hadoop.hbase.procedure2.LockedResourceType;<a name="line.34"></a>
-<span class="sourceLineNo">035</span>import org.apache.hadoop.hbase.procedure2.Procedure;<a name="line.35"></a>
-<span class="sourceLineNo">036</span>import org.apache.hadoop.hbase.util.AvlUtil.AvlIterableList;<a name="line.36"></a>
-<span class="sourceLineNo">037</span>import org.apache.hadoop.hbase.util.AvlUtil.AvlKeyComparator;<a name="line.37"></a>
-<span class="sourceLineNo">038</span>import org.apache.hadoop.hbase.util.AvlUtil.AvlTree;<a name="line.38"></a>
-<span class="sourceLineNo">039</span>import org.apache.hadoop.hbase.util.AvlUtil.AvlTreeIterator;<a name="line.39"></a>
-<span class="sourceLineNo">040</span>import org.apache.yetus.audience.InterfaceAudience;<a name="line.40"></a>
-<span class="sourceLineNo">041</span>import org.slf4j.Logger;<a name="line.41"></a>
-<span class="sourceLineNo">042</span>import org.slf4j.LoggerFactory;<a name="line.42"></a>
-<span class="sourceLineNo">043</span><a name="line.43"></a>
-<span class="sourceLineNo">044</span>import org.apache.hbase.thirdparty.com.google.common.annotations.VisibleForTesting;<a name="line.44"></a>
-<span class="sourceLineNo">045</span><a name="line.45"></a>
-<span class="sourceLineNo">046</span>/**<a name="line.46"></a>
-<span class="sourceLineNo">047</span> * ProcedureScheduler for the Master Procedures.<a name="line.47"></a>
-<span class="sourceLineNo">048</span> * This ProcedureScheduler tries to provide to the ProcedureExecutor procedures<a name="line.48"></a>
-<span class="sourceLineNo">049</span> * that can be executed without having to wait on a lock.<a name="line.49"></a>
-<span class="sourceLineNo">050</span> * Most of the master operations can be executed concurrently, if they<a name="line.50"></a>
-<span class="sourceLineNo">051</span> * are operating on different tables (e.g. two create table procedures can be performed<a name="line.51"></a>
-<span class="sourceLineNo">052</span> * at the same time) or against two different servers; say two servers that crashed at<a name="line.52"></a>
-<span class="sourceLineNo">053</span> * about the same time.<a name="line.53"></a>
-<span class="sourceLineNo">054</span> *<a name="line.54"></a>
-<span class="sourceLineNo">055</span> * &lt;p&gt;Each procedure should implement an Interface providing information for this queue.<a name="line.55"></a>
-<span class="sourceLineNo">056</span> * For example table related procedures should implement TableProcedureInterface.<a name="line.56"></a>
-<span class="sourceLineNo">057</span> * Each procedure will be pushed in its own queue, and based on the operation type<a name="line.57"></a>
-<span class="sourceLineNo">058</span> * we may make smarter decisions: e.g. we can abort all the operations preceding<a name="line.58"></a>
-<span class="sourceLineNo">059</span> * a delete table, or similar.<a name="line.59"></a>
-<span class="sourceLineNo">060</span> *<a name="line.60"></a>
-<span class="sourceLineNo">061</span> * &lt;h4&gt;Concurrency control&lt;/h4&gt;<a name="line.61"></a>
-<span class="sourceLineNo">062</span> * Concurrent access to member variables (tableRunQueue, serverRunQueue, locking, tableMap,<a name="line.62"></a>
-<span class="sourceLineNo">063</span> * serverBuckets) is controlled by schedLock(). This mainly includes:&lt;br&gt;<a name="line.63"></a>
-<span class="sourceLineNo">064</span> * &lt;ul&gt;<a name="line.64"></a>
-<span class="sourceLineNo">065</span> *   &lt;li&gt;<a name="line.65"></a>
-<span class="sourceLineNo">066</span> *     {@link #push(Procedure, boolean, boolean)}: A push will add a Queue back to run-queue<a name="line.66"></a>
-<span class="sourceLineNo">067</span> *     when:<a name="line.67"></a>
-<span class="sourceLineNo">068</span> *     &lt;ol&gt;<a name="line.68"></a>
-<span class="sourceLineNo">069</span> *       &lt;li&gt;Queue was empty before push (so must have been out of run-queue)&lt;/li&gt;<a name="line.69"></a>
-<span class="sourceLineNo">070</span> *       &lt;li&gt;Child procedure is added (which means parent procedure holds exclusive lock, and it<a name="line.70"></a>
-<span class="sourceLineNo">071</span> *           must have moved Queue out of run-queue)&lt;/li&gt;<a name="line.71"></a>
-<span class="sourceLineNo">072</span> *     &lt;/ol&gt;<a name="line.72"></a>
-<span class="sourceLineNo">073</span> *   &lt;/li&gt;<a name="line.73"></a>
-<span class="sourceLineNo">074</span> *   &lt;li&gt;<a name="line.74"></a>
-<span class="sourceLineNo">075</span> *     {@link #poll(long)}: A poll will remove a Queue from run-queue when:<a name="line.75"></a>
-<span class="sourceLineNo">076</span> *     &lt;ol&gt;<a name="line.76"></a>
-<span class="sourceLineNo">077</span> *       &lt;li&gt;Queue becomes empty after poll&lt;/li&gt;<a name="line.77"></a>
-<span class="sourceLineNo">078</span> *       &lt;li&gt;Exclusive lock is requested by polled procedure and lock is available (returns the<a name="line.78"></a>
-<span class="sourceLineNo">079</span> *           procedure)&lt;/li&gt;<a name="line.79"></a>
-<span class="sourceLineNo">080</span> *       &lt;li&gt;Exclusive lock is requested but lock is not available (returns null)&lt;/li&gt;<a name="line.80"></a>
-<span class="sourceLineNo">081</span> *       &lt;li&gt;Polled procedure is child of parent holding exclusive lock and the next procedure is<a name="line.81"></a>
-<span class="sourceLineNo">082</span> *           not a child&lt;/li&gt;<a name="line.82"></a>
-<span class="sourceLineNo">083</span> *     &lt;/ol&gt;<a name="line.83"></a>
-<span class="sourceLineNo">084</span> *   &lt;/li&gt;<a name="line.84"></a>
-<span class="sourceLineNo">085</span> *   &lt;li&gt;<a name="line.85"></a>
-<span class="sourceLineNo">086</span> *     Namespace/table/region locks: Queue is added back to run-queue when lock being released is:<a name="line.86"></a>
-<span class="sourceLineNo">087</span> *     &lt;ol&gt;<a name="line.87"></a>
-<span class="sourceLineNo">088</span> *       &lt;li&gt;Exclusive lock&lt;/li&gt;<a name="line.88"></a>
-<span class="sourceLineNo">089</span> *       &lt;li&gt;Last shared lock (in case queue was removed because next procedure in queue required<a name="line.89"></a>
-<span class="sourceLineNo">090</span> *           exclusive lock)&lt;/li&gt;<a name="line.90"></a>
-<span class="sourceLineNo">091</span> *     &lt;/ol&gt;<a name="line.91"></a>
-<span class="sourceLineNo">092</span> *   &lt;/li&gt;<a name="line.92"></a>
-<span class="sourceLineNo">093</span> * &lt;/ul&gt;<a name="line.93"></a>
-<span class="sourceLineNo">094</span> */<a name="line.94"></a>
-<span class="sourceLineNo">095</span>@InterfaceAudience.Private<a name="line.95"></a>
-<span class="sourceLineNo">096</span>public class MasterProcedureScheduler extends AbstractProcedureScheduler {<a name="line.96"></a>
-<span class="sourceLineNo">097</span>  private static final Logger LOG = LoggerFactory.getLogger(MasterProcedureScheduler.class);<a name="line.97"></a>
-<span class="sourceLineNo">098</span><a name="line.98"></a>
-<span class="sourceLineNo">099</span>  private static final AvlKeyComparator&lt;ServerQueue&gt; SERVER_QUEUE_KEY_COMPARATOR =<a name="line.99"></a>
-<span class="sourceLineNo">100</span>    (n, k) -&gt; n.compareKey((ServerName) k);<a name="line.100"></a>
-<span class="sourceLineNo">101</span>  private final static AvlKeyComparator&lt;TableQueue&gt; TABLE_QUEUE_KEY_COMPARATOR =<a name="line.101"></a>
-<span class="sourceLineNo">102</span>    (n, k) -&gt; n.compareKey((TableName) k);<a name="line.102"></a>
-<span class="sourceLineNo">103</span>  private final static AvlKeyComparator&lt;PeerQueue&gt; PEER_QUEUE_KEY_COMPARATOR =<a name="line.103"></a>
-<span class="sourceLineNo">104</span>    (n, k) -&gt; n.compareKey((String) k);<a name="line.104"></a>
-<span class="sourceLineNo">105</span>  private final static AvlKeyComparator&lt;MetaQueue&gt; META_QUEUE_KEY_COMPARATOR =<a name="line.105"></a>
-<span class="sourceLineNo">106</span>    (n, k) -&gt; n.compareKey((TableName) k);<a name="line.106"></a>
-<span class="sourceLineNo">107</span><a name="line.107"></a>
-<span class="sourceLineNo">108</span>  private final FairQueue&lt;ServerName&gt; serverRunQueue = new FairQueue&lt;&gt;();<a name="line.108"></a>
-<span class="sourceLineNo">109</span>  private final FairQueue&lt;TableName&gt; tableRunQueue = new FairQueue&lt;&gt;();<a name="line.109"></a>
-<span class="sourceLineNo">110</span>  private final FairQueue&lt;String&gt; peerRunQueue = new FairQueue&lt;&gt;();<a name="line.110"></a>
-<span class="sourceLineNo">111</span>  private final FairQueue&lt;TableName&gt; metaRunQueue = new FairQueue&lt;&gt;();<a name="line.111"></a>
-<span class="sourceLineNo">112</span><a name="line.112"></a>
-<span class="sourceLineNo">113</span>  private final ServerQueue[] serverBuckets = new ServerQueue[128];<a name="line.113"></a>
-<span class="sourceLineNo">114</span>  private TableQueue tableMap = null;<a name="line.114"></a>
-<span class="sourceLineNo">115</span>  private PeerQueue peerMap = null;<a name="line.115"></a>
-<span class="sourceLineNo">116</span>  private MetaQueue metaMap = null;<a name="line.116"></a>
-<span class="sourceLineNo">117</span><a name="line.117"></a>
-<span class="sourceLineNo">118</span>  private final SchemaLocking locking;<a name="line.118"></a>
-<span class="sourceLineNo">119</span><a name="line.119"></a>
-<span class="sourceLineNo">120</span>  public MasterProcedureScheduler(Function&lt;Long, Procedure&lt;?&gt;&gt; procedureRetriever) {<a name="line.120"></a>
-<span class="sourceLineNo">121</span>    locking = new SchemaLocking(procedureRetriever);<a name="line.121"></a>
-<span class="sourceLineNo">122</span>  }<a name="line.122"></a>
-<span class="sourceLineNo">123</span><a name="line.123"></a>
-<span class="sourceLineNo">124</span>  @Override<a name="line.124"></a>
-<span class="sourceLineNo">125</span>  public void yield(final Procedure proc) {<a name="line.125"></a>
-<span class="sourceLineNo">126</span>    push(proc, false, true);<a name="line.126"></a>
-<span class="sourceLineNo">127</span>  }<a name="line.127"></a>
-<span class="sourceLineNo">128</span><a name="line.128"></a>
-<span class="sourceLineNo">129</span>  @Override<a name="line.129"></a>
-<span class="sourceLineNo">130</span>  protected void enqueue(final Procedure proc, final boolean addFront) {<a name="line.130"></a>
-<span class="sourceLineNo">131</span>    if (isMetaProcedure(proc)) {<a name="line.131"></a>
-<span class="sourceLineNo">132</span>      doAdd(metaRunQueue, getMetaQueue(), proc, addFront);<a name="line.132"></a>
-<span class="sourceLineNo">133</span>    } else if (isTableProcedure(proc)) {<a name="line.133"></a>
-<span class="sourceLineNo">134</span>      doAdd(tableRunQueue, getTableQueue(getTableName(proc)), proc, addFront);<a name="line.134"></a>
-<span class="sourceLineNo">135</span>    } else if (isServerProcedure(proc)) {<a name="line.135"></a>
-<span class="sourceLineNo">136</span>      ServerProcedureInterface spi = (ServerProcedureInterface) proc;<a name="line.136"></a>
-<span class="sourceLineNo">137</span>      doAdd(serverRunQueue, getServerQueue(spi.getServerName(), spi), proc, addFront);<a name="line.137"></a>
-<span class="sourceLineNo">138</span>    } else if (isPeerProcedure(proc)) {<a name="line.138"></a>
-<span class="sourceLineNo">139</span>      doAdd(peerRunQueue, getPeerQueue(getPeerId(proc)), proc, addFront);<a name="line.139"></a>
-<span class="sourceLineNo">140</span>    } else {<a name="line.140"></a>
-<span class="sourceLineNo">141</span>      // TODO: at the moment we only have Table and Server procedures<a name="line.141"></a>
-<span class="sourceLineNo">142</span>      // if you are implementing a non-table/non-server procedure, you have two options: create<a name="line.142"></a>
-<span class="sourceLineNo">143</span>      // a group for all the non-table/non-server procedures or try to find a key for your<a name="line.143"></a>
-<span class="sourceLineNo">144</span>      // non-table/non-server procedures and implement something similar to the TableRunQueue.<a name="line.144"></a>
-<span class="sourceLineNo">145</span>      throw new UnsupportedOperationException(<a name="line.145"></a>
-<span class="sourceLineNo">146</span>        "RQs for non-table/non-server procedures are not implemented yet: " + proc);<a name="line.146"></a>
-<span class="sourceLineNo">147</span>    }<a name="line.147"></a>
-<span class="sourceLineNo">148</span>  }<a name="line.148"></a>
-<span class="sourceLineNo">149</span><a name="line.149"></a>
-<span class="sourceLineNo">150</span>  private &lt;T extends Comparable&lt;T&gt;&gt; void doAdd(FairQueue&lt;T&gt; fairq, Queue&lt;T&gt; queue,<a name="line.150"></a>
-<span class="sourceLineNo">151</span>      Procedure&lt;?&gt; proc, boolean addFront) {<a name="line.151"></a>
-<span class="sourceLineNo">152</span>    queue.add(proc, addFront);<a name="line.152"></a>
-<span class="sourceLineNo">153</span>    // For the following conditions, we will put the queue back into execution<a name="line.153"></a>
-<span class="sourceLineNo">154</span>    // 1. The procedure has already held the lock, or the lock has been restored when restarting,<a name="line.154"></a>
-<span class="sourceLineNo">155</span>    // which means it can be executed immediately.<a name="line.155"></a>
-<span class="sourceLineNo">156</span>    // 2. The exclusive lock for this queue has not been held.<a name="line.156"></a>
-<span class="sourceLineNo">157</span>    // 3. The given procedure has the exclusive lock permission for this queue.<a name="line.157"></a>
-<span class="sourceLineNo">158</span>    if (proc.hasLock() || proc.isLockedWhenLoading() || !queue.getLockStatus().hasExclusiveLock() ||<a name="line.158"></a>
-<span class="sourceLineNo">159</span>      queue.getLockStatus().hasLockAccess(proc)) {<a name="line.159"></a>
-<span class="sourceLineNo">160</span>      addToRunQueue(fairq, queue);<a name="line.160"></a>
-<span class="sourceLineNo">161</span>    }<a name="line.161"></a>
-<span class="sourceLineNo">162</span>  }<a name="line.162"></a>
-<span class="sourceLineNo">163</span><a name="line.163"></a>
-<span class="sourceLineNo">164</span>  @Override<a name="line.164"></a>
-<span class="sourceLineNo">165</span>  protected boolean queueHasRunnables() {<a name="line.165"></a>
-<span class="sourceLineNo">166</span>    return metaRunQueue.hasRunnables() || tableRunQueue.hasRunnables() ||<a name="line.166"></a>
-<span class="sourceLineNo">167</span>      serverRunQueue.hasRunnables() || peerRunQueue.hasRunnables();<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>  @Override<a name="line.170"></a>
-<span class="sourceLineNo">171</span>  protected Procedure dequeue() {<a name="line.171"></a>
-<span class="sourceLineNo">172</span>    // meta procedure is always the first priority<a name="line.172"></a>
-<span class="sourceLineNo">173</span>    Procedure&lt;?&gt; pollResult = doPoll(metaRunQueue);<a name="line.173"></a>
-<span class="sourceLineNo">174</span>    // For now, let server handling have precedence over table handling; presumption is that it<a name="line.174"></a>
-<span class="sourceLineNo">175</span>    // is more important handling crashed servers than it is running the<a name="line.175"></a>
-<span class="sourceLineNo">176</span>    // enabling/disabling tables, etc.<a name="line.176"></a>
-<span class="sourceLineNo">177</span>    if (pollResult == null) {<a name="line.177"></a>
-<span class="sourceLineNo">178</span>      pollResult = doPoll(serverRunQueue);<a name="line.178"></a>
-<span class="sourceLineNo">179</span>    }<a name="line.179"></a>
-<span class="sourceLineNo">180</span>    if (pollResult == null) {<a name="line.180"></a>
-<span class="sourceLineNo">181</span>      pollResult = doPoll(peerRunQueue);<a name="line.181"></a>
-<span class="sourceLineNo">182</span>    }<a name="line.182"></a>
-<span class="sourceLineNo">183</span>    if (pollResult == null) {<a name="line.183"></a>
-<span class="sourceLineNo">184</span>      pollResult = doPoll(tableRunQueue);<a name="line.184"></a>
-<span class="sourceLineNo">185</span>    }<a name="line.185"></a>
-<span class="sourceLineNo">186</span>    return pollResult;<a name="line.186"></a>
-<span class="sourceLineNo">187</span>  }<a name="line.187"></a>
-<span class="sourceLineNo">188</span><a name="line.188"></a>
-<span class="sourceLineNo">189</span>  private &lt;T extends Comparable&lt;T&gt;&gt; boolean isLockReady(Procedure&lt;?&gt; proc, Queue&lt;T&gt; rq) {<a name="line.189"></a>
-<span class="sourceLineNo">190</span>    LockStatus s = rq.getLockStatus();<a name="line.190"></a>
-<span class="sourceLineNo">191</span>    // if we have the lock access, we are ready<a name="line.191"></a>
-<span class="sourceLineNo">192</span>    if (s.hasLockAccess(proc)) {<a name="line.192"></a>
-<span class="sourceLineNo">193</span>      return true;<a name="line.193"></a>
-<span class="sourceLineNo">194</span>    }<a name="line.194"></a>
-<span class="sourceLineNo">195</span>    boolean xlockReq = rq.requireExclusiveLock(proc);<a name="line.195"></a>
-<span class="sourceLineNo">196</span>    // if we need to hold the xlock, then we need to make sure that no one holds any lock, including<a name="line.196"></a>
-<span class="sourceLineNo">197</span>    // the shared lock, otherwise, we just need to make sure that no one holds the xlock<a name="line.197"></a>
-<span class="sourceLineNo">198</span>    return xlockReq ? !s.isLocked() : !s.hasExclusiveLock();<a name="line.198"></a>
-<span class="sourceLineNo">199</span>  }<a name="line.199"></a>
-<span class="sourceLineNo">200</span><a name="line.200"></a>
-<span class="sourceLineNo">201</span>  private &lt;T extends Comparable&lt;T&gt;&gt; Procedure&lt;?&gt; doPoll(final FairQueue&lt;T&gt; fairq) {<a name="line.201"></a>
-<span class="sourceLineNo">202</span>    Queue&lt;T&gt; rq = fairq.poll();<a name="line.202"></a>
-<span class="sourceLineNo">203</span>    if (rq == null || !rq.isAvailable()) {<a name="line.203"></a>
-<span class="sourceLineNo">204</span>      return null;<a name="line.204"></a>
-<span class="sourceLineNo">205</span>    }<a name="line.205"></a>
-<span class="sourceLineNo">206</span>    // loop until we find out a procedure which is ready to run, or if we have checked all the<a name="line.206"></a>
-<span class="sourceLineNo">207</span>    // procedures, then we give up and remove the queue from run queue.<a name="line.207"></a>
-<span class="sourceLineNo">208</span>    for (int i = 0, n = rq.size(); i &lt; n; i++) {<a name="line.208"></a>
-<span class="sourceLineNo">209</span>      Procedure&lt;?&gt; proc = rq.poll();<a name="line.209"></a>
-<span class="sourceLineNo">210</span>      if (isLockReady(proc, rq)) {<a name="line.210"></a>
-<span class="sourceLineNo">211</span>        // the queue is empty, remove from run queue<a name="line.211"></a>
-<span class="sourceLineNo">212</span>        if (rq.isEmpty()) {<a name="line.212"></a>
-<span class="sourceLineNo">213</span>          removeFromRunQueue(fairq, rq);<a name="line.213"></a>
-<span class="sourceLineNo">214</span>        }<a name="line.214"></a>
-<span class="sourceLineNo">215</span>        return proc;<a name="line.215"></a>
-<span class="sourceLineNo">216</span>      }<a name="line.216"></a>
-<span class="sourceLineNo">217</span>      // we are not ready to run, add back and try the next procedure<a name="line.217"></a>
-<span class="sourceLineNo">218</span>      rq.add(proc, false);<a name="line.218"></a>
-<span class="sourceLineNo">219</span>    }<a name="line.219"></a>
-<span class="sourceLineNo">220</span>    // no procedure is ready for execution, remove from run queue<a name="line.220"></a>
-<span class="sourceLineNo">221</span>    removeFromRunQueue(fairq, rq);<a name="line.221"></a>
-<span class="sourceLineNo">222</span>    return null;<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>  @Override<a name="line.225"></a>
-<span class="sourceLineNo">226</span>  public List&lt;LockedResource&gt; getLocks() {<a name="line.226"></a>
-<span class="sourceLineNo">227</span>    schedLock();<a name="line.227"></a>
-<span class="sourceLineNo">228</span>    try {<a name="line.228"></a>
-<span class="sourceLineNo">229</span>      return locking.getLocks();<a name="line.229"></a>
-<span class="sourceLineNo">230</span>    } finally {<a name="line.230"></a>
-<span class="sourceLineNo">231</span>      schedUnlock();<a name="line.231"></a>
-<span class="sourceLineNo">232</span>    }<a name="line.232"></a>
+<span class="sourceLineNo">024</span>import java.util.function.Supplier;<a name="line.24"></a>
+<span class="sourceLineNo">025</span>import org.apache.hadoop.hbase.ServerName;<a name="line.25"></a>
+<span class="sourceLineNo">026</span>import org.apache.hadoop.hbase.TableExistsException;<a name="line.26"></a>
+<span class="sourceLineNo">027</span>import org.apache.hadoop.hbase.TableName;<a name="line.27"></a>
+<span class="sourceLineNo">028</span>import org.apache.hadoop.hbase.TableNotFoundException;<a name="line.28"></a>
+<span class="sourceLineNo">029</span>import org.apache.hadoop.hbase.client.RegionInfo;<a name="line.29"></a>
+<span class="sourceLineNo">030</span>import org.apache.hadoop.hbase.master.procedure.TableProcedureInterface.TableOperationType;<a name="line.30"></a>
+<span class="sourceLineNo">031</span>import org.apache.hadoop.hbase.procedure2.AbstractProcedureScheduler;<a name="line.31"></a>
+<span class="sourceLineNo">032</span>import org.apache.hadoop.hbase.procedure2.LockAndQueue;<a name="line.32"></a>
+<span class="sourceLineNo">033</span>import org.apache.hadoop.hbase.procedure2.LockStatus;<a name="line.33"></a>
+<span class="sourceLineNo">034</span>import org.apache.hadoop.hbase.procedure2.LockedResource;<a name="line.34"></a>
+<span class="sourceLineNo">035</span>import org.apache.hadoop.hbase.procedure2.LockedResourceType;<a name="line.35"></a>
+<span class="sourceLineNo">036</span>import org.apache.hadoop.hbase.procedure2.Procedure;<a name="line.36"></a>
+<span class="sourceLineNo">037</span>import org.apache.hadoop.hbase.util.AvlUtil.AvlIterableList;<a name="line.37"></a>
+<span class="sourceLineNo">038</span>import org.apache.hadoop.hbase.util.AvlUtil.AvlKeyComparator;<a name="line.38"></a>
+<span class="sourceLineNo">039</span>import org.apache.hadoop.hbase.util.AvlUtil.AvlTree;<a name="line.39"></a>
+<span class="sourceLineNo">040</span>import org.apache.hadoop.hbase.util.AvlUtil.AvlTreeIterator;<a name="line.40"></a>
+<span class="sourceLineNo">041</span>import org.apache.yetus.audience.InterfaceAudience;<a name="line.41"></a>
+<span class="sourceLineNo">042</span>import org.slf4j.Logger;<a name="line.42"></a>
+<span class="sourceLineNo">043</span>import org.slf4j.LoggerFactory;<a name="line.43"></a>
+<span class="sourceLineNo">044</span><a name="line.44"></a>
+<span class="sourceLineNo">045</span>import org.apache.hbase.thirdparty.com.google.common.annotations.VisibleForTesting;<a name="line.45"></a>
+<span class="sourceLineNo">046</span><a name="line.46"></a>
+<span class="sourceLineNo">047</span>/**<a name="line.47"></a>
+<span class="sourceLineNo">048</span> * ProcedureScheduler for the Master Procedures.<a name="line.48"></a>
+<span class="sourceLineNo">049</span> * This ProcedureScheduler tries to provide to the ProcedureExecutor procedures<a name="line.49"></a>
+<span class="sourceLineNo">050</span> * that can be executed without having to wait on a lock.<a name="line.50"></a>
+<span class="sourceLineNo">051</span> * Most of the master operations can be executed concurrently, if they<a name="line.51"></a>
+<span class="sourceLineNo">052</span> * are operating on different tables (e.g. two create table procedures can be performed<a name="line.52"></a>
+<span class="sourceLineNo">053</span> * at the same time) or against two different servers; say two servers that crashed at<a name="line.53"></a>
+<span class="sourceLineNo">054</span> * about the same time.<a name="line.54"></a>
+<span class="sourceLineNo">055</span> *<a name="line.55"></a>
+<span class="sourceLineNo">056</span> * &lt;p&gt;Each procedure should implement an Interface providing information for this queue.<a name="line.56"></a>
+<span class="sourceLineNo">057</span> * For example table related procedures should implement TableProcedureInterface.<a name="line.57"></a>
+<span class="sourceLineNo">058</span> * Each procedure will be pushed in its own queue, and based on the operation type<a name="line.58"></a>
+<span class="sourceLineNo">059</span> * we may make smarter decisions: e.g. we can abort all the operations preceding<a name="line.59"></a>
+<span class="sourceLineNo">060</span> * a delete table, or similar.<a name="line.60"></a>
+<span class="sourceLineNo">061</span> *<a name="line.61"></a>
+<span class="sourceLineNo">062</span> * &lt;h4&gt;Concurrency control&lt;/h4&gt;<a name="line.62"></a>
+<span class="sourceLineNo">063</span> * Concurrent access to member variables (tableRunQueue, serverRunQueue, locking, tableMap,<a name="line.63"></a>
+<span class="sourceLineNo">064</span> * serverBuckets) is controlled by schedLock(). This mainly includes:&lt;br&gt;<a name="line.64"></a>
+<span class="sourceLineNo">065</span> * &lt;ul&gt;<a name="line.65"></a>
+<span class="sourceLineNo">066</span> *   &lt;li&gt;<a name="line.66"></a>
+<span class="sourceLineNo">067</span> *     {@link #push(Procedure, boolean, boolean)}: A push will add a Queue back to run-queue<a name="line.67"></a>
+<span class="sourceLineNo">068</span> *     when:<a name="line.68"></a>
+<span class="sourceLineNo">069</span> *     &lt;ol&gt;<a name="line.69"></a>
+<span class="sourceLineNo">070</span> *       &lt;li&gt;Queue was empty before push (so must have been out of run-queue)&lt;/li&gt;<a name="line.70"></a>
+<span class="sourceLineNo">071</span> *       &lt;li&gt;Child procedure is added (which means parent procedure holds exclusive lock, and it<a name="line.71"></a>
+<span class="sourceLineNo">072</span> *           must have moved Queue out of run-queue)&lt;/li&gt;<a name="line.72"></a>
+<span class="sourceLineNo">073</span> *     &lt;/ol&gt;<a name="line.73"></a>
+<span class="sourceLineNo">074</span> *   &lt;/li&gt;<a name="line.74"></a>
+<span class="sourceLineNo">075</span> *   &lt;li&gt;<a name="line.75"></a>
+<span class="sourceLineNo">076</span> *     {@link #poll(long)}: A poll will remove a Queue from run-queue when:<a name="line.76"></a>
+<span class="sourceLineNo">077</span> *     &lt;ol&gt;<a name="line.77"></a>
+<span class="sourceLineNo">078</span> *       &lt;li&gt;Queue becomes empty after poll&lt;/li&gt;<a name="line.78"></a>
+<span class="sourceLineNo">079</span> *       &lt;li&gt;Exclusive lock is requested by polled procedure and lock is available (returns the<a name="line.79"></a>
+<span class="sourceLineNo">080</span> *           procedure)&lt;/li&gt;<a name="line.80"></a>
+<span class="sourceLineNo">081</span> *       &lt;li&gt;Exclusive lock is requested but lock is not available (returns null)&lt;/li&gt;<a name="line.81"></a>
+<span class="sourceLineNo">082</span> *       &lt;li&gt;Polled procedure is child of parent holding exclusive lock and the next procedure is<a name="line.82"></a>
+<span class="sourceLineNo">083</span> *           not a child&lt;/li&gt;<a name="line.83"></a>
+<span class="sourceLineNo">084</span> *     &lt;/ol&gt;<a name="line.84"></a>
+<span class="sourceLineNo">085</span> *   &lt;/li&gt;<a name="line.85"></a>
+<span class="sourceLineNo">086</span> *   &lt;li&gt;<a name="line.86"></a>
+<span class="sourceLineNo">087</span> *     Namespace/table/region locks: Queue is added back to run-queue when lock being released is:<a name="line.87"></a>
+<span class="sourceLineNo">088</span> *     &lt;ol&gt;<a name="line.88"></a>
+<span class="sourceLineNo">089</span> *       &lt;li&gt;Exclusive lock&lt;/li&gt;<a name="line.89"></a>
+<span class="sourceLineNo">090</span> *       &lt;li&gt;Last shared lock (in case queue was removed because next procedure in queue required<a name="line.90"></a>
+<span class="sourceLineNo">091</span> *           exclusive lock)&lt;/li&gt;<a name="line.91"></a>
+<span class="sourceLineNo">092</span> *     &lt;/ol&gt;<a name="line.92"></a>
+<span class="sourceLineNo">093</span> *   &lt;/li&gt;<a name="line.93"></a>
+<span class="sourceLineNo">094</span> * &lt;/ul&gt;<a name="line.94"></a>
+<span class="sourceLineNo">095</span> */<a name="line.95"></a>
+<span class="sourceLineNo">096</span>@InterfaceAudience.Private<a name="line.96"></a>
+<span class="sourceLineNo">097</span>public class MasterProcedureScheduler extends AbstractProcedureScheduler {<a name="line.97"></a>
+<span class="sourceLineNo">098</span>  private static final Logger LOG = LoggerFactory.getLogger(MasterProcedureScheduler.class);<a name="line.98"></a>
+<span class="sourceLineNo">099</span><a name="line.99"></a>
+<span class="sourceLineNo">100</span>  private static final AvlKeyComparator&lt;ServerQueue&gt; SERVER_QUEUE_KEY_COMPARATOR =<a name="line.100"></a>
+<span class="sourceLineNo">101</span>    (n, k) -&gt; n.compareKey((ServerName) k);<a name="line.101"></a>
+<span class="sourceLineNo">102</span>  private final static AvlKeyComparator&lt;TableQueue&gt; TABLE_QUEUE_KEY_COMPARATOR =<a name="line.102"></a>
+<span class="sourceLineNo">103</span>    (n, k) -&gt; n.compareKey((TableName) k);<a name="line.103"></a>
+<span class="sourceLineNo">104</span>  private final static AvlKeyComparator&lt;PeerQueue&gt; PEER_QUEUE_KEY_COMPARATOR =<a name="line.104"></a>
+<span class="sourceLineNo">105</span>    (n, k) -&gt; n.compareKey((String) k);<a name="line.105"></a>
+<span class="sourceLineNo">106</span>  private final static AvlKeyComparator&lt;MetaQueue&gt; META_QUEUE_KEY_COMPARATOR =<a name="line.106"></a>
+<span class="sourceLineNo">107</span>    (n, k) -&gt; n.compareKey((TableName) k);<a name="line.107"></a>
+<span class="sourceLineNo">108</span><a name="line.108"></a>
+<span class="sourceLineNo">109</span>  private final FairQueue&lt;ServerName&gt; serverRunQueue = new FairQueue&lt;&gt;();<a name="line.109"></a>
+<span class="sourceLineNo">110</span>  private final FairQueue&lt;TableName&gt; tableRunQueue = new FairQueue&lt;&gt;();<a name="line.110"></a>
+<span class="sourceLineNo">111</span>  private final FairQueue&lt;String&gt; peerRunQueue = new FairQueue&lt;&gt;();<a name="line.111"></a>
+<span class="sourceLineNo">112</span>  private final FairQueue&lt;TableName&gt; metaRunQueue = new FairQueue&lt;&gt;();<a name="line.112"></a>
+<span class="sourceLineNo">113</span><a name="line.113"></a>
+<span class="sourceLineNo">114</span>  private final ServerQueue[] serverBuckets = new ServerQueue[128];<a name="line.114"></a>
+<span class="sourceLineNo">115</span>  private TableQueue tableMap = null;<a name="line.115"></a>
+<span class="sourceLineNo">116</span>  private PeerQueue peerMap = null;<a name="line.116"></a>
+<span class="sourceLineNo">117</span>  private MetaQueue metaMap = null;<a name="line.117"></a>
+<span class="sourceLineNo">118</span><a name="line.118"></a>
+<span class="sourceLineNo">119</span>  private final SchemaLocking locking;<a name="line.119"></a>
+<span class="sourceLineNo">120</span><a name="line.120"></a>
+<span class="sourceLineNo">121</span>  public MasterProcedureScheduler(Function&lt;Long, Procedure&lt;?&gt;&gt; procedureRetriever) {<a name="line.121"></a>
+<span class="sourceLineNo">122</span>    locking = new SchemaLocking(procedureRetriever);<a name="line.122"></a>
+<span class="sourceLineNo">123</span>  }<a name="line.123"></a>
+<span class="sourceLineNo">124</span><a name="line.124"></a>
+<span class="sourceLineNo">125</span>  @Override<a name="line.125"></a>
+<span class="sourceLineNo">126</span>  public void yield(final Procedure proc) {<a name="line.126"></a>
+<span class="sourceLineNo">127</span>    push(proc, false, true);<a name="line.127"></a>
+<span class="sourceLineNo">128</span>  }<a name="line.128"></a>
+<span class="sourceLineNo">129</span><a name="line.129"></a>
+<span class="sourceLineNo">130</span>  @Override<a name="line.130"></a>
+<span class="sourceLineNo">131</span>  protected void enqueue(final Procedure proc, final boolean addFront) {<a name="line.131"></a>
+<span class="sourceLineNo">132</span>    if (isMetaProcedure(proc)) {<a name="line.132"></a>
+<span class="sourceLineNo">133</span>      doAdd(metaRunQueue, getMetaQueue(), proc, addFront);<a name="line.133"></a>
+<span class="sourceLineNo">134</span>    } else if (isTableProcedure(proc)) {<a name="line.134"></a>
+<span class="sourceLineNo">135</span>      doAdd(tableRunQueue, getTableQueue(getTableName(proc)), proc, addFront);<a name="line.135"></a>
+<span class="sourceLineNo">136</span>    } else if (isServerProcedure(proc)) {<a name="line.136"></a>
+<span class="sourceLineNo">137</span>      ServerProcedureInterface spi = (ServerProcedureInterface) proc;<a name="line.137"></a>
+<span class="sourceLineNo">138</span>      doAdd(serverRunQueue, getServerQueue(spi.getServerName(), spi), proc, addFront);<a name="line.138"></a>
+<span class="sourceLineNo">139</span>    } else if (isPeerProcedure(proc)) {<a name="line.139"></a>
+<span class="sourceLineNo">140</span>      doAdd(peerRunQueue, getPeerQueue(getPeerId(proc)), proc, addFront);<a name="line.140"></a>
+<span class="sourceLineNo">141</span>    } else {<a name="line.141"></a>
+<span class="sourceLineNo">142</span>      // TODO: at the moment we only have Table and Server procedures<a name="line.142"></a>
+<span class="sourceLineNo">143</span>      // if you are implementing a non-table/non-server procedure, you have two options: create<a name="line.143"></a>
+<span class="sourceLineNo">144</span>      // a group for all the non-table/non-server procedures or try to find a key for your<a name="line.144"></a>
+<span class="sourceLineNo">145</span>      // non-table/non-server procedures and implement something similar to the TableRunQueue.<a name="line.145"></a>
+<span class="sourceLineNo">146</span>      throw new UnsupportedOperationException(<a name="line.146"></a>
+<span class="sourceLineNo">147</span>        "RQs for non-table/non-server procedures are not implemented yet: " + proc);<a name="line.147"></a>
+<span class="sourceLineNo">148</span>    }<a name="line.148"></a>
+<span class="sourceLineNo">149</span>  }<a name="line.149"></a>
+<span class="sourceLineNo">150</span><a name="line.150"></a>
+<span class="sourceLineNo">151</span>  private &lt;T extends Comparable&lt;T&gt;&gt; void doAdd(FairQueue&lt;T&gt; fairq, Queue&lt;T&gt; queue,<a name="line.151"></a>
+<span class="sourceLineNo">152</span>      Procedure&lt;?&gt; proc, boolean addFront) {<a name="line.152"></a>
+<span class="sourceLineNo">153</span>    queue.add(proc, addFront);<a name="line.153"></a>
+<span class="sourceLineNo">154</span>    // For the following conditions, we will put the queue back into execution<a name="line.154"></a>
+<span class="sourceLineNo">155</span>    // 1. The procedure has already held the lock, or the lock has been restored when restarting,<a name="line.155"></a>
+<span class="sourceLineNo">156</span>    // which means it can be executed immediately.<a name="line.156"></a>
+<span class="sourceLineNo">157</span>    // 2. The exclusive lock for this queue has not been held.<a name="line.157"></a>
+<span class="sourceLineNo">158</span>    // 3. The given procedure has the exclusive lock permission for this queue.<a name="line.158"></a>
+<span class="sourceLineNo">159</span>    Supplier&lt;String&gt; reason = null;<a name="line.159"></a>
+<span class="sourceLineNo">160</span>    if (proc.hasLock()) {<a name="line.160"></a>
+<span class="sourceLineNo">161</span>      reason = () -&gt; proc + " has lock";<a name="line.161"></a>
+<span class="sourceLineNo">162</span>    } else if (proc.isLockedWhenLoading()) {<a name="line.162"></a>
+<span class="sourceLineNo">163</span>      reason = () -&gt; proc + " restores lock when restarting";<a name="line.163"></a>
+<span class="sourceLineNo">164</span>    } else if (!queue.getLockStatus().hasExclusiveLock()) {<a name="line.164"></a>
+<span class="sourceLineNo">165</span>      reason = () -&gt; "the exclusive lock is not held by anyone when adding " + proc;<a name="line.165"></a>
+<span class="sourceLineNo">166</span>    } else if (queue.getLockStatus().hasLockAccess(proc)) {<a name="line.166"></a>
+<span class="sourceLineNo">167</span>      reason = () -&gt; proc + " has the excusive lock access";<a name="line.167"></a>
+<span class="sourceLineNo">168</span>    }<a name="line.168"></a>
+<span class="sourceLineNo">169</span>    if (reason != null) {<a name="line.169"></a>
+<span class="sourceLineNo">170</span>      addToRunQueue(fairq, queue, reason);<a name="line.170"></a>
+<span class="sourceLineNo">171</span>    }<a name="line.171"></a>
+<span class="sourceLineNo">172</span>  }<a name="line.172"></a>
+<span class="sourceLineNo">173</span><a name="line.173"></a>
+<span class="sourceLineNo">174</span>  @Override<a name="line.174"></a>
+<span class="sourceLineNo">175</span>  protected boolean queueHasRunnables() {<a name="line.175"></a>
+<span class="sourceLineNo">176</span>    return metaRunQueue.hasRunnables() || tableRunQueue.hasRunnables() ||<a name="line.176"></a>
+<span class="sourceLineNo">177</span>      serverRunQueue.hasRunnables() || peerRunQueue.hasRunnables();<a name="line.177"></a>
+<span class="sourceLineNo">178</span>  }<a name="line.178"></a>
+<span class="sourceLineNo">179</span><a name="line.179"></a>
+<span class="sourceLineNo">180</span>  @Override<a name="line.180"></a>
+<span class="sourceLineNo">181</span>  protected Procedure dequeue() {<a name="line.181"></a>
+<span class="sourceLineNo">182</span>    // meta procedure is always the first priority<a name="line.182"></a>
+<span class="sourceLineNo">183</span>    Procedure&lt;?&gt; pollResult = doPoll(metaRunQueue);<a name="line.183"></a>
+<span class="sourceLineNo">184</span>    // For now, let server handling have precedence over table handling; presumption is that it<a name="line.184"></a>
+<span class="sourceLineNo">185</span>    // is more important handling crashed servers than it is running the<a name="line.185"></a>
+<span class="sourceLineNo">186</span>    // enabling/disabling tables, etc.<a name="line.186"></a>
+<span class="sourceLineNo">187</span>    if (pollResult == null) {<a name="line.187"></a>
+<span class="sourceLineNo">188</span>      pollResult = doPoll(serverRunQueue);<a name="line.188"></a>
+<span class="sourceLineNo">189</span>    }<a name="line.189"></a>
+<span class="sourceLineNo">190</span>    if (pollResult == null) {<a name="line.190"></a>
+<span class="sourceLineNo">191</span>      pollResult = doPoll(peerRunQueue);<a name="line.191"></a>
+<span class="sourceLineNo">192</span>    }<a name="line.192"></a>
+<span class="sourceLineNo">193</span>    if (pollResult == null) {<a name="line.193"></a>
+<span class="sourceLineNo">194</span>      pollResult = doPoll(tableRunQueue);<a name="line.194"></a>
+<span class="sourceLineNo">195</span>    }<a name="line.195"></a>
+<span class="sourceLineNo">196</span>    return pollResult;<a name="line.196"></a>
+<span class="sourceLineNo">197</span>  }<a name="line.197"></a>
+<span class="sourceLineNo">198</span><a name="line.198"></a>
+<span class="sourceLineNo">199</span>  private &lt;T extends Comparable&lt;T&gt;&gt; boolean isLockReady(Procedure&lt;?&gt; proc, Queue&lt;T&gt; rq) {<a name="line.199"></a>
+<span class="sourceLineNo">200</span>    LockStatus s = rq.getLockStatus();<a name="line.200"></a>
+<span class="sourceLineNo">201</span>    // if we have the lock access, we are ready<a name="line.201"></a>
+<span class="sourceLineNo">202</span>    if (s.hasLockAccess(proc)) {<a name="line.202"></a>
+<span class="sourceLineNo">203</span>      return true;<a name="line.203"></a>
+<span class="sourceLineNo">204</span>    }<a name="line.204"></a>
+<span class="sourceLineNo">205</span>    boolean xlockReq = rq.requireExclusiveLock(proc);<a name="line.205"></a>
+<span class="sourceLineNo">206</span>    // if we need to hold the xlock, then we need to make sure that no one holds any lock, including<a name="line.206"></a>
+<span class="sourceLineNo">207</span>    // the shared lock, otherwise, we just need to make sure that no one holds the xlock<a name="line.207"></a>
+<span class="sourceLineNo">208</span>    return xlockReq ? !s.isLocked() : !s.hasExclusiveLock();<a name="line.208"></a>
+<span class="sourceLineNo">209</span>  }<a name="line.209"></a>
+<span class="sourceLineNo">210</span><a name="line.210"></a>
+<span class="sourceLineNo">211</span>  private &lt;T extends Comparable&lt;T&gt;&gt; Procedure&lt;?&gt; doPoll(final FairQueue&lt;T&gt; fairq) {<a name="line.211"></a>
+<span class="sourceLineNo">212</span>    Queue&lt;T&gt; rq = fairq.poll();<a name="line.212"></a>
+<span class="sourceLineNo">213</span>    if (rq == null || !rq.isAvailable()) {<a name="line.213"></a>
+<span class="sourceLineNo">214</span>      return null;<a name="line.214"></a>
+<span class="sourceLineNo">215</span>    }<a name="line.215"></a>
+<span class="sourceLineNo">216</span>    // loop until we find out a procedure which is ready to run, or if we have checked all the<a name="line.216"></a>
+<span class="sourceLineNo">217</span>    // procedures, then we give up and remove the queue from run queue.<a name="line.217"></a>
+<span class="sourceLineNo">218</span>    for (int i = 0, n = rq.size(); i &lt; n; i++) {<a name="line.218"></a>
+<span class="sourceLineNo">219</span>      Procedure&lt;?&gt; proc = rq.poll();<a name="line.219"></a>
+<span class="sourceLineNo">220</span>      if (isLockReady(proc, rq)) {<a name="line.220"></a>
+<span class="sourceLineNo">221</span>        // the queue is empty, remove from run queue<a name="line.221"></a>
+<span class="sourceLineNo">222</span>        if (rq.isEmpty()) {<a name="line.222"></a>
+<span class="sourceLineNo">223</span>          removeFromRunQueue(fairq, rq, () -&gt; "queue is empty after polling out " + proc);<a name="line.223"></a>
+<span class="sourceLineNo">224</span>        }<a name="line.224"></a>
+<span class="sourceLineNo">225</span>        return proc;<a name="line.225"></a>
+<span class="sourceLineNo">226</span>      }<a name="line.226"></a>
+<span class="sourceLineNo">227</span>      // we are not ready to run, add back and try the next procedure<a name="line.227"></a>
+<span class="sourceLineNo">228</span>      rq.add(proc, false);<a name="line.228"></a>
+<span class="sourceLineNo">229</span>    }<a name="line.229"></a>
+<span class="sourceLineNo">230</span>    // no procedure is ready for execution, remove from run queue<a name="line.230"></a>
+<span class="sourceLineNo">231</span>    removeFromRunQueue(fairq, rq, () -&gt; "no procedure can be executed");<a name="line.231"></a>
+<span class="sourceLineNo">232</span>    return null;<a name="line.232"></a>
 <span class="sourceLineNo">233</span>  }<a name="line.233"></a>
 <span class="sourceLineNo">234</span><a name="line.234"></a>
 <span class="sourceLineNo">235</span>  @Override<a name="line.235"></a>
-<span class="sourceLineNo">236</span>  public LockedResource getLockResource(LockedResourceType resourceType, String resourceName) {<a name="line.236"></a>
+<span class="sourceLineNo">236</span>  public List&lt;LockedResource&gt; getLocks() {<a name="line.236"></a>
 <span class="sourceLineNo">237</span>    schedLock();<a name="line.237"></a>
 <span class="sourceLineNo">238</span>    try {<a name="line.238"></a>
-<span class="sourceLineNo">239</span>      return locking.getLockResource(resourceType, resourceName);<a name="line.239"></a>
+<span class="sourceLineNo">239</span>      return locking.getLocks();<a name="line.239"></a>
 <span class="sourceLineNo">240</span>    } finally {<a name="line.240"></a>
 <span class="sourceLineNo">241</span>      schedUnlock();<a name="line.241"></a>
 <span class="sourceLineNo">242</span>    }<a name="line.242"></a>
 <span class="sourceLineNo">243</span>  }<a name="line.243"></a>
 <span class="sourceLineNo">244</span><a name="line.244"></a>
 <span class="sourceLineNo">245</span>  @Override<a name="line.245"></a>
-<span class="sourceLineNo">246</span>  public void clear() {<a name="line.246"></a>
+<span class="sourceLineNo">246</span>  public LockedResource getLockResource(LockedResourceType resourceType, String resourceName) {<a name="line.246"></a>
 <span class="sourceLineNo">247</span>    schedLock();<a name="line.247"></a>
 <span class="sourceLineNo">248</span>    try {<a name="line.248"></a>
-<span class="sourceLineNo">249</span>      clearQueue();<a name="line.249"></a>
-<span class="sourceLineNo">250</span>      locking.clear();<a name="line.250"></a>
-<span class="sourceLineNo">251</span>    } finally {<a name="line.251"></a>
-<span class="sourceLineNo">252</span>      schedUnlock();<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>  private void clearQueue() {<a name="line.256"></a>
-<span class="sourceLineNo">257</span>    // Remove Servers<a name="line.257"></a>
-<span class="sourceLineNo">258</span>    for (int i = 0; i &lt; serverBuckets.length; ++i) {<a name="line.258"></a>
-<span class="sourceLineNo">259</span>      clear(serverBuckets[i], serverRunQueue, SERVER_QUEUE_KEY_COMPARATOR);<a name="line.259"></a>
-<span class="sourceLineNo">260</span>      serverBuckets[i] = null;<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>    // Remove Tables<a name="line.263"></a>
-<span class="sourceLineNo">264</span>    clear(tableMap, tableRunQueue, TABLE_QUEUE_KEY_COMPARATOR);<a name="line.264"></a>
-<span class="sourceLineNo">265</span>    tableMap = null;<a name="line.265"></a>
-<span class="sourceLineNo">266</span><a name="line.266"></a>
-<span class="sourceLineNo">267</span>    // Remove Peers<a name="line.267"></a>
-<span class="sourceLineNo">268</span>    clear(peerMap, peerRunQueue, PEER_QUEUE_KEY_COMPARATOR);<a name="line.268"></a>
-<span class="sourceLineNo">269</span>    peerMap = null;<a name="line.269"></a>
-<span class="sourceLineNo">270</span><a name="line.270"></a>
-<span class="sourceLineNo">271</span>    assert size() == 0 : "expected queue size to be 0, got " + size();<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>  private &lt;T extends Comparable&lt;T&gt;, TNode extends Queue&lt;T&gt;&gt; void clear(TNode treeMap,<a name="line.274"></a>
-<span class="sourceLineNo">275</span>      final FairQueue&lt;T&gt; fairq, final AvlKeyComparator&lt;TNode&gt; comparator) {<a name="line.275"></a>
-<span class="sourceLineNo">276</span>    while (treeMap != null) {<a name="line.276"></a>
-<span class="sourceLineNo">277</span>      Queue&lt;T&gt; node = AvlTree.getFirst(treeMap);<a name="line.277"></a>
-<span class="sourceLineNo">278</span>      treeMap = AvlTree.remove(treeMap, node.getKey(), comparator);<a name="line.278"></a>
-<span class="sourceLineNo">279</span>      if (fairq != null) removeFromRunQueue(fairq, node);<a name="line.279"></a>
-<span class="sourceLineNo">280</span>    }<a name="line.280"></a>
-<span class="sourceLineNo">281</span>  }<a name="line.281"></a>
-<span class="sourceLineNo">282</span><a name="line.282"></a>
-<span class="sourceLineNo">283</span>  private int queueSize(Queue&lt;?&gt; head) {<a name="line.283"></a>
-<span class="sourceLineNo">284</span>    int count = 0;<a name="line.284"></a>
-<span class="sourceLineNo">285</span>    AvlTreeIterator&lt;Queue&lt;?&gt;&gt; iter = new AvlTreeIterator&lt;Queue&lt;?&gt;&gt;(head);<a name="line.285"></a>
-<span class="sourceLineNo">286</span>    while (iter.hasNext()) {<a name="line.286"></a>
-<span class="sourceLineNo">287</span>      count += iter.next().size();<a name="line.287"></a>
-<span class="sourceLineNo">288</span>    }<a name="line.288"></a>
-<span class="sourceLineNo">289</span>    return count;<a name="line.289"></a>
-<span class="sourceLineNo">290</span>  }<a name="line.290"></a>
-<span class="sourceLineNo">291</span><a name="line.291"></a>
-<span class="sourceLineNo">292</span>  @Override<a name="line.292"></a>
-<span class="sourceLineNo">293</span>  protected int queueSize() {<a name="line.293"></a>
-<span class="sourceLineNo">294</span>    int count = 0;<a name="line.294"></a>
-<span class="sourceLineNo">295</span>    for (ServerQueue serverMap : serverBuckets) {<a name="line.295"></a>
-<span class="sourceLineNo">296</span>      count += queueSize(serverMap);<a name="line.296"></a>
-<span class="sourceLineNo">297</span>    }<a name="line.297"></a>
-<span class="sourceLineNo">298</span>    count += queueSize(tableMap);<a name="line.298"></a>
-<span class="sourceLineNo">299</span>    count += queueSize(peerMap);<a name="line.299"></a>
-<span class="sourceLineNo">300</span>    count += queueSize(metaMap);<a name="line.300"></a>
+<span class="sourceLineNo">249</span>      return locking.getLockResource(resourceType, resourceName);<a name="line.249"></a>
+<span class="sourceLineNo">250</span>    } finally {<a name="line.250"></a>
+<span class="sourceLineNo">251</span>      schedUnlock();<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>  @Override<a name="line.255"></a>
+<span class="sourceLineNo">256</span>  public void clear() {<a name="line.256"></a>
+<span class="sourceLineNo">257</span>    schedLock();<a name="line.257"></a>
+<span class="sourceLineNo">258</span>    try {<a name="line.258"></a>
+<span class="sourceLineNo">259</span>      clearQueue();<a name="line.259"></a>
+<span class="sourceLineNo">260</span>      locking.clear();<a name="line.260"></a>
+<span class="sourceLineNo">261</span>    } finally {<a name="line.261"></a>
+<span class="sourceLineNo">262</span>      schedUnlock();<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><a name="line.265"></a>
+<span class="sourceLineNo">266</span>  private void clearQueue() {<a name="line.266"></a>
+<span class="sourceLineNo">267</span>    // Remove Servers<a name="line.267"></a>
+<span class="sourceLineNo">268</span>    for (int i = 0; i &lt; serverBuckets.length; ++i) {<a name="line.268"></a>
+<span class="sourceLineNo">269</span>      clear(serverBuckets[i], serverRunQueue, SERVER_QUEUE_KEY_COMPARATOR);<a name="line.269"></a>
+<span class="sourceLineNo">270</span>      serverBuckets[i] = null;<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>    // Remove Tables<a name="line.273"></a>
+<span class="sourceLineNo">274</span>    clear(tableMap, tableRunQueue, TABLE_QUEUE_KEY_COMPARATOR);<a name="line.274"></a>
+<span class="sourceLineNo">275</span>    tableMap = null;<a name="line.275"></a>
+<span class="sourceLineNo">276</span><a name="line.276"></a>
+<span class="sourceLineNo">277</span>    // Remove Peers<a name="line.277"></a>
+<span class="sourceLineNo">278</span>    clear(peerMap, peerRunQueue, PEER_QUEUE_KEY_COMPARATOR);<a name="line.278"></a>
+<span class="sourceLineNo">279</span>    peerMap = null;<a name="line.279"></a>
+<span class="sourceLineNo">280</span><a name="line.280"></a>
+<span class="sourceLineNo">281</span>    assert size() == 0 : "expected queue size to be 0, got " + size();<a name="line.281"></a>
+<span class="sourceLineNo">282</span>  }<a name="line.282"></a>
+<span class="sourceLineNo">283</span><a name="line.283"></a>
+<span class="sourceLineNo">284</span>  private &lt;T extends Comparable&lt;T&gt;, TNode extends Queue&lt;T&gt;&gt; void clear(TNode treeMap,<a name="line.284"></a>
+<span class="sourceLineNo">285</span>      FairQueue&lt;T&gt; fairq, AvlKeyComparator&lt;TNode&gt; comparator) {<a name="line.285"></a>
+<span class="sourceLineNo">286</span>    while (treeMap != null) {<a name="line.286"></a>
+<span class="sourceLineNo">287</span>      Queue&lt;T&gt; node = AvlTree.getFirst(treeMap);<a name="line.287"></a>
+<span class="sourceLineNo">288</span>      treeMap = AvlTree.remove(treeMap, node.getKey(), comparator);<a name="line.288"></a>
+<span class="sourceLineNo">289</span>      if (fairq != null) {<a name="line.289"></a>
+<span class="sourceLineNo">290</span>        removeFromRunQueue(fairq, node, () -&gt; "clear all queues");<a name="line.290"></a>
+<span class="sourceLineNo">291</span>      }<a name="line.291"></a>
+<span class="sourceLineNo">292</span>    }<a name="line.292"></a>
+<span class="sourceLineNo">293</span>  }<a name="line.293"></a>
+<span class="sourceLineNo">294</span><a name="line.294"></a>
+<span class="sourceLineNo">295</span>  private int queueSize(Queue&lt;?&gt; head) {<a name="line.295"></a>
+<span class="sourceLineNo">296</span>    int count = 0;<a name="line.296"></a>
+<span class="sourceLineNo">297</span>    AvlTreeIterator&lt;Queue&lt;?&gt;&gt; iter = new AvlTreeIterator&lt;Queue&lt;?&gt;&gt;(head);<a name="line.297"></a>
+<span class="sourceLineNo">298</span>    while (iter.hasNext()) {<a name="line.298"></a>
+<span class="sourceLineNo">299</span>      count += iter.next().size();<a name="line.299"></a>
+<span class="sourceLineNo">300</span>    }<a name="line.300"></a>
 <span class="sourceLineNo">301</span>    return count;<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>  @Override<a name="line.304"></a>
-<span class="sourceLineNo">305</span>  public void completionCleanup(final Procedure proc) {<a name="line.305"></a>
-<span class="sourceLineNo">306</span>    if (proc instanceof TableProcedureInterface) {<a name="line.306"></a>
-<span class="sourceLineNo">307</span>      TableProcedureInterface iProcTable = (TableProcedureInterface) proc;<a name="line.307"></a>
-<span class="sourceLineNo">308</span>      boolean tableDeleted;<a name="line.308"></a>
-<span class="sourceLineNo">309</span>      if (proc.hasException()) {<a name="line.309"></a>
-<span class="sourceLineNo">310</span>        Exception procEx = proc.getException().unwrapRemoteException();<a name="line.310"></a>
-<span class="sourceLineNo">311</span>        if (iProcTable.getTableOperationType() == TableOperationType.CREATE) {<a name="line.311"></a>
-<span class="sourceLineNo">312</span>          // create failed because the table already exist<a name="line.312"></a>
-<span class="sourceLineNo">313</span>          tableDeleted = !(procEx instanceof TableExistsException);<a name="line.313"></a>
-<span class="sourceLineNo">314</span>        } else {<a name="line.314"></a>
-<span class="sourceLineNo">315</span>          // the operation failed because the table does not exist<a name="line.315"></a>
-<span class="sourceLineNo">316</span>          tableDeleted = (procEx instanceof TableNotFoundException);<a name="line.316"></a>
-<span class="sourceLineNo">317</span>        }<a name="line.317"></a>
-<span class="sourceLineNo">318</span>      } else {<a name="line.318"></a>
-<span class="sourceLineNo">319</span>        // the table was deleted<a name="line.319"></a>
-<span class="sourceLineNo">320</span>        tableDeleted = (iProcTable.getTableOperationType() == TableOperationType.DELETE);<a name="line.320"></a>
-<span class="sourceLineNo">321</span>      }<a name="line.321"></a>
-<span class="sourceLineNo">322</span>      if (tableDeleted) {<a name="line.322"></a>
-<span class="sourceLineNo">323</span>        markTableAsDeleted(iProcTable.getTableName(), proc);<a name="line.323"></a>
-<span class="sourceLineNo">324</span>        return;<a name="line.324"></a>
-<span class="sourceLineNo">325</span>      }<a name="line.325"></a>
-<span class="sourceLineNo">326</span>    } else if (proc instanceof PeerProcedureInterface) {<a name="line.326"></a>
-<span class="sourceLineNo">327</span>      tryCleanupPeerQueue(getPeerId(proc), proc);<a name="line.327"></a>
-<span class="sourceLineNo">328</span>    } else if (proc instanceof ServerProcedureInterface) {<a name="line.328"></a>
-<span class="sourceLineNo">329</span>      tryCleanupServerQueue(getServerName(proc), proc);<a name="line.329"></a>
-<span class="sourceLineNo">330</span>    } else {<a name="line.330"></a>
-<span class="sourceLineNo">331</span>      // No cleanup for other procedure types, yet.<a name="line.331"></a>
-<span class="sourceLineNo">332</span>      return;<a name="line.332"></a>
-<span class="sourceLineNo">333</span>    }<a name="line.333"></a>
-<span class="sourceLineNo">334</span>  }<a name="line.334"></a>
-<span class="sourceLineNo">335</span><a name="line.335"></a>
-<span class="sourceLineNo">336</span>  private static &lt;T extends Comparable&lt;T&gt;&gt; void addToRunQueue(FairQueue&lt;T&gt; fairq, Queue&lt;T&gt; queue) {<a name="line.336"></a>
-<span class="sourceLineNo">337</span>    if (!AvlIterableList.isLinked(queue) &amp;&amp; !queue.isEmpty()) {<a name="line.337"></a>
-<span class="sourceLineNo">338</span>      fairq.add(queue);<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>  private static &lt;T extends Comparable&lt;T&gt;&gt; void removeFromRunQueue(<a name="line.342"></a>
-<span class="sourceLineNo">343</span>      FairQueue&lt;T&gt; fairq, Queue&lt;T&gt; queue) {<a name="line.343"></a>
-<span class="sourceLineNo">344</span>    if (AvlIterableList.isLinked(queue)) {<a name="line.344"></a>
-<span class="sourceLineNo">345</span>      fairq.remove(queue);<a name="line.345"></a>
-<span class="sourceLineNo">346</span>    }<a name="line.346"></a>
-<span class="sourceLineNo">347</span>  }<a name="line.347"></a>
-<span class="sourceLineNo">348</span><a name="line.348"></a>
-<span class="sourceLineNo">349</span>  // ============================================================================<a name="line.349"></a>
-<span class="sourceLineNo">350</span>  //  Table Queue Lookup Helpers<a name="line.350"></a>
-<span class="sourceLineNo">351</span>  // ============================================================================<a name="line.351"></a>
-<span class="sourceLineNo">352</span>  private TableQueue getTableQueue(TableName tableName) {<a name="line.352"></a>
-<span class="sourceLineNo">353</span>    TableQueue node = AvlTree.get(tableMap, tableName, TABLE_QUEUE_KEY_COMPARATOR);<a name="line.353"></a>
-<span class="sourceLineNo">354</span>    if (node != null) return node;<a name="line.354"></a>
-<span class="sourceLineNo">355</span><a name="line.355"></a>
-<span class="sourceLineNo">356</span>    node = new TableQueue(tableName, MasterProcedureUtil.getTablePriority(tableName),<a name="line.356"></a>
-<span class="sourceLineNo">357</span>        locking.getTableLock(tableName), locking.getNamespaceLock(tableName.getNamespaceAsString()));<a name="line.357"></a>
-<span class="sourceLineNo">358</span>    tableMap = AvlTree.insert(tableMap, node);<a name="line.358"></a>
-<span class="sourceLineNo">359</span>    return node;<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>  private void removeTableQueue(TableName tableName) {<a name="line.362"></a>
-<span class="sourceLineNo">363</span>    tableMap = AvlTree.remove(tableMap, tableName, TABLE_QUEUE_KEY_COMPARATOR);<a name="line.363"></a>
-<span class="sourceLineNo">364</span>    locking.removeTableLock(tableName);<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>  private static boolean isTableProcedure(Procedure&lt;?&gt; proc) {<a name="line.367"></a>
-<span class="sourceLineNo">368</span>    return proc instanceof TableProcedureInterface;<a name="line.368"></a>
-<span class="sourceLineNo">369</span>  }<a name="line.369"></a>
-<span class="sourceLineNo">370</span><a name="line.370"></a>
-<span class="sourceLineNo">371</span>  private static TableName getTableName(Procedure&lt;?&gt; proc) {<a name="line.371"></a>
-<span class="sourceLineNo">372</span>    return ((TableProcedureInterface)proc).getTableName();<a name="line.372"></a>
-<span class="sourceLineNo">373</span>  }<a name="line.373"></a>
+<span class="sourceLineNo">305</span>  protected int queueSize() {<a name="line.305"></a>
+<span class="sourceLineNo">306</span>    int count = 0;<a name="line.306"></a>
+<span class="sourceLineNo">307</span>    for (ServerQueue serverMap : serverBuckets) {<a name="line.307"></a>
+<span class="sourceLineNo">308</span>      count += queueSize(serverMap);<a name="line.308"></a>
+<span class="sourceLineNo">309</span>    }<a name="line.309"></a>
+<span class="sourceLineNo">310</span>    count += queueSize(tableMap);<a name="line.310"></a>
+<span class="sourceLineNo">311</span>    count += queueSize(peerMap);<a name="line.311"></a>
+<span class="sourceLineNo">312</span>    count += queueSize(metaMap);<a name="line.312"></a>
+<span class="sourceLineNo">313</span>    return count;<a name="line.313"></a>
+<span class="sourceLineNo">314</span>  }<a name="line.314"></a>
+<span class="sourceLineNo">315</span><a name="line.315"></a>
+<span class="sourceLineNo">316</span>  @Override<a name="line.316"></a>
+<span class="sourceLineNo">317</span>  public void completionCleanup(final Procedure proc) {<a name="line.317"></a>
+<span class="sourceLineNo">318</span>    if (proc instanceof TableProcedureInterface) {<a name="line.318"></a>
+<span class="sourceLineNo">319</span>      TableProcedureInterface iProcTable = (TableProcedureInterface) proc;<a name="line.319"></a>
+<span class="sourceLineNo">320</span>      boolean tableDeleted;<a name="line.320"></a>
+<span class="sourceLineNo">321</span>      if (proc.hasException()) {<a name="line.321"></a>
+<span class="sourceLineNo">322</span>        Exception procEx = proc.getException().unwrapRemoteException();<a name="line.322"></a>
+<span class="sourceLineNo">323</span>        if (iProcTable.getTableOperationType() == TableOperationType.CREATE) {<a name="line.323"></a>
+<span class="sourceLineNo">324</span>          // create failed because the table already exist<a name="line.324"></a>
+<span class="sourceLineNo">325</span>          tableDeleted = !(procEx instanceof TableExistsException);<a name="line.325"></a>
+<span class="sourceLineNo">326</span>        } else {<a name="line.326"></a>
+<span class="sourceLineNo">327</span>          // the operation failed because the table does not exist<a name="line.327"></a>
+<span class="sourceLineNo">328</span>          tableDeleted = (procEx instanceof TableNotFoundException);<a name="line.328"></a>
+<span class="sourceLineNo">329</span>        }<a name="line.329"></a>
+<span class="sourceLineNo">330</span>      } else {<a name="line.330"></a>
+<span class="sourceLineNo">331</span>        // the table was deleted<a name="line.331"></a>
+<span class="sourceLineNo">332</span>        tableDeleted = (iProcTable.getTableOperationType() == TableOperationType.DELETE);<a name="line.332"></a>
+<span class="sourceLineNo">333</span>      }<a name="line.333"></a>
+<span class="sourceLineNo">334</span>      if (tableDeleted) {<a name="line.334"></a>
+<span class="sourceLineNo">335</span>        markTableAsDeleted(iProcTable.getTableName(), proc);<a name="line.335"></a>
+<span class="sourceLineNo">336</span>        return;<a name="line.336"></a>
+<span class="sourceLineNo">337</span>      }<a name="line.337"></a>
+<span class="sourceLineNo">338</span>    } else if (proc instanceof PeerProcedureInterface) {<a name="line.338"></a>
+<span class="sourceLineNo">339</span>      tryCleanupPeerQueue(getPeerId(proc), proc);<a name="line.339"></a>
+<span class="sourceLineNo">340</span>    } else if (proc instanceof ServerProcedureInterface) {<a name="line.340"></a>
+<span class="sourceLineNo">341</span>      tryCleanupServerQueue(getServerName(proc), proc);<a name="line.341"></a>
+<span class="sourceLineNo">342</span>    } else {<a name="line.342"></a>
+<span class="sourceLineNo">343</span>      // No cleanup for other procedure types, yet.<a name="line.343"></a>
+<span class="sourceLineNo">344</span>      return;<a name="line.344"></a>
+<span class="sourceLineNo">345</span>    }<a name="line.345"></a>
+<span class="sourceLineNo">346</span>  }<a name="line.346"></a>
+<span class="sourceLineNo">347</span><a name="line.347"></a>
+<span class="sourceLineNo">348</span>  private static &lt;T extends Comparable&lt;T&gt;&gt; void addToRunQueue(FairQueue&lt;T&gt; fairq, Queue&lt;T&gt; queue,<a name="line.348"></a>
+<span class="sourceLineNo">349</span>      Supplier&lt;String&gt; reason) {<a name="line.349"></a>
+<span class="sourceLineNo">350</span>    if (LOG.isDebugEnabled()) {<a name="line.350"></a>
+<span class="sourceLineNo">351</span>      LOG.debug("Add {} to run queue because: {}", queue, reason.get());<a name="line.351"></a>
+<span class="sourceLineNo">352</span>    }<a name="line.352"></a>
+<span class="sourceLineNo">353</span>    if (!AvlIterableList.isLinked(queue) &amp;&amp; !queue.isEmpty()) {<a name="line.353"></a>
+<span class="sourceLineNo">354</span>      fairq.add(queue);<a name="line.354"></a>
+<span class="sourceLineNo">355</span>    }<a name="line.355"></a>
+<span class="sourceLineNo">356</span>  }<a name="line.356"></a>
+<span class="sourceLineNo">357</span><a name="line.357"></a>
+<span class="sourceLineNo">358</span>  private static &lt;T extends Comparable&lt;T&gt;&gt; void removeFromRunQueue(FairQueue&lt;T&gt; fairq,<a name="line.358"></a>
+<span class="sourceLineNo">359</span>      Queue&lt;T&gt; queue, Supplier&lt;String&gt; reason) {<a name="line.359"></a>
+<span class="sourceLineNo">360</span>    if (LOG.isDebugEnabled()) {<a name="line.360"></a>
+<span class="sourceLineNo">361</span>      LOG.debug("Remove {} from run queue because: {}", queue, reason.get());<a name="line.361"></a>
+<span class="sourceLineNo">362</span>    }<a name="line.362"></a>
+<span class="sourceLineNo">363</span>    if (AvlIterableList.isLinked(queue)) {<a name="line.363"></a>
+<span class="sourceLineNo">364</span>      fairq.remove(queue);<a name="line.364"></a>
+<span class="sourceLineNo">365</span>    }<a name="line.365"></a>
+<span class="sourceLineNo">366</span>  }<a name="line.366"></a>
+<span class="sourceLineNo">367</span><a name="line.367"></a>
+<span class="sourceLineNo">368</span>  // ============================================================================<a name="line.368"></a>
+<span class="sourceLineNo">369</span>  //  Table Queue Lookup Helpers<a name="line.369"></a>
+<span class="sourceLineNo">370</span>  // ============================================================================<a name="line.370"></a>
+<span class="sourceLineNo">371</span>  private TableQueue getTableQueue(TableName tableName) {<a name="line.371"></a>
+<span class="sourceLineNo">372</span>    TableQueue node = AvlTree.get(tableMap, tableName, TABLE_QUEUE_KEY_COMPARATOR);<a name="line.372"></a>
+<span class="sourceLineNo">373</span>    if (node != null) return node;<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>  //  Server Queue Lookup Helpers<a name="line.376"></a>
-<span class="sourceLineNo">377</span>  // ============================================================================<a name="line.377"></a>
-<span class="sourceLineNo">378</span>  private ServerQueue getServerQueue(ServerName serverName, ServerProcedureInterface proc) {<a name="line.378"></a>
-<span class="sourceLineNo">379</span>    final int index = getBucketIndex(serverBuckets, serverName.hashCode());<a name="line.379"></a>
-<span class="sourceLineNo">380</span>    ServerQueue node = AvlTree.get(serverBuckets[index], serverName, SERVER_QUEUE_KEY_COMPARATOR);<a name="line.380"></a>
-<span class="sourceLineNo">381</span>    if (node != null) {<a name="line.381"></a>
-<span class="sourceLineNo">382</span>      return node;<a name="line.382"></a>
-<span class="sourceLineNo">383</span>    }<a name="line.383"></a>
-<span class="sourceLineNo">384</span>    int priority;<a name="line.384"></a>
-<span class="sourceLineNo">385</span>    if (proc != null) {<a name="line.385"></a>
-<span class="sourceLineNo">386</span>      priority = MasterProcedureUtil.getServerPriority(proc);<a name="line.386"></a>
-<span class="sourceLineNo">387</span>    } else {<a name="line.387"></a>
-<span class="sourceLineNo">388</span>      priority = 1;<a name="line.388"></a>
-<span class="sourceLineNo">389</span>    }<a name="line.389"></a>
-<span class="sourceLineNo">390</span>    node = new ServerQueue(serverName, priority, locking.getServerLock(serverName));<a name="line.390"></a>
-<span class="sourceLineNo">391</span>    serverBuckets[index] = AvlTree.insert(serverBuckets[index], node);<a name="line.391"></a>
-<span class="sourceLineNo">392</span>    return node;<a name="line.392"></a>
-<span class="sourceLineNo">393</span>  }<a name="line.393"></a>
-<span class="sourceLineNo">394</span><a name="line.394"></a>
-<span class="sourceLineNo">395</span>  private void removeServerQueue(ServerName serverName) {<a name="line.395"></a>
-<span class="sourceLineNo">396</span>    int index = getBucketIndex(serverBuckets, serverName.hashCode());<a name="line.396"></a>
-<span class="sourceLineNo">397</span>    serverBuckets[index] =<a name="line.397"></a>
-<span class="sourceLineNo">398</span>      AvlTree.remove(serverBuckets[index], serverName, SERVER_QUEUE_KEY_COMPARATOR);<a name="line.398"></a>
-<span class="sourceLineNo">399</span>    locking.removeServerLock(serverName);<a name="line.399"></a>
-<span class="sourceLineNo">400</span>  }<a name="line.400"></a>
-<span class="sourceLineNo">401</span><a name="line.401"></a>
-<span class="sourceLineNo">402</span>  private void tryCleanupServerQueue(ServerName serverName, Procedure&lt;?&gt; proc) {<a name="line.402"></a>
-<span class="sourceLineNo">403</span>    schedLock();<a name="line.403"></a>
-<span class="sourceLineNo">404</span>    try {<a name="line.404"></a>
-<span class="sourceLineNo">405</span>      int index = getBucketIndex(serverBuckets, serverName.hashCode());<a name="line.405"></a>
-<span class="sourceLineNo">406</span>      ServerQueue node = AvlTree.get(serverBuckets[index], serverName, SERVER_QUEUE_KEY_COMPARATOR);<a name="line.406"></a>
-<span class="sourceLineNo">407</span>      if (node == null) {<a name="line.407"></a>
-<span class="sourceLineNo">408</span>        return;<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>      LockAndQueue lock = locking.getServerLock(serverName);<a name="line.411"></a>
-<span class="sourceLineNo">412</span>      if (node.isEmpty() &amp;&amp; lock.tryExclusiveLock(proc)) {<a name="line.412"></a>
-<span class="sourceLineNo">413</span>        removeFromRunQueue(serverRunQueue, node);<a name="line.413"></a>
-<span class="sourceLineNo">414</span>        removeServerQueue(serverName);<a name="line.414"></a>
-<span class="sourceLineNo">415</span>      }<a name="line.415"></a>
-<span class="sourceLineNo">416</span>    } finally {<a name="line.416"></a>
-<span class="sourceLineNo">417</span>      schedUnlock();<a name="line.417"></a>
-<span class="sourceLineNo">418</span>    }<a name="line.418"></a>
+<span class="sourceLineNo">375</span>    node = new TableQueue(tableName, MasterProcedureUtil.getTablePriority(tableName),<a name="line.375"></a>
+<span class="sourceLineNo">376</span>        locking.getTableLock(tableName), locking.getNamespaceLock(tableName.getNamespaceAsString()));<a name="line.376"></a>
+<span class="sourceLineNo">377</span>    tableMap = AvlTree.insert(tableMap, node);<a name="line.377"></a>
+<span class="sourceLineNo">378</span>    return node;<a name="line.378"></a>
+<span class="sourceLineNo">379</span>  }<a name="line.379"></a>
+<span class="sourceLineNo">380</span><a name="line.380"></a>
+<span class="sourceLineNo">381</span>  private void removeTableQueue(TableName tableName) {<a name="line.381"></a>
+<span class="sourceLineNo">382</span>    tableMap = AvlTree.remove(tableMap, tableName, TABLE_QUEUE_KEY_COMPARATOR);<a name="line.382"></a>
+<span class="sourceLineNo">383</span>    locking.removeTableLock(tableName);<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>  private static boolean isTableProcedure(Procedure&lt;?&gt; proc) {<a name="line.386"></a>
+<span class="sourceLineNo">387</span>    return proc instanceof TableProcedureInterface;<a name="line.387"></a>
+<span class="sourceLineNo">388</span>  }<a name="line.388"></a>
+<span class="sourceLineNo">389</span><a name="line.389"></a>
+<span class="sourceLineNo">390</span>  private static TableName getTableName(Procedure&lt;?&gt; proc) {<a name="line.390"></a>
+<span class="sourceLineNo">391</span>    return ((TableProcedureInterface)proc).getTableName();<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>  //  Server Queue Lookup Helpers<a name="line.395"></a>
+<span class="sourceLineNo">396</span>  // ============================================================================<a name="line.396"></a>
+<span class="sourceLineNo">397</span>  private ServerQueue getServerQueue(ServerName serverName, ServerProcedureInterface proc) {<a name="line.397"></a>
+<span class="sourceLineNo">398</span>    final int index = getBucketIndex(serverBuckets, serverName.hashCode());<a name="line.398"></a>
+<span class="sourceLineNo">399</span>    ServerQueue node = AvlTree.get(serverBuckets[index], serverName, SERVER_QUEUE_KEY_COMPARATOR);<a name="line.399"></a>
+<span class="sourceLineNo">400</span>    if (node != null) {<a name="line.400"></a>
+<span class="sourceLineNo">401</span>      return node;<a name="line.401"></a>
+<span class="sourceLineNo">402</span>    }<a name="line.402"></a>
+<span class="sourceLineNo">403</span>    int priority;<a name="line.403"></a>
+<span class="sourceLineNo">404</span>    if (proc != null) {<a name="line.404"></a>
+<span class="sourceLineNo">405</span>      priority = MasterProcedureUtil.getServerPriority(proc);<a name="line.405"></a>
+<span class="sourceLineNo">406</span>    } else {<a name="line.406"></a>
+<span class="sourceLineNo">407</span>      priority = 1;<a name="line.407"></a>
+<span class="sourceLineNo">408</span>    }<a name="line.408"></a>
+<span class="sourceLineNo">409</span>    node = new ServerQueue(serverName, priority, locking.getServerLock(serverName));<a name="line.409"></a>
+<span class="sourceLineNo">410</span>    serverBuckets[index] = AvlTree.insert(serverBuckets[index], node);<a name="line.410"></a>
+<span class="sourceLineNo">411</span>    return node;<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>  private void removeServerQueue(ServerName serverName) {<a name="line.414"></a>
+<span class="sourceLineNo">415</span>    int index = getBucketIndex(serverBuckets, serverName.hashCode());<a name="line.415"></a>
+<span class="sourceLineNo">416</span>    serverBuckets[index] =<a name="line.416"></a>
+<span class="sourceLineNo">417</span>      AvlTree.remove(serverBuckets[index], serverName, SERVER_QUEUE_KEY_COMPARATOR);<a name="line.417"></a>
+<span class="sourceLineNo">418</span>    locking.removeServerLock(serverName);<a name="line.418"></a>
 <span class="sourceLineNo">419</span>  }<a name="line.419"></a>
 <span class="sourceLineNo">420</span><a name="line.420"></a>
-<span class="sourceLineNo">421</span>  private static int getBucketIndex(Object[] buckets, int hashCode) {<a name="line.421"></a>
-<span class="sourceLineNo">422</span>    return Math.abs(hashCode) % buckets.length;<a name="line.422"></a>
-<span class="sourceLineNo">423</span>  }<a name="line.423"></a>
-<span class="sourceLineNo">424</span><a name="line.424"></a>
-<span class="sourceLineNo">425</span>  private static boolean isServerProcedure(Procedure&lt;?&gt; proc) {<a name="line.425"></a>
-<span class="sourceLineNo">426</span>    return proc instanceof ServerProcedureInterface;<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>  private static ServerName getServerName(Procedure&lt;?&gt; proc) {<a name="line.429"></a>
-<span class="sourceLineNo">430</span>    return ((ServerProcedureInterface)proc).getServerName();<a name="line.430"></a>
-<span class="sourceLineNo">431</span>  }<a name="line.431"></a>
-<span class="sourceLineNo">432</span><a name="line.432"></a>
-<span class="sourceLineNo">433</span>  // ============================================================================<a name="line.433"></a>
-<span class="sourceLineNo">434</span>  //  Peer Queue Lookup Helpers<a name="line.434"></a>
-<span class="sourceLineNo">435</span>  // ============================================================================<a name="line.435"></a>
-<span class="sourceLineNo">436</span>  private PeerQueue getPeerQueue(String peerId) {<a name="line.436"></a>
-<span class="sourceLineNo">437</span>    PeerQueue node = AvlTree.get(peerMap, peerId, PEER_QUEUE_KEY_COMPARATOR);<a name="line.437"></a>
-<span class="sourceLineNo">438</span>    if (node != null) {<a name="line.438"></a>
-<span class="sourceLineNo">439</span>      return node;<a name="line.439"></a>
-<span class="sourceLineNo">440</span>    }<a name="line.440"></a>
-<span class="sourceLineNo">441</span>    node = new PeerQueue(peerId, locking.getPeerLock(peerId));<a name="line.441"></a>
-<span class="sourceLineNo">442</span>    peerMap = AvlTree.insert(peerMap, node);<a name="line.442"></a>
-<span class="sourceLineNo">443</span>    return node;<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>  private void removePeerQueue(String peerId) {<a name="line.446"></a>
-<span class="sourceLineNo">447</span>    peerMap = AvlTree.remove(peerMap, peerId, PEER_QUEUE_KEY_COMPARATOR);<a name="line.447"></a>
-<span class="sourceLineNo">448</span>    locking.removePeerLock(peerId);<a name="line.448"></a>
-<span class="sourceLineNo">449</span>  }<a name="line.449"></a>
-<span class="sourceLineNo">450</span><a name="line.450"></a>
-<span class="sourceLineNo">451</span>  private void tryCleanupPeerQueue(String peerId, Procedure&lt;?&gt; procedure) {<a name="line.451"></a>
-<span class="sourceLineNo">452</span>    schedLock();<a name="line.452"></a>
-<span class="sourceLineNo">453</span>    try {<a name="line.453"></a>
-<span class="sourceLineNo">454</span>      PeerQueue queue = AvlTree.get(peerMap, peerId, PEER_QUEUE_KEY_COMPARATOR);<a name="line.454"></a>
-<span class="sourceLineNo">455</span>      if (queue == null) {<a name="line.455"></a>
-<span class="sourceLineNo">456</span>        return;<a name="line.456"></a>
-<span class="sourceLineNo">457</span>      }<a name="line.457"></a>
-<span class="sourceLineNo">458</span><a name="line.458"></a>
-<span class="sourceLineNo">459</span>      final LockAndQueue lock = locking.getPeerLock(peerId);<a name="line.459"></a>
-<span class="sourceLineNo">460</span>      if (queue.isEmpty() &amp;&amp; lock.tryExclusiveLock(procedure)) {<a name="line.460"></a>
-<span class="sourceLineNo">461</span>        removeFromRunQueue(peerRunQueue, queue);<a name="line.461"></a>
-<span class="sourceLineNo">462</span>        removePeerQueue(peerId);<a name="line.462"></a>
-<span class="sourceLineNo">463</span>      }<a name="line.463"></a>
-<span class="sourceLineNo">464</span>    } finally {<a name="line.464"></a>
-<span class="sourceLineNo">465</span>      schedUnlock();<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><a name="line.468"></a>
-<span class="sourceLineNo">469</span>  private static boolean isPeerProcedure(Procedure&lt;?&gt; proc) {<a name="line.469"></a>
-<span class="sourceLineNo">470</span>    return proc instanceof PeerProcedureInterface;<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>  private static String getPeerId(Procedure&lt;?&gt; proc) {<a name="line.473"></a>
-<span class="sourceLineNo">474</span>    return ((PeerProcedureInterface) proc).getPeerId();<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>  //  Meta Queue Lookup Helpers<a name="line.478"></a>
-<span class="sourceLineNo">479</span>  // ============================================================================<a name="line.479"></a>
-<span class="sourceLineNo">480</span>  private MetaQueue getMetaQueue() {<a name="line.480"></a>
-<span class="sourceLineNo">481</span>    MetaQueue node = AvlTree.get(metaMap, TableName.META_TABLE_NAME, META_QUEUE_KEY_COMPARATOR);<a name="line.481"></a>
-<span class="sourceLineNo">482</span>    if (node != null) {<a name="line.482"></a>
-<span class="sourceLineNo">483</span>      return node;<a name="line.483"></a>
-<span class="sourceLineNo">484</span>    }<a name="line.484"></a>
-<span class="sourceLineNo">485</span>    node = new MetaQueue(locking.getMetaLock());<a name="line.485"></a>
-<span class="sourceLineNo">486</span>    metaMap = AvlTree.insert(metaMap, node);<a name="line.486"></a>
-<span class="sourceLineNo">487</span>    return node;<a name="line.487"></a>
+<span class="sourceLineNo">421</span>  private void tryCleanupServerQueue(ServerName serverName, Procedure&lt;?&gt; proc) {<a name="line.421"></a>
+<span class="sourceLineNo">422</span>    schedLock();<a name="line.422"></a>
+<span class="sourceLineNo">423</span>    try {<a name="line.423"></a>
+<span class="sourceLineNo">424</span>      int index = getBucketIndex(serverBuckets, serverName.hashCode());<a name="line.424"></a>
+<span class="sourceLineNo">425</span>      ServerQueue node = AvlTree.get(serverBuckets[index], serverName, SERVER_QUEUE_KEY_COMPARATOR);<a name="line.425"></a>
+<span class="sourceLineNo">426</span>      if (node == null) {<a name="line.426"></a>
+<span class="sourceLineNo">427</span>        return;<a name="line.427"></a>
+<span class="sourceLineNo">428</span>      }<a name="line.428"></a>
+<span class="sourceLineNo">429</span><a name="line.429"></a>
+<span class="sourceLineNo">430</span>      LockAndQueue lock = locking.getServerLock(serverName);<a name="line.430"></a>
+<span class="sourceLineNo">431</span>      if (node.isEmpty() &amp;&amp; lock.tryExclusiveLock(proc)) {<a name="line.431"></a>
+<span class="sourceLineNo">432</span>        removeFromRunQueue(serverRunQueue, node,<a name="line.432"></a>
+<span class="sourceLineNo">433</span>          () -&gt; "clean up server queue after " + proc + " completed");<a name="line.433"></a>
+<span class="sourceLineNo">434</span>        removeServerQueue(serverName);<a name="line.434"></a>
+<span class="sourceLineNo">435</span>      }<a name="line.435"></a>
+<span class="sourceLineNo">436</span>    } finally {<a name="line.436"></a>
+<span class="sourceLineNo">437</span>      schedUnlock();<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><a name="line.440"></a>
+<span class="sourceLineNo">441</span>  private static int getBucketIndex(Object[] buckets, int hashCode) {<a name="line.441"></a>
+<span class="sourceLineNo">442</span>    return Math.abs(hashCode) % buckets.length;<a name="line.442"></a>
+<span class="sourceLineNo">443</span>  }<a name="line.443"></a>
+<span class="sourceLineNo">444</span><a name="line.444"></a>
+<span class="sourceLineNo">445</span>  private static boolean isServerProcedure(Procedure&lt;?&gt; proc) {<a name="line.445"></a>
+<span class="sourceLineNo">446</span>    return proc instanceof ServerProcedureInterface;<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>  private static ServerName getServerName(Procedure&lt;?&gt; proc) {<a name="line.449"></a>
+<span class="sourceLineNo">450</span>    return ((ServerProcedureInterface)proc).getServerName();<a name="line.450"></a>
+<span class="sourceLineNo">451</span>  }<a name="line.451"></a>
+<span class="sourceLineNo">452</span><a name="line.452"></a>
+<span class="sourceLineNo">453</span>  // ============================================================================<a name="line.453"></a>
+<span class="sourceLineNo">454</span>  //  Peer Queue Lookup Helpers<a name="line.454"></a>
+<span class="sourceLineNo">455</span>  // ============================================================================<a name="line.455"></a>


<TRUNCATED>

[17/29] hbase-site git commit: Published site at 5e84997f2ffdbcf5f849d70c30ddbe2db4039ca4.

Posted by gi...@apache.org.
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/27f5bfb5/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 dd0dd0f..9fd7e0b 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
@@ -975,1128 +975,1136 @@
 <span class="sourceLineNo">967</span>        store.update(procedure);<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>      // If we don't have the lock, we can't re-submit the queue,<a name="line.970"></a>
-<span class="sourceLineNo">971</span>      // since it is already executing. To get rid of the stuck situation, we<a name="line.971"></a>
-<span class="sourceLineNo">972</span>      // need to restart the master. With the procedure set to bypass, the procedureExecutor<a name="line.972"></a>
-<span class="sourceLineNo">973</span>      // will bypass it and won't get stuck again.<a name="line.973"></a>
-<span class="sourceLineNo">974</span>      if (lockEntry != null) {<a name="line.974"></a>
-<span class="sourceLineNo">975</span>        // add the procedure to run queue,<a name="line.975"></a>
-<span class="sourceLineNo">976</span>        scheduler.addFront(procedure);<a name="line.976"></a>
-<span class="sourceLineNo">977</span>        LOG.debug("Bypassing {} and its ancestors successfully, adding to queue", procedure);<a name="line.977"></a>
-<span class="sourceLineNo">978</span>      } else {<a name="line.978"></a>
-<span class="sourceLineNo">979</span>        LOG.debug("Bypassing {} and its ancestors successfully, but since it is already running, "<a name="line.979"></a>
-<span class="sourceLineNo">980</span>            + "skipping add to queue", procedure);<a name="line.980"></a>
-<span class="sourceLineNo">981</span>      }<a name="line.981"></a>
-<span class="sourceLineNo">982</span>      return true;<a name="line.982"></a>
-<span class="sourceLineNo">983</span><a name="line.983"></a>
-<span class="sourceLineNo">984</span>    } finally {<a name="line.984"></a>
-<span class="sourceLineNo">985</span>      if (lockEntry != null) {<a name="line.985"></a>
-<span class="sourceLineNo">986</span>        procExecutionLock.releaseLockEntry(lockEntry);<a name="line.986"></a>
-<span class="sourceLineNo">987</span>      }<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><a name="line.990"></a>
-<span class="sourceLineNo">991</span>  /**<a name="line.991"></a>
-<span class="sourceLineNo">992</span>   * Add a new root-procedure to the executor.<a name="line.992"></a>
-<span class="sourceLineNo">993</span>   * @param proc the new procedure to execute.<a name="line.993"></a>
-<span class="sourceLineNo">994</span>   * @param nonceKey the registered unique identifier for this operation from the client or process.<a name="line.994"></a>
-<span class="sourceLineNo">995</span>   * @return the procedure id, that can be used to monitor the operation<a name="line.995"></a>
-<span class="sourceLineNo">996</span>   */<a name="line.996"></a>
-<span class="sourceLineNo">997</span>  @edu.umd.cs.findbugs.annotations.SuppressWarnings(value="NP_NULL_ON_SOME_PATH",<a name="line.997"></a>
-<span class="sourceLineNo">998</span>      justification = "FindBugs is blind to the check-for-null")<a name="line.998"></a>
-<span class="sourceLineNo">999</span>  public long submitProcedure(Procedure&lt;TEnvironment&gt; proc, NonceKey nonceKey) {<a name="line.999"></a>
-<span class="sourceLineNo">1000</span>    Preconditions.checkArgument(lastProcId.get() &gt;= 0);<a name="line.1000"></a>
-<span class="sourceLineNo">1001</span><a name="line.1001"></a>
-<span class="sourceLineNo">1002</span>    prepareProcedure(proc);<a name="line.1002"></a>
-<span class="sourceLineNo">1003</span><a name="line.1003"></a>
-<span class="sourceLineNo">1004</span>    final Long currentProcId;<a name="line.1004"></a>
-<span class="sourceLineNo">1005</span>    if (nonceKey != null) {<a name="line.1005"></a>
-<span class="sourceLineNo">1006</span>      currentProcId = nonceKeysToProcIdsMap.get(nonceKey);<a name="line.1006"></a>
-<span class="sourceLineNo">1007</span>      Preconditions.checkArgument(currentProcId != null,<a name="line.1007"></a>
-<span class="sourceLineNo">1008</span>        "Expected nonceKey=" + nonceKey + " to be reserved, use registerNonce(); proc=" + proc);<a name="line.1008"></a>
-<span class="sourceLineNo">1009</span>    } else {<a name="line.1009"></a>
-<span class="sourceLineNo">1010</span>      currentProcId = nextProcId();<a name="line.1010"></a>
-<span class="sourceLineNo">1011</span>    }<a name="line.1011"></a>
-<span class="sourceLineNo">1012</span><a name="line.1012"></a>
-<span class="sourceLineNo">1013</span>    // Initialize the procedure<a name="line.1013"></a>
-<span class="sourceLineNo">1014</span>    proc.setNonceKey(nonceKey);<a name="line.1014"></a>
-<span class="sourceLineNo">1015</span>    proc.setProcId(currentProcId.longValue());<a name="line.1015"></a>
-<span class="sourceLineNo">1016</span><a name="line.1016"></a>
-<span class="sourceLineNo">1017</span>    // Commit the transaction<a name="line.1017"></a>
-<span class="sourceLineNo">1018</span>    store.insert(proc, null);<a name="line.1018"></a>
-<span class="sourceLineNo">1019</span>    LOG.debug("Stored {}", proc);<a name="line.1019"></a>
+<span class="sourceLineNo">970</span>      // If state of procedure is WAITING_TIMEOUT, we can directly submit it to the scheduler.<a name="line.970"></a>
+<span class="sourceLineNo">971</span>      // Instead we should remove it from timeout Executor queue and tranfer its state to RUNNABLE<a name="line.971"></a>
+<span class="sourceLineNo">972</span>      if (procedure.getState() == ProcedureState.WAITING_TIMEOUT) {<a name="line.972"></a>
+<span class="sourceLineNo">973</span>        LOG.debug("transform procedure {} from WAITING_TIMEOUT to RUNNABLE", procedure);<a name="line.973"></a>
+<span class="sourceLineNo">974</span>        if (timeoutExecutor.remove(procedure)) {<a name="line.974"></a>
+<span class="sourceLineNo">975</span>          LOG.debug("removed procedure {} from timeoutExecutor", procedure);<a name="line.975"></a>
+<span class="sourceLineNo">976</span>          timeoutExecutor.executeTimedoutProcedure(procedure);<a name="line.976"></a>
+<span class="sourceLineNo">977</span>        }<a name="line.977"></a>
+<span class="sourceLineNo">978</span>      } else if (lockEntry != null) {<a name="line.978"></a>
+<span class="sourceLineNo">979</span>        scheduler.addFront(procedure);<a name="line.979"></a>
+<span class="sourceLineNo">980</span>        LOG.debug("Bypassing {} and its ancestors successfully, adding to queue", procedure);<a name="line.980"></a>
+<span class="sourceLineNo">981</span>      } else {<a name="line.981"></a>
+<span class="sourceLineNo">982</span>        // If we don't have the lock, we can't re-submit the queue,<a name="line.982"></a>
+<span class="sourceLineNo">983</span>        // since it is already executing. To get rid of the stuck situation, we<a name="line.983"></a>
+<span class="sourceLineNo">984</span>        // need to restart the master. With the procedure set to bypass, the procedureExecutor<a name="line.984"></a>
+<span class="sourceLineNo">985</span>        // will bypass it and won't get stuck again.<a name="line.985"></a>
+<span class="sourceLineNo">986</span>        LOG.debug("Bypassing {} and its ancestors successfully, but since it is already running, "<a name="line.986"></a>
+<span class="sourceLineNo">987</span>            + "skipping add to queue",<a name="line.987"></a>
+<span class="sourceLineNo">988</span>          procedure);<a name="line.988"></a>
+<span class="sourceLineNo">989</span>      }<a name="line.989"></a>
+<span class="sourceLineNo">990</span>      return true;<a name="line.990"></a>
+<span class="sourceLineNo">991</span><a name="line.991"></a>
+<span class="sourceLineNo">992</span>    } finally {<a name="line.992"></a>
+<span class="sourceLineNo">993</span>      if (lockEntry != null) {<a name="line.993"></a>
+<span class="sourceLineNo">994</span>        procExecutionLock.releaseLockEntry(lockEntry);<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>  }<a name="line.997"></a>
+<span class="sourceLineNo">998</span><a name="line.998"></a>
+<span class="sourceLineNo">999</span>  /**<a name="line.999"></a>
+<span class="sourceLineNo">1000</span>   * Add a new root-procedure to the executor.<a name="line.1000"></a>
+<span class="sourceLineNo">1001</span>   * @param proc the new procedure to execute.<a name="line.1001"></a>
+<span class="sourceLineNo">1002</span>   * @param nonceKey the registered unique identifier for this operation from the client or process.<a name="line.1002"></a>
+<span class="sourceLineNo">1003</span>   * @return the procedure id, that can be used to monitor the operation<a name="line.1003"></a>
+<span class="sourceLineNo">1004</span>   */<a name="line.1004"></a>
+<span class="sourceLineNo">1005</span>  @edu.umd.cs.findbugs.annotations.SuppressWarnings(value="NP_NULL_ON_SOME_PATH",<a name="line.1005"></a>
+<span class="sourceLineNo">1006</span>      justification = "FindBugs is blind to the check-for-null")<a name="line.1006"></a>
+<span class="sourceLineNo">1007</span>  public long submitProcedure(Procedure&lt;TEnvironment&gt; proc, NonceKey nonceKey) {<a name="line.1007"></a>
+<span class="sourceLineNo">1008</span>    Preconditions.checkArgument(lastProcId.get() &gt;= 0);<a name="line.1008"></a>
+<span class="sourceLineNo">1009</span><a name="line.1009"></a>
+<span class="sourceLineNo">1010</span>    prepareProcedure(proc);<a name="line.1010"></a>
+<span class="sourceLineNo">1011</span><a name="line.1011"></a>
+<span class="sourceLineNo">1012</span>    final Long currentProcId;<a name="line.1012"></a>
+<span class="sourceLineNo">1013</span>    if (nonceKey != null) {<a name="line.1013"></a>
+<span class="sourceLineNo">1014</span>      currentProcId = nonceKeysToProcIdsMap.get(nonceKey);<a name="line.1014"></a>
+<span class="sourceLineNo">1015</span>      Preconditions.checkArgument(currentProcId != null,<a name="line.1015"></a>
+<span class="sourceLineNo">1016</span>        "Expected nonceKey=" + nonceKey + " to be reserved, use registerNonce(); proc=" + proc);<a name="line.1016"></a>
+<span class="sourceLineNo">1017</span>    } else {<a name="line.1017"></a>
+<span class="sourceLineNo">1018</span>      currentProcId = nextProcId();<a name="line.1018"></a>
+<span class="sourceLineNo">1019</span>    }<a name="line.1019"></a>
 <span class="sourceLineNo">1020</span><a name="line.1020"></a>
-<span class="sourceLineNo">1021</span>    // Add the procedure to the executor<a name="line.1021"></a>
-<span class="sourceLineNo">1022</span>    return pushProcedure(proc);<a name="line.1022"></a>
-<span class="sourceLineNo">1023</span>  }<a name="line.1023"></a>
+<span class="sourceLineNo">1021</span>    // Initialize the procedure<a name="line.1021"></a>
+<span class="sourceLineNo">1022</span>    proc.setNonceKey(nonceKey);<a name="line.1022"></a>
+<span class="sourceLineNo">1023</span>    proc.setProcId(currentProcId.longValue());<a name="line.1023"></a>
 <span class="sourceLineNo">1024</span><a name="line.1024"></a>
-<span class="sourceLineNo">1025</span>  /**<a name="line.1025"></a>
-<span class="sourceLineNo">1026</span>   * Add a set of new root-procedure to the executor.<a name="line.1026"></a>
-<span class="sourceLineNo">1027</span>   * @param procs the new procedures to execute.<a name="line.1027"></a>
-<span class="sourceLineNo">1028</span>   */<a name="line.1028"></a>
-<span class="sourceLineNo">1029</span>  // TODO: Do we need to take nonces here?<a name="line.1029"></a>
-<span class="sourceLineNo">1030</span>  public void submitProcedures(Procedure&lt;TEnvironment&gt;[] procs) {<a name="line.1030"></a>
-<span class="sourceLineNo">1031</span>    Preconditions.checkArgument(lastProcId.get() &gt;= 0);<a name="line.1031"></a>
-<span class="sourceLineNo">1032</span>    if (procs == null || procs.length &lt;= 0) {<a name="line.1032"></a>
-<span class="sourceLineNo">1033</span>      return;<a name="line.1033"></a>
-<span class="sourceLineNo">1034</span>    }<a name="line.1034"></a>
-<span class="sourceLineNo">1035</span><a name="line.1035"></a>
-<span class="sourceLineNo">1036</span>    // Prepare procedure<a name="line.1036"></a>
-<span class="sourceLineNo">1037</span>    for (int i = 0; i &lt; procs.length; ++i) {<a name="line.1037"></a>
-<span class="sourceLineNo">1038</span>      prepareProcedure(procs[i]).setProcId(nextProcId());<a name="line.1038"></a>
-<span class="sourceLineNo">1039</span>    }<a name="line.1039"></a>
-<span class="sourceLineNo">1040</span><a name="line.1040"></a>
-<span class="sourceLineNo">1041</span>    // Commit the transaction<a name="line.1041"></a>
-<span class="sourceLineNo">1042</span>    store.insert(procs);<a name="line.1042"></a>
-<span class="sourceLineNo">1043</span>    if (LOG.isDebugEnabled()) {<a name="line.1043"></a>
-<span class="sourceLineNo">1044</span>      LOG.debug("Stored " + Arrays.toString(procs));<a name="line.1044"></a>
-<span class="sourceLineNo">1045</span>    }<a name="line.1045"></a>
-<span class="sourceLineNo">1046</span><a name="line.1046"></a>
-<span class="sourceLineNo">1047</span>    // Add the procedure to the executor<a name="line.1047"></a>
-<span class="sourceLineNo">1048</span>    for (int i = 0; i &lt; procs.length; ++i) {<a name="line.1048"></a>
-<span class="sourceLineNo">1049</span>      pushProcedure(procs[i]);<a name="line.1049"></a>
-<span class="sourceLineNo">1050</span>    }<a name="line.1050"></a>
-<span class="sourceLineNo">1051</span>  }<a name="line.1051"></a>
-<span class="sourceLineNo">1052</span><a name="line.1052"></a>
-<span class="sourceLineNo">1053</span>  private Procedure&lt;TEnvironment&gt; prepareProcedure(Procedure&lt;TEnvironment&gt; proc) {<a name="line.1053"></a>
-<span class="sourceLineNo">1054</span>    Preconditions.checkArgument(proc.getState() == ProcedureState.INITIALIZING);<a name="line.1054"></a>
-<span class="sourceLineNo">1055</span>    Preconditions.checkArgument(!proc.hasParent(), "unexpected parent", proc);<a name="line.1055"></a>
-<span class="sourceLineNo">1056</span>    if (this.checkOwnerSet) {<a name="line.1056"></a>
-<span class="sourceLineNo">1057</span>      Preconditions.checkArgument(proc.hasOwner(), "missing owner");<a name="line.1057"></a>
+<span class="sourceLineNo">1025</span>    // Commit the transaction<a name="line.1025"></a>
+<span class="sourceLineNo">1026</span>    store.insert(proc, null);<a name="line.1026"></a>
+<span class="sourceLineNo">1027</span>    LOG.debug("Stored {}", proc);<a name="line.1027"></a>
+<span class="sourceLineNo">1028</span><a name="line.1028"></a>
+<span class="sourceLineNo">1029</span>    // Add the procedure to the executor<a name="line.1029"></a>
+<span class="sourceLineNo">1030</span>    return pushProcedure(proc);<a name="line.1030"></a>
+<span class="sourceLineNo">1031</span>  }<a name="line.1031"></a>
+<span class="sourceLineNo">1032</span><a name="line.1032"></a>
+<span class="sourceLineNo">1033</span>  /**<a name="line.1033"></a>
+<span class="sourceLineNo">1034</span>   * Add a set of new root-procedure to the executor.<a name="line.1034"></a>
+<span class="sourceLineNo">1035</span>   * @param procs the new procedures to execute.<a name="line.1035"></a>
+<span class="sourceLineNo">1036</span>   */<a name="line.1036"></a>
+<span class="sourceLineNo">1037</span>  // TODO: Do we need to take nonces here?<a name="line.1037"></a>
+<span class="sourceLineNo">1038</span>  public void submitProcedures(Procedure&lt;TEnvironment&gt;[] procs) {<a name="line.1038"></a>
+<span class="sourceLineNo">1039</span>    Preconditions.checkArgument(lastProcId.get() &gt;= 0);<a name="line.1039"></a>
+<span class="sourceLineNo">1040</span>    if (procs == null || procs.length &lt;= 0) {<a name="line.1040"></a>
+<span class="sourceLineNo">1041</span>      return;<a name="line.1041"></a>
+<span class="sourceLineNo">1042</span>    }<a name="line.1042"></a>
+<span class="sourceLineNo">1043</span><a name="line.1043"></a>
+<span class="sourceLineNo">1044</span>    // Prepare procedure<a name="line.1044"></a>
+<span class="sourceLineNo">1045</span>    for (int i = 0; i &lt; procs.length; ++i) {<a name="line.1045"></a>
+<span class="sourceLineNo">1046</span>      prepareProcedure(procs[i]).setProcId(nextProcId());<a name="line.1046"></a>
+<span class="sourceLineNo">1047</span>    }<a name="line.1047"></a>
+<span class="sourceLineNo">1048</span><a name="line.1048"></a>
+<span class="sourceLineNo">1049</span>    // Commit the transaction<a name="line.1049"></a>
+<span class="sourceLineNo">1050</span>    store.insert(procs);<a name="line.1050"></a>
+<span class="sourceLineNo">1051</span>    if (LOG.isDebugEnabled()) {<a name="line.1051"></a>
+<span class="sourceLineNo">1052</span>      LOG.debug("Stored " + Arrays.toString(procs));<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>    // Add the procedure to the executor<a name="line.1055"></a>
+<span class="sourceLineNo">1056</span>    for (int i = 0; i &lt; procs.length; ++i) {<a name="line.1056"></a>
+<span class="sourceLineNo">1057</span>      pushProcedure(procs[i]);<a name="line.1057"></a>
 <span class="sourceLineNo">1058</span>    }<a name="line.1058"></a>
-<span class="sourceLineNo">1059</span>    return proc;<a name="line.1059"></a>
-<span class="sourceLineNo">1060</span>  }<a name="line.1060"></a>
-<span class="sourceLineNo">1061</span><a name="line.1061"></a>
-<span class="sourceLineNo">1062</span>  private long pushProcedure(Procedure&lt;TEnvironment&gt; proc) {<a name="line.1062"></a>
-<span class="sourceLineNo">1063</span>    final long currentProcId = proc.getProcId();<a name="line.1063"></a>
-<span class="sourceLineNo">1064</span><a name="line.1064"></a>
-<span class="sourceLineNo">1065</span>    // Update metrics on start of a procedure<a name="line.1065"></a>
-<span class="sourceLineNo">1066</span>    proc.updateMetricsOnSubmit(getEnvironment());<a name="line.1066"></a>
-<span class="sourceLineNo">1067</span><a name="line.1067"></a>
-<span class="sourceLineNo">1068</span>    // Create the rollback stack for the procedure<a name="line.1068"></a>
-<span class="sourceLineNo">1069</span>    RootProcedureState&lt;TEnvironment&gt; stack = new RootProcedureState&lt;&gt;();<a name="line.1069"></a>
-<span class="sourceLineNo">1070</span>    rollbackStack.put(currentProcId, stack);<a name="line.1070"></a>
-<span class="sourceLineNo">1071</span><a name="line.1071"></a>
-<span class="sourceLineNo">1072</span>    // Submit the new subprocedures<a name="line.1072"></a>
-<span class="sourceLineNo">1073</span>    assert !procedures.containsKey(currentProcId);<a name="line.1073"></a>
-<span class="sourceLineNo">1074</span>    procedures.put(currentProcId, proc);<a name="line.1074"></a>
-<span class="sourceLineNo">1075</span>    sendProcedureAddedNotification(currentProcId);<a name="line.1075"></a>
-<span class="sourceLineNo">1076</span>    scheduler.addBack(proc);<a name="line.1076"></a>
-<span class="sourceLineNo">1077</span>    return proc.getProcId();<a name="line.1077"></a>
-<span class="sourceLineNo">1078</span>  }<a name="line.1078"></a>
+<span class="sourceLineNo">1059</span>  }<a name="line.1059"></a>
+<span class="sourceLineNo">1060</span><a name="line.1060"></a>
+<span class="sourceLineNo">1061</span>  private Procedure&lt;TEnvironment&gt; prepareProcedure(Procedure&lt;TEnvironment&gt; proc) {<a name="line.1061"></a>
+<span class="sourceLineNo">1062</span>    Preconditions.checkArgument(proc.getState() == ProcedureState.INITIALIZING);<a name="line.1062"></a>
+<span class="sourceLineNo">1063</span>    Preconditions.checkArgument(!proc.hasParent(), "unexpected parent", proc);<a name="line.1063"></a>
+<span class="sourceLineNo">1064</span>    if (this.checkOwnerSet) {<a name="line.1064"></a>
+<span class="sourceLineNo">1065</span>      Preconditions.checkArgument(proc.hasOwner(), "missing owner");<a name="line.1065"></a>
+<span class="sourceLineNo">1066</span>    }<a name="line.1066"></a>
+<span class="sourceLineNo">1067</span>    return proc;<a name="line.1067"></a>
+<span class="sourceLineNo">1068</span>  }<a name="line.1068"></a>
+<span class="sourceLineNo">1069</span><a name="line.1069"></a>
+<span class="sourceLineNo">1070</span>  private long pushProcedure(Procedure&lt;TEnvironment&gt; proc) {<a name="line.1070"></a>
+<span class="sourceLineNo">1071</span>    final long currentProcId = proc.getProcId();<a name="line.1071"></a>
+<span class="sourceLineNo">1072</span><a name="line.1072"></a>
+<span class="sourceLineNo">1073</span>    // Update metrics on start of a procedure<a name="line.1073"></a>
+<span class="sourceLineNo">1074</span>    proc.updateMetricsOnSubmit(getEnvironment());<a name="line.1074"></a>
+<span class="sourceLineNo">1075</span><a name="line.1075"></a>
+<span class="sourceLineNo">1076</span>    // Create the rollback stack for the procedure<a name="line.1076"></a>
+<span class="sourceLineNo">1077</span>    RootProcedureState&lt;TEnvironment&gt; stack = new RootProcedureState&lt;&gt;();<a name="line.1077"></a>
+<span class="sourceLineNo">1078</span>    rollbackStack.put(currentProcId, stack);<a name="line.1078"></a>
 <span class="sourceLineNo">1079</span><a name="line.1079"></a>
-<span class="sourceLineNo">1080</span>  /**<a name="line.1080"></a>
-<span class="sourceLineNo">1081</span>   * Send an abort notification the specified procedure.<a name="line.1081"></a>
-<span class="sourceLineNo">1082</span>   * Depending on the procedure implementation the abort can be considered or ignored.<a name="line.1082"></a>
-<span class="sourceLineNo">1083</span>   * @param procId the procedure to abort<a name="line.1083"></a>
-<span class="sourceLineNo">1084</span>   * @return true if the procedure exists and has received the abort, otherwise false.<a name="line.1084"></a>
-<span class="sourceLineNo">1085</span>   */<a name="line.1085"></a>
-<span class="sourceLineNo">1086</span>  public boolean abort(long procId) {<a name="line.1086"></a>
-<span class="sourceLineNo">1087</span>    return abort(procId, true);<a name="line.1087"></a>
-<span class="sourceLineNo">1088</span>  }<a name="line.1088"></a>
-<span class="sourceLineNo">1089</span><a name="line.1089"></a>
-<span class="sourceLineNo">1090</span>  /**<a name="line.1090"></a>
-<span class="sourceLineNo">1091</span>   * Send an abort notification to the specified procedure.<a name="line.1091"></a>
-<span class="sourceLineNo">1092</span>   * Depending on the procedure implementation, the abort can be considered or ignored.<a name="line.1092"></a>
-<span class="sourceLineNo">1093</span>   * @param procId the procedure to abort<a name="line.1093"></a>
-<span class="sourceLineNo">1094</span>   * @param mayInterruptIfRunning if the proc completed at least one step, should it be aborted?<a name="line.1094"></a>
-<span class="sourceLineNo">1095</span>   * @return true if the procedure exists and has received the abort, otherwise false.<a name="line.1095"></a>
-<span class="sourceLineNo">1096</span>   */<a name="line.1096"></a>
-<span class="sourceLineNo">1097</span>  public boolean abort(long procId, boolean mayInterruptIfRunning) {<a name="line.1097"></a>
-<span class="sourceLineNo">1098</span>    Procedure&lt;TEnvironment&gt; proc = procedures.get(procId);<a name="line.1098"></a>
-<span class="sourceLineNo">1099</span>    if (proc != null) {<a name="line.1099"></a>
-<span class="sourceLineNo">1100</span>      if (!mayInterruptIfRunning &amp;&amp; proc.wasExecuted()) {<a name="line.1100"></a>
-<span class="sourceLineNo">1101</span>        return false;<a name="line.1101"></a>
-<span class="sourceLineNo">1102</span>      }<a name="line.1102"></a>
-<span class="sourceLineNo">1103</span>      return proc.abort(getEnvironment());<a name="line.1103"></a>
-<span class="sourceLineNo">1104</span>    }<a name="line.1104"></a>
-<span class="sourceLineNo">1105</span>    return false;<a name="line.1105"></a>
-<span class="sourceLineNo">1106</span>  }<a name="line.1106"></a>
-<span class="sourceLineNo">1107</span><a name="line.1107"></a>
-<span class="sourceLineNo">1108</span>  // ==========================================================================<a name="line.1108"></a>
-<span class="sourceLineNo">1109</span>  //  Executor query helpers<a name="line.1109"></a>
-<span class="sourceLineNo">1110</span>  // ==========================================================================<a name="line.1110"></a>
-<span class="sourceLineNo">1111</span>  public Procedure&lt;TEnvironment&gt; getProcedure(final long procId) {<a name="line.1111"></a>
-<span class="sourceLineNo">1112</span>    return procedures.get(procId);<a name="line.1112"></a>
-<span class="sourceLineNo">1113</span>  }<a name="line.1113"></a>
-<span class="sourceLineNo">1114</span><a name="line.1114"></a>
-<span class="sourceLineNo">1115</span>  public &lt;T extends Procedure&lt;TEnvironment&gt;&gt; T getProcedure(Class&lt;T&gt; clazz, long procId) {<a name="line.1115"></a>
-<span class="sourceLineNo">1116</span>    Procedure&lt;TEnvironment&gt; proc = getProcedure(procId);<a name="line.1116"></a>
-<span class="sourceLineNo">1117</span>    if (clazz.isInstance(proc)) {<a name="line.1117"></a>
-<span class="sourceLineNo">1118</span>      return clazz.cast(proc);<a name="line.1118"></a>
-<span class="sourceLineNo">1119</span>    }<a name="line.1119"></a>
-<span class="sourceLineNo">1120</span>    return null;<a name="line.1120"></a>
+<span class="sourceLineNo">1080</span>    // Submit the new subprocedures<a name="line.1080"></a>
+<span class="sourceLineNo">1081</span>    assert !procedures.containsKey(currentProcId);<a name="line.1081"></a>
+<span class="sourceLineNo">1082</span>    procedures.put(currentProcId, proc);<a name="line.1082"></a>
+<span class="sourceLineNo">1083</span>    sendProcedureAddedNotification(currentProcId);<a name="line.1083"></a>
+<span class="sourceLineNo">1084</span>    scheduler.addBack(proc);<a name="line.1084"></a>
+<span class="sourceLineNo">1085</span>    return proc.getProcId();<a name="line.1085"></a>
+<span class="sourceLineNo">1086</span>  }<a name="line.1086"></a>
+<span class="sourceLineNo">1087</span><a name="line.1087"></a>
+<span class="sourceLineNo">1088</span>  /**<a name="line.1088"></a>
+<span class="sourceLineNo">1089</span>   * Send an abort notification the specified procedure.<a name="line.1089"></a>
+<span class="sourceLineNo">1090</span>   * Depending on the procedure implementation the abort can be considered or ignored.<a name="line.1090"></a>
+<span class="sourceLineNo">1091</span>   * @param procId the procedure to abort<a name="line.1091"></a>
+<span class="sourceLineNo">1092</span>   * @return true if the procedure exists and has received the abort, otherwise false.<a name="line.1092"></a>
+<span class="sourceLineNo">1093</span>   */<a name="line.1093"></a>
+<span class="sourceLineNo">1094</span>  public boolean abort(long procId) {<a name="line.1094"></a>
+<span class="sourceLineNo">1095</span>    return abort(procId, true);<a name="line.1095"></a>
+<span class="sourceLineNo">1096</span>  }<a name="line.1096"></a>
+<span class="sourceLineNo">1097</span><a name="line.1097"></a>
+<span class="sourceLineNo">1098</span>  /**<a name="line.1098"></a>
+<span class="sourceLineNo">1099</span>   * Send an abort notification to the specified procedure.<a name="line.1099"></a>
+<span class="sourceLineNo">1100</span>   * Depending on the procedure implementation, the abort can be considered or ignored.<a name="line.1100"></a>
+<span class="sourceLineNo">1101</span>   * @param procId the procedure to abort<a name="line.1101"></a>
+<span class="sourceLineNo">1102</span>   * @param mayInterruptIfRunning if the proc completed at least one step, should it be aborted?<a name="line.1102"></a>
+<span class="sourceLineNo">1103</span>   * @return true if the procedure exists and has received the abort, otherwise false.<a name="line.1103"></a>
+<span class="sourceLineNo">1104</span>   */<a name="line.1104"></a>
+<span class="sourceLineNo">1105</span>  public boolean abort(long procId, boolean mayInterruptIfRunning) {<a name="line.1105"></a>
+<span class="sourceLineNo">1106</span>    Procedure&lt;TEnvironment&gt; proc = procedures.get(procId);<a name="line.1106"></a>
+<span class="sourceLineNo">1107</span>    if (proc != null) {<a name="line.1107"></a>
+<span class="sourceLineNo">1108</span>      if (!mayInterruptIfRunning &amp;&amp; proc.wasExecuted()) {<a name="line.1108"></a>
+<span class="sourceLineNo">1109</span>        return false;<a name="line.1109"></a>
+<span class="sourceLineNo">1110</span>      }<a name="line.1110"></a>
+<span class="sourceLineNo">1111</span>      return proc.abort(getEnvironment());<a name="line.1111"></a>
+<span class="sourceLineNo">1112</span>    }<a name="line.1112"></a>
+<span class="sourceLineNo">1113</span>    return false;<a name="line.1113"></a>
+<span class="sourceLineNo">1114</span>  }<a name="line.1114"></a>
+<span class="sourceLineNo">1115</span><a name="line.1115"></a>
+<span class="sourceLineNo">1116</span>  // ==========================================================================<a name="line.1116"></a>
+<span class="sourceLineNo">1117</span>  //  Executor query helpers<a name="line.1117"></a>
+<span class="sourceLineNo">1118</span>  // ==========================================================================<a name="line.1118"></a>
+<span class="sourceLineNo">1119</span>  public Procedure&lt;TEnvironment&gt; getProcedure(final long procId) {<a name="line.1119"></a>
+<span class="sourceLineNo">1120</span>    return procedures.get(procId);<a name="line.1120"></a>
 <span class="sourceLineNo">1121</span>  }<a name="line.1121"></a>
 <span class="sourceLineNo">1122</span><a name="line.1122"></a>
-<span class="sourceLineNo">1123</span>  public Procedure&lt;TEnvironment&gt; getResult(long procId) {<a name="line.1123"></a>
-<span class="sourceLineNo">1124</span>    CompletedProcedureRetainer&lt;TEnvironment&gt; retainer = completed.get(procId);<a name="line.1124"></a>
-<span class="sourceLineNo">1125</span>    if (retainer == null) {<a name="line.1125"></a>
-<span class="sourceLineNo">1126</span>      return null;<a name="line.1126"></a>
-<span class="sourceLineNo">1127</span>    } else {<a name="line.1127"></a>
-<span class="sourceLineNo">1128</span>      return retainer.getProcedure();<a name="line.1128"></a>
-<span class="sourceLineNo">1129</span>    }<a name="line.1129"></a>
-<span class="sourceLineNo">1130</span>  }<a name="line.1130"></a>
-<span class="sourceLineNo">1131</span><a name="line.1131"></a>
-<span class="sourceLineNo">1132</span>  /**<a name="line.1132"></a>
-<span class="sourceLineNo">1133</span>   * Return true if the procedure is finished.<a name="line.1133"></a>
-<span class="sourceLineNo">1134</span>   * The state may be "completed successfully" or "failed and rolledback".<a name="line.1134"></a>
-<span class="sourceLineNo">1135</span>   * Use getResult() to check the state or get the result data.<a name="line.1135"></a>
-<span class="sourceLineNo">1136</span>   * @param procId the ID of the procedure to check<a name="line.1136"></a>
-<span class="sourceLineNo">1137</span>   * @return true if the procedure execution is finished, otherwise false.<a name="line.1137"></a>
-<span class="sourceLineNo">1138</span>   */<a name="line.1138"></a>
-<span class="sourceLineNo">1139</span>  public boolean isFinished(final long procId) {<a name="line.1139"></a>
-<span class="sourceLineNo">1140</span>    return !procedures.containsKey(procId);<a name="line.1140"></a>
-<span class="sourceLineNo">1141</span>  }<a name="line.1141"></a>
-<span class="sourceLineNo">1142</span><a name="line.1142"></a>
-<span class="sourceLineNo">1143</span>  /**<a name="line.1143"></a>
-<span class="sourceLineNo">1144</span>   * Return true if the procedure is started.<a name="line.1144"></a>
-<span class="sourceLineNo">1145</span>   * @param procId the ID of the procedure to check<a name="line.1145"></a>
-<span class="sourceLineNo">1146</span>   * @return true if the procedure execution is started, otherwise false.<a name="line.1146"></a>
-<span class="sourceLineNo">1147</span>   */<a name="line.1147"></a>
-<span class="sourceLineNo">1148</span>  public boolean isStarted(long procId) {<a name="line.1148"></a>
-<span class="sourceLineNo">1149</span>    Procedure&lt;?&gt; proc = procedures.get(procId);<a name="line.1149"></a>
-<span class="sourceLineNo">1150</span>    if (proc == null) {<a name="line.1150"></a>
-<span class="sourceLineNo">1151</span>      return completed.get(procId) != null;<a name="line.1151"></a>
-<span class="sourceLineNo">1152</span>    }<a name="line.1152"></a>
-<span class="sourceLineNo">1153</span>    return proc.wasExecuted();<a name="line.1153"></a>
-<span class="sourceLineNo">1154</span>  }<a name="line.1154"></a>
-<span class="sourceLineNo">1155</span><a name="line.1155"></a>
-<span class="sourceLineNo">1156</span>  /**<a name="line.1156"></a>
-<span class="sourceLineNo">1157</span>   * Mark the specified completed procedure, as ready to remove.<a name="line.1157"></a>
-<span class="sourceLineNo">1158</span>   * @param procId the ID of the procedure to remove<a name="line.1158"></a>
-<span class="sourceLineNo">1159</span>   */<a name="line.1159"></a>
-<span class="sourceLineNo">1160</span>  public void removeResult(long procId) {<a name="line.1160"></a>
-<span class="sourceLineNo">1161</span>    CompletedProcedureRetainer&lt;TEnvironment&gt; retainer = completed.get(procId);<a name="line.1161"></a>
-<span class="sourceLineNo">1162</span>    if (retainer == null) {<a name="line.1162"></a>
-<span class="sourceLineNo">1163</span>      assert !procedures.containsKey(procId) : "pid=" + procId + " is still running";<a name="line.1163"></a>
-<span class="sourceLineNo">1164</span>      LOG.debug("pid={} already removed by the cleaner.", procId);<a name="line.1164"></a>
-<span class="sourceLineNo">1165</span>      return;<a name="line.1165"></a>
-<span class="sourceLineNo">1166</span>    }<a name="line.1166"></a>
-<span class="sourceLineNo">1167</span><a name="line.1167"></a>
-<span class="sourceLineNo">1168</span>    // The CompletedProcedureCleaner will take care of deletion, once the TTL is expired.<a name="line.1168"></a>
-<span class="sourceLineNo">1169</span>    retainer.setClientAckTime(EnvironmentEdgeManager.currentTime());<a name="line.1169"></a>
-<span class="sourceLineNo">1170</span>  }<a name="line.1170"></a>
-<span class="sourceLineNo">1171</span><a name="line.1171"></a>
-<span class="sourceLineNo">1172</span>  public Procedure&lt;TEnvironment&gt; getResultOrProcedure(long procId) {<a name="line.1172"></a>
-<span class="sourceLineNo">1173</span>    CompletedProcedureRetainer&lt;TEnvironment&gt; retainer = completed.get(procId);<a name="line.1173"></a>
-<span class="sourceLineNo">1174</span>    if (retainer == null) {<a name="line.1174"></a>
-<span class="sourceLineNo">1175</span>      return procedures.get(procId);<a name="line.1175"></a>
-<span class="sourceLineNo">1176</span>    } else {<a name="line.1176"></a>
-<span class="sourceLineNo">1177</span>      return retainer.getProcedure();<a name="line.1177"></a>
-<span class="sourceLineNo">1178</span>    }<a name="line.1178"></a>
-<span class="sourceLineNo">1179</span>  }<a name="line.1179"></a>
-<span class="sourceLineNo">1180</span><a name="line.1180"></a>
-<span class="sourceLineNo">1181</span>  /**<a name="line.1181"></a>
-<span class="sourceLineNo">1182</span>   * Check if the user is this procedure's owner<a name="line.1182"></a>
-<span class="sourceLineNo">1183</span>   * @param procId the target procedure<a name="line.1183"></a>
-<span class="sourceLineNo">1184</span>   * @param user the user<a name="line.1184"></a>
-<span class="sourceLineNo">1185</span>   * @return true if the user is the owner of the procedure,<a name="line.1185"></a>
-<span class="sourceLineNo">1186</span>   *   false otherwise or the owner is unknown.<a name="line.1186"></a>
-<span class="sourceLineNo">1187</span>   */<a name="line.1187"></a>
-<span class="sourceLineNo">1188</span>  public boolean isProcedureOwner(long procId, User user) {<a name="line.1188"></a>
-<span class="sourceLineNo">1189</span>    if (user == null) {<a name="line.1189"></a>
-<span class="sourceLineNo">1190</span>      return false;<a name="line.1190"></a>
-<span class="sourceLineNo">1191</span>    }<a name="line.1191"></a>
-<span class="sourceLineNo">1192</span>    final Procedure&lt;TEnvironment&gt; runningProc = procedures.get(procId);<a name="line.1192"></a>
-<span class="sourceLineNo">1193</span>    if (runningProc != null) {<a name="line.1193"></a>
-<span class="sourceLineNo">1194</span>      return runningProc.getOwner().equals(user.getShortName());<a name="line.1194"></a>
-<span class="sourceLineNo">1195</span>    }<a name="line.1195"></a>
-<span class="sourceLineNo">1196</span><a name="line.1196"></a>
-<span class="sourceLineNo">1197</span>    final CompletedProcedureRetainer&lt;TEnvironment&gt; retainer = completed.get(procId);<a name="line.1197"></a>
-<span class="sourceLineNo">1198</span>    if (retainer != null) {<a name="line.1198"></a>
-<span class="sourceLineNo">1199</span>      return retainer.getProcedure().getOwner().equals(user.getShortName());<a name="line.1199"></a>
-<span class="sourceLineNo">1200</span>    }<a name="line.1200"></a>
-<span class="sourceLineNo">1201</span><a name="line.1201"></a>
-<span class="sourceLineNo">1202</span>    // Procedure either does not exist or has already completed and got cleaned up.<a name="line.1202"></a>
-<span class="sourceLineNo">1203</span>    // At this time, we cannot check the owner of the procedure<a name="line.1203"></a>
-<span class="sourceLineNo">1204</span>    return false;<a name="line.1204"></a>
-<span class="sourceLineNo">1205</span>  }<a name="line.1205"></a>
-<span class="sourceLineNo">1206</span><a name="line.1206"></a>
-<span class="sourceLineNo">1207</span>  /**<a name="line.1207"></a>
-<span class="sourceLineNo">1208</span>   * Should only be used when starting up, where the procedure workers have not been started.<a name="line.1208"></a>
-<span class="sourceLineNo">1209</span>   * &lt;p/&gt;<a name="line.1209"></a>
-<span class="sourceLineNo">1210</span>   * If the procedure works has been started, the return values maybe changed when you are<a name="line.1210"></a>
-<span class="sourceLineNo">1211</span>   * processing it so usually this is not safe. Use {@link #getProcedures()} below for most cases as<a name="line.1211"></a>
-<span class="sourceLineNo">1212</span>   * it will do a copy, and also include the finished procedures.<a name="line.1212"></a>
-<span class="sourceLineNo">1213</span>   */<a name="line.1213"></a>
-<span class="sourceLineNo">1214</span>  public Collection&lt;Procedure&lt;TEnvironment&gt;&gt; getActiveProceduresNoCopy() {<a name="line.1214"></a>
-<span class="sourceLineNo">1215</span>    return procedures.values();<a name="line.1215"></a>
-<span class="sourceLineNo">1216</span>  }<a name="line.1216"></a>
-<span class="sourceLineNo">1217</span><a name="line.1217"></a>
-<span class="sourceLineNo">1218</span>  /**<a name="line.1218"></a>
-<span class="sourceLineNo">1219</span>   * Get procedures.<a name="line.1219"></a>
-<span class="sourceLineNo">1220</span>   * @return the procedures in a list<a name="line.1220"></a>
+<span class="sourceLineNo">1123</span>  public &lt;T extends Procedure&lt;TEnvironment&gt;&gt; T getProcedure(Class&lt;T&gt; clazz, long procId) {<a name="line.1123"></a>
+<span class="sourceLineNo">1124</span>    Procedure&lt;TEnvironment&gt; proc = getProcedure(procId);<a name="line.1124"></a>
+<span class="sourceLineNo">1125</span>    if (clazz.isInstance(proc)) {<a name="line.1125"></a>
+<span class="sourceLineNo">1126</span>      return clazz.cast(proc);<a name="line.1126"></a>
+<span class="sourceLineNo">1127</span>    }<a name="line.1127"></a>
+<span class="sourceLineNo">1128</span>    return null;<a name="line.1128"></a>
+<span class="sourceLineNo">1129</span>  }<a name="line.1129"></a>
+<span class="sourceLineNo">1130</span><a name="line.1130"></a>
+<span class="sourceLineNo">1131</span>  public Procedure&lt;TEnvironment&gt; getResult(long procId) {<a name="line.1131"></a>
+<span class="sourceLineNo">1132</span>    CompletedProcedureRetainer&lt;TEnvironment&gt; retainer = completed.get(procId);<a name="line.1132"></a>
+<span class="sourceLineNo">1133</span>    if (retainer == null) {<a name="line.1133"></a>
+<span class="sourceLineNo">1134</span>      return null;<a name="line.1134"></a>
+<span class="sourceLineNo">1135</span>    } else {<a name="line.1135"></a>
+<span class="sourceLineNo">1136</span>      return retainer.getProcedure();<a name="line.1136"></a>
+<span class="sourceLineNo">1137</span>    }<a name="line.1137"></a>
+<span class="sourceLineNo">1138</span>  }<a name="line.1138"></a>
+<span class="sourceLineNo">1139</span><a name="line.1139"></a>
+<span class="sourceLineNo">1140</span>  /**<a name="line.1140"></a>
+<span class="sourceLineNo">1141</span>   * Return true if the procedure is finished.<a name="line.1141"></a>
+<span class="sourceLineNo">1142</span>   * The state may be "completed successfully" or "failed and rolledback".<a name="line.1142"></a>
+<span class="sourceLineNo">1143</span>   * Use getResult() to check the state or get the result data.<a name="line.1143"></a>
+<span class="sourceLineNo">1144</span>   * @param procId the ID of the procedure to check<a name="line.1144"></a>
+<span class="sourceLineNo">1145</span>   * @return true if the procedure execution is finished, otherwise false.<a name="line.1145"></a>
+<span class="sourceLineNo">1146</span>   */<a name="line.1146"></a>
+<span class="sourceLineNo">1147</span>  public boolean isFinished(final long procId) {<a name="line.1147"></a>
+<span class="sourceLineNo">1148</span>    return !procedures.containsKey(procId);<a name="line.1148"></a>
+<span class="sourceLineNo">1149</span>  }<a name="line.1149"></a>
+<span class="sourceLineNo">1150</span><a name="line.1150"></a>
+<span class="sourceLineNo">1151</span>  /**<a name="line.1151"></a>
+<span class="sourceLineNo">1152</span>   * Return true if the procedure is started.<a name="line.1152"></a>
+<span class="sourceLineNo">1153</span>   * @param procId the ID of the procedure to check<a name="line.1153"></a>
+<span class="sourceLineNo">1154</span>   * @return true if the procedure execution is started, otherwise false.<a name="line.1154"></a>
+<span class="sourceLineNo">1155</span>   */<a name="line.1155"></a>
+<span class="sourceLineNo">1156</span>  public boolean isStarted(long procId) {<a name="line.1156"></a>
+<span class="sourceLineNo">1157</span>    Procedure&lt;?&gt; proc = procedures.get(procId);<a name="line.1157"></a>
+<span class="sourceLineNo">1158</span>    if (proc == null) {<a name="line.1158"></a>
+<span class="sourceLineNo">1159</span>      return completed.get(procId) != null;<a name="line.1159"></a>
+<span class="sourceLineNo">1160</span>    }<a name="line.1160"></a>
+<span class="sourceLineNo">1161</span>    return proc.wasExecuted();<a name="line.1161"></a>
+<span class="sourceLineNo">1162</span>  }<a name="line.1162"></a>
+<span class="sourceLineNo">1163</span><a name="line.1163"></a>
+<span class="sourceLineNo">1164</span>  /**<a name="line.1164"></a>
+<span class="sourceLineNo">1165</span>   * Mark the specified completed procedure, as ready to remove.<a name="line.1165"></a>
+<span class="sourceLineNo">1166</span>   * @param procId the ID of the procedure to remove<a name="line.1166"></a>
+<span class="sourceLineNo">1167</span>   */<a name="line.1167"></a>
+<span class="sourceLineNo">1168</span>  public void removeResult(long procId) {<a name="line.1168"></a>
+<span class="sourceLineNo">1169</span>    CompletedProcedureRetainer&lt;TEnvironment&gt; retainer = completed.get(procId);<a name="line.1169"></a>
+<span class="sourceLineNo">1170</span>    if (retainer == null) {<a name="line.1170"></a>
+<span class="sourceLineNo">1171</span>      assert !procedures.containsKey(procId) : "pid=" + procId + " is still running";<a name="line.1171"></a>
+<span class="sourceLineNo">1172</span>      LOG.debug("pid={} already removed by the cleaner.", procId);<a name="line.1172"></a>
+<span class="sourceLineNo">1173</span>      return;<a name="line.1173"></a>
+<span class="sourceLineNo">1174</span>    }<a name="line.1174"></a>
+<span class="sourceLineNo">1175</span><a name="line.1175"></a>
+<span class="sourceLineNo">1176</span>    // The CompletedProcedureCleaner will take care of deletion, once the TTL is expired.<a name="line.1176"></a>
+<span class="sourceLineNo">1177</span>    retainer.setClientAckTime(EnvironmentEdgeManager.currentTime());<a name="line.1177"></a>
+<span class="sourceLineNo">1178</span>  }<a name="line.1178"></a>
+<span class="sourceLineNo">1179</span><a name="line.1179"></a>
+<span class="sourceLineNo">1180</span>  public Procedure&lt;TEnvironment&gt; getResultOrProcedure(long procId) {<a name="line.1180"></a>
+<span class="sourceLineNo">1181</span>    CompletedProcedureRetainer&lt;TEnvironment&gt; retainer = completed.get(procId);<a name="line.1181"></a>
+<span class="sourceLineNo">1182</span>    if (retainer == null) {<a name="line.1182"></a>
+<span class="sourceLineNo">1183</span>      return procedures.get(procId);<a name="line.1183"></a>
+<span class="sourceLineNo">1184</span>    } else {<a name="line.1184"></a>
+<span class="sourceLineNo">1185</span>      return retainer.getProcedure();<a name="line.1185"></a>
+<span class="sourceLineNo">1186</span>    }<a name="line.1186"></a>
+<span class="sourceLineNo">1187</span>  }<a name="line.1187"></a>
+<span class="sourceLineNo">1188</span><a name="line.1188"></a>
+<span class="sourceLineNo">1189</span>  /**<a name="line.1189"></a>
+<span class="sourceLineNo">1190</span>   * Check if the user is this procedure's owner<a name="line.1190"></a>
+<span class="sourceLineNo">1191</span>   * @param procId the target procedure<a name="line.1191"></a>
+<span class="sourceLineNo">1192</span>   * @param user the user<a name="line.1192"></a>
+<span class="sourceLineNo">1193</span>   * @return true if the user is the owner of the procedure,<a name="line.1193"></a>
+<span class="sourceLineNo">1194</span>   *   false otherwise or the owner is unknown.<a name="line.1194"></a>
+<span class="sourceLineNo">1195</span>   */<a name="line.1195"></a>
+<span class="sourceLineNo">1196</span>  public boolean isProcedureOwner(long procId, User user) {<a name="line.1196"></a>
+<span class="sourceLineNo">1197</span>    if (user == null) {<a name="line.1197"></a>
+<span class="sourceLineNo">1198</span>      return false;<a name="line.1198"></a>
+<span class="sourceLineNo">1199</span>    }<a name="line.1199"></a>
+<span class="sourceLineNo">1200</span>    final Procedure&lt;TEnvironment&gt; runningProc = procedures.get(procId);<a name="line.1200"></a>
+<span class="sourceLineNo">1201</span>    if (runningProc != null) {<a name="line.1201"></a>
+<span class="sourceLineNo">1202</span>      return runningProc.getOwner().equals(user.getShortName());<a name="line.1202"></a>
+<span class="sourceLineNo">1203</span>    }<a name="line.1203"></a>
+<span class="sourceLineNo">1204</span><a name="line.1204"></a>
+<span class="sourceLineNo">1205</span>    final CompletedProcedureRetainer&lt;TEnvironment&gt; retainer = completed.get(procId);<a name="line.1205"></a>
+<span class="sourceLineNo">1206</span>    if (retainer != null) {<a name="line.1206"></a>
+<span class="sourceLineNo">1207</span>      return retainer.getProcedure().getOwner().equals(user.getShortName());<a name="line.1207"></a>
+<span class="sourceLineNo">1208</span>    }<a name="line.1208"></a>
+<span class="sourceLineNo">1209</span><a name="line.1209"></a>
+<span class="sourceLineNo">1210</span>    // Procedure either does not exist or has already completed and got cleaned up.<a name="line.1210"></a>
+<span class="sourceLineNo">1211</span>    // At this time, we cannot check the owner of the procedure<a name="line.1211"></a>
+<span class="sourceLineNo">1212</span>    return false;<a name="line.1212"></a>
+<span class="sourceLineNo">1213</span>  }<a name="line.1213"></a>
+<span class="sourceLineNo">1214</span><a name="line.1214"></a>
+<span class="sourceLineNo">1215</span>  /**<a name="line.1215"></a>
+<span class="sourceLineNo">1216</span>   * Should only be used when starting up, where the procedure workers have not been started.<a name="line.1216"></a>
+<span class="sourceLineNo">1217</span>   * &lt;p/&gt;<a name="line.1217"></a>
+<span class="sourceLineNo">1218</span>   * If the procedure works has been started, the return values maybe changed when you are<a name="line.1218"></a>
+<span class="sourceLineNo">1219</span>   * processing it so usually this is not safe. Use {@link #getProcedures()} below for most cases as<a name="line.1219"></a>
+<span class="sourceLineNo">1220</span>   * it will do a copy, and also include the finished procedures.<a name="line.1220"></a>
 <span class="sourceLineNo">1221</span>   */<a name="line.1221"></a>
-<span class="sourceLineNo">1222</span>  public List&lt;Procedure&lt;TEnvironment&gt;&gt; getProcedures() {<a name="line.1222"></a>
-<span class="sourceLineNo">1223</span>    List&lt;Procedure&lt;TEnvironment&gt;&gt; procedureList =<a name="line.1223"></a>
-<span class="sourceLineNo">1224</span>      new ArrayList&lt;&gt;(procedures.size() + completed.size());<a name="line.1224"></a>
-<span class="sourceLineNo">1225</span>    procedureList.addAll(procedures.values());<a name="line.1225"></a>
-<span class="sourceLineNo">1226</span>    // Note: The procedure could show up twice in the list with different state, as<a name="line.1226"></a>
-<span class="sourceLineNo">1227</span>    // it could complete after we walk through procedures list and insert into<a name="line.1227"></a>
-<span class="sourceLineNo">1228</span>    // procedureList - it is ok, as we will use the information in the Procedure<a name="line.1228"></a>
-<span class="sourceLineNo">1229</span>    // to figure it out; to prevent this would increase the complexity of the logic.<a name="line.1229"></a>
-<span class="sourceLineNo">1230</span>    completed.values().stream().map(CompletedProcedureRetainer::getProcedure)<a name="line.1230"></a>
-<span class="sourceLineNo">1231</span>      .forEach(procedureList::add);<a name="line.1231"></a>
-<span class="sourceLineNo">1232</span>    return procedureList;<a name="line.1232"></a>
-<span class="sourceLineNo">1233</span>  }<a name="line.1233"></a>
-<span class="sourceLineNo">1234</span><a name="line.1234"></a>
-<span class="sourceLineNo">1235</span>  // ==========================================================================<a name="line.1235"></a>
-<span class="sourceLineNo">1236</span>  //  Listeners helpers<a name="line.1236"></a>
-<span class="sourceLineNo">1237</span>  // ==========================================================================<a name="line.1237"></a>
-<span class="sourceLineNo">1238</span>  public void registerListener(ProcedureExecutorListener listener) {<a name="line.1238"></a>
-<span class="sourceLineNo">1239</span>    this.listeners.add(listener);<a name="line.1239"></a>
-<span class="sourceLineNo">1240</span>  }<a name="line.1240"></a>
-<span class="sourceLineNo">1241</span><a name="line.1241"></a>
-<span class="sourceLineNo">1242</span>  public boolean unregisterListener(ProcedureExecutorListener listener) {<a name="line.1242"></a>
-<span class="sourceLineNo">1243</span>    return this.listeners.remove(listener);<a name="line.1243"></a>
-<span class="sourceLineNo">1244</span>  }<a name="line.1244"></a>
-<span class="sourceLineNo">1245</span><a name="line.1245"></a>
-<span class="sourceLineNo">1246</span>  private void sendProcedureLoadedNotification(final long procId) {<a name="line.1246"></a>
-<span class="sourceLineNo">1247</span>    if (!this.listeners.isEmpty()) {<a name="line.1247"></a>
-<span class="sourceLineNo">1248</span>      for (ProcedureExecutorListener listener: this.listeners) {<a name="line.1248"></a>
-<span class="sourceLineNo">1249</span>        try {<a name="line.1249"></a>
-<span class="sourceLineNo">1250</span>          listener.procedureLoaded(procId);<a name="line.1250"></a>
-<span class="sourceLineNo">1251</span>        } catch (Throwable e) {<a name="line.1251"></a>
-<span class="sourceLineNo">1252</span>          LOG.error("Listener " + listener + " had an error: " + e.getMessage(), e);<a name="line.1252"></a>
-<span class="sourceLineNo">1253</span>        }<a name="line.1253"></a>
-<span class="sourceLineNo">1254</span>      }<a name="line.1254"></a>
-<span class="sourceLineNo">1255</span>    }<a name="line.1255"></a>
-<span class="sourceLineNo">1256</span>  }<a name="line.1256"></a>
-<span class="sourceLineNo">1257</span><a name="line.1257"></a>
-<span class="sourceLineNo">1258</span>  private void sendProcedureAddedNotification(final long procId) {<a name="line.1258"></a>
-<span class="sourceLineNo">1259</span>    if (!this.listeners.isEmpty()) {<a name="line.1259"></a>
-<span class="sourceLineNo">1260</span>      for (ProcedureExecutorListener listener: this.listeners) {<a name="line.1260"></a>
-<span class="sourceLineNo">1261</span>        try {<a name="line.1261"></a>
-<span class="sourceLineNo">1262</span>          listener.procedureAdded(procId);<a name="line.1262"></a>
-<span class="sourceLineNo">1263</span>        } catch (Throwable e) {<a name="line.1263"></a>
-<span class="sourceLineNo">1264</span>          LOG.error("Listener " + listener + " had an error: " + e.getMessage(), e);<a name="line.1264"></a>
-<span class="sourceLineNo">1265</span>        }<a name="line.1265"></a>
-<span class="sourceLineNo">1266</span>      }<a name="line.1266"></a>
-<span class="sourceLineNo">1267</span>    }<a name="line.1267"></a>
-<span class="sourceLineNo">1268</span>  }<a name="line.1268"></a>
-<span class="sourceLineNo">1269</span><a name="line.1269"></a>
-<span class="sourceLineNo">1270</span>  private void sendProcedureFinishedNotification(final long procId) {<a name="line.1270"></a>
-<span class="sourceLineNo">1271</span>    if (!this.listeners.isEmpty()) {<a name="line.1271"></a>
-<span class="sourceLineNo">1272</span>      for (ProcedureExecutorListener listener: this.listeners) {<a name="line.1272"></a>
-<span class="sourceLineNo">1273</span>        try {<a name="line.1273"></a>
-<span class="sourceLineNo">1274</span>          listener.procedureFinished(procId);<a name="line.1274"></a>
-<span class="sourceLineNo">1275</span>        } catch (Throwable e) {<a name="line.1275"></a>
-<span class="sourceLineNo">1276</span>          LOG.error("Listener " + listener + " had an error: " + e.getMessage(), e);<a name="line.1276"></a>
-<span class="sourceLineNo">1277</span>        }<a name="line.1277"></a>
-<span class="sourceLineNo">1278</span>      }<a name="line.1278"></a>
-<span class="sourceLineNo">1279</span>    }<a name="line.1279"></a>
-<span class="sourceLineNo">1280</span>  }<a name="line.1280"></a>
-<span class="sourceLineNo">1281</span><a name="line.1281"></a>
-<span class="sourceLineNo">1282</span>  // ==========================================================================<a name="line.1282"></a>
-<span class="sourceLineNo">1283</span>  //  Procedure IDs helpers<a name="line.1283"></a>
-<span class="sourceLineNo">1284</span>  // ==========================================================================<a name="line.1284"></a>
-<span class="sourceLineNo">1285</span>  private long nextProcId() {<a name="line.1285"></a>
-<span class="sourceLineNo">1286</span>    long procId = lastProcId.incrementAndGet();<a name="line.1286"></a>
-<span class="sourceLineNo">1287</span>    if (procId &lt; 0) {<a name="line.1287"></a>
-<span class="sourceLineNo">1288</span>      while (!lastProcId.compareAndSet(procId, 0)) {<a name="line.1288"></a>
-<span class="sourceLineNo">1289</span>        procId = lastProcId.get();<a name="line.1289"></a>
-<span class="sourceLineNo">1290</span>        if (procId &gt;= 0)<a name="line.1290"></a>
-<span class="sourceLineNo">1291</span>          break;<a name="line.1291"></a>
-<span class="sourceLineNo">1292</span>      }<a name="line.1292"></a>
-<span class="sourceLineNo">1293</span>      while (procedures.containsKey(procId)) {<a name="line.1293"></a>
-<span class="sourceLineNo">1294</span>        procId = lastProcId.incrementAndGet();<a name="line.1294"></a>
-<span class="sourceLineNo">1295</span>      }<a name="line.1295"></a>
-<span class="sourceLineNo">1296</span>    }<a name="line.1296"></a>
-<span class="sourceLineNo">1297</span>    assert procId &gt;= 0 : "Invalid procId " + procId;<a name="line.1297"></a>
-<span class="sourceLineNo">1298</span>    return procId;<a name="line.1298"></a>
-<span class="sourceLineNo">1299</span>  }<a name="line.1299"></a>
-<span class="sourceLineNo">1300</span><a name="line.1300"></a>
-<span class="sourceLineNo">1301</span>  @VisibleForTesting<a name="line.1301"></a>
-<span class="sourceLineNo">1302</span>  protected long getLastProcId() {<a name="line.1302"></a>
-<span class="sourceLineNo">1303</span>    return lastProcId.get();<a name="line.1303"></a>
-<span class="sourceLineNo">1304</span>  }<a name="line.1304"></a>
-<span class="sourceLineNo">1305</span><a name="line.1305"></a>
-<span class="sourceLineNo">1306</span>  @VisibleForTesting<a name="line.1306"></a>
-<span class="sourceLineNo">1307</span>  public Set&lt;Long&gt; getActiveProcIds() {<a name="line.1307"></a>
-<span class="sourceLineNo">1308</span>    return procedures.keySet();<a name="line.1308"></a>
-<span class="sourceLineNo">1309</span>  }<a name="line.1309"></a>
-<span class="sourceLineNo">1310</span><a name="line.1310"></a>
-<span class="sourceLineNo">1311</span>  Long getRootProcedureId(Procedure&lt;TEnvironment&gt; proc) {<a name="line.1311"></a>
-<span class="sourceLineNo">1312</span>    return Procedure.getRootProcedureId(procedures, proc);<a name="line.1312"></a>
-<span class="sourceLineNo">1313</span>  }<a name="line.1313"></a>
-<span class="sourceLineNo">1314</span><a name="line.1314"></a>
-<span class="sourceLineNo">1315</span>  // ==========================================================================<a name="line.1315"></a>
-<span class="sourceLineNo">1316</span>  //  Executions<a name="line.1316"></a>
-<span class="sourceLineNo">1317</span>  // ==========================================================================<a name="line.1317"></a>
-<span class="sourceLineNo">1318</span>  private void executeProcedure(Procedure&lt;TEnvironment&gt; proc) {<a name="line.1318"></a>
-<span class="sourceLineNo">1319</span>    if (proc.isFinished()) {<a name="line.1319"></a>
-<span class="sourceLineNo">1320</span>      LOG.debug("{} is already finished, skipping execution", proc);<a name="line.1320"></a>
-<span class="sourceLineNo">1321</span>      return;<a name="line.1321"></a>
-<span class="sourceLineNo">1322</span>    }<a name="line.1322"></a>
-<span class="sourceLineNo">1323</span>    final Long rootProcId = getRootProcedureId(proc);<a name="line.1323"></a>
-<span class="sourceLineNo">1324</span>    if (rootProcId == null) {<a name="line.1324"></a>
-<span class="sourceLineNo">1325</span>      // The 'proc' was ready to run but the root procedure was rolledback<a name="line.1325"></a>
-<span class="sourceLineNo">1326</span>      LOG.warn("Rollback because parent is done/rolledback proc=" + proc);<a name="line.1326"></a>
-<span class="sourceLineNo">1327</span>      executeRollback(proc);<a name="line.1327"></a>
-<span class="sourceLineNo">1328</span>      return;<a name="line.1328"></a>
-<span class="sourceLineNo">1329</span>    }<a name="line.1329"></a>
-<span class="sourceLineNo">1330</span><a name="line.1330"></a>
-<span class="sourceLineNo">1331</span>    RootProcedureState&lt;TEnvironment&gt; procStack = rollbackStack.get(rootProcId);<a name="line.1331"></a>
-<span class="sourceLineNo">1332</span>    if (procStack == null) {<a name="line.1332"></a>
-<span class="sourceLineNo">1333</span>      LOG.warn("RootProcedureState is null for " + proc.getProcId());<a name="line.1333"></a>
-<span class="sourceLineNo">1334</span>      return;<a name="line.1334"></a>
-<span class="sourceLineNo">1335</span>    }<a name="line.1335"></a>
-<span class="sourceLineNo">1336</span>    do {<a name="line.1336"></a>
-<span class="sourceLineNo">1337</span>      // Try to acquire the execution<a name="line.1337"></a>
-<span class="sourceLineNo">1338</span>      if (!procStack.acquire(proc)) {<a name="line.1338"></a>
-<span class="sourceLineNo">1339</span>        if (procStack.setRollback()) {<a name="line.1339"></a>
-<span class="sourceLineNo">1340</span>          // we have the 'rollback-lock' we can start rollingback<a name="line.1340"></a>
-<span class="sourceLineNo">1341</span>          switch (executeRollback(rootProcId, procStack)) {<a name="line.1341"></a>
-<span class="sourceLineNo">1342</span>            case LOCK_ACQUIRED:<a name="line.1342"></a>
-<span class="sourceLineNo">1343</span>              break;<a name="line.1343"></a>
-<span class="sourceLineNo">1344</span>            case LOCK_YIELD_WAIT:<a name="line.1344"></a>
-<span class="sourceLineNo">1345</span>              procStack.unsetRollback();<a name="line.1345"></a>
-<span class="sourceLineNo">1346</span>              scheduler.yield(proc);<a name="line.1346"></a>
-<span class="sourceLineNo">1347</span>              break;<a name="line.1347"></a>
-<span class="sourceLineNo">1348</span>            case LOCK_EVENT_WAIT:<a name="line.1348"></a>
-<span class="sourceLineNo">1349</span>              LOG.info("LOCK_EVENT_WAIT rollback..." + proc);<a name="line.1349"></a>
-<span class="sourceLineNo">1350</span>              procStack.unsetRollback();<a name="line.1350"></a>
+<span class="sourceLineNo">1222</span>  public Collection&lt;Procedure&lt;TEnvironment&gt;&gt; getActiveProceduresNoCopy() {<a name="line.1222"></a>
+<span class="sourceLineNo">1223</span>    return procedures.values();<a name="line.1223"></a>
+<span class="sourceLineNo">1224</span>  }<a name="line.1224"></a>
+<span class="sourceLineNo">1225</span><a name="line.1225"></a>
+<span class="sourceLineNo">1226</span>  /**<a name="line.1226"></a>
+<span class="sourceLineNo">1227</span>   * Get procedures.<a name="line.1227"></a>
+<span class="sourceLineNo">1228</span>   * @return the procedures in a list<a name="line.1228"></a>
+<span class="sourceLineNo">1229</span>   */<a name="line.1229"></a>
+<span class="sourceLineNo">1230</span>  public List&lt;Procedure&lt;TEnvironment&gt;&gt; getProcedures() {<a name="line.1230"></a>
+<span class="sourceLineNo">1231</span>    List&lt;Procedure&lt;TEnvironment&gt;&gt; procedureList =<a name="line.1231"></a>
+<span class="sourceLineNo">1232</span>      new ArrayList&lt;&gt;(procedures.size() + completed.size());<a name="line.1232"></a>
+<span class="sourceLineNo">1233</span>    procedureList.addAll(procedures.values());<a name="line.1233"></a>
+<span class="sourceLineNo">1234</span>    // Note: The procedure could show up twice in the list with different state, as<a name="line.1234"></a>
+<span class="sourceLineNo">1235</span>    // it could complete after we walk through procedures list and insert into<a name="line.1235"></a>
+<span class="sourceLineNo">1236</span>    // procedureList - it is ok, as we will use the information in the Procedure<a name="line.1236"></a>
+<span class="sourceLineNo">1237</span>    // to figure it out; to prevent this would increase the complexity of the logic.<a name="line.1237"></a>
+<span class="sourceLineNo">1238</span>    completed.values().stream().map(CompletedProcedureRetainer::getProcedure)<a name="line.1238"></a>
+<span class="sourceLineNo">1239</span>      .forEach(procedureList::add);<a name="line.1239"></a>
+<span class="sourceLineNo">1240</span>    return procedureList;<a name="line.1240"></a>
+<span class="sourceLineNo">1241</span>  }<a name="line.1241"></a>
+<span class="sourceLineNo">1242</span><a name="line.1242"></a>
+<span class="sourceLineNo">1243</span>  // ==========================================================================<a name="line.1243"></a>
+<span class="sourceLineNo">1244</span>  //  Listeners helpers<a name="line.1244"></a>
+<span class="sourceLineNo">1245</span>  // ==========================================================================<a name="line.1245"></a>
+<span class="sourceLineNo">1246</span>  public void registerListener(ProcedureExecutorListener listener) {<a name="line.1246"></a>
+<span class="sourceLineNo">1247</span>    this.listeners.add(listener);<a name="line.1247"></a>
+<span class="sourceLineNo">1248</span>  }<a name="line.1248"></a>
+<span class="sourceLineNo">1249</span><a name="line.1249"></a>
+<span class="sourceLineNo">1250</span>  public boolean unregisterListener(ProcedureExecutorListener listener) {<a name="line.1250"></a>
+<span class="sourceLineNo">1251</span>    return this.listeners.remove(listener);<a name="line.1251"></a>
+<span class="sourceLineNo">1252</span>  }<a name="line.1252"></a>
+<span class="sourceLineNo">1253</span><a name="line.1253"></a>
+<span class="sourceLineNo">1254</span>  private void sendProcedureLoadedNotification(final long procId) {<a name="line.1254"></a>
+<span class="sourceLineNo">1255</span>    if (!this.listeners.isEmpty()) {<a name="line.1255"></a>
+<span class="sourceLineNo">1256</span>      for (ProcedureExecutorListener listener: this.listeners) {<a name="line.1256"></a>
+<span class="sourceLineNo">1257</span>        try {<a name="line.1257"></a>
+<span class="sourceLineNo">1258</span>          listener.procedureLoaded(procId);<a name="line.1258"></a>
+<span class="sourceLineNo">1259</span>        } catch (Throwable e) {<a name="line.1259"></a>
+<span class="sourceLineNo">1260</span>          LOG.error("Listener " + listener + " had an error: " + e.getMessage(), e);<a name="line.1260"></a>
+<span class="sourceLineNo">1261</span>        }<a name="line.1261"></a>
+<span class="sourceLineNo">1262</span>      }<a name="line.1262"></a>
+<span class="sourceLineNo">1263</span>    }<a name="line.1263"></a>
+<span class="sourceLineNo">1264</span>  }<a name="line.1264"></a>
+<span class="sourceLineNo">1265</span><a name="line.1265"></a>
+<span class="sourceLineNo">1266</span>  private void sendProcedureAddedNotification(final long procId) {<a name="line.1266"></a>
+<span class="sourceLineNo">1267</span>    if (!this.listeners.isEmpty()) {<a name="line.1267"></a>
+<span class="sourceLineNo">1268</span>      for (ProcedureExecutorListener listener: this.listeners) {<a name="line.1268"></a>
+<span class="sourceLineNo">1269</span>        try {<a name="line.1269"></a>
+<span class="sourceLineNo">1270</span>          listener.procedureAdded(procId);<a name="line.1270"></a>
+<span class="sourceLineNo">1271</span>        } catch (Throwable e) {<a name="line.1271"></a>
+<span class="sourceLineNo">1272</span>          LOG.error("Listener " + listener + " had an error: " + e.getMessage(), e);<a name="line.1272"></a>
+<span class="sourceLineNo">1273</span>        }<a name="line.1273"></a>
+<span class="sourceLineNo">1274</span>      }<a name="line.1274"></a>
+<span class="sourceLineNo">1275</span>    }<a name="line.1275"></a>
+<span class="sourceLineNo">1276</span>  }<a name="line.1276"></a>
+<span class="sourceLineNo">1277</span><a name="line.1277"></a>
+<span class="sourceLineNo">1278</span>  private void sendProcedureFinishedNotification(final long procId) {<a name="line.1278"></a>
+<span class="sourceLineNo">1279</span>    if (!this.listeners.isEmpty()) {<a name="line.1279"></a>
+<span class="sourceLineNo">1280</span>      for (ProcedureExecutorListener listener: this.listeners) {<a name="line.1280"></a>
+<span class="sourceLineNo">1281</span>        try {<a name="line.1281"></a>
+<span class="sourceLineNo">1282</span>          listener.procedureFinished(procId);<a name="line.1282"></a>
+<span class="sourceLineNo">1283</span>        } catch (Throwable e) {<a name="line.1283"></a>
+<span class="sourceLineNo">1284</span>          LOG.error("Listener " + listener + " had an error: " + e.getMessage(), e);<a name="line.1284"></a>
+<span class="sourceLineNo">1285</span>        }<a name="line.1285"></a>
+<span class="sourceLineNo">1286</span>      }<a name="line.1286"></a>
+<span class="sourceLineNo">1287</span>    }<a name="line.1287"></a>
+<span class="sourceLineNo">1288</span>  }<a name="line.1288"></a>
+<span class="sourceLineNo">1289</span><a name="line.1289"></a>
+<span class="sourceLineNo">1290</span>  // ==========================================================================<a name="line.1290"></a>
+<span class="sourceLineNo">1291</span>  //  Procedure IDs helpers<a name="line.1291"></a>
+<span class="sourceLineNo">1292</span>  // ==========================================================================<a name="line.1292"></a>
+<span class="sourceLineNo">1293</span>  private long nextProcId() {<a name="line.1293"></a>
+<span class="sourceLineNo">1294</span>    long procId = lastProcId.incrementAndGet();<a name="line.1294"></a>
+<span class="sourceLineNo">1295</span>    if (procId &lt; 0) {<a name="line.1295"></a>
+<span class="sourceLineNo">1296</span>      while (!lastProcId.compareAndSet(procId, 0)) {<a name="line.1296"></a>
+<span class="sourceLineNo">1297</span>        procId = lastProcId.get();<a name="line.1297"></a>
+<span class="sourceLineNo">1298</span>        if (procId &gt;= 0)<a name="line.1298"></a>
+<span class="sourceLineNo">1299</span>          break;<a name="line.1299"></a>
+<span class="sourceLineNo">1300</span>      }<a name="line.1300"></a>
+<span class="sourceLineNo">1301</span>      while (procedures.containsKey(procId)) {<a name="line.1301"></a>
+<span class="sourceLineNo">1302</span>        procId = lastProcId.incrementAndGet();<a name="line.1302"></a>
+<span class="sourceLineNo">1303</span>      }<a name="line.1303"></a>
+<span class="sourceLineNo">1304</span>    }<a name="line.1304"></a>
+<span class="sourceLineNo">1305</span>    assert procId &gt;= 0 : "Invalid procId " + procId;<a name="line.1305"></a>
+<span class="sourceLineNo">1306</span>    return procId;<a name="line.1306"></a>
+<span class="sourceLineNo">1307</span>  }<a name="line.1307"></a>
+<span class="sourceLineNo">1308</span><a name="line.1308"></a>
+<span class="sourceLineNo">1309</span>  @VisibleForTesting<a name="line.1309"></a>
+<span class="sourceLineNo">1310</span>  protected long getLastProcId() {<a name="line.1310"></a>
+<span class="sourceLineNo">1311</span>    return lastProcId.get();<a name="line.1311"></a>
+<span class="sourceLineNo">1312</span>  }<a name="line.1312"></a>
+<span class="sourceLineNo">1313</span><a name="line.1313"></a>
+<span class="sourceLineNo">1314</span>  @VisibleForTesting<a name="line.1314"></a>
+<span class="sourceLineNo">1315</span>  public Set&lt;Long&gt; getActiveProcIds() {<a name="line.1315"></a>
+<span class="sourceLineNo">1316</span>    return procedures.keySet();<a name="line.1316"></a>
+<span class="sourceLineNo">1317</span>  }<a name="line.1317"></a>
+<span class="sourceLineNo">1318</span><a name="line.1318"></a>
+<span class="sourceLineNo">1319</span>  Long getRootProcedureId(Procedure&lt;TEnvironment&gt; proc) {<a name="line.1319"></a>
+<span class="sourceLineNo">1320</span>    return Procedure.getRootProcedureId(procedures, proc);<a name="line.1320"></a>
+<span class="sourceLineNo">1321</span>  }<a name="line.1321"></a>
+<span class="sourceLineNo">1322</span><a name="line.1322"></a>
+<span class="sourceLineNo">1323</span>  // ==========================================================================<a name="line.1323"></a>
+<span class="sourceLineNo">1324</span>  //  Executions<a name="line.1324"></a>
+<span class="sourceLineNo">1325</span>  // ==========================================================================<a name="line.1325"></a>
+<span class="sourceLineNo">1326</span>  private void executeProcedure(Procedure&lt;TEnvironment&gt; proc) {<a name="line.1326"></a>
+<span class="sourceLineNo">1327</span>    if (proc.isFinished()) {<a name="line.1327"></a>
+<span class="sourceLineNo">1328</span>      LOG.debug("{} is already finished, skipping execution", proc);<a name="line.1328"></a>
+<span class="sourceLineNo">1329</span>      return;<a name="line.1329"></a>
+<span class="sourceLineNo">1330</span>    }<a name="line.1330"></a>
+<span class="sourceLineNo">1331</span>    final Long rootProcId = getRootProcedureId(proc);<a name="line.1331"></a>
+<span class="sourceLineNo">1332</span>    if (rootProcId == null) {<a name="line.1332"></a>
+<span class="sourceLineNo">1333</span>      // The 'proc' was ready to run but the root procedure was rolledback<a name="line.1333"></a>
+<span class="sourceLineNo">1334</span>      LOG.warn("Rollback because parent is done/rolledback proc=" + proc);<a name="line.1334"></a>
+<span class="sourceLineNo">1335</span>      executeRollback(proc);<a name="line.1335"></a>
+<span class="sourceLineNo">1336</span>      return;<a name="line.1336"></a>
+<span class="sourceLineNo">1337</span>    }<a name="line.1337"></a>
+<span class="sourceLineNo">1338</span><a name="line.1338"></a>
+<span class="sourceLineNo">1339</span>    RootProcedureState&lt;TEnvironment&gt; procStack = rollbackStack.get(rootProcId);<a name="line.1339"></a>
+<span class="sourceLineNo">1340</span>    if (procStack == null) {<a name="line.1340"></a>
+<span class="sourceLineNo">1341</span>      LOG.warn("RootProcedureState is null for " + proc.getProcId());<a name="line.1341"></a>
+<span class="sourceLineNo">1342</span>      return;<a name="line.1342"></a>
+<span class="sourceLineNo">1343</span>    }<a name="line.1343"></a>
+<span class="sourceLineNo">1344</span>    do {<a name="line.1344"></a>
+<span class="sourceLineNo">1345</span>      // Try to acquire the execution<a name="line.1345"></a>
+<span class="sourceLineNo">1346</span>      if (!procStack.acquire(proc)) {<a name="line.1346"></a>
+<span class="sourceLineNo">1347</span>        if (procStack.setRollback()) {<a name="line.1347"></a>
+<span class="sourceLineNo">1348</span>          // we have the 'rollback-lock' we can start rollingback<a name="line.1348"></a>
+<span class="sourceLineNo">1349</span>          switch (executeRollback(rootProcId, procStack)) {<a name="line.1349"></a>
+<span class="sourceLineNo">1350</span>            case LOCK_ACQUIRED:<a name="line.1350"></a>
 <span class="sourceLineNo">1351</span>              break;<a name="line.1351"></a>
-<span class="sourceLineNo">1352</span>            default:<a name="line.1352"></a>
-<span class="sourceLineNo">1353</span>              throw new UnsupportedOperationException();<a name="line.1353"></a>
-<span class="sourceLineNo">1354</span>          }<a name="line.1354"></a>
-<span class="sourceLineNo">1355</span>        } else {<a name="line.1355"></a>
-<span class="sourceLineNo">1356</span>          // if we can't rollback means that some child is still running.<a name="line.1356"></a>
-<span class="sourceLineNo">1357</span>          // the rollback will be executed after all the children are done.<a name="line.1357"></a>
-<span class="sourceLineNo">1358</span>          // If the procedure was never executed, remove and mark it as rolledback.<a name="line.1358"></a>
-<span class="sourceLineNo">1359</span>          if (!proc.wasExecuted()) {<a name="line.1359"></a>
-<span class="sourceLineNo">1360</span>            switch (executeRollback(proc)) {<a name="line.1360"></a>
-<span class="sourceLineNo">1361</span>              case LOCK_ACQUIRED:<a name="line.1361"></a>
-<span class="sourceLineNo">1362</span>                break;<a name="line.1362"></a>
-<span class="sourceLineNo">1363</span>              case LOCK_YIELD_WAIT:<a name="line.1363"></a>
-<span class="sourceLineNo">1364</span>                scheduler.yield(proc);<a name="line.1364"></a>
-<span class="sourceLineNo">1365</span>                break;<a name="line.1365"></a>
-<span class="sourceLineNo">1366</span>              case LOCK_EVENT_WAIT:<a name="line.1366"></a>
-<span class="sourceLineNo">1367</span>                LOG.info("LOCK_EVENT_WAIT can't rollback child running?..." + proc);<a name="line.1367"></a>
-<span class="sourceLineNo">1368</span>                break;<a name="line.1368"></a>
-<span class="sourceLineNo">1369</span>              default:<a name="line.1369"></a>
-<span class="sourceLineNo">1370</span>                throw new UnsupportedOperationException();<a name="line.1370"></a>
-<span class="sourceLineNo">1371</span>            }<a name="line.1371"></a>
-<span class="sourceLineNo">1372</span>          }<a name="line.1372"></a>
-<span class="sourceLineNo">1373</span>        }<a name="line.1373"></a>
-<span class="sourceLineNo">1374</span>        break;<a name="line.1374"></a>
-<span class="sourceLineNo">1375</span>      }<a name="line.1375"></a>
-<span class="sourceLineNo">1376</span><a name="line.1376"></a>
-<span class="sourceLineNo">1377</span>      // Execute the procedure<a name="line.1377"></a>
-<span class="sourceLineNo">1378</span>      assert proc.getState() == ProcedureState.RUNNABLE : proc;<a name="line.1378"></a>
-<span class="sourceLineNo">1379</span>      // Note that lock is NOT about concurrency but rather about ensuring<a name="line.1379"></a>
-<span class="sourceLineNo">1380</span>      // ownership of a procedure of an entity such as a region or table<a name="line.1380"></a>
-<span class="sourceLineNo">1381</span>      LockState lockState = acquireLock(proc);<a name="line.1381"></a>
-<span class="sourceLineNo">1382</span>      switch (lockState) {<a name="line.1382"></a>
-<span class="sourceLineNo">1383</span>        case LOCK_ACQUIRED:<a name="line.1383"></a>
-<span class="sourceLineNo">1384</span>          execProcedure(procStack, proc);<a name="line.1384"></a>
-<span class="sourceLineNo">1385</span>          break;<a name="line.1385"></a>
-<span class="sourceLineNo">1386</span>        case LOCK_YIELD_WAIT:<a name="line.1386"></a>
-<span class="sourceLineNo">1387</span>          LOG.info(lockState + " " + proc);<a name="line.1387"></a>
-<span class="sourceLineNo">1388</span>          scheduler.yield(proc);<a name="line.1388"></a>
-<span class="sourceLineNo">1389</span>          break;<a name="line.1389"></a>
-<span class="sourceLineNo">1390</span>        case LOCK_EVENT_WAIT:<a name="line.1390"></a>
-<span class="sourceLineNo">1391</span>          // Someone will wake us up when the lock is available<a name="line.1391"></a>
-<span class="sourceLineNo">1392</span>          LOG.debug(lockState + " " + proc);<a name="line.1392"></a>
+<span class="sourceLineNo">1352</span>            case LOCK_YIELD_WAIT:<a name="line.1352"></a>
+<span class="sourceLineNo">1353</span>              procStack.unsetRollback();<a name="line.1353"></a>
+<span class="sourceLineNo">1354</span>              scheduler.yield(proc);<a name="line.1354"></a>
+<span class="sourceLineNo">1355</span>              break;<a name="line.1355"></a>
+<span class="sourceLineNo">1356</span>            case LOCK_EVENT_WAIT:<a name="line.1356"></a>
+<span class="sourceLineNo">1357</span>              LOG.info("LOCK_EVENT_WAIT rollback..." + proc);<a name="line.1357"></a>
+<span class="sourceLineNo">1358</span>              procStack.unsetRollback();<a name="line.1358"></a>
+<span class="sourceLineNo">1359</span>              break;<a name="line.1359"></a>
+<span class="sourceLineNo">1360</span>            default:<a name="line.1360"></a>
+<span class="sourceLineNo">1361</span>              throw new UnsupportedOperationException();<a name="line.1361"></a>
+<span class="sourceLineNo">1362</span>          }<a name="line.1362"></a>
+<span class="sourceLineNo">1363</span>        } else {<a name="line.1363"></a>
+<span class="sourceLineNo">1364</span>          // if we can't rollback means that some child is still running.<a name="line.1364"></a>
+<span class="sourceLineNo">1365</span>          // the rollback will be executed after all the children are done.<a name="line.1365"></a>
+<span class="sourceLineNo">1366</span>          // If the procedure was never executed, remove and mark it as rolledback.<a name="line.1366"></a>
+<span class="sourceLineNo">1367</span>          if (!proc.wasExecuted()) {<a name="line.1367"></a>
+<span class="sourceLineNo">1368</span>            switch (executeRollback(proc)) {<a name="line.1368"></a>
+<span class="sourceLineNo">1369</span>              case LOCK_ACQUIRED:<a name="line.1369"></a>
+<span class="sourceLineNo">1370</span>                break;<a name="line.1370"></a>
+<span class="sourceLineNo">1371</span>              case LOCK_YIELD_WAIT:<a name="line.1371"></a>
+<span class="sourceLineNo">1372</span>                scheduler.yield(proc);<a name="line.1372"></a>
+<span class="sourceLineNo">1373</span>                break;<a name="line.1373"></a>
+<span class="sourceLineNo">1374</span>              case LOCK_EVENT_WAIT:<a name="line.1374"></a>
+<span class="sourceLineNo">1375</span>                LOG.info("LOCK_EVENT_WAIT can't rollback child running?..." + proc);<a name="line.1375"></a>
+<span class="sourceLineNo">1376</span>                break;<a name="line.1376"></a>
+<span class="sourceLineNo">1377</span>              default:<a name="line.1377"></a>
+<span class="sourceLineNo">1378</span>                throw new UnsupportedOperationException();<a name="line.1378"></a>
+<span class="sourceLineNo">1379</span>            }<a name="line.1379"></a>
+<span class="sourceLineNo">1380</span>          }<a name="line.1380"></a>
+<span class="sourceLineNo">1381</span>        }<a name="line.1381"></a>
+<span class="sourceLineNo">1382</span>        break;<a name="line.1382"></a>
+<span class="sourceLineNo">1383</span>      }<a name="line.1383"></a>
+<span class="sourceLineNo">1384</span><a name="line.1384"></a>
+<span class="sourceLineNo">1385</span>      // Execute the procedure<a name="line.1385"></a>
+<span class="sourceLineNo">1386</span>      assert proc.getState() == ProcedureState.RUNNABLE : proc;<a name="line.1386"></a>
+<span class="sourceLineNo">1387</span>      // Note that lock is NOT about concurrency but rather about ensuring<a name="line.1387"></a>
+<span class="sourceLineNo">1388</span>      // ownership of a procedure of an entity such as a region or table<a name="line.1388"></a>
+<span class="sourceLineNo">1389</span>      LockState lockState = acquireLock(proc);<a name="line.1389"></a>
+<span class="sourceLineNo">1390</span>      switch (lockState) {<a name="line.1390"></a>
+<span class="sourceLineNo">1391</span>        case LOCK_ACQUIRED:<a name="line.1391"></a>
+<span class="sourceLineNo">1392</span>          execProcedure(procStack, proc);<a name="line.1392"></a>
 <span class="sourceLineNo">1393</span>          break;<a name="line.1393"></a>
-<span class="sourceLineNo">1394</span>        default:<a name="line.1394"></a>
-<span class="sourceLineNo">1395</span>          throw new UnsupportedOperationException();<a name="line.1395"></a>
-<span class="sourceLineNo">1396</span>      }<a name="line.1396"></a>
-<span class="sourceLineNo">1397</span>      procStack.release(proc);<a name="line.1397"></a>
-<span class="sourceLineNo">1398</span><a name="line.1398"></a>
-<span class="sourceLineNo">1399</span>      if (proc.isSuccess()) {<a name="line.1399"></a>
-<span class="sourceLineNo">1400</span>        // update metrics on finishing the procedure<a name="line.1400"></a>
-<span class="sourceLineNo">1401</span>        proc.updateMetricsOnFinish(getEnvironment(), proc.elapsedTime(), true);<a name="line.1401"></a>
-<span class="sourceLineNo">1402</span>        LOG.info("Finished " + proc + " in " + StringUtils.humanTimeDiff(proc.elapsedTime()));<a name="line.1402"></a>
-<span class="sourceLineNo">1403</span>        // Finalize the procedure state<a name="line.1403"></a>
-<span class="sourceLineNo">1404</span>        if (proc.getProcId() == rootProcId) {<a name="line.1404"></a>
-<span class="sourceLineNo">1405</span>          procedureFinished(proc);<a name="line.1405"></a>
-<span class="sourceLineNo">1406</span>        } else {<a name="line.1406"></a>
-<span class="sourceLineNo">1407</span>          execCompletionCleanup(proc);<a name="line.1407"></a>
-<span class="sourceLineNo">1408</span>        }<a name="line.1408"></a>
-<span class="sourceLineNo">1409</span>        break;<a name="line.1409"></a>
-<span class="sourceLineNo">1410</span>      }<a name="line.1410"></a>
-<span class="sourceLineNo">1411</span>    } while (procStack.isFailed());<a name="line.1411"></a>
-<span class="sourceLineNo">1412</span>  }<a name="line.1412"></a>
-<span class="sourceLineNo">1413</span><a name="line.1413"></a>
-<span class="sourceLineNo">1414</span>  private LockState acquireLock(Procedure&lt;TEnvironment&gt; proc) {<a name="line.1414"></a>
-<span class="sourceLineNo">1415</span>    TEnvironment env = getEnvironment();<a name="line.1415"></a>
-<span class="sourceLineNo">1416</span>    // if holdLock is true, then maybe we already have the lock, so just return LOCK_ACQUIRED if<a name="line.1416"></a>
-<span class="sourceLineNo">1417</span>    // hasLock is true.<a name="line.1417"></a>
-<span class="sourceLineNo">1418</span>    if (proc.hasLock()) {<a name="line.1418"></a>
-<span class="sourceLineNo">1419</span>      return LockState.LOCK_ACQUIRED;<a name="line.1419"></a>
-<span class="sourceLineNo">1420</span>    }<a name="line.1420"></a>
-<span class="sourceLineNo">1421</span>    return proc.doAcquireLock(env, store);<a name="line.1421"></a>
-<span class="sourceLineNo">1422</span>  }<a name="line.1422"></a>
-<span class="sourceLineNo">1423</span><a name="line.1423"></a>
-<span class="sourceLineNo">1424</span>  private void releaseLock(Procedure&lt;TEnvironment&gt; proc, boolean force) {<a name="line.1424"></a>
-<span class="sourceLineNo">1425</span>    TEnvironment env = getEnvironment();<a name="line.1425"></a>
-<span class="sourceLineNo">1426</span>    // For how the framework works, we know that we will always have the lock<a name="line.1426"></a>
-<span class="sourceLineNo">1427</span>    // when we call releaseLock(), so we can avoid calling proc.hasLock()<a name="line.1427"></a>
-<span class="sourceLineNo">1428</span>    if (force || !proc.holdLock(env) || proc.isFinished()) {<a name="line.1428"></a>
-<span class="sourceLineNo">1429</span>      proc.doReleaseLock(env, store);<a name="line.1429"></a>
-<span class="sourceLineNo">1430</span>    }<a name="line.1430"></a>
-<span class="sourceLineNo">1431</span>  }<a name="line.1431"></a>
-<span class="sourceLineNo">1432</span><a name="line.1432"></a>
-<span class="sourceLineNo">1433</span>  /**<a name="line.1433"></a>
-<span class="sourceLineNo">1434</span>   * Execute the rollback of the full procedure stack. Once the procedure is rolledback, the<a name="line.1434"></a>
-<span class="sourceLineNo">1435</span>   * root-procedure will be visible as finished to user, and the result will be the fatal exception.<a name="line.1435"></a>
-<span class="sourceLineNo">1436</span>   */<a name="line.1436"></a>
-<span class="sourceLineNo">1437</span>  private LockState executeRollback(long rootProcId, RootProcedureState&lt;TEnvironment&gt; procStack) {<a name="line.1437"></a>
-<span class="sourceLineNo">1438</span>    Procedure&lt;TEnvironment&gt; rootProc = procedures.get(rootProcId);<a name="line.1438"></a>
-<span class="sourceLineNo">1439</span>    RemoteProcedureException exception = rootProc.getException();<a name="line.1439"></a>
-<span class="sourceLineNo">1440</span>    // TODO: This needs doc. The root proc doesn't have an exception. Maybe we are<a name="line.1440"></a>
-<span class="sourceLineNo">1441</span>    // rolling back because the subprocedure does. Clarify.<a name="line.1441"></a>
-<span class="sourceLineNo">1442</span>    if (exception == null) {<a name="line.1442"></a>
-<span class="sourceLineNo">1443</span>      exception = procStack.getException();<a name="line.1443"></a>
-<span class="sourceLineNo">1444</span>      rootProc.setFailure(exception);<a name="line.1444"></a>
-<span class="sourceLineNo">1445</span>      store.update(rootProc);<a name="line.1445"></a>
-<span cla

<TRUNCATED>

[28/29] hbase-site git commit: Published site at 5e84997f2ffdbcf5f849d70c30ddbe2db4039ca4.

Posted by gi...@apache.org.
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/27f5bfb5/checkstyle-aggregate.html
----------------------------------------------------------------------
diff --git a/checkstyle-aggregate.html b/checkstyle-aggregate.html
index a98b531..94de370 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="20181109" />
+    <meta name="Date-Revision-yyyymmdd" content="20181110" />
     <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" />
@@ -294,7 +294,7 @@
 <td>3804</td>
 <td>0</td>
 <td>0</td>
-<td>15097</td></tr></table></div>
+<td>15095</td></tr></table></div>
 <div class="section">
 <h2><a name="Files"></a>Files</h2>
 <table border="0" class="table table-striped">
@@ -4082,7 +4082,7 @@
 <td><a href="#org.apache.hadoop.hbase.mapreduce.CopyTable.java">org/apache/hadoop/hbase/mapreduce/CopyTable.java</a></td>
 <td>0</td>
 <td>0</td>
-<td>14</td></tr>
+<td>13</td></tr>
 <tr class="b">
 <td><a href="#org.apache.hadoop.hbase.mapreduce.DefaultVisibilityExpressionResolver.java">org/apache/hadoop/hbase/mapreduce/DefaultVisibilityExpressionResolver.java</a></td>
 <td>0</td>
@@ -5087,7 +5087,7 @@
 <td><a href="#org.apache.hadoop.hbase.master.procedure.MasterProcedureScheduler.java">org/apache/hadoop/hbase/master/procedure/MasterProcedureScheduler.java</a></td>
 <td>0</td>
 <td>0</td>
-<td>4</td></tr>
+<td>3</td></tr>
 <tr class="a">
 <td><a href="#org.apache.hadoop.hbase.master.procedure.MasterProcedureSchedulerPerformanceEvaluation.java">org/apache/hadoop/hbase/master/procedure/MasterProcedureSchedulerPerformanceEvaluation.java</a></td>
 <td>0</td>
@@ -9729,7 +9729,7 @@
 <tr class="b">
 <td></td>
 <td><a class="externalLink" href="http://checkstyle.sourceforge.net/config_blocks.html#NeedBraces">NeedBraces</a></td>
-<td>1794</td>
+<td>1793</td>
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td></tr>
 <tr class="a">
 <td>coding</td>
@@ -9819,19 +9819,19 @@
 <li>caseIndent: <tt>&quot;2&quot;</tt></li>
 <li>basicOffset: <tt>&quot;2&quot;</tt></li>
 <li>lineWrappingIndentation: <tt>&quot;2&quot;</tt></li></ul></td>
-<td>4827</td>
+<td>4826</td>
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td></tr>
 <tr class="a">
 <td>javadoc</td>
 <td><a class="externalLink" href="http://checkstyle.sourceforge.net/config_javadoc.html#JavadocTagContinuationIndentation">JavadocTagContinuationIndentation</a>
 <ul>
 <li>offset: <tt>&quot;2&quot;</tt></li></ul></td>
-<td>731</td>
+<td>730</td>
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td></tr>
 <tr class="b">
 <td></td>
 <td><a class="externalLink" href="http://checkstyle.sourceforge.net/config_javadoc.html#NonEmptyAtclauseDescription">NonEmptyAtclauseDescription</a></td>
-<td>3493</td>
+<td>3494</td>
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td></tr>
 <tr class="a">
 <td>misc</td>
@@ -19245,7 +19245,7 @@
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
-<td>JavadocTagContinuationIndentation</td>
+<td>NonEmptyAtclauseDescription</td>
 <td>Javadoc comment at column 0 has parse error. Details: no viable alternative at input '   *' while parsing JAVADOC_TAG</td>
 <td>117</td></tr>
 <tr class="a">
@@ -55028,107 +55028,101 @@
 <td>imports</td>
 <td>ImportOrder</td>
 <td>Wrong order for 'org.apache.hadoop.hbase.client.Admin' import.</td>
-<td>35</td></tr>
+<td>36</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>82</td></tr>
+<td>83</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 12, expected level should be 10.</td>
-<td>127</td></tr>
+<td>128</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'if' child has incorrect indentation level 12, expected level should be 10.</td>
-<td>128</td></tr>
+<td>129</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 12, expected level should be 10.</td>
-<td>129</td></tr>
+<td>130</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'if' child has incorrect indentation level 12, expected level should be 10.</td>
-<td>130</td></tr>
+<td>131</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'else' child has incorrect indentation level 12, expected level should be 10.</td>
-<td>133</td></tr>
+<td>134</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 103).</td>
-<td>212</td></tr>
+<td>213</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 106).</td>
-<td>214</td></tr>
+<td>215</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>215</td></tr>
+<td>216</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 106).</td>
-<td>217</td></tr>
+<td>218</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 110).</td>
-<td>220</td></tr>
+<td>221</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>363</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'array initialization' child has incorrect indentation level 10, expected level should be one of the following: 8, 72, 73.</td>
-<td>374</td></tr></table></div>
+<td>364</td></tr></table></div>
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.mapreduce.DefaultVisibilityExpressionResolver.java">org/apache/hadoop/hbase/mapreduce/DefaultVisibilityExpressionResolver.java</h3>
 <table border="0" class="table table-striped">
-<tr class="a">
+<tr class="b">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>ImportOrder</td>
 <td>Wrong order for 'org.apache.hadoop.hbase.client.Connection' import.</td>
 <td>35</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
 <td>101</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
@@ -55137,31 +55131,31 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.mapreduce.Driver.java">org/apache/hadoop/hbase/mapreduce/Driver.java</h3>
 <table border="0" class="table table-striped">
-<tr class="a">
+<tr class="b">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>ImportOrder</td>
 <td>Wrong order for 'org.apache.hadoop.hbase.mapreduce.replication.VerifyReplication' import.</td>
 <td>24</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>design</td>
 <td>HideUtilityClassConstructor</td>
 <td>Utility classes should not have a public or default constructor.</td>
 <td>33</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>37</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
@@ -55170,25 +55164,25 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.mapreduce.Export.java">org/apache/hadoop/hbase/mapreduce/Export.java</h3>
 <table border="0" class="table table-striped">
-<tr class="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>ImportOrder</td>
 <td>Wrong order for 'org.apache.hadoop.hbase.HBaseConfiguration' import.</td>
 <td>30</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'throws' has incorrect indentation level 2, expected level should be 4.</td>
 <td>59</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
@@ -55197,55 +55191,55 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.mapreduce.ExportUtils.java">org/apache/hadoop/hbase/mapreduce/ExportUtils.java</h3>
 <table border="0" class="table table-striped">
-<tr class="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>ImportOrder</td>
 <td>Wrong order for 'org.apache.hadoop.hbase.client.Scan' import.</td>
 <td>33</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>UnusedImports</td>
 <td>Unused import - org.apache.hadoop.hbase.filter.CompareFilter.</td>
 <td>34</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>ImportOrder</td>
 <td>Wrong order for 'org.apache.hadoop.hbase.util.Bytes' import.</td>
 <td>42</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 112).</td>
 <td>70</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 101).</td>
 <td>74</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
 <td>88</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 107).</td>
 <td>107</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
@@ -55254,31 +55248,31 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.mapreduce.GroupingTableMapper.java">org/apache/hadoop/hbase/mapreduce/GroupingTableMapper.java</h3>
 <table border="0" class="table table-striped">
-<tr class="a">
+<tr class="b">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>ImportOrder</td>
 <td>Wrong order for 'org.apache.hadoop.conf.Configurable' import.</td>
 <td>25</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'extends' has incorrect indentation level 0, expected level should be 2.</td>
 <td>40</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>JavadocTagContinuationIndentation</td>
 <td>Line continuation have incorrect indentation level, expected level should be 2.</td>
 <td>61</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
@@ -55287,13 +55281,13 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.mapreduce.HFileInputFormat.java">org/apache/hadoop/hbase/mapreduce/HFileInputFormat.java</h3>
 <table border="0" class="table table-striped">
-<tr class="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
@@ -55302,115 +55296,115 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.mapreduce.HFileOutputFormat2.java">org/apache/hadoop/hbase/mapreduce/HFileOutputFormat2.java</h3>
 <table border="0" class="table table-striped">
-<tr class="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>MethodLength</td>
 <td>Method length is 279 lines (max allowed is 150).</td>
 <td>191</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 104).</td>
 <td>198</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 102).</td>
 <td>435</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'throws' has incorrect indentation level 6, expected level should be 8.</td>
 <td>465</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>LeftCurly</td>
 <td>'{' at column 5 should be on the previous line.</td>
 <td>506</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>LeftCurly</td>
 <td>'{' at column 9 should be on the previous line.</td>
 <td>513</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>whitespace</td>
 <td>MethodParamPad</td>
 <td>'(' should be on the previous line.</td>
 <td>519</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>whitespace</td>
 <td>MethodParamPad</td>
 <td>'(' should be on the previous line.</td>
 <td>547</td></tr>
-<tr class="a">
+<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>650</td></tr>
-<tr class="b">
+<tr class="a">
 <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>651</td></tr>
-<tr class="a">
+<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>653</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>whitespace</td>
 <td>ParenPad</td>
 <td>')' is preceded with whitespace.</td>
 <td>653</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>LeftCurly</td>
 <td>'{' at column 5 should be on the previous line.</td>
 <td>654</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 146).</td>
 <td>662</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 101).</td>
 <td>665</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 103).</td>
 <td>861</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 124).</td>
 <td>863</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
@@ -55419,31 +55413,31 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.mapreduce.HRegionPartitioner.java">org/apache/hadoop/hbase/mapreduce/HRegionPartitioner.java</h3>
 <table border="0" class="table table-striped">
-<tr class="a">
+<tr class="b">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>ImportOrder</td>
 <td>Wrong order for 'org.apache.hadoop.conf.Configurable' import.</td>
 <td>25</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'extends' has incorrect indentation level 0, expected level should be 2.</td>
 <td>52</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'implements' has incorrect indentation level 0, expected level should be 2.</td>
 <td>53</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>whitespace</td>
 <td>ParenPad</td>
@@ -55452,13 +55446,13 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.mapreduce.HashTable.java">org/apache/hadoop/hbase/mapreduce/HashTable.java</h3>
 <table border="0" class="table table-striped">
-<tr class="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
@@ -55467,25 +55461,25 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.mapreduce.IdentityTableMapper.java">org/apache/hadoop/hbase/mapreduce/IdentityTableMapper.java</h3>
 <table border="0" class="table table-striped">
-<tr class="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>ImportOrder</td>
 <td>Wrong order for 'org.apache.hadoop.hbase.client.Result' import.</td>
 <td>24</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'extends' has incorrect indentation level 0, expected level should be 2.</td>
 <td>34</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
@@ -55494,25 +55488,25 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.mapreduce.IdentityTableReducer.java">org/apache/hadoop/hbase/mapreduce/IdentityTableReducer.java</h3>
 <table border="0" class="table table-striped">
-<tr class="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>ImportOrder</td>
 <td>Wrong order for 'org.apache.hadoop.hbase.client.Mutation' import.</td>
 <td>26</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'extends' has incorrect indentation level 0, expected level should be 2.</td>
 <td>53</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
@@ -55521,97 +55515,97 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.mapreduce.Import.java">org/apache/hadoop/hbase/mapreduce/Import.java</h3>
 <table border="0" class="table table-striped">
-<tr class="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>ImportOrder</td>
 <td>Wrong order for 'org.apache.hadoop.hbase.KeyValue' import.</td>
 <td>45</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>ImportOrder</td>
 <td>Wrong order for 'org.apache.hadoop.hbase.client.Admin' import.</td>
 <td>52</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
 <td>186</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'throws' has incorrect indentation level 4, expected level should be 6.</td>
 <td>208</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
 <td>219</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'throws' has incorrect indentation level 4, expected level should be 6.</td>
 <td>273</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
 <td>285</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'throws' has incorrect indentation level 4, expected level should be 6.</td>
 <td>320</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'throws' has incorrect indentation level 4, expected level should be 6.</td>
 <td>330</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
 <td>349</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
 <td>429</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'if' child has incorrect indentation level 12, expected level should be 10.</td>
 <td>542</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'if' child has incorrect indentation level 12, expected level should be 10.</td>
 <td>546</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>JavadocTagContinuationIndentation</td>
 <td>Line continuation have incorrect indentation level, expected level should be 2.</td>
 <td>564</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
@@ -55620,139 +55614,139 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.mapreduce.ImportTsv.java">org/apache/hadoop/hbase/mapreduce/ImportTsv.java</h3>
 <table border="0" class="table table-striped">
-<tr class="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>ImportOrder</td>
 <td>Wrong order for 'org.apache.hadoop.hbase.client.Admin' import.</td>
 <td>44</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>ImportOrder</td>
 <td>Wrong order for 'org.apache.hadoop.hbase.client.ColumnFamilyDescriptor' import.</td>
 <td>63</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>JavadocTagContinuationIndentation</td>
 <td>Line continuation have incorrect indentation level, expected level should be 2.</td>
 <td>155</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>156</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'throws' has incorrect indentation level 4, expected level should be 6.</td>
 <td>250</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
 <td>399</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'else' construct must use '{}'s.</td>
 <td>401</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>424</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>425</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>427</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 109).</td>
 <td>591</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
 <td>631</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 113).</td>
 <td>658</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 101).</td>
 <td>660</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 107).</td>
 <td>677</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 105).</td>
 <td>691</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 103).</td>
 <td>694</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 102).</td>
 <td>695</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
 <td>729</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
 <td>739</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
 <td>750</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
@@ -55761,19 +55755,19 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.mapreduce.IndexBuilder.java">org/apache/hadoop/hbase/mapreduce/IndexBuilder.java</h3>
 <table border="0" class="table table-striped">
-<tr class="a">
+<tr class="b">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 127).</td>
 <td>55</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
@@ -55782,73 +55776,73 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.mapreduce.IntegrationTestBulkLoad.java">org/apache/hadoop/hbase/mapreduce/IntegrationTestBulkLoad.java</h3>
 <table border="0" class="table table-striped">
-<tr class="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
 <td>209</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
 <td>254</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>LeftCurly</td>
 <td>'{' at column 29 should have line break after.</td>
 <td>323</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>LeftCurly</td>
 <td>'{' at column 36 should have line break after.</td>
 <td>325</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'InterruptedException' has incorrect indentation level 4, expected level should be 6.</td>
 <td>339</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 102).</td>
 <td>378</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 123).</td>
 <td>385</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 101).</td>
 <td>680</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>695</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>696</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
@@ -55857,37 +55851,37 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.mapreduce.IntegrationTestImportTsv.java">org/apache/hadoop/hbase/mapreduce/IntegrationTestImportTsv.java</h3>
 <table border="0" class="table table-striped">
-<tr class="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>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>149</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'block' child has incorrect indentation level 6, expected level should be one of the following: 8, 10.</td>
 <td>150</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'block rcurly' has incorrect indentation level 4, expected level should be one of the following: 6, 8.</td>
 <td>151</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
 <td>170</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
@@ -55896,19 +55890,19 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.mapreduce.IntegrationTestTableSnapshotInputFormat.java">org/apache/hadoop/hbase/mapreduce/IntegrationTestTableSnapshotInputFormat.java</h3>
 <table border="0" class="table table-striped">
-<tr class="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>ImportOrder</td>
 <td>Wrong order for 'org.apache.hadoop.hbase.TableName' import.</td>
 <td>29</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>LeftCurly</td>
@@ -55917,13 +55911,13 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.mapreduce.MapreduceTestingShim.java">org/apache/hadoop/hbase/mapreduce/MapreduceTestingShim.java</h3>
 <table border="0" class="table table-striped">
-<tr class="a">
+<tr class="b">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
@@ -55932,25 +55926,25 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.mapreduce.MultiTableHFileOutputFormat.java">org/apache/hadoop/hbase/mapreduce/MultiTableHFileOutputFormat.java</h3>
 <table border="0" class="table table-striped">
-<tr class="a">
+<tr class="b">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>ImportOrder</td>
 <td>Wrong order for 'org.apache.hadoop.hbase.client.TableDescriptor' import.</td>
 <td>24</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>ImportOrder</td>
 <td>Wrong order for 'java.io.IOException' import.</td>
 <td>29</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
@@ -55959,13 +55953,13 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.mapreduce.MultiTableInputFormat.java">org/apache/hadoop/hbase/mapreduce/MultiTableInputFormat.java</h3>
 <table border="0" class="table table-striped">
-<tr class="a">
+<tr class="b">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>ImportOrder</td>
@@ -55974,31 +55968,31 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.mapreduce.MultiTableInputFormatBase.java">org/apache/hadoop/hbase/mapreduce/MultiTableInputFormatBase.java</h3>
 <table border="0" class="table table-striped">
-<tr class="a">
+<tr class="b">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>ImportOrder</td>
 <td>Wrong order for 'org.apache.hadoop.hbase.HRegionInfo' import.</td>
 <td>28</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>ImportOrder</td>
 <td>Wrong order for 'java.util.Map' import.</td>
 <td>46</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>ImportOrder</td>
 <td>Wrong order for 'java.util.HashMap' import.</td>
 <td>47</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
@@ -56007,31 +56001,31 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.mapreduce.MultiTableInputFormatTestBase.java">org/apache/hadoop/hbase/mapreduce/MultiTableInputFormatTestBase.java</h3>
 <table border="0" class="table table-striped">
-<tr class="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
 <td>160</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>217</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>218</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
@@ -56040,25 +56034,25 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.mapreduce.MultiTableOutputFormat.java">org/apache/hadoop/hbase/mapreduce/MultiTableOutputFormat.java</h3>
 <table border="0" class="table table-striped">
-<tr class="a">
+<tr class="b">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>ImportOrder</td>
 <td>Wrong order for 'org.apache.hadoop.conf.Configuration' import.</td>
 <td>28</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>ImportOrder</td>
 <td>Wrong order for 'org.apache.hadoop.hbase.client.Durability' import.</td>
 <td>37</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
@@ -56067,25 +56061,25 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.mapreduce.MultiTableSnapshotInputFormat.java">org/apache/hadoop/hbase/mapreduce/MultiTableSnapshotInputFormat.java</h3>
 <table border="0" class="table table-striped">
-<tr class="a">
+<tr class="b">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>ImportOrder</td>
 <td>Wrong order for 'org.apache.hadoop.conf.Configuration' import.</td>
 <td>22</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>ImportOrder</td>
 <td>Wrong order for 'org.apache.hadoop.hbase.client.Scan' import.</td>
 <td>25</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>ImportOrder</td>
@@ -56094,73 +56088,73 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.mapreduce.MultiTableSnapshotInputFormatImpl.java">org/apache/hadoop/hbase/mapreduce/MultiTableSnapshotInputFormatImpl.java</h3>
 <table border="0" class="table table-striped">
-<tr class="a">
+<tr class="b">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>67</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>68</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>69</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>70</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>91</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>127</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>153</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>154</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>155</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>182</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
@@ -56169,61 +56163,61 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.mapreduce.MultithreadedTableMapper.java">org/apache/hadoop/hbase/mapreduce/MultithreadedTableMapper.java</h3>
 <table border="0" class="table table-striped">
-<tr class="a">
+<tr class="b">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'Class' has incorrect indentation level 2, expected level should be 4.</td>
 <td>98</td></tr>
-<tr class="a">
+<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>100</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'void' has incorrect indentation level 2, expected level should be 4.</td>
 <td>112</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'extends' has incorrect indentation level 2, expected level should be 4.</td>
 <td>147</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'method def rparen' has incorrect indentation level 8, expected level should be 4.</td>
 <td>164</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'InterruptedException' has incorrect indentation level 4, expected level should be 6.</td>
 <td>195</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'InterruptedException' has incorrect indentation level 4, expected level should be 6.</td>
 <td>200</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 106).</td>
 <td>266</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
@@ -56232,19 +56226,19 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.mapreduce.MutationSerialization.java">org/apache/hadoop/hbase/mapreduce/MutationSerialization.java</h3>
 <table border="0" class="table table-striped">
-<tr class="a">
+<tr class="b">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>ImportOrder</td>
 <td>Wrong order for 'org.apache.hadoop.hbase.client.Delete' import.</td>
 <td>25</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>ImportOrder</td>
@@ -56253,13 +56247,13 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.mapreduce.NMapInputFormat.java">org/apache/hadoop/hbase/mapreduce/NMapInputFormat.java</h3>
 <table border="0" class="table table-striped">
-<tr class="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
@@ -56268,25 +56262,25 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.mapreduce.PutCombiner.java">org/apache/hadoop/hbase/mapreduce/PutCombiner.java</h3>
 <table border="0" class="table table-striped">
-<tr class="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>ImportOrder</td>
 <td>Wrong order for 'java.util.Map' import.</td>
 <td>24</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>ImportOrder</td>
 <td>Wrong order for 'org.apache.hadoop.hbase.Cell' import.</td>
 <td>29</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
@@ -56295,25 +56289,25 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.mapreduce.PutSortReducer.java">org/apache/hadoop/hbase/mapreduce/PutSortReducer.java</h3>
 <table border="0" class="table table-striped">
-<tr class="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>ImportOrder</td>
 <td>Wrong order for 'org.apache.hadoop.hbase.client.Put' import.</td>
 <td>37</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>LeftCurly</td>
 <td>'{' at column 3 should be on the previous line.</td>
 <td>74</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
@@ -56322,25 +56316,25 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.mapreduce.ResultSerialization.java">org/apache/hadoop/hbase/mapreduce/ResultSerialization.java</h3>
 <table border="0" class="table table-striped">
-<tr class="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>ImportOrder</td>
 <td>Wrong order for 'org.apache.hadoop.hbase.client.Result' import.</td>
 <td>35</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>ImportOrder</td>
 <td>Wrong order for 'org.apache.hadoop.hbase.util.Bytes' import.</td>
 <td>38</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
@@ -56349,49 +56343,49 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.mapreduce.RowCounter.java">org/apache/hadoop/hbase/mapreduce/RowCounter.java</h3>
 <table border="0" class="table table-striped">
-<tr class="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>ImportOrder</td>
 <td>Wrong order for 'java.util.ArrayList' import.</td>
 <td>23</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>ImportOrder</td>
 <td>Wrong order for 'org.apache.hadoop.conf.Configuration' import.</td>
 <td>30</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'extends' has incorrect indentation level 2, expected level should be 4.</td>
 <td>65</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'throws' has incorrect indentation level 4, expected level should be 6.</td>
 <td>82</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'throws' has incorrect indentation level 2, expected level should be 4.</td>
 <td>97</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>194</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
@@ -56400,13 +56394,13 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.mapreduce.RowCounter_Counters.properties">org/apache/hadoop/hbase/mapreduce/RowCounter_Counters.properties</h3>
 <table border="0" class="table table-striped">
-<tr class="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>whitespace</td>
 <td>FileTabCharacter</td>
@@ -56415,25 +56409,25 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.mapreduce.SampleUploader.java">org/apache/hadoop/hbase/mapreduce/SampleUploader.java</h3>
 <table border="0" class="table table-striped">
-<tr class="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'extends' has incorrect indentation level 2, expected level should be 4.</td>
 <td>70</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'throws' has incorrect indentation level 4, expected level should be 6.</td>
 <td>77</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
@@ -56442,43 +56436,43 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.mapreduce.SimpleTotalOrderPartitioner.java">org/apache/hadoop/hbase/mapreduce/SimpleTotalOrderPartitioner.java</h3>
 <table border="0" class="table table-striped">
-<tr class="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>ImportOrder</td>
 <td>Wrong order for 'org.apache.hadoop.conf.Configurable' import.</td>
 <td>26</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>43</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'implements' has incorrect indentation level 0, expected level should be 2.</td>
 <td>49</td></tr>
-<tr class="b">
+<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>52</td></tr>
-<tr class="a">
+<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>54</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
@@ -56487,31 +56481,31 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.mapreduce.SyncTable.java">org/apache/hadoop/hbase/mapreduce/SyncTable.java</h3>
 <table border="0" class="table table-striped">
-<tr class="a">
+<tr class="b">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'method def' child has incorrect indentation level 8, expected level should be 6.</td>
 <td>220</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'method def' child has incorrect indentation level 8, expected level should be 6.</td>
 <td>221</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'method def' child has incorrect indentation level 8, expected level should be 6.</td>
 <td>223</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
@@ -56520,37 +56514,37 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.mapreduce.TableInputFormat.java">org/apache/hadoop/hbase/mapreduce/TableInputFormat.java</h3>
 <table border="0" class="table table-striped">
-<tr class="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>ImportOrder</td>
 <td>Wrong order for 'org.apache.hadoop.hbase.client.Connection' import.</td>
 <td>33</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>ImportOrder</td>
 <td>Wrong order for 'org.apache.hadoop.hbase.util.Pair' import.</td>
 <td>40</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'implements' has incorrect indentation level 0, expected level should be 2.</td>
 <td>49</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'catch' child has incorrect indentation level 10, expected level should be 8.</td>
 <td>130</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
@@ -56559,127 +56553,127 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.mapreduce.TableInputFormatBase.java">org/apache/hadoop/hbase/mapreduce/TableInputFormatBase.java</h3>
 <table border="0" class="table table-striped">
-<tr class="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>UnusedImports</td>
 <td>Unused import - java.util.Map.</td>
 <td>29</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>ImportOrder</td>
 <td>Wrong order for 'org.apache.hadoop.hbase.HConstants' import.</td>
 <td>34</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 101).</td>
 <td>103</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 102).</td>
 <td>106</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 113).</td>
 <td>124</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 102).</td>
 <td>128</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>291</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>366</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 105).</td>
 <td>433</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 106).</td>
 <td>455</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 103).</td>
 <td>469</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
 <td>512</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 116).</td>
 <td>523</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 127).</td>
 <td>525</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 135).</td>
 <td>526</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 150).</td>
 <td>531</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>578</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
 <td>603</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>648</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>LeftCurly</td>
@@ -56688,403 +56682,403 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.mapreduce.TableMapReduceUtil.java">org/apache/hadoop/hbase/mapreduce/TableMapReduceUtil.java</h3>
 <table border="0" class="table table-striped">
-<tr class="a">
+<tr class="b">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>ImportOrder</td>
 <td>Wrong order for 'org.apache.hadoop.hbase.client.Connection' import.</td>
 <td>47</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>ImportOrder</td>
 <td>Wrong order for 'org.apache.hadoop.hbase.security.User' import.</td>
 <td>54</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>ImportOrder</td>
 <td>Wrong order for 'com.codahale.metrics.MetricRegistry' import.</td>
 <td>65</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>design</td>
 <td>HideUtilityClassConstructor</td>
 <td>Utility classes should not have a public or default constructor.</td>
 <td>70</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>JavadocTagContinuationIndentation</td>
 <td>Line continuation have incorrect indentation level, expected level should be 2.</td>
 <td>85</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'throws' has incorrect indentation level 2, expected level should be 4.</td>
 <td>92</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>JavadocTagContinuationIndentation</td>
 <td>Line continuation have incorrect indentation level, expected level should be 2.</td>
 <td>108</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>JavadocTagContinuationIndentation</td>
 <td>Line continuation have incorrect indentation level, expected level should be 2.</td>
 <td>136</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'method def modifier' has incorrect indentation level 3, expected level should be 2.</td>
 <td>139</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'throws' has incorrect indentation level 2, expected level should be 5.</td>
 <td>143</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'method def' child has incorrect indentation level 6, expected level should be 4.</td>
 <td>144</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>JavadocTagContinuationIndentation</td>
 <td>Line continuation have incorrect indentation level, expected level should be 2.</td>
 <td>158</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'method def modifier' has incorrect indentation level 3, expected level should be 2.</td>
 <td>163</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'throws' has incorrect indentation level 3, expected level should be 5.</td>
 <td>168</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'method def' child has incorrect indentation level 5, expected level should be 4.</td>
 <td>169</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'method def rcurly' has incorrect indentation level 3, expected level should be 2.</td>
 <td>171</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>JavadocTagContinuationIndentation</td>
 <td>Line continuation have incorrect indentation level, expected level should be 2.</td>
 <td>184</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'throws' has incorrect indentation level 2, expected level should be 4.</td>
 <td>197</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
 <td>199</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
 <td>200</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>JavadocTagContinuationIndentation</td>
 <td>Line continuation have incorrect indentation level, expected level should be 2.</td>
 <td>230</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'throws' has incorrect indentation level 2, expected level should be 4.</td>
 <td>241</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'method def' child has incorrect indentation level 6, expected level should be 4.</td>
 <td>242</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>JavadocTagContinuationIndentation</td>
 <td>Line continuation have incorrect indentation level, expected level should be 2.</td>
 <td>256</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'throws' has incorrect indentation level 2, expected level should be 4.</td>
 <td>266</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'method def' child has incorrect indentation level 6, expected level should be 4.</td>
 <td>267</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>JavadocTagContinuationIndentation</td>
 <td>Line continuation have incorrect indentation level, expected level should be 2.</td>
 <td>281</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'throws' has incorrect indentation level 2, expected level should be 4.</td>
 <td>291</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'method def' child has incorrect indentation level 6, expected level should be 4.</td>
 <td>292</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>JavadocTagContinuationIndentation</td>
 <td>Line continuation have incorrect indentation level, expected level should be 2.</td>
 <td>387</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>JavadocTagContinuationIndentation</td>
 <td>Line continuation have incorrect indentation level, expected level should be 2.</td>
 <td>392</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>JavadocTagContinuationIndentation</td>
 <td>Line continuation have incorrect indentation level, expected level should be 2.</td>
 <td>393</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'throws' has incorrect indentation level 2, expected level should be 4.</td>
 <td>626</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>JavadocTagContinuationIndentation</td>
 <td>Line continuation have incorrect indentation level, expected level should be 2.</td>
 <td>638</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>JavadocTagContinuationIndentation</td>
 <td>Line continuation have incorrect indentation level, expected level should be 2.</td>
 <td>654</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>JavadocTagContinuationIndentation</td>
 <td>Line continuation have incorrect indentation level, expected level should be 2.</td>
 <td>656</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>JavadocTagContinuationIndentation</td>
 <td>Line continuation have incorrect indentation level, expected level should be 2.</td>
 <td>658</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>JavadocTagContinuationIndentation</td>
 <td>Line continuation have incorrect indentation level, expected level should be 2.</td>
 <td>659</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>JavadocTagContinuationIndentation</td>
 <td>Line continuation have incorrect indentation level, expected level should be 2.</td>
 <td>660</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>JavadocTagContinuationIndentation</td>
 <td>Line continuation have incorrect indentation level, expected level should be 2.</td>
 <td>661</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>JavadocTagContinuationIndentation</td>
 <td>Line continuation have incorrect indentation level, expected level should be 2.</td>
 <td>662</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>JavadocTagContinuationIndentation</td>
 <td>Line continuation have incorrect indentation level, expected level should be 2.</td>
 <td>663</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>JavadocTagContinuationIndentation</td>
 <td>Line continuation have incorrect indentation level, expected level should be 2.</td>
 <td>664</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>JavadocTagContinuationIndentation</td>
 <td>Line continuation have incorrect indentation level, expected level should be 2.</td>
 <td>686</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>JavadocTagContinuationIndentation</td>
 <td>Line continuation have incorrect indentation level, expected level should be 2.</td>
 <td>688</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>JavadocTagContinuationIndentation</td>
 <td>Line continuation have incorrect indentation level, expected level should be 2.</td>
 <td>690</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>JavadocTagContinuationIndentation</td>
 <td>Line continuation have incorrect indentation level, expected level should be 2.</td>
 <td>691</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>JavadocTagContinuationIndentation</td>
 <td>Line continuation have incorrect indentation level, expected level should be 2.</td>
 <td>692</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>JavadocTagContinuationIndentation</td>
 <td>Line continuation have incorrect indentation level, expected level should be 2.</td>
 <td>693</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>JavadocTagContinuationIndentation</td>
 <td>Line continuation have incorrect indentation level, expected level should be 2.</td>
 <td>694</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>JavadocTagContinuationIndentation</td>
 <td>Line continuation have incorrect indentation level, expected level should be 2.</td>
 <td>695</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>JavadocTagContinuationIndentation</td>
 <td>Line continuation have incorrect indentation level, expected level should be 2.</td>
 <td>696</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
 <td>713</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'throws' has incorrect indentation level 2, expected level should be 4.</td>
 <td>755</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
 <td>758</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'throws' has incorrect indentation level 2, expected level should be 4.</td>
 <td>771</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>JavadocTagContinuationIndentation</td>
 <td>Line continuation have incorrect indentation level, expected level should be 2.</td>
 <td>783</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
 <td>844</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
 <td>845</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
 <td>918</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
 <td>933</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>949</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'throws' has incorrect indentation level 2, expected level should be 4.</td>
 <td>953</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 101).</td>
 <td>975</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
 <td>989</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
@@ -57093,19 +57087,19 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.mapreduce.TableMapper.java">org/apache/hadoop/hbase/mapreduce/TableMapper.java</h3>
 <table border="0" class="table table-striped">
-<tr class="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>ImportOrder</td>
 <td>Wrong order for 'org.apache.hadoop.hbase.client.Result' import.</td>
 <td>22</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
@@ -57114,25 +57108,25 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.mapreduce.TableOutputCommitter.java">org/apache/hadoop/hbase/mapreduce/TableOutputCommitter.java</h3>
 <table border="0" class="table table-striped">
-<tr class="a">
+<tr class="b">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>ImportOrder</td>
 <td>Wrong order for 'org.apache.hadoop.mapreduce.JobContext' import.</td>
 <td>24</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'throws' has incorrect indentation level 2, expected level should be 4.</td>
 <td>64</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>LeftCurly</td>
@@ -57141,49 +57135,49 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.mapreduce.TableOutputFormat.java">org/apache/hadoop/hbase/mapreduce/TableOutputFormat.java</h3>
 <table border="0" class="table table-striped">
-<tr class="a">
+<tr class="b">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>ImportOrder</td>
 <td>Wrong order for 'org.apache.hadoop.conf.Configurable' import.</td>
 <td>25</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'implements' has incorrect indentation level 0, expected level should be 2.</td>
 <td>52</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 127).</td>
 <td>73</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'extends' has incorrect indentation level 2, expected level should be 4.</td>
 <td>94</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'throws' has incorrect indentation level 4, expected level should be 6.</td>
 <td>139</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'throws' has incorrect indentation level 2, expected level should be 4.</td>
 <td>162</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
@@ -57192,25 +57186,25 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.mapreduce.TableRecordReader.java">org/apache/hadoop/hbase/mapreduce/TableRecordReader.java</h3>
 <table border="0" class="table table-striped">
-<tr class="a">
+<tr class="b">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>ImportOrder</td>
 <td>Wrong order for 'org.apache.hadoop.hbase.client.Result' import.</td>
 <td>24</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'extends' has incorrect indentation level 0, expected level should be 2.</td>
 <td>38</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
@@ -57219,79 +57213,79 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.mapreduce.TableRecordReaderImpl.java">org/apache/hadoop/hbase/mapreduce/TableRecordReaderImpl.java</h3>
 <table border="0" class="table table-striped">
-<tr class="a">
+<tr class="b">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>ImportOrder</td>
 <td>Wrong order for 'org.apache.hadoop.conf.Configuration' import.</td>
 <td>26</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>ImportOrder</td>
 <td>Wrong order for 'org.apache.hadoop.hbase.DoNotRetryIOException' import.</td>
 <td>33</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>101</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'throws' has incorrect indentation level 2, expected level should be 4.</td>
 <td>104</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>142</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>143</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>175</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
 <td>203</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
 <td>204</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
 <td>208</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
 <td>240</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
@@ -57300,19 +57294,19 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.mapreduce.TableReducer.java">org/apache/hadoop/hbase/mapreduce/TableReducer.java</h3>
 <table border="0" class="table table-striped">
-<tr class="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>ImportOrder</td>
 <td>Wrong order for 'org.apache.hadoop.hbase.client.Mutation' import.</td>
 <td>22</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
@@ -57321,61 +57315,61 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.mapreduce.TableSnapshotInputFormat.java">org/apache/hadoop/hbase/mapreduce/TableSnapshotInputFormat.java</h3>
 <table border="0" class="table table-striped">
-<tr class="a">
+<tr class="b">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 111).</td>
 <td>59</td></tr>
-<tr class="a">
+<tr class="b">


<TRUNCATED>

[27/29] hbase-site git commit: Published site at 5e84997f2ffdbcf5f849d70c30ddbe2db4039ca4.

Posted by gi...@apache.org.
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/27f5bfb5/checkstyle.rss
----------------------------------------------------------------------
diff --git a/checkstyle.rss b/checkstyle.rss
index c5a415e..2e76cc3 100644
--- a/checkstyle.rss
+++ b/checkstyle.rss
@@ -26,7 +26,7 @@ under the License.
     <copyright>&#169;2007 - 2018 The Apache Software Foundation</copyright>
     <item>
       <title>File: 3804,
-             Errors: 15097,
+             Errors: 15095,
              Warnings: 0,
              Infos: 0
       </title>
@@ -9211,7 +9211,7 @@ under the License.
                   0
                 </td>
                 <td>
-                  4
+                  3
                 </td>
               </tr>
                           <tr>
@@ -31919,7 +31919,7 @@ under the License.
                   0
                 </td>
                 <td>
-                  14
+                  13
                 </td>
               </tr>
                           <tr>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/27f5bfb5/coc.html
----------------------------------------------------------------------
diff --git a/coc.html b/coc.html
index 3212ffb..0719ee0 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="20181109" />
+    <meta name="Date-Revision-yyyymmdd" content="20181110" />
     <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-11-09</li>
+                  <li id="publishDate" class="pull-right">Last Published: 2018-11-10</li>
             </p>
                 </div>
 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/27f5bfb5/dependencies.html
----------------------------------------------------------------------
diff --git a/dependencies.html b/dependencies.html
index 5f9d67f..1cde05e 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="20181109" />
+    <meta name="Date-Revision-yyyymmdd" content="20181110" />
     <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-11-09</li>
+                  <li id="publishDate" class="pull-right">Last Published: 2018-11-10</li>
             </p>
                 </div>
 


[12/29] hbase-site git commit: Published site at 5e84997f2ffdbcf5f849d70c30ddbe2db4039ca4.

Posted by gi...@apache.org.
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/27f5bfb5/devapidocs/src-html/org/apache/hadoop/hbase/procedure2/TimeoutExecutorThread.html
----------------------------------------------------------------------
diff --git a/devapidocs/src-html/org/apache/hadoop/hbase/procedure2/TimeoutExecutorThread.html b/devapidocs/src-html/org/apache/hadoop/hbase/procedure2/TimeoutExecutorThread.html
index 103b0bb..882842c 100644
--- a/devapidocs/src-html/org/apache/hadoop/hbase/procedure2/TimeoutExecutorThread.html
+++ b/devapidocs/src-html/org/apache/hadoop/hbase/procedure2/TimeoutExecutorThread.html
@@ -134,7 +134,7 @@
 <span class="sourceLineNo">126</span>    }<a name="line.126"></a>
 <span class="sourceLineNo">127</span>  }<a name="line.127"></a>
 <span class="sourceLineNo">128</span><a name="line.128"></a>
-<span class="sourceLineNo">129</span>  private void executeTimedoutProcedure(Procedure&lt;TEnvironment&gt; proc) {<a name="line.129"></a>
+<span class="sourceLineNo">129</span>  protected void executeTimedoutProcedure(Procedure&lt;TEnvironment&gt; proc) {<a name="line.129"></a>
 <span class="sourceLineNo">130</span>    // The procedure received a timeout. if the procedure itself does not handle it,<a name="line.130"></a>
 <span class="sourceLineNo">131</span>    // call abort() and add the procedure back in the queue for rollback.<a name="line.131"></a>
 <span class="sourceLineNo">132</span>    if (proc.setTimeoutFailure(executor.getEnvironment())) {<a name="line.132"></a>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/27f5bfb5/devapidocs/src-html/org/apache/hadoop/hbase/zookeeper/ZKConfig.ZKClusterKey.html
----------------------------------------------------------------------
diff --git a/devapidocs/src-html/org/apache/hadoop/hbase/zookeeper/ZKConfig.ZKClusterKey.html b/devapidocs/src-html/org/apache/hadoop/hbase/zookeeper/ZKConfig.ZKClusterKey.html
index 6c6f61c..b62c8a9 100644
--- a/devapidocs/src-html/org/apache/hadoop/hbase/zookeeper/ZKConfig.ZKClusterKey.html
+++ b/devapidocs/src-html/org/apache/hadoop/hbase/zookeeper/ZKConfig.ZKClusterKey.html
@@ -30,315 +30,340 @@
 <span class="sourceLineNo">022</span>import java.util.Map.Entry;<a name="line.22"></a>
 <span class="sourceLineNo">023</span>import java.util.Properties;<a name="line.23"></a>
 <span class="sourceLineNo">024</span><a name="line.24"></a>
-<span class="sourceLineNo">025</span>import org.apache.hadoop.conf.Configuration;<a name="line.25"></a>
-<span class="sourceLineNo">026</span>import org.apache.hadoop.hbase.HConstants;<a name="line.26"></a>
-<span class="sourceLineNo">027</span>import org.apache.hadoop.util.StringUtils;<a name="line.27"></a>
-<span class="sourceLineNo">028</span>import org.apache.yetus.audience.InterfaceAudience;<a name="line.28"></a>
-<span class="sourceLineNo">029</span><a name="line.29"></a>
-<span class="sourceLineNo">030</span>import org.apache.hbase.thirdparty.com.google.common.annotations.VisibleForTesting;<a name="line.30"></a>
-<span class="sourceLineNo">031</span><a name="line.31"></a>
-<span class="sourceLineNo">032</span>/**<a name="line.32"></a>
-<span class="sourceLineNo">033</span> * Utility methods for reading, and building the ZooKeeper configuration.<a name="line.33"></a>
-<span class="sourceLineNo">034</span> *<a name="line.34"></a>
-<span class="sourceLineNo">035</span> * The order and priority for reading the config are as follows:<a name="line.35"></a>
-<span class="sourceLineNo">036</span> * (1). Property with "hbase.zookeeper.property." prefix from HBase XML<a name="line.36"></a>
-<span class="sourceLineNo">037</span> * (2). other zookeeper related properties in HBASE XML<a name="line.37"></a>
-<span class="sourceLineNo">038</span> */<a name="line.38"></a>
-<span class="sourceLineNo">039</span>@InterfaceAudience.Private<a name="line.39"></a>
-<span class="sourceLineNo">040</span>public final class ZKConfig {<a name="line.40"></a>
-<span class="sourceLineNo">041</span><a name="line.41"></a>
-<span class="sourceLineNo">042</span>  private static final String VARIABLE_START = "${";<a name="line.42"></a>
-<span class="sourceLineNo">043</span><a name="line.43"></a>
-<span class="sourceLineNo">044</span>  private ZKConfig() {<a name="line.44"></a>
-<span class="sourceLineNo">045</span>  }<a name="line.45"></a>
-<span class="sourceLineNo">046</span><a name="line.46"></a>
-<span class="sourceLineNo">047</span>  /**<a name="line.47"></a>
-<span class="sourceLineNo">048</span>   * Make a Properties object holding ZooKeeper config.<a name="line.48"></a>
-<span class="sourceLineNo">049</span>   * Parses the corresponding config options from the HBase XML configs<a name="line.49"></a>
-<span class="sourceLineNo">050</span>   * and generates the appropriate ZooKeeper properties.<a name="line.50"></a>
-<span class="sourceLineNo">051</span>   * @param conf Configuration to read from.<a name="line.51"></a>
-<span class="sourceLineNo">052</span>   * @return Properties holding mappings representing ZooKeeper config file.<a name="line.52"></a>
-<span class="sourceLineNo">053</span>   */<a name="line.53"></a>
-<span class="sourceLineNo">054</span>  public static Properties makeZKProps(Configuration conf) {<a name="line.54"></a>
-<span class="sourceLineNo">055</span>    return makeZKPropsFromHbaseConfig(conf);<a name="line.55"></a>
-<span class="sourceLineNo">056</span>  }<a name="line.56"></a>
-<span class="sourceLineNo">057</span><a name="line.57"></a>
-<span class="sourceLineNo">058</span>  /**<a name="line.58"></a>
-<span class="sourceLineNo">059</span>   * Make a Properties object holding ZooKeeper config.<a name="line.59"></a>
-<span class="sourceLineNo">060</span>   * Parses the corresponding config options from the HBase XML configs<a name="line.60"></a>
-<span class="sourceLineNo">061</span>   * and generates the appropriate ZooKeeper properties.<a name="line.61"></a>
-<span class="sourceLineNo">062</span>   *<a name="line.62"></a>
-<span class="sourceLineNo">063</span>   * @param conf Configuration to read from.<a name="line.63"></a>
-<span class="sourceLineNo">064</span>   * @return Properties holding mappings representing ZooKeeper config file.<a name="line.64"></a>
-<span class="sourceLineNo">065</span>   */<a name="line.65"></a>
-<span class="sourceLineNo">066</span>  private static Properties makeZKPropsFromHbaseConfig(Configuration conf) {<a name="line.66"></a>
-<span class="sourceLineNo">067</span>    Properties zkProperties = new Properties();<a name="line.67"></a>
-<span class="sourceLineNo">068</span><a name="line.68"></a>
-<span class="sourceLineNo">069</span>    // Directly map all of the hbase.zookeeper.property.KEY properties.<a name="line.69"></a>
-<span class="sourceLineNo">070</span>    // Synchronize on conf so no loading of configs while we iterate<a name="line.70"></a>
-<span class="sourceLineNo">071</span>    synchronized (conf) {<a name="line.71"></a>
-<span class="sourceLineNo">072</span>      for (Entry&lt;String, String&gt; entry : conf) {<a name="line.72"></a>
-<span class="sourceLineNo">073</span>        String key = entry.getKey();<a name="line.73"></a>
-<span class="sourceLineNo">074</span>        if (key.startsWith(HConstants.ZK_CFG_PROPERTY_PREFIX)) {<a name="line.74"></a>
-<span class="sourceLineNo">075</span>          String zkKey = key.substring(HConstants.ZK_CFG_PROPERTY_PREFIX_LEN);<a name="line.75"></a>
-<span class="sourceLineNo">076</span>          String value = entry.getValue();<a name="line.76"></a>
-<span class="sourceLineNo">077</span>          // If the value has variables substitutions, need to do a get.<a name="line.77"></a>
-<span class="sourceLineNo">078</span>          if (value.contains(VARIABLE_START)) {<a name="line.78"></a>
-<span class="sourceLineNo">079</span>            value = conf.get(key);<a name="line.79"></a>
-<span class="sourceLineNo">080</span>          }<a name="line.80"></a>
-<span class="sourceLineNo">081</span>          zkProperties.setProperty(zkKey, value);<a name="line.81"></a>
-<span class="sourceLineNo">082</span>        }<a name="line.82"></a>
-<span class="sourceLineNo">083</span>      }<a name="line.83"></a>
-<span class="sourceLineNo">084</span>    }<a name="line.84"></a>
-<span class="sourceLineNo">085</span><a name="line.85"></a>
-<span class="sourceLineNo">086</span>    // If clientPort is not set, assign the default.<a name="line.86"></a>
-<span class="sourceLineNo">087</span>    if (zkProperties.getProperty(HConstants.CLIENT_PORT_STR) == null) {<a name="line.87"></a>
-<span class="sourceLineNo">088</span>      zkProperties.put(HConstants.CLIENT_PORT_STR,<a name="line.88"></a>
-<span class="sourceLineNo">089</span>          HConstants.DEFAULT_ZOOKEEPER_CLIENT_PORT);<a name="line.89"></a>
-<span class="sourceLineNo">090</span>    }<a name="line.90"></a>
-<span class="sourceLineNo">091</span><a name="line.91"></a>
-<span class="sourceLineNo">092</span>    // Create the server.X properties.<a name="line.92"></a>
-<span class="sourceLineNo">093</span>    int peerPort = conf.getInt("hbase.zookeeper.peerport", 2888);<a name="line.93"></a>
-<span class="sourceLineNo">094</span>    int leaderPort = conf.getInt("hbase.zookeeper.leaderport", 3888);<a name="line.94"></a>
-<span class="sourceLineNo">095</span><a name="line.95"></a>
-<span class="sourceLineNo">096</span>    final String[] serverHosts = conf.getStrings(HConstants.ZOOKEEPER_QUORUM,<a name="line.96"></a>
-<span class="sourceLineNo">097</span>                                                 HConstants.LOCALHOST);<a name="line.97"></a>
-<span class="sourceLineNo">098</span>    String serverHost;<a name="line.98"></a>
-<span class="sourceLineNo">099</span>    String address;<a name="line.99"></a>
-<span class="sourceLineNo">100</span>    String key;<a name="line.100"></a>
-<span class="sourceLineNo">101</span>    for (int i = 0; i &lt; serverHosts.length; ++i) {<a name="line.101"></a>
-<span class="sourceLineNo">102</span>      if (serverHosts[i].contains(":")) {<a name="line.102"></a>
-<span class="sourceLineNo">103</span>        serverHost = serverHosts[i].substring(0, serverHosts[i].indexOf(':'));<a name="line.103"></a>
-<span class="sourceLineNo">104</span>      } else {<a name="line.104"></a>
-<span class="sourceLineNo">105</span>        serverHost = serverHosts[i];<a name="line.105"></a>
-<span class="sourceLineNo">106</span>      }<a name="line.106"></a>
-<span class="sourceLineNo">107</span>      address = serverHost + ":" + peerPort + ":" + leaderPort;<a name="line.107"></a>
-<span class="sourceLineNo">108</span>      key = "server." + i;<a name="line.108"></a>
-<span class="sourceLineNo">109</span>      zkProperties.put(key, address);<a name="line.109"></a>
-<span class="sourceLineNo">110</span>    }<a name="line.110"></a>
-<span class="sourceLineNo">111</span><a name="line.111"></a>
-<span class="sourceLineNo">112</span>    return zkProperties;<a name="line.112"></a>
-<span class="sourceLineNo">113</span>  }<a name="line.113"></a>
-<span class="sourceLineNo">114</span><a name="line.114"></a>
-<span class="sourceLineNo">115</span>  /**<a name="line.115"></a>
-<span class="sourceLineNo">116</span>   * Return the ZK Quorum servers string given the specified configuration<a name="line.116"></a>
-<span class="sourceLineNo">117</span>   *<a name="line.117"></a>
-<span class="sourceLineNo">118</span>   * @param conf<a name="line.118"></a>
-<span class="sourceLineNo">119</span>   * @return Quorum servers String<a name="line.119"></a>
-<span class="sourceLineNo">120</span>   */<a name="line.120"></a>
-<span class="sourceLineNo">121</span>  private static String getZKQuorumServersStringFromHbaseConfig(Configuration conf) {<a name="line.121"></a>
-<span class="sourceLineNo">122</span>    String defaultClientPort = Integer.toString(<a name="line.122"></a>
-<span class="sourceLineNo">123</span>        conf.getInt(HConstants.ZOOKEEPER_CLIENT_PORT, HConstants.DEFAULT_ZOOKEEPER_CLIENT_PORT));<a name="line.123"></a>
-<span class="sourceLineNo">124</span><a name="line.124"></a>
-<span class="sourceLineNo">125</span>    // Build the ZK quorum server string with "server:clientport" list, separated by ','<a name="line.125"></a>
-<span class="sourceLineNo">126</span>    final String[] serverHosts =<a name="line.126"></a>
-<span class="sourceLineNo">127</span>        conf.getStrings(HConstants.ZOOKEEPER_QUORUM, HConstants.LOCALHOST);<a name="line.127"></a>
-<span class="sourceLineNo">128</span>    return buildZKQuorumServerString(serverHosts, defaultClientPort);<a name="line.128"></a>
-<span class="sourceLineNo">129</span>  }<a name="line.129"></a>
-<span class="sourceLineNo">130</span><a name="line.130"></a>
-<span class="sourceLineNo">131</span>  /**<a name="line.131"></a>
-<span class="sourceLineNo">132</span>   * Return the ZK Quorum servers string given the specified configuration.<a name="line.132"></a>
-<span class="sourceLineNo">133</span>   * @return Quorum servers<a name="line.133"></a>
-<span class="sourceLineNo">134</span>   */<a name="line.134"></a>
-<span class="sourceLineNo">135</span>  public static String getZKQuorumServersString(Configuration conf) {<a name="line.135"></a>
-<span class="sourceLineNo">136</span>    return getZKQuorumServersStringFromHbaseConfig(conf);<a name="line.136"></a>
-<span class="sourceLineNo">137</span>  }<a name="line.137"></a>
-<span class="sourceLineNo">138</span><a name="line.138"></a>
-<span class="sourceLineNo">139</span>  /**<a name="line.139"></a>
-<span class="sourceLineNo">140</span>   * Build the ZK quorum server string with "server:clientport" list, separated by ','<a name="line.140"></a>
-<span class="sourceLineNo">141</span>   *<a name="line.141"></a>
-<span class="sourceLineNo">142</span>   * @param serverHosts a list of servers for ZK quorum<a name="line.142"></a>
-<span class="sourceLineNo">143</span>   * @param clientPort the default client port<a name="line.143"></a>
-<span class="sourceLineNo">144</span>   * @return the string for a list of "server:port" separated by ","<a name="line.144"></a>
-<span class="sourceLineNo">145</span>   */<a name="line.145"></a>
-<span class="sourceLineNo">146</span>  public static String buildZKQuorumServerString(String[] serverHosts, String clientPort) {<a name="line.146"></a>
-<span class="sourceLineNo">147</span>    StringBuilder quorumStringBuilder = new StringBuilder();<a name="line.147"></a>
-<span class="sourceLineNo">148</span>    String serverHost;<a name="line.148"></a>
-<span class="sourceLineNo">149</span>    for (int i = 0; i &lt; serverHosts.length; ++i) {<a name="line.149"></a>
-<span class="sourceLineNo">150</span>      if (serverHosts[i].contains(":")) {<a name="line.150"></a>
-<span class="sourceLineNo">151</span>        serverHost = serverHosts[i]; // just use the port specified from the input<a name="line.151"></a>
-<span class="sourceLineNo">152</span>      } else {<a name="line.152"></a>
-<span class="sourceLineNo">153</span>        serverHost = serverHosts[i] + ":" + clientPort;<a name="line.153"></a>
-<span class="sourceLineNo">154</span>      }<a name="line.154"></a>
-<span class="sourceLineNo">155</span>      if (i &gt; 0) {<a name="line.155"></a>
-<span class="sourceLineNo">156</span>        quorumStringBuilder.append(',');<a name="line.156"></a>
-<span class="sourceLineNo">157</span>      }<a name="line.157"></a>
-<span class="sourceLineNo">158</span>      quorumStringBuilder.append(serverHost);<a name="line.158"></a>
-<span class="sourceLineNo">159</span>    }<a name="line.159"></a>
-<span class="sourceLineNo">160</span>    return quorumStringBuilder.toString();<a name="line.160"></a>
-<span class="sourceLineNo">161</span>  }<a name="line.161"></a>
-<span class="sourceLineNo">162</span><a name="line.162"></a>
-<span class="sourceLineNo">163</span>  /**<a name="line.163"></a>
-<span class="sourceLineNo">164</span>   * Verifies that the given key matches the expected format for a ZooKeeper cluster key.<a name="line.164"></a>
-<span class="sourceLineNo">165</span>   * The Quorum for the ZK cluster can have one the following formats (see examples below):<a name="line.165"></a>
-<span class="sourceLineNo">166</span>   *<a name="line.166"></a>
-<span class="sourceLineNo">167</span>   * &lt;ol&gt;<a name="line.167"></a>
-<span class="sourceLineNo">168</span>   *   &lt;li&gt;s1,s2,s3 (no client port in the list, the client port could be obtained from<a name="line.168"></a>
-<span class="sourceLineNo">169</span>   *       clientPort)&lt;/li&gt;<a name="line.169"></a>
-<span class="sourceLineNo">170</span>   *   &lt;li&gt;s1:p1,s2:p2,s3:p3 (with client port, which could be same or different for each server,<a name="line.170"></a>
-<span class="sourceLineNo">171</span>   *       in this case, the clientPort would be ignored)&lt;/li&gt;<a name="line.171"></a>
-<span class="sourceLineNo">172</span>   *   &lt;li&gt;s1:p1,s2,s3:p3 (mix of (1) and (2) - if port is not specified in a server, it would use<a name="line.172"></a>
-<span class="sourceLineNo">173</span>   *       the clientPort; otherwise, it would use the specified port)&lt;/li&gt;<a name="line.173"></a>
-<span class="sourceLineNo">174</span>   * &lt;/ol&gt;<a name="line.174"></a>
-<span class="sourceLineNo">175</span>   *<a name="line.175"></a>
-<span class="sourceLineNo">176</span>   * @param key the cluster key to validate<a name="line.176"></a>
-<span class="sourceLineNo">177</span>   * @throws IOException if the key could not be parsed<a name="line.177"></a>
-<span class="sourceLineNo">178</span>   */<a name="line.178"></a>
-<span class="sourceLineNo">179</span>  public static void validateClusterKey(String key) throws IOException {<a name="line.179"></a>
-<span class="sourceLineNo">180</span>    transformClusterKey(key);<a name="line.180"></a>
-<span class="sourceLineNo">181</span>  }<a name="line.181"></a>
-<span class="sourceLineNo">182</span><a name="line.182"></a>
-<span class="sourceLineNo">183</span>  /**<a name="line.183"></a>
-<span class="sourceLineNo">184</span>   * Separate the given key into the three configurations it should contain:<a name="line.184"></a>
-<span class="sourceLineNo">185</span>   * hbase.zookeeper.quorum, hbase.zookeeper.client.port<a name="line.185"></a>
-<span class="sourceLineNo">186</span>   * and zookeeper.znode.parent<a name="line.186"></a>
-<span class="sourceLineNo">187</span>   * @param key<a name="line.187"></a>
-<span class="sourceLineNo">188</span>   * @return the three configuration in the described order<a name="line.188"></a>
-<span class="sourceLineNo">189</span>   * @throws IOException<a name="line.189"></a>
-<span class="sourceLineNo">190</span>   */<a name="line.190"></a>
-<span class="sourceLineNo">191</span>  public static ZKClusterKey transformClusterKey(String key) throws IOException {<a name="line.191"></a>
-<span class="sourceLineNo">192</span>    String[] parts = key.split(":");<a name="line.192"></a>
-<span class="sourceLineNo">193</span><a name="line.193"></a>
-<span class="sourceLineNo">194</span>    if (parts.length == 3) {<a name="line.194"></a>
-<span class="sourceLineNo">195</span>      if (!parts[2].matches("/.*[^/]")) {<a name="line.195"></a>
-<span class="sourceLineNo">196</span>        throw new IOException("Cluster key passed " + key + " is invalid, the format should be:" +<a name="line.196"></a>
-<span class="sourceLineNo">197</span>            HConstants.ZOOKEEPER_QUORUM + ":" + HConstants.ZOOKEEPER_CLIENT_PORT + ":"<a name="line.197"></a>
-<span class="sourceLineNo">198</span>            + HConstants.ZOOKEEPER_ZNODE_PARENT);<a name="line.198"></a>
-<span class="sourceLineNo">199</span>      }<a name="line.199"></a>
-<span class="sourceLineNo">200</span>      return new ZKClusterKey(parts [0], Integer.parseInt(parts [1]), parts [2]);<a name="line.200"></a>
-<span class="sourceLineNo">201</span>    }<a name="line.201"></a>
-<span class="sourceLineNo">202</span><a name="line.202"></a>
-<span class="sourceLineNo">203</span>    if (parts.length &gt; 3) {<a name="line.203"></a>
-<span class="sourceLineNo">204</span>      // The quorum could contain client port in server:clientport format, try to transform more.<a name="line.204"></a>
-<span class="sourceLineNo">205</span>      String zNodeParent = parts [parts.length - 1];<a name="line.205"></a>
-<span class="sourceLineNo">206</span>      if (!zNodeParent.matches("/.*[^/]")) {<a name="line.206"></a>
-<span class="sourceLineNo">207</span>        throw new IOException("Cluster key passed " + key + " is invalid, the format should be:"<a name="line.207"></a>
-<span class="sourceLineNo">208</span>            + HConstants.ZOOKEEPER_QUORUM + ":" + HConstants.ZOOKEEPER_CLIENT_PORT + ":"<a name="line.208"></a>
-<span class="sourceLineNo">209</span>            + HConstants.ZOOKEEPER_ZNODE_PARENT);<a name="line.209"></a>
-<span class="sourceLineNo">210</span>      }<a name="line.210"></a>
-<span class="sourceLineNo">211</span><a name="line.211"></a>
-<span class="sourceLineNo">212</span>      String clientPort = parts [parts.length - 2];<a name="line.212"></a>
-<span class="sourceLineNo">213</span><a name="line.213"></a>
-<span class="sourceLineNo">214</span>      // The first part length is the total length minus the lengths of other parts and minus 2 ":"<a name="line.214"></a>
-<span class="sourceLineNo">215</span>      int endQuorumIndex = key.length() - zNodeParent.length() - clientPort.length() - 2;<a name="line.215"></a>
-<span class="sourceLineNo">216</span>      String quorumStringInput = key.substring(0, endQuorumIndex);<a name="line.216"></a>
-<span class="sourceLineNo">217</span>      String[] serverHosts = quorumStringInput.split(",");<a name="line.217"></a>
+<span class="sourceLineNo">025</span>import org.apache.commons.validator.routines.InetAddressValidator;<a name="line.25"></a>
+<span class="sourceLineNo">026</span>import org.apache.hadoop.conf.Configuration;<a name="line.26"></a>
+<span class="sourceLineNo">027</span>import org.apache.hadoop.hbase.HConstants;<a name="line.27"></a>
+<span class="sourceLineNo">028</span>import org.apache.hadoop.util.StringUtils;<a name="line.28"></a>
+<span class="sourceLineNo">029</span>import org.apache.yetus.audience.InterfaceAudience;<a name="line.29"></a>
+<span class="sourceLineNo">030</span><a name="line.30"></a>
+<span class="sourceLineNo">031</span>import org.apache.hbase.thirdparty.com.google.common.annotations.VisibleForTesting;<a name="line.31"></a>
+<span class="sourceLineNo">032</span><a name="line.32"></a>
+<span class="sourceLineNo">033</span>/**<a name="line.33"></a>
+<span class="sourceLineNo">034</span> * Utility methods for reading, and building the ZooKeeper configuration.<a name="line.34"></a>
+<span class="sourceLineNo">035</span> *<a name="line.35"></a>
+<span class="sourceLineNo">036</span> * The order and priority for reading the config are as follows:<a name="line.36"></a>
+<span class="sourceLineNo">037</span> * (1). Property with "hbase.zookeeper.property." prefix from HBase XML<a name="line.37"></a>
+<span class="sourceLineNo">038</span> * (2). other zookeeper related properties in HBASE XML<a name="line.38"></a>
+<span class="sourceLineNo">039</span> */<a name="line.39"></a>
+<span class="sourceLineNo">040</span>@InterfaceAudience.Private<a name="line.40"></a>
+<span class="sourceLineNo">041</span>public final class ZKConfig {<a name="line.41"></a>
+<span class="sourceLineNo">042</span><a name="line.42"></a>
+<span class="sourceLineNo">043</span>  private static final String VARIABLE_START = "${";<a name="line.43"></a>
+<span class="sourceLineNo">044</span><a name="line.44"></a>
+<span class="sourceLineNo">045</span>  private ZKConfig() {<a name="line.45"></a>
+<span class="sourceLineNo">046</span>  }<a name="line.46"></a>
+<span class="sourceLineNo">047</span><a name="line.47"></a>
+<span class="sourceLineNo">048</span>  /**<a name="line.48"></a>
+<span class="sourceLineNo">049</span>   * Make a Properties object holding ZooKeeper config.<a name="line.49"></a>
+<span class="sourceLineNo">050</span>   * Parses the corresponding config options from the HBase XML configs<a name="line.50"></a>
+<span class="sourceLineNo">051</span>   * and generates the appropriate ZooKeeper properties.<a name="line.51"></a>
+<span class="sourceLineNo">052</span>   * @param conf Configuration to read from.<a name="line.52"></a>
+<span class="sourceLineNo">053</span>   * @return Properties holding mappings representing ZooKeeper config file.<a name="line.53"></a>
+<span class="sourceLineNo">054</span>   */<a name="line.54"></a>
+<span class="sourceLineNo">055</span>  public static Properties makeZKProps(Configuration conf) {<a name="line.55"></a>
+<span class="sourceLineNo">056</span>    return makeZKPropsFromHbaseConfig(conf);<a name="line.56"></a>
+<span class="sourceLineNo">057</span>  }<a name="line.57"></a>
+<span class="sourceLineNo">058</span><a name="line.58"></a>
+<span class="sourceLineNo">059</span>  /**<a name="line.59"></a>
+<span class="sourceLineNo">060</span>   * Make a Properties object holding ZooKeeper config.<a name="line.60"></a>
+<span class="sourceLineNo">061</span>   * Parses the corresponding config options from the HBase XML configs<a name="line.61"></a>
+<span class="sourceLineNo">062</span>   * and generates the appropriate ZooKeeper properties.<a name="line.62"></a>
+<span class="sourceLineNo">063</span>   *<a name="line.63"></a>
+<span class="sourceLineNo">064</span>   * @param conf Configuration to read from.<a name="line.64"></a>
+<span class="sourceLineNo">065</span>   * @return Properties holding mappings representing ZooKeeper config file.<a name="line.65"></a>
+<span class="sourceLineNo">066</span>   */<a name="line.66"></a>
+<span class="sourceLineNo">067</span>  private static Properties makeZKPropsFromHbaseConfig(Configuration conf) {<a name="line.67"></a>
+<span class="sourceLineNo">068</span>    Properties zkProperties = new Properties();<a name="line.68"></a>
+<span class="sourceLineNo">069</span><a name="line.69"></a>
+<span class="sourceLineNo">070</span>    // Directly map all of the hbase.zookeeper.property.KEY properties.<a name="line.70"></a>
+<span class="sourceLineNo">071</span>    // Synchronize on conf so no loading of configs while we iterate<a name="line.71"></a>
+<span class="sourceLineNo">072</span>    synchronized (conf) {<a name="line.72"></a>
+<span class="sourceLineNo">073</span>      for (Entry&lt;String, String&gt; entry : conf) {<a name="line.73"></a>
+<span class="sourceLineNo">074</span>        String key = entry.getKey();<a name="line.74"></a>
+<span class="sourceLineNo">075</span>        if (key.startsWith(HConstants.ZK_CFG_PROPERTY_PREFIX)) {<a name="line.75"></a>
+<span class="sourceLineNo">076</span>          String zkKey = key.substring(HConstants.ZK_CFG_PROPERTY_PREFIX_LEN);<a name="line.76"></a>
+<span class="sourceLineNo">077</span>          String value = entry.getValue();<a name="line.77"></a>
+<span class="sourceLineNo">078</span>          // If the value has variables substitutions, need to do a get.<a name="line.78"></a>
+<span class="sourceLineNo">079</span>          if (value.contains(VARIABLE_START)) {<a name="line.79"></a>
+<span class="sourceLineNo">080</span>            value = conf.get(key);<a name="line.80"></a>
+<span class="sourceLineNo">081</span>          }<a name="line.81"></a>
+<span class="sourceLineNo">082</span>          zkProperties.setProperty(zkKey, value);<a name="line.82"></a>
+<span class="sourceLineNo">083</span>        }<a name="line.83"></a>
+<span class="sourceLineNo">084</span>      }<a name="line.84"></a>
+<span class="sourceLineNo">085</span>    }<a name="line.85"></a>
+<span class="sourceLineNo">086</span><a name="line.86"></a>
+<span class="sourceLineNo">087</span>    // If clientPort is not set, assign the default.<a name="line.87"></a>
+<span class="sourceLineNo">088</span>    if (zkProperties.getProperty(HConstants.CLIENT_PORT_STR) == null) {<a name="line.88"></a>
+<span class="sourceLineNo">089</span>      zkProperties.put(HConstants.CLIENT_PORT_STR,<a name="line.89"></a>
+<span class="sourceLineNo">090</span>          HConstants.DEFAULT_ZOOKEEPER_CLIENT_PORT);<a name="line.90"></a>
+<span class="sourceLineNo">091</span>    }<a name="line.91"></a>
+<span class="sourceLineNo">092</span><a name="line.92"></a>
+<span class="sourceLineNo">093</span>    // Create the server.X properties.<a name="line.93"></a>
+<span class="sourceLineNo">094</span>    int peerPort = conf.getInt("hbase.zookeeper.peerport", 2888);<a name="line.94"></a>
+<span class="sourceLineNo">095</span>    int leaderPort = conf.getInt("hbase.zookeeper.leaderport", 3888);<a name="line.95"></a>
+<span class="sourceLineNo">096</span><a name="line.96"></a>
+<span class="sourceLineNo">097</span>    final String[] serverHosts = conf.getStrings(HConstants.ZOOKEEPER_QUORUM,<a name="line.97"></a>
+<span class="sourceLineNo">098</span>                                                 HConstants.LOCALHOST);<a name="line.98"></a>
+<span class="sourceLineNo">099</span>    String serverHost;<a name="line.99"></a>
+<span class="sourceLineNo">100</span>    String address;<a name="line.100"></a>
+<span class="sourceLineNo">101</span>    String key;<a name="line.101"></a>
+<span class="sourceLineNo">102</span>    for (int i = 0; i &lt; serverHosts.length; ++i) {<a name="line.102"></a>
+<span class="sourceLineNo">103</span>      if (serverHosts[i].contains(":")) {<a name="line.103"></a>
+<span class="sourceLineNo">104</span>        serverHost = serverHosts[i].substring(0, serverHosts[i].indexOf(':'));<a name="line.104"></a>
+<span class="sourceLineNo">105</span>      } else {<a name="line.105"></a>
+<span class="sourceLineNo">106</span>        serverHost = serverHosts[i];<a name="line.106"></a>
+<span class="sourceLineNo">107</span>      }<a name="line.107"></a>
+<span class="sourceLineNo">108</span>      address = serverHost + ":" + peerPort + ":" + leaderPort;<a name="line.108"></a>
+<span class="sourceLineNo">109</span>      key = "server." + i;<a name="line.109"></a>
+<span class="sourceLineNo">110</span>      zkProperties.put(key, address);<a name="line.110"></a>
+<span class="sourceLineNo">111</span>    }<a name="line.111"></a>
+<span class="sourceLineNo">112</span><a name="line.112"></a>
+<span class="sourceLineNo">113</span>    return zkProperties;<a name="line.113"></a>
+<span class="sourceLineNo">114</span>  }<a name="line.114"></a>
+<span class="sourceLineNo">115</span><a name="line.115"></a>
+<span class="sourceLineNo">116</span>  /**<a name="line.116"></a>
+<span class="sourceLineNo">117</span>   * Return the ZK Quorum servers string given the specified configuration<a name="line.117"></a>
+<span class="sourceLineNo">118</span>   *<a name="line.118"></a>
+<span class="sourceLineNo">119</span>   * @param conf<a name="line.119"></a>
+<span class="sourceLineNo">120</span>   * @return Quorum servers String<a name="line.120"></a>
+<span class="sourceLineNo">121</span>   */<a name="line.121"></a>
+<span class="sourceLineNo">122</span>  private static String getZKQuorumServersStringFromHbaseConfig(Configuration conf) {<a name="line.122"></a>
+<span class="sourceLineNo">123</span>    String defaultClientPort = Integer.toString(<a name="line.123"></a>
+<span class="sourceLineNo">124</span>        conf.getInt(HConstants.ZOOKEEPER_CLIENT_PORT, HConstants.DEFAULT_ZOOKEEPER_CLIENT_PORT));<a name="line.124"></a>
+<span class="sourceLineNo">125</span><a name="line.125"></a>
+<span class="sourceLineNo">126</span>    // Build the ZK quorum server string with "server:clientport" list, separated by ','<a name="line.126"></a>
+<span class="sourceLineNo">127</span>    final String[] serverHosts =<a name="line.127"></a>
+<span class="sourceLineNo">128</span>        conf.getStrings(HConstants.ZOOKEEPER_QUORUM, HConstants.LOCALHOST);<a name="line.128"></a>
+<span class="sourceLineNo">129</span>    return buildZKQuorumServerString(serverHosts, defaultClientPort);<a name="line.129"></a>
+<span class="sourceLineNo">130</span>  }<a name="line.130"></a>
+<span class="sourceLineNo">131</span><a name="line.131"></a>
+<span class="sourceLineNo">132</span>  /**<a name="line.132"></a>
+<span class="sourceLineNo">133</span>   * Return the ZK Quorum servers string given the specified configuration.<a name="line.133"></a>
+<span class="sourceLineNo">134</span>   * @return Quorum servers<a name="line.134"></a>
+<span class="sourceLineNo">135</span>   */<a name="line.135"></a>
+<span class="sourceLineNo">136</span>  public static String getZKQuorumServersString(Configuration conf) {<a name="line.136"></a>
+<span class="sourceLineNo">137</span>    return getZKQuorumServersStringFromHbaseConfig(conf);<a name="line.137"></a>
+<span class="sourceLineNo">138</span>  }<a name="line.138"></a>
+<span class="sourceLineNo">139</span><a name="line.139"></a>
+<span class="sourceLineNo">140</span>  /**<a name="line.140"></a>
+<span class="sourceLineNo">141</span>   * Build the ZK quorum server string with "server:clientport" list, separated by ','<a name="line.141"></a>
+<span class="sourceLineNo">142</span>   *<a name="line.142"></a>
+<span class="sourceLineNo">143</span>   * @param serverHosts a list of servers for ZK quorum<a name="line.143"></a>
+<span class="sourceLineNo">144</span>   * @param clientPort the default client port<a name="line.144"></a>
+<span class="sourceLineNo">145</span>   * @return the string for a list of "server:port" separated by ","<a name="line.145"></a>
+<span class="sourceLineNo">146</span>   */<a name="line.146"></a>
+<span class="sourceLineNo">147</span>  public static String buildZKQuorumServerString(String[] serverHosts, String clientPort) {<a name="line.147"></a>
+<span class="sourceLineNo">148</span>    StringBuilder quorumStringBuilder = new StringBuilder();<a name="line.148"></a>
+<span class="sourceLineNo">149</span>    String serverHost;<a name="line.149"></a>
+<span class="sourceLineNo">150</span>    InetAddressValidator validator = new InetAddressValidator();<a name="line.150"></a>
+<span class="sourceLineNo">151</span>    for (int i = 0; i &lt; serverHosts.length; ++i) {<a name="line.151"></a>
+<span class="sourceLineNo">152</span>      if (serverHosts[i].startsWith("[")) {<a name="line.152"></a>
+<span class="sourceLineNo">153</span>        int index = serverHosts[i].indexOf("]");<a name="line.153"></a>
+<span class="sourceLineNo">154</span>        if (index &lt; 0) {<a name="line.154"></a>
+<span class="sourceLineNo">155</span>          throw new IllegalArgumentException(serverHosts[i]<a name="line.155"></a>
+<span class="sourceLineNo">156</span>                  + " starts with '[' but has no matching ']:'");<a name="line.156"></a>
+<span class="sourceLineNo">157</span>        }<a name="line.157"></a>
+<span class="sourceLineNo">158</span>        if (index + 2 == serverHosts[i].length()) {<a name="line.158"></a>
+<span class="sourceLineNo">159</span>          throw new IllegalArgumentException(serverHosts[i]<a name="line.159"></a>
+<span class="sourceLineNo">160</span>                  + " doesn't have a port after colon");<a name="line.160"></a>
+<span class="sourceLineNo">161</span>        }<a name="line.161"></a>
+<span class="sourceLineNo">162</span>        //check the IPv6 address e.g. [2001:db8::1]<a name="line.162"></a>
+<span class="sourceLineNo">163</span>        String serverHostWithoutBracket = serverHosts[i].substring(1, index);<a name="line.163"></a>
+<span class="sourceLineNo">164</span>        if (!validator.isValidInet6Address(serverHostWithoutBracket)) {<a name="line.164"></a>
+<span class="sourceLineNo">165</span>          throw new IllegalArgumentException(serverHosts[i]<a name="line.165"></a>
+<span class="sourceLineNo">166</span>                  + " is not a valid IPv6 address");<a name="line.166"></a>
+<span class="sourceLineNo">167</span>        }<a name="line.167"></a>
+<span class="sourceLineNo">168</span>        serverHost = serverHosts[i];<a name="line.168"></a>
+<span class="sourceLineNo">169</span>        if ((index + 1 == serverHosts[i].length())) {<a name="line.169"></a>
+<span class="sourceLineNo">170</span>          serverHost = serverHosts[i] + ":" + clientPort;<a name="line.170"></a>
+<span class="sourceLineNo">171</span>        }<a name="line.171"></a>
+<span class="sourceLineNo">172</span>      } else {<a name="line.172"></a>
+<span class="sourceLineNo">173</span>        if (serverHosts[i].contains(":")) {<a name="line.173"></a>
+<span class="sourceLineNo">174</span>          serverHost = serverHosts[i]; // just use the port specified from the input<a name="line.174"></a>
+<span class="sourceLineNo">175</span>        } else {<a name="line.175"></a>
+<span class="sourceLineNo">176</span>          serverHost = serverHosts[i] + ":" + clientPort;<a name="line.176"></a>
+<span class="sourceLineNo">177</span>        }<a name="line.177"></a>
+<span class="sourceLineNo">178</span>      }<a name="line.178"></a>
+<span class="sourceLineNo">179</span><a name="line.179"></a>
+<span class="sourceLineNo">180</span>      if (i &gt; 0) {<a name="line.180"></a>
+<span class="sourceLineNo">181</span>        quorumStringBuilder.append(',');<a name="line.181"></a>
+<span class="sourceLineNo">182</span>      }<a name="line.182"></a>
+<span class="sourceLineNo">183</span>      quorumStringBuilder.append(serverHost);<a name="line.183"></a>
+<span class="sourceLineNo">184</span>    }<a name="line.184"></a>
+<span class="sourceLineNo">185</span>    return quorumStringBuilder.toString();<a name="line.185"></a>
+<span class="sourceLineNo">186</span>  }<a name="line.186"></a>
+<span class="sourceLineNo">187</span><a name="line.187"></a>
+<span class="sourceLineNo">188</span>  /**<a name="line.188"></a>
+<span class="sourceLineNo">189</span>   * Verifies that the given key matches the expected format for a ZooKeeper cluster key.<a name="line.189"></a>
+<span class="sourceLineNo">190</span>   * The Quorum for the ZK cluster can have one the following formats (see examples below):<a name="line.190"></a>
+<span class="sourceLineNo">191</span>   *<a name="line.191"></a>
+<span class="sourceLineNo">192</span>   * &lt;ol&gt;<a name="line.192"></a>
+<span class="sourceLineNo">193</span>   *   &lt;li&gt;s1,s2,s3 (no client port in the list, the client port could be obtained from<a name="line.193"></a>
+<span class="sourceLineNo">194</span>   *       clientPort)&lt;/li&gt;<a name="line.194"></a>
+<span class="sourceLineNo">195</span>   *   &lt;li&gt;s1:p1,s2:p2,s3:p3 (with client port, which could be same or different for each server,<a name="line.195"></a>
+<span class="sourceLineNo">196</span>   *       in this case, the clientPort would be ignored)&lt;/li&gt;<a name="line.196"></a>
+<span class="sourceLineNo">197</span>   *   &lt;li&gt;s1:p1,s2,s3:p3 (mix of (1) and (2) - if port is not specified in a server, it would use<a name="line.197"></a>
+<span class="sourceLineNo">198</span>   *       the clientPort; otherwise, it would use the specified port)&lt;/li&gt;<a name="line.198"></a>
+<span class="sourceLineNo">199</span>   * &lt;/ol&gt;<a name="line.199"></a>
+<span class="sourceLineNo">200</span>   *<a name="line.200"></a>
+<span class="sourceLineNo">201</span>   * @param key the cluster key to validate<a name="line.201"></a>
+<span class="sourceLineNo">202</span>   * @throws IOException if the key could not be parsed<a name="line.202"></a>
+<span class="sourceLineNo">203</span>   */<a name="line.203"></a>
+<span class="sourceLineNo">204</span>  public static void validateClusterKey(String key) throws IOException {<a name="line.204"></a>
+<span class="sourceLineNo">205</span>    transformClusterKey(key);<a name="line.205"></a>
+<span class="sourceLineNo">206</span>  }<a name="line.206"></a>
+<span class="sourceLineNo">207</span><a name="line.207"></a>
+<span class="sourceLineNo">208</span>  /**<a name="line.208"></a>
+<span class="sourceLineNo">209</span>   * Separate the given key into the three configurations it should contain:<a name="line.209"></a>
+<span class="sourceLineNo">210</span>   * hbase.zookeeper.quorum, hbase.zookeeper.client.port<a name="line.210"></a>
+<span class="sourceLineNo">211</span>   * and zookeeper.znode.parent<a name="line.211"></a>
+<span class="sourceLineNo">212</span>   * @param key<a name="line.212"></a>
+<span class="sourceLineNo">213</span>   * @return the three configuration in the described order<a name="line.213"></a>
+<span class="sourceLineNo">214</span>   * @throws IOException<a name="line.214"></a>
+<span class="sourceLineNo">215</span>   */<a name="line.215"></a>
+<span class="sourceLineNo">216</span>  public static ZKClusterKey transformClusterKey(String key) throws IOException {<a name="line.216"></a>
+<span class="sourceLineNo">217</span>    String[] parts = key.split(":");<a name="line.217"></a>
 <span class="sourceLineNo">218</span><a name="line.218"></a>
-<span class="sourceLineNo">219</span>      // The common case is that every server has its own client port specified - this means<a name="line.219"></a>
-<span class="sourceLineNo">220</span>      // that (total parts - the ZNodeParent part - the ClientPort part) is equal to<a name="line.220"></a>
-<span class="sourceLineNo">221</span>      // (the number of "," + 1) - "+ 1" because the last server has no ",".<a name="line.221"></a>
-<span class="sourceLineNo">222</span>      if ((parts.length - 2) == (serverHosts.length + 1)) {<a name="line.222"></a>
-<span class="sourceLineNo">223</span>        return new ZKClusterKey(quorumStringInput, Integer.parseInt(clientPort), zNodeParent);<a name="line.223"></a>
+<span class="sourceLineNo">219</span>    if (parts.length == 3) {<a name="line.219"></a>
+<span class="sourceLineNo">220</span>      if (!parts[2].matches("/.*[^/]")) {<a name="line.220"></a>
+<span class="sourceLineNo">221</span>        throw new IOException("Cluster key passed " + key + " is invalid, the format should be:" +<a name="line.221"></a>
+<span class="sourceLineNo">222</span>            HConstants.ZOOKEEPER_QUORUM + ":" + HConstants.ZOOKEEPER_CLIENT_PORT + ":"<a name="line.222"></a>
+<span class="sourceLineNo">223</span>            + HConstants.ZOOKEEPER_ZNODE_PARENT);<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>      // For the uncommon case that some servers has no port specified, we need to build the<a name="line.226"></a>
-<span class="sourceLineNo">227</span>      // server:clientport list using default client port for servers without specified port.<a name="line.227"></a>
-<span class="sourceLineNo">228</span>      return new ZKClusterKey(<a name="line.228"></a>
-<span class="sourceLineNo">229</span>          buildZKQuorumServerString(serverHosts, clientPort),<a name="line.229"></a>
-<span class="sourceLineNo">230</span>          Integer.parseInt(clientPort),<a name="line.230"></a>
-<span class="sourceLineNo">231</span>          zNodeParent);<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>    throw new IOException("Cluster key passed " + key + " is invalid, the format should be:" +<a name="line.234"></a>
-<span class="sourceLineNo">235</span>        HConstants.ZOOKEEPER_QUORUM + ":" + HConstants.ZOOKEEPER_CLIENT_PORT + ":"<a name="line.235"></a>
-<span class="sourceLineNo">236</span>        + HConstants.ZOOKEEPER_ZNODE_PARENT);<a name="line.236"></a>
-<span class="sourceLineNo">237</span>  }<a name="line.237"></a>
+<span class="sourceLineNo">225</span>      return new ZKClusterKey(parts [0], Integer.parseInt(parts [1]), parts [2]);<a name="line.225"></a>
+<span class="sourceLineNo">226</span>    }<a name="line.226"></a>
+<span class="sourceLineNo">227</span><a name="line.227"></a>
+<span class="sourceLineNo">228</span>    if (parts.length &gt; 3) {<a name="line.228"></a>
+<span class="sourceLineNo">229</span>      // The quorum could contain client port in server:clientport format, try to transform more.<a name="line.229"></a>
+<span class="sourceLineNo">230</span>      String zNodeParent = parts [parts.length - 1];<a name="line.230"></a>
+<span class="sourceLineNo">231</span>      if (!zNodeParent.matches("/.*[^/]")) {<a name="line.231"></a>
+<span class="sourceLineNo">232</span>        throw new IOException("Cluster key passed " + key + " is invalid, the format should be:"<a name="line.232"></a>
+<span class="sourceLineNo">233</span>            + HConstants.ZOOKEEPER_QUORUM + ":" + HConstants.ZOOKEEPER_CLIENT_PORT + ":"<a name="line.233"></a>
+<span class="sourceLineNo">234</span>            + HConstants.ZOOKEEPER_ZNODE_PARENT);<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>      String clientPort = parts [parts.length - 2];<a name="line.237"></a>
 <span class="sourceLineNo">238</span><a name="line.238"></a>
-<span class="sourceLineNo">239</span>  /**<a name="line.239"></a>
-<span class="sourceLineNo">240</span>   * Get the key to the ZK ensemble for this configuration without<a name="line.240"></a>
-<span class="sourceLineNo">241</span>   * adding a name at the end<a name="line.241"></a>
-<span class="sourceLineNo">242</span>   * @param conf Configuration to use to build the key<a name="line.242"></a>
-<span class="sourceLineNo">243</span>   * @return ensemble key without a name<a name="line.243"></a>
-<span class="sourceLineNo">244</span>   */<a name="line.244"></a>
-<span class="sourceLineNo">245</span>  public static String getZooKeeperClusterKey(Configuration conf) {<a name="line.245"></a>
-<span class="sourceLineNo">246</span>    return getZooKeeperClusterKey(conf, null);<a name="line.246"></a>
-<span class="sourceLineNo">247</span>  }<a name="line.247"></a>
-<span class="sourceLineNo">248</span><a name="line.248"></a>
-<span class="sourceLineNo">249</span>  /**<a name="line.249"></a>
-<span class="sourceLineNo">250</span>   * Get the key to the ZK ensemble for this configuration and append<a name="line.250"></a>
-<span class="sourceLineNo">251</span>   * a name at the end<a name="line.251"></a>
-<span class="sourceLineNo">252</span>   * @param conf Configuration to use to build the key<a name="line.252"></a>
-<span class="sourceLineNo">253</span>   * @param name Name that should be appended at the end if not empty or null<a name="line.253"></a>
-<span class="sourceLineNo">254</span>   * @return ensemble key with a name (if any)<a name="line.254"></a>
-<span class="sourceLineNo">255</span>   */<a name="line.255"></a>
-<span class="sourceLineNo">256</span>  public static String getZooKeeperClusterKey(Configuration conf, String name) {<a name="line.256"></a>
-<span class="sourceLineNo">257</span>    String ensemble = conf.get(HConstants.ZOOKEEPER_QUORUM).replaceAll(<a name="line.257"></a>
-<span class="sourceLineNo">258</span>        "[\\t\\n\\x0B\\f\\r]", "");<a name="line.258"></a>
-<span class="sourceLineNo">259</span>    StringBuilder builder = new StringBuilder(ensemble);<a name="line.259"></a>
-<span class="sourceLineNo">260</span>    builder.append(":");<a name="line.260"></a>
-<span class="sourceLineNo">261</span>    builder.append(conf.get(HConstants.ZOOKEEPER_CLIENT_PORT));<a name="line.261"></a>
-<span class="sourceLineNo">262</span>    builder.append(":");<a name="line.262"></a>
-<span class="sourceLineNo">263</span>    builder.append(conf.get(HConstants.ZOOKEEPER_ZNODE_PARENT));<a name="line.263"></a>
-<span class="sourceLineNo">264</span>    if (name != null &amp;&amp; !name.isEmpty()) {<a name="line.264"></a>
-<span class="sourceLineNo">265</span>      builder.append(",");<a name="line.265"></a>
-<span class="sourceLineNo">266</span>      builder.append(name);<a name="line.266"></a>
-<span class="sourceLineNo">267</span>    }<a name="line.267"></a>
-<span class="sourceLineNo">268</span>    return builder.toString();<a name="line.268"></a>
-<span class="sourceLineNo">269</span>  }<a name="line.269"></a>
-<span class="sourceLineNo">270</span><a name="line.270"></a>
-<span class="sourceLineNo">271</span>  /**<a name="line.271"></a>
-<span class="sourceLineNo">272</span>   * Standardize the ZK quorum string: make it a "server:clientport" list, separated by ','<a name="line.272"></a>
-<span class="sourceLineNo">273</span>   * @param quorumStringInput a string contains a list of servers for ZK quorum<a name="line.273"></a>
-<span class="sourceLineNo">274</span>   * @param clientPort the default client port<a name="line.274"></a>
-<span class="sourceLineNo">275</span>   * @return the string for a list of "server:port" separated by ","<a name="line.275"></a>
-<span class="sourceLineNo">276</span>   */<a name="line.276"></a>
-<span class="sourceLineNo">277</span>  @VisibleForTesting<a name="line.277"></a>
-<span class="sourceLineNo">278</span>  public static String standardizeZKQuorumServerString(String quorumStringInput,<a name="line.278"></a>
-<span class="sourceLineNo">279</span>      String clientPort) {<a name="line.279"></a>
-<span class="sourceLineNo">280</span>    String[] serverHosts = quorumStringInput.split(",");<a name="line.280"></a>
-<span class="sourceLineNo">281</span>    return buildZKQuorumServerString(serverHosts, clientPort);<a name="line.281"></a>
-<span class="sourceLineNo">282</span>  }<a name="line.282"></a>
-<span class="sourceLineNo">283</span><a name="line.283"></a>
-<span class="sourceLineNo">284</span>  // The Quorum for the ZK cluster can have one the following format (see examples below):<a name="line.284"></a>
-<span class="sourceLineNo">285</span>  // (1). s1,s2,s3 (no client port in the list, the client port could be obtained from clientPort)<a name="line.285"></a>
-<span class="sourceLineNo">286</span>  // (2). s1:p1,s2:p2,s3:p3 (with client port, which could be same or different for each server,<a name="line.286"></a>
-<span class="sourceLineNo">287</span>  //      in this case, the clientPort would be ignored)<a name="line.287"></a>
-<span class="sourceLineNo">288</span>  // (3). s1:p1,s2,s3:p3 (mix of (1) and (2) - if port is not specified in a server, it would use<a name="line.288"></a>
-<span class="sourceLineNo">289</span>  //      the clientPort; otherwise, it would use the specified port)<a name="line.289"></a>
-<span class="sourceLineNo">290</span>  @VisibleForTesting<a name="line.290"></a>
-<span class="sourceLineNo">291</span>  public static class ZKClusterKey {<a name="line.291"></a>
-<span class="sourceLineNo">292</span>    private String quorumString;<a name="line.292"></a>
-<span class="sourceLineNo">293</span>    private int clientPort;<a name="line.293"></a>
-<span class="sourceLineNo">294</span>    private String znodeParent;<a name="line.294"></a>
+<span class="sourceLineNo">239</span>      // The first part length is the total length minus the lengths of other parts and minus 2 ":"<a name="line.239"></a>
+<span class="sourceLineNo">240</span>      int endQuorumIndex = key.length() - zNodeParent.length() - clientPort.length() - 2;<a name="line.240"></a>
+<span class="sourceLineNo">241</span>      String quorumStringInput = key.substring(0, endQuorumIndex);<a name="line.241"></a>
+<span class="sourceLineNo">242</span>      String[] serverHosts = quorumStringInput.split(",");<a name="line.242"></a>
+<span class="sourceLineNo">243</span><a name="line.243"></a>
+<span class="sourceLineNo">244</span>      // The common case is that every server has its own client port specified - this means<a name="line.244"></a>
+<span class="sourceLineNo">245</span>      // that (total parts - the ZNodeParent part - the ClientPort part) is equal to<a name="line.245"></a>
+<span class="sourceLineNo">246</span>      // (the number of "," + 1) - "+ 1" because the last server has no ",".<a name="line.246"></a>
+<span class="sourceLineNo">247</span>      if ((parts.length - 2) == (serverHosts.length + 1)) {<a name="line.247"></a>
+<span class="sourceLineNo">248</span>        return new ZKClusterKey(quorumStringInput, Integer.parseInt(clientPort), zNodeParent);<a name="line.248"></a>
+<span class="sourceLineNo">249</span>      }<a name="line.249"></a>
+<span class="sourceLineNo">250</span><a name="line.250"></a>
+<span class="sourceLineNo">251</span>      // For the uncommon case that some servers has no port specified, we need to build the<a name="line.251"></a>
+<span class="sourceLineNo">252</span>      // server:clientport list using default client port for servers without specified port.<a name="line.252"></a>
+<span class="sourceLineNo">253</span>      return new ZKClusterKey(<a name="line.253"></a>
+<span class="sourceLineNo">254</span>          buildZKQuorumServerString(serverHosts, clientPort),<a name="line.254"></a>
+<span class="sourceLineNo">255</span>          Integer.parseInt(clientPort),<a name="line.255"></a>
+<span class="sourceLineNo">256</span>          zNodeParent);<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>    throw new IOException("Cluster key passed " + key + " is invalid, the format should be:" +<a name="line.259"></a>
+<span class="sourceLineNo">260</span>        HConstants.ZOOKEEPER_QUORUM + ":" + HConstants.ZOOKEEPER_CLIENT_PORT + ":"<a name="line.260"></a>
+<span class="sourceLineNo">261</span>        + HConstants.ZOOKEEPER_ZNODE_PARENT);<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>   * Get the key to the ZK ensemble for this configuration without<a name="line.265"></a>
+<span class="sourceLineNo">266</span>   * adding a name at the end<a name="line.266"></a>
+<span class="sourceLineNo">267</span>   * @param conf Configuration to use to build the key<a name="line.267"></a>
+<span class="sourceLineNo">268</span>   * @return ensemble key without a name<a name="line.268"></a>
+<span class="sourceLineNo">269</span>   */<a name="line.269"></a>
+<span class="sourceLineNo">270</span>  public static String getZooKeeperClusterKey(Configuration conf) {<a name="line.270"></a>
+<span class="sourceLineNo">271</span>    return getZooKeeperClusterKey(conf, null);<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>   * Get the key to the ZK ensemble for this configuration and append<a name="line.275"></a>
+<span class="sourceLineNo">276</span>   * a name at the end<a name="line.276"></a>
+<span class="sourceLineNo">277</span>   * @param conf Configuration to use to build the key<a name="line.277"></a>
+<span class="sourceLineNo">278</span>   * @param name Name that should be appended at the end if not empty or null<a name="line.278"></a>
+<span class="sourceLineNo">279</span>   * @return ensemble key with a name (if any)<a name="line.279"></a>
+<span class="sourceLineNo">280</span>   */<a name="line.280"></a>
+<span class="sourceLineNo">281</span>  public static String getZooKeeperClusterKey(Configuration conf, String name) {<a name="line.281"></a>
+<span class="sourceLineNo">282</span>    String ensemble = conf.get(HConstants.ZOOKEEPER_QUORUM).replaceAll(<a name="line.282"></a>
+<span class="sourceLineNo">283</span>        "[\\t\\n\\x0B\\f\\r]", "");<a name="line.283"></a>
+<span class="sourceLineNo">284</span>    StringBuilder builder = new StringBuilder(ensemble);<a name="line.284"></a>
+<span class="sourceLineNo">285</span>    builder.append(":");<a name="line.285"></a>
+<span class="sourceLineNo">286</span>    builder.append(conf.get(HConstants.ZOOKEEPER_CLIENT_PORT));<a name="line.286"></a>
+<span class="sourceLineNo">287</span>    builder.append(":");<a name="line.287"></a>
+<span class="sourceLineNo">288</span>    builder.append(conf.get(HConstants.ZOOKEEPER_ZNODE_PARENT));<a name="line.288"></a>
+<span class="sourceLineNo">289</span>    if (name != null &amp;&amp; !name.isEmpty()) {<a name="line.289"></a>
+<span class="sourceLineNo">290</span>      builder.append(",");<a name="line.290"></a>
+<span class="sourceLineNo">291</span>      builder.append(name);<a name="line.291"></a>
+<span class="sourceLineNo">292</span>    }<a name="line.292"></a>
+<span class="sourceLineNo">293</span>    return builder.toString();<a name="line.293"></a>
+<span class="sourceLineNo">294</span>  }<a name="line.294"></a>
 <span class="sourceLineNo">295</span><a name="line.295"></a>
-<span class="sourceLineNo">296</span>    ZKClusterKey(String quorumString, int clientPort, String znodeParent) {<a name="line.296"></a>
-<span class="sourceLineNo">297</span>      this.quorumString = quorumString;<a name="line.297"></a>
-<span class="sourceLineNo">298</span>      this.clientPort = clientPort;<a name="line.298"></a>
-<span class="sourceLineNo">299</span>      this.znodeParent = znodeParent;<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>    public String getQuorumString() {<a name="line.302"></a>
-<span class="sourceLineNo">303</span>      return quorumString;<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>    public int getClientPort() {<a name="line.306"></a>
-<span class="sourceLineNo">307</span>      return clientPort;<a name="line.307"></a>
-<span class="sourceLineNo">308</span>    }<a name="line.308"></a>
-<span class="sourceLineNo">309</span><a name="line.309"></a>
-<span class="sourceLineNo">310</span>    public String getZnodeParent() {<a name="line.310"></a>
-<span class="sourceLineNo">311</span>      return znodeParent;<a name="line.311"></a>
-<span class="sourceLineNo">312</span>    }<a name="line.312"></a>
-<span class="sourceLineNo">313</span>  }<a name="line.313"></a>
-<span class="sourceLineNo">314</span><a name="line.314"></a>
-<span class="sourceLineNo">315</span>  /**<a name="line.315"></a>
-<span class="sourceLineNo">316</span>   * Get the client ZK Quorum servers string<a name="line.316"></a>
-<span class="sourceLineNo">317</span>   * @param conf the configuration to read<a name="line.317"></a>
-<span class="sourceLineNo">318</span>   * @return Client quorum servers, or null if not specified<a name="line.318"></a>
-<span class="sourceLineNo">319</span>   */<a name="line.319"></a>
-<span class="sourceLineNo">320</span>  public static String getClientZKQuorumServersString(Configuration conf) {<a name="line.320"></a>
-<span class="sourceLineNo">321</span>    String clientQuromServers = conf.get(HConstants.CLIENT_ZOOKEEPER_QUORUM);<a name="line.321"></a>
-<span class="sourceLineNo">322</span>    if (clientQuromServers == null) {<a name="line.322"></a>
-<span class="sourceLineNo">323</span>      return null;<a name="line.323"></a>
-<span class="sourceLineNo">324</span>    }<a name="line.324"></a>
-<span class="sourceLineNo">325</span>    int defaultClientPort =<a name="line.325"></a>
-<span class="sourceLineNo">326</span>        conf.getInt(HConstants.ZOOKEEPER_CLIENT_PORT, HConstants.DEFAULT_ZOOKEEPER_CLIENT_PORT);<a name="line.326"></a>
-<span class="sourceLineNo">327</span>    String clientZkClientPort =<a name="line.327"></a>
-<span class="sourceLineNo">328</span>        Integer.toString(conf.getInt(HConstants.CLIENT_ZOOKEEPER_CLIENT_PORT, defaultClientPort));<a name="line.328"></a>
-<span class="sourceLineNo">329</span>    // Build the ZK quorum server string with "server:clientport" list, separated by ','<a name="line.329"></a>
-<span class="sourceLineNo">330</span>    final String[] serverHosts = StringUtils.getStrings(clientQuromServers);<a name="line.330"></a>
-<span class="sourceLineNo">331</span>    return buildZKQuorumServerString(serverHosts, clientZkClientPort);<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">296</span>  /**<a name="line.296"></a>
+<span class="sourceLineNo">297</span>   * Standardize the ZK quorum string: make it a "server:clientport" list, separated by ','<a name="line.297"></a>
+<span class="sourceLineNo">298</span>   * @param quorumStringInput a string contains a list of servers for ZK quorum<a name="line.298"></a>
+<span class="sourceLineNo">299</span>   * @param clientPort the default client port<a name="line.299"></a>
+<span class="sourceLineNo">300</span>   * @return the string for a list of "server:port" separated by ","<a name="line.300"></a>
+<span class="sourceLineNo">301</span>   */<a name="line.301"></a>
+<span class="sourceLineNo">302</span>  @VisibleForTesting<a name="line.302"></a>
+<span class="sourceLineNo">303</span>  public static String standardizeZKQuorumServerString(String quorumStringInput,<a name="line.303"></a>
+<span class="sourceLineNo">304</span>      String clientPort) {<a name="line.304"></a>
+<span class="sourceLineNo">305</span>    String[] serverHosts = quorumStringInput.split(",");<a name="line.305"></a>
+<span class="sourceLineNo">306</span>    return buildZKQuorumServerString(serverHosts, clientPort);<a name="line.306"></a>
+<span class="sourceLineNo">307</span>  }<a name="line.307"></a>
+<span class="sourceLineNo">308</span><a name="line.308"></a>
+<span class="sourceLineNo">309</span>  // The Quorum for the ZK cluster can have one the following format (see examples below):<a name="line.309"></a>
+<span class="sourceLineNo">310</span>  // (1). s1,s2,s3 (no client port in the list, the client port could be obtained from clientPort)<a name="line.310"></a>
+<span class="sourceLineNo">311</span>  // (2). s1:p1,s2:p2,s3:p3 (with client port, which could be same or different for each server,<a name="line.311"></a>
+<span class="sourceLineNo">312</span>  //      in this case, the clientPort would be ignored)<a name="line.312"></a>
+<span class="sourceLineNo">313</span>  // (3). s1:p1,s2,s3:p3 (mix of (1) and (2) - if port is not specified in a server, it would use<a name="line.313"></a>
+<span class="sourceLineNo">314</span>  //      the clientPort; otherwise, it would use the specified port)<a name="line.314"></a>
+<span class="sourceLineNo">315</span>  @VisibleForTesting<a name="line.315"></a>
+<span class="sourceLineNo">316</span>  public static class ZKClusterKey {<a name="line.316"></a>
+<span class="sourceLineNo">317</span>    private String quorumString;<a name="line.317"></a>
+<span class="sourceLineNo">318</span>    private int clientPort;<a name="line.318"></a>
+<span class="sourceLineNo">319</span>    private String znodeParent;<a name="line.319"></a>
+<span class="sourceLineNo">320</span><a name="line.320"></a>
+<span class="sourceLineNo">321</span>    ZKClusterKey(String quorumString, int clientPort, String znodeParent) {<a name="line.321"></a>
+<span class="sourceLineNo">322</span>      this.quorumString = quorumString;<a name="line.322"></a>
+<span class="sourceLineNo">323</span>      this.clientPort = clientPort;<a name="line.323"></a>
+<span class="sourceLineNo">324</span>      this.znodeParent = znodeParent;<a name="line.324"></a>
+<span class="sourceLineNo">325</span>    }<a name="line.325"></a>
+<span class="sourceLineNo">326</span><a name="line.326"></a>
+<span class="sourceLineNo">327</span>    public String getQuorumString() {<a name="line.327"></a>
+<span class="sourceLineNo">328</span>      return quorumString;<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>    public int getClientPort() {<a name="line.331"></a>
+<span class="sourceLineNo">332</span>      return clientPort;<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>    public String getZnodeParent() {<a name="line.335"></a>
+<span class="sourceLineNo">336</span>      return znodeParent;<a name="line.336"></a>
+<span class="sourceLineNo">337</span>    }<a name="line.337"></a>
+<span class="sourceLineNo">338</span>  }<a name="line.338"></a>
+<span class="sourceLineNo">339</span><a name="line.339"></a>
+<span class="sourceLineNo">340</span>  /**<a name="line.340"></a>
+<span class="sourceLineNo">341</span>   * Get the client ZK Quorum servers string<a name="line.341"></a>
+<span class="sourceLineNo">342</span>   * @param conf the configuration to read<a name="line.342"></a>
+<span class="sourceLineNo">343</span>   * @return Client quorum servers, or null if not specified<a name="line.343"></a>
+<span class="sourceLineNo">344</span>   */<a name="line.344"></a>
+<span class="sourceLineNo">345</span>  public static String getClientZKQuorumServersString(Configuration conf) {<a name="line.345"></a>
+<span class="sourceLineNo">346</span>    String clientQuromServers = conf.get(HConstants.CLIENT_ZOOKEEPER_QUORUM);<a name="line.346"></a>
+<span class="sourceLineNo">347</span>    if (clientQuromServers == null) {<a name="line.347"></a>
+<span class="sourceLineNo">348</span>      return null;<a name="line.348"></a>
+<span class="sourceLineNo">349</span>    }<a name="line.349"></a>
+<span class="sourceLineNo">350</span>    int defaultClientPort =<a name="line.350"></a>
+<span class="sourceLineNo">351</span>        conf.getInt(HConstants.ZOOKEEPER_CLIENT_PORT, HConstants.DEFAULT_ZOOKEEPER_CLIENT_PORT);<a name="line.351"></a>
+<span class="sourceLineNo">352</span>    String clientZkClientPort =<a name="line.352"></a>
+<span class="sourceLineNo">353</span>        Integer.toString(conf.getInt(HConstants.CLIENT_ZOOKEEPER_CLIENT_PORT, defaultClientPort));<a name="line.353"></a>
+<span class="sourceLineNo">354</span>    // Build the ZK quorum server string with "server:clientport" list, separated by ','<a name="line.354"></a>
+<span class="sourceLineNo">355</span>    final String[] serverHosts = StringUtils.getStrings(clientQuromServers);<a name="line.355"></a>
+<span class="sourceLineNo">356</span>    return buildZKQuorumServerString(serverHosts, clientZkClientPort);<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>