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<TestProcEnv> 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() > 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<>(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, () -> proc.isSuccess() && 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, () -> proc.isSuccess() && 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, () -> procExecutor.getProcedures().stream()<a name="line.114"></a>
-<span class="sourceLineNo">115</span> .filter(p -> p.getParentProcId() == rootId).collect(Collectors.toList())<a name="line.115"></a>
-<span class="sourceLineNo">116</span> .size() > 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 -> 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, () -> proc.isSuccess() && 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, () -> proc.isSuccess() && 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, () -> procExecutor.getProcedures().stream()<a name="line.142"></a>
-<span class="sourceLineNo">143</span> .filter(p -> p.getParentProcId() == rootId).collect(Collectors.toList())<a name="line.143"></a>
-<span class="sourceLineNo">144</span> .size() > 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 -> 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, () -> proc.isSuccess() && 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<TestProcEnv> {<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<TestProcEnv> 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() > 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<>(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, () -> proc.isSuccess() && 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, () -> proc.isSuccess() && 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, () -> procExecutor.getProcedures().stream()<a name="line.115"></a>
+<span class="sourceLineNo">116</span> .filter(p -> p.getParentProcId() == rootId).collect(Collectors.toList())<a name="line.116"></a>
+<span class="sourceLineNo">117</span> .size() > 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 -> 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, () -> proc.isSuccess() && 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, () -> proc.isSuccess() && 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, () -> procExecutor.getProcedures().stream()<a name="line.143"></a>
+<span class="sourceLineNo">144</span> .filter(p -> p.getParentProcId() == rootId).collect(Collectors.toList())<a name="line.144"></a>
+<span class="sourceLineNo">145</span> .size() > 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 -> 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, () -> proc.isSuccess() && 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, () -> proc.isSuccess() && 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<TestProcEnv> {<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<TestProcEnv> {<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<TestProcEnv> {<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<TestProcEnv> {<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<TestProcEnv> {<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<TestProcEnv, StuckStateMachineState> {<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<TestProcEnv> {<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<TestProcEnv, StuckStateMachineState> {<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<TEnvironment> proc, NonceKey nonceKey) {<a name="line.999"></a>
-<span class="sourceLineNo">1000</span> Preconditions.checkArgument(lastProcId.get() >= 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<TEnvironment> proc, NonceKey nonceKey) {<a name="line.1007"></a>
+<span class="sourceLineNo">1008</span> Preconditions.checkArgument(lastProcId.get() >= 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<TEnvironment>[] procs) {<a name="line.1030"></a>
-<span class="sourceLineNo">1031</span> Preconditions.checkArgument(lastProcId.get() >= 0);<a name="line.1031"></a>
-<span class="sourceLineNo">1032</span> if (procs == null || procs.length <= 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 < 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 < 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<TEnvironment> prepareProcedure(Procedure<TEnvironment> 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<TEnvironment>[] procs) {<a name="line.1038"></a>
+<span class="sourceLineNo">1039</span> Preconditions.checkArgument(lastProcId.get() >= 0);<a name="line.1039"></a>
+<span class="sourceLineNo">1040</span> if (procs == null || procs.length <= 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 < 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 < 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<TEnvironment> 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<TEnvironment> stack = new RootProcedureState<>();<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<TEnvironment> prepareProcedure(Procedure<TEnvironment> 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<TEnvironment> 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<TEnvironment> stack = new RootProcedureState<>();<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<TEnvironment> 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 && 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<TEnvironment> 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 <T extends Procedure<TEnvironment>> T getProcedure(Class<T> clazz, long procId) {<a name="line.1115"></a>
-<span class="sourceLineNo">1116</span> Procedure<TEnvironment> 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<TEnvironment> 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 && 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<TEnvironment> 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<TEnvironment> getResult(long procId) {<a name="line.1123"></a>
-<span class="sourceLineNo">1124</span> CompletedProcedureRetainer<TEnvironment> 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<?> 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<TEnvironment> 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<TEnvironment> getResultOrProcedure(long procId) {<a name="line.1172"></a>
-<span class="sourceLineNo">1173</span> CompletedProcedureRetainer<TEnvironment> 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<TEnvironment> 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<TEnvironment> 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> * <p/><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<Procedure<TEnvironment>> 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 <T extends Procedure<TEnvironment>> T getProcedure(Class<T> clazz, long procId) {<a name="line.1123"></a>
+<span class="sourceLineNo">1124</span> Procedure<TEnvironment> 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<TEnvironment> getResult(long procId) {<a name="line.1131"></a>
+<span class="sourceLineNo">1132</span> CompletedProcedureRetainer<TEnvironment> 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<?> 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<TEnvironment> 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<TEnvironment> getResultOrProcedure(long procId) {<a name="line.1180"></a>
+<span class="sourceLineNo">1181</span> CompletedProcedureRetainer<TEnvironment> 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<TEnvironment> 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<TEnvironment> 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> * <p/><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<Procedure<TEnvironment>> getProcedures() {<a name="line.1222"></a>
-<span class="sourceLineNo">1223</span> List<Procedure<TEnvironment>> procedureList =<a name="line.1223"></a>
-<span class="sourceLineNo">1224</span> new ArrayList<>(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 < 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 >= 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 >= 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<Long> 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<TEnvironment> 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<TEnvironment> 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<TEnvironment> 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<Procedure<TEnvironment>> 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<Procedure<TEnvironment>> getProcedures() {<a name="line.1230"></a>
+<span class="sourceLineNo">1231</span> List<Procedure<TEnvironment>> procedureList =<a name="line.1231"></a>
+<span class="sourceLineNo">1232</span> new ArrayList<>(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 < 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 >= 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 >= 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<Long> 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<TEnvironment> 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<TEnvironment> 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<TEnvironment> 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<TEnvironment> 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<TEnvironment> 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<TEnvironment> procStack) {<a name="line.1437"></a>
-<span class="sourceLineNo">1438</span> Procedure<TEnvironment> 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<TestProcEnv> 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() > 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<>(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, () -> proc.isSuccess() && 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, () -> proc.isSuccess() && 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, () -> procExecutor.getProcedures().stream()<a name="line.114"></a>
-<span class="sourceLineNo">115</span> .filter(p -> p.getParentProcId() == rootId).collect(Collectors.toList())<a name="line.115"></a>
-<span class="sourceLineNo">116</span> .size() > 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 -> 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, () -> proc.isSuccess() && 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, () -> proc.isSuccess() && 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, () -> procExecutor.getProcedures().stream()<a name="line.142"></a>
-<span class="sourceLineNo">143</span> .filter(p -> p.getParentProcId() == rootId).collect(Collectors.toList())<a name="line.143"></a>
-<span class="sourceLineNo">144</span> .size() > 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 -> 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, () -> proc.isSuccess() && 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<TestProcEnv> {<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<TestProcEnv> 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() > 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<>(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, () -> proc.isSuccess() && 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, () -> proc.isSuccess() && 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, () -> procExecutor.getProcedures().stream()<a name="line.115"></a>
+<span class="sourceLineNo">116</span> .filter(p -> p.getParentProcId() == rootId).collect(Collectors.toList())<a name="line.116"></a>
+<span class="sourceLineNo">117</span> .size() > 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 -> 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, () -> proc.isSuccess() && 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, () -> proc.isSuccess() && 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, () -> procExecutor.getProcedures().stream()<a name="line.143"></a>
+<span class="sourceLineNo">144</span> .filter(p -> p.getParentProcId() == rootId).collect(Collectors.toList())<a name="line.144"></a>
+<span class="sourceLineNo">145</span> .size() > 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 -> 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, () -> proc.isSuccess() && 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, () -> proc.isSuccess() && 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<TestProcEnv> {<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<TestProcEnv> {<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<TestProcEnv> {<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<TestProcEnv> {<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<TestProcEnv> {<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<TestProcEnv, StuckStateMachineState> {<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<TestProcEnv> {<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<TestProcEnv, StuckStateMachineState> {<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<TestProcEnv> 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() > 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<>(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, () -> proc.isSuccess() && 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, () -> proc.isSuccess() && 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, () -> procExecutor.getProcedures().stream()<a name="line.114"></a>
-<span class="sourceLineNo">115</span> .filter(p -> p.getParentProcId() == rootId).collect(Collectors.toList())<a name="line.115"></a>
-<span class="sourceLineNo">116</span> .size() > 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 -> 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, () -> proc.isSuccess() && 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, () -> proc.isSuccess() && 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, () -> procExecutor.getProcedures().stream()<a name="line.142"></a>
-<span class="sourceLineNo">143</span> .filter(p -> p.getParentProcId() == rootId).collect(Collectors.toList())<a name="line.143"></a>
-<span class="sourceLineNo">144</span> .size() > 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 -> 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, () -> proc.isSuccess() && 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<TestProcEnv> {<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<TestProcEnv> 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() > 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<>(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, () -> proc.isSuccess() && 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, () -> proc.isSuccess() && 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, () -> procExecutor.getProcedures().stream()<a name="line.115"></a>
+<span class="sourceLineNo">116</span> .filter(p -> p.getParentProcId() == rootId).collect(Collectors.toList())<a name="line.116"></a>
+<span class="sourceLineNo">117</span> .size() > 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 -> 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, () -> proc.isSuccess() && 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, () -> proc.isSuccess() && 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, () -> procExecutor.getProcedures().stream()<a name="line.143"></a>
+<span class="sourceLineNo">144</span> .filter(p -> p.getParentProcId() == rootId).collect(Collectors.toList())<a name="line.144"></a>
+<span class="sourceLineNo">145</span> .size() > 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 -> 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, () -> proc.isSuccess() && 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, () -> proc.isSuccess() && 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<TestProcEnv> {<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<TestProcEnv> {<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<TestProcEnv> {<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<TestProcEnv> {<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<TestProcEnv> {<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<TestProcEnv, StuckStateMachineState> {<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<TestProcEnv> {<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<TestProcEnv, StuckStateMachineState> {<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<TEnvironment> proc, NonceKey nonceKey) {<a name="line.999"></a>
-<span class="sourceLineNo">1000</span> Preconditions.checkArgument(lastProcId.get() >= 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<TEnvironment> proc, NonceKey nonceKey) {<a name="line.1007"></a>
+<span class="sourceLineNo">1008</span> Preconditions.checkArgument(lastProcId.get() >= 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<TEnvironment>[] procs) {<a name="line.1030"></a>
-<span class="sourceLineNo">1031</span> Preconditions.checkArgument(lastProcId.get() >= 0);<a name="line.1031"></a>
-<span class="sourceLineNo">1032</span> if (procs == null || procs.length <= 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 < 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 < 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<TEnvironment> prepareProcedure(Procedure<TEnvironment> 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<TEnvironment>[] procs) {<a name="line.1038"></a>
+<span class="sourceLineNo">1039</span> Preconditions.checkArgument(lastProcId.get() >= 0);<a name="line.1039"></a>
+<span class="sourceLineNo">1040</span> if (procs == null || procs.length <= 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 < 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 < 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<TEnvironment> 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<TEnvironment> stack = new RootProcedureState<>();<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<TEnvironment> prepareProcedure(Procedure<TEnvironment> 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<TEnvironment> 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<TEnvironment> stack = new RootProcedureState<>();<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<TEnvironment> 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 && 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<TEnvironment> 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 <T extends Procedure<TEnvironment>> T getProcedure(Class<T> clazz, long procId) {<a name="line.1115"></a>
-<span class="sourceLineNo">1116</span> Procedure<TEnvironment> 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<TEnvironment> 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 && 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<TEnvironment> 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<TEnvironment> getResult(long procId) {<a name="line.1123"></a>
-<span class="sourceLineNo">1124</span> CompletedProcedureRetainer<TEnvironment> 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<?> 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<TEnvironment> 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<TEnvironment> getResultOrProcedure(long procId) {<a name="line.1172"></a>
-<span class="sourceLineNo">1173</span> CompletedProcedureRetainer<TEnvironment> 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<TEnvironment> 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<TEnvironment> 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> * <p/><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<Procedure<TEnvironment>> 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 <T extends Procedure<TEnvironment>> T getProcedure(Class<T> clazz, long procId) {<a name="line.1123"></a>
+<span class="sourceLineNo">1124</span> Procedure<TEnvironment> 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<TEnvironment> getResult(long procId) {<a name="line.1131"></a>
+<span class="sourceLineNo">1132</span> CompletedProcedureRetainer<TEnvironment> 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<?> 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<TEnvironment> 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<TEnvironment> getResultOrProcedure(long procId) {<a name="line.1180"></a>
+<span class="sourceLineNo">1181</span> CompletedProcedureRetainer<TEnvironment> 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<TEnvironment> 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<TEnvironment> 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> * <p/><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<Procedure<TEnvironment>> getProcedures() {<a name="line.1222"></a>
-<span class="sourceLineNo">1223</span> List<Procedure<TEnvironment>> procedureList =<a name="line.1223"></a>
-<span class="sourceLineNo">1224</span> new ArrayList<>(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 < 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 >= 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 >= 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<Long> 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<TEnvironment> 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<TEnvironment> 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<TEnvironment> 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<Procedure<TEnvironment>> 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<Procedure<TEnvironment>> getProcedures() {<a name="line.1230"></a>
+<span class="sourceLineNo">1231</span> List<Procedure<TEnvironment>> procedureList =<a name="line.1231"></a>
+<span class="sourceLineNo">1232</span> new ArrayList<>(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 < 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 >= 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 >= 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<Long> 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<TEnvironment> 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<TEnvironment> 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<TEnvironment> 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<TEnvironment> 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<TEnvironment> 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<TEnvironment> procStack) {<a name="line.1437"></a>
-<span class="sourceLineNo">1438</span> Procedure<TEnvironment> 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 –
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 <a href="../../../../../src-html/org/apache/hadoop/hbase/mapreduce/CopyTable.html#line.51">CopyTable</a>()</pre>
+<pre>public <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 org.apache.hadoop.mapreduce.Job <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>[] args)
+<pre>public org.apache.hadoop.mapreduce.Job <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>[] 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 void <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>[] args)
+<pre>public static void <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>[] 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 int <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>[] args)
+<pre>public int <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>[] 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 > 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 >= 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<String,String> cfRenameMap = new HashMap<>();<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 && errorMsg.length() > 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] <tablename>");<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 >=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 < 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 < 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 && 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) && (startTime > endTime)) {<a name="line.327"></a>
-<span class="sourceLineNo">328</span> printUsage("Invalid time range filter: starttime=" + startTime + " > 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 && 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 > 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 >= 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<String,String> cfRenameMap = new HashMap<>();<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 && errorMsg.length() > 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] <tablename>");<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 >=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 < 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 < 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 && 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) && (startTime > endTime)) {<a name="line.328"></a>
+<span class="sourceLineNo">329</span> printUsage("Invalid time range filter: starttime=" + startTime + " > 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 && 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 –
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<TestProcEnv> 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() > 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<>(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, () -> proc.isSuccess() && 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, () -> proc.isSuccess() && 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, () -> procExecutor.getProcedures().stream()<a name="line.114"></a>
-<span class="sourceLineNo">115</span> .filter(p -> p.getParentProcId() == rootId).collect(Collectors.toList())<a name="line.115"></a>
-<span class="sourceLineNo">116</span> .size() > 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 -> 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, () -> proc.isSuccess() && 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, () -> proc.isSuccess() && 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, () -> procExecutor.getProcedures().stream()<a name="line.142"></a>
-<span class="sourceLineNo">143</span> .filter(p -> p.getParentProcId() == rootId).collect(Collectors.toList())<a name="line.143"></a>
-<span class="sourceLineNo">144</span> .size() > 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 -> 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, () -> proc.isSuccess() && 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<TestProcEnv> {<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<TestProcEnv> 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() > 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<>(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, () -> proc.isSuccess() && 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, () -> proc.isSuccess() && 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, () -> procExecutor.getProcedures().stream()<a name="line.115"></a>
+<span class="sourceLineNo">116</span> .filter(p -> p.getParentProcId() == rootId).collect(Collectors.toList())<a name="line.116"></a>
+<span class="sourceLineNo">117</span> .size() > 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 -> 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, () -> proc.isSuccess() && 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, () -> proc.isSuccess() && 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, () -> procExecutor.getProcedures().stream()<a name="line.143"></a>
+<span class="sourceLineNo">144</span> .filter(p -> p.getParentProcId() == rootId).collect(Collectors.toList())<a name="line.144"></a>
+<span class="sourceLineNo">145</span> .size() > 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 -> 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, () -> proc.isSuccess() && 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, () -> proc.isSuccess() && 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<TestProcEnv> {<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<TestProcEnv> {<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<TestProcEnv> {<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<TestProcEnv> {<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<TestProcEnv> {<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<TestProcEnv, StuckStateMachineState> {<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<TestProcEnv> {<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<TestProcEnv, StuckStateMachineState> {<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 > 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 >= 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<String,String> cfRenameMap = new HashMap<>();<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 && errorMsg.length() > 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] <tablename>");<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 >=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 < 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 < 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 && 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) && (startTime > endTime)) {<a name="line.327"></a>
-<span class="sourceLineNo">328</span> printUsage("Invalid time range filter: starttime=" + startTime + " > 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 && 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 > 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 >= 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<String,String> cfRenameMap = new HashMap<>();<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 && errorMsg.length() > 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] <tablename>");<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 >=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 < 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 < 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 && 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) && (startTime > endTime)) {<a name="line.328"></a>
+<span class="sourceLineNo">329</span> printUsage("Invalid time range filter: starttime=" + startTime + " > 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 && 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<TEnvironment> proc, NonceKey nonceKey) {<a name="line.999"></a>
-<span class="sourceLineNo">1000</span> Preconditions.checkArgument(lastProcId.get() >= 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<TEnvironment> proc, NonceKey nonceKey) {<a name="line.1007"></a>
+<span class="sourceLineNo">1008</span> Preconditions.checkArgument(lastProcId.get() >= 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<TEnvironment>[] procs) {<a name="line.1030"></a>
-<span class="sourceLineNo">1031</span> Preconditions.checkArgument(lastProcId.get() >= 0);<a name="line.1031"></a>
-<span class="sourceLineNo">1032</span> if (procs == null || procs.length <= 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 < 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 < 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<TEnvironment> prepareProcedure(Procedure<TEnvironment> 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<TEnvironment>[] procs) {<a name="line.1038"></a>
+<span class="sourceLineNo">1039</span> Preconditions.checkArgument(lastProcId.get() >= 0);<a name="line.1039"></a>
+<span class="sourceLineNo">1040</span> if (procs == null || procs.length <= 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 < 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 < 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<TEnvironment> 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<TEnvironment> stack = new RootProcedureState<>();<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<TEnvironment> prepareProcedure(Procedure<TEnvironment> 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<TEnvironment> 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<TEnvironment> stack = new RootProcedureState<>();<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<TEnvironment> 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 && 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<TEnvironment> 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 <T extends Procedure<TEnvironment>> T getProcedure(Class<T> clazz, long procId) {<a name="line.1115"></a>
-<span class="sourceLineNo">1116</span> Procedure<TEnvironment> 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<TEnvironment> 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 && 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<TEnvironment> 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<TEnvironment> getResult(long procId) {<a name="line.1123"></a>
-<span class="sourceLineNo">1124</span> CompletedProcedureRetainer<TEnvironment> 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<?> 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<TEnvironment> 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<TEnvironment> getResultOrProcedure(long procId) {<a name="line.1172"></a>
-<span class="sourceLineNo">1173</span> CompletedProcedureRetainer<TEnvironment> 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<TEnvironment> 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<TEnvironment> 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> * <p/><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<Procedure<TEnvironment>> 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 <T extends Procedure<TEnvironment>> T getProcedure(Class<T> clazz, long procId) {<a name="line.1123"></a>
+<span class="sourceLineNo">1124</span> Procedure<TEnvironment> 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<TEnvironment> getResult(long procId) {<a name="line.1131"></a>
+<span class="sourceLineNo">1132</span> CompletedProcedureRetainer<TEnvironment> 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<?> 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<TEnvironment> 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<TEnvironment> getResultOrProcedure(long procId) {<a name="line.1180"></a>
+<span class="sourceLineNo">1181</span> CompletedProcedureRetainer<TEnvironment> 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<TEnvironment> 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<TEnvironment> 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> * <p/><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<Procedure<TEnvironment>> getProcedures() {<a name="line.1222"></a>
-<span class="sourceLineNo">1223</span> List<Procedure<TEnvironment>> procedureList =<a name="line.1223"></a>
-<span class="sourceLineNo">1224</span> new ArrayList<>(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 < 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 >= 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 >= 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<Long> 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<TEnvironment> 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<TEnvironment> 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<TEnvironment> 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<Procedure<TEnvironment>> 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<Procedure<TEnvironment>> getProcedures() {<a name="line.1230"></a>
+<span class="sourceLineNo">1231</span> List<Procedure<TEnvironment>> procedureList =<a name="line.1231"></a>
+<span class="sourceLineNo">1232</span> new ArrayList<>(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 < 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 >= 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 >= 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<Long> 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<TEnvironment> 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<TEnvironment> 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<TEnvironment> 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<TEnvironment> 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<TEnvironment> 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<TEnvironment> procStack) {<a name="line.1437"></a>
-<span class="sourceLineNo">1438</span> Procedure<TEnvironment> 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 </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> </td>
</tr>
+<tr class="altColor">
+<td class="colFirst"><code>static class </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> </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> </td>
+<td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/procedure2/TestProcedureBypass.html#testBypassingWaitingTimeoutProcedures--">testBypassingWaitingTimeoutProcedures</a></span>()</code> </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> </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> </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 <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 <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 org.slf4j.Logger <a href="../../../../../src-html/org/apache/hadoop/hbase/procedure2/TestProcedureBypass.html#line.49">LOG</a></pre>
+<pre>private static final 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 int <a href="../../../../../src-html/org/apache/hadoop/hbase/procedure2/TestProcedureBypass.html#line.51">PROCEDURE_EXECUTOR_SLOTS</a></pre>
+<pre>private static final 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 <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 <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 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 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 org.apache.hadoop.hbase.procedure2.ProcedureExecutor<<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.56">procExecutor</a></pre>
+<pre>private static org.apache.hadoop.hbase.procedure2.ProcedureExecutor<<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.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 <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 <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 org.apache.hadoop.fs.FileSystem <a href="../../../../../src-html/org/apache/hadoop/hbase/procedure2/TestProcedureBypass.html#line.60">fs</a></pre>
+<pre>private static 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 org.apache.hadoop.fs.Path <a href="../../../../../src-html/org/apache/hadoop/hbase/procedure2/TestProcedureBypass.html#line.61">testDir</a></pre>
+<pre>private static 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 org.apache.hadoop.fs.Path <a href="../../../../../src-html/org/apache/hadoop/hbase/procedure2/TestProcedureBypass.html#line.62">logDir</a></pre>
+<pre>private static 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 <a href="../../../../../src-html/org/apache/hadoop/hbase/procedure2/TestProcedureBypass.html#line.44">TestProcedureBypass</a>()</pre>
+<pre>public <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 void <a href="../../../../../src-html/org/apache/hadoop/hbase/procedure2/TestProcedureBypass.html#line.68">setUp</a>()
+<pre>public static void <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 void <a href="../../../../../src-html/org/apache/hadoop/hbase/procedure2/TestProcedureBypass.html#line.87">testBypassSuspendProcedure</a>()
+<pre>public void <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 void <a href="../../../../../src-html/org/apache/hadoop/hbase/procedure2/TestProcedureBypass.html#line.98">testStuckProcedure</a>()
+<pre>public void <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 void <a href="../../../../../src-html/org/apache/hadoop/hbase/procedure2/TestProcedureBypass.html#line.111">testBypassingProcedureWithParent</a>()
+<pre>public void <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 void <a href="../../../../../src-html/org/apache/hadoop/hbase/procedure2/TestProcedureBypass.html#line.125">testBypassingStuckStateMachineProcedure</a>()
+<pre>public void <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 void <a href="../../../../../src-html/org/apache/hadoop/hbase/procedure2/TestProcedureBypass.html#line.139">testBypassingProcedureWithParentRecursive</a>()
+<pre>public void <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 void <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 void <a href="../../../../../src-html/org/apache/hadoop/hbase/procedure2/TestProcedureBypass.html#line.153">tearDown</a>()
+<pre>public static void <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 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 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 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 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 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 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 </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> </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> </td>
</tr>
<tr class="rowColor">
<td class="colFirst"><code>static class </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> </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> </td>
</tr>
<tr class="altColor">
<td class="colFirst"><code>static class </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> </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> </td>
</tr>
<tr class="rowColor">
<td class="colFirst"><code>static class </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> </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> </td>
</tr>
<tr class="altColor">
<td class="colFirst"><code>static class </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> </td>
+</tr>
+<tr class="rowColor">
+<td class="colFirst"><code>static class </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 </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> </td>
</tr>
-<tr class="altColor">
+<tr class="rowColor">
<td class="colFirst"><code>static class </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> </td>
</tr>
-<tr class="rowColor">
+<tr class="altColor">
<td class="colFirst"><code>static class </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> </td>
</tr>
-<tr class="altColor">
+<tr class="rowColor">
<td class="colFirst"><code>static class </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> </td>
</tr>
-<tr class="rowColor">
+<tr class="altColor">
<td class="colFirst"><code>static class </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> </td>
</tr>
-<tr class="altColor">
+<tr class="rowColor">
<td class="colFirst"><code>static class </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> </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> env)</code> </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> env)</code> </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> env,
<a href="../../../../../../org/apache/hadoop/hbase/procedure2/TestProcedureBypass.StuckStateMachineState.html" title="enum in org.apache.hadoop.hbase.procedure2">TestProcedureBypass.StuckStateMachineState</a> tState)</code> </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> env)</code> </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 Frames</a></li>
+</ul>
+<ul class="navList" id="allclasses_navbar_top">
+<li><a href="../../../../../../allclasses-noframe.html">All 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 Frames</a></li>
+</ul>
+<ul class="navList" id="allclasses_navbar_bottom">
+<li><a href="../../../../../../allclasses-noframe.html">All 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 © 2007–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"> </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"> </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"> </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"> </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"> </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"> </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"> </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"> </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"> </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"> </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"> </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"> </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"> </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"> </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"> </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"> </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"> </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"> </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"> </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"> </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"> </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"> </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"> </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"> </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"> </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"> </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"> </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"> </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"> </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"> </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"> </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"> </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"> </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"> </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"> </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"> </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"> </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"> </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"> </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"> </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"> </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"> </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"> </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"> </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"> </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"> </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"> </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"> </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"> </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"> </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"> </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"> </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"> </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"> </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"> </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"> </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"> </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"> </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"> </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"> </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><E> (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><T>, 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><E> (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><T>, 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><E> (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><T>, 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 long <a href="../../../../../src-html/org/apache/hadoop/hbase/zookeeper/TestZKMainServer.ExitException.html#line.45">serialVersionUID</a></pre>
+<pre>private static final 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 int <a href="../../../../../src-html/org/apache/hadoop/hbase/zookeeper/TestZKMainServer.ExitException.html#line.46">status</a></pre>
+<pre>private final 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 <a href="../../../../../src-html/org/apache/hadoop/hbase/zookeeper/TestZKMainServer.ExitException.html#line.47">ExitException</a>(int status)</pre>
+<pre>public <a href="../../../../../src-html/org/apache/hadoop/hbase/zookeeper/TestZKMainServer.ExitException.html#line.48">ExitException</a>(int 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 <a href="../../../../../src-html/org/apache/hadoop/hbase/zookeeper/TestZKMainServer.NoExitSecurityManager.html#line.53">NoExitSecurityManager</a>()</pre>
+<pre>private <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 void <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> perm)</pre>
+<pre>public void <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> 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> in class <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 void <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> perm,
+<pre>public void <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> 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> 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 void <a href="../../../../../src-html/org/apache/hadoop/hbase/zookeeper/TestZKMainServer.NoExitSecurityManager.html#line.65">checkExit</a>(int status)</pre>
+<pre>public void <a href="../../../../../src-html/org/apache/hadoop/hbase/zookeeper/TestZKMainServer.NoExitSecurityManager.html#line.66">checkExit</a>(int 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> in class <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 <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 <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 <a href="../../../../../src-html/org/apache/hadoop/hbase/zookeeper/TestZKMainServer.html#line.36">TestZKMainServer</a>()</pre>
+<pre>public <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 void <a href="../../../../../src-html/org/apache/hadoop/hbase/zookeeper/TestZKMainServer.html#line.75">testCommandLineWorks</a>()
+<pre>public void <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 void <a href="../../../../../src-html/org/apache/hadoop/hbase/zookeeper/TestZKMainServer.html#line.103">testHostPortParse</a>()</pre>
+<pre>public void <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 – 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 – 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 static final <a href="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 static final <a href="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<T>, Queue<T>)</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<T>, Queue<T>, Supplier<String>)</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> </dd>
<dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/regionserver/AbstractMemStore.html#addToScanners-java.util.List-long-java.util.List-">addToScanners(List<? extends Segment>, long, List<KeyValueScanner>)</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> </dd>
@@ -93115,7 +93115,7 @@ service.</div>
<dd> </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> </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<T>, Queue<T>)</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<T>, Queue<T>, Supplier<String>)</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> </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><E> (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><T>, 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><E> (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><T>, 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><E> (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><T>, 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><E> (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><T>, 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><E> (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><T>, 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><E> (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><T>, 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><E> (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><T>, 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 org.slf4j.Logger <a href="../../../../../src-html/org/apache/hadoop/hbase/mapreduce/CopyTable.html#line.52">LOG</a></pre>
+<pre>private static final 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 <a href="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 <a href="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 boolean <a href="../../../../../src-html/org/apache/hadoop/hbase/mapreduce/CopyTable.html#line.67">shuffle</a></pre>
+<pre>static 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 <a href="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 <a href="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 <a href="../../../../../src-html/org/apache/hadoop/hbase/mapreduce/CopyTable.html#line.51">CopyTable</a>()</pre>
+<pre>public <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 org.apache.hadoop.mapreduce.Job <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>[] args)
+<pre>public org.apache.hadoop.mapreduce.Job <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>[] 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 void <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> errorMsg)</pre>
+<pre>private static void <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> 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 boolean <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>[] args)</pre>
+<pre>private boolean <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>[] 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 void <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>[] args)
+<pre>public static void <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>[] 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 int <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>[] args)
+<pre>public int <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>[] 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><E> (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><T>, 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><E> (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><T>, 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><E> (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><T>, 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 <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><T>><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><T> fairq,
- <a href="../../../../../../../org/apache/hadoop/hbase/master/procedure/Queue.html" title="class in org.apache.hadoop.hbase.master.procedure">Queue</a><T> queue)</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-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><T> fairq,
+ <a href="../../../../../../../org/apache/hadoop/hbase/master/procedure/Queue.html" title="class in org.apache.hadoop.hbase.master.procedure">Queue</a><T> 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><<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>> reason)</code> </td>
</tr>
<tr class="rowColor">
<td class="colFirst"><code>private <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><T>,TNode extends <a href="../../../../../../../org/apache/hadoop/hbase/master/procedure/Queue.html" title="class in org.apache.hadoop.hbase.master.procedure">Queue</a><T>><br>void</code></td>
@@ -151,8 +152,9 @@
</tr>
<tr class="altColor">
<td class="colFirst"><code>private static <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><T>><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><T> fairq,
- <a href="../../../../../../../org/apache/hadoop/hbase/master/procedure/Queue.html" title="class in org.apache.hadoop.hbase.master.procedure">Queue</a><T> queue)</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-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><T> fairq,
+ <a href="../../../../../../../org/apache/hadoop/hbase/master/procedure/Queue.html" title="class in org.apache.hadoop.hbase.master.procedure">Queue</a><T> 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><<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>> reason)</code> </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 <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><T>><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><T> fairq,
- <a href="../../../../../../../org/apache/hadoop/hbase/master/procedure/Queue.html" title="class in org.apache.hadoop.hbase.master.procedure">Queue</a><T> queue)</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-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><T> fairq,
+ <a href="../../../../../../../org/apache/hadoop/hbase/master/procedure/Queue.html" title="class in org.apache.hadoop.hbase.master.procedure">Queue</a><T> 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><<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>> reason)</code> </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 <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><T>><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><T> fairq,
- <a href="../../../../../../../org/apache/hadoop/hbase/master/procedure/Queue.html" title="class in org.apache.hadoop.hbase.master.procedure">Queue</a><T> queue)</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-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><T> fairq,
+ <a href="../../../../../../../org/apache/hadoop/hbase/master/procedure/Queue.html" title="class in org.apache.hadoop.hbase.master.procedure">Queue</a><T> 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><<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>> reason)</code> </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><E> (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><T>, 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><E> (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><T>, 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 <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> group)</pre>
+<pre>public <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> 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 boolean <a href="../../../../../src-html/org/apache/hadoop/hbase/procedure2/ProcedureExecutor.KeepAliveWorkerThread.html#line.1999">keepAlive</a>(long lastUpdate)</pre>
+<pre>protected boolean <a href="../../../../../src-html/org/apache/hadoop/hbase/procedure2/ProcedureExecutor.KeepAliveWorkerThread.html#line.2007">keepAlive</a>(long 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> in class <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 <a href="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 <a href="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 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 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 <a href="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 <a href="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 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 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 <a href="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 <a href="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 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 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 float <a href="../../../../../src-html/org/apache/hadoop/hbase/procedure2/ProcedureExecutor.WorkerMonitor.html#line.2025">addWorkerStuckPercentage</a></pre>
+<pre>private 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 int <a href="../../../../../src-html/org/apache/hadoop/hbase/procedure2/ProcedureExecutor.WorkerMonitor.html#line.2026">timeoutInterval</a></pre>
+<pre>private 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 int <a href="../../../../../src-html/org/apache/hadoop/hbase/procedure2/ProcedureExecutor.WorkerMonitor.html#line.2027">stuckThreshold</a></pre>
+<pre>private 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 <a href="../../../../../src-html/org/apache/hadoop/hbase/procedure2/ProcedureExecutor.WorkerMonitor.html#line.2029">WorkerMonitor</a>()</pre>
+<pre>public <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 void <a href="../../../../../src-html/org/apache/hadoop/hbase/procedure2/ProcedureExecutor.WorkerMonitor.html#line.2034">run</a>()</pre>
+<pre>public void <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 int <a href="../../../../../src-html/org/apache/hadoop/hbase/procedure2/ProcedureExecutor.WorkerMonitor.html#line.2042">checkForStuckWorkers</a>()</pre>
+<pre>private int <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 void <a href="../../../../../src-html/org/apache/hadoop/hbase/procedure2/ProcedureExecutor.WorkerMonitor.html#line.2058">checkThreadCount</a>(int stuckCount)</pre>
+<pre>private void <a href="../../../../../src-html/org/apache/hadoop/hbase/procedure2/ProcedureExecutor.WorkerMonitor.html#line.2066">checkThreadCount</a>(int 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 void <a href="../../../../../src-html/org/apache/hadoop/hbase/procedure2/ProcedureExecutor.WorkerMonitor.html#line.2077">refreshConfig</a>()</pre>
+<pre>private void <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 int <a href="../../../../../src-html/org/apache/hadoop/hbase/procedure2/ProcedureExecutor.WorkerMonitor.html#line.2087">getTimeoutInterval</a>()</pre>
+<pre>public int <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> in class <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 <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 <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 <a href="../../../../../org/apache/hadoop/hbase/procedure2/Procedure.html" title="class in org.apache.hadoop.hbase.procedure2">Procedure</a><<a href="../../../../../org/apache/hadoop/hbase/procedure2/ProcedureExecutor.html" title="type parameter in ProcedureExecutor">TEnvironment</a>> <a href="../../../../../src-html/org/apache/hadoop/hbase/procedure2/ProcedureExecutor.WorkerThread.html#line.1915">activeProcedure</a></pre>
+<pre>private volatile <a href="../../../../../org/apache/hadoop/hbase/procedure2/Procedure.html" title="class in org.apache.hadoop.hbase.procedure2">Procedure</a><<a href="../../../../../org/apache/hadoop/hbase/procedure2/ProcedureExecutor.html" title="type parameter in ProcedureExecutor">TEnvironment</a>> <a href="../../../../../src-html/org/apache/hadoop/hbase/procedure2/ProcedureExecutor.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 <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> group)</pre>
+<pre>public <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> 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 <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> group,
+<pre>protected <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> 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> 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 void <a href="../../../../../src-html/org/apache/hadoop/hbase/procedure2/ProcedureExecutor.WorkerThread.html#line.1927">sendStopSignal</a>()</pre>
+<pre>public void <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> in class <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 void <a href="../../../../../src-html/org/apache/hadoop/hbase/procedure2/ProcedureExecutor.WorkerThread.html#line.1931">run</a>()</pre>
+<pre>public void <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> in interface <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 <a href="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.WorkerThread.html#line.1972">toString</a>()</pre>
+<pre>public <a href="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.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> in class <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 long <a href="../../../../../src-html/org/apache/hadoop/hbase/procedure2/ProcedureExecutor.WorkerThread.html#line.1980">getCurrentRunTime</a>()</pre>
+<pre>public long <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 boolean <a href="../../../../../src-html/org/apache/hadoop/hbase/procedure2/ProcedureExecutor.WorkerThread.html#line.1985">keepAlive</a>(long lastUpdate)</pre>
+<pre>protected boolean <a href="../../../../../src-html/org/apache/hadoop/hbase/procedure2/ProcedureExecutor.WorkerThread.html#line.1993">keepAlive</a>(long 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 – 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" /> <b>97 %</b></td></tr>
+<td><img alt="[Error]" src="images/icon_error_sml.gif" /> <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" /> <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 />\- org.apache.hbase:hbase-server:jar:3.0.0-SNAPSHOT:compile<br />   \- org.apache.hadoop:hadoop-common:jar:2.7.7:compile<br />      \- commons-configuration:commons-configuration:jar:1.6:compile<br />         \- (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 />\- org.apache.hadoop:hadoop-common:jar:2.7.7:compile<br />   \- commons-configuration:commons-configuration:jar:1.6:compile<br />      \- (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 />\- org.apache.hbase:hbase-server:jar:3.0.0-SNAPSHOT:compile<br />   +- org.apache.hbase:hbase-common:jar:3.0.0-SNAPSHOT:compile<br />   |  \- commons-validator:commons-validator:jar:1.6:compile<br />   |     \- commons-beanutils:commons-beanutils:jar:1.9.2:compile<br />   |        \- (commons-collections:commons-collections:jar:3.2.1:compile - omitted for conflict with 3.2.2)<br />   \- org.apache.hadoop:hadoop-common:jar:2.7.7:compile<br />      \- commons-configuration:commons-configuration:jar:1.6:compile<br />         \- (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 />+- org.apache.hbase:hbase-common:jar:3.0.0-SNAPSHOT:compile<br />|  \- commons-validator:commons-validator:jar:1.6:compile<br />|     \- commons-beanutils:commons-beanutils:jar:1.9.2:compile<br />|        \- (commons-collections:commons-collections:jar:3.2.1:compile - omitted for conflict with 3.2.2)<br />\- org.apache.hadoop:hadoop-common:jar:2.7.7:compile<br />   \- commons-configuration:commons-configuration:jar:1.6:compile<br />      \- (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 />\- org.apache.hbase:hbase-common:jar:3.0.0-SNAPSHOT:compile<br />   \- org.apache.hadoop:hadoop-common:jar:2.7.7:compile<br />      \- commons-configuration:commons-configuration:jar:1.6:compile<br />         \- (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 />\- org.apache.hadoop:hadoop-common:jar:2.7.7:compile<br />   \- commons-configuration:commons-configuration:jar:1.6:compile<br />      \- (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 />\- org.apache.hadoop:hadoop-common:jar:2.7.7:compile<br />   \- commons-configuration:commons-configuration:jar:1.6:compile<br />      \- (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 />+- org.apache.hadoop:hadoop-minikdc:jar:2.7.7:test<br />|  +- org.apache.directory.server:apacheds-core-api:jar:2.0.0-M15:test<br />|  |  +- org.apache.directory.api:api-ldap-codec-core:jar:1.0.0-M20:test<br />|  |  |  \- (commons-collections:commons-collections:jar:3.2.1:test - omitted for conflict with 3.2.2)<br />|  |  \- org.apache.directory.api:api-ldap-model:jar:1.0.0-M20:test<br />|  |     \- (commons-collections:commons-collections:jar:3.2.1:test - omitted for conflict with 3.2.2)<br />|  +- org.apache.directory.server:apacheds-interceptor-kerberos:jar:2.0.0-M15:test<br />|  |  \- org.apache.directory.server:apacheds-core:jar:2.0.0-M15:test<br />|  |     +- org.apache.directory.server:apacheds-i
nterceptors-authn:jar:2.0.0-M15:test<br />|  |     |  \- (commons-collections:commons-collections:jar:3.2.1:test - omitted for conflict with 3.2.2)<br />|  |     \- org.apache.directory.server:apacheds-interceptors-exception:jar:2.0.0-M15:test<br />|  |        \- (commons-collections:commons-collections:jar:3.2.1:test - omitted for conflict with 3.2.2)<br />|  +- org.apache.directory.server:apacheds-ldif-partition:jar:2.0.0-M15:test<br />|  |  \- org.apache.directory.server:apacheds-xdbm-partition:jar:2.0.0-M15:test<br />|  |     \- (commons-collections:commons-collections:jar:3.2.1:test - omitted for conflict with 3.2.2)<br />|  +- org.apache.directory.server:apacheds-mavibot-partition:jar:2.0.0-M15:test<br />|  |  \- org
.apache.directory.mavibot:mavibot:jar:1.0.0-M1:test<br />|  |     \- (commons-collections:commons-collections:jar:3.2.1:test - omitted for conflict with 3.2.2)<br />|  \- org.apache.directory.api:api-all:jar:1.0.0-M20:test<br />|     \- (commons-collections:commons-collections:jar:3.2.1:test - omitted for conflict with 3.2.2)<br />\- org.apache.hadoop:hadoop-common:jar:2.7.7:compile<br />   \- commons-configuration:commons-configuration:jar:1.6:compile<br />      \- (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 />\- org.apache.hadoop:hadoop-common:jar:2.7.7:compile<br />   \- commons-configuration:commons-configuration:jar:1.6:compile<br />      \- (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 />\- org.apache.hadoop:hadoop-common:jar:2.7.7:compile<br />   \- commons-configuration:commons-configuration:jar:1.6:compile<br />      \- (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 />\- org.apache.hbase:hbase-metrics-api:jar:3.0.0-SNAPSHOT:compile<br />   \- org.apache.hbase:hbase-common:jar:3.0.0-SNAPSHOT:compile<br />      \- org.apache.hadoop:hadoop-common:jar:2.7.7:compile<br />         \- commons-configuration:commons-configuration:jar:1.6:compile<br />            \- (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 />\- org.apache.hadoop:hadoop-common:jar:2.7.7:compile<br />   \- commons-configuration:commons-configuration:jar:1.6:compile<br />      \- (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 />\- org.apache.hadoop:hadoop-common:jar:2.7.7:compile<br />   \- commons-configuration:commons-configuration:jar:1.6:compile<br />      \- (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 />+- org.apache.hadoop:hadoop-common:jar:2.7.7:compile<br />|  \- commons-configuration:commons-configuration:jar:1.6:compile<br />|     \- (commons-collections:commons-collections:jar:3.2.1:compile - omitted for conflict with 3.2.2)<br />\- org.apache.hadoop:hadoop-minikdc:jar:2.7.7:test<br />   +- org.apache.directory.server:apacheds-core-api:jar:2.0.0-M15:test<br />   |  +- org.apache.directory.api:api-ldap-codec-core:jar:1.0.0-M20:test<br />   |  |  \- (commons-collections:commons-collections:jar:3.2.1:test - omitted for conflict with 3.2.2)<br />   |  \- org.apache.directory.api:api-ldap-model:jar:1.0.0-M20:test<br />   |     \- (commons-collections:commons-collections:jar:3.2.1:test - omitted for conflict with
3.2.2)<br />   +- org.apache.directory.server:apacheds-interceptor-kerberos:jar:2.0.0-M15:test<br />   |  \- org.apache.directory.server:apacheds-core:jar:2.0.0-M15:test<br />   |     +- org.apache.directory.server:apacheds-interceptors-authn:jar:2.0.0-M15:test<br />   |     |  \- (commons-collections:commons-collections:jar:3.2.1:test - omitted for conflict with 3.2.2)<br />   |     \- org.apache.directory.server:apacheds-interceptors-exception:jar:2.0.0-M15:test<br />   |        \- (commons-collections:commons-collections:jar:3.2.1:test - omitted for conflict with 3.2.2)<br />   +- org.apache.directory.server:apacheds-ldif-partition:jar:2.0.0-M15:test<br />   |  \- org.apache.dire
ctory.server:apacheds-xdbm-partition:jar:2.0.0-M15:test<br />   |     \- (commons-collections:commons-collections:jar:3.2.1:test - omitted for conflict with 3.2.2)<br />   +- org.apache.directory.server:apacheds-mavibot-partition:jar:2.0.0-M15:test<br />   |  \- org.apache.directory.mavibot:mavibot:jar:1.0.0-M1:test<br />   |     \- (commons-collections:commons-collections:jar:3.2.1:test - omitted for conflict with 3.2.2)<br />   \- org.apache.directory.api:api-all:jar:1.0.0-M20:test<br />      \- (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 />\- org.apache.hadoop:hadoop-common:jar:2.7.7:compile<br />   \- commons-configuration:commons-configuration:jar:1.6:compile<br />      \- (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 />\- org.apache.hbase:hbase-common:jar:3.0.0-SNAPSHOT:compile<br />   \- org.apache.hadoop:hadoop-common:jar:2.7.7:compile<br />      \- commons-configuration:commons-configuration:jar:1.6:compile<br />         \- (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 />\- org.apache.hbase:hbase-common:jar:3.0.0-SNAPSHOT:compile<br />   \- org.apache.hadoop:hadoop-common:jar:2.7.7:compile<br />      \- commons-configuration:commons-configuration:jar:1.6:compile<br />         \- (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 />\- org.apache.hadoop:hadoop-common:jar:2.7.7:compile<br />   \- commons-configuration:commons-configuration:jar:1.6:compile<br />      \- (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 />\- org.apache.hadoop:hadoop-common:jar:2.7.7:compile<br />   \- commons-configuration:commons-configuration:jar:1.6:compile<br />      \- (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 />\- org.apache.hadoop:hadoop-common:jar:2.7.7:compile<br />   \- commons-configuration:commons-configuration:jar:1.6:compile<br />      \- (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 />\- org.apache.hadoop:hadoop-common:jar:2.7.7:compile<br />   \- commons-configuration:commons-configuration:jar:1.6:compile<br />      \- (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 />+- org.apache.hadoop:hadoop-minikdc:jar:2.7.7:test<br />|  +- org.apache.directory.server:apacheds-core-api:jar:2.0.0-M15:test<br />|  |  +- org.apache.directory.api:api-ldap-codec-core:jar:1.0.0-M20:test<br />|  |  |  \- (commons-collections:commons-collections:jar:3.2.1:test - omitted for conflict with 3.2.2)<br />|  |  \- org.apache.directory.api:api-ldap-model:jar:1.0.0-M20:test<br />|  |     \- (commons-collections:commons-collections:jar:3.2.1:test - omitted for conflict with 3.2.2)<br />|  +- org.apache.directory.server:apacheds-interceptor-kerberos:jar:2.0.0-M15:test<br />|  |  \- org.apache.directory.server:apacheds-core:jar:2.0.0-M15:test<br />|  |     +- org.apache.directory.server:apacheds-int
erceptors-authn:jar:2.0.0-M15:test<br />|  |     |  \- (commons-collections:commons-collections:jar:3.2.1:test - omitted for conflict with 3.2.2)<br />|  |     \- org.apache.directory.server:apacheds-interceptors-exception:jar:2.0.0-M15:test<br />|  |        \- (commons-collections:commons-collections:jar:3.2.1:test - omitted for conflict with 3.2.2)<br />|  +- org.apache.directory.server:apacheds-ldif-partition:jar:2.0.0-M15:test<br />|  |  \- org.apache.directory.server:apacheds-xdbm-partition:jar:2.0.0-M15:test<br />|  |     \- (commons-collections:commons-collections:jar:3.2.1:test - omitted for conflict with 3.2.2)<br />|  +- org.apache.directory.server:apacheds-mavibot-partition:jar:2.0.0-M15:test<br />|  |  \- org.a
pache.directory.mavibot:mavibot:jar:1.0.0-M1:test<br />|  |     \- (commons-collections:commons-collections:jar:3.2.1:test - omitted for conflict with 3.2.2)<br />|  \- org.apache.directory.api:api-all:jar:1.0.0-M20:test<br />|     \- (commons-collections:commons-collections:jar:3.2.1:test - omitted for conflict with 3.2.2)<br />\- org.apache.hadoop:hadoop-common:jar:2.7.7:compile<br />   \- commons-configuration:commons-configuration:jar:1.6:compile<br />      \- (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 />\- org.apache.hbase:hbase-shaded-mapreduce:jar:3.0.0-SNAPSHOT:compile<br />   \- org.apache.hbase:hbase-mapreduce:jar:3.0.0-SNAPSHOT:compile<br />      \- org.apache.hadoop:hadoop-common:jar:2.7.7:compile<br />         \- commons-configuration:commons-configuration:jar:1.6:compile<br />            \- (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 />\- org.apache.hbase:hbase-client:jar:3.0.0-SNAPSHOT:compile<br />   \- org.apache.hadoop:hadoop-common:jar:2.7.7:compile<br />      \- commons-configuration:commons-configuration:jar:1.6:compile<br />         \- (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 />+- org.apache.hbase:hbase-common:jar:3.0.0-SNAPSHOT:compile<br />|  \- commons-validator:commons-validator:jar:1.6:compile<br />|     \- commons-beanutils:commons-beanutils:jar:1.9.2:compile<br />|        \- (commons-collections:commons-collections:jar:3.2.1:compile - omitted for conflict with 3.2.2)<br />\- org.apache.hadoop:hadoop-common:jar:2.7.7:compile<br />   \- commons-configuration:commons-configuration:jar:1.6:compile<br />      \- (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 />+- commons-validator:commons-validator:jar:1.6:compile<br />|  \- commons-beanutils:commons-beanutils:jar:1.9.2:compile<br />|     \- (commons-collections:commons-collections:jar:3.2.1:compile - omitted for conflict with 3.2.2)<br />\- org.apache.hadoop:hadoop-common:jar:2.7.7:compile<br />   \- commons-configuration:commons-configuration:jar:1.6:compile<br />      \- (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 />+- org.apache.hbase:hbase-common:jar:3.0.0-SNAPSHOT:compile<br />|  \- commons-validator:commons-validator:jar:1.6:compile<br />|     \- commons-beanutils:commons-beanutils:jar:1.9.2:compile<br />|        \- (commons-collections:commons-collections:jar:3.2.1:compile - omitted for conflict with 3.2.2)<br />+- org.apache.hadoop:hadoop-minikdc:jar:2.7.7:test<br />|  +- org.apache.directory.server:apacheds-core-api:jar:2.0.0-M15:test<br />|  |  +- org.apache.directory.api:api-ldap-codec-core:jar:1.0.0-M20:test<br />|  |  |  \- (commons-collections:commons-collections:jar:3.2.1:test - omitted for conflict with 3.2.2)<br />|  |  \- org.apache.directory.api:api-ldap-model:jar:1.0.0-M20:test<br />|  |    &
#160;\- (commons-collections:commons-collections:jar:3.2.1:test - omitted for conflict with 3.2.2)<br />|  +- org.apache.directory.server:apacheds-interceptor-kerberos:jar:2.0.0-M15:test<br />|  |  \- org.apache.directory.server:apacheds-core:jar:2.0.0-M15:test<br />|  |     +- org.apache.directory.server:apacheds-interceptors-authn:jar:2.0.0-M15:test<br />|  |     |  \- (commons-collections:commons-collections:jar:3.2.1:test - omitted for conflict with 3.2.2)<br />|  |     \- org.apache.directory.server:apacheds-interceptors-exception:jar:2.0.0-M15:test<br />|  |        \- (commons-collections:commons-collections:jar:3.2.1:test - omitted for conflict with 3.2.2)<br />|  +- org.apache.directory.server:apacheds-ldif-partition:jar:2.0.0-M15:tes
t<br />|  |  \- org.apache.directory.server:apacheds-xdbm-partition:jar:2.0.0-M15:test<br />|  |     \- (commons-collections:commons-collections:jar:3.2.1:test - omitted for conflict with 3.2.2)<br />|  +- org.apache.directory.server:apacheds-mavibot-partition:jar:2.0.0-M15:test<br />|  |  \- org.apache.directory.mavibot:mavibot:jar:1.0.0-M1:test<br />|  |     \- (commons-collections:commons-collections:jar:3.2.1:test - omitted for conflict with 3.2.2)<br />|  \- org.apache.directory.api:api-all:jar:1.0.0-M20:test<br />|     \- (commons-collections:commons-collections:jar:3.2.1:test - omitted for conflict with 3.2.2)<br />\- org.apache.hadoop:hadoop-common:jar:2.7.7:compile<br />   \- commons-configuration:commons-configuration:jar:1.6:compile<br />    
;  \- (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 />+- org.apache.hbase:hbase-common:jar:3.0.0-SNAPSHOT:compile<br />|  \- commons-validator:commons-validator:jar:1.6:compile<br />|     \- commons-beanutils:commons-beanutils:jar:1.9.2:compile<br />|        \- (commons-collections:commons-collections:jar:3.2.1:compile - omitted for conflict with 3.2.2)<br />\- org.apache.hadoop:hadoop-common:jar:2.7.7:compile<br />   \- commons-configuration:commons-configuration:jar:1.6:compile<br />      \- (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 />+- org.apache.hbase:hbase-common:jar:3.0.0-SNAPSHOT:compile<br />|  \- commons-validator:commons-validator:jar:1.6:compile<br />|     \- commons-beanutils:commons-beanutils:jar:1.9.2:compile<br />|        \- (commons-collections:commons-collections:jar:3.2.1:compile - omitted for conflict with 3.2.2)<br />\- org.apache.hadoop:hadoop-common:jar:2.7.7:compile<br />   \- commons-configuration:commons-configuration:jar:1.6:compile<br />      \- (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 />\- org.apache.hbase:hbase-metrics-api:jar:3.0.0-SNAPSHOT:compile<br />   \- org.apache.hbase:hbase-common:jar:3.0.0-SNAPSHOT:compile<br />      +- commons-validator:commons-validator:jar:1.6:compile<br />      |  \- commons-beanutils:commons-beanutils:jar:1.9.2:compile<br />      |     \- (commons-collections:commons-collections:jar:3.2.1:compile - omitted for conflict with 3.2.2)<br />      \- org.apache.hadoop:hadoop-common:jar:2.7.7:compile<br />         \- commons-configuration:commons-configuration:jar:1.6:compile<br />            \- (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 />+- org.apache.hbase:hbase-common:jar:3.0.0-SNAPSHOT:compile<br />|  \- commons-validator:commons-validator:jar:1.6:compile<br />|     \- commons-beanutils:commons-beanutils:jar:1.9.2:compile<br />|        \- (commons-collections:commons-collections:jar:3.2.1:compile - omitted for conflict with 3.2.2)<br />\- org.apache.hadoop:hadoop-common:jar:2.7.7:compile<br />   \- commons-configuration:commons-configuration:jar:1.6:compile<br />      \- (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 />+- org.apache.hbase:hbase-common:jar:3.0.0-SNAPSHOT:compile<br />|  \- commons-validator:commons-validator:jar:1.6:compile<br />|     \- commons-beanutils:commons-beanutils:jar:1.9.2:compile<br />|        \- (commons-collections:commons-collections:jar:3.2.1:compile - omitted for conflict with 3.2.2)<br />\- org.apache.hadoop:hadoop-common:jar:2.7.7:compile<br />   \- commons-configuration:commons-configuration:jar:1.6:compile<br />      \- (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 />+- org.apache.hbase:hbase-common:jar:3.0.0-SNAPSHOT:compile<br />|  \- commons-validator:commons-validator:jar:1.6:compile<br />|     \- commons-beanutils:commons-beanutils:jar:1.9.2:compile<br />|        \- (commons-collections:commons-collections:jar:3.2.1:compile - omitted for conflict with 3.2.2)<br />+- org.apache.hadoop:hadoop-common:jar:2.7.7:compile<br />|  \- commons-configuration:commons-configuration:jar:1.6:compile<br />|     \- (commons-collections:commons-collections:jar:3.2.1:compile - omitted for conflict with 3.2.2)<br />\- org.apache.hadoop:hadoop-minikdc:jar:2.7.7:test<br />   +- org.apache.directory.server:apacheds-core-api:jar:2.0.0-M15:test<br />   |  +- org.apache.directory.api:api-ldap-codec-core:jar:1.0.0-M20
:test<br />   |  |  \- (commons-collections:commons-collections:jar:3.2.1:test - omitted for conflict with 3.2.2)<br />   |  \- org.apache.directory.api:api-ldap-model:jar:1.0.0-M20:test<br />   |     \- (commons-collections:commons-collections:jar:3.2.1:test - omitted for conflict with 3.2.2)<br />   +- org.apache.directory.server:apacheds-interceptor-kerberos:jar:2.0.0-M15:test<br />   |  \- org.apache.directory.server:apacheds-core:jar:2.0.0-M15:test<br />   |     +- org.apache.directory.server:apacheds-interceptors-authn:jar:2.0.0-M15:test<br />   |     |  \- (commons-collections:commons-collections:jar:3.2.1:test - omitted for conflict with 3.2.2)<br />   |     \- org.apach
e.directory.server:apacheds-interceptors-exception:jar:2.0.0-M15:test<br />   |        \- (commons-collections:commons-collections:jar:3.2.1:test - omitted for conflict with 3.2.2)<br />   +- org.apache.directory.server:apacheds-ldif-partition:jar:2.0.0-M15:test<br />   |  \- org.apache.directory.server:apacheds-xdbm-partition:jar:2.0.0-M15:test<br />   |     \- (commons-collections:commons-collections:jar:3.2.1:test - omitted for conflict with 3.2.2)<br />   +- org.apache.directory.server:apacheds-mavibot-partition:jar:2.0.0-M15:test<br />   |  \- org.apache.directory.mavibot:mavibot:jar:1.0.0-M1:test<br />   |     \- (commons-collections:commons-collections:jar:3.2.1:test - omitted for conflict with 3.2.2)<br />   \-
0;org.apache.directory.api:api-all:jar:1.0.0-M20:test<br />      \- (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 />+- org.apache.hbase:hbase-common:jar:3.0.0-SNAPSHOT:compile<br />|  \- commons-validator:commons-validator:jar:1.6:compile<br />|     \- commons-beanutils:commons-beanutils:jar:1.9.2:compile<br />|        \- (commons-collections:commons-collections:jar:3.2.1:compile - omitted for conflict with 3.2.2)<br />\- org.apache.hadoop:hadoop-common:jar:2.7.7:compile<br />   \- commons-configuration:commons-configuration:jar:1.6:compile<br />      \- (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 />\- org.apache.hbase:hbase-common:jar:3.0.0-SNAPSHOT:compile<br />   +- commons-validator:commons-validator:jar:1.6:compile<br />   |  \- commons-beanutils:commons-beanutils:jar:1.9.2:compile<br />   |     \- (commons-collections:commons-collections:jar:3.2.1:compile - omitted for conflict with 3.2.2)<br />   \- org.apache.hadoop:hadoop-common:jar:2.7.7:compile<br />      \- commons-configuration:commons-configuration:jar:1.6:compile<br />         \- (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 />\- org.apache.hbase:hbase-common:jar:3.0.0-SNAPSHOT:compile<br />   +- commons-validator:commons-validator:jar:1.6:compile<br />   |  \- commons-beanutils:commons-beanutils:jar:1.9.2:compile<br />   |     \- (commons-collections:commons-collections:jar:3.2.1:compile - omitted for conflict with 3.2.2)<br />   \- org.apache.hadoop:hadoop-common:jar:2.7.7:compile<br />      \- commons-configuration:commons-configuration:jar:1.6:compile<br />         \- (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 />+- org.apache.hbase:hbase-common:jar:3.0.0-SNAPSHOT:compile<br />|  \- commons-validator:commons-validator:jar:1.6:compile<br />|     \- commons-beanutils:commons-beanutils:jar:1.9.2:compile<br />|        \- (commons-collections:commons-collections:jar:3.2.1:compile - omitted for conflict with 3.2.2)<br />\- org.apache.hadoop:hadoop-common:jar:2.7.7:compile<br />   \- commons-configuration:commons-configuration:jar:1.6:compile<br />      \- (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 />+- org.apache.hbase:hbase-common:jar:3.0.0-SNAPSHOT:compile<br />|  \- commons-validator:commons-validator:jar:1.6:compile<br />|     \- commons-beanutils:commons-beanutils:jar:1.9.2:compile<br />|        \- (commons-collections:commons-collections:jar:3.2.1:compile - omitted for conflict with 3.2.2)<br />\- org.apache.hadoop:hadoop-common:jar:2.7.7:compile<br />   \- commons-configuration:commons-configuration:jar:1.6:compile<br />      \- (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 />+- org.apache.hbase:hbase-common:jar:3.0.0-SNAPSHOT:compile<br />|  \- commons-validator:commons-validator:jar:1.6:compile<br />|     \- commons-beanutils:commons-beanutils:jar:1.9.2:compile<br />|        \- (commons-collections:commons-collections:jar:3.2.1:compile - omitted for conflict with 3.2.2)<br />\- org.apache.hadoop:hadoop-common:jar:2.7.7:compile<br />   \- commons-configuration:commons-configuration:jar:1.6:compile<br />      \- (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 />+- org.apache.hbase:hbase-common:jar:3.0.0-SNAPSHOT:compile<br />|  \- commons-validator:commons-validator:jar:1.6:compile<br />|     \- commons-beanutils:commons-beanutils:jar:1.9.2:compile<br />|        \- (commons-collections:commons-collections:jar:3.2.1:compile - omitted for conflict with 3.2.2)<br />\- org.apache.hadoop:hadoop-common:jar:2.7.7:compile<br />   \- commons-configuration:commons-configuration:jar:1.6:compile<br />      \- (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 />+- org.apache.hbase:hbase-common:jar:3.0.0-SNAPSHOT:compile<br />|  \- commons-validator:commons-validator:jar:1.6:compile<br />|     \- commons-beanutils:commons-beanutils:jar:1.9.2:compile<br />|        \- (commons-collections:commons-collections:jar:3.2.1:compile - omitted for conflict with 3.2.2)<br />+- org.apache.hadoop:hadoop-minikdc:jar:2.7.7:test<br />|  +- org.apache.directory.server:apacheds-core-api:jar:2.0.0-M15:test<br />|  |  +- org.apache.directory.api:api-ldap-codec-core:jar:1.0.0-M20:test<br />|  |  |  \- (commons-collections:commons-collections:jar:3.2.1:test - omitted for conflict with 3.2.2)<br />|  |  \- org.apache.directory.api:api-ldap-model:jar:1.0.0-M20:test<br />|  |    
60;\- (commons-collections:commons-collections:jar:3.2.1:test - omitted for conflict with 3.2.2)<br />|  +- org.apache.directory.server:apacheds-interceptor-kerberos:jar:2.0.0-M15:test<br />|  |  \- org.apache.directory.server:apacheds-core:jar:2.0.0-M15:test<br />|  |     +- org.apache.directory.server:apacheds-interceptors-authn:jar:2.0.0-M15:test<br />|  |     |  \- (commons-collections:commons-collections:jar:3.2.1:test - omitted for conflict with 3.2.2)<br />|  |     \- org.apache.directory.server:apacheds-interceptors-exception:jar:2.0.0-M15:test<br />|  |        \- (commons-collections:commons-collections:jar:3.2.1:test - omitted for conflict with 3.2.2)<br />|  +- org.apache.directory.server:apacheds-ldif-partition:jar:2.0.0-M15:test<
br />|  |  \- org.apache.directory.server:apacheds-xdbm-partition:jar:2.0.0-M15:test<br />|  |     \- (commons-collections:commons-collections:jar:3.2.1:test - omitted for conflict with 3.2.2)<br />|  +- org.apache.directory.server:apacheds-mavibot-partition:jar:2.0.0-M15:test<br />|  |  \- org.apache.directory.mavibot:mavibot:jar:1.0.0-M1:test<br />|  |     \- (commons-collections:commons-collections:jar:3.2.1:test - omitted for conflict with 3.2.2)<br />|  \- org.apache.directory.api:api-all:jar:1.0.0-M20:test<br />|     \- (commons-collections:commons-collections:jar:3.2.1:test - omitted for conflict with 3.2.2)<br />\- org.apache.hadoop:hadoop-common:jar:2.7.7:compile<br />   \- commons-configuration:commons-configuration:jar:1.6:compile<br />    &
#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 />\- org.apache.hbase:hbase-shaded-mapreduce:jar:3.0.0-SNAPSHOT:compile<br />   \- org.apache.hbase:hbase-mapreduce:jar:3.0.0-SNAPSHOT:compile<br />      +- org.apache.hbase:hbase-common:jar:3.0.0-SNAPSHOT:compile<br />      |  \- commons-validator:commons-validator:jar:1.6:compile<br />      |     \- commons-beanutils:commons-beanutils:jar:1.9.2:compile<br />      |        \- (commons-collections:commons-collections:jar:3.2.1:compile - omitted for conflict with 3.2.2)<br />      \- org.apache.hadoop:hadoop-common:jar:2.7.7:compile<br />         \- commons-configuration:commons-configuration:
jar:1.6:compile<br />            \- (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 />\- org.apache.hbase:hbase-client:jar:3.0.0-SNAPSHOT:compile<br />   +- org.apache.hbase:hbase-common:jar:3.0.0-SNAPSHOT:compile<br />   |  \- commons-validator:commons-validator:jar:1.6:compile<br />   |     \- commons-beanutils:commons-beanutils:jar:1.9.2:compile<br />   |        \- (commons-collections:commons-collections:jar:3.2.1:compile - omitted for conflict with 3.2.2)<br />   \- org.apache.hadoop:hadoop-common:jar:2.7.7:compile<br />      \- commons-configuration:commons-configuration:jar:1.6:compile<br />         \- (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 />\- org.apache.hbase:hbase-shaded-client:jar:3.0.0-SNAPSHOT:compile<br />   \- org.apache.hbase:hbase-client:jar:3.0.0-SNAPSHOT:compile<br />      \- org.apache.hadoop:hadoop-common:jar:2.7.7:compile<br />         \- commons-configuration:commons-configuration:jar:1.6:compile<br />            \- (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 />\- org.apache.hbase:hbase-client:jar:3.0.0-SNAPSHOT:compile<br />   \- org.apache.hadoop:hadoop-common:jar:2.7.7:compile<br />      \- commons-configuration:commons-configuration:jar:1.6:compile<br />         \- (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 />\- org.apache.hadoop:hadoop-common:jar:2.7.7:provided (scope not updated to compile)<br />   \- commons-configuration:commons-configuration:jar:1.6:provided<br />      \- (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 />\- org.apache.hbase:hbase-shaded-client:jar:3.0.0-SNAPSHOT:compile<br />   \- org.apache.hbase:hbase-client:jar:3.0.0-SNAPSHOT:compile<br />      \- org.apache.hadoop:hadoop-common:jar:2.7.7:compile<br />         \- commons-configuration:commons-configuration:jar:1.6:compile<br />            \- (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 />+- org.apache.hadoop:hadoop-common:jar:2.7.7:compile<br />|  \- commons-configuration:commons-configuration:jar:1.6:compile<br />|     \- (commons-collections:commons-collections:jar:3.2.1:compile - omitted for conflict with 3.2.2)<br />\- org.apache.hadoop:hadoop-minikdc:jar:2.7.7:test<br />   +- org.apache.directory.server:apacheds-core-api:jar:2.0.0-M15:test<br />   |  +- org.apache.directory.api:api-ldap-codec-core:jar:1.0.0-M20:test<br />   |  |  \- (commons-collections:commons-collections:jar:3.2.1:test - omitted for conflict with 3.2.2)<br />   |  \- org.apache.directory.api:api-ldap-model:jar:1.0.0-M20:test<br />   |     \- (commons-collections:commons-collections:jar:3.2.1:test - omitted for conflict w
ith 3.2.2)<br />   +- org.apache.directory.server:apacheds-interceptor-kerberos:jar:2.0.0-M15:test<br />   |  \- org.apache.directory.server:apacheds-core:jar:2.0.0-M15:test<br />   |     +- org.apache.directory.server:apacheds-interceptors-authn:jar:2.0.0-M15:test<br />   |     |  \- (commons-collections:commons-collections:jar:3.2.1:test - omitted for conflict with 3.2.2)<br />   |     \- org.apache.directory.server:apacheds-interceptors-exception:jar:2.0.0-M15:test<br />   |        \- (commons-collections:commons-collections:jar:3.2.1:test - omitted for conflict with 3.2.2)<br />   +- org.apache.directory.server:apacheds-ldif-partition:jar:2.0.0-M15:test<br />   |  \- org.apache.d
irectory.server:apacheds-xdbm-partition:jar:2.0.0-M15:test<br />   |     \- (commons-collections:commons-collections:jar:3.2.1:test - omitted for conflict with 3.2.2)<br />   +- org.apache.directory.server:apacheds-mavibot-partition:jar:2.0.0-M15:test<br />   |  \- org.apache.directory.mavibot:mavibot:jar:1.0.0-M1:test<br />   |     \- (commons-collections:commons-collections:jar:3.2.1:test - omitted for conflict with 3.2.2)<br />   \- org.apache.directory.api:api-all:jar:1.0.0-M20:test<br />      \- (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 />+- org.apache.hadoop:hadoop-common:jar:2.7.7:compile<br />|  \- commons-configuration:commons-configuration:jar:1.6:compile<br />|     \- (commons-collections:commons-collections:jar:3.2.1:compile - omitted for conflict with 3.2.2)<br />\- org.apache.hadoop:hadoop-minikdc:jar:2.7.7:test<br />   +- org.apache.directory.server:apacheds-core-api:jar:2.0.0-M15:test<br />   |  +- org.apache.directory.api:api-ldap-codec-core:jar:1.0.0-M20:test<br />   |  |  \- (commons-collections:commons-collections:jar:3.2.1:test - omitted for conflict with 3.2.2)<br />   |  \- org.apache.directory.api:api-ldap-model:jar:1.0.0-M20:test<br />   |     \- (commons-collections:commons-collections:jar:3.2.1:test - omitted for con
flict with 3.2.2)<br />   +- org.apache.directory.server:apacheds-interceptor-kerberos:jar:2.0.0-M15:test<br />   |  \- org.apache.directory.server:apacheds-core:jar:2.0.0-M15:test<br />   |     +- org.apache.directory.server:apacheds-interceptors-authn:jar:2.0.0-M15:test<br />   |     |  \- (commons-collections:commons-collections:jar:3.2.1:test - omitted for conflict with 3.2.2)<br />   |     \- org.apache.directory.server:apacheds-interceptors-exception:jar:2.0.0-M15:test<br />   |        \- (commons-collections:commons-collections:jar:3.2.1:test - omitted for conflict with 3.2.2)<br />   +- org.apache.directory.server:apacheds-ldif-partition:jar:2.0.0-M15:test<br />   |  \- org.a
pache.directory.server:apacheds-xdbm-partition:jar:2.0.0-M15:test<br />   |     \- (commons-collections:commons-collections:jar:3.2.1:test - omitted for conflict with 3.2.2)<br />   +- org.apache.directory.server:apacheds-mavibot-partition:jar:2.0.0-M15:test<br />   |  \- org.apache.directory.mavibot:mavibot:jar:1.0.0-M1:test<br />   |     \- (commons-collections:commons-collections:jar:3.2.1:test - omitted for conflict with 3.2.2)<br />   \- org.apache.directory.api:api-all:jar:1.0.0-M20:test<br />      \- (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 />\- org.apache.hadoop:hadoop-common:jar:2.7.7:compile<br />   \- commons-configuration:commons-configuration:jar:1.6:compile<br />      \- (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 />\- org.apache.hadoop:hadoop-common:jar:2.7.7:compile<br />   \- commons-configuration:commons-configuration:jar:1.6:compile<br />      \- (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 />\- org.apache.hbase:hbase-client:jar:3.0.0-SNAPSHOT:compile<br />   +- org.apache.hbase:hbase-common:jar:3.0.0-SNAPSHOT:compile<br />   |  \- commons-validator:commons-validator:jar:1.6:compile<br />   |     \- commons-beanutils:commons-beanutils:jar:1.9.2:compile<br />   |        \- (commons-collections:commons-collections:jar:3.2.1:compile - omitted for conflict with 3.2.2)<br />   \- org.apache.hadoop:hadoop-common:jar:2.7.7:compile<br />      \- commons-configuration:commons-configuration:jar:1.6:compile<br />         \- (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 />+- org.apache.hbase:hbase-mapreduce:jar:3.0.0-SNAPSHOT:compile<br />|  \- org.apache.hbase:hbase-common:jar:3.0.0-SNAPSHOT:compile<br />|     \- commons-validator:commons-validator:jar:1.6:compile<br />|        \- commons-beanutils:commons-beanutils:jar:1.9.2:compile<br />|           \- (commons-collections:commons-collections:jar:3.2.1:compile - omitted for conflict with 3.2.2)<br />\- org.apache.hadoop:hadoop-common:jar:2.7.7:provided (scope not updated to compile)<br />   \- commons-configuration:commons-configuration:jar:1.6:provided<br />      \- (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 />\- org.apache.hbase:hbase-shaded-client:jar:3.0.0-SNAPSHOT:compile<br />   \- org.apache.hbase:hbase-client:jar:3.0.0-SNAPSHOT:compile<br />      +- org.apache.hbase:hbase-common:jar:3.0.0-SNAPSHOT:compile<br />      |  \- commons-validator:commons-validator:jar:1.6:compile<br />      |     \- commons-beanutils:commons-beanutils:jar:1.9.2:compile<br />      |        \- (commons-collections:commons-collections:jar:3.2.1:compile - omitted for conflict with 3.2.2)<br />      \- org.apache.hadoop:hadoop-common:jar:2.7.7:compile<br />         \- commons-configuration:commons-configur
ation:jar:1.6:compile<br />            \- (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 />+- org.apache.hbase:hbase-common:jar:3.0.0-SNAPSHOT:compile<br />|  \- commons-validator:commons-validator:jar:1.6:compile<br />|     \- commons-beanutils:commons-beanutils:jar:1.9.2:compile<br />|        \- (commons-collections:commons-collections:jar:3.2.1:compile - omitted for conflict with 3.2.2)<br />+- org.apache.hadoop:hadoop-common:jar:2.7.7:compile<br />|  \- commons-configuration:commons-configuration:jar:1.6:compile<br />|     \- (commons-collections:commons-collections:jar:3.2.1:compile - omitted for conflict with 3.2.2)<br />\- org.apache.hadoop:hadoop-minikdc:jar:2.7.7:test<br />   +- org.apache.directory.server:apacheds-core-api:jar:2.0.0-M15:test<br />   |  +- org.apache.directory.api:api-ldap-codec-core:jar:1.0.0-
M20:test<br />   |  |  \- (commons-collections:commons-collections:jar:3.2.1:test - omitted for conflict with 3.2.2)<br />   |  \- org.apache.directory.api:api-ldap-model:jar:1.0.0-M20:test<br />   |     \- (commons-collections:commons-collections:jar:3.2.1:test - omitted for conflict with 3.2.2)<br />   +- org.apache.directory.server:apacheds-interceptor-kerberos:jar:2.0.0-M15:test<br />   |  \- org.apache.directory.server:apacheds-core:jar:2.0.0-M15:test<br />   |     +- org.apache.directory.server:apacheds-interceptors-authn:jar:2.0.0-M15:test<br />   |     |  \- (commons-collections:commons-collections:jar:3.2.1:test - omitted for conflict with 3.2.2)<br />   |     \- org.ap
ache.directory.server:apacheds-interceptors-exception:jar:2.0.0-M15:test<br />   |        \- (commons-collections:commons-collections:jar:3.2.1:test - omitted for conflict with 3.2.2)<br />   +- org.apache.directory.server:apacheds-ldif-partition:jar:2.0.0-M15:test<br />   |  \- org.apache.directory.server:apacheds-xdbm-partition:jar:2.0.0-M15:test<br />   |     \- (commons-collections:commons-collections:jar:3.2.1:test - omitted for conflict with 3.2.2)<br />   +- org.apache.directory.server:apacheds-mavibot-partition:jar:2.0.0-M15:test<br />   |  \- org.apache.directory.mavibot:mavibot:jar:1.0.0-M1:test<br />   |     \- (commons-collections:commons-collections:jar:3.2.1:test - omitted for conflict with 3.2.2)<br />   \-&
#160;org.apache.directory.api:api-all:jar:1.0.0-M20:test<br />      \- (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 />+- org.apache.hbase:hbase-common:jar:3.0.0-SNAPSHOT:compile<br />|  \- commons-validator:commons-validator:jar:1.6:compile<br />|     \- commons-beanutils:commons-beanutils:jar:1.9.2:compile<br />|        \- (commons-collections:commons-collections:jar:3.2.1:compile - omitted for conflict with 3.2.2)<br />+- org.apache.hadoop:hadoop-common:jar:2.7.7:compile<br />|  \- commons-configuration:commons-configuration:jar:1.6:compile<br />|     \- (commons-collections:commons-collections:jar:3.2.1:compile - omitted for conflict with 3.2.2)<br />\- org.apache.hadoop:hadoop-minikdc:jar:2.7.7:test<br />   +- org.apache.directory.server:apacheds-core-api:jar:2.0.0-M15:test<br />   |  +- org.apache.directory.api:api-ldap-codec-core:jar
:1.0.0-M20:test<br />   |  |  \- (commons-collections:commons-collections:jar:3.2.1:test - omitted for conflict with 3.2.2)<br />   |  \- org.apache.directory.api:api-ldap-model:jar:1.0.0-M20:test<br />   |     \- (commons-collections:commons-collections:jar:3.2.1:test - omitted for conflict with 3.2.2)<br />   +- org.apache.directory.server:apacheds-interceptor-kerberos:jar:2.0.0-M15:test<br />   |  \- org.apache.directory.server:apacheds-core:jar:2.0.0-M15:test<br />   |     +- org.apache.directory.server:apacheds-interceptors-authn:jar:2.0.0-M15:test<br />   |     |  \- (commons-collections:commons-collections:jar:3.2.1:test - omitted for conflict with 3.2.2)<br />   |     \- 
;org.apache.directory.server:apacheds-interceptors-exception:jar:2.0.0-M15:test<br />   |        \- (commons-collections:commons-collections:jar:3.2.1:test - omitted for conflict with 3.2.2)<br />   +- org.apache.directory.server:apacheds-ldif-partition:jar:2.0.0-M15:test<br />   |  \- org.apache.directory.server:apacheds-xdbm-partition:jar:2.0.0-M15:test<br />   |     \- (commons-collections:commons-collections:jar:3.2.1:test - omitted for conflict with 3.2.2)<br />   +- org.apache.directory.server:apacheds-mavibot-partition:jar:2.0.0-M15:test<br />   |  \- org.apache.directory.mavibot:mavibot:jar:1.0.0-M1:test<br />   |     \- (commons-collections:commons-collections:jar:3.2.1:test - omitted for conflict with 3.2.2)<br />  &#
160;\- org.apache.directory.api:api-all:jar:1.0.0-M20:test<br />      \- (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 />+- org.apache.hbase:hbase-common:jar:3.0.0-SNAPSHOT:compile<br />|  \- commons-validator:commons-validator:jar:1.6:compile<br />|     \- commons-beanutils:commons-beanutils:jar:1.9.2:compile<br />|        \- (commons-collections:commons-collections:jar:3.2.1:compile - omitted for conflict with 3.2.2)<br />\- org.apache.hadoop:hadoop-common:jar:2.7.7:compile<br />   \- commons-configuration:commons-configuration:jar:1.6:compile<br />      \- (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 />+- org.apache.hbase:hbase-common:jar:3.0.0-SNAPSHOT:compile<br />|  \- commons-validator:commons-validator:jar:1.6:compile<br />|     \- commons-beanutils:commons-beanutils:jar:1.9.2:compile<br />|        \- (commons-collections:commons-collections:jar:3.2.1:compile - omitted for conflict with 3.2.2)<br />\- org.apache.hadoop:hadoop-common:jar:2.7.7:compile<br />   \- commons-configuration:commons-configuration:jar:1.6:compile<br />      \- (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 />+- org.apache.hbase:hbase-server:jar:3.0.0-SNAPSHOT:compile<br />|  \- org.apache.hadoop:hadoop-common:jar:2.7.7:compile<br />|     \- commons-collections:commons-collections:jar:3.2.2:compile<br />\- org.apache.hbase:hbase-testing-util:jar:3.0.0-SNAPSHOT:test<br />   \- org.apache.hadoop:hadoop-minicluster:jar:2.7.7:test<br />      +- org.apache.hadoop:hadoop-common:test-jar:tests:2.7.7:test<br />      |  \- (commons-collections:commons-collections:jar:3.2.2:test - omitted for duplicate)<br />      \- org.apache.hadoop:hadoop-yarn-server-tests:test-jar:tests:2.7.7:test<br />         \- org.apache.hadoop:hadoop-yarn-server-resourcemanager:jar:2.7.7:test<br />     
       \- org.apache.hadoop:hadoop-yarn-server-applicationhistoryservice:jar:2.7.7:test<br />               \- (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 />+- org.apache.hbase:hbase-testing-util:jar:3.0.0-SNAPSHOT:test<br />|  \- org.apache.hadoop:hadoop-minicluster:jar:2.7.7:test<br />|     +- org.apache.hadoop:hadoop-common:test-jar:tests:2.7.7:test<br />|     |  \- (commons-collections:commons-collections:jar:3.2.2:test - omitted for duplicate)<br />|     \- org.apache.hadoop:hadoop-yarn-server-tests:test-jar:tests:2.7.7:test<br />|        \- org.apache.hadoop:hadoop-yarn-server-resourcemanager:jar:2.7.7:test<br />|           \- org.apache.hadoop:hadoop-yarn-server-applicationhistoryservice:jar:2.7.7:test<br />|              \- (commons-collections:commons-collections:jar:3.2.2:tes
t - omitted for duplicate)<br />\- org.apache.hadoop:hadoop-common:jar:2.7.7:compile<br />   \- 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 />+- org.apache.hbase:hbase-testing-util:jar:3.0.0-SNAPSHOT:test<br />|  \- org.apache.hadoop:hadoop-minicluster:jar:2.7.7:test<br />|     +- org.apache.hadoop:hadoop-common:test-jar:tests:2.7.7:test<br />|     |  \- (commons-collections:commons-collections:jar:3.2.2:test - omitted for duplicate)<br />|     \- org.apache.hadoop:hadoop-yarn-server-tests:test-jar:tests:2.7.7:test<br />|        \- org.apache.hadoop:hadoop-yarn-server-resourcemanager:jar:2.7.7:test<br />|           \- org.apache.hadoop:hadoop-yarn-server-applicationhistoryservice:jar:2.7.7:test<br />|              \- (commons-collections:commons-collections:jar:3
.2.2:test - omitted for duplicate)<br />\- org.apache.hbase:hbase-common:jar:3.0.0-SNAPSHOT:compile<br />   \- org.apache.hadoop:hadoop-common:jar:2.7.7:compile<br />      \- commons-collections:commons-collections:jar:3.2.2:compile<br /></li><br />
-<li>org.apache.hbase:hbase-client:jar:3.0.0-SNAPSHOT<br />\- org.apache.hadoop:hadoop-common:jar:2.7.7:compile<br />   \- commons-collections:commons-collections:jar:3.2.2:compile<br /></li><br />
-<li>org.apache.hbase:hbase-common:jar:3.0.0-SNAPSHOT<br />\- org.apache.hadoop:hadoop-common:jar:2.7.7:compile<br />   \- commons-collections:commons-collections:jar:3.2.2:compile<br /></li><br />
-<li>org.apache.hbase:hbase-endpoint:jar:3.0.0-SNAPSHOT<br />+- org.apache.hadoop:hadoop-common:jar:2.7.7:compile<br />|  \- commons-collections:commons-collections:jar:3.2.2:compile<br />\- org.apache.hadoop:hadoop-minicluster:jar:2.7.7:test<br />   +- org.apache.hadoop:hadoop-common:test-jar:tests:2.7.7:test<br />   |  \- (commons-collections:commons-collections:jar:3.2.2:test - omitted for duplicate)<br />   \- org.apache.hadoop:hadoop-yarn-server-tests:test-jar:tests:2.7.7:test<br />      \- org.apache.hadoop:hadoop-yarn-server-resourcemanager:jar:2.7.7:test<br />         \- org.apache.hadoop:hadoop-yarn-server-applicationhistoryservice:jar:2.7.7:test<br />            \- (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 />+- org.apache.hbase:hbase-testing-util:jar:3.0.0-SNAPSHOT:test<br />|  \- org.apache.hadoop:hadoop-minicluster:jar:2.7.7:test<br />|     +- org.apache.hadoop:hadoop-common:test-jar:tests:2.7.7:test<br />|     |  \- (commons-collections:commons-collections:jar:3.2.2:test - omitted for duplicate)<br />|     \- org.apache.hadoop:hadoop-yarn-server-tests:test-jar:tests:2.7.7:test<br />|        \- org.apache.hadoop:hadoop-yarn-server-resourcemanager:jar:2.7.7:test<br />|           \- org.apache.hadoop:hadoop-yarn-server-applicationhistoryservice:jar:2.7.7:test<br />|              \- (commons-collections:commons-collections:jar:3.2.2:t
est - omitted for duplicate)<br />\- org.apache.hadoop:hadoop-common:jar:2.7.7:compile<br />   \- 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 />\- org.apache.hadoop:hadoop-common:jar:2.7.7:compile<br />   \- 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 />\- org.apache.hbase:hbase-metrics-api:jar:3.0.0-SNAPSHOT:compile<br />   \- org.apache.hbase:hbase-common:jar:3.0.0-SNAPSHOT:compile<br />      \- org.apache.hadoop:hadoop-common:jar:2.7.7:compile<br />         \- 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 />\- org.apache.hadoop:hadoop-common:jar:2.7.7:compile<br />   \- commons-collections:commons-collections:jar:3.2.2:compile<br /></li><br />
-<li>org.apache.hbase:hbase-http:jar:3.0.0-SNAPSHOT<br />+- org.apache.hadoop:hadoop-common:jar:2.7.7:compile<br />|  \- commons-collections:commons-collections:jar:3.2.2:compile<br />\- org.apache.hadoop:hadoop-minicluster:jar:2.7.7:test<br />   +- org.apache.hadoop:hadoop-common:test-jar:tests:2.7.7:test<br />   |  \- (commons-collections:commons-collections:jar:3.2.2:test - omitted for duplicate)<br />   \- org.apache.hadoop:hadoop-yarn-server-tests:test-jar:tests:2.7.7:test<br />      \- org.apache.hadoop:hadoop-yarn-server-resourcemanager:jar:2.7.7:test<br />         \- org.apache.hadoop:hadoop-yarn-server-applicationhistoryservice:jar:2.7.7:test<br />            \- (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 />+- org.apache.hbase:hbase-testing-util:jar:3.0.0-SNAPSHOT:test<br />|  \- org.apache.hadoop:hadoop-minicluster:jar:2.7.7:test<br />|     +- org.apache.hadoop:hadoop-common:test-jar:tests:2.7.7:test<br />|     |  \- (commons-collections:commons-collections:jar:3.2.2:test - omitted for duplicate)<br />|     \- org.apache.hadoop:hadoop-yarn-server-tests:test-jar:tests:2.7.7:test<br />|        \- org.apache.hadoop:hadoop-yarn-server-resourcemanager:jar:2.7.7:test<br />|           \- org.apache.hadoop:hadoop-yarn-server-applicationhistoryservice:jar:2.7.7:test<br />|              \- (commons-collections:commons-collections:jar:3.2.2:test -
omitted for duplicate)<br />\- org.apache.hadoop:hadoop-common:jar:2.7.7:compile<br />   \- commons-collections:commons-collections:jar:3.2.2:compile<br /></li><br />
-<li>org.apache.hbase:hbase-mapreduce:jar:3.0.0-SNAPSHOT<br />+- org.apache.hadoop:hadoop-common:jar:2.7.7:compile<br />|  \- commons-collections:commons-collections:jar:3.2.2:compile<br />\- org.apache.hadoop:hadoop-minicluster:jar:2.7.7:test<br />   +- org.apache.hadoop:hadoop-common:test-jar:tests:2.7.7:test<br />   |  \- (commons-collections:commons-collections:jar:3.2.2:test - omitted for duplicate)<br />   \- org.apache.hadoop:hadoop-yarn-server-tests:test-jar:tests:2.7.7:test<br />      \- org.apache.hadoop:hadoop-yarn-server-resourcemanager:jar:2.7.7:test<br />         \- org.apache.hadoop:hadoop-yarn-server-applicationhistoryservice:jar:2.7.7:test<br />            \- (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 />\- org.apache.hbase:hbase-common:jar:3.0.0-SNAPSHOT:compile<br />   \- org.apache.hadoop:hadoop-common:jar:2.7.7:compile<br />      \- commons-collections:commons-collections:jar:3.2.2:compile<br /></li><br />
-<li>org.apache.hbase:hbase-metrics:jar:3.0.0-SNAPSHOT<br />\- org.apache.hbase:hbase-common:jar:3.0.0-SNAPSHOT:compile<br />   \- org.apache.hadoop:hadoop-common:jar:2.7.7:compile<br />      \- commons-collections:commons-collections:jar:3.2.2:compile<br /></li><br />
-<li>org.apache.hbase:hbase-procedure:jar:3.0.0-SNAPSHOT<br />\- org.apache.hadoop:hadoop-common:jar:2.7.7:compile<br />   \- commons-collections:commons-collections:jar:3.2.2:compile<br /></li><br />
-<li>org.apache.hbase:hbase-replication:jar:3.0.0-SNAPSHOT<br />\- org.apache.hadoop:hadoop-common:jar:2.7.7:compile<br />   \- commons-collections:commons-collections:jar:3.2.2:compile<br /></li><br />
-<li>org.apache.hbase:hbase-rest:jar:3.0.0-SNAPSHOT<br />+- org.apache.hbase:hbase-testing-util:jar:3.0.0-SNAPSHOT:test<br />|  \- org.apache.hadoop:hadoop-minicluster:jar:2.7.7:test<br />|     +- org.apache.hadoop:hadoop-common:test-jar:tests:2.7.7:test<br />|     |  \- (commons-collections:commons-collections:jar:3.2.2:test - omitted for duplicate)<br />|     \- org.apache.hadoop:hadoop-yarn-server-tests:test-jar:tests:2.7.7:test<br />|        \- org.apache.hadoop:hadoop-yarn-server-resourcemanager:jar:2.7.7:test<br />|           \- org.apache.hadoop:hadoop-yarn-server-applicationhistoryservice:jar:2.7.7:test<br />|              \- (commons-collections:commons-collections:jar:3.2.2:test
- omitted for duplicate)<br />\- org.apache.hadoop:hadoop-common:jar:2.7.7:compile<br />   \- commons-collections:commons-collections:jar:3.2.2:compile<br /></li><br />
-<li>org.apache.hbase:hbase-rsgroup:jar:3.0.0-SNAPSHOT<br />+- org.apache.hbase:hbase-testing-util:jar:3.0.0-SNAPSHOT:test<br />|  \- org.apache.hadoop:hadoop-minicluster:jar:2.7.7:test<br />|     +- org.apache.hadoop:hadoop-common:test-jar:tests:2.7.7:test<br />|     |  \- (commons-collections:commons-collections:jar:3.2.2:test - omitted for duplicate)<br />|     \- org.apache.hadoop:hadoop-yarn-server-tests:test-jar:tests:2.7.7:test<br />|        \- org.apache.hadoop:hadoop-yarn-server-resourcemanager:jar:2.7.7:test<br />|           \- org.apache.hadoop:hadoop-yarn-server-applicationhistoryservice:jar:2.7.7:test<br />|              \- (commons-collections:commons-collections:jar:3.2.2:te
st - omitted for duplicate)<br />\- org.apache.hadoop:hadoop-common:jar:2.7.7:compile<br />   \- commons-collections:commons-collections:jar:3.2.2:compile<br /></li><br />
-<li>org.apache.hbase:hbase-server:jar:3.0.0-SNAPSHOT<br />+- org.apache.hadoop:hadoop-common:jar:2.7.7:compile<br />|  \- commons-collections:commons-collections:jar:3.2.2:compile<br />\- org.apache.hadoop:hadoop-minicluster:jar:2.7.7:test<br />   +- org.apache.hadoop:hadoop-common:test-jar:tests:2.7.7:test<br />   |  \- (commons-collections:commons-collections:jar:3.2.2:test - omitted for duplicate)<br />   \- org.apache.hadoop:hadoop-yarn-server-tests:test-jar:tests:2.7.7:test<br />      \- org.apache.hadoop:hadoop-yarn-server-resourcemanager:jar:2.7.7:test<br />         \- org.apache.hadoop:hadoop-yarn-server-applicationhistoryservice:jar:2.7.7:test<br />            \- (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 />\- org.apache.hbase:hbase-shaded-mapreduce:jar:3.0.0-SNAPSHOT:compile<br />   \- org.apache.hbase:hbase-mapreduce:jar:3.0.0-SNAPSHOT:compile<br />      \- org.apache.hadoop:hadoop-common:jar:2.7.7:compile<br />         \- 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 />\- org.apache.hbase:hbase-client:jar:3.0.0-SNAPSHOT:compile<br />   \- org.apache.hadoop:hadoop-common:jar:2.7.7:compile<br />      \- 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 />+- org.apache.hbase:hbase-testing-util:jar:3.0.0-SNAPSHOT:test<br />|  \- org.apache.hadoop:hadoop-minicluster:jar:2.7.7:test<br />|     +- org.apache.hadoop:hadoop-common:test-jar:tests:2.7.7:test<br />|     |  \- (commons-collections:commons-collections:jar:3.2.2:test - omitted for duplicate)<br />|     \- org.apache.hadoop:hadoop-yarn-server-tests:test-jar:tests:2.7.7:test<br />|        \- org.apache.hadoop:hadoop-yarn-server-resourcemanager:jar:2.7.7:test<br />|           \- org.apache.hadoop:hadoop-yarn-server-applicationhistoryservice:jar:2.7.7:test<br />|              \- (commons-collections:commons-collection
s:jar:3.2.2:test - omitted for duplicate)<br />\- org.apache.hbase:hbase-shaded-client:jar:3.0.0-SNAPSHOT:compile<br />   \- org.apache.hbase:hbase-client:jar:3.0.0-SNAPSHOT:compile<br />      \- org.apache.hadoop:hadoop-common:jar:2.7.7:compile<br />         \- 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 />\- org.apache.hbase:hbase-client:jar:3.0.0-SNAPSHOT:compile<br />   \- org.apache.hadoop:hadoop-common:jar:2.7.7:compile<br />      \- 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 />\- org.apache.hadoop:hadoop-common:jar:2.7.7:provided (scope not updated to compile)<br />   \- 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 />\- org.apache.hbase:hbase-shaded-client:jar:3.0.0-SNAPSHOT:compile<br />   \- org.apache.hbase:hbase-client:jar:3.0.0-SNAPSHOT:compile<br />      \- org.apache.hadoop:hadoop-common:jar:2.7.7:compile<br />         \- commons-collections:commons-collections:jar:3.2.2:compile<br /></li><br />
-<li>org.apache.hbase:hbase-shell:jar:3.0.0-SNAPSHOT<br />+- org.apache.hadoop:hadoop-common:jar:2.7.7:compile<br />|  \- commons-collections:commons-collections:jar:3.2.2:compile<br />\- org.apache.hadoop:hadoop-minicluster:jar:2.7.7:test<br />   +- org.apache.hadoop:hadoop-common:test-jar:tests:2.7.7:test<br />   |  \- (commons-collections:commons-collections:jar:3.2.2:test - omitted for duplicate)<br />   \- org.apache.hadoop:hadoop-yarn-server-tests:test-jar:tests:2.7.7:test<br />      \- org.apache.hadoop:hadoop-yarn-server-resourcemanager:jar:2.7.7:test<br />         \- org.apache.hadoop:hadoop-yarn-server-applicationhistoryservice:jar:2.7.7:test<br />            \- (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 />+- org.apache.hadoop:hadoop-common:jar:2.7.7:compile<br />|  \- commons-collections:commons-collections:jar:3.2.2:compile<br />\- org.apache.hadoop:hadoop-minicluster:jar:2.7.7:compile<br />   +- org.apache.hadoop:hadoop-common:test-jar:tests:2.7.7:compile<br />   |  \- (commons-collections:commons-collections:jar:3.2.2:compile - omitted for duplicate)<br />   \- org.apache.hadoop:hadoop-yarn-server-tests:test-jar:tests:2.7.7:compile<br />      \- org.apache.hadoop:hadoop-yarn-server-resourcemanager:jar:2.7.7:compile<br />         \- org.apache.hadoop:hadoop-yarn-server-applicationhistoryservice:jar:2.7.7:compile<br />            \- (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 />+- org.apache.hadoop:hadoop-common:jar:2.7.7:compile<br />|  \- commons-collections:commons-collections:jar:3.2.2:compile<br />\- org.apache.hadoop:hadoop-minicluster:jar:2.7.7:test<br />   +- org.apache.hadoop:hadoop-common:test-jar:tests:2.7.7:test<br />   |  \- (commons-collections:commons-collections:jar:3.2.2:test - omitted for duplicate)<br />   \- org.apache.hadoop:hadoop-yarn-server-tests:test-jar:tests:2.7.7:test<br />      \- org.apache.hadoop:hadoop-yarn-server-resourcemanager:jar:2.7.7:test<br />         \- org.apache.hadoop:hadoop-yarn-server-applicationhistoryservice:jar:2.7.7:test<br />            \- (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 />\- org.apache.hadoop:hadoop-common:jar:2.7.7:compile<br />   \- 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 />+- org.apache.hbase:hbase-server:jar:3.0.0-SNAPSHOT:compile<br />|  +- org.apache.hbase:hbase-common:jar:3.0.0-SNAPSHOT:compile<br />|  |  \- commons-validator:commons-validator:jar:1.6:compile<br />|  |     \- (commons-collections:commons-collections:jar:3.2.2:compile - omitted for duplicate)<br />|  \- org.apache.hadoop:hadoop-common:jar:2.7.7:compile<br />|     \- commons-collections:commons-collections:jar:3.2.2:compile<br />\- org.apache.hbase:hbase-testing-util:jar:3.0.0-SNAPSHOT:test<br />   \- org.apache.hadoop:hadoop-minicluster:jar:2.7.7:test<br />      +- org.apache.hadoop:hadoop-common:test-jar:tests:2.7.7:test<br />      |  \- (commons-collections:commons-collections:jar:3.2.2:tes
t - omitted for duplicate)<br />      \- org.apache.hadoop:hadoop-yarn-server-tests:test-jar:tests:2.7.7:test<br />         \- org.apache.hadoop:hadoop-yarn-server-resourcemanager:jar:2.7.7:test<br />            \- org.apache.hadoop:hadoop-yarn-server-applicationhistoryservice:jar:2.7.7:test<br />               \- (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 />+- org.apache.hbase:hbase-common:jar:3.0.0-SNAPSHOT:compile<br />|  \- commons-validator:commons-validator:jar:1.6:compile<br />|     \- (commons-collections:commons-collections:jar:3.2.2:compile - omitted for duplicate)<br />+- org.apache.hbase:hbase-testing-util:jar:3.0.0-SNAPSHOT:test<br />|  \- org.apache.hadoop:hadoop-minicluster:jar:2.7.7:test<br />|     +- org.apache.hadoop:hadoop-common:test-jar:tests:2.7.7:test<br />|     |  \- (commons-collections:commons-collections:jar:3.2.2:test - omitted for duplicate)<br />|     \- org.apache.hadoop:hadoop-yarn-server-tests:test-jar:tests:2.7.7:test<br />|        \- org.apache.hadoop:hadoop-yarn-server-resourcemanager:jar:2.7.7:test<br />|    
0;      \- org.apache.hadoop:hadoop-yarn-server-applicationhistoryservice:jar:2.7.7:test<br />|              \- (commons-collections:commons-collections:jar:3.2.2:test - omitted for duplicate)<br />\- org.apache.hadoop:hadoop-common:jar:2.7.7:compile<br />   \- 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 />+- org.apache.hbase:hbase-testing-util:jar:3.0.0-SNAPSHOT:test<br />|  \- org.apache.hadoop:hadoop-minicluster:jar:2.7.7:test<br />|     +- org.apache.hadoop:hadoop-common:test-jar:tests:2.7.7:test<br />|     |  \- (commons-collections:commons-collections:jar:3.2.2:test - omitted for duplicate)<br />|     \- org.apache.hadoop:hadoop-yarn-server-tests:test-jar:tests:2.7.7:test<br />|        \- org.apache.hadoop:hadoop-yarn-server-resourcemanager:jar:2.7.7:test<br />|           \- org.apache.hadoop:hadoop-yarn-server-applicationhistoryservice:jar:2.7.7:test<br />|              \- (commons-collections:commons-collections:jar:3
.2.2:test - omitted for duplicate)<br />\- org.apache.hbase:hbase-common:jar:3.0.0-SNAPSHOT:compile<br />   +- commons-validator:commons-validator:jar:1.6:compile<br />   |  +- commons-beanutils:commons-beanutils:jar:1.9.2:compile<br />   |  |  \- (commons-collections:commons-collections:jar:3.2.2:compile - omitted for duplicate)<br />   |  \- commons-collections:commons-collections:jar:3.2.2:compile<br />   \- org.apache.hadoop:hadoop-common:jar:2.7.7:compile<br />      \- (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 />+- org.apache.hbase:hbase-common:jar:3.0.0-SNAPSHOT:compile<br />|  \
<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<TEnvironment> proc, NonceKey nonceKey) {<a name="line.999"></a>
-<span class="sourceLineNo">1000</span> Preconditions.checkArgument(lastProcId.get() >= 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<TEnvironment> proc, NonceKey nonceKey) {<a name="line.1007"></a>
+<span class="sourceLineNo">1008</span> Preconditions.checkArgument(lastProcId.get() >= 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<TEnvironment>[] procs) {<a name="line.1030"></a>
-<span class="sourceLineNo">1031</span> Preconditions.checkArgument(lastProcId.get() >= 0);<a name="line.1031"></a>
-<span class="sourceLineNo">1032</span> if (procs == null || procs.length <= 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 < 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 < 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<TEnvironment> prepareProcedure(Procedure<TEnvironment> 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<TEnvironment>[] procs) {<a name="line.1038"></a>
+<span class="sourceLineNo">1039</span> Preconditions.checkArgument(lastProcId.get() >= 0);<a name="line.1039"></a>
+<span class="sourceLineNo">1040</span> if (procs == null || procs.length <= 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 < 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 < 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<TEnvironment> 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<TEnvironment> stack = new RootProcedureState<>();<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<TEnvironment> prepareProcedure(Procedure<TEnvironment> 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<TEnvironment> 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<TEnvironment> stack = new RootProcedureState<>();<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<TEnvironment> 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 && 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<TEnvironment> 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 <T extends Procedure<TEnvironment>> T getProcedure(Class<T> clazz, long procId) {<a name="line.1115"></a>
-<span class="sourceLineNo">1116</span> Procedure<TEnvironment> 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<TEnvironment> 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 && 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<TEnvironment> 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<TEnvironment> getResult(long procId) {<a name="line.1123"></a>
-<span class="sourceLineNo">1124</span> CompletedProcedureRetainer<TEnvironment> 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<?> 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<TEnvironment> 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<TEnvironment> getResultOrProcedure(long procId) {<a name="line.1172"></a>
-<span class="sourceLineNo">1173</span> CompletedProcedureRetainer<TEnvironment> 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<TEnvironment> 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<TEnvironment> 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> * <p/><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<Procedure<TEnvironment>> 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 <T extends Procedure<TEnvironment>> T getProcedure(Class<T> clazz, long procId) {<a name="line.1123"></a>
+<span class="sourceLineNo">1124</span> Procedure<TEnvironment> 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<TEnvironment> getResult(long procId) {<a name="line.1131"></a>
+<span class="sourceLineNo">1132</span> CompletedProcedureRetainer<TEnvironment> 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<?> 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<TEnvironment> 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<TEnvironment> getResultOrProcedure(long procId) {<a name="line.1180"></a>
+<span class="sourceLineNo">1181</span> CompletedProcedureRetainer<TEnvironment> 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<TEnvironment> 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<TEnvironment> 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> * <p/><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<Procedure<TEnvironment>> getProcedures() {<a name="line.1222"></a>
-<span class="sourceLineNo">1223</span> List<Procedure<TEnvironment>> procedureList =<a name="line.1223"></a>
-<span class="sourceLineNo">1224</span> new ArrayList<>(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 < 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 >= 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 >= 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<Long> 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<TEnvironment> 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<TEnvironment> 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<TEnvironment> 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<Procedure<TEnvironment>> 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<Procedure<TEnvironment>> getProcedures() {<a name="line.1230"></a>
+<span class="sourceLineNo">1231</span> List<Procedure<TEnvironment>> procedureList =<a name="line.1231"></a>
+<span class="sourceLineNo">1232</span> new ArrayList<>(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 < 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 >= 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 >= 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<Long> 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<TEnvironment> 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<TEnvironment> 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<TEnvironment> 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<TEnvironment> 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<TEnvironment> 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<TEnvironment> procStack) {<a name="line.1437"></a>
-<span class="sourceLineNo">1438</span> Procedure<TEnvironment> 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<TestProcEnv> 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() > 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<>(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, () -> proc.isSuccess() && 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, () -> proc.isSuccess() && 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, () -> procExecutor.getProcedures().stream()<a name="line.114"></a>
-<span class="sourceLineNo">115</span> .filter(p -> p.getParentProcId() == rootId).collect(Collectors.toList())<a name="line.115"></a>
-<span class="sourceLineNo">116</span> .size() > 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 -> 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, () -> proc.isSuccess() && 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, () -> proc.isSuccess() && 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, () -> procExecutor.getProcedures().stream()<a name="line.142"></a>
-<span class="sourceLineNo">143</span> .filter(p -> p.getParentProcId() == rootId).collect(Collectors.toList())<a name="line.143"></a>
-<span class="sourceLineNo">144</span> .size() > 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 -> 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, () -> proc.isSuccess() && 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<TestProcEnv> {<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<TestProcEnv> 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() > 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<>(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, () -> proc.isSuccess() && 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, () -> proc.isSuccess() && 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, () -> procExecutor.getProcedures().stream()<a name="line.115"></a>
+<span class="sourceLineNo">116</span> .filter(p -> p.getParentProcId() == rootId).collect(Collectors.toList())<a name="line.116"></a>
+<span class="sourceLineNo">117</span> .size() > 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 -> 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, () -> proc.isSuccess() && 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, () -> proc.isSuccess() && 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, () -> procExecutor.getProcedures().stream()<a name="line.143"></a>
+<span class="sourceLineNo">144</span> .filter(p -> p.getParentProcId() == rootId).collect(Collectors.toList())<a name="line.144"></a>
+<span class="sourceLineNo">145</span> .size() > 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 -> 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, () -> proc.isSuccess() && 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, () -> proc.isSuccess() && 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<TestProcEnv> {<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<TestProcEnv> {<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<TestProcEnv> {<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<TestProcEnv> {<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<TestProcEnv> {<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<TestProcEnv, StuckStateMachineState> {<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<TestProcEnv> {<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<TestProcEnv, StuckStateMachineState> {<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 <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><T>><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><T> fairq,
- <a href="../../../../../../org/apache/hadoop/hbase/master/procedure/Queue.html" title="class in org.apache.hadoop.hbase.master.procedure">Queue</a><T> queue)</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-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><T> fairq,
+ <a href="../../../../../../org/apache/hadoop/hbase/master/procedure/Queue.html" title="class in org.apache.hadoop.hbase.master.procedure">Queue</a><T> 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><<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>> reason)</code> </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 <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><T>><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><T> fairq,
- <a href="../../../../../../org/apache/hadoop/hbase/master/procedure/Queue.html" title="class in org.apache.hadoop.hbase.master.procedure">Queue</a><T> queue)</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-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><T> fairq,
+ <a href="../../../../../../org/apache/hadoop/hbase/master/procedure/Queue.html" title="class in org.apache.hadoop.hbase.master.procedure">Queue</a><T> 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><<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>> reason)</code> </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 org.slf4j.Logger <a href="../../../../../../src-html/org/apache/hadoop/hbase/master/procedure/MasterProcedureScheduler.html#line.97">LOG</a></pre>
+<pre>private static final 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 <a href="../../../../../../org/apache/hadoop/hbase/util/AvlUtil.AvlKeyComparator.html" title="interface in org.apache.hadoop.hbase.util">AvlUtil.AvlKeyComparator</a><<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.99">SERVER_QUEUE_KEY_COMPARATOR</a></pre>
+<pre>private static final <a href="../../../../../../org/apache/hadoop/hbase/util/AvlUtil.AvlKeyComparator.html" title="interface in org.apache.hadoop.hbase.util">AvlUtil.AvlKeyComparator</a><<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.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 <a href="../../../../../../org/apache/hadoop/hbase/util/AvlUtil.AvlKeyComparator.html" title="interface in org.apache.hadoop.hbase.util">AvlUtil.AvlKeyComparator</a><<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.101">TABLE_QUEUE_KEY_COMPARATOR</a></pre>
+<pre>private static final <a href="../../../../../../org/apache/hadoop/hbase/util/AvlUtil.AvlKeyComparator.html" title="interface in org.apache.hadoop.hbase.util">AvlUtil.AvlKeyComparator</a><<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.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 <a href="../../../../../../org/apache/hadoop/hbase/util/AvlUtil.AvlKeyComparator.html" title="interface in org.apache.hadoop.hbase.util">AvlUtil.AvlKeyComparator</a><<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.103">PEER_QUEUE_KEY_COMPARATOR</a></pre>
+<pre>private static final <a href="../../../../../../org/apache/hadoop/hbase/util/AvlUtil.AvlKeyComparator.html" title="interface in org.apache.hadoop.hbase.util">AvlUtil.AvlKeyComparator</a><<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.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 <a href="../../../../../../org/apache/hadoop/hbase/util/AvlUtil.AvlKeyComparator.html" title="interface in org.apache.hadoop.hbase.util">AvlUtil.AvlKeyComparator</a><<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.105">META_QUEUE_KEY_COMPARATOR</a></pre>
+<pre>private static final <a href="../../../../../../org/apache/hadoop/hbase/util/AvlUtil.AvlKeyComparator.html" title="interface in org.apache.hadoop.hbase.util">AvlUtil.AvlKeyComparator</a><<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.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 <a href="../../../../../../org/apache/hadoop/hbase/master/procedure/FairQueue.html" title="class in org.apache.hadoop.hbase.master.procedure">FairQueue</a><<a href="../../../../../../org/apache/hadoop/hbase/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a>> <a href="../../../../../../src-html/org/apache/hadoop/hbase/master/procedure/MasterProcedureScheduler.html#line.108">serverRunQueue</a></pre>
+<pre>private final <a href="../../../../../../org/apache/hadoop/hbase/master/procedure/FairQueue.html" title="class in org.apache.hadoop.hbase.master.procedure">FairQueue</a><<a href="../../../../../../org/apache/hadoop/hbase/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a>> <a href="../../../../../../src-html/org/apache/hadoop/hbase/master/procedure/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 <a href="../../../../../../org/apache/hadoop/hbase/master/procedure/FairQueue.html" title="class in org.apache.hadoop.hbase.master.procedure">FairQueue</a><<a href="../../../../../../org/apache/hadoop/hbase/TableName.html" title="class in org.apache.hadoop.hbase">TableName</a>> <a href="../../../../../../src-html/org/apache/hadoop/hbase/master/procedure/MasterProcedureScheduler.html#line.109">tableRunQueue</a></pre>
+<pre>private final <a href="../../../../../../org/apache/hadoop/hbase/master/procedure/FairQueue.html" title="class in org.apache.hadoop.hbase.master.procedure">FairQueue</a><<a href="../../../../../../org/apache/hadoop/hbase/TableName.html" title="class in org.apache.hadoop.hbase">TableName</a>> <a href="../../../../../../src-html/org/apache/hadoop/hbase/master/procedure/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 <a href="../../../../../../org/apache/hadoop/hbase/master/procedure/FairQueue.html" title="class in org.apache.hadoop.hbase.master.procedure">FairQueue</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>> <a href="../../../../../../src-html/org/apache/hadoop/hbase/master/procedure/MasterProcedureScheduler.html#line.110">peerRunQueue</a></pre>
+<pre>private final <a href="../../../../../../org/apache/hadoop/hbase/master/procedure/FairQueue.html" title="class in org.apache.hadoop.hbase.master.procedure">FairQueue</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>> <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 <a href="../../../../../../org/apache/hadoop/hbase/master/procedure/FairQueue.html" title="class in org.apache.hadoop.hbase.master.procedure">FairQueue</a><<a href="../../../../../../org/apache/hadoop/hbase/TableName.html" title="class in org.apache.hadoop.hbase">TableName</a>> <a href="../../../../../../src-html/org/apache/hadoop/hbase/master/procedure/MasterProcedureScheduler.html#line.111">metaRunQueue</a></pre>
+<pre>private final <a href="../../../../../../org/apache/hadoop/hbase/master/procedure/FairQueue.html" title="class in org.apache.hadoop.hbase.master.procedure">FairQueue</a><<a href="../../../../../../org/apache/hadoop/hbase/TableName.html" title="class in org.apache.hadoop.hbase">TableName</a>> <a href="../../../../../../src-html/org/apache/hadoop/hbase/master/procedure/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 <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 <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 <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 <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 <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 <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 <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 <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 <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 <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 <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><<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><?>> procedureRetriever)</pre>
+<pre>public <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><<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><?>> 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 void <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> proc)</pre>
+<pre>public void <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> proc)</pre>
<div class="block"><span class="descfrmTypeLabel">Description copied from interface: <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 void <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> proc,
+<pre>protected void <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> proc,
boolean addFront)</pre>
<div class="block"><span class="descfrmTypeLabel">Description copied from class: <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 <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><T>> void <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><T> fairq,
+<pre>private <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><T>> void <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><T> fairq,
<a href="../../../../../../org/apache/hadoop/hbase/master/procedure/Queue.html" title="class in org.apache.hadoop.hbase.master.procedure">Queue</a><T> queue,
<a href="../../../../../../org/apache/hadoop/hbase/procedure2/Procedure.html" title="class in org.apache.hadoop.hbase.procedure2">Procedure</a><?> proc,
boolean 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 boolean <a href="../../../../../../src-html/org/apache/hadoop/hbase/master/procedure/MasterProcedureScheduler.html#line.165">queueHasRunnables</a>()</pre>
+<pre>protected boolean <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: <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 <a href="../../../../../../org/apache/hadoop/hbase/procedure2/Procedure.html" title="class in org.apache.hadoop.hbase.procedure2">Procedure</a> <a href="../../../../../../src-html/org/apache/hadoop/hbase/master/procedure/MasterProcedureScheduler.html#line.171">dequeue</a>()</pre>
+<pre>protected <a href="../../../../../../org/apache/hadoop/hbase/procedure2/Procedure.html" title="class in org.apache.hadoop.hbase.procedure2">Procedure</a> <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: <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 <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><T>> boolean <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><?> proc,
+<pre>private <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><T>> boolean <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><?> proc,
<a href="../../../../../../org/apache/hadoop/hbase/master/procedure/Queue.html" title="class in org.apache.hadoop.hbase.master.procedure">Queue</a><T> 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 <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><T>> <a href="../../../../../../org/apache/hadoop/hbase/procedure2/Procedure.html" title="class in org.apache.hadoop.hbase.procedure2">Procedure</a><?> <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><T> fairq)</pre>
+<pre>private <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><T>> <a href="../../../../../../org/apache/hadoop/hbase/procedure2/Procedure.html" title="class in org.apache.hadoop.hbase.procedure2">Procedure</a><?> <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><T> 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 <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><<a href="../../../../../../org/apache/hadoop/hbase/procedure2/LockedResource.html" title="class in org.apache.hadoop.hbase.procedure2">LockedResource</a>> <a href="../../../../../../src-html/org/apache/hadoop/hbase/master/procedure/MasterProcedureScheduler.html#line.226">getLocks</a>()</pre>
+<pre>public <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><<a href="../../../../../../org/apache/hadoop/hbase/procedure2/LockedResource.html" title="class in org.apache.hadoop.hbase.procedure2">LockedResource</a>> <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: <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 <a href="../../../../../../org/apache/hadoop/hbase/procedure2/LockedResource.html" title="class in org.apache.hadoop.hbase.procedure2">LockedResource</a> <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> resourceType,
+<pre>public <a href="../../../../../../org/apache/hadoop/hbase/procedure2/LockedResource.html" title="class in org.apache.hadoop.hbase.procedure2">LockedResource</a> <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> 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> 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 void <a href="../../../../../../src-html/org/apache/hadoop/hbase/master/procedure/MasterProcedureScheduler.html#line.246">clear</a>()</pre>
+<pre>public void <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: <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 void <a href="../../../../../../src-html/org/apache/hadoop/hbase/master/procedure/MasterProcedureScheduler.html#line.256">clearQueue</a>()</pre>
+<pre>private void <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 <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><T>,TNode extends <a href="../../../../../../org/apache/hadoop/hbase/master/procedure/Queue.html" title="class in org.apache.hadoop.hbase.master.procedure">Queue</a><T>> void <a href="../../../../../../src-html/org/apache/hadoop/hbase/master/procedure/MasterProcedureScheduler.html#line.274">clear</a>(TNode treeMap,
+<pre>private <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><T>,TNode extends <a href="../../../../../../org/apache/hadoop/hbase/master/procedure/Queue.html" title="class in org.apache.hadoop.hbase.master.procedure">Queue</a><T>> void <a href="../../../../../../src-html/org/apache/hadoop/hbase/master/procedure/MasterProcedureScheduler.html#line.284">clear</a>(TNode treeMap,
<a href="../../../../../../org/apache/hadoop/hbase/master/procedure/FairQueue.html" title="class in org.apache.hadoop.hbase.master.procedure">FairQueue</a><T> fairq,
<a href="../../../../../../org/apache/hadoop/hbase/util/AvlUtil.AvlKeyComparator.html" title="interface in org.apache.hadoop.hbase.util">AvlUtil.AvlKeyComparator</a><TNode> 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 int <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><?> head)</pre>
+<pre>private int <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><?> 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 int <a href="../../../../../../src-html/org/apache/hadoop/hbase/master/procedure/MasterProcedureScheduler.html#line.293">queueSize</a>()</pre>
+<pre>protected int <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: <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 void <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> proc)</pre>
+<pre>public void <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> proc)</pre>
<div class="block"><span class="descfrmTypeLabel">Description copied from interface: <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 <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><T>> void <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><T> fairq,
- <a href="../../../../../../org/apache/hadoop/hbase/master/procedure/Queue.html" title="class in org.apache.hadoop.hbase.master.procedure">Queue</a><T> queue)</pre>
+<pre>private static <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><T>> void <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><T> fairq,
+ <a href="../../../../../../org/apache/hadoop/hbase/master/procedure/Queue.html" title="class in org.apache.hadoop.hbase.master.procedure">Queue</a><T> 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><<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>> 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 <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><T>> void <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><T> fairq,
- <a href="../../../../../../org/apache/hadoop/hbase/master/procedure/Queue.html" title="class in org.apache.hadoop.hbase.master.procedure">Queue</a><T> queue)</pre>
+<pre>private static <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><T>> void <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><T> fairq,
+ <a href="../../../../../../org/apache/hadoop/hbase/master/procedure/Queue.html" title="class in org.apache.hadoop.hbase.master.procedure">Queue</a><T> 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><<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>> 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 <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.352">getTableQueue</a>(<a href="../../../../../../org/apache/hadoop/hbase/TableName.html" title="class in org.apache.hadoop.hbase">TableName</a> tableName)</pre>
+<pre>private <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.371">getTableQueue</a>(<a href="../../../../../../org/apache/hadoop/hbase/TableName.html" title="class in org.apache.hadoop.hbase">TableName</a> 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 void <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> tableName)</pre>
+<pre>private void <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> 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 boolean <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><?> proc)</pre>
+<pre>private static boolean <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><?> 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 <a href="../../../../../../org/apache/hadoop/hbase/TableName.html" title="class in org.apache.hadoop.hbase">TableName</a> <a href="../../../../../../src-html/org/apache/hadoop/hbase/master/procedure/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><?> proc)</pre>
+<pre>private static <a href="../../../../../../org/apache/hadoop/hbase/TableName.html" title="class in org.apache.hadoop.hbase">TableName</a> <a href="../../../../../../src-html/org/apache/hadoop/hbase/master/procedure/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><?> 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 <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.378">getServerQueue</a>(<a href="../../../../../../org/apache/hadoop/hbase/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a> serverName,
+<pre>private <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.397">getServerQueue</a>(<a href="../../../../../../org/apache/hadoop/hbase/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a> serverName,
<a href="../../../../../../org/apache/hadoop/hbase/master/procedure/ServerProcedureInterface.html" title="interface in org.apache.hadoop.hbase.master.procedure">ServerProcedureInterface</a> 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 void <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> serverName)</pre>
+<pre>private void <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> 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 void <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> serverName,
+<pre>private void <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> serverName,
<a href="../../../../../../org/apache/hadoop/hbase/procedure2/Procedure.html" title="class in org.apache.hadoop.hbase.procedure2">Procedure</a><?> 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 int <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>[] buckets,
+<pre>private static int <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>[] buckets,
int 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 boolean <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><?> proc)</pre>
+<pre>private static boolean <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><?> 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 <a href="../../../../../../org/apache/hadoop/hbase/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a> <a href="../../../../../../src-html/org/apache/hadoop/hbase/master/procedure/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><?> proc)</pre>
+<pre>private static <a href="../../../../../../org/apache/hadoop/hbase/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a> <a href="../../../../../../src-html/org/apache/hadoop/hbase/master/procedure/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><?> 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 <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.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> peerId)</pre>
+<pre>private <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.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> 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 void <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> peerId)</pre>
+<pre>private void <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> 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 void <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> peerId,
+<pre>private void <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> peerId,
<a href="../../../../../../org/apache/hadoop/hbase/procedure2/Procedure.html" title="class in org.apache.hadoop.hbase.procedure2">Procedure</a><?> 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 boolean <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><?> proc)</pre>
+<pre>private static boolean <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><?> 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 <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a> <a href="../../../../../../src-html/org/apache/hadoop/hbase/master/procedure/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><?> proc)</pre>
+<pre>private static <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a> <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><?> 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 <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.480">getMetaQueue</a>()</pre>
+<pre>private <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.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 boolean <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><?> proc)</pre>
+<pre>private static boolean <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><?> 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 void <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> resourceType,
+<pre>private void <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> 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> 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 boolean <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><?> procedure,
+<pre>public boolean <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><?> procedure,
<a href="../../../../../../org/apache/hadoop/hbase/TableName.html" title="class in org.apache.hadoop.hbase">TableName</a> 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 void <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><?> procedure,
+<pre>public void <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><?> procedure,
<a href="../../../../../../org/apache/hadoop/hbase/TableName.html" title="class in org.apache.hadoop.hbase">TableName</a> 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 boolean <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><?> procedure,
+<pre>public boolean <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><?> procedure,
<a href="../../../../../../org/apache/hadoop/hbase/TableName.html" title="class in org.apache.hadoop.hbase">TableName</a> 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 <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.583">waitTableQueueSharedLock</a>(<a href="../../../../../../org/apache/hadoop/hbase/procedure2/Procedure.html" title="class in org.apache.hadoop.hbase.procedure2">Procedure</a><?> procedure,
+<pre>private <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.606">waitTableQueueSharedLock</a>(<a href="../../../../../../org/apache/hadoop/hbase/procedure2/Procedure.html" title="class in org.apache.hadoop.hbase.procedure2">Procedure</a><?> procedure,
<a href="../../../../../../org/apache/hadoop/hbase/TableName.html" title="class in org.apache.hadoop.hbase">TableName</a> 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 void <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><?> procedure,
+<pre>public void <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><?> procedure,
<a href="../../../../../../org/apache/hadoop/hbase/TableName.html" title="class in org.apache.hadoop.hbase">TableName</a> 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 <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> table,
+<pre>boolean <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> table,
<a href="../../../../../../org/apache/hadoop/hbase/procedure2/Procedure.html" title="class in org.apache.hadoop.hbase.procedure2">Procedure</a><?> 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 boolean <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><?> procedure,
+<pre>public boolean <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><?> procedure,
<a href="../../../../../../org/apache/hadoop/hbase/client/RegionInfo.html" title="interface in org.apache.hadoop.hbase.client">RegionInfo</a> 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 boolean <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><?> procedure,
+<pre>public boolean <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><?> procedure,
<a href="../../../../../../org/apache/hadoop/hbase/TableName.html" title="class in org.apache.hadoop.hbase">TableName</a> table,
<a href="../../../../../../org/apache/hadoop/hbase/client/RegionInfo.html" title="interface in org.apache.hadoop.hbase.client">RegionInfo</a>... 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 void <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><?> procedure,
+<pre>public void <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><?> procedure,
<a href="../../../../../../org/apache/hadoop/hbase/client/RegionInfo.html" title="interface in org.apache.hadoop.hbase.client">RegionInfo</a> 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 void <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><?> procedure,
+<pre>public void <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><?> procedure,
<a href="../../../../../../org/apache/hadoop/hbase/TableName.html" title="class in org.apache.hadoop.hbase">TableName</a> table,
<a href="../../../../../../org/apache/hadoop/hbase/client/RegionInfo.html" title="interface in org.apache.hadoop.hbase.client">RegionInfo</a>... 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 boolean <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><?> procedure,
+<pre>public boolean <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><?> 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> 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 void <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><?> procedure,
+<pre>public void <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><?> 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> 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 boolean <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><?> procedure,
+<pre>public boolean <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><?> procedure,
<a href="../../../../../../org/apache/hadoop/hbase/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a> 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 void <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><?> procedure,
+<pre>public void <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><?> procedure,
<a href="../../../../../../org/apache/hadoop/hbase/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a> 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 boolean <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><?> procedure,
+<pre>public boolean <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><?> 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> 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 void <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><?> procedure,
+<pre>public void <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><?> 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> 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 boolean <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><?> procedure)</pre>
+public boolean <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><?> procedure)</pre>
<div class="block"><span class="deprecatedLabel">Deprecated.</span> <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 boolean <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 void <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><?> procedure)</pre>
+public void <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><?> procedure)</pre>
<div class="block"><span class="deprecatedLabel">Deprecated.</span> <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 void <a href="../../../../../../src-html/org/apache/hadoop/hbas
<ul class="blockListLast">
<li class="blockList">
<h4>dumpLocks</h4>
-<pre>public <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a> <a href="../../../../../../src-html/org/apache/hadoop/hbase/master/procedure/MasterProcedureScheduler.html#line.990">dumpLocks</a>()
+<pre>public <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a> <a href="../../../../../../src-html/org/apache/hadoop/hbase/master/procedure/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 <a href="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 <a href="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 int <a href="../../../../../src-html/org/apache/hadoop/hbase/zookeeper/ZKConfig.ZKClusterKey.html#line.293">clientPort</a></pre>
+<pre>private 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 <a href="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 <a href="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> 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> quorumString,
int 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> 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 <a href="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.302">getQuorumString</a>()</pre>
+<pre>public <a href="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.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 int <a href="../../../../../src-html/org/apache/hadoop/hbase/zookeeper/ZKConfig.ZKClusterKey.html#line.306">getClientPort</a>()</pre>
+<pre>public int <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 <a href="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.310">getZnodeParent</a>()</pre>
+<pre>public <a href="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.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 <a href="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 <a href="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 <a href="../../../../../src-html/org/apache/hadoop/hbase/zookeeper/ZKConfig.html#line.44">ZKConfig</a>()</pre>
+<pre>private <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 <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> <a href="../../../../../src-html/org/apache/hadoop/hbase/zookeeper/ZKConfig.html#line.54">makeZKProps</a>(org.apache.hadoop.conf.Configuration conf)</pre>
+<pre>public static <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> <a href="../../../../../src-html/org/apache/hadoop/hbase/zookeeper/ZKConfig.html#line.55">makeZKProps</a>(org.apache.hadoop.conf.Configuration 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 <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> <a href="../../../../../src-html/org/apache/hadoop/hbase/zookeeper/ZKConfig.html#line.66">makeZKPropsFromHbaseConfig</a>(org.apache.hadoop.conf.Configuration conf)</pre>
+<pre>private static <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> <a href="../../../../../src-html/org/apache/hadoop/hbase/zookeeper/ZKConfig.html#line.67">makeZKPropsFromHbaseConfig</a>(org.apache.hadoop.conf.Configuration 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 <a href="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.121">getZKQuorumServersStringFromHbaseConfig</a>(org.apache.hadoop.conf.Configuration conf)</pre>
+<pre>private static <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/zookeeper/ZKConfig.html#line.122">getZKQuorumServersStringFromHbaseConfig</a>(org.apache.hadoop.conf.Configuration 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 <a href="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.135">getZKQuorumServersString</a>(org.apache.hadoop.conf.Configuration conf)</pre>
+<pre>public static <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/zookeeper/ZKConfig.html#line.136">getZKQuorumServersString</a>(org.apache.hadoop.conf.Configuration 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 <a href="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.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>[] serverHosts,
+<pre>public static <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a> <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>[] 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> 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 void <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> key)
+<pre>public static void <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> 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 <a href="../../../../../org/apache/hadoop/hbase/zookeeper/ZKConfig.ZKClusterKey.html" title="class in org.apache.hadoop.hbase.zookeeper">ZKConfig.ZKClusterKey</a> <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> key)
+<pre>public static <a href="../../../../../org/apache/hadoop/hbase/zookeeper/ZKConfig.ZKClusterKey.html" title="class in org.apache.hadoop.hbase.zookeeper">ZKConfig.ZKClusterKey</a> <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> 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 <a href="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.245">getZooKeeperClusterKey</a>(org.apache.hadoop.conf.Configuration conf)</pre>
+<pre>public static <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/zookeeper/ZKConfig.html#line.270">getZooKeeperClusterKey</a>(org.apache.hadoop.conf.Configuration 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 <a href="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.256">getZooKeeperClusterKey</a>(org.apache.hadoop.conf.Configuration conf,
+<pre>public static <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/zookeeper/ZKConfig.html#line.281">getZooKeeperClusterKey</a>(org.apache.hadoop.conf.Configuration 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> 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 <a href="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.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> quorumStringInput,
+<pre>public static <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a> <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> 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> 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 <a href="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.320">getClientZKQuorumServersString</a>(org.apache.hadoop.conf.Configuration conf)</pre>
+<pre>public static <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/zookeeper/ZKConfig.html#line.345">getClientZKQuorumServersString</a>(org.apache.hadoop.conf.Configuration 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<TEnvironment> proc, NonceKey nonceKey) {<a name="line.999"></a>
-<span class="sourceLineNo">1000</span> Preconditions.checkArgument(lastProcId.get() >= 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<TEnvironment> proc, NonceKey nonceKey) {<a name="line.1007"></a>
+<span class="sourceLineNo">1008</span> Preconditions.checkArgument(lastProcId.get() >= 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<TEnvironment>[] procs) {<a name="line.1030"></a>
-<span class="sourceLineNo">1031</span> Preconditions.checkArgument(lastProcId.get() >= 0);<a name="line.1031"></a>
-<span class="sourceLineNo">1032</span> if (procs == null || procs.length <= 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 < 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 < 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<TEnvironment> prepareProcedure(Procedure<TEnvironment> 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<TEnvironment>[] procs) {<a name="line.1038"></a>
+<span class="sourceLineNo">1039</span> Preconditions.checkArgument(lastProcId.get() >= 0);<a name="line.1039"></a>
+<span class="sourceLineNo">1040</span> if (procs == null || procs.length <= 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 < 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 < 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<TEnvironment> 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<TEnvironment> stack = new RootProcedureState<>();<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<TEnvironment> prepareProcedure(Procedure<TEnvironment> 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<TEnvironment> 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<TEnvironment> stack = new RootProcedureState<>();<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<TEnvironment> 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 && 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<TEnvironment> 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 <T extends Procedure<TEnvironment>> T getProcedure(Class<T> clazz, long procId) {<a name="line.1115"></a>
-<span class="sourceLineNo">1116</span> Procedure<TEnvironment> 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<TEnvironment> 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 && 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<TEnvironment> 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<TEnvironment> getResult(long procId) {<a name="line.1123"></a>
-<span class="sourceLineNo">1124</span> CompletedProcedureRetainer<TEnvironment> 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<?> 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<TEnvironment> 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<TEnvironment> getResultOrProcedure(long procId) {<a name="line.1172"></a>
-<span class="sourceLineNo">1173</span> CompletedProcedureRetainer<TEnvironment> 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<TEnvironment> 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<TEnvironment> 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> * <p/><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<Procedure<TEnvironment>> 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 <T extends Procedure<TEnvironment>> T getProcedure(Class<T> clazz, long procId) {<a name="line.1123"></a>
+<span class="sourceLineNo">1124</span> Procedure<TEnvironment> 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<TEnvironment> getResult(long procId) {<a name="line.1131"></a>
+<span class="sourceLineNo">1132</span> CompletedProcedureRetainer<TEnvironment> 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<?> 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<TEnvironment> 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<TEnvironment> getResultOrProcedure(long procId) {<a name="line.1180"></a>
+<span class="sourceLineNo">1181</span> CompletedProcedureRetainer<TEnvironment> 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<TEnvironment> 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<TEnvironment> 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> * <p/><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<Procedure<TEnvironment>> getProcedures() {<a name="line.1222"></a>
-<span class="sourceLineNo">1223</span> List<Procedure<TEnvironment>> procedureList =<a name="line.1223"></a>
-<span class="sourceLineNo">1224</span> new ArrayList<>(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 < 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 >= 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 >= 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<Long> 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<TEnvironment> 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<TEnvironment> 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<TEnvironment> 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<Procedure<TEnvironment>> 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<Procedure<TEnvironment>> getProcedures() {<a name="line.1230"></a>
+<span class="sourceLineNo">1231</span> List<Procedure<TEnvironment>> procedureList =<a name="line.1231"></a>
+<span class="sourceLineNo">1232</span> new ArrayList<>(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 < 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 >= 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 >= 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<Long> 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<TEnvironment> 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<TEnvironment> 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<TEnvironment> 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<TEnvironment> 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<TEnvironment> 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<TEnvironment> procStack) {<a name="line.1437"></a>
-<span class="sourceLineNo">1438</span> Procedure<TEnvironment> 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 long <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><<a href="../../../../../org/apache/hadoop/hbase/procedure2/ProcedureExecutor.html" title="type parameter in ProcedureExecutor">TEnvironment</a>> proc,
+<pre>public long <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><<a href="../../../../../org/apache/hadoop/hbase/procedure2/ProcedureExecutor.html" title="type parameter in ProcedureExecutor">TEnvironment</a>> proc,
<a href="../../../../../org/apache/hadoop/hbase/util/NonceKey.html" title="class in org.apache.hadoop.hbase.util">NonceKey</a> 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 void <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><<a href="../../../../../org/apache/hadoop/hbase/procedure2/ProcedureExecutor.html" title="type parameter in ProcedureExecutor">TEnvironment</a>>[] procs)</pre>
+<pre>public void <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><<a href="../../../../../org/apache/hadoop/hbase/procedure2/ProcedureExecutor.html" title="type parameter in ProcedureExecutor">TEnvironment</a>>[] 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 <a href="../../../../../org/apache/hadoop/hbase/procedure2/Procedure.html" title="class in org.apache.hadoop.hbase.procedure2">Procedure</a><<a href="../../../../../org/apache/hadoop/hbase/procedure2/ProcedureExecutor.html" title="type parameter in ProcedureExecutor">TEnvironment</a>> <a href="../../../../../src-html/org/apache/hadoop/hbase/procedure2/ProcedureExecutor.html#line.1053">prepareProcedure</a>(<a href="../../../../../org/apache/hadoop/hbase/procedure2/Procedure.html" title="class in org.apache.hadoop.hbase.procedure2">Procedure</a><<a href="../../../../../org/apache/hadoop/hbase/procedure2/ProcedureExecutor.html" title="type parameter in ProcedureExecutor">TEnvironment</a>> proc)</pre>
+<pre>private <a href="../../../../../org/apache/hadoop/hbase/procedure2/Procedure.html" title="class in org.apache.hadoop.hbase.procedure2">Procedure</a><<a href="../../../../../org/apache/hadoop/hbase/procedure2/ProcedureExecutor.html" title="type parameter in ProcedureExecutor">TEnvironment</a>> <a href="../../../../../src-html/org/apache/hadoop/hbase/procedure2/ProcedureExecutor.html#line.1061">prepareProcedure</a>(<a href="../../../../../org/apache/hadoop/hbase/procedure2/Procedure.html" title="class in org.apache.hadoop.hbase.procedure2">Procedure</a><<a href="../../../../../org/apache/hadoop/hbase/procedure2/ProcedureExecutor.html" title="type parameter in ProcedureExecutor">TEnvironment</a>> 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 long <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><<a href="../../../../../org/apache/hadoop/hbase/procedure2/ProcedureExecutor.html" title="type parameter in ProcedureExecutor">TEnvironment</a>> proc)</pre>
+<pre>private long <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><<a href="../../../../../org/apache/hadoop/hbase/procedure2/ProcedureExecutor.html" title="type parameter in ProcedureExecutor">TEnvironment</a>> 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 boolean <a href="../../../../../src-html/org/apache/hadoop/hbase/procedure2/ProcedureExecutor.html#line.1086">abort</a>(long procId)</pre>
+<pre>public boolean <a href="../../../../../src-html/org/apache/hadoop/hbase/procedure2/ProcedureExecutor.html#line.1094">abort</a>(long 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 boolean <a href="../../../../../src-html/org/apache/hadoop/hbase/procedure2/ProcedureExecutor.html#line.1097">abort</a>(long procId,
+<pre>public boolean <a href="../../../../../src-html/org/apache/hadoop/hbase/procedure2/ProcedureExecutor.html#line.1105">abort</a>(long procId,
boolean 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 <a href="../../../../../org/apache/hadoop/hbase/procedure2/Procedure.html" title="class in org.apache.hadoop.hbase.procedure2">Procedure</a><<a href="../../../../../org/apache/hadoop/hbase/procedure2/ProcedureExecutor.html" title="type parameter in ProcedureExecutor">TEnvironment</a>> <a href="../../../../../src-html/org/apache/hadoop/hbase/procedure2/ProcedureExecutor.html#line.1111">getProcedure</a>(long procId)</pre>
+<pre>public <a href="../../../../../org/apache/hadoop/hbase/procedure2/Procedure.html" title="class in org.apache.hadoop.hbase.procedure2">Procedure</a><<a href="../../../../../org/apache/hadoop/hbase/procedure2/ProcedureExecutor.html" title="type parameter in ProcedureExecutor">TEnvironment</a>> <a href="../../../../../src-html/org/apache/hadoop/hbase/procedure2/ProcedureExecutor.html#line.1119">getProcedure</a>(long 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 <T extends <a href="../../../../../org/apache/hadoop/hbase/procedure2/Procedure.html" title="class in org.apache.hadoop.hbase.procedure2">Procedure</a><<a href="../../../../../org/apache/hadoop/hbase/procedure2/ProcedureExecutor.html" title="type parameter in ProcedureExecutor">TEnvironment</a>>> T <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><T> clazz,
+<pre>public <T extends <a href="../../../../../org/apache/hadoop/hbase/procedure2/Procedure.html" title="class in org.apache.hadoop.hbase.procedure2">Procedure</a><<a href="../../../../../org/apache/hadoop/hbase/procedure2/ProcedureExecutor.html" title="type parameter in ProcedureExecutor">TEnvironment</a>>> T <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><T> clazz,
long 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 <a href="../../../../../org/apache/hadoop/hbase/procedure2/Procedure.html" title="class in org.apache.hadoop.hbase.procedure2">Procedure</a><<a href="../../../../../org/apache/hadoop/hbase/procedure2/ProcedureExecutor.html" title="type parameter in ProcedureExecutor">TEnvironment</a>> <a href="../../../../../src-html/org/apache/hadoop/hbase/procedure2/ProcedureExecutor.html#line.1123">getResult</a>(long procId)</pre>
+<pre>public <a href="../../../../../org/apache/hadoop/hbase/procedure2/Procedure.html" title="class in org.apache.hadoop.hbase.procedure2">Procedure</a><<a href="../../../../../org/apache/hadoop/hbase/procedure2/ProcedureExecutor.html" title="type parameter in ProcedureExecutor">TEnvironment</a>> <a href="../../../../../src-html/org/apache/hadoop/hbase/procedure2/ProcedureExecutor.html#line.1131">getResult</a>(long 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 boolean <a href="../../../../../src-html/org/apache/hadoop/hbase/procedure2/ProcedureExecutor.html#line.1139">isFinished</a>(long procId)</pre>
+<pre>public boolean <a href="../../../../../src-html/org/apache/hadoop/hbase/procedure2/ProcedureExecutor.html#line.1147">isFinished</a>(long 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 boolean <a href="../../../../../src-html/org/apache/hadoop/hbase/procedure2/ProcedureExecutor.html#line.1148">isStarted</a>(long procId)</pre>
+<pre>public boolean <a href="../../../../../src-html/org/apache/hadoop/hbase/procedure2/ProcedureExecutor.html#line.1156">isStarted</a>(long 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 void <a href="../../../../../src-html/org/apache/hadoop/hbase/procedure2/ProcedureExecutor.html#line.1160">removeResult</a>(long procId)</pre>
+<pre>public void <a href="../../../../../src-html/org/apache/hadoop/hbase/procedure2/ProcedureExecutor.html#line.1168">removeResult</a>(long 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 <a href="../../../../../org/apache/hadoop/hbase/procedure2/Procedure.html" title="class in org.apache.hadoop.hbase.procedure2">Procedure</a><<a href="../../../../../org/apache/hadoop/hbase/procedure2/ProcedureExecutor.html" title="type parameter in ProcedureExecutor">TEnvironment</a>> <a href="../../../../../src-html/org/apache/hadoop/hbase/procedure2/ProcedureExecutor.html#line.1172">getResultOrProcedure</a>(long procId)</pre>
+<pre>public <a href="../../../../../org/apache/hadoop/hbase/procedure2/Procedure.html" title="class in org.apache.hadoop.hbase.procedure2">Procedure</a><<a href="../../../../../org/apache/hadoop/hbase/procedure2/ProcedureExecutor.html" title="type parameter in ProcedureExecutor">TEnvironment</a>> <a href="../../../../../src-html/org/apache/hadoop/hbase/procedure2/ProcedureExecutor.html#line.1180">getResultOrProcedure</a>(long 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 boolean <a href="../../../../../src-html/org/apache/hadoop/hbase/procedure2/ProcedureExecutor.html#line.1188">isProcedureOwner</a>(long procId,
+<pre>public boolean <a href="../../../../../src-html/org/apache/hadoop/hbase/procedure2/ProcedureExecutor.html#line.1196">isProcedureOwner</a>(long procId,
<a href="../../../../../org/apache/hadoop/hbase/security/User.html" title="class in org.apache.hadoop.hbase.security">User</a> 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 <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><<a href="../../../../../org/apache/hadoop/hbase/procedure2/Procedure.html" title="class in org.apache.hadoop.hbase.procedure2">Procedure</a><<a href="../../../../../org/apache/hadoop/hbase/procedure2/ProcedureExecutor.html" title="type parameter in ProcedureExecutor">TEnvironment</a>>> <a href="../../../../../src-html/org/apache/hadoop/hbase/procedure2/ProcedureExecutor.html#line.1214">getActiveProceduresNoCopy</a>()</pre>
+<pre>public <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><<a href="../../../../../org/apache/hadoop/hbase/procedure2/Procedure.html" title="class in org.apache.hadoop.hbase.procedure2">Procedure</a><<a href="../../../../../org/apache/hadoop/hbase/procedure2/ProcedureExecutor.html" title="type parameter in ProcedureExecutor">TEnvironment</a>>> <a href="../../../../../src-html/org/apache/hadoop/hbase/procedure2/ProcedureExecutor.html#line.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 <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><<a href="../../../../../org/apache/hadoop/hbase/procedure2/Procedure.html" title="class in org.apache.hadoop.hbase.procedure2">Procedure</a><<a href="../../../../../org/apache/hadoop/hbase/procedure2/ProcedureExecutor.html" title="type parameter in ProcedureExecutor">TEnvironment</a>>> <a href="../../../../../src-html/org/apache/hadoop/hbase/procedure2/ProcedureExecutor.html#line.1222">getProcedures</a>()</pre>
+<pre>public <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><<a href="../../../../../org/apache/hadoop/hbase/procedure2/Procedure.html" title="class in org.apache.hadoop.hbase.procedure2">Procedure</a><<a href="../../../../../org/apache/hadoop/hbase/procedure2/ProcedureExecutor.html" title="type parameter in ProcedureExecutor">TEnvironment</a>>> <a href="../../../../../src-html/org/apache/hadoop/hbase/procedure2/ProcedureExecutor.html#line.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 void <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> listener)</pre>
+<pre>public void <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> 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 boolean <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> listener)</pre>
+<pre>public boolean <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> 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 void <a href="../../../../../src-html/org/apache/hadoop/hbase/procedure2/ProcedureExecutor.html#line.1246">sendProcedureLoadedNotification</a>(long procId)</pre>
+<pre>private void <a href="../../../../../src-html/org/apache/hadoop/hbase/procedure2/ProcedureExecutor.html#line.1254">sendProcedureLoadedNotification</a>(long 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 void <a href="../../../../../src-html/org/apache/hadoop/hbase/procedure2/ProcedureExecutor.html#line.1258">sendProcedureAddedNotification</a>(long procId)</pre>
+<pre>private void <a href="../../../../../src-html/org/apache/hadoop/hbase/procedure2/ProcedureExecutor.html#line.1266">sendProcedureAddedNotification</a>(long 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 void <a href="../../../../../src-html/org/apache/hadoop/hbase/procedure2/ProcedureExecutor.html#line.1270">sendProcedureFinishedNotification</a>(long procId)</pre>
+<pre>private void <a href="../../../../../src-html/org/apache/hadoop/hbase/procedure2/ProcedureExecutor.html#line.1278">sendProcedureFinishedNotification</a>(long 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 long <a href="../../../../../src-html/org/apache/hadoop/hbase/procedure2/ProcedureExecutor.html#line.1285">nextProcId</a>()</pre>
+<pre>private long <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 long <a href="../../../../../src-html/org/apache/hadoop/hbase/procedure2/ProcedureExecutor.html#line.1302">getLastProcId</a>()</pre>
+<pre>protected long <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 <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><<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="../../../../../src-html/org/apache/hadoop/hbase/procedure2/ProcedureExecutor.html#line.1307">getActiveProcIds</a>()</pre>
+<pre>public <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><<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="../../../../../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> <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><<a href="../../../../../org/apache/hadoop/hbase/procedure2/ProcedureExecutor.html" title="type parameter in ProcedureExecutor">TEnvironment</a>> 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> <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><<a href="../../../../../org/apache/hadoop/hbase/procedure2/ProcedureExecutor.html" title="type parameter in ProcedureExecutor">TEnvironment</a>> 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 void <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><<a href="../../../../../org/apache/hadoop/hbase/procedure2/ProcedureExecutor.html" title="type parameter in ProcedureExecutor">TEnvironment</a>> proc)</pre>
+<pre>private void <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><<a href="../../../../../org/apache/hadoop/hbase/procedure2/ProcedureExecutor.html" title="type parameter in ProcedureExecutor">TEnvironment</a>> 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 <a href="../../../../../org/apache/hadoop/hbase/procedure2/Procedure.LockState.html" title="enum in org.apache.hadoop.hbase.procedure2">Procedure.LockState</a> <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><<a href="../../../../../org/apache/hadoop/hbase/procedure2/ProcedureExecutor.html" title="type parameter in ProcedureExecutor">TEnvironment</a>> proc)</pre>
+<pre>private <a href="../../../../../org/apache/hadoop/hbase/procedure2/Procedure.LockState.html" title="enum in org.apache.hadoop.hbase.procedure2">Procedure.LockState</a> <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><<a href="../../../../../org/apache/hadoop/hbase/procedure2/ProcedureExecutor.html" title="type parameter in ProcedureExecutor">TEnvironment</a>> 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 void <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><<a href="../../../../../org/apache/hadoop/hbase/procedure2/ProcedureExecutor.html" title="type parameter in ProcedureExecutor">TEnvironment</a>> proc,
+<pre>private void <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><<a href="../../../../../org/apache/hadoop/hbase/procedure2/ProcedureExecutor.html" title="type parameter in ProcedureExecutor">TEnvironment</a>> proc,
boolean 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 <a href="../../../../../org/apache/hadoop/hbase/procedure2/Procedure.LockState.html" title="enum in org.apache.hadoop.hbase.procedure2">Procedure.LockState</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/procedure2/ProcedureExecutor.html#line.1437">executeRollback</a>(long rootProcId,
+<pre>private <a href="../../../../../org/apache/hadoop/hbase/procedure2/Procedure.LockState.html" title="enum in org.apache.hadoop.hbase.procedure2">Procedure.LockState</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/procedure2/ProcedureExecutor.html#line.1445">executeRollback</a>(long rootProcId,
<a href="../../../../../org/apache/hadoop/hbase/procedure2/RootProcedureState.html" title="class in org.apache.hadoop.hbase.procedure2">RootProcedureState</a><<a href="../../../../../org/apache/hadoop/hbase/procedure2/ProcedureExecutor.html" title="type parameter in ProcedureExecutor">TEnvironment</a>> 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 void <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><<a href="../../../../../org/apache/hadoop/hbase/procedure2/ProcedureExecutor.html" title="type parameter in ProcedureExecutor">TEnvironment</a>> proc)</pre>
+<pre>private void <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><<a href="../../../../../org/apache/hadoop/hbase/procedure2/ProcedureExecutor.html" title="type parameter in ProcedureExecutor">TEnvironment</a>> 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 <a href="../../../../../org/apache/hadoop/hbase/procedure2/Procedure.LockState.html" title="enum in org.apache.hadoop.hbase.procedure2">Procedure.LockState</a> <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><<a href="../../../../../org/apache/hadoop/hbase/procedure2/ProcedureExecutor.html" title="type parameter in ProcedureExecutor">TEnvironment</a>> proc)</pre>
+<pre>private <a href="../../../../../org/apache/hadoop/hbase/procedure2/Procedure.LockState.html" title="enum in org.apache.hadoop.hbase.procedure2">Procedure.LockState</a> <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><<a href="../../../../../org/apache/hadoop/hbase/procedure2/ProcedureExecutor.html" title="type parameter in ProcedureExecutor">TEnvironment</a>> 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 void <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><<a href="../../../../../org/apache/hadoop/hbase/procedure2/ProcedureExecutor.html" title="type parameter in ProcedureExecutor">TEnvironment</a>> proc)</pre>
+<pre>private void <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><<a href="../../../../../org/apache/hadoop/hbase/procedure2/ProcedureExecutor.html" title="type parameter in ProcedureExecutor">TEnvironment</a>> 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 void <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><<a href="../../../../../org/apache/hadoop/hbase/procedure2/ProcedureExecutor.html" title="type parameter in ProcedureExecutor">TEnvironment</a>> procStack,
+<pre>private void <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><<a href="../../../../../org/apache/hadoop/hbase/procedure2/ProcedureExecutor.html" title="type parameter in ProcedureExecutor">TEnvironment</a>> procStack,
<a href="../../../../../org/apache/hadoop/hbase/procedure2/Procedure.html" title="class in org.apache.hadoop.hbase.procedure2">Procedure</a><<a href="../../../../../org/apache/hadoop/hbase/procedure2/ProcedureExecutor.html" title="type parameter in ProcedureExecutor">TEnvironment</a>> 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 void <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> msg)</pre>
+<pre>private void <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> 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 <a href="../../../../../org/apache/hadoop/hbase/procedure2/Procedure.html" title="class in org.apache.hadoop.hbase.procedure2">Procedure</a><<a href="../../../../../org/apache/hadoop/hbase/procedure2/ProcedureExecutor.html" title="type parameter in ProcedureExecutor">TEnvironment</a>>[] <a href="../../../../../src-html/org/apache/hadoop/hbase/procedure2/ProcedureExecutor.html#line.1752">initializeChildren</a>(<a href="../../../../../org/apache/hadoop/hbase/procedure2/RootProcedureState.html" title="class in org.apache.hadoop.hbase.procedure2">RootProcedureState</a><<a href="../../../../../org/apache/hadoop/hbase/procedure2/ProcedureExecutor.html" title="type parameter in ProcedureExecutor">TEnvironment</a>> procStack,
+<pre>private <a href="../../../../../org/apache/hadoop/hbase/procedure2/Procedure.html" title="class in org.apache.hadoop.hbase.procedure2">Procedure</a><<a href="../../../../../org/apache/hadoop/hbase/procedure2/ProcedureExecutor.html" title="type parameter in ProcedureExecutor">TEnvironment</a>>[] <a href="../../../../../src-html/org/apache/hadoop/hbase/procedure2/ProcedureExecutor.html#line.1760">initializeChildren</a>(<a href="../../../../../org/apache/hadoop/hbase/procedure2/RootProcedureState.html" title="class in org.apache.hadoop.hbase.procedure2">RootProcedureState</a><<a href="../../../../../org/apache/hadoop/hbase/procedure2/ProcedureExecutor.html" title="type parameter in ProcedureExecutor">TEnvironment</a>> procStack,
<a href="../../../../../org/apache/hadoop/hbase/procedure2/Procedure.html" title="class in org.apache.hadoop.hbase.procedure2">Procedure</a><<a href="../../../../../org/apache/hadoop/hbase/procedure2/ProcedureExecutor.html" title="type parameter in ProcedureExecutor">TEnvironment</a>> procedure,
<a href="../../../../../org/apache/hadoop/hbase/procedure2/Procedure.html" title="class in org.apache.hadoop.hbase.procedure2">Procedure</a><<a href="../../../../../org/apache/hadoop/hbase/procedure2/ProcedureExecutor.html" title="type parameter in ProcedureExecutor">TEnvironment</a>>[] 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 void <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><<a href="../../../../../org/apache/hadoop/hbase/procedure2/ProcedureExecutor.html" title="type parameter in ProcedureExecutor">TEnvironment</a>>[] subprocs)</pre>
+<pre>private void <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><<a href="../../../../../org/apache/hadoop/hbase/procedure2/ProcedureExecutor.html" title="type parameter in ProcedureExecutor">TEnvironment</a>>[] 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 void <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><<a href="../../../../../org/apache/hadoop/hbase/procedure2/ProcedureExecutor.html" title="type parameter in ProcedureExecutor">TEnvironment</a>> procStack,
+<pre>private void <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><<a href="../../../../../org/apache/hadoop/hbase/procedure2/ProcedureExecutor.html" title="type parameter in ProcedureExecutor">TEnvironment</a>> procStack,
<a href="../../../../../org/apache/hadoop/hbase/procedure2/Procedure.html" title="class in org.apache.hadoop.hbase.procedure2">Procedure</a><<a href="../../../../../org/apache/hadoop/hbase/procedure2/ProcedureExecutor.html" title="type parameter in ProcedureExecutor">TEnvironment</a>> 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 void <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><<a href="../../../../../org/apache/hadoop/hbase/procedure2/ProcedureExecutor.html" title="type parameter in ProcedureExecutor">TEnvironment</a>> procStack,
+<pre>private void <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><<a href="../../../../../org/apache/hadoop/hbase/procedure2/ProcedureExecutor.html" title="type parameter in ProcedureExecutor">TEnvironment</a>> procStack,
<a href="../../../../../org/apache/hadoop/hbase/procedure2/Procedure.html" title="class in org.apache.hadoop.hbase.procedure2">Procedure</a><<a href="../../../../../org/apache/hadoop/hbase/procedure2/ProcedureExecutor.html" title="type parameter in ProcedureExecutor">TEnvironment</a>> procedure,
<a href="../../../../../org/apache/hadoop/hbase/procedure2/Procedure.html" title="class in org.apache.hadoop.hbase.procedure2">Procedure</a><<a href="../../../../../org/apache/hadoop/hbase/procedure2/ProcedureExecutor.html" title="type parameter in ProcedureExecutor">TEnvironment</a>>[] 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 void <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><<a href="../../../../../org/apache/hadoop/hbase/procedure2/ProcedureExecutor.html" title="type parameter in ProcedureExecutor">TEnvironment</a>> proc,
+<pre>private void <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><<a href="../../../../../org/apache/hadoop/hbase/procedure2/ProcedureExecutor.html" title="type parameter in ProcedureExecutor">TEnvironment</a>> 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> 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 void <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><<a href="../../../../../org/apache/hadoop/hbase/procedure2/ProcedureExecutor.html" title="type parameter in ProcedureExecutor">TEnvironment</a>> proc)</pre>
+<pre>private void <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><<a href="../../../../../org/apache/hadoop/hbase/procedure2/ProcedureExecutor.html" title="type parameter in ProcedureExecutor">TEnvironment</a>> 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 void <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><<a href="../../../../../org/apache/hadoop/hbase/procedure2/ProcedureExecutor.html" title="type parameter in ProcedureExecutor">TEnvironment</a>> proc)</pre>
+<pre>private void <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><<a href="../../../../../org/apache/hadoop/hbase/procedure2/ProcedureExecutor.html" title="type parameter in ProcedureExecutor">TEnvironment</a>> 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><<a href="../../../../../org/apache/hadoop/hbase/procedure2/ProcedureExecutor.html" title="type parameter in ProcedureExecutor">TEnvironment</a>> <a href="../../../../../src-html/org/apache/hadoop/hbase/procedure2/ProcedureExecutor.html#line.1896">getProcStack</a>(long rootProcId)</pre>
+<pre><a href="../../../../../org/apache/hadoop/hbase/procedure2/RootProcedureState.html" title="class in org.apache.hadoop.hbase.procedure2">RootProcedureState</a><<a href="../../../../../org/apache/hadoop/hbase/procedure2/ProcedureExecutor.html" title="type parameter in ProcedureExecutor">TEnvironment</a>> <a href="../../../../../src-html/org/apache/hadoop/hbase/procedure2/ProcedureExecutor.html#line.1904">getProcStack</a>(long 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> <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> <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 <a href="../../../../../src-html/org/apache/hadoop/hbase/procedure2/ProcedureExecutor.html#line.1906">getCompletedSize</a>()</pre>
+<pre>int <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><<a href="../../../../../org/apache/hadoop/hbase/procedure2/TimeoutExecutorThread.html" title="type parameter in TimeoutExecutorThread">TEnvironment</a>> chore)</code> </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><<a href="../../../../../org/apache/hadoop/hbase/procedure2/TimeoutExecutorThread.html" title="type parameter in TimeoutExecutorThread">TEnvironment</a>> proc)</code> </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 void <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><<a href="../../../../../org/apache/hadoop/hbase/procedure2/TimeoutExecutorThread.html" title="type parameter in TimeoutExecutorThread">TEnvironment</a>> proc)</pre>
+<pre>protected void <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><<a href="../../../../../org/apache/hadoop/hbase/procedure2/TimeoutExecutorThread.html" title="type parameter in TimeoutExecutorThread">TEnvironment</a>> 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><<a href="../../../../../../org/apache/hadoop/hbase/procedure2/TimeoutExecutorThread.html" title="type parameter in TimeoutExecutorThread">TEnvironment</a>> proc)</code> </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><E> (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><T>, 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><E> (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><T>, 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><E> (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><T>, 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><E> (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><T>, 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><E> (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><T>, 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><E> (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><T>, 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><E> (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><T>, 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><E> (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><T>, 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><E> (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><T>, 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><T>)</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><T>)</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><T>)</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<TestProcEnv> 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() > 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<>(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, () -> proc.isSuccess() && 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, () -> proc.isSuccess() && 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, () -> procExecutor.getProcedures().stream()<a name="line.114"></a>
-<span class="sourceLineNo">115</span> .filter(p -> p.getParentProcId() == rootId).collect(Collectors.toList())<a name="line.115"></a>
-<span class="sourceLineNo">116</span> .size() > 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 -> 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, () -> proc.isSuccess() && 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, () -> proc.isSuccess() && 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, () -> procExecutor.getProcedures().stream()<a name="line.142"></a>
-<span class="sourceLineNo">143</span> .filter(p -> p.getParentProcId() == rootId).collect(Collectors.toList())<a name="line.143"></a>
-<span class="sourceLineNo">144</span> .size() > 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 -> 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, () -> proc.isSuccess() && 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<TestProcEnv> {<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<TestProcEnv> 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() > 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<>(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, () -> proc.isSuccess() && 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, () -> proc.isSuccess() && 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, () -> procExecutor.getProcedures().stream()<a name="line.115"></a>
+<span class="sourceLineNo">116</span> .filter(p -> p.getParentProcId() == rootId).collect(Collectors.toList())<a name="line.116"></a>
+<span class="sourceLineNo">117</span> .size() > 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 -> 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, () -> proc.isSuccess() && 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, () -> proc.isSuccess() && 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, () -> procExecutor.getProcedures().stream()<a name="line.143"></a>
+<span class="sourceLineNo">144</span> .filter(p -> p.getParentProcId() == rootId).collect(Collectors.toList())<a name="line.144"></a>
+<span class="sourceLineNo">145</span> .size() > 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 -> 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, () -> proc.isSuccess() && 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, () -> proc.isSuccess() && 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<TestProcEnv> {<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<TestProcEnv> {<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<TestProcEnv> {<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<TestProcEnv> {<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<TestProcEnv> {<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<TestProcEnv, StuckStateMachineState> {<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<TestProcEnv> {<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<TestProcEnv, StuckStateMachineState> {<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<String, String> 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 < 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 < 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 > 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> * <ol><a name="line.167"></a>
-<span class="sourceLineNo">168</span> * <li>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)</li><a name="line.169"></a>
-<span class="sourceLineNo">170</span> * <li>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)</li><a name="line.171"></a>
-<span class="sourceLineNo">172</span> * <li>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)</li><a name="line.173"></a>
-<span class="sourceLineNo">174</span> * </ol><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 > 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<String, String> 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 < 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 < 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 < 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 > 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> * <ol><a name="line.192"></a>
+<span class="sourceLineNo">193</span> * <li>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)</li><a name="line.194"></a>
+<span class="sourceLineNo">195</span> * <li>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)</li><a name="line.196"></a>
+<span class="sourceLineNo">197</span> * <li>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)</li><a name="line.198"></a>
+<span class="sourceLineNo">199</span> * </ol><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 > 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 && !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 && !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 – 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 –
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 – 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 – 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 – 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 – 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 – 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 –
Apache HBase (TM) Metrics
@@ -469,7 +469,7 @@ export HBASE_REGIONSERVER_OPTS="$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 –
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 – 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 – 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 – 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 – 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 – 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 – 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 –
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 –
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 – 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 – 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 – 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 – 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<TestProcEnv> 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() > 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<>(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, () -> proc.isSuccess() && 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, () -> proc.isSuccess() && 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, () -> procExecutor.getProcedures().stream()<a name="line.114"></a>
-<span class="sourceLineNo">115</span> .filter(p -> p.getParentProcId() == rootId).collect(Collectors.toList())<a name="line.115"></a>
-<span class="sourceLineNo">116</span> .size() > 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 -> 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, () -> proc.isSuccess() && 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, () -> proc.isSuccess() && 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, () -> procExecutor.getProcedures().stream()<a name="line.142"></a>
-<span class="sourceLineNo">143</span> .filter(p -> p.getParentProcId() == rootId).collect(Collectors.toList())<a name="line.143"></a>
-<span class="sourceLineNo">144</span> .size() > 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 -> 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, () -> proc.isSuccess() && 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<TestProcEnv> {<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<TestProcEnv> 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() > 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<>(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, () -> proc.isSuccess() && 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, () -> proc.isSuccess() && 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, () -> procExecutor.getProcedures().stream()<a name="line.115"></a>
+<span class="sourceLineNo">116</span> .filter(p -> p.getParentProcId() == rootId).collect(Collectors.toList())<a name="line.116"></a>
+<span class="sourceLineNo">117</span> .size() > 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 -> 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, () -> proc.isSuccess() && 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, () -> proc.isSuccess() && 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, () -> procExecutor.getProcedures().stream()<a name="line.143"></a>
+<span class="sourceLineNo">144</span> .filter(p -> p.getParentProcId() == rootId).collect(Collectors.toList())<a name="line.144"></a>
+<span class="sourceLineNo">145</span> .size() > 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 -> 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, () -> proc.isSuccess() && 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, () -> proc.isSuccess() && 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<TestProcEnv> {<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<TestProcEnv> {<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<TestProcEnv> {<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<TestProcEnv> {<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<TestProcEnv> {<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<TestProcEnv, StuckStateMachineState> {<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<TestProcEnv> {<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<TestProcEnv, StuckStateMachineState> {<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<TestProcEnv> 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() > 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<>(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, () -> proc.isSuccess() && 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, () -> proc.isSuccess() && 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, () -> procExecutor.getProcedures().stream()<a name="line.115"></a>
+<span class="sourceLineNo">116</span> .filter(p -> p.getParentProcId() == rootId).collect(Collectors.toList())<a name="line.116"></a>
+<span class="sourceLineNo">117</span> .size() > 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 -> 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, () -> proc.isSuccess() && 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, () -> proc.isSuccess() && 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, () -> procExecutor.getProcedures().stream()<a name="line.143"></a>
+<span class="sourceLineNo">144</span> .filter(p -> p.getParentProcId() == rootId).collect(Collectors.toList())<a name="line.144"></a>
+<span class="sourceLineNo">145</span> .size() > 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 -> 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, () -> proc.isSuccess() && 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, () -> proc.isSuccess() && 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<TestProcEnv> {<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<TestProcEnv> {<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<TestProcEnv> {<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<TestProcEnv> {<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<TestProcEnv, StuckStateMachineState> {<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 – 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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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><E> (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><T>, 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><E> (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><T>, 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><E> (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><T>, 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<TEnvironment> (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><T>)
+<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><V>, 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><V>, org.apache.hadoop.hbase.errorhandling.ForeignExceptionListener)
+<li type="circle">org.apache.hadoop.hbase.procedure2.Procedure<TEnvironment> (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><T>)
<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><<a href="../../../../../org/apache/hadoop/hbase/procedure2/TestProcedureBypass.TestProcEnv.html" title="class in org.apache.hadoop.hbase.procedure2">TestProcedureBypass.TestProcEnv</a>></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 boolean <a href="../../../../../src-html/org/apache/hadoop/hbase/procedure2/TestProcedureBypass.RootProcedure.html#line.193">childSpwaned</a></pre>
+<pre>private 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 <a href="../../../../../src-html/org/apache/hadoop/hbase/procedure2/TestProcedureBypass.RootProcedure.html#line.195">RootProcedure</a>()</pre>
+<pre>public <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 org.apache.hadoop.hbase.procedure2.Procedure[] <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> env)
+<pre>protected org.apache.hadoop.hbase.procedure2.Procedure[] <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> 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><<a href="../../../../../org/apache/hadoop/hbase/procedure2/TestProcedureBypass.TestProcEnv.html" title="class in org.apache.hadoop.hbase.procedure2">TestProcedureBypass.TestProcEnv</a>></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 <a href="../../../../../src-html/org/apache/hadoop/hbase/procedure2/TestProcedureBypass.StuckProcedure.html#line.175">StuckProcedure</a>()</pre>
+<pre>public <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 org.apache.hadoop.hbase.procedure2.Procedure[] <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> env)</pre>
+<pre>protected org.apache.hadoop.hbase.procedure2.Procedure[] <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> 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> in class <code><a href="../../../../../org/apache/hadoop/hbase/procedure2/ProcedureTestingUtility.NoopProcedure.html" title="class in org.apache.hadoop.hbase.procedure2">ProcedureTestingUtility.NoopProcedure</a><<a href="../../../../../org/apache/hadoop/hbase/procedure2/TestProcedureBypass.TestProcEnv.html" title="class in org.apache.hadoop.hbase.procedure2">TestProcedureBypass.TestProcEnv</a>></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><<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>></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 <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 <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 <a href="../../../../../src-html/org/apache/hadoop/hbase/procedure2/TestProcedureBypass.StuckStateMachineProcedure.html#line.220">StuckStateMachineProcedure</a>()</pre>
+<pre>public <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 <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> env,
+<pre>public <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> env,
<a href="../../../../../org/apache/hadoop/hbase/procedure2/TestProcedureBypass.StuckStateMachineState.html" title="enum in org.apache.hadoop.hbase.procedure2">TestProcedureBypass.StuckStateMachineState</a> 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 org.apache.hadoop.hbase.procedure2.StateMachineProcedure.Flow <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> env,
+<pre>protected org.apache.hadoop.hbase.procedure2.StateMachineProcedure.Flow <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> env,
<a href="../../../../../org/apache/hadoop/hbase/procedure2/TestProcedureBypass.StuckStateMachineState.html" title="enum in org.apache.hadoop.hbase.procedure2">TestProcedureBypass.StuckStateMachineState</a> 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 <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.StuckStateMachineProcedure.html#line.249">getState</a>(int stateId)</pre>
+<pre>protected <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.StuckStateMachineProcedure.html#line.285">getState</a>(int 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> in class <code><a href="../../../../../org/apache/hadoop/hbase/procedure2/ProcedureTestingUtility.NoopStateMachineProcedure.html" title="class in org.apache.hadoop.hbase.procedure2">ProcedureTestingUtility.NoopStateMachineProcedure</a><<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>></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 int <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> tState)</pre>
+<pre>protected int <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> 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> in class <code><a href="../../../../../org/apache/hadoop/hbase/procedure2/ProcedureTestingUtility.NoopStateMachineProcedure.html" title="class in org.apache.hadoop.hbase.procedure2">ProcedureTestingUtility.NoopStateMachineProcedure</a><<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>></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><<a href="../../../../../org/apache/hadoop/hbase/procedure2/TestProcedureBypass.StuckStateMachineState.html" title="enum in org.apache.hadoop.hbase.procedure2">TestProcedureBypass.StuckStateMachineState</a>></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 <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 <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 <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 <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 <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 <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 <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.212">values</a>()</pre>
+<pre>public static <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.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 <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.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> name)</pre>
+<pre>public static <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.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> 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><<a href="../../../../../org/apache/hadoop/hbase/procedure2/TestProcedureBypass.TestProcEnv.html" title="class in org.apache.hadoop.hbase.procedure2">TestProcedureBypass.TestProcEnv</a>></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 <a href="../../../../../src-html/org/apache/hadoop/hbase/procedure2/TestProcedureBypass.SuspendProcedure.html#line.161">SuspendProcedure</a>()</pre>
+<pre>public <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 org.apache.hadoop.hbase.procedure2.Procedure[] <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> env)
+<pre>protected org.apache.hadoop.hbase.procedure2.Procedure[] <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> 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 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 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 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 <a href="../../../../../src-html/org/apache/hadoop/hbase/procedure2/TestProcedureBypass.TestProcEnv.html#line.64">TestProcEnv</a>()</pre>
+<pre>private <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 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 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 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 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 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 Frames</a></li>
+</ul>
+<ul class="navList" id="allclasses_navbar_top">
+<li><a href="../../../../../allclasses-noframe.html">All 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: </li>
+<li><a href="#nested.classes.inherited.from.class.org.apache.hadoop.hbase.procedure2.Procedure">Nested</a> | </li>
+<li><a href="#fields.inherited.from.class.org.apache.hadoop.hbase.procedure2.Procedure">Field</a> | </li>
+<li><a href="#constructor.summary">Constr</a> | </li>
+<li><a href="#method.summary">Method</a></li>
+</ul>
+<ul class="subNavList">
+<li>Detail: </li>
+<li>Field | </li>
+<li><a href="#constructor.detail">Constr</a> | </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<TEnv></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><<a href="../../../../../org/apache/hadoop/hbase/procedure2/TestProcedureBypass.TestProcEnv.html" title="class in org.apache.hadoop.hbase.procedure2">TestProcedureBypass.TestProcEnv</a>></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><org.apache.hadoop.hbase.procedure2.Procedure<<a href="../../../../../org/apache/hadoop/hbase/procedure2/TestProcedureBypass.TestProcEnv.html" title="class in org.apache.hadoop.hbase.procedure2">TestProcedureBypass.TestProcEnv</a>>></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><<a href="../../../../../org/apache/hadoop/hbase/procedure2/TestProcedureBypass.TestProcEnv.html" title="class in org.apache.hadoop.hbase.procedure2">TestProcedureBypass.TestProcEnv</a>></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 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 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"> </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> </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"> </span></span><span id="t2" class="tableTab"><span><a href="javascript:show(2);">Instance Methods</a></span><span class="tabEnd"> </span></span><span id="t4" class="tableTab"><span><a href="javascript:show(8);">Concrete Methods</a></span><span class="tabEnd"> </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> env)</code> </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> env)</code> </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 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 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 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 <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 org.apache.hadoop.hbase.procedure2.Procedure[] <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> 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> in class <code><a href="../../../../../org/apache/hadoop/hbase/procedure2/ProcedureTestingUtility.NoopProcedure.html" title="class in org.apache.hadoop.hbase.procedure2">ProcedureTestingUtility.NoopProcedure</a><<a href="../../../../../org/apache/hadoop/hbase/procedure2/TestProcedureBypass.TestProcEnv.html" title="class in org.apache.hadoop.hbase.procedure2">TestProcedureBypass.TestProcEnv</a>></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 boolean <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> env)</pre>
+<dl>
+<dt><span class="overrideSpecifyLabel">Overrides:</span></dt>
+<dd><code>setTimeoutFailure</code> in class <code>org.apache.hadoop.hbase.procedure2.Procedure<<a href="../../../../../org/apache/hadoop/hbase/procedure2/TestProcedureBypass.TestProcEnv.html" title="class in org.apache.hadoop.hbase.procedure2">TestProcedureBypass.TestProcEnv</a>></code></dd>
+</dl>
+</li>
+</ul>
+</li>
+</ul>
+</li>
+</ul>
+</div>
+</div>
+<!-- ========= END OF CLASS DATA ========= -->
+<!-- ======= START OF BOTTOM NAVBAR ====== -->
+<div class="bottomNav"><a name="navbar.bottom">
+<!-- -->
+</a>
+<div class="skipNav"><a href="#skip.navbar.bottom" title="Skip navigation links">Skip navigation links</a></div>
+<a name="navbar.bottom.firstrow">
+<!-- -->
+</a>
+<ul class="navList" title="Navigation">
+<li><a href="../../../../../overview-summary.html">Overview</a></li>
+<li><a href="package-summary.html">Package</a></li>
+<li class="navBarCell1Rev">Class</li>
+<li><a href="class-use/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 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 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 Frames</a></li>
+</ul>
+<ul class="navList" id="allclasses_navbar_bottom">
+<li><a href="../../../../../allclasses-noframe.html">All 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: </li>
+<li><a href="#nested.classes.inherited.from.class.org.apache.hadoop.hbase.procedure2.Procedure">Nested</a> | </li>
+<li><a href="#fields.inherited.from.class.org.apache.hadoop.hbase.procedure2.Procedure">Field</a> | </li>
+<li><a href="#constructor.summary">Constr</a> | </li>
+<li><a href="#method.summary">Method</a></li>
+</ul>
+<ul class="subNavList">
+<li>Detail: </li>
+<li>Field | </li>
+<li><a href="#constructor.detail">Constr</a> | </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 © 2007–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> * <p>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> * <h4>Concurrency control</h4><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:<br><a name="line.63"></a>
-<span class="sourceLineNo">064</span> * <ul><a name="line.64"></a>
-<span class="sourceLineNo">065</span> * <li><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> * <ol><a name="line.68"></a>
-<span class="sourceLineNo">069</span> * <li>Queue was empty before push (so must have been out of run-queue)</li><a name="line.69"></a>
-<span class="sourceLineNo">070</span> * <li>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)</li><a name="line.71"></a>
-<span class="sourceLineNo">072</span> * </ol><a name="line.72"></a>
-<span class="sourceLineNo">073</span> * </li><a name="line.73"></a>
-<span class="sourceLineNo">074</span> * <li><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> * <ol><a name="line.76"></a>
-<span class="sourceLineNo">077</span> * <li>Queue becomes empty after poll</li><a name="line.77"></a>
-<span class="sourceLineNo">078</span> * <li>Exclusive lock is requested by polled procedure and lock is available (returns the<a name="line.78"></a>
-<span class="sourceLineNo">079</span> * procedure)</li><a name="line.79"></a>
-<span class="sourceLineNo">080</span> * <li>Exclusive lock is requested but lock is not available (returns null)</li><a name="line.80"></a>
-<span class="sourceLineNo">081</span> * <li>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</li><a name="line.82"></a>
-<span class="sourceLineNo">083</span> * </ol><a name="line.83"></a>
-<span class="sourceLineNo">084</span> * </li><a name="line.84"></a>
-<span class="sourceLineNo">085</span> * <li><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> * <ol><a name="line.87"></a>
-<span class="sourceLineNo">088</span> * <li>Exclusive lock</li><a name="line.88"></a>
-<span class="sourceLineNo">089</span> * <li>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)</li><a name="line.90"></a>
-<span class="sourceLineNo">091</span> * </ol><a name="line.91"></a>
-<span class="sourceLineNo">092</span> * </li><a name="line.92"></a>
-<span class="sourceLineNo">093</span> * </ul><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<ServerQueue> SERVER_QUEUE_KEY_COMPARATOR =<a name="line.99"></a>
-<span class="sourceLineNo">100</span> (n, k) -> n.compareKey((ServerName) k);<a name="line.100"></a>
-<span class="sourceLineNo">101</span> private final static AvlKeyComparator<TableQueue> TABLE_QUEUE_KEY_COMPARATOR =<a name="line.101"></a>
-<span class="sourceLineNo">102</span> (n, k) -> n.compareKey((TableName) k);<a name="line.102"></a>
-<span class="sourceLineNo">103</span> private final static AvlKeyComparator<PeerQueue> PEER_QUEUE_KEY_COMPARATOR =<a name="line.103"></a>
-<span class="sourceLineNo">104</span> (n, k) -> n.compareKey((String) k);<a name="line.104"></a>
-<span class="sourceLineNo">105</span> private final static AvlKeyComparator<MetaQueue> META_QUEUE_KEY_COMPARATOR =<a name="line.105"></a>
-<span class="sourceLineNo">106</span> (n, k) -> 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<ServerName> serverRunQueue = new FairQueue<>();<a name="line.108"></a>
-<span class="sourceLineNo">109</span> private final FairQueue<TableName> tableRunQueue = new FairQueue<>();<a name="line.109"></a>
-<span class="sourceLineNo">110</span> private final FairQueue<String> peerRunQueue = new FairQueue<>();<a name="line.110"></a>
-<span class="sourceLineNo">111</span> private final FairQueue<TableName> metaRunQueue = new FairQueue<>();<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<Long, Procedure<?>> 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 <T extends Comparable<T>> void doAdd(FairQueue<T> fairq, Queue<T> queue,<a name="line.150"></a>
-<span class="sourceLineNo">151</span> Procedure<?> 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<?> 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 <T extends Comparable<T>> boolean isLockReady(Procedure<?> proc, Queue<T> 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 <T extends Comparable<T>> Procedure<?> doPoll(final FairQueue<T> fairq) {<a name="line.201"></a>
-<span class="sourceLineNo">202</span> Queue<T> 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 < n; i++) {<a name="line.208"></a>
-<span class="sourceLineNo">209</span> Procedure<?> 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<LockedResource> 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> * <p>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> * <h4>Concurrency control</h4><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:<br><a name="line.64"></a>
+<span class="sourceLineNo">065</span> * <ul><a name="line.65"></a>
+<span class="sourceLineNo">066</span> * <li><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> * <ol><a name="line.69"></a>
+<span class="sourceLineNo">070</span> * <li>Queue was empty before push (so must have been out of run-queue)</li><a name="line.70"></a>
+<span class="sourceLineNo">071</span> * <li>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)</li><a name="line.72"></a>
+<span class="sourceLineNo">073</span> * </ol><a name="line.73"></a>
+<span class="sourceLineNo">074</span> * </li><a name="line.74"></a>
+<span class="sourceLineNo">075</span> * <li><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> * <ol><a name="line.77"></a>
+<span class="sourceLineNo">078</span> * <li>Queue becomes empty after poll</li><a name="line.78"></a>
+<span class="sourceLineNo">079</span> * <li>Exclusive lock is requested by polled procedure and lock is available (returns the<a name="line.79"></a>
+<span class="sourceLineNo">080</span> * procedure)</li><a name="line.80"></a>
+<span class="sourceLineNo">081</span> * <li>Exclusive lock is requested but lock is not available (returns null)</li><a name="line.81"></a>
+<span class="sourceLineNo">082</span> * <li>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</li><a name="line.83"></a>
+<span class="sourceLineNo">084</span> * </ol><a name="line.84"></a>
+<span class="sourceLineNo">085</span> * </li><a name="line.85"></a>
+<span class="sourceLineNo">086</span> * <li><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> * <ol><a name="line.88"></a>
+<span class="sourceLineNo">089</span> * <li>Exclusive lock</li><a name="line.89"></a>
+<span class="sourceLineNo">090</span> * <li>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)</li><a name="line.91"></a>
+<span class="sourceLineNo">092</span> * </ol><a name="line.92"></a>
+<span class="sourceLineNo">093</span> * </li><a name="line.93"></a>
+<span class="sourceLineNo">094</span> * </ul><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<ServerQueue> SERVER_QUEUE_KEY_COMPARATOR =<a name="line.100"></a>
+<span class="sourceLineNo">101</span> (n, k) -> n.compareKey((ServerName) k);<a name="line.101"></a>
+<span class="sourceLineNo">102</span> private final static AvlKeyComparator<TableQueue> TABLE_QUEUE_KEY_COMPARATOR =<a name="line.102"></a>
+<span class="sourceLineNo">103</span> (n, k) -> n.compareKey((TableName) k);<a name="line.103"></a>
+<span class="sourceLineNo">104</span> private final static AvlKeyComparator<PeerQueue> PEER_QUEUE_KEY_COMPARATOR =<a name="line.104"></a>
+<span class="sourceLineNo">105</span> (n, k) -> n.compareKey((String) k);<a name="line.105"></a>
+<span class="sourceLineNo">106</span> private final static AvlKeyComparator<MetaQueue> META_QUEUE_KEY_COMPARATOR =<a name="line.106"></a>
+<span class="sourceLineNo">107</span> (n, k) -> 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<ServerName> serverRunQueue = new FairQueue<>();<a name="line.109"></a>
+<span class="sourceLineNo">110</span> private final FairQueue<TableName> tableRunQueue = new FairQueue<>();<a name="line.110"></a>
+<span class="sourceLineNo">111</span> private final FairQueue<String> peerRunQueue = new FairQueue<>();<a name="line.111"></a>
+<span class="sourceLineNo">112</span> private final FairQueue<TableName> metaRunQueue = new FairQueue<>();<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<Long, Procedure<?>> 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 <T extends Comparable<T>> void doAdd(FairQueue<T> fairq, Queue<T> queue,<a name="line.151"></a>
+<span class="sourceLineNo">152</span> Procedure<?> 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<String> 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 = () -> 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 = () -> 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 = () -> "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 = () -> 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<?> 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 <T extends Comparable<T>> boolean isLockReady(Procedure<?> proc, Queue<T> 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 <T extends Comparable<T>> Procedure<?> doPoll(final FairQueue<T> fairq) {<a name="line.211"></a>
+<span class="sourceLineNo">212</span> Queue<T> 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 < n; i++) {<a name="line.218"></a>
+<span class="sourceLineNo">219</span> Procedure<?> 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, () -> "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, () -> "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<LockedResource> 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 < 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 <T extends Comparable<T>, TNode extends Queue<T>> void clear(TNode treeMap,<a name="line.274"></a>
-<span class="sourceLineNo">275</span> final FairQueue<T> fairq, final AvlKeyComparator<TNode> 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<T> 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<?> 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<Queue<?>> iter = new AvlTreeIterator<Queue<?>>(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 < 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 <T extends Comparable<T>, TNode extends Queue<T>> void clear(TNode treeMap,<a name="line.284"></a>
+<span class="sourceLineNo">285</span> FairQueue<T> fairq, AvlKeyComparator<TNode> 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<T> 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, () -> "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<?> 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<Queue<?>> iter = new AvlTreeIterator<Queue<?>>(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 <T extends Comparable<T>> void addToRunQueue(FairQueue<T> fairq, Queue<T> queue) {<a name="line.336"></a>
-<span class="sourceLineNo">337</span> if (!AvlIterableList.isLinked(queue) && !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 <T extends Comparable<T>> void removeFromRunQueue(<a name="line.342"></a>
-<span class="sourceLineNo">343</span> FairQueue<T> fairq, Queue<T> 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<?> 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<?> 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 <T extends Comparable<T>> void addToRunQueue(FairQueue<T> fairq, Queue<T> queue,<a name="line.348"></a>
+<span class="sourceLineNo">349</span> Supplier<String> 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) && !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 <T extends Comparable<T>> void removeFromRunQueue(FairQueue<T> fairq,<a name="line.358"></a>
+<span class="sourceLineNo">359</span> Queue<T> queue, Supplier<String> 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<?> 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() && 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<?> 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<?> 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<?> 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<?> 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<?> 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() && 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<?> 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<?> 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<?> 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() && 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> () -> "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<?> 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<?> 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<TEnvironment> proc, NonceKey nonceKey) {<a name="line.999"></a>
-<span class="sourceLineNo">1000</span> Preconditions.checkArgument(lastProcId.get() >= 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<TEnvironment> proc, NonceKey nonceKey) {<a name="line.1007"></a>
+<span class="sourceLineNo">1008</span> Preconditions.checkArgument(lastProcId.get() >= 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<TEnvironment>[] procs) {<a name="line.1030"></a>
-<span class="sourceLineNo">1031</span> Preconditions.checkArgument(lastProcId.get() >= 0);<a name="line.1031"></a>
-<span class="sourceLineNo">1032</span> if (procs == null || procs.length <= 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 < 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 < 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<TEnvironment> prepareProcedure(Procedure<TEnvironment> 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<TEnvironment>[] procs) {<a name="line.1038"></a>
+<span class="sourceLineNo">1039</span> Preconditions.checkArgument(lastProcId.get() >= 0);<a name="line.1039"></a>
+<span class="sourceLineNo">1040</span> if (procs == null || procs.length <= 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 < 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 < 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<TEnvironment> 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<TEnvironment> stack = new RootProcedureState<>();<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<TEnvironment> prepareProcedure(Procedure<TEnvironment> 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<TEnvironment> 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<TEnvironment> stack = new RootProcedureState<>();<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<TEnvironment> 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 && 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<TEnvironment> 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 <T extends Procedure<TEnvironment>> T getProcedure(Class<T> clazz, long procId) {<a name="line.1115"></a>
-<span class="sourceLineNo">1116</span> Procedure<TEnvironment> 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<TEnvironment> 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 && 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<TEnvironment> 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<TEnvironment> getResult(long procId) {<a name="line.1123"></a>
-<span class="sourceLineNo">1124</span> CompletedProcedureRetainer<TEnvironment> 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<?> 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<TEnvironment> 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<TEnvironment> getResultOrProcedure(long procId) {<a name="line.1172"></a>
-<span class="sourceLineNo">1173</span> CompletedProcedureRetainer<TEnvironment> 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<TEnvironment> 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<TEnvironment> 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> * <p/><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<Procedure<TEnvironment>> 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 <T extends Procedure<TEnvironment>> T getProcedure(Class<T> clazz, long procId) {<a name="line.1123"></a>
+<span class="sourceLineNo">1124</span> Procedure<TEnvironment> 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<TEnvironment> getResult(long procId) {<a name="line.1131"></a>
+<span class="sourceLineNo">1132</span> CompletedProcedureRetainer<TEnvironment> 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<?> 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<TEnvironment> 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<TEnvironment> getResultOrProcedure(long procId) {<a name="line.1180"></a>
+<span class="sourceLineNo">1181</span> CompletedProcedureRetainer<TEnvironment> 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<TEnvironment> 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<TEnvironment> 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> * <p/><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<Procedure<TEnvironment>> getProcedures() {<a name="line.1222"></a>
-<span class="sourceLineNo">1223</span> List<Procedure<TEnvironment>> procedureList =<a name="line.1223"></a>
-<span class="sourceLineNo">1224</span> new ArrayList<>(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 < 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 >= 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 >= 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<Long> 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<TEnvironment> 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<TEnvironment> 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<TEnvironment> 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<Procedure<TEnvironment>> 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<Procedure<TEnvironment>> getProcedures() {<a name="line.1230"></a>
+<span class="sourceLineNo">1231</span> List<Procedure<TEnvironment>> procedureList =<a name="line.1231"></a>
+<span class="sourceLineNo">1232</span> new ArrayList<>(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 < 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 >= 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 >= 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<Long> 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<TEnvironment> 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<TEnvironment> 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<TEnvironment> 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<TEnvironment> 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<TEnvironment> 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<TEnvironment> procStack) {<a name="line.1437"></a>
-<span class="sourceLineNo">1438</span> Procedure<TEnvironment> 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 – 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="" /> Error</td></tr>
<tr class="a">
<td>coding</td>
@@ -9819,19 +9819,19 @@
<li>caseIndent: <tt>"2"</tt></li>
<li>basicOffset: <tt>"2"</tt></li>
<li>lineWrappingIndentation: <tt>"2"</tt></li></ul></td>
-<td>4827</td>
+<td>4826</td>
<td><img src="images/icon_error_sml.gif" alt="" /> 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>"2"</tt></li></ul></td>
-<td>731</td>
+<td>730</td>
<td><img src="images/icon_error_sml.gif" alt="" /> 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="" /> 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="" /> 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="" /> 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="" /> 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="" /> 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="" /> 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="" /> 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="" /> 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="" /> 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="" /> 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="" /> 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="" /> 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="" /> 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="" /> 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="" /> 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="" /> 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="" /> 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="" /> 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="" /> 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="" /> 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="" /> 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="" /> 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="" /> 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="" /> 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="" /> 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="" /> 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="" /> 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="" /> 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="" /> 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="" /> 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="" /> 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="" /> 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="" /> 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="" /> 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="" /> 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="" /> 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="" /> 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="" /> 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="" /> 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="" /> 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="" /> 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="" /> 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="" /> 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="" /> 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="" /> 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="" /> 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="" /> 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="" /> 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="" /> 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="" /> 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="" /> 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="" /> 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="" /> 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="" /> 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="" /> 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="" /> 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="" /> 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="" /> 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="" /> 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="" /> 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="" /> 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="" /> 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="" /> 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="" /> 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="" /> 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="" /> 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="" /> 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="" /> 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="" /> 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="" /> 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="" /> 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="" /> 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="" /> 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="" /> 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="" /> 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="" /> 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="" /> 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="" /> 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="" /> 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="" /> 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="" /> 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="" /> 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="" /> 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="" /> 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="" /> 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="" /> 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="" /> 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="" /> 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="" /> 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="" /> 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="" /> 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="" /> 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="" /> 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="" /> 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="" /> 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="" /> 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="" /> 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="" /> 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="" /> 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="" /> 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="" /> 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="" /> 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="" /> 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="" /> 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="" /> 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="" /> 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="" /> 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="" /> 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="" /> 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="" /> 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="" /> 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="" /> 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="" /> 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="" /> 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="" /> 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="" /> 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="" /> 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="" /> 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="" /> 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="" /> 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="" /> 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="" /> 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="" /> 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="" /> 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="" /> 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="" /> 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="" /> 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="" /> 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="" /> 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="" /> 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="" /> 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="" /> 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="" /> 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="" /> 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="" /> 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="" /> 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="" /> 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="" /> 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="" /> 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="" /> 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="" /> 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="" /> 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="" /> 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="" /> 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="" /> 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="" /> 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="" /> 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="" /> 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="" /> 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="" /> 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="" /> 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="" /> 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="" /> 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="" /> 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="" /> 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="" /> 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="" /> 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="" /> 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="" /> 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="" /> 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="" /> 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="" /> 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="" /> 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="" /> 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="" /> 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="" /> 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="" /> 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="" /> 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="" /> 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="" /> 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="" /> 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="" /> 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="" /> 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="" /> 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="" /> 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="" /> 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="" /> 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="" /> 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="" /> 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="" /> 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="" /> 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="" /> 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="" /> 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="" /> 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="" /> 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="" /> 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="" /> 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="" /> 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="" /> 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="" /> 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="" /> 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="" /> 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="" /> 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="" /> 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="" /> 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="" /> 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="" /> 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="" /> 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="" /> 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="" /> 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="" /> 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="" /> 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="" /> 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="" /> 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="" /> 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="" /> 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="" /> 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="" /> 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="" /> 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="" /> 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="" /> 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="" /> 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="" /> 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="" /> 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="" /> 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="" /> 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="" /> 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="" /> 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="" /> 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="" /> 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="" /> 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="" /> 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="" /> 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="" /> 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="" /> 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="" /> 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="" /> 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="" /> 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="" /> 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="" /> 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="" /> 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="" /> 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="" /> 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="" /> 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="" /> 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="" /> 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="" /> 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="" /> 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="" /> 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="" /> 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="" /> 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="" /> 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="" /> 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="" /> 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="" /> 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="" /> 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="" /> 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="" /> 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="" /> 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="" /> 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="" /> 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="" /> 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="" /> 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="" /> 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="" /> 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="" /> 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="" /> 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="" /> 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="" /> 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="" /> 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="" /> 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="" /> 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="" /> 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="" /> 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="" /> 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="" /> 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="" /> 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="" /> 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="" /> 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="" /> 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="" /> 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="" /> 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="" /> 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="" /> 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="" /> 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="" /> 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="" /> 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="" /> 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="" /> 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="" /> 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="" /> 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="" /> 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="" /> 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="" /> 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="" /> 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="" /> 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="" /> 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="" /> 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="" /> 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="" /> 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="" /> 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="" /> 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="" /> 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="" /> 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="" /> 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="" /> 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="" /> 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="" /> 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="" /> 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="" /> 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="" /> 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="" /> 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="" /> 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="" /> 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="" /> 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="" /> 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="" /> 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="" /> 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="" /> 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="" /> 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="" /> 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="" /> 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="" /> 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="" /> 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="" /> 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="" /> 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="" /> 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>©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 –
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 – 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<TEnvironment> proc) {<a name="line.129"></a>
+<span class="sourceLineNo">129</span> protected void executeTimedoutProcedure(Procedure<TEnvironment> 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<String, String> 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 < 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 < 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 > 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> * <ol><a name="line.167"></a>
-<span class="sourceLineNo">168</span> * <li>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)</li><a name="line.169"></a>
-<span class="sourceLineNo">170</span> * <li>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)</li><a name="line.171"></a>
-<span class="sourceLineNo">172</span> * <li>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)</li><a name="line.173"></a>
-<span class="sourceLineNo">174</span> * </ol><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 > 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<String, String> 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 < 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 < 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 < 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 > 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> * <ol><a name="line.192"></a>
+<span class="sourceLineNo">193</span> * <li>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)</li><a name="line.194"></a>
+<span class="sourceLineNo">195</span> * <li>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)</li><a name="line.196"></a>
+<span class="sourceLineNo">197</span> * <li>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)</li><a name="line.198"></a>
+<span class="sourceLineNo">199</span> * </ol><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 > 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 && !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 && !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>