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/05/25 14:48:05 UTC

[01/29] hbase-site git commit: Published site at 477f9fdb32873387231c5fbbff130ba8bf7b5d68.

Repository: hbase-site
Updated Branches:
  refs/heads/asf-site 5ea72c644 -> 621479e1d


http://git-wip-us.apache.org/repos/asf/hbase-site/blob/621479e1/testdevapidocs/src-html/org/apache/hadoop/hbase/quotas/TestSpaceQuotas.html
----------------------------------------------------------------------
diff --git a/testdevapidocs/src-html/org/apache/hadoop/hbase/quotas/TestSpaceQuotas.html b/testdevapidocs/src-html/org/apache/hadoop/hbase/quotas/TestSpaceQuotas.html
index a2d27a0..95fac98 100644
--- a/testdevapidocs/src-html/org/apache/hadoop/hbase/quotas/TestSpaceQuotas.html
+++ b/testdevapidocs/src-html/org/apache/hadoop/hbase/quotas/TestSpaceQuotas.html
@@ -43,397 +43,596 @@
 <span class="sourceLineNo">035</span>import org.apache.hadoop.hbase.HBaseClassTestRule;<a name="line.35"></a>
 <span class="sourceLineNo">036</span>import org.apache.hadoop.hbase.HBaseTestingUtility;<a name="line.36"></a>
 <span class="sourceLineNo">037</span>import org.apache.hadoop.hbase.TableName;<a name="line.37"></a>
-<span class="sourceLineNo">038</span>import org.apache.hadoop.hbase.client.Admin;<a name="line.38"></a>
-<span class="sourceLineNo">039</span>import org.apache.hadoop.hbase.client.Append;<a name="line.39"></a>
-<span class="sourceLineNo">040</span>import org.apache.hadoop.hbase.client.ClientServiceCallable;<a name="line.40"></a>
-<span class="sourceLineNo">041</span>import org.apache.hadoop.hbase.client.Connection;<a name="line.41"></a>
-<span class="sourceLineNo">042</span>import org.apache.hadoop.hbase.client.Delete;<a name="line.42"></a>
-<span class="sourceLineNo">043</span>import org.apache.hadoop.hbase.client.Increment;<a name="line.43"></a>
-<span class="sourceLineNo">044</span>import org.apache.hadoop.hbase.client.Mutation;<a name="line.44"></a>
-<span class="sourceLineNo">045</span>import org.apache.hadoop.hbase.client.Put;<a name="line.45"></a>
-<span class="sourceLineNo">046</span>import org.apache.hadoop.hbase.client.RegionInfo;<a name="line.46"></a>
-<span class="sourceLineNo">047</span>import org.apache.hadoop.hbase.client.Result;<a name="line.47"></a>
-<span class="sourceLineNo">048</span>import org.apache.hadoop.hbase.client.ResultScanner;<a name="line.48"></a>
-<span class="sourceLineNo">049</span>import org.apache.hadoop.hbase.client.RpcRetryingCaller;<a name="line.49"></a>
-<span class="sourceLineNo">050</span>import org.apache.hadoop.hbase.client.RpcRetryingCallerFactory;<a name="line.50"></a>
-<span class="sourceLineNo">051</span>import org.apache.hadoop.hbase.client.Scan;<a name="line.51"></a>
-<span class="sourceLineNo">052</span>import org.apache.hadoop.hbase.client.Table;<a name="line.52"></a>
-<span class="sourceLineNo">053</span>import org.apache.hadoop.hbase.master.HMaster;<a name="line.53"></a>
-<span class="sourceLineNo">054</span>import org.apache.hadoop.hbase.quotas.policies.DefaultViolationPolicyEnforcement;<a name="line.54"></a>
-<span class="sourceLineNo">055</span>import org.apache.hadoop.hbase.regionserver.HRegionServer;<a name="line.55"></a>
-<span class="sourceLineNo">056</span>import org.apache.hadoop.hbase.security.AccessDeniedException;<a name="line.56"></a>
-<span class="sourceLineNo">057</span>import org.apache.hadoop.hbase.testclassification.LargeTests;<a name="line.57"></a>
-<span class="sourceLineNo">058</span>import org.apache.hadoop.hbase.util.Bytes;<a name="line.58"></a>
-<span class="sourceLineNo">059</span>import org.apache.hadoop.util.StringUtils;<a name="line.59"></a>
-<span class="sourceLineNo">060</span>import org.junit.AfterClass;<a name="line.60"></a>
-<span class="sourceLineNo">061</span>import org.junit.Before;<a name="line.61"></a>
-<span class="sourceLineNo">062</span>import org.junit.BeforeClass;<a name="line.62"></a>
-<span class="sourceLineNo">063</span>import org.junit.ClassRule;<a name="line.63"></a>
-<span class="sourceLineNo">064</span>import org.junit.Rule;<a name="line.64"></a>
-<span class="sourceLineNo">065</span>import org.junit.Test;<a name="line.65"></a>
-<span class="sourceLineNo">066</span>import org.junit.experimental.categories.Category;<a name="line.66"></a>
-<span class="sourceLineNo">067</span>import org.junit.rules.TestName;<a name="line.67"></a>
-<span class="sourceLineNo">068</span>import org.slf4j.Logger;<a name="line.68"></a>
-<span class="sourceLineNo">069</span>import org.slf4j.LoggerFactory;<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> * End-to-end test class for filesystem space quotas.<a name="line.72"></a>
-<span class="sourceLineNo">073</span> */<a name="line.73"></a>
-<span class="sourceLineNo">074</span>@Category(LargeTests.class)<a name="line.74"></a>
-<span class="sourceLineNo">075</span>public class TestSpaceQuotas {<a name="line.75"></a>
-<span class="sourceLineNo">076</span><a name="line.76"></a>
-<span class="sourceLineNo">077</span>  @ClassRule<a name="line.77"></a>
-<span class="sourceLineNo">078</span>  public static final HBaseClassTestRule CLASS_RULE =<a name="line.78"></a>
-<span class="sourceLineNo">079</span>      HBaseClassTestRule.forClass(TestSpaceQuotas.class);<a name="line.79"></a>
-<span class="sourceLineNo">080</span><a name="line.80"></a>
-<span class="sourceLineNo">081</span>  private static final Logger LOG = LoggerFactory.getLogger(TestSpaceQuotas.class);<a name="line.81"></a>
-<span class="sourceLineNo">082</span>  private static final HBaseTestingUtility TEST_UTIL = new HBaseTestingUtility();<a name="line.82"></a>
-<span class="sourceLineNo">083</span>  // Global for all tests in the class<a name="line.83"></a>
-<span class="sourceLineNo">084</span>  private static final AtomicLong COUNTER = new AtomicLong(0);<a name="line.84"></a>
-<span class="sourceLineNo">085</span>  private static final int NUM_RETRIES = 10;<a name="line.85"></a>
-<span class="sourceLineNo">086</span><a name="line.86"></a>
-<span class="sourceLineNo">087</span>  @Rule<a name="line.87"></a>
-<span class="sourceLineNo">088</span>  public TestName testName = new TestName();<a name="line.88"></a>
-<span class="sourceLineNo">089</span>  private SpaceQuotaHelperForTests helper;<a name="line.89"></a>
-<span class="sourceLineNo">090</span><a name="line.90"></a>
-<span class="sourceLineNo">091</span>  @BeforeClass<a name="line.91"></a>
-<span class="sourceLineNo">092</span>  public static void setUp() throws Exception {<a name="line.92"></a>
-<span class="sourceLineNo">093</span>    Configuration conf = TEST_UTIL.getConfiguration();<a name="line.93"></a>
-<span class="sourceLineNo">094</span>    SpaceQuotaHelperForTests.updateConfigForQuotas(conf);<a name="line.94"></a>
-<span class="sourceLineNo">095</span>    TEST_UTIL.startMiniCluster(1);<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>  @AfterClass<a name="line.98"></a>
-<span class="sourceLineNo">099</span>  public static void tearDown() throws Exception {<a name="line.99"></a>
-<span class="sourceLineNo">100</span>    TEST_UTIL.shutdownMiniCluster();<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>  @Before<a name="line.103"></a>
-<span class="sourceLineNo">104</span>  public void removeAllQuotas() throws Exception {<a name="line.104"></a>
-<span class="sourceLineNo">105</span>    final Connection conn = TEST_UTIL.getConnection();<a name="line.105"></a>
-<span class="sourceLineNo">106</span>    if (helper == null) {<a name="line.106"></a>
-<span class="sourceLineNo">107</span>      helper = new SpaceQuotaHelperForTests(TEST_UTIL, testName, COUNTER);<a name="line.107"></a>
-<span class="sourceLineNo">108</span>    }<a name="line.108"></a>
-<span class="sourceLineNo">109</span>    // Wait for the quota table to be created<a name="line.109"></a>
-<span class="sourceLineNo">110</span>    if (!conn.getAdmin().tableExists(QuotaUtil.QUOTA_TABLE_NAME)) {<a name="line.110"></a>
-<span class="sourceLineNo">111</span>      helper.waitForQuotaTable(conn);<a name="line.111"></a>
-<span class="sourceLineNo">112</span>    } else {<a name="line.112"></a>
-<span class="sourceLineNo">113</span>      // Or, clean up any quotas from previous test runs.<a name="line.113"></a>
-<span class="sourceLineNo">114</span>      helper.removeAllQuotas(conn);<a name="line.114"></a>
-<span class="sourceLineNo">115</span>      assertEquals(0, helper.listNumDefinedQuotas(conn));<a name="line.115"></a>
-<span class="sourceLineNo">116</span>    }<a name="line.116"></a>
-<span class="sourceLineNo">117</span>  }<a name="line.117"></a>
-<span class="sourceLineNo">118</span><a name="line.118"></a>
-<span class="sourceLineNo">119</span>  @Test<a name="line.119"></a>
-<span class="sourceLineNo">120</span>  public void testNoInsertsWithPut() throws Exception {<a name="line.120"></a>
-<span class="sourceLineNo">121</span>    Put p = new Put(Bytes.toBytes("to_reject"));<a name="line.121"></a>
-<span class="sourceLineNo">122</span>    p.addColumn(<a name="line.122"></a>
-<span class="sourceLineNo">123</span>        Bytes.toBytes(SpaceQuotaHelperForTests.F1), Bytes.toBytes("to"), Bytes.toBytes("reject"));<a name="line.123"></a>
-<span class="sourceLineNo">124</span>    writeUntilViolationAndVerifyViolation(SpaceViolationPolicy.NO_INSERTS, p);<a name="line.124"></a>
-<span class="sourceLineNo">125</span>  }<a name="line.125"></a>
-<span class="sourceLineNo">126</span><a name="line.126"></a>
-<span class="sourceLineNo">127</span>  @Test<a name="line.127"></a>
-<span class="sourceLineNo">128</span>  public void testNoInsertsWithAppend() throws Exception {<a name="line.128"></a>
-<span class="sourceLineNo">129</span>    Append a = new Append(Bytes.toBytes("to_reject"));<a name="line.129"></a>
-<span class="sourceLineNo">130</span>    a.addColumn(<a name="line.130"></a>
-<span class="sourceLineNo">131</span>        Bytes.toBytes(SpaceQuotaHelperForTests.F1), Bytes.toBytes("to"), Bytes.toBytes("reject"));<a name="line.131"></a>
-<span class="sourceLineNo">132</span>    writeUntilViolationAndVerifyViolation(SpaceViolationPolicy.NO_INSERTS, a);<a name="line.132"></a>
-<span class="sourceLineNo">133</span>  }<a name="line.133"></a>
-<span class="sourceLineNo">134</span><a name="line.134"></a>
-<span class="sourceLineNo">135</span>  @Test<a name="line.135"></a>
-<span class="sourceLineNo">136</span>  public void testNoInsertsWithIncrement() throws Exception {<a name="line.136"></a>
-<span class="sourceLineNo">137</span>    Increment i = new Increment(Bytes.toBytes("to_reject"));<a name="line.137"></a>
-<span class="sourceLineNo">138</span>    i.addColumn(Bytes.toBytes(SpaceQuotaHelperForTests.F1), Bytes.toBytes("count"), 0);<a name="line.138"></a>
-<span class="sourceLineNo">139</span>    writeUntilViolationAndVerifyViolation(SpaceViolationPolicy.NO_INSERTS, i);<a name="line.139"></a>
-<span class="sourceLineNo">140</span>  }<a name="line.140"></a>
-<span class="sourceLineNo">141</span><a name="line.141"></a>
-<span class="sourceLineNo">142</span>  @Test<a name="line.142"></a>
-<span class="sourceLineNo">143</span>  public void testDeletesAfterNoInserts() throws Exception {<a name="line.143"></a>
-<span class="sourceLineNo">144</span>    final TableName tn = writeUntilViolation(SpaceViolationPolicy.NO_INSERTS);<a name="line.144"></a>
-<span class="sourceLineNo">145</span>    // Try a couple of times to verify that the quota never gets enforced, same as we<a name="line.145"></a>
-<span class="sourceLineNo">146</span>    // do when we're trying to catch the failure.<a name="line.146"></a>
-<span class="sourceLineNo">147</span>    Delete d = new Delete(Bytes.toBytes("should_not_be_rejected"));<a name="line.147"></a>
-<span class="sourceLineNo">148</span>    for (int i = 0; i &lt; NUM_RETRIES; i++) {<a name="line.148"></a>
-<span class="sourceLineNo">149</span>      try (Table t = TEST_UTIL.getConnection().getTable(tn)) {<a name="line.149"></a>
-<span class="sourceLineNo">150</span>        t.delete(d);<a name="line.150"></a>
-<span class="sourceLineNo">151</span>      }<a name="line.151"></a>
-<span class="sourceLineNo">152</span>    }<a name="line.152"></a>
-<span class="sourceLineNo">153</span>  }<a name="line.153"></a>
-<span class="sourceLineNo">154</span><a name="line.154"></a>
-<span class="sourceLineNo">155</span>  @Test<a name="line.155"></a>
-<span class="sourceLineNo">156</span>  public void testNoWritesWithPut() throws Exception {<a name="line.156"></a>
-<span class="sourceLineNo">157</span>    Put p = new Put(Bytes.toBytes("to_reject"));<a name="line.157"></a>
-<span class="sourceLineNo">158</span>    p.addColumn(<a name="line.158"></a>
-<span class="sourceLineNo">159</span>        Bytes.toBytes(SpaceQuotaHelperForTests.F1), Bytes.toBytes("to"), Bytes.toBytes("reject"));<a name="line.159"></a>
-<span class="sourceLineNo">160</span>    writeUntilViolationAndVerifyViolation(SpaceViolationPolicy.NO_WRITES, p);<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>  @Test<a name="line.163"></a>
-<span class="sourceLineNo">164</span>  public void testNoWritesWithAppend() throws Exception {<a name="line.164"></a>
-<span class="sourceLineNo">165</span>    Append a = new Append(Bytes.toBytes("to_reject"));<a name="line.165"></a>
-<span class="sourceLineNo">166</span>    a.addColumn(<a name="line.166"></a>
-<span class="sourceLineNo">167</span>        Bytes.toBytes(SpaceQuotaHelperForTests.F1), Bytes.toBytes("to"), Bytes.toBytes("reject"));<a name="line.167"></a>
-<span class="sourceLineNo">168</span>    writeUntilViolationAndVerifyViolation(SpaceViolationPolicy.NO_WRITES, a);<a name="line.168"></a>
-<span class="sourceLineNo">169</span>  }<a name="line.169"></a>
-<span class="sourceLineNo">170</span><a name="line.170"></a>
-<span class="sourceLineNo">171</span>  @Test<a name="line.171"></a>
-<span class="sourceLineNo">172</span>  public void testNoWritesWithIncrement() throws Exception {<a name="line.172"></a>
-<span class="sourceLineNo">173</span>    Increment i = new Increment(Bytes.toBytes("to_reject"));<a name="line.173"></a>
-<span class="sourceLineNo">174</span>    i.addColumn(Bytes.toBytes(SpaceQuotaHelperForTests.F1), Bytes.toBytes("count"), 0);<a name="line.174"></a>
-<span class="sourceLineNo">175</span>    writeUntilViolationAndVerifyViolation(SpaceViolationPolicy.NO_WRITES, i);<a name="line.175"></a>
-<span class="sourceLineNo">176</span>  }<a name="line.176"></a>
-<span class="sourceLineNo">177</span><a name="line.177"></a>
-<span class="sourceLineNo">178</span>  @Test<a name="line.178"></a>
-<span class="sourceLineNo">179</span>  public void testNoWritesWithDelete() throws Exception {<a name="line.179"></a>
-<span class="sourceLineNo">180</span>    Delete d = new Delete(Bytes.toBytes("to_reject"));<a name="line.180"></a>
-<span class="sourceLineNo">181</span>    writeUntilViolationAndVerifyViolation(SpaceViolationPolicy.NO_WRITES, d);<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>  @Test<a name="line.184"></a>
-<span class="sourceLineNo">185</span>  public void testNoCompactions() throws Exception {<a name="line.185"></a>
-<span class="sourceLineNo">186</span>    Put p = new Put(Bytes.toBytes("to_reject"));<a name="line.186"></a>
-<span class="sourceLineNo">187</span>    p.addColumn(<a name="line.187"></a>
-<span class="sourceLineNo">188</span>        Bytes.toBytes(SpaceQuotaHelperForTests.F1), Bytes.toBytes("to"), Bytes.toBytes("reject"));<a name="line.188"></a>
-<span class="sourceLineNo">189</span>    final TableName tn = writeUntilViolationAndVerifyViolation(<a name="line.189"></a>
-<span class="sourceLineNo">190</span>        SpaceViolationPolicy.NO_WRITES_COMPACTIONS, p);<a name="line.190"></a>
-<span class="sourceLineNo">191</span>    // We know the policy is active at this point<a name="line.191"></a>
-<span class="sourceLineNo">192</span><a name="line.192"></a>
-<span class="sourceLineNo">193</span>    // Major compactions should be rejected<a name="line.193"></a>
-<span class="sourceLineNo">194</span>    try {<a name="line.194"></a>
-<span class="sourceLineNo">195</span>      TEST_UTIL.getAdmin().majorCompact(tn);<a name="line.195"></a>
-<span class="sourceLineNo">196</span>      fail("Expected that invoking the compaction should throw an Exception");<a name="line.196"></a>
-<span class="sourceLineNo">197</span>    } catch (DoNotRetryIOException e) {<a name="line.197"></a>
-<span class="sourceLineNo">198</span>      // Expected!<a name="line.198"></a>
-<span class="sourceLineNo">199</span>    }<a name="line.199"></a>
-<span class="sourceLineNo">200</span>    // Minor compactions should also be rejected.<a name="line.200"></a>
-<span class="sourceLineNo">201</span>    try {<a name="line.201"></a>
-<span class="sourceLineNo">202</span>      TEST_UTIL.getAdmin().compact(tn);<a name="line.202"></a>
-<span class="sourceLineNo">203</span>      fail("Expected that invoking the compaction should throw an Exception");<a name="line.203"></a>
-<span class="sourceLineNo">204</span>    } catch (DoNotRetryIOException e) {<a name="line.204"></a>
-<span class="sourceLineNo">205</span>      // Expected!<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>  @Test<a name="line.209"></a>
-<span class="sourceLineNo">210</span>  public void testNoEnableAfterDisablePolicy() throws Exception {<a name="line.210"></a>
-<span class="sourceLineNo">211</span>    Put p = new Put(Bytes.toBytes("to_reject"));<a name="line.211"></a>
-<span class="sourceLineNo">212</span>    p.addColumn(<a name="line.212"></a>
-<span class="sourceLineNo">213</span>        Bytes.toBytes(SpaceQuotaHelperForTests.F1), Bytes.toBytes("to"), Bytes.toBytes("reject"));<a name="line.213"></a>
-<span class="sourceLineNo">214</span>    final TableName tn = writeUntilViolation(SpaceViolationPolicy.DISABLE);<a name="line.214"></a>
-<span class="sourceLineNo">215</span>    final Admin admin = TEST_UTIL.getAdmin();<a name="line.215"></a>
-<span class="sourceLineNo">216</span>    // Disabling a table relies on some external action (over the other policies), so wait a bit<a name="line.216"></a>
-<span class="sourceLineNo">217</span>    // more than the other tests.<a name="line.217"></a>
-<span class="sourceLineNo">218</span>    for (int i = 0; i &lt; NUM_RETRIES * 2; i++) {<a name="line.218"></a>
-<span class="sourceLineNo">219</span>      if (admin.isTableEnabled(tn)) {<a name="line.219"></a>
-<span class="sourceLineNo">220</span>        LOG.info(tn + " is still enabled, expecting it to be disabled. Will wait and re-check.");<a name="line.220"></a>
-<span class="sourceLineNo">221</span>        Thread.sleep(2000);<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>    assertFalse(tn + " is still enabled but it should be disabled", admin.isTableEnabled(tn));<a name="line.224"></a>
-<span class="sourceLineNo">225</span>    try {<a name="line.225"></a>
-<span class="sourceLineNo">226</span>      admin.enableTable(tn);<a name="line.226"></a>
-<span class="sourceLineNo">227</span>    } catch (AccessDeniedException e) {<a name="line.227"></a>
-<span class="sourceLineNo">228</span>      String exceptionContents = StringUtils.stringifyException(e);<a name="line.228"></a>
-<span class="sourceLineNo">229</span>      final String expectedText = "violated space quota";<a name="line.229"></a>
-<span class="sourceLineNo">230</span>      assertTrue("Expected the exception to contain " + expectedText + ", but was: "<a name="line.230"></a>
-<span class="sourceLineNo">231</span>          + exceptionContents, exceptionContents.contains(expectedText));<a name="line.231"></a>
-<span class="sourceLineNo">232</span>    }<a name="line.232"></a>
-<span class="sourceLineNo">233</span>  }<a name="line.233"></a>
-<span class="sourceLineNo">234</span><a name="line.234"></a>
-<span class="sourceLineNo">235</span>  @Test<a name="line.235"></a>
-<span class="sourceLineNo">236</span>  public void testNoBulkLoadsWithNoWrites() throws Exception {<a name="line.236"></a>
-<span class="sourceLineNo">237</span>    Put p = new Put(Bytes.toBytes("to_reject"));<a name="line.237"></a>
-<span class="sourceLineNo">238</span>    p.addColumn(<a name="line.238"></a>
-<span class="sourceLineNo">239</span>        Bytes.toBytes(SpaceQuotaHelperForTests.F1), Bytes.toBytes("to"), Bytes.toBytes("reject"));<a name="line.239"></a>
-<span class="sourceLineNo">240</span>    TableName tableName = writeUntilViolationAndVerifyViolation(SpaceViolationPolicy.NO_WRITES, p);<a name="line.240"></a>
-<span class="sourceLineNo">241</span><a name="line.241"></a>
-<span class="sourceLineNo">242</span>    // The table is now in violation. Try to do a bulk load<a name="line.242"></a>
-<span class="sourceLineNo">243</span>    ClientServiceCallable&lt;Boolean&gt; callable = helper.generateFileToLoad(tableName, 1, 50);<a name="line.243"></a>
-<span class="sourceLineNo">244</span>    RpcRetryingCallerFactory factory = new RpcRetryingCallerFactory(TEST_UTIL.getConfiguration());<a name="line.244"></a>
-<span class="sourceLineNo">245</span>    RpcRetryingCaller&lt;Boolean&gt; caller = factory.newCaller();<a name="line.245"></a>
-<span class="sourceLineNo">246</span>    try {<a name="line.246"></a>
-<span class="sourceLineNo">247</span>      caller.callWithRetries(callable, Integer.MAX_VALUE);<a name="line.247"></a>
-<span class="sourceLineNo">248</span>      fail("Expected the bulk load call to fail!");<a name="line.248"></a>
-<span class="sourceLineNo">249</span>    } catch (SpaceLimitingException e) {<a name="line.249"></a>
-<span class="sourceLineNo">250</span>      // Pass<a name="line.250"></a>
-<span class="sourceLineNo">251</span>      LOG.trace("Caught expected exception", e);<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>  @Test<a name="line.255"></a>
-<span class="sourceLineNo">256</span>  public void testAtomicBulkLoadUnderQuota() throws Exception {<a name="line.256"></a>
-<span class="sourceLineNo">257</span>    // Need to verify that if the batch of hfiles cannot be loaded, none are loaded.<a name="line.257"></a>
-<span class="sourceLineNo">258</span>    TableName tn = helper.createTableWithRegions(10);<a name="line.258"></a>
-<span class="sourceLineNo">259</span><a name="line.259"></a>
-<span class="sourceLineNo">260</span>    final long sizeLimit = 50L * SpaceQuotaHelperForTests.ONE_KILOBYTE;<a name="line.260"></a>
-<span class="sourceLineNo">261</span>    QuotaSettings settings = QuotaSettingsFactory.limitTableSpace(<a name="line.261"></a>
-<span class="sourceLineNo">262</span>        tn, sizeLimit, SpaceViolationPolicy.NO_INSERTS);<a name="line.262"></a>
-<span class="sourceLineNo">263</span>    TEST_UTIL.getAdmin().setQuota(settings);<a name="line.263"></a>
-<span class="sourceLineNo">264</span><a name="line.264"></a>
-<span class="sourceLineNo">265</span>    HRegionServer rs = TEST_UTIL.getMiniHBaseCluster().getRegionServer(0);<a name="line.265"></a>
-<span class="sourceLineNo">266</span>    RegionServerSpaceQuotaManager spaceQuotaManager = rs.getRegionServerSpaceQuotaManager();<a name="line.266"></a>
-<span class="sourceLineNo">267</span>    Map&lt;TableName,SpaceQuotaSnapshot&gt; snapshots = spaceQuotaManager.copyQuotaSnapshots();<a name="line.267"></a>
-<span class="sourceLineNo">268</span>    Map&lt;RegionInfo,Long&gt; regionSizes = getReportedSizesForTable(tn);<a name="line.268"></a>
-<span class="sourceLineNo">269</span>    while (true) {<a name="line.269"></a>
-<span class="sourceLineNo">270</span>      SpaceQuotaSnapshot snapshot = snapshots.get(tn);<a name="line.270"></a>
-<span class="sourceLineNo">271</span>      if (snapshot != null &amp;&amp; snapshot.getLimit() &gt; 0) {<a name="line.271"></a>
-<span class="sourceLineNo">272</span>        break;<a name="line.272"></a>
-<span class="sourceLineNo">273</span>      }<a name="line.273"></a>
-<span class="sourceLineNo">274</span>      LOG.debug(<a name="line.274"></a>
-<span class="sourceLineNo">275</span>          "Snapshot does not yet realize quota limit: " + snapshots + ", regionsizes: " +<a name="line.275"></a>
-<span class="sourceLineNo">276</span>          regionSizes);<a name="line.276"></a>
-<span class="sourceLineNo">277</span>      Thread.sleep(3000);<a name="line.277"></a>
-<span class="sourceLineNo">278</span>      snapshots = spaceQuotaManager.copyQuotaSnapshots();<a name="line.278"></a>
-<span class="sourceLineNo">279</span>      regionSizes = getReportedSizesForTable(tn);<a name="line.279"></a>
-<span class="sourceLineNo">280</span>    }<a name="line.280"></a>
-<span class="sourceLineNo">281</span>    // Our quota limit should be reflected in the latest snapshot<a name="line.281"></a>
-<span class="sourceLineNo">282</span>    SpaceQuotaSnapshot snapshot = snapshots.get(tn);<a name="line.282"></a>
-<span class="sourceLineNo">283</span>    assertEquals(0L, snapshot.getUsage());<a name="line.283"></a>
-<span class="sourceLineNo">284</span>    assertEquals(sizeLimit, snapshot.getLimit());<a name="line.284"></a>
-<span class="sourceLineNo">285</span><a name="line.285"></a>
-<span class="sourceLineNo">286</span>    // We would also not have a "real" policy in violation<a name="line.286"></a>
-<span class="sourceLineNo">287</span>    ActivePolicyEnforcement activePolicies = spaceQuotaManager.getActiveEnforcements();<a name="line.287"></a>
-<span class="sourceLineNo">288</span>    SpaceViolationPolicyEnforcement enforcement = activePolicies.getPolicyEnforcement(tn);<a name="line.288"></a>
-<span class="sourceLineNo">289</span>    assertTrue(<a name="line.289"></a>
-<span class="sourceLineNo">290</span>        "Expected to find Noop policy, but got " + enforcement.getClass().getSimpleName(),<a name="line.290"></a>
-<span class="sourceLineNo">291</span>        enforcement instanceof DefaultViolationPolicyEnforcement);<a name="line.291"></a>
-<span class="sourceLineNo">292</span><a name="line.292"></a>
-<span class="sourceLineNo">293</span>    // Should generate two files, each of which is over 25KB each<a name="line.293"></a>
-<span class="sourceLineNo">294</span>    ClientServiceCallable&lt;Boolean&gt; callable = helper.generateFileToLoad(tn, 2, 525);<a name="line.294"></a>
-<span class="sourceLineNo">295</span>    FileSystem fs = TEST_UTIL.getTestFileSystem();<a name="line.295"></a>
-<span class="sourceLineNo">296</span>    FileStatus[] files = fs.listStatus(<a name="line.296"></a>
-<span class="sourceLineNo">297</span>        new Path(fs.getHomeDirectory(), testName.getMethodName() + "_files"));<a name="line.297"></a>
-<span class="sourceLineNo">298</span>    for (FileStatus file : files) {<a name="line.298"></a>
-<span class="sourceLineNo">299</span>      assertTrue(<a name="line.299"></a>
-<span class="sourceLineNo">300</span>          "Expected the file, " + file.getPath() + ",  length to be larger than 25KB, but was "<a name="line.300"></a>
-<span class="sourceLineNo">301</span>              + file.getLen(),<a name="line.301"></a>
-<span class="sourceLineNo">302</span>          file.getLen() &gt; 25 * SpaceQuotaHelperForTests.ONE_KILOBYTE);<a name="line.302"></a>
-<span class="sourceLineNo">303</span>      LOG.debug(file.getPath() + " -&gt; " + file.getLen() +"B");<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>    RpcRetryingCallerFactory factory = new RpcRetryingCallerFactory(TEST_UTIL.getConfiguration());<a name="line.306"></a>
-<span class="sourceLineNo">307</span>    RpcRetryingCaller&lt;Boolean&gt; caller = factory.newCaller();<a name="line.307"></a>
-<span class="sourceLineNo">308</span>    try {<a name="line.308"></a>
-<span class="sourceLineNo">309</span>      caller.callWithRetries(callable, Integer.MAX_VALUE);<a name="line.309"></a>
-<span class="sourceLineNo">310</span>      fail("Expected the bulk load call to fail!");<a name="line.310"></a>
-<span class="sourceLineNo">311</span>    } catch (SpaceLimitingException e) {<a name="line.311"></a>
-<span class="sourceLineNo">312</span>      // Pass<a name="line.312"></a>
-<span class="sourceLineNo">313</span>      LOG.trace("Caught expected exception", e);<a name="line.313"></a>
-<span class="sourceLineNo">314</span>    }<a name="line.314"></a>
-<span class="sourceLineNo">315</span>    // Verify that we have no data in the table because neither file should have been<a name="line.315"></a>
-<span class="sourceLineNo">316</span>    // loaded even though one of the files could have.<a name="line.316"></a>
-<span class="sourceLineNo">317</span>    Table table = TEST_UTIL.getConnection().getTable(tn);<a name="line.317"></a>
-<span class="sourceLineNo">318</span>    ResultScanner scanner = table.getScanner(new Scan());<a name="line.318"></a>
-<span class="sourceLineNo">319</span>    try {<a name="line.319"></a>
-<span class="sourceLineNo">320</span>      assertNull("Expected no results", scanner.next());<a name="line.320"></a>
-<span class="sourceLineNo">321</span>    } finally{<a name="line.321"></a>
-<span class="sourceLineNo">322</span>      scanner.close();<a name="line.322"></a>
-<span class="sourceLineNo">323</span>    }<a name="line.323"></a>
-<span class="sourceLineNo">324</span>  }<a name="line.324"></a>
-<span class="sourceLineNo">325</span><a name="line.325"></a>
-<span class="sourceLineNo">326</span>  @Test<a name="line.326"></a>
-<span class="sourceLineNo">327</span>  public void testTableQuotaOverridesNamespaceQuota() throws Exception {<a name="line.327"></a>
-<span class="sourceLineNo">328</span>    final SpaceViolationPolicy policy = SpaceViolationPolicy.NO_INSERTS;<a name="line.328"></a>
-<span class="sourceLineNo">329</span>    final TableName tn = helper.createTableWithRegions(10);<a name="line.329"></a>
-<span class="sourceLineNo">330</span><a name="line.330"></a>
-<span class="sourceLineNo">331</span>    // 2MB limit on the table, 1GB limit on the namespace<a name="line.331"></a>
-<span class="sourceLineNo">332</span>    final long tableLimit = 2L * SpaceQuotaHelperForTests.ONE_MEGABYTE;<a name="line.332"></a>
-<span class="sourceLineNo">333</span>    final long namespaceLimit = 1024L * SpaceQuotaHelperForTests.ONE_MEGABYTE;<a name="line.333"></a>
-<span class="sourceLineNo">334</span>    TEST_UTIL.getAdmin().setQuota(QuotaSettingsFactory.limitTableSpace(tn, tableLimit, policy));<a name="line.334"></a>
-<span class="sourceLineNo">335</span>    TEST_UTIL.getAdmin().setQuota(QuotaSettingsFactory.limitNamespaceSpace(<a name="line.335"></a>
-<span class="sourceLineNo">336</span>        tn.getNamespaceAsString(), namespaceLimit, policy));<a name="line.336"></a>
-<span class="sourceLineNo">337</span><a name="line.337"></a>
-<span class="sourceLineNo">338</span>    // Write more data than should be allowed and flush it to disk<a name="line.338"></a>
-<span class="sourceLineNo">339</span>    helper.writeData(tn, 3L * SpaceQuotaHelperForTests.ONE_MEGABYTE);<a name="line.339"></a>
-<span class="sourceLineNo">340</span><a name="line.340"></a>
-<span class="sourceLineNo">341</span>    // This should be sufficient time for the chores to run and see the change.<a name="line.341"></a>
-<span class="sourceLineNo">342</span>    Thread.sleep(5000);<a name="line.342"></a>
-<span class="sourceLineNo">343</span><a name="line.343"></a>
-<span class="sourceLineNo">344</span>    // The write should be rejected because the table quota takes priority over the namespace<a name="line.344"></a>
-<span class="sourceLineNo">345</span>    Put p = new Put(Bytes.toBytes("to_reject"));<a name="line.345"></a>
-<span class="sourceLineNo">346</span>    p.addColumn(<a name="line.346"></a>
-<span class="sourceLineNo">347</span>        Bytes.toBytes(SpaceQuotaHelperForTests.F1), Bytes.toBytes("to"), Bytes.toBytes("reject"));<a name="line.347"></a>
-<span class="sourceLineNo">348</span>    verifyViolation(policy, tn, p);<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>  private Map&lt;RegionInfo,Long&gt; getReportedSizesForTable(TableName tn) {<a name="line.351"></a>
-<span class="sourceLineNo">352</span>    HMaster master = TEST_UTIL.getMiniHBaseCluster().getMaster();<a name="line.352"></a>
-<span class="sourceLineNo">353</span>    MasterQuotaManager quotaManager = master.getMasterQuotaManager();<a name="line.353"></a>
-<span class="sourceLineNo">354</span>    Map&lt;RegionInfo,Long&gt; filteredRegionSizes = new HashMap&lt;&gt;();<a name="line.354"></a>
-<span class="sourceLineNo">355</span>    for (Entry&lt;RegionInfo,Long&gt; entry : quotaManager.snapshotRegionSizes().entrySet()) {<a name="line.355"></a>
-<span class="sourceLineNo">356</span>      if (entry.getKey().getTable().equals(tn)) {<a name="line.356"></a>
-<span class="sourceLineNo">357</span>        filteredRegionSizes.put(entry.getKey(), entry.getValue());<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>    return filteredRegionSizes;<a name="line.360"></a>
-<span class="sourceLineNo">361</span>  }<a name="line.361"></a>
-<span class="sourceLineNo">362</span><a name="line.362"></a>
-<span class="sourceLineNo">363</span>  private TableName writeUntilViolation(SpaceViolationPolicy policyToViolate) throws Exception {<a name="line.363"></a>
-<span class="sourceLineNo">364</span>    TableName tn = helper.createTableWithRegions(10);<a name="line.364"></a>
-<span class="sourceLineNo">365</span><a name="line.365"></a>
-<span class="sourceLineNo">366</span>    final long sizeLimit = 2L * SpaceQuotaHelperForTests.ONE_MEGABYTE;<a name="line.366"></a>
-<span class="sourceLineNo">367</span>    QuotaSettings settings = QuotaSettingsFactory.limitTableSpace(tn, sizeLimit, policyToViolate);<a name="line.367"></a>
-<span class="sourceLineNo">368</span>    TEST_UTIL.getAdmin().setQuota(settings);<a name="line.368"></a>
-<span class="sourceLineNo">369</span><a name="line.369"></a>
-<span class="sourceLineNo">370</span>    // Write more data than should be allowed and flush it to disk<a name="line.370"></a>
-<span class="sourceLineNo">371</span>    helper.writeData(tn, 3L * SpaceQuotaHelperForTests.ONE_MEGABYTE);<a name="line.371"></a>
-<span class="sourceLineNo">372</span><a name="line.372"></a>
-<span class="sourceLineNo">373</span>    // This should be sufficient time for the chores to run and see the change.<a name="line.373"></a>
-<span class="sourceLineNo">374</span>    Thread.sleep(5000);<a name="line.374"></a>
-<span class="sourceLineNo">375</span><a name="line.375"></a>
-<span class="sourceLineNo">376</span>    return tn;<a name="line.376"></a>
-<span class="sourceLineNo">377</span>  }<a name="line.377"></a>
-<span class="sourceLineNo">378</span><a name="line.378"></a>
-<span class="sourceLineNo">379</span>  private TableName writeUntilViolationAndVerifyViolation(<a name="line.379"></a>
-<span class="sourceLineNo">380</span>      SpaceViolationPolicy policyToViolate, Mutation m) throws Exception {<a name="line.380"></a>
-<span class="sourceLineNo">381</span>    final TableName tn = writeUntilViolation(policyToViolate);<a name="line.381"></a>
-<span class="sourceLineNo">382</span>    verifyViolation(policyToViolate, tn, m);<a name="line.382"></a>
-<span class="sourceLineNo">383</span>    return tn;<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 void verifyViolation(<a name="line.386"></a>
-<span class="sourceLineNo">387</span>      SpaceViolationPolicy policyToViolate, TableName tn, Mutation m) throws Exception {<a name="line.387"></a>
-<span class="sourceLineNo">388</span>    // But let's try a few times to get the exception before failing<a name="line.388"></a>
-<span class="sourceLineNo">389</span>    boolean sawError = false;<a name="line.389"></a>
-<span class="sourceLineNo">390</span>    for (int i = 0; i &lt; NUM_RETRIES &amp;&amp; !sawError; i++) {<a name="line.390"></a>
-<span class="sourceLineNo">391</span>      try (Table table = TEST_UTIL.getConnection().getTable(tn)) {<a name="line.391"></a>
-<span class="sourceLineNo">392</span>        if (m instanceof Put) {<a name="line.392"></a>
-<span class="sourceLineNo">393</span>          table.put((Put) m);<a name="line.393"></a>
-<span class="sourceLineNo">394</span>        } else if (m instanceof Delete) {<a name="line.394"></a>
-<span class="sourceLineNo">395</span>          table.delete((Delete) m);<a name="line.395"></a>
-<span class="sourceLineNo">396</span>        } else if (m instanceof Append) {<a name="line.396"></a>
-<span class="sourceLineNo">397</span>          table.append((Append) m);<a name="line.397"></a>
-<span class="sourceLineNo">398</span>        } else if (m instanceof Increment) {<a name="line.398"></a>
-<span class="sourceLineNo">399</span>          table.increment((Increment) m);<a name="line.399"></a>
-<span class="sourceLineNo">400</span>        } else {<a name="line.400"></a>
-<span class="sourceLineNo">401</span>          fail(<a name="line.401"></a>
-<span class="sourceLineNo">402</span>              "Failed to apply " + m.getClass().getSimpleName() +<a name="line.402"></a>
-<span class="sourceLineNo">403</span>              " to the table. Programming error");<a name="line.403"></a>
-<span class="sourceLineNo">404</span>        }<a name="line.404"></a>
-<span class="sourceLineNo">405</span>        LOG.info("Did not reject the " + m.getClass().getSimpleName() + ", will sleep and retry");<a name="line.405"></a>
-<span class="sourceLineNo">406</span>        Thread.sleep(2000);<a name="line.406"></a>
-<span class="sourceLineNo">407</span>      } catch (Exception e) {<a name="line.407"></a>
-<span class="sourceLineNo">408</span>        String msg = StringUtils.stringifyException(e);<a name="line.408"></a>
-<span class="sourceLineNo">409</span>        assertTrue("Expected exception message to contain the word '" + policyToViolate.name() +<a name="line.409"></a>
-<span class="sourceLineNo">410</span>            "', but was " + msg, msg.contains(policyToViolate.name()));<a name="line.410"></a>
-<span class="sourceLineNo">411</span>        sawError = true;<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>    if (!sawError) {<a name="line.414"></a>
-<span class="sourceLineNo">415</span>      try (Table quotaTable = TEST_UTIL.getConnection().getTable(QuotaUtil.QUOTA_TABLE_NAME)) {<a name="line.415"></a>
-<span class="sourceLineNo">416</span>        ResultScanner scanner = quotaTable.getScanner(new Scan());<a name="line.416"></a>
-<span class="sourceLineNo">417</span>        Result result = null;<a name="line.417"></a>
-<span class="sourceLineNo">418</span>        LOG.info("Dumping contents of hbase:quota table");<a name="line.418"></a>
-<span class="sourceLineNo">419</span>        while ((result = scanner.next()) != null) {<a name="line.419"></a>
-<span class="sourceLineNo">420</span>          LOG.info(Bytes.toString(result.getRow()) + " =&gt; " + result.toString());<a name="line.420"></a>
-<span class="sourceLineNo">421</span>        }<a name="line.421"></a>
-<span class="sourceLineNo">422</span>        scanner.close();<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>    assertTrue(<a name="line.425"></a>
-<span class="sourceLineNo">426</span>        "Expected to see an exception writing data to a table exceeding its quota", sawError);<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">038</span>import org.apache.hadoop.hbase.TableNotEnabledException;<a name="line.38"></a>
+<span class="sourceLineNo">039</span>import org.apache.hadoop.hbase.client.Admin;<a name="line.39"></a>
+<span class="sourceLineNo">040</span>import org.apache.hadoop.hbase.client.Append;<a name="line.40"></a>
+<span class="sourceLineNo">041</span>import org.apache.hadoop.hbase.client.ClientServiceCallable;<a name="line.41"></a>
+<span class="sourceLineNo">042</span>import org.apache.hadoop.hbase.client.Connection;<a name="line.42"></a>
+<span class="sourceLineNo">043</span>import org.apache.hadoop.hbase.client.Delete;<a name="line.43"></a>
+<span class="sourceLineNo">044</span>import org.apache.hadoop.hbase.client.Increment;<a name="line.44"></a>
+<span class="sourceLineNo">045</span>import org.apache.hadoop.hbase.client.Mutation;<a name="line.45"></a>
+<span class="sourceLineNo">046</span>import org.apache.hadoop.hbase.client.Put;<a name="line.46"></a>
+<span class="sourceLineNo">047</span>import org.apache.hadoop.hbase.client.RegionInfo;<a name="line.47"></a>
+<span class="sourceLineNo">048</span>import org.apache.hadoop.hbase.client.Result;<a name="line.48"></a>
+<span class="sourceLineNo">049</span>import org.apache.hadoop.hbase.client.ResultScanner;<a name="line.49"></a>
+<span class="sourceLineNo">050</span>import org.apache.hadoop.hbase.client.RpcRetryingCaller;<a name="line.50"></a>
+<span class="sourceLineNo">051</span>import org.apache.hadoop.hbase.client.RpcRetryingCallerFactory;<a name="line.51"></a>
+<span class="sourceLineNo">052</span>import org.apache.hadoop.hbase.client.Scan;<a name="line.52"></a>
+<span class="sourceLineNo">053</span>import org.apache.hadoop.hbase.client.Table;<a name="line.53"></a>
+<span class="sourceLineNo">054</span>import org.apache.hadoop.hbase.master.HMaster;<a name="line.54"></a>
+<span class="sourceLineNo">055</span>import org.apache.hadoop.hbase.quotas.policies.DefaultViolationPolicyEnforcement;<a name="line.55"></a>
+<span class="sourceLineNo">056</span>import org.apache.hadoop.hbase.regionserver.HRegionServer;<a name="line.56"></a>
+<span class="sourceLineNo">057</span>import org.apache.hadoop.hbase.security.AccessDeniedException;<a name="line.57"></a>
+<span class="sourceLineNo">058</span>import org.apache.hadoop.hbase.testclassification.LargeTests;<a name="line.58"></a>
+<span class="sourceLineNo">059</span>import org.apache.hadoop.hbase.util.Bytes;<a name="line.59"></a>
+<span class="sourceLineNo">060</span>import org.apache.hadoop.util.StringUtils;<a name="line.60"></a>
+<span class="sourceLineNo">061</span>import org.junit.AfterClass;<a name="line.61"></a>
+<span class="sourceLineNo">062</span>import org.junit.Before;<a name="line.62"></a>
+<span class="sourceLineNo">063</span>import org.junit.BeforeClass;<a name="line.63"></a>
+<span class="sourceLineNo">064</span>import org.junit.ClassRule;<a name="line.64"></a>
+<span class="sourceLineNo">065</span>import org.junit.Rule;<a name="line.65"></a>
+<span class="sourceLineNo">066</span>import org.junit.Test;<a name="line.66"></a>
+<span class="sourceLineNo">067</span>import org.junit.experimental.categories.Category;<a name="line.67"></a>
+<span class="sourceLineNo">068</span>import org.junit.rules.TestName;<a name="line.68"></a>
+<span class="sourceLineNo">069</span>import org.slf4j.Logger;<a name="line.69"></a>
+<span class="sourceLineNo">070</span>import org.slf4j.LoggerFactory;<a name="line.70"></a>
+<span class="sourceLineNo">071</span><a name="line.71"></a>
+<span class="sourceLineNo">072</span>/**<a name="line.72"></a>
+<span class="sourceLineNo">073</span> * End-to-end test class for filesystem space quotas.<a name="line.73"></a>
+<span class="sourceLineNo">074</span> */<a name="line.74"></a>
+<span class="sourceLineNo">075</span>@Category(LargeTests.class)<a name="line.75"></a>
+<span class="sourceLineNo">076</span>public class TestSpaceQuotas {<a name="line.76"></a>
+<span class="sourceLineNo">077</span><a name="line.77"></a>
+<span class="sourceLineNo">078</span>  @ClassRule<a name="line.78"></a>
+<span class="sourceLineNo">079</span>  public static final HBaseClassTestRule CLASS_RULE =<a name="line.79"></a>
+<span class="sourceLineNo">080</span>      HBaseClassTestRule.forClass(TestSpaceQuotas.class);<a name="line.80"></a>
+<span class="sourceLineNo">081</span><a name="line.81"></a>
+<span class="sourceLineNo">082</span>  private static final Logger LOG = LoggerFactory.getLogger(TestSpaceQuotas.class);<a name="line.82"></a>
+<span class="sourceLineNo">083</span>  private static final HBaseTestingUtility TEST_UTIL = new HBaseTestingUtility();<a name="line.83"></a>
+<span class="sourceLineNo">084</span>  // Global for all tests in the class<a name="line.84"></a>
+<span class="sourceLineNo">085</span>  private static final AtomicLong COUNTER = new AtomicLong(0);<a name="line.85"></a>
+<span class="sourceLineNo">086</span>  private static final int NUM_RETRIES = 10;<a name="line.86"></a>
+<span class="sourceLineNo">087</span><a name="line.87"></a>
+<span class="sourceLineNo">088</span>  @Rule<a name="line.88"></a>
+<span class="sourceLineNo">089</span>  public TestName testName = new TestName();<a name="line.89"></a>
+<span class="sourceLineNo">090</span>  private SpaceQuotaHelperForTests helper;<a name="line.90"></a>
+<span class="sourceLineNo">091</span><a name="line.91"></a>
+<span class="sourceLineNo">092</span>  @BeforeClass<a name="line.92"></a>
+<span class="sourceLineNo">093</span>  public static void setUp() throws Exception {<a name="line.93"></a>
+<span class="sourceLineNo">094</span>    Configuration conf = TEST_UTIL.getConfiguration();<a name="line.94"></a>
+<span class="sourceLineNo">095</span>    SpaceQuotaHelperForTests.updateConfigForQuotas(conf);<a name="line.95"></a>
+<span class="sourceLineNo">096</span>    TEST_UTIL.startMiniCluster(1);<a name="line.96"></a>
+<span class="sourceLineNo">097</span>  }<a name="line.97"></a>
+<span class="sourceLineNo">098</span><a name="line.98"></a>
+<span class="sourceLineNo">099</span>  @AfterClass<a name="line.99"></a>
+<span class="sourceLineNo">100</span>  public static void tearDown() throws Exception {<a name="line.100"></a>
+<span class="sourceLineNo">101</span>    TEST_UTIL.shutdownMiniCluster();<a name="line.101"></a>
+<span class="sourceLineNo">102</span>  }<a name="line.102"></a>
+<span class="sourceLineNo">103</span><a name="line.103"></a>
+<span class="sourceLineNo">104</span>  @Before<a name="line.104"></a>
+<span class="sourceLineNo">105</span>  public void removeAllQuotas() throws Exception {<a name="line.105"></a>
+<span class="sourceLineNo">106</span>    final Connection conn = TEST_UTIL.getConnection();<a name="line.106"></a>
+<span class="sourceLineNo">107</span>    if (helper == null) {<a name="line.107"></a>
+<span class="sourceLineNo">108</span>      helper = new SpaceQuotaHelperForTests(TEST_UTIL, testName, COUNTER);<a name="line.108"></a>
+<span class="sourceLineNo">109</span>    }<a name="line.109"></a>
+<span class="sourceLineNo">110</span>    // Wait for the quota table to be created<a name="line.110"></a>
+<span class="sourceLineNo">111</span>    if (!conn.getAdmin().tableExists(QuotaUtil.QUOTA_TABLE_NAME)) {<a name="line.111"></a>
+<span class="sourceLineNo">112</span>      helper.waitForQuotaTable(conn);<a name="line.112"></a>
+<span class="sourceLineNo">113</span>    } else {<a name="line.113"></a>
+<span class="sourceLineNo">114</span>      // Or, clean up any quotas from previous test runs.<a name="line.114"></a>
+<span class="sourceLineNo">115</span>      helper.removeAllQuotas(conn);<a name="line.115"></a>
+<span class="sourceLineNo">116</span>      assertEquals(0, helper.listNumDefinedQuotas(conn));<a name="line.116"></a>
+<span class="sourceLineNo">117</span>    }<a name="line.117"></a>
+<span class="sourceLineNo">118</span>  }<a name="line.118"></a>
+<span class="sourceLineNo">119</span><a name="line.119"></a>
+<span class="sourceLineNo">120</span>  @Test<a name="line.120"></a>
+<span class="sourceLineNo">121</span>  public void testNoInsertsWithPut() throws Exception {<a name="line.121"></a>
+<span class="sourceLineNo">122</span>    Put p = new Put(Bytes.toBytes("to_reject"));<a name="line.122"></a>
+<span class="sourceLineNo">123</span>    p.addColumn(<a name="line.123"></a>
+<span class="sourceLineNo">124</span>        Bytes.toBytes(SpaceQuotaHelperForTests.F1), Bytes.toBytes("to"), Bytes.toBytes("reject"));<a name="line.124"></a>
+<span class="sourceLineNo">125</span>    writeUntilViolationAndVerifyViolation(SpaceViolationPolicy.NO_INSERTS, p);<a name="line.125"></a>
+<span class="sourceLineNo">126</span>  }<a name="line.126"></a>
+<span class="sourceLineNo">127</span><a name="line.127"></a>
+<span class="sourceLineNo">128</span>  @Test<a name="line.128"></a>
+<span class="sourceLineNo">129</span>  public void testNoInsertsWithAppend() throws Exception {<a name="line.129"></a>
+<span class="sourceLineNo">130</span>    Append a = new Append(Bytes.toBytes("to_reject"));<a name="line.130"></a>
+<span class="sourceLineNo">131</span>    a.addColumn(<a name="line.131"></a>
+<span class="sourceLineNo">132</span>        Bytes.toBytes(SpaceQuotaHelperForTests.F1), Bytes.toBytes("to"), Bytes.toBytes("reject"));<a name="line.132"></a>
+<span class="sourceLineNo">133</span>    writeUntilViolationAndVerifyViolation(SpaceViolationPolicy.NO_INSERTS, a);<a name="line.133"></a>
+<span class="sourceLineNo">134</span>  }<a name="line.134"></a>
+<span class="sourceLineNo">135</span><a name="line.135"></a>
+<span class="sourceLineNo">136</span>  @Test<a name="line.136"></a>
+<span class="sourceLineNo">137</span>  public void testNoInsertsWithIncrement() throws Exception {<a name="line.137"></a>
+<span class="sourceLineNo">138</span>    Increment i = new Increment(Bytes.toBytes("to_reject"));<a name="line.138"></a>
+<span class="sourceLineNo">139</span>    i.addColumn(Bytes.toBytes(SpaceQuotaHelperForTests.F1), Bytes.toBytes("count"), 0);<a name="line.139"></a>
+<span class="sourceLineNo">140</span>    writeUntilViolationAndVerifyViolation(SpaceViolationPolicy.NO_INSERTS, i);<a name="line.140"></a>
+<span class="sourceLineNo">141</span>  }<a name="line.141"></a>
+<span class="sourceLineNo">142</span><a name="line.142"></a>
+<span class="sourceLineNo">143</span>  @Test<a name="line.143"></a>
+<span class="sourceLineNo">144</span>  public void testDeletesAfterNoInserts() throws Exception {<a name="line.144"></a>
+<span class="sourceLineNo">145</span>    final TableName tn = writeUntilViolation(SpaceViolationPolicy.NO_INSERTS);<a name="line.145"></a>
+<span class="sourceLineNo">146</span>    // Try a couple of times to verify that the quota never gets enforced, same as we<a name="line.146"></a>
+<span class="sourceLineNo">147</span>    // do when we're trying to catch the failure.<a name="line.147"></a>
+<span class="sourceLineNo">148</span>    Delete d = new Delete(Bytes.toBytes("should_not_be_rejected"));<a name="line.148"></a>
+<span class="sourceLineNo">149</span>    for (int i = 0; i &lt; NUM_RETRIES; i++) {<a name="line.149"></a>
+<span class="sourceLineNo">150</span>      try (Table t = TEST_UTIL.getConnection().getTable(tn)) {<a name="line.150"></a>
+<span class="sourceLineNo">151</span>        t.delete(d);<a name="line.151"></a>
+<span class="sourceLineNo">152</span>      }<a name="line.152"></a>
+<span class="sourceLineNo">153</span>    }<a name="line.153"></a>
+<span class="sourceLineNo">154</span>  }<a name="line.154"></a>
+<span class="sourceLineNo">155</span><a name="line.155"></a>
+<span class="sourceLineNo">156</span>  @Test<a name="line.156"></a>
+<span class="sourceLineNo">157</span>  public void testNoWritesWithPut() throws Exception {<a name="line.157"></a>
+<span class="sourceLineNo">158</span>    Put p = new Put(Bytes.toBytes("to_reject"));<a name="line.158"></a>
+<span class="sourceLineNo">159</span>    p.addColumn(<a name="line.159"></a>
+<span class="sourceLineNo">160</span>        Bytes.toBytes(SpaceQuotaHelperForTests.F1), Bytes.toBytes("to"), Bytes.toBytes("reject"));<a name="line.160"></a>
+<span class="sourceLineNo">161</span>    writeUntilViolationAndVerifyViolation(SpaceViolationPolicy.NO_WRITES, p);<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>  @Test<a name="line.164"></a>
+<span class="sourceLineNo">165</span>  public void testNoWritesWithAppend() throws Exception {<a name="line.165"></a>
+<span class="sourceLineNo">166</span>    Append a = new Append(Bytes.toBytes("to_reject"));<a name="line.166"></a>
+<span class="sourceLineNo">167</span>    a.addColumn(<a name="line.167"></a>
+<span class="sourceLineNo">168</span>        Bytes.toBytes(SpaceQuotaHelperForTests.F1), Bytes.toBytes("to"), Bytes.toBytes("reject"));<a name="line.168"></a>
+<span class="sourceLineNo">169</span>    writeUntilViolationAndVerifyViolation(SpaceViolationPolicy.NO_WRITES, a);<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>  @Test<a name="line.172"></a>
+<span class="sourceLineNo">173</span>  public void testNoWritesWithIncrement() throws Exception {<a name="line.173"></a>
+<span class="sourceLineNo">174</span>    Increment i = new Increment(Bytes.toBytes("to_reject"));<a name="line.174"></a>
+<span class="sourceLineNo">175</span>    i.addColumn(Bytes.toBytes(SpaceQuotaHelperForTests.F1), Bytes.toBytes("count"), 0);<a name="line.175"></a>
+<span class="sourceLineNo">176</span>    writeUntilViolationAndVerifyViolation(SpaceViolationPolicy.NO_WRITES, i);<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>  @Test<a name="line.179"></a>
+<span class="sourceLineNo">180</span>  public void testNoWritesWithDelete() throws Exception {<a name="line.180"></a>
+<span class="sourceLineNo">181</span>    Delete d = new Delete(Bytes.toBytes("to_reject"));<a name="line.181"></a>
+<span class="sourceLineNo">182</span>    writeUntilViolationAndVerifyViolation(SpaceViolationPolicy.NO_WRITES, d);<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>  @Test<a name="line.185"></a>
+<span class="sourceLineNo">186</span>  public void testNoCompactions() throws Exception {<a name="line.186"></a>
+<span class="sourceLineNo">187</span>    Put p = new Put(Bytes.toBytes("to_reject"));<a name="line.187"></a>
+<span class="sourceLineNo">188</span>    p.addColumn(<a name="line.188"></a>
+<span class="sourceLineNo">189</span>        Bytes.toBytes(SpaceQuotaHelperForTests.F1), Bytes.toBytes("to"), Bytes.toBytes("reject"));<a name="line.189"></a>
+<span class="sourceLineNo">190</span>    final TableName tn = writeUntilViolationAndVerifyViolation(<a name="line.190"></a>
+<span class="sourceLineNo">191</span>        SpaceViolationPolicy.NO_WRITES_COMPACTIONS, p);<a name="line.191"></a>
+<span class="sourceLineNo">192</span>    // We know the policy is active at this point<a name="line.192"></a>
+<span class="sourceLineNo">193</span><a name="line.193"></a>
+<span class="sourceLineNo">194</span>    // Major compactions should be rejected<a name="line.194"></a>
+<span class="sourceLineNo">195</span>    try {<a name="line.195"></a>
+<span class="sourceLineNo">196</span>      TEST_UTIL.getAdmin().majorCompact(tn);<a name="line.196"></a>
+<span class="sourceLineNo">197</span>      fail("Expected that invoking the compaction should throw an Exception");<a name="line.197"></a>
+<span class="sourceLineNo">198</span>    } catch (DoNotRetryIOException e) {<a name="line.198"></a>
+<span class="sourceLineNo">199</span>      // Expected!<a name="line.199"></a>
+<span class="sourceLineNo">200</span>    }<a name="line.200"></a>
+<span class="sourceLineNo">201</span>    // Minor compactions should also be rejected.<a name="line.201"></a>
+<span class="sourceLineNo">202</span>    try {<a name="line.202"></a>
+<span class="sourceLineNo">203</span>      TEST_UTIL.getAdmin().compact(tn);<a name="line.203"></a>
+<span class="sourceLineNo">204</span>      fail("Expected that invoking the compaction should throw an Exception");<a name="line.204"></a>
+<span class="sourceLineNo">205</span>    } catch (DoNotRetryIOException e) {<a name="line.205"></a>
+<span class="sourceLineNo">206</span>      // Expected!<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>  @Test<a name="line.210"></a>
+<span class="sourceLineNo">211</span>  public void testNoEnableAfterDisablePolicy() throws Exception {<a name="line.211"></a>
+<span class="sourceLineNo">212</span>    Put p = new Put(Bytes.toBytes("to_reject"));<a name="line.212"></a>
+<span class="sourceLineNo">213</span>    p.addColumn(<a name="line.213"></a>
+<span class="sourceLineNo">214</span>        Bytes.toBytes(SpaceQuotaHelperForTests.F1), Bytes.toBytes("to"), Bytes.toBytes("reject"));<a name="line.214"></a>
+<span class="sourceLineNo">215</span>    final TableName tn = writeUntilViolation(SpaceViolationPolicy.DISABLE);<a name="line.215"></a>
+<span class="sourceLineNo">216</span>    final Admin admin = TEST_UTIL.getAdmin();<a name="line.216"></a>
+<span class="sourceLineNo">217</span>    // Disabling a table relies on some external action (over the other policies), so wait a bit<a name="line.217"></a>
+<span class="sourceLineNo">218</span>    // more than the other tests.<a name="line.218"></a>
+<span class="sourceLineNo">219</span>    for (int i = 0; i &lt; NUM_RETRIES * 2; i++) {<a name="line.219"></a>
+<span class="sourceLineNo">220</span>      if (admin.isTableEnabled(tn)) {<a name="line.220"></a>
+<span class="sourceLineNo">221</span>        LOG.info(tn + " is still enabled, expecting it to be disabled. Will wait and re-check.");<a name="line.221"></a>
+<span class="sourceLineNo">222</span>        Thread.sleep(2000);<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>    assertFalse(tn + " is still enabled but it should be disabled", admin.isTableEnabled(tn));<a name="line.225"></a>
+<span class="sourceLineNo">226</span>    try {<a name="line.226"></a>
+<span class="sourceLineNo">227</span>      admin.enableTable(tn);<a name="line.227"></a>
+<span class="sourceLineNo">228</span>    } catch (AccessDeniedException e) {<a name="line.228"></a>
+<span class="sourceLineNo">229</span>      String exceptionContents = StringUtils.stringifyException(e);<a name="line.229"></a>
+<span class="sourceLineNo">230</span>      final String expectedText = "violated space quota";<a name="line.230"></a>
+<span class="sourceLineNo">231</span>      assertTrue("Expected the exception to contain " + expectedText + ", but was: "<a name="line.231"></a>
+<span class="sourceLineNo">232</span>          + exceptionContents, exceptionContents.contains(expectedText));<a name="line.232"></a>
+<span class="sourceLineNo">233</span>    }<a name="line.233"></a>
+<span class="sourceLineNo">234</span>  }<a name="line.234"></a>
+<span class="sourceLineNo">235</span><a name="line.235"></a>
+<span class="sourceLineNo">236</span>  @Test<a name="line.236"></a>
+<span class="sourceLineNo">237</span>  public void testNoBulkLoadsWithNoWrites() throws Exception {<a name="line.237"></a>
+<span class="sourceLineNo">238</span>    Put p = new Put(Bytes.toBytes("to_reject"));<a name="line.238"></a>
+<span class="sourceLineNo">239</span>    p.addColumn(<a name="line.239"></a>
+<span class="sourceLineNo">240</span>        Bytes.toBytes(SpaceQuotaHelperForTests.F1), Bytes.toBytes("to"), Bytes.toBytes("reject"));<a name="line.240"></a>
+<span class="sourceLineNo">241</span>    TableName tableName = writeUntilViolationAndVerifyViolation(SpaceViolationPolicy.NO_WRITES, p);<a name="line.241"></a>
+<span class="sourceLineNo">242</span><a name="line.242"></a>
+<span class="sourceLineNo">243</span>    // The table is now in violation. Try to do a bulk load<a name="line.243"></a>
+<span class="sourceLineNo">244</span>    ClientServiceCallable&lt;Boolean&gt; callable = helper.generateFileToLoad(tableName, 1, 50);<a name="line.244"></a>
+<span class="sourceLineNo">245</span>    RpcRetryingCallerFactory factory = new RpcRetryingCallerFactory(TEST_UTIL.getConfiguration());<a name="line.245"></a>
+<span class="sourceLineNo">246</span>    RpcRetryingCaller&lt;Boolean&gt; caller = factory.newCaller();<a name="line.246"></a>
+<span class="sourceLineNo">247</span>    try {<a name="line.247"></a>
+<span class="sourceLineNo">248</span>      caller.callWithRetries(callable, Integer.MAX_VALUE);<a name="line.248"></a>
+<span class="sourceLineNo">249</span>      fail("Expected the bulk load call to fail!");<a name="line.249"></a>
+<span class="sourceLineNo">250</span>    } catch (SpaceLimitingException e) {<a name="line.250"></a>
+<span class="sourceLineNo">251</span>      // Pass<a name="line.251"></a>
+<span class="sourceLineNo">252</span>      LOG.trace("Caught expected exception", e);<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>  @Test<a name="line.256"></a>
+<span class="sourceLineNo">257</span>  public void testAtomicBulkLoadUnderQuota() throws Exception {<a name="line.257"></a>
+<span class="sourceLineNo">258</span>    // Need to verify that if the batch of hfiles cannot be loaded, none are loaded.<a name="line.258"></a>
+<span class="sourceLineNo">259</span>    TableName tn = helper.createTableWithRegions(10);<a name="line.259"></a>
+<span class="sourceLineNo">260</span><a name="line.260"></a>
+<span class="sourceLineNo">261</span>    final long sizeLimit = 50L * SpaceQuotaHelperForTests.ONE_KILOBYTE;<a name="line.261"></a>
+<span class="sourceLineNo">262</span>    QuotaSettings settings = QuotaSettingsFactory.limitTableSpace(<a name="line.262"></a>
+<span class="sourceLineNo">263</span>        tn, sizeLimit, SpaceViolationPolicy.NO_INSERTS);<a name="line.263"></a>
+<span class="sourceLineNo">264</span>    TEST_UTIL.getAdmin().setQuota(settings);<a name="line.264"></a>
+<span class="sourceLineNo">265</span><a name="line.265"></a>
+<span class="sourceLineNo">266</span>    HRegionServer rs = TEST_UTIL.getMiniHBaseCluster().getRegionServer(0);<a name="line.266"></a>
+<span class="sourceLineNo">267</span>    RegionServerSpaceQuotaManager spaceQuotaManager = rs.getRegionServerSpaceQuotaManager();<a name="line.267"></a>
+<span class="sourceLineNo">268</span>    Map&lt;TableName,SpaceQuotaSnapshot&gt; snapshots = spaceQuotaManager.copyQuotaSnapshots();<a name="line.268"></a>
+<span class="sourceLineNo">269</span>    Map&lt;RegionInfo,Long&gt; regionSizes = getReportedSizesForTable(tn);<a name="line.269"></a>
+<span class="sourceLineNo">270</span>    while (true) {<a name="line.270"></a>
+<span class="sourceLineNo">271</span>      SpaceQuotaSnapshot snapshot = snapshots.get(tn);<a name="line.271"></a>
+<span class="sourceLineNo">272</span>      if (snapshot != null &amp;&amp; snapshot.getLimit() &gt; 0) {<a name="line.272"></a>
+<span class="sourceLineNo">273</span>        break;<a name="line.273"></a>
+<span class="sourceLineNo">274</span>      }<a name="line.274"></a>
+<span class="sourceLineNo">275</span>      LOG.debug(<a name="line.275"></a>
+<span class="sourceLineNo">276</span>          "Snapshot does not yet realize quota limit: " + snapshots + ", regionsizes: " +<a name="line.276"></a>
+<span class="sourceLineNo">277</span>          regionSizes);<a name="line.277"></a>
+<span class="sourceLineNo">278</span>      Thread.sleep(3000);<a name="line.278"></a>
+<span class="sourceLineNo">279</span>      snapshots = spaceQuotaManager.copyQuotaSnapshots();<a name="line.279"></a>
+<span class="sourceLineNo">280</span>      regionSizes = getReportedSizesForTable(tn);<a name="line.280"></a>
+<span class="sourceLineNo">281</span>    }<a name="line.281"></a>
+<span class="sourceLineNo">282</span>    // Our quota limit should be reflected in the latest snapshot<a name="line.282"></a>
+<span class="sourceLineNo">283</span>    SpaceQuotaSnapshot snapshot = snapshots.get(tn);<a name="line.283"></a>
+<span class="sourceLineNo">284</span>    assertEquals(0L, snapshot.getUsage());<a name="line.284"></a>
+<span class="sourceLineNo">285</span>    assertEquals(sizeLimit, snapshot.getLimit());<a name="line.285"></a>
+<span class="sourceLineNo">286</span><a name="line.286"></a>
+<span class="sourceLineNo">287</span>    // We would also not have a "real" policy in violation<a name="line.287"></a>
+<span class="sourceLineNo">288</span>    ActivePolicyEnforcement activePolicies = spaceQuotaManager.getActiveEnforcements();<a name="line.288"></a>
+<span class="sourceLineNo">289</span>    SpaceViolationPolicyEnforcement enforcement = activePolicies.getPolicyEnforcement(tn);<a name="line.289"></a>
+<span class="sourceLineNo">290</span>    assertTrue(<a name="line.290"></a>
+<span class="sourceLineNo">291</span>        "Expected to find Noop policy, but got " + enforcement.getClass().getSimpleName(),<a name="line.291"></a>
+<span class="sourceLineNo">292</span>        enforcement instanceof DefaultViolationPolicyEnforcement);<a name="line.292"></a>
+<span class="sourceLineNo">293</span><a name="line.293"></a>
+<span class="sourceLineNo">294</span>    // Should generate two files, each of which is over 25KB each<a name="line.294"></a>
+<span class="sourceLineNo">295</span>    ClientServiceCallable&lt;Boolean&gt; callable = helper.generateFileToLoad(tn, 2, 525);<a name="line.295"></a>
+<span class="sourceLineNo">296</span>    FileSystem fs = TEST_UTIL.getTestFileSystem();<a name="line.296"></a>
+<span class="sourceLineNo">297</span>    FileStatus[] files = fs.listStatus(<a name="line.297"></a>
+<span class="sourceLineNo">298</span>        new Path(fs.getHomeDirectory(), testName.getMethodName() + "_files"));<a name="line.298"></a>
+<span class="sourceLineNo">299</span>    for (FileStatus file : files) {<a name="line.299"></a>
+<span class="sourceLineNo">300</span>      assertTrue(<a name="line.300"></a>
+<span class="sourceLineNo">301</span>          "Expected the file, " + file.getPath() + ",  length to be larger than 25KB, but was "<a name="line.301"></a>
+<span class="sourceLineNo">302</span>              + file.getLen(),<a name="line.302"></a>
+<span class="sourceLineNo">303</span>          file.getLen() &gt; 25 * SpaceQuotaHelperForTests.ONE_KILOBYTE);<a name="line.303"></a>
+<span class="sourceLineNo">304</span>      LOG.debug(file.getPath() + " -&gt; " + file.getLen() +"B");<a name="line.304"></a>
+<span class="sourceLineNo">305</span>    }<a name="line.305"></a>
+<span class="sourceLineNo">306</span><a name="line.306"></a>
+<span class="sourceLineNo">307</span>    RpcRetryingCallerFactory factory = new RpcRetryingCallerFactory(TEST_UTIL.getConfiguration());<a name="line.307"></a>
+<span class="sourceLineNo">308</span>    RpcRetryingCaller&lt;Boolean&gt; caller = factory.newCaller();<a name="line.308"></a>
+<span class="sourceLineNo">309</span>    try {<a name="line.309"></a>
+<span class="sourceLineNo">310</span>      caller.callWithRetries(callable, Integer.MAX_VALUE);<a name="line.310"></a>
+<span class="sourceLineNo">311</span>      fail("Expected the bulk load call to fail!");<a name="line.311"></a>
+<span class="sourceLineNo">312</span>    } catch (SpaceLimitingException e) {<a name="line.312"></a>
+<span class="sourceLineNo">313</span>      // Pass<a name="line.313"></a>
+<span class="sourceLineNo">314</span>      LOG.trace("Caught expected exception", e);<a name="line.314"></a>
+<span class="sourceLineNo">315</span>    }<a name="line.315"></a>
+<span class="sourceLineNo">316</span>    // Verify that we have no data in the table because neither file should have been<a name="line.316"></a>
+<span class="sourceLineNo">317</span>    // loaded even though one of the files could have.<a name="line.317"></a>
+<span class="sourceLineNo">318</span>    Table table = TEST_UTIL.getConnection().getTable(tn);<a name="line.318"></a>
+<span class="sourceLineNo">319</span>    ResultScanner scanner = table.getScanner(new Scan());<a name="line.319"></a>
+<span class="sourceLineNo">320</span>    try {<a name="line.320"></a>
+<span class="sourceLineNo">321</span>      assertNull("Expected no results", scanner.next());<a name="line.321"></a>
+<span class="sourceLineNo">322</span>    } finally{<a name="line.322"></a>
+<span class="sourceLineNo">323</span>      scanner.close();<a name="line.323"></a>
+<span class="sourceLineNo">324</span>    }<a name="line.324"></a>
+<span class="sourceLineNo">325</span>  }<a name="line.325"></a>
+<span class="sourceLineNo">326</span><a name="line.326"></a>
+<span class="sourceLineNo">327</span>  @Test<a name="line.327"></a>
+<span class="sourceLineNo">328</span>  public void testTableQuotaOverridesNamespaceQuota() throws Exception {<a name="line.328"></a>
+<span class="sourceLineNo">329</span>    final SpaceViolationPolicy policy = SpaceViolationPolicy.NO_INSERTS;<a name="line.329"></a>
+<span class="sourceLineNo">330</span>    final TableName tn = helper.createTableWithRegions(10);<a name="line.330"></a>
+<span class="sourceLineNo">331</span><a name="line.331"></a>
+<span class="sourceLineNo">332</span>    // 2MB limit on the table, 1GB limit on the namespace<a name="line.332"></a>
+<span class="sourceLineNo">333</span>    final long tableLimit = 2L * SpaceQuotaHelperForTests.ONE_MEGABYTE;<a name="line.333"></a>
+<span class="sourceLineNo">334</span>    final long namespaceLimit = 1024L * SpaceQuotaHelperForTests.ONE_MEGABYTE;<a name="line.334"></a>
+<span class="sourceLineNo">335</span>    TEST_UTIL.getAdmin().setQuota(QuotaSettingsFactory.limitTableSpace(tn, tableLimit, policy));<a name="line.335"></a>
+<span class="sourceLineNo">336</span>    TEST_UTIL.getAdmin().setQuota(QuotaSettingsFactory.limitNamespaceSpace(<a name="line.336"></a>
+<span class="sourceLineNo">337</span>        tn.getNamespaceAsString(), namespaceLimit, policy));<a name="line.337"></a>
+<span class="sourceLineNo">338</span><a name="line.338"></a>
+<span class="sourceLineNo">339</span>    // Write more data than should be allowed and flush it to disk<a name="line.339"></a>
+<span class="sourceLineNo">340</span>    helper.writeData(tn, 3L * SpaceQuotaHelperForTests.ONE_MEGABYTE);<a name="line.340"></a>
+<span class="sourceLineNo">341</span><a name="line.341"></a>
+<span class="sourceLineNo">342</span>    // This should be sufficient time for the chores to run and see the change.<a name="line.342"></a>
+<span class="sourceLineNo">343</span>    Thread.sleep(5000);<a name="line.343"></a>
+<span class="sourceLineNo">344</span><a name="line.344"></a>
+<span class="sourceLineNo">345</span>    // The write should be rejected because the table quota takes priority over the namespace<a name="line.345"></a>
+<span class="sourceLineNo">346</span>    Put p = new Put(Bytes.toBytes("to_reject"));<a name="line.346"></a>
+<span class="sourceLineNo">347</span>    p.addColumn(<a name="line.347"></a>
+<span class="sourceLineNo">348</span>        Bytes.toBytes(SpaceQuotaHelperForTests.F1), Bytes.toBytes("to"), Bytes.toBytes("reject"));<a name="line.348"></a>
+<span class="sourceLineNo">349</span>    verifyViolation(policy, tn, p);<a name="line.349"></a>
+<span class="sourceLineNo">350</span>  }<a name="line.350"></a>
+<span class="sourceLineNo">351</span><a name="line.351"></a>
+<span class="sourceLineNo">352</span>  @Test<a name="line.352"></a>
+<span class="sourceLineNo">353</span>  public void testSetQuotaAndThenRemoveWithNoInserts() throws Exception {<a name="line.353"></a>
+<span class="sourceLineNo">354</span>    setQuotaAndThenRemove(SpaceViolationPolicy.NO_INSERTS);<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>  @Test<a name="line.357"></a>
+<span class="sourceLineNo">358</span>  public void testSetQuotaAndThenRemoveWithNoWrite() throws Exception {<a name="line.358"></a>
+<span class="sourceLineNo">359</span>    setQuotaAndThenRemove(SpaceViolationPolicy.NO_WRITES);<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>  @Test<a name="line.362"></a>
+<span class="sourceLineNo">363</span>  public void testSetQuotaAndThenRemoveWithNoWritesCompactions() throws Exception {<a name="line.363"></a>
+<span class="sourceLineNo">364</span>    setQuotaAndThenRemove(SpaceViolationPolicy.NO_WRITES_COMPACTIONS);<a name="line.364"></a>
+<span class="sourceLineNo">365</span>  }<a name="line.365"></a>
+<span class="sourceLineNo">366</span><a name="line.366"></a>
+<span class="sourceLineNo">367</span>  @Test<a name="line.367"></a>
+<span class="sourceLineNo">368</span>  public void testSetQuotaAndThenRemoveWithDisable() throws Exception {<a name="line.368"></a>
+<span class="sourceLineNo">369</span>    setQuotaAndThenRemove(SpaceViolationPolicy.DISABLE);<a name="line.369"></a>
+<span class="sourceLineNo">370</span>  }<a name="line.370"></a>
+<span class="sourceLineNo">371</span><a name="line.371"></a>
+<span class="sourceLineNo">372</span>  @Test<a name="line.372"></a>
+<span class="sourceLineNo">373</span>  public void testSetQuotaAndThenDropTableWithNoInserts() throws Exception {<a name="line.373"></a>
+<span class="sourceLineNo">374</span>    setQuotaAndThenDropTable(SpaceViolationPolicy.NO_INSERTS);<a name="line.374"></a>
+<span class="sourceLineNo">375</span>  }<a name="line.375"></a>
+<span class="sourceLineNo">376</span><a name="line.376"></a>
+<span class="sourceLineNo">377</span>  @Test<a name="line.377"></a>
+<span class="sourceLineNo">378</span>  public void testSetQuotaAndThenDropTableWithNoWrite() throws Exception {<a name="line.378"></a>
+<span class="sourceLineNo">379</span>    setQuotaAndThenDropTable(SpaceViolationPolicy.NO_WRITES);<a name="line.379"></a>
+<span class="sourceLineNo">380</span>  }<a name="line.380"></a>
+<span class="sourceLineNo">381</span><a name="line.381"></a>
+<span class="sourceLineNo">382</span>  @Test<a name="line.382"></a>
+<span class="sourceLineNo">383</span>  public void testSetQuotaAndThenDropTableeWithNoWritesCompactions() throws Exception {<a name="line.383"></a>
+<span class="sourceLineNo">384</span>    setQuotaAndThenDropTable(SpaceViolationPolicy.NO_WRITES_COMPACTIONS);<a name="line.384"></a>
+<span class="sourceLineNo">385</span>  }<a name="line.385"></a>
+<span class="sourceLineNo">386</span><a name="line.386"></a>
+<span class="sourceLineNo">387</span>  @Test<a name="line.387"></a>
+<span class="sourceLineNo">388</span>  public void testSetQuotaAndThenIncreaseQuotaWithNoInserts() throws Exception {<a name="line.388"></a>
+<span class="sourceLineNo">389</span>    setQuotaAndThenIncreaseQuota(SpaceViolationPolicy.NO_INSERTS);<a name="line.389"></a>
+<span class="sourceLineNo">390</span>  }<a name="line.390"></a>
+<span class="sourceLineNo">391</span><a name="line.391"></a>
+<span class="sourceLineNo">392</span>  @Test<a name="line.392"></a>
+<span class="sourceLineNo">393</span>  public void testSetQuotaAndThenIncreaseQuotaWithNoWrite() throws Exception {<a name="line.393"></a>
+<span class="sourceLineNo">394</span>    setQuotaAndThenIncreaseQuota(SpaceViolationPolicy.NO_WRITES);<a name="line.394"></a>
+<span class="sourceLineNo">395</span>  }<a name="line.395"></a>
+<span class="sourceLineNo">396</span><a name="line.396"></a>
+<span class="sourceLineNo">397</span>  @Test<a name="line.397"></a>
+<span class="sourceLineNo">398</span>  public void testSetQuotaAndThenIncreaseQuotaWithNoWritesCompactions() throws Exception {<a name="line.398"></a>
+<span class="sourceLineNo">399</span>    setQuotaAndThenIncreaseQuota(SpaceViolationPolicy.NO_WRITES_COMPACTIONS);<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>  @Test<a name="line.402"></a>
+<span class="sourceLineNo">403</span>  public void testSetQuotaAndThenRemoveInOneWithNoInserts() throws Exception {<a name="line.403"></a>
+<span class="sourceLineNo">404</span>    setQuotaAndThenRemoveInOneAmongTwoTables(SpaceViolationPolicy.NO_INSERTS);<a name="line.404"></a>
+<span class="sourceLineNo">405</span>  }<a name="line.405"></a>
+<span class="sourceLineNo">406</span><a name="line.406"></a>
+<span class="sourceLineNo">407</span>  @Test<a name="line.407"></a>
+<span class="sourceLineNo">408</span>  public void testSetQuotaAndThenRemoveInOneWithNoWrite() throws Exception {<a name="line.408"></a>
+<span class="sourceLineNo">409</span>    setQuotaAndThenRemoveInOneAmongTwoTables(SpaceViolationPolicy.NO_WRITES);<a name="line.409"></a>
+<span class="sourceLineNo">410</span>  }<a name="line.410"></a>
+<span class="sourceLineNo">411</span><a name="line.411"></a>
+<span class="sourceLineNo">412</span>  @Test<a name="line.412"></a>
+<span class="sourceLineNo">413</span>  public void testSetQuotaAndThenRemoveInOneWithNoWritesCompaction() throws Exception {<a name="line.413"></a>
+<span class="sourceLineNo">414</span>    setQuotaAndThenRemoveInOneAmongTwoTables(SpaceViolationPolicy.NO_WRITES_COMPACTIONS);<a name="line.414"></a>
+<span class="sourceLineNo">415</span>  }<a name="line.415"></a>
+<span class="sourceLineNo">416</span><a name="line.416"></a>
+<span class="sourceLineNo">417</span>  @Test<a name="line.417"></a>
+<span class="sourceLineNo">418</span>  public void testSetQuotaAndThenRemoveInOneWithDisable() throws Exception {<a name="line.418"></a>
+<span class="sourceLineNo">419</span>    setQuotaAndThenRemoveInOneAmongTwoTables(SpaceViolationPolicy.DISABLE);<a name="line.419"></a>
+<span class="sourceLineNo">420</span>  }<a name="line.420"></a>
+<span class="sourceLineNo">421</span><a name="line.421"></a>
+<span class="sourceLineNo">422</span>  private void setQuotaAndThenRemove(SpaceViolationPolicy policy) throws Exception {<a name="line.422"></a>
+<span class="sourceLineNo">423</span>    Put put = new Put(Bytes.toBytes("to_reject"));<a name="line.423"></a>
+<span class="sourceLineNo">424</span>    put.addColumn(Bytes.toBytes(SpaceQuotaHelperForTests.F1), Bytes.toBytes("to"),<a name="line.424"></a>
+<span class="sourceLineNo">425</span>      Bytes.toBytes("reject"));<a name="line.425"></a>
+<span class="sourceLineNo">426</span><a name="line.426"></a>
+<span class="sourceLineNo">427</span>    // Do puts until we violate space policy<a name="line.427"></a>
+<span class="sourceLineNo">428</span>    final TableName tn = writeUntilViolationAndVerifyViolation(policy, put);<a name="line.428"></a>
+<span class="sourceLineNo">429</span><a name="line.429"></a>
+<span class="sourceLineNo">430</span>    // Now, remove the quota<a name="line.430"></a>
+<span class="sourceLineNo">431</span>    removeQuotaFromtable(tn);<a name="line.431"></a>
+<span class="sourceLineNo">432</span><a name="line.432"></a>
+<span class="sourceLineNo">433</span>    // Put some rows now: should not violate as quota settings removed<a name="line.433"></a>
+<span class="sourceLineNo">434</span>    verifyNoViolation(policy, tn, put);<a name="line.434"></a>
+<span class="sourceLineNo">435</span>  }<a name="line.435"></a>
+<span class="sourceLineNo">436</span><a name="line.436"></a>
+<span class="sourceLineNo">437</span>  private void setQuotaAndThenDropTable(SpaceViolationPolicy policy) throws Exception {<a name="line.437"></a>
+<span class="sourceLineNo">438</span>    Put put = new Put(Bytes.toBytes("to_reject"));<a name="line.438"></a>
+<span class="sourceLineNo">439</span>    put.addColumn(Bytes.toBytes(SpaceQuotaHelperForTests.F1), Bytes.toBytes("to"),<a name="line.439"></a>
+<span class="sourceLineNo">440</span>      Bytes.toBytes("reject"));<a name="line.440"></a>
+<span class="sourceLineNo">441</span><a name="line.441"></a>
+<span class="sourceLineNo">442</span>    // Do puts until we violate space policy<a name="line.442"></a>
+<span class="sourceLineNo">443</span>    final TableName tn = writeUntilViolationAndVerifyViolation(policy, put);<a name="line.443"></a>
+<span class="sourceLineNo">444</span><a name="line.444"></a>
+<span class="sourceLineNo">445</span>    // Now, drop the table<a name="line.445"></a>
+<span class="sourceLineNo">446</span>    TEST_UTIL.deleteTable(tn);<a name="line.446"></a>
+<span class="sourceLineNo">447</span>    LOG.debug("Successfully deleted table ", tn);<a name="line.447"></a>
+<span class="sourceLineNo">448</span><a name="line.448"></a>
+<span class="sourceLineNo">449</span>    // Now re-create the table<a name="line.449"></a>
+<span class="sourceLineNo">450</span>    TEST_UTIL.createTable(tn, Bytes.toBytes(SpaceQuotaHelperForTests.F1));<a name="line.450"></a>
+<span class="sourceLineNo">451</span>    LOG.debug("Successfully re-created table ", tn);<a name="line.451"></a>
+<span class="sourceLineNo">452</span><a name="line.452"></a>
+<span class="sourceLineNo">453</span>    // Put some rows now: should not violate as table/quota was dropped<a name="line.453"></a>
+<span class="sourceLineNo">454</span>    verifyNoViolation(policy, tn, put);<a name="line.454"></a>
+<span class="sourceLineNo">455</span>  }<a name="line.455"></a>
+<span class="sourceLineNo">456</span><a name="line.456"></a>
+<span class="sourceLineNo">457</span>  private void setQuotaAndThenIncreaseQuota(SpaceViolationPolicy policy) throws Exception {<a name="line.457"></a>
+<span class="sourceLineNo">458</span>    Put put = new Put(Bytes.toBytes("to_reject"));<a name="line.458"></a>
+<span class="sourceLineNo">459</span>    put.addColumn(Bytes.toBytes(SpaceQuotaHelperForTests.F1), Bytes.toBytes("to"),<a name="line.459"></a>
+<span class="sourceLineNo">460</span>      Bytes.toBytes("reject"));<a name="line.460"></a>
+<span class="sourceLineNo">461</span><a name="line.461"></a>
+<span class="sourceLineNo">462</span>    // Do puts until we violate space policy<a name="line.462"></a>
+<span class="sourceLineNo">463</span>    final TableName tn = writeUntilViolationAndVerifyViolation(policy, put);<a name="line.463"></a>
+<span class="sourceLineNo">464</span><a name="line.464"></a>
+<span class="sourceLineNo">465</span>    // Now, increase limit and perform put<a name="line.465"></a>
+<span class="sourceLineNo">466</span>    increaseQuotaLimit(tn, policy);<a name="line.466"></a>
+<span class="sourceLineNo">467</span><a name="line.467"></a>
+<span class="sourceLineNo">468</span>    // Put some row now: should not violate as quota limit increased<a name="line.468"></a>
+<span class="sourceLineNo">469</span>    verifyNoViolation(policy, tn, put);<a name="line.469"></a>
+<span class="sourceLineNo">470</span>  }<a name="line.470"></a>
+<span class="sourceLineNo">471</span><a name="line.471"></a>
+<span class="sourceLineNo">472</span>  public void setQuotaAndThenRemoveInOneAmongTwoTables(SpaceViolationPolicy policy)<a name="line.472"></a>
+<span class="sourceLineNo">473</span>      throws Exception {<a name="line.473"></a>
+<span class="sourceLineNo">474</span>    Put put = new Put(Bytes.toBytes("to_reject"));<a name="line.474"></a>
+<span class="sourceLineNo">475</span>    put.addColumn(Bytes.toBytes(SpaceQuotaHelperForTests.F1), Bytes.toBytes("to"),<a name="line.475"></a>
+<span class="sourceLineNo">476</span>      Bytes.toBytes("reject"));<a name="line.476"></a>
+<span class="sourceLineNo">477</span><a name="line.477"></a>
+<span class="sourceLineNo">478</span>    // Do puts until we violate space policy on table tn1<a name="line.478"></a>
+<span class="sourceLineNo">479</span>    final TableName tn1 = writeUntilViolationAndVerifyViolation(policy, put);<a name="line.479"></a>
+<span class="sourceLineNo">480</span><a name="line.480"></a>
+<span class="sourceLineNo">481</span>    // Do puts until we violate space policy on table tn2<a name="line.481"></a>
+<span class="sourceLineNo">482</span>    final TableName tn2 = writeUntilViolationAndVerifyViolation(policy, put);<a name="line.482"></a>
+<span class="sourceLineNo">483</span><a name="line.483"></a>
+<span class="sourceLineNo">484</span>    // Now, remove the quota from table tn1<a name="line.484"></a>
+<span class="sourceLineNo">485</span>    removeQuotaFromtable(tn1);<a name="line.485"></a>
+<span class="sourceLineNo">486</span><a name="line.486"></a>
+<span class="sourceLineNo">487</span>    // Put a new row now on tn1: should not violate as quota settings removed<a name="line.487"></a>
+<span class="sourceLineNo">488</span>    verifyNoViolation(policy, tn1, put);<a name="line.488"></a>
+<span class="sourceLineNo">489</span>    // Put a new row now on tn2: should violate as quota settings exists<a name="line.489"></a>
+<span class="sourceLineNo">490</span>    verifyViolation(policy, tn2, put);<a name="line.490"></a>
+<span class="sourceLineNo">491</span>  }<a name="line.491"></a>
+<span class="sourceLineNo">492</span><a name="line.492"></a>
+<span class="sourceLineNo">493</span>  private void removeQuotaFromtable(final TableName tn) throws Exception {<a name="line.493"></a>
+<span class="sourceLineNo">494</span>    QuotaSettings removeQuota = QuotaSettingsFactory.removeTableSpaceLimit(tn);<a name="line.494"></a>
+<span class="sourceLineNo">495</span>    TEST_UTIL.getAdmin().setQuota(removeQuota);<a name="line.495"></a>
+<span class="sourceLineNo">496</span>    LOG.debug("Space quota settings removed from the table ", tn);<a name="line.496"></a>
+<span class="sourceLineNo">497</span>  }<a name="line.497"></a>
+<span class="sourceLineNo">498</span><a name="line.498"></a>
+<span class="sourceLineNo">499</span>  private void increaseQuotaLimit(final TableName tn, SpaceViolationPolicy policy)<a name="line.499"></a>
+<span class="sourceLineNo">500</span>      throws Exception {<a name="line.500"></a>
+<span class="sourceLineNo">501</span>    final long sizeLimit = 4L * SpaceQuotaHelperForTests.ONE_MEGABYTE;<a name="line.501"></a>
+<span class="sourceLineNo">502</span>    QuotaSettings settings = QuotaSettingsFactory.limitTableSpace(tn, sizeLimit, policy);<a name="line.502"></a>
+<span class="sourceLineNo">503</span>    TEST_UTIL.getAdmin().setQuota(settings);<a name="line.503"></a>
+<span class="sourceLineNo">504</span>    LOG.debug("Quota limit increased for table ", tn);<a name="line.504"></a>
+<span class="sourceLineNo">505</span>  }<a name="line.505"></a>
+<span class="sourceLineNo">506</span><a name="line.506"></a>
+<span class="sourceLineNo">507</span>  private Map&lt;RegionInfo,Long&gt; getReportedSizesForTable(TableName tn) {<a name="line.507"></a>
+<span class="sourceLineNo">508</span>    HMaster master = TEST_UTIL.getMiniHBaseCluster().getMaster();<a name="line.508"></a>
+<span class="sourceLineNo">509</span>    MasterQuotaManager quotaManager = master.getMasterQuotaManager();<a name="line.509"></a>
+<span class="sourceLineNo">510</span>    Map&lt;RegionInfo,Long&gt; filteredRegionSizes = new HashMap&lt;&gt;();<a name="line.510"></a>
+<span class="sourceLineNo">511</span>    for (Entry&lt;RegionInfo,Long&gt; entry : quotaManager.snapshotRegionSizes().entrySet()) {<a name="line.511"></a>
+<span class="sourceLineNo">512</span>      if (entry.getKey().getTable().equals(tn)) {<a name="line.512"></a>
+<span class="sourceLineNo">513</span>        filteredRegionSizes.put(entry.getKey(), entry.getValue());<a name="line.513"></a>
+<span class="sourceLineNo">514</span>      }<a name="line.514"></a>
+<span class="sourceLineNo">515</span>    }<a name="line.515"></a>
+<span class="sourceLineNo">516</span>    return filteredRegionSizes;<a name="line.516"></a>
+<span class="sourceLineNo">517</span>  }<a name="l

<TRUNCATED>

[25/29] hbase-site git commit: Published site at 477f9fdb32873387231c5fbbff130ba8bf7b5d68.

Posted by gi...@apache.org.
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/621479e1/checkstyle.rss
----------------------------------------------------------------------
diff --git a/checkstyle.rss b/checkstyle.rss
index 79a6ede..3e08c2e 100644
--- a/checkstyle.rss
+++ b/checkstyle.rss
@@ -26,7 +26,7 @@ under the License.
     <copyright>&#169;2007 - 2018 The Apache Software Foundation</copyright>
     <item>
       <title>File: 3616,
-             Errors: 15863,
+             Errors: 15862,
              Warnings: 0,
              Infos: 0
       </title>
@@ -49405,7 +49405,7 @@ under the License.
                   0
                 </td>
                 <td>
-                  1
+                  0
                 </td>
               </tr>
                           <tr>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/621479e1/coc.html
----------------------------------------------------------------------
diff --git a/coc.html b/coc.html
index 0400a7d..c2ff672 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="20180524" />
+    <meta name="Date-Revision-yyyymmdd" content="20180525" />
     <meta http-equiv="Content-Language" content="en" />
     <title>Apache HBase &#x2013; 
       Code of Conduct Policy
@@ -375,7 +375,7 @@ email to <a class="externalLink" href="mailto:private@hbase.apache.org">the priv
                         <a href="https://www.apache.org/">The Apache Software Foundation</a>.
             All rights reserved.      
                     
-                  <li id="publishDate" class="pull-right">Last Published: 2018-05-24</li>
+                  <li id="publishDate" class="pull-right">Last Published: 2018-05-25</li>
             </p>
                 </div>
 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/621479e1/dependencies.html
----------------------------------------------------------------------
diff --git a/dependencies.html b/dependencies.html
index cd5e000..890dda9 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="20180524" />
+    <meta name="Date-Revision-yyyymmdd" content="20180525" />
     <meta http-equiv="Content-Language" content="en" />
     <title>Apache HBase &#x2013; Project Dependencies</title>
     <link rel="stylesheet" href="./css/apache-maven-fluido-1.5-HBASE.min.css" />
@@ -440,7 +440,7 @@
                         <a href="https://www.apache.org/">The Apache Software Foundation</a>.
             All rights reserved.      
                     
-                  <li id="publishDate" class="pull-right">Last Published: 2018-05-24</li>
+                  <li id="publishDate" class="pull-right">Last Published: 2018-05-25</li>
             </p>
                 </div>
 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/621479e1/dependency-convergence.html
----------------------------------------------------------------------
diff --git a/dependency-convergence.html b/dependency-convergence.html
index de85a97..7b7dce4 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="20180524" />
+    <meta name="Date-Revision-yyyymmdd" content="20180525" />
     <meta http-equiv="Content-Language" content="en" />
     <title>Apache HBase &#x2013; Reactor Dependency Convergence</title>
     <link rel="stylesheet" href="./css/apache-maven-fluido-1.5-HBASE.min.css" />
@@ -1105,7 +1105,7 @@
                         <a href="https://www.apache.org/">The Apache Software Foundation</a>.
             All rights reserved.      
                     
-                  <li id="publishDate" class="pull-right">Last Published: 2018-05-24</li>
+                  <li id="publishDate" class="pull-right">Last Published: 2018-05-25</li>
             </p>
                 </div>
 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/621479e1/dependency-info.html
----------------------------------------------------------------------
diff --git a/dependency-info.html b/dependency-info.html
index b1b6eda..3c85f3e 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="20180524" />
+    <meta name="Date-Revision-yyyymmdd" content="20180525" />
     <meta http-equiv="Content-Language" content="en" />
     <title>Apache HBase &#x2013; Dependency Information</title>
     <link rel="stylesheet" href="./css/apache-maven-fluido-1.5-HBASE.min.css" />
@@ -313,7 +313,7 @@
                         <a href="https://www.apache.org/">The Apache Software Foundation</a>.
             All rights reserved.      
                     
-                  <li id="publishDate" class="pull-right">Last Published: 2018-05-24</li>
+                  <li id="publishDate" class="pull-right">Last Published: 2018-05-25</li>
             </p>
                 </div>
 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/621479e1/dependency-management.html
----------------------------------------------------------------------
diff --git a/dependency-management.html b/dependency-management.html
index 7df2f9c..ba25ee8 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="20180524" />
+    <meta name="Date-Revision-yyyymmdd" content="20180525" />
     <meta http-equiv="Content-Language" content="en" />
     <title>Apache HBase &#x2013; Project Dependency Management</title>
     <link rel="stylesheet" href="./css/apache-maven-fluido-1.5-HBASE.min.css" />
@@ -969,7 +969,7 @@
                         <a href="https://www.apache.org/">The Apache Software Foundation</a>.
             All rights reserved.      
                     
-                  <li id="publishDate" class="pull-right">Last Published: 2018-05-24</li>
+                  <li id="publishDate" class="pull-right">Last Published: 2018-05-25</li>
             </p>
                 </div>
 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/621479e1/devapidocs/constant-values.html
----------------------------------------------------------------------
diff --git a/devapidocs/constant-values.html b/devapidocs/constant-values.html
index 3fd6179..2eef46b 100644
--- a/devapidocs/constant-values.html
+++ b/devapidocs/constant-values.html
@@ -3768,21 +3768,21 @@
 <!--   -->
 </a><code>public&nbsp;static&nbsp;final&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a></code></td>
 <td><code><a href="org/apache/hadoop/hbase/Version.html#date">date</a></code></td>
-<td class="colLast"><code>"Thu May 24 14:39:22 UTC 2018"</code></td>
+<td class="colLast"><code>"Fri May 25 14:39:20 UTC 2018"</code></td>
 </tr>
 <tr class="rowColor">
 <td class="colFirst"><a name="org.apache.hadoop.hbase.Version.revision">
 <!--   -->
 </a><code>public&nbsp;static&nbsp;final&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a></code></td>
 <td><code><a href="org/apache/hadoop/hbase/Version.html#revision">revision</a></code></td>
-<td class="colLast"><code>"f3d1c021de2264301f68eadb9ef126ff83d7ef53"</code></td>
+<td class="colLast"><code>"477f9fdb32873387231c5fbbff130ba8bf7b5d68"</code></td>
 </tr>
 <tr class="altColor">
 <td class="colFirst"><a name="org.apache.hadoop.hbase.Version.srcChecksum">
 <!--   -->
 </a><code>public&nbsp;static&nbsp;final&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a></code></td>
 <td><code><a href="org/apache/hadoop/hbase/Version.html#srcChecksum">srcChecksum</a></code></td>
-<td class="colLast"><code>"9cf2b1576b925f830d9095fedcae0329"</code></td>
+<td class="colLast"><code>"6a21d52e1de7c6466666266ba63ff96d"</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/621479e1/devapidocs/index-all.html
----------------------------------------------------------------------
diff --git a/devapidocs/index-all.html b/devapidocs/index-all.html
index b3f6552..ccaf215 100644
--- a/devapidocs/index-all.html
+++ b/devapidocs/index-all.html
@@ -19037,7 +19037,7 @@
 <dd>
 <div class="block">Create the closest row after the specified row</div>
 </dd>
-<dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.html#createCluster-java.util.List-java.util.Collection-boolean-">createCluster(List&lt;ServerName&gt;, Collection&lt;RegionInfo&gt;, boolean)</a></span> - Method in class org.apache.hadoop.hbase.master.balancer.<a href="org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.html" title="class in org.apache.hadoop.hbase.master.balancer">BaseLoadBalancer</a></dt>
+<dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.html#createCluster-java.util.List-java.util.Collection-">createCluster(List&lt;ServerName&gt;, Collection&lt;RegionInfo&gt;)</a></span> - Method in class org.apache.hadoop.hbase.master.balancer.<a href="org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.html" title="class in org.apache.hadoop.hbase.master.balancer">BaseLoadBalancer</a></dt>
 <dd>&nbsp;</dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/HBaseConfiguration.html#createClusterConf-org.apache.hadoop.conf.Configuration-java.lang.String-">createClusterConf(Configuration, String)</a></span> - Static method in class org.apache.hadoop.hbase.<a href="org/apache/hadoop/hbase/HBaseConfiguration.html" title="class in org.apache.hadoop.hbase">HBaseConfiguration</a></dt>
 <dd>
@@ -39061,6 +39061,8 @@
 <dd>&nbsp;</dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/master/normalizer/MergeNormalizationPlan.html#getFirstRegion--">getFirstRegion()</a></span> - Method in class org.apache.hadoop.hbase.master.normalizer.<a href="org/apache/hadoop/hbase/master/normalizer/MergeNormalizationPlan.html" title="class in org.apache.hadoop.hbase.master.normalizer">MergeNormalizationPlan</a></dt>
 <dd>&nbsp;</dd>
+<dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/master/procedure/TruncateTableProcedure.html#getFirstRegionInfo--">getFirstRegionInfo()</a></span> - Method in class org.apache.hadoop.hbase.master.procedure.<a href="org/apache/hadoop/hbase/master/procedure/TruncateTableProcedure.html" title="class in org.apache.hadoop.hbase.master.procedure">TruncateTableProcedure</a></dt>
+<dd>&nbsp;</dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/io/hfile/HFile.Reader.html#getFirstRowKey--">getFirstRowKey()</a></span> - Method in interface org.apache.hadoop.hbase.io.hfile.<a href="org/apache/hadoop/hbase/io/hfile/HFile.Reader.html" title="interface in org.apache.hadoop.hbase.io.hfile">HFile.Reader</a></dt>
 <dd>&nbsp;</dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/io/hfile/HFileReaderImpl.html#getFirstRowKey--">getFirstRowKey()</a></span> - Method in class org.apache.hadoop.hbase.io.hfile.<a href="org/apache/hadoop/hbase/io/hfile/HFileReaderImpl.html" title="class in org.apache.hadoop.hbase.io.hfile">HFileReaderImpl</a></dt>
@@ -81353,6 +81355,14 @@ service.</div>
 <dd>&nbsp;</dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/replication/regionserver/ReplicationSourceWALActionListener.html#postLogRoll-org.apache.hadoop.fs.Path-org.apache.hadoop.fs.Path-">postLogRoll(Path, Path)</a></span> - Method in class org.apache.hadoop.hbase.replication.regionserver.<a href="org/apache/hadoop/hbase/replication/regionserver/ReplicationSourceWALActionListener.html" title="class in org.apache.hadoop.hbase.replication.regionserver">ReplicationSourceWALActionListener</a></dt>
 <dd>&nbsp;</dd>
+<dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.html#postMasterStartupInitialize--">postMasterStartupInitialize()</a></span> - Method in class org.apache.hadoop.hbase.master.balancer.<a href="org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.html" title="class in org.apache.hadoop.hbase.master.balancer">BaseLoadBalancer</a></dt>
+<dd>&nbsp;</dd>
+<dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/master/LoadBalancer.html#postMasterStartupInitialize--">postMasterStartupInitialize()</a></span> - Method in interface org.apache.hadoop.hbase.master.<a href="org/apache/hadoop/hbase/master/LoadBalancer.html" title="interface in org.apache.hadoop.hbase.master">LoadBalancer</a></dt>
+<dd>
+<div class="block">If balancer needs to do initialization after Master has started up, lets do that here.</div>
+</dd>
+<dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/rsgroup/RSGroupBasedLoadBalancer.html#postMasterStartupInitialize--">postMasterStartupInitialize()</a></span> - Method in class org.apache.hadoop.hbase.rsgroup.<a href="org/apache/hadoop/hbase/rsgroup/RSGroupBasedLoadBalancer.html" title="class in org.apache.hadoop.hbase.rsgroup">RSGroupBasedLoadBalancer</a></dt>
+<dd>&nbsp;</dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/coprocessor/RegionObserver.html#postMemStoreCompaction-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.regionserver.Store-">postMemStoreCompaction(ObserverContext&lt;RegionCoprocessorEnvironment&gt;, Store)</a></span> - Method in interface org.apache.hadoop.hbase.coprocessor.<a href="org/apache/hadoop/hbase/coprocessor/RegionObserver.html" title="interface in org.apache.hadoop.hbase.coprocessor">RegionObserver</a></dt>
 <dd>
 <div class="block">Called after the in memory compaction is finished.</div>

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

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/621479e1/devapidocs/org/apache/hadoop/hbase/class-use/ServerName.html
----------------------------------------------------------------------
diff --git a/devapidocs/org/apache/hadoop/hbase/class-use/ServerName.html b/devapidocs/org/apache/hadoop/hbase/class-use/ServerName.html
index 314ab37..a6c9234 100644
--- a/devapidocs/org/apache/hadoop/hbase/class-use/ServerName.html
+++ b/devapidocs/org/apache/hadoop/hbase/class-use/ServerName.html
@@ -4769,9 +4769,8 @@ Input/OutputFormats, a table indexing MapReduce job, and utility methods.</div>
 </tr>
 <tr class="altColor">
 <td class="colFirst"><code>protected <a href="../../../../../org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.Cluster.html" title="class in org.apache.hadoop.hbase.master.balancer">BaseLoadBalancer.Cluster</a></code></td>
-<td class="colLast"><span class="typeNameLabel">BaseLoadBalancer.</span><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.html#createCluster-java.util.List-java.util.Collection-boolean-">createCluster</a></span>(<a href="https://docs.oracle.com/javase/8/docs/api/java/util/List.html?is-external=true" title="class or interface in java.util">List</a>&lt;<a href="../../../../../org/apache/hadoop/hbase/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a>&gt;&nbsp;servers,
-             <a href="https://docs.oracle.com/javase/8/docs/api/java/util/Collection.html?is-external=true" title="class or interface in java.util">Collection</a>&lt;<a href="../../../../../org/apache/hadoop/hbase/client/RegionInfo.html" title="interface in org.apache.hadoop.hbase.client">RegionInfo</a>&gt;&nbsp;regions,
-             boolean&nbsp;forceRefresh)</code>&nbsp;</td>
+<td class="colLast"><span class="typeNameLabel">BaseLoadBalancer.</span><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.html#createCluster-java.util.List-java.util.Collection-">createCluster</a></span>(<a href="https://docs.oracle.com/javase/8/docs/api/java/util/List.html?is-external=true" title="class or interface in java.util">List</a>&lt;<a href="../../../../../org/apache/hadoop/hbase/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a>&gt;&nbsp;servers,
+             <a href="https://docs.oracle.com/javase/8/docs/api/java/util/Collection.html?is-external=true" title="class or interface in java.util">Collection</a>&lt;<a href="../../../../../org/apache/hadoop/hbase/client/RegionInfo.html" title="interface in org.apache.hadoop.hbase.client">RegionInfo</a>&gt;&nbsp;regions)</code>&nbsp;</td>
 </tr>
 <tr class="rowColor">
 <td class="colFirst"><code>private <a href="https://docs.oracle.com/javase/8/docs/api/java/util/List.html?is-external=true" title="class or interface in java.util">List</a>&lt;<a href="../../../../../org/apache/hadoop/hbase/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a>&gt;</code></td>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/621479e1/devapidocs/org/apache/hadoop/hbase/client/class-use/RegionInfo.html
----------------------------------------------------------------------
diff --git a/devapidocs/org/apache/hadoop/hbase/client/class-use/RegionInfo.html b/devapidocs/org/apache/hadoop/hbase/client/class-use/RegionInfo.html
index 4885291..0d9510c 100644
--- a/devapidocs/org/apache/hadoop/hbase/client/class-use/RegionInfo.html
+++ b/devapidocs/org/apache/hadoop/hbase/client/class-use/RegionInfo.html
@@ -3778,9 +3778,8 @@ Input/OutputFormats, a table indexing MapReduce job, and utility methods.</div>
 </tr>
 <tr class="rowColor">
 <td class="colFirst"><code>protected <a href="../../../../../../org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.Cluster.html" title="class in org.apache.hadoop.hbase.master.balancer">BaseLoadBalancer.Cluster</a></code></td>
-<td class="colLast"><span class="typeNameLabel">BaseLoadBalancer.</span><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.html#createCluster-java.util.List-java.util.Collection-boolean-">createCluster</a></span>(<a href="https://docs.oracle.com/javase/8/docs/api/java/util/List.html?is-external=true" title="class or interface in java.util">List</a>&lt;<a href="../../../../../../org/apache/hadoop/hbase/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a>&gt;&nbsp;servers,
-             <a href="https://docs.oracle.com/javase/8/docs/api/java/util/Collection.html?is-external=true" title="class or interface in java.util">Collection</a>&lt;<a href="../../../../../../org/apache/hadoop/hbase/client/RegionInfo.html" title="interface in org.apache.hadoop.hbase.client">RegionInfo</a>&gt;&nbsp;regions,
-             boolean&nbsp;forceRefresh)</code>&nbsp;</td>
+<td class="colLast"><span class="typeNameLabel">BaseLoadBalancer.</span><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.html#createCluster-java.util.List-java.util.Collection-">createCluster</a></span>(<a href="https://docs.oracle.com/javase/8/docs/api/java/util/List.html?is-external=true" title="class or interface in java.util">List</a>&lt;<a href="../../../../../../org/apache/hadoop/hbase/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a>&gt;&nbsp;servers,
+             <a href="https://docs.oracle.com/javase/8/docs/api/java/util/Collection.html?is-external=true" title="class or interface in java.util">Collection</a>&lt;<a href="../../../../../../org/apache/hadoop/hbase/client/RegionInfo.html" title="interface in org.apache.hadoop.hbase.client">RegionInfo</a>&gt;&nbsp;regions)</code>&nbsp;</td>
 </tr>
 <tr class="altColor">
 <td class="colFirst"><code>private <a href="https://docs.oracle.com/javase/8/docs/api/java/util/Map.html?is-external=true" title="class or interface in java.util">Map</a>&lt;<a href="../../../../../../org/apache/hadoop/hbase/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a>,<a href="https://docs.oracle.com/javase/8/docs/api/java/util/List.html?is-external=true" title="class or interface in java.util">List</a>&lt;<a href="../../../../../../org/apache/hadoop/hbase/client/RegionInfo.html" title="interface in org.apache.hadoop.hbase.client">RegionInfo</a>&gt;&gt;</code></td>
@@ -4146,10 +4145,14 @@ Input/OutputFormats, a table indexing MapReduce job, and utility methods.</div>
 </tr>
 <tbody>
 <tr class="altColor">
+<td class="colFirst"><code>(package private) <a href="../../../../../../org/apache/hadoop/hbase/client/RegionInfo.html" title="interface in org.apache.hadoop.hbase.client">RegionInfo</a></code></td>
+<td class="colLast"><span class="typeNameLabel">TruncateTableProcedure.</span><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/master/procedure/TruncateTableProcedure.html#getFirstRegionInfo--">getFirstRegionInfo</a></span>()</code>&nbsp;</td>
+</tr>
+<tr class="rowColor">
 <td class="colFirst"><code>protected <a href="../../../../../../org/apache/hadoop/hbase/client/RegionInfo.html" title="interface in org.apache.hadoop.hbase.client">RegionInfo</a></code></td>
 <td class="colLast"><span class="typeNameLabel">AbstractStateMachineRegionProcedure.</span><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/master/procedure/AbstractStateMachineRegionProcedure.html#getRegion--">getRegion</a></span>()</code>&nbsp;</td>
 </tr>
-<tr class="rowColor">
+<tr class="altColor">
 <td class="colFirst"><code><a href="../../../../../../org/apache/hadoop/hbase/client/RegionInfo.html" title="interface in org.apache.hadoop.hbase.client">RegionInfo</a></code></td>
 <td class="colLast"><span class="typeNameLabel">RSProcedureDispatcher.RegionOperation.</span><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/master/procedure/RSProcedureDispatcher.RegionOperation.html#getRegionInfo--">getRegionInfo</a></span>()</code>&nbsp;</td>
 </tr>

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

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/621479e1/devapidocs/org/apache/hadoop/hbase/favored/FavoredNodeLoadBalancer.html
----------------------------------------------------------------------
diff --git a/devapidocs/org/apache/hadoop/hbase/favored/FavoredNodeLoadBalancer.html b/devapidocs/org/apache/hadoop/hbase/favored/FavoredNodeLoadBalancer.html
index 47d431d..f4e46e2 100644
--- a/devapidocs/org/apache/hadoop/hbase/favored/FavoredNodeLoadBalancer.html
+++ b/devapidocs/org/apache/hadoop/hbase/favored/FavoredNodeLoadBalancer.html
@@ -340,7 +340,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/favored/FavoredNodesP
 <!--   -->
 </a>
 <h3>Methods inherited from class&nbsp;org.apache.hadoop.hbase.master.balancer.<a href="../../../../../org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.html" title="class in org.apache.hadoop.hbase.master.balancer">BaseLoadBalancer</a></h3>
-<code><a href="../../../../../org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.html#areSomeRegionReplicasColocated-org.apache.hadoop.hbase.master.balancer.BaseLoadBalancer.Cluster-">areSomeRegionReplicasColocated</a>, <a href="../../../../../org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.html#assignMasterSystemRegions-java.util.Collection-java.util.List-">assignMasterSystemRegions</a>, <a href="../../../../../org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.html#balanceMasterRegions-java.util.Map-">balanceMasterRegions</a>, <a href="../../../../../org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.html#createCluster-java.util.List-java.util.Collection-boolean-">createCluster</a>, <a href="../../../../../org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.html#getConf--">getConf</a>, <a href="../../../../../org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.html#getRegionAssignmentsByServer-java.util.Collection-">getRegionAssignmentsByServer
 </a>, <a href="../../../../../org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.html#isStopped--">isStopped</a>, <a href="../../../../../org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.html#needsBalance-org.apache.hadoop.hbase.master.balancer.BaseLoadBalancer.Cluster-">needsBalance</a>, <a href="../../../../../org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.html#onConfigurationChange-org.apache.hadoop.conf.Configuration-">onConfigurationChange</a>, <a href="../../../../../org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.html#regionOffline-org.apache.hadoop.hbase.client.RegionInfo-">regionOffline</a>, <a href="../../../../../org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.html#regionOnline-org.apache.hadoop.hbase.client.RegionInfo-org.apache.hadoop.hbase.ServerName-">regionOnline</a>, <a href="../../../../../org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.html#retainAssignment-java.util.Map-java.util.List-">retainAssignment</a>, <a h
 ref="../../../../../org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.html#setClusterLoad-java.util.Map-">setClusterLoad</a>, <a href="../../../../../org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.html#setClusterMetrics-org.apache.hadoop.hbase.ClusterMetrics-">setClusterMetrics</a>, <a href="../../../../../org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.html#setMasterServices-org.apache.hadoop.hbase.master.MasterServices-">setMasterServices</a>, <a href="../../../../../org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.html#setRackManager-org.apache.hadoop.hbase.master.RackManager-">setRackManager</a>, <a href="../../../../../org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.html#setSlop-org.apache.hadoop.conf.Configuration-">setSlop</a>, <a href="../../../../../org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.html#shouldBeOnMaster-org.apache.hadoop.hbase.client.RegionInfo-">shouldBeOnMaster</a>, <a href="../../../../../org/apache/hadoo
 p/hbase/master/balancer/BaseLoadBalancer.html#stop-java.lang.String-">stop</a></code></li>
+<code><a href="../../../../../org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.html#areSomeRegionReplicasColocated-org.apache.hadoop.hbase.master.balancer.BaseLoadBalancer.Cluster-">areSomeRegionReplicasColocated</a>, <a href="../../../../../org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.html#assignMasterSystemRegions-java.util.Collection-java.util.List-">assignMasterSystemRegions</a>, <a href="../../../../../org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.html#balanceMasterRegions-java.util.Map-">balanceMasterRegions</a>, <a href="../../../../../org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.html#createCluster-java.util.List-java.util.Collection-">createCluster</a>, <a href="../../../../../org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.html#getConf--">getConf</a>, <a href="../../../../../org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.html#getRegionAssignmentsByServer-java.util.Collection-">getRegionAssignmentsByServer</a>, <a
  href="../../../../../org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.html#isStopped--">isStopped</a>, <a href="../../../../../org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.html#needsBalance-org.apache.hadoop.hbase.master.balancer.BaseLoadBalancer.Cluster-">needsBalance</a>, <a href="../../../../../org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.html#onConfigurationChange-org.apache.hadoop.conf.Configuration-">onConfigurationChange</a>, <a href="../../../../../org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.html#postMasterStartupInitialize--">postMasterStartupInitialize</a>, <a href="../../../../../org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.html#regionOffline-org.apache.hadoop.hbase.client.RegionInfo-">regionOffline</a>, <a href="../../../../../org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.html#regionOnline-org.apache.hadoop.hbase.client.RegionInfo-org.apache.hadoop.hbase.ServerName-">regionOnline</a>, <a href="../../../
 ../../org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.html#retainAssignment-java.util.Map-java.util.List-">retainAssignment</a>, <a href="../../../../../org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.html#setClusterLoad-java.util.Map-">setClusterLoad</a>, <a href="../../../../../org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.html#setClusterMetrics-org.apache.hadoop.hbase.ClusterMetrics-">setClusterMetrics</a>, <a href="../../../../../org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.html#setMasterServices-org.apache.hadoop.hbase.master.MasterServices-">setMasterServices</a>, <a href="../../../../../org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.html#setRackManager-org.apache.hadoop.hbase.master.RackManager-">setRackManager</a>, <a href="../../../../../org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.html#setSlop-org.apache.hadoop.conf.Configuration-">setSlop</a>, <a href="../../../../../org/apache/hadoop/hbase/master/balancer/Bas
 eLoadBalancer.html#shouldBeOnMaster-org.apache.hadoop.hbase.client.RegionInfo-">shouldBeOnMaster</a>, <a href="../../../../../org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.html#stop-java.lang.String-">stop</a></code></li>
 </ul>
 <ul class="blockList">
 <li class="blockList"><a name="methods.inherited.from.class.java.lang.Object">

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

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/621479e1/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 ccf4c6d..09d03b4 100644
--- a/devapidocs/org/apache/hadoop/hbase/io/hfile/package-tree.html
+++ b/devapidocs/org/apache/hadoop/hbase/io/hfile/package-tree.html
@@ -273,12 +273,12 @@
 <ul>
 <li type="circle">java.lang.<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Enum.html?is-external=true" title="class or interface in java.lang"><span class="typeNameLink">Enum</span></a>&lt;E&gt; (implements java.lang.<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Comparable.html?is-external=true" title="class or interface in java.lang">Comparable</a>&lt;T&gt;, java.io.<a href="https://docs.oracle.com/javase/8/docs/api/java/io/Serializable.html?is-external=true" title="class or interface in java.io">Serializable</a>)
 <ul>
+<li type="circle">org.apache.hadoop.hbase.io.hfile.<a href="../../../../../../org/apache/hadoop/hbase/io/hfile/BlockType.html" title="enum in org.apache.hadoop.hbase.io.hfile"><span class="typeNameLink">BlockType</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.io.hfile.<a href="../../../../../../org/apache/hadoop/hbase/io/hfile/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/BlockType.BlockCategory.html" title="enum in org.apache.hadoop.hbase.io.hfile"><span class="typeNameLink">BlockType.BlockCategory</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.io.hfile.<a href="../../../../../../org/apache/hadoop/hbase/io/hfile/Cacheable.MemoryType.html" title="enum in org.apache.hadoop.hbase.io.hfile"><span class="typeNameLink">Cacheable.MemoryType</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.io.hfile.<a href="../../../../../../org/apache/hadoop/hbase/io/hfile/CacheConfig.ExternalBlockCaches.html" title="enum in org.apache.hadoop.hbase.io.hfile"><span class="typeNameLink">CacheConfig.ExternalBlockCaches</span></a></li>
-<li type="circle">org.apache.hadoop.hbase.io.hfile.<a href="../../../../../../org/apache/hadoop/hbase/io/hfile/BlockType.html" title="enum in org.apache.hadoop.hbase.io.hfile"><span class="typeNameLink">BlockType</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.io.hfile.<a href="../../../../../../org/apache/hadoop/hbase/io/hfile/HFileBlock.Writer.State.html" title="enum in org.apache.hadoop.hbase.io.hfile"><span class="typeNameLink">HFileBlock.Writer.State</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.io.hfile.<a href="../../../../../../org/apache/hadoop/hbase/io/hfile/BlockType.BlockCategory.html" title="enum in org.apache.hadoop.hbase.io.hfile"><span class="typeNameLink">BlockType.BlockCategory</span></a></li>
 </ul>
 </li>
 </ul>

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

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/621479e1/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 deb19ba..81c504b 100644
--- a/devapidocs/org/apache/hadoop/hbase/mapreduce/package-tree.html
+++ b/devapidocs/org/apache/hadoop/hbase/mapreduce/package-tree.html
@@ -293,10 +293,10 @@
 <ul>
 <li type="circle">java.lang.<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Enum.html?is-external=true" title="class or interface in java.lang"><span class="typeNameLink">Enum</span></a>&lt;E&gt; (implements java.lang.<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Comparable.html?is-external=true" title="class or interface in java.lang">Comparable</a>&lt;T&gt;, java.io.<a href="https://docs.oracle.com/javase/8/docs/api/java/io/Serializable.html?is-external=true" title="class or interface in java.io">Serializable</a>)
 <ul>
+<li type="circle">org.apache.hadoop.hbase.mapreduce.<a href="../../../../../org/apache/hadoop/hbase/mapreduce/TableSplit.Version.html" title="enum in org.apache.hadoop.hbase.mapreduce"><span class="typeNameLink">TableSplit.Version</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.mapreduce.<a href="../../../../../org/apache/hadoop/hbase/mapreduce/CellCounter.CellCounterMapper.Counters.html" title="enum in org.apache.hadoop.hbase.mapreduce"><span class="typeNameLink">CellCounter.CellCounterMapper.Counters</span></a></li>
-<li type="circle">org.apache.hadoop.hbase.mapreduce.<a href="../../../../../org/apache/hadoop/hbase/mapreduce/SyncTable.SyncMapper.Counter.html" title="enum in org.apache.hadoop.hbase.mapreduce"><span class="typeNameLink">SyncTable.SyncMapper.Counter</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.mapreduce.<a href="../../../../../org/apache/hadoop/hbase/mapreduce/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>
+<li type="circle">org.apache.hadoop.hbase.mapreduce.<a href="../../../../../org/apache/hadoop/hbase/mapreduce/SyncTable.SyncMapper.Counter.html" title="enum in org.apache.hadoop.hbase.mapreduce"><span class="typeNameLink">SyncTable.SyncMapper.Counter</span></a></li>
 </ul>
 </li>
 </ul>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/621479e1/devapidocs/org/apache/hadoop/hbase/master/HMaster.MasterStoppedException.html
----------------------------------------------------------------------
diff --git a/devapidocs/org/apache/hadoop/hbase/master/HMaster.MasterStoppedException.html b/devapidocs/org/apache/hadoop/hbase/master/HMaster.MasterStoppedException.html
index 55b6dd0..9e8c2af 100644
--- a/devapidocs/org/apache/hadoop/hbase/master/HMaster.MasterStoppedException.html
+++ b/devapidocs/org/apache/hadoop/hbase/master/HMaster.MasterStoppedException.html
@@ -136,7 +136,7 @@
 </dl>
 <hr>
 <br>
-<pre>public static class <a href="../../../../../src-html/org/apache/hadoop/hbase/master/HMaster.html#line.2764">HMaster.MasterStoppedException</a>
+<pre>public static class <a href="../../../../../src-html/org/apache/hadoop/hbase/master/HMaster.html#line.2775">HMaster.MasterStoppedException</a>
 extends <a href="../../../../../org/apache/hadoop/hbase/DoNotRetryIOException.html" title="class in org.apache.hadoop.hbase">DoNotRetryIOException</a></pre>
 <dl>
 <dt><span class="seeLabel">See Also:</span></dt>
@@ -205,7 +205,7 @@ extends <a href="../../../../../org/apache/hadoop/hbase/DoNotRetryIOException.ht
 <ul class="blockListLast">
 <li class="blockList">
 <h4>MasterStoppedException</h4>
-<pre><a href="../../../../../src-html/org/apache/hadoop/hbase/master/HMaster.MasterStoppedException.html#line.2765">MasterStoppedException</a>()</pre>
+<pre><a href="../../../../../src-html/org/apache/hadoop/hbase/master/HMaster.MasterStoppedException.html#line.2776">MasterStoppedException</a>()</pre>
 </li>
 </ul>
 </li>


[10/29] hbase-site git commit: Published site at 477f9fdb32873387231c5fbbff130ba8bf7b5d68.

Posted by gi...@apache.org.
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/621479e1/devapidocs/src-html/org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.Cluster.SwapRegionsAction.html
----------------------------------------------------------------------
diff --git a/devapidocs/src-html/org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.Cluster.SwapRegionsAction.html b/devapidocs/src-html/org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.Cluster.SwapRegionsAction.html
index 7f42212..d4bf03c 100644
--- a/devapidocs/src-html/org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.Cluster.SwapRegionsAction.html
+++ b/devapidocs/src-html/org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.Cluster.SwapRegionsAction.html
@@ -1159,434 +1159,442 @@
 <span class="sourceLineNo">1151</span>    }<a name="line.1151"></a>
 <span class="sourceLineNo">1152</span>  }<a name="line.1152"></a>
 <span class="sourceLineNo">1153</span><a name="line.1153"></a>
-<span class="sourceLineNo">1154</span>  public void setRackManager(RackManager rackManager) {<a name="line.1154"></a>
-<span class="sourceLineNo">1155</span>    this.rackManager = rackManager;<a name="line.1155"></a>
-<span class="sourceLineNo">1156</span>  }<a name="line.1156"></a>
-<span class="sourceLineNo">1157</span><a name="line.1157"></a>
-<span class="sourceLineNo">1158</span>  protected boolean needsBalance(Cluster c) {<a name="line.1158"></a>
-<span class="sourceLineNo">1159</span>    ClusterLoadState cs = new ClusterLoadState(c.clusterState);<a name="line.1159"></a>
-<span class="sourceLineNo">1160</span>    if (cs.getNumServers() &lt; MIN_SERVER_BALANCE) {<a name="line.1160"></a>
-<span class="sourceLineNo">1161</span>      if (LOG.isDebugEnabled()) {<a name="line.1161"></a>
-<span class="sourceLineNo">1162</span>        LOG.debug("Not running balancer because only " + cs.getNumServers()<a name="line.1162"></a>
-<span class="sourceLineNo">1163</span>            + " active regionserver(s)");<a name="line.1163"></a>
-<span class="sourceLineNo">1164</span>      }<a name="line.1164"></a>
-<span class="sourceLineNo">1165</span>      return false;<a name="line.1165"></a>
-<span class="sourceLineNo">1166</span>    }<a name="line.1166"></a>
-<span class="sourceLineNo">1167</span>    if(areSomeRegionReplicasColocated(c)) return true;<a name="line.1167"></a>
-<span class="sourceLineNo">1168</span>    // Check if we even need to do any load balancing<a name="line.1168"></a>
-<span class="sourceLineNo">1169</span>    // HBASE-3681 check sloppiness first<a name="line.1169"></a>
-<span class="sourceLineNo">1170</span>    float average = cs.getLoadAverage(); // for logging<a name="line.1170"></a>
-<span class="sourceLineNo">1171</span>    int floor = (int) Math.floor(average * (1 - slop));<a name="line.1171"></a>
-<span class="sourceLineNo">1172</span>    int ceiling = (int) Math.ceil(average * (1 + slop));<a name="line.1172"></a>
-<span class="sourceLineNo">1173</span>    if (!(cs.getMaxLoad() &gt; ceiling || cs.getMinLoad() &lt; floor)) {<a name="line.1173"></a>
-<span class="sourceLineNo">1174</span>      NavigableMap&lt;ServerAndLoad, List&lt;RegionInfo&gt;&gt; serversByLoad = cs.getServersByLoad();<a name="line.1174"></a>
-<span class="sourceLineNo">1175</span>      if (LOG.isTraceEnabled()) {<a name="line.1175"></a>
-<span class="sourceLineNo">1176</span>        // If nothing to balance, then don't say anything unless trace-level logging.<a name="line.1176"></a>
-<span class="sourceLineNo">1177</span>        LOG.trace("Skipping load balancing because balanced cluster; " +<a name="line.1177"></a>
-<span class="sourceLineNo">1178</span>          "servers=" + cs.getNumServers() +<a name="line.1178"></a>
-<span class="sourceLineNo">1179</span>          " regions=" + cs.getNumRegions() + " average=" + average +<a name="line.1179"></a>
-<span class="sourceLineNo">1180</span>          " mostloaded=" + serversByLoad.lastKey().getLoad() +<a name="line.1180"></a>
-<span class="sourceLineNo">1181</span>          " leastloaded=" + serversByLoad.firstKey().getLoad());<a name="line.1181"></a>
-<span class="sourceLineNo">1182</span>      }<a name="line.1182"></a>
-<span class="sourceLineNo">1183</span>      return false;<a name="line.1183"></a>
-<span class="sourceLineNo">1184</span>    }<a name="line.1184"></a>
-<span class="sourceLineNo">1185</span>    return true;<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>   * Subclasses should implement this to return true if the cluster has nodes that hosts<a name="line.1189"></a>
-<span class="sourceLineNo">1190</span>   * multiple replicas for the same region, or, if there are multiple racks and the same<a name="line.1190"></a>
-<span class="sourceLineNo">1191</span>   * rack hosts replicas of the same region<a name="line.1191"></a>
-<span class="sourceLineNo">1192</span>   * @param c Cluster information<a name="line.1192"></a>
-<span class="sourceLineNo">1193</span>   * @return whether region replicas are currently co-located<a name="line.1193"></a>
-<span class="sourceLineNo">1194</span>   */<a name="line.1194"></a>
-<span class="sourceLineNo">1195</span>  protected boolean areSomeRegionReplicasColocated(Cluster c) {<a name="line.1195"></a>
-<span class="sourceLineNo">1196</span>    return false;<a name="line.1196"></a>
-<span class="sourceLineNo">1197</span>  }<a name="line.1197"></a>
-<span class="sourceLineNo">1198</span><a name="line.1198"></a>
-<span class="sourceLineNo">1199</span>  /**<a name="line.1199"></a>
-<span class="sourceLineNo">1200</span>   * Generates a bulk assignment plan to be used on cluster startup using a<a name="line.1200"></a>
-<span class="sourceLineNo">1201</span>   * simple round-robin assignment.<a name="line.1201"></a>
-<span class="sourceLineNo">1202</span>   * &lt;p&gt;<a name="line.1202"></a>
-<span class="sourceLineNo">1203</span>   * Takes a list of all the regions and all the servers in the cluster and<a name="line.1203"></a>
-<span class="sourceLineNo">1204</span>   * returns a map of each server to the regions that it should be assigned.<a name="line.1204"></a>
-<span class="sourceLineNo">1205</span>   * &lt;p&gt;<a name="line.1205"></a>
-<span class="sourceLineNo">1206</span>   * Currently implemented as a round-robin assignment. Same invariant as load<a name="line.1206"></a>
-<span class="sourceLineNo">1207</span>   * balancing, all servers holding floor(avg) or ceiling(avg).<a name="line.1207"></a>
-<span class="sourceLineNo">1208</span>   *<a name="line.1208"></a>
-<span class="sourceLineNo">1209</span>   * TODO: Use block locations from HDFS to place regions with their blocks<a name="line.1209"></a>
-<span class="sourceLineNo">1210</span>   *<a name="line.1210"></a>
-<span class="sourceLineNo">1211</span>   * @param regions all regions<a name="line.1211"></a>
-<span class="sourceLineNo">1212</span>   * @param servers all servers<a name="line.1212"></a>
-<span class="sourceLineNo">1213</span>   * @return map of server to the regions it should take, or null if no<a name="line.1213"></a>
-<span class="sourceLineNo">1214</span>   *         assignment is possible (ie. no regions or no servers)<a name="line.1214"></a>
-<span class="sourceLineNo">1215</span>   */<a name="line.1215"></a>
-<span class="sourceLineNo">1216</span>  @Override<a name="line.1216"></a>
-<span class="sourceLineNo">1217</span>  public Map&lt;ServerName, List&lt;RegionInfo&gt;&gt; roundRobinAssignment(List&lt;RegionInfo&gt; regions,<a name="line.1217"></a>
-<span class="sourceLineNo">1218</span>      List&lt;ServerName&gt; servers) throws HBaseIOException {<a name="line.1218"></a>
-<span class="sourceLineNo">1219</span>    metricsBalancer.incrMiscInvocations();<a name="line.1219"></a>
-<span class="sourceLineNo">1220</span>    Map&lt;ServerName, List&lt;RegionInfo&gt;&gt; assignments = assignMasterSystemRegions(regions, servers);<a name="line.1220"></a>
-<span class="sourceLineNo">1221</span>    if (assignments != null &amp;&amp; !assignments.isEmpty()) {<a name="line.1221"></a>
-<span class="sourceLineNo">1222</span>      servers = new ArrayList&lt;&gt;(servers);<a name="line.1222"></a>
-<span class="sourceLineNo">1223</span>      // Guarantee not to put other regions on master<a name="line.1223"></a>
-<span class="sourceLineNo">1224</span>      servers.remove(masterServerName);<a name="line.1224"></a>
-<span class="sourceLineNo">1225</span>      List&lt;RegionInfo&gt; masterRegions = assignments.get(masterServerName);<a name="line.1225"></a>
-<span class="sourceLineNo">1226</span>      if (!masterRegions.isEmpty()) {<a name="line.1226"></a>
-<span class="sourceLineNo">1227</span>        regions = new ArrayList&lt;&gt;(regions);<a name="line.1227"></a>
-<span class="sourceLineNo">1228</span>        regions.removeAll(masterRegions);<a name="line.1228"></a>
-<span class="sourceLineNo">1229</span>      }<a name="line.1229"></a>
-<span class="sourceLineNo">1230</span>    }<a name="line.1230"></a>
-<span class="sourceLineNo">1231</span>    if (regions == null || regions.isEmpty()) {<a name="line.1231"></a>
-<span class="sourceLineNo">1232</span>      return assignments;<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>    int numServers = servers == null ? 0 : servers.size();<a name="line.1235"></a>
-<span class="sourceLineNo">1236</span>    if (numServers == 0) {<a name="line.1236"></a>
-<span class="sourceLineNo">1237</span>      LOG.warn("Wanted to do round robin assignment but no servers to assign to");<a name="line.1237"></a>
-<span class="sourceLineNo">1238</span>      return null;<a name="line.1238"></a>
-<span class="sourceLineNo">1239</span>    }<a name="line.1239"></a>
-<span class="sourceLineNo">1240</span><a name="line.1240"></a>
-<span class="sourceLineNo">1241</span>    // TODO: instead of retainAssignment() and roundRobinAssignment(), we should just run the<a name="line.1241"></a>
-<span class="sourceLineNo">1242</span>    // normal LB.balancerCluster() with unassignedRegions. We only need to have a candidate<a name="line.1242"></a>
-<span class="sourceLineNo">1243</span>    // generator for AssignRegionAction. The LB will ensure the regions are mostly local<a name="line.1243"></a>
-<span class="sourceLineNo">1244</span>    // and balanced. This should also run fast with fewer number of iterations.<a name="line.1244"></a>
-<span class="sourceLineNo">1245</span><a name="line.1245"></a>
-<span class="sourceLineNo">1246</span>    if (numServers == 1) { // Only one server, nothing fancy we can do here<a name="line.1246"></a>
-<span class="sourceLineNo">1247</span>      ServerName server = servers.get(0);<a name="line.1247"></a>
-<span class="sourceLineNo">1248</span>      assignments.put(server, new ArrayList&lt;&gt;(regions));<a name="line.1248"></a>
-<span class="sourceLineNo">1249</span>      return assignments;<a name="line.1249"></a>
-<span class="sourceLineNo">1250</span>    }<a name="line.1250"></a>
-<span class="sourceLineNo">1251</span><a name="line.1251"></a>
-<span class="sourceLineNo">1252</span>    Cluster cluster = createCluster(servers, regions, false);<a name="line.1252"></a>
-<span class="sourceLineNo">1253</span>    List&lt;RegionInfo&gt; unassignedRegions = new ArrayList&lt;&gt;();<a name="line.1253"></a>
-<span class="sourceLineNo">1254</span><a name="line.1254"></a>
-<span class="sourceLineNo">1255</span>    roundRobinAssignment(cluster, regions, unassignedRegions,<a name="line.1255"></a>
-<span class="sourceLineNo">1256</span>      servers, assignments);<a name="line.1256"></a>
-<span class="sourceLineNo">1257</span><a name="line.1257"></a>
-<span class="sourceLineNo">1258</span>    List&lt;RegionInfo&gt; lastFewRegions = new ArrayList&lt;&gt;();<a name="line.1258"></a>
-<span class="sourceLineNo">1259</span>    // assign the remaining by going through the list and try to assign to servers one-by-one<a name="line.1259"></a>
-<span class="sourceLineNo">1260</span>    int serverIdx = RANDOM.nextInt(numServers);<a name="line.1260"></a>
-<span class="sourceLineNo">1261</span>    for (RegionInfo region : unassignedRegions) {<a name="line.1261"></a>
-<span class="sourceLineNo">1262</span>      boolean assigned = false;<a name="line.1262"></a>
-<span class="sourceLineNo">1263</span>      for (int j = 0; j &lt; numServers; j++) { // try all servers one by one<a name="line.1263"></a>
-<span class="sourceLineNo">1264</span>        ServerName serverName = servers.get((j + serverIdx) % numServers);<a name="line.1264"></a>
-<span class="sourceLineNo">1265</span>        if (!cluster.wouldLowerAvailability(region, serverName)) {<a name="line.1265"></a>
-<span class="sourceLineNo">1266</span>          List&lt;RegionInfo&gt; serverRegions =<a name="line.1266"></a>
-<span class="sourceLineNo">1267</span>              assignments.computeIfAbsent(serverName, k -&gt; new ArrayList&lt;&gt;());<a name="line.1267"></a>
-<span class="sourceLineNo">1268</span>          serverRegions.add(region);<a name="line.1268"></a>
-<span class="sourceLineNo">1269</span>          cluster.doAssignRegion(region, serverName);<a name="line.1269"></a>
-<span class="sourceLineNo">1270</span>          serverIdx = (j + serverIdx + 1) % numServers; //remain from next server<a name="line.1270"></a>
-<span class="sourceLineNo">1271</span>          assigned = true;<a name="line.1271"></a>
-<span class="sourceLineNo">1272</span>          break;<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>      if (!assigned) {<a name="line.1275"></a>
-<span class="sourceLineNo">1276</span>        lastFewRegions.add(region);<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>    // just sprinkle the rest of the regions on random regionservers. The balanceCluster will<a name="line.1279"></a>
-<span class="sourceLineNo">1280</span>    // make it optimal later. we can end up with this if numReplicas &gt; numServers.<a name="line.1280"></a>
-<span class="sourceLineNo">1281</span>    for (RegionInfo region : lastFewRegions) {<a name="line.1281"></a>
-<span class="sourceLineNo">1282</span>      int i = RANDOM.nextInt(numServers);<a name="line.1282"></a>
-<span class="sourceLineNo">1283</span>      ServerName server = servers.get(i);<a name="line.1283"></a>
-<span class="sourceLineNo">1284</span>      List&lt;RegionInfo&gt; serverRegions = assignments.computeIfAbsent(server, k -&gt; new ArrayList&lt;&gt;());<a name="line.1284"></a>
-<span class="sourceLineNo">1285</span>      serverRegions.add(region);<a name="line.1285"></a>
-<span class="sourceLineNo">1286</span>      cluster.doAssignRegion(region, server);<a name="line.1286"></a>
-<span class="sourceLineNo">1287</span>    }<a name="line.1287"></a>
-<span class="sourceLineNo">1288</span>    return assignments;<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>  protected Cluster createCluster(List&lt;ServerName&gt; servers,<a name="line.1291"></a>
-<span class="sourceLineNo">1292</span>      Collection&lt;RegionInfo&gt; regions, boolean forceRefresh) {<a name="line.1292"></a>
-<span class="sourceLineNo">1293</span>    if (forceRefresh &amp;&amp; useRegionFinder) {<a name="line.1293"></a>
-<span class="sourceLineNo">1294</span>      regionFinder.refreshAndWait(regions);<a name="line.1294"></a>
-<span class="sourceLineNo">1295</span>    }<a name="line.1295"></a>
-<span class="sourceLineNo">1296</span>    // Get the snapshot of the current assignments for the regions in question, and then create<a name="line.1296"></a>
-<span class="sourceLineNo">1297</span>    // a cluster out of it. Note that we might have replicas already assigned to some servers<a name="line.1297"></a>
-<span class="sourceLineNo">1298</span>    // earlier. So we want to get the snapshot to see those assignments, but this will only contain<a name="line.1298"></a>
-<span class="sourceLineNo">1299</span>    // replicas of the regions that are passed (for performance).<a name="line.1299"></a>
-<span class="sourceLineNo">1300</span>    Map&lt;ServerName, List&lt;RegionInfo&gt;&gt; clusterState = getRegionAssignmentsByServer(regions);<a name="line.1300"></a>
-<span class="sourceLineNo">1301</span><a name="line.1301"></a>
-<span class="sourceLineNo">1302</span>    for (ServerName server : servers) {<a name="line.1302"></a>
-<span class="sourceLineNo">1303</span>      if (!clusterState.containsKey(server)) {<a name="line.1303"></a>
-<span class="sourceLineNo">1304</span>        clusterState.put(server, EMPTY_REGION_LIST);<a name="line.1304"></a>
-<span class="sourceLineNo">1305</span>      }<a name="line.1305"></a>
-<span class="sourceLineNo">1306</span>    }<a name="line.1306"></a>
-<span class="sourceLineNo">1307</span>    return new Cluster(regions, clusterState, null, this.regionFinder,<a name="line.1307"></a>
-<span class="sourceLineNo">1308</span>        rackManager);<a name="line.1308"></a>
-<span class="sourceLineNo">1309</span>  }<a name="line.1309"></a>
+<span class="sourceLineNo">1154</span>  @Override<a name="line.1154"></a>
+<span class="sourceLineNo">1155</span>  public void postMasterStartupInitialize() {<a name="line.1155"></a>
+<span class="sourceLineNo">1156</span>    if (services != null &amp;&amp; regionFinder != null) {<a name="line.1156"></a>
+<span class="sourceLineNo">1157</span>      try {<a name="line.1157"></a>
+<span class="sourceLineNo">1158</span>        Set&lt;RegionInfo&gt; regions =<a name="line.1158"></a>
+<span class="sourceLineNo">1159</span>            services.getAssignmentManager().getRegionStates().getRegionAssignments().keySet();<a name="line.1159"></a>
+<span class="sourceLineNo">1160</span>        regionFinder.refreshAndWait(regions);<a name="line.1160"></a>
+<span class="sourceLineNo">1161</span>      } catch (Exception e) {<a name="line.1161"></a>
+<span class="sourceLineNo">1162</span>        LOG.warn("Refreshing region HDFS Block dist failed with exception, ignoring", e);<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>  }<a name="line.1165"></a>
+<span class="sourceLineNo">1166</span><a name="line.1166"></a>
+<span class="sourceLineNo">1167</span>  public void setRackManager(RackManager rackManager) {<a name="line.1167"></a>
+<span class="sourceLineNo">1168</span>    this.rackManager = rackManager;<a name="line.1168"></a>
+<span class="sourceLineNo">1169</span>  }<a name="line.1169"></a>
+<span class="sourceLineNo">1170</span><a name="line.1170"></a>
+<span class="sourceLineNo">1171</span>  protected boolean needsBalance(Cluster c) {<a name="line.1171"></a>
+<span class="sourceLineNo">1172</span>    ClusterLoadState cs = new ClusterLoadState(c.clusterState);<a name="line.1172"></a>
+<span class="sourceLineNo">1173</span>    if (cs.getNumServers() &lt; MIN_SERVER_BALANCE) {<a name="line.1173"></a>
+<span class="sourceLineNo">1174</span>      if (LOG.isDebugEnabled()) {<a name="line.1174"></a>
+<span class="sourceLineNo">1175</span>        LOG.debug("Not running balancer because only " + cs.getNumServers()<a name="line.1175"></a>
+<span class="sourceLineNo">1176</span>            + " active regionserver(s)");<a name="line.1176"></a>
+<span class="sourceLineNo">1177</span>      }<a name="line.1177"></a>
+<span class="sourceLineNo">1178</span>      return false;<a name="line.1178"></a>
+<span class="sourceLineNo">1179</span>    }<a name="line.1179"></a>
+<span class="sourceLineNo">1180</span>    if(areSomeRegionReplicasColocated(c)) return true;<a name="line.1180"></a>
+<span class="sourceLineNo">1181</span>    // Check if we even need to do any load balancing<a name="line.1181"></a>
+<span class="sourceLineNo">1182</span>    // HBASE-3681 check sloppiness first<a name="line.1182"></a>
+<span class="sourceLineNo">1183</span>    float average = cs.getLoadAverage(); // for logging<a name="line.1183"></a>
+<span class="sourceLineNo">1184</span>    int floor = (int) Math.floor(average * (1 - slop));<a name="line.1184"></a>
+<span class="sourceLineNo">1185</span>    int ceiling = (int) Math.ceil(average * (1 + slop));<a name="line.1185"></a>
+<span class="sourceLineNo">1186</span>    if (!(cs.getMaxLoad() &gt; ceiling || cs.getMinLoad() &lt; floor)) {<a name="line.1186"></a>
+<span class="sourceLineNo">1187</span>      NavigableMap&lt;ServerAndLoad, List&lt;RegionInfo&gt;&gt; serversByLoad = cs.getServersByLoad();<a name="line.1187"></a>
+<span class="sourceLineNo">1188</span>      if (LOG.isTraceEnabled()) {<a name="line.1188"></a>
+<span class="sourceLineNo">1189</span>        // If nothing to balance, then don't say anything unless trace-level logging.<a name="line.1189"></a>
+<span class="sourceLineNo">1190</span>        LOG.trace("Skipping load balancing because balanced cluster; " +<a name="line.1190"></a>
+<span class="sourceLineNo">1191</span>          "servers=" + cs.getNumServers() +<a name="line.1191"></a>
+<span class="sourceLineNo">1192</span>          " regions=" + cs.getNumRegions() + " average=" + average +<a name="line.1192"></a>
+<span class="sourceLineNo">1193</span>          " mostloaded=" + serversByLoad.lastKey().getLoad() +<a name="line.1193"></a>
+<span class="sourceLineNo">1194</span>          " leastloaded=" + serversByLoad.firstKey().getLoad());<a name="line.1194"></a>
+<span class="sourceLineNo">1195</span>      }<a name="line.1195"></a>
+<span class="sourceLineNo">1196</span>      return false;<a name="line.1196"></a>
+<span class="sourceLineNo">1197</span>    }<a name="line.1197"></a>
+<span class="sourceLineNo">1198</span>    return true;<a name="line.1198"></a>
+<span class="sourceLineNo">1199</span>  }<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>   * Subclasses should implement this to return true if the cluster has nodes that hosts<a name="line.1202"></a>
+<span class="sourceLineNo">1203</span>   * multiple replicas for the same region, or, if there are multiple racks and the same<a name="line.1203"></a>
+<span class="sourceLineNo">1204</span>   * rack hosts replicas of the same region<a name="line.1204"></a>
+<span class="sourceLineNo">1205</span>   * @param c Cluster information<a name="line.1205"></a>
+<span class="sourceLineNo">1206</span>   * @return whether region replicas are currently co-located<a name="line.1206"></a>
+<span class="sourceLineNo">1207</span>   */<a name="line.1207"></a>
+<span class="sourceLineNo">1208</span>  protected boolean areSomeRegionReplicasColocated(Cluster c) {<a name="line.1208"></a>
+<span class="sourceLineNo">1209</span>    return false;<a name="line.1209"></a>
+<span class="sourceLineNo">1210</span>  }<a name="line.1210"></a>
+<span class="sourceLineNo">1211</span><a name="line.1211"></a>
+<span class="sourceLineNo">1212</span>  /**<a name="line.1212"></a>
+<span class="sourceLineNo">1213</span>   * Generates a bulk assignment plan to be used on cluster startup using a<a name="line.1213"></a>
+<span class="sourceLineNo">1214</span>   * simple round-robin assignment.<a name="line.1214"></a>
+<span class="sourceLineNo">1215</span>   * &lt;p&gt;<a name="line.1215"></a>
+<span class="sourceLineNo">1216</span>   * Takes a list of all the regions and all the servers in the cluster and<a name="line.1216"></a>
+<span class="sourceLineNo">1217</span>   * returns a map of each server to the regions that it should be assigned.<a name="line.1217"></a>
+<span class="sourceLineNo">1218</span>   * &lt;p&gt;<a name="line.1218"></a>
+<span class="sourceLineNo">1219</span>   * Currently implemented as a round-robin assignment. Same invariant as load<a name="line.1219"></a>
+<span class="sourceLineNo">1220</span>   * balancing, all servers holding floor(avg) or ceiling(avg).<a name="line.1220"></a>
+<span class="sourceLineNo">1221</span>   *<a name="line.1221"></a>
+<span class="sourceLineNo">1222</span>   * TODO: Use block locations from HDFS to place regions with their blocks<a name="line.1222"></a>
+<span class="sourceLineNo">1223</span>   *<a name="line.1223"></a>
+<span class="sourceLineNo">1224</span>   * @param regions all regions<a name="line.1224"></a>
+<span class="sourceLineNo">1225</span>   * @param servers all servers<a name="line.1225"></a>
+<span class="sourceLineNo">1226</span>   * @return map of server to the regions it should take, or null if no<a name="line.1226"></a>
+<span class="sourceLineNo">1227</span>   *         assignment is possible (ie. no regions or no servers)<a name="line.1227"></a>
+<span class="sourceLineNo">1228</span>   */<a name="line.1228"></a>
+<span class="sourceLineNo">1229</span>  @Override<a name="line.1229"></a>
+<span class="sourceLineNo">1230</span>  public Map&lt;ServerName, List&lt;RegionInfo&gt;&gt; roundRobinAssignment(List&lt;RegionInfo&gt; regions,<a name="line.1230"></a>
+<span class="sourceLineNo">1231</span>      List&lt;ServerName&gt; servers) throws HBaseIOException {<a name="line.1231"></a>
+<span class="sourceLineNo">1232</span>    metricsBalancer.incrMiscInvocations();<a name="line.1232"></a>
+<span class="sourceLineNo">1233</span>    Map&lt;ServerName, List&lt;RegionInfo&gt;&gt; assignments = assignMasterSystemRegions(regions, servers);<a name="line.1233"></a>
+<span class="sourceLineNo">1234</span>    if (assignments != null &amp;&amp; !assignments.isEmpty()) {<a name="line.1234"></a>
+<span class="sourceLineNo">1235</span>      servers = new ArrayList&lt;&gt;(servers);<a name="line.1235"></a>
+<span class="sourceLineNo">1236</span>      // Guarantee not to put other regions on master<a name="line.1236"></a>
+<span class="sourceLineNo">1237</span>      servers.remove(masterServerName);<a name="line.1237"></a>
+<span class="sourceLineNo">1238</span>      List&lt;RegionInfo&gt; masterRegions = assignments.get(masterServerName);<a name="line.1238"></a>
+<span class="sourceLineNo">1239</span>      if (!masterRegions.isEmpty()) {<a name="line.1239"></a>
+<span class="sourceLineNo">1240</span>        regions = new ArrayList&lt;&gt;(regions);<a name="line.1240"></a>
+<span class="sourceLineNo">1241</span>        regions.removeAll(masterRegions);<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>    if (regions == null || regions.isEmpty()) {<a name="line.1244"></a>
+<span class="sourceLineNo">1245</span>      return assignments;<a name="line.1245"></a>
+<span class="sourceLineNo">1246</span>    }<a name="line.1246"></a>
+<span class="sourceLineNo">1247</span><a name="line.1247"></a>
+<span class="sourceLineNo">1248</span>    int numServers = servers == null ? 0 : servers.size();<a name="line.1248"></a>
+<span class="sourceLineNo">1249</span>    if (numServers == 0) {<a name="line.1249"></a>
+<span class="sourceLineNo">1250</span>      LOG.warn("Wanted to do round robin assignment but no servers to assign to");<a name="line.1250"></a>
+<span class="sourceLineNo">1251</span>      return null;<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>    // TODO: instead of retainAssignment() and roundRobinAssignment(), we should just run the<a name="line.1254"></a>
+<span class="sourceLineNo">1255</span>    // normal LB.balancerCluster() with unassignedRegions. We only need to have a candidate<a name="line.1255"></a>
+<span class="sourceLineNo">1256</span>    // generator for AssignRegionAction. The LB will ensure the regions are mostly local<a name="line.1256"></a>
+<span class="sourceLineNo">1257</span>    // and balanced. This should also run fast with fewer number of iterations.<a name="line.1257"></a>
+<span class="sourceLineNo">1258</span><a name="line.1258"></a>
+<span class="sourceLineNo">1259</span>    if (numServers == 1) { // Only one server, nothing fancy we can do here<a name="line.1259"></a>
+<span class="sourceLineNo">1260</span>      ServerName server = servers.get(0);<a name="line.1260"></a>
+<span class="sourceLineNo">1261</span>      assignments.put(server, new ArrayList&lt;&gt;(regions));<a name="line.1261"></a>
+<span class="sourceLineNo">1262</span>      return assignments;<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>    Cluster cluster = createCluster(servers, regions);<a name="line.1265"></a>
+<span class="sourceLineNo">1266</span>    List&lt;RegionInfo&gt; unassignedRegions = new ArrayList&lt;&gt;();<a name="line.1266"></a>
+<span class="sourceLineNo">1267</span><a name="line.1267"></a>
+<span class="sourceLineNo">1268</span>    roundRobinAssignment(cluster, regions, unassignedRegions,<a name="line.1268"></a>
+<span class="sourceLineNo">1269</span>      servers, assignments);<a name="line.1269"></a>
+<span class="sourceLineNo">1270</span><a name="line.1270"></a>
+<span class="sourceLineNo">1271</span>    List&lt;RegionInfo&gt; lastFewRegions = new ArrayList&lt;&gt;();<a name="line.1271"></a>
+<span class="sourceLineNo">1272</span>    // assign the remaining by going through the list and try to assign to servers one-by-one<a name="line.1272"></a>
+<span class="sourceLineNo">1273</span>    int serverIdx = RANDOM.nextInt(numServers);<a name="line.1273"></a>
+<span class="sourceLineNo">1274</span>    for (RegionInfo region : unassignedRegions) {<a name="line.1274"></a>
+<span class="sourceLineNo">1275</span>      boolean assigned = false;<a name="line.1275"></a>
+<span class="sourceLineNo">1276</span>      for (int j = 0; j &lt; numServers; j++) { // try all servers one by one<a name="line.1276"></a>
+<span class="sourceLineNo">1277</span>        ServerName serverName = servers.get((j + serverIdx) % numServers);<a name="line.1277"></a>
+<span class="sourceLineNo">1278</span>        if (!cluster.wouldLowerAvailability(region, serverName)) {<a name="line.1278"></a>
+<span class="sourceLineNo">1279</span>          List&lt;RegionInfo&gt; serverRegions =<a name="line.1279"></a>
+<span class="sourceLineNo">1280</span>              assignments.computeIfAbsent(serverName, k -&gt; new ArrayList&lt;&gt;());<a name="line.1280"></a>
+<span class="sourceLineNo">1281</span>          serverRegions.add(region);<a name="line.1281"></a>
+<span class="sourceLineNo">1282</span>          cluster.doAssignRegion(region, serverName);<a name="line.1282"></a>
+<span class="sourceLineNo">1283</span>          serverIdx = (j + serverIdx + 1) % numServers; //remain from next server<a name="line.1283"></a>
+<span class="sourceLineNo">1284</span>          assigned = true;<a name="line.1284"></a>
+<span class="sourceLineNo">1285</span>          break;<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>      if (!assigned) {<a name="line.1288"></a>
+<span class="sourceLineNo">1289</span>        lastFewRegions.add(region);<a name="line.1289"></a>
+<span class="sourceLineNo">1290</span>      }<a name="line.1290"></a>
+<span class="sourceLineNo">1291</span>    }<a name="line.1291"></a>
+<span class="sourceLineNo">1292</span>    // just sprinkle the rest of the regions on random regionservers. The balanceCluster will<a name="line.1292"></a>
+<span class="sourceLineNo">1293</span>    // make it optimal later. we can end up with this if numReplicas &gt; numServers.<a name="line.1293"></a>
+<span class="sourceLineNo">1294</span>    for (RegionInfo region : lastFewRegions) {<a name="line.1294"></a>
+<span class="sourceLineNo">1295</span>      int i = RANDOM.nextInt(numServers);<a name="line.1295"></a>
+<span class="sourceLineNo">1296</span>      ServerName server = servers.get(i);<a name="line.1296"></a>
+<span class="sourceLineNo">1297</span>      List&lt;RegionInfo&gt; serverRegions = assignments.computeIfAbsent(server, k -&gt; new ArrayList&lt;&gt;());<a name="line.1297"></a>
+<span class="sourceLineNo">1298</span>      serverRegions.add(region);<a name="line.1298"></a>
+<span class="sourceLineNo">1299</span>      cluster.doAssignRegion(region, server);<a name="line.1299"></a>
+<span class="sourceLineNo">1300</span>    }<a name="line.1300"></a>
+<span class="sourceLineNo">1301</span>    return assignments;<a name="line.1301"></a>
+<span class="sourceLineNo">1302</span>  }<a name="line.1302"></a>
+<span class="sourceLineNo">1303</span><a name="line.1303"></a>
+<span class="sourceLineNo">1304</span>  protected Cluster createCluster(List&lt;ServerName&gt; servers, Collection&lt;RegionInfo&gt; regions) {<a name="line.1304"></a>
+<span class="sourceLineNo">1305</span>    // Get the snapshot of the current assignments for the regions in question, and then create<a name="line.1305"></a>
+<span class="sourceLineNo">1306</span>    // a cluster out of it. Note that we might have replicas already assigned to some servers<a name="line.1306"></a>
+<span class="sourceLineNo">1307</span>    // earlier. So we want to get the snapshot to see those assignments, but this will only contain<a name="line.1307"></a>
+<span class="sourceLineNo">1308</span>    // replicas of the regions that are passed (for performance).<a name="line.1308"></a>
+<span class="sourceLineNo">1309</span>    Map&lt;ServerName, List&lt;RegionInfo&gt;&gt; clusterState = getRegionAssignmentsByServer(regions);<a name="line.1309"></a>
 <span class="sourceLineNo">1310</span><a name="line.1310"></a>
-<span class="sourceLineNo">1311</span>  private List&lt;ServerName&gt; findIdleServers(List&lt;ServerName&gt; servers) {<a name="line.1311"></a>
-<span class="sourceLineNo">1312</span>    return this.services.getServerManager()<a name="line.1312"></a>
-<span class="sourceLineNo">1313</span>            .getOnlineServersListWithPredicator(servers, IDLE_SERVER_PREDICATOR);<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>  /**<a name="line.1316"></a>
-<span class="sourceLineNo">1317</span>   * Used to assign a single region to a random server.<a name="line.1317"></a>
-<span class="sourceLineNo">1318</span>   */<a name="line.1318"></a>
-<span class="sourceLineNo">1319</span>  @Override<a name="line.1319"></a>
-<span class="sourceLineNo">1320</span>  public ServerName randomAssignment(RegionInfo regionInfo, List&lt;ServerName&gt; servers)<a name="line.1320"></a>
-<span class="sourceLineNo">1321</span>      throws HBaseIOException {<a name="line.1321"></a>
-<span class="sourceLineNo">1322</span>    metricsBalancer.incrMiscInvocations();<a name="line.1322"></a>
-<span class="sourceLineNo">1323</span>    if (servers != null &amp;&amp; servers.contains(masterServerName)) {<a name="line.1323"></a>
-<span class="sourceLineNo">1324</span>      if (shouldBeOnMaster(regionInfo)) {<a name="line.1324"></a>
-<span class="sourceLineNo">1325</span>        return masterServerName;<a name="line.1325"></a>
-<span class="sourceLineNo">1326</span>      }<a name="line.1326"></a>
-<span class="sourceLineNo">1327</span>      if (!LoadBalancer.isTablesOnMaster(getConf())) {<a name="line.1327"></a>
-<span class="sourceLineNo">1328</span>        // Guarantee we do not put any regions on master<a name="line.1328"></a>
-<span class="sourceLineNo">1329</span>        servers = new ArrayList&lt;&gt;(servers);<a name="line.1329"></a>
-<span class="sourceLineNo">1330</span>        servers.remove(masterServerName);<a name="line.1330"></a>
-<span class="sourceLineNo">1331</span>      }<a name="line.1331"></a>
-<span class="sourceLineNo">1332</span>    }<a name="line.1332"></a>
-<span class="sourceLineNo">1333</span><a name="line.1333"></a>
-<span class="sourceLineNo">1334</span>    int numServers = servers == null ? 0 : servers.size();<a name="line.1334"></a>
-<span class="sourceLineNo">1335</span>    if (numServers == 0) {<a name="line.1335"></a>
-<span class="sourceLineNo">1336</span>      LOG.warn("Wanted to retain assignment but no servers to assign to");<a name="line.1336"></a>
-<span class="sourceLineNo">1337</span>      return null;<a name="line.1337"></a>
-<span class="sourceLineNo">1338</span>    }<a name="line.1338"></a>
-<span class="sourceLineNo">1339</span>    if (numServers == 1) { // Only one server, nothing fancy we can do here<a name="line.1339"></a>
-<span class="sourceLineNo">1340</span>      return servers.get(0);<a name="line.1340"></a>
+<span class="sourceLineNo">1311</span>    for (ServerName server : servers) {<a name="line.1311"></a>
+<span class="sourceLineNo">1312</span>      if (!clusterState.containsKey(server)) {<a name="line.1312"></a>
+<span class="sourceLineNo">1313</span>        clusterState.put(server, EMPTY_REGION_LIST);<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>    return new Cluster(regions, clusterState, null, this.regionFinder,<a name="line.1316"></a>
+<span class="sourceLineNo">1317</span>        rackManager);<a name="line.1317"></a>
+<span class="sourceLineNo">1318</span>  }<a name="line.1318"></a>
+<span class="sourceLineNo">1319</span><a name="line.1319"></a>
+<span class="sourceLineNo">1320</span>  private List&lt;ServerName&gt; findIdleServers(List&lt;ServerName&gt; servers) {<a name="line.1320"></a>
+<span class="sourceLineNo">1321</span>    return this.services.getServerManager()<a name="line.1321"></a>
+<span class="sourceLineNo">1322</span>            .getOnlineServersListWithPredicator(servers, IDLE_SERVER_PREDICATOR);<a name="line.1322"></a>
+<span class="sourceLineNo">1323</span>  }<a name="line.1323"></a>
+<span class="sourceLineNo">1324</span><a name="line.1324"></a>
+<span class="sourceLineNo">1325</span>  /**<a name="line.1325"></a>
+<span class="sourceLineNo">1326</span>   * Used to assign a single region to a random server.<a name="line.1326"></a>
+<span class="sourceLineNo">1327</span>   */<a name="line.1327"></a>
+<span class="sourceLineNo">1328</span>  @Override<a name="line.1328"></a>
+<span class="sourceLineNo">1329</span>  public ServerName randomAssignment(RegionInfo regionInfo, List&lt;ServerName&gt; servers)<a name="line.1329"></a>
+<span class="sourceLineNo">1330</span>      throws HBaseIOException {<a name="line.1330"></a>
+<span class="sourceLineNo">1331</span>    metricsBalancer.incrMiscInvocations();<a name="line.1331"></a>
+<span class="sourceLineNo">1332</span>    if (servers != null &amp;&amp; servers.contains(masterServerName)) {<a name="line.1332"></a>
+<span class="sourceLineNo">1333</span>      if (shouldBeOnMaster(regionInfo)) {<a name="line.1333"></a>
+<span class="sourceLineNo">1334</span>        return masterServerName;<a name="line.1334"></a>
+<span class="sourceLineNo">1335</span>      }<a name="line.1335"></a>
+<span class="sourceLineNo">1336</span>      if (!LoadBalancer.isTablesOnMaster(getConf())) {<a name="line.1336"></a>
+<span class="sourceLineNo">1337</span>        // Guarantee we do not put any regions on master<a name="line.1337"></a>
+<span class="sourceLineNo">1338</span>        servers = new ArrayList&lt;&gt;(servers);<a name="line.1338"></a>
+<span class="sourceLineNo">1339</span>        servers.remove(masterServerName);<a name="line.1339"></a>
+<span class="sourceLineNo">1340</span>      }<a name="line.1340"></a>
 <span class="sourceLineNo">1341</span>    }<a name="line.1341"></a>
-<span class="sourceLineNo">1342</span>    List&lt;ServerName&gt; idleServers = findIdleServers(servers);<a name="line.1342"></a>
-<span class="sourceLineNo">1343</span>    if (idleServers.size() == 1) {<a name="line.1343"></a>
-<span class="sourceLineNo">1344</span>      return idleServers.get(0);<a name="line.1344"></a>
-<span class="sourceLineNo">1345</span>    }<a name="line.1345"></a>
-<span class="sourceLineNo">1346</span>    final List&lt;ServerName&gt; finalServers = idleServers.isEmpty() ?<a name="line.1346"></a>
-<span class="sourceLineNo">1347</span>            servers : idleServers;<a name="line.1347"></a>
-<span class="sourceLineNo">1348</span>    List&lt;RegionInfo&gt; regions = Lists.newArrayList(regionInfo);<a name="line.1348"></a>
-<span class="sourceLineNo">1349</span>    Cluster cluster = createCluster(finalServers, regions, false);<a name="line.1349"></a>
-<span class="sourceLineNo">1350</span>    return randomAssignment(cluster, regionInfo, finalServers);<a name="line.1350"></a>
-<span class="sourceLineNo">1351</span>  }<a name="line.1351"></a>
-<span class="sourceLineNo">1352</span><a name="line.1352"></a>
-<span class="sourceLineNo">1353</span>  /**<a name="line.1353"></a>
-<span class="sourceLineNo">1354</span>   * Generates a bulk assignment startup plan, attempting to reuse the existing<a name="line.1354"></a>
-<span class="sourceLineNo">1355</span>   * assignment information from META, but adjusting for the specified list of<a name="line.1355"></a>
-<span class="sourceLineNo">1356</span>   * available/online servers available for assignment.<a name="line.1356"></a>
-<span class="sourceLineNo">1357</span>   * &lt;p&gt;<a name="line.1357"></a>
-<span class="sourceLineNo">1358</span>   * Takes a map of all regions to their existing assignment from META. Also<a name="line.1358"></a>
-<span class="sourceLineNo">1359</span>   * takes a list of online servers for regions to be assigned to. Attempts to<a name="line.1359"></a>
-<span class="sourceLineNo">1360</span>   * retain all assignment, so in some instances initial assignment will not be<a name="line.1360"></a>
-<span class="sourceLineNo">1361</span>   * completely balanced.<a name="line.1361"></a>
-<span class="sourceLineNo">1362</span>   * &lt;p&gt;<a name="line.1362"></a>
-<span class="sourceLineNo">1363</span>   * Any leftover regions without an existing server to be assigned to will be<a name="line.1363"></a>
-<span class="sourceLineNo">1364</span>   * assigned randomly to available servers.<a name="line.1364"></a>
-<span class="sourceLineNo">1365</span>   *<a name="line.1365"></a>
-<span class="sourceLineNo">1366</span>   * @param regions regions and existing assignment from meta<a name="line.1366"></a>
-<span class="sourceLineNo">1367</span>   * @param servers available servers<a name="line.1367"></a>
-<span class="sourceLineNo">1368</span>   * @return map of servers and regions to be assigned to them<a name="line.1368"></a>
-<span class="sourceLineNo">1369</span>   */<a name="line.1369"></a>
-<span class="sourceLineNo">1370</span>  @Override<a name="line.1370"></a>
-<span class="sourceLineNo">1371</span>  public Map&lt;ServerName, List&lt;RegionInfo&gt;&gt; retainAssignment(Map&lt;RegionInfo, ServerName&gt; regions,<a name="line.1371"></a>
-<span class="sourceLineNo">1372</span>      List&lt;ServerName&gt; servers) throws HBaseIOException {<a name="line.1372"></a>
-<span class="sourceLineNo">1373</span>    // Update metrics<a name="line.1373"></a>
-<span class="sourceLineNo">1374</span>    metricsBalancer.incrMiscInvocations();<a name="line.1374"></a>
-<span class="sourceLineNo">1375</span>    Map&lt;ServerName, List&lt;RegionInfo&gt;&gt; assignments = assignMasterSystemRegions(regions.keySet(), servers);<a name="line.1375"></a>
-<span class="sourceLineNo">1376</span>    if (assignments != null &amp;&amp; !assignments.isEmpty()) {<a name="line.1376"></a>
-<span class="sourceLineNo">1377</span>      servers = new ArrayList&lt;&gt;(servers);<a name="line.1377"></a>
-<span class="sourceLineNo">1378</span>      // Guarantee not to put other regions on master<a name="line.1378"></a>
-<span class="sourceLineNo">1379</span>      servers.remove(masterServerName);<a name="line.1379"></a>
-<span class="sourceLineNo">1380</span>      List&lt;RegionInfo&gt; masterRegions = assignments.get(masterServerName);<a name="line.1380"></a>
-<span class="sourceLineNo">1381</span>      regions = regions.entrySet().stream().filter(e -&gt; !masterRegions.contains(e.getKey()))<a name="line.1381"></a>
-<span class="sourceLineNo">1382</span>          .collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue));<a name="line.1382"></a>
-<span class="sourceLineNo">1383</span>    }<a name="line.1383"></a>
-<span class="sourceLineNo">1384</span>    if (regions.isEmpty()) {<a name="line.1384"></a>
-<span class="sourceLineNo">1385</span>      return assignments;<a name="line.1385"></a>
-<span class="sourceLineNo">1386</span>    }<a name="line.1386"></a>
-<span class="sourceLineNo">1387</span><a name="line.1387"></a>
-<span class="sourceLineNo">1388</span>    int numServers = servers == null ? 0 : servers.size();<a name="line.1388"></a>
-<span class="sourceLineNo">1389</span>    if (numServers == 0) {<a name="line.1389"></a>
-<span class="sourceLineNo">1390</span>      LOG.warn("Wanted to do retain assignment but no servers to assign to");<a name="line.1390"></a>
-<span class="sourceLineNo">1391</span>      return null;<a name="line.1391"></a>
+<span class="sourceLineNo">1342</span><a name="line.1342"></a>
+<span class="sourceLineNo">1343</span>    int numServers = servers == null ? 0 : servers.size();<a name="line.1343"></a>
+<span class="sourceLineNo">1344</span>    if (numServers == 0) {<a name="line.1344"></a>
+<span class="sourceLineNo">1345</span>      LOG.warn("Wanted to retain assignment but no servers to assign to");<a name="line.1345"></a>
+<span class="sourceLineNo">1346</span>      return null;<a name="line.1346"></a>
+<span class="sourceLineNo">1347</span>    }<a name="line.1347"></a>
+<span class="sourceLineNo">1348</span>    if (numServers == 1) { // Only one server, nothing fancy we can do here<a name="line.1348"></a>
+<span class="sourceLineNo">1349</span>      return servers.get(0);<a name="line.1349"></a>
+<span class="sourceLineNo">1350</span>    }<a name="line.1350"></a>
+<span class="sourceLineNo">1351</span>    List&lt;ServerName&gt; idleServers = findIdleServers(servers);<a name="line.1351"></a>
+<span class="sourceLineNo">1352</span>    if (idleServers.size() == 1) {<a name="line.1352"></a>
+<span class="sourceLineNo">1353</span>      return idleServers.get(0);<a name="line.1353"></a>
+<span class="sourceLineNo">1354</span>    }<a name="line.1354"></a>
+<span class="sourceLineNo">1355</span>    final List&lt;ServerName&gt; finalServers = idleServers.isEmpty() ?<a name="line.1355"></a>
+<span class="sourceLineNo">1356</span>            servers : idleServers;<a name="line.1356"></a>
+<span class="sourceLineNo">1357</span>    List&lt;RegionInfo&gt; regions = Lists.newArrayList(regionInfo);<a name="line.1357"></a>
+<span class="sourceLineNo">1358</span>    Cluster cluster = createCluster(finalServers, regions);<a name="line.1358"></a>
+<span class="sourceLineNo">1359</span>    return randomAssignment(cluster, regionInfo, finalServers);<a name="line.1359"></a>
+<span class="sourceLineNo">1360</span>  }<a name="line.1360"></a>
+<span class="sourceLineNo">1361</span><a name="line.1361"></a>
+<span class="sourceLineNo">1362</span>  /**<a name="line.1362"></a>
+<span class="sourceLineNo">1363</span>   * Generates a bulk assignment startup plan, attempting to reuse the existing<a name="line.1363"></a>
+<span class="sourceLineNo">1364</span>   * assignment information from META, but adjusting for the specified list of<a name="line.1364"></a>
+<span class="sourceLineNo">1365</span>   * available/online servers available for assignment.<a name="line.1365"></a>
+<span class="sourceLineNo">1366</span>   * &lt;p&gt;<a name="line.1366"></a>
+<span class="sourceLineNo">1367</span>   * Takes a map of all regions to their existing assignment from META. Also<a name="line.1367"></a>
+<span class="sourceLineNo">1368</span>   * takes a list of online servers for regions to be assigned to. Attempts to<a name="line.1368"></a>
+<span class="sourceLineNo">1369</span>   * retain all assignment, so in some instances initial assignment will not be<a name="line.1369"></a>
+<span class="sourceLineNo">1370</span>   * completely balanced.<a name="line.1370"></a>
+<span class="sourceLineNo">1371</span>   * &lt;p&gt;<a name="line.1371"></a>
+<span class="sourceLineNo">1372</span>   * Any leftover regions without an existing server to be assigned to will be<a name="line.1372"></a>
+<span class="sourceLineNo">1373</span>   * assigned randomly to available servers.<a name="line.1373"></a>
+<span class="sourceLineNo">1374</span>   *<a name="line.1374"></a>
+<span class="sourceLineNo">1375</span>   * @param regions regions and existing assignment from meta<a name="line.1375"></a>
+<span class="sourceLineNo">1376</span>   * @param servers available servers<a name="line.1376"></a>
+<span class="sourceLineNo">1377</span>   * @return map of servers and regions to be assigned to them<a name="line.1377"></a>
+<span class="sourceLineNo">1378</span>   */<a name="line.1378"></a>
+<span class="sourceLineNo">1379</span>  @Override<a name="line.1379"></a>
+<span class="sourceLineNo">1380</span>  public Map&lt;ServerName, List&lt;RegionInfo&gt;&gt; retainAssignment(Map&lt;RegionInfo, ServerName&gt; regions,<a name="line.1380"></a>
+<span class="sourceLineNo">1381</span>      List&lt;ServerName&gt; servers) throws HBaseIOException {<a name="line.1381"></a>
+<span class="sourceLineNo">1382</span>    // Update metrics<a name="line.1382"></a>
+<span class="sourceLineNo">1383</span>    metricsBalancer.incrMiscInvocations();<a name="line.1383"></a>
+<span class="sourceLineNo">1384</span>    Map&lt;ServerName, List&lt;RegionInfo&gt;&gt; assignments = assignMasterSystemRegions(regions.keySet(), servers);<a name="line.1384"></a>
+<span class="sourceLineNo">1385</span>    if (assignments != null &amp;&amp; !assignments.isEmpty()) {<a name="line.1385"></a>
+<span class="sourceLineNo">1386</span>      servers = new ArrayList&lt;&gt;(servers);<a name="line.1386"></a>
+<span class="sourceLineNo">1387</span>      // Guarantee not to put other regions on master<a name="line.1387"></a>
+<span class="sourceLineNo">1388</span>      servers.remove(masterServerName);<a name="line.1388"></a>
+<span class="sourceLineNo">1389</span>      List&lt;RegionInfo&gt; masterRegions = assignments.get(masterServerName);<a name="line.1389"></a>
+<span class="sourceLineNo">1390</span>      regions = regions.entrySet().stream().filter(e -&gt; !masterRegions.contains(e.getKey()))<a name="line.1390"></a>
+<span class="sourceLineNo">1391</span>          .collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue));<a name="line.1391"></a>
 <span class="sourceLineNo">1392</span>    }<a name="line.1392"></a>
-<span class="sourceLineNo">1393</span>    if (numServers == 1) { // Only one server, nothing fancy we can do here<a name="line.1393"></a>
-<span class="sourceLineNo">1394</span>      ServerName server = servers.get(0);<a name="line.1394"></a>
-<span class="sourceLineNo">1395</span>      assignments.put(server, new ArrayList&lt;&gt;(regions.keySet()));<a name="line.1395"></a>
-<span class="sourceLineNo">1396</span>      return assignments;<a name="line.1396"></a>
-<span class="sourceLineNo">1397</span>    }<a name="line.1397"></a>
-<span class="sourceLineNo">1398</span><a name="line.1398"></a>
-<span class="sourceLineNo">1399</span>    // Group all of the old assignments by their hostname.<a name="line.1399"></a>
-<span class="sourceLineNo">1400</span>    // We can't group directly by ServerName since the servers all have<a name="line.1400"></a>
-<span class="sourceLineNo">1401</span>    // new start-codes.<a name="line.1401"></a>
-<span class="sourceLineNo">1402</span><a name="line.1402"></a>
-<span class="sourceLineNo">1403</span>    // Group the servers by their hostname. It's possible we have multiple<a name="line.1403"></a>
-<span class="sourceLineNo">1404</span>    // servers on the same host on different ports.<a name="line.1404"></a>
-<span class="sourceLineNo">1405</span>    ArrayListMultimap&lt;String, ServerName&gt; serversByHostname = ArrayListMultimap.create();<a name="line.1405"></a>
-<span class="sourceLineNo">1406</span>    for (ServerName server : servers) {<a name="line.1406"></a>
-<span class="sourceLineNo">1407</span>      assignments.put(server, new ArrayList&lt;&gt;());<a name="line.1407"></a>
-<span class="sourceLineNo">1408</span>      serversByHostname.put(server.getHostnameLowerCase(), server);<a name="line.1408"></a>
-<span class="sourceLineNo">1409</span>    }<a name="line.1409"></a>
-<span class="sourceLineNo">1410</span><a name="line.1410"></a>
-<span class="sourceLineNo">1411</span>    // Collection of the hostnames that used to have regions<a name="line.1411"></a>
-<span class="sourceLineNo">1412</span>    // assigned, but for which we no longer have any RS running<a name="line.1412"></a>
-<span class="sourceLineNo">1413</span>    // after the cluster restart.<a name="line.1413"></a>
-<span class="sourceLineNo">1414</span>    Set&lt;String&gt; oldHostsNoLongerPresent = Sets.newTreeSet();<a name="line.1414"></a>
-<span class="sourceLineNo">1415</span><a name="line.1415"></a>
-<span class="sourceLineNo">1416</span>    // If the old servers aren't present, lets assign those regions later.<a name="line.1416"></a>
-<span class="sourceLineNo">1417</span>    List&lt;RegionInfo&gt; randomAssignRegions = Lists.newArrayList();<a name="line.1417"></a>
-<span class="sourceLineNo">1418</span><a name="line.1418"></a>
-<span class="sourceLineNo">1419</span>    int numRandomAssignments = 0;<a name="line.1419"></a>
-<span class="sourceLineNo">1420</span>    int numRetainedAssigments = 0;<a name="line.1420"></a>
-<span class="sourceLineNo">1421</span><a name="line.1421"></a>
-<span class="sourceLineNo">1422</span>    Cluster cluster = createCluster(servers, regions.keySet(), true);<a name="line.1422"></a>
-<span class="sourceLineNo">1423</span><a name="line.1423"></a>
-<span class="sourceLineNo">1424</span>    for (Map.Entry&lt;RegionInfo, ServerName&gt; entry : regions.entrySet()) {<a name="line.1424"></a>
-<span class="sourceLineNo">1425</span>      RegionInfo region = entry.getKey();<a name="line.1425"></a>
-<span class="sourceLineNo">1426</span>      ServerName oldServerName = entry.getValue();<a name="line.1426"></a>
-<span class="sourceLineNo">1427</span>      List&lt;ServerName&gt; localServers = new ArrayList&lt;&gt;();<a name="line.1427"></a>
-<span class="sourceLineNo">1428</span>      if (oldServerName != null) {<a name="line.1428"></a>
-<span class="sourceLineNo">1429</span>        localServers = serversByHostname.get(oldServerName.getHostnameLowerCase());<a name="line.1429"></a>
-<span class="sourceLineNo">1430</span>      }<a name="line.1430"></a>
-<span class="sourceLineNo">1431</span>      if (localServers.isEmpty()) {<a name="line.1431"></a>
-<span class="sourceLineNo">1432</span>        // No servers on the new cluster match up with this hostname, assign randomly, later.<a name="line.1432"></a>
-<span class="sourceLineNo">1433</span>        randomAssignRegions.add(region);<a name="line.1433"></a>
-<span class="sourceLineNo">1434</span>        if (oldServerName != null) {<a name="line.1434"></a>
-<span class="sourceLineNo">1435</span>          oldHostsNoLongerPresent.add(oldServerName.getHostnameLowerCase());<a name="line.1435"></a>
-<span class="sourceLineNo">1436</span>        }<a name="line.1436"></a>
-<span class="sourceLineNo">1437</span>      } else if (localServers.size() == 1) {<a name="line.1437"></a>
-<span class="sourceLineNo">1438</span>        // the usual case - one new server on same host<a name="line.1438"></a>
-<span class="sourceLineNo">1439</span>        ServerName target = localServers.get(0);<a name="line.1439"></a>
-<span class="sourceLineNo">1440</span>        assignments.get(target).add(region);<a name="line.1440"></a>
-<span class="sourceLineNo">1441</span>        numRetainedAssigments++;<a name="line.1441"></a>
-<span class="sourceLineNo">1442</span>      } else {<a name="line.1442"></a>
-<span class="sourceLineNo">1443</span>        // multiple new servers in the cluster on this same host<a name="line.1443"></a>
-<span class="sourceLineNo">1444</span>        if (localServers.contains(oldServerName)) {<a name="line.1444"></a>
-<span class="sourceLineNo">1445</span>          assignments.get(oldServerName).add(region);<a name="line.1445"></a>
-<span class="sourceLineNo">1446</span>          numRetainedAssigments++;<a name="line.1446"></a>
-<span class="sourceLineNo">1447</span>        } else {<a name="line.1447"></a>
-<span class="sourceLineNo">1448</span>          ServerName target = null;<a name="line.1448"></a>
-<span class="sourceLineNo">1449</span>          for (ServerName tmp : localServers) {<a name="line.1449"></a>
-<span class="sourceLineNo">1450</span>            if (tmp.getPort() == oldServerName.getPort()) {<a name="line.1450"></a>
-<span class="sourceLineNo">1451</span>              target = tmp;<a name="line.1451"></a>
-<span class="sourceLineNo">1452</span>              assignments.get(tmp).add(region);<a name="line.1452"></a>
-<span class="sourceLineNo">1453</span>              numRetainedAssigments++;<a name="line.1453"></a>
-<span class="sourceLineNo">1454</span>              break;<a name="line.1454"></a>
-<span class="sourceLineNo">1455</span>            }<a name="line.1455"></a>
-<span class="sourceLineNo">1456</span>          }<a name="line.1456"></a>
-<span class="sourceLineNo">1457</span>          if (target == null) {<a name="line.1457"></a>
-<span class="sourceLineNo">1458</span>            randomAssignRegions.add(region);<a name="line.1458"></a>
-<span class="sourceLineNo">1459</span>          }<a name="line.1459"></a>
-<span class="sourceLineNo">1460</span>        }<a name="line.1460"></a>
-<span class="sourceLineNo">1461</span>      }<a name="line.1461"></a>
-<span class="sourceLineNo">1462</span>    }<a name="line.1462"></a>
-<span class="sourceLineNo">1463</span><a name="line.1463"></a>
-<span class="sourceLineNo">1464</span>    // If servers from prior assignment aren't present, then lets do randomAssignment on regions.<a name="line.1464"></a>
-<span class="sourceLineNo">1465</span>    if (randomAssignRegions.size() &gt; 0) {<a name="line.1465"></a>
-<span class="sourceLineNo">1466</span>      for (Map.Entry&lt;ServerName, List&lt;RegionInfo&gt;&gt; entry : assignments.entrySet()) {<a name="line.1466"></a>
-<span class="sourceLineNo">1467</span>        ServerName sn = entry.getKey();<a name="line.1467"></a>
-<span class="sourceLineNo">1468</span>        for (RegionInfo region : entry.getValue()) {<a name="line.1468"></a>
-<span class="sourceLineNo">1469</span>          cluster.doAssignRegion(region, sn);<a name="line.1469"></a>
-<span class="sourceLineNo">1470</span>        }<a name="line.1470"></a>
-<span class="sourceLineNo">1471</span>      }<a name="line.1471"></a>
-<span class="sourceLineNo">1472</span>      for (RegionInfo region : randomAssignRegions) {<a name="line.1472"></a>
-<span class="sourceLineNo">1473</span>        ServerName target = randomAssignment(cluster, region, servers);<a name="line.1473"></a>
-<span class="sourceLineNo">1474</span>        assignments.get(target).add(region);<a name="line.1474"></a>
-<span class="sourceLineNo">1475</span>        cluster.doAssignRegion(region, target);<a name="line.1475"></a>
-<span class="sourceLineNo">1476</span>        numRandomAssignments++;<a name="line.1476"></a>
-<span class="sourceLineNo">1477</span>      }<a name="line.1477"></a>
-<span class="sourceLineNo">1478</span>    }<a name="line.1478"></a>
-<span class="sourceLineNo">1479</span><a name="line.1479"></a>
-<span class="sourceLineNo">1480</span>    String randomAssignMsg = "";<a name="line.1480"></a>
-<span class="sourceLineNo">1481</span>    if (numRandomAssignments &gt; 0) {<a name="line.1481"></a>
-<span class="sourceLineNo">1482</span>      randomAssignMsg =<a name="line.1482"></a>
-<span class="sourceLineNo">1483</span>          numRandomAssignments + " regions were assigned "<a name="line.1483"></a>
-<span class="sourceLineNo">1484</span>              + "to random hosts, since the old hosts for these regions are no "<a name="line.1484"></a>
-<span class="sourceLineNo">1485</span>              + "longer present in the cluster. These hosts were:\n  "<a name="line.1485"></a>
-<span class="sourceLineNo">1486</span>              + Joiner.on("\n  ").join(oldHostsNoLongerPresent);<a name="line.1486"></a>
-<span class="sourceLineNo">1487</span>    }<a name="line.1487"></a>
-<span class="sourceLineNo">1488</span><a name="line.1488"></a>
-<span class="sourceLineNo">1489</span>    LOG.info("Reassigned " + regions.size() + " regions. " + numRetainedAssigments<a name="line.1489"></a>
-<span class="sourceLineNo">1490</span>        + " retained the pre-restart assignment. " + randomAssignMsg);<a name="line.1490"></a>
-<span class="sourceLineNo">1491</span>    return assignments;<a name="line.1491"></a>
-<span class="sourceLineNo">1492</span>  }<a name="line.1492"></a>
-<span class="sourceLineNo">1493</span><a name="line.1493"></a>
-<span class="sourceLineNo">1494</span>  @Override<a name="line.1494"></a>
-<span class="sourceLineNo">1495</span>  public void initialize() throws HBaseIOException{<a name="line.1495"></a>
-<span class="sourceLineNo">1496</span>  }<a name="line.1496"></a>
-<span class="sourceLineNo">1497</span><a name="line.1497"></a>
-<span class="sourceLineNo">1498</span>  @Override<a name="line.1498"></a>
-<span class="sourceLineNo">1499</span>  public void regionOnline(RegionInfo regionInfo, ServerName sn) {<a name="line.1499"></a>
+<span class="sourceLineNo">1393</span>    if (regions.isEmpty()) {<a name="line.1393"></a>
+<span class="sourceLineNo">1394</span>      return assignments;<a name="line.1394"></a>
+<span class="sourceLineNo">1395</span>    }<a name="line.1395"></a>
+<span class="sourceLineNo">1396</span><a name="line.1396"></a>
+<span class="sourceLineNo">1397</span>    int numServers = servers == null ? 0 : servers.size();<a name="line.1397"></a>
+<span class="sourceLineNo">1398</span>    if (numServers == 0) {<a name="line.1398"></a>
+<span class="sourceLineNo">1399</span>      LOG.warn("Wanted to do retain assignment but no servers to assign to");<a name="line.1399"></a>
+<span class="sourceLineNo">1400</span>      return null;<a name="line.1400"></a>
+<span class="sourceLineNo">1401</span>    }<a name="line.1401"></a>
+<span class="sourceLineNo">1402</span>    if (numServers == 1) { // Only one server, nothing fancy we can do here<a name="line.1402"></a>
+<span class="sourceLineNo">1403</span>      ServerName server = servers.get(0);<a name="line.1403"></a>
+<span class="sourceLineNo">1404</span>      assignments.put(server, new ArrayList&lt;&gt;(regions.keySet()));<a name="line.1404"></a>
+<span class="sourceLineNo">1405</span>      return assignments;<a name="line.1405"></a>
+<span class="sourceLineNo">1406</span>    }<a name="line.1406"></a>
+<span class="sourceLineNo">1407</span><a name="line.1407"></a>
+<span class="sourceLineNo">1408</span>    // Group all of the old assignments by their hostname.<a name="line.1408"></a>
+<span class="sourceLineNo">1409</span>    // We can't group directly by ServerName since the servers all have<a name="line.1409"></a>
+<span class="sourceLineNo">1410</span>    // new start-codes.<a name="line.1410"></a>
+<span class="sourceLineNo">1411</span><a name="line.1411"></a>
+<span class="sourceLineNo">1412</span>    // Group the servers by their hostname. It's possible we have multiple<a name="line.1412"></a>
+<span class="sourceLineNo">1413</span>    // servers on the same host on different ports.<a name="line.1413"></a>
+<span class="sourceLineNo">1414</span>    ArrayListMultimap&lt;String, ServerName&gt; serversByHostname = ArrayListMultimap.create();<a name="line.1414"></a>
+<span class="sourceLineNo">1415</span>    for (ServerName server : servers) {<a name="line.1415"></a>
+<span class="sourceLineNo">1416</span>      assignments.put(server, new ArrayList&lt;&gt;());<a name="line.1416"></a>
+<span class="sourceLineNo">1417</span>      serversByHostname.put(server.getHostnameLowerCase(), server);<a name="line.1417"></a>
+<span class="sourceLineNo">1418</span>    }<a name="line.1418"></a>
+<span class="sourceLineNo">1419</span><a name="line.1419"></a>
+<span class="sourceLineNo">1420</span>    // Collection of the hostnames that used to have regions<a name="line.1420"></a>
+<span class="sourceLineNo">1421</span>    // assigned, but for which we no longer have any RS running<a name="line.1421"></a>
+<span class="sourceLineNo">1422</span>    // after the cluster restart.<a name="line.1422"></a>
+<span class="sourceLineNo">1423</span>    Set&lt;String&gt; oldHostsNoLongerPresent = Sets.newTreeSet();<a name="line.1423"></a>
+<span class="sourceLineNo">1424</span><a name="line.1424"></a>
+<span class="sourceLineNo">1425</span>    // If the old servers aren't present, lets assign those regions later.<a name="line.1425"></a>
+<span class="sourceLineNo">1426</span>    List&lt;RegionInfo&gt; randomAssignRegions = Lists.newArrayList();<a name="line.1426"></a>
+<span class="sourceLineNo">1427</span><a name="line.1427"></a>
+<span class="sourceLineNo">1428</span>    int numRandomAssignments = 0;<a name="line.1428"></a>
+<span class="sourceLineNo">1429</span>    int numRetainedAssigments = 0;<a name="line.1429"></a>
+<span class="sourceLineNo">1430</span><a name="line.1430"></a>
+<span class="sourceLineNo">1431</span>    for (Map.Entry&lt;RegionInfo, ServerName&gt; entry : regions.entrySet()) {<a name="line.1431"></a>
+<span class="sourceLineNo">1432</span>      RegionInfo region = entry.getKey();<a name="line.1432"></a>
+<span class="sourceLineNo">1433</span>      ServerName oldServerName = entry.getValue();<a name="line.1433"></a>
+<span class="sourceLineNo">1434</span>      List&lt;ServerName&gt; localServers = new ArrayList&lt;&gt;();<a name="line.1434"></a>
+<span class="sourceLineNo">1435</span>      if (oldServerName != null) {<a name="line.1435"></a>
+<span class="sourceLineNo">1436</span>        localServers = serversByHostname.get(oldServerName.getHostnameLowerCase());<a name="line.1436"></a>
+<span class="sourceLineNo">1437</span>      }<a name="line.1437"></a>
+<span class="sourceLineNo">1438</span>      if (localServers.isEmpty()) {<a name="line.1438"></a>
+<span class="sourceLineNo">1439</span>        // No servers on the new cluster match up with this hostname, assign randomly, later.<a name="line.1439"></a>
+<span class="sourceLineNo">1440</span>        randomAssignRegions.add(region);<a name="line.1440"></a>
+<span class="sourceLineNo">1441</span>        if (oldServerName != null) {<a name="line.1441"></a>
+<span class="sourceLineNo">1442</span>          oldHostsNoLongerPresent.add(oldServerName.getHostnameLowerCase());<a name="line.1442"></a>
+<span class="sourceLineNo">1443</span>        }<a name="line.1443"></a>
+<span class="sourceLineNo">1444</span>      } else if (localServers.size() == 1) {<a name="line.1444"></a>
+<span class="sourceLineNo">1445</span>        // the usual case - one new server on same host<a name="line.1445"></a>
+<span class="sourceLineNo">1446</span>        ServerName target = localServers.get(0);<a name="line.1446"></a>
+<span class="sourceLineNo">1447</span>        assignments.get(target).add(region);<a name="line.1447"></a>
+<span class="sourceLineNo">1448</span>        numRetainedAssigments++;<a name="line.1448"></a>
+<span class="sourceLineNo">1449</span>      } else {<a name="line.1449"></a>
+<span class="sourceLineNo">1450</span>        // multiple new servers in the cluster on this same host<a name="line.1450"></a>
+<span class="sourceLineNo">1451</span>        if (localServers.contains(oldServerName)) {<a name="line.1451"></a>
+<span class="sourceLineNo">1452</span>          assignments.get(oldServerName).add(region);<a name="line.1452"></a>
+<span class="sourceLineNo">1453</span>          numRetainedAssigments++;<a name="line.1453"></a>
+<span class="sourceLineNo">1454</span>        } else {<a name="line.1454"></a>
+<span class="sourceLineNo">1455</span>          ServerName target = null;<a name="line.1455"></a>
+<span class="sourceLineNo">1456</span>          for (ServerName tmp : localServers) {<a name="line.1456"></a>
+<span class="sourceLineNo">1457</span>            if (tmp.getPort() == oldServerName.getPort()) {<a name="line.1457"></a>
+<span class="sourceLineNo">1458</span>              target = tmp;<a name="line.1458"></a>
+<span class="sourceLineNo">1459</span>              assignments.get(tmp).add(region);<a name="line.1459"></a>
+<span class="sourceLineNo">1460</span>              numRetainedAssigments++;<a name="line.1460"></a>
+<span class="sourceLineNo">1461</span>              break;<a name="line.1461"></a>
+<span class="sourceLineNo">1462</span>            }<a name="line.1462"></a>
+<span class="sourceLineNo">1463</span>          }<a name="line.1463"></a>
+<span class="sourceLineNo">1464</span>          if (target == null) {<a name="line.1464"></a>
+<span class="sourceLineNo">1465</span>            randomAssignRegions.add(region);<a name="line.1465"></a>
+<span class="sourceLineNo">1466</span>          }<a name="line.1466"></a>
+<span class="sourceLineNo">1467</span>        }<a name="line.1467"></a>
+<span class="sourceLineNo">1468</span>      }<a name="line.1468"></a>
+<span class="sourceLineNo">1469</span>    }<a name="line.1469"></a>
+<span class="sourceLineNo">1470</span><a name="line.1470"></a>
+<span class="sourceLineNo">1471</span>    // If servers from prior assignment aren't present, then lets do randomAssignment on regions.<a name="line.1471"></a>
+<span class="sourceLineNo">1472</span>    if (randomAssignRegions.size() &gt; 0) {<a name="line.1472"></a>
+<span class="sourceLineNo">1473</span>      Cluster cluster = createCluster(servers, regions.keySet());<a name="line.1473"></a>
+<span class="sourceLineNo">1474</span>      for (Map.Entry&lt;ServerName, List&lt;RegionInfo&gt;&gt; entry : assignments.entrySet()) {<a name="line.1474"></a>
+<span class="sourceLineNo">1475</span>        ServerName sn = entry.getKey();<a name="line.1475"></a>
+<span class="sourceLineNo">1476</span>        for (RegionInfo region : entry.getValue()) {<a name="line.1476"></a>
+<span class="sourceLineNo">1477</span>          cluster.doAssignRegion(region, sn);<a name="line.1477"></a>
+<span class="sourceLineNo">1478</span>        }<a name="line.1478"></a>
+<span class="sourceLineNo">1479</span>      }<a name="line.1479"></a>
+<span class="sourceLineNo">1480</span>      for (RegionInfo region : randomAssignRegions) {<a name="line.1480"></a>
+<span class="sourceLineNo">1481</span>        ServerName target = randomAssignment(cluster, region, servers);<a name="line.1481"></a>
+<span class="sourceLineNo">1482</span>        assignments.get(target).add(region);<a name="line.1482"></a>
+<span class="sourceLineNo">1483</span>        cluster.doAssignRegion(region, target);<a name="line.1483"></a>
+<span class="sourceLineNo">1484</span>        numRandomAssignments++;<a name="line.1484"></a>
+<span class="sourceLineNo">1485</span>      }<a name="line.1485"></a>
+<span class="sourceLineNo">1486</span>    }<a name="line.1486"></a>
+<span class="sourceLineNo">1487</span><a name="line.1487"></a>
+<span class="sourceLineNo">1488</span>    String randomAssignMsg = "";<a name="line.1488"></a>
+<span class="sourceLineNo">1489</span>    if (numRandomAssignments &gt; 0) {<a name="line.1489"></a>
+<span class="sourceLineNo">1490</span>      randomAssignMsg =<a name="line.1490"></a>
+<span class="sourceLineNo">1491</span>          numRandomAssignments + " regions were assigned "<a name="line.1491"></a>
+<span class="sourceLineNo">1492</span>              + "to random hosts, since the old hosts for these regions are no "<a name="line.1492"></a>
+<span class="sourceLineNo">1493</span>              + "longer present in the cluster. These hosts were:\n  "<a name="line.1493"></a>
+<span class="sourceLineNo">1494</span>              + Joiner.on("\n  ").join(oldHostsNoLongerPresent);<a name="line.1494"></a>
+<span class="sourceLineNo">1495</span>    }<a name="line.1495"></a>
+<span class="sourceLineNo">1496</span><a name="line.1496"></a>
+<span class="sourceLineNo">1497</span>    LOG.info("Reassigned " + regions.size() + " regions. " + numRetainedAssigments<a name="line.1497"></a>
+<span class="sourceLineNo">1498</span>        + " retained the pre-restart assignment. " + randomAssignMsg);<a name="line.1498"></a>
+<span class="sourceLineNo">1499</span>    return assignments;<a name="line.1499"></a>
 <span class="sourceLineNo">1500</span>  }<a name="line.1500"></a>
 <span class="sourceLineNo">1501</span><a name="line.1501"></a>
 <span class="sourceLineNo">1502</span>  @Override<a name="line.1502"></a>
-<span class="sourceLineNo">1503</span>  public void regionOffline(RegionInfo regionInfo) {<a name="line.1503"></a>
+<span class="sourceLineNo">1503</span>  public void initialize() throws HBaseIOException{<a name="line.1503"></a>
 <span class="sourceLineNo">1504</span>  }<a name="line.1504"></a>
 <span class="sourceLineNo">1505</span><a name="line.1505"></a>
 <span class="sourceLineNo">1506</span>  @Override<a name="line.1506"></a>
-<span class="sourceLineNo">1507</span>  public boolean isStopped() {<a name="line.1507"></a>
-<span class="sourceLineNo">1508</span>    return stopped;<a name="line.1508"></a>
-<span class="sourceLineNo">1509</span>  }<a name="line.1509"></a>
-<span class="sourceLineNo">1510</span><a name="line.1510"></a>
-<span class="sourceLineNo">1511</span>  @Override<a name="line.1511"></a>
-<span class="sourceLineNo">1512</span>  public void stop(String why) {<a name="line.1512"></a>
-<span class="sourceLineNo">1513</span>    LOG.info("Load Balancer stop requested: "+why);<a name="line.1513"></a>
-<span class="sourceLineNo">1514</span>    stopped = true;<a name="line.1514"></a>
-<span class="sourceLineNo">1515</span>  }<a name="line.1515"></a>
-<span class="sourceLineNo">1516</span><a name="line.1516"></a>
-<span class="sourceLineNo">1517</span>  /**<a name="line.1517"></a>
-<span class="sourceLineNo">1518</span>   * Used to assign a single region to a random server.<a name="line.1518"></a>
-<span class="sourceLineNo">1519</span>   */<a name="line.1519"></a>
-<span class="sourceLineNo">1520</span>  private ServerName randomAssignment(Cluster cluster, RegionInfo regionInfo,<a name="line.1520"></a>
-<span class="sourceLineNo">1521</span>      List&lt;ServerName&gt; servers) {<a name="line.1521"></a>
-<span class="sourceLineNo">1522</span>    int numServers = servers.size(); // servers is not null, numServers &gt; 1<a name="line.1522"></a>
-<span class="sourceLineNo">1523</span>    ServerName sn = null;<a name="line.1523"></a>
-<span class="sourceLineNo">1524</span>    final int maxIterations = numServers * 4;<a name="line.1524"></a>
-<span class="sourceLineNo">1525</span>    int iterations = 0;<a name="line.1525"></a>
-<span class="sourceLineNo">1526</span><a name="line.1526"></a>
-<span class="sourceLineNo">1527</span>    do {<a name="line.1527"></a>
-<span class="sourceLineNo">1528</span>      int i = RANDOM.nextInt(numServers);<a name="line.1528"></a>
-<span class="sourceLineNo">1529</span>      sn = servers.get(i);<a name="line.1529"></a>
-<span class="sourceLineNo">1530</span>    } while (cluster.wouldLowerAvailability(regionInfo, sn)<a name="line.1530"></a>
-<span class="sourceLineNo">1531</span>        &amp;&amp; iterations++ &lt; maxIterations);<a name="line.1531"></a>
-<span class="sourceLineNo">1532</span>    cluster.doAssignRegion(regionInfo, sn);<a name="line.1532"></a>
-<span class="sourceLineNo">1533</span>    return sn;<a name="line.1533"></a>
-<span class="sourceLineNo">1534</span>  }<a name="line.1534"></a>
-<span class="sourceLineNo">1535</span><a name="line.1535"></a>
-<span class="sourceLineNo">1536</span>  /**<a name="line.1536"></a>
-<span class="sourceLineNo">1537</span>   * Round robin a list of regions to a list of servers<a name="line.1537"></a>
-<span class="sourceLineNo">1538</span>   */<a name="line.1538"></a>
-<span class="sourceLineNo">1539</span>  private void roundRobinAssignment(Cluster cluster, List&lt;RegionInfo&gt; regions,<a name="line.1539"></a>
-<span class="sourceLineNo">1540</span>      List&lt;RegionInfo&gt; unassignedRegions, List&lt;ServerName&gt; servers,<a name="line.1540"></a>
-<span class="sourceLineNo">1541</span>      Map&lt;ServerName, List&lt;RegionInfo&gt;&gt; assignments) {<a name="line.1541"></a>
-<span class="sourceLineNo">1542</span><a name="line.1542"></a>
-<span class="sourceLineNo">1543</span>    int numServers = servers.size();<a name="line.1543"></a>
-<span class="sourceLineNo">1544</span>    int numRegions = regions.size();<a name="line.1544"></a>
-<span class="sourceLineNo">1545</span>    int max = (int) Math.ceil((float) numRegions / numServers);<a name="line.1545"></a>
-<span class="sourceLineNo">1546</span>    int serverIdx = 0;<a name="line.1546"></a>
-<span class="sourceLineNo">1547</span>    if (numServers &gt; 1) {<a name="line.1547"></a>
-<span class="sourceLineNo">1548</span>      serverIdx = RANDOM.nextInt(numServers);<a name="line.1548"></a>
-<span class="sourceLineNo">1549</span>    }<a name="line.1549"></a>
-<span class="sourceLineNo">1550</span>    int regionIdx = 0;<a name="line.1550"></a>
-<span class="sourceLineNo">1551</span><a name="line.1551"></a>
-<span class="sourceLineNo">1552</span>    for (int j = 0; j &lt; numServers; j++) {<a name="line.1552"></a>
-<span class="sourceLineNo">1553</span>      ServerName server = servers.get((j + serverIdx) % numServers);<a name="line.1553"></a>
-<span class="sourceLineNo">1554</span>      List&lt;RegionInfo&gt; serverRegions = new ArrayList&lt;&gt;(max);<a name="line.1554"></a>
-<span class="sourceLineNo">1555</span>      for (int i = regionIdx; i &lt; numRegions; i += numServers) {<a name="line.1555"></a>
-<span class="sourceLineNo">1556</span>        RegionInfo region = regions.get(i % numRegions);<a name="line.1556"></a>
-<span class="sourceLineNo">1557</span>        if (cluster.wouldLowerAvailability(region, server)) {<a name="line.1557"></a>
-<span class="sourceLineNo">1558</span>          unassignedRegions.add(region);<a name="line.1558"></a>
-<span class="sourceLineNo">1559</span>        } else {<a name="line.1559"></a>
-<span class="sourceLineNo">1560</span>          serverRegions.add(region);<a name="line.1560"></a>
-<span class="sourceLineNo">1561</span>          cluster.doAssignRegion(region, server);<a name="line.1561"></a>
-<span class="sourceLineNo">1562</span>        }<a name="line.1562"></a>
-<span class="sourceLineNo">1563</span>      }<a name="line.1563"></a>
-<span class="sourceLineNo">1564</span>      assignments.put(server, serverRegions);<a name="line.1564"></a>
-<span class="sourceLineNo">1565</span>      regionIdx++;<a name="line.1565"></a>
-<span class="sourceLineNo">1566</span>    }<a name="line.1566"></a>
-<span class="sourceLineNo">1567</span>  }<a name="line.1567"></a>
-<span class="sourceLineNo">1568</span><a name="line.1568"></a>
-<span class="sourceLineNo">1569</span>  protected Map&lt;ServerName, List&lt;RegionInfo&gt;&gt; getRegionAssignmentsByServer(<a name="line.1569"></a>
-<span class="sourceLineNo">1570</span>    Collection&lt;RegionInfo&gt; regions) {<a name="line.1570"></a>
-<span class="sourceLineNo">1571</span>    if (this.services != null &amp;&amp; this.services.getAssignmentManager() != null) {<a name="line.1571"></a>
-<span class="sourceLineNo">1572</span>      return this.services.getAssignmentManager().getSnapShotOfAssignment(regions);<a name="line.1572"></a>
-<span class="sourceLineNo">1573</span>    } else {<a name="line.1573"></a>
-<span class="sourceLineNo">1574</span>      return new HashMap&lt;&gt;();<a name="line.1574"></a>
-<span class="sourceLineNo">1575</span>    }<a name="line.1575"></a>
-<span class="sourceLineNo">1576</span>  }<a name="line.1576"></a>
-<span class="sourceLineNo">1577</span><a name="line.1577"></a>
-<span class="sourceLineNo">1578</span>  @Override<a name="line.1578"></a>
-<span class="sourceLineNo">1579</span>  public void onConfigurationChange(Configuration conf) {<a name="line.1579"></a>
-<span class="sourceLineNo">1580</span>  }<a name="line.1580"></a>
-<span class="sourceLineNo">1581</span>}<a name="line.1581"></a>
+<span class="sourceLineNo">1507</span>  public void regionOnline(RegionInfo regionInfo, ServerName sn) {<a name="line.1507"></a>
+<span class="sourceLineNo">1508</span>  }<a name="line.1508"></a>
+<span class="sourceLineNo">1509</span><a name="line.1509"></a>
+<span class="sourceLineNo">1510</span>  @Override<a name="line.1510"></a>
+<span class="sourceLineNo">1511</span>  public void regionOffline(RegionInfo regionInfo) {<a name="line.1511"></a>
+<span class="sourceLineNo">1512</span>  }<a name="line.1512"></a>
+<span class="sourceLineNo">1513</span><a name="line.1513"></a>
+<span class="sourceLineNo">1514</span>  @Override<a name="line.1514"></a>
+<span class="sourceLineNo">1515</span>  public boolean isStopped() {<a name="line.1515"></a>
+<span class="sourceLineNo">1516</span>    return stopped;<a name="line.1516"></a>
+<span class="sourceLineNo">1517</span>  }<a name="line.1517"></a>
+<span class="sourceLineNo">1518</span><a name="line.1518"></a>
+<span class="sourceLineNo">1519</span>  @Override<a name="line.1519"></a>
+<span class="sourceLineNo">1520</span>  public void stop(String why) {<a name="line.1520"></a>
+<span class="sourceLineNo">1521</span>    LOG.info("Load Balancer stop requested: "+why);<a name="line.1521"></a>
+<span class="sourceLineNo">1522</span>    stopped = true;<a name="line.1522"></a>
+<span class="sourceLineNo">1523</span>  }<a name="line.1523"></a>
+<span class="sourceLineNo">1524</span><a name="line.1524"></a>
+<span class="sourceLineNo">1525</span>  /**<a name="line.1525"></a>
+<span class="sourceLineNo">1526</span>   * Used to assign a single region to a random server.<a name="line.1526"></a>
+<span class="sourceLineNo">1527</span>   */<a name="line.1527"></a>
+<span class="sourceLineNo">1528</span>  private ServerName randomAssignment(Cluster cluster, RegionInfo regionInfo,<a name="line.1528"></a>
+<span class="sourceLineNo">1529</span>      List&lt;ServerName&gt; servers) {<a name="line.1529"></a>
+<span class="sourceLineNo">1530</span>    int numServers = servers.size(); // servers is not null, numServers &gt; 1<a name="line.1530"></a>
+<span class="sourceLineNo">1531</span>    ServerName sn = null;<a name="line.1531"></a>
+<span class="sourceLineNo">1532</span>    final int maxIterations = numServers * 4;<a name="line.1532"></a>
+<span class="sourceLineNo">1533</span>    int iterations = 0;<a name="line.1533"></a>
+<span class="sourceLineNo">1534</span><a name="line.1534"></a>
+<span class="sourceLineNo">1535</span>    do {<a name="line.1535"></a>
+<span class="sourceLineNo">1536</span>      int i = RANDOM.nextInt(numServers);<a name="line.1536"></a>
+<span class="sourceLineNo">1537</span>      sn = servers.get(i);<a name="line.1537"></a>
+<span class="sourceLineNo">1538</span>    } while (cluster.wouldLowerAvailability(regionInfo, sn)<a name="line.1538"></a>
+<span class="sourceLineNo">1539</span>        &amp;&amp; iterations++ &lt; maxIterations);<a name="line.1539"></a>
+<span class="sourceLineNo">1540</span>    cluster.doAssignRegion(regionInfo, sn);<a name="line.1540"></a>
+<span class="sourceLineNo">1541</span>    return sn;<a name="line.1541"></a>
+<span class="sourceLineNo">1542</span>  }<a name="line.1542"></a>
+<span class="sourceLineNo">1543</span><a name="line.1543"></a>
+<span class="sourceLineNo">1544</span>  /**<a name="line.1544"></a>
+<span class="sourceLineNo">1545</span>   * Round robin a list of regions to a list of servers<a name="line.1545"></a>
+<span class="sourceLineNo">1546</span>   */<a name="line.1546"></a>
+<span class="sourceLineNo">1547</span>  private void roundRobinAssignment(Cluster cluster, List&lt;RegionInfo&gt; regions,<a name="line.1547"></a>
+<span class="sourceLineNo">1548</span>      List&lt;RegionInfo&gt; unassignedRegions, List&lt;ServerName&gt; servers,<a name="line.1548"></a>
+<span class="sourceLineNo">1549</span>      Map&lt;ServerName, List&lt;RegionInfo&gt;&gt; assignments) {<a name="line.1549"></a>
+<span class="sourceLineNo">1550</span><a name="line.1550"></a>
+<span class="sourceLineNo">1551</span>    int numServers = servers.size();<a name="line.1551"></a>
+<span class="sourceLineNo">1552</span>    int numRegions = regions.size();<a name="line.1552"></a>
+<span class="sourceLineNo">1553</span>    int max = (int) Math.ceil((float) numRegions / numServers);<a name="line.1553"></a>
+<span class="sourceLineNo">1554</span>    int serverIdx = 0;<a name="line.1554"></a>
+<span class="sourceLineNo">1555</span>    if (numServers &gt; 1) {<a name="line.1555"></a>
+<span class="sourceLineNo">1556</span>      serverIdx = RANDOM.nextInt(numServers);<a name="line.1556"></a>
+<span class="sourceLineNo">1557</span>    }<a name="line.1557"></a>
+<span class="sourceLineNo">1558</span>    int regionIdx = 0;<a name="line.1558"></a>
+<span class="sourceLineNo">1559</span><a name="line.1559"></a>
+<span class="sourceLineNo">1560</span>    for (int j = 0; j &lt; numServers; j++) {<a name="line.1560"></a>
+<span class="sourceLineNo">1561</span>      ServerName server = servers.get((j + serverIdx) % numServers);<a name="line.1561"></a>
+<span class="sourceLineNo">1562</span>      List&lt;RegionInfo&gt; serverRegions = new ArrayList&lt;&gt;(max);<a name="line.1562"></a>
+<span class="sourceLineNo">1563</span>      for (int i = regionIdx; i &lt; numRegions; i += numServers) {<a name="line.1563"></a>
+<span class="sourceLineNo">1564</span>        RegionInfo region = regions.get(i % numRegions);<a name="line.1564"></a>
+<span class="sourceLineNo">1565</span>        if (cluster.wouldLowerAvailability(region, server)) {<a name="line.1565"></a>
+<span class="sourceLineNo">1566</span>          unassignedRegions.add(region);<a name="line.1566"></a>
+<span class="sourceLineNo">1567</span>        } else {<a name="line.1567"></a>
+<span class="sourceLineNo">1568</span>          serverRegions.add(region);<a name="line.1568"></a>
+<span class="sourceLineNo">1569</span>          cluster.doAssignRegion(region, server);<a name="line.1569"></a>
+<span class="sourceLineNo">1570</span>        }<a name="line.1570"></a>
+<span class="sourceLineNo">1571</span>      }<a name="line.1571"></a>
+<span class="sourceLineNo">1572</span>      assignments.put(server, serverRegions);<a name="line.1572"></a>
+<span class="sourceLineNo">1573</span>      regionIdx++;<a name="line.1573"></a>
+<span class="sourceLineNo">1574</span>    }<a name="line.1574"></a>
+<span class="sourceLineNo">1575</span>  }<a name="line.1575"></a>
+<span class="sourceLineNo">1576</span><a name="line.1576"></a>
+<span class="sourceLineNo">1577</span>  protected Map&lt;ServerName, List&lt;RegionInfo&gt;&gt; getRegionAssignmentsByServer(<a name="line.1577"></a>
+<span class="sourceLineNo">1578</span>    Collection&lt;RegionInfo&gt; regions) {<a name="line.1578"></a>
+<span class="sourceLineNo">1579</span>    if (this.services != null &amp;&amp; this.services.getAssignmentManager() != null) {<a name="line.1579"></a>
+<span class="sourceLineNo">1580</span>      return this.services.getAssignmentManager().getSnapShotOfAssignment(regions);<a name="line.1580"></a>
+<span class="sourceLineNo">1581</span>    } else {<a name="line.1581"></a>
+<span class="sourceLineNo">1582</span>      return new HashMap&lt;&gt;();<a name="line.1582"></a>
+<span class="sourceLineNo">1583</span>    }<a name="line.1583"></a>
+<span class="sourceLineNo">1584</span>  }<a name="line.1584"></a>
+<span class="sourceLineNo">1585</span><a name="line.1585"></a>
+<span class="sourceLineNo">1586</span>  @Override<a name="line.1586"></a>
+<span class="sourceLineNo">1587</span>  public void onConfigurationChange(Configuration conf) {<a name="line.1587"></a>
+<span class="sourceLineNo">1588</span>  }<a name="line.1588"></a>
+<span class="sourceLineNo">1589</span>}<a name="line.1589"></a>
 
 
 


[07/29] hbase-site git commit: Published site at 477f9fdb32873387231c5fbbff130ba8bf7b5d68.

Posted by gi...@apache.org.
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/621479e1/devapidocs/src-html/org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.html
----------------------------------------------------------------------
diff --git a/devapidocs/src-html/org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.html b/devapidocs/src-html/org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.html
index 7f42212..d4bf03c 100644
--- a/devapidocs/src-html/org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.html
+++ b/devapidocs/src-html/org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.html
@@ -1159,434 +1159,442 @@
 <span class="sourceLineNo">1151</span>    }<a name="line.1151"></a>
 <span class="sourceLineNo">1152</span>  }<a name="line.1152"></a>
 <span class="sourceLineNo">1153</span><a name="line.1153"></a>
-<span class="sourceLineNo">1154</span>  public void setRackManager(RackManager rackManager) {<a name="line.1154"></a>
-<span class="sourceLineNo">1155</span>    this.rackManager = rackManager;<a name="line.1155"></a>
-<span class="sourceLineNo">1156</span>  }<a name="line.1156"></a>
-<span class="sourceLineNo">1157</span><a name="line.1157"></a>
-<span class="sourceLineNo">1158</span>  protected boolean needsBalance(Cluster c) {<a name="line.1158"></a>
-<span class="sourceLineNo">1159</span>    ClusterLoadState cs = new ClusterLoadState(c.clusterState);<a name="line.1159"></a>
-<span class="sourceLineNo">1160</span>    if (cs.getNumServers() &lt; MIN_SERVER_BALANCE) {<a name="line.1160"></a>
-<span class="sourceLineNo">1161</span>      if (LOG.isDebugEnabled()) {<a name="line.1161"></a>
-<span class="sourceLineNo">1162</span>        LOG.debug("Not running balancer because only " + cs.getNumServers()<a name="line.1162"></a>
-<span class="sourceLineNo">1163</span>            + " active regionserver(s)");<a name="line.1163"></a>
-<span class="sourceLineNo">1164</span>      }<a name="line.1164"></a>
-<span class="sourceLineNo">1165</span>      return false;<a name="line.1165"></a>
-<span class="sourceLineNo">1166</span>    }<a name="line.1166"></a>
-<span class="sourceLineNo">1167</span>    if(areSomeRegionReplicasColocated(c)) return true;<a name="line.1167"></a>
-<span class="sourceLineNo">1168</span>    // Check if we even need to do any load balancing<a name="line.1168"></a>
-<span class="sourceLineNo">1169</span>    // HBASE-3681 check sloppiness first<a name="line.1169"></a>
-<span class="sourceLineNo">1170</span>    float average = cs.getLoadAverage(); // for logging<a name="line.1170"></a>
-<span class="sourceLineNo">1171</span>    int floor = (int) Math.floor(average * (1 - slop));<a name="line.1171"></a>
-<span class="sourceLineNo">1172</span>    int ceiling = (int) Math.ceil(average * (1 + slop));<a name="line.1172"></a>
-<span class="sourceLineNo">1173</span>    if (!(cs.getMaxLoad() &gt; ceiling || cs.getMinLoad() &lt; floor)) {<a name="line.1173"></a>
-<span class="sourceLineNo">1174</span>      NavigableMap&lt;ServerAndLoad, List&lt;RegionInfo&gt;&gt; serversByLoad = cs.getServersByLoad();<a name="line.1174"></a>
-<span class="sourceLineNo">1175</span>      if (LOG.isTraceEnabled()) {<a name="line.1175"></a>
-<span class="sourceLineNo">1176</span>        // If nothing to balance, then don't say anything unless trace-level logging.<a name="line.1176"></a>
-<span class="sourceLineNo">1177</span>        LOG.trace("Skipping load balancing because balanced cluster; " +<a name="line.1177"></a>
-<span class="sourceLineNo">1178</span>          "servers=" + cs.getNumServers() +<a name="line.1178"></a>
-<span class="sourceLineNo">1179</span>          " regions=" + cs.getNumRegions() + " average=" + average +<a name="line.1179"></a>
-<span class="sourceLineNo">1180</span>          " mostloaded=" + serversByLoad.lastKey().getLoad() +<a name="line.1180"></a>
-<span class="sourceLineNo">1181</span>          " leastloaded=" + serversByLoad.firstKey().getLoad());<a name="line.1181"></a>
-<span class="sourceLineNo">1182</span>      }<a name="line.1182"></a>
-<span class="sourceLineNo">1183</span>      return false;<a name="line.1183"></a>
-<span class="sourceLineNo">1184</span>    }<a name="line.1184"></a>
-<span class="sourceLineNo">1185</span>    return true;<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>   * Subclasses should implement this to return true if the cluster has nodes that hosts<a name="line.1189"></a>
-<span class="sourceLineNo">1190</span>   * multiple replicas for the same region, or, if there are multiple racks and the same<a name="line.1190"></a>
-<span class="sourceLineNo">1191</span>   * rack hosts replicas of the same region<a name="line.1191"></a>
-<span class="sourceLineNo">1192</span>   * @param c Cluster information<a name="line.1192"></a>
-<span class="sourceLineNo">1193</span>   * @return whether region replicas are currently co-located<a name="line.1193"></a>
-<span class="sourceLineNo">1194</span>   */<a name="line.1194"></a>
-<span class="sourceLineNo">1195</span>  protected boolean areSomeRegionReplicasColocated(Cluster c) {<a name="line.1195"></a>
-<span class="sourceLineNo">1196</span>    return false;<a name="line.1196"></a>
-<span class="sourceLineNo">1197</span>  }<a name="line.1197"></a>
-<span class="sourceLineNo">1198</span><a name="line.1198"></a>
-<span class="sourceLineNo">1199</span>  /**<a name="line.1199"></a>
-<span class="sourceLineNo">1200</span>   * Generates a bulk assignment plan to be used on cluster startup using a<a name="line.1200"></a>
-<span class="sourceLineNo">1201</span>   * simple round-robin assignment.<a name="line.1201"></a>
-<span class="sourceLineNo">1202</span>   * &lt;p&gt;<a name="line.1202"></a>
-<span class="sourceLineNo">1203</span>   * Takes a list of all the regions and all the servers in the cluster and<a name="line.1203"></a>
-<span class="sourceLineNo">1204</span>   * returns a map of each server to the regions that it should be assigned.<a name="line.1204"></a>
-<span class="sourceLineNo">1205</span>   * &lt;p&gt;<a name="line.1205"></a>
-<span class="sourceLineNo">1206</span>   * Currently implemented as a round-robin assignment. Same invariant as load<a name="line.1206"></a>
-<span class="sourceLineNo">1207</span>   * balancing, all servers holding floor(avg) or ceiling(avg).<a name="line.1207"></a>
-<span class="sourceLineNo">1208</span>   *<a name="line.1208"></a>
-<span class="sourceLineNo">1209</span>   * TODO: Use block locations from HDFS to place regions with their blocks<a name="line.1209"></a>
-<span class="sourceLineNo">1210</span>   *<a name="line.1210"></a>
-<span class="sourceLineNo">1211</span>   * @param regions all regions<a name="line.1211"></a>
-<span class="sourceLineNo">1212</span>   * @param servers all servers<a name="line.1212"></a>
-<span class="sourceLineNo">1213</span>   * @return map of server to the regions it should take, or null if no<a name="line.1213"></a>
-<span class="sourceLineNo">1214</span>   *         assignment is possible (ie. no regions or no servers)<a name="line.1214"></a>
-<span class="sourceLineNo">1215</span>   */<a name="line.1215"></a>
-<span class="sourceLineNo">1216</span>  @Override<a name="line.1216"></a>
-<span class="sourceLineNo">1217</span>  public Map&lt;ServerName, List&lt;RegionInfo&gt;&gt; roundRobinAssignment(List&lt;RegionInfo&gt; regions,<a name="line.1217"></a>
-<span class="sourceLineNo">1218</span>      List&lt;ServerName&gt; servers) throws HBaseIOException {<a name="line.1218"></a>
-<span class="sourceLineNo">1219</span>    metricsBalancer.incrMiscInvocations();<a name="line.1219"></a>
-<span class="sourceLineNo">1220</span>    Map&lt;ServerName, List&lt;RegionInfo&gt;&gt; assignments = assignMasterSystemRegions(regions, servers);<a name="line.1220"></a>
-<span class="sourceLineNo">1221</span>    if (assignments != null &amp;&amp; !assignments.isEmpty()) {<a name="line.1221"></a>
-<span class="sourceLineNo">1222</span>      servers = new ArrayList&lt;&gt;(servers);<a name="line.1222"></a>
-<span class="sourceLineNo">1223</span>      // Guarantee not to put other regions on master<a name="line.1223"></a>
-<span class="sourceLineNo">1224</span>      servers.remove(masterServerName);<a name="line.1224"></a>
-<span class="sourceLineNo">1225</span>      List&lt;RegionInfo&gt; masterRegions = assignments.get(masterServerName);<a name="line.1225"></a>
-<span class="sourceLineNo">1226</span>      if (!masterRegions.isEmpty()) {<a name="line.1226"></a>
-<span class="sourceLineNo">1227</span>        regions = new ArrayList&lt;&gt;(regions);<a name="line.1227"></a>
-<span class="sourceLineNo">1228</span>        regions.removeAll(masterRegions);<a name="line.1228"></a>
-<span class="sourceLineNo">1229</span>      }<a name="line.1229"></a>
-<span class="sourceLineNo">1230</span>    }<a name="line.1230"></a>
-<span class="sourceLineNo">1231</span>    if (regions == null || regions.isEmpty()) {<a name="line.1231"></a>
-<span class="sourceLineNo">1232</span>      return assignments;<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>    int numServers = servers == null ? 0 : servers.size();<a name="line.1235"></a>
-<span class="sourceLineNo">1236</span>    if (numServers == 0) {<a name="line.1236"></a>
-<span class="sourceLineNo">1237</span>      LOG.warn("Wanted to do round robin assignment but no servers to assign to");<a name="line.1237"></a>
-<span class="sourceLineNo">1238</span>      return null;<a name="line.1238"></a>
-<span class="sourceLineNo">1239</span>    }<a name="line.1239"></a>
-<span class="sourceLineNo">1240</span><a name="line.1240"></a>
-<span class="sourceLineNo">1241</span>    // TODO: instead of retainAssignment() and roundRobinAssignment(), we should just run the<a name="line.1241"></a>
-<span class="sourceLineNo">1242</span>    // normal LB.balancerCluster() with unassignedRegions. We only need to have a candidate<a name="line.1242"></a>
-<span class="sourceLineNo">1243</span>    // generator for AssignRegionAction. The LB will ensure the regions are mostly local<a name="line.1243"></a>
-<span class="sourceLineNo">1244</span>    // and balanced. This should also run fast with fewer number of iterations.<a name="line.1244"></a>
-<span class="sourceLineNo">1245</span><a name="line.1245"></a>
-<span class="sourceLineNo">1246</span>    if (numServers == 1) { // Only one server, nothing fancy we can do here<a name="line.1246"></a>
-<span class="sourceLineNo">1247</span>      ServerName server = servers.get(0);<a name="line.1247"></a>
-<span class="sourceLineNo">1248</span>      assignments.put(server, new ArrayList&lt;&gt;(regions));<a name="line.1248"></a>
-<span class="sourceLineNo">1249</span>      return assignments;<a name="line.1249"></a>
-<span class="sourceLineNo">1250</span>    }<a name="line.1250"></a>
-<span class="sourceLineNo">1251</span><a name="line.1251"></a>
-<span class="sourceLineNo">1252</span>    Cluster cluster = createCluster(servers, regions, false);<a name="line.1252"></a>
-<span class="sourceLineNo">1253</span>    List&lt;RegionInfo&gt; unassignedRegions = new ArrayList&lt;&gt;();<a name="line.1253"></a>
-<span class="sourceLineNo">1254</span><a name="line.1254"></a>
-<span class="sourceLineNo">1255</span>    roundRobinAssignment(cluster, regions, unassignedRegions,<a name="line.1255"></a>
-<span class="sourceLineNo">1256</span>      servers, assignments);<a name="line.1256"></a>
-<span class="sourceLineNo">1257</span><a name="line.1257"></a>
-<span class="sourceLineNo">1258</span>    List&lt;RegionInfo&gt; lastFewRegions = new ArrayList&lt;&gt;();<a name="line.1258"></a>
-<span class="sourceLineNo">1259</span>    // assign the remaining by going through the list and try to assign to servers one-by-one<a name="line.1259"></a>
-<span class="sourceLineNo">1260</span>    int serverIdx = RANDOM.nextInt(numServers);<a name="line.1260"></a>
-<span class="sourceLineNo">1261</span>    for (RegionInfo region : unassignedRegions) {<a name="line.1261"></a>
-<span class="sourceLineNo">1262</span>      boolean assigned = false;<a name="line.1262"></a>
-<span class="sourceLineNo">1263</span>      for (int j = 0; j &lt; numServers; j++) { // try all servers one by one<a name="line.1263"></a>
-<span class="sourceLineNo">1264</span>        ServerName serverName = servers.get((j + serverIdx) % numServers);<a name="line.1264"></a>
-<span class="sourceLineNo">1265</span>        if (!cluster.wouldLowerAvailability(region, serverName)) {<a name="line.1265"></a>
-<span class="sourceLineNo">1266</span>          List&lt;RegionInfo&gt; serverRegions =<a name="line.1266"></a>
-<span class="sourceLineNo">1267</span>              assignments.computeIfAbsent(serverName, k -&gt; new ArrayList&lt;&gt;());<a name="line.1267"></a>
-<span class="sourceLineNo">1268</span>          serverRegions.add(region);<a name="line.1268"></a>
-<span class="sourceLineNo">1269</span>          cluster.doAssignRegion(region, serverName);<a name="line.1269"></a>
-<span class="sourceLineNo">1270</span>          serverIdx = (j + serverIdx + 1) % numServers; //remain from next server<a name="line.1270"></a>
-<span class="sourceLineNo">1271</span>          assigned = true;<a name="line.1271"></a>
-<span class="sourceLineNo">1272</span>          break;<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>      if (!assigned) {<a name="line.1275"></a>
-<span class="sourceLineNo">1276</span>        lastFewRegions.add(region);<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>    // just sprinkle the rest of the regions on random regionservers. The balanceCluster will<a name="line.1279"></a>
-<span class="sourceLineNo">1280</span>    // make it optimal later. we can end up with this if numReplicas &gt; numServers.<a name="line.1280"></a>
-<span class="sourceLineNo">1281</span>    for (RegionInfo region : lastFewRegions) {<a name="line.1281"></a>
-<span class="sourceLineNo">1282</span>      int i = RANDOM.nextInt(numServers);<a name="line.1282"></a>
-<span class="sourceLineNo">1283</span>      ServerName server = servers.get(i);<a name="line.1283"></a>
-<span class="sourceLineNo">1284</span>      List&lt;RegionInfo&gt; serverRegions = assignments.computeIfAbsent(server, k -&gt; new ArrayList&lt;&gt;());<a name="line.1284"></a>
-<span class="sourceLineNo">1285</span>      serverRegions.add(region);<a name="line.1285"></a>
-<span class="sourceLineNo">1286</span>      cluster.doAssignRegion(region, server);<a name="line.1286"></a>
-<span class="sourceLineNo">1287</span>    }<a name="line.1287"></a>
-<span class="sourceLineNo">1288</span>    return assignments;<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>  protected Cluster createCluster(List&lt;ServerName&gt; servers,<a name="line.1291"></a>
-<span class="sourceLineNo">1292</span>      Collection&lt;RegionInfo&gt; regions, boolean forceRefresh) {<a name="line.1292"></a>
-<span class="sourceLineNo">1293</span>    if (forceRefresh &amp;&amp; useRegionFinder) {<a name="line.1293"></a>
-<span class="sourceLineNo">1294</span>      regionFinder.refreshAndWait(regions);<a name="line.1294"></a>
-<span class="sourceLineNo">1295</span>    }<a name="line.1295"></a>
-<span class="sourceLineNo">1296</span>    // Get the snapshot of the current assignments for the regions in question, and then create<a name="line.1296"></a>
-<span class="sourceLineNo">1297</span>    // a cluster out of it. Note that we might have replicas already assigned to some servers<a name="line.1297"></a>
-<span class="sourceLineNo">1298</span>    // earlier. So we want to get the snapshot to see those assignments, but this will only contain<a name="line.1298"></a>
-<span class="sourceLineNo">1299</span>    // replicas of the regions that are passed (for performance).<a name="line.1299"></a>
-<span class="sourceLineNo">1300</span>    Map&lt;ServerName, List&lt;RegionInfo&gt;&gt; clusterState = getRegionAssignmentsByServer(regions);<a name="line.1300"></a>
-<span class="sourceLineNo">1301</span><a name="line.1301"></a>
-<span class="sourceLineNo">1302</span>    for (ServerName server : servers) {<a name="line.1302"></a>
-<span class="sourceLineNo">1303</span>      if (!clusterState.containsKey(server)) {<a name="line.1303"></a>
-<span class="sourceLineNo">1304</span>        clusterState.put(server, EMPTY_REGION_LIST);<a name="line.1304"></a>
-<span class="sourceLineNo">1305</span>      }<a name="line.1305"></a>
-<span class="sourceLineNo">1306</span>    }<a name="line.1306"></a>
-<span class="sourceLineNo">1307</span>    return new Cluster(regions, clusterState, null, this.regionFinder,<a name="line.1307"></a>
-<span class="sourceLineNo">1308</span>        rackManager);<a name="line.1308"></a>
-<span class="sourceLineNo">1309</span>  }<a name="line.1309"></a>
+<span class="sourceLineNo">1154</span>  @Override<a name="line.1154"></a>
+<span class="sourceLineNo">1155</span>  public void postMasterStartupInitialize() {<a name="line.1155"></a>
+<span class="sourceLineNo">1156</span>    if (services != null &amp;&amp; regionFinder != null) {<a name="line.1156"></a>
+<span class="sourceLineNo">1157</span>      try {<a name="line.1157"></a>
+<span class="sourceLineNo">1158</span>        Set&lt;RegionInfo&gt; regions =<a name="line.1158"></a>
+<span class="sourceLineNo">1159</span>            services.getAssignmentManager().getRegionStates().getRegionAssignments().keySet();<a name="line.1159"></a>
+<span class="sourceLineNo">1160</span>        regionFinder.refreshAndWait(regions);<a name="line.1160"></a>
+<span class="sourceLineNo">1161</span>      } catch (Exception e) {<a name="line.1161"></a>
+<span class="sourceLineNo">1162</span>        LOG.warn("Refreshing region HDFS Block dist failed with exception, ignoring", e);<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>  }<a name="line.1165"></a>
+<span class="sourceLineNo">1166</span><a name="line.1166"></a>
+<span class="sourceLineNo">1167</span>  public void setRackManager(RackManager rackManager) {<a name="line.1167"></a>
+<span class="sourceLineNo">1168</span>    this.rackManager = rackManager;<a name="line.1168"></a>
+<span class="sourceLineNo">1169</span>  }<a name="line.1169"></a>
+<span class="sourceLineNo">1170</span><a name="line.1170"></a>
+<span class="sourceLineNo">1171</span>  protected boolean needsBalance(Cluster c) {<a name="line.1171"></a>
+<span class="sourceLineNo">1172</span>    ClusterLoadState cs = new ClusterLoadState(c.clusterState);<a name="line.1172"></a>
+<span class="sourceLineNo">1173</span>    if (cs.getNumServers() &lt; MIN_SERVER_BALANCE) {<a name="line.1173"></a>
+<span class="sourceLineNo">1174</span>      if (LOG.isDebugEnabled()) {<a name="line.1174"></a>
+<span class="sourceLineNo">1175</span>        LOG.debug("Not running balancer because only " + cs.getNumServers()<a name="line.1175"></a>
+<span class="sourceLineNo">1176</span>            + " active regionserver(s)");<a name="line.1176"></a>
+<span class="sourceLineNo">1177</span>      }<a name="line.1177"></a>
+<span class="sourceLineNo">1178</span>      return false;<a name="line.1178"></a>
+<span class="sourceLineNo">1179</span>    }<a name="line.1179"></a>
+<span class="sourceLineNo">1180</span>    if(areSomeRegionReplicasColocated(c)) return true;<a name="line.1180"></a>
+<span class="sourceLineNo">1181</span>    // Check if we even need to do any load balancing<a name="line.1181"></a>
+<span class="sourceLineNo">1182</span>    // HBASE-3681 check sloppiness first<a name="line.1182"></a>
+<span class="sourceLineNo">1183</span>    float average = cs.getLoadAverage(); // for logging<a name="line.1183"></a>
+<span class="sourceLineNo">1184</span>    int floor = (int) Math.floor(average * (1 - slop));<a name="line.1184"></a>
+<span class="sourceLineNo">1185</span>    int ceiling = (int) Math.ceil(average * (1 + slop));<a name="line.1185"></a>
+<span class="sourceLineNo">1186</span>    if (!(cs.getMaxLoad() &gt; ceiling || cs.getMinLoad() &lt; floor)) {<a name="line.1186"></a>
+<span class="sourceLineNo">1187</span>      NavigableMap&lt;ServerAndLoad, List&lt;RegionInfo&gt;&gt; serversByLoad = cs.getServersByLoad();<a name="line.1187"></a>
+<span class="sourceLineNo">1188</span>      if (LOG.isTraceEnabled()) {<a name="line.1188"></a>
+<span class="sourceLineNo">1189</span>        // If nothing to balance, then don't say anything unless trace-level logging.<a name="line.1189"></a>
+<span class="sourceLineNo">1190</span>        LOG.trace("Skipping load balancing because balanced cluster; " +<a name="line.1190"></a>
+<span class="sourceLineNo">1191</span>          "servers=" + cs.getNumServers() +<a name="line.1191"></a>
+<span class="sourceLineNo">1192</span>          " regions=" + cs.getNumRegions() + " average=" + average +<a name="line.1192"></a>
+<span class="sourceLineNo">1193</span>          " mostloaded=" + serversByLoad.lastKey().getLoad() +<a name="line.1193"></a>
+<span class="sourceLineNo">1194</span>          " leastloaded=" + serversByLoad.firstKey().getLoad());<a name="line.1194"></a>
+<span class="sourceLineNo">1195</span>      }<a name="line.1195"></a>
+<span class="sourceLineNo">1196</span>      return false;<a name="line.1196"></a>
+<span class="sourceLineNo">1197</span>    }<a name="line.1197"></a>
+<span class="sourceLineNo">1198</span>    return true;<a name="line.1198"></a>
+<span class="sourceLineNo">1199</span>  }<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>   * Subclasses should implement this to return true if the cluster has nodes that hosts<a name="line.1202"></a>
+<span class="sourceLineNo">1203</span>   * multiple replicas for the same region, or, if there are multiple racks and the same<a name="line.1203"></a>
+<span class="sourceLineNo">1204</span>   * rack hosts replicas of the same region<a name="line.1204"></a>
+<span class="sourceLineNo">1205</span>   * @param c Cluster information<a name="line.1205"></a>
+<span class="sourceLineNo">1206</span>   * @return whether region replicas are currently co-located<a name="line.1206"></a>
+<span class="sourceLineNo">1207</span>   */<a name="line.1207"></a>
+<span class="sourceLineNo">1208</span>  protected boolean areSomeRegionReplicasColocated(Cluster c) {<a name="line.1208"></a>
+<span class="sourceLineNo">1209</span>    return false;<a name="line.1209"></a>
+<span class="sourceLineNo">1210</span>  }<a name="line.1210"></a>
+<span class="sourceLineNo">1211</span><a name="line.1211"></a>
+<span class="sourceLineNo">1212</span>  /**<a name="line.1212"></a>
+<span class="sourceLineNo">1213</span>   * Generates a bulk assignment plan to be used on cluster startup using a<a name="line.1213"></a>
+<span class="sourceLineNo">1214</span>   * simple round-robin assignment.<a name="line.1214"></a>
+<span class="sourceLineNo">1215</span>   * &lt;p&gt;<a name="line.1215"></a>
+<span class="sourceLineNo">1216</span>   * Takes a list of all the regions and all the servers in the cluster and<a name="line.1216"></a>
+<span class="sourceLineNo">1217</span>   * returns a map of each server to the regions that it should be assigned.<a name="line.1217"></a>
+<span class="sourceLineNo">1218</span>   * &lt;p&gt;<a name="line.1218"></a>
+<span class="sourceLineNo">1219</span>   * Currently implemented as a round-robin assignment. Same invariant as load<a name="line.1219"></a>
+<span class="sourceLineNo">1220</span>   * balancing, all servers holding floor(avg) or ceiling(avg).<a name="line.1220"></a>
+<span class="sourceLineNo">1221</span>   *<a name="line.1221"></a>
+<span class="sourceLineNo">1222</span>   * TODO: Use block locations from HDFS to place regions with their blocks<a name="line.1222"></a>
+<span class="sourceLineNo">1223</span>   *<a name="line.1223"></a>
+<span class="sourceLineNo">1224</span>   * @param regions all regions<a name="line.1224"></a>
+<span class="sourceLineNo">1225</span>   * @param servers all servers<a name="line.1225"></a>
+<span class="sourceLineNo">1226</span>   * @return map of server to the regions it should take, or null if no<a name="line.1226"></a>
+<span class="sourceLineNo">1227</span>   *         assignment is possible (ie. no regions or no servers)<a name="line.1227"></a>
+<span class="sourceLineNo">1228</span>   */<a name="line.1228"></a>
+<span class="sourceLineNo">1229</span>  @Override<a name="line.1229"></a>
+<span class="sourceLineNo">1230</span>  public Map&lt;ServerName, List&lt;RegionInfo&gt;&gt; roundRobinAssignment(List&lt;RegionInfo&gt; regions,<a name="line.1230"></a>
+<span class="sourceLineNo">1231</span>      List&lt;ServerName&gt; servers) throws HBaseIOException {<a name="line.1231"></a>
+<span class="sourceLineNo">1232</span>    metricsBalancer.incrMiscInvocations();<a name="line.1232"></a>
+<span class="sourceLineNo">1233</span>    Map&lt;ServerName, List&lt;RegionInfo&gt;&gt; assignments = assignMasterSystemRegions(regions, servers);<a name="line.1233"></a>
+<span class="sourceLineNo">1234</span>    if (assignments != null &amp;&amp; !assignments.isEmpty()) {<a name="line.1234"></a>
+<span class="sourceLineNo">1235</span>      servers = new ArrayList&lt;&gt;(servers);<a name="line.1235"></a>
+<span class="sourceLineNo">1236</span>      // Guarantee not to put other regions on master<a name="line.1236"></a>
+<span class="sourceLineNo">1237</span>      servers.remove(masterServerName);<a name="line.1237"></a>
+<span class="sourceLineNo">1238</span>      List&lt;RegionInfo&gt; masterRegions = assignments.get(masterServerName);<a name="line.1238"></a>
+<span class="sourceLineNo">1239</span>      if (!masterRegions.isEmpty()) {<a name="line.1239"></a>
+<span class="sourceLineNo">1240</span>        regions = new ArrayList&lt;&gt;(regions);<a name="line.1240"></a>
+<span class="sourceLineNo">1241</span>        regions.removeAll(masterRegions);<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>    if (regions == null || regions.isEmpty()) {<a name="line.1244"></a>
+<span class="sourceLineNo">1245</span>      return assignments;<a name="line.1245"></a>
+<span class="sourceLineNo">1246</span>    }<a name="line.1246"></a>
+<span class="sourceLineNo">1247</span><a name="line.1247"></a>
+<span class="sourceLineNo">1248</span>    int numServers = servers == null ? 0 : servers.size();<a name="line.1248"></a>
+<span class="sourceLineNo">1249</span>    if (numServers == 0) {<a name="line.1249"></a>
+<span class="sourceLineNo">1250</span>      LOG.warn("Wanted to do round robin assignment but no servers to assign to");<a name="line.1250"></a>
+<span class="sourceLineNo">1251</span>      return null;<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>    // TODO: instead of retainAssignment() and roundRobinAssignment(), we should just run the<a name="line.1254"></a>
+<span class="sourceLineNo">1255</span>    // normal LB.balancerCluster() with unassignedRegions. We only need to have a candidate<a name="line.1255"></a>
+<span class="sourceLineNo">1256</span>    // generator for AssignRegionAction. The LB will ensure the regions are mostly local<a name="line.1256"></a>
+<span class="sourceLineNo">1257</span>    // and balanced. This should also run fast with fewer number of iterations.<a name="line.1257"></a>
+<span class="sourceLineNo">1258</span><a name="line.1258"></a>
+<span class="sourceLineNo">1259</span>    if (numServers == 1) { // Only one server, nothing fancy we can do here<a name="line.1259"></a>
+<span class="sourceLineNo">1260</span>      ServerName server = servers.get(0);<a name="line.1260"></a>
+<span class="sourceLineNo">1261</span>      assignments.put(server, new ArrayList&lt;&gt;(regions));<a name="line.1261"></a>
+<span class="sourceLineNo">1262</span>      return assignments;<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>    Cluster cluster = createCluster(servers, regions);<a name="line.1265"></a>
+<span class="sourceLineNo">1266</span>    List&lt;RegionInfo&gt; unassignedRegions = new ArrayList&lt;&gt;();<a name="line.1266"></a>
+<span class="sourceLineNo">1267</span><a name="line.1267"></a>
+<span class="sourceLineNo">1268</span>    roundRobinAssignment(cluster, regions, unassignedRegions,<a name="line.1268"></a>
+<span class="sourceLineNo">1269</span>      servers, assignments);<a name="line.1269"></a>
+<span class="sourceLineNo">1270</span><a name="line.1270"></a>
+<span class="sourceLineNo">1271</span>    List&lt;RegionInfo&gt; lastFewRegions = new ArrayList&lt;&gt;();<a name="line.1271"></a>
+<span class="sourceLineNo">1272</span>    // assign the remaining by going through the list and try to assign to servers one-by-one<a name="line.1272"></a>
+<span class="sourceLineNo">1273</span>    int serverIdx = RANDOM.nextInt(numServers);<a name="line.1273"></a>
+<span class="sourceLineNo">1274</span>    for (RegionInfo region : unassignedRegions) {<a name="line.1274"></a>
+<span class="sourceLineNo">1275</span>      boolean assigned = false;<a name="line.1275"></a>
+<span class="sourceLineNo">1276</span>      for (int j = 0; j &lt; numServers; j++) { // try all servers one by one<a name="line.1276"></a>
+<span class="sourceLineNo">1277</span>        ServerName serverName = servers.get((j + serverIdx) % numServers);<a name="line.1277"></a>
+<span class="sourceLineNo">1278</span>        if (!cluster.wouldLowerAvailability(region, serverName)) {<a name="line.1278"></a>
+<span class="sourceLineNo">1279</span>          List&lt;RegionInfo&gt; serverRegions =<a name="line.1279"></a>
+<span class="sourceLineNo">1280</span>              assignments.computeIfAbsent(serverName, k -&gt; new ArrayList&lt;&gt;());<a name="line.1280"></a>
+<span class="sourceLineNo">1281</span>          serverRegions.add(region);<a name="line.1281"></a>
+<span class="sourceLineNo">1282</span>          cluster.doAssignRegion(region, serverName);<a name="line.1282"></a>
+<span class="sourceLineNo">1283</span>          serverIdx = (j + serverIdx + 1) % numServers; //remain from next server<a name="line.1283"></a>
+<span class="sourceLineNo">1284</span>          assigned = true;<a name="line.1284"></a>
+<span class="sourceLineNo">1285</span>          break;<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>      if (!assigned) {<a name="line.1288"></a>
+<span class="sourceLineNo">1289</span>        lastFewRegions.add(region);<a name="line.1289"></a>
+<span class="sourceLineNo">1290</span>      }<a name="line.1290"></a>
+<span class="sourceLineNo">1291</span>    }<a name="line.1291"></a>
+<span class="sourceLineNo">1292</span>    // just sprinkle the rest of the regions on random regionservers. The balanceCluster will<a name="line.1292"></a>
+<span class="sourceLineNo">1293</span>    // make it optimal later. we can end up with this if numReplicas &gt; numServers.<a name="line.1293"></a>
+<span class="sourceLineNo">1294</span>    for (RegionInfo region : lastFewRegions) {<a name="line.1294"></a>
+<span class="sourceLineNo">1295</span>      int i = RANDOM.nextInt(numServers);<a name="line.1295"></a>
+<span class="sourceLineNo">1296</span>      ServerName server = servers.get(i);<a name="line.1296"></a>
+<span class="sourceLineNo">1297</span>      List&lt;RegionInfo&gt; serverRegions = assignments.computeIfAbsent(server, k -&gt; new ArrayList&lt;&gt;());<a name="line.1297"></a>
+<span class="sourceLineNo">1298</span>      serverRegions.add(region);<a name="line.1298"></a>
+<span class="sourceLineNo">1299</span>      cluster.doAssignRegion(region, server);<a name="line.1299"></a>
+<span class="sourceLineNo">1300</span>    }<a name="line.1300"></a>
+<span class="sourceLineNo">1301</span>    return assignments;<a name="line.1301"></a>
+<span class="sourceLineNo">1302</span>  }<a name="line.1302"></a>
+<span class="sourceLineNo">1303</span><a name="line.1303"></a>
+<span class="sourceLineNo">1304</span>  protected Cluster createCluster(List&lt;ServerName&gt; servers, Collection&lt;RegionInfo&gt; regions) {<a name="line.1304"></a>
+<span class="sourceLineNo">1305</span>    // Get the snapshot of the current assignments for the regions in question, and then create<a name="line.1305"></a>
+<span class="sourceLineNo">1306</span>    // a cluster out of it. Note that we might have replicas already assigned to some servers<a name="line.1306"></a>
+<span class="sourceLineNo">1307</span>    // earlier. So we want to get the snapshot to see those assignments, but this will only contain<a name="line.1307"></a>
+<span class="sourceLineNo">1308</span>    // replicas of the regions that are passed (for performance).<a name="line.1308"></a>
+<span class="sourceLineNo">1309</span>    Map&lt;ServerName, List&lt;RegionInfo&gt;&gt; clusterState = getRegionAssignmentsByServer(regions);<a name="line.1309"></a>
 <span class="sourceLineNo">1310</span><a name="line.1310"></a>
-<span class="sourceLineNo">1311</span>  private List&lt;ServerName&gt; findIdleServers(List&lt;ServerName&gt; servers) {<a name="line.1311"></a>
-<span class="sourceLineNo">1312</span>    return this.services.getServerManager()<a name="line.1312"></a>
-<span class="sourceLineNo">1313</span>            .getOnlineServersListWithPredicator(servers, IDLE_SERVER_PREDICATOR);<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>  /**<a name="line.1316"></a>
-<span class="sourceLineNo">1317</span>   * Used to assign a single region to a random server.<a name="line.1317"></a>
-<span class="sourceLineNo">1318</span>   */<a name="line.1318"></a>
-<span class="sourceLineNo">1319</span>  @Override<a name="line.1319"></a>
-<span class="sourceLineNo">1320</span>  public ServerName randomAssignment(RegionInfo regionInfo, List&lt;ServerName&gt; servers)<a name="line.1320"></a>
-<span class="sourceLineNo">1321</span>      throws HBaseIOException {<a name="line.1321"></a>
-<span class="sourceLineNo">1322</span>    metricsBalancer.incrMiscInvocations();<a name="line.1322"></a>
-<span class="sourceLineNo">1323</span>    if (servers != null &amp;&amp; servers.contains(masterServerName)) {<a name="line.1323"></a>
-<span class="sourceLineNo">1324</span>      if (shouldBeOnMaster(regionInfo)) {<a name="line.1324"></a>
-<span class="sourceLineNo">1325</span>        return masterServerName;<a name="line.1325"></a>
-<span class="sourceLineNo">1326</span>      }<a name="line.1326"></a>
-<span class="sourceLineNo">1327</span>      if (!LoadBalancer.isTablesOnMaster(getConf())) {<a name="line.1327"></a>
-<span class="sourceLineNo">1328</span>        // Guarantee we do not put any regions on master<a name="line.1328"></a>
-<span class="sourceLineNo">1329</span>        servers = new ArrayList&lt;&gt;(servers);<a name="line.1329"></a>
-<span class="sourceLineNo">1330</span>        servers.remove(masterServerName);<a name="line.1330"></a>
-<span class="sourceLineNo">1331</span>      }<a name="line.1331"></a>
-<span class="sourceLineNo">1332</span>    }<a name="line.1332"></a>
-<span class="sourceLineNo">1333</span><a name="line.1333"></a>
-<span class="sourceLineNo">1334</span>    int numServers = servers == null ? 0 : servers.size();<a name="line.1334"></a>
-<span class="sourceLineNo">1335</span>    if (numServers == 0) {<a name="line.1335"></a>
-<span class="sourceLineNo">1336</span>      LOG.warn("Wanted to retain assignment but no servers to assign to");<a name="line.1336"></a>
-<span class="sourceLineNo">1337</span>      return null;<a name="line.1337"></a>
-<span class="sourceLineNo">1338</span>    }<a name="line.1338"></a>
-<span class="sourceLineNo">1339</span>    if (numServers == 1) { // Only one server, nothing fancy we can do here<a name="line.1339"></a>
-<span class="sourceLineNo">1340</span>      return servers.get(0);<a name="line.1340"></a>
+<span class="sourceLineNo">1311</span>    for (ServerName server : servers) {<a name="line.1311"></a>
+<span class="sourceLineNo">1312</span>      if (!clusterState.containsKey(server)) {<a name="line.1312"></a>
+<span class="sourceLineNo">1313</span>        clusterState.put(server, EMPTY_REGION_LIST);<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>    return new Cluster(regions, clusterState, null, this.regionFinder,<a name="line.1316"></a>
+<span class="sourceLineNo">1317</span>        rackManager);<a name="line.1317"></a>
+<span class="sourceLineNo">1318</span>  }<a name="line.1318"></a>
+<span class="sourceLineNo">1319</span><a name="line.1319"></a>
+<span class="sourceLineNo">1320</span>  private List&lt;ServerName&gt; findIdleServers(List&lt;ServerName&gt; servers) {<a name="line.1320"></a>
+<span class="sourceLineNo">1321</span>    return this.services.getServerManager()<a name="line.1321"></a>
+<span class="sourceLineNo">1322</span>            .getOnlineServersListWithPredicator(servers, IDLE_SERVER_PREDICATOR);<a name="line.1322"></a>
+<span class="sourceLineNo">1323</span>  }<a name="line.1323"></a>
+<span class="sourceLineNo">1324</span><a name="line.1324"></a>
+<span class="sourceLineNo">1325</span>  /**<a name="line.1325"></a>
+<span class="sourceLineNo">1326</span>   * Used to assign a single region to a random server.<a name="line.1326"></a>
+<span class="sourceLineNo">1327</span>   */<a name="line.1327"></a>
+<span class="sourceLineNo">1328</span>  @Override<a name="line.1328"></a>
+<span class="sourceLineNo">1329</span>  public ServerName randomAssignment(RegionInfo regionInfo, List&lt;ServerName&gt; servers)<a name="line.1329"></a>
+<span class="sourceLineNo">1330</span>      throws HBaseIOException {<a name="line.1330"></a>
+<span class="sourceLineNo">1331</span>    metricsBalancer.incrMiscInvocations();<a name="line.1331"></a>
+<span class="sourceLineNo">1332</span>    if (servers != null &amp;&amp; servers.contains(masterServerName)) {<a name="line.1332"></a>
+<span class="sourceLineNo">1333</span>      if (shouldBeOnMaster(regionInfo)) {<a name="line.1333"></a>
+<span class="sourceLineNo">1334</span>        return masterServerName;<a name="line.1334"></a>
+<span class="sourceLineNo">1335</span>      }<a name="line.1335"></a>
+<span class="sourceLineNo">1336</span>      if (!LoadBalancer.isTablesOnMaster(getConf())) {<a name="line.1336"></a>
+<span class="sourceLineNo">1337</span>        // Guarantee we do not put any regions on master<a name="line.1337"></a>
+<span class="sourceLineNo">1338</span>        servers = new ArrayList&lt;&gt;(servers);<a name="line.1338"></a>
+<span class="sourceLineNo">1339</span>        servers.remove(masterServerName);<a name="line.1339"></a>
+<span class="sourceLineNo">1340</span>      }<a name="line.1340"></a>
 <span class="sourceLineNo">1341</span>    }<a name="line.1341"></a>
-<span class="sourceLineNo">1342</span>    List&lt;ServerName&gt; idleServers = findIdleServers(servers);<a name="line.1342"></a>
-<span class="sourceLineNo">1343</span>    if (idleServers.size() == 1) {<a name="line.1343"></a>
-<span class="sourceLineNo">1344</span>      return idleServers.get(0);<a name="line.1344"></a>
-<span class="sourceLineNo">1345</span>    }<a name="line.1345"></a>
-<span class="sourceLineNo">1346</span>    final List&lt;ServerName&gt; finalServers = idleServers.isEmpty() ?<a name="line.1346"></a>
-<span class="sourceLineNo">1347</span>            servers : idleServers;<a name="line.1347"></a>
-<span class="sourceLineNo">1348</span>    List&lt;RegionInfo&gt; regions = Lists.newArrayList(regionInfo);<a name="line.1348"></a>
-<span class="sourceLineNo">1349</span>    Cluster cluster = createCluster(finalServers, regions, false);<a name="line.1349"></a>
-<span class="sourceLineNo">1350</span>    return randomAssignment(cluster, regionInfo, finalServers);<a name="line.1350"></a>
-<span class="sourceLineNo">1351</span>  }<a name="line.1351"></a>
-<span class="sourceLineNo">1352</span><a name="line.1352"></a>
-<span class="sourceLineNo">1353</span>  /**<a name="line.1353"></a>
-<span class="sourceLineNo">1354</span>   * Generates a bulk assignment startup plan, attempting to reuse the existing<a name="line.1354"></a>
-<span class="sourceLineNo">1355</span>   * assignment information from META, but adjusting for the specified list of<a name="line.1355"></a>
-<span class="sourceLineNo">1356</span>   * available/online servers available for assignment.<a name="line.1356"></a>
-<span class="sourceLineNo">1357</span>   * &lt;p&gt;<a name="line.1357"></a>
-<span class="sourceLineNo">1358</span>   * Takes a map of all regions to their existing assignment from META. Also<a name="line.1358"></a>
-<span class="sourceLineNo">1359</span>   * takes a list of online servers for regions to be assigned to. Attempts to<a name="line.1359"></a>
-<span class="sourceLineNo">1360</span>   * retain all assignment, so in some instances initial assignment will not be<a name="line.1360"></a>
-<span class="sourceLineNo">1361</span>   * completely balanced.<a name="line.1361"></a>
-<span class="sourceLineNo">1362</span>   * &lt;p&gt;<a name="line.1362"></a>
-<span class="sourceLineNo">1363</span>   * Any leftover regions without an existing server to be assigned to will be<a name="line.1363"></a>
-<span class="sourceLineNo">1364</span>   * assigned randomly to available servers.<a name="line.1364"></a>
-<span class="sourceLineNo">1365</span>   *<a name="line.1365"></a>
-<span class="sourceLineNo">1366</span>   * @param regions regions and existing assignment from meta<a name="line.1366"></a>
-<span class="sourceLineNo">1367</span>   * @param servers available servers<a name="line.1367"></a>
-<span class="sourceLineNo">1368</span>   * @return map of servers and regions to be assigned to them<a name="line.1368"></a>
-<span class="sourceLineNo">1369</span>   */<a name="line.1369"></a>
-<span class="sourceLineNo">1370</span>  @Override<a name="line.1370"></a>
-<span class="sourceLineNo">1371</span>  public Map&lt;ServerName, List&lt;RegionInfo&gt;&gt; retainAssignment(Map&lt;RegionInfo, ServerName&gt; regions,<a name="line.1371"></a>
-<span class="sourceLineNo">1372</span>      List&lt;ServerName&gt; servers) throws HBaseIOException {<a name="line.1372"></a>
-<span class="sourceLineNo">1373</span>    // Update metrics<a name="line.1373"></a>
-<span class="sourceLineNo">1374</span>    metricsBalancer.incrMiscInvocations();<a name="line.1374"></a>
-<span class="sourceLineNo">1375</span>    Map&lt;ServerName, List&lt;RegionInfo&gt;&gt; assignments = assignMasterSystemRegions(regions.keySet(), servers);<a name="line.1375"></a>
-<span class="sourceLineNo">1376</span>    if (assignments != null &amp;&amp; !assignments.isEmpty()) {<a name="line.1376"></a>
-<span class="sourceLineNo">1377</span>      servers = new ArrayList&lt;&gt;(servers);<a name="line.1377"></a>
-<span class="sourceLineNo">1378</span>      // Guarantee not to put other regions on master<a name="line.1378"></a>
-<span class="sourceLineNo">1379</span>      servers.remove(masterServerName);<a name="line.1379"></a>
-<span class="sourceLineNo">1380</span>      List&lt;RegionInfo&gt; masterRegions = assignments.get(masterServerName);<a name="line.1380"></a>
-<span class="sourceLineNo">1381</span>      regions = regions.entrySet().stream().filter(e -&gt; !masterRegions.contains(e.getKey()))<a name="line.1381"></a>
-<span class="sourceLineNo">1382</span>          .collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue));<a name="line.1382"></a>
-<span class="sourceLineNo">1383</span>    }<a name="line.1383"></a>
-<span class="sourceLineNo">1384</span>    if (regions.isEmpty()) {<a name="line.1384"></a>
-<span class="sourceLineNo">1385</span>      return assignments;<a name="line.1385"></a>
-<span class="sourceLineNo">1386</span>    }<a name="line.1386"></a>
-<span class="sourceLineNo">1387</span><a name="line.1387"></a>
-<span class="sourceLineNo">1388</span>    int numServers = servers == null ? 0 : servers.size();<a name="line.1388"></a>
-<span class="sourceLineNo">1389</span>    if (numServers == 0) {<a name="line.1389"></a>
-<span class="sourceLineNo">1390</span>      LOG.warn("Wanted to do retain assignment but no servers to assign to");<a name="line.1390"></a>
-<span class="sourceLineNo">1391</span>      return null;<a name="line.1391"></a>
+<span class="sourceLineNo">1342</span><a name="line.1342"></a>
+<span class="sourceLineNo">1343</span>    int numServers = servers == null ? 0 : servers.size();<a name="line.1343"></a>
+<span class="sourceLineNo">1344</span>    if (numServers == 0) {<a name="line.1344"></a>
+<span class="sourceLineNo">1345</span>      LOG.warn("Wanted to retain assignment but no servers to assign to");<a name="line.1345"></a>
+<span class="sourceLineNo">1346</span>      return null;<a name="line.1346"></a>
+<span class="sourceLineNo">1347</span>    }<a name="line.1347"></a>
+<span class="sourceLineNo">1348</span>    if (numServers == 1) { // Only one server, nothing fancy we can do here<a name="line.1348"></a>
+<span class="sourceLineNo">1349</span>      return servers.get(0);<a name="line.1349"></a>
+<span class="sourceLineNo">1350</span>    }<a name="line.1350"></a>
+<span class="sourceLineNo">1351</span>    List&lt;ServerName&gt; idleServers = findIdleServers(servers);<a name="line.1351"></a>
+<span class="sourceLineNo">1352</span>    if (idleServers.size() == 1) {<a name="line.1352"></a>
+<span class="sourceLineNo">1353</span>      return idleServers.get(0);<a name="line.1353"></a>
+<span class="sourceLineNo">1354</span>    }<a name="line.1354"></a>
+<span class="sourceLineNo">1355</span>    final List&lt;ServerName&gt; finalServers = idleServers.isEmpty() ?<a name="line.1355"></a>
+<span class="sourceLineNo">1356</span>            servers : idleServers;<a name="line.1356"></a>
+<span class="sourceLineNo">1357</span>    List&lt;RegionInfo&gt; regions = Lists.newArrayList(regionInfo);<a name="line.1357"></a>
+<span class="sourceLineNo">1358</span>    Cluster cluster = createCluster(finalServers, regions);<a name="line.1358"></a>
+<span class="sourceLineNo">1359</span>    return randomAssignment(cluster, regionInfo, finalServers);<a name="line.1359"></a>
+<span class="sourceLineNo">1360</span>  }<a name="line.1360"></a>
+<span class="sourceLineNo">1361</span><a name="line.1361"></a>
+<span class="sourceLineNo">1362</span>  /**<a name="line.1362"></a>
+<span class="sourceLineNo">1363</span>   * Generates a bulk assignment startup plan, attempting to reuse the existing<a name="line.1363"></a>
+<span class="sourceLineNo">1364</span>   * assignment information from META, but adjusting for the specified list of<a name="line.1364"></a>
+<span class="sourceLineNo">1365</span>   * available/online servers available for assignment.<a name="line.1365"></a>
+<span class="sourceLineNo">1366</span>   * &lt;p&gt;<a name="line.1366"></a>
+<span class="sourceLineNo">1367</span>   * Takes a map of all regions to their existing assignment from META. Also<a name="line.1367"></a>
+<span class="sourceLineNo">1368</span>   * takes a list of online servers for regions to be assigned to. Attempts to<a name="line.1368"></a>
+<span class="sourceLineNo">1369</span>   * retain all assignment, so in some instances initial assignment will not be<a name="line.1369"></a>
+<span class="sourceLineNo">1370</span>   * completely balanced.<a name="line.1370"></a>
+<span class="sourceLineNo">1371</span>   * &lt;p&gt;<a name="line.1371"></a>
+<span class="sourceLineNo">1372</span>   * Any leftover regions without an existing server to be assigned to will be<a name="line.1372"></a>
+<span class="sourceLineNo">1373</span>   * assigned randomly to available servers.<a name="line.1373"></a>
+<span class="sourceLineNo">1374</span>   *<a name="line.1374"></a>
+<span class="sourceLineNo">1375</span>   * @param regions regions and existing assignment from meta<a name="line.1375"></a>
+<span class="sourceLineNo">1376</span>   * @param servers available servers<a name="line.1376"></a>
+<span class="sourceLineNo">1377</span>   * @return map of servers and regions to be assigned to them<a name="line.1377"></a>
+<span class="sourceLineNo">1378</span>   */<a name="line.1378"></a>
+<span class="sourceLineNo">1379</span>  @Override<a name="line.1379"></a>
+<span class="sourceLineNo">1380</span>  public Map&lt;ServerName, List&lt;RegionInfo&gt;&gt; retainAssignment(Map&lt;RegionInfo, ServerName&gt; regions,<a name="line.1380"></a>
+<span class="sourceLineNo">1381</span>      List&lt;ServerName&gt; servers) throws HBaseIOException {<a name="line.1381"></a>
+<span class="sourceLineNo">1382</span>    // Update metrics<a name="line.1382"></a>
+<span class="sourceLineNo">1383</span>    metricsBalancer.incrMiscInvocations();<a name="line.1383"></a>
+<span class="sourceLineNo">1384</span>    Map&lt;ServerName, List&lt;RegionInfo&gt;&gt; assignments = assignMasterSystemRegions(regions.keySet(), servers);<a name="line.1384"></a>
+<span class="sourceLineNo">1385</span>    if (assignments != null &amp;&amp; !assignments.isEmpty()) {<a name="line.1385"></a>
+<span class="sourceLineNo">1386</span>      servers = new ArrayList&lt;&gt;(servers);<a name="line.1386"></a>
+<span class="sourceLineNo">1387</span>      // Guarantee not to put other regions on master<a name="line.1387"></a>
+<span class="sourceLineNo">1388</span>      servers.remove(masterServerName);<a name="line.1388"></a>
+<span class="sourceLineNo">1389</span>      List&lt;RegionInfo&gt; masterRegions = assignments.get(masterServerName);<a name="line.1389"></a>
+<span class="sourceLineNo">1390</span>      regions = regions.entrySet().stream().filter(e -&gt; !masterRegions.contains(e.getKey()))<a name="line.1390"></a>
+<span class="sourceLineNo">1391</span>          .collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue));<a name="line.1391"></a>
 <span class="sourceLineNo">1392</span>    }<a name="line.1392"></a>
-<span class="sourceLineNo">1393</span>    if (numServers == 1) { // Only one server, nothing fancy we can do here<a name="line.1393"></a>
-<span class="sourceLineNo">1394</span>      ServerName server = servers.get(0);<a name="line.1394"></a>
-<span class="sourceLineNo">1395</span>      assignments.put(server, new ArrayList&lt;&gt;(regions.keySet()));<a name="line.1395"></a>
-<span class="sourceLineNo">1396</span>      return assignments;<a name="line.1396"></a>
-<span class="sourceLineNo">1397</span>    }<a name="line.1397"></a>
-<span class="sourceLineNo">1398</span><a name="line.1398"></a>
-<span class="sourceLineNo">1399</span>    // Group all of the old assignments by their hostname.<a name="line.1399"></a>
-<span class="sourceLineNo">1400</span>    // We can't group directly by ServerName since the servers all have<a name="line.1400"></a>
-<span class="sourceLineNo">1401</span>    // new start-codes.<a name="line.1401"></a>
-<span class="sourceLineNo">1402</span><a name="line.1402"></a>
-<span class="sourceLineNo">1403</span>    // Group the servers by their hostname. It's possible we have multiple<a name="line.1403"></a>
-<span class="sourceLineNo">1404</span>    // servers on the same host on different ports.<a name="line.1404"></a>
-<span class="sourceLineNo">1405</span>    ArrayListMultimap&lt;String, ServerName&gt; serversByHostname = ArrayListMultimap.create();<a name="line.1405"></a>
-<span class="sourceLineNo">1406</span>    for (ServerName server : servers) {<a name="line.1406"></a>
-<span class="sourceLineNo">1407</span>      assignments.put(server, new ArrayList&lt;&gt;());<a name="line.1407"></a>
-<span class="sourceLineNo">1408</span>      serversByHostname.put(server.getHostnameLowerCase(), server);<a name="line.1408"></a>
-<span class="sourceLineNo">1409</span>    }<a name="line.1409"></a>
-<span class="sourceLineNo">1410</span><a name="line.1410"></a>
-<span class="sourceLineNo">1411</span>    // Collection of the hostnames that used to have regions<a name="line.1411"></a>
-<span class="sourceLineNo">1412</span>    // assigned, but for which we no longer have any RS running<a name="line.1412"></a>
-<span class="sourceLineNo">1413</span>    // after the cluster restart.<a name="line.1413"></a>
-<span class="sourceLineNo">1414</span>    Set&lt;String&gt; oldHostsNoLongerPresent = Sets.newTreeSet();<a name="line.1414"></a>
-<span class="sourceLineNo">1415</span><a name="line.1415"></a>
-<span class="sourceLineNo">1416</span>    // If the old servers aren't present, lets assign those regions later.<a name="line.1416"></a>
-<span class="sourceLineNo">1417</span>    List&lt;RegionInfo&gt; randomAssignRegions = Lists.newArrayList();<a name="line.1417"></a>
-<span class="sourceLineNo">1418</span><a name="line.1418"></a>
-<span class="sourceLineNo">1419</span>    int numRandomAssignments = 0;<a name="line.1419"></a>
-<span class="sourceLineNo">1420</span>    int numRetainedAssigments = 0;<a name="line.1420"></a>
-<span class="sourceLineNo">1421</span><a name="line.1421"></a>
-<span class="sourceLineNo">1422</span>    Cluster cluster = createCluster(servers, regions.keySet(), true);<a name="line.1422"></a>
-<span class="sourceLineNo">1423</span><a name="line.1423"></a>
-<span class="sourceLineNo">1424</span>    for (Map.Entry&lt;RegionInfo, ServerName&gt; entry : regions.entrySet()) {<a name="line.1424"></a>
-<span class="sourceLineNo">1425</span>      RegionInfo region = entry.getKey();<a name="line.1425"></a>
-<span class="sourceLineNo">1426</span>      ServerName oldServerName = entry.getValue();<a name="line.1426"></a>
-<span class="sourceLineNo">1427</span>      List&lt;ServerName&gt; localServers = new ArrayList&lt;&gt;();<a name="line.1427"></a>
-<span class="sourceLineNo">1428</span>      if (oldServerName != null) {<a name="line.1428"></a>
-<span class="sourceLineNo">1429</span>        localServers = serversByHostname.get(oldServerName.getHostnameLowerCase());<a name="line.1429"></a>
-<span class="sourceLineNo">1430</span>      }<a name="line.1430"></a>
-<span class="sourceLineNo">1431</span>      if (localServers.isEmpty()) {<a name="line.1431"></a>
-<span class="sourceLineNo">1432</span>        // No servers on the new cluster match up with this hostname, assign randomly, later.<a name="line.1432"></a>
-<span class="sourceLineNo">1433</span>        randomAssignRegions.add(region);<a name="line.1433"></a>
-<span class="sourceLineNo">1434</span>        if (oldServerName != null) {<a name="line.1434"></a>
-<span class="sourceLineNo">1435</span>          oldHostsNoLongerPresent.add(oldServerName.getHostnameLowerCase());<a name="line.1435"></a>
-<span class="sourceLineNo">1436</span>        }<a name="line.1436"></a>
-<span class="sourceLineNo">1437</span>      } else if (localServers.size() == 1) {<a name="line.1437"></a>
-<span class="sourceLineNo">1438</span>        // the usual case - one new server on same host<a name="line.1438"></a>
-<span class="sourceLineNo">1439</span>        ServerName target = localServers.get(0);<a name="line.1439"></a>
-<span class="sourceLineNo">1440</span>        assignments.get(target).add(region);<a name="line.1440"></a>
-<span class="sourceLineNo">1441</span>        numRetainedAssigments++;<a name="line.1441"></a>
-<span class="sourceLineNo">1442</span>      } else {<a name="line.1442"></a>
-<span class="sourceLineNo">1443</span>        // multiple new servers in the cluster on this same host<a name="line.1443"></a>
-<span class="sourceLineNo">1444</span>        if (localServers.contains(oldServerName)) {<a name="line.1444"></a>
-<span class="sourceLineNo">1445</span>          assignments.get(oldServerName).add(region);<a name="line.1445"></a>
-<span class="sourceLineNo">1446</span>          numRetainedAssigments++;<a name="line.1446"></a>
-<span class="sourceLineNo">1447</span>        } else {<a name="line.1447"></a>
-<span class="sourceLineNo">1448</span>          ServerName target = null;<a name="line.1448"></a>
-<span class="sourceLineNo">1449</span>          for (ServerName tmp : localServers) {<a name="line.1449"></a>
-<span class="sourceLineNo">1450</span>            if (tmp.getPort() == oldServerName.getPort()) {<a name="line.1450"></a>
-<span class="sourceLineNo">1451</span>              target = tmp;<a name="line.1451"></a>
-<span class="sourceLineNo">1452</span>              assignments.get(tmp).add(region);<a name="line.1452"></a>
-<span class="sourceLineNo">1453</span>              numRetainedAssigments++;<a name="line.1453"></a>
-<span class="sourceLineNo">1454</span>              break;<a name="line.1454"></a>
-<span class="sourceLineNo">1455</span>            }<a name="line.1455"></a>
-<span class="sourceLineNo">1456</span>          }<a name="line.1456"></a>
-<span class="sourceLineNo">1457</span>          if (target == null) {<a name="line.1457"></a>
-<span class="sourceLineNo">1458</span>            randomAssignRegions.add(region);<a name="line.1458"></a>
-<span class="sourceLineNo">1459</span>          }<a name="line.1459"></a>
-<span class="sourceLineNo">1460</span>        }<a name="line.1460"></a>
-<span class="sourceLineNo">1461</span>      }<a name="line.1461"></a>
-<span class="sourceLineNo">1462</span>    }<a name="line.1462"></a>
-<span class="sourceLineNo">1463</span><a name="line.1463"></a>
-<span class="sourceLineNo">1464</span>    // If servers from prior assignment aren't present, then lets do randomAssignment on regions.<a name="line.1464"></a>
-<span class="sourceLineNo">1465</span>    if (randomAssignRegions.size() &gt; 0) {<a name="line.1465"></a>
-<span class="sourceLineNo">1466</span>      for (Map.Entry&lt;ServerName, List&lt;RegionInfo&gt;&gt; entry : assignments.entrySet()) {<a name="line.1466"></a>
-<span class="sourceLineNo">1467</span>        ServerName sn = entry.getKey();<a name="line.1467"></a>
-<span class="sourceLineNo">1468</span>        for (RegionInfo region : entry.getValue()) {<a name="line.1468"></a>
-<span class="sourceLineNo">1469</span>          cluster.doAssignRegion(region, sn);<a name="line.1469"></a>
-<span class="sourceLineNo">1470</span>        }<a name="line.1470"></a>
-<span class="sourceLineNo">1471</span>      }<a name="line.1471"></a>
-<span class="sourceLineNo">1472</span>      for (RegionInfo region : randomAssignRegions) {<a name="line.1472"></a>
-<span class="sourceLineNo">1473</span>        ServerName target = randomAssignment(cluster, region, servers);<a name="line.1473"></a>
-<span class="sourceLineNo">1474</span>        assignments.get(target).add(region);<a name="line.1474"></a>
-<span class="sourceLineNo">1475</span>        cluster.doAssignRegion(region, target);<a name="line.1475"></a>
-<span class="sourceLineNo">1476</span>        numRandomAssignments++;<a name="line.1476"></a>
-<span class="sourceLineNo">1477</span>      }<a name="line.1477"></a>
-<span class="sourceLineNo">1478</span>    }<a name="line.1478"></a>
-<span class="sourceLineNo">1479</span><a name="line.1479"></a>
-<span class="sourceLineNo">1480</span>    String randomAssignMsg = "";<a name="line.1480"></a>
-<span class="sourceLineNo">1481</span>    if (numRandomAssignments &gt; 0) {<a name="line.1481"></a>
-<span class="sourceLineNo">1482</span>      randomAssignMsg =<a name="line.1482"></a>
-<span class="sourceLineNo">1483</span>          numRandomAssignments + " regions were assigned "<a name="line.1483"></a>
-<span class="sourceLineNo">1484</span>              + "to random hosts, since the old hosts for these regions are no "<a name="line.1484"></a>
-<span class="sourceLineNo">1485</span>              + "longer present in the cluster. These hosts were:\n  "<a name="line.1485"></a>
-<span class="sourceLineNo">1486</span>              + Joiner.on("\n  ").join(oldHostsNoLongerPresent);<a name="line.1486"></a>
-<span class="sourceLineNo">1487</span>    }<a name="line.1487"></a>
-<span class="sourceLineNo">1488</span><a name="line.1488"></a>
-<span class="sourceLineNo">1489</span>    LOG.info("Reassigned " + regions.size() + " regions. " + numRetainedAssigments<a name="line.1489"></a>
-<span class="sourceLineNo">1490</span>        + " retained the pre-restart assignment. " + randomAssignMsg);<a name="line.1490"></a>
-<span class="sourceLineNo">1491</span>    return assignments;<a name="line.1491"></a>
-<span class="sourceLineNo">1492</span>  }<a name="line.1492"></a>
-<span class="sourceLineNo">1493</span><a name="line.1493"></a>
-<span class="sourceLineNo">1494</span>  @Override<a name="line.1494"></a>
-<span class="sourceLineNo">1495</span>  public void initialize() throws HBaseIOException{<a name="line.1495"></a>
-<span class="sourceLineNo">1496</span>  }<a name="line.1496"></a>
-<span class="sourceLineNo">1497</span><a name="line.1497"></a>
-<span class="sourceLineNo">1498</span>  @Override<a name="line.1498"></a>
-<span class="sourceLineNo">1499</span>  public void regionOnline(RegionInfo regionInfo, ServerName sn) {<a name="line.1499"></a>
+<span class="sourceLineNo">1393</span>    if (regions.isEmpty()) {<a name="line.1393"></a>
+<span class="sourceLineNo">1394</span>      return assignments;<a name="line.1394"></a>
+<span class="sourceLineNo">1395</span>    }<a name="line.1395"></a>
+<span class="sourceLineNo">1396</span><a name="line.1396"></a>
+<span class="sourceLineNo">1397</span>    int numServers = servers == null ? 0 : servers.size();<a name="line.1397"></a>
+<span class="sourceLineNo">1398</span>    if (numServers == 0) {<a name="line.1398"></a>
+<span class="sourceLineNo">1399</span>      LOG.warn("Wanted to do retain assignment but no servers to assign to");<a name="line.1399"></a>
+<span class="sourceLineNo">1400</span>      return null;<a name="line.1400"></a>
+<span class="sourceLineNo">1401</span>    }<a name="line.1401"></a>
+<span class="sourceLineNo">1402</span>    if (numServers == 1) { // Only one server, nothing fancy we can do here<a name="line.1402"></a>
+<span class="sourceLineNo">1403</span>      ServerName server = servers.get(0);<a name="line.1403"></a>
+<span class="sourceLineNo">1404</span>      assignments.put(server, new ArrayList&lt;&gt;(regions.keySet()));<a name="line.1404"></a>
+<span class="sourceLineNo">1405</span>      return assignments;<a name="line.1405"></a>
+<span class="sourceLineNo">1406</span>    }<a name="line.1406"></a>
+<span class="sourceLineNo">1407</span><a name="line.1407"></a>
+<span class="sourceLineNo">1408</span>    // Group all of the old assignments by their hostname.<a name="line.1408"></a>
+<span class="sourceLineNo">1409</span>    // We can't group directly by ServerName since the servers all have<a name="line.1409"></a>
+<span class="sourceLineNo">1410</span>    // new start-codes.<a name="line.1410"></a>
+<span class="sourceLineNo">1411</span><a name="line.1411"></a>
+<span class="sourceLineNo">1412</span>    // Group the servers by their hostname. It's possible we have multiple<a name="line.1412"></a>
+<span class="sourceLineNo">1413</span>    // servers on the same host on different ports.<a name="line.1413"></a>
+<span class="sourceLineNo">1414</span>    ArrayListMultimap&lt;String, ServerName&gt; serversByHostname = ArrayListMultimap.create();<a name="line.1414"></a>
+<span class="sourceLineNo">1415</span>    for (ServerName server : servers) {<a name="line.1415"></a>
+<span class="sourceLineNo">1416</span>      assignments.put(server, new ArrayList&lt;&gt;());<a name="line.1416"></a>
+<span class="sourceLineNo">1417</span>      serversByHostname.put(server.getHostnameLowerCase(), server);<a name="line.1417"></a>
+<span class="sourceLineNo">1418</span>    }<a name="line.1418"></a>
+<span class="sourceLineNo">1419</span><a name="line.1419"></a>
+<span class="sourceLineNo">1420</span>    // Collection of the hostnames that used to have regions<a name="line.1420"></a>
+<span class="sourceLineNo">1421</span>    // assigned, but for which we no longer have any RS running<a name="line.1421"></a>
+<span class="sourceLineNo">1422</span>    // after the cluster restart.<a name="line.1422"></a>
+<span class="sourceLineNo">1423</span>    Set&lt;String&gt; oldHostsNoLongerPresent = Sets.newTreeSet();<a name="line.1423"></a>
+<span class="sourceLineNo">1424</span><a name="line.1424"></a>
+<span class="sourceLineNo">1425</span>    // If the old servers aren't present, lets assign those regions later.<a name="line.1425"></a>
+<span class="sourceLineNo">1426</span>    List&lt;RegionInfo&gt; randomAssignRegions = Lists.newArrayList();<a name="line.1426"></a>
+<span class="sourceLineNo">1427</span><a name="line.1427"></a>
+<span class="sourceLineNo">1428</span>    int numRandomAssignments = 0;<a name="line.1428"></a>
+<span class="sourceLineNo">1429</span>    int numRetainedAssigments = 0;<a name="line.1429"></a>
+<span class="sourceLineNo">1430</span><a name="line.1430"></a>
+<span class="sourceLineNo">1431</span>    for (Map.Entry&lt;RegionInfo, ServerName&gt; entry : regions.entrySet()) {<a name="line.1431"></a>
+<span class="sourceLineNo">1432</span>      RegionInfo region = entry.getKey();<a name="line.1432"></a>
+<span class="sourceLineNo">1433</span>      ServerName oldServerName = entry.getValue();<a name="line.1433"></a>
+<span class="sourceLineNo">1434</span>      List&lt;ServerName&gt; localServers = new ArrayList&lt;&gt;();<a name="line.1434"></a>
+<span class="sourceLineNo">1435</span>      if (oldServerName != null) {<a name="line.1435"></a>
+<span class="sourceLineNo">1436</span>        localServers = serversByHostname.get(oldServerName.getHostnameLowerCase());<a name="line.1436"></a>
+<span class="sourceLineNo">1437</span>      }<a name="line.1437"></a>
+<span class="sourceLineNo">1438</span>      if (localServers.isEmpty()) {<a name="line.1438"></a>
+<span class="sourceLineNo">1439</span>        // No servers on the new cluster match up with this hostname, assign randomly, later.<a name="line.1439"></a>
+<span class="sourceLineNo">1440</span>        randomAssignRegions.add(region);<a name="line.1440"></a>
+<span class="sourceLineNo">1441</span>        if (oldServerName != null) {<a name="line.1441"></a>
+<span class="sourceLineNo">1442</span>          oldHostsNoLongerPresent.add(oldServerName.getHostnameLowerCase());<a name="line.1442"></a>
+<span class="sourceLineNo">1443</span>        }<a name="line.1443"></a>
+<span class="sourceLineNo">1444</span>      } else if (localServers.size() == 1) {<a name="line.1444"></a>
+<span class="sourceLineNo">1445</span>        // the usual case - one new server on same host<a name="line.1445"></a>
+<span class="sourceLineNo">1446</span>        ServerName target = localServers.get(0);<a name="line.1446"></a>
+<span class="sourceLineNo">1447</span>        assignments.get(target).add(region);<a name="line.1447"></a>
+<span class="sourceLineNo">1448</span>        numRetainedAssigments++;<a name="line.1448"></a>
+<span class="sourceLineNo">1449</span>      } else {<a name="line.1449"></a>
+<span class="sourceLineNo">1450</span>        // multiple new servers in the cluster on this same host<a name="line.1450"></a>
+<span class="sourceLineNo">1451</span>        if (localServers.contains(oldServerName)) {<a name="line.1451"></a>
+<span class="sourceLineNo">1452</span>          assignments.get(oldServerName).add(region);<a name="line.1452"></a>
+<span class="sourceLineNo">1453</span>          numRetainedAssigments++;<a name="line.1453"></a>
+<span class="sourceLineNo">1454</span>        } else {<a name="line.1454"></a>
+<span class="sourceLineNo">1455</span>          ServerName target = null;<a name="line.1455"></a>
+<span class="sourceLineNo">1456</span>          for (ServerName tmp : localServers) {<a name="line.1456"></a>
+<span class="sourceLineNo">1457</span>            if (tmp.getPort() == oldServerName.getPort()) {<a name="line.1457"></a>
+<span class="sourceLineNo">1458</span>              target = tmp;<a name="line.1458"></a>
+<span class="sourceLineNo">1459</span>              assignments.get(tmp).add(region);<a name="line.1459"></a>
+<span class="sourceLineNo">1460</span>              numRetainedAssigments++;<a name="line.1460"></a>
+<span class="sourceLineNo">1461</span>              break;<a name="line.1461"></a>
+<span class="sourceLineNo">1462</span>            }<a name="line.1462"></a>
+<span class="sourceLineNo">1463</span>          }<a name="line.1463"></a>
+<span class="sourceLineNo">1464</span>          if (target == null) {<a name="line.1464"></a>
+<span class="sourceLineNo">1465</span>            randomAssignRegions.add(region);<a name="line.1465"></a>
+<span class="sourceLineNo">1466</span>          }<a name="line.1466"></a>
+<span class="sourceLineNo">1467</span>        }<a name="line.1467"></a>
+<span class="sourceLineNo">1468</span>      }<a name="line.1468"></a>
+<span class="sourceLineNo">1469</span>    }<a name="line.1469"></a>
+<span class="sourceLineNo">1470</span><a name="line.1470"></a>
+<span class="sourceLineNo">1471</span>    // If servers from prior assignment aren't present, then lets do randomAssignment on regions.<a name="line.1471"></a>
+<span class="sourceLineNo">1472</span>    if (randomAssignRegions.size() &gt; 0) {<a name="line.1472"></a>
+<span class="sourceLineNo">1473</span>      Cluster cluster = createCluster(servers, regions.keySet());<a name="line.1473"></a>
+<span class="sourceLineNo">1474</span>      for (Map.Entry&lt;ServerName, List&lt;RegionInfo&gt;&gt; entry : assignments.entrySet()) {<a name="line.1474"></a>
+<span class="sourceLineNo">1475</span>        ServerName sn = entry.getKey();<a name="line.1475"></a>
+<span class="sourceLineNo">1476</span>        for (RegionInfo region : entry.getValue()) {<a name="line.1476"></a>
+<span class="sourceLineNo">1477</span>          cluster.doAssignRegion(region, sn);<a name="line.1477"></a>
+<span class="sourceLineNo">1478</span>        }<a name="line.1478"></a>
+<span class="sourceLineNo">1479</span>      }<a name="line.1479"></a>
+<span class="sourceLineNo">1480</span>      for (RegionInfo region : randomAssignRegions) {<a name="line.1480"></a>
+<span class="sourceLineNo">1481</span>        ServerName target = randomAssignment(cluster, region, servers);<a name="line.1481"></a>
+<span class="sourceLineNo">1482</span>        assignments.get(target).add(region);<a name="line.1482"></a>
+<span class="sourceLineNo">1483</span>        cluster.doAssignRegion(region, target);<a name="line.1483"></a>
+<span class="sourceLineNo">1484</span>        numRandomAssignments++;<a name="line.1484"></a>
+<span class="sourceLineNo">1485</span>      }<a name="line.1485"></a>
+<span class="sourceLineNo">1486</span>    }<a name="line.1486"></a>
+<span class="sourceLineNo">1487</span><a name="line.1487"></a>
+<span class="sourceLineNo">1488</span>    String randomAssignMsg = "";<a name="line.1488"></a>
+<span class="sourceLineNo">1489</span>    if (numRandomAssignments &gt; 0) {<a name="line.1489"></a>
+<span class="sourceLineNo">1490</span>      randomAssignMsg =<a name="line.1490"></a>
+<span class="sourceLineNo">1491</span>          numRandomAssignments + " regions were assigned "<a name="line.1491"></a>
+<span class="sourceLineNo">1492</span>              + "to random hosts, since the old hosts for these regions are no "<a name="line.1492"></a>
+<span class="sourceLineNo">1493</span>              + "longer present in the cluster. These hosts were:\n  "<a name="line.1493"></a>
+<span class="sourceLineNo">1494</span>              + Joiner.on("\n  ").join(oldHostsNoLongerPresent);<a name="line.1494"></a>
+<span class="sourceLineNo">1495</span>    }<a name="line.1495"></a>
+<span class="sourceLineNo">1496</span><a name="line.1496"></a>
+<span class="sourceLineNo">1497</span>    LOG.info("Reassigned " + regions.size() + " regions. " + numRetainedAssigments<a name="line.1497"></a>
+<span class="sourceLineNo">1498</span>        + " retained the pre-restart assignment. " + randomAssignMsg);<a name="line.1498"></a>
+<span class="sourceLineNo">1499</span>    return assignments;<a name="line.1499"></a>
 <span class="sourceLineNo">1500</span>  }<a name="line.1500"></a>
 <span class="sourceLineNo">1501</span><a name="line.1501"></a>
 <span class="sourceLineNo">1502</span>  @Override<a name="line.1502"></a>
-<span class="sourceLineNo">1503</span>  public void regionOffline(RegionInfo regionInfo) {<a name="line.1503"></a>
+<span class="sourceLineNo">1503</span>  public void initialize() throws HBaseIOException{<a name="line.1503"></a>
 <span class="sourceLineNo">1504</span>  }<a name="line.1504"></a>
 <span class="sourceLineNo">1505</span><a name="line.1505"></a>
 <span class="sourceLineNo">1506</span>  @Override<a name="line.1506"></a>
-<span class="sourceLineNo">1507</span>  public boolean isStopped() {<a name="line.1507"></a>
-<span class="sourceLineNo">1508</span>    return stopped;<a name="line.1508"></a>
-<span class="sourceLineNo">1509</span>  }<a name="line.1509"></a>
-<span class="sourceLineNo">1510</span><a name="line.1510"></a>
-<span class="sourceLineNo">1511</span>  @Override<a name="line.1511"></a>
-<span class="sourceLineNo">1512</span>  public void stop(String why) {<a name="line.1512"></a>
-<span class="sourceLineNo">1513</span>    LOG.info("Load Balancer stop requested: "+why);<a name="line.1513"></a>
-<span class="sourceLineNo">1514</span>    stopped = true;<a name="line.1514"></a>
-<span class="sourceLineNo">1515</span>  }<a name="line.1515"></a>
-<span class="sourceLineNo">1516</span><a name="line.1516"></a>
-<span class="sourceLineNo">1517</span>  /**<a name="line.1517"></a>
-<span class="sourceLineNo">1518</span>   * Used to assign a single region to a random server.<a name="line.1518"></a>
-<span class="sourceLineNo">1519</span>   */<a name="line.1519"></a>
-<span class="sourceLineNo">1520</span>  private ServerName randomAssignment(Cluster cluster, RegionInfo regionInfo,<a name="line.1520"></a>
-<span class="sourceLineNo">1521</span>      List&lt;ServerName&gt; servers) {<a name="line.1521"></a>
-<span class="sourceLineNo">1522</span>    int numServers = servers.size(); // servers is not null, numServers &gt; 1<a name="line.1522"></a>
-<span class="sourceLineNo">1523</span>    ServerName sn = null;<a name="line.1523"></a>
-<span class="sourceLineNo">1524</span>    final int maxIterations = numServers * 4;<a name="line.1524"></a>
-<span class="sourceLineNo">1525</span>    int iterations = 0;<a name="line.1525"></a>
-<span class="sourceLineNo">1526</span><a name="line.1526"></a>
-<span class="sourceLineNo">1527</span>    do {<a name="line.1527"></a>
-<span class="sourceLineNo">1528</span>      int i = RANDOM.nextInt(numServers);<a name="line.1528"></a>
-<span class="sourceLineNo">1529</span>      sn = servers.get(i);<a name="line.1529"></a>
-<span class="sourceLineNo">1530</span>    } while (cluster.wouldLowerAvailability(regionInfo, sn)<a name="line.1530"></a>
-<span class="sourceLineNo">1531</span>        &amp;&amp; iterations++ &lt; maxIterations);<a name="line.1531"></a>
-<span class="sourceLineNo">1532</span>    cluster.doAssignRegion(regionInfo, sn);<a name="line.1532"></a>
-<span class="sourceLineNo">1533</span>    return sn;<a name="line.1533"></a>
-<span class="sourceLineNo">1534</span>  }<a name="line.1534"></a>
-<span class="sourceLineNo">1535</span><a name="line.1535"></a>
-<span class="sourceLineNo">1536</span>  /**<a name="line.1536"></a>
-<span class="sourceLineNo">1537</span>   * Round robin a list of regions to a list of servers<a name="line.1537"></a>
-<span class="sourceLineNo">1538</span>   */<a name="line.1538"></a>
-<span class="sourceLineNo">1539</span>  private void roundRobinAssignment(Cluster cluster, List&lt;RegionInfo&gt; regions,<a name="line.1539"></a>
-<span class="sourceLineNo">1540</span>      List&lt;RegionInfo&gt; unassignedRegions, List&lt;ServerName&gt; servers,<a name="line.1540"></a>
-<span class="sourceLineNo">1541</span>      Map&lt;ServerName, List&lt;RegionInfo&gt;&gt; assignments) {<a name="line.1541"></a>
-<span class="sourceLineNo">1542</span><a name="line.1542"></a>
-<span class="sourceLineNo">1543</span>    int numServers = servers.size();<a name="line.1543"></a>
-<span class="sourceLineNo">1544</span>    int numRegions = regions.size();<a name="line.1544"></a>
-<span class="sourceLineNo">1545</span>    int max = (int) Math.ceil((float) numRegions / numServers);<a name="line.1545"></a>
-<span class="sourceLineNo">1546</span>    int serverIdx = 0;<a name="line.1546"></a>
-<span class="sourceLineNo">1547</span>    if (numServers &gt; 1) {<a name="line.1547"></a>
-<span class="sourceLineNo">1548</span>      serverIdx = RANDOM.nextInt(numServers);<a name="line.1548"></a>
-<span class="sourceLineNo">1549</span>    }<a name="line.1549"></a>
-<span class="sourceLineNo">1550</span>    int regionIdx = 0;<a name="line.1550"></a>
-<span class="sourceLineNo">1551</span><a name="line.1551"></a>
-<span class="sourceLineNo">1552</span>    for (int j = 0; j &lt; numServers; j++) {<a name="line.1552"></a>
-<span class="sourceLineNo">1553</span>      ServerName server = servers.get((j + serverIdx) % numServers);<a name="line.1553"></a>
-<span class="sourceLineNo">1554</span>      List&lt;RegionInfo&gt; serverRegions = new ArrayList&lt;&gt;(max);<a name="line.1554"></a>
-<span class="sourceLineNo">1555</span>      for (int i = regionIdx; i &lt; numRegions; i += numServers) {<a name="line.1555"></a>
-<span class="sourceLineNo">1556</span>        RegionInfo region = regions.get(i % numRegions);<a name="line.1556"></a>
-<span class="sourceLineNo">1557</span>        if (cluster.wouldLowerAvailability(region, server)) {<a name="line.1557"></a>
-<span class="sourceLineNo">1558</span>          unassignedRegions.add(region);<a name="line.1558"></a>
-<span class="sourceLineNo">1559</span>        } else {<a name="line.1559"></a>
-<span class="sourceLineNo">1560</span>          serverRegions.add(region);<a name="line.1560"></a>
-<span class="sourceLineNo">1561</span>          cluster.doAssignRegion(region, server);<a name="line.1561"></a>
-<span class="sourceLineNo">1562</span>        }<a name="line.1562"></a>
-<span class="sourceLineNo">1563</span>      }<a name="line.1563"></a>
-<span class="sourceLineNo">1564</span>      assignments.put(server, serverRegions);<a name="line.1564"></a>
-<span class="sourceLineNo">1565</span>      regionIdx++;<a name="line.1565"></a>
-<span class="sourceLineNo">1566</span>    }<a name="line.1566"></a>
-<span class="sourceLineNo">1567</span>  }<a name="line.1567"></a>
-<span class="sourceLineNo">1568</span><a name="line.1568"></a>
-<span class="sourceLineNo">1569</span>  protected Map&lt;ServerName, List&lt;RegionInfo&gt;&gt; getRegionAssignmentsByServer(<a name="line.1569"></a>
-<span class="sourceLineNo">1570</span>    Collection&lt;RegionInfo&gt; regions) {<a name="line.1570"></a>
-<span class="sourceLineNo">1571</span>    if (this.services != null &amp;&amp; this.services.getAssignmentManager() != null) {<a name="line.1571"></a>
-<span class="sourceLineNo">1572</span>      return this.services.getAssignmentManager().getSnapShotOfAssignment(regions);<a name="line.1572"></a>
-<span class="sourceLineNo">1573</span>    } else {<a name="line.1573"></a>
-<span class="sourceLineNo">1574</span>      return new HashMap&lt;&gt;();<a name="line.1574"></a>
-<span class="sourceLineNo">1575</span>    }<a name="line.1575"></a>
-<span class="sourceLineNo">1576</span>  }<a name="line.1576"></a>
-<span class="sourceLineNo">1577</span><a name="line.1577"></a>
-<span class="sourceLineNo">1578</span>  @Override<a name="line.1578"></a>
-<span class="sourceLineNo">1579</span>  public void onConfigurationChange(Configuration conf) {<a name="line.1579"></a>
-<span class="sourceLineNo">1580</span>  }<a name="line.1580"></a>
-<span class="sourceLineNo">1581</span>}<a name="line.1581"></a>
+<span class="sourceLineNo">1507</span>  public void regionOnline(RegionInfo regionInfo, ServerName sn) {<a name="line.1507"></a>
+<span class="sourceLineNo">1508</span>  }<a name="line.1508"></a>
+<span class="sourceLineNo">1509</span><a name="line.1509"></a>
+<span class="sourceLineNo">1510</span>  @Override<a name="line.1510"></a>
+<span class="sourceLineNo">1511</span>  public void regionOffline(RegionInfo regionInfo) {<a name="line.1511"></a>
+<span class="sourceLineNo">1512</span>  }<a name="line.1512"></a>
+<span class="sourceLineNo">1513</span><a name="line.1513"></a>
+<span class="sourceLineNo">1514</span>  @Override<a name="line.1514"></a>
+<span class="sourceLineNo">1515</span>  public boolean isStopped() {<a name="line.1515"></a>
+<span class="sourceLineNo">1516</span>    return stopped;<a name="line.1516"></a>
+<span class="sourceLineNo">1517</span>  }<a name="line.1517"></a>
+<span class="sourceLineNo">1518</span><a name="line.1518"></a>
+<span class="sourceLineNo">1519</span>  @Override<a name="line.1519"></a>
+<span class="sourceLineNo">1520</span>  public void stop(String why) {<a name="line.1520"></a>
+<span class="sourceLineNo">1521</span>    LOG.info("Load Balancer stop requested: "+why);<a name="line.1521"></a>
+<span class="sourceLineNo">1522</span>    stopped = true;<a name="line.1522"></a>
+<span class="sourceLineNo">1523</span>  }<a name="line.1523"></a>
+<span class="sourceLineNo">1524</span><a name="line.1524"></a>
+<span class="sourceLineNo">1525</span>  /**<a name="line.1525"></a>
+<span class="sourceLineNo">1526</span>   * Used to assign a single region to a random server.<a name="line.1526"></a>
+<span class="sourceLineNo">1527</span>   */<a name="line.1527"></a>
+<span class="sourceLineNo">1528</span>  private ServerName randomAssignment(Cluster cluster, RegionInfo regionInfo,<a name="line.1528"></a>
+<span class="sourceLineNo">1529</span>      List&lt;ServerName&gt; servers) {<a name="line.1529"></a>
+<span class="sourceLineNo">1530</span>    int numServers = servers.size(); // servers is not null, numServers &gt; 1<a name="line.1530"></a>
+<span class="sourceLineNo">1531</span>    ServerName sn = null;<a name="line.1531"></a>
+<span class="sourceLineNo">1532</span>    final int maxIterations = numServers * 4;<a name="line.1532"></a>
+<span class="sourceLineNo">1533</span>    int iterations = 0;<a name="line.1533"></a>
+<span class="sourceLineNo">1534</span><a name="line.1534"></a>
+<span class="sourceLineNo">1535</span>    do {<a name="line.1535"></a>
+<span class="sourceLineNo">1536</span>      int i = RANDOM.nextInt(numServers);<a name="line.1536"></a>
+<span class="sourceLineNo">1537</span>      sn = servers.get(i);<a name="line.1537"></a>
+<span class="sourceLineNo">1538</span>    } while (cluster.wouldLowerAvailability(regionInfo, sn)<a name="line.1538"></a>
+<span class="sourceLineNo">1539</span>        &amp;&amp; iterations++ &lt; maxIterations);<a name="line.1539"></a>
+<span class="sourceLineNo">1540</span>    cluster.doAssignRegion(regionInfo, sn);<a name="line.1540"></a>
+<span class="sourceLineNo">1541</span>    return sn;<a name="line.1541"></a>
+<span class="sourceLineNo">1542</span>  }<a name="line.1542"></a>
+<span class="sourceLineNo">1543</span><a name="line.1543"></a>
+<span class="sourceLineNo">1544</span>  /**<a name="line.1544"></a>
+<span class="sourceLineNo">1545</span>   * Round robin a list of regions to a list of servers<a name="line.1545"></a>
+<span class="sourceLineNo">1546</span>   */<a name="line.1546"></a>
+<span class="sourceLineNo">1547</span>  private void roundRobinAssignment(Cluster cluster, List&lt;RegionInfo&gt; regions,<a name="line.1547"></a>
+<span class="sourceLineNo">1548</span>      List&lt;RegionInfo&gt; unassignedRegions, List&lt;ServerName&gt; servers,<a name="line.1548"></a>
+<span class="sourceLineNo">1549</span>      Map&lt;ServerName, List&lt;RegionInfo&gt;&gt; assignments) {<a name="line.1549"></a>
+<span class="sourceLineNo">1550</span><a name="line.1550"></a>
+<span class="sourceLineNo">1551</span>    int numServers = servers.size();<a name="line.1551"></a>
+<span class="sourceLineNo">1552</span>    int numRegions = regions.size();<a name="line.1552"></a>
+<span class="sourceLineNo">1553</span>    int max = (int) Math.ceil((float) numRegions / numServers);<a name="line.1553"></a>
+<span class="sourceLineNo">1554</span>    int serverIdx = 0;<a name="line.1554"></a>
+<span class="sourceLineNo">1555</span>    if (numServers &gt; 1) {<a name="line.1555"></a>
+<span class="sourceLineNo">1556</span>      serverIdx = RANDOM.nextInt(numServers);<a name="line.1556"></a>
+<span class="sourceLineNo">1557</span>    }<a name="line.1557"></a>
+<span class="sourceLineNo">1558</span>    int regionIdx = 0;<a name="line.1558"></a>
+<span class="sourceLineNo">1559</span><a name="line.1559"></a>
+<span class="sourceLineNo">1560</span>    for (int j = 0; j &lt; numServers; j++) {<a name="line.1560"></a>
+<span class="sourceLineNo">1561</span>      ServerName server = servers.get((j + serverIdx) % numServers);<a name="line.1561"></a>
+<span class="sourceLineNo">1562</span>      List&lt;RegionInfo&gt; serverRegions = new ArrayList&lt;&gt;(max);<a name="line.1562"></a>
+<span class="sourceLineNo">1563</span>      for (int i = regionIdx; i &lt; numRegions; i += numServers) {<a name="line.1563"></a>
+<span class="sourceLineNo">1564</span>        RegionInfo region = regions.get(i % numRegions);<a name="line.1564"></a>
+<span class="sourceLineNo">1565</span>        if (cluster.wouldLowerAvailability(region, server)) {<a name="line.1565"></a>
+<span class="sourceLineNo">1566</span>          unassignedRegions.add(region);<a name="line.1566"></a>
+<span class="sourceLineNo">1567</span>        } else {<a name="line.1567"></a>
+<span class="sourceLineNo">1568</span>          serverRegions.add(region);<a name="line.1568"></a>
+<span class="sourceLineNo">1569</span>          cluster.doAssignRegion(region, server);<a name="line.1569"></a>
+<span class="sourceLineNo">1570</span>        }<a name="line.1570"></a>
+<span class="sourceLineNo">1571</span>      }<a name="line.1571"></a>
+<span class="sourceLineNo">1572</span>      assignments.put(server, serverRegions);<a name="line.1572"></a>
+<span class="sourceLineNo">1573</span>      regionIdx++;<a name="line.1573"></a>
+<span class="sourceLineNo">1574</span>    }<a name="line.1574"></a>
+<span class="sourceLineNo">1575</span>  }<a name="line.1575"></a>
+<span class="sourceLineNo">1576</span><a name="line.1576"></a>
+<span class="sourceLineNo">1577</span>  protected Map&lt;ServerName, List&lt;RegionInfo&gt;&gt; getRegionAssignmentsByServer(<a name="line.1577"></a>
+<span class="sourceLineNo">1578</span>    Collection&lt;RegionInfo&gt; regions) {<a name="line.1578"></a>
+<span class="sourceLineNo">1579</span>    if (this.services != null &amp;&amp; this.services.getAssignmentManager() != null) {<a name="line.1579"></a>
+<span class="sourceLineNo">1580</span>      return this.services.getAssignmentManager().getSnapShotOfAssignment(regions);<a name="line.1580"></a>
+<span class="sourceLineNo">1581</span>    } else {<a name="line.1581"></a>
+<span class="sourceLineNo">1582</span>      return new HashMap&lt;&gt;();<a name="line.1582"></a>
+<span class="sourceLineNo">1583</span>    }<a name="line.1583"></a>
+<span class="sourceLineNo">1584</span>  }<a name="line.1584"></a>
+<span class="sourceLineNo">1585</span><a name="line.1585"></a>
+<span class="sourceLineNo">1586</span>  @Override<a name="line.1586"></a>
+<span class="sourceLineNo">1587</span>  public void onConfigurationChange(Configuration conf) {<a name="line.1587"></a>
+<span class="sourceLineNo">1588</span>  }<a name="line.1588"></a>
+<span class="sourceLineNo">1589</span>}<a name="line.1589"></a>
 
 
 


[29/29] hbase-site git commit: Published site at 477f9fdb32873387231c5fbbff130ba8bf7b5d68.

Posted by gi...@apache.org.
Published site at 477f9fdb32873387231c5fbbff130ba8bf7b5d68.


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

Branch: refs/heads/asf-site
Commit: 621479e1d34e8173631052e637c2105e82b52565
Parents: 5ea72c6
Author: jenkins <bu...@apache.org>
Authored: Fri May 25 14:47:45 2018 +0000
Committer: jenkins <bu...@apache.org>
Committed: Fri May 25 14:47:45 2018 +0000

----------------------------------------------------------------------
 acid-semantics.html                             |     4 +-
 apache_hbase_reference_guide.pdf                | 20776 ++++-----
 book.html                                       |    87 +-
 bulk-loads.html                                 |     4 +-
 checkstyle-aggregate.html                       | 37906 ++++++++---------
 checkstyle.rss                                  |     4 +-
 coc.html                                        |     4 +-
 dependencies.html                               |     4 +-
 dependency-convergence.html                     |     4 +-
 dependency-info.html                            |     4 +-
 dependency-management.html                      |     4 +-
 devapidocs/constant-values.html                 |     6 +-
 devapidocs/index-all.html                       |    12 +-
 .../hadoop/hbase/backup/package-tree.html       |     4 +-
 .../hadoop/hbase/class-use/ServerName.html      |     5 +-
 .../hbase/client/class-use/RegionInfo.html      |    11 +-
 .../hadoop/hbase/client/package-tree.html       |    24 +-
 .../hbase/favored/FavoredNodeLoadBalancer.html  |     2 +-
 .../hadoop/hbase/filter/package-tree.html       |    10 +-
 .../hadoop/hbase/io/hfile/package-tree.html     |     6 +-
 .../apache/hadoop/hbase/ipc/package-tree.html   |     2 +-
 .../hadoop/hbase/mapreduce/package-tree.html    |     4 +-
 .../master/HMaster.MasterStoppedException.html  |     4 +-
 .../org/apache/hadoop/hbase/master/HMaster.html |   312 +-
 .../hadoop/hbase/master/LoadBalancer.html       |    36 +-
 .../hbase/master/balancer/BaseLoadBalancer.html |    95 +-
 .../balancer/FavoredStochasticBalancer.html     |     2 +-
 .../master/balancer/SimpleLoadBalancer.html     |     2 +-
 .../master/balancer/StochasticLoadBalancer.html |     2 +-
 .../class-use/BaseLoadBalancer.Cluster.html     |     5 +-
 .../hbase/master/balancer/package-tree.html     |     2 +-
 .../hadoop/hbase/master/package-tree.html       |     6 +-
 .../procedure/TruncateTableProcedure.html       |    91 +-
 .../replication/UpdatePeerConfigProcedure.html  |     2 +-
 .../hadoop/hbase/monitoring/package-tree.html   |     2 +-
 .../org/apache/hadoop/hbase/package-tree.html   |    16 +-
 .../hadoop/hbase/procedure2/package-tree.html   |     4 +-
 .../hbase/quotas/SpaceQuotaRefresherChore.html  |    18 +-
 .../hadoop/hbase/quotas/package-tree.html       |     6 +-
 .../hadoop/hbase/regionserver/package-tree.html |    20 +-
 .../regionserver/querymatcher/package-tree.html |     2 +-
 .../hbase/rsgroup/RSGroupBasedLoadBalancer.html |    45 +-
 .../hbase/rsgroup/RSGroupableBalancer.html      |     2 +-
 .../hbase/security/access/package-tree.html     |     2 +-
 .../hadoop/hbase/security/package-tree.html     |     2 +-
 .../hadoop/hbase/thrift/package-tree.html       |     2 +-
 .../apache/hadoop/hbase/util/package-tree.html  |     6 +-
 .../org/apache/hadoop/hbase/Version.html        |     6 +-
 .../master/HMaster.InitializationMonitor.html   |  5175 +--
 .../master/HMaster.MasterStoppedException.html  |  5175 +--
 .../hbase/master/HMaster.RedirectServlet.html   |  5175 +--
 .../org/apache/hadoop/hbase/master/HMaster.html |  5175 +--
 .../hadoop/hbase/master/LoadBalancer.html       |    23 +-
 .../BaseLoadBalancer.Cluster.Action.Type.html   |   846 +-
 .../BaseLoadBalancer.Cluster.Action.html        |   846 +-
 ...LoadBalancer.Cluster.AssignRegionAction.html |   846 +-
 .../BaseLoadBalancer.Cluster.LocalityType.html  |   846 +-
 ...seLoadBalancer.Cluster.MoveRegionAction.html |   846 +-
 ...eLoadBalancer.Cluster.SwapRegionsAction.html |   846 +-
 .../balancer/BaseLoadBalancer.Cluster.html      |   846 +-
 .../BaseLoadBalancer.DefaultRackManager.html    |   846 +-
 .../hbase/master/balancer/BaseLoadBalancer.html |   846 +-
 .../procedure/TruncateTableProcedure.html       |   547 +-
 .../replication/UpdatePeerConfigProcedure.html  |    32 +-
 .../hbase/quotas/SpaceQuotaRefresherChore.html  |   211 +-
 .../hbase/rsgroup/RSGroupBasedLoadBalancer.html |     7 +-
 downloads.html                                  |     4 +-
 export_control.html                             |     4 +-
 index.html                                      |     4 +-
 integration.html                                |     4 +-
 issue-tracking.html                             |     4 +-
 license.html                                    |   208 +-
 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                   |    58 +
 .../hbase/TestZooKeeper.MockLoadBalancer.html   |     2 +-
 .../hadoop/hbase/backup/package-tree.html       |     2 +-
 .../LoadOnlyFavoredStochasticBalancer.html      |     2 +-
 .../TestBaseLoadBalancer.MockBalancer.html      |     2 +-
 ...ure.TruncateTableProcedureOnHDFSFailure.html |   430 +
 .../procedure/TestTruncateTableProcedure.html   |   127 +-
 .../procedure/TestWALProcedureStoreOnHDFS.html  |     4 +-
 ...ure.TruncateTableProcedureOnHDFSFailure.html |   125 +
 .../hbase/master/procedure/package-frame.html   |     1 +
 .../hbase/master/procedure/package-summary.html |     4 +
 .../hbase/master/procedure/package-tree.html    |    13 +
 .../org/apache/hadoop/hbase/package-tree.html   |     8 +-
 .../hadoop/hbase/procedure/package-tree.html    |     8 +-
 .../hadoop/hbase/procedure2/package-tree.html   |     4 +-
 .../hadoop/hbase/quotas/TestSpaceQuotas.html    |   482 +-
 .../hadoop/hbase/regionserver/package-tree.html |     6 +-
 .../apache/hadoop/hbase/test/package-tree.html  |     4 +-
 .../apache/hadoop/hbase/wal/package-tree.html   |     2 +-
 testdevapidocs/overview-tree.html               |     9 +
 ...ure.TruncateTableProcedureOnHDFSFailure.html |   382 +
 .../procedure/TestTruncateTableProcedure.html   |   478 +-
 .../hadoop/hbase/quotas/TestSpaceQuotas.html    |   981 +-
 113 files changed, 47575 insertions(+), 44566 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/hbase-site/blob/621479e1/acid-semantics.html
----------------------------------------------------------------------
diff --git a/acid-semantics.html b/acid-semantics.html
index 04c2d08..00c2a5a 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="20180524" />
+    <meta name="Date-Revision-yyyymmdd" content="20180525" />
     <meta http-equiv="Content-Language" content="en" />
     <title>Apache HBase &#x2013;  
       Apache HBase (TM) ACID Properties
@@ -601,7 +601,7 @@ under the License. -->
                         <a href="https://www.apache.org/">The Apache Software Foundation</a>.
             All rights reserved.      
                     
-                  <li id="publishDate" class="pull-right">Last Published: 2018-05-24</li>
+                  <li id="publishDate" class="pull-right">Last Published: 2018-05-25</li>
             </p>
                 </div>
 


[21/29] hbase-site git commit: Published site at 477f9fdb32873387231c5fbbff130ba8bf7b5d68.

Posted by gi...@apache.org.
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/621479e1/devapidocs/org/apache/hadoop/hbase/rsgroup/RSGroupableBalancer.html
----------------------------------------------------------------------
diff --git a/devapidocs/org/apache/hadoop/hbase/rsgroup/RSGroupableBalancer.html b/devapidocs/org/apache/hadoop/hbase/rsgroup/RSGroupableBalancer.html
index 409d102..54b33a4 100644
--- a/devapidocs/org/apache/hadoop/hbase/rsgroup/RSGroupableBalancer.html
+++ b/devapidocs/org/apache/hadoop/hbase/rsgroup/RSGroupableBalancer.html
@@ -153,7 +153,7 @@ extends <a href="../../../../../org/apache/hadoop/hbase/master/LoadBalancer.html
 <!--   -->
 </a>
 <h3>Methods inherited from interface&nbsp;org.apache.hadoop.hbase.master.<a href="../../../../../org/apache/hadoop/hbase/master/LoadBalancer.html" title="interface in org.apache.hadoop.hbase.master">LoadBalancer</a></h3>
-<code><a href="../../../../../org/apache/hadoop/hbase/master/LoadBalancer.html#balanceCluster-java.util.Map-">balanceCluster</a>, <a href="../../../../../org/apache/hadoop/hbase/master/LoadBalancer.html#balanceCluster-org.apache.hadoop.hbase.TableName-java.util.Map-">balanceCluster</a>, <a href="../../../../../org/apache/hadoop/hbase/master/LoadBalancer.html#initialize--">initialize</a>, <a href="../../../../../org/apache/hadoop/hbase/master/LoadBalancer.html#isSystemTablesOnlyOnMaster-org.apache.hadoop.conf.Configuration-">isSystemTablesOnlyOnMaster</a>, <a href="../../../../../org/apache/hadoop/hbase/master/LoadBalancer.html#isTablesOnMaster-org.apache.hadoop.conf.Configuration-">isTablesOnMaster</a>, <a href="../../../../../org/apache/hadoop/hbase/master/LoadBalancer.html#onConfigurationChange-org.apache.hadoop.conf.Configuration-">onConfigurationChange</a>, <a href="../../../../../org/apache/hadoop/hbase/master/LoadBalancer.html#randomAssignment-org.apache.hadoop.hbase.client.Re
 gionInfo-java.util.List-">randomAssignment</a>, <a href="../../../../../org/apache/hadoop/hbase/master/LoadBalancer.html#regionOffline-org.apache.hadoop.hbase.client.RegionInfo-">regionOffline</a>, <a href="../../../../../org/apache/hadoop/hbase/master/LoadBalancer.html#regionOnline-org.apache.hadoop.hbase.client.RegionInfo-org.apache.hadoop.hbase.ServerName-">regionOnline</a>, <a href="../../../../../org/apache/hadoop/hbase/master/LoadBalancer.html#retainAssignment-java.util.Map-java.util.List-">retainAssignment</a>, <a href="../../../../../org/apache/hadoop/hbase/master/LoadBalancer.html#roundRobinAssignment-java.util.List-java.util.List-">roundRobinAssignment</a>, <a href="../../../../../org/apache/hadoop/hbase/master/LoadBalancer.html#setClusterLoad-java.util.Map-">setClusterLoad</a>, <a href="../../../../../org/apache/hadoop/hbase/master/LoadBalancer.html#setClusterMetrics-org.apache.hadoop.hbase.ClusterMetrics-">setClusterMetrics</a>, <a href="../../../../../org/apache/hadoop/
 hbase/master/LoadBalancer.html#setMasterServices-org.apache.hadoop.hbase.master.MasterServices-">setMasterServices</a></code></li>
+<code><a href="../../../../../org/apache/hadoop/hbase/master/LoadBalancer.html#balanceCluster-java.util.Map-">balanceCluster</a>, <a href="../../../../../org/apache/hadoop/hbase/master/LoadBalancer.html#balanceCluster-org.apache.hadoop.hbase.TableName-java.util.Map-">balanceCluster</a>, <a href="../../../../../org/apache/hadoop/hbase/master/LoadBalancer.html#initialize--">initialize</a>, <a href="../../../../../org/apache/hadoop/hbase/master/LoadBalancer.html#isSystemTablesOnlyOnMaster-org.apache.hadoop.conf.Configuration-">isSystemTablesOnlyOnMaster</a>, <a href="../../../../../org/apache/hadoop/hbase/master/LoadBalancer.html#isTablesOnMaster-org.apache.hadoop.conf.Configuration-">isTablesOnMaster</a>, <a href="../../../../../org/apache/hadoop/hbase/master/LoadBalancer.html#onConfigurationChange-org.apache.hadoop.conf.Configuration-">onConfigurationChange</a>, <a href="../../../../../org/apache/hadoop/hbase/master/LoadBalancer.html#postMasterStartupInitialize--">postMasterStartupIn
 itialize</a>, <a href="../../../../../org/apache/hadoop/hbase/master/LoadBalancer.html#randomAssignment-org.apache.hadoop.hbase.client.RegionInfo-java.util.List-">randomAssignment</a>, <a href="../../../../../org/apache/hadoop/hbase/master/LoadBalancer.html#regionOffline-org.apache.hadoop.hbase.client.RegionInfo-">regionOffline</a>, <a href="../../../../../org/apache/hadoop/hbase/master/LoadBalancer.html#regionOnline-org.apache.hadoop.hbase.client.RegionInfo-org.apache.hadoop.hbase.ServerName-">regionOnline</a>, <a href="../../../../../org/apache/hadoop/hbase/master/LoadBalancer.html#retainAssignment-java.util.Map-java.util.List-">retainAssignment</a>, <a href="../../../../../org/apache/hadoop/hbase/master/LoadBalancer.html#roundRobinAssignment-java.util.List-java.util.List-">roundRobinAssignment</a>, <a href="../../../../../org/apache/hadoop/hbase/master/LoadBalancer.html#setClusterLoad-java.util.Map-">setClusterLoad</a>, <a href="../../../../../org/apache/hadoop/hbase/master/LoadB
 alancer.html#setClusterMetrics-org.apache.hadoop.hbase.ClusterMetrics-">setClusterMetrics</a>, <a href="../../../../../org/apache/hadoop/hbase/master/LoadBalancer.html#setMasterServices-org.apache.hadoop.hbase.master.MasterServices-">setMasterServices</a></code></li>
 </ul>
 <ul class="blockList">
 <li class="blockList"><a name="methods.inherited.from.class.org.apache.hadoop.conf.Configurable">

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

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/621479e1/devapidocs/org/apache/hadoop/hbase/security/package-tree.html
----------------------------------------------------------------------
diff --git a/devapidocs/org/apache/hadoop/hbase/security/package-tree.html b/devapidocs/org/apache/hadoop/hbase/security/package-tree.html
index 7ba3a64..13f949c 100644
--- a/devapidocs/org/apache/hadoop/hbase/security/package-tree.html
+++ b/devapidocs/org/apache/hadoop/hbase/security/package-tree.html
@@ -191,9 +191,9 @@
 <ul>
 <li type="circle">java.lang.<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Enum.html?is-external=true" title="class or interface in java.lang"><span class="typeNameLink">Enum</span></a>&lt;E&gt; (implements java.lang.<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Comparable.html?is-external=true" title="class or interface in java.lang">Comparable</a>&lt;T&gt;, java.io.<a href="https://docs.oracle.com/javase/8/docs/api/java/io/Serializable.html?is-external=true" title="class or interface in java.io">Serializable</a>)
 <ul>
+<li type="circle">org.apache.hadoop.hbase.security.<a href="../../../../../org/apache/hadoop/hbase/security/SaslUtil.QualityOfProtection.html" title="enum in org.apache.hadoop.hbase.security"><span class="typeNameLink">SaslUtil.QualityOfProtection</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.security.<a href="../../../../../org/apache/hadoop/hbase/security/AuthMethod.html" title="enum in org.apache.hadoop.hbase.security"><span class="typeNameLink">AuthMethod</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.security.<a href="../../../../../org/apache/hadoop/hbase/security/SaslStatus.html" title="enum in org.apache.hadoop.hbase.security"><span class="typeNameLink">SaslStatus</span></a></li>
-<li type="circle">org.apache.hadoop.hbase.security.<a href="../../../../../org/apache/hadoop/hbase/security/SaslUtil.QualityOfProtection.html" title="enum in org.apache.hadoop.hbase.security"><span class="typeNameLink">SaslUtil.QualityOfProtection</span></a></li>
 </ul>
 </li>
 </ul>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/621479e1/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 272b207..41c2191 100644
--- a/devapidocs/org/apache/hadoop/hbase/thrift/package-tree.html
+++ b/devapidocs/org/apache/hadoop/hbase/thrift/package-tree.html
@@ -198,9 +198,9 @@
 <ul>
 <li type="circle">java.lang.<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Enum.html?is-external=true" title="class or interface in java.lang"><span class="typeNameLink">Enum</span></a>&lt;E&gt; (implements java.lang.<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Comparable.html?is-external=true" title="class or interface in java.lang">Comparable</a>&lt;T&gt;, java.io.<a href="https://docs.oracle.com/javase/8/docs/api/java/io/Serializable.html?is-external=true" title="class or interface in java.io">Serializable</a>)
 <ul>
+<li type="circle">org.apache.hadoop.hbase.thrift.<a href="../../../../../org/apache/hadoop/hbase/thrift/MetricsThriftServerSourceFactoryImpl.FactoryStorage.html" title="enum in org.apache.hadoop.hbase.thrift"><span class="typeNameLink">MetricsThriftServerSourceFactoryImpl.FactoryStorage</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.thrift.<a href="../../../../../org/apache/hadoop/hbase/thrift/ThriftMetrics.ThriftServerType.html" title="enum in org.apache.hadoop.hbase.thrift"><span class="typeNameLink">ThriftMetrics.ThriftServerType</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.thrift.<a href="../../../../../org/apache/hadoop/hbase/thrift/ThriftServerRunner.ImplType.html" title="enum in org.apache.hadoop.hbase.thrift"><span class="typeNameLink">ThriftServerRunner.ImplType</span></a></li>
-<li type="circle">org.apache.hadoop.hbase.thrift.<a href="../../../../../org/apache/hadoop/hbase/thrift/MetricsThriftServerSourceFactoryImpl.FactoryStorage.html" title="enum in org.apache.hadoop.hbase.thrift"><span class="typeNameLink">MetricsThriftServerSourceFactoryImpl.FactoryStorage</span></a></li>
 </ul>
 </li>
 </ul>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/621479e1/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 2b33b03..bcc5862 100644
--- a/devapidocs/org/apache/hadoop/hbase/util/package-tree.html
+++ b/devapidocs/org/apache/hadoop/hbase/util/package-tree.html
@@ -533,13 +533,13 @@
 <li type="circle">java.lang.<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Enum.html?is-external=true" title="class or interface in java.lang"><span class="typeNameLink">Enum</span></a>&lt;E&gt; (implements java.lang.<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Comparable.html?is-external=true" title="class or interface in java.lang">Comparable</a>&lt;T&gt;, java.io.<a href="https://docs.oracle.com/javase/8/docs/api/java/io/Serializable.html?is-external=true" title="class or interface in java.io">Serializable</a>)
 <ul>
 <li type="circle">org.apache.hadoop.hbase.util.<a href="../../../../../org/apache/hadoop/hbase/util/Order.html" title="enum in org.apache.hadoop.hbase.util"><span class="typeNameLink">Order</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.util.<a href="../../../../../org/apache/hadoop/hbase/util/Bytes.LexicographicalComparerHolder.PureJavaComparer.html" title="enum in org.apache.hadoop.hbase.util"><span class="typeNameLink">Bytes.LexicographicalComparerHolder.PureJavaComparer</span></a> (implements org.apache.hadoop.hbase.util.<a href="../../../../../org/apache/hadoop/hbase/util/Bytes.Comparer.html" title="interface in org.apache.hadoop.hbase.util">Bytes.Comparer</a>&lt;T&gt;)</li>
 <li type="circle">org.apache.hadoop.hbase.util.<a href="../../../../../org/apache/hadoop/hbase/util/PoolMap.PoolType.html" title="enum in org.apache.hadoop.hbase.util"><span class="typeNameLink">PoolMap.PoolType</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.util.<a href="../../../../../org/apache/hadoop/hbase/util/Bytes.LexicographicalComparerHolder.UnsafeComparer.html" title="enum in org.apache.hadoop.hbase.util"><span class="typeNameLink">Bytes.LexicographicalComparerHolder.UnsafeComparer</span></a> (implements org.apache.hadoop.hbase.util.<a href="../../../../../org/apache/hadoop/hbase/util/Bytes.Comparer.html" title="interface in org.apache.hadoop.hbase.util">Bytes.Comparer</a>&lt;T&gt;)</li>
+<li type="circle">org.apache.hadoop.hbase.util.<a href="../../../../../org/apache/hadoop/hbase/util/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/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/Bytes.LexicographicalComparerHolder.PureJavaComparer.html" title="enum in org.apache.hadoop.hbase.util"><span class="typeNameLink">Bytes.LexicographicalComparerHolder.PureJavaComparer</span></a> (implements org.apache.hadoop.hbase.util.<a href="../../../../../org/apache/hadoop/hbase/util/Bytes.Comparer.html" title="interface in org.apache.hadoop.hbase.util">Bytes.Comparer</a>&lt;T&gt;)</li>
 <li type="circle">org.apache.hadoop.hbase.util.<a href="../../../../../org/apache/hadoop/hbase/util/ChecksumType.html" title="enum in org.apache.hadoop.hbase.util"><span class="typeNameLink">ChecksumType</span></a></li>
-<li type="circle">org.apache.hadoop.hbase.util.<a href="../../../../../org/apache/hadoop/hbase/util/PrettyPrinter.Unit.html" title="enum in org.apache.hadoop.hbase.util"><span class="typeNameLink">PrettyPrinter.Unit</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.util.<a href="../../../../../org/apache/hadoop/hbase/util/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>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/621479e1/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 0dfeb21..bcc16b3 100644
--- a/devapidocs/src-html/org/apache/hadoop/hbase/Version.html
+++ b/devapidocs/src-html/org/apache/hadoop/hbase/Version.html
@@ -16,11 +16,11 @@
 <span class="sourceLineNo">008</span>@InterfaceAudience.Private<a name="line.8"></a>
 <span class="sourceLineNo">009</span>public class Version {<a name="line.9"></a>
 <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 = "f3d1c021de2264301f68eadb9ef126ff83d7ef53";<a name="line.11"></a>
+<span class="sourceLineNo">011</span>  public static final String revision = "477f9fdb32873387231c5fbbff130ba8bf7b5d68";<a name="line.11"></a>
 <span class="sourceLineNo">012</span>  public static final String user = "jenkins";<a name="line.12"></a>
-<span class="sourceLineNo">013</span>  public static final String date = "Thu May 24 14:39:22 UTC 2018";<a name="line.13"></a>
+<span class="sourceLineNo">013</span>  public static final String date = "Fri May 25 14:39: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 = "9cf2b1576b925f830d9095fedcae0329";<a name="line.15"></a>
+<span class="sourceLineNo">015</span>  public static final String srcChecksum = "6a21d52e1de7c6466666266ba63ff96d";<a name="line.15"></a>
 <span class="sourceLineNo">016</span>}<a name="line.16"></a>
 
 


[27/29] hbase-site git commit: Published site at 477f9fdb32873387231c5fbbff130ba8bf7b5d68.

Posted by gi...@apache.org.
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/621479e1/book.html
----------------------------------------------------------------------
diff --git a/book.html b/book.html
index 185f280..10f8274 100644
--- a/book.html
+++ b/book.html
@@ -30063,7 +30063,88 @@ before you start moving out the dead. Move in good live nodes first if you have
 </div>
 </div>
 <div class="sect2">
-<h3 id="_acl"><a class="anchor" href="#_acl"></a>158.3. ACL</h3>
+<h3 id="_remove_regionserver_grouping"><a class="anchor" href="#_remove_regionserver_grouping"></a>158.3. Remove RegionServer Grouping</h3>
+<div class="paragraph">
+<p>Removing RegionServer Grouping feature from a cluster on which it was enabled involves
+more steps in addition to removing the relevant properties from <code>hbase-site.xml</code>. This is
+to clean the RegionServer grouping related meta data so that if the feature is re-enabled
+in the future, the old meta data will not affect the functioning of the cluster.</p>
+</div>
+<div class="ulist">
+<ul>
+<li>
+<p>Move all tables in non-default rsgroups to <code>default</code> regionserver group</p>
+</li>
+</ul>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre>#Reassigning table t1 from non default group - hbase shell
+hbase(main):005:0&gt; move_tables_rsgroup 'default',['t1']</pre>
+</div>
+</div>
+<div class="ulist">
+<ul>
+<li>
+<p>Move all regionservers in non-default rsgroups to <code>default</code> regionserver group</p>
+</li>
+</ul>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre>#Reassigning all the servers in the non-default rsgroup to default - hbase shell
+hbase(main):008:0&gt; move_servers_rsgroup 'default',['rs1.xxx.com:16206','rs2.xxx.com:16202','rs3.xxx.com:16204']</pre>
+</div>
+</div>
+<div class="ulist">
+<ul>
+<li>
+<p>Remove all non-default rsgroups. <code>default</code> rsgroup created implicitly doesn&#8217;t have to be removed</p>
+</li>
+</ul>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre>#removing non default rsgroup - hbase shell
+hbase(main):009:0&gt; remove_rsgroup 'group2'</pre>
+</div>
+</div>
+<div class="ulist">
+<ul>
+<li>
+<p>Remove the changes made in <code>hbase-site.xml</code> and restart the cluster</p>
+</li>
+<li>
+<p>Drop the table <code>hbase:rsgroup</code> from <code>hbase</code></p>
+</li>
+</ul>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre>#Through hbase shell drop table hbase:rsgroup
+hbase(main):001:0&gt; disable 'hbase:rsgroup'
+0 row(s) in 2.6270 seconds
+
+hbase(main):002:0&gt; drop 'hbase:rsgroup'
+0 row(s) in 1.2730 seconds</pre>
+</div>
+</div>
+<div class="ulist">
+<ul>
+<li>
+<p>Remove znode <code>rsgroup</code> from the cluster ZooKeeper using zkCli.sh</p>
+</li>
+</ul>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre>#From ZK remove the node /hbase/rsgroup through zkCli.sh
+rmr /hbase/rsgroup</pre>
+</div>
+</div>
+</div>
+<div class="sect2">
+<h3 id="_acl"><a class="anchor" href="#_acl"></a>158.4. ACL</h3>
 <div class="paragraph">
 <p>To enable ACL, add the following to your hbase-site.xml and restart your Master:</p>
 </div>
@@ -36539,7 +36620,7 @@ Options:
                               LZ4]
  -data_block_encoding &lt;arg&gt;   Encoding algorithm (e.g. prefix compression) to
                               use for data blocks in the test column family, one
-                              of [NONE, PREFIX, DIFF, FAST_DIFF, PREFIX_TREE].
+                              of [NONE, PREFIX, DIFF, FAST_DIFF, ROW_INDEX_V1].
  -encryption &lt;arg&gt;            Enables transparent encryption on the test table,
                               one of [AES]
  -generator &lt;arg&gt;             The class which generates load for the tool. Any
@@ -37873,7 +37954,7 @@ The server will return cellblocks compressed using this same compressor as long
 <div id="footer">
 <div id="footer-text">
 Version 3.0.0-SNAPSHOT<br>
-Last updated 2018-05-24 14:29:53 UTC
+Last updated 2018-05-25 14:29:53 UTC
 </div>
 </div>
 </body>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/621479e1/bulk-loads.html
----------------------------------------------------------------------
diff --git a/bulk-loads.html b/bulk-loads.html
index c12251a..5cbb1f1 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="20180524" />
+    <meta name="Date-Revision-yyyymmdd" content="20180525" />
     <meta http-equiv="Content-Language" content="en" />
     <title>Apache HBase &#x2013;  
       Bulk Loads in Apache HBase (TM)
@@ -306,7 +306,7 @@ under the License. -->
                         <a href="https://www.apache.org/">The Apache Software Foundation</a>.
             All rights reserved.      
                     
-                  <li id="publishDate" class="pull-right">Last Published: 2018-05-24</li>
+                  <li id="publishDate" class="pull-right">Last Published: 2018-05-25</li>
             </p>
                 </div>
 


[03/29] hbase-site git commit: Published site at 477f9fdb32873387231c5fbbff130ba8bf7b5d68.

Posted by gi...@apache.org.
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/621479e1/testdevapidocs/org/apache/hadoop/hbase/quotas/TestSpaceQuotas.html
----------------------------------------------------------------------
diff --git a/testdevapidocs/org/apache/hadoop/hbase/quotas/TestSpaceQuotas.html b/testdevapidocs/org/apache/hadoop/hbase/quotas/TestSpaceQuotas.html
index d9f617d..8a96d4e 100644
--- a/testdevapidocs/org/apache/hadoop/hbase/quotas/TestSpaceQuotas.html
+++ b/testdevapidocs/org/apache/hadoop/hbase/quotas/TestSpaceQuotas.html
@@ -18,7 +18,7 @@
     catch(err) {
     }
 //-->
-var methods = {"i0":10,"i1":10,"i2":9,"i3":9,"i4":10,"i5":10,"i6":10,"i7":10,"i8":10,"i9":10,"i10":10,"i11":10,"i12":10,"i13":10,"i14":10,"i15":10,"i16":10,"i17":10,"i18":10,"i19":10};
+var methods = {"i0":10,"i1":10,"i2":10,"i3":10,"i4":10,"i5":10,"i6":10,"i7":10,"i8":9,"i9":9,"i10":10,"i11":10,"i12":10,"i13":10,"i14":10,"i15":10,"i16":10,"i17":10,"i18":10,"i19":10,"i20":10,"i21":10,"i22":10,"i23":10,"i24":10,"i25":10,"i26":10,"i27":10,"i28":10,"i29":10,"i30":10,"i31":10,"i32":10,"i33":10,"i34":10,"i35":10,"i36":10,"i37":10,"i38":10,"i39":10,"i40":10};
 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/quotas/TestSpaceQuotas.html#line.75">TestSpaceQuotas</a>
+<pre>public class <a href="../../../../../src-html/org/apache/hadoop/hbase/quotas/TestSpaceQuotas.html#line.76">TestSpaceQuotas</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">End-to-end test class for filesystem space quotas.</div>
 </li>
@@ -195,80 +195,167 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/quotas/TestSpaceQuotas.html#getReportedSizesForTable-org.apache.hadoop.hbase.TableName-">getReportedSizesForTable</a></span>(org.apache.hadoop.hbase.TableName&nbsp;tn)</code>&nbsp;</td>
 </tr>
 <tr id="i1" class="rowColor">
+<td class="colFirst"><code>private void</code></td>
+<td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/quotas/TestSpaceQuotas.html#increaseQuotaLimit-org.apache.hadoop.hbase.TableName-org.apache.hadoop.hbase.quotas.SpaceViolationPolicy-">increaseQuotaLimit</a></span>(org.apache.hadoop.hbase.TableName&nbsp;tn,
+                  org.apache.hadoop.hbase.quotas.SpaceViolationPolicy&nbsp;policy)</code>&nbsp;</td>
+</tr>
+<tr id="i2" class="altColor">
 <td class="colFirst"><code>void</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/quotas/TestSpaceQuotas.html#removeAllQuotas--">removeAllQuotas</a></span>()</code>&nbsp;</td>
 </tr>
-<tr id="i2" class="altColor">
+<tr id="i3" class="rowColor">
+<td class="colFirst"><code>private void</code></td>
+<td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/quotas/TestSpaceQuotas.html#removeQuotaFromtable-org.apache.hadoop.hbase.TableName-">removeQuotaFromtable</a></span>(org.apache.hadoop.hbase.TableName&nbsp;tn)</code>&nbsp;</td>
+</tr>
+<tr id="i4" class="altColor">
+<td class="colFirst"><code>private void</code></td>
+<td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/quotas/TestSpaceQuotas.html#setQuotaAndThenDropTable-org.apache.hadoop.hbase.quotas.SpaceViolationPolicy-">setQuotaAndThenDropTable</a></span>(org.apache.hadoop.hbase.quotas.SpaceViolationPolicy&nbsp;policy)</code>&nbsp;</td>
+</tr>
+<tr id="i5" class="rowColor">
+<td class="colFirst"><code>private void</code></td>
+<td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/quotas/TestSpaceQuotas.html#setQuotaAndThenIncreaseQuota-org.apache.hadoop.hbase.quotas.SpaceViolationPolicy-">setQuotaAndThenIncreaseQuota</a></span>(org.apache.hadoop.hbase.quotas.SpaceViolationPolicy&nbsp;policy)</code>&nbsp;</td>
+</tr>
+<tr id="i6" class="altColor">
+<td class="colFirst"><code>private void</code></td>
+<td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/quotas/TestSpaceQuotas.html#setQuotaAndThenRemove-org.apache.hadoop.hbase.quotas.SpaceViolationPolicy-">setQuotaAndThenRemove</a></span>(org.apache.hadoop.hbase.quotas.SpaceViolationPolicy&nbsp;policy)</code>&nbsp;</td>
+</tr>
+<tr id="i7" class="rowColor">
+<td class="colFirst"><code>void</code></td>
+<td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/quotas/TestSpaceQuotas.html#setQuotaAndThenRemoveInOneAmongTwoTables-org.apache.hadoop.hbase.quotas.SpaceViolationPolicy-">setQuotaAndThenRemoveInOneAmongTwoTables</a></span>(org.apache.hadoop.hbase.quotas.SpaceViolationPolicy&nbsp;policy)</code>&nbsp;</td>
+</tr>
+<tr id="i8" class="altColor">
 <td class="colFirst"><code>static void</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/quotas/TestSpaceQuotas.html#setUp--">setUp</a></span>()</code>&nbsp;</td>
 </tr>
-<tr id="i3" class="rowColor">
+<tr id="i9" class="rowColor">
 <td class="colFirst"><code>static void</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/quotas/TestSpaceQuotas.html#tearDown--">tearDown</a></span>()</code>&nbsp;</td>
 </tr>
-<tr id="i4" class="altColor">
+<tr id="i10" class="altColor">
 <td class="colFirst"><code>void</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/quotas/TestSpaceQuotas.html#testAtomicBulkLoadUnderQuota--">testAtomicBulkLoadUnderQuota</a></span>()</code>&nbsp;</td>
 </tr>
-<tr id="i5" class="rowColor">
+<tr id="i11" class="rowColor">
 <td class="colFirst"><code>void</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/quotas/TestSpaceQuotas.html#testDeletesAfterNoInserts--">testDeletesAfterNoInserts</a></span>()</code>&nbsp;</td>
 </tr>
-<tr id="i6" class="altColor">
+<tr id="i12" class="altColor">
 <td class="colFirst"><code>void</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/quotas/TestSpaceQuotas.html#testNoBulkLoadsWithNoWrites--">testNoBulkLoadsWithNoWrites</a></span>()</code>&nbsp;</td>
 </tr>
-<tr id="i7" class="rowColor">
+<tr id="i13" class="rowColor">
 <td class="colFirst"><code>void</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/quotas/TestSpaceQuotas.html#testNoCompactions--">testNoCompactions</a></span>()</code>&nbsp;</td>
 </tr>
-<tr id="i8" class="altColor">
+<tr id="i14" class="altColor">
 <td class="colFirst"><code>void</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/quotas/TestSpaceQuotas.html#testNoEnableAfterDisablePolicy--">testNoEnableAfterDisablePolicy</a></span>()</code>&nbsp;</td>
 </tr>
-<tr id="i9" class="rowColor">
+<tr id="i15" class="rowColor">
 <td class="colFirst"><code>void</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/quotas/TestSpaceQuotas.html#testNoInsertsWithAppend--">testNoInsertsWithAppend</a></span>()</code>&nbsp;</td>
 </tr>
-<tr id="i10" class="altColor">
+<tr id="i16" class="altColor">
 <td class="colFirst"><code>void</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/quotas/TestSpaceQuotas.html#testNoInsertsWithIncrement--">testNoInsertsWithIncrement</a></span>()</code>&nbsp;</td>
 </tr>
-<tr id="i11" class="rowColor">
+<tr id="i17" class="rowColor">
 <td class="colFirst"><code>void</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/quotas/TestSpaceQuotas.html#testNoInsertsWithPut--">testNoInsertsWithPut</a></span>()</code>&nbsp;</td>
 </tr>
-<tr id="i12" class="altColor">
+<tr id="i18" class="altColor">
 <td class="colFirst"><code>void</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/quotas/TestSpaceQuotas.html#testNoWritesWithAppend--">testNoWritesWithAppend</a></span>()</code>&nbsp;</td>
 </tr>
-<tr id="i13" class="rowColor">
+<tr id="i19" class="rowColor">
 <td class="colFirst"><code>void</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/quotas/TestSpaceQuotas.html#testNoWritesWithDelete--">testNoWritesWithDelete</a></span>()</code>&nbsp;</td>
 </tr>
-<tr id="i14" class="altColor">
+<tr id="i20" class="altColor">
 <td class="colFirst"><code>void</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/quotas/TestSpaceQuotas.html#testNoWritesWithIncrement--">testNoWritesWithIncrement</a></span>()</code>&nbsp;</td>
 </tr>
-<tr id="i15" class="rowColor">
+<tr id="i21" class="rowColor">
 <td class="colFirst"><code>void</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/quotas/TestSpaceQuotas.html#testNoWritesWithPut--">testNoWritesWithPut</a></span>()</code>&nbsp;</td>
 </tr>
-<tr id="i16" class="altColor">
+<tr id="i22" class="altColor">
+<td class="colFirst"><code>void</code></td>
+<td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/quotas/TestSpaceQuotas.html#testSetQuotaAndThenDropTableeWithNoWritesCompactions--">testSetQuotaAndThenDropTableeWithNoWritesCompactions</a></span>()</code>&nbsp;</td>
+</tr>
+<tr id="i23" class="rowColor">
+<td class="colFirst"><code>void</code></td>
+<td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/quotas/TestSpaceQuotas.html#testSetQuotaAndThenDropTableWithNoInserts--">testSetQuotaAndThenDropTableWithNoInserts</a></span>()</code>&nbsp;</td>
+</tr>
+<tr id="i24" class="altColor">
+<td class="colFirst"><code>void</code></td>
+<td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/quotas/TestSpaceQuotas.html#testSetQuotaAndThenDropTableWithNoWrite--">testSetQuotaAndThenDropTableWithNoWrite</a></span>()</code>&nbsp;</td>
+</tr>
+<tr id="i25" class="rowColor">
+<td class="colFirst"><code>void</code></td>
+<td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/quotas/TestSpaceQuotas.html#testSetQuotaAndThenIncreaseQuotaWithNoInserts--">testSetQuotaAndThenIncreaseQuotaWithNoInserts</a></span>()</code>&nbsp;</td>
+</tr>
+<tr id="i26" class="altColor">
+<td class="colFirst"><code>void</code></td>
+<td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/quotas/TestSpaceQuotas.html#testSetQuotaAndThenIncreaseQuotaWithNoWrite--">testSetQuotaAndThenIncreaseQuotaWithNoWrite</a></span>()</code>&nbsp;</td>
+</tr>
+<tr id="i27" class="rowColor">
+<td class="colFirst"><code>void</code></td>
+<td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/quotas/TestSpaceQuotas.html#testSetQuotaAndThenIncreaseQuotaWithNoWritesCompactions--">testSetQuotaAndThenIncreaseQuotaWithNoWritesCompactions</a></span>()</code>&nbsp;</td>
+</tr>
+<tr id="i28" class="altColor">
+<td class="colFirst"><code>void</code></td>
+<td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/quotas/TestSpaceQuotas.html#testSetQuotaAndThenRemoveInOneWithDisable--">testSetQuotaAndThenRemoveInOneWithDisable</a></span>()</code>&nbsp;</td>
+</tr>
+<tr id="i29" class="rowColor">
+<td class="colFirst"><code>void</code></td>
+<td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/quotas/TestSpaceQuotas.html#testSetQuotaAndThenRemoveInOneWithNoInserts--">testSetQuotaAndThenRemoveInOneWithNoInserts</a></span>()</code>&nbsp;</td>
+</tr>
+<tr id="i30" class="altColor">
+<td class="colFirst"><code>void</code></td>
+<td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/quotas/TestSpaceQuotas.html#testSetQuotaAndThenRemoveInOneWithNoWrite--">testSetQuotaAndThenRemoveInOneWithNoWrite</a></span>()</code>&nbsp;</td>
+</tr>
+<tr id="i31" class="rowColor">
+<td class="colFirst"><code>void</code></td>
+<td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/quotas/TestSpaceQuotas.html#testSetQuotaAndThenRemoveInOneWithNoWritesCompaction--">testSetQuotaAndThenRemoveInOneWithNoWritesCompaction</a></span>()</code>&nbsp;</td>
+</tr>
+<tr id="i32" class="altColor">
+<td class="colFirst"><code>void</code></td>
+<td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/quotas/TestSpaceQuotas.html#testSetQuotaAndThenRemoveWithDisable--">testSetQuotaAndThenRemoveWithDisable</a></span>()</code>&nbsp;</td>
+</tr>
+<tr id="i33" class="rowColor">
+<td class="colFirst"><code>void</code></td>
+<td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/quotas/TestSpaceQuotas.html#testSetQuotaAndThenRemoveWithNoInserts--">testSetQuotaAndThenRemoveWithNoInserts</a></span>()</code>&nbsp;</td>
+</tr>
+<tr id="i34" class="altColor">
+<td class="colFirst"><code>void</code></td>
+<td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/quotas/TestSpaceQuotas.html#testSetQuotaAndThenRemoveWithNoWrite--">testSetQuotaAndThenRemoveWithNoWrite</a></span>()</code>&nbsp;</td>
+</tr>
+<tr id="i35" class="rowColor">
+<td class="colFirst"><code>void</code></td>
+<td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/quotas/TestSpaceQuotas.html#testSetQuotaAndThenRemoveWithNoWritesCompactions--">testSetQuotaAndThenRemoveWithNoWritesCompactions</a></span>()</code>&nbsp;</td>
+</tr>
+<tr id="i36" class="altColor">
 <td class="colFirst"><code>void</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/quotas/TestSpaceQuotas.html#testTableQuotaOverridesNamespaceQuota--">testTableQuotaOverridesNamespaceQuota</a></span>()</code>&nbsp;</td>
 </tr>
-<tr id="i17" class="rowColor">
+<tr id="i37" class="rowColor">
+<td class="colFirst"><code>private void</code></td>
+<td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/quotas/TestSpaceQuotas.html#verifyNoViolation-org.apache.hadoop.hbase.quotas.SpaceViolationPolicy-org.apache.hadoop.hbase.TableName-org.apache.hadoop.hbase.client.Mutation-">verifyNoViolation</a></span>(org.apache.hadoop.hbase.quotas.SpaceViolationPolicy&nbsp;policyToViolate,
+                 org.apache.hadoop.hbase.TableName&nbsp;tn,
+                 org.apache.hadoop.hbase.client.Mutation&nbsp;m)</code>&nbsp;</td>
+</tr>
+<tr id="i38" class="altColor">
 <td class="colFirst"><code>private void</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/quotas/TestSpaceQuotas.html#verifyViolation-org.apache.hadoop.hbase.quotas.SpaceViolationPolicy-org.apache.hadoop.hbase.TableName-org.apache.hadoop.hbase.client.Mutation-">verifyViolation</a></span>(org.apache.hadoop.hbase.quotas.SpaceViolationPolicy&nbsp;policyToViolate,
                org.apache.hadoop.hbase.TableName&nbsp;tn,
                org.apache.hadoop.hbase.client.Mutation&nbsp;m)</code>&nbsp;</td>
 </tr>
-<tr id="i18" class="altColor">
+<tr id="i39" class="rowColor">
 <td class="colFirst"><code>private org.apache.hadoop.hbase.TableName</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/quotas/TestSpaceQuotas.html#writeUntilViolation-org.apache.hadoop.hbase.quotas.SpaceViolationPolicy-">writeUntilViolation</a></span>(org.apache.hadoop.hbase.quotas.SpaceViolationPolicy&nbsp;policyToViolate)</code>&nbsp;</td>
 </tr>
-<tr id="i19" class="rowColor">
+<tr id="i40" class="altColor">
 <td class="colFirst"><code>private org.apache.hadoop.hbase.TableName</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/quotas/TestSpaceQuotas.html#writeUntilViolationAndVerifyViolation-org.apache.hadoop.hbase.quotas.SpaceViolationPolicy-org.apache.hadoop.hbase.client.Mutation-">writeUntilViolationAndVerifyViolation</a></span>(org.apache.hadoop.hbase.quotas.SpaceViolationPolicy&nbsp;policyToViolate,
                                      org.apache.hadoop.hbase.client.Mutation&nbsp;m)</code>&nbsp;</td>
@@ -301,7 +388,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>CLASS_RULE</h4>
-<pre>public static final&nbsp;<a href="../../../../../org/apache/hadoop/hbase/HBaseClassTestRule.html" title="class in org.apache.hadoop.hbase">HBaseClassTestRule</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/quotas/TestSpaceQuotas.html#line.78">CLASS_RULE</a></pre>
+<pre>public static final&nbsp;<a href="../../../../../org/apache/hadoop/hbase/HBaseClassTestRule.html" title="class in org.apache.hadoop.hbase">HBaseClassTestRule</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/quotas/TestSpaceQuotas.html#line.79">CLASS_RULE</a></pre>
 </li>
 </ul>
 <a name="LOG">
@@ -310,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>LOG</h4>
-<pre>private static final&nbsp;org.slf4j.Logger <a href="../../../../../src-html/org/apache/hadoop/hbase/quotas/TestSpaceQuotas.html#line.81">LOG</a></pre>
+<pre>private static final&nbsp;org.slf4j.Logger <a href="../../../../../src-html/org/apache/hadoop/hbase/quotas/TestSpaceQuotas.html#line.82">LOG</a></pre>
 </li>
 </ul>
 <a name="TEST_UTIL">
@@ -319,7 +406,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>TEST_UTIL</h4>
-<pre>private static final&nbsp;<a href="../../../../../org/apache/hadoop/hbase/HBaseTestingUtility.html" title="class in org.apache.hadoop.hbase">HBaseTestingUtility</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/quotas/TestSpaceQuotas.html#line.82">TEST_UTIL</a></pre>
+<pre>private static final&nbsp;<a href="../../../../../org/apache/hadoop/hbase/HBaseTestingUtility.html" title="class in org.apache.hadoop.hbase">HBaseTestingUtility</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/quotas/TestSpaceQuotas.html#line.83">TEST_UTIL</a></pre>
 </li>
 </ul>
 <a name="COUNTER">
@@ -328,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>COUNTER</h4>
-<pre>private static final&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/util/concurrent/atomic/AtomicLong.html?is-external=true" title="class or interface in java.util.concurrent.atomic">AtomicLong</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/quotas/TestSpaceQuotas.html#line.84">COUNTER</a></pre>
+<pre>private static final&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/util/concurrent/atomic/AtomicLong.html?is-external=true" title="class or interface in java.util.concurrent.atomic">AtomicLong</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/quotas/TestSpaceQuotas.html#line.85">COUNTER</a></pre>
 </li>
 </ul>
 <a name="NUM_RETRIES">
@@ -337,7 +424,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>NUM_RETRIES</h4>
-<pre>private static final&nbsp;int <a href="../../../../../src-html/org/apache/hadoop/hbase/quotas/TestSpaceQuotas.html#line.85">NUM_RETRIES</a></pre>
+<pre>private static final&nbsp;int <a href="../../../../../src-html/org/apache/hadoop/hbase/quotas/TestSpaceQuotas.html#line.86">NUM_RETRIES</a></pre>
 <dl>
 <dt><span class="seeLabel">See Also:</span></dt>
 <dd><a href="../../../../../constant-values.html#org.apache.hadoop.hbase.quotas.TestSpaceQuotas.NUM_RETRIES">Constant Field Values</a></dd>
@@ -350,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>testName</h4>
-<pre>public&nbsp;org.junit.rules.TestName <a href="../../../../../src-html/org/apache/hadoop/hbase/quotas/TestSpaceQuotas.html#line.88">testName</a></pre>
+<pre>public&nbsp;org.junit.rules.TestName <a href="../../../../../src-html/org/apache/hadoop/hbase/quotas/TestSpaceQuotas.html#line.89">testName</a></pre>
 </li>
 </ul>
 <a name="helper">
@@ -359,7 +446,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockListLast">
 <li class="blockList">
 <h4>helper</h4>
-<pre>private&nbsp;<a href="../../../../../org/apache/hadoop/hbase/quotas/SpaceQuotaHelperForTests.html" title="class in org.apache.hadoop.hbase.quotas">SpaceQuotaHelperForTests</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/quotas/TestSpaceQuotas.html#line.89">helper</a></pre>
+<pre>private&nbsp;<a href="../../../../../org/apache/hadoop/hbase/quotas/SpaceQuotaHelperForTests.html" title="class in org.apache.hadoop.hbase.quotas">SpaceQuotaHelperForTests</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/quotas/TestSpaceQuotas.html#line.90">helper</a></pre>
 </li>
 </ul>
 </li>
@@ -376,7 +463,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockListLast">
 <li class="blockList">
 <h4>TestSpaceQuotas</h4>
-<pre>public&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/quotas/TestSpaceQuotas.html#line.75">TestSpaceQuotas</a>()</pre>
+<pre>public&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/quotas/TestSpaceQuotas.html#line.76">TestSpaceQuotas</a>()</pre>
 </li>
 </ul>
 </li>
@@ -393,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>setUp</h4>
-<pre>public static&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/quotas/TestSpaceQuotas.html#line.92">setUp</a>()
+<pre>public static&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/quotas/TestSpaceQuotas.html#line.93">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>
@@ -407,7 +494,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>tearDown</h4>
-<pre>public static&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/quotas/TestSpaceQuotas.html#line.99">tearDown</a>()
+<pre>public static&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/quotas/TestSpaceQuotas.html#line.100">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>
@@ -421,7 +508,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>removeAllQuotas</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/quotas/TestSpaceQuotas.html#line.104">removeAllQuotas</a>()
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/quotas/TestSpaceQuotas.html#line.105">removeAllQuotas</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>
@@ -435,7 +522,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>testNoInsertsWithPut</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/quotas/TestSpaceQuotas.html#line.120">testNoInsertsWithPut</a>()
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/quotas/TestSpaceQuotas.html#line.121">testNoInsertsWithPut</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>
@@ -449,7 +536,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>testNoInsertsWithAppend</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/quotas/TestSpaceQuotas.html#line.128">testNoInsertsWithAppend</a>()
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/quotas/TestSpaceQuotas.html#line.129">testNoInsertsWithAppend</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>
@@ -463,7 +550,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>testNoInsertsWithIncrement</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/quotas/TestSpaceQuotas.html#line.136">testNoInsertsWithIncrement</a>()
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/quotas/TestSpaceQuotas.html#line.137">testNoInsertsWithIncrement</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>
@@ -477,7 +564,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>testDeletesAfterNoInserts</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/quotas/TestSpaceQuotas.html#line.143">testDeletesAfterNoInserts</a>()
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/quotas/TestSpaceQuotas.html#line.144">testDeletesAfterNoInserts</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>
@@ -491,7 +578,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>testNoWritesWithPut</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/quotas/TestSpaceQuotas.html#line.156">testNoWritesWithPut</a>()
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/quotas/TestSpaceQuotas.html#line.157">testNoWritesWithPut</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>
@@ -505,7 +592,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>testNoWritesWithAppend</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/quotas/TestSpaceQuotas.html#line.164">testNoWritesWithAppend</a>()
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/quotas/TestSpaceQuotas.html#line.165">testNoWritesWithAppend</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>
@@ -519,7 +606,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>testNoWritesWithIncrement</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/quotas/TestSpaceQuotas.html#line.172">testNoWritesWithIncrement</a>()
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/quotas/TestSpaceQuotas.html#line.173">testNoWritesWithIncrement</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>
@@ -533,7 +620,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>testNoWritesWithDelete</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/quotas/TestSpaceQuotas.html#line.179">testNoWritesWithDelete</a>()
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/quotas/TestSpaceQuotas.html#line.180">testNoWritesWithDelete</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>
@@ -547,7 +634,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>testNoCompactions</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/quotas/TestSpaceQuotas.html#line.185">testNoCompactions</a>()
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/quotas/TestSpaceQuotas.html#line.186">testNoCompactions</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>
@@ -561,7 +648,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>testNoEnableAfterDisablePolicy</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/quotas/TestSpaceQuotas.html#line.210">testNoEnableAfterDisablePolicy</a>()
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/quotas/TestSpaceQuotas.html#line.211">testNoEnableAfterDisablePolicy</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>
@@ -575,7 +662,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>testNoBulkLoadsWithNoWrites</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/quotas/TestSpaceQuotas.html#line.236">testNoBulkLoadsWithNoWrites</a>()
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/quotas/TestSpaceQuotas.html#line.237">testNoBulkLoadsWithNoWrites</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>
@@ -589,7 +676,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>testAtomicBulkLoadUnderQuota</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/quotas/TestSpaceQuotas.html#line.256">testAtomicBulkLoadUnderQuota</a>()
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/quotas/TestSpaceQuotas.html#line.257">testAtomicBulkLoadUnderQuota</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>
@@ -603,7 +690,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>testTableQuotaOverridesNamespaceQuota</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/quotas/TestSpaceQuotas.html#line.327">testTableQuotaOverridesNamespaceQuota</a>()
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/quotas/TestSpaceQuotas.html#line.328">testTableQuotaOverridesNamespaceQuota</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>
@@ -611,13 +698,294 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 </dl>
 </li>
 </ul>
+<a name="testSetQuotaAndThenRemoveWithNoInserts--">
+<!--   -->
+</a>
+<ul class="blockList">
+<li class="blockList">
+<h4>testSetQuotaAndThenRemoveWithNoInserts</h4>
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/quotas/TestSpaceQuotas.html#line.353">testSetQuotaAndThenRemoveWithNoInserts</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="testSetQuotaAndThenRemoveWithNoWrite--">
+<!--   -->
+</a>
+<ul class="blockList">
+<li class="blockList">
+<h4>testSetQuotaAndThenRemoveWithNoWrite</h4>
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/quotas/TestSpaceQuotas.html#line.358">testSetQuotaAndThenRemoveWithNoWrite</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="testSetQuotaAndThenRemoveWithNoWritesCompactions--">
+<!--   -->
+</a>
+<ul class="blockList">
+<li class="blockList">
+<h4>testSetQuotaAndThenRemoveWithNoWritesCompactions</h4>
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/quotas/TestSpaceQuotas.html#line.363">testSetQuotaAndThenRemoveWithNoWritesCompactions</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="testSetQuotaAndThenRemoveWithDisable--">
+<!--   -->
+</a>
+<ul class="blockList">
+<li class="blockList">
+<h4>testSetQuotaAndThenRemoveWithDisable</h4>
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/quotas/TestSpaceQuotas.html#line.368">testSetQuotaAndThenRemoveWithDisable</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="testSetQuotaAndThenDropTableWithNoInserts--">
+<!--   -->
+</a>
+<ul class="blockList">
+<li class="blockList">
+<h4>testSetQuotaAndThenDropTableWithNoInserts</h4>
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/quotas/TestSpaceQuotas.html#line.373">testSetQuotaAndThenDropTableWithNoInserts</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="testSetQuotaAndThenDropTableWithNoWrite--">
+<!--   -->
+</a>
+<ul class="blockList">
+<li class="blockList">
+<h4>testSetQuotaAndThenDropTableWithNoWrite</h4>
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/quotas/TestSpaceQuotas.html#line.378">testSetQuotaAndThenDropTableWithNoWrite</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="testSetQuotaAndThenDropTableeWithNoWritesCompactions--">
+<!--   -->
+</a>
+<ul class="blockList">
+<li class="blockList">
+<h4>testSetQuotaAndThenDropTableeWithNoWritesCompactions</h4>
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/quotas/TestSpaceQuotas.html#line.383">testSetQuotaAndThenDropTableeWithNoWritesCompactions</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="testSetQuotaAndThenIncreaseQuotaWithNoInserts--">
+<!--   -->
+</a>
+<ul class="blockList">
+<li class="blockList">
+<h4>testSetQuotaAndThenIncreaseQuotaWithNoInserts</h4>
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/quotas/TestSpaceQuotas.html#line.388">testSetQuotaAndThenIncreaseQuotaWithNoInserts</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="testSetQuotaAndThenIncreaseQuotaWithNoWrite--">
+<!--   -->
+</a>
+<ul class="blockList">
+<li class="blockList">
+<h4>testSetQuotaAndThenIncreaseQuotaWithNoWrite</h4>
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/quotas/TestSpaceQuotas.html#line.393">testSetQuotaAndThenIncreaseQuotaWithNoWrite</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="testSetQuotaAndThenIncreaseQuotaWithNoWritesCompactions--">
+<!--   -->
+</a>
+<ul class="blockList">
+<li class="blockList">
+<h4>testSetQuotaAndThenIncreaseQuotaWithNoWritesCompactions</h4>
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/quotas/TestSpaceQuotas.html#line.398">testSetQuotaAndThenIncreaseQuotaWithNoWritesCompactions</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="testSetQuotaAndThenRemoveInOneWithNoInserts--">
+<!--   -->
+</a>
+<ul class="blockList">
+<li class="blockList">
+<h4>testSetQuotaAndThenRemoveInOneWithNoInserts</h4>
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/quotas/TestSpaceQuotas.html#line.403">testSetQuotaAndThenRemoveInOneWithNoInserts</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="testSetQuotaAndThenRemoveInOneWithNoWrite--">
+<!--   -->
+</a>
+<ul class="blockList">
+<li class="blockList">
+<h4>testSetQuotaAndThenRemoveInOneWithNoWrite</h4>
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/quotas/TestSpaceQuotas.html#line.408">testSetQuotaAndThenRemoveInOneWithNoWrite</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="testSetQuotaAndThenRemoveInOneWithNoWritesCompaction--">
+<!--   -->
+</a>
+<ul class="blockList">
+<li class="blockList">
+<h4>testSetQuotaAndThenRemoveInOneWithNoWritesCompaction</h4>
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/quotas/TestSpaceQuotas.html#line.413">testSetQuotaAndThenRemoveInOneWithNoWritesCompaction</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="testSetQuotaAndThenRemoveInOneWithDisable--">
+<!--   -->
+</a>
+<ul class="blockList">
+<li class="blockList">
+<h4>testSetQuotaAndThenRemoveInOneWithDisable</h4>
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/quotas/TestSpaceQuotas.html#line.418">testSetQuotaAndThenRemoveInOneWithDisable</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="setQuotaAndThenRemove-org.apache.hadoop.hbase.quotas.SpaceViolationPolicy-">
+<!--   -->
+</a>
+<ul class="blockList">
+<li class="blockList">
+<h4>setQuotaAndThenRemove</h4>
+<pre>private&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/quotas/TestSpaceQuotas.html#line.422">setQuotaAndThenRemove</a>(org.apache.hadoop.hbase.quotas.SpaceViolationPolicy&nbsp;policy)
+                            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="setQuotaAndThenDropTable-org.apache.hadoop.hbase.quotas.SpaceViolationPolicy-">
+<!--   -->
+</a>
+<ul class="blockList">
+<li class="blockList">
+<h4>setQuotaAndThenDropTable</h4>
+<pre>private&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/quotas/TestSpaceQuotas.html#line.437">setQuotaAndThenDropTable</a>(org.apache.hadoop.hbase.quotas.SpaceViolationPolicy&nbsp;policy)
+                               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="setQuotaAndThenIncreaseQuota-org.apache.hadoop.hbase.quotas.SpaceViolationPolicy-">
+<!--   -->
+</a>
+<ul class="blockList">
+<li class="blockList">
+<h4>setQuotaAndThenIncreaseQuota</h4>
+<pre>private&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/quotas/TestSpaceQuotas.html#line.457">setQuotaAndThenIncreaseQuota</a>(org.apache.hadoop.hbase.quotas.SpaceViolationPolicy&nbsp;policy)
+                                   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="setQuotaAndThenRemoveInOneAmongTwoTables-org.apache.hadoop.hbase.quotas.SpaceViolationPolicy-">
+<!--   -->
+</a>
+<ul class="blockList">
+<li class="blockList">
+<h4>setQuotaAndThenRemoveInOneAmongTwoTables</h4>
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/quotas/TestSpaceQuotas.html#line.472">setQuotaAndThenRemoveInOneAmongTwoTables</a>(org.apache.hadoop.hbase.quotas.SpaceViolationPolicy&nbsp;policy)
+                                              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="removeQuotaFromtable-org.apache.hadoop.hbase.TableName-">
+<!--   -->
+</a>
+<ul class="blockList">
+<li class="blockList">
+<h4>removeQuotaFromtable</h4>
+<pre>private&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/quotas/TestSpaceQuotas.html#line.493">removeQuotaFromtable</a>(org.apache.hadoop.hbase.TableName&nbsp;tn)
+                           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="increaseQuotaLimit-org.apache.hadoop.hbase.TableName-org.apache.hadoop.hbase.quotas.SpaceViolationPolicy-">
+<!--   -->
+</a>
+<ul class="blockList">
+<li class="blockList">
+<h4>increaseQuotaLimit</h4>
+<pre>private&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/quotas/TestSpaceQuotas.html#line.499">increaseQuotaLimit</a>(org.apache.hadoop.hbase.TableName&nbsp;tn,
+                                org.apache.hadoop.hbase.quotas.SpaceViolationPolicy&nbsp;policy)
+                         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="getReportedSizesForTable-org.apache.hadoop.hbase.TableName-">
 <!--   -->
 </a>
 <ul class="blockList">
 <li class="blockList">
 <h4>getReportedSizesForTable</h4>
-<pre>private&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/util/Map.html?is-external=true" title="class or interface in java.util">Map</a>&lt;org.apache.hadoop.hbase.client.RegionInfo,<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Long.html?is-external=true" title="class or interface in java.lang">Long</a>&gt;&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/quotas/TestSpaceQuotas.html#line.351">getReportedSizesForTable</a>(org.apache.hadoop.hbase.TableName&nbsp;tn)</pre>
+<pre>private&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/util/Map.html?is-external=true" title="class or interface in java.util">Map</a>&lt;org.apache.hadoop.hbase.client.RegionInfo,<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Long.html?is-external=true" title="class or interface in java.lang">Long</a>&gt;&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/quotas/TestSpaceQuotas.html#line.507">getReportedSizesForTable</a>(org.apache.hadoop.hbase.TableName&nbsp;tn)</pre>
 </li>
 </ul>
 <a name="writeUntilViolation-org.apache.hadoop.hbase.quotas.SpaceViolationPolicy-">
@@ -626,7 +994,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>writeUntilViolation</h4>
-<pre>private&nbsp;org.apache.hadoop.hbase.TableName&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/quotas/TestSpaceQuotas.html#line.363">writeUntilViolation</a>(org.apache.hadoop.hbase.quotas.SpaceViolationPolicy&nbsp;policyToViolate)
+<pre>private&nbsp;org.apache.hadoop.hbase.TableName&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/quotas/TestSpaceQuotas.html#line.519">writeUntilViolation</a>(org.apache.hadoop.hbase.quotas.SpaceViolationPolicy&nbsp;policyToViolate)
                                                        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>
@@ -640,7 +1008,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>writeUntilViolationAndVerifyViolation</h4>
-<pre>private&nbsp;org.apache.hadoop.hbase.TableName&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/quotas/TestSpaceQuotas.html#line.379">writeUntilViolationAndVerifyViolation</a>(org.apache.hadoop.hbase.quotas.SpaceViolationPolicy&nbsp;policyToViolate,
+<pre>private&nbsp;org.apache.hadoop.hbase.TableName&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/quotas/TestSpaceQuotas.html#line.535">writeUntilViolationAndVerifyViolation</a>(org.apache.hadoop.hbase.quotas.SpaceViolationPolicy&nbsp;policyToViolate,
                                                                                 org.apache.hadoop.hbase.client.Mutation&nbsp;m)
                                                                          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>
@@ -652,10 +1020,10 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <a name="verifyViolation-org.apache.hadoop.hbase.quotas.SpaceViolationPolicy-org.apache.hadoop.hbase.TableName-org.apache.hadoop.hbase.client.Mutation-">
 <!--   -->
 </a>
-<ul class="blockListLast">
+<ul class="blockList">
 <li class="blockList">
 <h4>verifyViolation</h4>
-<pre>private&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/quotas/TestSpaceQuotas.html#line.386">verifyViolation</a>(org.apache.hadoop.hbase.quotas.SpaceViolationPolicy&nbsp;policyToViolate,
+<pre>private&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/quotas/TestSpaceQuotas.html#line.542">verifyViolation</a>(org.apache.hadoop.hbase.quotas.SpaceViolationPolicy&nbsp;policyToViolate,
                              org.apache.hadoop.hbase.TableName&nbsp;tn,
                              org.apache.hadoop.hbase.client.Mutation&nbsp;m)
                       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>
@@ -665,6 +1033,22 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 </dl>
 </li>
 </ul>
+<a name="verifyNoViolation-org.apache.hadoop.hbase.quotas.SpaceViolationPolicy-org.apache.hadoop.hbase.TableName-org.apache.hadoop.hbase.client.Mutation-">
+<!--   -->
+</a>
+<ul class="blockListLast">
+<li class="blockList">
+<h4>verifyNoViolation</h4>
+<pre>private&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/quotas/TestSpaceQuotas.html#line.590">verifyNoViolation</a>(org.apache.hadoop.hbase.quotas.SpaceViolationPolicy&nbsp;policyToViolate,
+                               org.apache.hadoop.hbase.TableName&nbsp;tn,
+                               org.apache.hadoop.hbase.client.Mutation&nbsp;m)
+                        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>
 </li>
 </ul>
 </li>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/621479e1/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 1a5d9e6..4fe4623 100644
--- a/testdevapidocs/org/apache/hadoop/hbase/regionserver/package-tree.html
+++ b/testdevapidocs/org/apache/hadoop/hbase/regionserver/package-tree.html
@@ -659,10 +659,10 @@
 <ul>
 <li type="circle">java.lang.<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Enum.html?is-external=true" title="class or interface in java.lang"><span class="typeNameLink">Enum</span></a>&lt;E&gt; (implements java.lang.<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Comparable.html?is-external=true" title="class or interface in java.lang">Comparable</a>&lt;T&gt;, java.io.<a href="https://docs.oracle.com/javase/8/docs/api/java/io/Serializable.html?is-external=true" title="class or interface in java.io">Serializable</a>)
 <ul>
-<li type="circle">org.apache.hadoop.hbase.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/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>
 <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/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/TestMultiLogThreshold.ActionType.html" title="enum in org.apache.hadoop.hbase.regionserver"><span class="typeNameLink">TestMultiLogThreshold.ActionType</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.regionserver.<a href="../../../../../org/apache/hadoop/hbase/regionserver/DataBlockEncodingTool.Manipulation.html" title="enum in org.apache.hadoop.hbase.regionserver"><span class="typeNameLink">DataBlockEncodingTool.Manipulation</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.regionserver.<a href="../../../../../org/apache/hadoop/hbase/regionserver/TestCacheOnWriteInSchema.CacheOnWriteType.html" title="enum in org.apache.hadoop.hbase.regionserver"><span class="typeNameLink">TestCacheOnWriteInSchema.CacheOnWriteType</span></a></li>
 </ul>
 </li>

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

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/621479e1/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 f7d6df6..84112c6 100644
--- a/testdevapidocs/org/apache/hadoop/hbase/wal/package-tree.html
+++ b/testdevapidocs/org/apache/hadoop/hbase/wal/package-tree.html
@@ -139,8 +139,8 @@
 <ul>
 <li type="circle">java.lang.<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Enum.html?is-external=true" title="class or interface in java.lang"><span class="typeNameLink">Enum</span></a>&lt;E&gt; (implements java.lang.<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Comparable.html?is-external=true" title="class or interface in java.lang">Comparable</a>&lt;T&gt;, java.io.<a href="https://docs.oracle.com/javase/8/docs/api/java/io/Serializable.html?is-external=true" title="class or interface in java.io">Serializable</a>)
 <ul>
-<li type="circle">org.apache.hadoop.hbase.wal.<a href="../../../../../org/apache/hadoop/hbase/wal/IOTestProvider.AllowedOperations.html" title="enum in org.apache.hadoop.hbase.wal"><span class="typeNameLink">IOTestProvider.AllowedOperations</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.wal.<a href="../../../../../org/apache/hadoop/hbase/wal/TestWALSplit.Corruptions.html" title="enum in org.apache.hadoop.hbase.wal"><span class="typeNameLink">TestWALSplit.Corruptions</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.wal.<a href="../../../../../org/apache/hadoop/hbase/wal/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/FaultyFSLog.FailureType.html" title="enum in org.apache.hadoop.hbase.wal"><span class="typeNameLink">FaultyFSLog.FailureType</span></a></li>
 </ul>
 </li>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/621479e1/testdevapidocs/overview-tree.html
----------------------------------------------------------------------
diff --git a/testdevapidocs/overview-tree.html b/testdevapidocs/overview-tree.html
index 02d1bf1..e33f261 100644
--- a/testdevapidocs/overview-tree.html
+++ b/testdevapidocs/overview-tree.html
@@ -1738,6 +1738,15 @@
 <li type="circle">org.apache.hadoop.hbase.client.procedure.<a href="org/apache/hadoop/hbase/client/procedure/ShellTestProcedure.html" title="class in org.apache.hadoop.hbase.client.procedure"><span class="typeNameLink">ShellTestProcedure</span></a> (implements org.apache.hadoop.hbase.master.procedure.TableProcedureInterface)</li>
 <li type="circle">org.apache.hadoop.hbase.procedure2.StateMachineProcedure&lt;TEnvironment,TState&gt;
 <ul>
+<li type="circle">org.apache.hadoop.hbase.master.procedure.AbstractStateMachineTableProcedure&lt;TState&gt; (implements org.apache.hadoop.hbase.master.procedure.TableProcedureInterface)
+<ul>
+<li type="circle">org.apache.hadoop.hbase.master.procedure.TruncateTableProcedure
+<ul>
+<li type="circle">org.apache.hadoop.hbase.master.procedure.<a href="org/apache/hadoop/hbase/master/procedure/TestTruncateTableProcedure.TruncateTableProcedureOnHDFSFailure.html" title="class in org.apache.hadoop.hbase.master.procedure"><span class="typeNameLink">TestTruncateTableProcedure.TruncateTableProcedureOnHDFSFailure</span></a></li>
+</ul>
+</li>
+</ul>
+</li>
 <li type="circle">org.apache.hadoop.hbase.procedure2.<a href="org/apache/hadoop/hbase/procedure2/TestProcedureRecovery.TestStateMachineProcedure.html" title="class in org.apache.hadoop.hbase.procedure2"><span class="typeNameLink">TestProcedureRecovery.TestStateMachineProcedure</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.procedure2.<a href="org/apache/hadoop/hbase/procedure2/TestProcedureToString.SimpleStateMachineProcedure.html" title="class in org.apache.hadoop.hbase.procedure2"><span class="typeNameLink">TestProcedureToString.SimpleStateMachineProcedure</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.procedure2.<a href="org/apache/hadoop/hbase/procedure2/TestStateMachineProcedure.TestSMProcedure.html" title="class in org.apache.hadoop.hbase.procedure2"><span class="typeNameLink">TestStateMachineProcedure.TestSMProcedure</span></a></li>


[12/29] hbase-site git commit: Published site at 477f9fdb32873387231c5fbbff130ba8bf7b5d68.

Posted by gi...@apache.org.
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/621479e1/devapidocs/src-html/org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.Cluster.LocalityType.html
----------------------------------------------------------------------
diff --git a/devapidocs/src-html/org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.Cluster.LocalityType.html b/devapidocs/src-html/org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.Cluster.LocalityType.html
index 7f42212..d4bf03c 100644
--- a/devapidocs/src-html/org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.Cluster.LocalityType.html
+++ b/devapidocs/src-html/org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.Cluster.LocalityType.html
@@ -1159,434 +1159,442 @@
 <span class="sourceLineNo">1151</span>    }<a name="line.1151"></a>
 <span class="sourceLineNo">1152</span>  }<a name="line.1152"></a>
 <span class="sourceLineNo">1153</span><a name="line.1153"></a>
-<span class="sourceLineNo">1154</span>  public void setRackManager(RackManager rackManager) {<a name="line.1154"></a>
-<span class="sourceLineNo">1155</span>    this.rackManager = rackManager;<a name="line.1155"></a>
-<span class="sourceLineNo">1156</span>  }<a name="line.1156"></a>
-<span class="sourceLineNo">1157</span><a name="line.1157"></a>
-<span class="sourceLineNo">1158</span>  protected boolean needsBalance(Cluster c) {<a name="line.1158"></a>
-<span class="sourceLineNo">1159</span>    ClusterLoadState cs = new ClusterLoadState(c.clusterState);<a name="line.1159"></a>
-<span class="sourceLineNo">1160</span>    if (cs.getNumServers() &lt; MIN_SERVER_BALANCE) {<a name="line.1160"></a>
-<span class="sourceLineNo">1161</span>      if (LOG.isDebugEnabled()) {<a name="line.1161"></a>
-<span class="sourceLineNo">1162</span>        LOG.debug("Not running balancer because only " + cs.getNumServers()<a name="line.1162"></a>
-<span class="sourceLineNo">1163</span>            + " active regionserver(s)");<a name="line.1163"></a>
-<span class="sourceLineNo">1164</span>      }<a name="line.1164"></a>
-<span class="sourceLineNo">1165</span>      return false;<a name="line.1165"></a>
-<span class="sourceLineNo">1166</span>    }<a name="line.1166"></a>
-<span class="sourceLineNo">1167</span>    if(areSomeRegionReplicasColocated(c)) return true;<a name="line.1167"></a>
-<span class="sourceLineNo">1168</span>    // Check if we even need to do any load balancing<a name="line.1168"></a>
-<span class="sourceLineNo">1169</span>    // HBASE-3681 check sloppiness first<a name="line.1169"></a>
-<span class="sourceLineNo">1170</span>    float average = cs.getLoadAverage(); // for logging<a name="line.1170"></a>
-<span class="sourceLineNo">1171</span>    int floor = (int) Math.floor(average * (1 - slop));<a name="line.1171"></a>
-<span class="sourceLineNo">1172</span>    int ceiling = (int) Math.ceil(average * (1 + slop));<a name="line.1172"></a>
-<span class="sourceLineNo">1173</span>    if (!(cs.getMaxLoad() &gt; ceiling || cs.getMinLoad() &lt; floor)) {<a name="line.1173"></a>
-<span class="sourceLineNo">1174</span>      NavigableMap&lt;ServerAndLoad, List&lt;RegionInfo&gt;&gt; serversByLoad = cs.getServersByLoad();<a name="line.1174"></a>
-<span class="sourceLineNo">1175</span>      if (LOG.isTraceEnabled()) {<a name="line.1175"></a>
-<span class="sourceLineNo">1176</span>        // If nothing to balance, then don't say anything unless trace-level logging.<a name="line.1176"></a>
-<span class="sourceLineNo">1177</span>        LOG.trace("Skipping load balancing because balanced cluster; " +<a name="line.1177"></a>
-<span class="sourceLineNo">1178</span>          "servers=" + cs.getNumServers() +<a name="line.1178"></a>
-<span class="sourceLineNo">1179</span>          " regions=" + cs.getNumRegions() + " average=" + average +<a name="line.1179"></a>
-<span class="sourceLineNo">1180</span>          " mostloaded=" + serversByLoad.lastKey().getLoad() +<a name="line.1180"></a>
-<span class="sourceLineNo">1181</span>          " leastloaded=" + serversByLoad.firstKey().getLoad());<a name="line.1181"></a>
-<span class="sourceLineNo">1182</span>      }<a name="line.1182"></a>
-<span class="sourceLineNo">1183</span>      return false;<a name="line.1183"></a>
-<span class="sourceLineNo">1184</span>    }<a name="line.1184"></a>
-<span class="sourceLineNo">1185</span>    return true;<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>   * Subclasses should implement this to return true if the cluster has nodes that hosts<a name="line.1189"></a>
-<span class="sourceLineNo">1190</span>   * multiple replicas for the same region, or, if there are multiple racks and the same<a name="line.1190"></a>
-<span class="sourceLineNo">1191</span>   * rack hosts replicas of the same region<a name="line.1191"></a>
-<span class="sourceLineNo">1192</span>   * @param c Cluster information<a name="line.1192"></a>
-<span class="sourceLineNo">1193</span>   * @return whether region replicas are currently co-located<a name="line.1193"></a>
-<span class="sourceLineNo">1194</span>   */<a name="line.1194"></a>
-<span class="sourceLineNo">1195</span>  protected boolean areSomeRegionReplicasColocated(Cluster c) {<a name="line.1195"></a>
-<span class="sourceLineNo">1196</span>    return false;<a name="line.1196"></a>
-<span class="sourceLineNo">1197</span>  }<a name="line.1197"></a>
-<span class="sourceLineNo">1198</span><a name="line.1198"></a>
-<span class="sourceLineNo">1199</span>  /**<a name="line.1199"></a>
-<span class="sourceLineNo">1200</span>   * Generates a bulk assignment plan to be used on cluster startup using a<a name="line.1200"></a>
-<span class="sourceLineNo">1201</span>   * simple round-robin assignment.<a name="line.1201"></a>
-<span class="sourceLineNo">1202</span>   * &lt;p&gt;<a name="line.1202"></a>
-<span class="sourceLineNo">1203</span>   * Takes a list of all the regions and all the servers in the cluster and<a name="line.1203"></a>
-<span class="sourceLineNo">1204</span>   * returns a map of each server to the regions that it should be assigned.<a name="line.1204"></a>
-<span class="sourceLineNo">1205</span>   * &lt;p&gt;<a name="line.1205"></a>
-<span class="sourceLineNo">1206</span>   * Currently implemented as a round-robin assignment. Same invariant as load<a name="line.1206"></a>
-<span class="sourceLineNo">1207</span>   * balancing, all servers holding floor(avg) or ceiling(avg).<a name="line.1207"></a>
-<span class="sourceLineNo">1208</span>   *<a name="line.1208"></a>
-<span class="sourceLineNo">1209</span>   * TODO: Use block locations from HDFS to place regions with their blocks<a name="line.1209"></a>
-<span class="sourceLineNo">1210</span>   *<a name="line.1210"></a>
-<span class="sourceLineNo">1211</span>   * @param regions all regions<a name="line.1211"></a>
-<span class="sourceLineNo">1212</span>   * @param servers all servers<a name="line.1212"></a>
-<span class="sourceLineNo">1213</span>   * @return map of server to the regions it should take, or null if no<a name="line.1213"></a>
-<span class="sourceLineNo">1214</span>   *         assignment is possible (ie. no regions or no servers)<a name="line.1214"></a>
-<span class="sourceLineNo">1215</span>   */<a name="line.1215"></a>
-<span class="sourceLineNo">1216</span>  @Override<a name="line.1216"></a>
-<span class="sourceLineNo">1217</span>  public Map&lt;ServerName, List&lt;RegionInfo&gt;&gt; roundRobinAssignment(List&lt;RegionInfo&gt; regions,<a name="line.1217"></a>
-<span class="sourceLineNo">1218</span>      List&lt;ServerName&gt; servers) throws HBaseIOException {<a name="line.1218"></a>
-<span class="sourceLineNo">1219</span>    metricsBalancer.incrMiscInvocations();<a name="line.1219"></a>
-<span class="sourceLineNo">1220</span>    Map&lt;ServerName, List&lt;RegionInfo&gt;&gt; assignments = assignMasterSystemRegions(regions, servers);<a name="line.1220"></a>
-<span class="sourceLineNo">1221</span>    if (assignments != null &amp;&amp; !assignments.isEmpty()) {<a name="line.1221"></a>
-<span class="sourceLineNo">1222</span>      servers = new ArrayList&lt;&gt;(servers);<a name="line.1222"></a>
-<span class="sourceLineNo">1223</span>      // Guarantee not to put other regions on master<a name="line.1223"></a>
-<span class="sourceLineNo">1224</span>      servers.remove(masterServerName);<a name="line.1224"></a>
-<span class="sourceLineNo">1225</span>      List&lt;RegionInfo&gt; masterRegions = assignments.get(masterServerName);<a name="line.1225"></a>
-<span class="sourceLineNo">1226</span>      if (!masterRegions.isEmpty()) {<a name="line.1226"></a>
-<span class="sourceLineNo">1227</span>        regions = new ArrayList&lt;&gt;(regions);<a name="line.1227"></a>
-<span class="sourceLineNo">1228</span>        regions.removeAll(masterRegions);<a name="line.1228"></a>
-<span class="sourceLineNo">1229</span>      }<a name="line.1229"></a>
-<span class="sourceLineNo">1230</span>    }<a name="line.1230"></a>
-<span class="sourceLineNo">1231</span>    if (regions == null || regions.isEmpty()) {<a name="line.1231"></a>
-<span class="sourceLineNo">1232</span>      return assignments;<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>    int numServers = servers == null ? 0 : servers.size();<a name="line.1235"></a>
-<span class="sourceLineNo">1236</span>    if (numServers == 0) {<a name="line.1236"></a>
-<span class="sourceLineNo">1237</span>      LOG.warn("Wanted to do round robin assignment but no servers to assign to");<a name="line.1237"></a>
-<span class="sourceLineNo">1238</span>      return null;<a name="line.1238"></a>
-<span class="sourceLineNo">1239</span>    }<a name="line.1239"></a>
-<span class="sourceLineNo">1240</span><a name="line.1240"></a>
-<span class="sourceLineNo">1241</span>    // TODO: instead of retainAssignment() and roundRobinAssignment(), we should just run the<a name="line.1241"></a>
-<span class="sourceLineNo">1242</span>    // normal LB.balancerCluster() with unassignedRegions. We only need to have a candidate<a name="line.1242"></a>
-<span class="sourceLineNo">1243</span>    // generator for AssignRegionAction. The LB will ensure the regions are mostly local<a name="line.1243"></a>
-<span class="sourceLineNo">1244</span>    // and balanced. This should also run fast with fewer number of iterations.<a name="line.1244"></a>
-<span class="sourceLineNo">1245</span><a name="line.1245"></a>
-<span class="sourceLineNo">1246</span>    if (numServers == 1) { // Only one server, nothing fancy we can do here<a name="line.1246"></a>
-<span class="sourceLineNo">1247</span>      ServerName server = servers.get(0);<a name="line.1247"></a>
-<span class="sourceLineNo">1248</span>      assignments.put(server, new ArrayList&lt;&gt;(regions));<a name="line.1248"></a>
-<span class="sourceLineNo">1249</span>      return assignments;<a name="line.1249"></a>
-<span class="sourceLineNo">1250</span>    }<a name="line.1250"></a>
-<span class="sourceLineNo">1251</span><a name="line.1251"></a>
-<span class="sourceLineNo">1252</span>    Cluster cluster = createCluster(servers, regions, false);<a name="line.1252"></a>
-<span class="sourceLineNo">1253</span>    List&lt;RegionInfo&gt; unassignedRegions = new ArrayList&lt;&gt;();<a name="line.1253"></a>
-<span class="sourceLineNo">1254</span><a name="line.1254"></a>
-<span class="sourceLineNo">1255</span>    roundRobinAssignment(cluster, regions, unassignedRegions,<a name="line.1255"></a>
-<span class="sourceLineNo">1256</span>      servers, assignments);<a name="line.1256"></a>
-<span class="sourceLineNo">1257</span><a name="line.1257"></a>
-<span class="sourceLineNo">1258</span>    List&lt;RegionInfo&gt; lastFewRegions = new ArrayList&lt;&gt;();<a name="line.1258"></a>
-<span class="sourceLineNo">1259</span>    // assign the remaining by going through the list and try to assign to servers one-by-one<a name="line.1259"></a>
-<span class="sourceLineNo">1260</span>    int serverIdx = RANDOM.nextInt(numServers);<a name="line.1260"></a>
-<span class="sourceLineNo">1261</span>    for (RegionInfo region : unassignedRegions) {<a name="line.1261"></a>
-<span class="sourceLineNo">1262</span>      boolean assigned = false;<a name="line.1262"></a>
-<span class="sourceLineNo">1263</span>      for (int j = 0; j &lt; numServers; j++) { // try all servers one by one<a name="line.1263"></a>
-<span class="sourceLineNo">1264</span>        ServerName serverName = servers.get((j + serverIdx) % numServers);<a name="line.1264"></a>
-<span class="sourceLineNo">1265</span>        if (!cluster.wouldLowerAvailability(region, serverName)) {<a name="line.1265"></a>
-<span class="sourceLineNo">1266</span>          List&lt;RegionInfo&gt; serverRegions =<a name="line.1266"></a>
-<span class="sourceLineNo">1267</span>              assignments.computeIfAbsent(serverName, k -&gt; new ArrayList&lt;&gt;());<a name="line.1267"></a>
-<span class="sourceLineNo">1268</span>          serverRegions.add(region);<a name="line.1268"></a>
-<span class="sourceLineNo">1269</span>          cluster.doAssignRegion(region, serverName);<a name="line.1269"></a>
-<span class="sourceLineNo">1270</span>          serverIdx = (j + serverIdx + 1) % numServers; //remain from next server<a name="line.1270"></a>
-<span class="sourceLineNo">1271</span>          assigned = true;<a name="line.1271"></a>
-<span class="sourceLineNo">1272</span>          break;<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>      if (!assigned) {<a name="line.1275"></a>
-<span class="sourceLineNo">1276</span>        lastFewRegions.add(region);<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>    // just sprinkle the rest of the regions on random regionservers. The balanceCluster will<a name="line.1279"></a>
-<span class="sourceLineNo">1280</span>    // make it optimal later. we can end up with this if numReplicas &gt; numServers.<a name="line.1280"></a>
-<span class="sourceLineNo">1281</span>    for (RegionInfo region : lastFewRegions) {<a name="line.1281"></a>
-<span class="sourceLineNo">1282</span>      int i = RANDOM.nextInt(numServers);<a name="line.1282"></a>
-<span class="sourceLineNo">1283</span>      ServerName server = servers.get(i);<a name="line.1283"></a>
-<span class="sourceLineNo">1284</span>      List&lt;RegionInfo&gt; serverRegions = assignments.computeIfAbsent(server, k -&gt; new ArrayList&lt;&gt;());<a name="line.1284"></a>
-<span class="sourceLineNo">1285</span>      serverRegions.add(region);<a name="line.1285"></a>
-<span class="sourceLineNo">1286</span>      cluster.doAssignRegion(region, server);<a name="line.1286"></a>
-<span class="sourceLineNo">1287</span>    }<a name="line.1287"></a>
-<span class="sourceLineNo">1288</span>    return assignments;<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>  protected Cluster createCluster(List&lt;ServerName&gt; servers,<a name="line.1291"></a>
-<span class="sourceLineNo">1292</span>      Collection&lt;RegionInfo&gt; regions, boolean forceRefresh) {<a name="line.1292"></a>
-<span class="sourceLineNo">1293</span>    if (forceRefresh &amp;&amp; useRegionFinder) {<a name="line.1293"></a>
-<span class="sourceLineNo">1294</span>      regionFinder.refreshAndWait(regions);<a name="line.1294"></a>
-<span class="sourceLineNo">1295</span>    }<a name="line.1295"></a>
-<span class="sourceLineNo">1296</span>    // Get the snapshot of the current assignments for the regions in question, and then create<a name="line.1296"></a>
-<span class="sourceLineNo">1297</span>    // a cluster out of it. Note that we might have replicas already assigned to some servers<a name="line.1297"></a>
-<span class="sourceLineNo">1298</span>    // earlier. So we want to get the snapshot to see those assignments, but this will only contain<a name="line.1298"></a>
-<span class="sourceLineNo">1299</span>    // replicas of the regions that are passed (for performance).<a name="line.1299"></a>
-<span class="sourceLineNo">1300</span>    Map&lt;ServerName, List&lt;RegionInfo&gt;&gt; clusterState = getRegionAssignmentsByServer(regions);<a name="line.1300"></a>
-<span class="sourceLineNo">1301</span><a name="line.1301"></a>
-<span class="sourceLineNo">1302</span>    for (ServerName server : servers) {<a name="line.1302"></a>
-<span class="sourceLineNo">1303</span>      if (!clusterState.containsKey(server)) {<a name="line.1303"></a>
-<span class="sourceLineNo">1304</span>        clusterState.put(server, EMPTY_REGION_LIST);<a name="line.1304"></a>
-<span class="sourceLineNo">1305</span>      }<a name="line.1305"></a>
-<span class="sourceLineNo">1306</span>    }<a name="line.1306"></a>
-<span class="sourceLineNo">1307</span>    return new Cluster(regions, clusterState, null, this.regionFinder,<a name="line.1307"></a>
-<span class="sourceLineNo">1308</span>        rackManager);<a name="line.1308"></a>
-<span class="sourceLineNo">1309</span>  }<a name="line.1309"></a>
+<span class="sourceLineNo">1154</span>  @Override<a name="line.1154"></a>
+<span class="sourceLineNo">1155</span>  public void postMasterStartupInitialize() {<a name="line.1155"></a>
+<span class="sourceLineNo">1156</span>    if (services != null &amp;&amp; regionFinder != null) {<a name="line.1156"></a>
+<span class="sourceLineNo">1157</span>      try {<a name="line.1157"></a>
+<span class="sourceLineNo">1158</span>        Set&lt;RegionInfo&gt; regions =<a name="line.1158"></a>
+<span class="sourceLineNo">1159</span>            services.getAssignmentManager().getRegionStates().getRegionAssignments().keySet();<a name="line.1159"></a>
+<span class="sourceLineNo">1160</span>        regionFinder.refreshAndWait(regions);<a name="line.1160"></a>
+<span class="sourceLineNo">1161</span>      } catch (Exception e) {<a name="line.1161"></a>
+<span class="sourceLineNo">1162</span>        LOG.warn("Refreshing region HDFS Block dist failed with exception, ignoring", e);<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>  }<a name="line.1165"></a>
+<span class="sourceLineNo">1166</span><a name="line.1166"></a>
+<span class="sourceLineNo">1167</span>  public void setRackManager(RackManager rackManager) {<a name="line.1167"></a>
+<span class="sourceLineNo">1168</span>    this.rackManager = rackManager;<a name="line.1168"></a>
+<span class="sourceLineNo">1169</span>  }<a name="line.1169"></a>
+<span class="sourceLineNo">1170</span><a name="line.1170"></a>
+<span class="sourceLineNo">1171</span>  protected boolean needsBalance(Cluster c) {<a name="line.1171"></a>
+<span class="sourceLineNo">1172</span>    ClusterLoadState cs = new ClusterLoadState(c.clusterState);<a name="line.1172"></a>
+<span class="sourceLineNo">1173</span>    if (cs.getNumServers() &lt; MIN_SERVER_BALANCE) {<a name="line.1173"></a>
+<span class="sourceLineNo">1174</span>      if (LOG.isDebugEnabled()) {<a name="line.1174"></a>
+<span class="sourceLineNo">1175</span>        LOG.debug("Not running balancer because only " + cs.getNumServers()<a name="line.1175"></a>
+<span class="sourceLineNo">1176</span>            + " active regionserver(s)");<a name="line.1176"></a>
+<span class="sourceLineNo">1177</span>      }<a name="line.1177"></a>
+<span class="sourceLineNo">1178</span>      return false;<a name="line.1178"></a>
+<span class="sourceLineNo">1179</span>    }<a name="line.1179"></a>
+<span class="sourceLineNo">1180</span>    if(areSomeRegionReplicasColocated(c)) return true;<a name="line.1180"></a>
+<span class="sourceLineNo">1181</span>    // Check if we even need to do any load balancing<a name="line.1181"></a>
+<span class="sourceLineNo">1182</span>    // HBASE-3681 check sloppiness first<a name="line.1182"></a>
+<span class="sourceLineNo">1183</span>    float average = cs.getLoadAverage(); // for logging<a name="line.1183"></a>
+<span class="sourceLineNo">1184</span>    int floor = (int) Math.floor(average * (1 - slop));<a name="line.1184"></a>
+<span class="sourceLineNo">1185</span>    int ceiling = (int) Math.ceil(average * (1 + slop));<a name="line.1185"></a>
+<span class="sourceLineNo">1186</span>    if (!(cs.getMaxLoad() &gt; ceiling || cs.getMinLoad() &lt; floor)) {<a name="line.1186"></a>
+<span class="sourceLineNo">1187</span>      NavigableMap&lt;ServerAndLoad, List&lt;RegionInfo&gt;&gt; serversByLoad = cs.getServersByLoad();<a name="line.1187"></a>
+<span class="sourceLineNo">1188</span>      if (LOG.isTraceEnabled()) {<a name="line.1188"></a>
+<span class="sourceLineNo">1189</span>        // If nothing to balance, then don't say anything unless trace-level logging.<a name="line.1189"></a>
+<span class="sourceLineNo">1190</span>        LOG.trace("Skipping load balancing because balanced cluster; " +<a name="line.1190"></a>
+<span class="sourceLineNo">1191</span>          "servers=" + cs.getNumServers() +<a name="line.1191"></a>
+<span class="sourceLineNo">1192</span>          " regions=" + cs.getNumRegions() + " average=" + average +<a name="line.1192"></a>
+<span class="sourceLineNo">1193</span>          " mostloaded=" + serversByLoad.lastKey().getLoad() +<a name="line.1193"></a>
+<span class="sourceLineNo">1194</span>          " leastloaded=" + serversByLoad.firstKey().getLoad());<a name="line.1194"></a>
+<span class="sourceLineNo">1195</span>      }<a name="line.1195"></a>
+<span class="sourceLineNo">1196</span>      return false;<a name="line.1196"></a>
+<span class="sourceLineNo">1197</span>    }<a name="line.1197"></a>
+<span class="sourceLineNo">1198</span>    return true;<a name="line.1198"></a>
+<span class="sourceLineNo">1199</span>  }<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>   * Subclasses should implement this to return true if the cluster has nodes that hosts<a name="line.1202"></a>
+<span class="sourceLineNo">1203</span>   * multiple replicas for the same region, or, if there are multiple racks and the same<a name="line.1203"></a>
+<span class="sourceLineNo">1204</span>   * rack hosts replicas of the same region<a name="line.1204"></a>
+<span class="sourceLineNo">1205</span>   * @param c Cluster information<a name="line.1205"></a>
+<span class="sourceLineNo">1206</span>   * @return whether region replicas are currently co-located<a name="line.1206"></a>
+<span class="sourceLineNo">1207</span>   */<a name="line.1207"></a>
+<span class="sourceLineNo">1208</span>  protected boolean areSomeRegionReplicasColocated(Cluster c) {<a name="line.1208"></a>
+<span class="sourceLineNo">1209</span>    return false;<a name="line.1209"></a>
+<span class="sourceLineNo">1210</span>  }<a name="line.1210"></a>
+<span class="sourceLineNo">1211</span><a name="line.1211"></a>
+<span class="sourceLineNo">1212</span>  /**<a name="line.1212"></a>
+<span class="sourceLineNo">1213</span>   * Generates a bulk assignment plan to be used on cluster startup using a<a name="line.1213"></a>
+<span class="sourceLineNo">1214</span>   * simple round-robin assignment.<a name="line.1214"></a>
+<span class="sourceLineNo">1215</span>   * &lt;p&gt;<a name="line.1215"></a>
+<span class="sourceLineNo">1216</span>   * Takes a list of all the regions and all the servers in the cluster and<a name="line.1216"></a>
+<span class="sourceLineNo">1217</span>   * returns a map of each server to the regions that it should be assigned.<a name="line.1217"></a>
+<span class="sourceLineNo">1218</span>   * &lt;p&gt;<a name="line.1218"></a>
+<span class="sourceLineNo">1219</span>   * Currently implemented as a round-robin assignment. Same invariant as load<a name="line.1219"></a>
+<span class="sourceLineNo">1220</span>   * balancing, all servers holding floor(avg) or ceiling(avg).<a name="line.1220"></a>
+<span class="sourceLineNo">1221</span>   *<a name="line.1221"></a>
+<span class="sourceLineNo">1222</span>   * TODO: Use block locations from HDFS to place regions with their blocks<a name="line.1222"></a>
+<span class="sourceLineNo">1223</span>   *<a name="line.1223"></a>
+<span class="sourceLineNo">1224</span>   * @param regions all regions<a name="line.1224"></a>
+<span class="sourceLineNo">1225</span>   * @param servers all servers<a name="line.1225"></a>
+<span class="sourceLineNo">1226</span>   * @return map of server to the regions it should take, or null if no<a name="line.1226"></a>
+<span class="sourceLineNo">1227</span>   *         assignment is possible (ie. no regions or no servers)<a name="line.1227"></a>
+<span class="sourceLineNo">1228</span>   */<a name="line.1228"></a>
+<span class="sourceLineNo">1229</span>  @Override<a name="line.1229"></a>
+<span class="sourceLineNo">1230</span>  public Map&lt;ServerName, List&lt;RegionInfo&gt;&gt; roundRobinAssignment(List&lt;RegionInfo&gt; regions,<a name="line.1230"></a>
+<span class="sourceLineNo">1231</span>      List&lt;ServerName&gt; servers) throws HBaseIOException {<a name="line.1231"></a>
+<span class="sourceLineNo">1232</span>    metricsBalancer.incrMiscInvocations();<a name="line.1232"></a>
+<span class="sourceLineNo">1233</span>    Map&lt;ServerName, List&lt;RegionInfo&gt;&gt; assignments = assignMasterSystemRegions(regions, servers);<a name="line.1233"></a>
+<span class="sourceLineNo">1234</span>    if (assignments != null &amp;&amp; !assignments.isEmpty()) {<a name="line.1234"></a>
+<span class="sourceLineNo">1235</span>      servers = new ArrayList&lt;&gt;(servers);<a name="line.1235"></a>
+<span class="sourceLineNo">1236</span>      // Guarantee not to put other regions on master<a name="line.1236"></a>
+<span class="sourceLineNo">1237</span>      servers.remove(masterServerName);<a name="line.1237"></a>
+<span class="sourceLineNo">1238</span>      List&lt;RegionInfo&gt; masterRegions = assignments.get(masterServerName);<a name="line.1238"></a>
+<span class="sourceLineNo">1239</span>      if (!masterRegions.isEmpty()) {<a name="line.1239"></a>
+<span class="sourceLineNo">1240</span>        regions = new ArrayList&lt;&gt;(regions);<a name="line.1240"></a>
+<span class="sourceLineNo">1241</span>        regions.removeAll(masterRegions);<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>    if (regions == null || regions.isEmpty()) {<a name="line.1244"></a>
+<span class="sourceLineNo">1245</span>      return assignments;<a name="line.1245"></a>
+<span class="sourceLineNo">1246</span>    }<a name="line.1246"></a>
+<span class="sourceLineNo">1247</span><a name="line.1247"></a>
+<span class="sourceLineNo">1248</span>    int numServers = servers == null ? 0 : servers.size();<a name="line.1248"></a>
+<span class="sourceLineNo">1249</span>    if (numServers == 0) {<a name="line.1249"></a>
+<span class="sourceLineNo">1250</span>      LOG.warn("Wanted to do round robin assignment but no servers to assign to");<a name="line.1250"></a>
+<span class="sourceLineNo">1251</span>      return null;<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>    // TODO: instead of retainAssignment() and roundRobinAssignment(), we should just run the<a name="line.1254"></a>
+<span class="sourceLineNo">1255</span>    // normal LB.balancerCluster() with unassignedRegions. We only need to have a candidate<a name="line.1255"></a>
+<span class="sourceLineNo">1256</span>    // generator for AssignRegionAction. The LB will ensure the regions are mostly local<a name="line.1256"></a>
+<span class="sourceLineNo">1257</span>    // and balanced. This should also run fast with fewer number of iterations.<a name="line.1257"></a>
+<span class="sourceLineNo">1258</span><a name="line.1258"></a>
+<span class="sourceLineNo">1259</span>    if (numServers == 1) { // Only one server, nothing fancy we can do here<a name="line.1259"></a>
+<span class="sourceLineNo">1260</span>      ServerName server = servers.get(0);<a name="line.1260"></a>
+<span class="sourceLineNo">1261</span>      assignments.put(server, new ArrayList&lt;&gt;(regions));<a name="line.1261"></a>
+<span class="sourceLineNo">1262</span>      return assignments;<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>    Cluster cluster = createCluster(servers, regions);<a name="line.1265"></a>
+<span class="sourceLineNo">1266</span>    List&lt;RegionInfo&gt; unassignedRegions = new ArrayList&lt;&gt;();<a name="line.1266"></a>
+<span class="sourceLineNo">1267</span><a name="line.1267"></a>
+<span class="sourceLineNo">1268</span>    roundRobinAssignment(cluster, regions, unassignedRegions,<a name="line.1268"></a>
+<span class="sourceLineNo">1269</span>      servers, assignments);<a name="line.1269"></a>
+<span class="sourceLineNo">1270</span><a name="line.1270"></a>
+<span class="sourceLineNo">1271</span>    List&lt;RegionInfo&gt; lastFewRegions = new ArrayList&lt;&gt;();<a name="line.1271"></a>
+<span class="sourceLineNo">1272</span>    // assign the remaining by going through the list and try to assign to servers one-by-one<a name="line.1272"></a>
+<span class="sourceLineNo">1273</span>    int serverIdx = RANDOM.nextInt(numServers);<a name="line.1273"></a>
+<span class="sourceLineNo">1274</span>    for (RegionInfo region : unassignedRegions) {<a name="line.1274"></a>
+<span class="sourceLineNo">1275</span>      boolean assigned = false;<a name="line.1275"></a>
+<span class="sourceLineNo">1276</span>      for (int j = 0; j &lt; numServers; j++) { // try all servers one by one<a name="line.1276"></a>
+<span class="sourceLineNo">1277</span>        ServerName serverName = servers.get((j + serverIdx) % numServers);<a name="line.1277"></a>
+<span class="sourceLineNo">1278</span>        if (!cluster.wouldLowerAvailability(region, serverName)) {<a name="line.1278"></a>
+<span class="sourceLineNo">1279</span>          List&lt;RegionInfo&gt; serverRegions =<a name="line.1279"></a>
+<span class="sourceLineNo">1280</span>              assignments.computeIfAbsent(serverName, k -&gt; new ArrayList&lt;&gt;());<a name="line.1280"></a>
+<span class="sourceLineNo">1281</span>          serverRegions.add(region);<a name="line.1281"></a>
+<span class="sourceLineNo">1282</span>          cluster.doAssignRegion(region, serverName);<a name="line.1282"></a>
+<span class="sourceLineNo">1283</span>          serverIdx = (j + serverIdx + 1) % numServers; //remain from next server<a name="line.1283"></a>
+<span class="sourceLineNo">1284</span>          assigned = true;<a name="line.1284"></a>
+<span class="sourceLineNo">1285</span>          break;<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>      if (!assigned) {<a name="line.1288"></a>
+<span class="sourceLineNo">1289</span>        lastFewRegions.add(region);<a name="line.1289"></a>
+<span class="sourceLineNo">1290</span>      }<a name="line.1290"></a>
+<span class="sourceLineNo">1291</span>    }<a name="line.1291"></a>
+<span class="sourceLineNo">1292</span>    // just sprinkle the rest of the regions on random regionservers. The balanceCluster will<a name="line.1292"></a>
+<span class="sourceLineNo">1293</span>    // make it optimal later. we can end up with this if numReplicas &gt; numServers.<a name="line.1293"></a>
+<span class="sourceLineNo">1294</span>    for (RegionInfo region : lastFewRegions) {<a name="line.1294"></a>
+<span class="sourceLineNo">1295</span>      int i = RANDOM.nextInt(numServers);<a name="line.1295"></a>
+<span class="sourceLineNo">1296</span>      ServerName server = servers.get(i);<a name="line.1296"></a>
+<span class="sourceLineNo">1297</span>      List&lt;RegionInfo&gt; serverRegions = assignments.computeIfAbsent(server, k -&gt; new ArrayList&lt;&gt;());<a name="line.1297"></a>
+<span class="sourceLineNo">1298</span>      serverRegions.add(region);<a name="line.1298"></a>
+<span class="sourceLineNo">1299</span>      cluster.doAssignRegion(region, server);<a name="line.1299"></a>
+<span class="sourceLineNo">1300</span>    }<a name="line.1300"></a>
+<span class="sourceLineNo">1301</span>    return assignments;<a name="line.1301"></a>
+<span class="sourceLineNo">1302</span>  }<a name="line.1302"></a>
+<span class="sourceLineNo">1303</span><a name="line.1303"></a>
+<span class="sourceLineNo">1304</span>  protected Cluster createCluster(List&lt;ServerName&gt; servers, Collection&lt;RegionInfo&gt; regions) {<a name="line.1304"></a>
+<span class="sourceLineNo">1305</span>    // Get the snapshot of the current assignments for the regions in question, and then create<a name="line.1305"></a>
+<span class="sourceLineNo">1306</span>    // a cluster out of it. Note that we might have replicas already assigned to some servers<a name="line.1306"></a>
+<span class="sourceLineNo">1307</span>    // earlier. So we want to get the snapshot to see those assignments, but this will only contain<a name="line.1307"></a>
+<span class="sourceLineNo">1308</span>    // replicas of the regions that are passed (for performance).<a name="line.1308"></a>
+<span class="sourceLineNo">1309</span>    Map&lt;ServerName, List&lt;RegionInfo&gt;&gt; clusterState = getRegionAssignmentsByServer(regions);<a name="line.1309"></a>
 <span class="sourceLineNo">1310</span><a name="line.1310"></a>
-<span class="sourceLineNo">1311</span>  private List&lt;ServerName&gt; findIdleServers(List&lt;ServerName&gt; servers) {<a name="line.1311"></a>
-<span class="sourceLineNo">1312</span>    return this.services.getServerManager()<a name="line.1312"></a>
-<span class="sourceLineNo">1313</span>            .getOnlineServersListWithPredicator(servers, IDLE_SERVER_PREDICATOR);<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>  /**<a name="line.1316"></a>
-<span class="sourceLineNo">1317</span>   * Used to assign a single region to a random server.<a name="line.1317"></a>
-<span class="sourceLineNo">1318</span>   */<a name="line.1318"></a>
-<span class="sourceLineNo">1319</span>  @Override<a name="line.1319"></a>
-<span class="sourceLineNo">1320</span>  public ServerName randomAssignment(RegionInfo regionInfo, List&lt;ServerName&gt; servers)<a name="line.1320"></a>
-<span class="sourceLineNo">1321</span>      throws HBaseIOException {<a name="line.1321"></a>
-<span class="sourceLineNo">1322</span>    metricsBalancer.incrMiscInvocations();<a name="line.1322"></a>
-<span class="sourceLineNo">1323</span>    if (servers != null &amp;&amp; servers.contains(masterServerName)) {<a name="line.1323"></a>
-<span class="sourceLineNo">1324</span>      if (shouldBeOnMaster(regionInfo)) {<a name="line.1324"></a>
-<span class="sourceLineNo">1325</span>        return masterServerName;<a name="line.1325"></a>
-<span class="sourceLineNo">1326</span>      }<a name="line.1326"></a>
-<span class="sourceLineNo">1327</span>      if (!LoadBalancer.isTablesOnMaster(getConf())) {<a name="line.1327"></a>
-<span class="sourceLineNo">1328</span>        // Guarantee we do not put any regions on master<a name="line.1328"></a>
-<span class="sourceLineNo">1329</span>        servers = new ArrayList&lt;&gt;(servers);<a name="line.1329"></a>
-<span class="sourceLineNo">1330</span>        servers.remove(masterServerName);<a name="line.1330"></a>
-<span class="sourceLineNo">1331</span>      }<a name="line.1331"></a>
-<span class="sourceLineNo">1332</span>    }<a name="line.1332"></a>
-<span class="sourceLineNo">1333</span><a name="line.1333"></a>
-<span class="sourceLineNo">1334</span>    int numServers = servers == null ? 0 : servers.size();<a name="line.1334"></a>
-<span class="sourceLineNo">1335</span>    if (numServers == 0) {<a name="line.1335"></a>
-<span class="sourceLineNo">1336</span>      LOG.warn("Wanted to retain assignment but no servers to assign to");<a name="line.1336"></a>
-<span class="sourceLineNo">1337</span>      return null;<a name="line.1337"></a>
-<span class="sourceLineNo">1338</span>    }<a name="line.1338"></a>
-<span class="sourceLineNo">1339</span>    if (numServers == 1) { // Only one server, nothing fancy we can do here<a name="line.1339"></a>
-<span class="sourceLineNo">1340</span>      return servers.get(0);<a name="line.1340"></a>
+<span class="sourceLineNo">1311</span>    for (ServerName server : servers) {<a name="line.1311"></a>
+<span class="sourceLineNo">1312</span>      if (!clusterState.containsKey(server)) {<a name="line.1312"></a>
+<span class="sourceLineNo">1313</span>        clusterState.put(server, EMPTY_REGION_LIST);<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>    return new Cluster(regions, clusterState, null, this.regionFinder,<a name="line.1316"></a>
+<span class="sourceLineNo">1317</span>        rackManager);<a name="line.1317"></a>
+<span class="sourceLineNo">1318</span>  }<a name="line.1318"></a>
+<span class="sourceLineNo">1319</span><a name="line.1319"></a>
+<span class="sourceLineNo">1320</span>  private List&lt;ServerName&gt; findIdleServers(List&lt;ServerName&gt; servers) {<a name="line.1320"></a>
+<span class="sourceLineNo">1321</span>    return this.services.getServerManager()<a name="line.1321"></a>
+<span class="sourceLineNo">1322</span>            .getOnlineServersListWithPredicator(servers, IDLE_SERVER_PREDICATOR);<a name="line.1322"></a>
+<span class="sourceLineNo">1323</span>  }<a name="line.1323"></a>
+<span class="sourceLineNo">1324</span><a name="line.1324"></a>
+<span class="sourceLineNo">1325</span>  /**<a name="line.1325"></a>
+<span class="sourceLineNo">1326</span>   * Used to assign a single region to a random server.<a name="line.1326"></a>
+<span class="sourceLineNo">1327</span>   */<a name="line.1327"></a>
+<span class="sourceLineNo">1328</span>  @Override<a name="line.1328"></a>
+<span class="sourceLineNo">1329</span>  public ServerName randomAssignment(RegionInfo regionInfo, List&lt;ServerName&gt; servers)<a name="line.1329"></a>
+<span class="sourceLineNo">1330</span>      throws HBaseIOException {<a name="line.1330"></a>
+<span class="sourceLineNo">1331</span>    metricsBalancer.incrMiscInvocations();<a name="line.1331"></a>
+<span class="sourceLineNo">1332</span>    if (servers != null &amp;&amp; servers.contains(masterServerName)) {<a name="line.1332"></a>
+<span class="sourceLineNo">1333</span>      if (shouldBeOnMaster(regionInfo)) {<a name="line.1333"></a>
+<span class="sourceLineNo">1334</span>        return masterServerName;<a name="line.1334"></a>
+<span class="sourceLineNo">1335</span>      }<a name="line.1335"></a>
+<span class="sourceLineNo">1336</span>      if (!LoadBalancer.isTablesOnMaster(getConf())) {<a name="line.1336"></a>
+<span class="sourceLineNo">1337</span>        // Guarantee we do not put any regions on master<a name="line.1337"></a>
+<span class="sourceLineNo">1338</span>        servers = new ArrayList&lt;&gt;(servers);<a name="line.1338"></a>
+<span class="sourceLineNo">1339</span>        servers.remove(masterServerName);<a name="line.1339"></a>
+<span class="sourceLineNo">1340</span>      }<a name="line.1340"></a>
 <span class="sourceLineNo">1341</span>    }<a name="line.1341"></a>
-<span class="sourceLineNo">1342</span>    List&lt;ServerName&gt; idleServers = findIdleServers(servers);<a name="line.1342"></a>
-<span class="sourceLineNo">1343</span>    if (idleServers.size() == 1) {<a name="line.1343"></a>
-<span class="sourceLineNo">1344</span>      return idleServers.get(0);<a name="line.1344"></a>
-<span class="sourceLineNo">1345</span>    }<a name="line.1345"></a>
-<span class="sourceLineNo">1346</span>    final List&lt;ServerName&gt; finalServers = idleServers.isEmpty() ?<a name="line.1346"></a>
-<span class="sourceLineNo">1347</span>            servers : idleServers;<a name="line.1347"></a>
-<span class="sourceLineNo">1348</span>    List&lt;RegionInfo&gt; regions = Lists.newArrayList(regionInfo);<a name="line.1348"></a>
-<span class="sourceLineNo">1349</span>    Cluster cluster = createCluster(finalServers, regions, false);<a name="line.1349"></a>
-<span class="sourceLineNo">1350</span>    return randomAssignment(cluster, regionInfo, finalServers);<a name="line.1350"></a>
-<span class="sourceLineNo">1351</span>  }<a name="line.1351"></a>
-<span class="sourceLineNo">1352</span><a name="line.1352"></a>
-<span class="sourceLineNo">1353</span>  /**<a name="line.1353"></a>
-<span class="sourceLineNo">1354</span>   * Generates a bulk assignment startup plan, attempting to reuse the existing<a name="line.1354"></a>
-<span class="sourceLineNo">1355</span>   * assignment information from META, but adjusting for the specified list of<a name="line.1355"></a>
-<span class="sourceLineNo">1356</span>   * available/online servers available for assignment.<a name="line.1356"></a>
-<span class="sourceLineNo">1357</span>   * &lt;p&gt;<a name="line.1357"></a>
-<span class="sourceLineNo">1358</span>   * Takes a map of all regions to their existing assignment from META. Also<a name="line.1358"></a>
-<span class="sourceLineNo">1359</span>   * takes a list of online servers for regions to be assigned to. Attempts to<a name="line.1359"></a>
-<span class="sourceLineNo">1360</span>   * retain all assignment, so in some instances initial assignment will not be<a name="line.1360"></a>
-<span class="sourceLineNo">1361</span>   * completely balanced.<a name="line.1361"></a>
-<span class="sourceLineNo">1362</span>   * &lt;p&gt;<a name="line.1362"></a>
-<span class="sourceLineNo">1363</span>   * Any leftover regions without an existing server to be assigned to will be<a name="line.1363"></a>
-<span class="sourceLineNo">1364</span>   * assigned randomly to available servers.<a name="line.1364"></a>
-<span class="sourceLineNo">1365</span>   *<a name="line.1365"></a>
-<span class="sourceLineNo">1366</span>   * @param regions regions and existing assignment from meta<a name="line.1366"></a>
-<span class="sourceLineNo">1367</span>   * @param servers available servers<a name="line.1367"></a>
-<span class="sourceLineNo">1368</span>   * @return map of servers and regions to be assigned to them<a name="line.1368"></a>
-<span class="sourceLineNo">1369</span>   */<a name="line.1369"></a>
-<span class="sourceLineNo">1370</span>  @Override<a name="line.1370"></a>
-<span class="sourceLineNo">1371</span>  public Map&lt;ServerName, List&lt;RegionInfo&gt;&gt; retainAssignment(Map&lt;RegionInfo, ServerName&gt; regions,<a name="line.1371"></a>
-<span class="sourceLineNo">1372</span>      List&lt;ServerName&gt; servers) throws HBaseIOException {<a name="line.1372"></a>
-<span class="sourceLineNo">1373</span>    // Update metrics<a name="line.1373"></a>
-<span class="sourceLineNo">1374</span>    metricsBalancer.incrMiscInvocations();<a name="line.1374"></a>
-<span class="sourceLineNo">1375</span>    Map&lt;ServerName, List&lt;RegionInfo&gt;&gt; assignments = assignMasterSystemRegions(regions.keySet(), servers);<a name="line.1375"></a>
-<span class="sourceLineNo">1376</span>    if (assignments != null &amp;&amp; !assignments.isEmpty()) {<a name="line.1376"></a>
-<span class="sourceLineNo">1377</span>      servers = new ArrayList&lt;&gt;(servers);<a name="line.1377"></a>
-<span class="sourceLineNo">1378</span>      // Guarantee not to put other regions on master<a name="line.1378"></a>
-<span class="sourceLineNo">1379</span>      servers.remove(masterServerName);<a name="line.1379"></a>
-<span class="sourceLineNo">1380</span>      List&lt;RegionInfo&gt; masterRegions = assignments.get(masterServerName);<a name="line.1380"></a>
-<span class="sourceLineNo">1381</span>      regions = regions.entrySet().stream().filter(e -&gt; !masterRegions.contains(e.getKey()))<a name="line.1381"></a>
-<span class="sourceLineNo">1382</span>          .collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue));<a name="line.1382"></a>
-<span class="sourceLineNo">1383</span>    }<a name="line.1383"></a>
-<span class="sourceLineNo">1384</span>    if (regions.isEmpty()) {<a name="line.1384"></a>
-<span class="sourceLineNo">1385</span>      return assignments;<a name="line.1385"></a>
-<span class="sourceLineNo">1386</span>    }<a name="line.1386"></a>
-<span class="sourceLineNo">1387</span><a name="line.1387"></a>
-<span class="sourceLineNo">1388</span>    int numServers = servers == null ? 0 : servers.size();<a name="line.1388"></a>
-<span class="sourceLineNo">1389</span>    if (numServers == 0) {<a name="line.1389"></a>
-<span class="sourceLineNo">1390</span>      LOG.warn("Wanted to do retain assignment but no servers to assign to");<a name="line.1390"></a>
-<span class="sourceLineNo">1391</span>      return null;<a name="line.1391"></a>
+<span class="sourceLineNo">1342</span><a name="line.1342"></a>
+<span class="sourceLineNo">1343</span>    int numServers = servers == null ? 0 : servers.size();<a name="line.1343"></a>
+<span class="sourceLineNo">1344</span>    if (numServers == 0) {<a name="line.1344"></a>
+<span class="sourceLineNo">1345</span>      LOG.warn("Wanted to retain assignment but no servers to assign to");<a name="line.1345"></a>
+<span class="sourceLineNo">1346</span>      return null;<a name="line.1346"></a>
+<span class="sourceLineNo">1347</span>    }<a name="line.1347"></a>
+<span class="sourceLineNo">1348</span>    if (numServers == 1) { // Only one server, nothing fancy we can do here<a name="line.1348"></a>
+<span class="sourceLineNo">1349</span>      return servers.get(0);<a name="line.1349"></a>
+<span class="sourceLineNo">1350</span>    }<a name="line.1350"></a>
+<span class="sourceLineNo">1351</span>    List&lt;ServerName&gt; idleServers = findIdleServers(servers);<a name="line.1351"></a>
+<span class="sourceLineNo">1352</span>    if (idleServers.size() == 1) {<a name="line.1352"></a>
+<span class="sourceLineNo">1353</span>      return idleServers.get(0);<a name="line.1353"></a>
+<span class="sourceLineNo">1354</span>    }<a name="line.1354"></a>
+<span class="sourceLineNo">1355</span>    final List&lt;ServerName&gt; finalServers = idleServers.isEmpty() ?<a name="line.1355"></a>
+<span class="sourceLineNo">1356</span>            servers : idleServers;<a name="line.1356"></a>
+<span class="sourceLineNo">1357</span>    List&lt;RegionInfo&gt; regions = Lists.newArrayList(regionInfo);<a name="line.1357"></a>
+<span class="sourceLineNo">1358</span>    Cluster cluster = createCluster(finalServers, regions);<a name="line.1358"></a>
+<span class="sourceLineNo">1359</span>    return randomAssignment(cluster, regionInfo, finalServers);<a name="line.1359"></a>
+<span class="sourceLineNo">1360</span>  }<a name="line.1360"></a>
+<span class="sourceLineNo">1361</span><a name="line.1361"></a>
+<span class="sourceLineNo">1362</span>  /**<a name="line.1362"></a>
+<span class="sourceLineNo">1363</span>   * Generates a bulk assignment startup plan, attempting to reuse the existing<a name="line.1363"></a>
+<span class="sourceLineNo">1364</span>   * assignment information from META, but adjusting for the specified list of<a name="line.1364"></a>
+<span class="sourceLineNo">1365</span>   * available/online servers available for assignment.<a name="line.1365"></a>
+<span class="sourceLineNo">1366</span>   * &lt;p&gt;<a name="line.1366"></a>
+<span class="sourceLineNo">1367</span>   * Takes a map of all regions to their existing assignment from META. Also<a name="line.1367"></a>
+<span class="sourceLineNo">1368</span>   * takes a list of online servers for regions to be assigned to. Attempts to<a name="line.1368"></a>
+<span class="sourceLineNo">1369</span>   * retain all assignment, so in some instances initial assignment will not be<a name="line.1369"></a>
+<span class="sourceLineNo">1370</span>   * completely balanced.<a name="line.1370"></a>
+<span class="sourceLineNo">1371</span>   * &lt;p&gt;<a name="line.1371"></a>
+<span class="sourceLineNo">1372</span>   * Any leftover regions without an existing server to be assigned to will be<a name="line.1372"></a>
+<span class="sourceLineNo">1373</span>   * assigned randomly to available servers.<a name="line.1373"></a>
+<span class="sourceLineNo">1374</span>   *<a name="line.1374"></a>
+<span class="sourceLineNo">1375</span>   * @param regions regions and existing assignment from meta<a name="line.1375"></a>
+<span class="sourceLineNo">1376</span>   * @param servers available servers<a name="line.1376"></a>
+<span class="sourceLineNo">1377</span>   * @return map of servers and regions to be assigned to them<a name="line.1377"></a>
+<span class="sourceLineNo">1378</span>   */<a name="line.1378"></a>
+<span class="sourceLineNo">1379</span>  @Override<a name="line.1379"></a>
+<span class="sourceLineNo">1380</span>  public Map&lt;ServerName, List&lt;RegionInfo&gt;&gt; retainAssignment(Map&lt;RegionInfo, ServerName&gt; regions,<a name="line.1380"></a>
+<span class="sourceLineNo">1381</span>      List&lt;ServerName&gt; servers) throws HBaseIOException {<a name="line.1381"></a>
+<span class="sourceLineNo">1382</span>    // Update metrics<a name="line.1382"></a>
+<span class="sourceLineNo">1383</span>    metricsBalancer.incrMiscInvocations();<a name="line.1383"></a>
+<span class="sourceLineNo">1384</span>    Map&lt;ServerName, List&lt;RegionInfo&gt;&gt; assignments = assignMasterSystemRegions(regions.keySet(), servers);<a name="line.1384"></a>
+<span class="sourceLineNo">1385</span>    if (assignments != null &amp;&amp; !assignments.isEmpty()) {<a name="line.1385"></a>
+<span class="sourceLineNo">1386</span>      servers = new ArrayList&lt;&gt;(servers);<a name="line.1386"></a>
+<span class="sourceLineNo">1387</span>      // Guarantee not to put other regions on master<a name="line.1387"></a>
+<span class="sourceLineNo">1388</span>      servers.remove(masterServerName);<a name="line.1388"></a>
+<span class="sourceLineNo">1389</span>      List&lt;RegionInfo&gt; masterRegions = assignments.get(masterServerName);<a name="line.1389"></a>
+<span class="sourceLineNo">1390</span>      regions = regions.entrySet().stream().filter(e -&gt; !masterRegions.contains(e.getKey()))<a name="line.1390"></a>
+<span class="sourceLineNo">1391</span>          .collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue));<a name="line.1391"></a>
 <span class="sourceLineNo">1392</span>    }<a name="line.1392"></a>
-<span class="sourceLineNo">1393</span>    if (numServers == 1) { // Only one server, nothing fancy we can do here<a name="line.1393"></a>
-<span class="sourceLineNo">1394</span>      ServerName server = servers.get(0);<a name="line.1394"></a>
-<span class="sourceLineNo">1395</span>      assignments.put(server, new ArrayList&lt;&gt;(regions.keySet()));<a name="line.1395"></a>
-<span class="sourceLineNo">1396</span>      return assignments;<a name="line.1396"></a>
-<span class="sourceLineNo">1397</span>    }<a name="line.1397"></a>
-<span class="sourceLineNo">1398</span><a name="line.1398"></a>
-<span class="sourceLineNo">1399</span>    // Group all of the old assignments by their hostname.<a name="line.1399"></a>
-<span class="sourceLineNo">1400</span>    // We can't group directly by ServerName since the servers all have<a name="line.1400"></a>
-<span class="sourceLineNo">1401</span>    // new start-codes.<a name="line.1401"></a>
-<span class="sourceLineNo">1402</span><a name="line.1402"></a>
-<span class="sourceLineNo">1403</span>    // Group the servers by their hostname. It's possible we have multiple<a name="line.1403"></a>
-<span class="sourceLineNo">1404</span>    // servers on the same host on different ports.<a name="line.1404"></a>
-<span class="sourceLineNo">1405</span>    ArrayListMultimap&lt;String, ServerName&gt; serversByHostname = ArrayListMultimap.create();<a name="line.1405"></a>
-<span class="sourceLineNo">1406</span>    for (ServerName server : servers) {<a name="line.1406"></a>
-<span class="sourceLineNo">1407</span>      assignments.put(server, new ArrayList&lt;&gt;());<a name="line.1407"></a>
-<span class="sourceLineNo">1408</span>      serversByHostname.put(server.getHostnameLowerCase(), server);<a name="line.1408"></a>
-<span class="sourceLineNo">1409</span>    }<a name="line.1409"></a>
-<span class="sourceLineNo">1410</span><a name="line.1410"></a>
-<span class="sourceLineNo">1411</span>    // Collection of the hostnames that used to have regions<a name="line.1411"></a>
-<span class="sourceLineNo">1412</span>    // assigned, but for which we no longer have any RS running<a name="line.1412"></a>
-<span class="sourceLineNo">1413</span>    // after the cluster restart.<a name="line.1413"></a>
-<span class="sourceLineNo">1414</span>    Set&lt;String&gt; oldHostsNoLongerPresent = Sets.newTreeSet();<a name="line.1414"></a>
-<span class="sourceLineNo">1415</span><a name="line.1415"></a>
-<span class="sourceLineNo">1416</span>    // If the old servers aren't present, lets assign those regions later.<a name="line.1416"></a>
-<span class="sourceLineNo">1417</span>    List&lt;RegionInfo&gt; randomAssignRegions = Lists.newArrayList();<a name="line.1417"></a>
-<span class="sourceLineNo">1418</span><a name="line.1418"></a>
-<span class="sourceLineNo">1419</span>    int numRandomAssignments = 0;<a name="line.1419"></a>
-<span class="sourceLineNo">1420</span>    int numRetainedAssigments = 0;<a name="line.1420"></a>
-<span class="sourceLineNo">1421</span><a name="line.1421"></a>
-<span class="sourceLineNo">1422</span>    Cluster cluster = createCluster(servers, regions.keySet(), true);<a name="line.1422"></a>
-<span class="sourceLineNo">1423</span><a name="line.1423"></a>
-<span class="sourceLineNo">1424</span>    for (Map.Entry&lt;RegionInfo, ServerName&gt; entry : regions.entrySet()) {<a name="line.1424"></a>
-<span class="sourceLineNo">1425</span>      RegionInfo region = entry.getKey();<a name="line.1425"></a>
-<span class="sourceLineNo">1426</span>      ServerName oldServerName = entry.getValue();<a name="line.1426"></a>
-<span class="sourceLineNo">1427</span>      List&lt;ServerName&gt; localServers = new ArrayList&lt;&gt;();<a name="line.1427"></a>
-<span class="sourceLineNo">1428</span>      if (oldServerName != null) {<a name="line.1428"></a>
-<span class="sourceLineNo">1429</span>        localServers = serversByHostname.get(oldServerName.getHostnameLowerCase());<a name="line.1429"></a>
-<span class="sourceLineNo">1430</span>      }<a name="line.1430"></a>
-<span class="sourceLineNo">1431</span>      if (localServers.isEmpty()) {<a name="line.1431"></a>
-<span class="sourceLineNo">1432</span>        // No servers on the new cluster match up with this hostname, assign randomly, later.<a name="line.1432"></a>
-<span class="sourceLineNo">1433</span>        randomAssignRegions.add(region);<a name="line.1433"></a>
-<span class="sourceLineNo">1434</span>        if (oldServerName != null) {<a name="line.1434"></a>
-<span class="sourceLineNo">1435</span>          oldHostsNoLongerPresent.add(oldServerName.getHostnameLowerCase());<a name="line.1435"></a>
-<span class="sourceLineNo">1436</span>        }<a name="line.1436"></a>
-<span class="sourceLineNo">1437</span>      } else if (localServers.size() == 1) {<a name="line.1437"></a>
-<span class="sourceLineNo">1438</span>        // the usual case - one new server on same host<a name="line.1438"></a>
-<span class="sourceLineNo">1439</span>        ServerName target = localServers.get(0);<a name="line.1439"></a>
-<span class="sourceLineNo">1440</span>        assignments.get(target).add(region);<a name="line.1440"></a>
-<span class="sourceLineNo">1441</span>        numRetainedAssigments++;<a name="line.1441"></a>
-<span class="sourceLineNo">1442</span>      } else {<a name="line.1442"></a>
-<span class="sourceLineNo">1443</span>        // multiple new servers in the cluster on this same host<a name="line.1443"></a>
-<span class="sourceLineNo">1444</span>        if (localServers.contains(oldServerName)) {<a name="line.1444"></a>
-<span class="sourceLineNo">1445</span>          assignments.get(oldServerName).add(region);<a name="line.1445"></a>
-<span class="sourceLineNo">1446</span>          numRetainedAssigments++;<a name="line.1446"></a>
-<span class="sourceLineNo">1447</span>        } else {<a name="line.1447"></a>
-<span class="sourceLineNo">1448</span>          ServerName target = null;<a name="line.1448"></a>
-<span class="sourceLineNo">1449</span>          for (ServerName tmp : localServers) {<a name="line.1449"></a>
-<span class="sourceLineNo">1450</span>            if (tmp.getPort() == oldServerName.getPort()) {<a name="line.1450"></a>
-<span class="sourceLineNo">1451</span>              target = tmp;<a name="line.1451"></a>
-<span class="sourceLineNo">1452</span>              assignments.get(tmp).add(region);<a name="line.1452"></a>
-<span class="sourceLineNo">1453</span>              numRetainedAssigments++;<a name="line.1453"></a>
-<span class="sourceLineNo">1454</span>              break;<a name="line.1454"></a>
-<span class="sourceLineNo">1455</span>            }<a name="line.1455"></a>
-<span class="sourceLineNo">1456</span>          }<a name="line.1456"></a>
-<span class="sourceLineNo">1457</span>          if (target == null) {<a name="line.1457"></a>
-<span class="sourceLineNo">1458</span>            randomAssignRegions.add(region);<a name="line.1458"></a>
-<span class="sourceLineNo">1459</span>          }<a name="line.1459"></a>
-<span class="sourceLineNo">1460</span>        }<a name="line.1460"></a>
-<span class="sourceLineNo">1461</span>      }<a name="line.1461"></a>
-<span class="sourceLineNo">1462</span>    }<a name="line.1462"></a>
-<span class="sourceLineNo">1463</span><a name="line.1463"></a>
-<span class="sourceLineNo">1464</span>    // If servers from prior assignment aren't present, then lets do randomAssignment on regions.<a name="line.1464"></a>
-<span class="sourceLineNo">1465</span>    if (randomAssignRegions.size() &gt; 0) {<a name="line.1465"></a>
-<span class="sourceLineNo">1466</span>      for (Map.Entry&lt;ServerName, List&lt;RegionInfo&gt;&gt; entry : assignments.entrySet()) {<a name="line.1466"></a>
-<span class="sourceLineNo">1467</span>        ServerName sn = entry.getKey();<a name="line.1467"></a>
-<span class="sourceLineNo">1468</span>        for (RegionInfo region : entry.getValue()) {<a name="line.1468"></a>
-<span class="sourceLineNo">1469</span>          cluster.doAssignRegion(region, sn);<a name="line.1469"></a>
-<span class="sourceLineNo">1470</span>        }<a name="line.1470"></a>
-<span class="sourceLineNo">1471</span>      }<a name="line.1471"></a>
-<span class="sourceLineNo">1472</span>      for (RegionInfo region : randomAssignRegions) {<a name="line.1472"></a>
-<span class="sourceLineNo">1473</span>        ServerName target = randomAssignment(cluster, region, servers);<a name="line.1473"></a>
-<span class="sourceLineNo">1474</span>        assignments.get(target).add(region);<a name="line.1474"></a>
-<span class="sourceLineNo">1475</span>        cluster.doAssignRegion(region, target);<a name="line.1475"></a>
-<span class="sourceLineNo">1476</span>        numRandomAssignments++;<a name="line.1476"></a>
-<span class="sourceLineNo">1477</span>      }<a name="line.1477"></a>
-<span class="sourceLineNo">1478</span>    }<a name="line.1478"></a>
-<span class="sourceLineNo">1479</span><a name="line.1479"></a>
-<span class="sourceLineNo">1480</span>    String randomAssignMsg = "";<a name="line.1480"></a>
-<span class="sourceLineNo">1481</span>    if (numRandomAssignments &gt; 0) {<a name="line.1481"></a>
-<span class="sourceLineNo">1482</span>      randomAssignMsg =<a name="line.1482"></a>
-<span class="sourceLineNo">1483</span>          numRandomAssignments + " regions were assigned "<a name="line.1483"></a>
-<span class="sourceLineNo">1484</span>              + "to random hosts, since the old hosts for these regions are no "<a name="line.1484"></a>
-<span class="sourceLineNo">1485</span>              + "longer present in the cluster. These hosts were:\n  "<a name="line.1485"></a>
-<span class="sourceLineNo">1486</span>              + Joiner.on("\n  ").join(oldHostsNoLongerPresent);<a name="line.1486"></a>
-<span class="sourceLineNo">1487</span>    }<a name="line.1487"></a>
-<span class="sourceLineNo">1488</span><a name="line.1488"></a>
-<span class="sourceLineNo">1489</span>    LOG.info("Reassigned " + regions.size() + " regions. " + numRetainedAssigments<a name="line.1489"></a>
-<span class="sourceLineNo">1490</span>        + " retained the pre-restart assignment. " + randomAssignMsg);<a name="line.1490"></a>
-<span class="sourceLineNo">1491</span>    return assignments;<a name="line.1491"></a>
-<span class="sourceLineNo">1492</span>  }<a name="line.1492"></a>
-<span class="sourceLineNo">1493</span><a name="line.1493"></a>
-<span class="sourceLineNo">1494</span>  @Override<a name="line.1494"></a>
-<span class="sourceLineNo">1495</span>  public void initialize() throws HBaseIOException{<a name="line.1495"></a>
-<span class="sourceLineNo">1496</span>  }<a name="line.1496"></a>
-<span class="sourceLineNo">1497</span><a name="line.1497"></a>
-<span class="sourceLineNo">1498</span>  @Override<a name="line.1498"></a>
-<span class="sourceLineNo">1499</span>  public void regionOnline(RegionInfo regionInfo, ServerName sn) {<a name="line.1499"></a>
+<span class="sourceLineNo">1393</span>    if (regions.isEmpty()) {<a name="line.1393"></a>
+<span class="sourceLineNo">1394</span>      return assignments;<a name="line.1394"></a>
+<span class="sourceLineNo">1395</span>    }<a name="line.1395"></a>
+<span class="sourceLineNo">1396</span><a name="line.1396"></a>
+<span class="sourceLineNo">1397</span>    int numServers = servers == null ? 0 : servers.size();<a name="line.1397"></a>
+<span class="sourceLineNo">1398</span>    if (numServers == 0) {<a name="line.1398"></a>
+<span class="sourceLineNo">1399</span>      LOG.warn("Wanted to do retain assignment but no servers to assign to");<a name="line.1399"></a>
+<span class="sourceLineNo">1400</span>      return null;<a name="line.1400"></a>
+<span class="sourceLineNo">1401</span>    }<a name="line.1401"></a>
+<span class="sourceLineNo">1402</span>    if (numServers == 1) { // Only one server, nothing fancy we can do here<a name="line.1402"></a>
+<span class="sourceLineNo">1403</span>      ServerName server = servers.get(0);<a name="line.1403"></a>
+<span class="sourceLineNo">1404</span>      assignments.put(server, new ArrayList&lt;&gt;(regions.keySet()));<a name="line.1404"></a>
+<span class="sourceLineNo">1405</span>      return assignments;<a name="line.1405"></a>
+<span class="sourceLineNo">1406</span>    }<a name="line.1406"></a>
+<span class="sourceLineNo">1407</span><a name="line.1407"></a>
+<span class="sourceLineNo">1408</span>    // Group all of the old assignments by their hostname.<a name="line.1408"></a>
+<span class="sourceLineNo">1409</span>    // We can't group directly by ServerName since the servers all have<a name="line.1409"></a>
+<span class="sourceLineNo">1410</span>    // new start-codes.<a name="line.1410"></a>
+<span class="sourceLineNo">1411</span><a name="line.1411"></a>
+<span class="sourceLineNo">1412</span>    // Group the servers by their hostname. It's possible we have multiple<a name="line.1412"></a>
+<span class="sourceLineNo">1413</span>    // servers on the same host on different ports.<a name="line.1413"></a>
+<span class="sourceLineNo">1414</span>    ArrayListMultimap&lt;String, ServerName&gt; serversByHostname = ArrayListMultimap.create();<a name="line.1414"></a>
+<span class="sourceLineNo">1415</span>    for (ServerName server : servers) {<a name="line.1415"></a>
+<span class="sourceLineNo">1416</span>      assignments.put(server, new ArrayList&lt;&gt;());<a name="line.1416"></a>
+<span class="sourceLineNo">1417</span>      serversByHostname.put(server.getHostnameLowerCase(), server);<a name="line.1417"></a>
+<span class="sourceLineNo">1418</span>    }<a name="line.1418"></a>
+<span class="sourceLineNo">1419</span><a name="line.1419"></a>
+<span class="sourceLineNo">1420</span>    // Collection of the hostnames that used to have regions<a name="line.1420"></a>
+<span class="sourceLineNo">1421</span>    // assigned, but for which we no longer have any RS running<a name="line.1421"></a>
+<span class="sourceLineNo">1422</span>    // after the cluster restart.<a name="line.1422"></a>
+<span class="sourceLineNo">1423</span>    Set&lt;String&gt; oldHostsNoLongerPresent = Sets.newTreeSet();<a name="line.1423"></a>
+<span class="sourceLineNo">1424</span><a name="line.1424"></a>
+<span class="sourceLineNo">1425</span>    // If the old servers aren't present, lets assign those regions later.<a name="line.1425"></a>
+<span class="sourceLineNo">1426</span>    List&lt;RegionInfo&gt; randomAssignRegions = Lists.newArrayList();<a name="line.1426"></a>
+<span class="sourceLineNo">1427</span><a name="line.1427"></a>
+<span class="sourceLineNo">1428</span>    int numRandomAssignments = 0;<a name="line.1428"></a>
+<span class="sourceLineNo">1429</span>    int numRetainedAssigments = 0;<a name="line.1429"></a>
+<span class="sourceLineNo">1430</span><a name="line.1430"></a>
+<span class="sourceLineNo">1431</span>    for (Map.Entry&lt;RegionInfo, ServerName&gt; entry : regions.entrySet()) {<a name="line.1431"></a>
+<span class="sourceLineNo">1432</span>      RegionInfo region = entry.getKey();<a name="line.1432"></a>
+<span class="sourceLineNo">1433</span>      ServerName oldServerName = entry.getValue();<a name="line.1433"></a>
+<span class="sourceLineNo">1434</span>      List&lt;ServerName&gt; localServers = new ArrayList&lt;&gt;();<a name="line.1434"></a>
+<span class="sourceLineNo">1435</span>      if (oldServerName != null) {<a name="line.1435"></a>
+<span class="sourceLineNo">1436</span>        localServers = serversByHostname.get(oldServerName.getHostnameLowerCase());<a name="line.1436"></a>
+<span class="sourceLineNo">1437</span>      }<a name="line.1437"></a>
+<span class="sourceLineNo">1438</span>      if (localServers.isEmpty()) {<a name="line.1438"></a>
+<span class="sourceLineNo">1439</span>        // No servers on the new cluster match up with this hostname, assign randomly, later.<a name="line.1439"></a>
+<span class="sourceLineNo">1440</span>        randomAssignRegions.add(region);<a name="line.1440"></a>
+<span class="sourceLineNo">1441</span>        if (oldServerName != null) {<a name="line.1441"></a>
+<span class="sourceLineNo">1442</span>          oldHostsNoLongerPresent.add(oldServerName.getHostnameLowerCase());<a name="line.1442"></a>
+<span class="sourceLineNo">1443</span>        }<a name="line.1443"></a>
+<span class="sourceLineNo">1444</span>      } else if (localServers.size() == 1) {<a name="line.1444"></a>
+<span class="sourceLineNo">1445</span>        // the usual case - one new server on same host<a name="line.1445"></a>
+<span class="sourceLineNo">1446</span>        ServerName target = localServers.get(0);<a name="line.1446"></a>
+<span class="sourceLineNo">1447</span>        assignments.get(target).add(region);<a name="line.1447"></a>
+<span class="sourceLineNo">1448</span>        numRetainedAssigments++;<a name="line.1448"></a>
+<span class="sourceLineNo">1449</span>      } else {<a name="line.1449"></a>
+<span class="sourceLineNo">1450</span>        // multiple new servers in the cluster on this same host<a name="line.1450"></a>
+<span class="sourceLineNo">1451</span>        if (localServers.contains(oldServerName)) {<a name="line.1451"></a>
+<span class="sourceLineNo">1452</span>          assignments.get(oldServerName).add(region);<a name="line.1452"></a>
+<span class="sourceLineNo">1453</span>          numRetainedAssigments++;<a name="line.1453"></a>
+<span class="sourceLineNo">1454</span>        } else {<a name="line.1454"></a>
+<span class="sourceLineNo">1455</span>          ServerName target = null;<a name="line.1455"></a>
+<span class="sourceLineNo">1456</span>          for (ServerName tmp : localServers) {<a name="line.1456"></a>
+<span class="sourceLineNo">1457</span>            if (tmp.getPort() == oldServerName.getPort()) {<a name="line.1457"></a>
+<span class="sourceLineNo">1458</span>              target = tmp;<a name="line.1458"></a>
+<span class="sourceLineNo">1459</span>              assignments.get(tmp).add(region);<a name="line.1459"></a>
+<span class="sourceLineNo">1460</span>              numRetainedAssigments++;<a name="line.1460"></a>
+<span class="sourceLineNo">1461</span>              break;<a name="line.1461"></a>
+<span class="sourceLineNo">1462</span>            }<a name="line.1462"></a>
+<span class="sourceLineNo">1463</span>          }<a name="line.1463"></a>
+<span class="sourceLineNo">1464</span>          if (target == null) {<a name="line.1464"></a>
+<span class="sourceLineNo">1465</span>            randomAssignRegions.add(region);<a name="line.1465"></a>
+<span class="sourceLineNo">1466</span>          }<a name="line.1466"></a>
+<span class="sourceLineNo">1467</span>        }<a name="line.1467"></a>
+<span class="sourceLineNo">1468</span>      }<a name="line.1468"></a>
+<span class="sourceLineNo">1469</span>    }<a name="line.1469"></a>
+<span class="sourceLineNo">1470</span><a name="line.1470"></a>
+<span class="sourceLineNo">1471</span>    // If servers from prior assignment aren't present, then lets do randomAssignment on regions.<a name="line.1471"></a>
+<span class="sourceLineNo">1472</span>    if (randomAssignRegions.size() &gt; 0) {<a name="line.1472"></a>
+<span class="sourceLineNo">1473</span>      Cluster cluster = createCluster(servers, regions.keySet());<a name="line.1473"></a>
+<span class="sourceLineNo">1474</span>      for (Map.Entry&lt;ServerName, List&lt;RegionInfo&gt;&gt; entry : assignments.entrySet()) {<a name="line.1474"></a>
+<span class="sourceLineNo">1475</span>        ServerName sn = entry.getKey();<a name="line.1475"></a>
+<span class="sourceLineNo">1476</span>        for (RegionInfo region : entry.getValue()) {<a name="line.1476"></a>
+<span class="sourceLineNo">1477</span>          cluster.doAssignRegion(region, sn);<a name="line.1477"></a>
+<span class="sourceLineNo">1478</span>        }<a name="line.1478"></a>
+<span class="sourceLineNo">1479</span>      }<a name="line.1479"></a>
+<span class="sourceLineNo">1480</span>      for (RegionInfo region : randomAssignRegions) {<a name="line.1480"></a>
+<span class="sourceLineNo">1481</span>        ServerName target = randomAssignment(cluster, region, servers);<a name="line.1481"></a>
+<span class="sourceLineNo">1482</span>        assignments.get(target).add(region);<a name="line.1482"></a>
+<span class="sourceLineNo">1483</span>        cluster.doAssignRegion(region, target);<a name="line.1483"></a>
+<span class="sourceLineNo">1484</span>        numRandomAssignments++;<a name="line.1484"></a>
+<span class="sourceLineNo">1485</span>      }<a name="line.1485"></a>
+<span class="sourceLineNo">1486</span>    }<a name="line.1486"></a>
+<span class="sourceLineNo">1487</span><a name="line.1487"></a>
+<span class="sourceLineNo">1488</span>    String randomAssignMsg = "";<a name="line.1488"></a>
+<span class="sourceLineNo">1489</span>    if (numRandomAssignments &gt; 0) {<a name="line.1489"></a>
+<span class="sourceLineNo">1490</span>      randomAssignMsg =<a name="line.1490"></a>
+<span class="sourceLineNo">1491</span>          numRandomAssignments + " regions were assigned "<a name="line.1491"></a>
+<span class="sourceLineNo">1492</span>              + "to random hosts, since the old hosts for these regions are no "<a name="line.1492"></a>
+<span class="sourceLineNo">1493</span>              + "longer present in the cluster. These hosts were:\n  "<a name="line.1493"></a>
+<span class="sourceLineNo">1494</span>              + Joiner.on("\n  ").join(oldHostsNoLongerPresent);<a name="line.1494"></a>
+<span class="sourceLineNo">1495</span>    }<a name="line.1495"></a>
+<span class="sourceLineNo">1496</span><a name="line.1496"></a>
+<span class="sourceLineNo">1497</span>    LOG.info("Reassigned " + regions.size() + " regions. " + numRetainedAssigments<a name="line.1497"></a>
+<span class="sourceLineNo">1498</span>        + " retained the pre-restart assignment. " + randomAssignMsg);<a name="line.1498"></a>
+<span class="sourceLineNo">1499</span>    return assignments;<a name="line.1499"></a>
 <span class="sourceLineNo">1500</span>  }<a name="line.1500"></a>
 <span class="sourceLineNo">1501</span><a name="line.1501"></a>
 <span class="sourceLineNo">1502</span>  @Override<a name="line.1502"></a>
-<span class="sourceLineNo">1503</span>  public void regionOffline(RegionInfo regionInfo) {<a name="line.1503"></a>
+<span class="sourceLineNo">1503</span>  public void initialize() throws HBaseIOException{<a name="line.1503"></a>
 <span class="sourceLineNo">1504</span>  }<a name="line.1504"></a>
 <span class="sourceLineNo">1505</span><a name="line.1505"></a>
 <span class="sourceLineNo">1506</span>  @Override<a name="line.1506"></a>
-<span class="sourceLineNo">1507</span>  public boolean isStopped() {<a name="line.1507"></a>
-<span class="sourceLineNo">1508</span>    return stopped;<a name="line.1508"></a>
-<span class="sourceLineNo">1509</span>  }<a name="line.1509"></a>
-<span class="sourceLineNo">1510</span><a name="line.1510"></a>
-<span class="sourceLineNo">1511</span>  @Override<a name="line.1511"></a>
-<span class="sourceLineNo">1512</span>  public void stop(String why) {<a name="line.1512"></a>
-<span class="sourceLineNo">1513</span>    LOG.info("Load Balancer stop requested: "+why);<a name="line.1513"></a>
-<span class="sourceLineNo">1514</span>    stopped = true;<a name="line.1514"></a>
-<span class="sourceLineNo">1515</span>  }<a name="line.1515"></a>
-<span class="sourceLineNo">1516</span><a name="line.1516"></a>
-<span class="sourceLineNo">1517</span>  /**<a name="line.1517"></a>
-<span class="sourceLineNo">1518</span>   * Used to assign a single region to a random server.<a name="line.1518"></a>
-<span class="sourceLineNo">1519</span>   */<a name="line.1519"></a>
-<span class="sourceLineNo">1520</span>  private ServerName randomAssignment(Cluster cluster, RegionInfo regionInfo,<a name="line.1520"></a>
-<span class="sourceLineNo">1521</span>      List&lt;ServerName&gt; servers) {<a name="line.1521"></a>
-<span class="sourceLineNo">1522</span>    int numServers = servers.size(); // servers is not null, numServers &gt; 1<a name="line.1522"></a>
-<span class="sourceLineNo">1523</span>    ServerName sn = null;<a name="line.1523"></a>
-<span class="sourceLineNo">1524</span>    final int maxIterations = numServers * 4;<a name="line.1524"></a>
-<span class="sourceLineNo">1525</span>    int iterations = 0;<a name="line.1525"></a>
-<span class="sourceLineNo">1526</span><a name="line.1526"></a>
-<span class="sourceLineNo">1527</span>    do {<a name="line.1527"></a>
-<span class="sourceLineNo">1528</span>      int i = RANDOM.nextInt(numServers);<a name="line.1528"></a>
-<span class="sourceLineNo">1529</span>      sn = servers.get(i);<a name="line.1529"></a>
-<span class="sourceLineNo">1530</span>    } while (cluster.wouldLowerAvailability(regionInfo, sn)<a name="line.1530"></a>
-<span class="sourceLineNo">1531</span>        &amp;&amp; iterations++ &lt; maxIterations);<a name="line.1531"></a>
-<span class="sourceLineNo">1532</span>    cluster.doAssignRegion(regionInfo, sn);<a name="line.1532"></a>
-<span class="sourceLineNo">1533</span>    return sn;<a name="line.1533"></a>
-<span class="sourceLineNo">1534</span>  }<a name="line.1534"></a>
-<span class="sourceLineNo">1535</span><a name="line.1535"></a>
-<span class="sourceLineNo">1536</span>  /**<a name="line.1536"></a>
-<span class="sourceLineNo">1537</span>   * Round robin a list of regions to a list of servers<a name="line.1537"></a>
-<span class="sourceLineNo">1538</span>   */<a name="line.1538"></a>
-<span class="sourceLineNo">1539</span>  private void roundRobinAssignment(Cluster cluster, List&lt;RegionInfo&gt; regions,<a name="line.1539"></a>
-<span class="sourceLineNo">1540</span>      List&lt;RegionInfo&gt; unassignedRegions, List&lt;ServerName&gt; servers,<a name="line.1540"></a>
-<span class="sourceLineNo">1541</span>      Map&lt;ServerName, List&lt;RegionInfo&gt;&gt; assignments) {<a name="line.1541"></a>
-<span class="sourceLineNo">1542</span><a name="line.1542"></a>
-<span class="sourceLineNo">1543</span>    int numServers = servers.size();<a name="line.1543"></a>
-<span class="sourceLineNo">1544</span>    int numRegions = regions.size();<a name="line.1544"></a>
-<span class="sourceLineNo">1545</span>    int max = (int) Math.ceil((float) numRegions / numServers);<a name="line.1545"></a>
-<span class="sourceLineNo">1546</span>    int serverIdx = 0;<a name="line.1546"></a>
-<span class="sourceLineNo">1547</span>    if (numServers &gt; 1) {<a name="line.1547"></a>
-<span class="sourceLineNo">1548</span>      serverIdx = RANDOM.nextInt(numServers);<a name="line.1548"></a>
-<span class="sourceLineNo">1549</span>    }<a name="line.1549"></a>
-<span class="sourceLineNo">1550</span>    int regionIdx = 0;<a name="line.1550"></a>
-<span class="sourceLineNo">1551</span><a name="line.1551"></a>
-<span class="sourceLineNo">1552</span>    for (int j = 0; j &lt; numServers; j++) {<a name="line.1552"></a>
-<span class="sourceLineNo">1553</span>      ServerName server = servers.get((j + serverIdx) % numServers);<a name="line.1553"></a>
-<span class="sourceLineNo">1554</span>      List&lt;RegionInfo&gt; serverRegions = new ArrayList&lt;&gt;(max);<a name="line.1554"></a>
-<span class="sourceLineNo">1555</span>      for (int i = regionIdx; i &lt; numRegions; i += numServers) {<a name="line.1555"></a>
-<span class="sourceLineNo">1556</span>        RegionInfo region = regions.get(i % numRegions);<a name="line.1556"></a>
-<span class="sourceLineNo">1557</span>        if (cluster.wouldLowerAvailability(region, server)) {<a name="line.1557"></a>
-<span class="sourceLineNo">1558</span>          unassignedRegions.add(region);<a name="line.1558"></a>
-<span class="sourceLineNo">1559</span>        } else {<a name="line.1559"></a>
-<span class="sourceLineNo">1560</span>          serverRegions.add(region);<a name="line.1560"></a>
-<span class="sourceLineNo">1561</span>          cluster.doAssignRegion(region, server);<a name="line.1561"></a>
-<span class="sourceLineNo">1562</span>        }<a name="line.1562"></a>
-<span class="sourceLineNo">1563</span>      }<a name="line.1563"></a>
-<span class="sourceLineNo">1564</span>      assignments.put(server, serverRegions);<a name="line.1564"></a>
-<span class="sourceLineNo">1565</span>      regionIdx++;<a name="line.1565"></a>
-<span class="sourceLineNo">1566</span>    }<a name="line.1566"></a>
-<span class="sourceLineNo">1567</span>  }<a name="line.1567"></a>
-<span class="sourceLineNo">1568</span><a name="line.1568"></a>
-<span class="sourceLineNo">1569</span>  protected Map&lt;ServerName, List&lt;RegionInfo&gt;&gt; getRegionAssignmentsByServer(<a name="line.1569"></a>
-<span class="sourceLineNo">1570</span>    Collection&lt;RegionInfo&gt; regions) {<a name="line.1570"></a>
-<span class="sourceLineNo">1571</span>    if (this.services != null &amp;&amp; this.services.getAssignmentManager() != null) {<a name="line.1571"></a>
-<span class="sourceLineNo">1572</span>      return this.services.getAssignmentManager().getSnapShotOfAssignment(regions);<a name="line.1572"></a>
-<span class="sourceLineNo">1573</span>    } else {<a name="line.1573"></a>
-<span class="sourceLineNo">1574</span>      return new HashMap&lt;&gt;();<a name="line.1574"></a>
-<span class="sourceLineNo">1575</span>    }<a name="line.1575"></a>
-<span class="sourceLineNo">1576</span>  }<a name="line.1576"></a>
-<span class="sourceLineNo">1577</span><a name="line.1577"></a>
-<span class="sourceLineNo">1578</span>  @Override<a name="line.1578"></a>
-<span class="sourceLineNo">1579</span>  public void onConfigurationChange(Configuration conf) {<a name="line.1579"></a>
-<span class="sourceLineNo">1580</span>  }<a name="line.1580"></a>
-<span class="sourceLineNo">1581</span>}<a name="line.1581"></a>
+<span class="sourceLineNo">1507</span>  public void regionOnline(RegionInfo regionInfo, ServerName sn) {<a name="line.1507"></a>
+<span class="sourceLineNo">1508</span>  }<a name="line.1508"></a>
+<span class="sourceLineNo">1509</span><a name="line.1509"></a>
+<span class="sourceLineNo">1510</span>  @Override<a name="line.1510"></a>
+<span class="sourceLineNo">1511</span>  public void regionOffline(RegionInfo regionInfo) {<a name="line.1511"></a>
+<span class="sourceLineNo">1512</span>  }<a name="line.1512"></a>
+<span class="sourceLineNo">1513</span><a name="line.1513"></a>
+<span class="sourceLineNo">1514</span>  @Override<a name="line.1514"></a>
+<span class="sourceLineNo">1515</span>  public boolean isStopped() {<a name="line.1515"></a>
+<span class="sourceLineNo">1516</span>    return stopped;<a name="line.1516"></a>
+<span class="sourceLineNo">1517</span>  }<a name="line.1517"></a>
+<span class="sourceLineNo">1518</span><a name="line.1518"></a>
+<span class="sourceLineNo">1519</span>  @Override<a name="line.1519"></a>
+<span class="sourceLineNo">1520</span>  public void stop(String why) {<a name="line.1520"></a>
+<span class="sourceLineNo">1521</span>    LOG.info("Load Balancer stop requested: "+why);<a name="line.1521"></a>
+<span class="sourceLineNo">1522</span>    stopped = true;<a name="line.1522"></a>
+<span class="sourceLineNo">1523</span>  }<a name="line.1523"></a>
+<span class="sourceLineNo">1524</span><a name="line.1524"></a>
+<span class="sourceLineNo">1525</span>  /**<a name="line.1525"></a>
+<span class="sourceLineNo">1526</span>   * Used to assign a single region to a random server.<a name="line.1526"></a>
+<span class="sourceLineNo">1527</span>   */<a name="line.1527"></a>
+<span class="sourceLineNo">1528</span>  private ServerName randomAssignment(Cluster cluster, RegionInfo regionInfo,<a name="line.1528"></a>
+<span class="sourceLineNo">1529</span>      List&lt;ServerName&gt; servers) {<a name="line.1529"></a>
+<span class="sourceLineNo">1530</span>    int numServers = servers.size(); // servers is not null, numServers &gt; 1<a name="line.1530"></a>
+<span class="sourceLineNo">1531</span>    ServerName sn = null;<a name="line.1531"></a>
+<span class="sourceLineNo">1532</span>    final int maxIterations = numServers * 4;<a name="line.1532"></a>
+<span class="sourceLineNo">1533</span>    int iterations = 0;<a name="line.1533"></a>
+<span class="sourceLineNo">1534</span><a name="line.1534"></a>
+<span class="sourceLineNo">1535</span>    do {<a name="line.1535"></a>
+<span class="sourceLineNo">1536</span>      int i = RANDOM.nextInt(numServers);<a name="line.1536"></a>
+<span class="sourceLineNo">1537</span>      sn = servers.get(i);<a name="line.1537"></a>
+<span class="sourceLineNo">1538</span>    } while (cluster.wouldLowerAvailability(regionInfo, sn)<a name="line.1538"></a>
+<span class="sourceLineNo">1539</span>        &amp;&amp; iterations++ &lt; maxIterations);<a name="line.1539"></a>
+<span class="sourceLineNo">1540</span>    cluster.doAssignRegion(regionInfo, sn);<a name="line.1540"></a>
+<span class="sourceLineNo">1541</span>    return sn;<a name="line.1541"></a>
+<span class="sourceLineNo">1542</span>  }<a name="line.1542"></a>
+<span class="sourceLineNo">1543</span><a name="line.1543"></a>
+<span class="sourceLineNo">1544</span>  /**<a name="line.1544"></a>
+<span class="sourceLineNo">1545</span>   * Round robin a list of regions to a list of servers<a name="line.1545"></a>
+<span class="sourceLineNo">1546</span>   */<a name="line.1546"></a>
+<span class="sourceLineNo">1547</span>  private void roundRobinAssignment(Cluster cluster, List&lt;RegionInfo&gt; regions,<a name="line.1547"></a>
+<span class="sourceLineNo">1548</span>      List&lt;RegionInfo&gt; unassignedRegions, List&lt;ServerName&gt; servers,<a name="line.1548"></a>
+<span class="sourceLineNo">1549</span>      Map&lt;ServerName, List&lt;RegionInfo&gt;&gt; assignments) {<a name="line.1549"></a>
+<span class="sourceLineNo">1550</span><a name="line.1550"></a>
+<span class="sourceLineNo">1551</span>    int numServers = servers.size();<a name="line.1551"></a>
+<span class="sourceLineNo">1552</span>    int numRegions = regions.size();<a name="line.1552"></a>
+<span class="sourceLineNo">1553</span>    int max = (int) Math.ceil((float) numRegions / numServers);<a name="line.1553"></a>
+<span class="sourceLineNo">1554</span>    int serverIdx = 0;<a name="line.1554"></a>
+<span class="sourceLineNo">1555</span>    if (numServers &gt; 1) {<a name="line.1555"></a>
+<span class="sourceLineNo">1556</span>      serverIdx = RANDOM.nextInt(numServers);<a name="line.1556"></a>
+<span class="sourceLineNo">1557</span>    }<a name="line.1557"></a>
+<span class="sourceLineNo">1558</span>    int regionIdx = 0;<a name="line.1558"></a>
+<span class="sourceLineNo">1559</span><a name="line.1559"></a>
+<span class="sourceLineNo">1560</span>    for (int j = 0; j &lt; numServers; j++) {<a name="line.1560"></a>
+<span class="sourceLineNo">1561</span>      ServerName server = servers.get((j + serverIdx) % numServers);<a name="line.1561"></a>
+<span class="sourceLineNo">1562</span>      List&lt;RegionInfo&gt; serverRegions = new ArrayList&lt;&gt;(max);<a name="line.1562"></a>
+<span class="sourceLineNo">1563</span>      for (int i = regionIdx; i &lt; numRegions; i += numServers) {<a name="line.1563"></a>
+<span class="sourceLineNo">1564</span>        RegionInfo region = regions.get(i % numRegions);<a name="line.1564"></a>
+<span class="sourceLineNo">1565</span>        if (cluster.wouldLowerAvailability(region, server)) {<a name="line.1565"></a>
+<span class="sourceLineNo">1566</span>          unassignedRegions.add(region);<a name="line.1566"></a>
+<span class="sourceLineNo">1567</span>        } else {<a name="line.1567"></a>
+<span class="sourceLineNo">1568</span>          serverRegions.add(region);<a name="line.1568"></a>
+<span class="sourceLineNo">1569</span>          cluster.doAssignRegion(region, server);<a name="line.1569"></a>
+<span class="sourceLineNo">1570</span>        }<a name="line.1570"></a>
+<span class="sourceLineNo">1571</span>      }<a name="line.1571"></a>
+<span class="sourceLineNo">1572</span>      assignments.put(server, serverRegions);<a name="line.1572"></a>
+<span class="sourceLineNo">1573</span>      regionIdx++;<a name="line.1573"></a>
+<span class="sourceLineNo">1574</span>    }<a name="line.1574"></a>
+<span class="sourceLineNo">1575</span>  }<a name="line.1575"></a>
+<span class="sourceLineNo">1576</span><a name="line.1576"></a>
+<span class="sourceLineNo">1577</span>  protected Map&lt;ServerName, List&lt;RegionInfo&gt;&gt; getRegionAssignmentsByServer(<a name="line.1577"></a>
+<span class="sourceLineNo">1578</span>    Collection&lt;RegionInfo&gt; regions) {<a name="line.1578"></a>
+<span class="sourceLineNo">1579</span>    if (this.services != null &amp;&amp; this.services.getAssignmentManager() != null) {<a name="line.1579"></a>
+<span class="sourceLineNo">1580</span>      return this.services.getAssignmentManager().getSnapShotOfAssignment(regions);<a name="line.1580"></a>
+<span class="sourceLineNo">1581</span>    } else {<a name="line.1581"></a>
+<span class="sourceLineNo">1582</span>      return new HashMap&lt;&gt;();<a name="line.1582"></a>
+<span class="sourceLineNo">1583</span>    }<a name="line.1583"></a>
+<span class="sourceLineNo">1584</span>  }<a name="line.1584"></a>
+<span class="sourceLineNo">1585</span><a name="line.1585"></a>
+<span class="sourceLineNo">1586</span>  @Override<a name="line.1586"></a>
+<span class="sourceLineNo">1587</span>  public void onConfigurationChange(Configuration conf) {<a name="line.1587"></a>
+<span class="sourceLineNo">1588</span>  }<a name="line.1588"></a>
+<span class="sourceLineNo">1589</span>}<a name="line.1589"></a>
 
 
 


[11/29] hbase-site git commit: Published site at 477f9fdb32873387231c5fbbff130ba8bf7b5d68.

Posted by gi...@apache.org.
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/621479e1/devapidocs/src-html/org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.Cluster.MoveRegionAction.html
----------------------------------------------------------------------
diff --git a/devapidocs/src-html/org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.Cluster.MoveRegionAction.html b/devapidocs/src-html/org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.Cluster.MoveRegionAction.html
index 7f42212..d4bf03c 100644
--- a/devapidocs/src-html/org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.Cluster.MoveRegionAction.html
+++ b/devapidocs/src-html/org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.Cluster.MoveRegionAction.html
@@ -1159,434 +1159,442 @@
 <span class="sourceLineNo">1151</span>    }<a name="line.1151"></a>
 <span class="sourceLineNo">1152</span>  }<a name="line.1152"></a>
 <span class="sourceLineNo">1153</span><a name="line.1153"></a>
-<span class="sourceLineNo">1154</span>  public void setRackManager(RackManager rackManager) {<a name="line.1154"></a>
-<span class="sourceLineNo">1155</span>    this.rackManager = rackManager;<a name="line.1155"></a>
-<span class="sourceLineNo">1156</span>  }<a name="line.1156"></a>
-<span class="sourceLineNo">1157</span><a name="line.1157"></a>
-<span class="sourceLineNo">1158</span>  protected boolean needsBalance(Cluster c) {<a name="line.1158"></a>
-<span class="sourceLineNo">1159</span>    ClusterLoadState cs = new ClusterLoadState(c.clusterState);<a name="line.1159"></a>
-<span class="sourceLineNo">1160</span>    if (cs.getNumServers() &lt; MIN_SERVER_BALANCE) {<a name="line.1160"></a>
-<span class="sourceLineNo">1161</span>      if (LOG.isDebugEnabled()) {<a name="line.1161"></a>
-<span class="sourceLineNo">1162</span>        LOG.debug("Not running balancer because only " + cs.getNumServers()<a name="line.1162"></a>
-<span class="sourceLineNo">1163</span>            + " active regionserver(s)");<a name="line.1163"></a>
-<span class="sourceLineNo">1164</span>      }<a name="line.1164"></a>
-<span class="sourceLineNo">1165</span>      return false;<a name="line.1165"></a>
-<span class="sourceLineNo">1166</span>    }<a name="line.1166"></a>
-<span class="sourceLineNo">1167</span>    if(areSomeRegionReplicasColocated(c)) return true;<a name="line.1167"></a>
-<span class="sourceLineNo">1168</span>    // Check if we even need to do any load balancing<a name="line.1168"></a>
-<span class="sourceLineNo">1169</span>    // HBASE-3681 check sloppiness first<a name="line.1169"></a>
-<span class="sourceLineNo">1170</span>    float average = cs.getLoadAverage(); // for logging<a name="line.1170"></a>
-<span class="sourceLineNo">1171</span>    int floor = (int) Math.floor(average * (1 - slop));<a name="line.1171"></a>
-<span class="sourceLineNo">1172</span>    int ceiling = (int) Math.ceil(average * (1 + slop));<a name="line.1172"></a>
-<span class="sourceLineNo">1173</span>    if (!(cs.getMaxLoad() &gt; ceiling || cs.getMinLoad() &lt; floor)) {<a name="line.1173"></a>
-<span class="sourceLineNo">1174</span>      NavigableMap&lt;ServerAndLoad, List&lt;RegionInfo&gt;&gt; serversByLoad = cs.getServersByLoad();<a name="line.1174"></a>
-<span class="sourceLineNo">1175</span>      if (LOG.isTraceEnabled()) {<a name="line.1175"></a>
-<span class="sourceLineNo">1176</span>        // If nothing to balance, then don't say anything unless trace-level logging.<a name="line.1176"></a>
-<span class="sourceLineNo">1177</span>        LOG.trace("Skipping load balancing because balanced cluster; " +<a name="line.1177"></a>
-<span class="sourceLineNo">1178</span>          "servers=" + cs.getNumServers() +<a name="line.1178"></a>
-<span class="sourceLineNo">1179</span>          " regions=" + cs.getNumRegions() + " average=" + average +<a name="line.1179"></a>
-<span class="sourceLineNo">1180</span>          " mostloaded=" + serversByLoad.lastKey().getLoad() +<a name="line.1180"></a>
-<span class="sourceLineNo">1181</span>          " leastloaded=" + serversByLoad.firstKey().getLoad());<a name="line.1181"></a>
-<span class="sourceLineNo">1182</span>      }<a name="line.1182"></a>
-<span class="sourceLineNo">1183</span>      return false;<a name="line.1183"></a>
-<span class="sourceLineNo">1184</span>    }<a name="line.1184"></a>
-<span class="sourceLineNo">1185</span>    return true;<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>   * Subclasses should implement this to return true if the cluster has nodes that hosts<a name="line.1189"></a>
-<span class="sourceLineNo">1190</span>   * multiple replicas for the same region, or, if there are multiple racks and the same<a name="line.1190"></a>
-<span class="sourceLineNo">1191</span>   * rack hosts replicas of the same region<a name="line.1191"></a>
-<span class="sourceLineNo">1192</span>   * @param c Cluster information<a name="line.1192"></a>
-<span class="sourceLineNo">1193</span>   * @return whether region replicas are currently co-located<a name="line.1193"></a>
-<span class="sourceLineNo">1194</span>   */<a name="line.1194"></a>
-<span class="sourceLineNo">1195</span>  protected boolean areSomeRegionReplicasColocated(Cluster c) {<a name="line.1195"></a>
-<span class="sourceLineNo">1196</span>    return false;<a name="line.1196"></a>
-<span class="sourceLineNo">1197</span>  }<a name="line.1197"></a>
-<span class="sourceLineNo">1198</span><a name="line.1198"></a>
-<span class="sourceLineNo">1199</span>  /**<a name="line.1199"></a>
-<span class="sourceLineNo">1200</span>   * Generates a bulk assignment plan to be used on cluster startup using a<a name="line.1200"></a>
-<span class="sourceLineNo">1201</span>   * simple round-robin assignment.<a name="line.1201"></a>
-<span class="sourceLineNo">1202</span>   * &lt;p&gt;<a name="line.1202"></a>
-<span class="sourceLineNo">1203</span>   * Takes a list of all the regions and all the servers in the cluster and<a name="line.1203"></a>
-<span class="sourceLineNo">1204</span>   * returns a map of each server to the regions that it should be assigned.<a name="line.1204"></a>
-<span class="sourceLineNo">1205</span>   * &lt;p&gt;<a name="line.1205"></a>
-<span class="sourceLineNo">1206</span>   * Currently implemented as a round-robin assignment. Same invariant as load<a name="line.1206"></a>
-<span class="sourceLineNo">1207</span>   * balancing, all servers holding floor(avg) or ceiling(avg).<a name="line.1207"></a>
-<span class="sourceLineNo">1208</span>   *<a name="line.1208"></a>
-<span class="sourceLineNo">1209</span>   * TODO: Use block locations from HDFS to place regions with their blocks<a name="line.1209"></a>
-<span class="sourceLineNo">1210</span>   *<a name="line.1210"></a>
-<span class="sourceLineNo">1211</span>   * @param regions all regions<a name="line.1211"></a>
-<span class="sourceLineNo">1212</span>   * @param servers all servers<a name="line.1212"></a>
-<span class="sourceLineNo">1213</span>   * @return map of server to the regions it should take, or null if no<a name="line.1213"></a>
-<span class="sourceLineNo">1214</span>   *         assignment is possible (ie. no regions or no servers)<a name="line.1214"></a>
-<span class="sourceLineNo">1215</span>   */<a name="line.1215"></a>
-<span class="sourceLineNo">1216</span>  @Override<a name="line.1216"></a>
-<span class="sourceLineNo">1217</span>  public Map&lt;ServerName, List&lt;RegionInfo&gt;&gt; roundRobinAssignment(List&lt;RegionInfo&gt; regions,<a name="line.1217"></a>
-<span class="sourceLineNo">1218</span>      List&lt;ServerName&gt; servers) throws HBaseIOException {<a name="line.1218"></a>
-<span class="sourceLineNo">1219</span>    metricsBalancer.incrMiscInvocations();<a name="line.1219"></a>
-<span class="sourceLineNo">1220</span>    Map&lt;ServerName, List&lt;RegionInfo&gt;&gt; assignments = assignMasterSystemRegions(regions, servers);<a name="line.1220"></a>
-<span class="sourceLineNo">1221</span>    if (assignments != null &amp;&amp; !assignments.isEmpty()) {<a name="line.1221"></a>
-<span class="sourceLineNo">1222</span>      servers = new ArrayList&lt;&gt;(servers);<a name="line.1222"></a>
-<span class="sourceLineNo">1223</span>      // Guarantee not to put other regions on master<a name="line.1223"></a>
-<span class="sourceLineNo">1224</span>      servers.remove(masterServerName);<a name="line.1224"></a>
-<span class="sourceLineNo">1225</span>      List&lt;RegionInfo&gt; masterRegions = assignments.get(masterServerName);<a name="line.1225"></a>
-<span class="sourceLineNo">1226</span>      if (!masterRegions.isEmpty()) {<a name="line.1226"></a>
-<span class="sourceLineNo">1227</span>        regions = new ArrayList&lt;&gt;(regions);<a name="line.1227"></a>
-<span class="sourceLineNo">1228</span>        regions.removeAll(masterRegions);<a name="line.1228"></a>
-<span class="sourceLineNo">1229</span>      }<a name="line.1229"></a>
-<span class="sourceLineNo">1230</span>    }<a name="line.1230"></a>
-<span class="sourceLineNo">1231</span>    if (regions == null || regions.isEmpty()) {<a name="line.1231"></a>
-<span class="sourceLineNo">1232</span>      return assignments;<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>    int numServers = servers == null ? 0 : servers.size();<a name="line.1235"></a>
-<span class="sourceLineNo">1236</span>    if (numServers == 0) {<a name="line.1236"></a>
-<span class="sourceLineNo">1237</span>      LOG.warn("Wanted to do round robin assignment but no servers to assign to");<a name="line.1237"></a>
-<span class="sourceLineNo">1238</span>      return null;<a name="line.1238"></a>
-<span class="sourceLineNo">1239</span>    }<a name="line.1239"></a>
-<span class="sourceLineNo">1240</span><a name="line.1240"></a>
-<span class="sourceLineNo">1241</span>    // TODO: instead of retainAssignment() and roundRobinAssignment(), we should just run the<a name="line.1241"></a>
-<span class="sourceLineNo">1242</span>    // normal LB.balancerCluster() with unassignedRegions. We only need to have a candidate<a name="line.1242"></a>
-<span class="sourceLineNo">1243</span>    // generator for AssignRegionAction. The LB will ensure the regions are mostly local<a name="line.1243"></a>
-<span class="sourceLineNo">1244</span>    // and balanced. This should also run fast with fewer number of iterations.<a name="line.1244"></a>
-<span class="sourceLineNo">1245</span><a name="line.1245"></a>
-<span class="sourceLineNo">1246</span>    if (numServers == 1) { // Only one server, nothing fancy we can do here<a name="line.1246"></a>
-<span class="sourceLineNo">1247</span>      ServerName server = servers.get(0);<a name="line.1247"></a>
-<span class="sourceLineNo">1248</span>      assignments.put(server, new ArrayList&lt;&gt;(regions));<a name="line.1248"></a>
-<span class="sourceLineNo">1249</span>      return assignments;<a name="line.1249"></a>
-<span class="sourceLineNo">1250</span>    }<a name="line.1250"></a>
-<span class="sourceLineNo">1251</span><a name="line.1251"></a>
-<span class="sourceLineNo">1252</span>    Cluster cluster = createCluster(servers, regions, false);<a name="line.1252"></a>
-<span class="sourceLineNo">1253</span>    List&lt;RegionInfo&gt; unassignedRegions = new ArrayList&lt;&gt;();<a name="line.1253"></a>
-<span class="sourceLineNo">1254</span><a name="line.1254"></a>
-<span class="sourceLineNo">1255</span>    roundRobinAssignment(cluster, regions, unassignedRegions,<a name="line.1255"></a>
-<span class="sourceLineNo">1256</span>      servers, assignments);<a name="line.1256"></a>
-<span class="sourceLineNo">1257</span><a name="line.1257"></a>
-<span class="sourceLineNo">1258</span>    List&lt;RegionInfo&gt; lastFewRegions = new ArrayList&lt;&gt;();<a name="line.1258"></a>
-<span class="sourceLineNo">1259</span>    // assign the remaining by going through the list and try to assign to servers one-by-one<a name="line.1259"></a>
-<span class="sourceLineNo">1260</span>    int serverIdx = RANDOM.nextInt(numServers);<a name="line.1260"></a>
-<span class="sourceLineNo">1261</span>    for (RegionInfo region : unassignedRegions) {<a name="line.1261"></a>
-<span class="sourceLineNo">1262</span>      boolean assigned = false;<a name="line.1262"></a>
-<span class="sourceLineNo">1263</span>      for (int j = 0; j &lt; numServers; j++) { // try all servers one by one<a name="line.1263"></a>
-<span class="sourceLineNo">1264</span>        ServerName serverName = servers.get((j + serverIdx) % numServers);<a name="line.1264"></a>
-<span class="sourceLineNo">1265</span>        if (!cluster.wouldLowerAvailability(region, serverName)) {<a name="line.1265"></a>
-<span class="sourceLineNo">1266</span>          List&lt;RegionInfo&gt; serverRegions =<a name="line.1266"></a>
-<span class="sourceLineNo">1267</span>              assignments.computeIfAbsent(serverName, k -&gt; new ArrayList&lt;&gt;());<a name="line.1267"></a>
-<span class="sourceLineNo">1268</span>          serverRegions.add(region);<a name="line.1268"></a>
-<span class="sourceLineNo">1269</span>          cluster.doAssignRegion(region, serverName);<a name="line.1269"></a>
-<span class="sourceLineNo">1270</span>          serverIdx = (j + serverIdx + 1) % numServers; //remain from next server<a name="line.1270"></a>
-<span class="sourceLineNo">1271</span>          assigned = true;<a name="line.1271"></a>
-<span class="sourceLineNo">1272</span>          break;<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>      if (!assigned) {<a name="line.1275"></a>
-<span class="sourceLineNo">1276</span>        lastFewRegions.add(region);<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>    // just sprinkle the rest of the regions on random regionservers. The balanceCluster will<a name="line.1279"></a>
-<span class="sourceLineNo">1280</span>    // make it optimal later. we can end up with this if numReplicas &gt; numServers.<a name="line.1280"></a>
-<span class="sourceLineNo">1281</span>    for (RegionInfo region : lastFewRegions) {<a name="line.1281"></a>
-<span class="sourceLineNo">1282</span>      int i = RANDOM.nextInt(numServers);<a name="line.1282"></a>
-<span class="sourceLineNo">1283</span>      ServerName server = servers.get(i);<a name="line.1283"></a>
-<span class="sourceLineNo">1284</span>      List&lt;RegionInfo&gt; serverRegions = assignments.computeIfAbsent(server, k -&gt; new ArrayList&lt;&gt;());<a name="line.1284"></a>
-<span class="sourceLineNo">1285</span>      serverRegions.add(region);<a name="line.1285"></a>
-<span class="sourceLineNo">1286</span>      cluster.doAssignRegion(region, server);<a name="line.1286"></a>
-<span class="sourceLineNo">1287</span>    }<a name="line.1287"></a>
-<span class="sourceLineNo">1288</span>    return assignments;<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>  protected Cluster createCluster(List&lt;ServerName&gt; servers,<a name="line.1291"></a>
-<span class="sourceLineNo">1292</span>      Collection&lt;RegionInfo&gt; regions, boolean forceRefresh) {<a name="line.1292"></a>
-<span class="sourceLineNo">1293</span>    if (forceRefresh &amp;&amp; useRegionFinder) {<a name="line.1293"></a>
-<span class="sourceLineNo">1294</span>      regionFinder.refreshAndWait(regions);<a name="line.1294"></a>
-<span class="sourceLineNo">1295</span>    }<a name="line.1295"></a>
-<span class="sourceLineNo">1296</span>    // Get the snapshot of the current assignments for the regions in question, and then create<a name="line.1296"></a>
-<span class="sourceLineNo">1297</span>    // a cluster out of it. Note that we might have replicas already assigned to some servers<a name="line.1297"></a>
-<span class="sourceLineNo">1298</span>    // earlier. So we want to get the snapshot to see those assignments, but this will only contain<a name="line.1298"></a>
-<span class="sourceLineNo">1299</span>    // replicas of the regions that are passed (for performance).<a name="line.1299"></a>
-<span class="sourceLineNo">1300</span>    Map&lt;ServerName, List&lt;RegionInfo&gt;&gt; clusterState = getRegionAssignmentsByServer(regions);<a name="line.1300"></a>
-<span class="sourceLineNo">1301</span><a name="line.1301"></a>
-<span class="sourceLineNo">1302</span>    for (ServerName server : servers) {<a name="line.1302"></a>
-<span class="sourceLineNo">1303</span>      if (!clusterState.containsKey(server)) {<a name="line.1303"></a>
-<span class="sourceLineNo">1304</span>        clusterState.put(server, EMPTY_REGION_LIST);<a name="line.1304"></a>
-<span class="sourceLineNo">1305</span>      }<a name="line.1305"></a>
-<span class="sourceLineNo">1306</span>    }<a name="line.1306"></a>
-<span class="sourceLineNo">1307</span>    return new Cluster(regions, clusterState, null, this.regionFinder,<a name="line.1307"></a>
-<span class="sourceLineNo">1308</span>        rackManager);<a name="line.1308"></a>
-<span class="sourceLineNo">1309</span>  }<a name="line.1309"></a>
+<span class="sourceLineNo">1154</span>  @Override<a name="line.1154"></a>
+<span class="sourceLineNo">1155</span>  public void postMasterStartupInitialize() {<a name="line.1155"></a>
+<span class="sourceLineNo">1156</span>    if (services != null &amp;&amp; regionFinder != null) {<a name="line.1156"></a>
+<span class="sourceLineNo">1157</span>      try {<a name="line.1157"></a>
+<span class="sourceLineNo">1158</span>        Set&lt;RegionInfo&gt; regions =<a name="line.1158"></a>
+<span class="sourceLineNo">1159</span>            services.getAssignmentManager().getRegionStates().getRegionAssignments().keySet();<a name="line.1159"></a>
+<span class="sourceLineNo">1160</span>        regionFinder.refreshAndWait(regions);<a name="line.1160"></a>
+<span class="sourceLineNo">1161</span>      } catch (Exception e) {<a name="line.1161"></a>
+<span class="sourceLineNo">1162</span>        LOG.warn("Refreshing region HDFS Block dist failed with exception, ignoring", e);<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>  }<a name="line.1165"></a>
+<span class="sourceLineNo">1166</span><a name="line.1166"></a>
+<span class="sourceLineNo">1167</span>  public void setRackManager(RackManager rackManager) {<a name="line.1167"></a>
+<span class="sourceLineNo">1168</span>    this.rackManager = rackManager;<a name="line.1168"></a>
+<span class="sourceLineNo">1169</span>  }<a name="line.1169"></a>
+<span class="sourceLineNo">1170</span><a name="line.1170"></a>
+<span class="sourceLineNo">1171</span>  protected boolean needsBalance(Cluster c) {<a name="line.1171"></a>
+<span class="sourceLineNo">1172</span>    ClusterLoadState cs = new ClusterLoadState(c.clusterState);<a name="line.1172"></a>
+<span class="sourceLineNo">1173</span>    if (cs.getNumServers() &lt; MIN_SERVER_BALANCE) {<a name="line.1173"></a>
+<span class="sourceLineNo">1174</span>      if (LOG.isDebugEnabled()) {<a name="line.1174"></a>
+<span class="sourceLineNo">1175</span>        LOG.debug("Not running balancer because only " + cs.getNumServers()<a name="line.1175"></a>
+<span class="sourceLineNo">1176</span>            + " active regionserver(s)");<a name="line.1176"></a>
+<span class="sourceLineNo">1177</span>      }<a name="line.1177"></a>
+<span class="sourceLineNo">1178</span>      return false;<a name="line.1178"></a>
+<span class="sourceLineNo">1179</span>    }<a name="line.1179"></a>
+<span class="sourceLineNo">1180</span>    if(areSomeRegionReplicasColocated(c)) return true;<a name="line.1180"></a>
+<span class="sourceLineNo">1181</span>    // Check if we even need to do any load balancing<a name="line.1181"></a>
+<span class="sourceLineNo">1182</span>    // HBASE-3681 check sloppiness first<a name="line.1182"></a>
+<span class="sourceLineNo">1183</span>    float average = cs.getLoadAverage(); // for logging<a name="line.1183"></a>
+<span class="sourceLineNo">1184</span>    int floor = (int) Math.floor(average * (1 - slop));<a name="line.1184"></a>
+<span class="sourceLineNo">1185</span>    int ceiling = (int) Math.ceil(average * (1 + slop));<a name="line.1185"></a>
+<span class="sourceLineNo">1186</span>    if (!(cs.getMaxLoad() &gt; ceiling || cs.getMinLoad() &lt; floor)) {<a name="line.1186"></a>
+<span class="sourceLineNo">1187</span>      NavigableMap&lt;ServerAndLoad, List&lt;RegionInfo&gt;&gt; serversByLoad = cs.getServersByLoad();<a name="line.1187"></a>
+<span class="sourceLineNo">1188</span>      if (LOG.isTraceEnabled()) {<a name="line.1188"></a>
+<span class="sourceLineNo">1189</span>        // If nothing to balance, then don't say anything unless trace-level logging.<a name="line.1189"></a>
+<span class="sourceLineNo">1190</span>        LOG.trace("Skipping load balancing because balanced cluster; " +<a name="line.1190"></a>
+<span class="sourceLineNo">1191</span>          "servers=" + cs.getNumServers() +<a name="line.1191"></a>
+<span class="sourceLineNo">1192</span>          " regions=" + cs.getNumRegions() + " average=" + average +<a name="line.1192"></a>
+<span class="sourceLineNo">1193</span>          " mostloaded=" + serversByLoad.lastKey().getLoad() +<a name="line.1193"></a>
+<span class="sourceLineNo">1194</span>          " leastloaded=" + serversByLoad.firstKey().getLoad());<a name="line.1194"></a>
+<span class="sourceLineNo">1195</span>      }<a name="line.1195"></a>
+<span class="sourceLineNo">1196</span>      return false;<a name="line.1196"></a>
+<span class="sourceLineNo">1197</span>    }<a name="line.1197"></a>
+<span class="sourceLineNo">1198</span>    return true;<a name="line.1198"></a>
+<span class="sourceLineNo">1199</span>  }<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>   * Subclasses should implement this to return true if the cluster has nodes that hosts<a name="line.1202"></a>
+<span class="sourceLineNo">1203</span>   * multiple replicas for the same region, or, if there are multiple racks and the same<a name="line.1203"></a>
+<span class="sourceLineNo">1204</span>   * rack hosts replicas of the same region<a name="line.1204"></a>
+<span class="sourceLineNo">1205</span>   * @param c Cluster information<a name="line.1205"></a>
+<span class="sourceLineNo">1206</span>   * @return whether region replicas are currently co-located<a name="line.1206"></a>
+<span class="sourceLineNo">1207</span>   */<a name="line.1207"></a>
+<span class="sourceLineNo">1208</span>  protected boolean areSomeRegionReplicasColocated(Cluster c) {<a name="line.1208"></a>
+<span class="sourceLineNo">1209</span>    return false;<a name="line.1209"></a>
+<span class="sourceLineNo">1210</span>  }<a name="line.1210"></a>
+<span class="sourceLineNo">1211</span><a name="line.1211"></a>
+<span class="sourceLineNo">1212</span>  /**<a name="line.1212"></a>
+<span class="sourceLineNo">1213</span>   * Generates a bulk assignment plan to be used on cluster startup using a<a name="line.1213"></a>
+<span class="sourceLineNo">1214</span>   * simple round-robin assignment.<a name="line.1214"></a>
+<span class="sourceLineNo">1215</span>   * &lt;p&gt;<a name="line.1215"></a>
+<span class="sourceLineNo">1216</span>   * Takes a list of all the regions and all the servers in the cluster and<a name="line.1216"></a>
+<span class="sourceLineNo">1217</span>   * returns a map of each server to the regions that it should be assigned.<a name="line.1217"></a>
+<span class="sourceLineNo">1218</span>   * &lt;p&gt;<a name="line.1218"></a>
+<span class="sourceLineNo">1219</span>   * Currently implemented as a round-robin assignment. Same invariant as load<a name="line.1219"></a>
+<span class="sourceLineNo">1220</span>   * balancing, all servers holding floor(avg) or ceiling(avg).<a name="line.1220"></a>
+<span class="sourceLineNo">1221</span>   *<a name="line.1221"></a>
+<span class="sourceLineNo">1222</span>   * TODO: Use block locations from HDFS to place regions with their blocks<a name="line.1222"></a>
+<span class="sourceLineNo">1223</span>   *<a name="line.1223"></a>
+<span class="sourceLineNo">1224</span>   * @param regions all regions<a name="line.1224"></a>
+<span class="sourceLineNo">1225</span>   * @param servers all servers<a name="line.1225"></a>
+<span class="sourceLineNo">1226</span>   * @return map of server to the regions it should take, or null if no<a name="line.1226"></a>
+<span class="sourceLineNo">1227</span>   *         assignment is possible (ie. no regions or no servers)<a name="line.1227"></a>
+<span class="sourceLineNo">1228</span>   */<a name="line.1228"></a>
+<span class="sourceLineNo">1229</span>  @Override<a name="line.1229"></a>
+<span class="sourceLineNo">1230</span>  public Map&lt;ServerName, List&lt;RegionInfo&gt;&gt; roundRobinAssignment(List&lt;RegionInfo&gt; regions,<a name="line.1230"></a>
+<span class="sourceLineNo">1231</span>      List&lt;ServerName&gt; servers) throws HBaseIOException {<a name="line.1231"></a>
+<span class="sourceLineNo">1232</span>    metricsBalancer.incrMiscInvocations();<a name="line.1232"></a>
+<span class="sourceLineNo">1233</span>    Map&lt;ServerName, List&lt;RegionInfo&gt;&gt; assignments = assignMasterSystemRegions(regions, servers);<a name="line.1233"></a>
+<span class="sourceLineNo">1234</span>    if (assignments != null &amp;&amp; !assignments.isEmpty()) {<a name="line.1234"></a>
+<span class="sourceLineNo">1235</span>      servers = new ArrayList&lt;&gt;(servers);<a name="line.1235"></a>
+<span class="sourceLineNo">1236</span>      // Guarantee not to put other regions on master<a name="line.1236"></a>
+<span class="sourceLineNo">1237</span>      servers.remove(masterServerName);<a name="line.1237"></a>
+<span class="sourceLineNo">1238</span>      List&lt;RegionInfo&gt; masterRegions = assignments.get(masterServerName);<a name="line.1238"></a>
+<span class="sourceLineNo">1239</span>      if (!masterRegions.isEmpty()) {<a name="line.1239"></a>
+<span class="sourceLineNo">1240</span>        regions = new ArrayList&lt;&gt;(regions);<a name="line.1240"></a>
+<span class="sourceLineNo">1241</span>        regions.removeAll(masterRegions);<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>    if (regions == null || regions.isEmpty()) {<a name="line.1244"></a>
+<span class="sourceLineNo">1245</span>      return assignments;<a name="line.1245"></a>
+<span class="sourceLineNo">1246</span>    }<a name="line.1246"></a>
+<span class="sourceLineNo">1247</span><a name="line.1247"></a>
+<span class="sourceLineNo">1248</span>    int numServers = servers == null ? 0 : servers.size();<a name="line.1248"></a>
+<span class="sourceLineNo">1249</span>    if (numServers == 0) {<a name="line.1249"></a>
+<span class="sourceLineNo">1250</span>      LOG.warn("Wanted to do round robin assignment but no servers to assign to");<a name="line.1250"></a>
+<span class="sourceLineNo">1251</span>      return null;<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>    // TODO: instead of retainAssignment() and roundRobinAssignment(), we should just run the<a name="line.1254"></a>
+<span class="sourceLineNo">1255</span>    // normal LB.balancerCluster() with unassignedRegions. We only need to have a candidate<a name="line.1255"></a>
+<span class="sourceLineNo">1256</span>    // generator for AssignRegionAction. The LB will ensure the regions are mostly local<a name="line.1256"></a>
+<span class="sourceLineNo">1257</span>    // and balanced. This should also run fast with fewer number of iterations.<a name="line.1257"></a>
+<span class="sourceLineNo">1258</span><a name="line.1258"></a>
+<span class="sourceLineNo">1259</span>    if (numServers == 1) { // Only one server, nothing fancy we can do here<a name="line.1259"></a>
+<span class="sourceLineNo">1260</span>      ServerName server = servers.get(0);<a name="line.1260"></a>
+<span class="sourceLineNo">1261</span>      assignments.put(server, new ArrayList&lt;&gt;(regions));<a name="line.1261"></a>
+<span class="sourceLineNo">1262</span>      return assignments;<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>    Cluster cluster = createCluster(servers, regions);<a name="line.1265"></a>
+<span class="sourceLineNo">1266</span>    List&lt;RegionInfo&gt; unassignedRegions = new ArrayList&lt;&gt;();<a name="line.1266"></a>
+<span class="sourceLineNo">1267</span><a name="line.1267"></a>
+<span class="sourceLineNo">1268</span>    roundRobinAssignment(cluster, regions, unassignedRegions,<a name="line.1268"></a>
+<span class="sourceLineNo">1269</span>      servers, assignments);<a name="line.1269"></a>
+<span class="sourceLineNo">1270</span><a name="line.1270"></a>
+<span class="sourceLineNo">1271</span>    List&lt;RegionInfo&gt; lastFewRegions = new ArrayList&lt;&gt;();<a name="line.1271"></a>
+<span class="sourceLineNo">1272</span>    // assign the remaining by going through the list and try to assign to servers one-by-one<a name="line.1272"></a>
+<span class="sourceLineNo">1273</span>    int serverIdx = RANDOM.nextInt(numServers);<a name="line.1273"></a>
+<span class="sourceLineNo">1274</span>    for (RegionInfo region : unassignedRegions) {<a name="line.1274"></a>
+<span class="sourceLineNo">1275</span>      boolean assigned = false;<a name="line.1275"></a>
+<span class="sourceLineNo">1276</span>      for (int j = 0; j &lt; numServers; j++) { // try all servers one by one<a name="line.1276"></a>
+<span class="sourceLineNo">1277</span>        ServerName serverName = servers.get((j + serverIdx) % numServers);<a name="line.1277"></a>
+<span class="sourceLineNo">1278</span>        if (!cluster.wouldLowerAvailability(region, serverName)) {<a name="line.1278"></a>
+<span class="sourceLineNo">1279</span>          List&lt;RegionInfo&gt; serverRegions =<a name="line.1279"></a>
+<span class="sourceLineNo">1280</span>              assignments.computeIfAbsent(serverName, k -&gt; new ArrayList&lt;&gt;());<a name="line.1280"></a>
+<span class="sourceLineNo">1281</span>          serverRegions.add(region);<a name="line.1281"></a>
+<span class="sourceLineNo">1282</span>          cluster.doAssignRegion(region, serverName);<a name="line.1282"></a>
+<span class="sourceLineNo">1283</span>          serverIdx = (j + serverIdx + 1) % numServers; //remain from next server<a name="line.1283"></a>
+<span class="sourceLineNo">1284</span>          assigned = true;<a name="line.1284"></a>
+<span class="sourceLineNo">1285</span>          break;<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>      if (!assigned) {<a name="line.1288"></a>
+<span class="sourceLineNo">1289</span>        lastFewRegions.add(region);<a name="line.1289"></a>
+<span class="sourceLineNo">1290</span>      }<a name="line.1290"></a>
+<span class="sourceLineNo">1291</span>    }<a name="line.1291"></a>
+<span class="sourceLineNo">1292</span>    // just sprinkle the rest of the regions on random regionservers. The balanceCluster will<a name="line.1292"></a>
+<span class="sourceLineNo">1293</span>    // make it optimal later. we can end up with this if numReplicas &gt; numServers.<a name="line.1293"></a>
+<span class="sourceLineNo">1294</span>    for (RegionInfo region : lastFewRegions) {<a name="line.1294"></a>
+<span class="sourceLineNo">1295</span>      int i = RANDOM.nextInt(numServers);<a name="line.1295"></a>
+<span class="sourceLineNo">1296</span>      ServerName server = servers.get(i);<a name="line.1296"></a>
+<span class="sourceLineNo">1297</span>      List&lt;RegionInfo&gt; serverRegions = assignments.computeIfAbsent(server, k -&gt; new ArrayList&lt;&gt;());<a name="line.1297"></a>
+<span class="sourceLineNo">1298</span>      serverRegions.add(region);<a name="line.1298"></a>
+<span class="sourceLineNo">1299</span>      cluster.doAssignRegion(region, server);<a name="line.1299"></a>
+<span class="sourceLineNo">1300</span>    }<a name="line.1300"></a>
+<span class="sourceLineNo">1301</span>    return assignments;<a name="line.1301"></a>
+<span class="sourceLineNo">1302</span>  }<a name="line.1302"></a>
+<span class="sourceLineNo">1303</span><a name="line.1303"></a>
+<span class="sourceLineNo">1304</span>  protected Cluster createCluster(List&lt;ServerName&gt; servers, Collection&lt;RegionInfo&gt; regions) {<a name="line.1304"></a>
+<span class="sourceLineNo">1305</span>    // Get the snapshot of the current assignments for the regions in question, and then create<a name="line.1305"></a>
+<span class="sourceLineNo">1306</span>    // a cluster out of it. Note that we might have replicas already assigned to some servers<a name="line.1306"></a>
+<span class="sourceLineNo">1307</span>    // earlier. So we want to get the snapshot to see those assignments, but this will only contain<a name="line.1307"></a>
+<span class="sourceLineNo">1308</span>    // replicas of the regions that are passed (for performance).<a name="line.1308"></a>
+<span class="sourceLineNo">1309</span>    Map&lt;ServerName, List&lt;RegionInfo&gt;&gt; clusterState = getRegionAssignmentsByServer(regions);<a name="line.1309"></a>
 <span class="sourceLineNo">1310</span><a name="line.1310"></a>
-<span class="sourceLineNo">1311</span>  private List&lt;ServerName&gt; findIdleServers(List&lt;ServerName&gt; servers) {<a name="line.1311"></a>
-<span class="sourceLineNo">1312</span>    return this.services.getServerManager()<a name="line.1312"></a>
-<span class="sourceLineNo">1313</span>            .getOnlineServersListWithPredicator(servers, IDLE_SERVER_PREDICATOR);<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>  /**<a name="line.1316"></a>
-<span class="sourceLineNo">1317</span>   * Used to assign a single region to a random server.<a name="line.1317"></a>
-<span class="sourceLineNo">1318</span>   */<a name="line.1318"></a>
-<span class="sourceLineNo">1319</span>  @Override<a name="line.1319"></a>
-<span class="sourceLineNo">1320</span>  public ServerName randomAssignment(RegionInfo regionInfo, List&lt;ServerName&gt; servers)<a name="line.1320"></a>
-<span class="sourceLineNo">1321</span>      throws HBaseIOException {<a name="line.1321"></a>
-<span class="sourceLineNo">1322</span>    metricsBalancer.incrMiscInvocations();<a name="line.1322"></a>
-<span class="sourceLineNo">1323</span>    if (servers != null &amp;&amp; servers.contains(masterServerName)) {<a name="line.1323"></a>
-<span class="sourceLineNo">1324</span>      if (shouldBeOnMaster(regionInfo)) {<a name="line.1324"></a>
-<span class="sourceLineNo">1325</span>        return masterServerName;<a name="line.1325"></a>
-<span class="sourceLineNo">1326</span>      }<a name="line.1326"></a>
-<span class="sourceLineNo">1327</span>      if (!LoadBalancer.isTablesOnMaster(getConf())) {<a name="line.1327"></a>
-<span class="sourceLineNo">1328</span>        // Guarantee we do not put any regions on master<a name="line.1328"></a>
-<span class="sourceLineNo">1329</span>        servers = new ArrayList&lt;&gt;(servers);<a name="line.1329"></a>
-<span class="sourceLineNo">1330</span>        servers.remove(masterServerName);<a name="line.1330"></a>
-<span class="sourceLineNo">1331</span>      }<a name="line.1331"></a>
-<span class="sourceLineNo">1332</span>    }<a name="line.1332"></a>
-<span class="sourceLineNo">1333</span><a name="line.1333"></a>
-<span class="sourceLineNo">1334</span>    int numServers = servers == null ? 0 : servers.size();<a name="line.1334"></a>
-<span class="sourceLineNo">1335</span>    if (numServers == 0) {<a name="line.1335"></a>
-<span class="sourceLineNo">1336</span>      LOG.warn("Wanted to retain assignment but no servers to assign to");<a name="line.1336"></a>
-<span class="sourceLineNo">1337</span>      return null;<a name="line.1337"></a>
-<span class="sourceLineNo">1338</span>    }<a name="line.1338"></a>
-<span class="sourceLineNo">1339</span>    if (numServers == 1) { // Only one server, nothing fancy we can do here<a name="line.1339"></a>
-<span class="sourceLineNo">1340</span>      return servers.get(0);<a name="line.1340"></a>
+<span class="sourceLineNo">1311</span>    for (ServerName server : servers) {<a name="line.1311"></a>
+<span class="sourceLineNo">1312</span>      if (!clusterState.containsKey(server)) {<a name="line.1312"></a>
+<span class="sourceLineNo">1313</span>        clusterState.put(server, EMPTY_REGION_LIST);<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>    return new Cluster(regions, clusterState, null, this.regionFinder,<a name="line.1316"></a>
+<span class="sourceLineNo">1317</span>        rackManager);<a name="line.1317"></a>
+<span class="sourceLineNo">1318</span>  }<a name="line.1318"></a>
+<span class="sourceLineNo">1319</span><a name="line.1319"></a>
+<span class="sourceLineNo">1320</span>  private List&lt;ServerName&gt; findIdleServers(List&lt;ServerName&gt; servers) {<a name="line.1320"></a>
+<span class="sourceLineNo">1321</span>    return this.services.getServerManager()<a name="line.1321"></a>
+<span class="sourceLineNo">1322</span>            .getOnlineServersListWithPredicator(servers, IDLE_SERVER_PREDICATOR);<a name="line.1322"></a>
+<span class="sourceLineNo">1323</span>  }<a name="line.1323"></a>
+<span class="sourceLineNo">1324</span><a name="line.1324"></a>
+<span class="sourceLineNo">1325</span>  /**<a name="line.1325"></a>
+<span class="sourceLineNo">1326</span>   * Used to assign a single region to a random server.<a name="line.1326"></a>
+<span class="sourceLineNo">1327</span>   */<a name="line.1327"></a>
+<span class="sourceLineNo">1328</span>  @Override<a name="line.1328"></a>
+<span class="sourceLineNo">1329</span>  public ServerName randomAssignment(RegionInfo regionInfo, List&lt;ServerName&gt; servers)<a name="line.1329"></a>
+<span class="sourceLineNo">1330</span>      throws HBaseIOException {<a name="line.1330"></a>
+<span class="sourceLineNo">1331</span>    metricsBalancer.incrMiscInvocations();<a name="line.1331"></a>
+<span class="sourceLineNo">1332</span>    if (servers != null &amp;&amp; servers.contains(masterServerName)) {<a name="line.1332"></a>
+<span class="sourceLineNo">1333</span>      if (shouldBeOnMaster(regionInfo)) {<a name="line.1333"></a>
+<span class="sourceLineNo">1334</span>        return masterServerName;<a name="line.1334"></a>
+<span class="sourceLineNo">1335</span>      }<a name="line.1335"></a>
+<span class="sourceLineNo">1336</span>      if (!LoadBalancer.isTablesOnMaster(getConf())) {<a name="line.1336"></a>
+<span class="sourceLineNo">1337</span>        // Guarantee we do not put any regions on master<a name="line.1337"></a>
+<span class="sourceLineNo">1338</span>        servers = new ArrayList&lt;&gt;(servers);<a name="line.1338"></a>
+<span class="sourceLineNo">1339</span>        servers.remove(masterServerName);<a name="line.1339"></a>
+<span class="sourceLineNo">1340</span>      }<a name="line.1340"></a>
 <span class="sourceLineNo">1341</span>    }<a name="line.1341"></a>
-<span class="sourceLineNo">1342</span>    List&lt;ServerName&gt; idleServers = findIdleServers(servers);<a name="line.1342"></a>
-<span class="sourceLineNo">1343</span>    if (idleServers.size() == 1) {<a name="line.1343"></a>
-<span class="sourceLineNo">1344</span>      return idleServers.get(0);<a name="line.1344"></a>
-<span class="sourceLineNo">1345</span>    }<a name="line.1345"></a>
-<span class="sourceLineNo">1346</span>    final List&lt;ServerName&gt; finalServers = idleServers.isEmpty() ?<a name="line.1346"></a>
-<span class="sourceLineNo">1347</span>            servers : idleServers;<a name="line.1347"></a>
-<span class="sourceLineNo">1348</span>    List&lt;RegionInfo&gt; regions = Lists.newArrayList(regionInfo);<a name="line.1348"></a>
-<span class="sourceLineNo">1349</span>    Cluster cluster = createCluster(finalServers, regions, false);<a name="line.1349"></a>
-<span class="sourceLineNo">1350</span>    return randomAssignment(cluster, regionInfo, finalServers);<a name="line.1350"></a>
-<span class="sourceLineNo">1351</span>  }<a name="line.1351"></a>
-<span class="sourceLineNo">1352</span><a name="line.1352"></a>
-<span class="sourceLineNo">1353</span>  /**<a name="line.1353"></a>
-<span class="sourceLineNo">1354</span>   * Generates a bulk assignment startup plan, attempting to reuse the existing<a name="line.1354"></a>
-<span class="sourceLineNo">1355</span>   * assignment information from META, but adjusting for the specified list of<a name="line.1355"></a>
-<span class="sourceLineNo">1356</span>   * available/online servers available for assignment.<a name="line.1356"></a>
-<span class="sourceLineNo">1357</span>   * &lt;p&gt;<a name="line.1357"></a>
-<span class="sourceLineNo">1358</span>   * Takes a map of all regions to their existing assignment from META. Also<a name="line.1358"></a>
-<span class="sourceLineNo">1359</span>   * takes a list of online servers for regions to be assigned to. Attempts to<a name="line.1359"></a>
-<span class="sourceLineNo">1360</span>   * retain all assignment, so in some instances initial assignment will not be<a name="line.1360"></a>
-<span class="sourceLineNo">1361</span>   * completely balanced.<a name="line.1361"></a>
-<span class="sourceLineNo">1362</span>   * &lt;p&gt;<a name="line.1362"></a>
-<span class="sourceLineNo">1363</span>   * Any leftover regions without an existing server to be assigned to will be<a name="line.1363"></a>
-<span class="sourceLineNo">1364</span>   * assigned randomly to available servers.<a name="line.1364"></a>
-<span class="sourceLineNo">1365</span>   *<a name="line.1365"></a>
-<span class="sourceLineNo">1366</span>   * @param regions regions and existing assignment from meta<a name="line.1366"></a>
-<span class="sourceLineNo">1367</span>   * @param servers available servers<a name="line.1367"></a>
-<span class="sourceLineNo">1368</span>   * @return map of servers and regions to be assigned to them<a name="line.1368"></a>
-<span class="sourceLineNo">1369</span>   */<a name="line.1369"></a>
-<span class="sourceLineNo">1370</span>  @Override<a name="line.1370"></a>
-<span class="sourceLineNo">1371</span>  public Map&lt;ServerName, List&lt;RegionInfo&gt;&gt; retainAssignment(Map&lt;RegionInfo, ServerName&gt; regions,<a name="line.1371"></a>
-<span class="sourceLineNo">1372</span>      List&lt;ServerName&gt; servers) throws HBaseIOException {<a name="line.1372"></a>
-<span class="sourceLineNo">1373</span>    // Update metrics<a name="line.1373"></a>
-<span class="sourceLineNo">1374</span>    metricsBalancer.incrMiscInvocations();<a name="line.1374"></a>
-<span class="sourceLineNo">1375</span>    Map&lt;ServerName, List&lt;RegionInfo&gt;&gt; assignments = assignMasterSystemRegions(regions.keySet(), servers);<a name="line.1375"></a>
-<span class="sourceLineNo">1376</span>    if (assignments != null &amp;&amp; !assignments.isEmpty()) {<a name="line.1376"></a>
-<span class="sourceLineNo">1377</span>      servers = new ArrayList&lt;&gt;(servers);<a name="line.1377"></a>
-<span class="sourceLineNo">1378</span>      // Guarantee not to put other regions on master<a name="line.1378"></a>
-<span class="sourceLineNo">1379</span>      servers.remove(masterServerName);<a name="line.1379"></a>
-<span class="sourceLineNo">1380</span>      List&lt;RegionInfo&gt; masterRegions = assignments.get(masterServerName);<a name="line.1380"></a>
-<span class="sourceLineNo">1381</span>      regions = regions.entrySet().stream().filter(e -&gt; !masterRegions.contains(e.getKey()))<a name="line.1381"></a>
-<span class="sourceLineNo">1382</span>          .collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue));<a name="line.1382"></a>
-<span class="sourceLineNo">1383</span>    }<a name="line.1383"></a>
-<span class="sourceLineNo">1384</span>    if (regions.isEmpty()) {<a name="line.1384"></a>
-<span class="sourceLineNo">1385</span>      return assignments;<a name="line.1385"></a>
-<span class="sourceLineNo">1386</span>    }<a name="line.1386"></a>
-<span class="sourceLineNo">1387</span><a name="line.1387"></a>
-<span class="sourceLineNo">1388</span>    int numServers = servers == null ? 0 : servers.size();<a name="line.1388"></a>
-<span class="sourceLineNo">1389</span>    if (numServers == 0) {<a name="line.1389"></a>
-<span class="sourceLineNo">1390</span>      LOG.warn("Wanted to do retain assignment but no servers to assign to");<a name="line.1390"></a>
-<span class="sourceLineNo">1391</span>      return null;<a name="line.1391"></a>
+<span class="sourceLineNo">1342</span><a name="line.1342"></a>
+<span class="sourceLineNo">1343</span>    int numServers = servers == null ? 0 : servers.size();<a name="line.1343"></a>
+<span class="sourceLineNo">1344</span>    if (numServers == 0) {<a name="line.1344"></a>
+<span class="sourceLineNo">1345</span>      LOG.warn("Wanted to retain assignment but no servers to assign to");<a name="line.1345"></a>
+<span class="sourceLineNo">1346</span>      return null;<a name="line.1346"></a>
+<span class="sourceLineNo">1347</span>    }<a name="line.1347"></a>
+<span class="sourceLineNo">1348</span>    if (numServers == 1) { // Only one server, nothing fancy we can do here<a name="line.1348"></a>
+<span class="sourceLineNo">1349</span>      return servers.get(0);<a name="line.1349"></a>
+<span class="sourceLineNo">1350</span>    }<a name="line.1350"></a>
+<span class="sourceLineNo">1351</span>    List&lt;ServerName&gt; idleServers = findIdleServers(servers);<a name="line.1351"></a>
+<span class="sourceLineNo">1352</span>    if (idleServers.size() == 1) {<a name="line.1352"></a>
+<span class="sourceLineNo">1353</span>      return idleServers.get(0);<a name="line.1353"></a>
+<span class="sourceLineNo">1354</span>    }<a name="line.1354"></a>
+<span class="sourceLineNo">1355</span>    final List&lt;ServerName&gt; finalServers = idleServers.isEmpty() ?<a name="line.1355"></a>
+<span class="sourceLineNo">1356</span>            servers : idleServers;<a name="line.1356"></a>
+<span class="sourceLineNo">1357</span>    List&lt;RegionInfo&gt; regions = Lists.newArrayList(regionInfo);<a name="line.1357"></a>
+<span class="sourceLineNo">1358</span>    Cluster cluster = createCluster(finalServers, regions);<a name="line.1358"></a>
+<span class="sourceLineNo">1359</span>    return randomAssignment(cluster, regionInfo, finalServers);<a name="line.1359"></a>
+<span class="sourceLineNo">1360</span>  }<a name="line.1360"></a>
+<span class="sourceLineNo">1361</span><a name="line.1361"></a>
+<span class="sourceLineNo">1362</span>  /**<a name="line.1362"></a>
+<span class="sourceLineNo">1363</span>   * Generates a bulk assignment startup plan, attempting to reuse the existing<a name="line.1363"></a>
+<span class="sourceLineNo">1364</span>   * assignment information from META, but adjusting for the specified list of<a name="line.1364"></a>
+<span class="sourceLineNo">1365</span>   * available/online servers available for assignment.<a name="line.1365"></a>
+<span class="sourceLineNo">1366</span>   * &lt;p&gt;<a name="line.1366"></a>
+<span class="sourceLineNo">1367</span>   * Takes a map of all regions to their existing assignment from META. Also<a name="line.1367"></a>
+<span class="sourceLineNo">1368</span>   * takes a list of online servers for regions to be assigned to. Attempts to<a name="line.1368"></a>
+<span class="sourceLineNo">1369</span>   * retain all assignment, so in some instances initial assignment will not be<a name="line.1369"></a>
+<span class="sourceLineNo">1370</span>   * completely balanced.<a name="line.1370"></a>
+<span class="sourceLineNo">1371</span>   * &lt;p&gt;<a name="line.1371"></a>
+<span class="sourceLineNo">1372</span>   * Any leftover regions without an existing server to be assigned to will be<a name="line.1372"></a>
+<span class="sourceLineNo">1373</span>   * assigned randomly to available servers.<a name="line.1373"></a>
+<span class="sourceLineNo">1374</span>   *<a name="line.1374"></a>
+<span class="sourceLineNo">1375</span>   * @param regions regions and existing assignment from meta<a name="line.1375"></a>
+<span class="sourceLineNo">1376</span>   * @param servers available servers<a name="line.1376"></a>
+<span class="sourceLineNo">1377</span>   * @return map of servers and regions to be assigned to them<a name="line.1377"></a>
+<span class="sourceLineNo">1378</span>   */<a name="line.1378"></a>
+<span class="sourceLineNo">1379</span>  @Override<a name="line.1379"></a>
+<span class="sourceLineNo">1380</span>  public Map&lt;ServerName, List&lt;RegionInfo&gt;&gt; retainAssignment(Map&lt;RegionInfo, ServerName&gt; regions,<a name="line.1380"></a>
+<span class="sourceLineNo">1381</span>      List&lt;ServerName&gt; servers) throws HBaseIOException {<a name="line.1381"></a>
+<span class="sourceLineNo">1382</span>    // Update metrics<a name="line.1382"></a>
+<span class="sourceLineNo">1383</span>    metricsBalancer.incrMiscInvocations();<a name="line.1383"></a>
+<span class="sourceLineNo">1384</span>    Map&lt;ServerName, List&lt;RegionInfo&gt;&gt; assignments = assignMasterSystemRegions(regions.keySet(), servers);<a name="line.1384"></a>
+<span class="sourceLineNo">1385</span>    if (assignments != null &amp;&amp; !assignments.isEmpty()) {<a name="line.1385"></a>
+<span class="sourceLineNo">1386</span>      servers = new ArrayList&lt;&gt;(servers);<a name="line.1386"></a>
+<span class="sourceLineNo">1387</span>      // Guarantee not to put other regions on master<a name="line.1387"></a>
+<span class="sourceLineNo">1388</span>      servers.remove(masterServerName);<a name="line.1388"></a>
+<span class="sourceLineNo">1389</span>      List&lt;RegionInfo&gt; masterRegions = assignments.get(masterServerName);<a name="line.1389"></a>
+<span class="sourceLineNo">1390</span>      regions = regions.entrySet().stream().filter(e -&gt; !masterRegions.contains(e.getKey()))<a name="line.1390"></a>
+<span class="sourceLineNo">1391</span>          .collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue));<a name="line.1391"></a>
 <span class="sourceLineNo">1392</span>    }<a name="line.1392"></a>
-<span class="sourceLineNo">1393</span>    if (numServers == 1) { // Only one server, nothing fancy we can do here<a name="line.1393"></a>
-<span class="sourceLineNo">1394</span>      ServerName server = servers.get(0);<a name="line.1394"></a>
-<span class="sourceLineNo">1395</span>      assignments.put(server, new ArrayList&lt;&gt;(regions.keySet()));<a name="line.1395"></a>
-<span class="sourceLineNo">1396</span>      return assignments;<a name="line.1396"></a>
-<span class="sourceLineNo">1397</span>    }<a name="line.1397"></a>
-<span class="sourceLineNo">1398</span><a name="line.1398"></a>
-<span class="sourceLineNo">1399</span>    // Group all of the old assignments by their hostname.<a name="line.1399"></a>
-<span class="sourceLineNo">1400</span>    // We can't group directly by ServerName since the servers all have<a name="line.1400"></a>
-<span class="sourceLineNo">1401</span>    // new start-codes.<a name="line.1401"></a>
-<span class="sourceLineNo">1402</span><a name="line.1402"></a>
-<span class="sourceLineNo">1403</span>    // Group the servers by their hostname. It's possible we have multiple<a name="line.1403"></a>
-<span class="sourceLineNo">1404</span>    // servers on the same host on different ports.<a name="line.1404"></a>
-<span class="sourceLineNo">1405</span>    ArrayListMultimap&lt;String, ServerName&gt; serversByHostname = ArrayListMultimap.create();<a name="line.1405"></a>
-<span class="sourceLineNo">1406</span>    for (ServerName server : servers) {<a name="line.1406"></a>
-<span class="sourceLineNo">1407</span>      assignments.put(server, new ArrayList&lt;&gt;());<a name="line.1407"></a>
-<span class="sourceLineNo">1408</span>      serversByHostname.put(server.getHostnameLowerCase(), server);<a name="line.1408"></a>
-<span class="sourceLineNo">1409</span>    }<a name="line.1409"></a>
-<span class="sourceLineNo">1410</span><a name="line.1410"></a>
-<span class="sourceLineNo">1411</span>    // Collection of the hostnames that used to have regions<a name="line.1411"></a>
-<span class="sourceLineNo">1412</span>    // assigned, but for which we no longer have any RS running<a name="line.1412"></a>
-<span class="sourceLineNo">1413</span>    // after the cluster restart.<a name="line.1413"></a>
-<span class="sourceLineNo">1414</span>    Set&lt;String&gt; oldHostsNoLongerPresent = Sets.newTreeSet();<a name="line.1414"></a>
-<span class="sourceLineNo">1415</span><a name="line.1415"></a>
-<span class="sourceLineNo">1416</span>    // If the old servers aren't present, lets assign those regions later.<a name="line.1416"></a>
-<span class="sourceLineNo">1417</span>    List&lt;RegionInfo&gt; randomAssignRegions = Lists.newArrayList();<a name="line.1417"></a>
-<span class="sourceLineNo">1418</span><a name="line.1418"></a>
-<span class="sourceLineNo">1419</span>    int numRandomAssignments = 0;<a name="line.1419"></a>
-<span class="sourceLineNo">1420</span>    int numRetainedAssigments = 0;<a name="line.1420"></a>
-<span class="sourceLineNo">1421</span><a name="line.1421"></a>
-<span class="sourceLineNo">1422</span>    Cluster cluster = createCluster(servers, regions.keySet(), true);<a name="line.1422"></a>
-<span class="sourceLineNo">1423</span><a name="line.1423"></a>
-<span class="sourceLineNo">1424</span>    for (Map.Entry&lt;RegionInfo, ServerName&gt; entry : regions.entrySet()) {<a name="line.1424"></a>
-<span class="sourceLineNo">1425</span>      RegionInfo region = entry.getKey();<a name="line.1425"></a>
-<span class="sourceLineNo">1426</span>      ServerName oldServerName = entry.getValue();<a name="line.1426"></a>
-<span class="sourceLineNo">1427</span>      List&lt;ServerName&gt; localServers = new ArrayList&lt;&gt;();<a name="line.1427"></a>
-<span class="sourceLineNo">1428</span>      if (oldServerName != null) {<a name="line.1428"></a>
-<span class="sourceLineNo">1429</span>        localServers = serversByHostname.get(oldServerName.getHostnameLowerCase());<a name="line.1429"></a>
-<span class="sourceLineNo">1430</span>      }<a name="line.1430"></a>
-<span class="sourceLineNo">1431</span>      if (localServers.isEmpty()) {<a name="line.1431"></a>
-<span class="sourceLineNo">1432</span>        // No servers on the new cluster match up with this hostname, assign randomly, later.<a name="line.1432"></a>
-<span class="sourceLineNo">1433</span>        randomAssignRegions.add(region);<a name="line.1433"></a>
-<span class="sourceLineNo">1434</span>        if (oldServerName != null) {<a name="line.1434"></a>
-<span class="sourceLineNo">1435</span>          oldHostsNoLongerPresent.add(oldServerName.getHostnameLowerCase());<a name="line.1435"></a>
-<span class="sourceLineNo">1436</span>        }<a name="line.1436"></a>
-<span class="sourceLineNo">1437</span>      } else if (localServers.size() == 1) {<a name="line.1437"></a>
-<span class="sourceLineNo">1438</span>        // the usual case - one new server on same host<a name="line.1438"></a>
-<span class="sourceLineNo">1439</span>        ServerName target = localServers.get(0);<a name="line.1439"></a>
-<span class="sourceLineNo">1440</span>        assignments.get(target).add(region);<a name="line.1440"></a>
-<span class="sourceLineNo">1441</span>        numRetainedAssigments++;<a name="line.1441"></a>
-<span class="sourceLineNo">1442</span>      } else {<a name="line.1442"></a>
-<span class="sourceLineNo">1443</span>        // multiple new servers in the cluster on this same host<a name="line.1443"></a>
-<span class="sourceLineNo">1444</span>        if (localServers.contains(oldServerName)) {<a name="line.1444"></a>
-<span class="sourceLineNo">1445</span>          assignments.get(oldServerName).add(region);<a name="line.1445"></a>
-<span class="sourceLineNo">1446</span>          numRetainedAssigments++;<a name="line.1446"></a>
-<span class="sourceLineNo">1447</span>        } else {<a name="line.1447"></a>
-<span class="sourceLineNo">1448</span>          ServerName target = null;<a name="line.1448"></a>
-<span class="sourceLineNo">1449</span>          for (ServerName tmp : localServers) {<a name="line.1449"></a>
-<span class="sourceLineNo">1450</span>            if (tmp.getPort() == oldServerName.getPort()) {<a name="line.1450"></a>
-<span class="sourceLineNo">1451</span>              target = tmp;<a name="line.1451"></a>
-<span class="sourceLineNo">1452</span>              assignments.get(tmp).add(region);<a name="line.1452"></a>
-<span class="sourceLineNo">1453</span>              numRetainedAssigments++;<a name="line.1453"></a>
-<span class="sourceLineNo">1454</span>              break;<a name="line.1454"></a>
-<span class="sourceLineNo">1455</span>            }<a name="line.1455"></a>
-<span class="sourceLineNo">1456</span>          }<a name="line.1456"></a>
-<span class="sourceLineNo">1457</span>          if (target == null) {<a name="line.1457"></a>
-<span class="sourceLineNo">1458</span>            randomAssignRegions.add(region);<a name="line.1458"></a>
-<span class="sourceLineNo">1459</span>          }<a name="line.1459"></a>
-<span class="sourceLineNo">1460</span>        }<a name="line.1460"></a>
-<span class="sourceLineNo">1461</span>      }<a name="line.1461"></a>
-<span class="sourceLineNo">1462</span>    }<a name="line.1462"></a>
-<span class="sourceLineNo">1463</span><a name="line.1463"></a>
-<span class="sourceLineNo">1464</span>    // If servers from prior assignment aren't present, then lets do randomAssignment on regions.<a name="line.1464"></a>
-<span class="sourceLineNo">1465</span>    if (randomAssignRegions.size() &gt; 0) {<a name="line.1465"></a>
-<span class="sourceLineNo">1466</span>      for (Map.Entry&lt;ServerName, List&lt;RegionInfo&gt;&gt; entry : assignments.entrySet()) {<a name="line.1466"></a>
-<span class="sourceLineNo">1467</span>        ServerName sn = entry.getKey();<a name="line.1467"></a>
-<span class="sourceLineNo">1468</span>        for (RegionInfo region : entry.getValue()) {<a name="line.1468"></a>
-<span class="sourceLineNo">1469</span>          cluster.doAssignRegion(region, sn);<a name="line.1469"></a>
-<span class="sourceLineNo">1470</span>        }<a name="line.1470"></a>
-<span class="sourceLineNo">1471</span>      }<a name="line.1471"></a>
-<span class="sourceLineNo">1472</span>      for (RegionInfo region : randomAssignRegions) {<a name="line.1472"></a>
-<span class="sourceLineNo">1473</span>        ServerName target = randomAssignment(cluster, region, servers);<a name="line.1473"></a>
-<span class="sourceLineNo">1474</span>        assignments.get(target).add(region);<a name="line.1474"></a>
-<span class="sourceLineNo">1475</span>        cluster.doAssignRegion(region, target);<a name="line.1475"></a>
-<span class="sourceLineNo">1476</span>        numRandomAssignments++;<a name="line.1476"></a>
-<span class="sourceLineNo">1477</span>      }<a name="line.1477"></a>
-<span class="sourceLineNo">1478</span>    }<a name="line.1478"></a>
-<span class="sourceLineNo">1479</span><a name="line.1479"></a>
-<span class="sourceLineNo">1480</span>    String randomAssignMsg = "";<a name="line.1480"></a>
-<span class="sourceLineNo">1481</span>    if (numRandomAssignments &gt; 0) {<a name="line.1481"></a>
-<span class="sourceLineNo">1482</span>      randomAssignMsg =<a name="line.1482"></a>
-<span class="sourceLineNo">1483</span>          numRandomAssignments + " regions were assigned "<a name="line.1483"></a>
-<span class="sourceLineNo">1484</span>              + "to random hosts, since the old hosts for these regions are no "<a name="line.1484"></a>
-<span class="sourceLineNo">1485</span>              + "longer present in the cluster. These hosts were:\n  "<a name="line.1485"></a>
-<span class="sourceLineNo">1486</span>              + Joiner.on("\n  ").join(oldHostsNoLongerPresent);<a name="line.1486"></a>
-<span class="sourceLineNo">1487</span>    }<a name="line.1487"></a>
-<span class="sourceLineNo">1488</span><a name="line.1488"></a>
-<span class="sourceLineNo">1489</span>    LOG.info("Reassigned " + regions.size() + " regions. " + numRetainedAssigments<a name="line.1489"></a>
-<span class="sourceLineNo">1490</span>        + " retained the pre-restart assignment. " + randomAssignMsg);<a name="line.1490"></a>
-<span class="sourceLineNo">1491</span>    return assignments;<a name="line.1491"></a>
-<span class="sourceLineNo">1492</span>  }<a name="line.1492"></a>
-<span class="sourceLineNo">1493</span><a name="line.1493"></a>
-<span class="sourceLineNo">1494</span>  @Override<a name="line.1494"></a>
-<span class="sourceLineNo">1495</span>  public void initialize() throws HBaseIOException{<a name="line.1495"></a>
-<span class="sourceLineNo">1496</span>  }<a name="line.1496"></a>
-<span class="sourceLineNo">1497</span><a name="line.1497"></a>
-<span class="sourceLineNo">1498</span>  @Override<a name="line.1498"></a>
-<span class="sourceLineNo">1499</span>  public void regionOnline(RegionInfo regionInfo, ServerName sn) {<a name="line.1499"></a>
+<span class="sourceLineNo">1393</span>    if (regions.isEmpty()) {<a name="line.1393"></a>
+<span class="sourceLineNo">1394</span>      return assignments;<a name="line.1394"></a>
+<span class="sourceLineNo">1395</span>    }<a name="line.1395"></a>
+<span class="sourceLineNo">1396</span><a name="line.1396"></a>
+<span class="sourceLineNo">1397</span>    int numServers = servers == null ? 0 : servers.size();<a name="line.1397"></a>
+<span class="sourceLineNo">1398</span>    if (numServers == 0) {<a name="line.1398"></a>
+<span class="sourceLineNo">1399</span>      LOG.warn("Wanted to do retain assignment but no servers to assign to");<a name="line.1399"></a>
+<span class="sourceLineNo">1400</span>      return null;<a name="line.1400"></a>
+<span class="sourceLineNo">1401</span>    }<a name="line.1401"></a>
+<span class="sourceLineNo">1402</span>    if (numServers == 1) { // Only one server, nothing fancy we can do here<a name="line.1402"></a>
+<span class="sourceLineNo">1403</span>      ServerName server = servers.get(0);<a name="line.1403"></a>
+<span class="sourceLineNo">1404</span>      assignments.put(server, new ArrayList&lt;&gt;(regions.keySet()));<a name="line.1404"></a>
+<span class="sourceLineNo">1405</span>      return assignments;<a name="line.1405"></a>
+<span class="sourceLineNo">1406</span>    }<a name="line.1406"></a>
+<span class="sourceLineNo">1407</span><a name="line.1407"></a>
+<span class="sourceLineNo">1408</span>    // Group all of the old assignments by their hostname.<a name="line.1408"></a>
+<span class="sourceLineNo">1409</span>    // We can't group directly by ServerName since the servers all have<a name="line.1409"></a>
+<span class="sourceLineNo">1410</span>    // new start-codes.<a name="line.1410"></a>
+<span class="sourceLineNo">1411</span><a name="line.1411"></a>
+<span class="sourceLineNo">1412</span>    // Group the servers by their hostname. It's possible we have multiple<a name="line.1412"></a>
+<span class="sourceLineNo">1413</span>    // servers on the same host on different ports.<a name="line.1413"></a>
+<span class="sourceLineNo">1414</span>    ArrayListMultimap&lt;String, ServerName&gt; serversByHostname = ArrayListMultimap.create();<a name="line.1414"></a>
+<span class="sourceLineNo">1415</span>    for (ServerName server : servers) {<a name="line.1415"></a>
+<span class="sourceLineNo">1416</span>      assignments.put(server, new ArrayList&lt;&gt;());<a name="line.1416"></a>
+<span class="sourceLineNo">1417</span>      serversByHostname.put(server.getHostnameLowerCase(), server);<a name="line.1417"></a>
+<span class="sourceLineNo">1418</span>    }<a name="line.1418"></a>
+<span class="sourceLineNo">1419</span><a name="line.1419"></a>
+<span class="sourceLineNo">1420</span>    // Collection of the hostnames that used to have regions<a name="line.1420"></a>
+<span class="sourceLineNo">1421</span>    // assigned, but for which we no longer have any RS running<a name="line.1421"></a>
+<span class="sourceLineNo">1422</span>    // after the cluster restart.<a name="line.1422"></a>
+<span class="sourceLineNo">1423</span>    Set&lt;String&gt; oldHostsNoLongerPresent = Sets.newTreeSet();<a name="line.1423"></a>
+<span class="sourceLineNo">1424</span><a name="line.1424"></a>
+<span class="sourceLineNo">1425</span>    // If the old servers aren't present, lets assign those regions later.<a name="line.1425"></a>
+<span class="sourceLineNo">1426</span>    List&lt;RegionInfo&gt; randomAssignRegions = Lists.newArrayList();<a name="line.1426"></a>
+<span class="sourceLineNo">1427</span><a name="line.1427"></a>
+<span class="sourceLineNo">1428</span>    int numRandomAssignments = 0;<a name="line.1428"></a>
+<span class="sourceLineNo">1429</span>    int numRetainedAssigments = 0;<a name="line.1429"></a>
+<span class="sourceLineNo">1430</span><a name="line.1430"></a>
+<span class="sourceLineNo">1431</span>    for (Map.Entry&lt;RegionInfo, ServerName&gt; entry : regions.entrySet()) {<a name="line.1431"></a>
+<span class="sourceLineNo">1432</span>      RegionInfo region = entry.getKey();<a name="line.1432"></a>
+<span class="sourceLineNo">1433</span>      ServerName oldServerName = entry.getValue();<a name="line.1433"></a>
+<span class="sourceLineNo">1434</span>      List&lt;ServerName&gt; localServers = new ArrayList&lt;&gt;();<a name="line.1434"></a>
+<span class="sourceLineNo">1435</span>      if (oldServerName != null) {<a name="line.1435"></a>
+<span class="sourceLineNo">1436</span>        localServers = serversByHostname.get(oldServerName.getHostnameLowerCase());<a name="line.1436"></a>
+<span class="sourceLineNo">1437</span>      }<a name="line.1437"></a>
+<span class="sourceLineNo">1438</span>      if (localServers.isEmpty()) {<a name="line.1438"></a>
+<span class="sourceLineNo">1439</span>        // No servers on the new cluster match up with this hostname, assign randomly, later.<a name="line.1439"></a>
+<span class="sourceLineNo">1440</span>        randomAssignRegions.add(region);<a name="line.1440"></a>
+<span class="sourceLineNo">1441</span>        if (oldServerName != null) {<a name="line.1441"></a>
+<span class="sourceLineNo">1442</span>          oldHostsNoLongerPresent.add(oldServerName.getHostnameLowerCase());<a name="line.1442"></a>
+<span class="sourceLineNo">1443</span>        }<a name="line.1443"></a>
+<span class="sourceLineNo">1444</span>      } else if (localServers.size() == 1) {<a name="line.1444"></a>
+<span class="sourceLineNo">1445</span>        // the usual case - one new server on same host<a name="line.1445"></a>
+<span class="sourceLineNo">1446</span>        ServerName target = localServers.get(0);<a name="line.1446"></a>
+<span class="sourceLineNo">1447</span>        assignments.get(target).add(region);<a name="line.1447"></a>
+<span class="sourceLineNo">1448</span>        numRetainedAssigments++;<a name="line.1448"></a>
+<span class="sourceLineNo">1449</span>      } else {<a name="line.1449"></a>
+<span class="sourceLineNo">1450</span>        // multiple new servers in the cluster on this same host<a name="line.1450"></a>
+<span class="sourceLineNo">1451</span>        if (localServers.contains(oldServerName)) {<a name="line.1451"></a>
+<span class="sourceLineNo">1452</span>          assignments.get(oldServerName).add(region);<a name="line.1452"></a>
+<span class="sourceLineNo">1453</span>          numRetainedAssigments++;<a name="line.1453"></a>
+<span class="sourceLineNo">1454</span>        } else {<a name="line.1454"></a>
+<span class="sourceLineNo">1455</span>          ServerName target = null;<a name="line.1455"></a>
+<span class="sourceLineNo">1456</span>          for (ServerName tmp : localServers) {<a name="line.1456"></a>
+<span class="sourceLineNo">1457</span>            if (tmp.getPort() == oldServerName.getPort()) {<a name="line.1457"></a>
+<span class="sourceLineNo">1458</span>              target = tmp;<a name="line.1458"></a>
+<span class="sourceLineNo">1459</span>              assignments.get(tmp).add(region);<a name="line.1459"></a>
+<span class="sourceLineNo">1460</span>              numRetainedAssigments++;<a name="line.1460"></a>
+<span class="sourceLineNo">1461</span>              break;<a name="line.1461"></a>
+<span class="sourceLineNo">1462</span>            }<a name="line.1462"></a>
+<span class="sourceLineNo">1463</span>          }<a name="line.1463"></a>
+<span class="sourceLineNo">1464</span>          if (target == null) {<a name="line.1464"></a>
+<span class="sourceLineNo">1465</span>            randomAssignRegions.add(region);<a name="line.1465"></a>
+<span class="sourceLineNo">1466</span>          }<a name="line.1466"></a>
+<span class="sourceLineNo">1467</span>        }<a name="line.1467"></a>
+<span class="sourceLineNo">1468</span>      }<a name="line.1468"></a>
+<span class="sourceLineNo">1469</span>    }<a name="line.1469"></a>
+<span class="sourceLineNo">1470</span><a name="line.1470"></a>
+<span class="sourceLineNo">1471</span>    // If servers from prior assignment aren't present, then lets do randomAssignment on regions.<a name="line.1471"></a>
+<span class="sourceLineNo">1472</span>    if (randomAssignRegions.size() &gt; 0) {<a name="line.1472"></a>
+<span class="sourceLineNo">1473</span>      Cluster cluster = createCluster(servers, regions.keySet());<a name="line.1473"></a>
+<span class="sourceLineNo">1474</span>      for (Map.Entry&lt;ServerName, List&lt;RegionInfo&gt;&gt; entry : assignments.entrySet()) {<a name="line.1474"></a>
+<span class="sourceLineNo">1475</span>        ServerName sn = entry.getKey();<a name="line.1475"></a>
+<span class="sourceLineNo">1476</span>        for (RegionInfo region : entry.getValue()) {<a name="line.1476"></a>
+<span class="sourceLineNo">1477</span>          cluster.doAssignRegion(region, sn);<a name="line.1477"></a>
+<span class="sourceLineNo">1478</span>        }<a name="line.1478"></a>
+<span class="sourceLineNo">1479</span>      }<a name="line.1479"></a>
+<span class="sourceLineNo">1480</span>      for (RegionInfo region : randomAssignRegions) {<a name="line.1480"></a>
+<span class="sourceLineNo">1481</span>        ServerName target = randomAssignment(cluster, region, servers);<a name="line.1481"></a>
+<span class="sourceLineNo">1482</span>        assignments.get(target).add(region);<a name="line.1482"></a>
+<span class="sourceLineNo">1483</span>        cluster.doAssignRegion(region, target);<a name="line.1483"></a>
+<span class="sourceLineNo">1484</span>        numRandomAssignments++;<a name="line.1484"></a>
+<span class="sourceLineNo">1485</span>      }<a name="line.1485"></a>
+<span class="sourceLineNo">1486</span>    }<a name="line.1486"></a>
+<span class="sourceLineNo">1487</span><a name="line.1487"></a>
+<span class="sourceLineNo">1488</span>    String randomAssignMsg = "";<a name="line.1488"></a>
+<span class="sourceLineNo">1489</span>    if (numRandomAssignments &gt; 0) {<a name="line.1489"></a>
+<span class="sourceLineNo">1490</span>      randomAssignMsg =<a name="line.1490"></a>
+<span class="sourceLineNo">1491</span>          numRandomAssignments + " regions were assigned "<a name="line.1491"></a>
+<span class="sourceLineNo">1492</span>              + "to random hosts, since the old hosts for these regions are no "<a name="line.1492"></a>
+<span class="sourceLineNo">1493</span>              + "longer present in the cluster. These hosts were:\n  "<a name="line.1493"></a>
+<span class="sourceLineNo">1494</span>              + Joiner.on("\n  ").join(oldHostsNoLongerPresent);<a name="line.1494"></a>
+<span class="sourceLineNo">1495</span>    }<a name="line.1495"></a>
+<span class="sourceLineNo">1496</span><a name="line.1496"></a>
+<span class="sourceLineNo">1497</span>    LOG.info("Reassigned " + regions.size() + " regions. " + numRetainedAssigments<a name="line.1497"></a>
+<span class="sourceLineNo">1498</span>        + " retained the pre-restart assignment. " + randomAssignMsg);<a name="line.1498"></a>
+<span class="sourceLineNo">1499</span>    return assignments;<a name="line.1499"></a>
 <span class="sourceLineNo">1500</span>  }<a name="line.1500"></a>
 <span class="sourceLineNo">1501</span><a name="line.1501"></a>
 <span class="sourceLineNo">1502</span>  @Override<a name="line.1502"></a>
-<span class="sourceLineNo">1503</span>  public void regionOffline(RegionInfo regionInfo) {<a name="line.1503"></a>
+<span class="sourceLineNo">1503</span>  public void initialize() throws HBaseIOException{<a name="line.1503"></a>
 <span class="sourceLineNo">1504</span>  }<a name="line.1504"></a>
 <span class="sourceLineNo">1505</span><a name="line.1505"></a>
 <span class="sourceLineNo">1506</span>  @Override<a name="line.1506"></a>
-<span class="sourceLineNo">1507</span>  public boolean isStopped() {<a name="line.1507"></a>
-<span class="sourceLineNo">1508</span>    return stopped;<a name="line.1508"></a>
-<span class="sourceLineNo">1509</span>  }<a name="line.1509"></a>
-<span class="sourceLineNo">1510</span><a name="line.1510"></a>
-<span class="sourceLineNo">1511</span>  @Override<a name="line.1511"></a>
-<span class="sourceLineNo">1512</span>  public void stop(String why) {<a name="line.1512"></a>
-<span class="sourceLineNo">1513</span>    LOG.info("Load Balancer stop requested: "+why);<a name="line.1513"></a>
-<span class="sourceLineNo">1514</span>    stopped = true;<a name="line.1514"></a>
-<span class="sourceLineNo">1515</span>  }<a name="line.1515"></a>
-<span class="sourceLineNo">1516</span><a name="line.1516"></a>
-<span class="sourceLineNo">1517</span>  /**<a name="line.1517"></a>
-<span class="sourceLineNo">1518</span>   * Used to assign a single region to a random server.<a name="line.1518"></a>
-<span class="sourceLineNo">1519</span>   */<a name="line.1519"></a>
-<span class="sourceLineNo">1520</span>  private ServerName randomAssignment(Cluster cluster, RegionInfo regionInfo,<a name="line.1520"></a>
-<span class="sourceLineNo">1521</span>      List&lt;ServerName&gt; servers) {<a name="line.1521"></a>
-<span class="sourceLineNo">1522</span>    int numServers = servers.size(); // servers is not null, numServers &gt; 1<a name="line.1522"></a>
-<span class="sourceLineNo">1523</span>    ServerName sn = null;<a name="line.1523"></a>
-<span class="sourceLineNo">1524</span>    final int maxIterations = numServers * 4;<a name="line.1524"></a>
-<span class="sourceLineNo">1525</span>    int iterations = 0;<a name="line.1525"></a>
-<span class="sourceLineNo">1526</span><a name="line.1526"></a>
-<span class="sourceLineNo">1527</span>    do {<a name="line.1527"></a>
-<span class="sourceLineNo">1528</span>      int i = RANDOM.nextInt(numServers);<a name="line.1528"></a>
-<span class="sourceLineNo">1529</span>      sn = servers.get(i);<a name="line.1529"></a>
-<span class="sourceLineNo">1530</span>    } while (cluster.wouldLowerAvailability(regionInfo, sn)<a name="line.1530"></a>
-<span class="sourceLineNo">1531</span>        &amp;&amp; iterations++ &lt; maxIterations);<a name="line.1531"></a>
-<span class="sourceLineNo">1532</span>    cluster.doAssignRegion(regionInfo, sn);<a name="line.1532"></a>
-<span class="sourceLineNo">1533</span>    return sn;<a name="line.1533"></a>
-<span class="sourceLineNo">1534</span>  }<a name="line.1534"></a>
-<span class="sourceLineNo">1535</span><a name="line.1535"></a>
-<span class="sourceLineNo">1536</span>  /**<a name="line.1536"></a>
-<span class="sourceLineNo">1537</span>   * Round robin a list of regions to a list of servers<a name="line.1537"></a>
-<span class="sourceLineNo">1538</span>   */<a name="line.1538"></a>
-<span class="sourceLineNo">1539</span>  private void roundRobinAssignment(Cluster cluster, List&lt;RegionInfo&gt; regions,<a name="line.1539"></a>
-<span class="sourceLineNo">1540</span>      List&lt;RegionInfo&gt; unassignedRegions, List&lt;ServerName&gt; servers,<a name="line.1540"></a>
-<span class="sourceLineNo">1541</span>      Map&lt;ServerName, List&lt;RegionInfo&gt;&gt; assignments) {<a name="line.1541"></a>
-<span class="sourceLineNo">1542</span><a name="line.1542"></a>
-<span class="sourceLineNo">1543</span>    int numServers = servers.size();<a name="line.1543"></a>
-<span class="sourceLineNo">1544</span>    int numRegions = regions.size();<a name="line.1544"></a>
-<span class="sourceLineNo">1545</span>    int max = (int) Math.ceil((float) numRegions / numServers);<a name="line.1545"></a>
-<span class="sourceLineNo">1546</span>    int serverIdx = 0;<a name="line.1546"></a>
-<span class="sourceLineNo">1547</span>    if (numServers &gt; 1) {<a name="line.1547"></a>
-<span class="sourceLineNo">1548</span>      serverIdx = RANDOM.nextInt(numServers);<a name="line.1548"></a>
-<span class="sourceLineNo">1549</span>    }<a name="line.1549"></a>
-<span class="sourceLineNo">1550</span>    int regionIdx = 0;<a name="line.1550"></a>
-<span class="sourceLineNo">1551</span><a name="line.1551"></a>
-<span class="sourceLineNo">1552</span>    for (int j = 0; j &lt; numServers; j++) {<a name="line.1552"></a>
-<span class="sourceLineNo">1553</span>      ServerName server = servers.get((j + serverIdx) % numServers);<a name="line.1553"></a>
-<span class="sourceLineNo">1554</span>      List&lt;RegionInfo&gt; serverRegions = new ArrayList&lt;&gt;(max);<a name="line.1554"></a>
-<span class="sourceLineNo">1555</span>      for (int i = regionIdx; i &lt; numRegions; i += numServers) {<a name="line.1555"></a>
-<span class="sourceLineNo">1556</span>        RegionInfo region = regions.get(i % numRegions);<a name="line.1556"></a>
-<span class="sourceLineNo">1557</span>        if (cluster.wouldLowerAvailability(region, server)) {<a name="line.1557"></a>
-<span class="sourceLineNo">1558</span>          unassignedRegions.add(region);<a name="line.1558"></a>
-<span class="sourceLineNo">1559</span>        } else {<a name="line.1559"></a>
-<span class="sourceLineNo">1560</span>          serverRegions.add(region);<a name="line.1560"></a>
-<span class="sourceLineNo">1561</span>          cluster.doAssignRegion(region, server);<a name="line.1561"></a>
-<span class="sourceLineNo">1562</span>        }<a name="line.1562"></a>
-<span class="sourceLineNo">1563</span>      }<a name="line.1563"></a>
-<span class="sourceLineNo">1564</span>      assignments.put(server, serverRegions);<a name="line.1564"></a>
-<span class="sourceLineNo">1565</span>      regionIdx++;<a name="line.1565"></a>
-<span class="sourceLineNo">1566</span>    }<a name="line.1566"></a>
-<span class="sourceLineNo">1567</span>  }<a name="line.1567"></a>
-<span class="sourceLineNo">1568</span><a name="line.1568"></a>
-<span class="sourceLineNo">1569</span>  protected Map&lt;ServerName, List&lt;RegionInfo&gt;&gt; getRegionAssignmentsByServer(<a name="line.1569"></a>
-<span class="sourceLineNo">1570</span>    Collection&lt;RegionInfo&gt; regions) {<a name="line.1570"></a>
-<span class="sourceLineNo">1571</span>    if (this.services != null &amp;&amp; this.services.getAssignmentManager() != null) {<a name="line.1571"></a>
-<span class="sourceLineNo">1572</span>      return this.services.getAssignmentManager().getSnapShotOfAssignment(regions);<a name="line.1572"></a>
-<span class="sourceLineNo">1573</span>    } else {<a name="line.1573"></a>
-<span class="sourceLineNo">1574</span>      return new HashMap&lt;&gt;();<a name="line.1574"></a>
-<span class="sourceLineNo">1575</span>    }<a name="line.1575"></a>
-<span class="sourceLineNo">1576</span>  }<a name="line.1576"></a>
-<span class="sourceLineNo">1577</span><a name="line.1577"></a>
-<span class="sourceLineNo">1578</span>  @Override<a name="line.1578"></a>
-<span class="sourceLineNo">1579</span>  public void onConfigurationChange(Configuration conf) {<a name="line.1579"></a>
-<span class="sourceLineNo">1580</span>  }<a name="line.1580"></a>
-<span class="sourceLineNo">1581</span>}<a name="line.1581"></a>
+<span class="sourceLineNo">1507</span>  public void regionOnline(RegionInfo regionInfo, ServerName sn) {<a name="line.1507"></a>
+<span class="sourceLineNo">1508</span>  }<a name="line.1508"></a>
+<span class="sourceLineNo">1509</span><a name="line.1509"></a>
+<span class="sourceLineNo">1510</span>  @Override<a name="line.1510"></a>
+<span class="sourceLineNo">1511</span>  public void regionOffline(RegionInfo regionInfo) {<a name="line.1511"></a>
+<span class="sourceLineNo">1512</span>  }<a name="line.1512"></a>
+<span class="sourceLineNo">1513</span><a name="line.1513"></a>
+<span class="sourceLineNo">1514</span>  @Override<a name="line.1514"></a>
+<span class="sourceLineNo">1515</span>  public boolean isStopped() {<a name="line.1515"></a>
+<span class="sourceLineNo">1516</span>    return stopped;<a name="line.1516"></a>
+<span class="sourceLineNo">1517</span>  }<a name="line.1517"></a>
+<span class="sourceLineNo">1518</span><a name="line.1518"></a>
+<span class="sourceLineNo">1519</span>  @Override<a name="line.1519"></a>
+<span class="sourceLineNo">1520</span>  public void stop(String why) {<a name="line.1520"></a>
+<span class="sourceLineNo">1521</span>    LOG.info("Load Balancer stop requested: "+why);<a name="line.1521"></a>
+<span class="sourceLineNo">1522</span>    stopped = true;<a name="line.1522"></a>
+<span class="sourceLineNo">1523</span>  }<a name="line.1523"></a>
+<span class="sourceLineNo">1524</span><a name="line.1524"></a>
+<span class="sourceLineNo">1525</span>  /**<a name="line.1525"></a>
+<span class="sourceLineNo">1526</span>   * Used to assign a single region to a random server.<a name="line.1526"></a>
+<span class="sourceLineNo">1527</span>   */<a name="line.1527"></a>
+<span class="sourceLineNo">1528</span>  private ServerName randomAssignment(Cluster cluster, RegionInfo regionInfo,<a name="line.1528"></a>
+<span class="sourceLineNo">1529</span>      List&lt;ServerName&gt; servers) {<a name="line.1529"></a>
+<span class="sourceLineNo">1530</span>    int numServers = servers.size(); // servers is not null, numServers &gt; 1<a name="line.1530"></a>
+<span class="sourceLineNo">1531</span>    ServerName sn = null;<a name="line.1531"></a>
+<span class="sourceLineNo">1532</span>    final int maxIterations = numServers * 4;<a name="line.1532"></a>
+<span class="sourceLineNo">1533</span>    int iterations = 0;<a name="line.1533"></a>
+<span class="sourceLineNo">1534</span><a name="line.1534"></a>
+<span class="sourceLineNo">1535</span>    do {<a name="line.1535"></a>
+<span class="sourceLineNo">1536</span>      int i = RANDOM.nextInt(numServers);<a name="line.1536"></a>
+<span class="sourceLineNo">1537</span>      sn = servers.get(i);<a name="line.1537"></a>
+<span class="sourceLineNo">1538</span>    } while (cluster.wouldLowerAvailability(regionInfo, sn)<a name="line.1538"></a>
+<span class="sourceLineNo">1539</span>        &amp;&amp; iterations++ &lt; maxIterations);<a name="line.1539"></a>
+<span class="sourceLineNo">1540</span>    cluster.doAssignRegion(regionInfo, sn);<a name="line.1540"></a>
+<span class="sourceLineNo">1541</span>    return sn;<a name="line.1541"></a>
+<span class="sourceLineNo">1542</span>  }<a name="line.1542"></a>
+<span class="sourceLineNo">1543</span><a name="line.1543"></a>
+<span class="sourceLineNo">1544</span>  /**<a name="line.1544"></a>
+<span class="sourceLineNo">1545</span>   * Round robin a list of regions to a list of servers<a name="line.1545"></a>
+<span class="sourceLineNo">1546</span>   */<a name="line.1546"></a>
+<span class="sourceLineNo">1547</span>  private void roundRobinAssignment(Cluster cluster, List&lt;RegionInfo&gt; regions,<a name="line.1547"></a>
+<span class="sourceLineNo">1548</span>      List&lt;RegionInfo&gt; unassignedRegions, List&lt;ServerName&gt; servers,<a name="line.1548"></a>
+<span class="sourceLineNo">1549</span>      Map&lt;ServerName, List&lt;RegionInfo&gt;&gt; assignments) {<a name="line.1549"></a>
+<span class="sourceLineNo">1550</span><a name="line.1550"></a>
+<span class="sourceLineNo">1551</span>    int numServers = servers.size();<a name="line.1551"></a>
+<span class="sourceLineNo">1552</span>    int numRegions = regions.size();<a name="line.1552"></a>
+<span class="sourceLineNo">1553</span>    int max = (int) Math.ceil((float) numRegions / numServers);<a name="line.1553"></a>
+<span class="sourceLineNo">1554</span>    int serverIdx = 0;<a name="line.1554"></a>
+<span class="sourceLineNo">1555</span>    if (numServers &gt; 1) {<a name="line.1555"></a>
+<span class="sourceLineNo">1556</span>      serverIdx = RANDOM.nextInt(numServers);<a name="line.1556"></a>
+<span class="sourceLineNo">1557</span>    }<a name="line.1557"></a>
+<span class="sourceLineNo">1558</span>    int regionIdx = 0;<a name="line.1558"></a>
+<span class="sourceLineNo">1559</span><a name="line.1559"></a>
+<span class="sourceLineNo">1560</span>    for (int j = 0; j &lt; numServers; j++) {<a name="line.1560"></a>
+<span class="sourceLineNo">1561</span>      ServerName server = servers.get((j + serverIdx) % numServers);<a name="line.1561"></a>
+<span class="sourceLineNo">1562</span>      List&lt;RegionInfo&gt; serverRegions = new ArrayList&lt;&gt;(max);<a name="line.1562"></a>
+<span class="sourceLineNo">1563</span>      for (int i = regionIdx; i &lt; numRegions; i += numServers) {<a name="line.1563"></a>
+<span class="sourceLineNo">1564</span>        RegionInfo region = regions.get(i % numRegions);<a name="line.1564"></a>
+<span class="sourceLineNo">1565</span>        if (cluster.wouldLowerAvailability(region, server)) {<a name="line.1565"></a>
+<span class="sourceLineNo">1566</span>          unassignedRegions.add(region);<a name="line.1566"></a>
+<span class="sourceLineNo">1567</span>        } else {<a name="line.1567"></a>
+<span class="sourceLineNo">1568</span>          serverRegions.add(region);<a name="line.1568"></a>
+<span class="sourceLineNo">1569</span>          cluster.doAssignRegion(region, server);<a name="line.1569"></a>
+<span class="sourceLineNo">1570</span>        }<a name="line.1570"></a>
+<span class="sourceLineNo">1571</span>      }<a name="line.1571"></a>
+<span class="sourceLineNo">1572</span>      assignments.put(server, serverRegions);<a name="line.1572"></a>
+<span class="sourceLineNo">1573</span>      regionIdx++;<a name="line.1573"></a>
+<span class="sourceLineNo">1574</span>    }<a name="line.1574"></a>
+<span class="sourceLineNo">1575</span>  }<a name="line.1575"></a>
+<span class="sourceLineNo">1576</span><a name="line.1576"></a>
+<span class="sourceLineNo">1577</span>  protected Map&lt;ServerName, List&lt;RegionInfo&gt;&gt; getRegionAssignmentsByServer(<a name="line.1577"></a>
+<span class="sourceLineNo">1578</span>    Collection&lt;RegionInfo&gt; regions) {<a name="line.1578"></a>
+<span class="sourceLineNo">1579</span>    if (this.services != null &amp;&amp; this.services.getAssignmentManager() != null) {<a name="line.1579"></a>
+<span class="sourceLineNo">1580</span>      return this.services.getAssignmentManager().getSnapShotOfAssignment(regions);<a name="line.1580"></a>
+<span class="sourceLineNo">1581</span>    } else {<a name="line.1581"></a>
+<span class="sourceLineNo">1582</span>      return new HashMap&lt;&gt;();<a name="line.1582"></a>
+<span class="sourceLineNo">1583</span>    }<a name="line.1583"></a>
+<span class="sourceLineNo">1584</span>  }<a name="line.1584"></a>
+<span class="sourceLineNo">1585</span><a name="line.1585"></a>
+<span class="sourceLineNo">1586</span>  @Override<a name="line.1586"></a>
+<span class="sourceLineNo">1587</span>  public void onConfigurationChange(Configuration conf) {<a name="line.1587"></a>
+<span class="sourceLineNo">1588</span>  }<a name="line.1588"></a>
+<span class="sourceLineNo">1589</span>}<a name="line.1589"></a>
 
 
 


[08/29] hbase-site git commit: Published site at 477f9fdb32873387231c5fbbff130ba8bf7b5d68.

Posted by gi...@apache.org.
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/621479e1/devapidocs/src-html/org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.DefaultRackManager.html
----------------------------------------------------------------------
diff --git a/devapidocs/src-html/org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.DefaultRackManager.html b/devapidocs/src-html/org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.DefaultRackManager.html
index 7f42212..d4bf03c 100644
--- a/devapidocs/src-html/org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.DefaultRackManager.html
+++ b/devapidocs/src-html/org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.DefaultRackManager.html
@@ -1159,434 +1159,442 @@
 <span class="sourceLineNo">1151</span>    }<a name="line.1151"></a>
 <span class="sourceLineNo">1152</span>  }<a name="line.1152"></a>
 <span class="sourceLineNo">1153</span><a name="line.1153"></a>
-<span class="sourceLineNo">1154</span>  public void setRackManager(RackManager rackManager) {<a name="line.1154"></a>
-<span class="sourceLineNo">1155</span>    this.rackManager = rackManager;<a name="line.1155"></a>
-<span class="sourceLineNo">1156</span>  }<a name="line.1156"></a>
-<span class="sourceLineNo">1157</span><a name="line.1157"></a>
-<span class="sourceLineNo">1158</span>  protected boolean needsBalance(Cluster c) {<a name="line.1158"></a>
-<span class="sourceLineNo">1159</span>    ClusterLoadState cs = new ClusterLoadState(c.clusterState);<a name="line.1159"></a>
-<span class="sourceLineNo">1160</span>    if (cs.getNumServers() &lt; MIN_SERVER_BALANCE) {<a name="line.1160"></a>
-<span class="sourceLineNo">1161</span>      if (LOG.isDebugEnabled()) {<a name="line.1161"></a>
-<span class="sourceLineNo">1162</span>        LOG.debug("Not running balancer because only " + cs.getNumServers()<a name="line.1162"></a>
-<span class="sourceLineNo">1163</span>            + " active regionserver(s)");<a name="line.1163"></a>
-<span class="sourceLineNo">1164</span>      }<a name="line.1164"></a>
-<span class="sourceLineNo">1165</span>      return false;<a name="line.1165"></a>
-<span class="sourceLineNo">1166</span>    }<a name="line.1166"></a>
-<span class="sourceLineNo">1167</span>    if(areSomeRegionReplicasColocated(c)) return true;<a name="line.1167"></a>
-<span class="sourceLineNo">1168</span>    // Check if we even need to do any load balancing<a name="line.1168"></a>
-<span class="sourceLineNo">1169</span>    // HBASE-3681 check sloppiness first<a name="line.1169"></a>
-<span class="sourceLineNo">1170</span>    float average = cs.getLoadAverage(); // for logging<a name="line.1170"></a>
-<span class="sourceLineNo">1171</span>    int floor = (int) Math.floor(average * (1 - slop));<a name="line.1171"></a>
-<span class="sourceLineNo">1172</span>    int ceiling = (int) Math.ceil(average * (1 + slop));<a name="line.1172"></a>
-<span class="sourceLineNo">1173</span>    if (!(cs.getMaxLoad() &gt; ceiling || cs.getMinLoad() &lt; floor)) {<a name="line.1173"></a>
-<span class="sourceLineNo">1174</span>      NavigableMap&lt;ServerAndLoad, List&lt;RegionInfo&gt;&gt; serversByLoad = cs.getServersByLoad();<a name="line.1174"></a>
-<span class="sourceLineNo">1175</span>      if (LOG.isTraceEnabled()) {<a name="line.1175"></a>
-<span class="sourceLineNo">1176</span>        // If nothing to balance, then don't say anything unless trace-level logging.<a name="line.1176"></a>
-<span class="sourceLineNo">1177</span>        LOG.trace("Skipping load balancing because balanced cluster; " +<a name="line.1177"></a>
-<span class="sourceLineNo">1178</span>          "servers=" + cs.getNumServers() +<a name="line.1178"></a>
-<span class="sourceLineNo">1179</span>          " regions=" + cs.getNumRegions() + " average=" + average +<a name="line.1179"></a>
-<span class="sourceLineNo">1180</span>          " mostloaded=" + serversByLoad.lastKey().getLoad() +<a name="line.1180"></a>
-<span class="sourceLineNo">1181</span>          " leastloaded=" + serversByLoad.firstKey().getLoad());<a name="line.1181"></a>
-<span class="sourceLineNo">1182</span>      }<a name="line.1182"></a>
-<span class="sourceLineNo">1183</span>      return false;<a name="line.1183"></a>
-<span class="sourceLineNo">1184</span>    }<a name="line.1184"></a>
-<span class="sourceLineNo">1185</span>    return true;<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>   * Subclasses should implement this to return true if the cluster has nodes that hosts<a name="line.1189"></a>
-<span class="sourceLineNo">1190</span>   * multiple replicas for the same region, or, if there are multiple racks and the same<a name="line.1190"></a>
-<span class="sourceLineNo">1191</span>   * rack hosts replicas of the same region<a name="line.1191"></a>
-<span class="sourceLineNo">1192</span>   * @param c Cluster information<a name="line.1192"></a>
-<span class="sourceLineNo">1193</span>   * @return whether region replicas are currently co-located<a name="line.1193"></a>
-<span class="sourceLineNo">1194</span>   */<a name="line.1194"></a>
-<span class="sourceLineNo">1195</span>  protected boolean areSomeRegionReplicasColocated(Cluster c) {<a name="line.1195"></a>
-<span class="sourceLineNo">1196</span>    return false;<a name="line.1196"></a>
-<span class="sourceLineNo">1197</span>  }<a name="line.1197"></a>
-<span class="sourceLineNo">1198</span><a name="line.1198"></a>
-<span class="sourceLineNo">1199</span>  /**<a name="line.1199"></a>
-<span class="sourceLineNo">1200</span>   * Generates a bulk assignment plan to be used on cluster startup using a<a name="line.1200"></a>
-<span class="sourceLineNo">1201</span>   * simple round-robin assignment.<a name="line.1201"></a>
-<span class="sourceLineNo">1202</span>   * &lt;p&gt;<a name="line.1202"></a>
-<span class="sourceLineNo">1203</span>   * Takes a list of all the regions and all the servers in the cluster and<a name="line.1203"></a>
-<span class="sourceLineNo">1204</span>   * returns a map of each server to the regions that it should be assigned.<a name="line.1204"></a>
-<span class="sourceLineNo">1205</span>   * &lt;p&gt;<a name="line.1205"></a>
-<span class="sourceLineNo">1206</span>   * Currently implemented as a round-robin assignment. Same invariant as load<a name="line.1206"></a>
-<span class="sourceLineNo">1207</span>   * balancing, all servers holding floor(avg) or ceiling(avg).<a name="line.1207"></a>
-<span class="sourceLineNo">1208</span>   *<a name="line.1208"></a>
-<span class="sourceLineNo">1209</span>   * TODO: Use block locations from HDFS to place regions with their blocks<a name="line.1209"></a>
-<span class="sourceLineNo">1210</span>   *<a name="line.1210"></a>
-<span class="sourceLineNo">1211</span>   * @param regions all regions<a name="line.1211"></a>
-<span class="sourceLineNo">1212</span>   * @param servers all servers<a name="line.1212"></a>
-<span class="sourceLineNo">1213</span>   * @return map of server to the regions it should take, or null if no<a name="line.1213"></a>
-<span class="sourceLineNo">1214</span>   *         assignment is possible (ie. no regions or no servers)<a name="line.1214"></a>
-<span class="sourceLineNo">1215</span>   */<a name="line.1215"></a>
-<span class="sourceLineNo">1216</span>  @Override<a name="line.1216"></a>
-<span class="sourceLineNo">1217</span>  public Map&lt;ServerName, List&lt;RegionInfo&gt;&gt; roundRobinAssignment(List&lt;RegionInfo&gt; regions,<a name="line.1217"></a>
-<span class="sourceLineNo">1218</span>      List&lt;ServerName&gt; servers) throws HBaseIOException {<a name="line.1218"></a>
-<span class="sourceLineNo">1219</span>    metricsBalancer.incrMiscInvocations();<a name="line.1219"></a>
-<span class="sourceLineNo">1220</span>    Map&lt;ServerName, List&lt;RegionInfo&gt;&gt; assignments = assignMasterSystemRegions(regions, servers);<a name="line.1220"></a>
-<span class="sourceLineNo">1221</span>    if (assignments != null &amp;&amp; !assignments.isEmpty()) {<a name="line.1221"></a>
-<span class="sourceLineNo">1222</span>      servers = new ArrayList&lt;&gt;(servers);<a name="line.1222"></a>
-<span class="sourceLineNo">1223</span>      // Guarantee not to put other regions on master<a name="line.1223"></a>
-<span class="sourceLineNo">1224</span>      servers.remove(masterServerName);<a name="line.1224"></a>
-<span class="sourceLineNo">1225</span>      List&lt;RegionInfo&gt; masterRegions = assignments.get(masterServerName);<a name="line.1225"></a>
-<span class="sourceLineNo">1226</span>      if (!masterRegions.isEmpty()) {<a name="line.1226"></a>
-<span class="sourceLineNo">1227</span>        regions = new ArrayList&lt;&gt;(regions);<a name="line.1227"></a>
-<span class="sourceLineNo">1228</span>        regions.removeAll(masterRegions);<a name="line.1228"></a>
-<span class="sourceLineNo">1229</span>      }<a name="line.1229"></a>
-<span class="sourceLineNo">1230</span>    }<a name="line.1230"></a>
-<span class="sourceLineNo">1231</span>    if (regions == null || regions.isEmpty()) {<a name="line.1231"></a>
-<span class="sourceLineNo">1232</span>      return assignments;<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>    int numServers = servers == null ? 0 : servers.size();<a name="line.1235"></a>
-<span class="sourceLineNo">1236</span>    if (numServers == 0) {<a name="line.1236"></a>
-<span class="sourceLineNo">1237</span>      LOG.warn("Wanted to do round robin assignment but no servers to assign to");<a name="line.1237"></a>
-<span class="sourceLineNo">1238</span>      return null;<a name="line.1238"></a>
-<span class="sourceLineNo">1239</span>    }<a name="line.1239"></a>
-<span class="sourceLineNo">1240</span><a name="line.1240"></a>
-<span class="sourceLineNo">1241</span>    // TODO: instead of retainAssignment() and roundRobinAssignment(), we should just run the<a name="line.1241"></a>
-<span class="sourceLineNo">1242</span>    // normal LB.balancerCluster() with unassignedRegions. We only need to have a candidate<a name="line.1242"></a>
-<span class="sourceLineNo">1243</span>    // generator for AssignRegionAction. The LB will ensure the regions are mostly local<a name="line.1243"></a>
-<span class="sourceLineNo">1244</span>    // and balanced. This should also run fast with fewer number of iterations.<a name="line.1244"></a>
-<span class="sourceLineNo">1245</span><a name="line.1245"></a>
-<span class="sourceLineNo">1246</span>    if (numServers == 1) { // Only one server, nothing fancy we can do here<a name="line.1246"></a>
-<span class="sourceLineNo">1247</span>      ServerName server = servers.get(0);<a name="line.1247"></a>
-<span class="sourceLineNo">1248</span>      assignments.put(server, new ArrayList&lt;&gt;(regions));<a name="line.1248"></a>
-<span class="sourceLineNo">1249</span>      return assignments;<a name="line.1249"></a>
-<span class="sourceLineNo">1250</span>    }<a name="line.1250"></a>
-<span class="sourceLineNo">1251</span><a name="line.1251"></a>
-<span class="sourceLineNo">1252</span>    Cluster cluster = createCluster(servers, regions, false);<a name="line.1252"></a>
-<span class="sourceLineNo">1253</span>    List&lt;RegionInfo&gt; unassignedRegions = new ArrayList&lt;&gt;();<a name="line.1253"></a>
-<span class="sourceLineNo">1254</span><a name="line.1254"></a>
-<span class="sourceLineNo">1255</span>    roundRobinAssignment(cluster, regions, unassignedRegions,<a name="line.1255"></a>
-<span class="sourceLineNo">1256</span>      servers, assignments);<a name="line.1256"></a>
-<span class="sourceLineNo">1257</span><a name="line.1257"></a>
-<span class="sourceLineNo">1258</span>    List&lt;RegionInfo&gt; lastFewRegions = new ArrayList&lt;&gt;();<a name="line.1258"></a>
-<span class="sourceLineNo">1259</span>    // assign the remaining by going through the list and try to assign to servers one-by-one<a name="line.1259"></a>
-<span class="sourceLineNo">1260</span>    int serverIdx = RANDOM.nextInt(numServers);<a name="line.1260"></a>
-<span class="sourceLineNo">1261</span>    for (RegionInfo region : unassignedRegions) {<a name="line.1261"></a>
-<span class="sourceLineNo">1262</span>      boolean assigned = false;<a name="line.1262"></a>
-<span class="sourceLineNo">1263</span>      for (int j = 0; j &lt; numServers; j++) { // try all servers one by one<a name="line.1263"></a>
-<span class="sourceLineNo">1264</span>        ServerName serverName = servers.get((j + serverIdx) % numServers);<a name="line.1264"></a>
-<span class="sourceLineNo">1265</span>        if (!cluster.wouldLowerAvailability(region, serverName)) {<a name="line.1265"></a>
-<span class="sourceLineNo">1266</span>          List&lt;RegionInfo&gt; serverRegions =<a name="line.1266"></a>
-<span class="sourceLineNo">1267</span>              assignments.computeIfAbsent(serverName, k -&gt; new ArrayList&lt;&gt;());<a name="line.1267"></a>
-<span class="sourceLineNo">1268</span>          serverRegions.add(region);<a name="line.1268"></a>
-<span class="sourceLineNo">1269</span>          cluster.doAssignRegion(region, serverName);<a name="line.1269"></a>
-<span class="sourceLineNo">1270</span>          serverIdx = (j + serverIdx + 1) % numServers; //remain from next server<a name="line.1270"></a>
-<span class="sourceLineNo">1271</span>          assigned = true;<a name="line.1271"></a>
-<span class="sourceLineNo">1272</span>          break;<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>      if (!assigned) {<a name="line.1275"></a>
-<span class="sourceLineNo">1276</span>        lastFewRegions.add(region);<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>    // just sprinkle the rest of the regions on random regionservers. The balanceCluster will<a name="line.1279"></a>
-<span class="sourceLineNo">1280</span>    // make it optimal later. we can end up with this if numReplicas &gt; numServers.<a name="line.1280"></a>
-<span class="sourceLineNo">1281</span>    for (RegionInfo region : lastFewRegions) {<a name="line.1281"></a>
-<span class="sourceLineNo">1282</span>      int i = RANDOM.nextInt(numServers);<a name="line.1282"></a>
-<span class="sourceLineNo">1283</span>      ServerName server = servers.get(i);<a name="line.1283"></a>
-<span class="sourceLineNo">1284</span>      List&lt;RegionInfo&gt; serverRegions = assignments.computeIfAbsent(server, k -&gt; new ArrayList&lt;&gt;());<a name="line.1284"></a>
-<span class="sourceLineNo">1285</span>      serverRegions.add(region);<a name="line.1285"></a>
-<span class="sourceLineNo">1286</span>      cluster.doAssignRegion(region, server);<a name="line.1286"></a>
-<span class="sourceLineNo">1287</span>    }<a name="line.1287"></a>
-<span class="sourceLineNo">1288</span>    return assignments;<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>  protected Cluster createCluster(List&lt;ServerName&gt; servers,<a name="line.1291"></a>
-<span class="sourceLineNo">1292</span>      Collection&lt;RegionInfo&gt; regions, boolean forceRefresh) {<a name="line.1292"></a>
-<span class="sourceLineNo">1293</span>    if (forceRefresh &amp;&amp; useRegionFinder) {<a name="line.1293"></a>
-<span class="sourceLineNo">1294</span>      regionFinder.refreshAndWait(regions);<a name="line.1294"></a>
-<span class="sourceLineNo">1295</span>    }<a name="line.1295"></a>
-<span class="sourceLineNo">1296</span>    // Get the snapshot of the current assignments for the regions in question, and then create<a name="line.1296"></a>
-<span class="sourceLineNo">1297</span>    // a cluster out of it. Note that we might have replicas already assigned to some servers<a name="line.1297"></a>
-<span class="sourceLineNo">1298</span>    // earlier. So we want to get the snapshot to see those assignments, but this will only contain<a name="line.1298"></a>
-<span class="sourceLineNo">1299</span>    // replicas of the regions that are passed (for performance).<a name="line.1299"></a>
-<span class="sourceLineNo">1300</span>    Map&lt;ServerName, List&lt;RegionInfo&gt;&gt; clusterState = getRegionAssignmentsByServer(regions);<a name="line.1300"></a>
-<span class="sourceLineNo">1301</span><a name="line.1301"></a>
-<span class="sourceLineNo">1302</span>    for (ServerName server : servers) {<a name="line.1302"></a>
-<span class="sourceLineNo">1303</span>      if (!clusterState.containsKey(server)) {<a name="line.1303"></a>
-<span class="sourceLineNo">1304</span>        clusterState.put(server, EMPTY_REGION_LIST);<a name="line.1304"></a>
-<span class="sourceLineNo">1305</span>      }<a name="line.1305"></a>
-<span class="sourceLineNo">1306</span>    }<a name="line.1306"></a>
-<span class="sourceLineNo">1307</span>    return new Cluster(regions, clusterState, null, this.regionFinder,<a name="line.1307"></a>
-<span class="sourceLineNo">1308</span>        rackManager);<a name="line.1308"></a>
-<span class="sourceLineNo">1309</span>  }<a name="line.1309"></a>
+<span class="sourceLineNo">1154</span>  @Override<a name="line.1154"></a>
+<span class="sourceLineNo">1155</span>  public void postMasterStartupInitialize() {<a name="line.1155"></a>
+<span class="sourceLineNo">1156</span>    if (services != null &amp;&amp; regionFinder != null) {<a name="line.1156"></a>
+<span class="sourceLineNo">1157</span>      try {<a name="line.1157"></a>
+<span class="sourceLineNo">1158</span>        Set&lt;RegionInfo&gt; regions =<a name="line.1158"></a>
+<span class="sourceLineNo">1159</span>            services.getAssignmentManager().getRegionStates().getRegionAssignments().keySet();<a name="line.1159"></a>
+<span class="sourceLineNo">1160</span>        regionFinder.refreshAndWait(regions);<a name="line.1160"></a>
+<span class="sourceLineNo">1161</span>      } catch (Exception e) {<a name="line.1161"></a>
+<span class="sourceLineNo">1162</span>        LOG.warn("Refreshing region HDFS Block dist failed with exception, ignoring", e);<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>  }<a name="line.1165"></a>
+<span class="sourceLineNo">1166</span><a name="line.1166"></a>
+<span class="sourceLineNo">1167</span>  public void setRackManager(RackManager rackManager) {<a name="line.1167"></a>
+<span class="sourceLineNo">1168</span>    this.rackManager = rackManager;<a name="line.1168"></a>
+<span class="sourceLineNo">1169</span>  }<a name="line.1169"></a>
+<span class="sourceLineNo">1170</span><a name="line.1170"></a>
+<span class="sourceLineNo">1171</span>  protected boolean needsBalance(Cluster c) {<a name="line.1171"></a>
+<span class="sourceLineNo">1172</span>    ClusterLoadState cs = new ClusterLoadState(c.clusterState);<a name="line.1172"></a>
+<span class="sourceLineNo">1173</span>    if (cs.getNumServers() &lt; MIN_SERVER_BALANCE) {<a name="line.1173"></a>
+<span class="sourceLineNo">1174</span>      if (LOG.isDebugEnabled()) {<a name="line.1174"></a>
+<span class="sourceLineNo">1175</span>        LOG.debug("Not running balancer because only " + cs.getNumServers()<a name="line.1175"></a>
+<span class="sourceLineNo">1176</span>            + " active regionserver(s)");<a name="line.1176"></a>
+<span class="sourceLineNo">1177</span>      }<a name="line.1177"></a>
+<span class="sourceLineNo">1178</span>      return false;<a name="line.1178"></a>
+<span class="sourceLineNo">1179</span>    }<a name="line.1179"></a>
+<span class="sourceLineNo">1180</span>    if(areSomeRegionReplicasColocated(c)) return true;<a name="line.1180"></a>
+<span class="sourceLineNo">1181</span>    // Check if we even need to do any load balancing<a name="line.1181"></a>
+<span class="sourceLineNo">1182</span>    // HBASE-3681 check sloppiness first<a name="line.1182"></a>
+<span class="sourceLineNo">1183</span>    float average = cs.getLoadAverage(); // for logging<a name="line.1183"></a>
+<span class="sourceLineNo">1184</span>    int floor = (int) Math.floor(average * (1 - slop));<a name="line.1184"></a>
+<span class="sourceLineNo">1185</span>    int ceiling = (int) Math.ceil(average * (1 + slop));<a name="line.1185"></a>
+<span class="sourceLineNo">1186</span>    if (!(cs.getMaxLoad() &gt; ceiling || cs.getMinLoad() &lt; floor)) {<a name="line.1186"></a>
+<span class="sourceLineNo">1187</span>      NavigableMap&lt;ServerAndLoad, List&lt;RegionInfo&gt;&gt; serversByLoad = cs.getServersByLoad();<a name="line.1187"></a>
+<span class="sourceLineNo">1188</span>      if (LOG.isTraceEnabled()) {<a name="line.1188"></a>
+<span class="sourceLineNo">1189</span>        // If nothing to balance, then don't say anything unless trace-level logging.<a name="line.1189"></a>
+<span class="sourceLineNo">1190</span>        LOG.trace("Skipping load balancing because balanced cluster; " +<a name="line.1190"></a>
+<span class="sourceLineNo">1191</span>          "servers=" + cs.getNumServers() +<a name="line.1191"></a>
+<span class="sourceLineNo">1192</span>          " regions=" + cs.getNumRegions() + " average=" + average +<a name="line.1192"></a>
+<span class="sourceLineNo">1193</span>          " mostloaded=" + serversByLoad.lastKey().getLoad() +<a name="line.1193"></a>
+<span class="sourceLineNo">1194</span>          " leastloaded=" + serversByLoad.firstKey().getLoad());<a name="line.1194"></a>
+<span class="sourceLineNo">1195</span>      }<a name="line.1195"></a>
+<span class="sourceLineNo">1196</span>      return false;<a name="line.1196"></a>
+<span class="sourceLineNo">1197</span>    }<a name="line.1197"></a>
+<span class="sourceLineNo">1198</span>    return true;<a name="line.1198"></a>
+<span class="sourceLineNo">1199</span>  }<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>   * Subclasses should implement this to return true if the cluster has nodes that hosts<a name="line.1202"></a>
+<span class="sourceLineNo">1203</span>   * multiple replicas for the same region, or, if there are multiple racks and the same<a name="line.1203"></a>
+<span class="sourceLineNo">1204</span>   * rack hosts replicas of the same region<a name="line.1204"></a>
+<span class="sourceLineNo">1205</span>   * @param c Cluster information<a name="line.1205"></a>
+<span class="sourceLineNo">1206</span>   * @return whether region replicas are currently co-located<a name="line.1206"></a>
+<span class="sourceLineNo">1207</span>   */<a name="line.1207"></a>
+<span class="sourceLineNo">1208</span>  protected boolean areSomeRegionReplicasColocated(Cluster c) {<a name="line.1208"></a>
+<span class="sourceLineNo">1209</span>    return false;<a name="line.1209"></a>
+<span class="sourceLineNo">1210</span>  }<a name="line.1210"></a>
+<span class="sourceLineNo">1211</span><a name="line.1211"></a>
+<span class="sourceLineNo">1212</span>  /**<a name="line.1212"></a>
+<span class="sourceLineNo">1213</span>   * Generates a bulk assignment plan to be used on cluster startup using a<a name="line.1213"></a>
+<span class="sourceLineNo">1214</span>   * simple round-robin assignment.<a name="line.1214"></a>
+<span class="sourceLineNo">1215</span>   * &lt;p&gt;<a name="line.1215"></a>
+<span class="sourceLineNo">1216</span>   * Takes a list of all the regions and all the servers in the cluster and<a name="line.1216"></a>
+<span class="sourceLineNo">1217</span>   * returns a map of each server to the regions that it should be assigned.<a name="line.1217"></a>
+<span class="sourceLineNo">1218</span>   * &lt;p&gt;<a name="line.1218"></a>
+<span class="sourceLineNo">1219</span>   * Currently implemented as a round-robin assignment. Same invariant as load<a name="line.1219"></a>
+<span class="sourceLineNo">1220</span>   * balancing, all servers holding floor(avg) or ceiling(avg).<a name="line.1220"></a>
+<span class="sourceLineNo">1221</span>   *<a name="line.1221"></a>
+<span class="sourceLineNo">1222</span>   * TODO: Use block locations from HDFS to place regions with their blocks<a name="line.1222"></a>
+<span class="sourceLineNo">1223</span>   *<a name="line.1223"></a>
+<span class="sourceLineNo">1224</span>   * @param regions all regions<a name="line.1224"></a>
+<span class="sourceLineNo">1225</span>   * @param servers all servers<a name="line.1225"></a>
+<span class="sourceLineNo">1226</span>   * @return map of server to the regions it should take, or null if no<a name="line.1226"></a>
+<span class="sourceLineNo">1227</span>   *         assignment is possible (ie. no regions or no servers)<a name="line.1227"></a>
+<span class="sourceLineNo">1228</span>   */<a name="line.1228"></a>
+<span class="sourceLineNo">1229</span>  @Override<a name="line.1229"></a>
+<span class="sourceLineNo">1230</span>  public Map&lt;ServerName, List&lt;RegionInfo&gt;&gt; roundRobinAssignment(List&lt;RegionInfo&gt; regions,<a name="line.1230"></a>
+<span class="sourceLineNo">1231</span>      List&lt;ServerName&gt; servers) throws HBaseIOException {<a name="line.1231"></a>
+<span class="sourceLineNo">1232</span>    metricsBalancer.incrMiscInvocations();<a name="line.1232"></a>
+<span class="sourceLineNo">1233</span>    Map&lt;ServerName, List&lt;RegionInfo&gt;&gt; assignments = assignMasterSystemRegions(regions, servers);<a name="line.1233"></a>
+<span class="sourceLineNo">1234</span>    if (assignments != null &amp;&amp; !assignments.isEmpty()) {<a name="line.1234"></a>
+<span class="sourceLineNo">1235</span>      servers = new ArrayList&lt;&gt;(servers);<a name="line.1235"></a>
+<span class="sourceLineNo">1236</span>      // Guarantee not to put other regions on master<a name="line.1236"></a>
+<span class="sourceLineNo">1237</span>      servers.remove(masterServerName);<a name="line.1237"></a>
+<span class="sourceLineNo">1238</span>      List&lt;RegionInfo&gt; masterRegions = assignments.get(masterServerName);<a name="line.1238"></a>
+<span class="sourceLineNo">1239</span>      if (!masterRegions.isEmpty()) {<a name="line.1239"></a>
+<span class="sourceLineNo">1240</span>        regions = new ArrayList&lt;&gt;(regions);<a name="line.1240"></a>
+<span class="sourceLineNo">1241</span>        regions.removeAll(masterRegions);<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>    if (regions == null || regions.isEmpty()) {<a name="line.1244"></a>
+<span class="sourceLineNo">1245</span>      return assignments;<a name="line.1245"></a>
+<span class="sourceLineNo">1246</span>    }<a name="line.1246"></a>
+<span class="sourceLineNo">1247</span><a name="line.1247"></a>
+<span class="sourceLineNo">1248</span>    int numServers = servers == null ? 0 : servers.size();<a name="line.1248"></a>
+<span class="sourceLineNo">1249</span>    if (numServers == 0) {<a name="line.1249"></a>
+<span class="sourceLineNo">1250</span>      LOG.warn("Wanted to do round robin assignment but no servers to assign to");<a name="line.1250"></a>
+<span class="sourceLineNo">1251</span>      return null;<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>    // TODO: instead of retainAssignment() and roundRobinAssignment(), we should just run the<a name="line.1254"></a>
+<span class="sourceLineNo">1255</span>    // normal LB.balancerCluster() with unassignedRegions. We only need to have a candidate<a name="line.1255"></a>
+<span class="sourceLineNo">1256</span>    // generator for AssignRegionAction. The LB will ensure the regions are mostly local<a name="line.1256"></a>
+<span class="sourceLineNo">1257</span>    // and balanced. This should also run fast with fewer number of iterations.<a name="line.1257"></a>
+<span class="sourceLineNo">1258</span><a name="line.1258"></a>
+<span class="sourceLineNo">1259</span>    if (numServers == 1) { // Only one server, nothing fancy we can do here<a name="line.1259"></a>
+<span class="sourceLineNo">1260</span>      ServerName server = servers.get(0);<a name="line.1260"></a>
+<span class="sourceLineNo">1261</span>      assignments.put(server, new ArrayList&lt;&gt;(regions));<a name="line.1261"></a>
+<span class="sourceLineNo">1262</span>      return assignments;<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>    Cluster cluster = createCluster(servers, regions);<a name="line.1265"></a>
+<span class="sourceLineNo">1266</span>    List&lt;RegionInfo&gt; unassignedRegions = new ArrayList&lt;&gt;();<a name="line.1266"></a>
+<span class="sourceLineNo">1267</span><a name="line.1267"></a>
+<span class="sourceLineNo">1268</span>    roundRobinAssignment(cluster, regions, unassignedRegions,<a name="line.1268"></a>
+<span class="sourceLineNo">1269</span>      servers, assignments);<a name="line.1269"></a>
+<span class="sourceLineNo">1270</span><a name="line.1270"></a>
+<span class="sourceLineNo">1271</span>    List&lt;RegionInfo&gt; lastFewRegions = new ArrayList&lt;&gt;();<a name="line.1271"></a>
+<span class="sourceLineNo">1272</span>    // assign the remaining by going through the list and try to assign to servers one-by-one<a name="line.1272"></a>
+<span class="sourceLineNo">1273</span>    int serverIdx = RANDOM.nextInt(numServers);<a name="line.1273"></a>
+<span class="sourceLineNo">1274</span>    for (RegionInfo region : unassignedRegions) {<a name="line.1274"></a>
+<span class="sourceLineNo">1275</span>      boolean assigned = false;<a name="line.1275"></a>
+<span class="sourceLineNo">1276</span>      for (int j = 0; j &lt; numServers; j++) { // try all servers one by one<a name="line.1276"></a>
+<span class="sourceLineNo">1277</span>        ServerName serverName = servers.get((j + serverIdx) % numServers);<a name="line.1277"></a>
+<span class="sourceLineNo">1278</span>        if (!cluster.wouldLowerAvailability(region, serverName)) {<a name="line.1278"></a>
+<span class="sourceLineNo">1279</span>          List&lt;RegionInfo&gt; serverRegions =<a name="line.1279"></a>
+<span class="sourceLineNo">1280</span>              assignments.computeIfAbsent(serverName, k -&gt; new ArrayList&lt;&gt;());<a name="line.1280"></a>
+<span class="sourceLineNo">1281</span>          serverRegions.add(region);<a name="line.1281"></a>
+<span class="sourceLineNo">1282</span>          cluster.doAssignRegion(region, serverName);<a name="line.1282"></a>
+<span class="sourceLineNo">1283</span>          serverIdx = (j + serverIdx + 1) % numServers; //remain from next server<a name="line.1283"></a>
+<span class="sourceLineNo">1284</span>          assigned = true;<a name="line.1284"></a>
+<span class="sourceLineNo">1285</span>          break;<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>      if (!assigned) {<a name="line.1288"></a>
+<span class="sourceLineNo">1289</span>        lastFewRegions.add(region);<a name="line.1289"></a>
+<span class="sourceLineNo">1290</span>      }<a name="line.1290"></a>
+<span class="sourceLineNo">1291</span>    }<a name="line.1291"></a>
+<span class="sourceLineNo">1292</span>    // just sprinkle the rest of the regions on random regionservers. The balanceCluster will<a name="line.1292"></a>
+<span class="sourceLineNo">1293</span>    // make it optimal later. we can end up with this if numReplicas &gt; numServers.<a name="line.1293"></a>
+<span class="sourceLineNo">1294</span>    for (RegionInfo region : lastFewRegions) {<a name="line.1294"></a>
+<span class="sourceLineNo">1295</span>      int i = RANDOM.nextInt(numServers);<a name="line.1295"></a>
+<span class="sourceLineNo">1296</span>      ServerName server = servers.get(i);<a name="line.1296"></a>
+<span class="sourceLineNo">1297</span>      List&lt;RegionInfo&gt; serverRegions = assignments.computeIfAbsent(server, k -&gt; new ArrayList&lt;&gt;());<a name="line.1297"></a>
+<span class="sourceLineNo">1298</span>      serverRegions.add(region);<a name="line.1298"></a>
+<span class="sourceLineNo">1299</span>      cluster.doAssignRegion(region, server);<a name="line.1299"></a>
+<span class="sourceLineNo">1300</span>    }<a name="line.1300"></a>
+<span class="sourceLineNo">1301</span>    return assignments;<a name="line.1301"></a>
+<span class="sourceLineNo">1302</span>  }<a name="line.1302"></a>
+<span class="sourceLineNo">1303</span><a name="line.1303"></a>
+<span class="sourceLineNo">1304</span>  protected Cluster createCluster(List&lt;ServerName&gt; servers, Collection&lt;RegionInfo&gt; regions) {<a name="line.1304"></a>
+<span class="sourceLineNo">1305</span>    // Get the snapshot of the current assignments for the regions in question, and then create<a name="line.1305"></a>
+<span class="sourceLineNo">1306</span>    // a cluster out of it. Note that we might have replicas already assigned to some servers<a name="line.1306"></a>
+<span class="sourceLineNo">1307</span>    // earlier. So we want to get the snapshot to see those assignments, but this will only contain<a name="line.1307"></a>
+<span class="sourceLineNo">1308</span>    // replicas of the regions that are passed (for performance).<a name="line.1308"></a>
+<span class="sourceLineNo">1309</span>    Map&lt;ServerName, List&lt;RegionInfo&gt;&gt; clusterState = getRegionAssignmentsByServer(regions);<a name="line.1309"></a>
 <span class="sourceLineNo">1310</span><a name="line.1310"></a>
-<span class="sourceLineNo">1311</span>  private List&lt;ServerName&gt; findIdleServers(List&lt;ServerName&gt; servers) {<a name="line.1311"></a>
-<span class="sourceLineNo">1312</span>    return this.services.getServerManager()<a name="line.1312"></a>
-<span class="sourceLineNo">1313</span>            .getOnlineServersListWithPredicator(servers, IDLE_SERVER_PREDICATOR);<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>  /**<a name="line.1316"></a>
-<span class="sourceLineNo">1317</span>   * Used to assign a single region to a random server.<a name="line.1317"></a>
-<span class="sourceLineNo">1318</span>   */<a name="line.1318"></a>
-<span class="sourceLineNo">1319</span>  @Override<a name="line.1319"></a>
-<span class="sourceLineNo">1320</span>  public ServerName randomAssignment(RegionInfo regionInfo, List&lt;ServerName&gt; servers)<a name="line.1320"></a>
-<span class="sourceLineNo">1321</span>      throws HBaseIOException {<a name="line.1321"></a>
-<span class="sourceLineNo">1322</span>    metricsBalancer.incrMiscInvocations();<a name="line.1322"></a>
-<span class="sourceLineNo">1323</span>    if (servers != null &amp;&amp; servers.contains(masterServerName)) {<a name="line.1323"></a>
-<span class="sourceLineNo">1324</span>      if (shouldBeOnMaster(regionInfo)) {<a name="line.1324"></a>
-<span class="sourceLineNo">1325</span>        return masterServerName;<a name="line.1325"></a>
-<span class="sourceLineNo">1326</span>      }<a name="line.1326"></a>
-<span class="sourceLineNo">1327</span>      if (!LoadBalancer.isTablesOnMaster(getConf())) {<a name="line.1327"></a>
-<span class="sourceLineNo">1328</span>        // Guarantee we do not put any regions on master<a name="line.1328"></a>
-<span class="sourceLineNo">1329</span>        servers = new ArrayList&lt;&gt;(servers);<a name="line.1329"></a>
-<span class="sourceLineNo">1330</span>        servers.remove(masterServerName);<a name="line.1330"></a>
-<span class="sourceLineNo">1331</span>      }<a name="line.1331"></a>
-<span class="sourceLineNo">1332</span>    }<a name="line.1332"></a>
-<span class="sourceLineNo">1333</span><a name="line.1333"></a>
-<span class="sourceLineNo">1334</span>    int numServers = servers == null ? 0 : servers.size();<a name="line.1334"></a>
-<span class="sourceLineNo">1335</span>    if (numServers == 0) {<a name="line.1335"></a>
-<span class="sourceLineNo">1336</span>      LOG.warn("Wanted to retain assignment but no servers to assign to");<a name="line.1336"></a>
-<span class="sourceLineNo">1337</span>      return null;<a name="line.1337"></a>
-<span class="sourceLineNo">1338</span>    }<a name="line.1338"></a>
-<span class="sourceLineNo">1339</span>    if (numServers == 1) { // Only one server, nothing fancy we can do here<a name="line.1339"></a>
-<span class="sourceLineNo">1340</span>      return servers.get(0);<a name="line.1340"></a>
+<span class="sourceLineNo">1311</span>    for (ServerName server : servers) {<a name="line.1311"></a>
+<span class="sourceLineNo">1312</span>      if (!clusterState.containsKey(server)) {<a name="line.1312"></a>
+<span class="sourceLineNo">1313</span>        clusterState.put(server, EMPTY_REGION_LIST);<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>    return new Cluster(regions, clusterState, null, this.regionFinder,<a name="line.1316"></a>
+<span class="sourceLineNo">1317</span>        rackManager);<a name="line.1317"></a>
+<span class="sourceLineNo">1318</span>  }<a name="line.1318"></a>
+<span class="sourceLineNo">1319</span><a name="line.1319"></a>
+<span class="sourceLineNo">1320</span>  private List&lt;ServerName&gt; findIdleServers(List&lt;ServerName&gt; servers) {<a name="line.1320"></a>
+<span class="sourceLineNo">1321</span>    return this.services.getServerManager()<a name="line.1321"></a>
+<span class="sourceLineNo">1322</span>            .getOnlineServersListWithPredicator(servers, IDLE_SERVER_PREDICATOR);<a name="line.1322"></a>
+<span class="sourceLineNo">1323</span>  }<a name="line.1323"></a>
+<span class="sourceLineNo">1324</span><a name="line.1324"></a>
+<span class="sourceLineNo">1325</span>  /**<a name="line.1325"></a>
+<span class="sourceLineNo">1326</span>   * Used to assign a single region to a random server.<a name="line.1326"></a>
+<span class="sourceLineNo">1327</span>   */<a name="line.1327"></a>
+<span class="sourceLineNo">1328</span>  @Override<a name="line.1328"></a>
+<span class="sourceLineNo">1329</span>  public ServerName randomAssignment(RegionInfo regionInfo, List&lt;ServerName&gt; servers)<a name="line.1329"></a>
+<span class="sourceLineNo">1330</span>      throws HBaseIOException {<a name="line.1330"></a>
+<span class="sourceLineNo">1331</span>    metricsBalancer.incrMiscInvocations();<a name="line.1331"></a>
+<span class="sourceLineNo">1332</span>    if (servers != null &amp;&amp; servers.contains(masterServerName)) {<a name="line.1332"></a>
+<span class="sourceLineNo">1333</span>      if (shouldBeOnMaster(regionInfo)) {<a name="line.1333"></a>
+<span class="sourceLineNo">1334</span>        return masterServerName;<a name="line.1334"></a>
+<span class="sourceLineNo">1335</span>      }<a name="line.1335"></a>
+<span class="sourceLineNo">1336</span>      if (!LoadBalancer.isTablesOnMaster(getConf())) {<a name="line.1336"></a>
+<span class="sourceLineNo">1337</span>        // Guarantee we do not put any regions on master<a name="line.1337"></a>
+<span class="sourceLineNo">1338</span>        servers = new ArrayList&lt;&gt;(servers);<a name="line.1338"></a>
+<span class="sourceLineNo">1339</span>        servers.remove(masterServerName);<a name="line.1339"></a>
+<span class="sourceLineNo">1340</span>      }<a name="line.1340"></a>
 <span class="sourceLineNo">1341</span>    }<a name="line.1341"></a>
-<span class="sourceLineNo">1342</span>    List&lt;ServerName&gt; idleServers = findIdleServers(servers);<a name="line.1342"></a>
-<span class="sourceLineNo">1343</span>    if (idleServers.size() == 1) {<a name="line.1343"></a>
-<span class="sourceLineNo">1344</span>      return idleServers.get(0);<a name="line.1344"></a>
-<span class="sourceLineNo">1345</span>    }<a name="line.1345"></a>
-<span class="sourceLineNo">1346</span>    final List&lt;ServerName&gt; finalServers = idleServers.isEmpty() ?<a name="line.1346"></a>
-<span class="sourceLineNo">1347</span>            servers : idleServers;<a name="line.1347"></a>
-<span class="sourceLineNo">1348</span>    List&lt;RegionInfo&gt; regions = Lists.newArrayList(regionInfo);<a name="line.1348"></a>
-<span class="sourceLineNo">1349</span>    Cluster cluster = createCluster(finalServers, regions, false);<a name="line.1349"></a>
-<span class="sourceLineNo">1350</span>    return randomAssignment(cluster, regionInfo, finalServers);<a name="line.1350"></a>
-<span class="sourceLineNo">1351</span>  }<a name="line.1351"></a>
-<span class="sourceLineNo">1352</span><a name="line.1352"></a>
-<span class="sourceLineNo">1353</span>  /**<a name="line.1353"></a>
-<span class="sourceLineNo">1354</span>   * Generates a bulk assignment startup plan, attempting to reuse the existing<a name="line.1354"></a>
-<span class="sourceLineNo">1355</span>   * assignment information from META, but adjusting for the specified list of<a name="line.1355"></a>
-<span class="sourceLineNo">1356</span>   * available/online servers available for assignment.<a name="line.1356"></a>
-<span class="sourceLineNo">1357</span>   * &lt;p&gt;<a name="line.1357"></a>
-<span class="sourceLineNo">1358</span>   * Takes a map of all regions to their existing assignment from META. Also<a name="line.1358"></a>
-<span class="sourceLineNo">1359</span>   * takes a list of online servers for regions to be assigned to. Attempts to<a name="line.1359"></a>
-<span class="sourceLineNo">1360</span>   * retain all assignment, so in some instances initial assignment will not be<a name="line.1360"></a>
-<span class="sourceLineNo">1361</span>   * completely balanced.<a name="line.1361"></a>
-<span class="sourceLineNo">1362</span>   * &lt;p&gt;<a name="line.1362"></a>
-<span class="sourceLineNo">1363</span>   * Any leftover regions without an existing server to be assigned to will be<a name="line.1363"></a>
-<span class="sourceLineNo">1364</span>   * assigned randomly to available servers.<a name="line.1364"></a>
-<span class="sourceLineNo">1365</span>   *<a name="line.1365"></a>
-<span class="sourceLineNo">1366</span>   * @param regions regions and existing assignment from meta<a name="line.1366"></a>
-<span class="sourceLineNo">1367</span>   * @param servers available servers<a name="line.1367"></a>
-<span class="sourceLineNo">1368</span>   * @return map of servers and regions to be assigned to them<a name="line.1368"></a>
-<span class="sourceLineNo">1369</span>   */<a name="line.1369"></a>
-<span class="sourceLineNo">1370</span>  @Override<a name="line.1370"></a>
-<span class="sourceLineNo">1371</span>  public Map&lt;ServerName, List&lt;RegionInfo&gt;&gt; retainAssignment(Map&lt;RegionInfo, ServerName&gt; regions,<a name="line.1371"></a>
-<span class="sourceLineNo">1372</span>      List&lt;ServerName&gt; servers) throws HBaseIOException {<a name="line.1372"></a>
-<span class="sourceLineNo">1373</span>    // Update metrics<a name="line.1373"></a>
-<span class="sourceLineNo">1374</span>    metricsBalancer.incrMiscInvocations();<a name="line.1374"></a>
-<span class="sourceLineNo">1375</span>    Map&lt;ServerName, List&lt;RegionInfo&gt;&gt; assignments = assignMasterSystemRegions(regions.keySet(), servers);<a name="line.1375"></a>
-<span class="sourceLineNo">1376</span>    if (assignments != null &amp;&amp; !assignments.isEmpty()) {<a name="line.1376"></a>
-<span class="sourceLineNo">1377</span>      servers = new ArrayList&lt;&gt;(servers);<a name="line.1377"></a>
-<span class="sourceLineNo">1378</span>      // Guarantee not to put other regions on master<a name="line.1378"></a>
-<span class="sourceLineNo">1379</span>      servers.remove(masterServerName);<a name="line.1379"></a>
-<span class="sourceLineNo">1380</span>      List&lt;RegionInfo&gt; masterRegions = assignments.get(masterServerName);<a name="line.1380"></a>
-<span class="sourceLineNo">1381</span>      regions = regions.entrySet().stream().filter(e -&gt; !masterRegions.contains(e.getKey()))<a name="line.1381"></a>
-<span class="sourceLineNo">1382</span>          .collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue));<a name="line.1382"></a>
-<span class="sourceLineNo">1383</span>    }<a name="line.1383"></a>
-<span class="sourceLineNo">1384</span>    if (regions.isEmpty()) {<a name="line.1384"></a>
-<span class="sourceLineNo">1385</span>      return assignments;<a name="line.1385"></a>
-<span class="sourceLineNo">1386</span>    }<a name="line.1386"></a>
-<span class="sourceLineNo">1387</span><a name="line.1387"></a>
-<span class="sourceLineNo">1388</span>    int numServers = servers == null ? 0 : servers.size();<a name="line.1388"></a>
-<span class="sourceLineNo">1389</span>    if (numServers == 0) {<a name="line.1389"></a>
-<span class="sourceLineNo">1390</span>      LOG.warn("Wanted to do retain assignment but no servers to assign to");<a name="line.1390"></a>
-<span class="sourceLineNo">1391</span>      return null;<a name="line.1391"></a>
+<span class="sourceLineNo">1342</span><a name="line.1342"></a>
+<span class="sourceLineNo">1343</span>    int numServers = servers == null ? 0 : servers.size();<a name="line.1343"></a>
+<span class="sourceLineNo">1344</span>    if (numServers == 0) {<a name="line.1344"></a>
+<span class="sourceLineNo">1345</span>      LOG.warn("Wanted to retain assignment but no servers to assign to");<a name="line.1345"></a>
+<span class="sourceLineNo">1346</span>      return null;<a name="line.1346"></a>
+<span class="sourceLineNo">1347</span>    }<a name="line.1347"></a>
+<span class="sourceLineNo">1348</span>    if (numServers == 1) { // Only one server, nothing fancy we can do here<a name="line.1348"></a>
+<span class="sourceLineNo">1349</span>      return servers.get(0);<a name="line.1349"></a>
+<span class="sourceLineNo">1350</span>    }<a name="line.1350"></a>
+<span class="sourceLineNo">1351</span>    List&lt;ServerName&gt; idleServers = findIdleServers(servers);<a name="line.1351"></a>
+<span class="sourceLineNo">1352</span>    if (idleServers.size() == 1) {<a name="line.1352"></a>
+<span class="sourceLineNo">1353</span>      return idleServers.get(0);<a name="line.1353"></a>
+<span class="sourceLineNo">1354</span>    }<a name="line.1354"></a>
+<span class="sourceLineNo">1355</span>    final List&lt;ServerName&gt; finalServers = idleServers.isEmpty() ?<a name="line.1355"></a>
+<span class="sourceLineNo">1356</span>            servers : idleServers;<a name="line.1356"></a>
+<span class="sourceLineNo">1357</span>    List&lt;RegionInfo&gt; regions = Lists.newArrayList(regionInfo);<a name="line.1357"></a>
+<span class="sourceLineNo">1358</span>    Cluster cluster = createCluster(finalServers, regions);<a name="line.1358"></a>
+<span class="sourceLineNo">1359</span>    return randomAssignment(cluster, regionInfo, finalServers);<a name="line.1359"></a>
+<span class="sourceLineNo">1360</span>  }<a name="line.1360"></a>
+<span class="sourceLineNo">1361</span><a name="line.1361"></a>
+<span class="sourceLineNo">1362</span>  /**<a name="line.1362"></a>
+<span class="sourceLineNo">1363</span>   * Generates a bulk assignment startup plan, attempting to reuse the existing<a name="line.1363"></a>
+<span class="sourceLineNo">1364</span>   * assignment information from META, but adjusting for the specified list of<a name="line.1364"></a>
+<span class="sourceLineNo">1365</span>   * available/online servers available for assignment.<a name="line.1365"></a>
+<span class="sourceLineNo">1366</span>   * &lt;p&gt;<a name="line.1366"></a>
+<span class="sourceLineNo">1367</span>   * Takes a map of all regions to their existing assignment from META. Also<a name="line.1367"></a>
+<span class="sourceLineNo">1368</span>   * takes a list of online servers for regions to be assigned to. Attempts to<a name="line.1368"></a>
+<span class="sourceLineNo">1369</span>   * retain all assignment, so in some instances initial assignment will not be<a name="line.1369"></a>
+<span class="sourceLineNo">1370</span>   * completely balanced.<a name="line.1370"></a>
+<span class="sourceLineNo">1371</span>   * &lt;p&gt;<a name="line.1371"></a>
+<span class="sourceLineNo">1372</span>   * Any leftover regions without an existing server to be assigned to will be<a name="line.1372"></a>
+<span class="sourceLineNo">1373</span>   * assigned randomly to available servers.<a name="line.1373"></a>
+<span class="sourceLineNo">1374</span>   *<a name="line.1374"></a>
+<span class="sourceLineNo">1375</span>   * @param regions regions and existing assignment from meta<a name="line.1375"></a>
+<span class="sourceLineNo">1376</span>   * @param servers available servers<a name="line.1376"></a>
+<span class="sourceLineNo">1377</span>   * @return map of servers and regions to be assigned to them<a name="line.1377"></a>
+<span class="sourceLineNo">1378</span>   */<a name="line.1378"></a>
+<span class="sourceLineNo">1379</span>  @Override<a name="line.1379"></a>
+<span class="sourceLineNo">1380</span>  public Map&lt;ServerName, List&lt;RegionInfo&gt;&gt; retainAssignment(Map&lt;RegionInfo, ServerName&gt; regions,<a name="line.1380"></a>
+<span class="sourceLineNo">1381</span>      List&lt;ServerName&gt; servers) throws HBaseIOException {<a name="line.1381"></a>
+<span class="sourceLineNo">1382</span>    // Update metrics<a name="line.1382"></a>
+<span class="sourceLineNo">1383</span>    metricsBalancer.incrMiscInvocations();<a name="line.1383"></a>
+<span class="sourceLineNo">1384</span>    Map&lt;ServerName, List&lt;RegionInfo&gt;&gt; assignments = assignMasterSystemRegions(regions.keySet(), servers);<a name="line.1384"></a>
+<span class="sourceLineNo">1385</span>    if (assignments != null &amp;&amp; !assignments.isEmpty()) {<a name="line.1385"></a>
+<span class="sourceLineNo">1386</span>      servers = new ArrayList&lt;&gt;(servers);<a name="line.1386"></a>
+<span class="sourceLineNo">1387</span>      // Guarantee not to put other regions on master<a name="line.1387"></a>
+<span class="sourceLineNo">1388</span>      servers.remove(masterServerName);<a name="line.1388"></a>
+<span class="sourceLineNo">1389</span>      List&lt;RegionInfo&gt; masterRegions = assignments.get(masterServerName);<a name="line.1389"></a>
+<span class="sourceLineNo">1390</span>      regions = regions.entrySet().stream().filter(e -&gt; !masterRegions.contains(e.getKey()))<a name="line.1390"></a>
+<span class="sourceLineNo">1391</span>          .collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue));<a name="line.1391"></a>
 <span class="sourceLineNo">1392</span>    }<a name="line.1392"></a>
-<span class="sourceLineNo">1393</span>    if (numServers == 1) { // Only one server, nothing fancy we can do here<a name="line.1393"></a>
-<span class="sourceLineNo">1394</span>      ServerName server = servers.get(0);<a name="line.1394"></a>
-<span class="sourceLineNo">1395</span>      assignments.put(server, new ArrayList&lt;&gt;(regions.keySet()));<a name="line.1395"></a>
-<span class="sourceLineNo">1396</span>      return assignments;<a name="line.1396"></a>
-<span class="sourceLineNo">1397</span>    }<a name="line.1397"></a>
-<span class="sourceLineNo">1398</span><a name="line.1398"></a>
-<span class="sourceLineNo">1399</span>    // Group all of the old assignments by their hostname.<a name="line.1399"></a>
-<span class="sourceLineNo">1400</span>    // We can't group directly by ServerName since the servers all have<a name="line.1400"></a>
-<span class="sourceLineNo">1401</span>    // new start-codes.<a name="line.1401"></a>
-<span class="sourceLineNo">1402</span><a name="line.1402"></a>
-<span class="sourceLineNo">1403</span>    // Group the servers by their hostname. It's possible we have multiple<a name="line.1403"></a>
-<span class="sourceLineNo">1404</span>    // servers on the same host on different ports.<a name="line.1404"></a>
-<span class="sourceLineNo">1405</span>    ArrayListMultimap&lt;String, ServerName&gt; serversByHostname = ArrayListMultimap.create();<a name="line.1405"></a>
-<span class="sourceLineNo">1406</span>    for (ServerName server : servers) {<a name="line.1406"></a>
-<span class="sourceLineNo">1407</span>      assignments.put(server, new ArrayList&lt;&gt;());<a name="line.1407"></a>
-<span class="sourceLineNo">1408</span>      serversByHostname.put(server.getHostnameLowerCase(), server);<a name="line.1408"></a>
-<span class="sourceLineNo">1409</span>    }<a name="line.1409"></a>
-<span class="sourceLineNo">1410</span><a name="line.1410"></a>
-<span class="sourceLineNo">1411</span>    // Collection of the hostnames that used to have regions<a name="line.1411"></a>
-<span class="sourceLineNo">1412</span>    // assigned, but for which we no longer have any RS running<a name="line.1412"></a>
-<span class="sourceLineNo">1413</span>    // after the cluster restart.<a name="line.1413"></a>
-<span class="sourceLineNo">1414</span>    Set&lt;String&gt; oldHostsNoLongerPresent = Sets.newTreeSet();<a name="line.1414"></a>
-<span class="sourceLineNo">1415</span><a name="line.1415"></a>
-<span class="sourceLineNo">1416</span>    // If the old servers aren't present, lets assign those regions later.<a name="line.1416"></a>
-<span class="sourceLineNo">1417</span>    List&lt;RegionInfo&gt; randomAssignRegions = Lists.newArrayList();<a name="line.1417"></a>
-<span class="sourceLineNo">1418</span><a name="line.1418"></a>
-<span class="sourceLineNo">1419</span>    int numRandomAssignments = 0;<a name="line.1419"></a>
-<span class="sourceLineNo">1420</span>    int numRetainedAssigments = 0;<a name="line.1420"></a>
-<span class="sourceLineNo">1421</span><a name="line.1421"></a>
-<span class="sourceLineNo">1422</span>    Cluster cluster = createCluster(servers, regions.keySet(), true);<a name="line.1422"></a>
-<span class="sourceLineNo">1423</span><a name="line.1423"></a>
-<span class="sourceLineNo">1424</span>    for (Map.Entry&lt;RegionInfo, ServerName&gt; entry : regions.entrySet()) {<a name="line.1424"></a>
-<span class="sourceLineNo">1425</span>      RegionInfo region = entry.getKey();<a name="line.1425"></a>
-<span class="sourceLineNo">1426</span>      ServerName oldServerName = entry.getValue();<a name="line.1426"></a>
-<span class="sourceLineNo">1427</span>      List&lt;ServerName&gt; localServers = new ArrayList&lt;&gt;();<a name="line.1427"></a>
-<span class="sourceLineNo">1428</span>      if (oldServerName != null) {<a name="line.1428"></a>
-<span class="sourceLineNo">1429</span>        localServers = serversByHostname.get(oldServerName.getHostnameLowerCase());<a name="line.1429"></a>
-<span class="sourceLineNo">1430</span>      }<a name="line.1430"></a>
-<span class="sourceLineNo">1431</span>      if (localServers.isEmpty()) {<a name="line.1431"></a>
-<span class="sourceLineNo">1432</span>        // No servers on the new cluster match up with this hostname, assign randomly, later.<a name="line.1432"></a>
-<span class="sourceLineNo">1433</span>        randomAssignRegions.add(region);<a name="line.1433"></a>
-<span class="sourceLineNo">1434</span>        if (oldServerName != null) {<a name="line.1434"></a>
-<span class="sourceLineNo">1435</span>          oldHostsNoLongerPresent.add(oldServerName.getHostnameLowerCase());<a name="line.1435"></a>
-<span class="sourceLineNo">1436</span>        }<a name="line.1436"></a>
-<span class="sourceLineNo">1437</span>      } else if (localServers.size() == 1) {<a name="line.1437"></a>
-<span class="sourceLineNo">1438</span>        // the usual case - one new server on same host<a name="line.1438"></a>
-<span class="sourceLineNo">1439</span>        ServerName target = localServers.get(0);<a name="line.1439"></a>
-<span class="sourceLineNo">1440</span>        assignments.get(target).add(region);<a name="line.1440"></a>
-<span class="sourceLineNo">1441</span>        numRetainedAssigments++;<a name="line.1441"></a>
-<span class="sourceLineNo">1442</span>      } else {<a name="line.1442"></a>
-<span class="sourceLineNo">1443</span>        // multiple new servers in the cluster on this same host<a name="line.1443"></a>
-<span class="sourceLineNo">1444</span>        if (localServers.contains(oldServerName)) {<a name="line.1444"></a>
-<span class="sourceLineNo">1445</span>          assignments.get(oldServerName).add(region);<a name="line.1445"></a>
-<span class="sourceLineNo">1446</span>          numRetainedAssigments++;<a name="line.1446"></a>
-<span class="sourceLineNo">1447</span>        } else {<a name="line.1447"></a>
-<span class="sourceLineNo">1448</span>          ServerName target = null;<a name="line.1448"></a>
-<span class="sourceLineNo">1449</span>          for (ServerName tmp : localServers) {<a name="line.1449"></a>
-<span class="sourceLineNo">1450</span>            if (tmp.getPort() == oldServerName.getPort()) {<a name="line.1450"></a>
-<span class="sourceLineNo">1451</span>              target = tmp;<a name="line.1451"></a>
-<span class="sourceLineNo">1452</span>              assignments.get(tmp).add(region);<a name="line.1452"></a>
-<span class="sourceLineNo">1453</span>              numRetainedAssigments++;<a name="line.1453"></a>
-<span class="sourceLineNo">1454</span>              break;<a name="line.1454"></a>
-<span class="sourceLineNo">1455</span>            }<a name="line.1455"></a>
-<span class="sourceLineNo">1456</span>          }<a name="line.1456"></a>
-<span class="sourceLineNo">1457</span>          if (target == null) {<a name="line.1457"></a>
-<span class="sourceLineNo">1458</span>            randomAssignRegions.add(region);<a name="line.1458"></a>
-<span class="sourceLineNo">1459</span>          }<a name="line.1459"></a>
-<span class="sourceLineNo">1460</span>        }<a name="line.1460"></a>
-<span class="sourceLineNo">1461</span>      }<a name="line.1461"></a>
-<span class="sourceLineNo">1462</span>    }<a name="line.1462"></a>
-<span class="sourceLineNo">1463</span><a name="line.1463"></a>
-<span class="sourceLineNo">1464</span>    // If servers from prior assignment aren't present, then lets do randomAssignment on regions.<a name="line.1464"></a>
-<span class="sourceLineNo">1465</span>    if (randomAssignRegions.size() &gt; 0) {<a name="line.1465"></a>
-<span class="sourceLineNo">1466</span>      for (Map.Entry&lt;ServerName, List&lt;RegionInfo&gt;&gt; entry : assignments.entrySet()) {<a name="line.1466"></a>
-<span class="sourceLineNo">1467</span>        ServerName sn = entry.getKey();<a name="line.1467"></a>
-<span class="sourceLineNo">1468</span>        for (RegionInfo region : entry.getValue()) {<a name="line.1468"></a>
-<span class="sourceLineNo">1469</span>          cluster.doAssignRegion(region, sn);<a name="line.1469"></a>
-<span class="sourceLineNo">1470</span>        }<a name="line.1470"></a>
-<span class="sourceLineNo">1471</span>      }<a name="line.1471"></a>
-<span class="sourceLineNo">1472</span>      for (RegionInfo region : randomAssignRegions) {<a name="line.1472"></a>
-<span class="sourceLineNo">1473</span>        ServerName target = randomAssignment(cluster, region, servers);<a name="line.1473"></a>
-<span class="sourceLineNo">1474</span>        assignments.get(target).add(region);<a name="line.1474"></a>
-<span class="sourceLineNo">1475</span>        cluster.doAssignRegion(region, target);<a name="line.1475"></a>
-<span class="sourceLineNo">1476</span>        numRandomAssignments++;<a name="line.1476"></a>
-<span class="sourceLineNo">1477</span>      }<a name="line.1477"></a>
-<span class="sourceLineNo">1478</span>    }<a name="line.1478"></a>
-<span class="sourceLineNo">1479</span><a name="line.1479"></a>
-<span class="sourceLineNo">1480</span>    String randomAssignMsg = "";<a name="line.1480"></a>
-<span class="sourceLineNo">1481</span>    if (numRandomAssignments &gt; 0) {<a name="line.1481"></a>
-<span class="sourceLineNo">1482</span>      randomAssignMsg =<a name="line.1482"></a>
-<span class="sourceLineNo">1483</span>          numRandomAssignments + " regions were assigned "<a name="line.1483"></a>
-<span class="sourceLineNo">1484</span>              + "to random hosts, since the old hosts for these regions are no "<a name="line.1484"></a>
-<span class="sourceLineNo">1485</span>              + "longer present in the cluster. These hosts were:\n  "<a name="line.1485"></a>
-<span class="sourceLineNo">1486</span>              + Joiner.on("\n  ").join(oldHostsNoLongerPresent);<a name="line.1486"></a>
-<span class="sourceLineNo">1487</span>    }<a name="line.1487"></a>
-<span class="sourceLineNo">1488</span><a name="line.1488"></a>
-<span class="sourceLineNo">1489</span>    LOG.info("Reassigned " + regions.size() + " regions. " + numRetainedAssigments<a name="line.1489"></a>
-<span class="sourceLineNo">1490</span>        + " retained the pre-restart assignment. " + randomAssignMsg);<a name="line.1490"></a>
-<span class="sourceLineNo">1491</span>    return assignments;<a name="line.1491"></a>
-<span class="sourceLineNo">1492</span>  }<a name="line.1492"></a>
-<span class="sourceLineNo">1493</span><a name="line.1493"></a>
-<span class="sourceLineNo">1494</span>  @Override<a name="line.1494"></a>
-<span class="sourceLineNo">1495</span>  public void initialize() throws HBaseIOException{<a name="line.1495"></a>
-<span class="sourceLineNo">1496</span>  }<a name="line.1496"></a>
-<span class="sourceLineNo">1497</span><a name="line.1497"></a>
-<span class="sourceLineNo">1498</span>  @Override<a name="line.1498"></a>
-<span class="sourceLineNo">1499</span>  public void regionOnline(RegionInfo regionInfo, ServerName sn) {<a name="line.1499"></a>
+<span class="sourceLineNo">1393</span>    if (regions.isEmpty()) {<a name="line.1393"></a>
+<span class="sourceLineNo">1394</span>      return assignments;<a name="line.1394"></a>
+<span class="sourceLineNo">1395</span>    }<a name="line.1395"></a>
+<span class="sourceLineNo">1396</span><a name="line.1396"></a>
+<span class="sourceLineNo">1397</span>    int numServers = servers == null ? 0 : servers.size();<a name="line.1397"></a>
+<span class="sourceLineNo">1398</span>    if (numServers == 0) {<a name="line.1398"></a>
+<span class="sourceLineNo">1399</span>      LOG.warn("Wanted to do retain assignment but no servers to assign to");<a name="line.1399"></a>
+<span class="sourceLineNo">1400</span>      return null;<a name="line.1400"></a>
+<span class="sourceLineNo">1401</span>    }<a name="line.1401"></a>
+<span class="sourceLineNo">1402</span>    if (numServers == 1) { // Only one server, nothing fancy we can do here<a name="line.1402"></a>
+<span class="sourceLineNo">1403</span>      ServerName server = servers.get(0);<a name="line.1403"></a>
+<span class="sourceLineNo">1404</span>      assignments.put(server, new ArrayList&lt;&gt;(regions.keySet()));<a name="line.1404"></a>
+<span class="sourceLineNo">1405</span>      return assignments;<a name="line.1405"></a>
+<span class="sourceLineNo">1406</span>    }<a name="line.1406"></a>
+<span class="sourceLineNo">1407</span><a name="line.1407"></a>
+<span class="sourceLineNo">1408</span>    // Group all of the old assignments by their hostname.<a name="line.1408"></a>
+<span class="sourceLineNo">1409</span>    // We can't group directly by ServerName since the servers all have<a name="line.1409"></a>
+<span class="sourceLineNo">1410</span>    // new start-codes.<a name="line.1410"></a>
+<span class="sourceLineNo">1411</span><a name="line.1411"></a>
+<span class="sourceLineNo">1412</span>    // Group the servers by their hostname. It's possible we have multiple<a name="line.1412"></a>
+<span class="sourceLineNo">1413</span>    // servers on the same host on different ports.<a name="line.1413"></a>
+<span class="sourceLineNo">1414</span>    ArrayListMultimap&lt;String, ServerName&gt; serversByHostname = ArrayListMultimap.create();<a name="line.1414"></a>
+<span class="sourceLineNo">1415</span>    for (ServerName server : servers) {<a name="line.1415"></a>
+<span class="sourceLineNo">1416</span>      assignments.put(server, new ArrayList&lt;&gt;());<a name="line.1416"></a>
+<span class="sourceLineNo">1417</span>      serversByHostname.put(server.getHostnameLowerCase(), server);<a name="line.1417"></a>
+<span class="sourceLineNo">1418</span>    }<a name="line.1418"></a>
+<span class="sourceLineNo">1419</span><a name="line.1419"></a>
+<span class="sourceLineNo">1420</span>    // Collection of the hostnames that used to have regions<a name="line.1420"></a>
+<span class="sourceLineNo">1421</span>    // assigned, but for which we no longer have any RS running<a name="line.1421"></a>
+<span class="sourceLineNo">1422</span>    // after the cluster restart.<a name="line.1422"></a>
+<span class="sourceLineNo">1423</span>    Set&lt;String&gt; oldHostsNoLongerPresent = Sets.newTreeSet();<a name="line.1423"></a>
+<span class="sourceLineNo">1424</span><a name="line.1424"></a>
+<span class="sourceLineNo">1425</span>    // If the old servers aren't present, lets assign those regions later.<a name="line.1425"></a>
+<span class="sourceLineNo">1426</span>    List&lt;RegionInfo&gt; randomAssignRegions = Lists.newArrayList();<a name="line.1426"></a>
+<span class="sourceLineNo">1427</span><a name="line.1427"></a>
+<span class="sourceLineNo">1428</span>    int numRandomAssignments = 0;<a name="line.1428"></a>
+<span class="sourceLineNo">1429</span>    int numRetainedAssigments = 0;<a name="line.1429"></a>
+<span class="sourceLineNo">1430</span><a name="line.1430"></a>
+<span class="sourceLineNo">1431</span>    for (Map.Entry&lt;RegionInfo, ServerName&gt; entry : regions.entrySet()) {<a name="line.1431"></a>
+<span class="sourceLineNo">1432</span>      RegionInfo region = entry.getKey();<a name="line.1432"></a>
+<span class="sourceLineNo">1433</span>      ServerName oldServerName = entry.getValue();<a name="line.1433"></a>
+<span class="sourceLineNo">1434</span>      List&lt;ServerName&gt; localServers = new ArrayList&lt;&gt;();<a name="line.1434"></a>
+<span class="sourceLineNo">1435</span>      if (oldServerName != null) {<a name="line.1435"></a>
+<span class="sourceLineNo">1436</span>        localServers = serversByHostname.get(oldServerName.getHostnameLowerCase());<a name="line.1436"></a>
+<span class="sourceLineNo">1437</span>      }<a name="line.1437"></a>
+<span class="sourceLineNo">1438</span>      if (localServers.isEmpty()) {<a name="line.1438"></a>
+<span class="sourceLineNo">1439</span>        // No servers on the new cluster match up with this hostname, assign randomly, later.<a name="line.1439"></a>
+<span class="sourceLineNo">1440</span>        randomAssignRegions.add(region);<a name="line.1440"></a>
+<span class="sourceLineNo">1441</span>        if (oldServerName != null) {<a name="line.1441"></a>
+<span class="sourceLineNo">1442</span>          oldHostsNoLongerPresent.add(oldServerName.getHostnameLowerCase());<a name="line.1442"></a>
+<span class="sourceLineNo">1443</span>        }<a name="line.1443"></a>
+<span class="sourceLineNo">1444</span>      } else if (localServers.size() == 1) {<a name="line.1444"></a>
+<span class="sourceLineNo">1445</span>        // the usual case - one new server on same host<a name="line.1445"></a>
+<span class="sourceLineNo">1446</span>        ServerName target = localServers.get(0);<a name="line.1446"></a>
+<span class="sourceLineNo">1447</span>        assignments.get(target).add(region);<a name="line.1447"></a>
+<span class="sourceLineNo">1448</span>        numRetainedAssigments++;<a name="line.1448"></a>
+<span class="sourceLineNo">1449</span>      } else {<a name="line.1449"></a>
+<span class="sourceLineNo">1450</span>        // multiple new servers in the cluster on this same host<a name="line.1450"></a>
+<span class="sourceLineNo">1451</span>        if (localServers.contains(oldServerName)) {<a name="line.1451"></a>
+<span class="sourceLineNo">1452</span>          assignments.get(oldServerName).add(region);<a name="line.1452"></a>
+<span class="sourceLineNo">1453</span>          numRetainedAssigments++;<a name="line.1453"></a>
+<span class="sourceLineNo">1454</span>        } else {<a name="line.1454"></a>
+<span class="sourceLineNo">1455</span>          ServerName target = null;<a name="line.1455"></a>
+<span class="sourceLineNo">1456</span>          for (ServerName tmp : localServers) {<a name="line.1456"></a>
+<span class="sourceLineNo">1457</span>            if (tmp.getPort() == oldServerName.getPort()) {<a name="line.1457"></a>
+<span class="sourceLineNo">1458</span>              target = tmp;<a name="line.1458"></a>
+<span class="sourceLineNo">1459</span>              assignments.get(tmp).add(region);<a name="line.1459"></a>
+<span class="sourceLineNo">1460</span>              numRetainedAssigments++;<a name="line.1460"></a>
+<span class="sourceLineNo">1461</span>              break;<a name="line.1461"></a>
+<span class="sourceLineNo">1462</span>            }<a name="line.1462"></a>
+<span class="sourceLineNo">1463</span>          }<a name="line.1463"></a>
+<span class="sourceLineNo">1464</span>          if (target == null) {<a name="line.1464"></a>
+<span class="sourceLineNo">1465</span>            randomAssignRegions.add(region);<a name="line.1465"></a>
+<span class="sourceLineNo">1466</span>          }<a name="line.1466"></a>
+<span class="sourceLineNo">1467</span>        }<a name="line.1467"></a>
+<span class="sourceLineNo">1468</span>      }<a name="line.1468"></a>
+<span class="sourceLineNo">1469</span>    }<a name="line.1469"></a>
+<span class="sourceLineNo">1470</span><a name="line.1470"></a>
+<span class="sourceLineNo">1471</span>    // If servers from prior assignment aren't present, then lets do randomAssignment on regions.<a name="line.1471"></a>
+<span class="sourceLineNo">1472</span>    if (randomAssignRegions.size() &gt; 0) {<a name="line.1472"></a>
+<span class="sourceLineNo">1473</span>      Cluster cluster = createCluster(servers, regions.keySet());<a name="line.1473"></a>
+<span class="sourceLineNo">1474</span>      for (Map.Entry&lt;ServerName, List&lt;RegionInfo&gt;&gt; entry : assignments.entrySet()) {<a name="line.1474"></a>
+<span class="sourceLineNo">1475</span>        ServerName sn = entry.getKey();<a name="line.1475"></a>
+<span class="sourceLineNo">1476</span>        for (RegionInfo region : entry.getValue()) {<a name="line.1476"></a>
+<span class="sourceLineNo">1477</span>          cluster.doAssignRegion(region, sn);<a name="line.1477"></a>
+<span class="sourceLineNo">1478</span>        }<a name="line.1478"></a>
+<span class="sourceLineNo">1479</span>      }<a name="line.1479"></a>
+<span class="sourceLineNo">1480</span>      for (RegionInfo region : randomAssignRegions) {<a name="line.1480"></a>
+<span class="sourceLineNo">1481</span>        ServerName target = randomAssignment(cluster, region, servers);<a name="line.1481"></a>
+<span class="sourceLineNo">1482</span>        assignments.get(target).add(region);<a name="line.1482"></a>
+<span class="sourceLineNo">1483</span>        cluster.doAssignRegion(region, target);<a name="line.1483"></a>
+<span class="sourceLineNo">1484</span>        numRandomAssignments++;<a name="line.1484"></a>
+<span class="sourceLineNo">1485</span>      }<a name="line.1485"></a>
+<span class="sourceLineNo">1486</span>    }<a name="line.1486"></a>
+<span class="sourceLineNo">1487</span><a name="line.1487"></a>
+<span class="sourceLineNo">1488</span>    String randomAssignMsg = "";<a name="line.1488"></a>
+<span class="sourceLineNo">1489</span>    if (numRandomAssignments &gt; 0) {<a name="line.1489"></a>
+<span class="sourceLineNo">1490</span>      randomAssignMsg =<a name="line.1490"></a>
+<span class="sourceLineNo">1491</span>          numRandomAssignments + " regions were assigned "<a name="line.1491"></a>
+<span class="sourceLineNo">1492</span>              + "to random hosts, since the old hosts for these regions are no "<a name="line.1492"></a>
+<span class="sourceLineNo">1493</span>              + "longer present in the cluster. These hosts were:\n  "<a name="line.1493"></a>
+<span class="sourceLineNo">1494</span>              + Joiner.on("\n  ").join(oldHostsNoLongerPresent);<a name="line.1494"></a>
+<span class="sourceLineNo">1495</span>    }<a name="line.1495"></a>
+<span class="sourceLineNo">1496</span><a name="line.1496"></a>
+<span class="sourceLineNo">1497</span>    LOG.info("Reassigned " + regions.size() + " regions. " + numRetainedAssigments<a name="line.1497"></a>
+<span class="sourceLineNo">1498</span>        + " retained the pre-restart assignment. " + randomAssignMsg);<a name="line.1498"></a>
+<span class="sourceLineNo">1499</span>    return assignments;<a name="line.1499"></a>
 <span class="sourceLineNo">1500</span>  }<a name="line.1500"></a>
 <span class="sourceLineNo">1501</span><a name="line.1501"></a>
 <span class="sourceLineNo">1502</span>  @Override<a name="line.1502"></a>
-<span class="sourceLineNo">1503</span>  public void regionOffline(RegionInfo regionInfo) {<a name="line.1503"></a>
+<span class="sourceLineNo">1503</span>  public void initialize() throws HBaseIOException{<a name="line.1503"></a>
 <span class="sourceLineNo">1504</span>  }<a name="line.1504"></a>
 <span class="sourceLineNo">1505</span><a name="line.1505"></a>
 <span class="sourceLineNo">1506</span>  @Override<a name="line.1506"></a>
-<span class="sourceLineNo">1507</span>  public boolean isStopped() {<a name="line.1507"></a>
-<span class="sourceLineNo">1508</span>    return stopped;<a name="line.1508"></a>
-<span class="sourceLineNo">1509</span>  }<a name="line.1509"></a>
-<span class="sourceLineNo">1510</span><a name="line.1510"></a>
-<span class="sourceLineNo">1511</span>  @Override<a name="line.1511"></a>
-<span class="sourceLineNo">1512</span>  public void stop(String why) {<a name="line.1512"></a>
-<span class="sourceLineNo">1513</span>    LOG.info("Load Balancer stop requested: "+why);<a name="line.1513"></a>
-<span class="sourceLineNo">1514</span>    stopped = true;<a name="line.1514"></a>
-<span class="sourceLineNo">1515</span>  }<a name="line.1515"></a>
-<span class="sourceLineNo">1516</span><a name="line.1516"></a>
-<span class="sourceLineNo">1517</span>  /**<a name="line.1517"></a>
-<span class="sourceLineNo">1518</span>   * Used to assign a single region to a random server.<a name="line.1518"></a>
-<span class="sourceLineNo">1519</span>   */<a name="line.1519"></a>
-<span class="sourceLineNo">1520</span>  private ServerName randomAssignment(Cluster cluster, RegionInfo regionInfo,<a name="line.1520"></a>
-<span class="sourceLineNo">1521</span>      List&lt;ServerName&gt; servers) {<a name="line.1521"></a>
-<span class="sourceLineNo">1522</span>    int numServers = servers.size(); // servers is not null, numServers &gt; 1<a name="line.1522"></a>
-<span class="sourceLineNo">1523</span>    ServerName sn = null;<a name="line.1523"></a>
-<span class="sourceLineNo">1524</span>    final int maxIterations = numServers * 4;<a name="line.1524"></a>
-<span class="sourceLineNo">1525</span>    int iterations = 0;<a name="line.1525"></a>
-<span class="sourceLineNo">1526</span><a name="line.1526"></a>
-<span class="sourceLineNo">1527</span>    do {<a name="line.1527"></a>
-<span class="sourceLineNo">1528</span>      int i = RANDOM.nextInt(numServers);<a name="line.1528"></a>
-<span class="sourceLineNo">1529</span>      sn = servers.get(i);<a name="line.1529"></a>
-<span class="sourceLineNo">1530</span>    } while (cluster.wouldLowerAvailability(regionInfo, sn)<a name="line.1530"></a>
-<span class="sourceLineNo">1531</span>        &amp;&amp; iterations++ &lt; maxIterations);<a name="line.1531"></a>
-<span class="sourceLineNo">1532</span>    cluster.doAssignRegion(regionInfo, sn);<a name="line.1532"></a>
-<span class="sourceLineNo">1533</span>    return sn;<a name="line.1533"></a>
-<span class="sourceLineNo">1534</span>  }<a name="line.1534"></a>
-<span class="sourceLineNo">1535</span><a name="line.1535"></a>
-<span class="sourceLineNo">1536</span>  /**<a name="line.1536"></a>
-<span class="sourceLineNo">1537</span>   * Round robin a list of regions to a list of servers<a name="line.1537"></a>
-<span class="sourceLineNo">1538</span>   */<a name="line.1538"></a>
-<span class="sourceLineNo">1539</span>  private void roundRobinAssignment(Cluster cluster, List&lt;RegionInfo&gt; regions,<a name="line.1539"></a>
-<span class="sourceLineNo">1540</span>      List&lt;RegionInfo&gt; unassignedRegions, List&lt;ServerName&gt; servers,<a name="line.1540"></a>
-<span class="sourceLineNo">1541</span>      Map&lt;ServerName, List&lt;RegionInfo&gt;&gt; assignments) {<a name="line.1541"></a>
-<span class="sourceLineNo">1542</span><a name="line.1542"></a>
-<span class="sourceLineNo">1543</span>    int numServers = servers.size();<a name="line.1543"></a>
-<span class="sourceLineNo">1544</span>    int numRegions = regions.size();<a name="line.1544"></a>
-<span class="sourceLineNo">1545</span>    int max = (int) Math.ceil((float) numRegions / numServers);<a name="line.1545"></a>
-<span class="sourceLineNo">1546</span>    int serverIdx = 0;<a name="line.1546"></a>
-<span class="sourceLineNo">1547</span>    if (numServers &gt; 1) {<a name="line.1547"></a>
-<span class="sourceLineNo">1548</span>      serverIdx = RANDOM.nextInt(numServers);<a name="line.1548"></a>
-<span class="sourceLineNo">1549</span>    }<a name="line.1549"></a>
-<span class="sourceLineNo">1550</span>    int regionIdx = 0;<a name="line.1550"></a>
-<span class="sourceLineNo">1551</span><a name="line.1551"></a>
-<span class="sourceLineNo">1552</span>    for (int j = 0; j &lt; numServers; j++) {<a name="line.1552"></a>
-<span class="sourceLineNo">1553</span>      ServerName server = servers.get((j + serverIdx) % numServers);<a name="line.1553"></a>
-<span class="sourceLineNo">1554</span>      List&lt;RegionInfo&gt; serverRegions = new ArrayList&lt;&gt;(max);<a name="line.1554"></a>
-<span class="sourceLineNo">1555</span>      for (int i = regionIdx; i &lt; numRegions; i += numServers) {<a name="line.1555"></a>
-<span class="sourceLineNo">1556</span>        RegionInfo region = regions.get(i % numRegions);<a name="line.1556"></a>
-<span class="sourceLineNo">1557</span>        if (cluster.wouldLowerAvailability(region, server)) {<a name="line.1557"></a>
-<span class="sourceLineNo">1558</span>          unassignedRegions.add(region);<a name="line.1558"></a>
-<span class="sourceLineNo">1559</span>        } else {<a name="line.1559"></a>
-<span class="sourceLineNo">1560</span>          serverRegions.add(region);<a name="line.1560"></a>
-<span class="sourceLineNo">1561</span>          cluster.doAssignRegion(region, server);<a name="line.1561"></a>
-<span class="sourceLineNo">1562</span>        }<a name="line.1562"></a>
-<span class="sourceLineNo">1563</span>      }<a name="line.1563"></a>
-<span class="sourceLineNo">1564</span>      assignments.put(server, serverRegions);<a name="line.1564"></a>
-<span class="sourceLineNo">1565</span>      regionIdx++;<a name="line.1565"></a>
-<span class="sourceLineNo">1566</span>    }<a name="line.1566"></a>
-<span class="sourceLineNo">1567</span>  }<a name="line.1567"></a>
-<span class="sourceLineNo">1568</span><a name="line.1568"></a>
-<span class="sourceLineNo">1569</span>  protected Map&lt;ServerName, List&lt;RegionInfo&gt;&gt; getRegionAssignmentsByServer(<a name="line.1569"></a>
-<span class="sourceLineNo">1570</span>    Collection&lt;RegionInfo&gt; regions) {<a name="line.1570"></a>
-<span class="sourceLineNo">1571</span>    if (this.services != null &amp;&amp; this.services.getAssignmentManager() != null) {<a name="line.1571"></a>
-<span class="sourceLineNo">1572</span>      return this.services.getAssignmentManager().getSnapShotOfAssignment(regions);<a name="line.1572"></a>
-<span class="sourceLineNo">1573</span>    } else {<a name="line.1573"></a>
-<span class="sourceLineNo">1574</span>      return new HashMap&lt;&gt;();<a name="line.1574"></a>
-<span class="sourceLineNo">1575</span>    }<a name="line.1575"></a>
-<span class="sourceLineNo">1576</span>  }<a name="line.1576"></a>
-<span class="sourceLineNo">1577</span><a name="line.1577"></a>
-<span class="sourceLineNo">1578</span>  @Override<a name="line.1578"></a>
-<span class="sourceLineNo">1579</span>  public void onConfigurationChange(Configuration conf) {<a name="line.1579"></a>
-<span class="sourceLineNo">1580</span>  }<a name="line.1580"></a>
-<span class="sourceLineNo">1581</span>}<a name="line.1581"></a>
+<span class="sourceLineNo">1507</span>  public void regionOnline(RegionInfo regionInfo, ServerName sn) {<a name="line.1507"></a>
+<span class="sourceLineNo">1508</span>  }<a name="line.1508"></a>
+<span class="sourceLineNo">1509</span><a name="line.1509"></a>
+<span class="sourceLineNo">1510</span>  @Override<a name="line.1510"></a>
+<span class="sourceLineNo">1511</span>  public void regionOffline(RegionInfo regionInfo) {<a name="line.1511"></a>
+<span class="sourceLineNo">1512</span>  }<a name="line.1512"></a>
+<span class="sourceLineNo">1513</span><a name="line.1513"></a>
+<span class="sourceLineNo">1514</span>  @Override<a name="line.1514"></a>
+<span class="sourceLineNo">1515</span>  public boolean isStopped() {<a name="line.1515"></a>
+<span class="sourceLineNo">1516</span>    return stopped;<a name="line.1516"></a>
+<span class="sourceLineNo">1517</span>  }<a name="line.1517"></a>
+<span class="sourceLineNo">1518</span><a name="line.1518"></a>
+<span class="sourceLineNo">1519</span>  @Override<a name="line.1519"></a>
+<span class="sourceLineNo">1520</span>  public void stop(String why) {<a name="line.1520"></a>
+<span class="sourceLineNo">1521</span>    LOG.info("Load Balancer stop requested: "+why);<a name="line.1521"></a>
+<span class="sourceLineNo">1522</span>    stopped = true;<a name="line.1522"></a>
+<span class="sourceLineNo">1523</span>  }<a name="line.1523"></a>
+<span class="sourceLineNo">1524</span><a name="line.1524"></a>
+<span class="sourceLineNo">1525</span>  /**<a name="line.1525"></a>
+<span class="sourceLineNo">1526</span>   * Used to assign a single region to a random server.<a name="line.1526"></a>
+<span class="sourceLineNo">1527</span>   */<a name="line.1527"></a>
+<span class="sourceLineNo">1528</span>  private ServerName randomAssignment(Cluster cluster, RegionInfo regionInfo,<a name="line.1528"></a>
+<span class="sourceLineNo">1529</span>      List&lt;ServerName&gt; servers) {<a name="line.1529"></a>
+<span class="sourceLineNo">1530</span>    int numServers = servers.size(); // servers is not null, numServers &gt; 1<a name="line.1530"></a>
+<span class="sourceLineNo">1531</span>    ServerName sn = null;<a name="line.1531"></a>
+<span class="sourceLineNo">1532</span>    final int maxIterations = numServers * 4;<a name="line.1532"></a>
+<span class="sourceLineNo">1533</span>    int iterations = 0;<a name="line.1533"></a>
+<span class="sourceLineNo">1534</span><a name="line.1534"></a>
+<span class="sourceLineNo">1535</span>    do {<a name="line.1535"></a>
+<span class="sourceLineNo">1536</span>      int i = RANDOM.nextInt(numServers);<a name="line.1536"></a>
+<span class="sourceLineNo">1537</span>      sn = servers.get(i);<a name="line.1537"></a>
+<span class="sourceLineNo">1538</span>    } while (cluster.wouldLowerAvailability(regionInfo, sn)<a name="line.1538"></a>
+<span class="sourceLineNo">1539</span>        &amp;&amp; iterations++ &lt; maxIterations);<a name="line.1539"></a>
+<span class="sourceLineNo">1540</span>    cluster.doAssignRegion(regionInfo, sn);<a name="line.1540"></a>
+<span class="sourceLineNo">1541</span>    return sn;<a name="line.1541"></a>
+<span class="sourceLineNo">1542</span>  }<a name="line.1542"></a>
+<span class="sourceLineNo">1543</span><a name="line.1543"></a>
+<span class="sourceLineNo">1544</span>  /**<a name="line.1544"></a>
+<span class="sourceLineNo">1545</span>   * Round robin a list of regions to a list of servers<a name="line.1545"></a>
+<span class="sourceLineNo">1546</span>   */<a name="line.1546"></a>
+<span class="sourceLineNo">1547</span>  private void roundRobinAssignment(Cluster cluster, List&lt;RegionInfo&gt; regions,<a name="line.1547"></a>
+<span class="sourceLineNo">1548</span>      List&lt;RegionInfo&gt; unassignedRegions, List&lt;ServerName&gt; servers,<a name="line.1548"></a>
+<span class="sourceLineNo">1549</span>      Map&lt;ServerName, List&lt;RegionInfo&gt;&gt; assignments) {<a name="line.1549"></a>
+<span class="sourceLineNo">1550</span><a name="line.1550"></a>
+<span class="sourceLineNo">1551</span>    int numServers = servers.size();<a name="line.1551"></a>
+<span class="sourceLineNo">1552</span>    int numRegions = regions.size();<a name="line.1552"></a>
+<span class="sourceLineNo">1553</span>    int max = (int) Math.ceil((float) numRegions / numServers);<a name="line.1553"></a>
+<span class="sourceLineNo">1554</span>    int serverIdx = 0;<a name="line.1554"></a>
+<span class="sourceLineNo">1555</span>    if (numServers &gt; 1) {<a name="line.1555"></a>
+<span class="sourceLineNo">1556</span>      serverIdx = RANDOM.nextInt(numServers);<a name="line.1556"></a>
+<span class="sourceLineNo">1557</span>    }<a name="line.1557"></a>
+<span class="sourceLineNo">1558</span>    int regionIdx = 0;<a name="line.1558"></a>
+<span class="sourceLineNo">1559</span><a name="line.1559"></a>
+<span class="sourceLineNo">1560</span>    for (int j = 0; j &lt; numServers; j++) {<a name="line.1560"></a>
+<span class="sourceLineNo">1561</span>      ServerName server = servers.get((j + serverIdx) % numServers);<a name="line.1561"></a>
+<span class="sourceLineNo">1562</span>      List&lt;RegionInfo&gt; serverRegions = new ArrayList&lt;&gt;(max);<a name="line.1562"></a>
+<span class="sourceLineNo">1563</span>      for (int i = regionIdx; i &lt; numRegions; i += numServers) {<a name="line.1563"></a>
+<span class="sourceLineNo">1564</span>        RegionInfo region = regions.get(i % numRegions);<a name="line.1564"></a>
+<span class="sourceLineNo">1565</span>        if (cluster.wouldLowerAvailability(region, server)) {<a name="line.1565"></a>
+<span class="sourceLineNo">1566</span>          unassignedRegions.add(region);<a name="line.1566"></a>
+<span class="sourceLineNo">1567</span>        } else {<a name="line.1567"></a>
+<span class="sourceLineNo">1568</span>          serverRegions.add(region);<a name="line.1568"></a>
+<span class="sourceLineNo">1569</span>          cluster.doAssignRegion(region, server);<a name="line.1569"></a>
+<span class="sourceLineNo">1570</span>        }<a name="line.1570"></a>
+<span class="sourceLineNo">1571</span>      }<a name="line.1571"></a>
+<span class="sourceLineNo">1572</span>      assignments.put(server, serverRegions);<a name="line.1572"></a>
+<span class="sourceLineNo">1573</span>      regionIdx++;<a name="line.1573"></a>
+<span class="sourceLineNo">1574</span>    }<a name="line.1574"></a>
+<span class="sourceLineNo">1575</span>  }<a name="line.1575"></a>
+<span class="sourceLineNo">1576</span><a name="line.1576"></a>
+<span class="sourceLineNo">1577</span>  protected Map&lt;ServerName, List&lt;RegionInfo&gt;&gt; getRegionAssignmentsByServer(<a name="line.1577"></a>
+<span class="sourceLineNo">1578</span>    Collection&lt;RegionInfo&gt; regions) {<a name="line.1578"></a>
+<span class="sourceLineNo">1579</span>    if (this.services != null &amp;&amp; this.services.getAssignmentManager() != null) {<a name="line.1579"></a>
+<span class="sourceLineNo">1580</span>      return this.services.getAssignmentManager().getSnapShotOfAssignment(regions);<a name="line.1580"></a>
+<span class="sourceLineNo">1581</span>    } else {<a name="line.1581"></a>
+<span class="sourceLineNo">1582</span>      return new HashMap&lt;&gt;();<a name="line.1582"></a>
+<span class="sourceLineNo">1583</span>    }<a name="line.1583"></a>
+<span class="sourceLineNo">1584</span>  }<a name="line.1584"></a>
+<span class="sourceLineNo">1585</span><a name="line.1585"></a>
+<span class="sourceLineNo">1586</span>  @Override<a name="line.1586"></a>
+<span class="sourceLineNo">1587</span>  public void onConfigurationChange(Configuration conf) {<a name="line.1587"></a>
+<span class="sourceLineNo">1588</span>  }<a name="line.1588"></a>
+<span class="sourceLineNo">1589</span>}<a name="line.1589"></a>
 
 
 


[17/29] hbase-site git commit: Published site at 477f9fdb32873387231c5fbbff130ba8bf7b5d68.

Posted by gi...@apache.org.
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/621479e1/devapidocs/src-html/org/apache/hadoop/hbase/master/HMaster.html
----------------------------------------------------------------------
diff --git a/devapidocs/src-html/org/apache/hadoop/hbase/master/HMaster.html b/devapidocs/src-html/org/apache/hadoop/hbase/master/HMaster.html
index 2b1b6c6..adaa381 100644
--- a/devapidocs/src-html/org/apache/hadoop/hbase/master/HMaster.html
+++ b/devapidocs/src-html/org/apache/hadoop/hbase/master/HMaster.html
@@ -1011,2651 +1011,2662 @@
 <span class="sourceLineNo">1003</span>    }<a name="line.1003"></a>
 <span class="sourceLineNo">1004</span><a name="line.1004"></a>
 <span class="sourceLineNo">1005</span>    zombieDetector.interrupt();<a name="line.1005"></a>
-<span class="sourceLineNo">1006</span>  }<a name="line.1006"></a>
-<span class="sourceLineNo">1007</span><a name="line.1007"></a>
-<span class="sourceLineNo">1008</span>  /**<a name="line.1008"></a>
-<span class="sourceLineNo">1009</span>   * Adds the {@code MasterSpaceQuotaObserver} to the list of configured Master observers to<a name="line.1009"></a>
-<span class="sourceLineNo">1010</span>   * automatically remove space quotas for a table when that table is deleted.<a name="line.1010"></a>
-<span class="sourceLineNo">1011</span>   */<a name="line.1011"></a>
-<span class="sourceLineNo">1012</span>  @VisibleForTesting<a name="line.1012"></a>
-<span class="sourceLineNo">1013</span>  public void updateConfigurationForSpaceQuotaObserver(Configuration conf) {<a name="line.1013"></a>
-<span class="sourceLineNo">1014</span>    // We're configured to not delete quotas on table deletion, so we don't need to add the obs.<a name="line.1014"></a>
-<span class="sourceLineNo">1015</span>    if (!conf.getBoolean(<a name="line.1015"></a>
-<span class="sourceLineNo">1016</span>          MasterSpaceQuotaObserver.REMOVE_QUOTA_ON_TABLE_DELETE,<a name="line.1016"></a>
-<span class="sourceLineNo">1017</span>          MasterSpaceQuotaObserver.REMOVE_QUOTA_ON_TABLE_DELETE_DEFAULT)) {<a name="line.1017"></a>
-<span class="sourceLineNo">1018</span>      return;<a name="line.1018"></a>
-<span class="sourceLineNo">1019</span>    }<a name="line.1019"></a>
-<span class="sourceLineNo">1020</span>    String[] masterCoprocs = conf.getStrings(CoprocessorHost.MASTER_COPROCESSOR_CONF_KEY);<a name="line.1020"></a>
-<span class="sourceLineNo">1021</span>    final int length = null == masterCoprocs ? 0 : masterCoprocs.length;<a name="line.1021"></a>
-<span class="sourceLineNo">1022</span>    String[] updatedCoprocs = new String[length + 1];<a name="line.1022"></a>
-<span class="sourceLineNo">1023</span>    if (length &gt; 0) {<a name="line.1023"></a>
-<span class="sourceLineNo">1024</span>      System.arraycopy(masterCoprocs, 0, updatedCoprocs, 0, masterCoprocs.length);<a name="line.1024"></a>
-<span class="sourceLineNo">1025</span>    }<a name="line.1025"></a>
-<span class="sourceLineNo">1026</span>    updatedCoprocs[length] = MasterSpaceQuotaObserver.class.getName();<a name="line.1026"></a>
-<span class="sourceLineNo">1027</span>    conf.setStrings(CoprocessorHost.MASTER_COPROCESSOR_CONF_KEY, updatedCoprocs);<a name="line.1027"></a>
-<span class="sourceLineNo">1028</span>  }<a name="line.1028"></a>
-<span class="sourceLineNo">1029</span><a name="line.1029"></a>
-<span class="sourceLineNo">1030</span>  private void initMobCleaner() {<a name="line.1030"></a>
-<span class="sourceLineNo">1031</span>    this.expiredMobFileCleanerChore = new ExpiredMobFileCleanerChore(this);<a name="line.1031"></a>
-<span class="sourceLineNo">1032</span>    getChoreService().scheduleChore(expiredMobFileCleanerChore);<a name="line.1032"></a>
-<span class="sourceLineNo">1033</span><a name="line.1033"></a>
-<span class="sourceLineNo">1034</span>    int mobCompactionPeriod = conf.getInt(MobConstants.MOB_COMPACTION_CHORE_PERIOD,<a name="line.1034"></a>
-<span class="sourceLineNo">1035</span>        MobConstants.DEFAULT_MOB_COMPACTION_CHORE_PERIOD);<a name="line.1035"></a>
-<span class="sourceLineNo">1036</span>    if (mobCompactionPeriod &gt; 0) {<a name="line.1036"></a>
-<span class="sourceLineNo">1037</span>      this.mobCompactChore = new MobCompactionChore(this, mobCompactionPeriod);<a name="line.1037"></a>
-<span class="sourceLineNo">1038</span>      getChoreService().scheduleChore(mobCompactChore);<a name="line.1038"></a>
-<span class="sourceLineNo">1039</span>    } else {<a name="line.1039"></a>
-<span class="sourceLineNo">1040</span>      LOG<a name="line.1040"></a>
-<span class="sourceLineNo">1041</span>        .info("The period is " + mobCompactionPeriod + " seconds, MobCompactionChore is disabled");<a name="line.1041"></a>
-<span class="sourceLineNo">1042</span>    }<a name="line.1042"></a>
-<span class="sourceLineNo">1043</span>    this.mobCompactThread = new MasterMobCompactionThread(this);<a name="line.1043"></a>
-<span class="sourceLineNo">1044</span>  }<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>   * Create a {@link MasterMetaBootstrap} instance.<a name="line.1047"></a>
-<span class="sourceLineNo">1048</span>   */<a name="line.1048"></a>
-<span class="sourceLineNo">1049</span>  MasterMetaBootstrap createMetaBootstrap(final HMaster master, final MonitoredTask status) {<a name="line.1049"></a>
-<span class="sourceLineNo">1050</span>    // We put this out here in a method so can do a Mockito.spy and stub it out<a name="line.1050"></a>
-<span class="sourceLineNo">1051</span>    // w/ a mocked up MasterMetaBootstrap.<a name="line.1051"></a>
-<span class="sourceLineNo">1052</span>    return new MasterMetaBootstrap(master, status);<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>  /**<a name="line.1055"></a>
-<span class="sourceLineNo">1056</span>   * Create a {@link ServerManager} instance.<a name="line.1056"></a>
-<span class="sourceLineNo">1057</span>   */<a name="line.1057"></a>
-<span class="sourceLineNo">1058</span>  ServerManager createServerManager(final MasterServices master) throws IOException {<a name="line.1058"></a>
-<span class="sourceLineNo">1059</span>    // We put this out here in a method so can do a Mockito.spy and stub it out<a name="line.1059"></a>
-<span class="sourceLineNo">1060</span>    // w/ a mocked up ServerManager.<a name="line.1060"></a>
-<span class="sourceLineNo">1061</span>    setupClusterConnection();<a name="line.1061"></a>
-<span class="sourceLineNo">1062</span>    return new ServerManager(master);<a name="line.1062"></a>
-<span class="sourceLineNo">1063</span>  }<a name="line.1063"></a>
-<span class="sourceLineNo">1064</span><a name="line.1064"></a>
-<span class="sourceLineNo">1065</span>  private void waitForRegionServers(final MonitoredTask status)<a name="line.1065"></a>
-<span class="sourceLineNo">1066</span>      throws IOException, InterruptedException {<a name="line.1066"></a>
-<span class="sourceLineNo">1067</span>    this.serverManager.waitForRegionServers(status);<a name="line.1067"></a>
-<span class="sourceLineNo">1068</span>    // Check zk for region servers that are up but didn't register<a name="line.1068"></a>
-<span class="sourceLineNo">1069</span>    for (ServerName sn: this.regionServerTracker.getOnlineServers()) {<a name="line.1069"></a>
-<span class="sourceLineNo">1070</span>      // The isServerOnline check is opportunistic, correctness is handled inside<a name="line.1070"></a>
-<span class="sourceLineNo">1071</span>      if (!this.serverManager.isServerOnline(sn) &amp;&amp;<a name="line.1071"></a>
-<span class="sourceLineNo">1072</span>          serverManager.checkAndRecordNewServer(sn, ServerMetricsBuilder.of(sn))) {<a name="line.1072"></a>
-<span class="sourceLineNo">1073</span>        LOG.info("Registered server found up in zk but who has not yet reported in: " + sn);<a name="line.1073"></a>
-<span class="sourceLineNo">1074</span>      }<a name="line.1074"></a>
-<span class="sourceLineNo">1075</span>    }<a name="line.1075"></a>
-<span class="sourceLineNo">1076</span>  }<a name="line.1076"></a>
-<span class="sourceLineNo">1077</span><a name="line.1077"></a>
-<span class="sourceLineNo">1078</span>  void initClusterSchemaService() throws IOException, InterruptedException {<a name="line.1078"></a>
-<span class="sourceLineNo">1079</span>    this.clusterSchemaService = new ClusterSchemaServiceImpl(this);<a name="line.1079"></a>
-<span class="sourceLineNo">1080</span>    this.clusterSchemaService.startAsync();<a name="line.1080"></a>
-<span class="sourceLineNo">1081</span>    try {<a name="line.1081"></a>
-<span class="sourceLineNo">1082</span>      this.clusterSchemaService.awaitRunning(getConfiguration().getInt(<a name="line.1082"></a>
-<span class="sourceLineNo">1083</span>        HBASE_MASTER_WAIT_ON_SERVICE_IN_SECONDS,<a name="line.1083"></a>
-<span class="sourceLineNo">1084</span>        DEFAULT_HBASE_MASTER_WAIT_ON_SERVICE_IN_SECONDS), TimeUnit.SECONDS);<a name="line.1084"></a>
-<span class="sourceLineNo">1085</span>    } catch (TimeoutException toe) {<a name="line.1085"></a>
-<span class="sourceLineNo">1086</span>      throw new IOException("Timedout starting ClusterSchemaService", toe);<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><a name="line.1089"></a>
-<span class="sourceLineNo">1090</span>  void initQuotaManager() throws IOException {<a name="line.1090"></a>
-<span class="sourceLineNo">1091</span>    MasterQuotaManager quotaManager = new MasterQuotaManager(this);<a name="line.1091"></a>
-<span class="sourceLineNo">1092</span>    this.assignmentManager.setRegionStateListener(quotaManager);<a name="line.1092"></a>
-<span class="sourceLineNo">1093</span>    quotaManager.start();<a name="line.1093"></a>
-<span class="sourceLineNo">1094</span>    this.quotaManager = quotaManager;<a name="line.1094"></a>
-<span class="sourceLineNo">1095</span>  }<a name="line.1095"></a>
-<span class="sourceLineNo">1096</span><a name="line.1096"></a>
-<span class="sourceLineNo">1097</span>  SpaceQuotaSnapshotNotifier createQuotaSnapshotNotifier() {<a name="line.1097"></a>
-<span class="sourceLineNo">1098</span>    SpaceQuotaSnapshotNotifier notifier =<a name="line.1098"></a>
-<span class="sourceLineNo">1099</span>        SpaceQuotaSnapshotNotifierFactory.getInstance().create(getConfiguration());<a name="line.1099"></a>
-<span class="sourceLineNo">1100</span>    return notifier;<a name="line.1100"></a>
-<span class="sourceLineNo">1101</span>  }<a name="line.1101"></a>
-<span class="sourceLineNo">1102</span><a name="line.1102"></a>
-<span class="sourceLineNo">1103</span>  boolean isCatalogJanitorEnabled() {<a name="line.1103"></a>
-<span class="sourceLineNo">1104</span>    return catalogJanitorChore != null ?<a name="line.1104"></a>
-<span class="sourceLineNo">1105</span>      catalogJanitorChore.getEnabled() : false;<a name="line.1105"></a>
+<span class="sourceLineNo">1006</span><a name="line.1006"></a>
+<span class="sourceLineNo">1007</span>    /*<a name="line.1007"></a>
+<span class="sourceLineNo">1008</span>     * After master has started up, lets do balancer post startup initialization. Since this runs<a name="line.1008"></a>
+<span class="sourceLineNo">1009</span>     * in activeMasterManager thread, it should be fine.<a name="line.1009"></a>
+<span class="sourceLineNo">1010</span>     */<a name="line.1010"></a>
+<span class="sourceLineNo">1011</span>    long start = System.currentTimeMillis();<a name="line.1011"></a>
+<span class="sourceLineNo">1012</span>    this.balancer.postMasterStartupInitialize();<a name="line.1012"></a>
+<span class="sourceLineNo">1013</span>    if (LOG.isDebugEnabled()) {<a name="line.1013"></a>
+<span class="sourceLineNo">1014</span>      LOG.debug("Balancer post startup initialization complete, took " + (<a name="line.1014"></a>
+<span class="sourceLineNo">1015</span>          (System.currentTimeMillis() - start) / 1000) + " seconds");<a name="line.1015"></a>
+<span class="sourceLineNo">1016</span>    }<a name="line.1016"></a>
+<span class="sourceLineNo">1017</span>  }<a name="line.1017"></a>
+<span class="sourceLineNo">1018</span><a name="line.1018"></a>
+<span class="sourceLineNo">1019</span>  /**<a name="line.1019"></a>
+<span class="sourceLineNo">1020</span>   * Adds the {@code MasterSpaceQuotaObserver} to the list of configured Master observers to<a name="line.1020"></a>
+<span class="sourceLineNo">1021</span>   * automatically remove space quotas for a table when that table is deleted.<a name="line.1021"></a>
+<span class="sourceLineNo">1022</span>   */<a name="line.1022"></a>
+<span class="sourceLineNo">1023</span>  @VisibleForTesting<a name="line.1023"></a>
+<span class="sourceLineNo">1024</span>  public void updateConfigurationForSpaceQuotaObserver(Configuration conf) {<a name="line.1024"></a>
+<span class="sourceLineNo">1025</span>    // We're configured to not delete quotas on table deletion, so we don't need to add the obs.<a name="line.1025"></a>
+<span class="sourceLineNo">1026</span>    if (!conf.getBoolean(<a name="line.1026"></a>
+<span class="sourceLineNo">1027</span>          MasterSpaceQuotaObserver.REMOVE_QUOTA_ON_TABLE_DELETE,<a name="line.1027"></a>
+<span class="sourceLineNo">1028</span>          MasterSpaceQuotaObserver.REMOVE_QUOTA_ON_TABLE_DELETE_DEFAULT)) {<a name="line.1028"></a>
+<span class="sourceLineNo">1029</span>      return;<a name="line.1029"></a>
+<span class="sourceLineNo">1030</span>    }<a name="line.1030"></a>
+<span class="sourceLineNo">1031</span>    String[] masterCoprocs = conf.getStrings(CoprocessorHost.MASTER_COPROCESSOR_CONF_KEY);<a name="line.1031"></a>
+<span class="sourceLineNo">1032</span>    final int length = null == masterCoprocs ? 0 : masterCoprocs.length;<a name="line.1032"></a>
+<span class="sourceLineNo">1033</span>    String[] updatedCoprocs = new String[length + 1];<a name="line.1033"></a>
+<span class="sourceLineNo">1034</span>    if (length &gt; 0) {<a name="line.1034"></a>
+<span class="sourceLineNo">1035</span>      System.arraycopy(masterCoprocs, 0, updatedCoprocs, 0, masterCoprocs.length);<a name="line.1035"></a>
+<span class="sourceLineNo">1036</span>    }<a name="line.1036"></a>
+<span class="sourceLineNo">1037</span>    updatedCoprocs[length] = MasterSpaceQuotaObserver.class.getName();<a name="line.1037"></a>
+<span class="sourceLineNo">1038</span>    conf.setStrings(CoprocessorHost.MASTER_COPROCESSOR_CONF_KEY, updatedCoprocs);<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>  private void initMobCleaner() {<a name="line.1041"></a>
+<span class="sourceLineNo">1042</span>    this.expiredMobFileCleanerChore = new ExpiredMobFileCleanerChore(this);<a name="line.1042"></a>
+<span class="sourceLineNo">1043</span>    getChoreService().scheduleChore(expiredMobFileCleanerChore);<a name="line.1043"></a>
+<span class="sourceLineNo">1044</span><a name="line.1044"></a>
+<span class="sourceLineNo">1045</span>    int mobCompactionPeriod = conf.getInt(MobConstants.MOB_COMPACTION_CHORE_PERIOD,<a name="line.1045"></a>
+<span class="sourceLineNo">1046</span>        MobConstants.DEFAULT_MOB_COMPACTION_CHORE_PERIOD);<a name="line.1046"></a>
+<span class="sourceLineNo">1047</span>    if (mobCompactionPeriod &gt; 0) {<a name="line.1047"></a>
+<span class="sourceLineNo">1048</span>      this.mobCompactChore = new MobCompactionChore(this, mobCompactionPeriod);<a name="line.1048"></a>
+<span class="sourceLineNo">1049</span>      getChoreService().scheduleChore(mobCompactChore);<a name="line.1049"></a>
+<span class="sourceLineNo">1050</span>    } else {<a name="line.1050"></a>
+<span class="sourceLineNo">1051</span>      LOG<a name="line.1051"></a>
+<span class="sourceLineNo">1052</span>        .info("The period is " + mobCompactionPeriod + " seconds, MobCompactionChore is disabled");<a name="line.1052"></a>
+<span class="sourceLineNo">1053</span>    }<a name="line.1053"></a>
+<span class="sourceLineNo">1054</span>    this.mobCompactThread = new MasterMobCompactionThread(this);<a name="line.1054"></a>
+<span class="sourceLineNo">1055</span>  }<a name="line.1055"></a>
+<span class="sourceLineNo">1056</span><a name="line.1056"></a>
+<span class="sourceLineNo">1057</span>  /**<a name="line.1057"></a>
+<span class="sourceLineNo">1058</span>   * Create a {@link MasterMetaBootstrap} instance.<a name="line.1058"></a>
+<span class="sourceLineNo">1059</span>   */<a name="line.1059"></a>
+<span class="sourceLineNo">1060</span>  MasterMetaBootstrap createMetaBootstrap(final HMaster master, final MonitoredTask status) {<a name="line.1060"></a>
+<span class="sourceLineNo">1061</span>    // We put this out here in a method so can do a Mockito.spy and stub it out<a name="line.1061"></a>
+<span class="sourceLineNo">1062</span>    // w/ a mocked up MasterMetaBootstrap.<a name="line.1062"></a>
+<span class="sourceLineNo">1063</span>    return new MasterMetaBootstrap(master, status);<a name="line.1063"></a>
+<span class="sourceLineNo">1064</span>  }<a name="line.1064"></a>
+<span class="sourceLineNo">1065</span><a name="line.1065"></a>
+<span class="sourceLineNo">1066</span>  /**<a name="line.1066"></a>
+<span class="sourceLineNo">1067</span>   * Create a {@link ServerManager} instance.<a name="line.1067"></a>
+<span class="sourceLineNo">1068</span>   */<a name="line.1068"></a>
+<span class="sourceLineNo">1069</span>  ServerManager createServerManager(final MasterServices master) throws IOException {<a name="line.1069"></a>
+<span class="sourceLineNo">1070</span>    // We put this out here in a method so can do a Mockito.spy and stub it out<a name="line.1070"></a>
+<span class="sourceLineNo">1071</span>    // w/ a mocked up ServerManager.<a name="line.1071"></a>
+<span class="sourceLineNo">1072</span>    setupClusterConnection();<a name="line.1072"></a>
+<span class="sourceLineNo">1073</span>    return new ServerManager(master);<a name="line.1073"></a>
+<span class="sourceLineNo">1074</span>  }<a name="line.1074"></a>
+<span class="sourceLineNo">1075</span><a name="line.1075"></a>
+<span class="sourceLineNo">1076</span>  private void waitForRegionServers(final MonitoredTask status)<a name="line.1076"></a>
+<span class="sourceLineNo">1077</span>      throws IOException, InterruptedException {<a name="line.1077"></a>
+<span class="sourceLineNo">1078</span>    this.serverManager.waitForRegionServers(status);<a name="line.1078"></a>
+<span class="sourceLineNo">1079</span>    // Check zk for region servers that are up but didn't register<a name="line.1079"></a>
+<span class="sourceLineNo">1080</span>    for (ServerName sn: this.regionServerTracker.getOnlineServers()) {<a name="line.1080"></a>
+<span class="sourceLineNo">1081</span>      // The isServerOnline check is opportunistic, correctness is handled inside<a name="line.1081"></a>
+<span class="sourceLineNo">1082</span>      if (!this.serverManager.isServerOnline(sn) &amp;&amp;<a name="line.1082"></a>
+<span class="sourceLineNo">1083</span>          serverManager.checkAndRecordNewServer(sn, ServerMetricsBuilder.of(sn))) {<a name="line.1083"></a>
+<span class="sourceLineNo">1084</span>        LOG.info("Registered server found up in zk but who has not yet reported in: " + sn);<a name="line.1084"></a>
+<span class="sourceLineNo">1085</span>      }<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>  void initClusterSchemaService() throws IOException, InterruptedException {<a name="line.1089"></a>
+<span class="sourceLineNo">1090</span>    this.clusterSchemaService = new ClusterSchemaServiceImpl(this);<a name="line.1090"></a>
+<span class="sourceLineNo">1091</span>    this.clusterSchemaService.startAsync();<a name="line.1091"></a>
+<span class="sourceLineNo">1092</span>    try {<a name="line.1092"></a>
+<span class="sourceLineNo">1093</span>      this.clusterSchemaService.awaitRunning(getConfiguration().getInt(<a name="line.1093"></a>
+<span class="sourceLineNo">1094</span>        HBASE_MASTER_WAIT_ON_SERVICE_IN_SECONDS,<a name="line.1094"></a>
+<span class="sourceLineNo">1095</span>        DEFAULT_HBASE_MASTER_WAIT_ON_SERVICE_IN_SECONDS), TimeUnit.SECONDS);<a name="line.1095"></a>
+<span class="sourceLineNo">1096</span>    } catch (TimeoutException toe) {<a name="line.1096"></a>
+<span class="sourceLineNo">1097</span>      throw new IOException("Timedout starting ClusterSchemaService", toe);<a name="line.1097"></a>
+<span class="sourceLineNo">1098</span>    }<a name="line.1098"></a>
+<span class="sourceLineNo">1099</span>  }<a name="line.1099"></a>
+<span class="sourceLineNo">1100</span><a name="line.1100"></a>
+<span class="sourceLineNo">1101</span>  void initQuotaManager() throws IOException {<a name="line.1101"></a>
+<span class="sourceLineNo">1102</span>    MasterQuotaManager quotaManager = new MasterQuotaManager(this);<a name="line.1102"></a>
+<span class="sourceLineNo">1103</span>    this.assignmentManager.setRegionStateListener(quotaManager);<a name="line.1103"></a>
+<span class="sourceLineNo">1104</span>    quotaManager.start();<a name="line.1104"></a>
+<span class="sourceLineNo">1105</span>    this.quotaManager = quotaManager;<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>  boolean isCleanerChoreEnabled() {<a name="line.1108"></a>
-<span class="sourceLineNo">1109</span>    boolean hfileCleanerFlag = true, logCleanerFlag = true;<a name="line.1109"></a>
-<span class="sourceLineNo">1110</span><a name="line.1110"></a>
-<span class="sourceLineNo">1111</span>    if (hfileCleaner != null) {<a name="line.1111"></a>
-<span class="sourceLineNo">1112</span>      hfileCleanerFlag = hfileCleaner.getEnabled();<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>    if (logCleaner != null) {<a name="line.1115"></a>
-<span class="sourceLineNo">1116</span>      logCleanerFlag = logCleaner.getEnabled();<a name="line.1116"></a>
-<span class="sourceLineNo">1117</span>    }<a name="line.1117"></a>
+<span class="sourceLineNo">1108</span>  SpaceQuotaSnapshotNotifier createQuotaSnapshotNotifier() {<a name="line.1108"></a>
+<span class="sourceLineNo">1109</span>    SpaceQuotaSnapshotNotifier notifier =<a name="line.1109"></a>
+<span class="sourceLineNo">1110</span>        SpaceQuotaSnapshotNotifierFactory.getInstance().create(getConfiguration());<a name="line.1110"></a>
+<span class="sourceLineNo">1111</span>    return notifier;<a name="line.1111"></a>
+<span class="sourceLineNo">1112</span>  }<a name="line.1112"></a>
+<span class="sourceLineNo">1113</span><a name="line.1113"></a>
+<span class="sourceLineNo">1114</span>  boolean isCatalogJanitorEnabled() {<a name="line.1114"></a>
+<span class="sourceLineNo">1115</span>    return catalogJanitorChore != null ?<a name="line.1115"></a>
+<span class="sourceLineNo">1116</span>      catalogJanitorChore.getEnabled() : false;<a name="line.1116"></a>
+<span class="sourceLineNo">1117</span>  }<a name="line.1117"></a>
 <span class="sourceLineNo">1118</span><a name="line.1118"></a>
-<span class="sourceLineNo">1119</span>    return (hfileCleanerFlag &amp;&amp; logCleanerFlag);<a name="line.1119"></a>
-<span class="sourceLineNo">1120</span>  }<a name="line.1120"></a>
+<span class="sourceLineNo">1119</span>  boolean isCleanerChoreEnabled() {<a name="line.1119"></a>
+<span class="sourceLineNo">1120</span>    boolean hfileCleanerFlag = true, logCleanerFlag = true;<a name="line.1120"></a>
 <span class="sourceLineNo">1121</span><a name="line.1121"></a>
-<span class="sourceLineNo">1122</span>  @Override<a name="line.1122"></a>
-<span class="sourceLineNo">1123</span>  public TableDescriptors getTableDescriptors() {<a name="line.1123"></a>
-<span class="sourceLineNo">1124</span>    return this.tableDescriptors;<a name="line.1124"></a>
-<span class="sourceLineNo">1125</span>  }<a name="line.1125"></a>
-<span class="sourceLineNo">1126</span><a name="line.1126"></a>
-<span class="sourceLineNo">1127</span>  @Override<a name="line.1127"></a>
-<span class="sourceLineNo">1128</span>  public ServerManager getServerManager() {<a name="line.1128"></a>
-<span class="sourceLineNo">1129</span>    return this.serverManager;<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>  @Override<a name="line.1132"></a>
-<span class="sourceLineNo">1133</span>  public MasterFileSystem getMasterFileSystem() {<a name="line.1133"></a>
-<span class="sourceLineNo">1134</span>    return this.fileSystemManager;<a name="line.1134"></a>
-<span class="sourceLineNo">1135</span>  }<a name="line.1135"></a>
-<span class="sourceLineNo">1136</span><a name="line.1136"></a>
-<span class="sourceLineNo">1137</span>  @Override<a name="line.1137"></a>
-<span class="sourceLineNo">1138</span>  public MasterWalManager getMasterWalManager() {<a name="line.1138"></a>
-<span class="sourceLineNo">1139</span>    return this.walManager;<a name="line.1139"></a>
-<span class="sourceLineNo">1140</span>  }<a name="line.1140"></a>
-<span class="sourceLineNo">1141</span><a name="line.1141"></a>
-<span class="sourceLineNo">1142</span>  @Override<a name="line.1142"></a>
-<span class="sourceLineNo">1143</span>  public TableStateManager getTableStateManager() {<a name="line.1143"></a>
-<span class="sourceLineNo">1144</span>    return tableStateManager;<a name="line.1144"></a>
-<span class="sourceLineNo">1145</span>  }<a name="line.1145"></a>
-<span class="sourceLineNo">1146</span><a name="line.1146"></a>
-<span class="sourceLineNo">1147</span>  /*<a name="line.1147"></a>
-<span class="sourceLineNo">1148</span>   * Start up all services. If any of these threads gets an unhandled exception<a name="line.1148"></a>
-<span class="sourceLineNo">1149</span>   * then they just die with a logged message.  This should be fine because<a name="line.1149"></a>
-<span class="sourceLineNo">1150</span>   * in general, we do not expect the master to get such unhandled exceptions<a name="line.1150"></a>
-<span class="sourceLineNo">1151</span>   *  as OOMEs; it should be lightly loaded. See what HRegionServer does if<a name="line.1151"></a>
-<span class="sourceLineNo">1152</span>   *  need to install an unexpected exception handler.<a name="line.1152"></a>
-<span class="sourceLineNo">1153</span>   */<a name="line.1153"></a>
-<span class="sourceLineNo">1154</span>  private void startServiceThreads() throws IOException{<a name="line.1154"></a>
-<span class="sourceLineNo">1155</span>   // Start the executor service pools<a name="line.1155"></a>
-<span class="sourceLineNo">1156</span>   this.executorService.startExecutorService(ExecutorType.MASTER_OPEN_REGION,<a name="line.1156"></a>
-<span class="sourceLineNo">1157</span>      conf.getInt("hbase.master.executor.openregion.threads", 5));<a name="line.1157"></a>
-<span class="sourceLineNo">1158</span>   this.executorService.startExecutorService(ExecutorType.MASTER_CLOSE_REGION,<a name="line.1158"></a>
-<span class="sourceLineNo">1159</span>      conf.getInt("hbase.master.executor.closeregion.threads", 5));<a name="line.1159"></a>
-<span class="sourceLineNo">1160</span>   this.executorService.startExecutorService(ExecutorType.MASTER_SERVER_OPERATIONS,<a name="line.1160"></a>
-<span class="sourceLineNo">1161</span>      conf.getInt("hbase.master.executor.serverops.threads", 5));<a name="line.1161"></a>
-<span class="sourceLineNo">1162</span>   this.executorService.startExecutorService(ExecutorType.MASTER_META_SERVER_OPERATIONS,<a name="line.1162"></a>
-<span class="sourceLineNo">1163</span>      conf.getInt("hbase.master.executor.meta.serverops.threads", 5));<a name="line.1163"></a>
-<span class="sourceLineNo">1164</span>   this.executorService.startExecutorService(ExecutorType.M_LOG_REPLAY_OPS,<a name="line.1164"></a>
-<span class="sourceLineNo">1165</span>      conf.getInt("hbase.master.executor.logreplayops.threads", 10));<a name="line.1165"></a>
-<span class="sourceLineNo">1166</span><a name="line.1166"></a>
-<span class="sourceLineNo">1167</span>   // We depend on there being only one instance of this executor running<a name="line.1167"></a>
-<span class="sourceLineNo">1168</span>   // at a time.  To do concurrency, would need fencing of enable/disable of<a name="line.1168"></a>
-<span class="sourceLineNo">1169</span>   // tables.<a name="line.1169"></a>
-<span class="sourceLineNo">1170</span>   // Any time changing this maxThreads to &gt; 1, pls see the comment at<a name="line.1170"></a>
-<span class="sourceLineNo">1171</span>   // AccessController#postCompletedCreateTableAction<a name="line.1171"></a>
-<span class="sourceLineNo">1172</span>   this.executorService.startExecutorService(ExecutorType.MASTER_TABLE_OPERATIONS, 1);<a name="line.1172"></a>
-<span class="sourceLineNo">1173</span>   startProcedureExecutor();<a name="line.1173"></a>
-<span class="sourceLineNo">1174</span><a name="line.1174"></a>
-<span class="sourceLineNo">1175</span>    // Initial cleaner chore<a name="line.1175"></a>
-<span class="sourceLineNo">1176</span>    CleanerChore.initChorePool(conf);<a name="line.1176"></a>
-<span class="sourceLineNo">1177</span>   // Start log cleaner thread<a name="line.1177"></a>
-<span class="sourceLineNo">1178</span>   int cleanerInterval = conf.getInt("hbase.master.cleaner.interval", 600 * 1000);<a name="line.1178"></a>
-<span class="sourceLineNo">1179</span>   this.logCleaner =<a name="line.1179"></a>
-<span class="sourceLineNo">1180</span>      new LogCleaner(cleanerInterval,<a name="line.1180"></a>
-<span class="sourceLineNo">1181</span>         this, conf, getMasterWalManager().getFileSystem(),<a name="line.1181"></a>
-<span class="sourceLineNo">1182</span>         getMasterWalManager().getOldLogDir());<a name="line.1182"></a>
-<span class="sourceLineNo">1183</span>    getChoreService().scheduleChore(logCleaner);<a name="line.1183"></a>
-<span class="sourceLineNo">1184</span><a name="line.1184"></a>
-<span class="sourceLineNo">1185</span>    // start the hfile archive cleaner thread<a name="line.1185"></a>
-<span class="sourceLineNo">1186</span>    Path archiveDir = HFileArchiveUtil.getArchivePath(conf);<a name="line.1186"></a>
-<span class="sourceLineNo">1187</span>    Map&lt;String, Object&gt; params = new HashMap&lt;&gt;();<a name="line.1187"></a>
-<span class="sourceLineNo">1188</span>    params.put(MASTER, this);<a name="line.1188"></a>
-<span class="sourceLineNo">1189</span>    this.hfileCleaner = new HFileCleaner(cleanerInterval, this, conf, getMasterFileSystem()<a name="line.1189"></a>
-<span class="sourceLineNo">1190</span>        .getFileSystem(), archiveDir, params);<a name="line.1190"></a>
-<span class="sourceLineNo">1191</span>    getChoreService().scheduleChore(hfileCleaner);<a name="line.1191"></a>
-<span class="sourceLineNo">1192</span><a name="line.1192"></a>
-<span class="sourceLineNo">1193</span>    replicationBarrierCleaner =<a name="line.1193"></a>
-<span class="sourceLineNo">1194</span>      new ReplicationBarrierCleaner(conf, this, getConnection(), replicationPeerManager);<a name="line.1194"></a>
-<span class="sourceLineNo">1195</span>    getChoreService().scheduleChore(replicationBarrierCleaner);<a name="line.1195"></a>
-<span class="sourceLineNo">1196</span><a name="line.1196"></a>
-<span class="sourceLineNo">1197</span>    serviceStarted = true;<a name="line.1197"></a>
-<span class="sourceLineNo">1198</span>    if (LOG.isTraceEnabled()) {<a name="line.1198"></a>
-<span class="sourceLineNo">1199</span>      LOG.trace("Started service threads");<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><a name="line.1202"></a>
-<span class="sourceLineNo">1203</span>  private void cancelChore(ScheduledChore chore) {<a name="line.1203"></a>
-<span class="sourceLineNo">1204</span>    if (chore != null) {<a name="line.1204"></a>
-<span class="sourceLineNo">1205</span>      chore.cancel();<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><a name="line.1208"></a>
-<span class="sourceLineNo">1209</span>  @Override<a name="line.1209"></a>
-<span class="sourceLineNo">1210</span>  protected void stopServiceThreads() {<a name="line.1210"></a>
-<span class="sourceLineNo">1211</span>    if (masterJettyServer != null) {<a name="line.1211"></a>
-<span class="sourceLineNo">1212</span>      LOG.info("Stopping master jetty server");<a name="line.1212"></a>
-<span class="sourceLineNo">1213</span>      try {<a name="line.1213"></a>
-<span class="sourceLineNo">1214</span>        masterJettyServer.stop();<a name="line.1214"></a>
-<span class="sourceLineNo">1215</span>      } catch (Exception e) {<a name="line.1215"></a>
-<span class="sourceLineNo">1216</span>        LOG.error("Failed to stop master jetty server", e);<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>    super.stopServiceThreads();<a name="line.1219"></a>
-<span class="sourceLineNo">1220</span>    stopChores();<a name="line.1220"></a>
-<span class="sourceLineNo">1221</span><a name="line.1221"></a>
-<span class="sourceLineNo">1222</span>    LOG.debug("Stopping service threads");<a name="line.1222"></a>
-<span class="sourceLineNo">1223</span><a name="line.1223"></a>
-<span class="sourceLineNo">1224</span>    if (this.quotaManager != null) {<a name="line.1224"></a>
-<span class="sourceLineNo">1225</span>      this.quotaManager.stop();<a name="line.1225"></a>
-<span class="sourceLineNo">1226</span>    }<a name="line.1226"></a>
-<span class="sourceLineNo">1227</span><a name="line.1227"></a>
-<span class="sourceLineNo">1228</span>    if (this.activeMasterManager != null) {<a name="line.1228"></a>
-<span class="sourceLineNo">1229</span>      this.activeMasterManager.stop();<a name="line.1229"></a>
-<span class="sourceLineNo">1230</span>    }<a name="line.1230"></a>
-<span class="sourceLineNo">1231</span>    if (this.serverManager != null) {<a name="line.1231"></a>
-<span class="sourceLineNo">1232</span>      this.serverManager.stop();<a name="line.1232"></a>
-<span class="sourceLineNo">1233</span>    }<a name="line.1233"></a>
-<span class="sourceLineNo">1234</span>    if (this.assignmentManager != null) {<a name="line.1234"></a>
-<span class="sourceLineNo">1235</span>      this.assignmentManager.stop();<a name="line.1235"></a>
-<span class="sourceLineNo">1236</span>    }<a name="line.1236"></a>
-<span class="sourceLineNo">1237</span><a name="line.1237"></a>
-<span class="sourceLineNo">1238</span>    stopProcedureExecutor();<a name="line.1238"></a>
-<span class="sourceLineNo">1239</span><a name="line.1239"></a>
-<span class="sourceLineNo">1240</span>    if (this.walManager != null) {<a name="line.1240"></a>
-<span class="sourceLineNo">1241</span>      this.walManager.stop();<a name="line.1241"></a>
-<span class="sourceLineNo">1242</span>    }<a name="line.1242"></a>
-<span class="sourceLineNo">1243</span>    if (this.fileSystemManager != null) {<a name="line.1243"></a>
-<span class="sourceLineNo">1244</span>      this.fileSystemManager.stop();<a name="line.1244"></a>
-<span class="sourceLineNo">1245</span>    }<a name="line.1245"></a>
-<span class="sourceLineNo">1246</span>    if (this.mpmHost != null) {<a name="line.1246"></a>
-<span class="sourceLineNo">1247</span>      this.mpmHost.stop("server shutting down.");<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">1122</span>    if (hfileCleaner != null) {<a name="line.1122"></a>
+<span class="sourceLineNo">1123</span>      hfileCleanerFlag = hfileCleaner.getEnabled();<a name="line.1123"></a>
+<span class="sourceLineNo">1124</span>    }<a name="line.1124"></a>
+<span class="sourceLineNo">1125</span><a name="line.1125"></a>
+<span class="sourceLineNo">1126</span>    if (logCleaner != null) {<a name="line.1126"></a>
+<span class="sourceLineNo">1127</span>      logCleanerFlag = logCleaner.getEnabled();<a name="line.1127"></a>
+<span class="sourceLineNo">1128</span>    }<a name="line.1128"></a>
+<span class="sourceLineNo">1129</span><a name="line.1129"></a>
+<span class="sourceLineNo">1130</span>    return (hfileCleanerFlag &amp;&amp; logCleanerFlag);<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>  @Override<a name="line.1133"></a>
+<span class="sourceLineNo">1134</span>  public TableDescriptors getTableDescriptors() {<a name="line.1134"></a>
+<span class="sourceLineNo">1135</span>    return this.tableDescriptors;<a name="line.1135"></a>
+<span class="sourceLineNo">1136</span>  }<a name="line.1136"></a>
+<span class="sourceLineNo">1137</span><a name="line.1137"></a>
+<span class="sourceLineNo">1138</span>  @Override<a name="line.1138"></a>
+<span class="sourceLineNo">1139</span>  public ServerManager getServerManager() {<a name="line.1139"></a>
+<span class="sourceLineNo">1140</span>    return this.serverManager;<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>  @Override<a name="line.1143"></a>
+<span class="sourceLineNo">1144</span>  public MasterFileSystem getMasterFileSystem() {<a name="line.1144"></a>
+<span class="sourceLineNo">1145</span>    return this.fileSystemManager;<a name="line.1145"></a>
+<span class="sourceLineNo">1146</span>  }<a name="line.1146"></a>
+<span class="sourceLineNo">1147</span><a name="line.1147"></a>
+<span class="sourceLineNo">1148</span>  @Override<a name="line.1148"></a>
+<span class="sourceLineNo">1149</span>  public MasterWalManager getMasterWalManager() {<a name="line.1149"></a>
+<span class="sourceLineNo">1150</span>    return this.walManager;<a name="line.1150"></a>
+<span class="sourceLineNo">1151</span>  }<a name="line.1151"></a>
+<span class="sourceLineNo">1152</span><a name="line.1152"></a>
+<span class="sourceLineNo">1153</span>  @Override<a name="line.1153"></a>
+<span class="sourceLineNo">1154</span>  public TableStateManager getTableStateManager() {<a name="line.1154"></a>
+<span class="sourceLineNo">1155</span>    return tableStateManager;<a name="line.1155"></a>
+<span class="sourceLineNo">1156</span>  }<a name="line.1156"></a>
+<span class="sourceLineNo">1157</span><a name="line.1157"></a>
+<span class="sourceLineNo">1158</span>  /*<a name="line.1158"></a>
+<span class="sourceLineNo">1159</span>   * Start up all services. If any of these threads gets an unhandled exception<a name="line.1159"></a>
+<span class="sourceLineNo">1160</span>   * then they just die with a logged message.  This should be fine because<a name="line.1160"></a>
+<span class="sourceLineNo">1161</span>   * in general, we do not expect the master to get such unhandled exceptions<a name="line.1161"></a>
+<span class="sourceLineNo">1162</span>   *  as OOMEs; it should be lightly loaded. See what HRegionServer does if<a name="line.1162"></a>
+<span class="sourceLineNo">1163</span>   *  need to install an unexpected exception handler.<a name="line.1163"></a>
+<span class="sourceLineNo">1164</span>   */<a name="line.1164"></a>
+<span class="sourceLineNo">1165</span>  private void startServiceThreads() throws IOException{<a name="line.1165"></a>
+<span class="sourceLineNo">1166</span>   // Start the executor service pools<a name="line.1166"></a>
+<span class="sourceLineNo">1167</span>   this.executorService.startExecutorService(ExecutorType.MASTER_OPEN_REGION,<a name="line.1167"></a>
+<span class="sourceLineNo">1168</span>      conf.getInt("hbase.master.executor.openregion.threads", 5));<a name="line.1168"></a>
+<span class="sourceLineNo">1169</span>   this.executorService.startExecutorService(ExecutorType.MASTER_CLOSE_REGION,<a name="line.1169"></a>
+<span class="sourceLineNo">1170</span>      conf.getInt("hbase.master.executor.closeregion.threads", 5));<a name="line.1170"></a>
+<span class="sourceLineNo">1171</span>   this.executorService.startExecutorService(ExecutorType.MASTER_SERVER_OPERATIONS,<a name="line.1171"></a>
+<span class="sourceLineNo">1172</span>      conf.getInt("hbase.master.executor.serverops.threads", 5));<a name="line.1172"></a>
+<span class="sourceLineNo">1173</span>   this.executorService.startExecutorService(ExecutorType.MASTER_META_SERVER_OPERATIONS,<a name="line.1173"></a>
+<span class="sourceLineNo">1174</span>      conf.getInt("hbase.master.executor.meta.serverops.threads", 5));<a name="line.1174"></a>
+<span class="sourceLineNo">1175</span>   this.executorService.startExecutorService(ExecutorType.M_LOG_REPLAY_OPS,<a name="line.1175"></a>
+<span class="sourceLineNo">1176</span>      conf.getInt("hbase.master.executor.logreplayops.threads", 10));<a name="line.1176"></a>
+<span class="sourceLineNo">1177</span><a name="line.1177"></a>
+<span class="sourceLineNo">1178</span>   // We depend on there being only one instance of this executor running<a name="line.1178"></a>
+<span class="sourceLineNo">1179</span>   // at a time.  To do concurrency, would need fencing of enable/disable of<a name="line.1179"></a>
+<span class="sourceLineNo">1180</span>   // tables.<a name="line.1180"></a>
+<span class="sourceLineNo">1181</span>   // Any time changing this maxThreads to &gt; 1, pls see the comment at<a name="line.1181"></a>
+<span class="sourceLineNo">1182</span>   // AccessController#postCompletedCreateTableAction<a name="line.1182"></a>
+<span class="sourceLineNo">1183</span>   this.executorService.startExecutorService(ExecutorType.MASTER_TABLE_OPERATIONS, 1);<a name="line.1183"></a>
+<span class="sourceLineNo">1184</span>   startProcedureExecutor();<a name="line.1184"></a>
+<span class="sourceLineNo">1185</span><a name="line.1185"></a>
+<span class="sourceLineNo">1186</span>    // Initial cleaner chore<a name="line.1186"></a>
+<span class="sourceLineNo">1187</span>    CleanerChore.initChorePool(conf);<a name="line.1187"></a>
+<span class="sourceLineNo">1188</span>   // Start log cleaner thread<a name="line.1188"></a>
+<span class="sourceLineNo">1189</span>   int cleanerInterval = conf.getInt("hbase.master.cleaner.interval", 600 * 1000);<a name="line.1189"></a>
+<span class="sourceLineNo">1190</span>   this.logCleaner =<a name="line.1190"></a>
+<span class="sourceLineNo">1191</span>      new LogCleaner(cleanerInterval,<a name="line.1191"></a>
+<span class="sourceLineNo">1192</span>         this, conf, getMasterWalManager().getFileSystem(),<a name="line.1192"></a>
+<span class="sourceLineNo">1193</span>         getMasterWalManager().getOldLogDir());<a name="line.1193"></a>
+<span class="sourceLineNo">1194</span>    getChoreService().scheduleChore(logCleaner);<a name="line.1194"></a>
+<span class="sourceLineNo">1195</span><a name="line.1195"></a>
+<span class="sourceLineNo">1196</span>    // start the hfile archive cleaner thread<a name="line.1196"></a>
+<span class="sourceLineNo">1197</span>    Path archiveDir = HFileArchiveUtil.getArchivePath(conf);<a name="line.1197"></a>
+<span class="sourceLineNo">1198</span>    Map&lt;String, Object&gt; params = new HashMap&lt;&gt;();<a name="line.1198"></a>
+<span class="sourceLineNo">1199</span>    params.put(MASTER, this);<a name="line.1199"></a>
+<span class="sourceLineNo">1200</span>    this.hfileCleaner = new HFileCleaner(cleanerInterval, this, conf, getMasterFileSystem()<a name="line.1200"></a>
+<span class="sourceLineNo">1201</span>        .getFileSystem(), archiveDir, params);<a name="line.1201"></a>
+<span class="sourceLineNo">1202</span>    getChoreService().scheduleChore(hfileCleaner);<a name="line.1202"></a>
+<span class="sourceLineNo">1203</span><a name="line.1203"></a>
+<span class="sourceLineNo">1204</span>    replicationBarrierCleaner =<a name="line.1204"></a>
+<span class="sourceLineNo">1205</span>      new ReplicationBarrierCleaner(conf, this, getConnection(), replicationPeerManager);<a name="line.1205"></a>
+<span class="sourceLineNo">1206</span>    getChoreService().scheduleChore(replicationBarrierCleaner);<a name="line.1206"></a>
+<span class="sourceLineNo">1207</span><a name="line.1207"></a>
+<span class="sourceLineNo">1208</span>    serviceStarted = true;<a name="line.1208"></a>
+<span class="sourceLineNo">1209</span>    if (LOG.isTraceEnabled()) {<a name="line.1209"></a>
+<span class="sourceLineNo">1210</span>      LOG.trace("Started service threads");<a name="line.1210"></a>
+<span class="sourceLineNo">1211</span>    }<a name="line.1211"></a>
+<span class="sourceLineNo">1212</span>  }<a name="line.1212"></a>
+<span class="sourceLineNo">1213</span><a name="line.1213"></a>
+<span class="sourceLineNo">1214</span>  private void cancelChore(ScheduledChore chore) {<a name="line.1214"></a>
+<span class="sourceLineNo">1215</span>    if (chore != null) {<a name="line.1215"></a>
+<span class="sourceLineNo">1216</span>      chore.cancel();<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><a name="line.1219"></a>
+<span class="sourceLineNo">1220</span>  @Override<a name="line.1220"></a>
+<span class="sourceLineNo">1221</span>  protected void stopServiceThreads() {<a name="line.1221"></a>
+<span class="sourceLineNo">1222</span>    if (masterJettyServer != null) {<a name="line.1222"></a>
+<span class="sourceLineNo">1223</span>      LOG.info("Stopping master jetty server");<a name="line.1223"></a>
+<span class="sourceLineNo">1224</span>      try {<a name="line.1224"></a>
+<span class="sourceLineNo">1225</span>        masterJettyServer.stop();<a name="line.1225"></a>
+<span class="sourceLineNo">1226</span>      } catch (Exception e) {<a name="line.1226"></a>
+<span class="sourceLineNo">1227</span>        LOG.error("Failed to stop master jetty server", e);<a name="line.1227"></a>
+<span class="sourceLineNo">1228</span>      }<a name="line.1228"></a>
+<span class="sourceLineNo">1229</span>    }<a name="line.1229"></a>
+<span class="sourceLineNo">1230</span>    super.stopServiceThreads();<a name="line.1230"></a>
+<span class="sourceLineNo">1231</span>    stopChores();<a name="line.1231"></a>
+<span class="sourceLineNo">1232</span><a name="line.1232"></a>
+<span class="sourceLineNo">1233</span>    LOG.debug("Stopping service threads");<a name="line.1233"></a>
+<span class="sourceLineNo">1234</span><a name="line.1234"></a>
+<span class="sourceLineNo">1235</span>    if (this.quotaManager != null) {<a name="line.1235"></a>
+<span class="sourceLineNo">1236</span>      this.quotaManager.stop();<a name="line.1236"></a>
+<span class="sourceLineNo">1237</span>    }<a name="line.1237"></a>
+<span class="sourceLineNo">1238</span><a name="line.1238"></a>
+<span class="sourceLineNo">1239</span>    if (this.activeMasterManager != null) {<a name="line.1239"></a>
+<span class="sourceLineNo">1240</span>      this.activeMasterManager.stop();<a name="line.1240"></a>
+<span class="sourceLineNo">1241</span>    }<a name="line.1241"></a>
+<span class="sourceLineNo">1242</span>    if (this.serverManager != null) {<a name="line.1242"></a>
+<span class="sourceLineNo">1243</span>      this.serverManager.stop();<a name="line.1243"></a>
+<span class="sourceLineNo">1244</span>    }<a name="line.1244"></a>
+<span class="sourceLineNo">1245</span>    if (this.assignmentManager != null) {<a name="line.1245"></a>
+<span class="sourceLineNo">1246</span>      this.assignmentManager.stop();<a name="line.1246"></a>
+<span class="sourceLineNo">1247</span>    }<a name="line.1247"></a>
+<span class="sourceLineNo">1248</span><a name="line.1248"></a>
+<span class="sourceLineNo">1249</span>    stopProcedureExecutor();<a name="line.1249"></a>
 <span class="sourceLineNo">1250</span><a name="line.1250"></a>
-<span class="sourceLineNo">1251</span>  private void startProcedureExecutor() throws IOException {<a name="line.1251"></a>
-<span class="sourceLineNo">1252</span>    final MasterProcedureEnv procEnv = new MasterProcedureEnv(this);<a name="line.1252"></a>
-<span class="sourceLineNo">1253</span>    procedureStore = new WALProcedureStore(conf,<a name="line.1253"></a>
-<span class="sourceLineNo">1254</span>        new MasterProcedureEnv.WALStoreLeaseRecovery(this));<a name="line.1254"></a>
-<span class="sourceLineNo">1255</span>    procedureStore.registerListener(new MasterProcedureEnv.MasterProcedureStoreListener(this));<a name="line.1255"></a>
-<span class="sourceLineNo">1256</span>    MasterProcedureScheduler procedureScheduler = procEnv.getProcedureScheduler();<a name="line.1256"></a>
-<span class="sourceLineNo">1257</span>    procedureExecutor = new ProcedureExecutor&lt;&gt;(conf, procEnv, procedureStore, procedureScheduler);<a name="line.1257"></a>
-<span class="sourceLineNo">1258</span>    configurationManager.registerObserver(procEnv);<a name="line.1258"></a>
-<span class="sourceLineNo">1259</span><a name="line.1259"></a>
-<span class="sourceLineNo">1260</span>    int cpus = Runtime.getRuntime().availableProcessors();<a name="line.1260"></a>
-<span class="sourceLineNo">1261</span>    final int numThreads = conf.getInt(MasterProcedureConstants.MASTER_PROCEDURE_THREADS, Math.max(<a name="line.1261"></a>
-<span class="sourceLineNo">1262</span>      (cpus &gt; 0 ? cpus / 4 : 0), MasterProcedureConstants.DEFAULT_MIN_MASTER_PROCEDURE_THREADS));<a name="line.1262"></a>
-<span class="sourceLineNo">1263</span>    final boolean abortOnCorruption =<a name="line.1263"></a>
-<span class="sourceLineNo">1264</span>      conf.getBoolean(MasterProcedureConstants.EXECUTOR_ABORT_ON_CORRUPTION,<a name="line.1264"></a>
-<span class="sourceLineNo">1265</span>        MasterProcedureConstants.DEFAULT_EXECUTOR_ABORT_ON_CORRUPTION);<a name="line.1265"></a>
-<span class="sourceLineNo">1266</span>    procedureStore.start(numThreads);<a name="line.1266"></a>
-<span class="sourceLineNo">1267</span>    procedureExecutor.start(numThreads, abortOnCorruption);<a name="line.1267"></a>
-<span class="sourceLineNo">1268</span>    procEnv.getRemoteDispatcher().start();<a name="line.1268"></a>
-<span class="sourceLineNo">1269</span>  }<a name="line.1269"></a>
+<span class="sourceLineNo">1251</span>    if (this.walManager != null) {<a name="line.1251"></a>
+<span class="sourceLineNo">1252</span>      this.walManager.stop();<a name="line.1252"></a>
+<span class="sourceLineNo">1253</span>    }<a name="line.1253"></a>
+<span class="sourceLineNo">1254</span>    if (this.fileSystemManager != null) {<a name="line.1254"></a>
+<span class="sourceLineNo">1255</span>      this.fileSystemManager.stop();<a name="line.1255"></a>
+<span class="sourceLineNo">1256</span>    }<a name="line.1256"></a>
+<span class="sourceLineNo">1257</span>    if (this.mpmHost != null) {<a name="line.1257"></a>
+<span class="sourceLineNo">1258</span>      this.mpmHost.stop("server shutting down.");<a name="line.1258"></a>
+<span class="sourceLineNo">1259</span>    }<a name="line.1259"></a>
+<span class="sourceLineNo">1260</span>  }<a name="line.1260"></a>
+<span class="sourceLineNo">1261</span><a name="line.1261"></a>
+<span class="sourceLineNo">1262</span>  private void startProcedureExecutor() throws IOException {<a name="line.1262"></a>
+<span class="sourceLineNo">1263</span>    final MasterProcedureEnv procEnv = new MasterProcedureEnv(this);<a name="line.1263"></a>
+<span class="sourceLineNo">1264</span>    procedureStore = new WALProcedureStore(conf,<a name="line.1264"></a>
+<span class="sourceLineNo">1265</span>        new MasterProcedureEnv.WALStoreLeaseRecovery(this));<a name="line.1265"></a>
+<span class="sourceLineNo">1266</span>    procedureStore.registerListener(new MasterProcedureEnv.MasterProcedureStoreListener(this));<a name="line.1266"></a>
+<span class="sourceLineNo">1267</span>    MasterProcedureScheduler procedureScheduler = procEnv.getProcedureScheduler();<a name="line.1267"></a>
+<span class="sourceLineNo">1268</span>    procedureExecutor = new ProcedureExecutor&lt;&gt;(conf, procEnv, procedureStore, procedureScheduler);<a name="line.1268"></a>
+<span class="sourceLineNo">1269</span>    configurationManager.registerObserver(procEnv);<a name="line.1269"></a>
 <span class="sourceLineNo">1270</span><a name="line.1270"></a>
-<span class="sourceLineNo">1271</span>  private void stopProcedureExecutor() {<a name="line.1271"></a>
-<span class="sourceLineNo">1272</span>    if (procedureExecutor != null) {<a name="line.1272"></a>
-<span class="sourceLineNo">1273</span>      configurationManager.deregisterObserver(procedureExecutor.getEnvironment());<a name="line.1273"></a>
-<span class="sourceLineNo">1274</span>      procedureExecutor.getEnvironment().getRemoteDispatcher().stop();<a name="line.1274"></a>
-<span class="sourceLineNo">1275</span>      procedureExecutor.stop();<a name="line.1275"></a>
-<span class="sourceLineNo">1276</span>      procedureExecutor.join();<a name="line.1276"></a>
-<span class="sourceLineNo">1277</span>      procedureExecutor = null;<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>    if (procedureStore != null) {<a name="line.1280"></a>
-<span class="sourceLineNo">1281</span>      procedureStore.stop(isAborted());<a name="line.1281"></a>
-<span class="sourceLineNo">1282</span>      procedureStore = null;<a name="line.1282"></a>
-<span class="sourceLineNo">1283</span>    }<a name="line.1283"></a>
-<span class="sourceLineNo">1284</span>  }<a name="line.1284"></a>
-<span class="sourceLineNo">1285</span><a name="line.1285"></a>
-<span class="sourceLineNo">1286</span>  private void stopChores() {<a name="line.1286"></a>
-<span class="sourceLineNo">1287</span>    cancelChore(this.expiredMobFileCleanerChore);<a name="line.1287"></a>
-<span class="sourceLineNo">1288</span>    cancelChore(this.mobCompactChore);<a name="line.1288"></a>
-<span class="sourceLineNo">1289</span>    cancelChore(this.balancerChore);<a name="line.1289"></a>
-<span class="sourceLineNo">1290</span>    cancelChore(this.normalizerChore);<a name="line.1290"></a>
-<span class="sourceLineNo">1291</span>    cancelChore(this.clusterStatusChore);<a name="line.1291"></a>
-<span class="sourceLineNo">1292</span>    cancelChore(this.catalogJanitorChore);<a name="line.1292"></a>
-<span class="sourceLineNo">1293</span>    cancelChore(this.clusterStatusPublisherChore);<a name="line.1293"></a>
-<span class="sourceLineNo">1294</span>    if (this.mobCompactThread != null) {<a name="line.1294"></a>
-<span class="sourceLineNo">1295</span>      this.mobCompactThread.close();<a name="line.1295"></a>
-<span class="sourceLineNo">1296</span>    }<a name="line.1296"></a>
-<span class="sourceLineNo">1297</span>    cancelChore(this.clusterStatusPublisherChore);<a name="line.1297"></a>
-<span class="sourceLineNo">1298</span>    cancelChore(this.snapshotQuotaChore);<a name="line.1298"></a>
-<span class="sourceLineNo">1299</span>    cancelChore(this.logCleaner);<a name="line.1299"></a>
-<span class="sourceLineNo">1300</span>    cancelChore(this.hfileCleaner);<a name="line.1300"></a>
-<span class="sourceLineNo">1301</span>    cancelChore(this.replicationBarrierCleaner);<a name="line.1301"></a>
-<span class="sourceLineNo">1302</span>  }<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>   * @return Get remote side's InetAddress<a name="line.1305"></a>
-<span class="sourceLineNo">1306</span>   */<a name="line.1306"></a>
-<span class="sourceLineNo">1307</span>  InetAddress getRemoteInetAddress(final int port,<a name="line.1307"></a>
-<span class="sourceLineNo">1308</span>      final long serverStartCode) throws UnknownHostException {<a name="line.1308"></a>
-<span class="sourceLineNo">1309</span>    // Do it out here in its own little method so can fake an address when<a name="line.1309"></a>
-<span class="sourceLineNo">1310</span>    // mocking up in tests.<a name="line.1310"></a>
-<span class="sourceLineNo">1311</span>    InetAddress ia = RpcServer.getRemoteIp();<a name="line.1311"></a>
-<span class="sourceLineNo">1312</span><a name="line.1312"></a>
-<span class="sourceLineNo">1313</span>    // The call could be from the local regionserver,<a name="line.1313"></a>
-<span class="sourceLineNo">1314</span>    // in which case, there is no remote address.<a name="line.1314"></a>
-<span class="sourceLineNo">1315</span>    if (ia == null &amp;&amp; serverStartCode == startcode) {<a name="line.1315"></a>
-<span class="sourceLineNo">1316</span>      InetSocketAddress isa = rpcServices.getSocketAddress();<a name="line.1316"></a>
-<span class="sourceLineNo">1317</span>      if (isa != null &amp;&amp; isa.getPort() == port) {<a name="line.1317"></a>
-<span class="sourceLineNo">1318</span>        ia = isa.getAddress();<a name="line.1318"></a>
-<span class="sourceLineNo">1319</span>      }<a name="line.1319"></a>
-<span class="sourceLineNo">1320</span>    }<a name="line.1320"></a>
-<span class="sourceLineNo">1321</span>    return ia;<a name="line.1321"></a>
-<span class="sourceLineNo">1322</span>  }<a name="line.1322"></a>
+<span class="sourceLineNo">1271</span>    int cpus = Runtime.getRuntime().availableProcessors();<a name="line.1271"></a>
+<span class="sourceLineNo">1272</span>    final int numThreads = conf.getInt(MasterProcedureConstants.MASTER_PROCEDURE_THREADS, Math.max(<a name="line.1272"></a>
+<span class="sourceLineNo">1273</span>      (cpus &gt; 0 ? cpus / 4 : 0), MasterProcedureConstants.DEFAULT_MIN_MASTER_PROCEDURE_THREADS));<a name="line.1273"></a>
+<span class="sourceLineNo">1274</span>    final boolean abortOnCorruption =<a name="line.1274"></a>
+<span class="sourceLineNo">1275</span>      conf.getBoolean(MasterProcedureConstants.EXECUTOR_ABORT_ON_CORRUPTION,<a name="line.1275"></a>
+<span class="sourceLineNo">1276</span>        MasterProcedureConstants.DEFAULT_EXECUTOR_ABORT_ON_CORRUPTION);<a name="line.1276"></a>
+<span class="sourceLineNo">1277</span>    procedureStore.start(numThreads);<a name="line.1277"></a>
+<span class="sourceLineNo">1278</span>    procedureExecutor.start(numThreads, abortOnCorruption);<a name="line.1278"></a>
+<span class="sourceLineNo">1279</span>    procEnv.getRemoteDispatcher().start();<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>  private void stopProcedureExecutor() {<a name="line.1282"></a>
+<span class="sourceLineNo">1283</span>    if (procedureExecutor != null) {<a name="line.1283"></a>
+<span class="sourceLineNo">1284</span>      configurationManager.deregisterObserver(procedureExecutor.getEnvironment());<a name="line.1284"></a>
+<span class="sourceLineNo">1285</span>      procedureExecutor.getEnvironment().getRemoteDispatcher().stop();<a name="line.1285"></a>
+<span class="sourceLineNo">1286</span>      procedureExecutor.stop();<a name="line.1286"></a>
+<span class="sourceLineNo">1287</span>      procedureExecutor.join();<a name="line.1287"></a>
+<span class="sourceLineNo">1288</span>      procedureExecutor = null;<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>    if (procedureStore != null) {<a name="line.1291"></a>
+<span class="sourceLineNo">1292</span>      procedureStore.stop(isAborted());<a name="line.1292"></a>
+<span class="sourceLineNo">1293</span>      procedureStore = null;<a name="line.1293"></a>
+<span class="sourceLineNo">1294</span>    }<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>  private void stopChores() {<a name="line.1297"></a>
+<span class="sourceLineNo">1298</span>    cancelChore(this.expiredMobFileCleanerChore);<a name="line.1298"></a>
+<span class="sourceLineNo">1299</span>    cancelChore(this.mobCompactChore);<a name="line.1299"></a>
+<span class="sourceLineNo">1300</span>    cancelChore(this.balancerChore);<a name="line.1300"></a>
+<span class="sourceLineNo">1301</span>    cancelChore(this.normalizerChore);<a name="line.1301"></a>
+<span class="sourceLineNo">1302</span>    cancelChore(this.clusterStatusChore);<a name="line.1302"></a>
+<span class="sourceLineNo">1303</span>    cancelChore(this.catalogJanitorChore);<a name="line.1303"></a>
+<span class="sourceLineNo">1304</span>    cancelChore(this.clusterStatusPublisherChore);<a name="line.1304"></a>
+<span class="sourceLineNo">1305</span>    if (this.mobCompactThread != null) {<a name="line.1305"></a>
+<span class="sourceLineNo">1306</span>      this.mobCompactThread.close();<a name="line.1306"></a>
+<span class="sourceLineNo">1307</span>    }<a name="line.1307"></a>
+<span class="sourceLineNo">1308</span>    cancelChore(this.clusterStatusPublisherChore);<a name="line.1308"></a>
+<span class="sourceLineNo">1309</span>    cancelChore(this.snapshotQuotaChore);<a name="line.1309"></a>
+<span class="sourceLineNo">1310</span>    cancelChore(this.logCleaner);<a name="line.1310"></a>
+<span class="sourceLineNo">1311</span>    cancelChore(this.hfileCleaner);<a name="line.1311"></a>
+<span class="sourceLineNo">1312</span>    cancelChore(this.replicationBarrierCleaner);<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>   * @return Get remote side's InetAddress<a name="line.1316"></a>
+<span class="sourceLineNo">1317</span>   */<a name="line.1317"></a>
+<span class="sourceLineNo">1318</span>  InetAddress getRemoteInetAddress(final int port,<a name="line.1318"></a>
+<span class="sourceLineNo">1319</span>      final long serverStartCode) throws UnknownHostException {<a name="line.1319"></a>
+<span class="sourceLineNo">1320</span>    // Do it out here in its own little method so can fake an address when<a name="line.1320"></a>
+<span class="sourceLineNo">1321</span>    // mocking up in tests.<a name="line.1321"></a>
+<span class="sourceLineNo">1322</span>    InetAddress ia = RpcServer.getRemoteIp();<a name="line.1322"></a>
 <span class="sourceLineNo">1323</span><a name="line.1323"></a>
-<span class="sourceLineNo">1324</span>  /**<a name="line.1324"></a>
-<span class="sourceLineNo">1325</span>   * @return Maximum time we should run balancer for<a name="line.1325"></a>
-<span class="sourceLineNo">1326</span>   */<a name="line.1326"></a>
-<span class="sourceLineNo">1327</span>  private int getMaxBalancingTime() {<a name="line.1327"></a>
-<span class="sourceLineNo">1328</span>    int maxBalancingTime = getConfiguration().getInt(HConstants.HBASE_BALANCER_MAX_BALANCING, -1);<a name="line.1328"></a>
-<span class="sourceLineNo">1329</span>    if (maxBalancingTime == -1) {<a name="line.1329"></a>
-<span class="sourceLineNo">1330</span>      // if max balancing time isn't set, defaulting it to period time<a name="line.1330"></a>
-<span class="sourceLineNo">1331</span>      maxBalancingTime = getConfiguration().getInt(HConstants.HBASE_BALANCER_PERIOD,<a name="line.1331"></a>
-<span class="sourceLineNo">1332</span>        HConstants.DEFAULT_HBASE_BALANCER_PERIOD);<a name="line.1332"></a>
-<span class="sourceLineNo">1333</span>    }<a name="line.1333"></a>
-<span class="sourceLineNo">1334</span>    return maxBalancingTime;<a name="line.1334"></a>
-<span class="sourceLineNo">1335</span>  }<a name="line.1335"></a>
-<span class="sourceLineNo">1336</span><a name="line.1336"></a>
-<span class="sourceLineNo">1337</span>  /**<a name="line.1337"></a>
-<span class="sourceLineNo">1338</span>   * @return Maximum number of regions in transition<a name="line.1338"></a>
-<span class="sourceLineNo">1339</span>   */<a name="line.1339"></a>
-<span class="sourceLineNo">1340</span>  private int getMaxRegionsInTransition() {<a name="line.1340"></a>
-<span class="sourceLineNo">1341</span>    int numRegions = this.assignmentManager.getRegionStates().getRegionAssignments().size();<a name="line.1341"></a>
-<span class="sourceLineNo">1342</span>    return Math.max((int) Math.floor(numRegions * this.maxRitPercent), 1);<a name="line.1342"></a>
-<span class="sourceLineNo">1343</span>  }<a name="line.1343"></a>
-<span class="sourceLineNo">1344</span><a name="line.1344"></a>
-<span class="sourceLineNo">1345</span>  /**<a name="line.1345"></a>
-<span class="sourceLineNo">1346</span>   * It first sleep to the next balance plan start time. Meanwhile, throttling by the max<a name="line.1346"></a>
-<span class="sourceLineNo">1347</span>   * number regions in transition to protect availability.<a name="line.1347"></a>
-<span class="sourceLineNo">1348</span>   * @param nextBalanceStartTime The next balance plan start time<a name="line.1348"></a>
-<span class="sourceLineNo">1349</span>   * @param maxRegionsInTransition max number of regions in transition<a name="line.1349"></a>
-<span class="sourceLineNo">1350</span>   * @param cutoffTime when to exit balancer<a name="line.1350"></a>
-<span class="sourceLineNo">1351</span>   */<a name="line.1351"></a>
-<span class="sourceLineNo">1352</span>  private void balanceThrottling(long nextBalanceStartTime, int maxRegionsInTransition,<a name="line.1352"></a>
-<span class="sourceLineNo">1353</span>      long cutoffTime) {<a name="line.1353"></a>
-<span class="sourceLineNo">1354</span>    boolean interrupted = false;<a name="line.1354"></a>
+<span class="sourceLineNo">1324</span>    // The call could be from the local regionserver,<a name="line.1324"></a>
+<span class="sourceLineNo">1325</span>    // in which case, there is no remote address.<a name="line.1325"></a>
+<span class="sourceLineNo">1326</span>    if (ia == null &amp;&amp; serverStartCode == startcode) {<a name="line.1326"></a>
+<span class="sourceLineNo">1327</span>      InetSocketAddress isa = rpcServices.getSocketAddress();<a name="line.1327"></a>
+<span class="sourceLineNo">1328</span>      if (isa != null &amp;&amp; isa.getPort() == port) {<a name="line.1328"></a>
+<span class="sourceLineNo">1329</span>        ia = isa.getAddress();<a name="line.1329"></a>
+<span class="sourceLineNo">1330</span>      }<a name="line.1330"></a>
+<span class="sourceLineNo">1331</span>    }<a name="line.1331"></a>
+<span class="sourceLineNo">1332</span>    return ia;<a name="line.1332"></a>
+<span class="sourceLineNo">1333</span>  }<a name="line.1333"></a>
+<span class="sourceLineNo">1334</span><a name="line.1334"></a>
+<span class="sourceLineNo">1335</span>  /**<a name="line.1335"></a>
+<span class="sourceLineNo">1336</span>   * @return Maximum time we should run balancer for<a name="line.1336"></a>
+<span class="sourceLineNo">1337</span>   */<a name="line.1337"></a>
+<span class="sourceLineNo">1338</span>  private int getMaxBalancingTime() {<a name="line.1338"></a>
+<span class="sourceLineNo">1339</span>    int maxBalancingTime = getConfiguration().getInt(HConstants.HBASE_BALANCER_MAX_BALANCING, -1);<a name="line.1339"></a>
+<span class="sourceLineNo">1340</span>    if (maxBalancingTime == -1) {<a name="line.1340"></a>
+<span class="sourceLineNo">1341</span>      // if max balancing time isn't set, defaulting it to period time<a name="line.1341"></a>
+<span class="sourceLineNo">1342</span>      maxBalancingTime = getConfiguration().getInt(HConstants.HBASE_BALANCER_PERIOD,<a name="line.1342"></a>
+<span class="sourceLineNo">1343</span>        HConstants.DEFAULT_HBASE_BALANCER_PERIOD);<a name="line.1343"></a>
+<span class="sourceLineNo">1344</span>    }<a name="line.1344"></a>
+<span class="sourceLineNo">1345</span>    return maxBalancingTime;<a name="line.1345"></a>
+<span class="sourceLineNo">1346</span>  }<a name="line.1346"></a>
+<span class="sourceLineNo">1347</span><a name="line.1347"></a>
+<span class="sourceLineNo">1348</span>  /**<a name="line.1348"></a>
+<span class="sourceLineNo">1349</span>   * @return Maximum number of regions in transition<a name="line.1349"></a>
+<span class="sourceLineNo">1350</span>   */<a name="line.1350"></a>
+<span class="sourceLineNo">1351</span>  private int getMaxRegionsInTransition() {<a name="line.1351"></a>
+<span class="sourceLineNo">1352</span>    int numRegions = this.assignmentManager.getRegionStates().getRegionAssignments().size();<a name="line.1352"></a>
+<span class="sourceLineNo">1353</span>    return Math.max((int) Math.floor(numRegions * this.maxRitPercent), 1);<a name="line.1353"></a>
+<span class="sourceLineNo">1354</span>  }<a name="line.1354"></a>
 <span class="sourceLineNo">1355</span><a name="line.1355"></a>
-<span class="sourceLineNo">1356</span>    // Sleep to next balance plan start time<a name="line.1356"></a>
-<span class="sourceLineNo">1357</span>    // But if there are zero regions in transition, it can skip sleep to speed up.<a name="line.1357"></a>
-<span class="sourceLineNo">1358</span>    while (!interrupted &amp;&amp; System.currentTimeMillis() &lt; nextBalanceStartTime<a name="line.1358"></a>
-<span class="sourceLineNo">1359</span>        &amp;&amp; this.assignmentManager.getRegionStates().hasRegionsInTransition()) {<a name="line.1359"></a>
-<span class="sourceLineNo">1360</span>      try {<a name="line.1360"></a>
-<span class="sourceLineNo">1361</span>        Thread.sleep(100);<a name="line.1361"></a>
-<span class="sourceLineNo">1362</span>      } catch (InterruptedException ie) {<a name="line.1362"></a>
-<span class="sourceLineNo">1363</span>        interrupted = true;<a name="line.1363"></a>
-<span class="sourceLineNo">1364</span>      }<a name="line.1364"></a>
-<span class="sourceLineNo">1365</span>    }<a name="line.1365"></a>
+<span class="sourceLineNo">1356</span>  /**<a name="line.1356"></a>
+<span class="sourceLineNo">1357</span>   * It first sleep to the next balance plan start time. Meanwhile, throttling by the max<a name="line.1357"></a>
+<span class="sourceLineNo">1358</span>   * number regions in transition to protect availability.<a name="line.1358"></a>
+<span class="sourceLineNo">1359</span>   * @param nextBalanceStartTime The next balance plan start time<a name="line.1359"></a>
+<span class="sourceLineNo">1360</span>   * @param maxRegionsInTransition max number of regions in transition<a name="line.1360"></a>
+<span class="sourceLineNo">1361</span>   * @param cutoffTime when to exit balancer<a name="line.1361"></a>
+<span class="sourceLineNo">1362</span>   */<a name="line.1362"></a>
+<span class="sourceLineNo">1363</span>  private void balanceThrottling(long nextBalanceStartTime, int maxRegionsInTransition,<a name="line.1363"></a>
+<span class="sourceLineNo">1364</span>      long cutoffTime) {<a name="line.1364"></a>
+<span class="sourceLineNo">1365</span>    boolean interrupted = false;<a name="line.1365"></a>
 <span class="sourceLineNo">1366</span><a name="line.1366"></a>
-<span class="sourceLineNo">1367</span>    // Throttling by max number regions in transition<a name="line.1367"></a>
-<span class="sourceLineNo">1368</span>    while (!interrupted<a name="line.1368"></a>
-<span class="sourceLineNo">1369</span>        &amp;&amp; maxRegionsInTransition &gt; 0<a name="line.1369"></a>
-<span class="sourceLineNo">1370</span>        &amp;&amp; this.assignmentManager.getRegionStates().getRegionsInTransitionCount()<a name="line.1370"></a>
-<span class="sourceLineNo">1371</span>        &gt;= maxRegionsInTransition &amp;&amp; System.currentTimeMillis() &lt;= cutoffTime) {<a name="line.1371"></a>
-<span class="sourceLineNo">1372</span>      try {<a name="line.1372"></a>
-<span class="sourceLineNo">1373</span>        // sleep if the number of regions in transition exceeds the limit<a name="line.1373"></a>
-<span class="sourceLineNo">1374</span>        Thread.sleep(100);<a name="line.1374"></a>
-<span class="sourceLineNo">1375</span>      } catch (InterruptedException ie) {<a name="line.1375"></a>
-<span class="sourceLineNo">1376</span>        interrupted = true;<a name="line.1376"></a>
-<span class="sourceLineNo">1377</span>      }<a name="line.1377"></a>
-<span class="sourceLineNo">1378</span>    }<a name="line.1378"></a>
-<span class="sourceLineNo">1379</span><a name="line.1379"></a>
-<span class="sourceLineNo">1380</span>    if (interrupted) Thread.currentThread().interrupt();<a name="line.1380"></a>
-<span class="sourceLineNo">1381</span>  }<a name="line.1381"></a>
-<span class="sourceLineNo">1382</span><a name="line.1382"></a>
-<span class="sourceLineNo">1383</span>  public boolean balance() throws IOException {<a name="line.1383"></a>
-<span class="sourceLineNo">1384</span>    return balance(false);<a name="line.1384"></a>
-<span class="sourceLineNo">1385</span>  }<a name="line.1385"></a>
-<span class="sourceLineNo">1386</span><a name="line.1386"></a>
-<span class="sourceLineNo">1387</span>  public boolean balance(boolean force) throws IOException {<a name="line.1387"></a>
-<span class="sourceLineNo">1388</span>    // if master not initialized, don't run balancer.<a name="line.1388"></a>
-<span class="sourceLineNo">1389</span>    if (!isInitialized()) {<a name="line.1389"></a>
-<span class="sourceLineNo">1390</span>      LOG.debug("Master has not been initialized, don't run balancer.");<a name="line.1390"></a>
-<span class="sourceLineNo">1391</span>      return false;<a name="line.1391"></a>
-<span class="sourceLineNo">1392</span>    }<a name="line.1392"></a>
+<span class="sourceLineNo">1367</span>    // Sleep to next balance plan start time<a name="line.1367"></a>
+<span class="sourceLineNo">1368</span>    // But if there are zero regions in transition, it can skip sleep to speed up.<a name="line.1368"></a>
+<span class="sourceLineNo">1369</span>    while (!interrupted &amp;&amp; System.currentTimeMillis() &lt; nextBalanceStartTime<a name="line.1369"></a>
+<span class="sourceLineNo">1370</span>        &amp;&amp; this.assignmentManager.getRegionStates().hasRegionsInTransition()) {<a name="line.1370"></a>
+<span class="sourceLineNo">1371</span>      try {<a name="line.1371"></a>
+<span class="sourceLineNo">1372</span>        Thread.sleep(100);<a name="line.1372"></a>
+<span class="sourceLineNo">1373</span>      } catch (InterruptedException ie) {<a name="line.1373"></a>
+<span class="sourceLineNo">1374</span>        interrupted = true;<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><a name="line.1377"></a>
+<span class="sourceLineNo">1378</span>    // Throttling by max number regions in transition<a name="line.1378"></a>
+<span class="sourceLineNo">1379</span>    while (!interrupted<a name="line.1379"></a>
+<span class="sourceLineNo">1380</span>        &amp;&amp; maxRegionsInTransition &gt; 0<a name="line.1380"></a>
+<span class="sourceLineNo">1381</span>        &amp;&amp; this.assignmentManager.getRegionStates().getRegionsInTransitionCount()<a name="line.1381"></a>
+<span class="sourceLineNo">1382</span>        &gt;= maxRegionsInTransition &amp;&amp; System.currentTimeMillis() &lt;= cutoffTime) {<a name="line.1382"></a>
+<span class="sourceLineNo">1383</span>      try {<a name="line.1383"></a>
+<span class="sourceLineNo">1384</span>        // sleep if the number of regions in transition exceeds the limit<a name="line.1384"></a>
+<span class="sourceLineNo">1385</span>        Thread.sleep(100);<a name="line.1385"></a>
+<span class="sourceLineNo">1386</span>      } catch (InterruptedException ie) {<a name="line.1386"></a>
+<span class="sourceLineNo">1387</span>        interrupted = true;<a name="line.1387"></a>
+<span class="sourceLineNo">1388</span>      }<a name="line.1388"></a>
+<span class="sourceLineNo">1389</span>    }<a name="line.1389"></a>
+<span class="sourceLineNo">1390</span><a name="line.1390"></a>
+<span class="sourceLineNo">1391</span>    if (interrupted) Thread.currentThread().interrupt();<a name="line.1391"></a>
+<span class="sourceLineNo">1392</span>  }<a name="line.1392"></a>
 <span class="sourceLineNo">1393</span><a name="line.1393"></a>
-<span class="sourceLineNo">1394</span>    if (isInMaintenanceMode()) {<a name="line.1394"></a>
-<span class="sourceLineNo">1395</span>      LOG.info("Master is in maintenanceMode mode, don't run balancer.");<a name="line.1395"></a>
-<span class="sourceLineNo">1396</span>      return false;<a name="line.1396"></a>
-<span class="sourceLineNo">1397</span>    }<a name="line.1397"></a>
-<span class="sourceLineNo">1398</span><a name="line.1398"></a>
-<span class="sourceLineNo">1399</span>    int maxRegionsInTransition = getMaxRegionsInTransition();<a name="line.1399"></a>
-<span class="sourceLineNo">1400</span>    synchronized (this.balancer) {<a name="line.1400"></a>
-<span class="sourceLineNo">1401</span>      // If balance not true, don't run balancer.<a name="line.1401"></a>
-<span class="sourceLineNo">1402</span>      if (!this.loadBalancerTracker.isBalancerOn()) return false;<a name="line.1402"></a>
-<span class="sourceLineNo">1403</span>        // Only allow one balance run at at time.<a name="line.1403"></a>
-<span class="sourceLineNo">1404</span>      if (this.assignmentManager.hasRegionsInTransition()) {<a name="line.1404"></a>
-<span class="sourceLineNo">1405</span>        List&lt;RegionStateNode&gt; regionsInTransition = assignmentManager.getRegionsInTransition();<a name="line.1405"></a>
-<span class="sourceLineNo">1406</span>        // if hbase:meta region is in transition, result of assignment cannot be recorded<a name="line.1406"></a>
-<span class="sourceLineNo">1407</span>        // ignore the force flag in that case<a name="line.1407"></a>
-<span class="sourceLineNo">1408</span>        boolean metaInTransition = assignmentManager.isMetaRegionInTransition();<a name="line.1408"></a>
-<span class="sourceLineNo">1409</span>        String prefix = force &amp;&amp; !metaInTransition ? "R" : "Not r";<a name="line.1409"></a>
-<span class="sourceLineNo">1410</span>        List&lt;RegionStateNode&gt; toPrint = regionsInTransition;<a name="line.1410"></a>
-<span class="sourceLineNo">1411</span>        int max = 5;<a name="line.1411"></a>
-<span class="sourceLineNo">1412</span>        boolean truncated = false;<a name="line.1412"></a>
-<span class="sourceLineNo">1413</span>        if (regionsInTransition.size() &gt; max) {<a name="line.1413"></a>
-<span class="sourceLineNo">1414</span>          toPrint = regionsInTransition.subList(0, max);<a name="line.1414"></a>
-<span class="sourceLineNo">1415</span>          truncated = true;<a name="line.1415"></a>
-<span class="sourceLineNo">1416</span>        }<a name="line.1416"></a>
-<span class="sourceLineNo">1417</span>        LOG.info(prefix + "unning balancer because " + regionsInTransition.size() +<a name="line.1417"></a>
-<span class="sourceLineNo">1418</span>          " region(s) in transition: " + toPrint + (truncated? "(truncated list)": ""));<a name="line.1418"></a>
-<span class="sourceLineNo">1419</span>        if (!force || metaInTransition) return false;<a name="line.1419"></a>
-<span class="sourceLineNo">1420</span>      }<a name="line.1420"></a>
-<span class="sourceLineNo">1421</span>      if (this.serverManager.areDeadServersInProgress()) {<a name="line.1421"></a>
-<span class="sourceLineNo">1422</span>        LOG.info("Not running balancer because processing dead regionserver(s): " +<a name="line.1422"></a>
-<span class="sourceLineNo">1423</span>          this.serverManager.getDeadServers());<a name="line.1423"></a>
-<span class="sourceLineNo">1424</span>        return false;<a name="line.1424"></a>
-<span class="sourceLineNo">1425</span>      }<a name="line.1425"></a>
-<span class="sourceLineNo">1426</span><a name="line.1426"></a>
-<span class="sourceLineNo">1427</span>      if (this.cpHost != null) {<a name="line.1427"></a>
-<span class="sourceLineNo">1428</span>        try {<a name="line.1428"></a>
-<span class="sourceLineNo">1429</span>          if (this.cpHost.preBalance()) {<a name="line.1429"></a>
-<span class="sourceLineNo">1430</span>            LOG.debug("Coprocessor bypassing balancer request");<a name="line.1430"></a>
-<span class="sourceLineNo">1431</span>            return false;<a name="line.1431"></a>
-<span class="sourceLineNo">1432</span>          }<a name="line.1432"></a>
-<span class="sourceLineNo">1433</span>        } catch (IOException ioe) {<a name="line.1433"></a>
-<span class="sourceLineNo">1434</span>          LOG.error("Error invoking master coprocessor preBalance()", ioe);<a name="line.1434"></a>
-<span class="sourceLineNo">1435</span>          return false;<a name="line.1435"></a>
-<span class="sourceLineNo">1436</span>        }<a name="line.1436"></a>
-<span class="sourceLineNo">1437</span>      }<a name="line.1437"></a>
-<span class="sourceLineNo">1438</span><a name="line.1438"></a>
-<span class="sourceLineNo">1439</span>      boolean isByTable = getConfiguration().getBoolean("hbase.master.loadbalance.bytable", false);<a name="line.1439"></a>
-<span class="sourceLineNo">1440</span>      Map&lt;TableName, Map&lt;ServerName, List&lt;RegionInfo&gt;&gt;&gt; assignmentsByTable =<a name="line.1440"></a>
-<span class="sourceLineNo">1441</span>        this.assignmentManager.getRegionStates().getAssignmentsByTable(!isByTable);<a name="line.1441"></a>
-<span class="sourceLineNo">1442</span><a name="line.1442"></a>
-<span class="sourceLineNo">1443</span>      List&lt;RegionPlan&gt; plans = new ArrayList&lt;&gt;();<a name="line.1443"></a>
-<span class="sourceLineNo">1444</span><a name="line.1444"></a>
-<span class="sourceLineNo">1445</span>      //Give the balancer the current cluster state.<a name="line.1445"></a>
-<span class="sourceLineNo">1446</span>      this.balancer.setClusterMetrics(getClusterMetricsWithoutCoprocessor());<a name="line.1446"></a>
-<span class="sourceLineNo">1447</span>      this.balancer.setClusterLoad(assignmentsByTable);<a name="line.1447"></a>
-<span class="sourceLineNo">1448</span><a name="line.1448"></a>
-<span class="sourceLineNo">1449</span>      for (Map&lt;ServerName, List&lt;RegionInfo&gt;&gt; serverMap : assignmentsByTable.values()) {<a name="line.1449"></a>
-<span class="sourceLineNo">1450</span>        serverMap.keySet().removeAll(this.serverManager.getDrainingServersList());<a name="line.1450"></a>
-<span class="sourceLineNo">1451</span>      }<a name="line.1451"></a>
-<span class="sourceLineNo">1452</span>      for (Entry&lt;TableName, Map&lt;ServerName, List&lt;RegionInfo&gt;&gt;&gt; e : assignmentsByTable.entrySet()) {<a name="line.1452"></a>
-<span class="sourceLineNo">1453</span>        List&lt;RegionPlan&gt; partialPlans = this.balancer.balanceCluster(e.getKey(), e.getValue());<a name="line.1453"></a>
-<span class="sourceLineNo">1454</span>        if (partialPlans != null) plans.addAll(partialPlans);<a name="line.1454"></a>
-<span class="sourceLineNo">1455</span>      }<a name="line.1455"></a>
-<span class="sourceLineNo">1456</span><a name="line.1456"></a>
-<span class="sourceLineNo">1457</span>      long balanceStartTime = System.currentTimeMillis();<a name="line.1457"></a>
-<span class="sourceLineNo">1458</span>      long cutoffTime = balanceStartTime + this.maxBlancingTime;<a name="line.1458"></a>
-<span class="sourceLineNo">1459</span>      int rpCount = 0;  // number of RegionPlans balanced so far<a name="line.1459"></a>
-<span class="sourceLineNo">1460</span>      if (plans != null &amp;&amp; !plans.isEmpty()) {<a name="line.1460"></a>
-<span class="sourceLineNo">1461</span>        int balanceInterval = this.maxBlancingTime / plans.size();<a name="line.1461"></a>
-<span class="sourceLineNo">1462</span>        LOG.info("Balancer plans size is " + plans.size() + ", the balance interval is "<a name="line.1462"></a>
-<span class="sourceLineNo">1463</span>            + balanceInterval + " ms, and the max number regions in transition is "<a name="line.1463"></a>
-<span class="sourceLineNo">1464</span>            + maxRegionsInTransition);<a name="line.1464"></a>
-<span class="sourceLineNo">1465</span><a name="line.1465"></a>
-<span class="sourceLineNo">1466</span>        for (RegionPlan plan: plans) {<a name="line.1466"></a>
-<span class="sourceLineNo">1467</span>          LOG.info("balance " + plan);<a name="line.1467"></a>
-<span class="sourceLineNo">1468</span>          //TODO: bulk assign<a name="line.1468"></a>
-<span class="sourceLineNo">1469</span>          this.assignmentManager.moveAsync(plan);<a name="line.1469"></a>
-<span class="sourceLineNo">1470</span>          rpCount++;<a name="line.1470"></a>
-<span class="sourceLineNo">1471</span><a name="line.1471"></a>
-<span class="sourceLineNo">1472</span>          balanceThrottling(balanceStartTime + rpCount * balanceInterval, maxRegionsInTransition,<a name="line.1472"></a>
-<span class="sourceLineNo">1473</span>            cutoffTime);<a name="line.1473"></a>
-<span class="sourceLineNo">1474</span><a name="line.1474"></a>
-<span class="sourceLineNo">1475</span>          // if performing next balance exceeds cutoff time, exit the loop<a name="line.1475"></a>
-<span class="sourceLineNo">1476</span>          if (rpCount &lt; plans.size() &amp;&amp; System.currentTimeMillis() &gt; cutoffTime) {<a name="line.1476"></a>
-<span class="sourceLineNo">1477</span>            // TODO: After balance, there should not be a cutoff time (keeping it as<a name="line.1477"></a>
-<span class="sourceLineNo">1478</span>            // a security net for now)<a name="line.1478"></a>
-<span class="sourceLineNo">1479</span>            LOG.debug("No more balancing till next balance run; maxBalanceTime="<a name="line.1479"></a>
-<span class="sourceLineNo">1480</span>                + this.maxBlancingTime);<a name="line.1480"></a>
-<span class="sourceLineNo">1481</span>            break;<a name="line.1481"></a>
-<span class="sourceLineNo">1482</span>          }<a name="line.1482"></a>
-<span class="sourceLineNo">1483</span>        }<a name="line.1483"></a>
-<span class="sourceLineNo">1484</span>      }<a name="line.1484"></a>
+<span class="sourceLineNo">1394</span>  public boolean balance() throws IOException {<a name="line.1394"></a>
+<span class="sourceLineNo">1395</span>    return balance(false);<a name="line.1395"></a>
+<span class="sourceLineNo">1396</span>  }<a name="line.1396"></a>
+<span class="sourceLineNo">1397</span><a name="line.1397"></a>
+<span class="sourceLineNo">1398</span>  public boolean balance(boolean force) throws IOException {<a name="line.1398"></a>
+<span class="sourceLineNo">1399</span>    // if master not initialized, don't run balancer.<a name="line.1399"></a>
+<span class="sourceLineNo">1400</span>    if (!isInitialized()) {<a name="line.1400"></a>
+<span class="sourceLineNo">1401</span>      LOG.debug("Master has not been initialized, don't run balancer.");<a name="line.1401"></a>
+<span class="sourceLineNo">1402</span>      return false;<a name="line.1402"></a>
+<span class="sourceLineNo">1403</span>    }<a name="line.1403"></a>
+<span class="sourceLineNo">1404</span><a name="line.1404"></a>
+<span class="sourceLineNo">1405</span>    if (isInMaintenanceMode()) {<a name="line.1405"></a>
+<span class="sourceLineNo">1406</span>      LOG.info("Master is in maintenanceMode mode, don't run balancer.");<a name="line.1406"></a>
+<span class="sourceLineNo">1407</span>      return false;<a name="line.1407"></a>
+<span class="sourceLineNo">1408</span>    }<a name="line.1408"></a>
+<span class="sourceLineNo">1409</span><a name="line.1409"></a>
+<span class="sourceLineNo">1410</span>    int maxRegionsInTransition = getMaxRegionsInTransition();<a name="line.1410"></a>
+<span class="sourceLineNo">1411</span>    synchronized (this.balancer) {<a name="line.1411"></a>
+<span class="sourceLineNo">1412</span>      /

<TRUNCATED>

[05/29] hbase-site git commit: Published site at 477f9fdb32873387231c5fbbff130ba8bf7b5d68.

Posted by gi...@apache.org.
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/621479e1/license.html
----------------------------------------------------------------------
diff --git a/license.html b/license.html
index 6c82745..8735e61 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="20180524" />
+    <meta name="Date-Revision-yyyymmdd" content="20180525" />
     <meta http-equiv="Content-Language" content="en" />
     <title>Apache HBase &#x2013; Project Licenses</title>
     <link rel="stylesheet" href="./css/apache-maven-fluido-1.5-HBASE.min.css" />
@@ -276,7 +276,209 @@
 <h2><a name="Project_Licenses"></a>Project Licenses</h2><a name="Project_Licenses"></a>
 <div class="section">
 <h3><a name="Apache_License_Version_2.0"></a>Apache License, Version 2.0</h3><a name="Apache_License_Version_2.0"></a>
-<p>Can't read the url [https://www.apache.org/licenses/LICENSE-2.0.txt] : connect timed out</p></div></div>
+<div class="source"><pre class="prettyprint">
+                                 Apache License
+                           Version 2.0, January 2004
+                        http://www.apache.org/licenses/
+
+   TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
+
+   1. Definitions.
+
+      &quot;License&quot; shall mean the terms and conditions for use, reproduction,
+      and distribution as defined by Sections 1 through 9 of this document.
+
+      &quot;Licensor&quot; shall mean the copyright owner or entity authorized by
+      the copyright owner that is granting the License.
+
+      &quot;Legal Entity&quot; shall mean the union of the acting entity and all
+      other entities that control, are controlled by, or are under common
+      control with that entity. For the purposes of this definition,
+      &quot;control&quot; means (i) the power, direct or indirect, to cause the
+      direction or management of such entity, whether by contract or
+      otherwise, or (ii) ownership of fifty percent (50%) or more of the
+      outstanding shares, or (iii) beneficial ownership of such entity.
+
+      &quot;You&quot; (or &quot;Your&quot;) shall mean an individual or Legal Entity
+      exercising permissions granted by this License.
+
+      &quot;Source&quot; form shall mean the preferred form for making modifications,
+      including but not limited to software source code, documentation
+      source, and configuration files.
+
+      &quot;Object&quot; form shall mean any form resulting from mechanical
+      transformation or translation of a Source form, including but
+      not limited to compiled object code, generated documentation,
+      and conversions to other media types.
+
+      &quot;Work&quot; shall mean the work of authorship, whether in Source or
+      Object form, made available under the License, as indicated by a
+      copyright notice that is included in or attached to the work
+      (an example is provided in the Appendix below).
+
+      &quot;Derivative Works&quot; shall mean any work, whether in Source or Object
+      form, that is based on (or derived from) the Work and for which the
+      editorial revisions, annotations, elaborations, or other modifications
+      represent, as a whole, an original work of authorship. For the purposes
+      of this License, Derivative Works shall not include works that remain
+      separable from, or merely link (or bind by name) to the interfaces of,
+      the Work and Derivative Works thereof.
+
+      &quot;Contribution&quot; shall mean any work of authorship, including
+      the original version of the Work and any modifications or additions
+      to that Work or Derivative Works thereof, that is intentionally
+      submitted to Licensor for inclusion in the Work by the copyright owner
+      or by an individual or Legal Entity authorized to submit on behalf of
+      the copyright owner. For the purposes of this definition, &quot;submitted&quot;
+      means any form of electronic, verbal, or written communication sent
+      to the Licensor or its representatives, including but not limited to
+      communication on electronic mailing lists, source code control systems,
+      and issue tracking systems that are managed by, or on behalf of, the
+      Licensor for the purpose of discussing and improving the Work, but
+      excluding communication that is conspicuously marked or otherwise
+      designated in writing by the copyright owner as &quot;Not a Contribution.&quot;
+
+      &quot;Contributor&quot; shall mean Licensor and any individual or Legal Entity
+      on behalf of whom a Contribution has been received by Licensor and
+      subsequently incorporated within the Work.
+
+   2. Grant of Copyright License. Subject to the terms and conditions of
+      this License, each Contributor hereby grants to You a perpetual,
+      worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+      copyright license to reproduce, prepare Derivative Works of,
+      publicly display, publicly perform, sublicense, and distribute the
+      Work and such Derivative Works in Source or Object form.
+
+   3. Grant of Patent License. Subject to the terms and conditions of
+      this License, each Contributor hereby grants to You a perpetual,
+      worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+      (except as stated in this section) patent license to make, have made,
+      use, offer to sell, sell, import, and otherwise transfer the Work,
+      where such license applies only to those patent claims licensable
+      by such Contributor that are necessarily infringed by their
+      Contribution(s) alone or by combination of their Contribution(s)
+      with the Work to which such Contribution(s) was submitted. If You
+      institute patent litigation against any entity (including a
+      cross-claim or counterclaim in a lawsuit) alleging that the Work
+      or a Contribution incorporated within the Work constitutes direct
+      or contributory patent infringement, then any patent licenses
+      granted to You under this License for that Work shall terminate
+      as of the date such litigation is filed.
+
+   4. Redistribution. You may reproduce and distribute copies of the
+      Work or Derivative Works thereof in any medium, with or without
+      modifications, and in Source or Object form, provided that You
+      meet the following conditions:
+
+      (a) You must give any other recipients of the Work or
+          Derivative Works a copy of this License; and
+
+      (b) You must cause any modified files to carry prominent notices
+          stating that You changed the files; and
+
+      (c) You must retain, in the Source form of any Derivative Works
+          that You distribute, all copyright, patent, trademark, and
+          attribution notices from the Source form of the Work,
+          excluding those notices that do not pertain to any part of
+          the Derivative Works; and
+
+      (d) If the Work includes a &quot;NOTICE&quot; text file as part of its
+          distribution, then any Derivative Works that You distribute must
+          include a readable copy of the attribution notices contained
+          within such NOTICE file, excluding those notices that do not
+          pertain to any part of the Derivative Works, in at least one
+          of the following places: within a NOTICE text file distributed
+          as part of the Derivative Works; within the Source form or
+          documentation, if provided along with the Derivative Works; or,
+          within a display generated by the Derivative Works, if and
+          wherever such third-party notices normally appear. The contents
+          of the NOTICE file are for informational purposes only and
+          do not modify the License. You may add Your own attribution
+          notices within Derivative Works that You distribute, alongside
+          or as an addendum to the NOTICE text from the Work, provided
+          that such additional attribution notices cannot be construed
+          as modifying the License.
+
+      You may add Your own copyright statement to Your modifications and
+      may provide additional or different license terms and conditions
+      for use, reproduction, or distribution of Your modifications, or
+      for any such Derivative Works as a whole, provided Your use,
+      reproduction, and distribution of the Work otherwise complies with
+      the conditions stated in this License.
+
+   5. Submission of Contributions. Unless You explicitly state otherwise,
+      any Contribution intentionally submitted for inclusion in the Work
+      by You to the Licensor shall be under the terms and conditions of
+      this License, without any additional terms or conditions.
+      Notwithstanding the above, nothing herein shall supersede or modify
+      the terms of any separate license agreement you may have executed
+      with Licensor regarding such Contributions.
+
+   6. Trademarks. This License does not grant permission to use the trade
+      names, trademarks, service marks, or product names of the Licensor,
+      except as required for reasonable and customary use in describing the
+      origin of the Work and reproducing the content of the NOTICE file.
+
+   7. Disclaimer of Warranty. Unless required by applicable law or
+      agreed to in writing, Licensor provides the Work (and each
+      Contributor provides its Contributions) on an &quot;AS IS&quot; BASIS,
+      WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
+      implied, including, without limitation, any warranties or conditions
+      of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
+      PARTICULAR PURPOSE. You are solely responsible for determining the
+      appropriateness of using or redistributing the Work and assume any
+      risks associated with Your exercise of permissions under this License.
+
+   8. Limitation of Liability. In no event and under no legal theory,
+      whether in tort (including negligence), contract, or otherwise,
+      unless required by applicable law (such as deliberate and grossly
+      negligent acts) or agreed to in writing, shall any Contributor be
+      liable to You for damages, including any direct, indirect, special,
+      incidental, or consequential damages of any character arising as a
+      result of this License or out of the use or inability to use the
+      Work (including but not limited to damages for loss of goodwill,
+      work stoppage, computer failure or malfunction, or any and all
+      other commercial damages or losses), even if such Contributor
+      has been advised of the possibility of such damages.
+
+   9. Accepting Warranty or Additional Liability. While redistributing
+      the Work or Derivative Works thereof, You may choose to offer,
+      and charge a fee for, acceptance of support, warranty, indemnity,
+      or other liability obligations and/or rights consistent with this
+      License. However, in accepting such obligations, You may act only
+      on Your own behalf and on Your sole responsibility, not on behalf
+      of any other Contributor, and only if You agree to indemnify,
+      defend, and hold each Contributor harmless for any liability
+      incurred by, or claims asserted against, such Contributor by reason
+      of your accepting any such warranty or additional liability.
+
+   END OF TERMS AND CONDITIONS
+
+   APPENDIX: How to apply the Apache License to your work.
+
+      To apply the Apache License to your work, attach the following
+      boilerplate notice, with the fields enclosed by brackets &quot;[]&quot;
+      replaced with your own identifying information. (Don't include
+      the brackets!)  The text should be enclosed in the appropriate
+      comment syntax for the file format. We also recommend that a
+      file or class name and description of purpose be included on the
+      same &quot;printed page&quot; as the copyright notice for easier
+      identification within third-party archives.
+
+   Copyright [yyyy] [name of copyright owner]
+
+   Licensed under the Apache License, Version 2.0 (the &quot;License&quot;);
+   you may not use this file except in compliance with the License.
+   You may obtain a copy of the License at
+
+       http://www.apache.org/licenses/LICENSE-2.0
+
+   Unless required by applicable law or agreed to in writing, software
+   distributed under the License is distributed on an &quot;AS IS&quot; BASIS,
+   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+   See the License for the specific language governing permissions and
+   limitations under the License.
+</pre></div></div></div>
                   </div>
           </div>
 
@@ -289,7 +491,7 @@
                         <a href="https://www.apache.org/">The Apache Software Foundation</a>.
             All rights reserved.      
                     
-                  <li id="publishDate" class="pull-right">Last Published: 2018-05-24</li>
+                  <li id="publishDate" class="pull-right">Last Published: 2018-05-25</li>
             </p>
                 </div>
 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/621479e1/mail-lists.html
----------------------------------------------------------------------
diff --git a/mail-lists.html b/mail-lists.html
index 9781708..83aade2 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="20180524" />
+    <meta name="Date-Revision-yyyymmdd" content="20180525" />
     <meta http-equiv="Content-Language" content="en" />
     <title>Apache HBase &#x2013; Project Mailing Lists</title>
     <link rel="stylesheet" href="./css/apache-maven-fluido-1.5-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-05-24</li>
+                  <li id="publishDate" class="pull-right">Last Published: 2018-05-25</li>
             </p>
                 </div>
 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/621479e1/metrics.html
----------------------------------------------------------------------
diff --git a/metrics.html b/metrics.html
index 09b94bb..82d41f4 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="20180524" />
+    <meta name="Date-Revision-yyyymmdd" content="20180525" />
     <meta http-equiv="Content-Language" content="en" />
     <title>Apache HBase &#x2013;  
       Apache HBase (TM) Metrics
@@ -459,7 +459,7 @@ export HBASE_REGIONSERVER_OPTS=&quot;$HBASE_JMX_OPTS -Dcom.sun.management.jmxrem
                         <a href="https://www.apache.org/">The Apache Software Foundation</a>.
             All rights reserved.      
                     
-                  <li id="publishDate" class="pull-right">Last Published: 2018-05-24</li>
+                  <li id="publishDate" class="pull-right">Last Published: 2018-05-25</li>
             </p>
                 </div>
 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/621479e1/old_news.html
----------------------------------------------------------------------
diff --git a/old_news.html b/old_news.html
index 3926dc7..f863e2c 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="20180524" />
+    <meta name="Date-Revision-yyyymmdd" content="20180525" />
     <meta http-equiv="Content-Language" content="en" />
     <title>Apache HBase &#x2013; 
       Old Apache HBase (TM) News
@@ -440,7 +440,7 @@ under the License. -->
                         <a href="https://www.apache.org/">The Apache Software Foundation</a>.
             All rights reserved.      
                     
-                  <li id="publishDate" class="pull-right">Last Published: 2018-05-24</li>
+                  <li id="publishDate" class="pull-right">Last Published: 2018-05-25</li>
             </p>
                 </div>
 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/621479e1/plugin-management.html
----------------------------------------------------------------------
diff --git a/plugin-management.html b/plugin-management.html
index 9e1e17b..bfcddad 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="20180524" />
+    <meta name="Date-Revision-yyyymmdd" content="20180525" />
     <meta http-equiv="Content-Language" content="en" />
     <title>Apache HBase &#x2013; Project Plugin Management</title>
     <link rel="stylesheet" href="./css/apache-maven-fluido-1.5-HBASE.min.css" />
@@ -440,7 +440,7 @@
                         <a href="https://www.apache.org/">The Apache Software Foundation</a>.
             All rights reserved.      
                     
-                  <li id="publishDate" class="pull-right">Last Published: 2018-05-24</li>
+                  <li id="publishDate" class="pull-right">Last Published: 2018-05-25</li>
             </p>
                 </div>
 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/621479e1/plugins.html
----------------------------------------------------------------------
diff --git a/plugins.html b/plugins.html
index 79cca90..c7c68e5 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="20180524" />
+    <meta name="Date-Revision-yyyymmdd" content="20180525" />
     <meta http-equiv="Content-Language" content="en" />
     <title>Apache HBase &#x2013; Project Plugins</title>
     <link rel="stylesheet" href="./css/apache-maven-fluido-1.5-HBASE.min.css" />
@@ -375,7 +375,7 @@
                         <a href="https://www.apache.org/">The Apache Software Foundation</a>.
             All rights reserved.      
                     
-                  <li id="publishDate" class="pull-right">Last Published: 2018-05-24</li>
+                  <li id="publishDate" class="pull-right">Last Published: 2018-05-25</li>
             </p>
                 </div>
 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/621479e1/poweredbyhbase.html
----------------------------------------------------------------------
diff --git a/poweredbyhbase.html b/poweredbyhbase.html
index afb4627..11f8ae9 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="20180524" />
+    <meta name="Date-Revision-yyyymmdd" content="20180525" />
     <meta http-equiv="Content-Language" content="en" />
     <title>Apache HBase &#x2013; Powered By Apache HBase™</title>
     <link rel="stylesheet" href="./css/apache-maven-fluido-1.5-HBASE.min.css" />
@@ -769,7 +769,7 @@ under the License. -->
                         <a href="https://www.apache.org/">The Apache Software Foundation</a>.
             All rights reserved.      
                     
-                  <li id="publishDate" class="pull-right">Last Published: 2018-05-24</li>
+                  <li id="publishDate" class="pull-right">Last Published: 2018-05-25</li>
             </p>
                 </div>
 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/621479e1/project-info.html
----------------------------------------------------------------------
diff --git a/project-info.html b/project-info.html
index 8b9a6c4..cdd85d5 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="20180524" />
+    <meta name="Date-Revision-yyyymmdd" content="20180525" />
     <meta http-equiv="Content-Language" content="en" />
     <title>Apache HBase &#x2013; Project Information</title>
     <link rel="stylesheet" href="./css/apache-maven-fluido-1.5-HBASE.min.css" />
@@ -335,7 +335,7 @@
                         <a href="https://www.apache.org/">The Apache Software Foundation</a>.
             All rights reserved.      
                     
-                  <li id="publishDate" class="pull-right">Last Published: 2018-05-24</li>
+                  <li id="publishDate" class="pull-right">Last Published: 2018-05-25</li>
             </p>
                 </div>
 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/621479e1/project-reports.html
----------------------------------------------------------------------
diff --git a/project-reports.html b/project-reports.html
index 8d79f4b..64f1236 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="20180524" />
+    <meta name="Date-Revision-yyyymmdd" content="20180525" />
     <meta http-equiv="Content-Language" content="en" />
     <title>Apache HBase &#x2013; Generated Reports</title>
     <link rel="stylesheet" href="./css/apache-maven-fluido-1.5-HBASE.min.css" />
@@ -305,7 +305,7 @@
                         <a href="https://www.apache.org/">The Apache Software Foundation</a>.
             All rights reserved.      
                     
-                  <li id="publishDate" class="pull-right">Last Published: 2018-05-24</li>
+                  <li id="publishDate" class="pull-right">Last Published: 2018-05-25</li>
             </p>
                 </div>
 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/621479e1/project-summary.html
----------------------------------------------------------------------
diff --git a/project-summary.html b/project-summary.html
index 98d72b6..1d39b94 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="20180524" />
+    <meta name="Date-Revision-yyyymmdd" content="20180525" />
     <meta http-equiv="Content-Language" content="en" />
     <title>Apache HBase &#x2013; Project Summary</title>
     <link rel="stylesheet" href="./css/apache-maven-fluido-1.5-HBASE.min.css" />
@@ -331,7 +331,7 @@
                         <a href="https://www.apache.org/">The Apache Software Foundation</a>.
             All rights reserved.      
                     
-                  <li id="publishDate" class="pull-right">Last Published: 2018-05-24</li>
+                  <li id="publishDate" class="pull-right">Last Published: 2018-05-25</li>
             </p>
                 </div>
 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/621479e1/pseudo-distributed.html
----------------------------------------------------------------------
diff --git a/pseudo-distributed.html b/pseudo-distributed.html
index edc12d8..27a5c9a 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="20180524" />
+    <meta name="Date-Revision-yyyymmdd" content="20180525" />
     <meta http-equiv="Content-Language" content="en" />
     <title>Apache HBase &#x2013;  
 Running Apache HBase (TM) in pseudo-distributed mode
@@ -308,7 +308,7 @@ under the License. -->
                         <a href="https://www.apache.org/">The Apache Software Foundation</a>.
             All rights reserved.      
                     
-                  <li id="publishDate" class="pull-right">Last Published: 2018-05-24</li>
+                  <li id="publishDate" class="pull-right">Last Published: 2018-05-25</li>
             </p>
                 </div>
 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/621479e1/replication.html
----------------------------------------------------------------------
diff --git a/replication.html b/replication.html
index aa1621c..3d1735c 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="20180524" />
+    <meta name="Date-Revision-yyyymmdd" content="20180525" />
     <meta http-equiv="Content-Language" content="en" />
     <title>Apache HBase &#x2013; 
       Apache HBase (TM) Replication
@@ -303,7 +303,7 @@ under the License. -->
                         <a href="https://www.apache.org/">The Apache Software Foundation</a>.
             All rights reserved.      
                     
-                  <li id="publishDate" class="pull-right">Last Published: 2018-05-24</li>
+                  <li id="publishDate" class="pull-right">Last Published: 2018-05-25</li>
             </p>
                 </div>
 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/621479e1/resources.html
----------------------------------------------------------------------
diff --git a/resources.html b/resources.html
index 9502422..314c46e 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="20180524" />
+    <meta name="Date-Revision-yyyymmdd" content="20180525" />
     <meta http-equiv="Content-Language" content="en" />
     <title>Apache HBase &#x2013; Other Apache HBase (TM) Resources</title>
     <link rel="stylesheet" href="./css/apache-maven-fluido-1.5-HBASE.min.css" />
@@ -331,7 +331,7 @@ under the License. -->
                         <a href="https://www.apache.org/">The Apache Software Foundation</a>.
             All rights reserved.      
                     
-                  <li id="publishDate" class="pull-right">Last Published: 2018-05-24</li>
+                  <li id="publishDate" class="pull-right">Last Published: 2018-05-25</li>
             </p>
                 </div>
 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/621479e1/source-repository.html
----------------------------------------------------------------------
diff --git a/source-repository.html b/source-repository.html
index 95bf395..8a70f93 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="20180524" />
+    <meta name="Date-Revision-yyyymmdd" content="20180525" />
     <meta http-equiv="Content-Language" content="en" />
     <title>Apache HBase &#x2013; Source Code Management</title>
     <link rel="stylesheet" href="./css/apache-maven-fluido-1.5-HBASE.min.css" />
@@ -299,7 +299,7 @@
                         <a href="https://www.apache.org/">The Apache Software Foundation</a>.
             All rights reserved.      
                     
-                  <li id="publishDate" class="pull-right">Last Published: 2018-05-24</li>
+                  <li id="publishDate" class="pull-right">Last Published: 2018-05-25</li>
             </p>
                 </div>
 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/621479e1/sponsors.html
----------------------------------------------------------------------
diff --git a/sponsors.html b/sponsors.html
index 03f9438..131cfdb 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="20180524" />
+    <meta name="Date-Revision-yyyymmdd" content="20180525" />
     <meta http-equiv="Content-Language" content="en" />
     <title>Apache HBase &#x2013; Apache HBase™ Sponsors</title>
     <link rel="stylesheet" href="./css/apache-maven-fluido-1.5-HBASE.min.css" />
@@ -333,7 +333,7 @@ under the License. -->
                         <a href="https://www.apache.org/">The Apache Software Foundation</a>.
             All rights reserved.      
                     
-                  <li id="publishDate" class="pull-right">Last Published: 2018-05-24</li>
+                  <li id="publishDate" class="pull-right">Last Published: 2018-05-25</li>
             </p>
                 </div>
 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/621479e1/supportingprojects.html
----------------------------------------------------------------------
diff --git a/supportingprojects.html b/supportingprojects.html
index 1541296..98286b5 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="20180524" />
+    <meta name="Date-Revision-yyyymmdd" content="20180525" />
     <meta http-equiv="Content-Language" content="en" />
     <title>Apache HBase &#x2013; Supporting Projects</title>
     <link rel="stylesheet" href="./css/apache-maven-fluido-1.5-HBASE.min.css" />
@@ -520,7 +520,7 @@ under the License. -->
                         <a href="https://www.apache.org/">The Apache Software Foundation</a>.
             All rights reserved.      
                     
-                  <li id="publishDate" class="pull-right">Last Published: 2018-05-24</li>
+                  <li id="publishDate" class="pull-right">Last Published: 2018-05-25</li>
             </p>
                 </div>
 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/621479e1/team-list.html
----------------------------------------------------------------------
diff --git a/team-list.html b/team-list.html
index 2b559b9..dd58bfe 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="20180524" />
+    <meta name="Date-Revision-yyyymmdd" content="20180525" />
     <meta http-equiv="Content-Language" content="en" />
     <title>Apache HBase &#x2013; Project Team</title>
     <link rel="stylesheet" href="./css/apache-maven-fluido-1.5-HBASE.min.css" />
@@ -730,7 +730,7 @@
                         <a href="https://www.apache.org/">The Apache Software Foundation</a>.
             All rights reserved.      
                     
-                  <li id="publishDate" class="pull-right">Last Published: 2018-05-24</li>
+                  <li id="publishDate" class="pull-right">Last Published: 2018-05-25</li>
             </p>
                 </div>
 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/621479e1/testdevapidocs/allclasses-frame.html
----------------------------------------------------------------------
diff --git a/testdevapidocs/allclasses-frame.html b/testdevapidocs/allclasses-frame.html
index 935aeda..445b68e 100644
--- a/testdevapidocs/allclasses-frame.html
+++ b/testdevapidocs/allclasses-frame.html
@@ -2213,6 +2213,7 @@
 <li><a href="org/apache/hadoop/hbase/security/token/TestTokenAuthentication.TokenServer.html" title="class in org.apache.hadoop.hbase.security.token" target="classFrame">TestTokenAuthentication.TokenServer</a></li>
 <li><a href="org/apache/hadoop/hbase/security/token/TestTokenUtil.html" title="class in org.apache.hadoop.hbase.security.token" target="classFrame">TestTokenUtil</a></li>
 <li><a href="org/apache/hadoop/hbase/master/procedure/TestTruncateTableProcedure.html" title="class in org.apache.hadoop.hbase.master.procedure" target="classFrame">TestTruncateTableProcedure</a></li>
+<li><a href="org/apache/hadoop/hbase/master/procedure/TestTruncateTableProcedure.TruncateTableProcedureOnHDFSFailure.html" title="class in org.apache.hadoop.hbase.master.procedure" target="classFrame">TestTruncateTableProcedure.TruncateTableProcedureOnHDFSFailure</a></li>
 <li><a href="org/apache/hadoop/hbase/master/assignment/TestUnexpectedStateException.html" title="class in org.apache.hadoop.hbase.master.assignment" target="classFrame">TestUnexpectedStateException</a></li>
 <li><a href="org/apache/hadoop/hbase/types/TestUnion2.html" title="class in org.apache.hadoop.hbase.types" target="classFrame">TestUnion2</a></li>
 <li><a href="org/apache/hadoop/hbase/types/TestUnion2.SampleUnion1.html" title="class in org.apache.hadoop.hbase.types" target="classFrame">TestUnion2.SampleUnion1</a></li>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/621479e1/testdevapidocs/allclasses-noframe.html
----------------------------------------------------------------------
diff --git a/testdevapidocs/allclasses-noframe.html b/testdevapidocs/allclasses-noframe.html
index 5d07158..8184039 100644
--- a/testdevapidocs/allclasses-noframe.html
+++ b/testdevapidocs/allclasses-noframe.html
@@ -2213,6 +2213,7 @@
 <li><a href="org/apache/hadoop/hbase/security/token/TestTokenAuthentication.TokenServer.html" title="class in org.apache.hadoop.hbase.security.token">TestTokenAuthentication.TokenServer</a></li>
 <li><a href="org/apache/hadoop/hbase/security/token/TestTokenUtil.html" title="class in org.apache.hadoop.hbase.security.token">TestTokenUtil</a></li>
 <li><a href="org/apache/hadoop/hbase/master/procedure/TestTruncateTableProcedure.html" title="class in org.apache.hadoop.hbase.master.procedure">TestTruncateTableProcedure</a></li>
+<li><a href="org/apache/hadoop/hbase/master/procedure/TestTruncateTableProcedure.TruncateTableProcedureOnHDFSFailure.html" title="class in org.apache.hadoop.hbase.master.procedure">TestTruncateTableProcedure.TruncateTableProcedureOnHDFSFailure</a></li>
 <li><a href="org/apache/hadoop/hbase/master/assignment/TestUnexpectedStateException.html" title="class in org.apache.hadoop.hbase.master.assignment">TestUnexpectedStateException</a></li>
 <li><a href="org/apache/hadoop/hbase/types/TestUnion2.html" title="class in org.apache.hadoop.hbase.types">TestUnion2</a></li>
 <li><a href="org/apache/hadoop/hbase/types/TestUnion2.SampleUnion1.html" title="class in org.apache.hadoop.hbase.types">TestUnion2.SampleUnion1</a></li>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/621479e1/testdevapidocs/index-all.html
----------------------------------------------------------------------
diff --git a/testdevapidocs/index-all.html b/testdevapidocs/index-all.html
index 9d38150..ef4fead 100644
--- a/testdevapidocs/index-all.html
+++ b/testdevapidocs/index-all.html
@@ -13002,6 +13002,8 @@
 <dd>&nbsp;</dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/MiniHBaseCluster.html#executeFlush-org.apache.hadoop.hbase.regionserver.HRegion-">executeFlush(HRegion)</a></span> - Method in class org.apache.hadoop.hbase.<a href="org/apache/hadoop/hbase/MiniHBaseCluster.html" title="class in org.apache.hadoop.hbase">MiniHBaseCluster</a></dt>
 <dd>&nbsp;</dd>
+<dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/master/procedure/TestTruncateTableProcedure.TruncateTableProcedureOnHDFSFailure.html#executeFromState-org.apache.hadoop.hbase.master.procedure.MasterProcedureEnv-org.apache.hadoop.hbase.shaded.protobuf.generated.MasterProcedureProtos.TruncateTableState-">executeFromState(MasterProcedureEnv, MasterProcedureProtos.TruncateTableState)</a></span> - Method in class org.apache.hadoop.hbase.master.procedure.<a href="org/apache/hadoop/hbase/master/procedure/TestTruncateTableProcedure.TruncateTableProcedureOnHDFSFailure.html" title="class in org.apache.hadoop.hbase.master.procedure">TestTruncateTableProcedure.TruncateTableProcedureOnHDFSFailure</a></dt>
+<dd>&nbsp;</dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/procedure2/TestProcedureRecovery.TestStateMachineProcedure.html#executeFromState-org.apache.hadoop.hbase.procedure2.TestProcedureRecovery.TestProcEnv-org.apache.hadoop.hbase.procedure2.TestProcedureRecovery.TestStateMachineProcedure.State-">executeFromState(TestProcedureRecovery.TestProcEnv, TestProcedureRecovery.TestStateMachineProcedure.State)</a></span> - Method in class org.apache.hadoop.hbase.procedure2.<a href="org/apache/hadoop/hbase/procedure2/TestProcedureRecovery.TestStateMachineProcedure.html" title="class in org.apache.hadoop.hbase.procedure2">TestProcedureRecovery.TestStateMachineProcedure</a></dt>
 <dd>&nbsp;</dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/procedure2/TestProcedureToString.SimpleStateMachineProcedure.html#executeFromState-org.apache.hadoop.hbase.procedure2.TestProcedureToString.BasicProcedureEnv-org.apache.hadoop.hbase.shaded.protobuf.generated.MasterProcedureProtos.ServerCrashState-">executeFromState(TestProcedureToString.BasicProcedureEnv, MasterProcedureProtos.ServerCrashState)</a></span> - Method in class org.apache.hadoop.hbase.procedure2.<a href="org/apache/hadoop/hbase/procedure2/TestProcedureToString.SimpleStateMachineProcedure.html" title="class in org.apache.hadoop.hbase.procedure2">TestProcedureToString.SimpleStateMachineProcedure</a></dt>
@@ -13325,6 +13327,8 @@
 <dd>&nbsp;</dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/replication/regionserver/TestReplicator.FailureInjectingReplicationEndpointForTest.html#failNext">failNext</a></span> - Variable in class org.apache.hadoop.hbase.replication.regionserver.<a href="org/apache/hadoop/hbase/replication/regionserver/TestReplicator.FailureInjectingReplicationEndpointForTest.html" title="class in org.apache.hadoop.hbase.replication.regionserver">TestReplicator.FailureInjectingReplicationEndpointForTest</a></dt>
 <dd>&nbsp;</dd>
+<dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/master/procedure/TestTruncateTableProcedure.TruncateTableProcedureOnHDFSFailure.html#failOnce">failOnce</a></span> - Variable in class org.apache.hadoop.hbase.master.procedure.<a href="org/apache/hadoop/hbase/master/procedure/TestTruncateTableProcedure.TruncateTableProcedureOnHDFSFailure.html" title="class in org.apache.hadoop.hbase.master.procedure">TestTruncateTableProcedure.TruncateTableProcedureOnHDFSFailure</a></dt>
+<dd>&nbsp;</dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/client/TestAsyncProcess.html#FAILS">FAILS</a></span> - Static variable in class org.apache.hadoop.hbase.client.<a href="org/apache/hadoop/hbase/client/TestAsyncProcess.html" title="class in org.apache.hadoop.hbase.client">TestAsyncProcess</a></dt>
 <dd>&nbsp;</dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/client/TestSnapshotFromAdmin.html#failSnapshotDescriptorCreation-java.lang.String-java.lang.String-">failSnapshotDescriptorCreation(String, String)</a></span> - Method in class org.apache.hadoop.hbase.client.<a href="org/apache/hadoop/hbase/client/TestSnapshotFromAdmin.html" title="class in org.apache.hadoop.hbase.client">TestSnapshotFromAdmin</a></dt>
@@ -19967,6 +19971,8 @@
 </dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/util/hbck/HbckTestingUtil.html#inconsistencyFound-org.apache.hadoop.hbase.util.HBaseFsck-">inconsistencyFound(HBaseFsck)</a></span> - Static method in class org.apache.hadoop.hbase.util.hbck.<a href="org/apache/hadoop/hbase/util/hbck/HbckTestingUtil.html" title="class in org.apache.hadoop.hbase.util.hbck">HbckTestingUtil</a></dt>
 <dd>&nbsp;</dd>
+<dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/quotas/TestSpaceQuotas.html#increaseQuotaLimit-org.apache.hadoop.hbase.TableName-org.apache.hadoop.hbase.quotas.SpaceViolationPolicy-">increaseQuotaLimit(TableName, SpaceViolationPolicy)</a></span> - Method in class org.apache.hadoop.hbase.quotas.<a href="org/apache/hadoop/hbase/quotas/TestSpaceQuotas.html" title="class in org.apache.hadoop.hbase.quotas">TestSpaceQuotas</a></dt>
+<dd>&nbsp;</dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/coprocessor/example/WriteHeavyIncrementObserverTestBase.html#increment-int-">increment(int)</a></span> - Static method in class org.apache.hadoop.hbase.coprocessor.example.<a href="org/apache/hadoop/hbase/coprocessor/example/WriteHeavyIncrementObserverTestBase.html" title="class in org.apache.hadoop.hbase.coprocessor.example">WriteHeavyIncrementObserverTestBase</a></dt>
 <dd>&nbsp;</dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/quotas/policies/BaseViolationPolicyEnforcement.html#INCREMENT">INCREMENT</a></span> - Static variable in class org.apache.hadoop.hbase.quotas.policies.<a href="org/apache/hadoop/hbase/quotas/policies/BaseViolationPolicyEnforcement.html" title="class in org.apache.hadoop.hbase.quotas.policies">BaseViolationPolicyEnforcement</a></dt>
@@ -32277,6 +32283,8 @@
 </dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/replication/TestReplicationProcedureRetry.MockHMaster.html#removePeerCalled">removePeerCalled</a></span> - Variable in class org.apache.hadoop.hbase.replication.<a href="org/apache/hadoop/hbase/replication/TestReplicationProcedureRetry.MockHMaster.html" title="class in org.apache.hadoop.hbase.replication">TestReplicationProcedureRetry.MockHMaster</a></dt>
 <dd>&nbsp;</dd>
+<dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/quotas/TestSpaceQuotas.html#removeQuotaFromtable-org.apache.hadoop.hbase.TableName-">removeQuotaFromtable(TableName)</a></span> - Method in class org.apache.hadoop.hbase.quotas.<a href="org/apache/hadoop/hbase/quotas/TestSpaceQuotas.html" title="class in org.apache.hadoop.hbase.quotas">TestSpaceQuotas</a></dt>
+<dd>&nbsp;</dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/master/MockRegionServer.html#removeRegion-org.apache.hadoop.hbase.regionserver.HRegion-org.apache.hadoop.hbase.ServerName-">removeRegion(HRegion, ServerName)</a></span> - Method in class org.apache.hadoop.hbase.master.<a href="org/apache/hadoop/hbase/master/MockRegionServer.html" title="class in org.apache.hadoop.hbase.master">MockRegionServer</a></dt>
 <dd>&nbsp;</dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/MockRegionServerServices.html#removeRegion-org.apache.hadoop.hbase.regionserver.HRegion-org.apache.hadoop.hbase.ServerName-">removeRegion(HRegion, ServerName)</a></span> - Method in class org.apache.hadoop.hbase.<a href="org/apache/hadoop/hbase/MockRegionServerServices.html" title="class in org.apache.hadoop.hbase">MockRegionServerServices</a></dt>
@@ -35553,6 +35561,14 @@
 <dd>&nbsp;</dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/util/RedundantKVGenerator.html#setQualifierLengthVariance-int-">setQualifierLengthVariance(int)</a></span> - Method in class org.apache.hadoop.hbase.util.<a href="org/apache/hadoop/hbase/util/RedundantKVGenerator.html" title="class in org.apache.hadoop.hbase.util">RedundantKVGenerator</a></dt>
 <dd>&nbsp;</dd>
+<dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/quotas/TestSpaceQuotas.html#setQuotaAndThenDropTable-org.apache.hadoop.hbase.quotas.SpaceViolationPolicy-">setQuotaAndThenDropTable(SpaceViolationPolicy)</a></span> - Method in class org.apache.hadoop.hbase.quotas.<a href="org/apache/hadoop/hbase/quotas/TestSpaceQuotas.html" title="class in org.apache.hadoop.hbase.quotas">TestSpaceQuotas</a></dt>
+<dd>&nbsp;</dd>
+<dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/quotas/TestSpaceQuotas.html#setQuotaAndThenIncreaseQuota-org.apache.hadoop.hbase.quotas.SpaceViolationPolicy-">setQuotaAndThenIncreaseQuota(SpaceViolationPolicy)</a></span> - Method in class org.apache.hadoop.hbase.quotas.<a href="org/apache/hadoop/hbase/quotas/TestSpaceQuotas.html" title="class in org.apache.hadoop.hbase.quotas">TestSpaceQuotas</a></dt>
+<dd>&nbsp;</dd>
+<dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/quotas/TestSpaceQuotas.html#setQuotaAndThenRemove-org.apache.hadoop.hbase.quotas.SpaceViolationPolicy-">setQuotaAndThenRemove(SpaceViolationPolicy)</a></span> - Method in class org.apache.hadoop.hbase.quotas.<a href="org/apache/hadoop/hbase/quotas/TestSpaceQuotas.html" title="class in org.apache.hadoop.hbase.quotas">TestSpaceQuotas</a></dt>
+<dd>&nbsp;</dd>
+<dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/quotas/TestSpaceQuotas.html#setQuotaAndThenRemoveInOneAmongTwoTables-org.apache.hadoop.hbase.quotas.SpaceViolationPolicy-">setQuotaAndThenRemoveInOneAmongTwoTables(SpaceViolationPolicy)</a></span> - Method in class org.apache.hadoop.hbase.quotas.<a href="org/apache/hadoop/hbase/quotas/TestSpaceQuotas.html" title="class in org.apache.hadoop.hbase.quotas">TestSpaceQuotas</a></dt>
+<dd>&nbsp;</dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/util/RedundantKVGenerator.html#setRandomizer-java.util.Random-">setRandomizer(Random)</a></span> - Method in class org.apache.hadoop.hbase.util.<a href="org/apache/hadoop/hbase/util/RedundantKVGenerator.html" title="class in org.apache.hadoop.hbase.util">RedundantKVGenerator</a></dt>
 <dd>&nbsp;</dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/PerformanceEvaluation.TestOptions.html#setRandomSleep-int-">setRandomSleep(int)</a></span> - Method in class org.apache.hadoop.hbase.<a href="org/apache/hadoop/hbase/PerformanceEvaluation.TestOptions.html" title="class in org.apache.hadoop.hbase">PerformanceEvaluation.TestOptions</a></dt>
@@ -55008,6 +55024,12 @@
 <dd>&nbsp;</dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/filter/TestMultiRowRangeFilter.html#testOneRowRange--">testOneRowRange()</a></span> - Method in class org.apache.hadoop.hbase.filter.<a href="org/apache/hadoop/hbase/filter/TestMultiRowRangeFilter.html" title="class in org.apache.hadoop.hbase.filter">TestMultiRowRangeFilter</a></dt>
 <dd>&nbsp;</dd>
+<dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/master/procedure/TestTruncateTableProcedure.html#testOnHDFSFailure-org.apache.hadoop.hbase.TableName-boolean-">testOnHDFSFailure(TableName, boolean)</a></span> - Method in class org.apache.hadoop.hbase.master.procedure.<a href="org/apache/hadoop/hbase/master/procedure/TestTruncateTableProcedure.html" title="class in org.apache.hadoop.hbase.master.procedure">TestTruncateTableProcedure</a></dt>
+<dd>&nbsp;</dd>
+<dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/master/procedure/TestTruncateTableProcedure.html#testOnHDFSFailureNoPreserveSplits--">testOnHDFSFailureNoPreserveSplits()</a></span> - Method in class org.apache.hadoop.hbase.master.procedure.<a href="org/apache/hadoop/hbase/master/procedure/TestTruncateTableProcedure.html" title="class in org.apache.hadoop.hbase.master.procedure">TestTruncateTableProcedure</a></dt>
+<dd>&nbsp;</dd>
+<dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/master/procedure/TestTruncateTableProcedure.html#testOnHDFSFailurePreserveSplits--">testOnHDFSFailurePreserveSplits()</a></span> - Method in class org.apache.hadoop.hbase.master.procedure.<a href="org/apache/hadoop/hbase/master/procedure/TestTruncateTableProcedure.html" title="class in org.apache.hadoop.hbase.master.procedure">TestTruncateTableProcedure</a></dt>
+<dd>&nbsp;</dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/io/TestByteBufferPool.html#testOnheapBBPool--">testOnheapBBPool()</a></span> - Method in class org.apache.hadoop.hbase.io.<a href="org/apache/hadoop/hbase/io/TestByteBufferPool.html" title="class in org.apache.hadoop.hbase.io">TestByteBufferPool</a></dt>
 <dd>&nbsp;</dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/regionserver/TestRegionServerAccounting.html#testOnheapMemstoreHigherWaterMarkLimits--">testOnheapMemstoreHigherWaterMarkLimits()</a></span> - Method in class org.apache.hadoop.hbase.regionserver.<a href="org/apache/hadoop/hbase/regionserver/TestRegionServerAccounting.html" title="class in org.apache.hadoop.hbase.regionserver">TestRegionServerAccounting</a></dt>
@@ -59867,6 +59889,34 @@
 <dd>&nbsp;</dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/security/access/TestAccessController.html#testSetQuota--">testSetQuota()</a></span> - Method in class org.apache.hadoop.hbase.security.access.<a href="org/apache/hadoop/hbase/security/access/TestAccessController.html" title="class in org.apache.hadoop.hbase.security.access">TestAccessController</a></dt>
 <dd>&nbsp;</dd>
+<dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/quotas/TestSpaceQuotas.html#testSetQuotaAndThenDropTableeWithNoWritesCompactions--">testSetQuotaAndThenDropTableeWithNoWritesCompactions()</a></span> - Method in class org.apache.hadoop.hbase.quotas.<a href="org/apache/hadoop/hbase/quotas/TestSpaceQuotas.html" title="class in org.apache.hadoop.hbase.quotas">TestSpaceQuotas</a></dt>
+<dd>&nbsp;</dd>
+<dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/quotas/TestSpaceQuotas.html#testSetQuotaAndThenDropTableWithNoInserts--">testSetQuotaAndThenDropTableWithNoInserts()</a></span> - Method in class org.apache.hadoop.hbase.quotas.<a href="org/apache/hadoop/hbase/quotas/TestSpaceQuotas.html" title="class in org.apache.hadoop.hbase.quotas">TestSpaceQuotas</a></dt>
+<dd>&nbsp;</dd>
+<dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/quotas/TestSpaceQuotas.html#testSetQuotaAndThenDropTableWithNoWrite--">testSetQuotaAndThenDropTableWithNoWrite()</a></span> - Method in class org.apache.hadoop.hbase.quotas.<a href="org/apache/hadoop/hbase/quotas/TestSpaceQuotas.html" title="class in org.apache.hadoop.hbase.quotas">TestSpaceQuotas</a></dt>
+<dd>&nbsp;</dd>
+<dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/quotas/TestSpaceQuotas.html#testSetQuotaAndThenIncreaseQuotaWithNoInserts--">testSetQuotaAndThenIncreaseQuotaWithNoInserts()</a></span> - Method in class org.apache.hadoop.hbase.quotas.<a href="org/apache/hadoop/hbase/quotas/TestSpaceQuotas.html" title="class in org.apache.hadoop.hbase.quotas">TestSpaceQuotas</a></dt>
+<dd>&nbsp;</dd>
+<dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/quotas/TestSpaceQuotas.html#testSetQuotaAndThenIncreaseQuotaWithNoWrite--">testSetQuotaAndThenIncreaseQuotaWithNoWrite()</a></span> - Method in class org.apache.hadoop.hbase.quotas.<a href="org/apache/hadoop/hbase/quotas/TestSpaceQuotas.html" title="class in org.apache.hadoop.hbase.quotas">TestSpaceQuotas</a></dt>
+<dd>&nbsp;</dd>
+<dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/quotas/TestSpaceQuotas.html#testSetQuotaAndThenIncreaseQuotaWithNoWritesCompactions--">testSetQuotaAndThenIncreaseQuotaWithNoWritesCompactions()</a></span> - Method in class org.apache.hadoop.hbase.quotas.<a href="org/apache/hadoop/hbase/quotas/TestSpaceQuotas.html" title="class in org.apache.hadoop.hbase.quotas">TestSpaceQuotas</a></dt>
+<dd>&nbsp;</dd>
+<dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/quotas/TestSpaceQuotas.html#testSetQuotaAndThenRemoveInOneWithDisable--">testSetQuotaAndThenRemoveInOneWithDisable()</a></span> - Method in class org.apache.hadoop.hbase.quotas.<a href="org/apache/hadoop/hbase/quotas/TestSpaceQuotas.html" title="class in org.apache.hadoop.hbase.quotas">TestSpaceQuotas</a></dt>
+<dd>&nbsp;</dd>
+<dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/quotas/TestSpaceQuotas.html#testSetQuotaAndThenRemoveInOneWithNoInserts--">testSetQuotaAndThenRemoveInOneWithNoInserts()</a></span> - Method in class org.apache.hadoop.hbase.quotas.<a href="org/apache/hadoop/hbase/quotas/TestSpaceQuotas.html" title="class in org.apache.hadoop.hbase.quotas">TestSpaceQuotas</a></dt>
+<dd>&nbsp;</dd>
+<dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/quotas/TestSpaceQuotas.html#testSetQuotaAndThenRemoveInOneWithNoWrite--">testSetQuotaAndThenRemoveInOneWithNoWrite()</a></span> - Method in class org.apache.hadoop.hbase.quotas.<a href="org/apache/hadoop/hbase/quotas/TestSpaceQuotas.html" title="class in org.apache.hadoop.hbase.quotas">TestSpaceQuotas</a></dt>
+<dd>&nbsp;</dd>
+<dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/quotas/TestSpaceQuotas.html#testSetQuotaAndThenRemoveInOneWithNoWritesCompaction--">testSetQuotaAndThenRemoveInOneWithNoWritesCompaction()</a></span> - Method in class org.apache.hadoop.hbase.quotas.<a href="org/apache/hadoop/hbase/quotas/TestSpaceQuotas.html" title="class in org.apache.hadoop.hbase.quotas">TestSpaceQuotas</a></dt>
+<dd>&nbsp;</dd>
+<dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/quotas/TestSpaceQuotas.html#testSetQuotaAndThenRemoveWithDisable--">testSetQuotaAndThenRemoveWithDisable()</a></span> - Method in class org.apache.hadoop.hbase.quotas.<a href="org/apache/hadoop/hbase/quotas/TestSpaceQuotas.html" title="class in org.apache.hadoop.hbase.quotas">TestSpaceQuotas</a></dt>
+<dd>&nbsp;</dd>
+<dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/quotas/TestSpaceQuotas.html#testSetQuotaAndThenRemoveWithNoInserts--">testSetQuotaAndThenRemoveWithNoInserts()</a></span> - Method in class org.apache.hadoop.hbase.quotas.<a href="org/apache/hadoop/hbase/quotas/TestSpaceQuotas.html" title="class in org.apache.hadoop.hbase.quotas">TestSpaceQuotas</a></dt>
+<dd>&nbsp;</dd>
+<dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/quotas/TestSpaceQuotas.html#testSetQuotaAndThenRemoveWithNoWrite--">testSetQuotaAndThenRemoveWithNoWrite()</a></span> - Method in class org.apache.hadoop.hbase.quotas.<a href="org/apache/hadoop/hbase/quotas/TestSpaceQuotas.html" title="class in org.apache.hadoop.hbase.quotas">TestSpaceQuotas</a></dt>
+<dd>&nbsp;</dd>
+<dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/quotas/TestSpaceQuotas.html#testSetQuotaAndThenRemoveWithNoWritesCompactions--">testSetQuotaAndThenRemoveWithNoWritesCompactions()</a></span> - Method in class org.apache.hadoop.hbase.quotas.<a href="org/apache/hadoop/hbase/quotas/TestSpaceQuotas.html" title="class in org.apache.hadoop.hbase.quotas">TestSpaceQuotas</a></dt>
+<dd>&nbsp;</dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/client/replication/TestReplicationAdmin.html#testSetReplicateAllUserTables--">testSetReplicateAllUserTables()</a></span> - Method in class org.apache.hadoop.hbase.client.replication.<a href="org/apache/hadoop/hbase/client/replication/TestReplicationAdmin.html" title="class in org.apache.hadoop.hbase.client.replication">TestReplicationAdmin</a></dt>
 <dd>&nbsp;</dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/security/access/TestAccessController.html#testSetSplitOrMergeEnabled--">testSetSplitOrMergeEnabled()</a></span> - Method in class org.apache.hadoop.hbase.security.access.<a href="org/apache/hadoop/hbase/security/access/TestAccessController.html" title="class in org.apache.hadoop.hbase.security.access">TestAccessController</a></dt>
@@ -62289,6 +62339,8 @@
 <dd>&nbsp;</dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/master/procedure/TestTruncateTableProcedure.html#TestTruncateTableProcedure--">TestTruncateTableProcedure()</a></span> - Constructor for class org.apache.hadoop.hbase.master.procedure.<a href="org/apache/hadoop/hbase/master/procedure/TestTruncateTableProcedure.html" title="class in org.apache.hadoop.hbase.master.procedure">TestTruncateTableProcedure</a></dt>
 <dd>&nbsp;</dd>
+<dt><a href="org/apache/hadoop/hbase/master/procedure/TestTruncateTableProcedure.TruncateTableProcedureOnHDFSFailure.html" title="class in org.apache.hadoop.hbase.master.procedure"><span class="typeNameLink">TestTruncateTableProcedure.TruncateTableProcedureOnHDFSFailure</span></a> - Class in <a href="org/apache/hadoop/hbase/master/procedure/package-summary.html">org.apache.hadoop.hbase.master.procedure</a></dt>
+<dd>&nbsp;</dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/master/procedure/TestMasterFailoverWithProcedures.html#testTruncateWithFailover--">testTruncateWithFailover()</a></span> - Method in class org.apache.hadoop.hbase.master.procedure.<a href="org/apache/hadoop/hbase/master/procedure/TestMasterFailoverWithProcedures.html" title="class in org.apache.hadoop.hbase.master.procedure">TestMasterFailoverWithProcedures</a></dt>
 <dd>&nbsp;</dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/master/procedure/TestMasterFailoverWithProcedures.html#testTruncateWithFailoverAtStep-boolean-int-">testTruncateWithFailoverAtStep(boolean, int)</a></span> - Method in class org.apache.hadoop.hbase.master.procedure.<a href="org/apache/hadoop/hbase/master/procedure/TestMasterFailoverWithProcedures.html" title="class in org.apache.hadoop.hbase.master.procedure">TestMasterFailoverWithProcedures</a></dt>
@@ -64251,6 +64303,10 @@
 </dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/chaos/actions/TruncateTableAction.html#TruncateTableAction-java.lang.String-">TruncateTableAction(String)</a></span> - Constructor for class org.apache.hadoop.hbase.chaos.actions.<a href="org/apache/hadoop/hbase/chaos/actions/TruncateTableAction.html" title="class in org.apache.hadoop.hbase.chaos.actions">TruncateTableAction</a></dt>
 <dd>&nbsp;</dd>
+<dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/master/procedure/TestTruncateTableProcedure.TruncateTableProcedureOnHDFSFailure.html#TruncateTableProcedureOnHDFSFailure--">TruncateTableProcedureOnHDFSFailure()</a></span> - Constructor for class org.apache.hadoop.hbase.master.procedure.<a href="org/apache/hadoop/hbase/master/procedure/TestTruncateTableProcedure.TruncateTableProcedureOnHDFSFailure.html" title="class in org.apache.hadoop.hbase.master.procedure">TestTruncateTableProcedure.TruncateTableProcedureOnHDFSFailure</a></dt>
+<dd>&nbsp;</dd>
+<dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/master/procedure/TestTruncateTableProcedure.TruncateTableProcedureOnHDFSFailure.html#TruncateTableProcedureOnHDFSFailure-org.apache.hadoop.hbase.master.procedure.MasterProcedureEnv-org.apache.hadoop.hbase.TableName-boolean-">TruncateTableProcedureOnHDFSFailure(MasterProcedureEnv, TableName, boolean)</a></span> - Constructor for class org.apache.hadoop.hbase.master.procedure.<a href="org/apache/hadoop/hbase/master/procedure/TestTruncateTableProcedure.TruncateTableProcedureOnHDFSFailure.html" title="class in org.apache.hadoop.hbase.master.procedure">TestTruncateTableProcedure.TruncateTableProcedureOnHDFSFailure</a></dt>
+<dd>&nbsp;</dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/client/TestClientScannerRPCTimeout.RSRpcServicesWithScanTimeout.html#tryNumber">tryNumber</a></span> - Static variable in class org.apache.hadoop.hbase.client.<a href="org/apache/hadoop/hbase/client/TestClientScannerRPCTimeout.RSRpcServicesWithScanTimeout.html" title="class in org.apache.hadoop.hbase.client">TestClientScannerRPCTimeout.RSRpcServicesWithScanTimeout</a></dt>
 <dd>&nbsp;</dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/master/TestMasterMetrics.MyMaster.html#tryRegionServerReport-long-long-">tryRegionServerReport(long, long)</a></span> - Method in class org.apache.hadoop.hbase.master.<a href="org/apache/hadoop/hbase/master/TestMasterMetrics.MyMaster.html" title="class in org.apache.hadoop.hbase.master">TestMasterMetrics.MyMaster</a></dt>
@@ -66369,6 +66425,8 @@ the order they are declared.</div>
 <dd>
 <div class="block">Verify no compaction is needed or selected.</div>
 </dd>
+<dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/quotas/TestSpaceQuotas.html#verifyNoViolation-org.apache.hadoop.hbase.quotas.SpaceViolationPolicy-org.apache.hadoop.hbase.TableName-org.apache.hadoop.hbase.client.Mutation-">verifyNoViolation(SpaceViolationPolicy, TableName, Mutation)</a></span> - Method in class org.apache.hadoop.hbase.quotas.<a href="org/apache/hadoop/hbase/quotas/TestSpaceQuotas.html" title="class in org.apache.hadoop.hbase.quotas">TestSpaceQuotas</a></dt>
+<dd>&nbsp;</dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/HBaseTestingUtility.html#verifyNumericRows-org.apache.hadoop.hbase.client.Table-byte:A-int-int-int-">verifyNumericRows(Table, byte[], int, int, int)</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>&nbsp;</dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/HBaseTestingUtility.html#verifyNumericRows-org.apache.hadoop.hbase.regionserver.Region-byte:A-int-int-">verifyNumericRows(Region, byte[], int, int)</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>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/621479e1/testdevapidocs/org/apache/hadoop/hbase/TestZooKeeper.MockLoadBalancer.html
----------------------------------------------------------------------
diff --git a/testdevapidocs/org/apache/hadoop/hbase/TestZooKeeper.MockLoadBalancer.html b/testdevapidocs/org/apache/hadoop/hbase/TestZooKeeper.MockLoadBalancer.html
index b19eafe..59bddd3 100644
--- a/testdevapidocs/org/apache/hadoop/hbase/TestZooKeeper.MockLoadBalancer.html
+++ b/testdevapidocs/org/apache/hadoop/hbase/TestZooKeeper.MockLoadBalancer.html
@@ -230,7 +230,7 @@ extends org.apache.hadoop.hbase.master.balancer.SimpleLoadBalancer</pre>
 <!--   -->
 </a>
 <h3>Methods inherited from class&nbsp;org.apache.hadoop.hbase.master.balancer.BaseLoadBalancer</h3>
-<code>areSomeRegionReplicasColocated, assignMasterSystemRegions, balanceMasterRegions, createCluster, getConf, getRegionAssignmentsByServer, initialize, isStopped, needsBalance, randomAssignment, regionOffline, regionOnline, roundRobinAssignment, setClusterMetrics, setConf, setMasterServices, setRackManager, setSlop, shouldBeOnMaster, stop</code></li>
+<code>areSomeRegionReplicasColocated, assignMasterSystemRegions, balanceMasterRegions, createCluster, getConf, getRegionAssignmentsByServer, initialize, isStopped, needsBalance, postMasterStartupInitialize, randomAssignment, regionOffline, regionOnline, roundRobinAssignment, setClusterMetrics, setConf, setMasterServices, setRackManager, setSlop, shouldBeOnMaster, stop</code></li>
 </ul>
 <ul class="blockList">
 <li class="blockList"><a name="methods.inherited.from.class.java.lang.Object">

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/621479e1/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 3168ee3..e159b3f 100644
--- a/testdevapidocs/org/apache/hadoop/hbase/backup/package-tree.html
+++ b/testdevapidocs/org/apache/hadoop/hbase/backup/package-tree.html
@@ -145,8 +145,8 @@
 <ul>
 <li type="circle">java.lang.<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Enum.html?is-external=true" title="class or interface in java.lang"><span class="typeNameLink">Enum</span></a>&lt;E&gt; (implements java.lang.<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Comparable.html?is-external=true" title="class or interface in java.lang">Comparable</a>&lt;T&gt;, java.io.<a href="https://docs.oracle.com/javase/8/docs/api/java/io/Serializable.html?is-external=true" title="class or interface in java.io">Serializable</a>)
 <ul>
-<li type="circle">org.apache.hadoop.hbase.backup.<a href="../../../../../org/apache/hadoop/hbase/backup/TestIncrementalBackupMergeWithFailures.FailurePhase.html" title="enum in org.apache.hadoop.hbase.backup"><span class="typeNameLink">TestIncrementalBackupMergeWithFailures.FailurePhase</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.backup.<a href="../../../../../org/apache/hadoop/hbase/backup/TestBackupDeleteWithFailures.Failure.html" title="enum in org.apache.hadoop.hbase.backup"><span class="typeNameLink">TestBackupDeleteWithFailures.Failure</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.backup.<a href="../../../../../org/apache/hadoop/hbase/backup/TestIncrementalBackupMergeWithFailures.FailurePhase.html" title="enum in org.apache.hadoop.hbase.backup"><span class="typeNameLink">TestIncrementalBackupMergeWithFailures.FailurePhase</span></a></li>
 </ul>
 </li>
 </ul>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/621479e1/testdevapidocs/org/apache/hadoop/hbase/master/balancer/LoadOnlyFavoredStochasticBalancer.html
----------------------------------------------------------------------
diff --git a/testdevapidocs/org/apache/hadoop/hbase/master/balancer/LoadOnlyFavoredStochasticBalancer.html b/testdevapidocs/org/apache/hadoop/hbase/master/balancer/LoadOnlyFavoredStochasticBalancer.html
index 30805c3..0b974bb 100644
--- a/testdevapidocs/org/apache/hadoop/hbase/master/balancer/LoadOnlyFavoredStochasticBalancer.html
+++ b/testdevapidocs/org/apache/hadoop/hbase/master/balancer/LoadOnlyFavoredStochasticBalancer.html
@@ -255,7 +255,7 @@ extends org.apache.hadoop.hbase.master.balancer.FavoredStochasticBalancer</pre>
 <!--   -->
 </a>
 <h3>Methods inherited from class&nbsp;org.apache.hadoop.hbase.master.balancer.BaseLoadBalancer</h3>
-<code>assignMasterSystemRegions, balanceMasterRegions, createCluster, getConf, getRegionAssignmentsByServer, isStopped, regionOffline, regionOnline, setClusterLoad, setRackManager, shouldBeOnMaster, stop</code></li>
+<code>assignMasterSystemRegions, balanceMasterRegions, createCluster, getConf, getRegionAssignmentsByServer, isStopped, postMasterStartupInitialize, regionOffline, regionOnline, setClusterLoad, setRackManager, shouldBeOnMaster, stop</code></li>
 </ul>
 <ul class="blockList">
 <li class="blockList"><a name="methods.inherited.from.class.java.lang.Object">

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/621479e1/testdevapidocs/org/apache/hadoop/hbase/master/balancer/TestBaseLoadBalancer.MockBalancer.html
----------------------------------------------------------------------
diff --git a/testdevapidocs/org/apache/hadoop/hbase/master/balancer/TestBaseLoadBalancer.MockBalancer.html b/testdevapidocs/org/apache/hadoop/hbase/master/balancer/TestBaseLoadBalancer.MockBalancer.html
index e193c37..dd40522 100644
--- a/testdevapidocs/org/apache/hadoop/hbase/master/balancer/TestBaseLoadBalancer.MockBalancer.html
+++ b/testdevapidocs/org/apache/hadoop/hbase/master/balancer/TestBaseLoadBalancer.MockBalancer.html
@@ -211,7 +211,7 @@ extends org.apache.hadoop.hbase.master.balancer.BaseLoadBalancer</pre>
 <!--   -->
 </a>
 <h3>Methods inherited from class&nbsp;org.apache.hadoop.hbase.master.balancer.BaseLoadBalancer</h3>
-<code>areSomeRegionReplicasColocated, assignMasterSystemRegions, balanceMasterRegions, createCluster, getConf, getRegionAssignmentsByServer, initialize, isStopped, needsBalance, onConfigurationChange, randomAssignment, regionOffline, regionOnline, retainAssignment, roundRobinAssignment, setClusterLoad, setClusterMetrics, setConf, setMasterServices, setRackManager, setSlop, shouldBeOnMaster, stop</code></li>
+<code>areSomeRegionReplicasColocated, assignMasterSystemRegions, balanceMasterRegions, createCluster, getConf, getRegionAssignmentsByServer, initialize, isStopped, needsBalance, onConfigurationChange, postMasterStartupInitialize, randomAssignment, regionOffline, regionOnline, retainAssignment, roundRobinAssignment, setClusterLoad, setClusterMetrics, setConf, setMasterServices, setRackManager, setSlop, shouldBeOnMaster, stop</code></li>
 </ul>
 <ul class="blockList">
 <li class="blockList"><a name="methods.inherited.from.class.java.lang.Object">


[19/29] hbase-site git commit: Published site at 477f9fdb32873387231c5fbbff130ba8bf7b5d68.

Posted by gi...@apache.org.
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/621479e1/devapidocs/src-html/org/apache/hadoop/hbase/master/HMaster.MasterStoppedException.html
----------------------------------------------------------------------
diff --git a/devapidocs/src-html/org/apache/hadoop/hbase/master/HMaster.MasterStoppedException.html b/devapidocs/src-html/org/apache/hadoop/hbase/master/HMaster.MasterStoppedException.html
index 2b1b6c6..adaa381 100644
--- a/devapidocs/src-html/org/apache/hadoop/hbase/master/HMaster.MasterStoppedException.html
+++ b/devapidocs/src-html/org/apache/hadoop/hbase/master/HMaster.MasterStoppedException.html
@@ -1011,2651 +1011,2662 @@
 <span class="sourceLineNo">1003</span>    }<a name="line.1003"></a>
 <span class="sourceLineNo">1004</span><a name="line.1004"></a>
 <span class="sourceLineNo">1005</span>    zombieDetector.interrupt();<a name="line.1005"></a>
-<span class="sourceLineNo">1006</span>  }<a name="line.1006"></a>
-<span class="sourceLineNo">1007</span><a name="line.1007"></a>
-<span class="sourceLineNo">1008</span>  /**<a name="line.1008"></a>
-<span class="sourceLineNo">1009</span>   * Adds the {@code MasterSpaceQuotaObserver} to the list of configured Master observers to<a name="line.1009"></a>
-<span class="sourceLineNo">1010</span>   * automatically remove space quotas for a table when that table is deleted.<a name="line.1010"></a>
-<span class="sourceLineNo">1011</span>   */<a name="line.1011"></a>
-<span class="sourceLineNo">1012</span>  @VisibleForTesting<a name="line.1012"></a>
-<span class="sourceLineNo">1013</span>  public void updateConfigurationForSpaceQuotaObserver(Configuration conf) {<a name="line.1013"></a>
-<span class="sourceLineNo">1014</span>    // We're configured to not delete quotas on table deletion, so we don't need to add the obs.<a name="line.1014"></a>
-<span class="sourceLineNo">1015</span>    if (!conf.getBoolean(<a name="line.1015"></a>
-<span class="sourceLineNo">1016</span>          MasterSpaceQuotaObserver.REMOVE_QUOTA_ON_TABLE_DELETE,<a name="line.1016"></a>
-<span class="sourceLineNo">1017</span>          MasterSpaceQuotaObserver.REMOVE_QUOTA_ON_TABLE_DELETE_DEFAULT)) {<a name="line.1017"></a>
-<span class="sourceLineNo">1018</span>      return;<a name="line.1018"></a>
-<span class="sourceLineNo">1019</span>    }<a name="line.1019"></a>
-<span class="sourceLineNo">1020</span>    String[] masterCoprocs = conf.getStrings(CoprocessorHost.MASTER_COPROCESSOR_CONF_KEY);<a name="line.1020"></a>
-<span class="sourceLineNo">1021</span>    final int length = null == masterCoprocs ? 0 : masterCoprocs.length;<a name="line.1021"></a>
-<span class="sourceLineNo">1022</span>    String[] updatedCoprocs = new String[length + 1];<a name="line.1022"></a>
-<span class="sourceLineNo">1023</span>    if (length &gt; 0) {<a name="line.1023"></a>
-<span class="sourceLineNo">1024</span>      System.arraycopy(masterCoprocs, 0, updatedCoprocs, 0, masterCoprocs.length);<a name="line.1024"></a>
-<span class="sourceLineNo">1025</span>    }<a name="line.1025"></a>
-<span class="sourceLineNo">1026</span>    updatedCoprocs[length] = MasterSpaceQuotaObserver.class.getName();<a name="line.1026"></a>
-<span class="sourceLineNo">1027</span>    conf.setStrings(CoprocessorHost.MASTER_COPROCESSOR_CONF_KEY, updatedCoprocs);<a name="line.1027"></a>
-<span class="sourceLineNo">1028</span>  }<a name="line.1028"></a>
-<span class="sourceLineNo">1029</span><a name="line.1029"></a>
-<span class="sourceLineNo">1030</span>  private void initMobCleaner() {<a name="line.1030"></a>
-<span class="sourceLineNo">1031</span>    this.expiredMobFileCleanerChore = new ExpiredMobFileCleanerChore(this);<a name="line.1031"></a>
-<span class="sourceLineNo">1032</span>    getChoreService().scheduleChore(expiredMobFileCleanerChore);<a name="line.1032"></a>
-<span class="sourceLineNo">1033</span><a name="line.1033"></a>
-<span class="sourceLineNo">1034</span>    int mobCompactionPeriod = conf.getInt(MobConstants.MOB_COMPACTION_CHORE_PERIOD,<a name="line.1034"></a>
-<span class="sourceLineNo">1035</span>        MobConstants.DEFAULT_MOB_COMPACTION_CHORE_PERIOD);<a name="line.1035"></a>
-<span class="sourceLineNo">1036</span>    if (mobCompactionPeriod &gt; 0) {<a name="line.1036"></a>
-<span class="sourceLineNo">1037</span>      this.mobCompactChore = new MobCompactionChore(this, mobCompactionPeriod);<a name="line.1037"></a>
-<span class="sourceLineNo">1038</span>      getChoreService().scheduleChore(mobCompactChore);<a name="line.1038"></a>
-<span class="sourceLineNo">1039</span>    } else {<a name="line.1039"></a>
-<span class="sourceLineNo">1040</span>      LOG<a name="line.1040"></a>
-<span class="sourceLineNo">1041</span>        .info("The period is " + mobCompactionPeriod + " seconds, MobCompactionChore is disabled");<a name="line.1041"></a>
-<span class="sourceLineNo">1042</span>    }<a name="line.1042"></a>
-<span class="sourceLineNo">1043</span>    this.mobCompactThread = new MasterMobCompactionThread(this);<a name="line.1043"></a>
-<span class="sourceLineNo">1044</span>  }<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>   * Create a {@link MasterMetaBootstrap} instance.<a name="line.1047"></a>
-<span class="sourceLineNo">1048</span>   */<a name="line.1048"></a>
-<span class="sourceLineNo">1049</span>  MasterMetaBootstrap createMetaBootstrap(final HMaster master, final MonitoredTask status) {<a name="line.1049"></a>
-<span class="sourceLineNo">1050</span>    // We put this out here in a method so can do a Mockito.spy and stub it out<a name="line.1050"></a>
-<span class="sourceLineNo">1051</span>    // w/ a mocked up MasterMetaBootstrap.<a name="line.1051"></a>
-<span class="sourceLineNo">1052</span>    return new MasterMetaBootstrap(master, status);<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>  /**<a name="line.1055"></a>
-<span class="sourceLineNo">1056</span>   * Create a {@link ServerManager} instance.<a name="line.1056"></a>
-<span class="sourceLineNo">1057</span>   */<a name="line.1057"></a>
-<span class="sourceLineNo">1058</span>  ServerManager createServerManager(final MasterServices master) throws IOException {<a name="line.1058"></a>
-<span class="sourceLineNo">1059</span>    // We put this out here in a method so can do a Mockito.spy and stub it out<a name="line.1059"></a>
-<span class="sourceLineNo">1060</span>    // w/ a mocked up ServerManager.<a name="line.1060"></a>
-<span class="sourceLineNo">1061</span>    setupClusterConnection();<a name="line.1061"></a>
-<span class="sourceLineNo">1062</span>    return new ServerManager(master);<a name="line.1062"></a>
-<span class="sourceLineNo">1063</span>  }<a name="line.1063"></a>
-<span class="sourceLineNo">1064</span><a name="line.1064"></a>
-<span class="sourceLineNo">1065</span>  private void waitForRegionServers(final MonitoredTask status)<a name="line.1065"></a>
-<span class="sourceLineNo">1066</span>      throws IOException, InterruptedException {<a name="line.1066"></a>
-<span class="sourceLineNo">1067</span>    this.serverManager.waitForRegionServers(status);<a name="line.1067"></a>
-<span class="sourceLineNo">1068</span>    // Check zk for region servers that are up but didn't register<a name="line.1068"></a>
-<span class="sourceLineNo">1069</span>    for (ServerName sn: this.regionServerTracker.getOnlineServers()) {<a name="line.1069"></a>
-<span class="sourceLineNo">1070</span>      // The isServerOnline check is opportunistic, correctness is handled inside<a name="line.1070"></a>
-<span class="sourceLineNo">1071</span>      if (!this.serverManager.isServerOnline(sn) &amp;&amp;<a name="line.1071"></a>
-<span class="sourceLineNo">1072</span>          serverManager.checkAndRecordNewServer(sn, ServerMetricsBuilder.of(sn))) {<a name="line.1072"></a>
-<span class="sourceLineNo">1073</span>        LOG.info("Registered server found up in zk but who has not yet reported in: " + sn);<a name="line.1073"></a>
-<span class="sourceLineNo">1074</span>      }<a name="line.1074"></a>
-<span class="sourceLineNo">1075</span>    }<a name="line.1075"></a>
-<span class="sourceLineNo">1076</span>  }<a name="line.1076"></a>
-<span class="sourceLineNo">1077</span><a name="line.1077"></a>
-<span class="sourceLineNo">1078</span>  void initClusterSchemaService() throws IOException, InterruptedException {<a name="line.1078"></a>
-<span class="sourceLineNo">1079</span>    this.clusterSchemaService = new ClusterSchemaServiceImpl(this);<a name="line.1079"></a>
-<span class="sourceLineNo">1080</span>    this.clusterSchemaService.startAsync();<a name="line.1080"></a>
-<span class="sourceLineNo">1081</span>    try {<a name="line.1081"></a>
-<span class="sourceLineNo">1082</span>      this.clusterSchemaService.awaitRunning(getConfiguration().getInt(<a name="line.1082"></a>
-<span class="sourceLineNo">1083</span>        HBASE_MASTER_WAIT_ON_SERVICE_IN_SECONDS,<a name="line.1083"></a>
-<span class="sourceLineNo">1084</span>        DEFAULT_HBASE_MASTER_WAIT_ON_SERVICE_IN_SECONDS), TimeUnit.SECONDS);<a name="line.1084"></a>
-<span class="sourceLineNo">1085</span>    } catch (TimeoutException toe) {<a name="line.1085"></a>
-<span class="sourceLineNo">1086</span>      throw new IOException("Timedout starting ClusterSchemaService", toe);<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><a name="line.1089"></a>
-<span class="sourceLineNo">1090</span>  void initQuotaManager() throws IOException {<a name="line.1090"></a>
-<span class="sourceLineNo">1091</span>    MasterQuotaManager quotaManager = new MasterQuotaManager(this);<a name="line.1091"></a>
-<span class="sourceLineNo">1092</span>    this.assignmentManager.setRegionStateListener(quotaManager);<a name="line.1092"></a>
-<span class="sourceLineNo">1093</span>    quotaManager.start();<a name="line.1093"></a>
-<span class="sourceLineNo">1094</span>    this.quotaManager = quotaManager;<a name="line.1094"></a>
-<span class="sourceLineNo">1095</span>  }<a name="line.1095"></a>
-<span class="sourceLineNo">1096</span><a name="line.1096"></a>
-<span class="sourceLineNo">1097</span>  SpaceQuotaSnapshotNotifier createQuotaSnapshotNotifier() {<a name="line.1097"></a>
-<span class="sourceLineNo">1098</span>    SpaceQuotaSnapshotNotifier notifier =<a name="line.1098"></a>
-<span class="sourceLineNo">1099</span>        SpaceQuotaSnapshotNotifierFactory.getInstance().create(getConfiguration());<a name="line.1099"></a>
-<span class="sourceLineNo">1100</span>    return notifier;<a name="line.1100"></a>
-<span class="sourceLineNo">1101</span>  }<a name="line.1101"></a>
-<span class="sourceLineNo">1102</span><a name="line.1102"></a>
-<span class="sourceLineNo">1103</span>  boolean isCatalogJanitorEnabled() {<a name="line.1103"></a>
-<span class="sourceLineNo">1104</span>    return catalogJanitorChore != null ?<a name="line.1104"></a>
-<span class="sourceLineNo">1105</span>      catalogJanitorChore.getEnabled() : false;<a name="line.1105"></a>
+<span class="sourceLineNo">1006</span><a name="line.1006"></a>
+<span class="sourceLineNo">1007</span>    /*<a name="line.1007"></a>
+<span class="sourceLineNo">1008</span>     * After master has started up, lets do balancer post startup initialization. Since this runs<a name="line.1008"></a>
+<span class="sourceLineNo">1009</span>     * in activeMasterManager thread, it should be fine.<a name="line.1009"></a>
+<span class="sourceLineNo">1010</span>     */<a name="line.1010"></a>
+<span class="sourceLineNo">1011</span>    long start = System.currentTimeMillis();<a name="line.1011"></a>
+<span class="sourceLineNo">1012</span>    this.balancer.postMasterStartupInitialize();<a name="line.1012"></a>
+<span class="sourceLineNo">1013</span>    if (LOG.isDebugEnabled()) {<a name="line.1013"></a>
+<span class="sourceLineNo">1014</span>      LOG.debug("Balancer post startup initialization complete, took " + (<a name="line.1014"></a>
+<span class="sourceLineNo">1015</span>          (System.currentTimeMillis() - start) / 1000) + " seconds");<a name="line.1015"></a>
+<span class="sourceLineNo">1016</span>    }<a name="line.1016"></a>
+<span class="sourceLineNo">1017</span>  }<a name="line.1017"></a>
+<span class="sourceLineNo">1018</span><a name="line.1018"></a>
+<span class="sourceLineNo">1019</span>  /**<a name="line.1019"></a>
+<span class="sourceLineNo">1020</span>   * Adds the {@code MasterSpaceQuotaObserver} to the list of configured Master observers to<a name="line.1020"></a>
+<span class="sourceLineNo">1021</span>   * automatically remove space quotas for a table when that table is deleted.<a name="line.1021"></a>
+<span class="sourceLineNo">1022</span>   */<a name="line.1022"></a>
+<span class="sourceLineNo">1023</span>  @VisibleForTesting<a name="line.1023"></a>
+<span class="sourceLineNo">1024</span>  public void updateConfigurationForSpaceQuotaObserver(Configuration conf) {<a name="line.1024"></a>
+<span class="sourceLineNo">1025</span>    // We're configured to not delete quotas on table deletion, so we don't need to add the obs.<a name="line.1025"></a>
+<span class="sourceLineNo">1026</span>    if (!conf.getBoolean(<a name="line.1026"></a>
+<span class="sourceLineNo">1027</span>          MasterSpaceQuotaObserver.REMOVE_QUOTA_ON_TABLE_DELETE,<a name="line.1027"></a>
+<span class="sourceLineNo">1028</span>          MasterSpaceQuotaObserver.REMOVE_QUOTA_ON_TABLE_DELETE_DEFAULT)) {<a name="line.1028"></a>
+<span class="sourceLineNo">1029</span>      return;<a name="line.1029"></a>
+<span class="sourceLineNo">1030</span>    }<a name="line.1030"></a>
+<span class="sourceLineNo">1031</span>    String[] masterCoprocs = conf.getStrings(CoprocessorHost.MASTER_COPROCESSOR_CONF_KEY);<a name="line.1031"></a>
+<span class="sourceLineNo">1032</span>    final int length = null == masterCoprocs ? 0 : masterCoprocs.length;<a name="line.1032"></a>
+<span class="sourceLineNo">1033</span>    String[] updatedCoprocs = new String[length + 1];<a name="line.1033"></a>
+<span class="sourceLineNo">1034</span>    if (length &gt; 0) {<a name="line.1034"></a>
+<span class="sourceLineNo">1035</span>      System.arraycopy(masterCoprocs, 0, updatedCoprocs, 0, masterCoprocs.length);<a name="line.1035"></a>
+<span class="sourceLineNo">1036</span>    }<a name="line.1036"></a>
+<span class="sourceLineNo">1037</span>    updatedCoprocs[length] = MasterSpaceQuotaObserver.class.getName();<a name="line.1037"></a>
+<span class="sourceLineNo">1038</span>    conf.setStrings(CoprocessorHost.MASTER_COPROCESSOR_CONF_KEY, updatedCoprocs);<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>  private void initMobCleaner() {<a name="line.1041"></a>
+<span class="sourceLineNo">1042</span>    this.expiredMobFileCleanerChore = new ExpiredMobFileCleanerChore(this);<a name="line.1042"></a>
+<span class="sourceLineNo">1043</span>    getChoreService().scheduleChore(expiredMobFileCleanerChore);<a name="line.1043"></a>
+<span class="sourceLineNo">1044</span><a name="line.1044"></a>
+<span class="sourceLineNo">1045</span>    int mobCompactionPeriod = conf.getInt(MobConstants.MOB_COMPACTION_CHORE_PERIOD,<a name="line.1045"></a>
+<span class="sourceLineNo">1046</span>        MobConstants.DEFAULT_MOB_COMPACTION_CHORE_PERIOD);<a name="line.1046"></a>
+<span class="sourceLineNo">1047</span>    if (mobCompactionPeriod &gt; 0) {<a name="line.1047"></a>
+<span class="sourceLineNo">1048</span>      this.mobCompactChore = new MobCompactionChore(this, mobCompactionPeriod);<a name="line.1048"></a>
+<span class="sourceLineNo">1049</span>      getChoreService().scheduleChore(mobCompactChore);<a name="line.1049"></a>
+<span class="sourceLineNo">1050</span>    } else {<a name="line.1050"></a>
+<span class="sourceLineNo">1051</span>      LOG<a name="line.1051"></a>
+<span class="sourceLineNo">1052</span>        .info("The period is " + mobCompactionPeriod + " seconds, MobCompactionChore is disabled");<a name="line.1052"></a>
+<span class="sourceLineNo">1053</span>    }<a name="line.1053"></a>
+<span class="sourceLineNo">1054</span>    this.mobCompactThread = new MasterMobCompactionThread(this);<a name="line.1054"></a>
+<span class="sourceLineNo">1055</span>  }<a name="line.1055"></a>
+<span class="sourceLineNo">1056</span><a name="line.1056"></a>
+<span class="sourceLineNo">1057</span>  /**<a name="line.1057"></a>
+<span class="sourceLineNo">1058</span>   * Create a {@link MasterMetaBootstrap} instance.<a name="line.1058"></a>
+<span class="sourceLineNo">1059</span>   */<a name="line.1059"></a>
+<span class="sourceLineNo">1060</span>  MasterMetaBootstrap createMetaBootstrap(final HMaster master, final MonitoredTask status) {<a name="line.1060"></a>
+<span class="sourceLineNo">1061</span>    // We put this out here in a method so can do a Mockito.spy and stub it out<a name="line.1061"></a>
+<span class="sourceLineNo">1062</span>    // w/ a mocked up MasterMetaBootstrap.<a name="line.1062"></a>
+<span class="sourceLineNo">1063</span>    return new MasterMetaBootstrap(master, status);<a name="line.1063"></a>
+<span class="sourceLineNo">1064</span>  }<a name="line.1064"></a>
+<span class="sourceLineNo">1065</span><a name="line.1065"></a>
+<span class="sourceLineNo">1066</span>  /**<a name="line.1066"></a>
+<span class="sourceLineNo">1067</span>   * Create a {@link ServerManager} instance.<a name="line.1067"></a>
+<span class="sourceLineNo">1068</span>   */<a name="line.1068"></a>
+<span class="sourceLineNo">1069</span>  ServerManager createServerManager(final MasterServices master) throws IOException {<a name="line.1069"></a>
+<span class="sourceLineNo">1070</span>    // We put this out here in a method so can do a Mockito.spy and stub it out<a name="line.1070"></a>
+<span class="sourceLineNo">1071</span>    // w/ a mocked up ServerManager.<a name="line.1071"></a>
+<span class="sourceLineNo">1072</span>    setupClusterConnection();<a name="line.1072"></a>
+<span class="sourceLineNo">1073</span>    return new ServerManager(master);<a name="line.1073"></a>
+<span class="sourceLineNo">1074</span>  }<a name="line.1074"></a>
+<span class="sourceLineNo">1075</span><a name="line.1075"></a>
+<span class="sourceLineNo">1076</span>  private void waitForRegionServers(final MonitoredTask status)<a name="line.1076"></a>
+<span class="sourceLineNo">1077</span>      throws IOException, InterruptedException {<a name="line.1077"></a>
+<span class="sourceLineNo">1078</span>    this.serverManager.waitForRegionServers(status);<a name="line.1078"></a>
+<span class="sourceLineNo">1079</span>    // Check zk for region servers that are up but didn't register<a name="line.1079"></a>
+<span class="sourceLineNo">1080</span>    for (ServerName sn: this.regionServerTracker.getOnlineServers()) {<a name="line.1080"></a>
+<span class="sourceLineNo">1081</span>      // The isServerOnline check is opportunistic, correctness is handled inside<a name="line.1081"></a>
+<span class="sourceLineNo">1082</span>      if (!this.serverManager.isServerOnline(sn) &amp;&amp;<a name="line.1082"></a>
+<span class="sourceLineNo">1083</span>          serverManager.checkAndRecordNewServer(sn, ServerMetricsBuilder.of(sn))) {<a name="line.1083"></a>
+<span class="sourceLineNo">1084</span>        LOG.info("Registered server found up in zk but who has not yet reported in: " + sn);<a name="line.1084"></a>
+<span class="sourceLineNo">1085</span>      }<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>  void initClusterSchemaService() throws IOException, InterruptedException {<a name="line.1089"></a>
+<span class="sourceLineNo">1090</span>    this.clusterSchemaService = new ClusterSchemaServiceImpl(this);<a name="line.1090"></a>
+<span class="sourceLineNo">1091</span>    this.clusterSchemaService.startAsync();<a name="line.1091"></a>
+<span class="sourceLineNo">1092</span>    try {<a name="line.1092"></a>
+<span class="sourceLineNo">1093</span>      this.clusterSchemaService.awaitRunning(getConfiguration().getInt(<a name="line.1093"></a>
+<span class="sourceLineNo">1094</span>        HBASE_MASTER_WAIT_ON_SERVICE_IN_SECONDS,<a name="line.1094"></a>
+<span class="sourceLineNo">1095</span>        DEFAULT_HBASE_MASTER_WAIT_ON_SERVICE_IN_SECONDS), TimeUnit.SECONDS);<a name="line.1095"></a>
+<span class="sourceLineNo">1096</span>    } catch (TimeoutException toe) {<a name="line.1096"></a>
+<span class="sourceLineNo">1097</span>      throw new IOException("Timedout starting ClusterSchemaService", toe);<a name="line.1097"></a>
+<span class="sourceLineNo">1098</span>    }<a name="line.1098"></a>
+<span class="sourceLineNo">1099</span>  }<a name="line.1099"></a>
+<span class="sourceLineNo">1100</span><a name="line.1100"></a>
+<span class="sourceLineNo">1101</span>  void initQuotaManager() throws IOException {<a name="line.1101"></a>
+<span class="sourceLineNo">1102</span>    MasterQuotaManager quotaManager = new MasterQuotaManager(this);<a name="line.1102"></a>
+<span class="sourceLineNo">1103</span>    this.assignmentManager.setRegionStateListener(quotaManager);<a name="line.1103"></a>
+<span class="sourceLineNo">1104</span>    quotaManager.start();<a name="line.1104"></a>
+<span class="sourceLineNo">1105</span>    this.quotaManager = quotaManager;<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>  boolean isCleanerChoreEnabled() {<a name="line.1108"></a>
-<span class="sourceLineNo">1109</span>    boolean hfileCleanerFlag = true, logCleanerFlag = true;<a name="line.1109"></a>
-<span class="sourceLineNo">1110</span><a name="line.1110"></a>
-<span class="sourceLineNo">1111</span>    if (hfileCleaner != null) {<a name="line.1111"></a>
-<span class="sourceLineNo">1112</span>      hfileCleanerFlag = hfileCleaner.getEnabled();<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>    if (logCleaner != null) {<a name="line.1115"></a>
-<span class="sourceLineNo">1116</span>      logCleanerFlag = logCleaner.getEnabled();<a name="line.1116"></a>
-<span class="sourceLineNo">1117</span>    }<a name="line.1117"></a>
+<span class="sourceLineNo">1108</span>  SpaceQuotaSnapshotNotifier createQuotaSnapshotNotifier() {<a name="line.1108"></a>
+<span class="sourceLineNo">1109</span>    SpaceQuotaSnapshotNotifier notifier =<a name="line.1109"></a>
+<span class="sourceLineNo">1110</span>        SpaceQuotaSnapshotNotifierFactory.getInstance().create(getConfiguration());<a name="line.1110"></a>
+<span class="sourceLineNo">1111</span>    return notifier;<a name="line.1111"></a>
+<span class="sourceLineNo">1112</span>  }<a name="line.1112"></a>
+<span class="sourceLineNo">1113</span><a name="line.1113"></a>
+<span class="sourceLineNo">1114</span>  boolean isCatalogJanitorEnabled() {<a name="line.1114"></a>
+<span class="sourceLineNo">1115</span>    return catalogJanitorChore != null ?<a name="line.1115"></a>
+<span class="sourceLineNo">1116</span>      catalogJanitorChore.getEnabled() : false;<a name="line.1116"></a>
+<span class="sourceLineNo">1117</span>  }<a name="line.1117"></a>
 <span class="sourceLineNo">1118</span><a name="line.1118"></a>
-<span class="sourceLineNo">1119</span>    return (hfileCleanerFlag &amp;&amp; logCleanerFlag);<a name="line.1119"></a>
-<span class="sourceLineNo">1120</span>  }<a name="line.1120"></a>
+<span class="sourceLineNo">1119</span>  boolean isCleanerChoreEnabled() {<a name="line.1119"></a>
+<span class="sourceLineNo">1120</span>    boolean hfileCleanerFlag = true, logCleanerFlag = true;<a name="line.1120"></a>
 <span class="sourceLineNo">1121</span><a name="line.1121"></a>
-<span class="sourceLineNo">1122</span>  @Override<a name="line.1122"></a>
-<span class="sourceLineNo">1123</span>  public TableDescriptors getTableDescriptors() {<a name="line.1123"></a>
-<span class="sourceLineNo">1124</span>    return this.tableDescriptors;<a name="line.1124"></a>
-<span class="sourceLineNo">1125</span>  }<a name="line.1125"></a>
-<span class="sourceLineNo">1126</span><a name="line.1126"></a>
-<span class="sourceLineNo">1127</span>  @Override<a name="line.1127"></a>
-<span class="sourceLineNo">1128</span>  public ServerManager getServerManager() {<a name="line.1128"></a>
-<span class="sourceLineNo">1129</span>    return this.serverManager;<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>  @Override<a name="line.1132"></a>
-<span class="sourceLineNo">1133</span>  public MasterFileSystem getMasterFileSystem() {<a name="line.1133"></a>
-<span class="sourceLineNo">1134</span>    return this.fileSystemManager;<a name="line.1134"></a>
-<span class="sourceLineNo">1135</span>  }<a name="line.1135"></a>
-<span class="sourceLineNo">1136</span><a name="line.1136"></a>
-<span class="sourceLineNo">1137</span>  @Override<a name="line.1137"></a>
-<span class="sourceLineNo">1138</span>  public MasterWalManager getMasterWalManager() {<a name="line.1138"></a>
-<span class="sourceLineNo">1139</span>    return this.walManager;<a name="line.1139"></a>
-<span class="sourceLineNo">1140</span>  }<a name="line.1140"></a>
-<span class="sourceLineNo">1141</span><a name="line.1141"></a>
-<span class="sourceLineNo">1142</span>  @Override<a name="line.1142"></a>
-<span class="sourceLineNo">1143</span>  public TableStateManager getTableStateManager() {<a name="line.1143"></a>
-<span class="sourceLineNo">1144</span>    return tableStateManager;<a name="line.1144"></a>
-<span class="sourceLineNo">1145</span>  }<a name="line.1145"></a>
-<span class="sourceLineNo">1146</span><a name="line.1146"></a>
-<span class="sourceLineNo">1147</span>  /*<a name="line.1147"></a>
-<span class="sourceLineNo">1148</span>   * Start up all services. If any of these threads gets an unhandled exception<a name="line.1148"></a>
-<span class="sourceLineNo">1149</span>   * then they just die with a logged message.  This should be fine because<a name="line.1149"></a>
-<span class="sourceLineNo">1150</span>   * in general, we do not expect the master to get such unhandled exceptions<a name="line.1150"></a>
-<span class="sourceLineNo">1151</span>   *  as OOMEs; it should be lightly loaded. See what HRegionServer does if<a name="line.1151"></a>
-<span class="sourceLineNo">1152</span>   *  need to install an unexpected exception handler.<a name="line.1152"></a>
-<span class="sourceLineNo">1153</span>   */<a name="line.1153"></a>
-<span class="sourceLineNo">1154</span>  private void startServiceThreads() throws IOException{<a name="line.1154"></a>
-<span class="sourceLineNo">1155</span>   // Start the executor service pools<a name="line.1155"></a>
-<span class="sourceLineNo">1156</span>   this.executorService.startExecutorService(ExecutorType.MASTER_OPEN_REGION,<a name="line.1156"></a>
-<span class="sourceLineNo">1157</span>      conf.getInt("hbase.master.executor.openregion.threads", 5));<a name="line.1157"></a>
-<span class="sourceLineNo">1158</span>   this.executorService.startExecutorService(ExecutorType.MASTER_CLOSE_REGION,<a name="line.1158"></a>
-<span class="sourceLineNo">1159</span>      conf.getInt("hbase.master.executor.closeregion.threads", 5));<a name="line.1159"></a>
-<span class="sourceLineNo">1160</span>   this.executorService.startExecutorService(ExecutorType.MASTER_SERVER_OPERATIONS,<a name="line.1160"></a>
-<span class="sourceLineNo">1161</span>      conf.getInt("hbase.master.executor.serverops.threads", 5));<a name="line.1161"></a>
-<span class="sourceLineNo">1162</span>   this.executorService.startExecutorService(ExecutorType.MASTER_META_SERVER_OPERATIONS,<a name="line.1162"></a>
-<span class="sourceLineNo">1163</span>      conf.getInt("hbase.master.executor.meta.serverops.threads", 5));<a name="line.1163"></a>
-<span class="sourceLineNo">1164</span>   this.executorService.startExecutorService(ExecutorType.M_LOG_REPLAY_OPS,<a name="line.1164"></a>
-<span class="sourceLineNo">1165</span>      conf.getInt("hbase.master.executor.logreplayops.threads", 10));<a name="line.1165"></a>
-<span class="sourceLineNo">1166</span><a name="line.1166"></a>
-<span class="sourceLineNo">1167</span>   // We depend on there being only one instance of this executor running<a name="line.1167"></a>
-<span class="sourceLineNo">1168</span>   // at a time.  To do concurrency, would need fencing of enable/disable of<a name="line.1168"></a>
-<span class="sourceLineNo">1169</span>   // tables.<a name="line.1169"></a>
-<span class="sourceLineNo">1170</span>   // Any time changing this maxThreads to &gt; 1, pls see the comment at<a name="line.1170"></a>
-<span class="sourceLineNo">1171</span>   // AccessController#postCompletedCreateTableAction<a name="line.1171"></a>
-<span class="sourceLineNo">1172</span>   this.executorService.startExecutorService(ExecutorType.MASTER_TABLE_OPERATIONS, 1);<a name="line.1172"></a>
-<span class="sourceLineNo">1173</span>   startProcedureExecutor();<a name="line.1173"></a>
-<span class="sourceLineNo">1174</span><a name="line.1174"></a>
-<span class="sourceLineNo">1175</span>    // Initial cleaner chore<a name="line.1175"></a>
-<span class="sourceLineNo">1176</span>    CleanerChore.initChorePool(conf);<a name="line.1176"></a>
-<span class="sourceLineNo">1177</span>   // Start log cleaner thread<a name="line.1177"></a>
-<span class="sourceLineNo">1178</span>   int cleanerInterval = conf.getInt("hbase.master.cleaner.interval", 600 * 1000);<a name="line.1178"></a>
-<span class="sourceLineNo">1179</span>   this.logCleaner =<a name="line.1179"></a>
-<span class="sourceLineNo">1180</span>      new LogCleaner(cleanerInterval,<a name="line.1180"></a>
-<span class="sourceLineNo">1181</span>         this, conf, getMasterWalManager().getFileSystem(),<a name="line.1181"></a>
-<span class="sourceLineNo">1182</span>         getMasterWalManager().getOldLogDir());<a name="line.1182"></a>
-<span class="sourceLineNo">1183</span>    getChoreService().scheduleChore(logCleaner);<a name="line.1183"></a>
-<span class="sourceLineNo">1184</span><a name="line.1184"></a>
-<span class="sourceLineNo">1185</span>    // start the hfile archive cleaner thread<a name="line.1185"></a>
-<span class="sourceLineNo">1186</span>    Path archiveDir = HFileArchiveUtil.getArchivePath(conf);<a name="line.1186"></a>
-<span class="sourceLineNo">1187</span>    Map&lt;String, Object&gt; params = new HashMap&lt;&gt;();<a name="line.1187"></a>
-<span class="sourceLineNo">1188</span>    params.put(MASTER, this);<a name="line.1188"></a>
-<span class="sourceLineNo">1189</span>    this.hfileCleaner = new HFileCleaner(cleanerInterval, this, conf, getMasterFileSystem()<a name="line.1189"></a>
-<span class="sourceLineNo">1190</span>        .getFileSystem(), archiveDir, params);<a name="line.1190"></a>
-<span class="sourceLineNo">1191</span>    getChoreService().scheduleChore(hfileCleaner);<a name="line.1191"></a>
-<span class="sourceLineNo">1192</span><a name="line.1192"></a>
-<span class="sourceLineNo">1193</span>    replicationBarrierCleaner =<a name="line.1193"></a>
-<span class="sourceLineNo">1194</span>      new ReplicationBarrierCleaner(conf, this, getConnection(), replicationPeerManager);<a name="line.1194"></a>
-<span class="sourceLineNo">1195</span>    getChoreService().scheduleChore(replicationBarrierCleaner);<a name="line.1195"></a>
-<span class="sourceLineNo">1196</span><a name="line.1196"></a>
-<span class="sourceLineNo">1197</span>    serviceStarted = true;<a name="line.1197"></a>
-<span class="sourceLineNo">1198</span>    if (LOG.isTraceEnabled()) {<a name="line.1198"></a>
-<span class="sourceLineNo">1199</span>      LOG.trace("Started service threads");<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><a name="line.1202"></a>
-<span class="sourceLineNo">1203</span>  private void cancelChore(ScheduledChore chore) {<a name="line.1203"></a>
-<span class="sourceLineNo">1204</span>    if (chore != null) {<a name="line.1204"></a>
-<span class="sourceLineNo">1205</span>      chore.cancel();<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><a name="line.1208"></a>
-<span class="sourceLineNo">1209</span>  @Override<a name="line.1209"></a>
-<span class="sourceLineNo">1210</span>  protected void stopServiceThreads() {<a name="line.1210"></a>
-<span class="sourceLineNo">1211</span>    if (masterJettyServer != null) {<a name="line.1211"></a>
-<span class="sourceLineNo">1212</span>      LOG.info("Stopping master jetty server");<a name="line.1212"></a>
-<span class="sourceLineNo">1213</span>      try {<a name="line.1213"></a>
-<span class="sourceLineNo">1214</span>        masterJettyServer.stop();<a name="line.1214"></a>
-<span class="sourceLineNo">1215</span>      } catch (Exception e) {<a name="line.1215"></a>
-<span class="sourceLineNo">1216</span>        LOG.error("Failed to stop master jetty server", e);<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>    super.stopServiceThreads();<a name="line.1219"></a>
-<span class="sourceLineNo">1220</span>    stopChores();<a name="line.1220"></a>
-<span class="sourceLineNo">1221</span><a name="line.1221"></a>
-<span class="sourceLineNo">1222</span>    LOG.debug("Stopping service threads");<a name="line.1222"></a>
-<span class="sourceLineNo">1223</span><a name="line.1223"></a>
-<span class="sourceLineNo">1224</span>    if (this.quotaManager != null) {<a name="line.1224"></a>
-<span class="sourceLineNo">1225</span>      this.quotaManager.stop();<a name="line.1225"></a>
-<span class="sourceLineNo">1226</span>    }<a name="line.1226"></a>
-<span class="sourceLineNo">1227</span><a name="line.1227"></a>
-<span class="sourceLineNo">1228</span>    if (this.activeMasterManager != null) {<a name="line.1228"></a>
-<span class="sourceLineNo">1229</span>      this.activeMasterManager.stop();<a name="line.1229"></a>
-<span class="sourceLineNo">1230</span>    }<a name="line.1230"></a>
-<span class="sourceLineNo">1231</span>    if (this.serverManager != null) {<a name="line.1231"></a>
-<span class="sourceLineNo">1232</span>      this.serverManager.stop();<a name="line.1232"></a>
-<span class="sourceLineNo">1233</span>    }<a name="line.1233"></a>
-<span class="sourceLineNo">1234</span>    if (this.assignmentManager != null) {<a name="line.1234"></a>
-<span class="sourceLineNo">1235</span>      this.assignmentManager.stop();<a name="line.1235"></a>
-<span class="sourceLineNo">1236</span>    }<a name="line.1236"></a>
-<span class="sourceLineNo">1237</span><a name="line.1237"></a>
-<span class="sourceLineNo">1238</span>    stopProcedureExecutor();<a name="line.1238"></a>
-<span class="sourceLineNo">1239</span><a name="line.1239"></a>
-<span class="sourceLineNo">1240</span>    if (this.walManager != null) {<a name="line.1240"></a>
-<span class="sourceLineNo">1241</span>      this.walManager.stop();<a name="line.1241"></a>
-<span class="sourceLineNo">1242</span>    }<a name="line.1242"></a>
-<span class="sourceLineNo">1243</span>    if (this.fileSystemManager != null) {<a name="line.1243"></a>
-<span class="sourceLineNo">1244</span>      this.fileSystemManager.stop();<a name="line.1244"></a>
-<span class="sourceLineNo">1245</span>    }<a name="line.1245"></a>
-<span class="sourceLineNo">1246</span>    if (this.mpmHost != null) {<a name="line.1246"></a>
-<span class="sourceLineNo">1247</span>      this.mpmHost.stop("server shutting down.");<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">1122</span>    if (hfileCleaner != null) {<a name="line.1122"></a>
+<span class="sourceLineNo">1123</span>      hfileCleanerFlag = hfileCleaner.getEnabled();<a name="line.1123"></a>
+<span class="sourceLineNo">1124</span>    }<a name="line.1124"></a>
+<span class="sourceLineNo">1125</span><a name="line.1125"></a>
+<span class="sourceLineNo">1126</span>    if (logCleaner != null) {<a name="line.1126"></a>
+<span class="sourceLineNo">1127</span>      logCleanerFlag = logCleaner.getEnabled();<a name="line.1127"></a>
+<span class="sourceLineNo">1128</span>    }<a name="line.1128"></a>
+<span class="sourceLineNo">1129</span><a name="line.1129"></a>
+<span class="sourceLineNo">1130</span>    return (hfileCleanerFlag &amp;&amp; logCleanerFlag);<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>  @Override<a name="line.1133"></a>
+<span class="sourceLineNo">1134</span>  public TableDescriptors getTableDescriptors() {<a name="line.1134"></a>
+<span class="sourceLineNo">1135</span>    return this.tableDescriptors;<a name="line.1135"></a>
+<span class="sourceLineNo">1136</span>  }<a name="line.1136"></a>
+<span class="sourceLineNo">1137</span><a name="line.1137"></a>
+<span class="sourceLineNo">1138</span>  @Override<a name="line.1138"></a>
+<span class="sourceLineNo">1139</span>  public ServerManager getServerManager() {<a name="line.1139"></a>
+<span class="sourceLineNo">1140</span>    return this.serverManager;<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>  @Override<a name="line.1143"></a>
+<span class="sourceLineNo">1144</span>  public MasterFileSystem getMasterFileSystem() {<a name="line.1144"></a>
+<span class="sourceLineNo">1145</span>    return this.fileSystemManager;<a name="line.1145"></a>
+<span class="sourceLineNo">1146</span>  }<a name="line.1146"></a>
+<span class="sourceLineNo">1147</span><a name="line.1147"></a>
+<span class="sourceLineNo">1148</span>  @Override<a name="line.1148"></a>
+<span class="sourceLineNo">1149</span>  public MasterWalManager getMasterWalManager() {<a name="line.1149"></a>
+<span class="sourceLineNo">1150</span>    return this.walManager;<a name="line.1150"></a>
+<span class="sourceLineNo">1151</span>  }<a name="line.1151"></a>
+<span class="sourceLineNo">1152</span><a name="line.1152"></a>
+<span class="sourceLineNo">1153</span>  @Override<a name="line.1153"></a>
+<span class="sourceLineNo">1154</span>  public TableStateManager getTableStateManager() {<a name="line.1154"></a>
+<span class="sourceLineNo">1155</span>    return tableStateManager;<a name="line.1155"></a>
+<span class="sourceLineNo">1156</span>  }<a name="line.1156"></a>
+<span class="sourceLineNo">1157</span><a name="line.1157"></a>
+<span class="sourceLineNo">1158</span>  /*<a name="line.1158"></a>
+<span class="sourceLineNo">1159</span>   * Start up all services. If any of these threads gets an unhandled exception<a name="line.1159"></a>
+<span class="sourceLineNo">1160</span>   * then they just die with a logged message.  This should be fine because<a name="line.1160"></a>
+<span class="sourceLineNo">1161</span>   * in general, we do not expect the master to get such unhandled exceptions<a name="line.1161"></a>
+<span class="sourceLineNo">1162</span>   *  as OOMEs; it should be lightly loaded. See what HRegionServer does if<a name="line.1162"></a>
+<span class="sourceLineNo">1163</span>   *  need to install an unexpected exception handler.<a name="line.1163"></a>
+<span class="sourceLineNo">1164</span>   */<a name="line.1164"></a>
+<span class="sourceLineNo">1165</span>  private void startServiceThreads() throws IOException{<a name="line.1165"></a>
+<span class="sourceLineNo">1166</span>   // Start the executor service pools<a name="line.1166"></a>
+<span class="sourceLineNo">1167</span>   this.executorService.startExecutorService(ExecutorType.MASTER_OPEN_REGION,<a name="line.1167"></a>
+<span class="sourceLineNo">1168</span>      conf.getInt("hbase.master.executor.openregion.threads", 5));<a name="line.1168"></a>
+<span class="sourceLineNo">1169</span>   this.executorService.startExecutorService(ExecutorType.MASTER_CLOSE_REGION,<a name="line.1169"></a>
+<span class="sourceLineNo">1170</span>      conf.getInt("hbase.master.executor.closeregion.threads", 5));<a name="line.1170"></a>
+<span class="sourceLineNo">1171</span>   this.executorService.startExecutorService(ExecutorType.MASTER_SERVER_OPERATIONS,<a name="line.1171"></a>
+<span class="sourceLineNo">1172</span>      conf.getInt("hbase.master.executor.serverops.threads", 5));<a name="line.1172"></a>
+<span class="sourceLineNo">1173</span>   this.executorService.startExecutorService(ExecutorType.MASTER_META_SERVER_OPERATIONS,<a name="line.1173"></a>
+<span class="sourceLineNo">1174</span>      conf.getInt("hbase.master.executor.meta.serverops.threads", 5));<a name="line.1174"></a>
+<span class="sourceLineNo">1175</span>   this.executorService.startExecutorService(ExecutorType.M_LOG_REPLAY_OPS,<a name="line.1175"></a>
+<span class="sourceLineNo">1176</span>      conf.getInt("hbase.master.executor.logreplayops.threads", 10));<a name="line.1176"></a>
+<span class="sourceLineNo">1177</span><a name="line.1177"></a>
+<span class="sourceLineNo">1178</span>   // We depend on there being only one instance of this executor running<a name="line.1178"></a>
+<span class="sourceLineNo">1179</span>   // at a time.  To do concurrency, would need fencing of enable/disable of<a name="line.1179"></a>
+<span class="sourceLineNo">1180</span>   // tables.<a name="line.1180"></a>
+<span class="sourceLineNo">1181</span>   // Any time changing this maxThreads to &gt; 1, pls see the comment at<a name="line.1181"></a>
+<span class="sourceLineNo">1182</span>   // AccessController#postCompletedCreateTableAction<a name="line.1182"></a>
+<span class="sourceLineNo">1183</span>   this.executorService.startExecutorService(ExecutorType.MASTER_TABLE_OPERATIONS, 1);<a name="line.1183"></a>
+<span class="sourceLineNo">1184</span>   startProcedureExecutor();<a name="line.1184"></a>
+<span class="sourceLineNo">1185</span><a name="line.1185"></a>
+<span class="sourceLineNo">1186</span>    // Initial cleaner chore<a name="line.1186"></a>
+<span class="sourceLineNo">1187</span>    CleanerChore.initChorePool(conf);<a name="line.1187"></a>
+<span class="sourceLineNo">1188</span>   // Start log cleaner thread<a name="line.1188"></a>
+<span class="sourceLineNo">1189</span>   int cleanerInterval = conf.getInt("hbase.master.cleaner.interval", 600 * 1000);<a name="line.1189"></a>
+<span class="sourceLineNo">1190</span>   this.logCleaner =<a name="line.1190"></a>
+<span class="sourceLineNo">1191</span>      new LogCleaner(cleanerInterval,<a name="line.1191"></a>
+<span class="sourceLineNo">1192</span>         this, conf, getMasterWalManager().getFileSystem(),<a name="line.1192"></a>
+<span class="sourceLineNo">1193</span>         getMasterWalManager().getOldLogDir());<a name="line.1193"></a>
+<span class="sourceLineNo">1194</span>    getChoreService().scheduleChore(logCleaner);<a name="line.1194"></a>
+<span class="sourceLineNo">1195</span><a name="line.1195"></a>
+<span class="sourceLineNo">1196</span>    // start the hfile archive cleaner thread<a name="line.1196"></a>
+<span class="sourceLineNo">1197</span>    Path archiveDir = HFileArchiveUtil.getArchivePath(conf);<a name="line.1197"></a>
+<span class="sourceLineNo">1198</span>    Map&lt;String, Object&gt; params = new HashMap&lt;&gt;();<a name="line.1198"></a>
+<span class="sourceLineNo">1199</span>    params.put(MASTER, this);<a name="line.1199"></a>
+<span class="sourceLineNo">1200</span>    this.hfileCleaner = new HFileCleaner(cleanerInterval, this, conf, getMasterFileSystem()<a name="line.1200"></a>
+<span class="sourceLineNo">1201</span>        .getFileSystem(), archiveDir, params);<a name="line.1201"></a>
+<span class="sourceLineNo">1202</span>    getChoreService().scheduleChore(hfileCleaner);<a name="line.1202"></a>
+<span class="sourceLineNo">1203</span><a name="line.1203"></a>
+<span class="sourceLineNo">1204</span>    replicationBarrierCleaner =<a name="line.1204"></a>
+<span class="sourceLineNo">1205</span>      new ReplicationBarrierCleaner(conf, this, getConnection(), replicationPeerManager);<a name="line.1205"></a>
+<span class="sourceLineNo">1206</span>    getChoreService().scheduleChore(replicationBarrierCleaner);<a name="line.1206"></a>
+<span class="sourceLineNo">1207</span><a name="line.1207"></a>
+<span class="sourceLineNo">1208</span>    serviceStarted = true;<a name="line.1208"></a>
+<span class="sourceLineNo">1209</span>    if (LOG.isTraceEnabled()) {<a name="line.1209"></a>
+<span class="sourceLineNo">1210</span>      LOG.trace("Started service threads");<a name="line.1210"></a>
+<span class="sourceLineNo">1211</span>    }<a name="line.1211"></a>
+<span class="sourceLineNo">1212</span>  }<a name="line.1212"></a>
+<span class="sourceLineNo">1213</span><a name="line.1213"></a>
+<span class="sourceLineNo">1214</span>  private void cancelChore(ScheduledChore chore) {<a name="line.1214"></a>
+<span class="sourceLineNo">1215</span>    if (chore != null) {<a name="line.1215"></a>
+<span class="sourceLineNo">1216</span>      chore.cancel();<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><a name="line.1219"></a>
+<span class="sourceLineNo">1220</span>  @Override<a name="line.1220"></a>
+<span class="sourceLineNo">1221</span>  protected void stopServiceThreads() {<a name="line.1221"></a>
+<span class="sourceLineNo">1222</span>    if (masterJettyServer != null) {<a name="line.1222"></a>
+<span class="sourceLineNo">1223</span>      LOG.info("Stopping master jetty server");<a name="line.1223"></a>
+<span class="sourceLineNo">1224</span>      try {<a name="line.1224"></a>
+<span class="sourceLineNo">1225</span>        masterJettyServer.stop();<a name="line.1225"></a>
+<span class="sourceLineNo">1226</span>      } catch (Exception e) {<a name="line.1226"></a>
+<span class="sourceLineNo">1227</span>        LOG.error("Failed to stop master jetty server", e);<a name="line.1227"></a>
+<span class="sourceLineNo">1228</span>      }<a name="line.1228"></a>
+<span class="sourceLineNo">1229</span>    }<a name="line.1229"></a>
+<span class="sourceLineNo">1230</span>    super.stopServiceThreads();<a name="line.1230"></a>
+<span class="sourceLineNo">1231</span>    stopChores();<a name="line.1231"></a>
+<span class="sourceLineNo">1232</span><a name="line.1232"></a>
+<span class="sourceLineNo">1233</span>    LOG.debug("Stopping service threads");<a name="line.1233"></a>
+<span class="sourceLineNo">1234</span><a name="line.1234"></a>
+<span class="sourceLineNo">1235</span>    if (this.quotaManager != null) {<a name="line.1235"></a>
+<span class="sourceLineNo">1236</span>      this.quotaManager.stop();<a name="line.1236"></a>
+<span class="sourceLineNo">1237</span>    }<a name="line.1237"></a>
+<span class="sourceLineNo">1238</span><a name="line.1238"></a>
+<span class="sourceLineNo">1239</span>    if (this.activeMasterManager != null) {<a name="line.1239"></a>
+<span class="sourceLineNo">1240</span>      this.activeMasterManager.stop();<a name="line.1240"></a>
+<span class="sourceLineNo">1241</span>    }<a name="line.1241"></a>
+<span class="sourceLineNo">1242</span>    if (this.serverManager != null) {<a name="line.1242"></a>
+<span class="sourceLineNo">1243</span>      this.serverManager.stop();<a name="line.1243"></a>
+<span class="sourceLineNo">1244</span>    }<a name="line.1244"></a>
+<span class="sourceLineNo">1245</span>    if (this.assignmentManager != null) {<a name="line.1245"></a>
+<span class="sourceLineNo">1246</span>      this.assignmentManager.stop();<a name="line.1246"></a>
+<span class="sourceLineNo">1247</span>    }<a name="line.1247"></a>
+<span class="sourceLineNo">1248</span><a name="line.1248"></a>
+<span class="sourceLineNo">1249</span>    stopProcedureExecutor();<a name="line.1249"></a>
 <span class="sourceLineNo">1250</span><a name="line.1250"></a>
-<span class="sourceLineNo">1251</span>  private void startProcedureExecutor() throws IOException {<a name="line.1251"></a>
-<span class="sourceLineNo">1252</span>    final MasterProcedureEnv procEnv = new MasterProcedureEnv(this);<a name="line.1252"></a>
-<span class="sourceLineNo">1253</span>    procedureStore = new WALProcedureStore(conf,<a name="line.1253"></a>
-<span class="sourceLineNo">1254</span>        new MasterProcedureEnv.WALStoreLeaseRecovery(this));<a name="line.1254"></a>
-<span class="sourceLineNo">1255</span>    procedureStore.registerListener(new MasterProcedureEnv.MasterProcedureStoreListener(this));<a name="line.1255"></a>
-<span class="sourceLineNo">1256</span>    MasterProcedureScheduler procedureScheduler = procEnv.getProcedureScheduler();<a name="line.1256"></a>
-<span class="sourceLineNo">1257</span>    procedureExecutor = new ProcedureExecutor&lt;&gt;(conf, procEnv, procedureStore, procedureScheduler);<a name="line.1257"></a>
-<span class="sourceLineNo">1258</span>    configurationManager.registerObserver(procEnv);<a name="line.1258"></a>
-<span class="sourceLineNo">1259</span><a name="line.1259"></a>
-<span class="sourceLineNo">1260</span>    int cpus = Runtime.getRuntime().availableProcessors();<a name="line.1260"></a>
-<span class="sourceLineNo">1261</span>    final int numThreads = conf.getInt(MasterProcedureConstants.MASTER_PROCEDURE_THREADS, Math.max(<a name="line.1261"></a>
-<span class="sourceLineNo">1262</span>      (cpus &gt; 0 ? cpus / 4 : 0), MasterProcedureConstants.DEFAULT_MIN_MASTER_PROCEDURE_THREADS));<a name="line.1262"></a>
-<span class="sourceLineNo">1263</span>    final boolean abortOnCorruption =<a name="line.1263"></a>
-<span class="sourceLineNo">1264</span>      conf.getBoolean(MasterProcedureConstants.EXECUTOR_ABORT_ON_CORRUPTION,<a name="line.1264"></a>
-<span class="sourceLineNo">1265</span>        MasterProcedureConstants.DEFAULT_EXECUTOR_ABORT_ON_CORRUPTION);<a name="line.1265"></a>
-<span class="sourceLineNo">1266</span>    procedureStore.start(numThreads);<a name="line.1266"></a>
-<span class="sourceLineNo">1267</span>    procedureExecutor.start(numThreads, abortOnCorruption);<a name="line.1267"></a>
-<span class="sourceLineNo">1268</span>    procEnv.getRemoteDispatcher().start();<a name="line.1268"></a>
-<span class="sourceLineNo">1269</span>  }<a name="line.1269"></a>
+<span class="sourceLineNo">1251</span>    if (this.walManager != null) {<a name="line.1251"></a>
+<span class="sourceLineNo">1252</span>      this.walManager.stop();<a name="line.1252"></a>
+<span class="sourceLineNo">1253</span>    }<a name="line.1253"></a>
+<span class="sourceLineNo">1254</span>    if (this.fileSystemManager != null) {<a name="line.1254"></a>
+<span class="sourceLineNo">1255</span>      this.fileSystemManager.stop();<a name="line.1255"></a>
+<span class="sourceLineNo">1256</span>    }<a name="line.1256"></a>
+<span class="sourceLineNo">1257</span>    if (this.mpmHost != null) {<a name="line.1257"></a>
+<span class="sourceLineNo">1258</span>      this.mpmHost.stop("server shutting down.");<a name="line.1258"></a>
+<span class="sourceLineNo">1259</span>    }<a name="line.1259"></a>
+<span class="sourceLineNo">1260</span>  }<a name="line.1260"></a>
+<span class="sourceLineNo">1261</span><a name="line.1261"></a>
+<span class="sourceLineNo">1262</span>  private void startProcedureExecutor() throws IOException {<a name="line.1262"></a>
+<span class="sourceLineNo">1263</span>    final MasterProcedureEnv procEnv = new MasterProcedureEnv(this);<a name="line.1263"></a>
+<span class="sourceLineNo">1264</span>    procedureStore = new WALProcedureStore(conf,<a name="line.1264"></a>
+<span class="sourceLineNo">1265</span>        new MasterProcedureEnv.WALStoreLeaseRecovery(this));<a name="line.1265"></a>
+<span class="sourceLineNo">1266</span>    procedureStore.registerListener(new MasterProcedureEnv.MasterProcedureStoreListener(this));<a name="line.1266"></a>
+<span class="sourceLineNo">1267</span>    MasterProcedureScheduler procedureScheduler = procEnv.getProcedureScheduler();<a name="line.1267"></a>
+<span class="sourceLineNo">1268</span>    procedureExecutor = new ProcedureExecutor&lt;&gt;(conf, procEnv, procedureStore, procedureScheduler);<a name="line.1268"></a>
+<span class="sourceLineNo">1269</span>    configurationManager.registerObserver(procEnv);<a name="line.1269"></a>
 <span class="sourceLineNo">1270</span><a name="line.1270"></a>
-<span class="sourceLineNo">1271</span>  private void stopProcedureExecutor() {<a name="line.1271"></a>
-<span class="sourceLineNo">1272</span>    if (procedureExecutor != null) {<a name="line.1272"></a>
-<span class="sourceLineNo">1273</span>      configurationManager.deregisterObserver(procedureExecutor.getEnvironment());<a name="line.1273"></a>
-<span class="sourceLineNo">1274</span>      procedureExecutor.getEnvironment().getRemoteDispatcher().stop();<a name="line.1274"></a>
-<span class="sourceLineNo">1275</span>      procedureExecutor.stop();<a name="line.1275"></a>
-<span class="sourceLineNo">1276</span>      procedureExecutor.join();<a name="line.1276"></a>
-<span class="sourceLineNo">1277</span>      procedureExecutor = null;<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>    if (procedureStore != null) {<a name="line.1280"></a>
-<span class="sourceLineNo">1281</span>      procedureStore.stop(isAborted());<a name="line.1281"></a>
-<span class="sourceLineNo">1282</span>      procedureStore = null;<a name="line.1282"></a>
-<span class="sourceLineNo">1283</span>    }<a name="line.1283"></a>
-<span class="sourceLineNo">1284</span>  }<a name="line.1284"></a>
-<span class="sourceLineNo">1285</span><a name="line.1285"></a>
-<span class="sourceLineNo">1286</span>  private void stopChores() {<a name="line.1286"></a>
-<span class="sourceLineNo">1287</span>    cancelChore(this.expiredMobFileCleanerChore);<a name="line.1287"></a>
-<span class="sourceLineNo">1288</span>    cancelChore(this.mobCompactChore);<a name="line.1288"></a>
-<span class="sourceLineNo">1289</span>    cancelChore(this.balancerChore);<a name="line.1289"></a>
-<span class="sourceLineNo">1290</span>    cancelChore(this.normalizerChore);<a name="line.1290"></a>
-<span class="sourceLineNo">1291</span>    cancelChore(this.clusterStatusChore);<a name="line.1291"></a>
-<span class="sourceLineNo">1292</span>    cancelChore(this.catalogJanitorChore);<a name="line.1292"></a>
-<span class="sourceLineNo">1293</span>    cancelChore(this.clusterStatusPublisherChore);<a name="line.1293"></a>
-<span class="sourceLineNo">1294</span>    if (this.mobCompactThread != null) {<a name="line.1294"></a>
-<span class="sourceLineNo">1295</span>      this.mobCompactThread.close();<a name="line.1295"></a>
-<span class="sourceLineNo">1296</span>    }<a name="line.1296"></a>
-<span class="sourceLineNo">1297</span>    cancelChore(this.clusterStatusPublisherChore);<a name="line.1297"></a>
-<span class="sourceLineNo">1298</span>    cancelChore(this.snapshotQuotaChore);<a name="line.1298"></a>
-<span class="sourceLineNo">1299</span>    cancelChore(this.logCleaner);<a name="line.1299"></a>
-<span class="sourceLineNo">1300</span>    cancelChore(this.hfileCleaner);<a name="line.1300"></a>
-<span class="sourceLineNo">1301</span>    cancelChore(this.replicationBarrierCleaner);<a name="line.1301"></a>
-<span class="sourceLineNo">1302</span>  }<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>   * @return Get remote side's InetAddress<a name="line.1305"></a>
-<span class="sourceLineNo">1306</span>   */<a name="line.1306"></a>
-<span class="sourceLineNo">1307</span>  InetAddress getRemoteInetAddress(final int port,<a name="line.1307"></a>
-<span class="sourceLineNo">1308</span>      final long serverStartCode) throws UnknownHostException {<a name="line.1308"></a>
-<span class="sourceLineNo">1309</span>    // Do it out here in its own little method so can fake an address when<a name="line.1309"></a>
-<span class="sourceLineNo">1310</span>    // mocking up in tests.<a name="line.1310"></a>
-<span class="sourceLineNo">1311</span>    InetAddress ia = RpcServer.getRemoteIp();<a name="line.1311"></a>
-<span class="sourceLineNo">1312</span><a name="line.1312"></a>
-<span class="sourceLineNo">1313</span>    // The call could be from the local regionserver,<a name="line.1313"></a>
-<span class="sourceLineNo">1314</span>    // in which case, there is no remote address.<a name="line.1314"></a>
-<span class="sourceLineNo">1315</span>    if (ia == null &amp;&amp; serverStartCode == startcode) {<a name="line.1315"></a>
-<span class="sourceLineNo">1316</span>      InetSocketAddress isa = rpcServices.getSocketAddress();<a name="line.1316"></a>
-<span class="sourceLineNo">1317</span>      if (isa != null &amp;&amp; isa.getPort() == port) {<a name="line.1317"></a>
-<span class="sourceLineNo">1318</span>        ia = isa.getAddress();<a name="line.1318"></a>
-<span class="sourceLineNo">1319</span>      }<a name="line.1319"></a>
-<span class="sourceLineNo">1320</span>    }<a name="line.1320"></a>
-<span class="sourceLineNo">1321</span>    return ia;<a name="line.1321"></a>
-<span class="sourceLineNo">1322</span>  }<a name="line.1322"></a>
+<span class="sourceLineNo">1271</span>    int cpus = Runtime.getRuntime().availableProcessors();<a name="line.1271"></a>
+<span class="sourceLineNo">1272</span>    final int numThreads = conf.getInt(MasterProcedureConstants.MASTER_PROCEDURE_THREADS, Math.max(<a name="line.1272"></a>
+<span class="sourceLineNo">1273</span>      (cpus &gt; 0 ? cpus / 4 : 0), MasterProcedureConstants.DEFAULT_MIN_MASTER_PROCEDURE_THREADS));<a name="line.1273"></a>
+<span class="sourceLineNo">1274</span>    final boolean abortOnCorruption =<a name="line.1274"></a>
+<span class="sourceLineNo">1275</span>      conf.getBoolean(MasterProcedureConstants.EXECUTOR_ABORT_ON_CORRUPTION,<a name="line.1275"></a>
+<span class="sourceLineNo">1276</span>        MasterProcedureConstants.DEFAULT_EXECUTOR_ABORT_ON_CORRUPTION);<a name="line.1276"></a>
+<span class="sourceLineNo">1277</span>    procedureStore.start(numThreads);<a name="line.1277"></a>
+<span class="sourceLineNo">1278</span>    procedureExecutor.start(numThreads, abortOnCorruption);<a name="line.1278"></a>
+<span class="sourceLineNo">1279</span>    procEnv.getRemoteDispatcher().start();<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>  private void stopProcedureExecutor() {<a name="line.1282"></a>
+<span class="sourceLineNo">1283</span>    if (procedureExecutor != null) {<a name="line.1283"></a>
+<span class="sourceLineNo">1284</span>      configurationManager.deregisterObserver(procedureExecutor.getEnvironment());<a name="line.1284"></a>
+<span class="sourceLineNo">1285</span>      procedureExecutor.getEnvironment().getRemoteDispatcher().stop();<a name="line.1285"></a>
+<span class="sourceLineNo">1286</span>      procedureExecutor.stop();<a name="line.1286"></a>
+<span class="sourceLineNo">1287</span>      procedureExecutor.join();<a name="line.1287"></a>
+<span class="sourceLineNo">1288</span>      procedureExecutor = null;<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>    if (procedureStore != null) {<a name="line.1291"></a>
+<span class="sourceLineNo">1292</span>      procedureStore.stop(isAborted());<a name="line.1292"></a>
+<span class="sourceLineNo">1293</span>      procedureStore = null;<a name="line.1293"></a>
+<span class="sourceLineNo">1294</span>    }<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>  private void stopChores() {<a name="line.1297"></a>
+<span class="sourceLineNo">1298</span>    cancelChore(this.expiredMobFileCleanerChore);<a name="line.1298"></a>
+<span class="sourceLineNo">1299</span>    cancelChore(this.mobCompactChore);<a name="line.1299"></a>
+<span class="sourceLineNo">1300</span>    cancelChore(this.balancerChore);<a name="line.1300"></a>
+<span class="sourceLineNo">1301</span>    cancelChore(this.normalizerChore);<a name="line.1301"></a>
+<span class="sourceLineNo">1302</span>    cancelChore(this.clusterStatusChore);<a name="line.1302"></a>
+<span class="sourceLineNo">1303</span>    cancelChore(this.catalogJanitorChore);<a name="line.1303"></a>
+<span class="sourceLineNo">1304</span>    cancelChore(this.clusterStatusPublisherChore);<a name="line.1304"></a>
+<span class="sourceLineNo">1305</span>    if (this.mobCompactThread != null) {<a name="line.1305"></a>
+<span class="sourceLineNo">1306</span>      this.mobCompactThread.close();<a name="line.1306"></a>
+<span class="sourceLineNo">1307</span>    }<a name="line.1307"></a>
+<span class="sourceLineNo">1308</span>    cancelChore(this.clusterStatusPublisherChore);<a name="line.1308"></a>
+<span class="sourceLineNo">1309</span>    cancelChore(this.snapshotQuotaChore);<a name="line.1309"></a>
+<span class="sourceLineNo">1310</span>    cancelChore(this.logCleaner);<a name="line.1310"></a>
+<span class="sourceLineNo">1311</span>    cancelChore(this.hfileCleaner);<a name="line.1311"></a>
+<span class="sourceLineNo">1312</span>    cancelChore(this.replicationBarrierCleaner);<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>   * @return Get remote side's InetAddress<a name="line.1316"></a>
+<span class="sourceLineNo">1317</span>   */<a name="line.1317"></a>
+<span class="sourceLineNo">1318</span>  InetAddress getRemoteInetAddress(final int port,<a name="line.1318"></a>
+<span class="sourceLineNo">1319</span>      final long serverStartCode) throws UnknownHostException {<a name="line.1319"></a>
+<span class="sourceLineNo">1320</span>    // Do it out here in its own little method so can fake an address when<a name="line.1320"></a>
+<span class="sourceLineNo">1321</span>    // mocking up in tests.<a name="line.1321"></a>
+<span class="sourceLineNo">1322</span>    InetAddress ia = RpcServer.getRemoteIp();<a name="line.1322"></a>
 <span class="sourceLineNo">1323</span><a name="line.1323"></a>
-<span class="sourceLineNo">1324</span>  /**<a name="line.1324"></a>
-<span class="sourceLineNo">1325</span>   * @return Maximum time we should run balancer for<a name="line.1325"></a>
-<span class="sourceLineNo">1326</span>   */<a name="line.1326"></a>
-<span class="sourceLineNo">1327</span>  private int getMaxBalancingTime() {<a name="line.1327"></a>
-<span class="sourceLineNo">1328</span>    int maxBalancingTime = getConfiguration().getInt(HConstants.HBASE_BALANCER_MAX_BALANCING, -1);<a name="line.1328"></a>
-<span class="sourceLineNo">1329</span>    if (maxBalancingTime == -1) {<a name="line.1329"></a>
-<span class="sourceLineNo">1330</span>      // if max balancing time isn't set, defaulting it to period time<a name="line.1330"></a>
-<span class="sourceLineNo">1331</span>      maxBalancingTime = getConfiguration().getInt(HConstants.HBASE_BALANCER_PERIOD,<a name="line.1331"></a>
-<span class="sourceLineNo">1332</span>        HConstants.DEFAULT_HBASE_BALANCER_PERIOD);<a name="line.1332"></a>
-<span class="sourceLineNo">1333</span>    }<a name="line.1333"></a>
-<span class="sourceLineNo">1334</span>    return maxBalancingTime;<a name="line.1334"></a>
-<span class="sourceLineNo">1335</span>  }<a name="line.1335"></a>
-<span class="sourceLineNo">1336</span><a name="line.1336"></a>
-<span class="sourceLineNo">1337</span>  /**<a name="line.1337"></a>
-<span class="sourceLineNo">1338</span>   * @return Maximum number of regions in transition<a name="line.1338"></a>
-<span class="sourceLineNo">1339</span>   */<a name="line.1339"></a>
-<span class="sourceLineNo">1340</span>  private int getMaxRegionsInTransition() {<a name="line.1340"></a>
-<span class="sourceLineNo">1341</span>    int numRegions = this.assignmentManager.getRegionStates().getRegionAssignments().size();<a name="line.1341"></a>
-<span class="sourceLineNo">1342</span>    return Math.max((int) Math.floor(numRegions * this.maxRitPercent), 1);<a name="line.1342"></a>
-<span class="sourceLineNo">1343</span>  }<a name="line.1343"></a>
-<span class="sourceLineNo">1344</span><a name="line.1344"></a>
-<span class="sourceLineNo">1345</span>  /**<a name="line.1345"></a>
-<span class="sourceLineNo">1346</span>   * It first sleep to the next balance plan start time. Meanwhile, throttling by the max<a name="line.1346"></a>
-<span class="sourceLineNo">1347</span>   * number regions in transition to protect availability.<a name="line.1347"></a>
-<span class="sourceLineNo">1348</span>   * @param nextBalanceStartTime The next balance plan start time<a name="line.1348"></a>
-<span class="sourceLineNo">1349</span>   * @param maxRegionsInTransition max number of regions in transition<a name="line.1349"></a>
-<span class="sourceLineNo">1350</span>   * @param cutoffTime when to exit balancer<a name="line.1350"></a>
-<span class="sourceLineNo">1351</span>   */<a name="line.1351"></a>
-<span class="sourceLineNo">1352</span>  private void balanceThrottling(long nextBalanceStartTime, int maxRegionsInTransition,<a name="line.1352"></a>
-<span class="sourceLineNo">1353</span>      long cutoffTime) {<a name="line.1353"></a>
-<span class="sourceLineNo">1354</span>    boolean interrupted = false;<a name="line.1354"></a>
+<span class="sourceLineNo">1324</span>    // The call could be from the local regionserver,<a name="line.1324"></a>
+<span class="sourceLineNo">1325</span>    // in which case, there is no remote address.<a name="line.1325"></a>
+<span class="sourceLineNo">1326</span>    if (ia == null &amp;&amp; serverStartCode == startcode) {<a name="line.1326"></a>
+<span class="sourceLineNo">1327</span>      InetSocketAddress isa = rpcServices.getSocketAddress();<a name="line.1327"></a>
+<span class="sourceLineNo">1328</span>      if (isa != null &amp;&amp; isa.getPort() == port) {<a name="line.1328"></a>
+<span class="sourceLineNo">1329</span>        ia = isa.getAddress();<a name="line.1329"></a>
+<span class="sourceLineNo">1330</span>      }<a name="line.1330"></a>
+<span class="sourceLineNo">1331</span>    }<a name="line.1331"></a>
+<span class="sourceLineNo">1332</span>    return ia;<a name="line.1332"></a>
+<span class="sourceLineNo">1333</span>  }<a name="line.1333"></a>
+<span class="sourceLineNo">1334</span><a name="line.1334"></a>
+<span class="sourceLineNo">1335</span>  /**<a name="line.1335"></a>
+<span class="sourceLineNo">1336</span>   * @return Maximum time we should run balancer for<a name="line.1336"></a>
+<span class="sourceLineNo">1337</span>   */<a name="line.1337"></a>
+<span class="sourceLineNo">1338</span>  private int getMaxBalancingTime() {<a name="line.1338"></a>
+<span class="sourceLineNo">1339</span>    int maxBalancingTime = getConfiguration().getInt(HConstants.HBASE_BALANCER_MAX_BALANCING, -1);<a name="line.1339"></a>
+<span class="sourceLineNo">1340</span>    if (maxBalancingTime == -1) {<a name="line.1340"></a>
+<span class="sourceLineNo">1341</span>      // if max balancing time isn't set, defaulting it to period time<a name="line.1341"></a>
+<span class="sourceLineNo">1342</span>      maxBalancingTime = getConfiguration().getInt(HConstants.HBASE_BALANCER_PERIOD,<a name="line.1342"></a>
+<span class="sourceLineNo">1343</span>        HConstants.DEFAULT_HBASE_BALANCER_PERIOD);<a name="line.1343"></a>
+<span class="sourceLineNo">1344</span>    }<a name="line.1344"></a>
+<span class="sourceLineNo">1345</span>    return maxBalancingTime;<a name="line.1345"></a>
+<span class="sourceLineNo">1346</span>  }<a name="line.1346"></a>
+<span class="sourceLineNo">1347</span><a name="line.1347"></a>
+<span class="sourceLineNo">1348</span>  /**<a name="line.1348"></a>
+<span class="sourceLineNo">1349</span>   * @return Maximum number of regions in transition<a name="line.1349"></a>
+<span class="sourceLineNo">1350</span>   */<a name="line.1350"></a>
+<span class="sourceLineNo">1351</span>  private int getMaxRegionsInTransition() {<a name="line.1351"></a>
+<span class="sourceLineNo">1352</span>    int numRegions = this.assignmentManager.getRegionStates().getRegionAssignments().size();<a name="line.1352"></a>
+<span class="sourceLineNo">1353</span>    return Math.max((int) Math.floor(numRegions * this.maxRitPercent), 1);<a name="line.1353"></a>
+<span class="sourceLineNo">1354</span>  }<a name="line.1354"></a>
 <span class="sourceLineNo">1355</span><a name="line.1355"></a>
-<span class="sourceLineNo">1356</span>    // Sleep to next balance plan start time<a name="line.1356"></a>
-<span class="sourceLineNo">1357</span>    // But if there are zero regions in transition, it can skip sleep to speed up.<a name="line.1357"></a>
-<span class="sourceLineNo">1358</span>    while (!interrupted &amp;&amp; System.currentTimeMillis() &lt; nextBalanceStartTime<a name="line.1358"></a>
-<span class="sourceLineNo">1359</span>        &amp;&amp; this.assignmentManager.getRegionStates().hasRegionsInTransition()) {<a name="line.1359"></a>
-<span class="sourceLineNo">1360</span>      try {<a name="line.1360"></a>
-<span class="sourceLineNo">1361</span>        Thread.sleep(100);<a name="line.1361"></a>
-<span class="sourceLineNo">1362</span>      } catch (InterruptedException ie) {<a name="line.1362"></a>
-<span class="sourceLineNo">1363</span>        interrupted = true;<a name="line.1363"></a>
-<span class="sourceLineNo">1364</span>      }<a name="line.1364"></a>
-<span class="sourceLineNo">1365</span>    }<a name="line.1365"></a>
+<span class="sourceLineNo">1356</span>  /**<a name="line.1356"></a>
+<span class="sourceLineNo">1357</span>   * It first sleep to the next balance plan start time. Meanwhile, throttling by the max<a name="line.1357"></a>
+<span class="sourceLineNo">1358</span>   * number regions in transition to protect availability.<a name="line.1358"></a>
+<span class="sourceLineNo">1359</span>   * @param nextBalanceStartTime The next balance plan start time<a name="line.1359"></a>
+<span class="sourceLineNo">1360</span>   * @param maxRegionsInTransition max number of regions in transition<a name="line.1360"></a>
+<span class="sourceLineNo">1361</span>   * @param cutoffTime when to exit balancer<a name="line.1361"></a>
+<span class="sourceLineNo">1362</span>   */<a name="line.1362"></a>
+<span class="sourceLineNo">1363</span>  private void balanceThrottling(long nextBalanceStartTime, int maxRegionsInTransition,<a name="line.1363"></a>
+<span class="sourceLineNo">1364</span>      long cutoffTime) {<a name="line.1364"></a>
+<span class="sourceLineNo">1365</span>    boolean interrupted = false;<a name="line.1365"></a>
 <span class="sourceLineNo">1366</span><a name="line.1366"></a>
-<span class="sourceLineNo">1367</span>    // Throttling by max number regions in transition<a name="line.1367"></a>
-<span class="sourceLineNo">1368</span>    while (!interrupted<a name="line.1368"></a>
-<span class="sourceLineNo">1369</span>        &amp;&amp; maxRegionsInTransition &gt; 0<a name="line.1369"></a>
-<span class="sourceLineNo">1370</span>        &amp;&amp; this.assignmentManager.getRegionStates().getRegionsInTransitionCount()<a name="line.1370"></a>
-<span class="sourceLineNo">1371</span>        &gt;= maxRegionsInTransition &amp;&amp; System.currentTimeMillis() &lt;= cutoffTime) {<a name="line.1371"></a>
-<span class="sourceLineNo">1372</span>      try {<a name="line.1372"></a>
-<span class="sourceLineNo">1373</span>        // sleep if the number of regions in transition exceeds the limit<a name="line.1373"></a>
-<span class="sourceLineNo">1374</span>        Thread.sleep(100);<a name="line.1374"></a>
-<span class="sourceLineNo">1375</span>      } catch (InterruptedException ie) {<a name="line.1375"></a>
-<span class="sourceLineNo">1376</span>        interrupted = true;<a name="line.1376"></a>
-<span class="sourceLineNo">1377</span>      }<a name="line.1377"></a>
-<span class="sourceLineNo">1378</span>    }<a name="line.1378"></a>
-<span class="sourceLineNo">1379</span><a name="line.1379"></a>
-<span class="sourceLineNo">1380</span>    if (interrupted) Thread.currentThread().interrupt();<a name="line.1380"></a>
-<span class="sourceLineNo">1381</span>  }<a name="line.1381"></a>
-<span class="sourceLineNo">1382</span><a name="line.1382"></a>
-<span class="sourceLineNo">1383</span>  public boolean balance() throws IOException {<a name="line.1383"></a>
-<span class="sourceLineNo">1384</span>    return balance(false);<a name="line.1384"></a>
-<span class="sourceLineNo">1385</span>  }<a name="line.1385"></a>
-<span class="sourceLineNo">1386</span><a name="line.1386"></a>
-<span class="sourceLineNo">1387</span>  public boolean balance(boolean force) throws IOException {<a name="line.1387"></a>
-<span class="sourceLineNo">1388</span>    // if master not initialized, don't run balancer.<a name="line.1388"></a>
-<span class="sourceLineNo">1389</span>    if (!isInitialized()) {<a name="line.1389"></a>
-<span class="sourceLineNo">1390</span>      LOG.debug("Master has not been initialized, don't run balancer.");<a name="line.1390"></a>
-<span class="sourceLineNo">1391</span>      return false;<a name="line.1391"></a>
-<span class="sourceLineNo">1392</span>    }<a name="line.1392"></a>
+<span class="sourceLineNo">1367</span>    // Sleep to next balance plan start time<a name="line.1367"></a>
+<span class="sourceLineNo">1368</span>    // But if there are zero regions in transition, it can skip sleep to speed up.<a name="line.1368"></a>
+<span class="sourceLineNo">1369</span>    while (!interrupted &amp;&amp; System.currentTimeMillis() &lt; nextBalanceStartTime<a name="line.1369"></a>
+<span class="sourceLineNo">1370</span>        &amp;&amp; this.assignmentManager.getRegionStates().hasRegionsInTransition()) {<a name="line.1370"></a>
+<span class="sourceLineNo">1371</span>      try {<a name="line.1371"></a>
+<span class="sourceLineNo">1372</span>        Thread.sleep(100);<a name="line.1372"></a>
+<span class="sourceLineNo">1373</span>      } catch (InterruptedException ie) {<a name="line.1373"></a>
+<span class="sourceLineNo">1374</span>        interrupted = true;<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><a name="line.1377"></a>
+<span class="sourceLineNo">1378</span>    // Throttling by max number regions in transition<a name="line.1378"></a>
+<span class="sourceLineNo">1379</span>    while (!interrupted<a name="line.1379"></a>
+<span class="sourceLineNo">1380</span>        &amp;&amp; maxRegionsInTransition &gt; 0<a name="line.1380"></a>
+<span class="sourceLineNo">1381</span>        &amp;&amp; this.assignmentManager.getRegionStates().getRegionsInTransitionCount()<a name="line.1381"></a>
+<span class="sourceLineNo">1382</span>        &gt;= maxRegionsInTransition &amp;&amp; System.currentTimeMillis() &lt;= cutoffTime) {<a name="line.1382"></a>
+<span class="sourceLineNo">1383</span>      try {<a name="line.1383"></a>
+<span class="sourceLineNo">1384</span>        // sleep if the number of regions in transition exceeds the limit<a name="line.1384"></a>
+<span class="sourceLineNo">1385</span>        Thread.sleep(100);<a name="line.1385"></a>
+<span class="sourceLineNo">1386</span>      } catch (InterruptedException ie) {<a name="line.1386"></a>
+<span class="sourceLineNo">1387</span>        interrupted = true;<a name="line.1387"></a>
+<span class="sourceLineNo">1388</span>      }<a name="line.1388"></a>
+<span class="sourceLineNo">1389</span>    }<a name="line.1389"></a>
+<span class="sourceLineNo">1390</span><a name="line.1390"></a>
+<span class="sourceLineNo">1391</span>    if (interrupted) Thread.currentThread().interrupt();<a name="line.1391"></a>
+<span class="sourceLineNo">1392</span>  }<a name="line.1392"></a>
 <span class="sourceLineNo">1393</span><a name="line.1393"></a>
-<span class="sourceLineNo">1394</span>    if (isInMaintenanceMode()) {<a name="line.1394"></a>
-<span class="sourceLineNo">1395</span>      LOG.info("Master is in maintenanceMode mode, don't run balancer.");<a name="line.1395"></a>
-<span class="sourceLineNo">1396</span>      return false;<a name="line.1396"></a>
-<span class="sourceLineNo">1397</span>    }<a name="line.1397"></a>
-<span class="sourceLineNo">1398</span><a name="line.1398"></a>
-<span class="sourceLineNo">1399</span>    int maxRegionsInTransition = getMaxRegionsInTransition();<a name="line.1399"></a>
-<span class="sourceLineNo">1400</span>    synchronized (this.balancer) {<a name="line.1400"></a>
-<span class="sourceLineNo">1401</span>      // If balance not true, don't run balancer.<a name="line.1401"></a>
-<span class="sourceLineNo">1402</span>      if (!this.loadBalancerTracker.isBalancerOn()) return false;<a name="line.1402"></a>
-<span class="sourceLineNo">1403</span>        // Only allow one balance run at at time.<a name="line.1403"></a>
-<span class="sourceLineNo">1404</span>      if (this.assignmentManager.hasRegionsInTransition()) {<a name="line.1404"></a>
-<span class="sourceLineNo">1405</span>        List&lt;RegionStateNode&gt; regionsInTransition = assignmentManager.getRegionsInTransition();<a name="line.1405"></a>
-<span class="sourceLineNo">1406</span>        // if hbase:meta region is in transition, result of assignment cannot be recorded<a name="line.1406"></a>
-<span class="sourceLineNo">1407</span>        // ignore the force flag in that case<a name="line.1407"></a>
-<span class="sourceLineNo">1408</span>        boolean metaInTransition = assignmentManager.isMetaRegionInTransition();<a name="line.1408"></a>
-<span class="sourceLineNo">1409</span>        String prefix = force &amp;&amp; !metaInTransition ? "R" : "Not r";<a name="line.1409"></a>
-<span class="sourceLineNo">1410</span>        List&lt;RegionStateNode&gt; toPrint = regionsInTransition;<a name="line.1410"></a>
-<span class="sourceLineNo">1411</span>        int max = 5;<a name="line.1411"></a>
-<span class="sourceLineNo">1412</span>        boolean truncated = false;<a name="line.1412"></a>
-<span class="sourceLineNo">1413</span>        if (regionsInTransition.size() &gt; max) {<a name="line.1413"></a>
-<span class="sourceLineNo">1414</span>          toPrint = regionsInTransition.subList(0, max);<a name="line.1414"></a>
-<span class="sourceLineNo">1415</span>          truncated = true;<a name="line.1415"></a>
-<span class="sourceLineNo">1416</span>        }<a name="line.1416"></a>
-<span class="sourceLineNo">1417</span>        LOG.info(prefix + "unning balancer because " + regionsInTransition.size() +<a name="line.1417"></a>
-<span class="sourceLineNo">1418</span>          " region(s) in transition: " + toPrint + (truncated? "(truncated list)": ""));<a name="line.1418"></a>
-<span class="sourceLineNo">1419</span>        if (!force || metaInTransition) return false;<a name="line.1419"></a>
-<span class="sourceLineNo">1420</span>      }<a name="line.1420"></a>
-<span class="sourceLineNo">1421</span>      if (this.serverManager.areDeadServersInProgress()) {<a name="line.1421"></a>
-<span class="sourceLineNo">1422</span>        LOG.info("Not running balancer because processing dead regionserver(s): " +<a name="line.1422"></a>
-<span class="sourceLineNo">1423</span>          this.serverManager.getDeadServers());<a name="line.1423"></a>
-<span class="sourceLineNo">1424</span>        return false;<a name="line.1424"></a>
-<span class="sourceLineNo">1425</span>      }<a name="line.1425"></a>
-<span class="sourceLineNo">1426</span><a name="line.1426"></a>
-<span class="sourceLineNo">1427</span>      if (this.cpHost != null) {<a name="line.1427"></a>
-<span class="sourceLineNo">1428</span>        try {<a name="line.1428"></a>
-<span class="sourceLineNo">1429</span>          if (this.cpHost.preBalance()) {<a name="line.1429"></a>
-<span class="sourceLineNo">1430</span>            LOG.debug("Coprocessor bypassing balancer request");<a name="line.1430"></a>
-<span class="sourceLineNo">1431</span>            return false;<a name="line.1431"></a>
-<span class="sourceLineNo">1432</span>          }<a name="line.1432"></a>
-<span class="sourceLineNo">1433</span>        } catch (IOException ioe) {<a name="line.1433"></a>
-<span class="sourceLineNo">1434</span>          LOG.error("Error invoking master coprocessor preBalance()", ioe);<a name="line.1434"></a>
-<span class="sourceLineNo">1435</span>          return false;<a name="line.1435"></a>
-<span class="sourceLineNo">1436</span>        }<a name="line.1436"></a>
-<span class="sourceLineNo">1437</span>      }<a name="line.1437"></a>
-<span class="sourceLineNo">1438</span><a name="line.1438"></a>
-<span class="sourceLineNo">1439</span>      boolean isByTable = getConfiguration().getBoolean("hbase.master.loadbalance.bytable", false);<a name="line.1439"></a>
-<span class="sourceLineNo">1440</span>      Map&lt;TableName, Map&lt;ServerName, List&lt;RegionInfo&gt;&gt;&gt; assignmentsByTable =<a name="line.1440"></a>
-<span class="sourceLineNo">1441</span>        this.assignmentManager.getRegionStates().getAssignmentsByTable(!isByTable);<a name="line.1441"></a>
-<span class="sourceLineNo">1442</span><a name="line.1442"></a>
-<span class="sourceLineNo">1443</span>      List&lt;RegionPlan&gt; plans = new ArrayList&lt;&gt;();<a name="line.1443"></a>
-<span class="sourceLineNo">1444</span><a name="line.1444"></a>
-<span class="sourceLineNo">1445</span>      //Give the balancer the current cluster state.<a name="line.1445"></a>
-<span class="sourceLineNo">1446</span>      this.balancer.setClusterMetrics(getClusterMetricsWithoutCoprocessor());<a name="line.1446"></a>
-<span class="sourceLineNo">1447</span>      this.balancer.setClusterLoad(assignmentsByTable);<a name="line.1447"></a>
-<span class="sourceLineNo">1448</span><a name="line.1448"></a>
-<span class="sourceLineNo">1449</span>      for (Map&lt;ServerName, List&lt;RegionInfo&gt;&gt; serverMap : assignmentsByTable.values()) {<a name="line.1449"></a>
-<span class="sourceLineNo">1450</span>        serverMap.keySet().removeAll(this.serverManager.getDrainingServersList());<a name="line.1450"></a>
-<span class="sourceLineNo">1451</span>      }<a name="line.1451"></a>
-<span class="sourceLineNo">1452</span>      for (Entry&lt;TableName, Map&lt;ServerName, List&lt;RegionInfo&gt;&gt;&gt; e : assignmentsByTable.entrySet()) {<a name="line.1452"></a>
-<span class="sourceLineNo">1453</span>        List&lt;RegionPlan&gt; partialPlans = this.balancer.balanceCluster(e.getKey(), e.getValue());<a name="line.1453"></a>
-<span class="sourceLineNo">1454</span>        if (partialPlans != null) plans.addAll(partialPlans);<a name="line.1454"></a>
-<span class="sourceLineNo">1455</span>      }<a name="line.1455"></a>
-<span class="sourceLineNo">1456</span><a name="line.1456"></a>
-<span class="sourceLineNo">1457</span>      long balanceStartTime = System.currentTimeMillis();<a name="line.1457"></a>
-<span class="sourceLineNo">1458</span>      long cutoffTime = balanceStartTime + this.maxBlancingTime;<a name="line.1458"></a>
-<span class="sourceLineNo">1459</span>      int rpCount = 0;  // number of RegionPlans balanced so far<a name="line.1459"></a>
-<span class="sourceLineNo">1460</span>      if (plans != null &amp;&amp; !plans.isEmpty()) {<a name="line.1460"></a>
-<span class="sourceLineNo">1461</span>        int balanceInterval = this.maxBlancingTime / plans.size();<a name="line.1461"></a>
-<span class="sourceLineNo">1462</span>        LOG.info("Balancer plans size is " + plans.size() + ", the balance interval is "<a name="line.1462"></a>
-<span class="sourceLineNo">1463</span>            + balanceInterval + " ms, and the max number regions in transition is "<a name="line.1463"></a>
-<span class="sourceLineNo">1464</span>            + maxRegionsInTransition);<a name="line.1464"></a>
-<span class="sourceLineNo">1465</span><a name="line.1465"></a>
-<span class="sourceLineNo">1466</span>        for (RegionPlan plan: plans) {<a name="line.1466"></a>
-<span class="sourceLineNo">1467</span>          LOG.info("balance " + plan);<a name="line.1467"></a>
-<span class="sourceLineNo">1468</span>          //TODO: bulk assign<a name="line.1468"></a>
-<span class="sourceLineNo">1469</span>          this.assignmentManager.moveAsync(plan);<a name="line.1469"></a>
-<span class="sourceLineNo">1470</span>          rpCount++;<a name="line.1470"></a>
-<span class="sourceLineNo">1471</span><a name="line.1471"></a>
-<span class="sourceLineNo">1472</span>          balanceThrottling(balanceStartTime + rpCount * balanceInterval, maxRegionsInTransition,<a name="line.1472"></a>
-<span class="sourceLineNo">1473</span>            cutoffTime);<a name="line.1473"></a>
-<span class="sourceLineNo">1474</span><a name="line.1474"></a>
-<span class="sourceLineNo">1475</span>          // if performing next balance exceeds cutoff time, exit the loop<a name="line.1475"></a>
-<span class="sourceLineNo">1476</span>          if (rpCount &lt; plans.size() &amp;&amp; System.currentTimeMillis() &gt; cutoffTime) {<a name="line.1476"></a>
-<span class="sourceLineNo">1477</span>            // TODO: After balance, there should not be a cutoff time (keeping it as<a name="line.1477"></a>
-<span class="sourceLineNo">1478</span>            // a security net for now)<a name="line.1478"></a>
-<span class="sourceLineNo">1479</span>            LOG.debug("No more balancing till next balance run; maxBalanceTime="<a name="line.1479"></a>
-<span class="sourceLineNo">1480</span>                + this.maxBlancingTime);<a name="line.1480"></a>
-<span class="sourceLineNo">1481</span>            break;<a name="line.1481"></a>
-<span class="sourceLineNo">1482</span>          }<a name="line.1482"></a>
-<span class="sourceLineNo">1483</span>        }<a name="line.1483"></a>
-<span class="sourceLineNo">1484</span>      }<a name="line.1484"></a>
+<span class="sourceLineNo">1394</span>  public boolean balance() throws IOException {<a name="line.1394"></a>
+<span class="sourceLineNo">1395</span>    return balance(false);<a name="line.1395"></a>
+<span class="sourceLineNo">1396</span>  }<a name="line.1396"></a>
+<span class="sourceLineNo">1397</span><a name="line.1397"></a>
+<span class="sourceLineNo">1398</span>  public boolean balance(boolean force) throws IOException {<a name="line.1398"></a>
+<span class="sourceLineNo">1399</span>    // if master not initialized, don't run balancer.<a name="line.1399"></a>
+<span class="sourceLineNo">1400</span>    if (!isInitialized()) {<a name="line.1400"></a>
+<span class="sourceLineNo">1401</span>      LOG.debug("Master has not been initialized, don't run balancer.");<a name="line.1401"></a>
+<span class="sourceLineNo">1402</span>      return false;<a name="line.1402"></a>
+<span class="sourceLineNo">1403</span>    }<a name="line.1403"></a>
+<span class="sourceLineNo">1404</span><a name="line.1404"></a>
+<span class="sourceLineNo">1405</span>    if (isInMaintenanceMode()) {<a name="line.1405"></a>
+<span class="sourceLineNo">1406</span>      LOG.info("Master is in maintenanceMode mode, don't run balancer.");<a name="line.1406"></a>
+<span class="sourceLineNo">1407</span>      return false;<a name="line.1407"></a>
+<span class="sourceLineNo">1408</span>    }<a name="line.1408"></a>
+<span class="sourceLineNo">1409</span><a name="line.1409"></a>
+<span class="sourceLineNo">1410</span>    int maxRegionsInTransition = getMaxRegionsInTransition();<a name="line.1410"></a>
+<span class="sourceLineNo">1

<TRUNCATED>

[04/29] hbase-site git commit: Published site at 477f9fdb32873387231c5fbbff130ba8bf7b5d68.

Posted by gi...@apache.org.
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/621479e1/testdevapidocs/org/apache/hadoop/hbase/master/procedure/TestTruncateTableProcedure.TruncateTableProcedureOnHDFSFailure.html
----------------------------------------------------------------------
diff --git a/testdevapidocs/org/apache/hadoop/hbase/master/procedure/TestTruncateTableProcedure.TruncateTableProcedureOnHDFSFailure.html b/testdevapidocs/org/apache/hadoop/hbase/master/procedure/TestTruncateTableProcedure.TruncateTableProcedureOnHDFSFailure.html
new file mode 100644
index 0000000..2e1d023
--- /dev/null
+++ b/testdevapidocs/org/apache/hadoop/hbase/master/procedure/TestTruncateTableProcedure.TruncateTableProcedureOnHDFSFailure.html
@@ -0,0 +1,430 @@
+<!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>TestTruncateTableProcedure.TruncateTableProcedureOnHDFSFailure (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="TestTruncateTableProcedure.TruncateTableProcedureOnHDFSFailure (Apache HBase 3.0.0-SNAPSHOT Test API)";
+        }
+    }
+    catch(err) {
+    }
+//-->
+var methods = {"i0":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/TestTruncateTableProcedure.TruncateTableProcedureOnHDFSFailure.html">Use</a></li>
+<li><a href="package-tree.html">Tree</a></li>
+<li><a href="../../../../../../deprecated-list.html">Deprecated</a></li>
+<li><a href="../../../../../../index-all.html">Index</a></li>
+<li><a href="../../../../../../help-doc.html">Help</a></li>
+</ul>
+</div>
+<div class="subNav">
+<ul class="navList">
+<li><a href="../../../../../../org/apache/hadoop/hbase/master/procedure/TestTruncateTableProcedure.html" title="class in org.apache.hadoop.hbase.master.procedure"><span class="typeNameLink">Prev&nbsp;Class</span></a></li>
+<li><a href="../../../../../../org/apache/hadoop/hbase/master/procedure/TestWALProcedureStoreOnHDFS.html" title="class in org.apache.hadoop.hbase.master.procedure"><span class="typeNameLink">Next&nbsp;Class</span></a></li>
+</ul>
+<ul class="navList">
+<li><a href="../../../../../../index.html?org/apache/hadoop/hbase/master/procedure/TestTruncateTableProcedure.TruncateTableProcedureOnHDFSFailure.html" target="_top">Frames</a></li>
+<li><a href="TestTruncateTableProcedure.TruncateTableProcedureOnHDFSFailure.html" target="_top">No&nbsp;Frames</a></li>
+</ul>
+<ul class="navList" id="allclasses_navbar_top">
+<li><a href="../../../../../../allclasses-noframe.html">All&nbsp;Classes</a></li>
+</ul>
+<div>
+<script type="text/javascript"><!--
+  allClassesLink = document.getElementById("allclasses_navbar_top");
+  if(window==top) {
+    allClassesLink.style.display = "block";
+  }
+  else {
+    allClassesLink.style.display = "none";
+  }
+  //-->
+</script>
+</div>
+<div>
+<ul class="subNavList">
+<li>Summary:&nbsp;</li>
+<li><a href="#nested.classes.inherited.from.class.org.apache.hadoop.hbase.procedure2.StateMachineProcedure">Nested</a>&nbsp;|&nbsp;</li>
+<li><a href="#field.summary">Field</a>&nbsp;|&nbsp;</li>
+<li><a href="#constructor.summary">Constr</a>&nbsp;|&nbsp;</li>
+<li><a href="#method.summary">Method</a></li>
+</ul>
+<ul class="subNavList">
+<li>Detail:&nbsp;</li>
+<li><a href="#field.detail">Field</a>&nbsp;|&nbsp;</li>
+<li><a href="#constructor.detail">Constr</a>&nbsp;|&nbsp;</li>
+<li><a href="#method.detail">Method</a></li>
+</ul>
+</div>
+<a name="skip.navbar.top">
+<!--   -->
+</a></div>
+<!-- ========= END OF TOP NAVBAR ========= -->
+<!-- ======== START OF CLASS DATA ======== -->
+<div class="header">
+<div class="subTitle">org.apache.hadoop.hbase.master.procedure</div>
+<h2 title="Class TestTruncateTableProcedure.TruncateTableProcedureOnHDFSFailure" class="title">Class TestTruncateTableProcedure.TruncateTableProcedureOnHDFSFailure</h2>
+</div>
+<div class="contentContainer">
+<ul class="inheritance">
+<li><a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html?is-external=true" title="class or interface in java.lang">java.lang.Object</a></li>
+<li>
+<ul class="inheritance">
+<li>org.apache.hadoop.hbase.procedure2.Procedure&lt;TEnvironment&gt;</li>
+<li>
+<ul class="inheritance">
+<li>org.apache.hadoop.hbase.procedure2.StateMachineProcedure&lt;org.apache.hadoop.hbase.master.procedure.MasterProcedureEnv,TState&gt;</li>
+<li>
+<ul class="inheritance">
+<li>org.apache.hadoop.hbase.master.procedure.AbstractStateMachineTableProcedure&lt;org.apache.hadoop.hbase.shaded.protobuf.generated.MasterProcedureProtos.TruncateTableState&gt;</li>
+<li>
+<ul class="inheritance">
+<li>org.apache.hadoop.hbase.master.procedure.TruncateTableProcedure</li>
+<li>
+<ul class="inheritance">
+<li>org.apache.hadoop.hbase.master.procedure.TestTruncateTableProcedure.TruncateTableProcedureOnHDFSFailure</li>
+</ul>
+</li>
+</ul>
+</li>
+</ul>
+</li>
+</ul>
+</li>
+</ul>
+</li>
+</ul>
+<div class="description">
+<ul class="blockList">
+<li class="blockList">
+<dl>
+<dt>All Implemented Interfaces:</dt>
+<dd><a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Comparable.html?is-external=true" title="class or interface in java.lang">Comparable</a>&lt;org.apache.hadoop.hbase.procedure2.Procedure&lt;org.apache.hadoop.hbase.master.procedure.MasterProcedureEnv&gt;&gt;, org.apache.hadoop.hbase.master.procedure.TableProcedureInterface</dd>
+</dl>
+<dl>
+<dt>Enclosing class:</dt>
+<dd><a href="../../../../../../org/apache/hadoop/hbase/master/procedure/TestTruncateTableProcedure.html" title="class in org.apache.hadoop.hbase.master.procedure">TestTruncateTableProcedure</a></dd>
+</dl>
+<hr>
+<br>
+<pre>public static class <a href="../../../../../../src-html/org/apache/hadoop/hbase/master/procedure/TestTruncateTableProcedure.html#line.242">TestTruncateTableProcedure.TruncateTableProcedureOnHDFSFailure</a>
+extends org.apache.hadoop.hbase.master.procedure.TruncateTableProcedure</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.StateMachineProcedure">
+<!--   -->
+</a>
+<h3>Nested classes/interfaces inherited from class&nbsp;org.apache.hadoop.hbase.procedure2.StateMachineProcedure</h3>
+<code>org.apache.hadoop.hbase.procedure2.StateMachineProcedure.Flow</code></li>
+</ul>
+<ul class="blockList">
+<li class="blockList"><a name="nested.classes.inherited.from.class.org.apache.hadoop.hbase.procedure2.Procedure">
+<!--   -->
+</a>
+<h3>Nested classes/interfaces inherited from class&nbsp;org.apache.hadoop.hbase.procedure2.Procedure</h3>
+<code>org.apache.hadoop.hbase.procedure2.Procedure.LockState</code></li>
+</ul>
+<ul class="blockList">
+<li class="blockList"><a name="nested.classes.inherited.from.class.org.apache.hadoop.hbase.master.procedure.TableProcedureInterface">
+<!--   -->
+</a>
+<h3>Nested classes/interfaces inherited from interface&nbsp;org.apache.hadoop.hbase.master.procedure.TableProcedureInterface</h3>
+<code>org.apache.hadoop.hbase.master.procedure.TableProcedureInterface.TableOperationType</code></li>
+</ul>
+</li>
+</ul>
+<!-- =========== FIELD SUMMARY =========== -->
+<ul class="blockList">
+<li class="blockList"><a name="field.summary">
+<!--   -->
+</a>
+<h3>Field Summary</h3>
+<table class="memberSummary" border="0" cellpadding="3" cellspacing="0" summary="Field Summary table, listing fields, and an explanation">
+<caption><span>Fields</span><span class="tabEnd">&nbsp;</span></caption>
+<tr>
+<th class="colFirst" scope="col">Modifier and Type</th>
+<th class="colLast" scope="col">Field and Description</th>
+</tr>
+<tr class="altColor">
+<td class="colFirst"><code>private boolean</code></td>
+<td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/master/procedure/TestTruncateTableProcedure.TruncateTableProcedureOnHDFSFailure.html#failOnce">failOnce</a></span></code>&nbsp;</td>
+</tr>
+</table>
+<ul class="blockList">
+<li class="blockList"><a name="fields.inherited.from.class.org.apache.hadoop.hbase.procedure2.Procedure">
+<!--   -->
+</a>
+<h3>Fields inherited from class&nbsp;org.apache.hadoop.hbase.procedure2.Procedure</h3>
+<code>NO_PROC_ID, NO_TIMEOUT</code></li>
+</ul>
+</li>
+</ul>
+<!-- ======== CONSTRUCTOR SUMMARY ======== -->
+<ul class="blockList">
+<li class="blockList"><a name="constructor.summary">
+<!--   -->
+</a>
+<h3>Constructor Summary</h3>
+<table class="memberSummary" border="0" cellpadding="3" cellspacing="0" summary="Constructor Summary table, listing constructors, and an explanation">
+<caption><span>Constructors</span><span class="tabEnd">&nbsp;</span></caption>
+<tr>
+<th class="colOne" scope="col">Constructor and Description</th>
+</tr>
+<tr class="altColor">
+<td class="colOne"><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/master/procedure/TestTruncateTableProcedure.TruncateTableProcedureOnHDFSFailure.html#TruncateTableProcedureOnHDFSFailure--">TruncateTableProcedureOnHDFSFailure</a></span>()</code>&nbsp;</td>
+</tr>
+<tr class="rowColor">
+<td class="colOne"><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/master/procedure/TestTruncateTableProcedure.TruncateTableProcedureOnHDFSFailure.html#TruncateTableProcedureOnHDFSFailure-org.apache.hadoop.hbase.master.procedure.MasterProcedureEnv-org.apache.hadoop.hbase.TableName-boolean-">TruncateTableProcedureOnHDFSFailure</a></span>(org.apache.hadoop.hbase.master.procedure.MasterProcedureEnv&nbsp;env,
+                                   org.apache.hadoop.hbase.TableName&nbsp;tableName,
+                                   boolean&nbsp;preserveSplits)</code>&nbsp;</td>
+</tr>
+</table>
+</li>
+</ul>
+<!-- ========== METHOD SUMMARY =========== -->
+<ul class="blockList">
+<li class="blockList"><a name="method.summary">
+<!--   -->
+</a>
+<h3>Method Summary</h3>
+<table class="memberSummary" border="0" cellpadding="3" cellspacing="0" summary="Method Summary table, listing methods, and an explanation">
+<caption><span id="t0" class="activeTableTab"><span>All Methods</span><span class="tabEnd">&nbsp;</span></span><span id="t2" class="tableTab"><span><a href="javascript:show(2);">Instance Methods</a></span><span class="tabEnd">&nbsp;</span></span><span id="t4" class="tableTab"><span><a href="javascript:show(8);">Concrete Methods</a></span><span class="tabEnd">&nbsp;</span></span></caption>
+<tr>
+<th class="colFirst" scope="col">Modifier and Type</th>
+<th class="colLast" scope="col">Method and Description</th>
+</tr>
+<tr id="i0" class="altColor">
+<td class="colFirst"><code>protected org.apache.hadoop.hbase.procedure2.StateMachineProcedure.Flow</code></td>
+<td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/master/procedure/TestTruncateTableProcedure.TruncateTableProcedureOnHDFSFailure.html#executeFromState-org.apache.hadoop.hbase.master.procedure.MasterProcedureEnv-org.apache.hadoop.hbase.shaded.protobuf.generated.MasterProcedureProtos.TruncateTableState-">executeFromState</a></span>(org.apache.hadoop.hbase.master.procedure.MasterProcedureEnv&nbsp;env,
+                org.apache.hadoop.hbase.shaded.protobuf.generated.MasterProcedureProtos.TruncateTableState&nbsp;state)</code>&nbsp;</td>
+</tr>
+</table>
+<ul class="blockList">
+<li class="blockList"><a name="methods.inherited.from.class.org.apache.hadoop.hbase.master.procedure.TruncateTableProcedure">
+<!--   -->
+</a>
+<h3>Methods inherited from class&nbsp;org.apache.hadoop.hbase.master.procedure.TruncateTableProcedure</h3>
+<code>completionCleanup, deserializeStateData, getFirstRegionInfo, getInitialState, getState, getStateId, getTableName, getTableOperationType, isRollbackSupported, rollbackState, serializeStateData, toStringClassDetails</code></li>
+</ul>
+<ul class="blockList">
+<li class="blockList"><a name="methods.inherited.from.class.org.apache.hadoop.hbase.master.procedure.AbstractStateMachineTableProcedure">
+<!--   -->
+</a>
+<h3>Methods inherited from class&nbsp;org.apache.hadoop.hbase.master.procedure.AbstractStateMachineTableProcedure</h3>
+<code>acquireLock, checkOnline, checkTableModifiable, getRegionDir, getUser, preflightChecks, releaseLock, releaseSyncLatch, setUser</code></li>
+</ul>
+<ul class="blockList">
+<li class="blockList"><a name="methods.inherited.from.class.org.apache.hadoop.hbase.procedure2.StateMachineProcedure">
+<!--   -->
+</a>
+<h3>Methods inherited from class&nbsp;org.apache.hadoop.hbase.procedure2.StateMachineProcedure</h3>
+<code>abort, addChildProcedure, execute, failIfAborted, getCurrentState, getCurrentStateId, getCycles, isYieldAfterExecutionStep, isYieldBeforeExecuteFromState, rollback, setNextState, toStringState</code></li>
+</ul>
+<ul class="blockList">
+<li class="blockList"><a name="methods.inherited.from.class.org.apache.hadoop.hbase.procedure2.Procedure">
+<!--   -->
+</a>
+<h3>Methods inherited from class&nbsp;org.apache.hadoop.hbase.procedure2.Procedure</h3>
+<code>addStackIndex, afterReplay, beforeReplay, compareTo, 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, isFailed, isFinished, isInitializing, isRunnable, isSuccess, isWaiting, removeStackIndex, setAbortFailure, setChildrenLatch, setFailure, setFailure, setLastUpdate, setNonceKey, setOwner, setOwner, setParentProcId, setProcId, setResult, setRootProcId, setStackIndexes, setState, setSubmittedTime, setTimeout, setTimeoutFailure, shouldWaitClientAck, toString, toStringClass, toStringDetails, toStringSimpleSB, updateMetricsOnFinish, updateMetricsOnSubmit, updateTimestamp, wasExecuted</
 code></li>
+</ul>
+<ul class="blockList">
+<li class="blockList"><a name="methods.inherited.from.class.java.lang.Object">
+<!--   -->
+</a>
+<h3>Methods inherited from class&nbsp;java.lang.<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html?is-external=true" title="class or interface in java.lang">Object</a></h3>
+<code><a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html?is-external=true#clone--" title="class or interface in java.lang">clone</a>, <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html?is-external=true#equals-java.lang.Object-" title="class or interface in java.lang">equals</a>, <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html?is-external=true#finalize--" title="class or interface in java.lang">finalize</a>, <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html?is-external=true#getClass--" title="class or interface in java.lang">getClass</a>, <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html?is-external=true#hashCode--" title="class or interface in java.lang">hashCode</a>, <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html?is-external=true#notify--" title="class or interface in java.lang">notify</a>, <a href="https://docs.oracle.com/javase/8/docs/api/ja
 va/lang/Object.html?is-external=true#notifyAll--" title="class or interface in java.lang">notifyAll</a>, <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html?is-external=true#wait--" title="class or interface in java.lang">wait</a>, <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html?is-external=true#wait-long-" title="class or interface in java.lang">wait</a>, <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html?is-external=true#wait-long-int-" title="class or interface in java.lang">wait</a></code></li>
+</ul>
+</li>
+</ul>
+</li>
+</ul>
+</div>
+<div class="details">
+<ul class="blockList">
+<li class="blockList">
+<!-- ============ FIELD DETAIL =========== -->
+<ul class="blockList">
+<li class="blockList"><a name="field.detail">
+<!--   -->
+</a>
+<h3>Field Detail</h3>
+<a name="failOnce">
+<!--   -->
+</a>
+<ul class="blockListLast">
+<li class="blockList">
+<h4>failOnce</h4>
+<pre>private&nbsp;boolean <a href="../../../../../../src-html/org/apache/hadoop/hbase/master/procedure/TestTruncateTableProcedure.TruncateTableProcedureOnHDFSFailure.html#line.244">failOnce</a></pre>
+</li>
+</ul>
+</li>
+</ul>
+<!-- ========= CONSTRUCTOR DETAIL ======== -->
+<ul class="blockList">
+<li class="blockList"><a name="constructor.detail">
+<!--   -->
+</a>
+<h3>Constructor Detail</h3>
+<a name="TruncateTableProcedureOnHDFSFailure--">
+<!--   -->
+</a>
+<ul class="blockList">
+<li class="blockList">
+<h4>TruncateTableProcedureOnHDFSFailure</h4>
+<pre>public&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/procedure/TestTruncateTableProcedure.TruncateTableProcedureOnHDFSFailure.html#line.246">TruncateTableProcedureOnHDFSFailure</a>()</pre>
+</li>
+</ul>
+<a name="TruncateTableProcedureOnHDFSFailure-org.apache.hadoop.hbase.master.procedure.MasterProcedureEnv-org.apache.hadoop.hbase.TableName-boolean-">
+<!--   -->
+</a>
+<ul class="blockListLast">
+<li class="blockList">
+<h4>TruncateTableProcedureOnHDFSFailure</h4>
+<pre>public&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/procedure/TestTruncateTableProcedure.TruncateTableProcedureOnHDFSFailure.html#line.251">TruncateTableProcedureOnHDFSFailure</a>(org.apache.hadoop.hbase.master.procedure.MasterProcedureEnv&nbsp;env,
+                                           org.apache.hadoop.hbase.TableName&nbsp;tableName,
+                                           boolean&nbsp;preserveSplits)
+                                    throws org.apache.hadoop.hbase.HBaseIOException</pre>
+<dl>
+<dt><span class="throwsLabel">Throws:</span></dt>
+<dd><code>org.apache.hadoop.hbase.HBaseIOException</code></dd>
+</dl>
+</li>
+</ul>
+</li>
+</ul>
+<!-- ============ METHOD DETAIL ========== -->
+<ul class="blockList">
+<li class="blockList"><a name="method.detail">
+<!--   -->
+</a>
+<h3>Method Detail</h3>
+<a name="executeFromState-org.apache.hadoop.hbase.master.procedure.MasterProcedureEnv-org.apache.hadoop.hbase.shaded.protobuf.generated.MasterProcedureProtos.TruncateTableState-">
+<!--   -->
+</a>
+<ul class="blockListLast">
+<li class="blockList">
+<h4>executeFromState</h4>
+<pre>protected&nbsp;org.apache.hadoop.hbase.procedure2.StateMachineProcedure.Flow&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/procedure/TestTruncateTableProcedure.TruncateTableProcedureOnHDFSFailure.html#line.258">executeFromState</a>(org.apache.hadoop.hbase.master.procedure.MasterProcedureEnv&nbsp;env,
+                                                                                         org.apache.hadoop.hbase.shaded.protobuf.generated.MasterProcedureProtos.TruncateTableState&nbsp;state)
+                                                                                  throws <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/InterruptedException.html?is-external=true" title="class or interface in java.lang">InterruptedException</a></pre>
+<dl>
+<dt><span class="overrideSpecifyLabel">Overrides:</span></dt>
+<dd><code>executeFromState</code>&nbsp;in class&nbsp;<code>org.apache.hadoop.hbase.master.procedure.TruncateTableProcedure</code></dd>
+<dt><span class="throwsLabel">Throws:</span></dt>
+<dd><code><a href="https://docs.oracle.com/javase/8/docs/api/java/lang/InterruptedException.html?is-external=true" title="class or interface in java.lang">InterruptedException</a></code></dd>
+</dl>
+</li>
+</ul>
+</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/TestTruncateTableProcedure.TruncateTableProcedureOnHDFSFailure.html">Use</a></li>
+<li><a href="package-tree.html">Tree</a></li>
+<li><a href="../../../../../../deprecated-list.html">Deprecated</a></li>
+<li><a href="../../../../../../index-all.html">Index</a></li>
+<li><a href="../../../../../../help-doc.html">Help</a></li>
+</ul>
+</div>
+<div class="subNav">
+<ul class="navList">
+<li><a href="../../../../../../org/apache/hadoop/hbase/master/procedure/TestTruncateTableProcedure.html" title="class in org.apache.hadoop.hbase.master.procedure"><span class="typeNameLink">Prev&nbsp;Class</span></a></li>
+<li><a href="../../../../../../org/apache/hadoop/hbase/master/procedure/TestWALProcedureStoreOnHDFS.html" title="class in org.apache.hadoop.hbase.master.procedure"><span class="typeNameLink">Next&nbsp;Class</span></a></li>
+</ul>
+<ul class="navList">
+<li><a href="../../../../../../index.html?org/apache/hadoop/hbase/master/procedure/TestTruncateTableProcedure.TruncateTableProcedureOnHDFSFailure.html" target="_top">Frames</a></li>
+<li><a href="TestTruncateTableProcedure.TruncateTableProcedureOnHDFSFailure.html" target="_top">No&nbsp;Frames</a></li>
+</ul>
+<ul class="navList" id="allclasses_navbar_bottom">
+<li><a href="../../../../../../allclasses-noframe.html">All&nbsp;Classes</a></li>
+</ul>
+<div>
+<script type="text/javascript"><!--
+  allClassesLink = document.getElementById("allclasses_navbar_bottom");
+  if(window==top) {
+    allClassesLink.style.display = "block";
+  }
+  else {
+    allClassesLink.style.display = "none";
+  }
+  //-->
+</script>
+</div>
+<div>
+<ul class="subNavList">
+<li>Summary:&nbsp;</li>
+<li><a href="#nested.classes.inherited.from.class.org.apache.hadoop.hbase.procedure2.StateMachineProcedure">Nested</a>&nbsp;|&nbsp;</li>
+<li><a href="#field.summary">Field</a>&nbsp;|&nbsp;</li>
+<li><a href="#constructor.summary">Constr</a>&nbsp;|&nbsp;</li>
+<li><a href="#method.summary">Method</a></li>
+</ul>
+<ul class="subNavList">
+<li>Detail:&nbsp;</li>
+<li><a href="#field.detail">Field</a>&nbsp;|&nbsp;</li>
+<li><a href="#constructor.detail">Constr</a>&nbsp;|&nbsp;</li>
+<li><a href="#method.detail">Method</a></li>
+</ul>
+</div>
+<a name="skip.navbar.bottom">
+<!--   -->
+</a></div>
+<!-- ======== END OF BOTTOM NAVBAR ======= -->
+<p class="legalCopy"><small>Copyright &#169; 2007&#x2013;2018 <a href="https://www.apache.org/">The Apache Software Foundation</a>. All rights reserved.</small></p>
+</body>
+</html>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/621479e1/testdevapidocs/org/apache/hadoop/hbase/master/procedure/TestTruncateTableProcedure.html
----------------------------------------------------------------------
diff --git a/testdevapidocs/org/apache/hadoop/hbase/master/procedure/TestTruncateTableProcedure.html b/testdevapidocs/org/apache/hadoop/hbase/master/procedure/TestTruncateTableProcedure.html
index b95264a..73b1bec 100644
--- a/testdevapidocs/org/apache/hadoop/hbase/master/procedure/TestTruncateTableProcedure.html
+++ b/testdevapidocs/org/apache/hadoop/hbase/master/procedure/TestTruncateTableProcedure.html
@@ -18,7 +18,7 @@
     catch(err) {
     }
 //-->
-var methods = {"i0":10,"i1":10,"i2":10,"i3":10,"i4":10,"i5":10,"i6":10,"i7":10};
+var methods = {"i0":10,"i1":10,"i2":10,"i3":10,"i4":10,"i5":10,"i6":10,"i7":10,"i8":10,"i9":10,"i10":10};
 var tabs = {65535:["t0","All Methods"],2:["t2","Instance Methods"],8:["t4","Concrete Methods"]};
 var altColor = "altColor";
 var rowColor = "rowColor";
@@ -50,7 +50,7 @@ var activeTableTab = "activeTableTab";
 <div class="subNav">
 <ul class="navList">
 <li><a href="../../../../../../org/apache/hadoop/hbase/master/procedure/TestTableDescriptorModificationFromClient.html" title="class in org.apache.hadoop.hbase.master.procedure"><span class="typeNameLink">Prev&nbsp;Class</span></a></li>
-<li><a href="../../../../../../org/apache/hadoop/hbase/master/procedure/TestWALProcedureStoreOnHDFS.html" title="class in org.apache.hadoop.hbase.master.procedure"><span class="typeNameLink">Next&nbsp;Class</span></a></li>
+<li><a href="../../../../../../org/apache/hadoop/hbase/master/procedure/TestTruncateTableProcedure.TruncateTableProcedureOnHDFSFailure.html" title="class in org.apache.hadoop.hbase.master.procedure"><span class="typeNameLink">Next&nbsp;Class</span></a></li>
 </ul>
 <ul class="navList">
 <li><a href="../../../../../../index.html?org/apache/hadoop/hbase/master/procedure/TestTruncateTableProcedure.html" target="_top">Frames</a></li>
@@ -74,7 +74,7 @@ var activeTableTab = "activeTableTab";
 <div>
 <ul class="subNavList">
 <li>Summary:&nbsp;</li>
-<li>Nested&nbsp;|&nbsp;</li>
+<li><a href="#nested.class.summary">Nested</a>&nbsp;|&nbsp;</li>
 <li><a href="#field.summary">Field</a>&nbsp;|&nbsp;</li>
 <li><a href="#constructor.summary">Constr</a>&nbsp;|&nbsp;</li>
 <li><a href="#method.summary">Method</a></li>
@@ -114,7 +114,7 @@ var activeTableTab = "activeTableTab";
 <li class="blockList">
 <hr>
 <br>
-<pre>public class <a href="../../../../../../src-html/org/apache/hadoop/hbase/master/procedure/TestTruncateTableProcedure.html#line.43">TestTruncateTableProcedure</a>
+<pre>public class <a href="../../../../../../src-html/org/apache/hadoop/hbase/master/procedure/TestTruncateTableProcedure.html#line.52">TestTruncateTableProcedure</a>
 extends <a href="../../../../../../org/apache/hadoop/hbase/master/procedure/TestTableDDLProcedureBase.html" title="class in org.apache.hadoop.hbase.master.procedure">TestTableDDLProcedureBase</a></pre>
 </li>
 </ul>
@@ -122,6 +122,25 @@ extends <a href="../../../../../../org/apache/hadoop/hbase/master/procedure/Test
 <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>
+<table class="memberSummary" border="0" cellpadding="3" cellspacing="0" summary="Nested Class Summary table, listing nested classes, and an explanation">
+<caption><span>Nested Classes</span><span class="tabEnd">&nbsp;</span></caption>
+<tr>
+<th class="colFirst" scope="col">Modifier and Type</th>
+<th class="colLast" scope="col">Class and Description</th>
+</tr>
+<tr class="altColor">
+<td class="colFirst"><code>static class&nbsp;</code></td>
+<td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/master/procedure/TestTruncateTableProcedure.TruncateTableProcedureOnHDFSFailure.html" title="class in org.apache.hadoop.hbase.master.procedure">TestTruncateTableProcedure.TruncateTableProcedureOnHDFSFailure</a></span></code>&nbsp;</td>
+</tr>
+</table>
+</li>
+</ul>
 <!-- =========== FIELD SUMMARY =========== -->
 <ul class="blockList">
 <li class="blockList"><a name="field.summary">
@@ -187,35 +206,48 @@ extends <a href="../../../../../../org/apache/hadoop/hbase/master/procedure/Test
 </tr>
 <tr id="i0" class="altColor">
 <td class="colFirst"><code>private void</code></td>
+<td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/master/procedure/TestTruncateTableProcedure.html#testOnHDFSFailure-org.apache.hadoop.hbase.TableName-boolean-">testOnHDFSFailure</a></span>(org.apache.hadoop.hbase.TableName&nbsp;tableName,
+                 boolean&nbsp;preserveSplits)</code>&nbsp;</td>
+</tr>
+<tr id="i1" class="rowColor">
+<td class="colFirst"><code>void</code></td>
+<td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/master/procedure/TestTruncateTableProcedure.html#testOnHDFSFailureNoPreserveSplits--">testOnHDFSFailureNoPreserveSplits</a></span>()</code>&nbsp;</td>
+</tr>
+<tr id="i2" class="altColor">
+<td class="colFirst"><code>void</code></td>
+<td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/master/procedure/TestTruncateTableProcedure.html#testOnHDFSFailurePreserveSplits--">testOnHDFSFailurePreserveSplits</a></span>()</code>&nbsp;</td>
+</tr>
+<tr id="i3" class="rowColor">
+<td class="colFirst"><code>private void</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/master/procedure/TestTruncateTableProcedure.html#testRecoveryAndDoubleExecution-org.apache.hadoop.hbase.TableName-boolean-">testRecoveryAndDoubleExecution</a></span>(org.apache.hadoop.hbase.TableName&nbsp;tableName,
                               boolean&nbsp;preserveSplits)</code>&nbsp;</td>
 </tr>
-<tr id="i1" class="rowColor">
+<tr id="i4" class="altColor">
 <td class="colFirst"><code>void</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/master/procedure/TestTruncateTableProcedure.html#testRecoveryAndDoubleExecutionNoPreserveSplits--">testRecoveryAndDoubleExecutionNoPreserveSplits</a></span>()</code>&nbsp;</td>
 </tr>
-<tr id="i2" class="altColor">
+<tr id="i5" class="rowColor">
 <td class="colFirst"><code>void</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/master/procedure/TestTruncateTableProcedure.html#testRecoveryAndDoubleExecutionPreserveSplits--">testRecoveryAndDoubleExecutionPreserveSplits</a></span>()</code>&nbsp;</td>
 </tr>
-<tr id="i3" class="rowColor">
+<tr id="i6" class="altColor">
 <td class="colFirst"><code>private void</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/master/procedure/TestTruncateTableProcedure.html#testSimpleTruncate-org.apache.hadoop.hbase.TableName-boolean-">testSimpleTruncate</a></span>(org.apache.hadoop.hbase.TableName&nbsp;tableName,
                   boolean&nbsp;preserveSplits)</code>&nbsp;</td>
 </tr>
-<tr id="i4" class="altColor">
+<tr id="i7" class="rowColor">
 <td class="colFirst"><code>void</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/master/procedure/TestTruncateTableProcedure.html#testSimpleTruncateNoPreserveSplits--">testSimpleTruncateNoPreserveSplits</a></span>()</code>&nbsp;</td>
 </tr>
-<tr id="i5" class="rowColor">
+<tr id="i8" class="altColor">
 <td class="colFirst"><code>void</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/master/procedure/TestTruncateTableProcedure.html#testSimpleTruncatePreserveSplits--">testSimpleTruncatePreserveSplits</a></span>()</code>&nbsp;</td>
 </tr>
-<tr id="i6" class="altColor">
+<tr id="i9" class="rowColor">
 <td class="colFirst"><code>void</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/master/procedure/TestTruncateTableProcedure.html#testTruncateNotDisabledTable--">testTruncateNotDisabledTable</a></span>()</code>&nbsp;</td>
 </tr>
-<tr id="i7" class="rowColor">
+<tr id="i10" class="altColor">
 <td class="colFirst"><code>void</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/master/procedure/TestTruncateTableProcedure.html#testTruncateNotExistentTable--">testTruncateNotExistentTable</a></span>()</code>&nbsp;</td>
 </tr>
@@ -254,7 +286,7 @@ extends <a href="../../../../../../org/apache/hadoop/hbase/master/procedure/Test
 <ul class="blockList">
 <li class="blockList">
 <h4>CLASS_RULE</h4>
-<pre>public static final&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/HBaseClassTestRule.html" title="class in org.apache.hadoop.hbase">HBaseClassTestRule</a> <a href="../../../../../../src-html/org/apache/hadoop/hbase/master/procedure/TestTruncateTableProcedure.html#line.46">CLASS_RULE</a></pre>
+<pre>public static final&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/HBaseClassTestRule.html" title="class in org.apache.hadoop.hbase">HBaseClassTestRule</a> <a href="../../../../../../src-html/org/apache/hadoop/hbase/master/procedure/TestTruncateTableProcedure.html#line.55">CLASS_RULE</a></pre>
 </li>
 </ul>
 <a name="LOG">
@@ -263,7 +295,7 @@ extends <a href="../../../../../../org/apache/hadoop/hbase/master/procedure/Test
 <ul class="blockList">
 <li class="blockList">
 <h4>LOG</h4>
-<pre>private static final&nbsp;org.slf4j.Logger <a href="../../../../../../src-html/org/apache/hadoop/hbase/master/procedure/TestTruncateTableProcedure.html#line.49">LOG</a></pre>
+<pre>private static final&nbsp;org.slf4j.Logger <a href="../../../../../../src-html/org/apache/hadoop/hbase/master/procedure/TestTruncateTableProcedure.html#line.58">LOG</a></pre>
 </li>
 </ul>
 <a name="name">
@@ -272,7 +304,7 @@ extends <a href="../../../../../../org/apache/hadoop/hbase/master/procedure/Test
 <ul class="blockListLast">
 <li class="blockList">
 <h4>name</h4>
-<pre>public&nbsp;org.junit.rules.TestName <a href="../../../../../../src-html/org/apache/hadoop/hbase/master/procedure/TestTruncateTableProcedure.html#line.52">name</a></pre>
+<pre>public&nbsp;org.junit.rules.TestName <a href="../../../../../../src-html/org/apache/hadoop/hbase/master/procedure/TestTruncateTableProcedure.html#line.61">name</a></pre>
 </li>
 </ul>
 </li>
@@ -289,7 +321,7 @@ extends <a href="../../../../../../org/apache/hadoop/hbase/master/procedure/Test
 <ul class="blockListLast">
 <li class="blockList">
 <h4>TestTruncateTableProcedure</h4>
-<pre>public&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/procedure/TestTruncateTableProcedure.html#line.43">TestTruncateTableProcedure</a>()</pre>
+<pre>public&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/procedure/TestTruncateTableProcedure.html#line.52">TestTruncateTableProcedure</a>()</pre>
 </li>
 </ul>
 </li>
@@ -306,7 +338,7 @@ extends <a href="../../../../../../org/apache/hadoop/hbase/master/procedure/Test
 <ul class="blockList">
 <li class="blockList">
 <h4>testTruncateNotExistentTable</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/procedure/TestTruncateTableProcedure.html#line.55">testTruncateNotExistentTable</a>()
+<pre>public&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/procedure/TestTruncateTableProcedure.html#line.64">testTruncateNotExistentTable</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>
@@ -320,7 +352,7 @@ extends <a href="../../../../../../org/apache/hadoop/hbase/master/procedure/Test
 <ul class="blockList">
 <li class="blockList">
 <h4>testTruncateNotDisabledTable</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/procedure/TestTruncateTableProcedure.html#line.78">testTruncateNotDisabledTable</a>()
+<pre>public&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/procedure/TestTruncateTableProcedure.html#line.87">testTruncateNotDisabledTable</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>
@@ -334,7 +366,7 @@ extends <a href="../../../../../../org/apache/hadoop/hbase/master/procedure/Test
 <ul class="blockList">
 <li class="blockList">
 <h4>testSimpleTruncatePreserveSplits</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/procedure/TestTruncateTableProcedure.html#line.103">testSimpleTruncatePreserveSplits</a>()
+<pre>public&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/procedure/TestTruncateTableProcedure.html#line.112">testSimpleTruncatePreserveSplits</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>
@@ -348,7 +380,7 @@ extends <a href="../../../../../../org/apache/hadoop/hbase/master/procedure/Test
 <ul class="blockList">
 <li class="blockList">
 <h4>testSimpleTruncateNoPreserveSplits</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/procedure/TestTruncateTableProcedure.html#line.109">testSimpleTruncateNoPreserveSplits</a>()
+<pre>public&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/procedure/TestTruncateTableProcedure.html#line.118">testSimpleTruncateNoPreserveSplits</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>
@@ -362,7 +394,7 @@ extends <a href="../../../../../../org/apache/hadoop/hbase/master/procedure/Test
 <ul class="blockList">
 <li class="blockList">
 <h4>testSimpleTruncate</h4>
-<pre>private&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/procedure/TestTruncateTableProcedure.html#line.114">testSimpleTruncate</a>(org.apache.hadoop.hbase.TableName&nbsp;tableName,
+<pre>private&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/procedure/TestTruncateTableProcedure.html#line.123">testSimpleTruncate</a>(org.apache.hadoop.hbase.TableName&nbsp;tableName,
                                 boolean&nbsp;preserveSplits)
                          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>
@@ -377,7 +409,7 @@ extends <a href="../../../../../../org/apache/hadoop/hbase/master/procedure/Test
 <ul class="blockList">
 <li class="blockList">
 <h4>testRecoveryAndDoubleExecutionPreserveSplits</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/procedure/TestTruncateTableProcedure.html#line.160">testRecoveryAndDoubleExecutionPreserveSplits</a>()
+<pre>public&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/procedure/TestTruncateTableProcedure.html#line.169">testRecoveryAndDoubleExecutionPreserveSplits</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>
@@ -391,7 +423,7 @@ extends <a href="../../../../../../org/apache/hadoop/hbase/master/procedure/Test
 <ul class="blockList">
 <li class="blockList">
 <h4>testRecoveryAndDoubleExecutionNoPreserveSplits</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/procedure/TestTruncateTableProcedure.html#line.166">testRecoveryAndDoubleExecutionNoPreserveSplits</a>()
+<pre>public&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/procedure/TestTruncateTableProcedure.html#line.175">testRecoveryAndDoubleExecutionNoPreserveSplits</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>
@@ -402,10 +434,10 @@ extends <a href="../../../../../../org/apache/hadoop/hbase/master/procedure/Test
 <a name="testRecoveryAndDoubleExecution-org.apache.hadoop.hbase.TableName-boolean-">
 <!--   -->
 </a>
-<ul class="blockListLast">
+<ul class="blockList">
 <li class="blockList">
 <h4>testRecoveryAndDoubleExecution</h4>
-<pre>private&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/procedure/TestTruncateTableProcedure.html#line.171">testRecoveryAndDoubleExecution</a>(org.apache.hadoop.hbase.TableName&nbsp;tableName,
+<pre>private&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/procedure/TestTruncateTableProcedure.html#line.180">testRecoveryAndDoubleExecution</a>(org.apache.hadoop.hbase.TableName&nbsp;tableName,
                                             boolean&nbsp;preserveSplits)
                                      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>
@@ -414,6 +446,49 @@ extends <a href="../../../../../../org/apache/hadoop/hbase/master/procedure/Test
 </dl>
 </li>
 </ul>
+<a name="testOnHDFSFailurePreserveSplits--">
+<!--   -->
+</a>
+<ul class="blockList">
+<li class="blockList">
+<h4>testOnHDFSFailurePreserveSplits</h4>
+<pre>public&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/procedure/TestTruncateTableProcedure.html#line.231">testOnHDFSFailurePreserveSplits</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="testOnHDFSFailureNoPreserveSplits--">
+<!--   -->
+</a>
+<ul class="blockList">
+<li class="blockList">
+<h4>testOnHDFSFailureNoPreserveSplits</h4>
+<pre>public&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/procedure/TestTruncateTableProcedure.html#line.237">testOnHDFSFailureNoPreserveSplits</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="testOnHDFSFailure-org.apache.hadoop.hbase.TableName-boolean-">
+<!--   -->
+</a>
+<ul class="blockListLast">
+<li class="blockList">
+<h4>testOnHDFSFailure</h4>
+<pre>private&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/procedure/TestTruncateTableProcedure.html#line.285">testOnHDFSFailure</a>(org.apache.hadoop.hbase.TableName&nbsp;tableName,
+                               boolean&nbsp;preserveSplits)
+                        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>
 </li>
 </ul>
 </li>
@@ -443,7 +518,7 @@ extends <a href="../../../../../../org/apache/hadoop/hbase/master/procedure/Test
 <div class="subNav">
 <ul class="navList">
 <li><a href="../../../../../../org/apache/hadoop/hbase/master/procedure/TestTableDescriptorModificationFromClient.html" title="class in org.apache.hadoop.hbase.master.procedure"><span class="typeNameLink">Prev&nbsp;Class</span></a></li>
-<li><a href="../../../../../../org/apache/hadoop/hbase/master/procedure/TestWALProcedureStoreOnHDFS.html" title="class in org.apache.hadoop.hbase.master.procedure"><span class="typeNameLink">Next&nbsp;Class</span></a></li>
+<li><a href="../../../../../../org/apache/hadoop/hbase/master/procedure/TestTruncateTableProcedure.TruncateTableProcedureOnHDFSFailure.html" title="class in org.apache.hadoop.hbase.master.procedure"><span class="typeNameLink">Next&nbsp;Class</span></a></li>
 </ul>
 <ul class="navList">
 <li><a href="../../../../../../index.html?org/apache/hadoop/hbase/master/procedure/TestTruncateTableProcedure.html" target="_top">Frames</a></li>
@@ -467,7 +542,7 @@ extends <a href="../../../../../../org/apache/hadoop/hbase/master/procedure/Test
 <div>
 <ul class="subNavList">
 <li>Summary:&nbsp;</li>
-<li>Nested&nbsp;|&nbsp;</li>
+<li><a href="#nested.class.summary">Nested</a>&nbsp;|&nbsp;</li>
 <li><a href="#field.summary">Field</a>&nbsp;|&nbsp;</li>
 <li><a href="#constructor.summary">Constr</a>&nbsp;|&nbsp;</li>
 <li><a href="#method.summary">Method</a></li>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/621479e1/testdevapidocs/org/apache/hadoop/hbase/master/procedure/TestWALProcedureStoreOnHDFS.html
----------------------------------------------------------------------
diff --git a/testdevapidocs/org/apache/hadoop/hbase/master/procedure/TestWALProcedureStoreOnHDFS.html b/testdevapidocs/org/apache/hadoop/hbase/master/procedure/TestWALProcedureStoreOnHDFS.html
index e882b1b..87ddc3e 100644
--- a/testdevapidocs/org/apache/hadoop/hbase/master/procedure/TestWALProcedureStoreOnHDFS.html
+++ b/testdevapidocs/org/apache/hadoop/hbase/master/procedure/TestWALProcedureStoreOnHDFS.html
@@ -49,7 +49,7 @@ var activeTableTab = "activeTableTab";
 </div>
 <div class="subNav">
 <ul class="navList">
-<li><a href="../../../../../../org/apache/hadoop/hbase/master/procedure/TestTruncateTableProcedure.html" title="class in org.apache.hadoop.hbase.master.procedure"><span class="typeNameLink">Prev&nbsp;Class</span></a></li>
+<li><a href="../../../../../../org/apache/hadoop/hbase/master/procedure/TestTruncateTableProcedure.TruncateTableProcedureOnHDFSFailure.html" title="class in org.apache.hadoop.hbase.master.procedure"><span class="typeNameLink">Prev&nbsp;Class</span></a></li>
 <li>Next&nbsp;Class</li>
 </ul>
 <ul class="navList">
@@ -422,7 +422,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/master/procedure/TestTruncateTableProcedure.html" title="class in org.apache.hadoop.hbase.master.procedure"><span class="typeNameLink">Prev&nbsp;Class</span></a></li>
+<li><a href="../../../../../../org/apache/hadoop/hbase/master/procedure/TestTruncateTableProcedure.TruncateTableProcedureOnHDFSFailure.html" title="class in org.apache.hadoop.hbase.master.procedure"><span class="typeNameLink">Prev&nbsp;Class</span></a></li>
 <li>Next&nbsp;Class</li>
 </ul>
 <ul class="navList">

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/621479e1/testdevapidocs/org/apache/hadoop/hbase/master/procedure/class-use/TestTruncateTableProcedure.TruncateTableProcedureOnHDFSFailure.html
----------------------------------------------------------------------
diff --git a/testdevapidocs/org/apache/hadoop/hbase/master/procedure/class-use/TestTruncateTableProcedure.TruncateTableProcedureOnHDFSFailure.html b/testdevapidocs/org/apache/hadoop/hbase/master/procedure/class-use/TestTruncateTableProcedure.TruncateTableProcedureOnHDFSFailure.html
new file mode 100644
index 0000000..75fc85c
--- /dev/null
+++ b/testdevapidocs/org/apache/hadoop/hbase/master/procedure/class-use/TestTruncateTableProcedure.TruncateTableProcedureOnHDFSFailure.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.master.procedure.TestTruncateTableProcedure.TruncateTableProcedureOnHDFSFailure (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.master.procedure.TestTruncateTableProcedure.TruncateTableProcedureOnHDFSFailure (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/master/procedure/TestTruncateTableProcedure.TruncateTableProcedureOnHDFSFailure.html" title="class in org.apache.hadoop.hbase.master.procedure">Class</a></li>
+<li class="navBarCell1Rev">Use</li>
+<li><a href="../../../../../../../overview-tree.html">Tree</a></li>
+<li><a href="../../../../../../../deprecated-list.html">Deprecated</a></li>
+<li><a href="../../../../../../../index-all.html">Index</a></li>
+<li><a href="../../../../../../../help-doc.html">Help</a></li>
+</ul>
+</div>
+<div class="subNav">
+<ul class="navList">
+<li>Prev</li>
+<li>Next</li>
+</ul>
+<ul class="navList">
+<li><a href="../../../../../../../index.html?org/apache/hadoop/hbase/master/procedure/class-use/TestTruncateTableProcedure.TruncateTableProcedureOnHDFSFailure.html" target="_top">Frames</a></li>
+<li><a href="TestTruncateTableProcedure.TruncateTableProcedureOnHDFSFailure.html" target="_top">No&nbsp;Frames</a></li>
+</ul>
+<ul class="navList" id="allclasses_navbar_top">
+<li><a href="../../../../../../../allclasses-noframe.html">All&nbsp;Classes</a></li>
+</ul>
+<div>
+<script type="text/javascript"><!--
+  allClassesLink = document.getElementById("allclasses_navbar_top");
+  if(window==top) {
+    allClassesLink.style.display = "block";
+  }
+  else {
+    allClassesLink.style.display = "none";
+  }
+  //-->
+</script>
+</div>
+<a name="skip.navbar.top">
+<!--   -->
+</a></div>
+<!-- ========= END OF TOP NAVBAR ========= -->
+<div class="header">
+<h2 title="Uses of Class org.apache.hadoop.hbase.master.procedure.TestTruncateTableProcedure.TruncateTableProcedureOnHDFSFailure" class="title">Uses of Class<br>org.apache.hadoop.hbase.master.procedure.TestTruncateTableProcedure.TruncateTableProcedureOnHDFSFailure</h2>
+</div>
+<div class="classUseContainer">No usage of org.apache.hadoop.hbase.master.procedure.TestTruncateTableProcedure.TruncateTableProcedureOnHDFSFailure</div>
+<!-- ======= START OF BOTTOM NAVBAR ====== -->
+<div class="bottomNav"><a name="navbar.bottom">
+<!--   -->
+</a>
+<div class="skipNav"><a href="#skip.navbar.bottom" title="Skip navigation links">Skip navigation links</a></div>
+<a name="navbar.bottom.firstrow">
+<!--   -->
+</a>
+<ul class="navList" title="Navigation">
+<li><a href="../../../../../../../overview-summary.html">Overview</a></li>
+<li><a href="../package-summary.html">Package</a></li>
+<li><a href="../../../../../../../org/apache/hadoop/hbase/master/procedure/TestTruncateTableProcedure.TruncateTableProcedureOnHDFSFailure.html" title="class in org.apache.hadoop.hbase.master.procedure">Class</a></li>
+<li class="navBarCell1Rev">Use</li>
+<li><a href="../../../../../../../overview-tree.html">Tree</a></li>
+<li><a href="../../../../../../../deprecated-list.html">Deprecated</a></li>
+<li><a href="../../../../../../../index-all.html">Index</a></li>
+<li><a href="../../../../../../../help-doc.html">Help</a></li>
+</ul>
+</div>
+<div class="subNav">
+<ul class="navList">
+<li>Prev</li>
+<li>Next</li>
+</ul>
+<ul class="navList">
+<li><a href="../../../../../../../index.html?org/apache/hadoop/hbase/master/procedure/class-use/TestTruncateTableProcedure.TruncateTableProcedureOnHDFSFailure.html" target="_top">Frames</a></li>
+<li><a href="TestTruncateTableProcedure.TruncateTableProcedureOnHDFSFailure.html" target="_top">No&nbsp;Frames</a></li>
+</ul>
+<ul class="navList" id="allclasses_navbar_bottom">
+<li><a href="../../../../../../../allclasses-noframe.html">All&nbsp;Classes</a></li>
+</ul>
+<div>
+<script type="text/javascript"><!--
+  allClassesLink = document.getElementById("allclasses_navbar_bottom");
+  if(window==top) {
+    allClassesLink.style.display = "block";
+  }
+  else {
+    allClassesLink.style.display = "none";
+  }
+  //-->
+</script>
+</div>
+<a name="skip.navbar.bottom">
+<!--   -->
+</a></div>
+<!-- ======== END OF BOTTOM NAVBAR ======= -->
+<p class="legalCopy"><small>Copyright &#169; 2007&#x2013;2018 <a href="https://www.apache.org/">The Apache Software Foundation</a>. All rights reserved.</small></p>
+</body>
+</html>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/621479e1/testdevapidocs/org/apache/hadoop/hbase/master/procedure/package-frame.html
----------------------------------------------------------------------
diff --git a/testdevapidocs/org/apache/hadoop/hbase/master/procedure/package-frame.html b/testdevapidocs/org/apache/hadoop/hbase/master/procedure/package-frame.html
index 08bebaf..e791a1e 100644
--- a/testdevapidocs/org/apache/hadoop/hbase/master/procedure/package-frame.html
+++ b/testdevapidocs/org/apache/hadoop/hbase/master/procedure/package-frame.html
@@ -55,6 +55,7 @@
 <li><a href="TestTableDDLProcedureBase.html" title="class in org.apache.hadoop.hbase.master.procedure" target="classFrame">TestTableDDLProcedureBase</a></li>
 <li><a href="TestTableDescriptorModificationFromClient.html" title="class in org.apache.hadoop.hbase.master.procedure" target="classFrame">TestTableDescriptorModificationFromClient</a></li>
 <li><a href="TestTruncateTableProcedure.html" title="class in org.apache.hadoop.hbase.master.procedure" target="classFrame">TestTruncateTableProcedure</a></li>
+<li><a href="TestTruncateTableProcedure.TruncateTableProcedureOnHDFSFailure.html" title="class in org.apache.hadoop.hbase.master.procedure" target="classFrame">TestTruncateTableProcedure.TruncateTableProcedureOnHDFSFailure</a></li>
 <li><a href="TestWALProcedureStoreOnHDFS.html" title="class in org.apache.hadoop.hbase.master.procedure" target="classFrame">TestWALProcedureStoreOnHDFS</a></li>
 </ul>
 </div>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/621479e1/testdevapidocs/org/apache/hadoop/hbase/master/procedure/package-summary.html
----------------------------------------------------------------------
diff --git a/testdevapidocs/org/apache/hadoop/hbase/master/procedure/package-summary.html b/testdevapidocs/org/apache/hadoop/hbase/master/procedure/package-summary.html
index 2e70974..e8a6a85 100644
--- a/testdevapidocs/org/apache/hadoop/hbase/master/procedure/package-summary.html
+++ b/testdevapidocs/org/apache/hadoop/hbase/master/procedure/package-summary.html
@@ -262,6 +262,10 @@
 <td class="colLast">&nbsp;</td>
 </tr>
 <tr class="altColor">
+<td class="colFirst"><a href="../../../../../../org/apache/hadoop/hbase/master/procedure/TestTruncateTableProcedure.TruncateTableProcedureOnHDFSFailure.html" title="class in org.apache.hadoop.hbase.master.procedure">TestTruncateTableProcedure.TruncateTableProcedureOnHDFSFailure</a></td>
+<td class="colLast">&nbsp;</td>
+</tr>
+<tr class="rowColor">
 <td class="colFirst"><a href="../../../../../../org/apache/hadoop/hbase/master/procedure/TestWALProcedureStoreOnHDFS.html" title="class in org.apache.hadoop.hbase.master.procedure">TestWALProcedureStoreOnHDFS</a></td>
 <td class="colLast">&nbsp;</td>
 </tr>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/621479e1/testdevapidocs/org/apache/hadoop/hbase/master/procedure/package-tree.html
----------------------------------------------------------------------
diff --git a/testdevapidocs/org/apache/hadoop/hbase/master/procedure/package-tree.html b/testdevapidocs/org/apache/hadoop/hbase/master/procedure/package-tree.html
index da83332..5363ff4 100644
--- a/testdevapidocs/org/apache/hadoop/hbase/master/procedure/package-tree.html
+++ b/testdevapidocs/org/apache/hadoop/hbase/master/procedure/package-tree.html
@@ -113,6 +113,19 @@
 </li>
 </ul>
 </li>
+<li type="circle">org.apache.hadoop.hbase.procedure2.StateMachineProcedure&lt;TEnvironment,TState&gt;
+<ul>
+<li type="circle">org.apache.hadoop.hbase.master.procedure.AbstractStateMachineTableProcedure&lt;TState&gt; (implements org.apache.hadoop.hbase.master.procedure.TableProcedureInterface)
+<ul>
+<li type="circle">org.apache.hadoop.hbase.master.procedure.TruncateTableProcedure
+<ul>
+<li type="circle">org.apache.hadoop.hbase.master.procedure.<a href="../../../../../../org/apache/hadoop/hbase/master/procedure/TestTruncateTableProcedure.TruncateTableProcedureOnHDFSFailure.html" title="class in org.apache.hadoop.hbase.master.procedure"><span class="typeNameLink">TestTruncateTableProcedure.TruncateTableProcedureOnHDFSFailure</span></a></li>
+</ul>
+</li>
+</ul>
+</li>
+</ul>
+</li>
 </ul>
 </li>
 <li type="circle">org.apache.hadoop.hbase.master.procedure.<a href="../../../../../../org/apache/hadoop/hbase/master/procedure/TestCreateNamespaceProcedure.html" title="class in org.apache.hadoop.hbase.master.procedure"><span class="typeNameLink">TestCreateNamespaceProcedure</span></a></li>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/621479e1/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 622a432..51f8e9b 100644
--- a/testdevapidocs/org/apache/hadoop/hbase/package-tree.html
+++ b/testdevapidocs/org/apache/hadoop/hbase/package-tree.html
@@ -576,15 +576,15 @@
 <ul>
 <li type="circle">java.lang.<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Enum.html?is-external=true" title="class or interface in java.lang"><span class="typeNameLink">Enum</span></a>&lt;E&gt; (implements java.lang.<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Comparable.html?is-external=true" title="class or interface in java.lang">Comparable</a>&lt;T&gt;, java.io.<a href="https://docs.oracle.com/javase/8/docs/api/java/io/Serializable.html?is-external=true" title="class or interface in java.io">Serializable</a>)
 <ul>
-<li type="circle">org.apache.hadoop.hbase.<a href="../../../../org/apache/hadoop/hbase/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/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/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/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/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/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/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/ClusterManager.ServiceType.html" title="enum in org.apache.hadoop.hbase"><span class="typeNameLink">ClusterManager.ServiceType</span></a></li>
-<li type="circle">org.apache.hadoop.hbase.<a href="../../../../org/apache/hadoop/hbase/ResourceChecker.Phase.html" title="enum in org.apache.hadoop.hbase"><span class="typeNameLink">ResourceChecker.Phase</span></a></li>
-<li type="circle">org.apache.hadoop.hbase.<a href="../../../../org/apache/hadoop/hbase/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/RESTApiClusterManager.RoleCommand.html" title="enum in org.apache.hadoop.hbase"><span class="typeNameLink">RESTApiClusterManager.RoleCommand</span></a></li>
-<li type="circle">org.apache.hadoop.hbase.<a href="../../../../org/apache/hadoop/hbase/IntegrationTestRegionReplicaPerf.Stat.html" title="enum in org.apache.hadoop.hbase"><span class="typeNameLink">IntegrationTestRegionReplicaPerf.Stat</span></a></li>
 </ul>
 </li>
 </ul>

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

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/621479e1/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 e9c1d93..19002f2 100644
--- a/testdevapidocs/org/apache/hadoop/hbase/procedure2/package-tree.html
+++ b/testdevapidocs/org/apache/hadoop/hbase/procedure2/package-tree.html
@@ -205,9 +205,9 @@
 <ul>
 <li type="circle">java.lang.<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Enum.html?is-external=true" title="class or interface in java.lang"><span class="typeNameLink">Enum</span></a>&lt;E&gt; (implements java.lang.<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Comparable.html?is-external=true" title="class or interface in java.lang">Comparable</a>&lt;T&gt;, java.io.<a href="https://docs.oracle.com/javase/8/docs/api/java/io/Serializable.html?is-external=true" title="class or interface in java.io">Serializable</a>)
 <ul>
-<li type="circle">org.apache.hadoop.hbase.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/TestProcedureRecovery.TestStateMachineProcedure.State.html" title="enum in org.apache.hadoop.hbase.procedure2"><span class="typeNameLink">TestProcedureRecovery.TestStateMachineProcedure.State</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.procedure2.<a href="../../../../../org/apache/hadoop/hbase/procedure2/TestYieldProcedures.TestStateMachineProcedure.State.html" title="enum in org.apache.hadoop.hbase.procedure2"><span class="typeNameLink">TestYieldProcedures.TestStateMachineProcedure.State</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.procedure2.<a href="../../../../../org/apache/hadoop/hbase/procedure2/TestStateMachineProcedure.TestSMProcedureState.html" title="enum in org.apache.hadoop.hbase.procedure2"><span class="typeNameLink">TestStateMachineProcedure.TestSMProcedureState</span></a></li>
 </ul>
 </li>
 </ul>


[02/29] hbase-site git commit: Published site at 477f9fdb32873387231c5fbbff130ba8bf7b5d68.

Posted by gi...@apache.org.
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/621479e1/testdevapidocs/src-html/org/apache/hadoop/hbase/master/procedure/TestTruncateTableProcedure.TruncateTableProcedureOnHDFSFailure.html
----------------------------------------------------------------------
diff --git a/testdevapidocs/src-html/org/apache/hadoop/hbase/master/procedure/TestTruncateTableProcedure.TruncateTableProcedureOnHDFSFailure.html b/testdevapidocs/src-html/org/apache/hadoop/hbase/master/procedure/TestTruncateTableProcedure.TruncateTableProcedureOnHDFSFailure.html
new file mode 100644
index 0000000..7f7759f
--- /dev/null
+++ b/testdevapidocs/src-html/org/apache/hadoop/hbase/master/procedure/TestTruncateTableProcedure.TruncateTableProcedureOnHDFSFailure.html
@@ -0,0 +1,382 @@
+<!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.master.procedure;<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.assertEquals;<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>import static org.junit.Assert.fail;<a name="line.22"></a>
+<span class="sourceLineNo">023</span><a name="line.23"></a>
+<span class="sourceLineNo">024</span>import java.io.IOException;<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.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.HBaseIOException;<a name="line.29"></a>
+<span class="sourceLineNo">030</span>import org.apache.hadoop.hbase.TableName;<a name="line.30"></a>
+<span class="sourceLineNo">031</span>import org.apache.hadoop.hbase.TableNotDisabledException;<a name="line.31"></a>
+<span class="sourceLineNo">032</span>import org.apache.hadoop.hbase.TableNotFoundException;<a name="line.32"></a>
+<span class="sourceLineNo">033</span>import org.apache.hadoop.hbase.client.RegionInfo;<a name="line.33"></a>
+<span class="sourceLineNo">034</span>import org.apache.hadoop.hbase.master.MasterFileSystem;<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.procedure2.ProcedureExecutor;<a name="line.36"></a>
+<span class="sourceLineNo">037</span>import org.apache.hadoop.hbase.procedure2.ProcedureTestingUtility;<a name="line.37"></a>
+<span class="sourceLineNo">038</span>import org.apache.hadoop.hbase.testclassification.MasterTests;<a name="line.38"></a>
+<span class="sourceLineNo">039</span>import org.apache.hadoop.hbase.testclassification.MediumTests;<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.hbase.util.FSUtils;<a name="line.41"></a>
+<span class="sourceLineNo">042</span>import org.junit.ClassRule;<a name="line.42"></a>
+<span class="sourceLineNo">043</span>import org.junit.Rule;<a name="line.43"></a>
+<span class="sourceLineNo">044</span>import org.junit.Test;<a name="line.44"></a>
+<span class="sourceLineNo">045</span>import org.junit.experimental.categories.Category;<a name="line.45"></a>
+<span class="sourceLineNo">046</span>import org.junit.rules.TestName;<a name="line.46"></a>
+<span class="sourceLineNo">047</span>import org.slf4j.Logger;<a name="line.47"></a>
+<span class="sourceLineNo">048</span>import org.slf4j.LoggerFactory;<a name="line.48"></a>
+<span class="sourceLineNo">049</span>import org.apache.hadoop.hbase.shaded.protobuf.generated.MasterProcedureProtos;<a name="line.49"></a>
+<span class="sourceLineNo">050</span><a name="line.50"></a>
+<span class="sourceLineNo">051</span>@Category({MasterTests.class, MediumTests.class})<a name="line.51"></a>
+<span class="sourceLineNo">052</span>public class TestTruncateTableProcedure extends TestTableDDLProcedureBase {<a name="line.52"></a>
+<span class="sourceLineNo">053</span><a name="line.53"></a>
+<span class="sourceLineNo">054</span>  @ClassRule<a name="line.54"></a>
+<span class="sourceLineNo">055</span>  public static final HBaseClassTestRule CLASS_RULE =<a name="line.55"></a>
+<span class="sourceLineNo">056</span>      HBaseClassTestRule.forClass(TestTruncateTableProcedure.class);<a name="line.56"></a>
+<span class="sourceLineNo">057</span><a name="line.57"></a>
+<span class="sourceLineNo">058</span>  private static final Logger LOG = LoggerFactory.getLogger(TestTruncateTableProcedure.class);<a name="line.58"></a>
+<span class="sourceLineNo">059</span><a name="line.59"></a>
+<span class="sourceLineNo">060</span>  @Rule<a name="line.60"></a>
+<span class="sourceLineNo">061</span>  public TestName name = new TestName();<a name="line.61"></a>
+<span class="sourceLineNo">062</span><a name="line.62"></a>
+<span class="sourceLineNo">063</span>  @Test<a name="line.63"></a>
+<span class="sourceLineNo">064</span>  public void testTruncateNotExistentTable() throws Exception {<a name="line.64"></a>
+<span class="sourceLineNo">065</span>    final TableName tableName = TableName.valueOf(name.getMethodName());<a name="line.65"></a>
+<span class="sourceLineNo">066</span><a name="line.66"></a>
+<span class="sourceLineNo">067</span>    final ProcedureExecutor&lt;MasterProcedureEnv&gt; procExec = getMasterProcedureExecutor();<a name="line.67"></a>
+<span class="sourceLineNo">068</span>    // HBASE-20178 has us fail-fast, in the constructor, so add try/catch for this case.<a name="line.68"></a>
+<span class="sourceLineNo">069</span>    // Keep old way of looking at procedure too.<a name="line.69"></a>
+<span class="sourceLineNo">070</span>    Throwable cause = null;<a name="line.70"></a>
+<span class="sourceLineNo">071</span>    try {<a name="line.71"></a>
+<span class="sourceLineNo">072</span>      long procId = ProcedureTestingUtility.submitAndWait(procExec,<a name="line.72"></a>
+<span class="sourceLineNo">073</span>          new TruncateTableProcedure(procExec.getEnvironment(), tableName, true));<a name="line.73"></a>
+<span class="sourceLineNo">074</span><a name="line.74"></a>
+<span class="sourceLineNo">075</span>      // Second delete should fail with TableNotFound<a name="line.75"></a>
+<span class="sourceLineNo">076</span>      Procedure&lt;?&gt; result = procExec.getResult(procId);<a name="line.76"></a>
+<span class="sourceLineNo">077</span>      assertTrue(result.isFailed());<a name="line.77"></a>
+<span class="sourceLineNo">078</span>      cause = ProcedureTestingUtility.getExceptionCause(result);<a name="line.78"></a>
+<span class="sourceLineNo">079</span>    } catch (Throwable t) {<a name="line.79"></a>
+<span class="sourceLineNo">080</span>      cause = t;<a name="line.80"></a>
+<span class="sourceLineNo">081</span>    }<a name="line.81"></a>
+<span class="sourceLineNo">082</span>    LOG.debug("Truncate failed with exception: " + cause);<a name="line.82"></a>
+<span class="sourceLineNo">083</span>    assertTrue(cause instanceof TableNotFoundException);<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 testTruncateNotDisabledTable() throws Exception {<a name="line.87"></a>
+<span class="sourceLineNo">088</span>    final TableName tableName = TableName.valueOf(name.getMethodName());<a name="line.88"></a>
+<span class="sourceLineNo">089</span><a name="line.89"></a>
+<span class="sourceLineNo">090</span>    final ProcedureExecutor&lt;MasterProcedureEnv&gt; procExec = getMasterProcedureExecutor();<a name="line.90"></a>
+<span class="sourceLineNo">091</span>    MasterProcedureTestingUtility.createTable(procExec, tableName, null, "f");<a name="line.91"></a>
+<span class="sourceLineNo">092</span><a name="line.92"></a>
+<span class="sourceLineNo">093</span>    // HBASE-20178 has us fail-fast, in the constructor, so add try/catch for this case.<a name="line.93"></a>
+<span class="sourceLineNo">094</span>    // Keep old way of looking at procedure too.<a name="line.94"></a>
+<span class="sourceLineNo">095</span>    Throwable cause = null;<a name="line.95"></a>
+<span class="sourceLineNo">096</span>    try {<a name="line.96"></a>
+<span class="sourceLineNo">097</span>      long procId = ProcedureTestingUtility.submitAndWait(procExec,<a name="line.97"></a>
+<span class="sourceLineNo">098</span>          new TruncateTableProcedure(procExec.getEnvironment(), tableName, false));<a name="line.98"></a>
+<span class="sourceLineNo">099</span><a name="line.99"></a>
+<span class="sourceLineNo">100</span>      // Second delete should fail with TableNotDisabled<a name="line.100"></a>
+<span class="sourceLineNo">101</span>      Procedure&lt;?&gt; result = procExec.getResult(procId);<a name="line.101"></a>
+<span class="sourceLineNo">102</span>      assertTrue(result.isFailed());<a name="line.102"></a>
+<span class="sourceLineNo">103</span>      cause = ProcedureTestingUtility.getExceptionCause(result);<a name="line.103"></a>
+<span class="sourceLineNo">104</span>    } catch (Throwable t) {<a name="line.104"></a>
+<span class="sourceLineNo">105</span>      cause = t;<a name="line.105"></a>
+<span class="sourceLineNo">106</span>    }<a name="line.106"></a>
+<span class="sourceLineNo">107</span>    LOG.debug("Truncate failed with exception: " + cause);<a name="line.107"></a>
+<span class="sourceLineNo">108</span>    assertTrue(cause instanceof TableNotDisabledException);<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 testSimpleTruncatePreserveSplits() throws Exception {<a name="line.112"></a>
+<span class="sourceLineNo">113</span>    final TableName tableName = TableName.valueOf(name.getMethodName());<a name="line.113"></a>
+<span class="sourceLineNo">114</span>    testSimpleTruncate(tableName, true);<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>  @Test<a name="line.117"></a>
+<span class="sourceLineNo">118</span>  public void testSimpleTruncateNoPreserveSplits() throws Exception {<a name="line.118"></a>
+<span class="sourceLineNo">119</span>    final TableName tableName = TableName.valueOf(name.getMethodName());<a name="line.119"></a>
+<span class="sourceLineNo">120</span>    testSimpleTruncate(tableName, false);<a name="line.120"></a>
+<span class="sourceLineNo">121</span>  }<a name="line.121"></a>
+<span class="sourceLineNo">122</span><a name="line.122"></a>
+<span class="sourceLineNo">123</span>  private void testSimpleTruncate(final TableName tableName, final boolean preserveSplits)<a name="line.123"></a>
+<span class="sourceLineNo">124</span>      throws Exception {<a name="line.124"></a>
+<span class="sourceLineNo">125</span>    final String[] families = new String[] { "f1", "f2" };<a name="line.125"></a>
+<span class="sourceLineNo">126</span>    final byte[][] splitKeys = new byte[][] {<a name="line.126"></a>
+<span class="sourceLineNo">127</span>      Bytes.toBytes("a"), Bytes.toBytes("b"), Bytes.toBytes("c")<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>    RegionInfo[] regions = MasterProcedureTestingUtility.createTable(<a name="line.130"></a>
+<span class="sourceLineNo">131</span>      getMasterProcedureExecutor(), tableName, splitKeys, families);<a name="line.131"></a>
+<span class="sourceLineNo">132</span>    // load and verify that there are rows in the table<a name="line.132"></a>
+<span class="sourceLineNo">133</span>    MasterProcedureTestingUtility.loadData(<a name="line.133"></a>
+<span class="sourceLineNo">134</span>      UTIL.getConnection(), tableName, 100, splitKeys, families);<a name="line.134"></a>
+<span class="sourceLineNo">135</span>    assertEquals(100, UTIL.countRows(tableName));<a name="line.135"></a>
+<span class="sourceLineNo">136</span>    // disable the table<a name="line.136"></a>
+<span class="sourceLineNo">137</span>    UTIL.getAdmin().disableTable(tableName);<a name="line.137"></a>
+<span class="sourceLineNo">138</span><a name="line.138"></a>
+<span class="sourceLineNo">139</span>    // truncate the table<a name="line.139"></a>
+<span class="sourceLineNo">140</span>    final ProcedureExecutor&lt;MasterProcedureEnv&gt; procExec = getMasterProcedureExecutor();<a name="line.140"></a>
+<span class="sourceLineNo">141</span>    long procId = ProcedureTestingUtility.submitAndWait(procExec,<a name="line.141"></a>
+<span class="sourceLineNo">142</span>      new TruncateTableProcedure(procExec.getEnvironment(), tableName, preserveSplits));<a name="line.142"></a>
+<span class="sourceLineNo">143</span>    ProcedureTestingUtility.assertProcNotFailed(procExec, procId);<a name="line.143"></a>
+<span class="sourceLineNo">144</span><a name="line.144"></a>
+<span class="sourceLineNo">145</span>    // If truncate procedure completed successfully, it means all regions were assigned correctly<a name="line.145"></a>
+<span class="sourceLineNo">146</span>    // and table is enabled now.<a name="line.146"></a>
+<span class="sourceLineNo">147</span>    UTIL.waitUntilAllRegionsAssigned(tableName);<a name="line.147"></a>
+<span class="sourceLineNo">148</span><a name="line.148"></a>
+<span class="sourceLineNo">149</span>    // validate the table regions and layout<a name="line.149"></a>
+<span class="sourceLineNo">150</span>    regions = UTIL.getAdmin().getTableRegions(tableName).toArray(new RegionInfo[0]);<a name="line.150"></a>
+<span class="sourceLineNo">151</span>    if (preserveSplits) {<a name="line.151"></a>
+<span class="sourceLineNo">152</span>      assertEquals(1 + splitKeys.length, regions.length);<a name="line.152"></a>
+<span class="sourceLineNo">153</span>    } else {<a name="line.153"></a>
+<span class="sourceLineNo">154</span>      assertEquals(1, regions.length);<a name="line.154"></a>
+<span class="sourceLineNo">155</span>    }<a name="line.155"></a>
+<span class="sourceLineNo">156</span>    MasterProcedureTestingUtility.validateTableCreation(<a name="line.156"></a>
+<span class="sourceLineNo">157</span>      UTIL.getHBaseCluster().getMaster(), tableName, regions, families);<a name="line.157"></a>
+<span class="sourceLineNo">158</span><a name="line.158"></a>
+<span class="sourceLineNo">159</span>    // verify that there are no rows in the table<a name="line.159"></a>
+<span class="sourceLineNo">160</span>    assertEquals(0, UTIL.countRows(tableName));<a name="line.160"></a>
+<span class="sourceLineNo">161</span><a name="line.161"></a>
+<span class="sourceLineNo">162</span>    // verify that the table is read/writable<a name="line.162"></a>
+<span class="sourceLineNo">163</span>    MasterProcedureTestingUtility.loadData(<a name="line.163"></a>
+<span class="sourceLineNo">164</span>      UTIL.getConnection(), tableName, 50, splitKeys, families);<a name="line.164"></a>
+<span class="sourceLineNo">165</span>    assertEquals(50, UTIL.countRows(tableName));<a name="line.165"></a>
+<span class="sourceLineNo">166</span>  }<a name="line.166"></a>
+<span class="sourceLineNo">167</span><a name="line.167"></a>
+<span class="sourceLineNo">168</span>  @Test<a name="line.168"></a>
+<span class="sourceLineNo">169</span>  public void testRecoveryAndDoubleExecutionPreserveSplits() throws Exception {<a name="line.169"></a>
+<span class="sourceLineNo">170</span>    final TableName tableName = TableName.valueOf(name.getMethodName());<a name="line.170"></a>
+<span class="sourceLineNo">171</span>    testRecoveryAndDoubleExecution(tableName, true);<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>  @Test<a name="line.174"></a>
+<span class="sourceLineNo">175</span>  public void testRecoveryAndDoubleExecutionNoPreserveSplits() throws Exception {<a name="line.175"></a>
+<span class="sourceLineNo">176</span>    final TableName tableName = TableName.valueOf(name.getMethodName());<a name="line.176"></a>
+<span class="sourceLineNo">177</span>    testRecoveryAndDoubleExecution(tableName, false);<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>  private void testRecoveryAndDoubleExecution(final TableName tableName,<a name="line.180"></a>
+<span class="sourceLineNo">181</span>      final boolean preserveSplits) throws Exception {<a name="line.181"></a>
+<span class="sourceLineNo">182</span>    final String[] families = new String[] { "f1", "f2" };<a name="line.182"></a>
+<span class="sourceLineNo">183</span><a name="line.183"></a>
+<span class="sourceLineNo">184</span>    // create the table<a name="line.184"></a>
+<span class="sourceLineNo">185</span>    final byte[][] splitKeys = new byte[][] {<a name="line.185"></a>
+<span class="sourceLineNo">186</span>      Bytes.toBytes("a"), Bytes.toBytes("b"), Bytes.toBytes("c")<a name="line.186"></a>
+<span class="sourceLineNo">187</span>    };<a name="line.187"></a>
+<span class="sourceLineNo">188</span>    RegionInfo[] regions = MasterProcedureTestingUtility.createTable(<a name="line.188"></a>
+<span class="sourceLineNo">189</span>      getMasterProcedureExecutor(), tableName, splitKeys, families);<a name="line.189"></a>
+<span class="sourceLineNo">190</span>    // load and verify that there are rows in the table<a name="line.190"></a>
+<span class="sourceLineNo">191</span>    MasterProcedureTestingUtility.loadData(<a name="line.191"></a>
+<span class="sourceLineNo">192</span>      UTIL.getConnection(), tableName, 100, splitKeys, families);<a name="line.192"></a>
+<span class="sourceLineNo">193</span>    assertEquals(100, UTIL.countRows(tableName));<a name="line.193"></a>
+<span class="sourceLineNo">194</span>    // disable the table<a name="line.194"></a>
+<span class="sourceLineNo">195</span>    UTIL.getAdmin().disableTable(tableName);<a name="line.195"></a>
+<span class="sourceLineNo">196</span><a name="line.196"></a>
+<span class="sourceLineNo">197</span>    final ProcedureExecutor&lt;MasterProcedureEnv&gt; procExec = getMasterProcedureExecutor();<a name="line.197"></a>
+<span class="sourceLineNo">198</span>    ProcedureTestingUtility.waitNoProcedureRunning(procExec);<a name="line.198"></a>
+<span class="sourceLineNo">199</span>    ProcedureTestingUtility.setKillAndToggleBeforeStoreUpdate(procExec, true);<a name="line.199"></a>
+<span class="sourceLineNo">200</span><a name="line.200"></a>
+<span class="sourceLineNo">201</span>    // Start the Truncate procedure &amp;&amp; kill the executor<a name="line.201"></a>
+<span class="sourceLineNo">202</span>    long procId = procExec.submitProcedure(<a name="line.202"></a>
+<span class="sourceLineNo">203</span>      new TruncateTableProcedure(procExec.getEnvironment(), tableName, preserveSplits));<a name="line.203"></a>
+<span class="sourceLineNo">204</span><a name="line.204"></a>
+<span class="sourceLineNo">205</span>    // Restart the executor and execute the step twice<a name="line.205"></a>
+<span class="sourceLineNo">206</span>    MasterProcedureTestingUtility.testRecoveryAndDoubleExecution(procExec, procId);<a name="line.206"></a>
+<span class="sourceLineNo">207</span><a name="line.207"></a>
+<span class="sourceLineNo">208</span>    ProcedureTestingUtility.setKillAndToggleBeforeStoreUpdate(procExec, false);<a name="line.208"></a>
+<span class="sourceLineNo">209</span>    UTIL.waitUntilAllRegionsAssigned(tableName);<a name="line.209"></a>
+<span class="sourceLineNo">210</span><a name="line.210"></a>
+<span class="sourceLineNo">211</span>    // validate the table regions and layout<a name="line.211"></a>
+<span class="sourceLineNo">212</span>    regions = UTIL.getAdmin().getTableRegions(tableName).toArray(new RegionInfo[0]);<a name="line.212"></a>
+<span class="sourceLineNo">213</span>    if (preserveSplits) {<a name="line.213"></a>
+<span class="sourceLineNo">214</span>      assertEquals(1 + splitKeys.length, regions.length);<a name="line.214"></a>
+<span class="sourceLineNo">215</span>    } else {<a name="line.215"></a>
+<span class="sourceLineNo">216</span>      assertEquals(1, regions.length);<a name="line.216"></a>
+<span class="sourceLineNo">217</span>    }<a name="line.217"></a>
+<span class="sourceLineNo">218</span>    MasterProcedureTestingUtility.validateTableCreation(<a name="line.218"></a>
+<span class="sourceLineNo">219</span>      UTIL.getHBaseCluster().getMaster(), tableName, regions, families);<a name="line.219"></a>
+<span class="sourceLineNo">220</span><a name="line.220"></a>
+<span class="sourceLineNo">221</span>    // verify that there are no rows in the table<a name="line.221"></a>
+<span class="sourceLineNo">222</span>    assertEquals(0, UTIL.countRows(tableName));<a name="line.222"></a>
+<span class="sourceLineNo">223</span><a name="line.223"></a>
+<span class="sourceLineNo">224</span>    // verify that the table is read/writable<a name="line.224"></a>
+<span class="sourceLineNo">225</span>    MasterProcedureTestingUtility.loadData(<a name="line.225"></a>
+<span class="sourceLineNo">226</span>      UTIL.getConnection(), tableName, 50, splitKeys, families);<a name="line.226"></a>
+<span class="sourceLineNo">227</span>    assertEquals(50, UTIL.countRows(tableName));<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>  @Test<a name="line.230"></a>
+<span class="sourceLineNo">231</span>  public void testOnHDFSFailurePreserveSplits() throws Exception {<a name="line.231"></a>
+<span class="sourceLineNo">232</span>    final TableName tableName = TableName.valueOf(name.getMethodName());<a name="line.232"></a>
+<span class="sourceLineNo">233</span>    testOnHDFSFailure(tableName, true);<a name="line.233"></a>
+<span class="sourceLineNo">234</span>  }<a name="line.234"></a>
+<span class="sourceLineNo">235</span><a name="line.235"></a>
+<span class="sourceLineNo">236</span>  @Test<a name="line.236"></a>
+<span class="sourceLineNo">237</span>  public void testOnHDFSFailureNoPreserveSplits() throws Exception {<a name="line.237"></a>
+<span class="sourceLineNo">238</span>    final TableName tableName = TableName.valueOf(name.getMethodName());<a name="line.238"></a>
+<span class="sourceLineNo">239</span>    testOnHDFSFailure(tableName, false);<a name="line.239"></a>
+<span class="sourceLineNo">240</span>  }<a name="line.240"></a>
+<span class="sourceLineNo">241</span><a name="line.241"></a>
+<span class="sourceLineNo">242</span>  public static class TruncateTableProcedureOnHDFSFailure extends TruncateTableProcedure {<a name="line.242"></a>
+<span class="sourceLineNo">243</span><a name="line.243"></a>
+<span class="sourceLineNo">244</span>    private boolean failOnce = false;<a name="line.244"></a>
+<span class="sourceLineNo">245</span><a name="line.245"></a>
+<span class="sourceLineNo">246</span>    public TruncateTableProcedureOnHDFSFailure() {<a name="line.246"></a>
+<span class="sourceLineNo">247</span>      // Required by the Procedure framework to create the procedure on replay<a name="line.247"></a>
+<span class="sourceLineNo">248</span>      super();<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>    public TruncateTableProcedureOnHDFSFailure(final MasterProcedureEnv env, TableName tableName,<a name="line.251"></a>
+<span class="sourceLineNo">252</span>      boolean preserveSplits)<a name="line.252"></a>
+<span class="sourceLineNo">253</span>      throws HBaseIOException {<a name="line.253"></a>
+<span class="sourceLineNo">254</span>      super(env, tableName, preserveSplits);<a name="line.254"></a>
+<span class="sourceLineNo">255</span>    }<a name="line.255"></a>
+<span class="sourceLineNo">256</span><a name="line.256"></a>
+<span class="sourceLineNo">257</span>    @Override<a name="line.257"></a>
+<span class="sourceLineNo">258</span>    protected Flow executeFromState(MasterProcedureEnv env,<a name="line.258"></a>
+<span class="sourceLineNo">259</span>      MasterProcedureProtos.TruncateTableState state) throws InterruptedException {<a name="line.259"></a>
+<span class="sourceLineNo">260</span><a name="line.260"></a>
+<span class="sourceLineNo">261</span>      if (!failOnce &amp;&amp;<a name="line.261"></a>
+<span class="sourceLineNo">262</span>        state == MasterProcedureProtos.TruncateTableState.TRUNCATE_TABLE_CREATE_FS_LAYOUT) {<a name="line.262"></a>
+<span class="sourceLineNo">263</span>        try {<a name="line.263"></a>
+<span class="sourceLineNo">264</span>          // To emulate an HDFS failure, create only the first region directory<a name="line.264"></a>
+<span class="sourceLineNo">265</span>          RegionInfo regionInfo = getFirstRegionInfo();<a name="line.265"></a>
+<span class="sourceLineNo">266</span>          Configuration conf = env.getMasterConfiguration();<a name="line.266"></a>
+<span class="sourceLineNo">267</span>          MasterFileSystem mfs = env.getMasterServices().getMasterFileSystem();<a name="line.267"></a>
+<span class="sourceLineNo">268</span>          Path tempdir = mfs.getTempDir();<a name="line.268"></a>
+<span class="sourceLineNo">269</span>          Path tableDir = FSUtils.getTableDir(tempdir, regionInfo.getTable());<a name="line.269"></a>
+<span class="sourceLineNo">270</span>          Path regionDir = FSUtils.getRegionDir(tableDir, regionInfo);<a name="line.270"></a>
+<span class="sourceLineNo">271</span>          FileSystem fs = FileSystem.get(conf);<a name="line.271"></a>
+<span class="sourceLineNo">272</span>          fs.mkdirs(regionDir);<a name="line.272"></a>
+<span class="sourceLineNo">273</span><a name="line.273"></a>
+<span class="sourceLineNo">274</span>          failOnce = true;<a name="line.274"></a>
+<span class="sourceLineNo">275</span>          return Flow.HAS_MORE_STATE;<a name="line.275"></a>
+<span class="sourceLineNo">276</span>        } catch (IOException e) {<a name="line.276"></a>
+<span class="sourceLineNo">277</span>          fail("failed to create a region directory: " + e);<a name="line.277"></a>
+<span class="sourceLineNo">278</span>        }<a name="line.278"></a>
+<span class="sourceLineNo">279</span>      }<a name="line.279"></a>
+<span class="sourceLineNo">280</span><a name="line.280"></a>
+<span class="sourceLineNo">281</span>      return super.executeFromState(env, state);<a name="line.281"></a>
+<span class="sourceLineNo">282</span>    }<a name="line.282"></a>
+<span class="sourceLineNo">283</span>  }<a name="line.283"></a>
+<span class="sourceLineNo">284</span><a name="line.284"></a>
+<span class="sourceLineNo">285</span>  private void testOnHDFSFailure(TableName tableName, boolean preserveSplits) throws Exception {<a name="line.285"></a>
+<span class="sourceLineNo">286</span>    String[] families = new String[] { "f1", "f2" };<a name="line.286"></a>
+<span class="sourceLineNo">287</span>    byte[][] splitKeys = new byte[][] {<a name="line.287"></a>
+<span class="sourceLineNo">288</span>      Bytes.toBytes("a"), Bytes.toBytes("b"), Bytes.toBytes("c")<a name="line.288"></a>
+<span class="sourceLineNo">289</span>    };<a name="line.289"></a>
+<span class="sourceLineNo">290</span><a name="line.290"></a>
+<span class="sourceLineNo">291</span>    // create a table<a name="line.291"></a>
+<span class="sourceLineNo">292</span>    MasterProcedureTestingUtility.createTable(<a name="line.292"></a>
+<span class="sourceLineNo">293</span>      getMasterProcedureExecutor(), tableName, splitKeys, families);<a name="line.293"></a>
+<span class="sourceLineNo">294</span><a name="line.294"></a>
+<span class="sourceLineNo">295</span>    // load and verify that there are rows in the table<a name="line.295"></a>
+<span class="sourceLineNo">296</span>    MasterProcedureTestingUtility.loadData(<a name="line.296"></a>
+<span class="sourceLineNo">297</span>      UTIL.getConnection(), tableName, 100, splitKeys, families);<a name="line.297"></a>
+<span class="sourceLineNo">298</span>    assertEquals(100, UTIL.countRows(tableName));<a name="line.298"></a>
+<span class="sourceLineNo">299</span><a name="line.299"></a>
+<span class="sourceLineNo">300</span>    // disable the table<a name="line.300"></a>
+<span class="sourceLineNo">301</span>    UTIL.getAdmin().disableTable(tableName);<a name="line.301"></a>
+<span class="sourceLineNo">302</span><a name="line.302"></a>
+<span class="sourceLineNo">303</span>    // truncate the table<a name="line.303"></a>
+<span class="sourceLineNo">304</span>    final ProcedureExecutor&lt;MasterProcedureEnv&gt; procExec = getMasterProcedureExecutor();<a name="line.304"></a>
+<span class="sourceLineNo">305</span>    long procId = ProcedureTestingUtility.submitAndWait(procExec,<a name="line.305"></a>
+<span class="sourceLineNo">306</span>      new TruncateTableProcedureOnHDFSFailure(procExec.getEnvironment(), tableName,<a name="line.306"></a>
+<span class="sourceLineNo">307</span>        preserveSplits));<a name="line.307"></a>
+<span class="sourceLineNo">308</span>    ProcedureTestingUtility.assertProcNotFailed(procExec, procId);<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>
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+</pre>
+</div>
+</body>
+</html>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/621479e1/testdevapidocs/src-html/org/apache/hadoop/hbase/master/procedure/TestTruncateTableProcedure.html
----------------------------------------------------------------------
diff --git a/testdevapidocs/src-html/org/apache/hadoop/hbase/master/procedure/TestTruncateTableProcedure.html b/testdevapidocs/src-html/org/apache/hadoop/hbase/master/procedure/TestTruncateTableProcedure.html
index 46c03d1..7f7759f 100644
--- a/testdevapidocs/src-html/org/apache/hadoop/hbase/master/procedure/TestTruncateTableProcedure.html
+++ b/testdevapidocs/src-html/org/apache/hadoop/hbase/master/procedure/TestTruncateTableProcedure.html
@@ -27,205 +27,295 @@
 <span class="sourceLineNo">019</span><a name="line.19"></a>
 <span class="sourceLineNo">020</span>import static org.junit.Assert.assertEquals;<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 org.apache.hadoop.hbase.HBaseClassTestRule;<a name="line.23"></a>
-<span class="sourceLineNo">024</span>import org.apache.hadoop.hbase.TableName;<a name="line.24"></a>
-<span class="sourceLineNo">025</span>import org.apache.hadoop.hbase.TableNotDisabledException;<a name="line.25"></a>
-<span class="sourceLineNo">026</span>import org.apache.hadoop.hbase.TableNotFoundException;<a name="line.26"></a>
-<span class="sourceLineNo">027</span>import org.apache.hadoop.hbase.client.RegionInfo;<a name="line.27"></a>
-<span class="sourceLineNo">028</span>import org.apache.hadoop.hbase.procedure2.Procedure;<a name="line.28"></a>
-<span class="sourceLineNo">029</span>import org.apache.hadoop.hbase.procedure2.ProcedureExecutor;<a name="line.29"></a>
-<span class="sourceLineNo">030</span>import org.apache.hadoop.hbase.procedure2.ProcedureTestingUtility;<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.MediumTests;<a name="line.32"></a>
-<span class="sourceLineNo">033</span>import org.apache.hadoop.hbase.util.Bytes;<a name="line.33"></a>
-<span class="sourceLineNo">034</span>import org.junit.ClassRule;<a name="line.34"></a>
-<span class="sourceLineNo">035</span>import org.junit.Rule;<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.junit.rules.TestName;<a name="line.38"></a>
-<span class="sourceLineNo">039</span>import org.slf4j.Logger;<a name="line.39"></a>
-<span class="sourceLineNo">040</span>import org.slf4j.LoggerFactory;<a name="line.40"></a>
-<span class="sourceLineNo">041</span><a name="line.41"></a>
-<span class="sourceLineNo">042</span>@Category({MasterTests.class, MediumTests.class})<a name="line.42"></a>
-<span class="sourceLineNo">043</span>public class TestTruncateTableProcedure extends TestTableDDLProcedureBase {<a name="line.43"></a>
-<span class="sourceLineNo">044</span><a name="line.44"></a>
-<span class="sourceLineNo">045</span>  @ClassRule<a name="line.45"></a>
-<span class="sourceLineNo">046</span>  public static final HBaseClassTestRule CLASS_RULE =<a name="line.46"></a>
-<span class="sourceLineNo">047</span>      HBaseClassTestRule.forClass(TestTruncateTableProcedure.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(TestTruncateTableProcedure.class);<a name="line.49"></a>
+<span class="sourceLineNo">022</span>import static org.junit.Assert.fail;<a name="line.22"></a>
+<span class="sourceLineNo">023</span><a name="line.23"></a>
+<span class="sourceLineNo">024</span>import java.io.IOException;<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.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.HBaseIOException;<a name="line.29"></a>
+<span class="sourceLineNo">030</span>import org.apache.hadoop.hbase.TableName;<a name="line.30"></a>
+<span class="sourceLineNo">031</span>import org.apache.hadoop.hbase.TableNotDisabledException;<a name="line.31"></a>
+<span class="sourceLineNo">032</span>import org.apache.hadoop.hbase.TableNotFoundException;<a name="line.32"></a>
+<span class="sourceLineNo">033</span>import org.apache.hadoop.hbase.client.RegionInfo;<a name="line.33"></a>
+<span class="sourceLineNo">034</span>import org.apache.hadoop.hbase.master.MasterFileSystem;<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.procedure2.ProcedureExecutor;<a name="line.36"></a>
+<span class="sourceLineNo">037</span>import org.apache.hadoop.hbase.procedure2.ProcedureTestingUtility;<a name="line.37"></a>
+<span class="sourceLineNo">038</span>import org.apache.hadoop.hbase.testclassification.MasterTests;<a name="line.38"></a>
+<span class="sourceLineNo">039</span>import org.apache.hadoop.hbase.testclassification.MediumTests;<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.hbase.util.FSUtils;<a name="line.41"></a>
+<span class="sourceLineNo">042</span>import org.junit.ClassRule;<a name="line.42"></a>
+<span class="sourceLineNo">043</span>import org.junit.Rule;<a name="line.43"></a>
+<span class="sourceLineNo">044</span>import org.junit.Test;<a name="line.44"></a>
+<span class="sourceLineNo">045</span>import org.junit.experimental.categories.Category;<a name="line.45"></a>
+<span class="sourceLineNo">046</span>import org.junit.rules.TestName;<a name="line.46"></a>
+<span class="sourceLineNo">047</span>import org.slf4j.Logger;<a name="line.47"></a>
+<span class="sourceLineNo">048</span>import org.slf4j.LoggerFactory;<a name="line.48"></a>
+<span class="sourceLineNo">049</span>import org.apache.hadoop.hbase.shaded.protobuf.generated.MasterProcedureProtos;<a name="line.49"></a>
 <span class="sourceLineNo">050</span><a name="line.50"></a>
-<span class="sourceLineNo">051</span>  @Rule<a name="line.51"></a>
-<span class="sourceLineNo">052</span>  public TestName name = new TestName();<a name="line.52"></a>
+<span class="sourceLineNo">051</span>@Category({MasterTests.class, MediumTests.class})<a name="line.51"></a>
+<span class="sourceLineNo">052</span>public class TestTruncateTableProcedure extends TestTableDDLProcedureBase {<a name="line.52"></a>
 <span class="sourceLineNo">053</span><a name="line.53"></a>
-<span class="sourceLineNo">054</span>  @Test<a name="line.54"></a>
-<span class="sourceLineNo">055</span>  public void testTruncateNotExistentTable() throws Exception {<a name="line.55"></a>
-<span class="sourceLineNo">056</span>    final TableName tableName = TableName.valueOf(name.getMethodName());<a name="line.56"></a>
+<span class="sourceLineNo">054</span>  @ClassRule<a name="line.54"></a>
+<span class="sourceLineNo">055</span>  public static final HBaseClassTestRule CLASS_RULE =<a name="line.55"></a>
+<span class="sourceLineNo">056</span>      HBaseClassTestRule.forClass(TestTruncateTableProcedure.class);<a name="line.56"></a>
 <span class="sourceLineNo">057</span><a name="line.57"></a>
-<span class="sourceLineNo">058</span>    final ProcedureExecutor&lt;MasterProcedureEnv&gt; procExec = getMasterProcedureExecutor();<a name="line.58"></a>
-<span class="sourceLineNo">059</span>    // HBASE-20178 has us fail-fast, in the constructor, so add try/catch for this case.<a name="line.59"></a>
-<span class="sourceLineNo">060</span>    // Keep old way of looking at procedure too.<a name="line.60"></a>
-<span class="sourceLineNo">061</span>    Throwable cause = null;<a name="line.61"></a>
-<span class="sourceLineNo">062</span>    try {<a name="line.62"></a>
-<span class="sourceLineNo">063</span>      long procId = ProcedureTestingUtility.submitAndWait(procExec,<a name="line.63"></a>
-<span class="sourceLineNo">064</span>          new TruncateTableProcedure(procExec.getEnvironment(), tableName, true));<a name="line.64"></a>
-<span class="sourceLineNo">065</span><a name="line.65"></a>
-<span class="sourceLineNo">066</span>      // Second delete should fail with TableNotFound<a name="line.66"></a>
-<span class="sourceLineNo">067</span>      Procedure&lt;?&gt; result = procExec.getResult(procId);<a name="line.67"></a>
-<span class="sourceLineNo">068</span>      assertTrue(result.isFailed());<a name="line.68"></a>
-<span class="sourceLineNo">069</span>      cause = ProcedureTestingUtility.getExceptionCause(result);<a name="line.69"></a>
-<span class="sourceLineNo">070</span>    } catch (Throwable t) {<a name="line.70"></a>
-<span class="sourceLineNo">071</span>      cause = t;<a name="line.71"></a>
-<span class="sourceLineNo">072</span>    }<a name="line.72"></a>
-<span class="sourceLineNo">073</span>    LOG.debug("Truncate failed with exception: " + cause);<a name="line.73"></a>
-<span class="sourceLineNo">074</span>    assertTrue(cause instanceof TableNotFoundException);<a name="line.74"></a>
-<span class="sourceLineNo">075</span>  }<a name="line.75"></a>
-<span class="sourceLineNo">076</span><a name="line.76"></a>
-<span class="sourceLineNo">077</span>  @Test<a name="line.77"></a>
-<span class="sourceLineNo">078</span>  public void testTruncateNotDisabledTable() throws Exception {<a name="line.78"></a>
-<span class="sourceLineNo">079</span>    final TableName tableName = TableName.valueOf(name.getMethodName());<a name="line.79"></a>
-<span class="sourceLineNo">080</span><a name="line.80"></a>
-<span class="sourceLineNo">081</span>    final ProcedureExecutor&lt;MasterProcedureEnv&gt; procExec = getMasterProcedureExecutor();<a name="line.81"></a>
-<span class="sourceLineNo">082</span>    MasterProcedureTestingUtility.createTable(procExec, tableName, null, "f");<a name="line.82"></a>
-<span class="sourceLineNo">083</span><a name="line.83"></a>
-<span class="sourceLineNo">084</span>    // HBASE-20178 has us fail-fast, in the constructor, so add try/catch for this case.<a name="line.84"></a>
-<span class="sourceLineNo">085</span>    // Keep old way of looking at procedure too.<a name="line.85"></a>
-<span class="sourceLineNo">086</span>    Throwable cause = null;<a name="line.86"></a>
-<span class="sourceLineNo">087</span>    try {<a name="line.87"></a>
-<span class="sourceLineNo">088</span>      long procId = ProcedureTestingUtility.submitAndWait(procExec,<a name="line.88"></a>
-<span class="sourceLineNo">089</span>          new TruncateTableProcedure(procExec.getEnvironment(), tableName, false));<a name="line.89"></a>
-<span class="sourceLineNo">090</span><a name="line.90"></a>
-<span class="sourceLineNo">091</span>      // Second delete should fail with TableNotDisabled<a name="line.91"></a>
-<span class="sourceLineNo">092</span>      Procedure&lt;?&gt; result = procExec.getResult(procId);<a name="line.92"></a>
-<span class="sourceLineNo">093</span>      assertTrue(result.isFailed());<a name="line.93"></a>
-<span class="sourceLineNo">094</span>      cause = ProcedureTestingUtility.getExceptionCause(result);<a name="line.94"></a>
-<span class="sourceLineNo">095</span>    } catch (Throwable t) {<a name="line.95"></a>
-<span class="sourceLineNo">096</span>      cause = t;<a name="line.96"></a>
-<span class="sourceLineNo">097</span>    }<a name="line.97"></a>
-<span class="sourceLineNo">098</span>    LOG.debug("Truncate failed with exception: " + cause);<a name="line.98"></a>
-<span class="sourceLineNo">099</span>    assertTrue(cause instanceof TableNotDisabledException);<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 testSimpleTruncatePreserveSplits() throws Exception {<a name="line.103"></a>
-<span class="sourceLineNo">104</span>    final TableName tableName = TableName.valueOf(name.getMethodName());<a name="line.104"></a>
-<span class="sourceLineNo">105</span>    testSimpleTruncate(tableName, true);<a name="line.105"></a>
-<span class="sourceLineNo">106</span>  }<a name="line.106"></a>
-<span class="sourceLineNo">107</span><a name="line.107"></a>
-<span class="sourceLineNo">108</span>  @Test<a name="line.108"></a>
-<span class="sourceLineNo">109</span>  public void testSimpleTruncateNoPreserveSplits() throws Exception {<a name="line.109"></a>
-<span class="sourceLineNo">110</span>    final TableName tableName = TableName.valueOf(name.getMethodName());<a name="line.110"></a>
-<span class="sourceLineNo">111</span>    testSimpleTruncate(tableName, false);<a name="line.111"></a>
-<span class="sourceLineNo">112</span>  }<a name="line.112"></a>
-<span class="sourceLineNo">113</span><a name="line.113"></a>
-<span class="sourceLineNo">114</span>  private void testSimpleTruncate(final TableName tableName, final boolean preserveSplits)<a name="line.114"></a>
-<span class="sourceLineNo">115</span>      throws Exception {<a name="line.115"></a>
-<span class="sourceLineNo">116</span>    final String[] families = new String[] { "f1", "f2" };<a name="line.116"></a>
-<span class="sourceLineNo">117</span>    final byte[][] splitKeys = new byte[][] {<a name="line.117"></a>
-<span class="sourceLineNo">118</span>      Bytes.toBytes("a"), Bytes.toBytes("b"), Bytes.toBytes("c")<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>    RegionInfo[] regions = MasterProcedureTestingUtility.createTable(<a name="line.121"></a>
-<span class="sourceLineNo">122</span>      getMasterProcedureExecutor(), tableName, splitKeys, families);<a name="line.122"></a>
-<span class="sourceLineNo">123</span>    // load and verify that there are rows in the table<a name="line.123"></a>
-<span class="sourceLineNo">124</span>    MasterProcedureTestingUtility.loadData(<a name="line.124"></a>
-<span class="sourceLineNo">125</span>      UTIL.getConnection(), tableName, 100, splitKeys, families);<a name="line.125"></a>
-<span class="sourceLineNo">126</span>    assertEquals(100, UTIL.countRows(tableName));<a name="line.126"></a>
-<span class="sourceLineNo">127</span>    // disable the table<a name="line.127"></a>
-<span class="sourceLineNo">128</span>    UTIL.getAdmin().disableTable(tableName);<a name="line.128"></a>
+<span class="sourceLineNo">058</span>  private static final Logger LOG = LoggerFactory.getLogger(TestTruncateTableProcedure.class);<a name="line.58"></a>
+<span class="sourceLineNo">059</span><a name="line.59"></a>
+<span class="sourceLineNo">060</span>  @Rule<a name="line.60"></a>
+<span class="sourceLineNo">061</span>  public TestName name = new TestName();<a name="line.61"></a>
+<span class="sourceLineNo">062</span><a name="line.62"></a>
+<span class="sourceLineNo">063</span>  @Test<a name="line.63"></a>
+<span class="sourceLineNo">064</span>  public void testTruncateNotExistentTable() throws Exception {<a name="line.64"></a>
+<span class="sourceLineNo">065</span>    final TableName tableName = TableName.valueOf(name.getMethodName());<a name="line.65"></a>
+<span class="sourceLineNo">066</span><a name="line.66"></a>
+<span class="sourceLineNo">067</span>    final ProcedureExecutor&lt;MasterProcedureEnv&gt; procExec = getMasterProcedureExecutor();<a name="line.67"></a>
+<span class="sourceLineNo">068</span>    // HBASE-20178 has us fail-fast, in the constructor, so add try/catch for this case.<a name="line.68"></a>
+<span class="sourceLineNo">069</span>    // Keep old way of looking at procedure too.<a name="line.69"></a>
+<span class="sourceLineNo">070</span>    Throwable cause = null;<a name="line.70"></a>
+<span class="sourceLineNo">071</span>    try {<a name="line.71"></a>
+<span class="sourceLineNo">072</span>      long procId = ProcedureTestingUtility.submitAndWait(procExec,<a name="line.72"></a>
+<span class="sourceLineNo">073</span>          new TruncateTableProcedure(procExec.getEnvironment(), tableName, true));<a name="line.73"></a>
+<span class="sourceLineNo">074</span><a name="line.74"></a>
+<span class="sourceLineNo">075</span>      // Second delete should fail with TableNotFound<a name="line.75"></a>
+<span class="sourceLineNo">076</span>      Procedure&lt;?&gt; result = procExec.getResult(procId);<a name="line.76"></a>
+<span class="sourceLineNo">077</span>      assertTrue(result.isFailed());<a name="line.77"></a>
+<span class="sourceLineNo">078</span>      cause = ProcedureTestingUtility.getExceptionCause(result);<a name="line.78"></a>
+<span class="sourceLineNo">079</span>    } catch (Throwable t) {<a name="line.79"></a>
+<span class="sourceLineNo">080</span>      cause = t;<a name="line.80"></a>
+<span class="sourceLineNo">081</span>    }<a name="line.81"></a>
+<span class="sourceLineNo">082</span>    LOG.debug("Truncate failed with exception: " + cause);<a name="line.82"></a>
+<span class="sourceLineNo">083</span>    assertTrue(cause instanceof TableNotFoundException);<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 testTruncateNotDisabledTable() throws Exception {<a name="line.87"></a>
+<span class="sourceLineNo">088</span>    final TableName tableName = TableName.valueOf(name.getMethodName());<a name="line.88"></a>
+<span class="sourceLineNo">089</span><a name="line.89"></a>
+<span class="sourceLineNo">090</span>    final ProcedureExecutor&lt;MasterProcedureEnv&gt; procExec = getMasterProcedureExecutor();<a name="line.90"></a>
+<span class="sourceLineNo">091</span>    MasterProcedureTestingUtility.createTable(procExec, tableName, null, "f");<a name="line.91"></a>
+<span class="sourceLineNo">092</span><a name="line.92"></a>
+<span class="sourceLineNo">093</span>    // HBASE-20178 has us fail-fast, in the constructor, so add try/catch for this case.<a name="line.93"></a>
+<span class="sourceLineNo">094</span>    // Keep old way of looking at procedure too.<a name="line.94"></a>
+<span class="sourceLineNo">095</span>    Throwable cause = null;<a name="line.95"></a>
+<span class="sourceLineNo">096</span>    try {<a name="line.96"></a>
+<span class="sourceLineNo">097</span>      long procId = ProcedureTestingUtility.submitAndWait(procExec,<a name="line.97"></a>
+<span class="sourceLineNo">098</span>          new TruncateTableProcedure(procExec.getEnvironment(), tableName, false));<a name="line.98"></a>
+<span class="sourceLineNo">099</span><a name="line.99"></a>
+<span class="sourceLineNo">100</span>      // Second delete should fail with TableNotDisabled<a name="line.100"></a>
+<span class="sourceLineNo">101</span>      Procedure&lt;?&gt; result = procExec.getResult(procId);<a name="line.101"></a>
+<span class="sourceLineNo">102</span>      assertTrue(result.isFailed());<a name="line.102"></a>
+<span class="sourceLineNo">103</span>      cause = ProcedureTestingUtility.getExceptionCause(result);<a name="line.103"></a>
+<span class="sourceLineNo">104</span>    } catch (Throwable t) {<a name="line.104"></a>
+<span class="sourceLineNo">105</span>      cause = t;<a name="line.105"></a>
+<span class="sourceLineNo">106</span>    }<a name="line.106"></a>
+<span class="sourceLineNo">107</span>    LOG.debug("Truncate failed with exception: " + cause);<a name="line.107"></a>
+<span class="sourceLineNo">108</span>    assertTrue(cause instanceof TableNotDisabledException);<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 testSimpleTruncatePreserveSplits() throws Exception {<a name="line.112"></a>
+<span class="sourceLineNo">113</span>    final TableName tableName = TableName.valueOf(name.getMethodName());<a name="line.113"></a>
+<span class="sourceLineNo">114</span>    testSimpleTruncate(tableName, true);<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>  @Test<a name="line.117"></a>
+<span class="sourceLineNo">118</span>  public void testSimpleTruncateNoPreserveSplits() throws Exception {<a name="line.118"></a>
+<span class="sourceLineNo">119</span>    final TableName tableName = TableName.valueOf(name.getMethodName());<a name="line.119"></a>
+<span class="sourceLineNo">120</span>    testSimpleTruncate(tableName, false);<a name="line.120"></a>
+<span class="sourceLineNo">121</span>  }<a name="line.121"></a>
+<span class="sourceLineNo">122</span><a name="line.122"></a>
+<span class="sourceLineNo">123</span>  private void testSimpleTruncate(final TableName tableName, final boolean preserveSplits)<a name="line.123"></a>
+<span class="sourceLineNo">124</span>      throws Exception {<a name="line.124"></a>
+<span class="sourceLineNo">125</span>    final String[] families = new String[] { "f1", "f2" };<a name="line.125"></a>
+<span class="sourceLineNo">126</span>    final byte[][] splitKeys = new byte[][] {<a name="line.126"></a>
+<span class="sourceLineNo">127</span>      Bytes.toBytes("a"), Bytes.toBytes("b"), Bytes.toBytes("c")<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>    // truncate the table<a name="line.130"></a>
-<span class="sourceLineNo">131</span>    final ProcedureExecutor&lt;MasterProcedureEnv&gt; procExec = getMasterProcedureExecutor();<a name="line.131"></a>
-<span class="sourceLineNo">132</span>    long procId = ProcedureTestingUtility.submitAndWait(procExec,<a name="line.132"></a>
-<span class="sourceLineNo">133</span>      new TruncateTableProcedure(procExec.getEnvironment(), tableName, preserveSplits));<a name="line.133"></a>
-<span class="sourceLineNo">134</span>    ProcedureTestingUtility.assertProcNotFailed(procExec, procId);<a name="line.134"></a>
-<span class="sourceLineNo">135</span><a name="line.135"></a>
-<span class="sourceLineNo">136</span>    // If truncate procedure completed successfully, it means all regions were assigned correctly<a name="line.136"></a>
-<span class="sourceLineNo">137</span>    // and table is enabled now.<a name="line.137"></a>
-<span class="sourceLineNo">138</span>    UTIL.waitUntilAllRegionsAssigned(tableName);<a name="line.138"></a>
-<span class="sourceLineNo">139</span><a name="line.139"></a>
-<span class="sourceLineNo">140</span>    // validate the table regions and layout<a name="line.140"></a>
-<span class="sourceLineNo">141</span>    regions = UTIL.getAdmin().getTableRegions(tableName).toArray(new RegionInfo[0]);<a name="line.141"></a>
-<span class="sourceLineNo">142</span>    if (preserveSplits) {<a name="line.142"></a>
-<span class="sourceLineNo">143</span>      assertEquals(1 + splitKeys.length, regions.length);<a name="line.143"></a>
-<span class="sourceLineNo">144</span>    } else {<a name="line.144"></a>
-<span class="sourceLineNo">145</span>      assertEquals(1, regions.length);<a name="line.145"></a>
-<span class="sourceLineNo">146</span>    }<a name="line.146"></a>
-<span class="sourceLineNo">147</span>    MasterProcedureTestingUtility.validateTableCreation(<a name="line.147"></a>
-<span class="sourceLineNo">148</span>      UTIL.getHBaseCluster().getMaster(), tableName, regions, families);<a name="line.148"></a>
-<span class="sourceLineNo">149</span><a name="line.149"></a>
-<span class="sourceLineNo">150</span>    // verify that there are no rows in the table<a name="line.150"></a>
-<span class="sourceLineNo">151</span>    assertEquals(0, UTIL.countRows(tableName));<a name="line.151"></a>
-<span class="sourceLineNo">152</span><a name="line.152"></a>
-<span class="sourceLineNo">153</span>    // verify that the table is read/writable<a name="line.153"></a>
-<span class="sourceLineNo">154</span>    MasterProcedureTestingUtility.loadData(<a name="line.154"></a>
-<span class="sourceLineNo">155</span>      UTIL.getConnection(), tableName, 50, splitKeys, families);<a name="line.155"></a>
-<span class="sourceLineNo">156</span>    assertEquals(50, UTIL.countRows(tableName));<a name="line.156"></a>
-<span class="sourceLineNo">157</span>  }<a name="line.157"></a>
+<span class="sourceLineNo">130</span>    RegionInfo[] regions = MasterProcedureTestingUtility.createTable(<a name="line.130"></a>
+<span class="sourceLineNo">131</span>      getMasterProcedureExecutor(), tableName, splitKeys, families);<a name="line.131"></a>
+<span class="sourceLineNo">132</span>    // load and verify that there are rows in the table<a name="line.132"></a>
+<span class="sourceLineNo">133</span>    MasterProcedureTestingUtility.loadData(<a name="line.133"></a>
+<span class="sourceLineNo">134</span>      UTIL.getConnection(), tableName, 100, splitKeys, families);<a name="line.134"></a>
+<span class="sourceLineNo">135</span>    assertEquals(100, UTIL.countRows(tableName));<a name="line.135"></a>
+<span class="sourceLineNo">136</span>    // disable the table<a name="line.136"></a>
+<span class="sourceLineNo">137</span>    UTIL.getAdmin().disableTable(tableName);<a name="line.137"></a>
+<span class="sourceLineNo">138</span><a name="line.138"></a>
+<span class="sourceLineNo">139</span>    // truncate the table<a name="line.139"></a>
+<span class="sourceLineNo">140</span>    final ProcedureExecutor&lt;MasterProcedureEnv&gt; procExec = getMasterProcedureExecutor();<a name="line.140"></a>
+<span class="sourceLineNo">141</span>    long procId = ProcedureTestingUtility.submitAndWait(procExec,<a name="line.141"></a>
+<span class="sourceLineNo">142</span>      new TruncateTableProcedure(procExec.getEnvironment(), tableName, preserveSplits));<a name="line.142"></a>
+<span class="sourceLineNo">143</span>    ProcedureTestingUtility.assertProcNotFailed(procExec, procId);<a name="line.143"></a>
+<span class="sourceLineNo">144</span><a name="line.144"></a>
+<span class="sourceLineNo">145</span>    // If truncate procedure completed successfully, it means all regions were assigned correctly<a name="line.145"></a>
+<span class="sourceLineNo">146</span>    // and table is enabled now.<a name="line.146"></a>
+<span class="sourceLineNo">147</span>    UTIL.waitUntilAllRegionsAssigned(tableName);<a name="line.147"></a>
+<span class="sourceLineNo">148</span><a name="line.148"></a>
+<span class="sourceLineNo">149</span>    // validate the table regions and layout<a name="line.149"></a>
+<span class="sourceLineNo">150</span>    regions = UTIL.getAdmin().getTableRegions(tableName).toArray(new RegionInfo[0]);<a name="line.150"></a>
+<span class="sourceLineNo">151</span>    if (preserveSplits) {<a name="line.151"></a>
+<span class="sourceLineNo">152</span>      assertEquals(1 + splitKeys.length, regions.length);<a name="line.152"></a>
+<span class="sourceLineNo">153</span>    } else {<a name="line.153"></a>
+<span class="sourceLineNo">154</span>      assertEquals(1, regions.length);<a name="line.154"></a>
+<span class="sourceLineNo">155</span>    }<a name="line.155"></a>
+<span class="sourceLineNo">156</span>    MasterProcedureTestingUtility.validateTableCreation(<a name="line.156"></a>
+<span class="sourceLineNo">157</span>      UTIL.getHBaseCluster().getMaster(), tableName, regions, families);<a name="line.157"></a>
 <span class="sourceLineNo">158</span><a name="line.158"></a>
-<span class="sourceLineNo">159</span>  @Test<a name="line.159"></a>
-<span class="sourceLineNo">160</span>  public void testRecoveryAndDoubleExecutionPreserveSplits() throws Exception {<a name="line.160"></a>
-<span class="sourceLineNo">161</span>    final TableName tableName = TableName.valueOf(name.getMethodName());<a name="line.161"></a>
-<span class="sourceLineNo">162</span>    testRecoveryAndDoubleExecution(tableName, true);<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>  @Test<a name="line.165"></a>
-<span class="sourceLineNo">166</span>  public void testRecoveryAndDoubleExecutionNoPreserveSplits() throws Exception {<a name="line.166"></a>
-<span class="sourceLineNo">167</span>    final TableName tableName = TableName.valueOf(name.getMethodName());<a name="line.167"></a>
-<span class="sourceLineNo">168</span>    testRecoveryAndDoubleExecution(tableName, false);<a name="line.168"></a>
-<span class="sourceLineNo">169</span>  }<a name="line.169"></a>
-<span class="sourceLineNo">170</span><a name="line.170"></a>
-<span class="sourceLineNo">171</span>  private void testRecoveryAndDoubleExecution(final TableName tableName,<a name="line.171"></a>
-<span class="sourceLineNo">172</span>      final boolean preserveSplits) throws Exception {<a name="line.172"></a>
-<span class="sourceLineNo">173</span>    final String[] families = new String[] { "f1", "f2" };<a name="line.173"></a>
-<span class="sourceLineNo">174</span><a name="line.174"></a>
-<span class="sourceLineNo">175</span>    // create the table<a name="line.175"></a>
-<span class="sourceLineNo">176</span>    final byte[][] splitKeys = new byte[][] {<a name="line.176"></a>
-<span class="sourceLineNo">177</span>      Bytes.toBytes("a"), Bytes.toBytes("b"), Bytes.toBytes("c")<a name="line.177"></a>
-<span class="sourceLineNo">178</span>    };<a name="line.178"></a>
-<span class="sourceLineNo">179</span>    RegionInfo[] regions = MasterProcedureTestingUtility.createTable(<a name="line.179"></a>
-<span class="sourceLineNo">180</span>      getMasterProcedureExecutor(), tableName, splitKeys, families);<a name="line.180"></a>
-<span class="sourceLineNo">181</span>    // load and verify that there are rows in the table<a name="line.181"></a>
-<span class="sourceLineNo">182</span>    MasterProcedureTestingUtility.loadData(<a name="line.182"></a>
-<span class="sourceLineNo">183</span>      UTIL.getConnection(), tableName, 100, splitKeys, families);<a name="line.183"></a>
-<span class="sourceLineNo">184</span>    assertEquals(100, UTIL.countRows(tableName));<a name="line.184"></a>
-<span class="sourceLineNo">185</span>    // disable the table<a name="line.185"></a>
-<span class="sourceLineNo">186</span>    UTIL.getAdmin().disableTable(tableName);<a name="line.186"></a>
-<span class="sourceLineNo">187</span><a name="line.187"></a>
-<span class="sourceLineNo">188</span>    final ProcedureExecutor&lt;MasterProcedureEnv&gt; procExec = getMasterProcedureExecutor();<a name="line.188"></a>
-<span class="sourceLineNo">189</span>    ProcedureTestingUtility.waitNoProcedureRunning(procExec);<a name="line.189"></a>
-<span class="sourceLineNo">190</span>    ProcedureTestingUtility.setKillAndToggleBeforeStoreUpdate(procExec, true);<a name="line.190"></a>
-<span class="sourceLineNo">191</span><a name="line.191"></a>
-<span class="sourceLineNo">192</span>    // Start the Truncate procedure &amp;&amp; kill the executor<a name="line.192"></a>
-<span class="sourceLineNo">193</span>    long procId = procExec.submitProcedure(<a name="line.193"></a>
-<span class="sourceLineNo">194</span>      new TruncateTableProcedure(procExec.getEnvironment(), tableName, preserveSplits));<a name="line.194"></a>
-<span class="sourceLineNo">195</span><a name="line.195"></a>
-<span class="sourceLineNo">196</span>    // Restart the executor and execute the step twice<a name="line.196"></a>
-<span class="sourceLineNo">197</span>    MasterProcedureTestingUtility.testRecoveryAndDoubleExecution(procExec, procId);<a name="line.197"></a>
-<span class="sourceLineNo">198</span><a name="line.198"></a>
-<span class="sourceLineNo">199</span>    ProcedureTestingUtility.setKillAndToggleBeforeStoreUpdate(procExec, false);<a name="line.199"></a>
-<span class="sourceLineNo">200</span>    UTIL.waitUntilAllRegionsAssigned(tableName);<a name="line.200"></a>
-<span class="sourceLineNo">201</span><a name="line.201"></a>
-<span class="sourceLineNo">202</span>    // validate the table regions and layout<a name="line.202"></a>
-<span class="sourceLineNo">203</span>    regions = UTIL.getAdmin().getTableRegions(tableName).toArray(new RegionInfo[0]);<a name="line.203"></a>
-<span class="sourceLineNo">204</span>    if (preserveSplits) {<a name="line.204"></a>
-<span class="sourceLineNo">205</span>      assertEquals(1 + splitKeys.length, regions.length);<a name="line.205"></a>
-<span class="sourceLineNo">206</span>    } else {<a name="line.206"></a>
-<span class="sourceLineNo">207</span>      assertEquals(1, regions.length);<a name="line.207"></a>
-<span class="sourceLineNo">208</span>    }<a name="line.208"></a>
-<span class="sourceLineNo">209</span>    MasterProcedureTestingUtility.validateTableCreation(<a name="line.209"></a>
-<span class="sourceLineNo">210</span>      UTIL.getHBaseCluster().getMaster(), tableName, regions, families);<a name="line.210"></a>
-<span class="sourceLineNo">211</span><a name="line.211"></a>
-<span class="sourceLineNo">212</span>    // verify that there are no rows in the table<a name="line.212"></a>
-<span class="sourceLineNo">213</span>    assertEquals(0, UTIL.countRows(tableName));<a name="line.213"></a>
-<span class="sourceLineNo">214</span><a name="line.214"></a>
-<span class="sourceLineNo">215</span>    // verify that the table is read/writable<a name="line.215"></a>
-<span class="sourceLineNo">216</span>    MasterProcedureTestingUtility.loadData(<a name="line.216"></a>
-<span class="sourceLineNo">217</span>      UTIL.getConnection(), tableName, 50, splitKeys, families);<a name="line.217"></a>
-<span class="sourceLineNo">218</span>    assertEquals(50, UTIL.countRows(tableName));<a name="line.218"></a>
-<span class="sourceLineNo">219</span>  }<a name="line.219"></a>
-<span class="sourceLineNo">220</span>}<a name="line.220"></a>
+<span class="sourceLineNo">159</span>    // verify that there are no rows in the table<a name="line.159"></a>
+<span class="sourceLineNo">160</span>    assertEquals(0, UTIL.countRows(tableName));<a name="line.160"></a>
+<span class="sourceLineNo">161</span><a name="line.161"></a>
+<span class="sourceLineNo">162</span>    // verify that the table is read/writable<a name="line.162"></a>
+<span class="sourceLineNo">163</span>    MasterProcedureTestingUtility.loadData(<a name="line.163"></a>
+<span class="sourceLineNo">164</span>      UTIL.getConnection(), tableName, 50, splitKeys, families);<a name="line.164"></a>
+<span class="sourceLineNo">165</span>    assertEquals(50, UTIL.countRows(tableName));<a name="line.165"></a>
+<span class="sourceLineNo">166</span>  }<a name="line.166"></a>
+<span class="sourceLineNo">167</span><a name="line.167"></a>
+<span class="sourceLineNo">168</span>  @Test<a name="line.168"></a>
+<span class="sourceLineNo">169</span>  public void testRecoveryAndDoubleExecutionPreserveSplits() throws Exception {<a name="line.169"></a>
+<span class="sourceLineNo">170</span>    final TableName tableName = TableName.valueOf(name.getMethodName());<a name="line.170"></a>
+<span class="sourceLineNo">171</span>    testRecoveryAndDoubleExecution(tableName, true);<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>  @Test<a name="line.174"></a>
+<span class="sourceLineNo">175</span>  public void testRecoveryAndDoubleExecutionNoPreserveSplits() throws Exception {<a name="line.175"></a>
+<span class="sourceLineNo">176</span>    final TableName tableName = TableName.valueOf(name.getMethodName());<a name="line.176"></a>
+<span class="sourceLineNo">177</span>    testRecoveryAndDoubleExecution(tableName, false);<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>  private void testRecoveryAndDoubleExecution(final TableName tableName,<a name="line.180"></a>
+<span class="sourceLineNo">181</span>      final boolean preserveSplits) throws Exception {<a name="line.181"></a>
+<span class="sourceLineNo">182</span>    final String[] families = new String[] { "f1", "f2" };<a name="line.182"></a>
+<span class="sourceLineNo">183</span><a name="line.183"></a>
+<span class="sourceLineNo">184</span>    // create the table<a name="line.184"></a>
+<span class="sourceLineNo">185</span>    final byte[][] splitKeys = new byte[][] {<a name="line.185"></a>
+<span class="sourceLineNo">186</span>      Bytes.toBytes("a"), Bytes.toBytes("b"), Bytes.toBytes("c")<a name="line.186"></a>
+<span class="sourceLineNo">187</span>    };<a name="line.187"></a>
+<span class="sourceLineNo">188</span>    RegionInfo[] regions = MasterProcedureTestingUtility.createTable(<a name="line.188"></a>
+<span class="sourceLineNo">189</span>      getMasterProcedureExecutor(), tableName, splitKeys, families);<a name="line.189"></a>
+<span class="sourceLineNo">190</span>    // load and verify that there are rows in the table<a name="line.190"></a>
+<span class="sourceLineNo">191</span>    MasterProcedureTestingUtility.loadData(<a name="line.191"></a>
+<span class="sourceLineNo">192</span>      UTIL.getConnection(), tableName, 100, splitKeys, families);<a name="line.192"></a>
+<span class="sourceLineNo">193</span>    assertEquals(100, UTIL.countRows(tableName));<a name="line.193"></a>
+<span class="sourceLineNo">194</span>    // disable the table<a name="line.194"></a>
+<span class="sourceLineNo">195</span>    UTIL.getAdmin().disableTable(tableName);<a name="line.195"></a>
+<span class="sourceLineNo">196</span><a name="line.196"></a>
+<span class="sourceLineNo">197</span>    final ProcedureExecutor&lt;MasterProcedureEnv&gt; procExec = getMasterProcedureExecutor();<a name="line.197"></a>
+<span class="sourceLineNo">198</span>    ProcedureTestingUtility.waitNoProcedureRunning(procExec);<a name="line.198"></a>
+<span class="sourceLineNo">199</span>    ProcedureTestingUtility.setKillAndToggleBeforeStoreUpdate(procExec, true);<a name="line.199"></a>
+<span class="sourceLineNo">200</span><a name="line.200"></a>
+<span class="sourceLineNo">201</span>    // Start the Truncate procedure &amp;&amp; kill the executor<a name="line.201"></a>
+<span class="sourceLineNo">202</span>    long procId = procExec.submitProcedure(<a name="line.202"></a>
+<span class="sourceLineNo">203</span>      new TruncateTableProcedure(procExec.getEnvironment(), tableName, preserveSplits));<a name="line.203"></a>
+<span class="sourceLineNo">204</span><a name="line.204"></a>
+<span class="sourceLineNo">205</span>    // Restart the executor and execute the step twice<a name="line.205"></a>
+<span class="sourceLineNo">206</span>    MasterProcedureTestingUtility.testRecoveryAndDoubleExecution(procExec, procId);<a name="line.206"></a>
+<span class="sourceLineNo">207</span><a name="line.207"></a>
+<span class="sourceLineNo">208</span>    ProcedureTestingUtility.setKillAndToggleBeforeStoreUpdate(procExec, false);<a name="line.208"></a>
+<span class="sourceLineNo">209</span>    UTIL.waitUntilAllRegionsAssigned(tableName);<a name="line.209"></a>
+<span class="sourceLineNo">210</span><a name="line.210"></a>
+<span class="sourceLineNo">211</span>    // validate the table regions and layout<a name="line.211"></a>
+<span class="sourceLineNo">212</span>    regions = UTIL.getAdmin().getTableRegions(tableName).toArray(new RegionInfo[0]);<a name="line.212"></a>
+<span class="sourceLineNo">213</span>    if (preserveSplits) {<a name="line.213"></a>
+<span class="sourceLineNo">214</span>      assertEquals(1 + splitKeys.length, regions.length);<a name="line.214"></a>
+<span class="sourceLineNo">215</span>    } else {<a name="line.215"></a>
+<span class="sourceLineNo">216</span>      assertEquals(1, regions.length);<a name="line.216"></a>
+<span class="sourceLineNo">217</span>    }<a name="line.217"></a>
+<span class="sourceLineNo">218</span>    MasterProcedureTestingUtility.validateTableCreation(<a name="line.218"></a>
+<span class="sourceLineNo">219</span>      UTIL.getHBaseCluster().getMaster(), tableName, regions, families);<a name="line.219"></a>
+<span class="sourceLineNo">220</span><a name="line.220"></a>
+<span class="sourceLineNo">221</span>    // verify that there are no rows in the table<a name="line.221"></a>
+<span class="sourceLineNo">222</span>    assertEquals(0, UTIL.countRows(tableName));<a name="line.222"></a>
+<span class="sourceLineNo">223</span><a name="line.223"></a>
+<span class="sourceLineNo">224</span>    // verify that the table is read/writable<a name="line.224"></a>
+<span class="sourceLineNo">225</span>    MasterProcedureTestingUtility.loadData(<a name="line.225"></a>
+<span class="sourceLineNo">226</span>      UTIL.getConnection(), tableName, 50, splitKeys, families);<a name="line.226"></a>
+<span class="sourceLineNo">227</span>    assertEquals(50, UTIL.countRows(tableName));<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>  @Test<a name="line.230"></a>
+<span class="sourceLineNo">231</span>  public void testOnHDFSFailurePreserveSplits() throws Exception {<a name="line.231"></a>
+<span class="sourceLineNo">232</span>    final TableName tableName = TableName.valueOf(name.getMethodName());<a name="line.232"></a>
+<span class="sourceLineNo">233</span>    testOnHDFSFailure(tableName, true);<a name="line.233"></a>
+<span class="sourceLineNo">234</span>  }<a name="line.234"></a>
+<span class="sourceLineNo">235</span><a name="line.235"></a>
+<span class="sourceLineNo">236</span>  @Test<a name="line.236"></a>
+<span class="sourceLineNo">237</span>  public void testOnHDFSFailureNoPreserveSplits() throws Exception {<a name="line.237"></a>
+<span class="sourceLineNo">238</span>    final TableName tableName = TableName.valueOf(name.getMethodName());<a name="line.238"></a>
+<span class="sourceLineNo">239</span>    testOnHDFSFailure(tableName, false);<a name="line.239"></a>
+<span class="sourceLineNo">240</span>  }<a name="line.240"></a>
+<span class="sourceLineNo">241</span><a name="line.241"></a>
+<span class="sourceLineNo">242</span>  public static class TruncateTableProcedureOnHDFSFailure extends TruncateTableProcedure {<a name="line.242"></a>
+<span class="sourceLineNo">243</span><a name="line.243"></a>
+<span class="sourceLineNo">244</span>    private boolean failOnce = false;<a name="line.244"></a>
+<span class="sourceLineNo">245</span><a name="line.245"></a>
+<span class="sourceLineNo">246</span>    public TruncateTableProcedureOnHDFSFailure() {<a name="line.246"></a>
+<span class="sourceLineNo">247</span>      // Required by the Procedure framework to create the procedure on replay<a name="line.247"></a>
+<span class="sourceLineNo">248</span>      super();<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>    public TruncateTableProcedureOnHDFSFailure(final MasterProcedureEnv env, TableName tableName,<a name="line.251"></a>
+<span class="sourceLineNo">252</span>      boolean preserveSplits)<a name="line.252"></a>
+<span class="sourceLineNo">253</span>      throws HBaseIOException {<a name="line.253"></a>
+<span class="sourceLineNo">254</span>      super(env, tableName, preserveSplits);<a name="line.254"></a>
+<span class="sourceLineNo">255</span>    }<a name="line.255"></a>
+<span class="sourceLineNo">256</span><a name="line.256"></a>
+<span class="sourceLineNo">257</span>    @Override<a name="line.257"></a>
+<span class="sourceLineNo">258</span>    protected Flow executeFromState(MasterProcedureEnv env,<a name="line.258"></a>
+<span class="sourceLineNo">259</span>      MasterProcedureProtos.TruncateTableState state) throws InterruptedException {<a name="line.259"></a>
+<span class="sourceLineNo">260</span><a name="line.260"></a>
+<span class="sourceLineNo">261</span>      if (!failOnce &amp;&amp;<a name="line.261"></a>
+<span class="sourceLineNo">262</span>        state == MasterProcedureProtos.TruncateTableState.TRUNCATE_TABLE_CREATE_FS_LAYOUT) {<a name="line.262"></a>
+<span class="sourceLineNo">263</span>        try {<a name="line.263"></a>
+<span class="sourceLineNo">264</span>          // To emulate an HDFS failure, create only the first region directory<a name="line.264"></a>
+<span class="sourceLineNo">265</span>          RegionInfo regionInfo = getFirstRegionInfo();<a name="line.265"></a>
+<span class="sourceLineNo">266</span>          Configuration conf = env.getMasterConfiguration();<a name="line.266"></a>
+<span class="sourceLineNo">267</span>          MasterFileSystem mfs = env.getMasterServices().getMasterFileSystem();<a name="line.267"></a>
+<span class="sourceLineNo">268</span>          Path tempdir = mfs.getTempDir();<a name="line.268"></a>
+<span class="sourceLineNo">269</span>          Path tableDir = FSUtils.getTableDir(tempdir, regionInfo.getTable());<a name="line.269"></a>
+<span class="sourceLineNo">270</span>          Path regionDir = FSUtils.getRegionDir(tableDir, regionInfo);<a name="line.270"></a>
+<span class="sourceLineNo">271</span>          FileSystem fs = FileSystem.get(conf);<a name="line.271"></a>
+<span class="sourceLineNo">272</span>          fs.mkdirs(regionDir);<a name="line.272"></a>
+<span class="sourceLineNo">273</span><a name="line.273"></a>
+<span class="sourceLineNo">274</span>          failOnce = true;<a name="line.274"></a>
+<span class="sourceLineNo">275</span>          return Flow.HAS_MORE_STATE;<a name="line.275"></a>
+<span class="sourceLineNo">276</span>        } catch (IOException e) {<a name="line.276"></a>
+<span class="sourceLineNo">277</span>          fail("failed to create a region directory: " + e);<a name="line.277"></a>
+<span class="sourceLineNo">278</span>        }<a name="line.278"></a>
+<span class="sourceLineNo">279</span>      }<a name="line.279"></a>
+<span class="sourceLineNo">280</span><a name="line.280"></a>
+<span class="sourceLineNo">281</span>      return super.executeFromState(env, state);<a name="line.281"></a>
+<span class="sourceLineNo">282</span>    }<a name="line.282"></a>
+<span class="sourceLineNo">283</span>  }<a name="line.283"></a>
+<span class="sourceLineNo">284</span><a name="line.284"></a>
+<span class="sourceLineNo">285</span>  private void testOnHDFSFailure(TableName tableName, boolean preserveSplits) throws Exception {<a name="line.285"></a>
+<span class="sourceLineNo">286</span>    String[] families = new String[] { "f1", "f2" };<a name="line.286"></a>
+<span class="sourceLineNo">287</span>    byte[][] splitKeys = new byte[][] {<a name="line.287"></a>
+<span class="sourceLineNo">288</span>      Bytes.toBytes("a"), Bytes.toBytes("b"), Bytes.toBytes("c")<a name="line.288"></a>
+<span class="sourceLineNo">289</span>    };<a name="line.289"></a>
+<span class="sourceLineNo">290</span><a name="line.290"></a>
+<span class="sourceLineNo">291</span>    // create a table<a name="line.291"></a>
+<span class="sourceLineNo">292</span>    MasterProcedureTestingUtility.createTable(<a name="line.292"></a>
+<span class="sourceLineNo">293</span>      getMasterProcedureExecutor(), tableName, splitKeys, families);<a name="line.293"></a>
+<span class="sourceLineNo">294</span><a name="line.294"></a>
+<span class="sourceLineNo">295</span>    // load and verify that there are rows in the table<a name="line.295"></a>
+<span class="sourceLineNo">296</span>    MasterProcedureTestingUtility.loadData(<a name="line.296"></a>
+<span class="sourceLineNo">297</span>      UTIL.getConnection(), tableName, 100, splitKeys, families);<a name="line.297"></a>
+<span class="sourceLineNo">298</span>    assertEquals(100, UTIL.countRows(tableName));<a name="line.298"></a>
+<span class="sourceLineNo">299</span><a name="line.299"></a>
+<span class="sourceLineNo">300</span>    // disable the table<a name="line.300"></a>
+<span class="sourceLineNo">301</span>    UTIL.getAdmin().disableTable(tableName);<a name="line.301"></a>
+<span class="sourceLineNo">302</span><a name="line.302"></a>
+<span class="sourceLineNo">303</span>    // truncate the table<a name="line.303"></a>
+<span class="sourceLineNo">304</span>    final ProcedureExecutor&lt;MasterProcedureEnv&gt; procExec = getMasterProcedureExecutor();<a name="line.304"></a>
+<span class="sourceLineNo">305</span>    long procId = ProcedureTestingUtility.submitAndWait(procExec,<a name="line.305"></a>
+<span class="sourceLineNo">306</span>      new TruncateTableProcedureOnHDFSFailure(procExec.getEnvironment(), tableName,<a name="line.306"></a>
+<span class="sourceLineNo">307</span>        preserveSplits));<a name="line.307"></a>
+<span class="sourceLineNo">308</span>    ProcedureTestingUtility.assertProcNotFailed(procExec, procId);<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>
 
 
 


[22/29] hbase-site git commit: Published site at 477f9fdb32873387231c5fbbff130ba8bf7b5d68.

Posted by gi...@apache.org.
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/621479e1/devapidocs/org/apache/hadoop/hbase/master/procedure/TruncateTableProcedure.html
----------------------------------------------------------------------
diff --git a/devapidocs/org/apache/hadoop/hbase/master/procedure/TruncateTableProcedure.html b/devapidocs/org/apache/hadoop/hbase/master/procedure/TruncateTableProcedure.html
index 53dd8d5..05e93e1 100644
--- a/devapidocs/org/apache/hadoop/hbase/master/procedure/TruncateTableProcedure.html
+++ b/devapidocs/org/apache/hadoop/hbase/master/procedure/TruncateTableProcedure.html
@@ -18,7 +18,7 @@
     catch(err) {
     }
 //-->
-var methods = {"i0":10,"i1":10,"i2":10,"i3":10,"i4":10,"i5":10,"i6":10,"i7":10,"i8":10,"i9":10,"i10":10,"i11":10,"i12":9,"i13":10,"i14":10,"i15":10};
+var methods = {"i0":10,"i1":10,"i2":10,"i3":10,"i4":10,"i5":10,"i6":10,"i7":10,"i8":10,"i9":10,"i10":10,"i11":10,"i12":10,"i13":9,"i14":10,"i15":10,"i16":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";
@@ -129,7 +129,7 @@ var activeTableTab = "activeTableTab";
 <hr>
 <br>
 <pre>@InterfaceAudience.Private
-public class <a href="../../../../../../src-html/org/apache/hadoop/hbase/master/procedure/TruncateTableProcedure.html#line.45">TruncateTableProcedure</a>
+public class <a href="../../../../../../src-html/org/apache/hadoop/hbase/master/procedure/TruncateTableProcedure.html#line.46">TruncateTableProcedure</a>
 extends <a href="../../../../../../org/apache/hadoop/hbase/master/procedure/AbstractStateMachineTableProcedure.html" title="class in org.apache.hadoop.hbase.master.procedure">AbstractStateMachineTableProcedure</a>&lt;org.apache.hadoop.hbase.shaded.protobuf.generated.MasterProcedureProtos.TruncateTableState&gt;</pre>
 </li>
 </ul>
@@ -269,71 +269,75 @@ extends <a href="../../../../../../org/apache/hadoop/hbase/master/procedure/Abst
 </td>
 </tr>
 <tr id="i3" class="rowColor">
+<td class="colFirst"><code>(package private) <a href="../../../../../../org/apache/hadoop/hbase/client/RegionInfo.html" title="interface in org.apache.hadoop.hbase.client">RegionInfo</a></code></td>
+<td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/master/procedure/TruncateTableProcedure.html#getFirstRegionInfo--">getFirstRegionInfo</a></span>()</code>&nbsp;</td>
+</tr>
+<tr id="i4" class="altColor">
 <td class="colFirst"><code>protected org.apache.hadoop.hbase.shaded.protobuf.generated.MasterProcedureProtos.TruncateTableState</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/master/procedure/TruncateTableProcedure.html#getInitialState--">getInitialState</a></span>()</code>
 <div class="block">Return the initial state object that will be used for the first call to executeFromState().</div>
 </td>
 </tr>
-<tr id="i4" class="altColor">
+<tr id="i5" class="rowColor">
 <td class="colFirst"><code>protected org.apache.hadoop.hbase.shaded.protobuf.generated.MasterProcedureProtos.TruncateTableState</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/master/procedure/TruncateTableProcedure.html#getState-int-">getState</a></span>(int&nbsp;stateId)</code>
 <div class="block">Convert an ordinal (or state id) to an Enum (or more descriptive) state object.</div>
 </td>
 </tr>
-<tr id="i5" class="rowColor">
+<tr id="i6" class="altColor">
 <td class="colFirst"><code>protected int</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/master/procedure/TruncateTableProcedure.html#getStateId-org.apache.hadoop.hbase.shaded.protobuf.generated.MasterProcedureProtos.TruncateTableState-">getStateId</a></span>(org.apache.hadoop.hbase.shaded.protobuf.generated.MasterProcedureProtos.TruncateTableState&nbsp;state)</code>
 <div class="block">Convert the Enum (or more descriptive) state object to an ordinal (or state id).</div>
 </td>
 </tr>
-<tr id="i6" class="altColor">
+<tr id="i7" class="rowColor">
 <td class="colFirst"><code><a href="../../../../../../org/apache/hadoop/hbase/TableName.html" title="class in org.apache.hadoop.hbase">TableName</a></code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/master/procedure/TruncateTableProcedure.html#getTableName--">getTableName</a></span>()</code>&nbsp;</td>
 </tr>
-<tr id="i7" class="rowColor">
+<tr id="i8" class="altColor">
 <td class="colFirst"><code><a href="../../../../../../org/apache/hadoop/hbase/master/procedure/TableProcedureInterface.TableOperationType.html" title="enum in org.apache.hadoop.hbase.master.procedure">TableProcedureInterface.TableOperationType</a></code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/master/procedure/TruncateTableProcedure.html#getTableOperationType--">getTableOperationType</a></span>()</code>
 <div class="block">Given an operation type we can take decisions about what to do with pending operations.</div>
 </td>
 </tr>
-<tr id="i8" class="altColor">
+<tr id="i9" class="rowColor">
 <td class="colFirst"><code>protected boolean</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/master/procedure/TruncateTableProcedure.html#isRollbackSupported-org.apache.hadoop.hbase.shaded.protobuf.generated.MasterProcedureProtos.TruncateTableState-">isRollbackSupported</a></span>(org.apache.hadoop.hbase.shaded.protobuf.generated.MasterProcedureProtos.TruncateTableState&nbsp;state)</code>
 <div class="block">Used by the default implementation of abort() to know if the current state can be aborted
  and rollback can be triggered.</div>
 </td>
 </tr>
-<tr id="i9" class="rowColor">
+<tr id="i10" class="altColor">
 <td class="colFirst"><code>private void</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/master/procedure/TruncateTableProcedure.html#postTruncate-org.apache.hadoop.hbase.master.procedure.MasterProcedureEnv-">postTruncate</a></span>(<a href="../../../../../../org/apache/hadoop/hbase/master/procedure/MasterProcedureEnv.html" title="class in org.apache.hadoop.hbase.master.procedure">MasterProcedureEnv</a>&nbsp;env)</code>&nbsp;</td>
 </tr>
-<tr id="i10" class="altColor">
+<tr id="i11" class="rowColor">
 <td class="colFirst"><code>private boolean</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/master/procedure/TruncateTableProcedure.html#prepareTruncate-org.apache.hadoop.hbase.master.procedure.MasterProcedureEnv-">prepareTruncate</a></span>(<a href="../../../../../../org/apache/hadoop/hbase/master/procedure/MasterProcedureEnv.html" title="class in org.apache.hadoop.hbase.master.procedure">MasterProcedureEnv</a>&nbsp;env)</code>&nbsp;</td>
 </tr>
-<tr id="i11" class="rowColor">
+<tr id="i12" class="altColor">
 <td class="colFirst"><code>private boolean</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/master/procedure/TruncateTableProcedure.html#preTruncate-org.apache.hadoop.hbase.master.procedure.MasterProcedureEnv-">preTruncate</a></span>(<a href="../../../../../../org/apache/hadoop/hbase/master/procedure/MasterProcedureEnv.html" title="class in org.apache.hadoop.hbase.master.procedure">MasterProcedureEnv</a>&nbsp;env)</code>&nbsp;</td>
 </tr>
-<tr id="i12" class="altColor">
+<tr id="i13" class="rowColor">
 <td class="colFirst"><code>private static <a href="https://docs.oracle.com/javase/8/docs/api/java/util/List.html?is-external=true" title="class or interface in java.util">List</a>&lt;<a href="../../../../../../org/apache/hadoop/hbase/client/RegionInfo.html" title="interface in org.apache.hadoop.hbase.client">RegionInfo</a>&gt;</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/master/procedure/TruncateTableProcedure.html#recreateRegionInfo-java.util.List-">recreateRegionInfo</a></span>(<a href="https://docs.oracle.com/javase/8/docs/api/java/util/List.html?is-external=true" title="class or interface in java.util">List</a>&lt;<a href="../../../../../../org/apache/hadoop/hbase/client/RegionInfo.html" title="interface in org.apache.hadoop.hbase.client">RegionInfo</a>&gt;&nbsp;regions)</code>&nbsp;</td>
 </tr>
-<tr id="i13" class="rowColor">
+<tr id="i14" class="altColor">
 <td class="colFirst"><code>protected void</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/master/procedure/TruncateTableProcedure.html#rollbackState-org.apache.hadoop.hbase.master.procedure.MasterProcedureEnv-org.apache.hadoop.hbase.shaded.protobuf.generated.MasterProcedureProtos.TruncateTableState-">rollbackState</a></span>(<a href="../../../../../../org/apache/hadoop/hbase/master/procedure/MasterProcedureEnv.html" title="class in org.apache.hadoop.hbase.master.procedure">MasterProcedureEnv</a>&nbsp;env,
              org.apache.hadoop.hbase.shaded.protobuf.generated.MasterProcedureProtos.TruncateTableState&nbsp;state)</code>
 <div class="block">called to perform the rollback of the specified state</div>
 </td>
 </tr>
-<tr id="i14" class="altColor">
+<tr id="i15" class="rowColor">
 <td class="colFirst"><code>protected void</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/master/procedure/TruncateTableProcedure.html#serializeStateData-org.apache.hadoop.hbase.procedure2.ProcedureStateSerializer-">serializeStateData</a></span>(<a href="../../../../../../org/apache/hadoop/hbase/procedure2/ProcedureStateSerializer.html" title="interface in org.apache.hadoop.hbase.procedure2">ProcedureStateSerializer</a>&nbsp;serializer)</code>
 <div class="block">The user-level code of the procedure may have some state to
  persist (e.g.</div>
 </td>
 </tr>
-<tr id="i15" class="rowColor">
+<tr id="i16" class="altColor">
 <td class="colFirst"><code>void</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/master/procedure/TruncateTableProcedure.html#toStringClassDetails-java.lang.StringBuilder-">toStringClassDetails</a></span>(<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/StringBuilder.html?is-external=true" title="class or interface in java.lang">StringBuilder</a>&nbsp;sb)</code>
 <div class="block">Extend the toString() information with the procedure details
@@ -389,7 +393,7 @@ extends <a href="../../../../../../org/apache/hadoop/hbase/master/procedure/Abst
 <ul class="blockList">
 <li class="blockList">
 <h4>LOG</h4>
-<pre>private static final&nbsp;org.slf4j.Logger <a href="../../../../../../src-html/org/apache/hadoop/hbase/master/procedure/TruncateTableProcedure.html#line.47">LOG</a></pre>
+<pre>private static final&nbsp;org.slf4j.Logger <a href="../../../../../../src-html/org/apache/hadoop/hbase/master/procedure/TruncateTableProcedure.html#line.48">LOG</a></pre>
 </li>
 </ul>
 <a name="preserveSplits">
@@ -398,7 +402,7 @@ extends <a href="../../../../../../org/apache/hadoop/hbase/master/procedure/Abst
 <ul class="blockList">
 <li class="blockList">
 <h4>preserveSplits</h4>
-<pre>private&nbsp;boolean <a href="../../../../../../src-html/org/apache/hadoop/hbase/master/procedure/TruncateTableProcedure.html#line.49">preserveSplits</a></pre>
+<pre>private&nbsp;boolean <a href="../../../../../../src-html/org/apache/hadoop/hbase/master/procedure/TruncateTableProcedure.html#line.50">preserveSplits</a></pre>
 </li>
 </ul>
 <a name="regions">
@@ -407,7 +411,7 @@ extends <a href="../../../../../../org/apache/hadoop/hbase/master/procedure/Abst
 <ul class="blockList">
 <li class="blockList">
 <h4>regions</h4>
-<pre>private&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/util/List.html?is-external=true" title="class or interface in java.util">List</a>&lt;<a href="../../../../../../org/apache/hadoop/hbase/client/RegionInfo.html" title="interface in org.apache.hadoop.hbase.client">RegionInfo</a>&gt; <a href="../../../../../../src-html/org/apache/hadoop/hbase/master/procedure/TruncateTableProcedure.html#line.50">regions</a></pre>
+<pre>private&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/util/List.html?is-external=true" title="class or interface in java.util">List</a>&lt;<a href="../../../../../../org/apache/hadoop/hbase/client/RegionInfo.html" title="interface in org.apache.hadoop.hbase.client">RegionInfo</a>&gt; <a href="../../../../../../src-html/org/apache/hadoop/hbase/master/procedure/TruncateTableProcedure.html#line.51">regions</a></pre>
 </li>
 </ul>
 <a name="tableDescriptor">
@@ -416,7 +420,7 @@ extends <a href="../../../../../../org/apache/hadoop/hbase/master/procedure/Abst
 <ul class="blockList">
 <li class="blockList">
 <h4>tableDescriptor</h4>
-<pre>private&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/client/TableDescriptor.html" title="interface in org.apache.hadoop.hbase.client">TableDescriptor</a> <a href="../../../../../../src-html/org/apache/hadoop/hbase/master/procedure/TruncateTableProcedure.html#line.51">tableDescriptor</a></pre>
+<pre>private&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/client/TableDescriptor.html" title="interface in org.apache.hadoop.hbase.client">TableDescriptor</a> <a href="../../../../../../src-html/org/apache/hadoop/hbase/master/procedure/TruncateTableProcedure.html#line.52">tableDescriptor</a></pre>
 </li>
 </ul>
 <a name="tableName">
@@ -425,7 +429,7 @@ extends <a href="../../../../../../org/apache/hadoop/hbase/master/procedure/Abst
 <ul class="blockListLast">
 <li class="blockList">
 <h4>tableName</h4>
-<pre>private&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/TableName.html" title="class in org.apache.hadoop.hbase">TableName</a> <a href="../../../../../../src-html/org/apache/hadoop/hbase/master/procedure/TruncateTableProcedure.html#line.52">tableName</a></pre>
+<pre>private&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/TableName.html" title="class in org.apache.hadoop.hbase">TableName</a> <a href="../../../../../../src-html/org/apache/hadoop/hbase/master/procedure/TruncateTableProcedure.html#line.53">tableName</a></pre>
 </li>
 </ul>
 </li>
@@ -442,7 +446,7 @@ extends <a href="../../../../../../org/apache/hadoop/hbase/master/procedure/Abst
 <ul class="blockList">
 <li class="blockList">
 <h4>TruncateTableProcedure</h4>
-<pre>public&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/procedure/TruncateTableProcedure.html#line.54">TruncateTableProcedure</a>()</pre>
+<pre>public&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/procedure/TruncateTableProcedure.html#line.55">TruncateTableProcedure</a>()</pre>
 </li>
 </ul>
 <a name="TruncateTableProcedure-org.apache.hadoop.hbase.master.procedure.MasterProcedureEnv-org.apache.hadoop.hbase.TableName-boolean-">
@@ -451,7 +455,7 @@ extends <a href="../../../../../../org/apache/hadoop/hbase/master/procedure/Abst
 <ul class="blockList">
 <li class="blockList">
 <h4>TruncateTableProcedure</h4>
-<pre>public&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/procedure/TruncateTableProcedure.html#line.59">TruncateTableProcedure</a>(<a href="../../../../../../org/apache/hadoop/hbase/master/procedure/MasterProcedureEnv.html" title="class in org.apache.hadoop.hbase.master.procedure">MasterProcedureEnv</a>&nbsp;env,
+<pre>public&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/procedure/TruncateTableProcedure.html#line.60">TruncateTableProcedure</a>(<a href="../../../../../../org/apache/hadoop/hbase/master/procedure/MasterProcedureEnv.html" title="class in org.apache.hadoop.hbase.master.procedure">MasterProcedureEnv</a>&nbsp;env,
                               <a href="../../../../../../org/apache/hadoop/hbase/TableName.html" title="class in org.apache.hadoop.hbase">TableName</a>&nbsp;tableName,
                               boolean&nbsp;preserveSplits)
                        throws <a href="../../../../../../org/apache/hadoop/hbase/HBaseIOException.html" title="class in org.apache.hadoop.hbase">HBaseIOException</a></pre>
@@ -467,7 +471,7 @@ extends <a href="../../../../../../org/apache/hadoop/hbase/master/procedure/Abst
 <ul class="blockListLast">
 <li class="blockList">
 <h4>TruncateTableProcedure</h4>
-<pre>public&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/procedure/TruncateTableProcedure.html#line.65">TruncateTableProcedure</a>(<a href="../../../../../../org/apache/hadoop/hbase/master/procedure/MasterProcedureEnv.html" title="class in org.apache.hadoop.hbase.master.procedure">MasterProcedureEnv</a>&nbsp;env,
+<pre>public&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/procedure/TruncateTableProcedure.html#line.66">TruncateTableProcedure</a>(<a href="../../../../../../org/apache/hadoop/hbase/master/procedure/MasterProcedureEnv.html" title="class in org.apache.hadoop.hbase.master.procedure">MasterProcedureEnv</a>&nbsp;env,
                               <a href="../../../../../../org/apache/hadoop/hbase/TableName.html" title="class in org.apache.hadoop.hbase">TableName</a>&nbsp;tableName,
                               boolean&nbsp;preserveSplits,
                               <a href="../../../../../../org/apache/hadoop/hbase/master/procedure/ProcedurePrepareLatch.html" title="class in org.apache.hadoop.hbase.master.procedure">ProcedurePrepareLatch</a>&nbsp;latch)
@@ -492,7 +496,7 @@ extends <a href="../../../../../../org/apache/hadoop/hbase/master/procedure/Abst
 <ul class="blockList">
 <li class="blockList">
 <h4>executeFromState</h4>
-<pre>protected&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/procedure2/StateMachineProcedure.Flow.html" title="enum in org.apache.hadoop.hbase.procedure2">StateMachineProcedure.Flow</a>&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/procedure/TruncateTableProcedure.html#line.75">executeFromState</a>(<a href="../../../../../../org/apache/hadoop/hbase/master/procedure/MasterProcedureEnv.html" title="class in org.apache.hadoop.hbase.master.procedure">MasterProcedureEnv</a>&nbsp;env,
+<pre>protected&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/procedure2/StateMachineProcedure.Flow.html" title="enum in org.apache.hadoop.hbase.procedure2">StateMachineProcedure.Flow</a>&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/procedure/TruncateTableProcedure.html#line.76">executeFromState</a>(<a href="../../../../../../org/apache/hadoop/hbase/master/procedure/MasterProcedureEnv.html" title="class in org.apache.hadoop.hbase.master.procedure">MasterProcedureEnv</a>&nbsp;env,
                                                       org.apache.hadoop.hbase.shaded.protobuf.generated.MasterProcedureProtos.TruncateTableState&nbsp;state)
                                                throws <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/InterruptedException.html?is-external=true" title="class or interface in java.lang">InterruptedException</a></pre>
 <div class="block"><span class="descfrmTypeLabel">Description copied from class:&nbsp;<code><a href="../../../../../../org/apache/hadoop/hbase/procedure2/StateMachineProcedure.html#executeFromState-TEnvironment-TState-">StateMachineProcedure</a></code></span></div>
@@ -515,7 +519,7 @@ extends <a href="../../../../../../org/apache/hadoop/hbase/master/procedure/Abst
 <ul class="blockList">
 <li class="blockList">
 <h4>rollbackState</h4>
-<pre>protected&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/procedure/TruncateTableProcedure.html#line.158">rollbackState</a>(<a href="../../../../../../org/apache/hadoop/hbase/master/procedure/MasterProcedureEnv.html" title="class in org.apache.hadoop.hbase.master.procedure">MasterProcedureEnv</a>&nbsp;env,
+<pre>protected&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/procedure/TruncateTableProcedure.html#line.161">rollbackState</a>(<a href="../../../../../../org/apache/hadoop/hbase/master/procedure/MasterProcedureEnv.html" title="class in org.apache.hadoop.hbase.master.procedure">MasterProcedureEnv</a>&nbsp;env,
                              org.apache.hadoop.hbase.shaded.protobuf.generated.MasterProcedureProtos.TruncateTableState&nbsp;state)</pre>
 <div class="block"><span class="descfrmTypeLabel">Description copied from class:&nbsp;<code><a href="../../../../../../org/apache/hadoop/hbase/procedure2/StateMachineProcedure.html#rollbackState-TEnvironment-TState-">StateMachineProcedure</a></code></span></div>
 <div class="block">called to perform the rollback of the specified state</div>
@@ -532,7 +536,7 @@ extends <a href="../../../../../../org/apache/hadoop/hbase/master/procedure/Abst
 <ul class="blockList">
 <li class="blockList">
 <h4>completionCleanup</h4>
-<pre>protected&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/procedure/TruncateTableProcedure.html#line.171">completionCleanup</a>(<a href="../../../../../../org/apache/hadoop/hbase/master/procedure/MasterProcedureEnv.html" title="class in org.apache.hadoop.hbase.master.procedure">MasterProcedureEnv</a>&nbsp;env)</pre>
+<pre>protected&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/procedure/TruncateTableProcedure.html#line.174">completionCleanup</a>(<a href="../../../../../../org/apache/hadoop/hbase/master/procedure/MasterProcedureEnv.html" title="class in org.apache.hadoop.hbase.master.procedure">MasterProcedureEnv</a>&nbsp;env)</pre>
 <div class="block"><span class="descfrmTypeLabel">Description copied from class:&nbsp;<code><a href="../../../../../../org/apache/hadoop/hbase/procedure2/Procedure.html#completionCleanup-TEnvironment-">Procedure</a></code></span></div>
 <div class="block">Called when the procedure is marked as completed (success or rollback).
  The procedure implementor may use this method to cleanup in-memory states.
@@ -550,7 +554,7 @@ extends <a href="../../../../../../org/apache/hadoop/hbase/master/procedure/Abst
 <ul class="blockList">
 <li class="blockList">
 <h4>isRollbackSupported</h4>
-<pre>protected&nbsp;boolean&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/procedure/TruncateTableProcedure.html#line.176">isRollbackSupported</a>(org.apache.hadoop.hbase.shaded.protobuf.generated.MasterProcedureProtos.TruncateTableState&nbsp;state)</pre>
+<pre>protected&nbsp;boolean&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/procedure/TruncateTableProcedure.html#line.179">isRollbackSupported</a>(org.apache.hadoop.hbase.shaded.protobuf.generated.MasterProcedureProtos.TruncateTableState&nbsp;state)</pre>
 <div class="block"><span class="descfrmTypeLabel">Description copied from class:&nbsp;<code><a href="../../../../../../org/apache/hadoop/hbase/procedure2/StateMachineProcedure.html#isRollbackSupported-TState-">StateMachineProcedure</a></code></span></div>
 <div class="block">Used by the default implementation of abort() to know if the current state can be aborted
  and rollback can be triggered.</div>
@@ -566,7 +570,7 @@ extends <a href="../../../../../../org/apache/hadoop/hbase/master/procedure/Abst
 <ul class="blockList">
 <li class="blockList">
 <h4>getState</h4>
-<pre>protected&nbsp;org.apache.hadoop.hbase.shaded.protobuf.generated.MasterProcedureProtos.TruncateTableState&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/procedure/TruncateTableProcedure.html#line.186">getState</a>(int&nbsp;stateId)</pre>
+<pre>protected&nbsp;org.apache.hadoop.hbase.shaded.protobuf.generated.MasterProcedureProtos.TruncateTableState&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/procedure/TruncateTableProcedure.html#line.189">getState</a>(int&nbsp;stateId)</pre>
 <div class="block"><span class="descfrmTypeLabel">Description copied from class:&nbsp;<code><a href="../../../../../../org/apache/hadoop/hbase/procedure2/StateMachineProcedure.html#getState-int-">StateMachineProcedure</a></code></span></div>
 <div class="block">Convert an ordinal (or state id) to an Enum (or more descriptive) state object.</div>
 <dl>
@@ -585,7 +589,7 @@ extends <a href="../../../../../../org/apache/hadoop/hbase/master/procedure/Abst
 <ul class="blockList">
 <li class="blockList">
 <h4>getStateId</h4>
-<pre>protected&nbsp;int&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/procedure/TruncateTableProcedure.html#line.191">getStateId</a>(org.apache.hadoop.hbase.shaded.protobuf.generated.MasterProcedureProtos.TruncateTableState&nbsp;state)</pre>
+<pre>protected&nbsp;int&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/procedure/TruncateTableProcedure.html#line.194">getStateId</a>(org.apache.hadoop.hbase.shaded.protobuf.generated.MasterProcedureProtos.TruncateTableState&nbsp;state)</pre>
 <div class="block"><span class="descfrmTypeLabel">Description copied from class:&nbsp;<code><a href="../../../../../../org/apache/hadoop/hbase/procedure2/StateMachineProcedure.html#getStateId-TState-">StateMachineProcedure</a></code></span></div>
 <div class="block">Convert the Enum (or more descriptive) state object to an ordinal (or state id).</div>
 <dl>
@@ -604,7 +608,7 @@ extends <a href="../../../../../../org/apache/hadoop/hbase/master/procedure/Abst
 <ul class="blockList">
 <li class="blockList">
 <h4>getInitialState</h4>
-<pre>protected&nbsp;org.apache.hadoop.hbase.shaded.protobuf.generated.MasterProcedureProtos.TruncateTableState&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/procedure/TruncateTableProcedure.html#line.196">getInitialState</a>()</pre>
+<pre>protected&nbsp;org.apache.hadoop.hbase.shaded.protobuf.generated.MasterProcedureProtos.TruncateTableState&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/procedure/TruncateTableProcedure.html#line.199">getInitialState</a>()</pre>
 <div class="block"><span class="descfrmTypeLabel">Description copied from class:&nbsp;<code><a href="../../../../../../org/apache/hadoop/hbase/procedure2/StateMachineProcedure.html#getInitialState--">StateMachineProcedure</a></code></span></div>
 <div class="block">Return the initial state object that will be used for the first call to executeFromState().</div>
 <dl>
@@ -621,7 +625,7 @@ extends <a href="../../../../../../org/apache/hadoop/hbase/master/procedure/Abst
 <ul class="blockList">
 <li class="blockList">
 <h4>getTableName</h4>
-<pre>public&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/TableName.html" title="class in org.apache.hadoop.hbase">TableName</a>&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/procedure/TruncateTableProcedure.html#line.201">getTableName</a>()</pre>
+<pre>public&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/TableName.html" title="class in org.apache.hadoop.hbase">TableName</a>&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/procedure/TruncateTableProcedure.html#line.204">getTableName</a>()</pre>
 <dl>
 <dt><span class="overrideSpecifyLabel">Specified by:</span></dt>
 <dd><code><a href="../../../../../../org/apache/hadoop/hbase/master/procedure/TableProcedureInterface.html#getTableName--">getTableName</a></code>&nbsp;in interface&nbsp;<code><a href="../../../../../../org/apache/hadoop/hbase/master/procedure/TableProcedureInterface.html" title="interface in org.apache.hadoop.hbase.master.procedure">TableProcedureInterface</a></code></dd>
@@ -638,7 +642,7 @@ extends <a href="../../../../../../org/apache/hadoop/hbase/master/procedure/Abst
 <ul class="blockList">
 <li class="blockList">
 <h4>getTableOperationType</h4>
-<pre>public&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/master/procedure/TableProcedureInterface.TableOperationType.html" title="enum in org.apache.hadoop.hbase.master.procedure">TableProcedureInterface.TableOperationType</a>&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/procedure/TruncateTableProcedure.html#line.206">getTableOperationType</a>()</pre>
+<pre>public&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/master/procedure/TableProcedureInterface.TableOperationType.html" title="enum in org.apache.hadoop.hbase.master.procedure">TableProcedureInterface.TableOperationType</a>&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/procedure/TruncateTableProcedure.html#line.209">getTableOperationType</a>()</pre>
 <div class="block"><span class="descfrmTypeLabel">Description copied from interface:&nbsp;<code><a href="../../../../../../org/apache/hadoop/hbase/master/procedure/TableProcedureInterface.html#getTableOperationType--">TableProcedureInterface</a></code></span></div>
 <div class="block">Given an operation type we can take decisions about what to do with pending operations.
  e.g. if we get a delete and we have some table operation pending (e.g. add column)
@@ -659,7 +663,7 @@ extends <a href="../../../../../../org/apache/hadoop/hbase/master/procedure/Abst
 <ul class="blockList">
 <li class="blockList">
 <h4>toStringClassDetails</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/procedure/TruncateTableProcedure.html#line.211">toStringClassDetails</a>(<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/StringBuilder.html?is-external=true" title="class or interface in java.lang">StringBuilder</a>&nbsp;sb)</pre>
+<pre>public&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/procedure/TruncateTableProcedure.html#line.214">toStringClassDetails</a>(<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/StringBuilder.html?is-external=true" title="class or interface in java.lang">StringBuilder</a>&nbsp;sb)</pre>
 <div class="block"><span class="descfrmTypeLabel">Description copied from class:&nbsp;<code><a href="../../../../../../org/apache/hadoop/hbase/procedure2/Procedure.html#toStringClassDetails-java.lang.StringBuilder-">Procedure</a></code></span></div>
 <div class="block">Extend the toString() information with the procedure details
  e.g. className and parameters</div>
@@ -677,7 +681,7 @@ extends <a href="../../../../../../org/apache/hadoop/hbase/master/procedure/Abst
 <ul class="blockList">
 <li class="blockList">
 <h4>serializeStateData</h4>
-<pre>protected&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/procedure/TruncateTableProcedure.html#line.221">serializeStateData</a>(<a href="../../../../../../org/apache/hadoop/hbase/procedure2/ProcedureStateSerializer.html" title="interface in org.apache.hadoop.hbase.procedure2">ProcedureStateSerializer</a>&nbsp;serializer)
+<pre>protected&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/procedure/TruncateTableProcedure.html#line.224">serializeStateData</a>(<a href="../../../../../../org/apache/hadoop/hbase/procedure2/ProcedureStateSerializer.html" title="interface in org.apache.hadoop.hbase.procedure2">ProcedureStateSerializer</a>&nbsp;serializer)
                            throws <a href="https://docs.oracle.com/javase/8/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</a></pre>
 <div class="block"><span class="descfrmTypeLabel">Description copied from class:&nbsp;<code><a href="../../../../../../org/apache/hadoop/hbase/procedure2/Procedure.html#serializeStateData-org.apache.hadoop.hbase.procedure2.ProcedureStateSerializer-">Procedure</a></code></span></div>
 <div class="block">The user-level code of the procedure may have some state to
@@ -699,7 +703,7 @@ extends <a href="../../../../../../org/apache/hadoop/hbase/master/procedure/Abst
 <ul class="blockList">
 <li class="blockList">
 <h4>deserializeStateData</h4>
-<pre>protected&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/procedure/TruncateTableProcedure.html#line.243">deserializeStateData</a>(<a href="../../../../../../org/apache/hadoop/hbase/procedure2/ProcedureStateSerializer.html" title="interface in org.apache.hadoop.hbase.procedure2">ProcedureStateSerializer</a>&nbsp;serializer)
+<pre>protected&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/procedure/TruncateTableProcedure.html#line.246">deserializeStateData</a>(<a href="../../../../../../org/apache/hadoop/hbase/procedure2/ProcedureStateSerializer.html" title="interface in org.apache.hadoop.hbase.procedure2">ProcedureStateSerializer</a>&nbsp;serializer)
                              throws <a href="https://docs.oracle.com/javase/8/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</a></pre>
 <div class="block"><span class="descfrmTypeLabel">Description copied from class:&nbsp;<code><a href="../../../../../../org/apache/hadoop/hbase/procedure2/Procedure.html#deserializeStateData-org.apache.hadoop.hbase.procedure2.ProcedureStateSerializer-">Procedure</a></code></span></div>
 <div class="block">Called on store load to allow the user to decode the previously serialized
@@ -720,7 +724,7 @@ extends <a href="../../../../../../org/apache/hadoop/hbase/master/procedure/Abst
 <ul class="blockList">
 <li class="blockList">
 <h4>recreateRegionInfo</h4>
-<pre>private static&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/util/List.html?is-external=true" title="class or interface in java.util">List</a>&lt;<a href="../../../../../../org/apache/hadoop/hbase/client/RegionInfo.html" title="interface in org.apache.hadoop.hbase.client">RegionInfo</a>&gt;&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/procedure/TruncateTableProcedure.html#line.267">recreateRegionInfo</a>(<a href="https://docs.oracle.com/javase/8/docs/api/java/util/List.html?is-external=true" title="class or interface in java.util">List</a>&lt;<a href="../../../../../../org/apache/hadoop/hbase/client/RegionInfo.html" title="interface in org.apache.hadoop.hbase.client">RegionInfo</a>&gt;&nbsp;regions)</pre>
+<pre>private static&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/util/List.html?is-external=true" title="class or interface in java.util">List</a>&lt;<a href="../../../../../../org/apache/hadoop/hbase/client/RegionInfo.html" title="interface in org.apache.hadoop.hbase.client">RegionInfo</a>&gt;&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/procedure/TruncateTableProcedure.html#line.270">recreateRegionInfo</a>(<a href="https://docs.oracle.com/javase/8/docs/api/java/util/List.html?is-external=true" title="class or interface in java.util">List</a>&lt;<a href="../../../../../../org/apache/hadoop/hbase/client/RegionInfo.html" title="interface in org.apache.hadoop.hbase.client">RegionInfo</a>&gt;&nbsp;regions)</pre>
 </li>
 </ul>
 <a name="prepareTruncate-org.apache.hadoop.hbase.master.procedure.MasterProcedureEnv-">
@@ -729,7 +733,7 @@ extends <a href="../../../../../../org/apache/hadoop/hbase/master/procedure/Abst
 <ul class="blockList">
 <li class="blockList">
 <h4>prepareTruncate</h4>
-<pre>private&nbsp;boolean&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/procedure/TruncateTableProcedure.html#line.278">prepareTruncate</a>(<a href="../../../../../../org/apache/hadoop/hbase/master/procedure/MasterProcedureEnv.html" title="class in org.apache.hadoop.hbase.master.procedure">MasterProcedureEnv</a>&nbsp;env)
+<pre>private&nbsp;boolean&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/procedure/TruncateTableProcedure.html#line.281">prepareTruncate</a>(<a href="../../../../../../org/apache/hadoop/hbase/master/procedure/MasterProcedureEnv.html" title="class in org.apache.hadoop.hbase.master.procedure">MasterProcedureEnv</a>&nbsp;env)
                          throws <a href="https://docs.oracle.com/javase/8/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</a></pre>
 <dl>
 <dt><span class="throwsLabel">Throws:</span></dt>
@@ -743,7 +747,7 @@ extends <a href="../../../../../../org/apache/hadoop/hbase/master/procedure/Abst
 <ul class="blockList">
 <li class="blockList">
 <h4>preTruncate</h4>
-<pre>private&nbsp;boolean&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/procedure/TruncateTableProcedure.html#line.288">preTruncate</a>(<a href="../../../../../../org/apache/hadoop/hbase/master/procedure/MasterProcedureEnv.html" title="class in org.apache.hadoop.hbase.master.procedure">MasterProcedureEnv</a>&nbsp;env)
+<pre>private&nbsp;boolean&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/procedure/TruncateTableProcedure.html#line.291">preTruncate</a>(<a href="../../../../../../org/apache/hadoop/hbase/master/procedure/MasterProcedureEnv.html" title="class in org.apache.hadoop.hbase.master.procedure">MasterProcedureEnv</a>&nbsp;env)
                      throws <a href="https://docs.oracle.com/javase/8/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</a>,
                             <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/InterruptedException.html?is-external=true" title="class or interface in java.lang">InterruptedException</a></pre>
 <dl>
@@ -756,10 +760,10 @@ extends <a href="../../../../../../org/apache/hadoop/hbase/master/procedure/Abst
 <a name="postTruncate-org.apache.hadoop.hbase.master.procedure.MasterProcedureEnv-">
 <!--   -->
 </a>
-<ul class="blockListLast">
+<ul class="blockList">
 <li class="blockList">
 <h4>postTruncate</h4>
-<pre>private&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/procedure/TruncateTableProcedure.html#line.298">postTruncate</a>(<a href="../../../../../../org/apache/hadoop/hbase/master/procedure/MasterProcedureEnv.html" title="class in org.apache.hadoop.hbase.master.procedure">MasterProcedureEnv</a>&nbsp;env)
+<pre>private&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/procedure/TruncateTableProcedure.html#line.301">postTruncate</a>(<a href="../../../../../../org/apache/hadoop/hbase/master/procedure/MasterProcedureEnv.html" title="class in org.apache.hadoop.hbase.master.procedure">MasterProcedureEnv</a>&nbsp;env)
                    throws <a href="https://docs.oracle.com/javase/8/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</a>,
                           <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/InterruptedException.html?is-external=true" title="class or interface in java.lang">InterruptedException</a></pre>
 <dl>
@@ -769,6 +773,15 @@ extends <a href="../../../../../../org/apache/hadoop/hbase/master/procedure/Abst
 </dl>
 </li>
 </ul>
+<a name="getFirstRegionInfo--">
+<!--   -->
+</a>
+<ul class="blockListLast">
+<li class="blockList">
+<h4>getFirstRegionInfo</h4>
+<pre><a href="../../../../../../org/apache/hadoop/hbase/client/RegionInfo.html" title="interface in org.apache.hadoop.hbase.client">RegionInfo</a>&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/procedure/TruncateTableProcedure.html#line.311">getFirstRegionInfo</a>()</pre>
+</li>
+</ul>
 </li>
 </ul>
 </li>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/621479e1/devapidocs/org/apache/hadoop/hbase/master/replication/UpdatePeerConfigProcedure.html
----------------------------------------------------------------------
diff --git a/devapidocs/org/apache/hadoop/hbase/master/replication/UpdatePeerConfigProcedure.html b/devapidocs/org/apache/hadoop/hbase/master/replication/UpdatePeerConfigProcedure.html
index 9caa20d..4783645 100644
--- a/devapidocs/org/apache/hadoop/hbase/master/replication/UpdatePeerConfigProcedure.html
+++ b/devapidocs/org/apache/hadoop/hbase/master/replication/UpdatePeerConfigProcedure.html
@@ -636,7 +636,7 @@ extends <a href="../../../../../../org/apache/hadoop/hbase/master/replication/Mo
 <ul class="blockListLast">
 <li class="blockList">
 <h4>deserializeStateData</h4>
-<pre>protected&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/replication/UpdatePeerConfigProcedure.html#line.216">deserializeStateData</a>(<a href="../../../../../../org/apache/hadoop/hbase/procedure2/ProcedureStateSerializer.html" title="interface in org.apache.hadoop.hbase.procedure2">ProcedureStateSerializer</a>&nbsp;serializer)
+<pre>protected&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/replication/UpdatePeerConfigProcedure.html#line.217">deserializeStateData</a>(<a href="../../../../../../org/apache/hadoop/hbase/procedure2/ProcedureStateSerializer.html" title="interface in org.apache.hadoop.hbase.procedure2">ProcedureStateSerializer</a>&nbsp;serializer)
                              throws <a href="https://docs.oracle.com/javase/8/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</a></pre>
 <div class="block"><span class="descfrmTypeLabel">Description copied from class:&nbsp;<code><a href="../../../../../../org/apache/hadoop/hbase/procedure2/Procedure.html#deserializeStateData-org.apache.hadoop.hbase.procedure2.ProcedureStateSerializer-">Procedure</a></code></span></div>
 <div class="block">Called on store load to allow the user to decode the previously serialized

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/621479e1/devapidocs/org/apache/hadoop/hbase/monitoring/package-tree.html
----------------------------------------------------------------------
diff --git a/devapidocs/org/apache/hadoop/hbase/monitoring/package-tree.html b/devapidocs/org/apache/hadoop/hbase/monitoring/package-tree.html
index 9eb46aa..3e1ea7f 100644
--- a/devapidocs/org/apache/hadoop/hbase/monitoring/package-tree.html
+++ b/devapidocs/org/apache/hadoop/hbase/monitoring/package-tree.html
@@ -125,8 +125,8 @@
 <ul>
 <li type="circle">java.lang.<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Enum.html?is-external=true" title="class or interface in java.lang"><span class="typeNameLink">Enum</span></a>&lt;E&gt; (implements java.lang.<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Comparable.html?is-external=true" title="class or interface in java.lang">Comparable</a>&lt;T&gt;, java.io.<a href="https://docs.oracle.com/javase/8/docs/api/java/io/Serializable.html?is-external=true" title="class or interface in java.io">Serializable</a>)
 <ul>
-<li type="circle">org.apache.hadoop.hbase.monitoring.<a href="../../../../../org/apache/hadoop/hbase/monitoring/MonitoredTask.State.html" title="enum in org.apache.hadoop.hbase.monitoring"><span class="typeNameLink">MonitoredTask.State</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.monitoring.<a href="../../../../../org/apache/hadoop/hbase/monitoring/TaskMonitor.TaskFilter.TaskType.html" title="enum in org.apache.hadoop.hbase.monitoring"><span class="typeNameLink">TaskMonitor.TaskFilter.TaskType</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.monitoring.<a href="../../../../../org/apache/hadoop/hbase/monitoring/MonitoredTask.State.html" title="enum in org.apache.hadoop.hbase.monitoring"><span class="typeNameLink">MonitoredTask.State</span></a></li>
 </ul>
 </li>
 </ul>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/621479e1/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 38df5bd..7a840cb 100644
--- a/devapidocs/org/apache/hadoop/hbase/package-tree.html
+++ b/devapidocs/org/apache/hadoop/hbase/package-tree.html
@@ -437,19 +437,19 @@
 <ul>
 <li type="circle">java.lang.<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Enum.html?is-external=true" title="class or interface in java.lang"><span class="typeNameLink">Enum</span></a>&lt;E&gt; (implements java.lang.<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Comparable.html?is-external=true" title="class or interface in java.lang">Comparable</a>&lt;T&gt;, java.io.<a href="https://docs.oracle.com/javase/8/docs/api/java/io/Serializable.html?is-external=true" title="class or interface in java.io">Serializable</a>)
 <ul>
-<li type="circle">org.apache.hadoop.hbase.<a href="../../../../org/apache/hadoop/hbase/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/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/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/MetaTableAccessor.QueryType.html" title="enum in org.apache.hadoop.hbase"><span class="typeNameLink">MetaTableAccessor.QueryType</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.<a href="../../../../org/apache/hadoop/hbase/CompareOperator.html" title="enum in org.apache.hadoop.hbase"><span class="typeNameLink">CompareOperator</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.<a href="../../../../org/apache/hadoop/hbase/MemoryCompactionPolicy.html" title="enum in org.apache.hadoop.hbase"><span class="typeNameLink">MemoryCompactionPolicy</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.<a href="../../../../org/apache/hadoop/hbase/Size.Unit.html" title="enum in org.apache.hadoop.hbase"><span class="typeNameLink">Size.Unit</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.<a href="../../../../org/apache/hadoop/hbase/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/HealthChecker.HealthCheckerExitStatus.html" title="enum in org.apache.hadoop.hbase"><span class="typeNameLink">HealthChecker.HealthCheckerExitStatus</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.<a href="../../../../org/apache/hadoop/hbase/Cell.Type.html" title="enum in org.apache.hadoop.hbase"><span class="typeNameLink">Cell.Type</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.<a href="../../../../org/apache/hadoop/hbase/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/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/CompareOperator.html" title="enum in org.apache.hadoop.hbase"><span class="typeNameLink">CompareOperator</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.<a href="../../../../org/apache/hadoop/hbase/Coprocessor.State.html" title="enum in org.apache.hadoop.hbase"><span class="typeNameLink">Coprocessor.State</span></a></li>
-<li type="circle">org.apache.hadoop.hbase.<a href="../../../../org/apache/hadoop/hbase/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/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/Size.Unit.html" title="enum in org.apache.hadoop.hbase"><span class="typeNameLink">Size.Unit</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.<a href="../../../../org/apache/hadoop/hbase/KeepDeletedCells.html" title="enum in org.apache.hadoop.hbase"><span class="typeNameLink">KeepDeletedCells</span></a></li>
 </ul>
 </li>
 </ul>

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

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/621479e1/devapidocs/org/apache/hadoop/hbase/quotas/SpaceQuotaRefresherChore.html
----------------------------------------------------------------------
diff --git a/devapidocs/org/apache/hadoop/hbase/quotas/SpaceQuotaRefresherChore.html b/devapidocs/org/apache/hadoop/hbase/quotas/SpaceQuotaRefresherChore.html
index 43908ac..b298519 100644
--- a/devapidocs/org/apache/hadoop/hbase/quotas/SpaceQuotaRefresherChore.html
+++ b/devapidocs/org/apache/hadoop/hbase/quotas/SpaceQuotaRefresherChore.html
@@ -479,7 +479,7 @@ extends <a href="../../../../../org/apache/hadoop/hbase/ScheduledChore.html" tit
 <ul class="blockList">
 <li class="blockList">
 <h4>isInViolation</h4>
-<pre>boolean&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/quotas/SpaceQuotaRefresherChore.html#line.135">isInViolation</a>(<a href="../../../../../org/apache/hadoop/hbase/quotas/SpaceQuotaSnapshot.html" title="class in org.apache.hadoop.hbase.quotas">SpaceQuotaSnapshot</a>&nbsp;snapshot)</pre>
+<pre>boolean&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/quotas/SpaceQuotaRefresherChore.html#line.146">isInViolation</a>(<a href="../../../../../org/apache/hadoop/hbase/quotas/SpaceQuotaSnapshot.html" title="class in org.apache.hadoop.hbase.quotas">SpaceQuotaSnapshot</a>&nbsp;snapshot)</pre>
 <div class="block">Checks if the given <code>snapshot</code> is in violation, allowing the snapshot to be null.
  If the snapshot is null, this is interpreted as no snapshot which implies not in violation.</div>
 <dl>
@@ -496,7 +496,7 @@ extends <a href="../../../../../org/apache/hadoop/hbase/ScheduledChore.html" tit
 <ul class="blockList">
 <li class="blockList">
 <h4>fetchSnapshotsFromQuotaTable</h4>
-<pre>public&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/util/Map.html?is-external=true" title="class or interface in java.util">Map</a>&lt;<a href="../../../../../org/apache/hadoop/hbase/TableName.html" title="class in org.apache.hadoop.hbase">TableName</a>,<a href="../../../../../org/apache/hadoop/hbase/quotas/SpaceQuotaSnapshot.html" title="class in org.apache.hadoop.hbase.quotas">SpaceQuotaSnapshot</a>&gt;&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/quotas/SpaceQuotaRefresherChore.html#line.147">fetchSnapshotsFromQuotaTable</a>()
+<pre>public&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/util/Map.html?is-external=true" title="class or interface in java.util">Map</a>&lt;<a href="../../../../../org/apache/hadoop/hbase/TableName.html" title="class in org.apache.hadoop.hbase">TableName</a>,<a href="../../../../../org/apache/hadoop/hbase/quotas/SpaceQuotaSnapshot.html" title="class in org.apache.hadoop.hbase.quotas">SpaceQuotaSnapshot</a>&gt;&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/quotas/SpaceQuotaRefresherChore.html#line.158">fetchSnapshotsFromQuotaTable</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">Reads all quota snapshots from the quota table.</div>
 <dl>
@@ -513,7 +513,7 @@ extends <a href="../../../../../org/apache/hadoop/hbase/ScheduledChore.html" tit
 <ul class="blockList">
 <li class="blockList">
 <h4>extractQuotaSnapshot</h4>
-<pre>void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/quotas/SpaceQuotaRefresherChore.html#line.167">extractQuotaSnapshot</a>(<a href="../../../../../org/apache/hadoop/hbase/client/Result.html" title="class in org.apache.hadoop.hbase.client">Result</a>&nbsp;result,
+<pre>void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/quotas/SpaceQuotaRefresherChore.html#line.178">extractQuotaSnapshot</a>(<a href="../../../../../org/apache/hadoop/hbase/client/Result.html" title="class in org.apache.hadoop.hbase.client">Result</a>&nbsp;result,
                           <a href="https://docs.oracle.com/javase/8/docs/api/java/util/Map.html?is-external=true" title="class or interface in java.util">Map</a>&lt;<a href="../../../../../org/apache/hadoop/hbase/TableName.html" title="class in org.apache.hadoop.hbase">TableName</a>,<a href="../../../../../org/apache/hadoop/hbase/quotas/SpaceQuotaSnapshot.html" title="class in org.apache.hadoop.hbase.quotas">SpaceQuotaSnapshot</a>&gt;&nbsp;snapshots)</pre>
 <div class="block">Wrapper around <a href="../../../../../org/apache/hadoop/hbase/quotas/QuotaTableUtil.html#extractQuotaSnapshot-org.apache.hadoop.hbase.client.Result-java.util.Map-"><code>QuotaTableUtil.extractQuotaSnapshot(Result, Map)</code></a> for testing.</div>
 </li>
@@ -524,7 +524,7 @@ extends <a href="../../../../../org/apache/hadoop/hbase/ScheduledChore.html" tit
 <ul class="blockList">
 <li class="blockList">
 <h4>getConnection</h4>
-<pre><a href="../../../../../org/apache/hadoop/hbase/client/Connection.html" title="interface in org.apache.hadoop.hbase.client">Connection</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/quotas/SpaceQuotaRefresherChore.html#line.171">getConnection</a>()</pre>
+<pre><a href="../../../../../org/apache/hadoop/hbase/client/Connection.html" title="interface in org.apache.hadoop.hbase.client">Connection</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/quotas/SpaceQuotaRefresherChore.html#line.182">getConnection</a>()</pre>
 </li>
 </ul>
 <a name="getManager--">
@@ -533,7 +533,7 @@ extends <a href="../../../../../org/apache/hadoop/hbase/ScheduledChore.html" tit
 <ul class="blockList">
 <li class="blockList">
 <h4>getManager</h4>
-<pre><a href="../../../../../org/apache/hadoop/hbase/quotas/RegionServerSpaceQuotaManager.html" title="class in org.apache.hadoop.hbase.quotas">RegionServerSpaceQuotaManager</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/quotas/SpaceQuotaRefresherChore.html#line.175">getManager</a>()</pre>
+<pre><a href="../../../../../org/apache/hadoop/hbase/quotas/RegionServerSpaceQuotaManager.html" title="class in org.apache.hadoop.hbase.quotas">RegionServerSpaceQuotaManager</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/quotas/SpaceQuotaRefresherChore.html#line.186">getManager</a>()</pre>
 </li>
 </ul>
 <a name="getPeriod-org.apache.hadoop.conf.Configuration-">
@@ -542,7 +542,7 @@ extends <a href="../../../../../org/apache/hadoop/hbase/ScheduledChore.html" tit
 <ul class="blockList">
 <li class="blockList">
 <h4>getPeriod</h4>
-<pre>static&nbsp;int&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/quotas/SpaceQuotaRefresherChore.html#line.185">getPeriod</a>(org.apache.hadoop.conf.Configuration&nbsp;conf)</pre>
+<pre>static&nbsp;int&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/quotas/SpaceQuotaRefresherChore.html#line.196">getPeriod</a>(org.apache.hadoop.conf.Configuration&nbsp;conf)</pre>
 <div class="block">Extracts the period for the chore from the configuration.</div>
 <dl>
 <dt><span class="paramLabel">Parameters:</span></dt>
@@ -558,7 +558,7 @@ extends <a href="../../../../../org/apache/hadoop/hbase/ScheduledChore.html" tit
 <ul class="blockList">
 <li class="blockList">
 <h4>getInitialDelay</h4>
-<pre>static&nbsp;long&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/quotas/SpaceQuotaRefresherChore.html#line.196">getInitialDelay</a>(org.apache.hadoop.conf.Configuration&nbsp;conf)</pre>
+<pre>static&nbsp;long&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/quotas/SpaceQuotaRefresherChore.html#line.207">getInitialDelay</a>(org.apache.hadoop.conf.Configuration&nbsp;conf)</pre>
 <div class="block">Extracts the initial delay for the chore from the configuration.</div>
 <dl>
 <dt><span class="paramLabel">Parameters:</span></dt>
@@ -574,7 +574,7 @@ extends <a href="../../../../../org/apache/hadoop/hbase/ScheduledChore.html" tit
 <ul class="blockList">
 <li class="blockList">
 <h4>getTimeUnit</h4>
-<pre>static&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/util/concurrent/TimeUnit.html?is-external=true" title="class or interface in java.util.concurrent">TimeUnit</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/quotas/SpaceQuotaRefresherChore.html#line.209">getTimeUnit</a>(org.apache.hadoop.conf.Configuration&nbsp;conf)</pre>
+<pre>static&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/util/concurrent/TimeUnit.html?is-external=true" title="class or interface in java.util.concurrent">TimeUnit</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/quotas/SpaceQuotaRefresherChore.html#line.220">getTimeUnit</a>(org.apache.hadoop.conf.Configuration&nbsp;conf)</pre>
 <div class="block">Extracts the time unit for the chore period and initial delay from the configuration. The
  configuration value for <a href="../../../../../org/apache/hadoop/hbase/quotas/SpaceQuotaRefresherChore.html#POLICY_REFRESHER_CHORE_TIMEUNIT_KEY"><code>POLICY_REFRESHER_CHORE_TIMEUNIT_KEY</code></a> must correspond to
  a <a href="https://docs.oracle.com/javase/8/docs/api/java/util/concurrent/TimeUnit.html?is-external=true" title="class or interface in java.util.concurrent"><code>TimeUnit</code></a> value.</div>
@@ -592,7 +592,7 @@ extends <a href="../../../../../org/apache/hadoop/hbase/ScheduledChore.html" tit
 <ul class="blockListLast">
 <li class="blockList">
 <h4>getRegionReportPercent</h4>
-<pre>static&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Double.html?is-external=true" title="class or interface in java.lang">Double</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/quotas/SpaceQuotaRefresherChore.html#line.221">getRegionReportPercent</a>(org.apache.hadoop.conf.Configuration&nbsp;conf)</pre>
+<pre>static&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Double.html?is-external=true" title="class or interface in java.lang">Double</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/quotas/SpaceQuotaRefresherChore.html#line.232">getRegionReportPercent</a>(org.apache.hadoop.conf.Configuration&nbsp;conf)</pre>
 <div class="block">Extracts the percent of Regions for a table to have been reported to enable quota violation
  state change.</div>
 <dl>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/621479e1/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 1b90d1c..7dce4a6 100644
--- a/devapidocs/org/apache/hadoop/hbase/quotas/package-tree.html
+++ b/devapidocs/org/apache/hadoop/hbase/quotas/package-tree.html
@@ -231,11 +231,11 @@
 <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/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/SpaceViolationPolicy.html" title="enum in org.apache.hadoop.hbase.quotas"><span class="typeNameLink">SpaceViolationPolicy</span></a></li>
-<li type="circle">org.apache.hadoop.hbase.quotas.<a href="../../../../../org/apache/hadoop/hbase/quotas/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/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/SpaceViolationPolicy.html" title="enum in org.apache.hadoop.hbase.quotas"><span class="typeNameLink">SpaceViolationPolicy</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.quotas.<a href="../../../../../org/apache/hadoop/hbase/quotas/ThrottleType.html" title="enum in org.apache.hadoop.hbase.quotas"><span class="typeNameLink">ThrottleType</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.quotas.<a href="../../../../../org/apache/hadoop/hbase/quotas/OperationQuota.OperationType.html" title="enum in org.apache.hadoop.hbase.quotas"><span class="typeNameLink">OperationQuota.OperationType</span></a></li>
 </ul>
 </li>
 </ul>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/621479e1/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 a57c9f0..f679c7b 100644
--- a/devapidocs/org/apache/hadoop/hbase/regionserver/package-tree.html
+++ b/devapidocs/org/apache/hadoop/hbase/regionserver/package-tree.html
@@ -703,20 +703,20 @@
 <ul>
 <li type="circle">java.lang.<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Enum.html?is-external=true" title="class or interface in java.lang"><span class="typeNameLink">Enum</span></a>&lt;E&gt; (implements java.lang.<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Comparable.html?is-external=true" title="class or interface in java.lang">Comparable</a>&lt;T&gt;, java.io.<a href="https://docs.oracle.com/javase/8/docs/api/java/io/Serializable.html?is-external=true" title="class or interface in java.io">Serializable</a>)
 <ul>
-<li type="circle">org.apache.hadoop.hbase.regionserver.<a href="../../../../../org/apache/hadoop/hbase/regionserver/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/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/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/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/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/HRegion.FlushResult.Result.html" title="enum in org.apache.hadoop.hbase.regionserver"><span class="typeNameLink">HRegion.FlushResult.Result</span></a></li>
-<li type="circle">org.apache.hadoop.hbase.regionserver.<a href="../../../../../org/apache/hadoop/hbase/regionserver/ChunkCreator.ChunkType.html" title="enum in org.apache.hadoop.hbase.regionserver"><span class="typeNameLink">ChunkCreator.ChunkType</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.regionserver.<a href="../../../../../org/apache/hadoop/hbase/regionserver/BloomType.html" title="enum in org.apache.hadoop.hbase.regionserver"><span class="typeNameLink">BloomType</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.regionserver.<a href="../../../../../org/apache/hadoop/hbase/regionserver/ScanType.html" title="enum in org.apache.hadoop.hbase.regionserver"><span class="typeNameLink">ScanType</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.regionserver.<a href="../../../../../org/apache/hadoop/hbase/regionserver/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/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/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/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/FlushType.html" title="enum in org.apache.hadoop.hbase.regionserver"><span class="typeNameLink">FlushType</span></a></li>
-<li type="circle">org.apache.hadoop.hbase.regionserver.<a href="../../../../../org/apache/hadoop/hbase/regionserver/Region.Operation.html" title="enum in org.apache.hadoop.hbase.regionserver"><span class="typeNameLink">Region.Operation</span></a></li>
-<li type="circle">org.apache.hadoop.hbase.regionserver.<a href="../../../../../org/apache/hadoop/hbase/regionserver/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/MemStoreCompactionStrategy.Action.html" title="enum in org.apache.hadoop.hbase.regionserver"><span class="typeNameLink">MemStoreCompactionStrategy.Action</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.regionserver.<a href="../../../../../org/apache/hadoop/hbase/regionserver/ChunkCreator.ChunkType.html" title="enum in org.apache.hadoop.hbase.regionserver"><span class="typeNameLink">ChunkCreator.ChunkType</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.regionserver.<a href="../../../../../org/apache/hadoop/hbase/regionserver/MetricsRegionServerSourceFactoryImpl.FactoryStorage.html" title="enum in org.apache.hadoop.hbase.regionserver"><span class="typeNameLink">MetricsRegionServerSourceFactoryImpl.FactoryStorage</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.regionserver.<a href="../../../../../org/apache/hadoop/hbase/regionserver/CompactingMemStore.IndexType.html" title="enum in org.apache.hadoop.hbase.regionserver"><span class="typeNameLink">CompactingMemStore.IndexType</span></a></li>
 </ul>
 </li>
 </ul>

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

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/621479e1/devapidocs/org/apache/hadoop/hbase/rsgroup/RSGroupBasedLoadBalancer.html
----------------------------------------------------------------------
diff --git a/devapidocs/org/apache/hadoop/hbase/rsgroup/RSGroupBasedLoadBalancer.html b/devapidocs/org/apache/hadoop/hbase/rsgroup/RSGroupBasedLoadBalancer.html
index f13a3ef..4660147 100644
--- a/devapidocs/org/apache/hadoop/hbase/rsgroup/RSGroupBasedLoadBalancer.html
+++ b/devapidocs/org/apache/hadoop/hbase/rsgroup/RSGroupBasedLoadBalancer.html
@@ -18,7 +18,7 @@
     catch(err) {
     }
 //-->
-var methods = {"i0":10,"i1":10,"i2":10,"i3":10,"i4":10,"i5":10,"i6":10,"i7":10,"i8":10,"i9":10,"i10":10,"i11":10,"i12":10,"i13":10,"i14":10,"i15":10,"i16":10,"i17":10,"i18":10,"i19":10,"i20":10,"i21":10,"i22":10};
+var methods = {"i0":10,"i1":10,"i2":10,"i3":10,"i4":10,"i5":10,"i6":10,"i7":10,"i8":10,"i9":10,"i10":10,"i11":10,"i12":10,"i13":10,"i14":10,"i15":10,"i16":10,"i17":10,"i18":10,"i19":10,"i20":10,"i21":10,"i22":10,"i23":10};
 var tabs = {65535:["t0","All Methods"],2:["t2","Instance Methods"],8:["t4","Concrete Methods"]};
 var altColor = "altColor";
 var rowColor = "rowColor";
@@ -284,66 +284,72 @@ implements <a href="../../../../../org/apache/hadoop/hbase/rsgroup/RSGroupableBa
 </td>
 </tr>
 <tr id="i12" class="altColor">
+<td class="colFirst"><code>void</code></td>
+<td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/rsgroup/RSGroupBasedLoadBalancer.html#postMasterStartupInitialize--">postMasterStartupInitialize</a></span>()</code>
+<div class="block">If balancer needs to do initialization after Master has started up, lets do that here.</div>
+</td>
+</tr>
+<tr id="i13" class="rowColor">
 <td class="colFirst"><code><a href="../../../../../org/apache/hadoop/hbase/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a></code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/rsgroup/RSGroupBasedLoadBalancer.html#randomAssignment-org.apache.hadoop.hbase.client.RegionInfo-java.util.List-">randomAssignment</a></span>(<a href="../../../../../org/apache/hadoop/hbase/client/RegionInfo.html" title="interface in org.apache.hadoop.hbase.client">RegionInfo</a>&nbsp;region,
                 <a href="https://docs.oracle.com/javase/8/docs/api/java/util/List.html?is-external=true" title="class or interface in java.util">List</a>&lt;<a href="../../../../../org/apache/hadoop/hbase/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a>&gt;&nbsp;servers)</code>
 <div class="block">Get a random region server from the list</div>
 </td>
 </tr>
-<tr id="i13" class="rowColor">
+<tr id="i14" class="altColor">
 <td class="colFirst"><code>void</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/rsgroup/RSGroupBasedLoadBalancer.html#regionOffline-org.apache.hadoop.hbase.client.RegionInfo-">regionOffline</a></span>(<a href="../../../../../org/apache/hadoop/hbase/client/RegionInfo.html" title="interface in org.apache.hadoop.hbase.client">RegionInfo</a>&nbsp;regionInfo)</code>
 <div class="block">Marks the region as offline at balancer.</div>
 </td>
 </tr>
-<tr id="i14" class="altColor">
+<tr id="i15" class="rowColor">
 <td class="colFirst"><code>void</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/rsgroup/RSGroupBasedLoadBalancer.html#regionOnline-org.apache.hadoop.hbase.client.RegionInfo-org.apache.hadoop.hbase.ServerName-">regionOnline</a></span>(<a href="../../../../../org/apache/hadoop/hbase/client/RegionInfo.html" title="interface in org.apache.hadoop.hbase.client">RegionInfo</a>&nbsp;regionInfo,
             <a href="../../../../../org/apache/hadoop/hbase/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a>&nbsp;sn)</code>
 <div class="block">Marks the region as online at balancer.</div>
 </td>
 </tr>
-<tr id="i15" class="rowColor">
+<tr id="i16" class="altColor">
 <td class="colFirst"><code><a href="https://docs.oracle.com/javase/8/docs/api/java/util/Map.html?is-external=true" title="class or interface in java.util">Map</a>&lt;<a href="../../../../../org/apache/hadoop/hbase/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a>,<a href="https://docs.oracle.com/javase/8/docs/api/java/util/List.html?is-external=true" title="class or interface in java.util">List</a>&lt;<a href="../../../../../org/apache/hadoop/hbase/client/RegionInfo.html" title="interface in org.apache.hadoop.hbase.client">RegionInfo</a>&gt;&gt;</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/rsgroup/RSGroupBasedLoadBalancer.html#retainAssignment-java.util.Map-java.util.List-">retainAssignment</a></span>(<a href="https://docs.oracle.com/javase/8/docs/api/java/util/Map.html?is-external=true" title="class or interface in java.util">Map</a>&lt;<a href="../../../../../org/apache/hadoop/hbase/client/RegionInfo.html" title="interface in org.apache.hadoop.hbase.client">RegionInfo</a>,<a href="../../../../../org/apache/hadoop/hbase/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a>&gt;&nbsp;regions,
                 <a href="https://docs.oracle.com/javase/8/docs/api/java/util/List.html?is-external=true" title="class or interface in java.util">List</a>&lt;<a href="../../../../../org/apache/hadoop/hbase/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a>&gt;&nbsp;servers)</code>
 <div class="block">Assign regions to the previously hosting region server</div>
 </td>
 </tr>
-<tr id="i16" class="altColor">
+<tr id="i17" class="rowColor">
 <td class="colFirst"><code><a href="https://docs.oracle.com/javase/8/docs/api/java/util/Map.html?is-external=true" title="class or interface in java.util">Map</a>&lt;<a href="../../../../../org/apache/hadoop/hbase/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a>,<a href="https://docs.oracle.com/javase/8/docs/api/java/util/List.html?is-external=true" title="class or interface in java.util">List</a>&lt;<a href="../../../../../org/apache/hadoop/hbase/client/RegionInfo.html" title="interface in org.apache.hadoop.hbase.client">RegionInfo</a>&gt;&gt;</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/rsgroup/RSGroupBasedLoadBalancer.html#roundRobinAssignment-java.util.List-java.util.List-">roundRobinAssignment</a></span>(<a href="https://docs.oracle.com/javase/8/docs/api/java/util/List.html?is-external=true" title="class or interface in java.util">List</a>&lt;<a href="../../../../../org/apache/hadoop/hbase/client/RegionInfo.html" title="interface in org.apache.hadoop.hbase.client">RegionInfo</a>&gt;&nbsp;regions,
                     <a href="https://docs.oracle.com/javase/8/docs/api/java/util/List.html?is-external=true" title="class or interface in java.util">List</a>&lt;<a href="../../../../../org/apache/hadoop/hbase/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a>&gt;&nbsp;servers)</code>
 <div class="block">Perform a Round Robin assignment of regions.</div>
 </td>
 </tr>
-<tr id="i17" class="rowColor">
+<tr id="i18" class="altColor">
 <td class="colFirst"><code>void</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/rsgroup/RSGroupBasedLoadBalancer.html#setClusterLoad-java.util.Map-">setClusterLoad</a></span>(<a href="https://docs.oracle.com/javase/8/docs/api/java/util/Map.html?is-external=true" title="class or interface in java.util">Map</a>&lt;<a href="../../../../../org/apache/hadoop/hbase/TableName.html" title="class in org.apache.hadoop.hbase">TableName</a>,<a href="https://docs.oracle.com/javase/8/docs/api/java/util/Map.html?is-external=true" title="class or interface in java.util">Map</a>&lt;<a href="../../../../../org/apache/hadoop/hbase/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a>,<a href="https://docs.oracle.com/javase/8/docs/api/java/util/List.html?is-external=true" title="class or interface in java.util">List</a>&lt;<a href="../../../../../org/apache/hadoop/hbase/client/RegionInfo.html" title="interface in org.apache.hadoop.hbase.client">RegionInfo</a>&g
 t;&gt;&gt;&nbsp;clusterLoad)</code>
 <div class="block">Pass RegionStates and allow balancer to set the current cluster load.</div>
 </td>
 </tr>
-<tr id="i18" class="altColor">
+<tr id="i19" class="rowColor">
 <td class="colFirst"><code>void</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/rsgroup/RSGroupBasedLoadBalancer.html#setClusterMetrics-org.apache.hadoop.hbase.ClusterMetrics-">setClusterMetrics</a></span>(<a href="../../../../../org/apache/hadoop/hbase/ClusterMetrics.html" title="interface in org.apache.hadoop.hbase">ClusterMetrics</a>&nbsp;sm)</code>
 <div class="block">Set the current cluster status.</div>
 </td>
 </tr>
-<tr id="i19" class="rowColor">
+<tr id="i20" class="altColor">
 <td class="colFirst"><code>void</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/rsgroup/RSGroupBasedLoadBalancer.html#setConf-org.apache.hadoop.conf.Configuration-">setConf</a></span>(org.apache.hadoop.conf.Configuration&nbsp;conf)</code>&nbsp;</td>
 </tr>
-<tr id="i20" class="altColor">
+<tr id="i21" class="rowColor">
 <td class="colFirst"><code>void</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/rsgroup/RSGroupBasedLoadBalancer.html#setMasterServices-org.apache.hadoop.hbase.master.MasterServices-">setMasterServices</a></span>(<a href="../../../../../org/apache/hadoop/hbase/master/MasterServices.html" title="interface in org.apache.hadoop.hbase.master">MasterServices</a>&nbsp;masterServices)</code>
 <div class="block">Set the master service.</div>
 </td>
 </tr>
-<tr id="i21" class="rowColor">
+<tr id="i22" class="altColor">
 <td class="colFirst"><code>void</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/rsgroup/RSGroupBasedLoadBalancer.html#setRsGroupInfoManager-org.apache.hadoop.hbase.rsgroup.RSGroupInfoManager-">setRsGroupInfoManager</a></span>(<a href="../../../../../org/apache/hadoop/hbase/rsgroup/RSGroupInfoManager.html" title="interface in org.apache.hadoop.hbase.rsgroup">RSGroupInfoManager</a>&nbsp;rsGroupInfoManager)</code>&nbsp;</td>
 </tr>
-<tr id="i22" class="altColor">
+<tr id="i23" class="rowColor">
 <td class="colFirst"><code>void</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/rsgroup/RSGroupBasedLoadBalancer.html#stop-java.lang.String-">stop</a></span>(<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;why)</code>
 <div class="block">Stop this service.</div>
@@ -821,12 +827,27 @@ public&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/rsgroup/RSG
 <a name="setRsGroupInfoManager-org.apache.hadoop.hbase.rsgroup.RSGroupInfoManager-">
 <!--   -->
 </a>
-<ul class="blockListLast">
+<ul class="blockList">
 <li class="blockList">
 <h4>setRsGroupInfoManager</h4>
 <pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/rsgroup/RSGroupBasedLoadBalancer.html#line.466">setRsGroupInfoManager</a>(<a href="../../../../../org/apache/hadoop/hbase/rsgroup/RSGroupInfoManager.html" title="interface in org.apache.hadoop.hbase.rsgroup">RSGroupInfoManager</a>&nbsp;rsGroupInfoManager)</pre>
 </li>
 </ul>
+<a name="postMasterStartupInitialize--">
+<!--   -->
+</a>
+<ul class="blockListLast">
+<li class="blockList">
+<h4>postMasterStartupInitialize</h4>
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/rsgroup/RSGroupBasedLoadBalancer.html#line.471">postMasterStartupInitialize</a>()</pre>
+<div class="block"><span class="descfrmTypeLabel">Description copied from interface:&nbsp;<code><a href="../../../../../org/apache/hadoop/hbase/master/LoadBalancer.html#postMasterStartupInitialize--">LoadBalancer</a></code></span></div>
+<div class="block">If balancer needs to do initialization after Master has started up, lets do that here.</div>
+<dl>
+<dt><span class="overrideSpecifyLabel">Specified by:</span></dt>
+<dd><code><a href="../../../../../org/apache/hadoop/hbase/master/LoadBalancer.html#postMasterStartupInitialize--">postMasterStartupInitialize</a></code>&nbsp;in interface&nbsp;<code><a href="../../../../../org/apache/hadoop/hbase/master/LoadBalancer.html" title="interface in org.apache.hadoop.hbase.master">LoadBalancer</a></code></dd>
+</dl>
+</li>
+</ul>
 </li>
 </ul>
 </li>


[23/29] hbase-site git commit: Published site at 477f9fdb32873387231c5fbbff130ba8bf7b5d68.

Posted by gi...@apache.org.
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/621479e1/devapidocs/org/apache/hadoop/hbase/master/LoadBalancer.html
----------------------------------------------------------------------
diff --git a/devapidocs/org/apache/hadoop/hbase/master/LoadBalancer.html b/devapidocs/org/apache/hadoop/hbase/master/LoadBalancer.html
index 4562caf..6b464bf 100644
--- a/devapidocs/org/apache/hadoop/hbase/master/LoadBalancer.html
+++ b/devapidocs/org/apache/hadoop/hbase/master/LoadBalancer.html
@@ -18,7 +18,7 @@
     catch(err) {
     }
 //-->
-var methods = {"i0":6,"i1":6,"i2":6,"i3":17,"i4":17,"i5":6,"i6":6,"i7":6,"i8":6,"i9":6,"i10":6,"i11":6,"i12":6,"i13":6};
+var methods = {"i0":6,"i1":6,"i2":6,"i3":17,"i4":17,"i5":6,"i6":6,"i7":6,"i8":6,"i9":6,"i10":6,"i11":6,"i12":6,"i13":6,"i14":6};
 var tabs = {65535:["t0","All Methods"],1:["t1","Static Methods"],2:["t2","Instance Methods"],4:["t3","Abstract Methods"],16:["t5","Default Methods"]};
 var altColor = "altColor";
 var rowColor = "rowColor";
@@ -212,52 +212,58 @@ extends org.apache.hadoop.conf.Configurable, <a href="../../../../../org/apache/
 </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/master/LoadBalancer.html#postMasterStartupInitialize--">postMasterStartupInitialize</a></span>()</code>
+<div class="block">If balancer needs to do initialization after Master has started up, lets do that here.</div>
+</td>
+</tr>
+<tr id="i7" class="rowColor">
 <td class="colFirst"><code><a href="../../../../../org/apache/hadoop/hbase/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a></code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/master/LoadBalancer.html#randomAssignment-org.apache.hadoop.hbase.client.RegionInfo-java.util.List-">randomAssignment</a></span>(<a href="../../../../../org/apache/hadoop/hbase/client/RegionInfo.html" title="interface in org.apache.hadoop.hbase.client">RegionInfo</a>&nbsp;regionInfo,
                 <a href="https://docs.oracle.com/javase/8/docs/api/java/util/List.html?is-external=true" title="class or interface in java.util">List</a>&lt;<a href="../../../../../org/apache/hadoop/hbase/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a>&gt;&nbsp;servers)</code>
 <div class="block">Get a random region server from the list</div>
 </td>
 </tr>
-<tr id="i7" class="rowColor">
+<tr id="i8" class="altColor">
 <td class="colFirst"><code>void</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/master/LoadBalancer.html#regionOffline-org.apache.hadoop.hbase.client.RegionInfo-">regionOffline</a></span>(<a href="../../../../../org/apache/hadoop/hbase/client/RegionInfo.html" title="interface in org.apache.hadoop.hbase.client">RegionInfo</a>&nbsp;regionInfo)</code>
 <div class="block">Marks the region as offline at balancer.</div>
 </td>
 </tr>
-<tr id="i8" class="altColor">
+<tr id="i9" class="rowColor">
 <td class="colFirst"><code>void</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/master/LoadBalancer.html#regionOnline-org.apache.hadoop.hbase.client.RegionInfo-org.apache.hadoop.hbase.ServerName-">regionOnline</a></span>(<a href="../../../../../org/apache/hadoop/hbase/client/RegionInfo.html" title="interface in org.apache.hadoop.hbase.client">RegionInfo</a>&nbsp;regionInfo,
             <a href="../../../../../org/apache/hadoop/hbase/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a>&nbsp;sn)</code>
 <div class="block">Marks the region as online at balancer.</div>
 </td>
 </tr>
-<tr id="i9" class="rowColor">
+<tr id="i10" class="altColor">
 <td class="colFirst"><code><a href="https://docs.oracle.com/javase/8/docs/api/java/util/Map.html?is-external=true" title="class or interface in java.util">Map</a>&lt;<a href="../../../../../org/apache/hadoop/hbase/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a>,<a href="https://docs.oracle.com/javase/8/docs/api/java/util/List.html?is-external=true" title="class or interface in java.util">List</a>&lt;<a href="../../../../../org/apache/hadoop/hbase/client/RegionInfo.html" title="interface in org.apache.hadoop.hbase.client">RegionInfo</a>&gt;&gt;</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/master/LoadBalancer.html#retainAssignment-java.util.Map-java.util.List-">retainAssignment</a></span>(<a href="https://docs.oracle.com/javase/8/docs/api/java/util/Map.html?is-external=true" title="class or interface in java.util">Map</a>&lt;<a href="../../../../../org/apache/hadoop/hbase/client/RegionInfo.html" title="interface in org.apache.hadoop.hbase.client">RegionInfo</a>,<a href="../../../../../org/apache/hadoop/hbase/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a>&gt;&nbsp;regions,
                 <a href="https://docs.oracle.com/javase/8/docs/api/java/util/List.html?is-external=true" title="class or interface in java.util">List</a>&lt;<a href="../../../../../org/apache/hadoop/hbase/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a>&gt;&nbsp;servers)</code>
 <div class="block">Assign regions to the previously hosting region server</div>
 </td>
 </tr>
-<tr id="i10" class="altColor">
+<tr id="i11" class="rowColor">
 <td class="colFirst"><code><a href="https://docs.oracle.com/javase/8/docs/api/java/util/Map.html?is-external=true" title="class or interface in java.util">Map</a>&lt;<a href="../../../../../org/apache/hadoop/hbase/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a>,<a href="https://docs.oracle.com/javase/8/docs/api/java/util/List.html?is-external=true" title="class or interface in java.util">List</a>&lt;<a href="../../../../../org/apache/hadoop/hbase/client/RegionInfo.html" title="interface in org.apache.hadoop.hbase.client">RegionInfo</a>&gt;&gt;</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/master/LoadBalancer.html#roundRobinAssignment-java.util.List-java.util.List-">roundRobinAssignment</a></span>(<a href="https://docs.oracle.com/javase/8/docs/api/java/util/List.html?is-external=true" title="class or interface in java.util">List</a>&lt;<a href="../../../../../org/apache/hadoop/hbase/client/RegionInfo.html" title="interface in org.apache.hadoop.hbase.client">RegionInfo</a>&gt;&nbsp;regions,
                     <a href="https://docs.oracle.com/javase/8/docs/api/java/util/List.html?is-external=true" title="class or interface in java.util">List</a>&lt;<a href="../../../../../org/apache/hadoop/hbase/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a>&gt;&nbsp;servers)</code>
 <div class="block">Perform a Round Robin assignment of regions.</div>
 </td>
 </tr>
-<tr id="i11" class="rowColor">
+<tr id="i12" class="altColor">
 <td class="colFirst"><code>void</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/master/LoadBalancer.html#setClusterLoad-java.util.Map-">setClusterLoad</a></span>(<a href="https://docs.oracle.com/javase/8/docs/api/java/util/Map.html?is-external=true" title="class or interface in java.util">Map</a>&lt;<a href="../../../../../org/apache/hadoop/hbase/TableName.html" title="class in org.apache.hadoop.hbase">TableName</a>,<a href="https://docs.oracle.com/javase/8/docs/api/java/util/Map.html?is-external=true" title="class or interface in java.util">Map</a>&lt;<a href="../../../../../org/apache/hadoop/hbase/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a>,<a href="https://docs.oracle.com/javase/8/docs/api/java/util/List.html?is-external=true" title="class or interface in java.util">List</a>&lt;<a href="../../../../../org/apache/hadoop/hbase/client/RegionInfo.html" title="interface in org.apache.hadoop.hbase.client">RegionInfo</a>&gt;&gt;&gt;&nb
 sp;ClusterLoad)</code>
 <div class="block">Pass RegionStates and allow balancer to set the current cluster load.</div>
 </td>
 </tr>
-<tr id="i12" class="altColor">
+<tr id="i13" class="rowColor">
 <td class="colFirst"><code>void</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/master/LoadBalancer.html#setClusterMetrics-org.apache.hadoop.hbase.ClusterMetrics-">setClusterMetrics</a></span>(<a href="../../../../../org/apache/hadoop/hbase/ClusterMetrics.html" title="interface in org.apache.hadoop.hbase">ClusterMetrics</a>&nbsp;st)</code>
 <div class="block">Set the current cluster status.</div>
 </td>
 </tr>
-<tr id="i13" class="rowColor">
+<tr id="i14" class="altColor">
 <td class="colFirst"><code>void</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/master/LoadBalancer.html#setMasterServices-org.apache.hadoop.hbase.master.MasterServices-">setMasterServices</a></span>(<a href="../../../../../org/apache/hadoop/hbase/master/MasterServices.html" title="interface in org.apache.hadoop.hbase.master">MasterServices</a>&nbsp;masterServices)</code>
 <div class="block">Set the master service.</div>
@@ -546,13 +552,23 @@ extends org.apache.hadoop.conf.Configurable, <a href="../../../../../org/apache/
 </dl>
 </li>
 </ul>
+<a name="postMasterStartupInitialize--">
+<!--   -->
+</a>
+<ul class="blockList">
+<li class="blockList">
+<h4>postMasterStartupInitialize</h4>
+<pre>void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/master/LoadBalancer.html#line.165">postMasterStartupInitialize</a>()</pre>
+<div class="block">If balancer needs to do initialization after Master has started up, lets do that here.</div>
+</li>
+</ul>
 <a name="isTablesOnMaster-org.apache.hadoop.conf.Configuration-">
 <!--   -->
 </a>
 <ul class="blockList">
 <li class="blockList">
 <h4>isTablesOnMaster</h4>
-<pre>static&nbsp;boolean&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/master/LoadBalancer.html#line.165">isTablesOnMaster</a>(org.apache.hadoop.conf.Configuration&nbsp;conf)</pre>
+<pre>static&nbsp;boolean&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/master/LoadBalancer.html#line.170">isTablesOnMaster</a>(org.apache.hadoop.conf.Configuration&nbsp;conf)</pre>
 <dl>
 <dt><span class="returnLabel">Returns:</span></dt>
 <dd>true if Master carries regions</dd>
@@ -565,7 +581,7 @@ extends org.apache.hadoop.conf.Configurable, <a href="../../../../../org/apache/
 <ul class="blockListLast">
 <li class="blockList">
 <h4>isSystemTablesOnlyOnMaster</h4>
-<pre>static&nbsp;boolean&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/master/LoadBalancer.html#line.169">isSystemTablesOnlyOnMaster</a>(org.apache.hadoop.conf.Configuration&nbsp;conf)</pre>
+<pre>static&nbsp;boolean&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/master/LoadBalancer.html#line.174">isSystemTablesOnlyOnMaster</a>(org.apache.hadoop.conf.Configuration&nbsp;conf)</pre>
 </li>
 </ul>
 </li>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/621479e1/devapidocs/org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.html
----------------------------------------------------------------------
diff --git a/devapidocs/org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.html b/devapidocs/org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.html
index ed41587..6422327 100644
--- a/devapidocs/org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.html
+++ b/devapidocs/org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.html
@@ -18,7 +18,7 @@
     catch(err) {
     }
 //-->
-var methods = {"i0":10,"i1":10,"i2":10,"i3":10,"i4":10,"i5":10,"i6":10,"i7":10,"i8":10,"i9":10,"i10":10,"i11":10,"i12":10,"i13":10,"i14":10,"i15":10,"i16":10,"i17":10,"i18":10,"i19":10,"i20":10,"i21":10,"i22":10,"i23":10,"i24":10,"i25":10,"i26":10};
+var methods = {"i0":10,"i1":10,"i2":10,"i3":10,"i4":10,"i5":10,"i6":10,"i7":10,"i8":10,"i9":10,"i10":10,"i11":10,"i12":10,"i13":10,"i14":10,"i15":10,"i16":10,"i17":10,"i18":10,"i19":10,"i20":10,"i21":10,"i22":10,"i23":10,"i24":10,"i25":10,"i26":10,"i27":10};
 var tabs = {65535:["t0","All Methods"],2:["t2","Instance Methods"],8:["t4","Concrete Methods"]};
 var altColor = "altColor";
 var rowColor = "rowColor";
@@ -315,9 +315,8 @@ implements <a href="../../../../../../org/apache/hadoop/hbase/master/LoadBalance
 </tr>
 <tr id="i3" class="rowColor">
 <td class="colFirst"><code>protected <a href="../../../../../../org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.Cluster.html" title="class in org.apache.hadoop.hbase.master.balancer">BaseLoadBalancer.Cluster</a></code></td>
-<td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.html#createCluster-java.util.List-java.util.Collection-boolean-">createCluster</a></span>(<a href="https://docs.oracle.com/javase/8/docs/api/java/util/List.html?is-external=true" title="class or interface in java.util">List</a>&lt;<a href="../../../../../../org/apache/hadoop/hbase/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a>&gt;&nbsp;servers,
-             <a href="https://docs.oracle.com/javase/8/docs/api/java/util/Collection.html?is-external=true" title="class or interface in java.util">Collection</a>&lt;<a href="../../../../../../org/apache/hadoop/hbase/client/RegionInfo.html" title="interface in org.apache.hadoop.hbase.client">RegionInfo</a>&gt;&nbsp;regions,
-             boolean&nbsp;forceRefresh)</code>&nbsp;</td>
+<td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.html#createCluster-java.util.List-java.util.Collection-">createCluster</a></span>(<a href="https://docs.oracle.com/javase/8/docs/api/java/util/List.html?is-external=true" title="class or interface in java.util">List</a>&lt;<a href="../../../../../../org/apache/hadoop/hbase/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a>&gt;&nbsp;servers,
+             <a href="https://docs.oracle.com/javase/8/docs/api/java/util/Collection.html?is-external=true" title="class or interface in java.util">Collection</a>&lt;<a href="../../../../../../org/apache/hadoop/hbase/client/RegionInfo.html" title="interface in org.apache.hadoop.hbase.client">RegionInfo</a>&gt;&nbsp;regions)</code>&nbsp;</td>
 </tr>
 <tr id="i4" class="altColor">
 <td class="colFirst"><code>private void</code></td>
@@ -357,6 +356,12 @@ implements <a href="../../../../../../org/apache/hadoop/hbase/master/LoadBalance
 </td>
 </tr>
 <tr id="i12" class="altColor">
+<td class="colFirst"><code>void</code></td>
+<td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.html#postMasterStartupInitialize--">postMasterStartupInitialize</a></span>()</code>
+<div class="block">If balancer needs to do initialization after Master has started up, lets do that here.</div>
+</td>
+</tr>
+<tr id="i13" class="rowColor">
 <td class="colFirst"><code>private <a href="../../../../../../org/apache/hadoop/hbase/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a></code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.html#randomAssignment-org.apache.hadoop.hbase.master.balancer.BaseLoadBalancer.Cluster-org.apache.hadoop.hbase.client.RegionInfo-java.util.List-">randomAssignment</a></span>(<a href="../../../../../../org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.Cluster.html" title="class in org.apache.hadoop.hbase.master.balancer">BaseLoadBalancer.Cluster</a>&nbsp;cluster,
                 <a href="../../../../../../org/apache/hadoop/hbase/client/RegionInfo.html" title="interface in org.apache.hadoop.hbase.client">RegionInfo</a>&nbsp;regionInfo,
@@ -364,27 +369,27 @@ implements <a href="../../../../../../org/apache/hadoop/hbase/master/LoadBalance
 <div class="block">Used to assign a single region to a random server.</div>
 </td>
 </tr>
-<tr id="i13" class="rowColor">
+<tr id="i14" class="altColor">
 <td class="colFirst"><code><a href="../../../../../../org/apache/hadoop/hbase/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a></code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.html#randomAssignment-org.apache.hadoop.hbase.client.RegionInfo-java.util.List-">randomAssignment</a></span>(<a href="../../../../../../org/apache/hadoop/hbase/client/RegionInfo.html" title="interface in org.apache.hadoop.hbase.client">RegionInfo</a>&nbsp;regionInfo,
                 <a href="https://docs.oracle.com/javase/8/docs/api/java/util/List.html?is-external=true" title="class or interface in java.util">List</a>&lt;<a href="../../../../../../org/apache/hadoop/hbase/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a>&gt;&nbsp;servers)</code>
 <div class="block">Used to assign a single region to a random server.</div>
 </td>
 </tr>
-<tr id="i14" class="altColor">
+<tr id="i15" class="rowColor">
 <td class="colFirst"><code>void</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.html#regionOffline-org.apache.hadoop.hbase.client.RegionInfo-">regionOffline</a></span>(<a href="../../../../../../org/apache/hadoop/hbase/client/RegionInfo.html" title="interface in org.apache.hadoop.hbase.client">RegionInfo</a>&nbsp;regionInfo)</code>
 <div class="block">Marks the region as offline at balancer.</div>
 </td>
 </tr>
-<tr id="i15" class="rowColor">
+<tr id="i16" class="altColor">
 <td class="colFirst"><code>void</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.html#regionOnline-org.apache.hadoop.hbase.client.RegionInfo-org.apache.hadoop.hbase.ServerName-">regionOnline</a></span>(<a href="../../../../../../org/apache/hadoop/hbase/client/RegionInfo.html" title="interface in org.apache.hadoop.hbase.client">RegionInfo</a>&nbsp;regionInfo,
             <a href="../../../../../../org/apache/hadoop/hbase/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a>&nbsp;sn)</code>
 <div class="block">Marks the region as online at balancer.</div>
 </td>
 </tr>
-<tr id="i16" class="altColor">
+<tr id="i17" class="rowColor">
 <td class="colFirst"><code><a href="https://docs.oracle.com/javase/8/docs/api/java/util/Map.html?is-external=true" title="class or interface in java.util">Map</a>&lt;<a href="../../../../../../org/apache/hadoop/hbase/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a>,<a href="https://docs.oracle.com/javase/8/docs/api/java/util/List.html?is-external=true" title="class or interface in java.util">List</a>&lt;<a href="../../../../../../org/apache/hadoop/hbase/client/RegionInfo.html" title="interface in org.apache.hadoop.hbase.client">RegionInfo</a>&gt;&gt;</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.html#retainAssignment-java.util.Map-java.util.List-">retainAssignment</a></span>(<a href="https://docs.oracle.com/javase/8/docs/api/java/util/Map.html?is-external=true" title="class or interface in java.util">Map</a>&lt;<a href="../../../../../../org/apache/hadoop/hbase/client/RegionInfo.html" title="interface in org.apache.hadoop.hbase.client">RegionInfo</a>,<a href="../../../../../../org/apache/hadoop/hbase/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a>&gt;&nbsp;regions,
                 <a href="https://docs.oracle.com/javase/8/docs/api/java/util/List.html?is-external=true" title="class or interface in java.util">List</a>&lt;<a href="../../../../../../org/apache/hadoop/hbase/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a>&gt;&nbsp;servers)</code>
@@ -393,7 +398,7 @@ implements <a href="../../../../../../org/apache/hadoop/hbase/master/LoadBalance
  available/online servers available for assignment.</div>
 </td>
 </tr>
-<tr id="i17" class="rowColor">
+<tr id="i18" class="altColor">
 <td class="colFirst"><code>private void</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.html#roundRobinAssignment-org.apache.hadoop.hbase.master.balancer.BaseLoadBalancer.Cluster-java.util.List-java.util.List-java.util.List-java.util.Map-">roundRobinAssignment</a></span>(<a href="../../../../../../org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.Cluster.html" title="class in org.apache.hadoop.hbase.master.balancer">BaseLoadBalancer.Cluster</a>&nbsp;cluster,
                     <a href="https://docs.oracle.com/javase/8/docs/api/java/util/List.html?is-external=true" title="class or interface in java.util">List</a>&lt;<a href="../../../../../../org/apache/hadoop/hbase/client/RegionInfo.html" title="interface in org.apache.hadoop.hbase.client">RegionInfo</a>&gt;&nbsp;regions,
@@ -403,7 +408,7 @@ implements <a href="../../../../../../org/apache/hadoop/hbase/master/LoadBalance
 <div class="block">Round robin a list of regions to a list of servers</div>
 </td>
 </tr>
-<tr id="i18" class="altColor">
+<tr id="i19" class="rowColor">
 <td class="colFirst"><code><a href="https://docs.oracle.com/javase/8/docs/api/java/util/Map.html?is-external=true" title="class or interface in java.util">Map</a>&lt;<a href="../../../../../../org/apache/hadoop/hbase/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a>,<a href="https://docs.oracle.com/javase/8/docs/api/java/util/List.html?is-external=true" title="class or interface in java.util">List</a>&lt;<a href="../../../../../../org/apache/hadoop/hbase/client/RegionInfo.html" title="interface in org.apache.hadoop.hbase.client">RegionInfo</a>&gt;&gt;</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.html#roundRobinAssignment-java.util.List-java.util.List-">roundRobinAssignment</a></span>(<a href="https://docs.oracle.com/javase/8/docs/api/java/util/List.html?is-external=true" title="class or interface in java.util">List</a>&lt;<a href="../../../../../../org/apache/hadoop/hbase/client/RegionInfo.html" title="interface in org.apache.hadoop.hbase.client">RegionInfo</a>&gt;&nbsp;regions,
                     <a href="https://docs.oracle.com/javase/8/docs/api/java/util/List.html?is-external=true" title="class or interface in java.util">List</a>&lt;<a href="../../../../../../org/apache/hadoop/hbase/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a>&gt;&nbsp;servers)</code>
@@ -411,43 +416,43 @@ implements <a href="../../../../../../org/apache/hadoop/hbase/master/LoadBalance
  simple round-robin assignment.</div>
 </td>
 </tr>
-<tr id="i19" class="rowColor">
+<tr id="i20" class="altColor">
 <td class="colFirst"><code>void</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.html#setClusterLoad-java.util.Map-">setClusterLoad</a></span>(<a href="https://docs.oracle.com/javase/8/docs/api/java/util/Map.html?is-external=true" title="class or interface in java.util">Map</a>&lt;<a href="../../../../../../org/apache/hadoop/hbase/TableName.html" title="class in org.apache.hadoop.hbase">TableName</a>,<a href="https://docs.oracle.com/javase/8/docs/api/java/util/Map.html?is-external=true" title="class or interface in java.util">Map</a>&lt;<a href="../../../../../../org/apache/hadoop/hbase/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a>,<a href="https://docs.oracle.com/javase/8/docs/api/java/util/List.html?is-external=true" title="class or interface in java.util">List</a>&lt;<a href="../../../../../../org/apache/hadoop/hbase/client/RegionInfo.html" title="interface in org.apache.hadoop.hbase.client">Regi
 onInfo</a>&gt;&gt;&gt;&nbsp;clusterLoad)</code>
 <div class="block">Pass RegionStates and allow balancer to set the current cluster load.</div>
 </td>
 </tr>
-<tr id="i20" class="altColor">
+<tr id="i21" class="rowColor">
 <td class="colFirst"><code>void</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.html#setClusterMetrics-org.apache.hadoop.hbase.ClusterMetrics-">setClusterMetrics</a></span>(<a href="../../../../../../org/apache/hadoop/hbase/ClusterMetrics.html" title="interface in org.apache.hadoop.hbase">ClusterMetrics</a>&nbsp;st)</code>
 <div class="block">Set the current cluster status.</div>
 </td>
 </tr>
-<tr id="i21" class="rowColor">
+<tr id="i22" class="altColor">
 <td class="colFirst"><code>void</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.html#setConf-org.apache.hadoop.conf.Configuration-">setConf</a></span>(org.apache.hadoop.conf.Configuration&nbsp;conf)</code>&nbsp;</td>
 </tr>
-<tr id="i22" class="altColor">
+<tr id="i23" class="rowColor">
 <td class="colFirst"><code>void</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.html#setMasterServices-org.apache.hadoop.hbase.master.MasterServices-">setMasterServices</a></span>(<a href="../../../../../../org/apache/hadoop/hbase/master/MasterServices.html" title="interface in org.apache.hadoop.hbase.master">MasterServices</a>&nbsp;masterServices)</code>
 <div class="block">Set the master service.</div>
 </td>
 </tr>
-<tr id="i23" class="rowColor">
+<tr id="i24" class="altColor">
 <td class="colFirst"><code>void</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.html#setRackManager-org.apache.hadoop.hbase.master.RackManager-">setRackManager</a></span>(<a href="../../../../../../org/apache/hadoop/hbase/master/RackManager.html" title="class in org.apache.hadoop.hbase.master">RackManager</a>&nbsp;rackManager)</code>&nbsp;</td>
 </tr>
-<tr id="i24" class="altColor">
+<tr id="i25" class="rowColor">
 <td class="colFirst"><code>protected void</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.html#setSlop-org.apache.hadoop.conf.Configuration-">setSlop</a></span>(org.apache.hadoop.conf.Configuration&nbsp;conf)</code>&nbsp;</td>
 </tr>
-<tr id="i25" class="rowColor">
+<tr id="i26" class="altColor">
 <td class="colFirst"><code>boolean</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.html#shouldBeOnMaster-org.apache.hadoop.hbase.client.RegionInfo-">shouldBeOnMaster</a></span>(<a href="../../../../../../org/apache/hadoop/hbase/client/RegionInfo.html" title="interface in org.apache.hadoop.hbase.client">RegionInfo</a>&nbsp;region)</code>
 <div class="block">Check if a region belongs to some system table.</div>
 </td>
 </tr>
-<tr id="i26" class="altColor">
+<tr id="i27" class="rowColor">
 <td class="colFirst"><code>void</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.html#stop-java.lang.String-">stop</a></span>(<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;why)</code>
 <div class="block">Stop this service.</div>
@@ -807,13 +812,28 @@ implements <a href="../../../../../../org/apache/hadoop/hbase/master/LoadBalance
 </dl>
 </li>
 </ul>
+<a name="postMasterStartupInitialize--">
+<!--   -->
+</a>
+<ul class="blockList">
+<li class="blockList">
+<h4>postMasterStartupInitialize</h4>
+<pre>public&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.html#line.1155">postMasterStartupInitialize</a>()</pre>
+<div class="block"><span class="descfrmTypeLabel">Description copied from interface:&nbsp;<code><a href="../../../../../../org/apache/hadoop/hbase/master/LoadBalancer.html#postMasterStartupInitialize--">LoadBalancer</a></code></span></div>
+<div class="block">If balancer needs to do initialization after Master has started up, lets do that here.</div>
+<dl>
+<dt><span class="overrideSpecifyLabel">Specified by:</span></dt>
+<dd><code><a href="../../../../../../org/apache/hadoop/hbase/master/LoadBalancer.html#postMasterStartupInitialize--">postMasterStartupInitialize</a></code>&nbsp;in interface&nbsp;<code><a href="../../../../../../org/apache/hadoop/hbase/master/LoadBalancer.html" title="interface in org.apache.hadoop.hbase.master">LoadBalancer</a></code></dd>
+</dl>
+</li>
+</ul>
 <a name="setRackManager-org.apache.hadoop.hbase.master.RackManager-">
 <!--   -->
 </a>
 <ul class="blockList">
 <li class="blockList">
 <h4>setRackManager</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.html#line.1154">setRackManager</a>(<a href="../../../../../../org/apache/hadoop/hbase/master/RackManager.html" title="class in org.apache.hadoop.hbase.master">RackManager</a>&nbsp;rackManager)</pre>
+<pre>public&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.html#line.1167">setRackManager</a>(<a href="../../../../../../org/apache/hadoop/hbase/master/RackManager.html" title="class in org.apache.hadoop.hbase.master">RackManager</a>&nbsp;rackManager)</pre>
 </li>
 </ul>
 <a name="needsBalance-org.apache.hadoop.hbase.master.balancer.BaseLoadBalancer.Cluster-">
@@ -822,7 +842,7 @@ implements <a href="../../../../../../org/apache/hadoop/hbase/master/LoadBalance
 <ul class="blockList">
 <li class="blockList">
 <h4>needsBalance</h4>
-<pre>protected&nbsp;boolean&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.html#line.1158">needsBalance</a>(<a href="../../../../../../org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.Cluster.html" title="class in org.apache.hadoop.hbase.master.balancer">BaseLoadBalancer.Cluster</a>&nbsp;c)</pre>
+<pre>protected&nbsp;boolean&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.html#line.1171">needsBalance</a>(<a href="../../../../../../org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.Cluster.html" title="class in org.apache.hadoop.hbase.master.balancer">BaseLoadBalancer.Cluster</a>&nbsp;c)</pre>
 </li>
 </ul>
 <a name="areSomeRegionReplicasColocated-org.apache.hadoop.hbase.master.balancer.BaseLoadBalancer.Cluster-">
@@ -831,7 +851,7 @@ implements <a href="../../../../../../org/apache/hadoop/hbase/master/LoadBalance
 <ul class="blockList">
 <li class="blockList">
 <h4>areSomeRegionReplicasColocated</h4>
-<pre>protected&nbsp;boolean&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.html#line.1195">areSomeRegionReplicasColocated</a>(<a href="../../../../../../org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.Cluster.html" title="class in org.apache.hadoop.hbase.master.balancer">BaseLoadBalancer.Cluster</a>&nbsp;c)</pre>
+<pre>protected&nbsp;boolean&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.html#line.1208">areSomeRegionReplicasColocated</a>(<a href="../../../../../../org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.Cluster.html" title="class in org.apache.hadoop.hbase.master.balancer">BaseLoadBalancer.Cluster</a>&nbsp;c)</pre>
 <div class="block">Subclasses should implement this to return true if the cluster has nodes that hosts
  multiple replicas for the same region, or, if there are multiple racks and the same
  rack hosts replicas of the same region</div>
@@ -849,7 +869,7 @@ implements <a href="../../../../../../org/apache/hadoop/hbase/master/LoadBalance
 <ul class="blockList">
 <li class="blockList">
 <h4>roundRobinAssignment</h4>
-<pre>public&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/util/Map.html?is-external=true" title="class or interface in java.util">Map</a>&lt;<a href="../../../../../../org/apache/hadoop/hbase/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a>,<a href="https://docs.oracle.com/javase/8/docs/api/java/util/List.html?is-external=true" title="class or interface in java.util">List</a>&lt;<a href="../../../../../../org/apache/hadoop/hbase/client/RegionInfo.html" title="interface in org.apache.hadoop.hbase.client">RegionInfo</a>&gt;&gt;&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.html#line.1217">roundRobinAssignment</a>(<a href="https://docs.oracle.com/javase/8/docs/api/java/util/List.html?is-external=true" title="class or interface in java.util">List</a>&lt;<a href="../../../../../../org/apache/hadoop/hbase/client/RegionInfo.html" title="interface in org.apache.hadoop.hbase.client">RegionInfo</a>&gt;&
 nbsp;regions,
+<pre>public&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/util/Map.html?is-external=true" title="class or interface in java.util">Map</a>&lt;<a href="../../../../../../org/apache/hadoop/hbase/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a>,<a href="https://docs.oracle.com/javase/8/docs/api/java/util/List.html?is-external=true" title="class or interface in java.util">List</a>&lt;<a href="../../../../../../org/apache/hadoop/hbase/client/RegionInfo.html" title="interface in org.apache.hadoop.hbase.client">RegionInfo</a>&gt;&gt;&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.html#line.1230">roundRobinAssignment</a>(<a href="https://docs.oracle.com/javase/8/docs/api/java/util/List.html?is-external=true" title="class or interface in java.util">List</a>&lt;<a href="../../../../../../org/apache/hadoop/hbase/client/RegionInfo.html" title="interface in org.apache.hadoop.hbase.client">RegionInfo</a>&gt;&
 nbsp;regions,
                                                              <a href="https://docs.oracle.com/javase/8/docs/api/java/util/List.html?is-external=true" title="class or interface in java.util">List</a>&lt;<a href="../../../../../../org/apache/hadoop/hbase/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a>&gt;&nbsp;servers)
                                                       throws <a href="../../../../../../org/apache/hadoop/hbase/HBaseIOException.html" title="class in org.apache.hadoop.hbase">HBaseIOException</a></pre>
 <div class="block">Generates a bulk assignment plan to be used on cluster startup using a
@@ -876,15 +896,14 @@ implements <a href="../../../../../../org/apache/hadoop/hbase/master/LoadBalance
 </dl>
 </li>
 </ul>
-<a name="createCluster-java.util.List-java.util.Collection-boolean-">
+<a name="createCluster-java.util.List-java.util.Collection-">
 <!--   -->
 </a>
 <ul class="blockList">
 <li class="blockList">
 <h4>createCluster</h4>
-<pre>protected&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.Cluster.html" title="class in org.apache.hadoop.hbase.master.balancer">BaseLoadBalancer.Cluster</a>&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.html#line.1291">createCluster</a>(<a href="https://docs.oracle.com/javase/8/docs/api/java/util/List.html?is-external=true" title="class or interface in java.util">List</a>&lt;<a href="../../../../../../org/apache/hadoop/hbase/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a>&gt;&nbsp;servers,
-                                                 <a href="https://docs.oracle.com/javase/8/docs/api/java/util/Collection.html?is-external=true" title="class or interface in java.util">Collection</a>&lt;<a href="../../../../../../org/apache/hadoop/hbase/client/RegionInfo.html" title="interface in org.apache.hadoop.hbase.client">RegionInfo</a>&gt;&nbsp;regions,
-                                                 boolean&nbsp;forceRefresh)</pre>
+<pre>protected&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.Cluster.html" title="class in org.apache.hadoop.hbase.master.balancer">BaseLoadBalancer.Cluster</a>&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.html#line.1304">createCluster</a>(<a href="https://docs.oracle.com/javase/8/docs/api/java/util/List.html?is-external=true" title="class or interface in java.util">List</a>&lt;<a href="../../../../../../org/apache/hadoop/hbase/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a>&gt;&nbsp;servers,
+                                                 <a href="https://docs.oracle.com/javase/8/docs/api/java/util/Collection.html?is-external=true" title="class or interface in java.util">Collection</a>&lt;<a href="../../../../../../org/apache/hadoop/hbase/client/RegionInfo.html" title="interface in org.apache.hadoop.hbase.client">RegionInfo</a>&gt;&nbsp;regions)</pre>
 </li>
 </ul>
 <a name="findIdleServers-java.util.List-">
@@ -893,7 +912,7 @@ implements <a href="../../../../../../org/apache/hadoop/hbase/master/LoadBalance
 <ul class="blockList">
 <li class="blockList">
 <h4>findIdleServers</h4>
-<pre>private&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/util/List.html?is-external=true" title="class or interface in java.util">List</a>&lt;<a href="../../../../../../org/apache/hadoop/hbase/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a>&gt;&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.html#line.1311">findIdleServers</a>(<a href="https://docs.oracle.com/javase/8/docs/api/java/util/List.html?is-external=true" title="class or interface in java.util">List</a>&lt;<a href="../../../../../../org/apache/hadoop/hbase/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a>&gt;&nbsp;servers)</pre>
+<pre>private&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/util/List.html?is-external=true" title="class or interface in java.util">List</a>&lt;<a href="../../../../../../org/apache/hadoop/hbase/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a>&gt;&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.html#line.1320">findIdleServers</a>(<a href="https://docs.oracle.com/javase/8/docs/api/java/util/List.html?is-external=true" title="class or interface in java.util">List</a>&lt;<a href="../../../../../../org/apache/hadoop/hbase/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a>&gt;&nbsp;servers)</pre>
 </li>
 </ul>
 <a name="randomAssignment-org.apache.hadoop.hbase.client.RegionInfo-java.util.List-">
@@ -902,7 +921,7 @@ implements <a href="../../../../../../org/apache/hadoop/hbase/master/LoadBalance
 <ul class="blockList">
 <li class="blockList">
 <h4>randomAssignment</h4>
-<pre>public&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a>&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.html#line.1320">randomAssignment</a>(<a href="../../../../../../org/apache/hadoop/hbase/client/RegionInfo.html" title="interface in org.apache.hadoop.hbase.client">RegionInfo</a>&nbsp;regionInfo,
+<pre>public&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a>&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.html#line.1329">randomAssignment</a>(<a href="../../../../../../org/apache/hadoop/hbase/client/RegionInfo.html" title="interface in org.apache.hadoop.hbase.client">RegionInfo</a>&nbsp;regionInfo,
                                    <a href="https://docs.oracle.com/javase/8/docs/api/java/util/List.html?is-external=true" title="class or interface in java.util">List</a>&lt;<a href="../../../../../../org/apache/hadoop/hbase/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a>&gt;&nbsp;servers)
                             throws <a href="../../../../../../org/apache/hadoop/hbase/HBaseIOException.html" title="class in org.apache.hadoop.hbase">HBaseIOException</a></pre>
 <div class="block">Used to assign a single region to a random server.</div>
@@ -924,7 +943,7 @@ implements <a href="../../../../../../org/apache/hadoop/hbase/master/LoadBalance
 <ul class="blockList">
 <li class="blockList">
 <h4>retainAssignment</h4>
-<pre>public&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/util/Map.html?is-external=true" title="class or interface in java.util">Map</a>&lt;<a href="../../../../../../org/apache/hadoop/hbase/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a>,<a href="https://docs.oracle.com/javase/8/docs/api/java/util/List.html?is-external=true" title="class or interface in java.util">List</a>&lt;<a href="../../../../../../org/apache/hadoop/hbase/client/RegionInfo.html" title="interface in org.apache.hadoop.hbase.client">RegionInfo</a>&gt;&gt;&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.html#line.1371">retainAssignment</a>(<a href="https://docs.oracle.com/javase/8/docs/api/java/util/Map.html?is-external=true" title="class or interface in java.util">Map</a>&lt;<a href="../../../../../../org/apache/hadoop/hbase/client/RegionInfo.html" title="interface in org.apache.hadoop.hbase.client">RegionInfo</a>,<a href=".
 ./../../../../../org/apache/hadoop/hbase/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a>&gt;&nbsp;regions,
+<pre>public&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/util/Map.html?is-external=true" title="class or interface in java.util">Map</a>&lt;<a href="../../../../../../org/apache/hadoop/hbase/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a>,<a href="https://docs.oracle.com/javase/8/docs/api/java/util/List.html?is-external=true" title="class or interface in java.util">List</a>&lt;<a href="../../../../../../org/apache/hadoop/hbase/client/RegionInfo.html" title="interface in org.apache.hadoop.hbase.client">RegionInfo</a>&gt;&gt;&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.html#line.1380">retainAssignment</a>(<a href="https://docs.oracle.com/javase/8/docs/api/java/util/Map.html?is-external=true" title="class or interface in java.util">Map</a>&lt;<a href="../../../../../../org/apache/hadoop/hbase/client/RegionInfo.html" title="interface in org.apache.hadoop.hbase.client">RegionInfo</a>,<a href=".
 ./../../../../../org/apache/hadoop/hbase/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a>&gt;&nbsp;regions,
                                                          <a href="https://docs.oracle.com/javase/8/docs/api/java/util/List.html?is-external=true" title="class or interface in java.util">List</a>&lt;<a href="../../../../../../org/apache/hadoop/hbase/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a>&gt;&nbsp;servers)
                                                   throws <a href="../../../../../../org/apache/hadoop/hbase/HBaseIOException.html" title="class in org.apache.hadoop.hbase">HBaseIOException</a></pre>
 <div class="block">Generates a bulk assignment startup plan, attempting to reuse the existing
@@ -957,7 +976,7 @@ implements <a href="../../../../../../org/apache/hadoop/hbase/master/LoadBalance
 <ul class="blockList">
 <li class="blockList">
 <h4>initialize</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.html#line.1495">initialize</a>()
+<pre>public&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.html#line.1503">initialize</a>()
                 throws <a href="../../../../../../org/apache/hadoop/hbase/HBaseIOException.html" title="class in org.apache.hadoop.hbase">HBaseIOException</a></pre>
 <div class="block"><span class="descfrmTypeLabel">Description copied from interface:&nbsp;<code><a href="../../../../../../org/apache/hadoop/hbase/master/LoadBalancer.html#initialize--">LoadBalancer</a></code></span></div>
 <div class="block">Initialize the load balancer. Must be called after setters.</div>
@@ -975,7 +994,7 @@ implements <a href="../../../../../../org/apache/hadoop/hbase/master/LoadBalance
 <ul class="blockList">
 <li class="blockList">
 <h4>regionOnline</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.html#line.1499">regionOnline</a>(<a href="../../../../../../org/apache/hadoop/hbase/client/RegionInfo.html" title="interface in org.apache.hadoop.hbase.client">RegionInfo</a>&nbsp;regionInfo,
+<pre>public&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.html#line.1507">regionOnline</a>(<a href="../../../../../../org/apache/hadoop/hbase/client/RegionInfo.html" title="interface in org.apache.hadoop.hbase.client">RegionInfo</a>&nbsp;regionInfo,
                          <a href="../../../../../../org/apache/hadoop/hbase/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a>&nbsp;sn)</pre>
 <div class="block"><span class="descfrmTypeLabel">Description copied from interface:&nbsp;<code><a href="../../../../../../org/apache/hadoop/hbase/master/LoadBalancer.html#regionOnline-org.apache.hadoop.hbase.client.RegionInfo-org.apache.hadoop.hbase.ServerName-">LoadBalancer</a></code></span></div>
 <div class="block">Marks the region as online at balancer.</div>
@@ -991,7 +1010,7 @@ implements <a href="../../../../../../org/apache/hadoop/hbase/master/LoadBalance
 <ul class="blockList">
 <li class="blockList">
 <h4>regionOffline</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.html#line.1503">regionOffline</a>(<a href="../../../../../../org/apache/hadoop/hbase/client/RegionInfo.html" title="interface in org.apache.hadoop.hbase.client">RegionInfo</a>&nbsp;regionInfo)</pre>
+<pre>public&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.html#line.1511">regionOffline</a>(<a href="../../../../../../org/apache/hadoop/hbase/client/RegionInfo.html" title="interface in org.apache.hadoop.hbase.client">RegionInfo</a>&nbsp;regionInfo)</pre>
 <div class="block"><span class="descfrmTypeLabel">Description copied from interface:&nbsp;<code><a href="../../../../../../org/apache/hadoop/hbase/master/LoadBalancer.html#regionOffline-org.apache.hadoop.hbase.client.RegionInfo-">LoadBalancer</a></code></span></div>
 <div class="block">Marks the region as offline at balancer.</div>
 <dl>
@@ -1006,7 +1025,7 @@ implements <a href="../../../../../../org/apache/hadoop/hbase/master/LoadBalance
 <ul class="blockList">
 <li class="blockList">
 <h4>isStopped</h4>
-<pre>public&nbsp;boolean&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.html#line.1507">isStopped</a>()</pre>
+<pre>public&nbsp;boolean&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.html#line.1515">isStopped</a>()</pre>
 <dl>
 <dt><span class="overrideSpecifyLabel">Specified by:</span></dt>
 <dd><code><a href="../../../../../../org/apache/hadoop/hbase/Stoppable.html#isStopped--">isStopped</a></code>&nbsp;in interface&nbsp;<code><a href="../../../../../../org/apache/hadoop/hbase/Stoppable.html" title="interface in org.apache.hadoop.hbase">Stoppable</a></code></dd>
@@ -1021,7 +1040,7 @@ implements <a href="../../../../../../org/apache/hadoop/hbase/master/LoadBalance
 <ul class="blockList">
 <li class="blockList">
 <h4>stop</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.html#line.1512">stop</a>(<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;why)</pre>
+<pre>public&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.html#line.1520">stop</a>(<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;why)</pre>
 <div class="block"><span class="descfrmTypeLabel">Description copied from interface:&nbsp;<code><a href="../../../../../../org/apache/hadoop/hbase/Stoppable.html#stop-java.lang.String-">Stoppable</a></code></span></div>
 <div class="block">Stop this service.
  Implementers should favor logging errors over throwing RuntimeExceptions.</div>
@@ -1039,7 +1058,7 @@ implements <a href="../../../../../../org/apache/hadoop/hbase/master/LoadBalance
 <ul class="blockList">
 <li class="blockList">
 <h4>randomAssignment</h4>
-<pre>private&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a>&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.html#line.1520">randomAssignment</a>(<a href="../../../../../../org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.Cluster.html" title="class in org.apache.hadoop.hbase.master.balancer">BaseLoadBalancer.Cluster</a>&nbsp;cluster,
+<pre>private&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a>&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.html#line.1528">randomAssignment</a>(<a href="../../../../../../org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.Cluster.html" title="class in org.apache.hadoop.hbase.master.balancer">BaseLoadBalancer.Cluster</a>&nbsp;cluster,
                                     <a href="../../../../../../org/apache/hadoop/hbase/client/RegionInfo.html" title="interface in org.apache.hadoop.hbase.client">RegionInfo</a>&nbsp;regionInfo,
                                     <a href="https://docs.oracle.com/javase/8/docs/api/java/util/List.html?is-external=true" title="class or interface in java.util">List</a>&lt;<a href="../../../../../../org/apache/hadoop/hbase/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a>&gt;&nbsp;servers)</pre>
 <div class="block">Used to assign a single region to a random server.</div>
@@ -1051,7 +1070,7 @@ implements <a href="../../../../../../org/apache/hadoop/hbase/master/LoadBalance
 <ul class="blockList">
 <li class="blockList">
 <h4>roundRobinAssignment</h4>
-<pre>private&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.html#line.1539">roundRobinAssignment</a>(<a href="../../../../../../org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.Cluster.html" title="class in org.apache.hadoop.hbase.master.balancer">BaseLoadBalancer.Cluster</a>&nbsp;cluster,
+<pre>private&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.html#line.1547">roundRobinAssignment</a>(<a href="../../../../../../org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.Cluster.html" title="class in org.apache.hadoop.hbase.master.balancer">BaseLoadBalancer.Cluster</a>&nbsp;cluster,
                                   <a href="https://docs.oracle.com/javase/8/docs/api/java/util/List.html?is-external=true" title="class or interface in java.util">List</a>&lt;<a href="../../../../../../org/apache/hadoop/hbase/client/RegionInfo.html" title="interface in org.apache.hadoop.hbase.client">RegionInfo</a>&gt;&nbsp;regions,
                                   <a href="https://docs.oracle.com/javase/8/docs/api/java/util/List.html?is-external=true" title="class or interface in java.util">List</a>&lt;<a href="../../../../../../org/apache/hadoop/hbase/client/RegionInfo.html" title="interface in org.apache.hadoop.hbase.client">RegionInfo</a>&gt;&nbsp;unassignedRegions,
                                   <a href="https://docs.oracle.com/javase/8/docs/api/java/util/List.html?is-external=true" title="class or interface in java.util">List</a>&lt;<a href="../../../../../../org/apache/hadoop/hbase/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a>&gt;&nbsp;servers,
@@ -1065,7 +1084,7 @@ implements <a href="../../../../../../org/apache/hadoop/hbase/master/LoadBalance
 <ul class="blockList">
 <li class="blockList">
 <h4>getRegionAssignmentsByServer</h4>
-<pre>protected&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/util/Map.html?is-external=true" title="class or interface in java.util">Map</a>&lt;<a href="../../../../../../org/apache/hadoop/hbase/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a>,<a href="https://docs.oracle.com/javase/8/docs/api/java/util/List.html?is-external=true" title="class or interface in java.util">List</a>&lt;<a href="../../../../../../org/apache/hadoop/hbase/client/RegionInfo.html" title="interface in org.apache.hadoop.hbase.client">RegionInfo</a>&gt;&gt;&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.html#line.1569">getRegionAssignmentsByServer</a>(<a href="https://docs.oracle.com/javase/8/docs/api/java/util/Collection.html?is-external=true" title="class or interface in java.util">Collection</a>&lt;<a href="../../../../../../org/apache/hadoop/hbase/client/RegionInfo.html" title="interface in org.apache.hadoop.hbase.clie
 nt">RegionInfo</a>&gt;&nbsp;regions)</pre>
+<pre>protected&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/util/Map.html?is-external=true" title="class or interface in java.util">Map</a>&lt;<a href="../../../../../../org/apache/hadoop/hbase/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a>,<a href="https://docs.oracle.com/javase/8/docs/api/java/util/List.html?is-external=true" title="class or interface in java.util">List</a>&lt;<a href="../../../../../../org/apache/hadoop/hbase/client/RegionInfo.html" title="interface in org.apache.hadoop.hbase.client">RegionInfo</a>&gt;&gt;&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.html#line.1577">getRegionAssignmentsByServer</a>(<a href="https://docs.oracle.com/javase/8/docs/api/java/util/Collection.html?is-external=true" title="class or interface in java.util">Collection</a>&lt;<a href="../../../../../../org/apache/hadoop/hbase/client/RegionInfo.html" title="interface in org.apache.hadoop.hbase.clie
 nt">RegionInfo</a>&gt;&nbsp;regions)</pre>
 </li>
 </ul>
 <a name="onConfigurationChange-org.apache.hadoop.conf.Configuration-">
@@ -1074,7 +1093,7 @@ implements <a href="../../../../../../org/apache/hadoop/hbase/master/LoadBalance
 <ul class="blockListLast">
 <li class="blockList">
 <h4>onConfigurationChange</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.html#line.1579">onConfigurationChange</a>(org.apache.hadoop.conf.Configuration&nbsp;conf)</pre>
+<pre>public&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.html#line.1587">onConfigurationChange</a>(org.apache.hadoop.conf.Configuration&nbsp;conf)</pre>
 <div class="block"><span class="descfrmTypeLabel">Description copied from interface:&nbsp;<code><a href="../../../../../../org/apache/hadoop/hbase/conf/ConfigurationObserver.html#onConfigurationChange-org.apache.hadoop.conf.Configuration-">ConfigurationObserver</a></code></span></div>
 <div class="block">This method would be called by the <a href="../../../../../../org/apache/hadoop/hbase/conf/ConfigurationManager.html" title="class in org.apache.hadoop.hbase.conf"><code>ConfigurationManager</code></a>
  object when the <code>Configuration</code> object is reloaded from disk.</div>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/621479e1/devapidocs/org/apache/hadoop/hbase/master/balancer/FavoredStochasticBalancer.html
----------------------------------------------------------------------
diff --git a/devapidocs/org/apache/hadoop/hbase/master/balancer/FavoredStochasticBalancer.html b/devapidocs/org/apache/hadoop/hbase/master/balancer/FavoredStochasticBalancer.html
index 7b3f9f8..6882bd5 100644
--- a/devapidocs/org/apache/hadoop/hbase/master/balancer/FavoredStochasticBalancer.html
+++ b/devapidocs/org/apache/hadoop/hbase/master/balancer/FavoredStochasticBalancer.html
@@ -389,7 +389,7 @@ implements <a href="../../../../../../org/apache/hadoop/hbase/favored/FavoredNod
 <!--   -->
 </a>
 <h3>Methods inherited from class&nbsp;org.apache.hadoop.hbase.master.balancer.<a href="../../../../../../org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.html" title="class in org.apache.hadoop.hbase.master.balancer">BaseLoadBalancer</a></h3>
-<code><a href="../../../../../../org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.html#assignMasterSystemRegions-java.util.Collection-java.util.List-">assignMasterSystemRegions</a>, <a href="../../../../../../org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.html#balanceMasterRegions-java.util.Map-">balanceMasterRegions</a>, <a href="../../../../../../org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.html#createCluster-java.util.List-java.util.Collection-boolean-">createCluster</a>, <a href="../../../../../../org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.html#getConf--">getConf</a>, <a href="../../../../../../org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.html#getRegionAssignmentsByServer-java.util.Collection-">getRegionAssignmentsByServer</a>, <a href="../../../../../../org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.html#isStopped--">isStopped</a>, <a href="../../../../../../org/apache/hadoop/hbase/master/balancer/BaseLoadBalance
 r.html#regionOffline-org.apache.hadoop.hbase.client.RegionInfo-">regionOffline</a>, <a href="../../../../../../org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.html#regionOnline-org.apache.hadoop.hbase.client.RegionInfo-org.apache.hadoop.hbase.ServerName-">regionOnline</a>, <a href="../../../../../../org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.html#setClusterLoad-java.util.Map-">setClusterLoad</a>, <a href="../../../../../../org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.html#setRackManager-org.apache.hadoop.hbase.master.RackManager-">setRackManager</a>, <a href="../../../../../../org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.html#shouldBeOnMaster-org.apache.hadoop.hbase.client.RegionInfo-">shouldBeOnMaster</a>, <a href="../../../../../../org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.html#stop-java.lang.String-">stop</a></code></li>
+<code><a href="../../../../../../org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.html#assignMasterSystemRegions-java.util.Collection-java.util.List-">assignMasterSystemRegions</a>, <a href="../../../../../../org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.html#balanceMasterRegions-java.util.Map-">balanceMasterRegions</a>, <a href="../../../../../../org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.html#createCluster-java.util.List-java.util.Collection-">createCluster</a>, <a href="../../../../../../org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.html#getConf--">getConf</a>, <a href="../../../../../../org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.html#getRegionAssignmentsByServer-java.util.Collection-">getRegionAssignmentsByServer</a>, <a href="../../../../../../org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.html#isStopped--">isStopped</a>, <a href="../../../../../../org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.html#p
 ostMasterStartupInitialize--">postMasterStartupInitialize</a>, <a href="../../../../../../org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.html#regionOffline-org.apache.hadoop.hbase.client.RegionInfo-">regionOffline</a>, <a href="../../../../../../org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.html#regionOnline-org.apache.hadoop.hbase.client.RegionInfo-org.apache.hadoop.hbase.ServerName-">regionOnline</a>, <a href="../../../../../../org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.html#setClusterLoad-java.util.Map-">setClusterLoad</a>, <a href="../../../../../../org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.html#setRackManager-org.apache.hadoop.hbase.master.RackManager-">setRackManager</a>, <a href="../../../../../../org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.html#shouldBeOnMaster-org.apache.hadoop.hbase.client.RegionInfo-">shouldBeOnMaster</a>, <a href="../../../../../../org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.html
 #stop-java.lang.String-">stop</a></code></li>
 </ul>
 <ul class="blockList">
 <li class="blockList"><a name="methods.inherited.from.class.java.lang.Object">

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/621479e1/devapidocs/org/apache/hadoop/hbase/master/balancer/SimpleLoadBalancer.html
----------------------------------------------------------------------
diff --git a/devapidocs/org/apache/hadoop/hbase/master/balancer/SimpleLoadBalancer.html b/devapidocs/org/apache/hadoop/hbase/master/balancer/SimpleLoadBalancer.html
index c3dfeac..4e1621f 100644
--- a/devapidocs/org/apache/hadoop/hbase/master/balancer/SimpleLoadBalancer.html
+++ b/devapidocs/org/apache/hadoop/hbase/master/balancer/SimpleLoadBalancer.html
@@ -315,7 +315,7 @@ extends <a href="../../../../../../org/apache/hadoop/hbase/master/balancer/BaseL
 <!--   -->
 </a>
 <h3>Methods inherited from class&nbsp;org.apache.hadoop.hbase.master.balancer.<a href="../../../../../../org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.html" title="class in org.apache.hadoop.hbase.master.balancer">BaseLoadBalancer</a></h3>
-<code><a href="../../../../../../org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.html#areSomeRegionReplicasColocated-org.apache.hadoop.hbase.master.balancer.BaseLoadBalancer.Cluster-">areSomeRegionReplicasColocated</a>, <a href="../../../../../../org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.html#assignMasterSystemRegions-java.util.Collection-java.util.List-">assignMasterSystemRegions</a>, <a href="../../../../../../org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.html#balanceMasterRegions-java.util.Map-">balanceMasterRegions</a>, <a href="../../../../../../org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.html#createCluster-java.util.List-java.util.Collection-boolean-">createCluster</a>, <a href="../../../../../../org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.html#getConf--">getConf</a>, <a href="../../../../../../org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.html#getRegionAssignmentsByServer-java.util.Collection-">getRegionA
 ssignmentsByServer</a>, <a href="../../../../../../org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.html#initialize--">initialize</a>, <a href="../../../../../../org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.html#isStopped--">isStopped</a>, <a href="../../../../../../org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.html#needsBalance-org.apache.hadoop.hbase.master.balancer.BaseLoadBalancer.Cluster-">needsBalance</a>, <a href="../../../../../../org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.html#randomAssignment-org.apache.hadoop.hbase.client.RegionInfo-java.util.List-">randomAssignment</a>, <a href="../../../../../../org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.html#regionOffline-org.apache.hadoop.hbase.client.RegionInfo-">regionOffline</a>, <a href="../../../../../../org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.html#regionOnline-org.apache.hadoop.hbase.client.RegionInfo-org.apache.hadoop.hbase.ServerName-">regionOnline</a>
 , <a href="../../../../../../org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.html#retainAssignment-java.util.Map-java.util.List-">retainAssignment</a>, <a href="../../../../../../org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.html#roundRobinAssignment-java.util.List-java.util.List-">roundRobinAssignment</a>, <a href="../../../../../../org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.html#setClusterMetrics-org.apache.hadoop.hbase.ClusterMetrics-">setClusterMetrics</a>, <a href="../../../../../../org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.html#setConf-org.apache.hadoop.conf.Configuration-">setConf</a>, <a href="../../../../../../org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.html#setMasterServices-org.apache.hadoop.hbase.master.MasterServices-">setMasterServices</a>, <a href="../../../../../../org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.html#setRackManager-org.apache.hadoop.hbase.master.RackManager-">setRackManager</a>, <
 a href="../../../../../../org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.html#setSlop-org.apache.hadoop.conf.Configuration-">setSlop</a>, <a href="../../../../../../org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.html#shouldBeOnMaster-org.apache.hadoop.hbase.client.RegionInfo-">shouldBeOnMaster</a>, <a href="../../../../../../org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.html#stop-java.lang.String-">stop</a></code></li>
+<code><a href="../../../../../../org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.html#areSomeRegionReplicasColocated-org.apache.hadoop.hbase.master.balancer.BaseLoadBalancer.Cluster-">areSomeRegionReplicasColocated</a>, <a href="../../../../../../org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.html#assignMasterSystemRegions-java.util.Collection-java.util.List-">assignMasterSystemRegions</a>, <a href="../../../../../../org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.html#balanceMasterRegions-java.util.Map-">balanceMasterRegions</a>, <a href="../../../../../../org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.html#createCluster-java.util.List-java.util.Collection-">createCluster</a>, <a href="../../../../../../org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.html#getConf--">getConf</a>, <a href="../../../../../../org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.html#getRegionAssignmentsByServer-java.util.Collection-">getRegionAssignmen
 tsByServer</a>, <a href="../../../../../../org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.html#initialize--">initialize</a>, <a href="../../../../../../org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.html#isStopped--">isStopped</a>, <a href="../../../../../../org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.html#needsBalance-org.apache.hadoop.hbase.master.balancer.BaseLoadBalancer.Cluster-">needsBalance</a>, <a href="../../../../../../org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.html#postMasterStartupInitialize--">postMasterStartupInitialize</a>, <a href="../../../../../../org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.html#randomAssignment-org.apache.hadoop.hbase.client.RegionInfo-java.util.List-">randomAssignment</a>, <a href="../../../../../../org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.html#regionOffline-org.apache.hadoop.hbase.client.RegionInfo-">regionOffline</a>, <a href="../../../../../../org/apache/hadoop/hbase/m
 aster/balancer/BaseLoadBalancer.html#regionOnline-org.apache.hadoop.hbase.client.RegionInfo-org.apache.hadoop.hbase.ServerName-">regionOnline</a>, <a href="../../../../../../org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.html#retainAssignment-java.util.Map-java.util.List-">retainAssignment</a>, <a href="../../../../../../org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.html#roundRobinAssignment-java.util.List-java.util.List-">roundRobinAssignment</a>, <a href="../../../../../../org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.html#setClusterMetrics-org.apache.hadoop.hbase.ClusterMetrics-">setClusterMetrics</a>, <a href="../../../../../../org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.html#setConf-org.apache.hadoop.conf.Configuration-">setConf</a>, <a href="../../../../../../org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.html#setMasterServices-org.apache.hadoop.hbase.master.MasterServices-">setMasterServices</a>, <a href="../../../../../.
 ./org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.html#setRackManager-org.apache.hadoop.hbase.master.RackManager-">setRackManager</a>, <a href="../../../../../../org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.html#setSlop-org.apache.hadoop.conf.Configuration-">setSlop</a>, <a href="../../../../../../org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.html#shouldBeOnMaster-org.apache.hadoop.hbase.client.RegionInfo-">shouldBeOnMaster</a>, <a href="../../../../../../org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.html#stop-java.lang.String-">stop</a></code></li>
 </ul>
 <ul class="blockList">
 <li class="blockList"><a name="methods.inherited.from.class.java.lang.Object">

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/621479e1/devapidocs/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.html
----------------------------------------------------------------------
diff --git a/devapidocs/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.html b/devapidocs/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.html
index fe14702..a215688 100644
--- a/devapidocs/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.html
+++ b/devapidocs/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.html
@@ -628,7 +628,7 @@ extends <a href="../../../../../../org/apache/hadoop/hbase/master/balancer/BaseL
 <!--   -->
 </a>
 <h3>Methods inherited from class&nbsp;org.apache.hadoop.hbase.master.balancer.<a href="../../../../../../org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.html" title="class in org.apache.hadoop.hbase.master.balancer">BaseLoadBalancer</a></h3>
-<code><a href="../../../../../../org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.html#assignMasterSystemRegions-java.util.Collection-java.util.List-">assignMasterSystemRegions</a>, <a href="../../../../../../org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.html#balanceMasterRegions-java.util.Map-">balanceMasterRegions</a>, <a href="../../../../../../org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.html#createCluster-java.util.List-java.util.Collection-boolean-">createCluster</a>, <a href="../../../../../../org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.html#getConf--">getConf</a>, <a href="../../../../../../org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.html#getRegionAssignmentsByServer-java.util.Collection-">getRegionAssignmentsByServer</a>, <a href="../../../../../../org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.html#initialize--">initialize</a>, <a href="../../../../../../org/apache/hadoop/hbase/master/balancer/BaseLoadBalan
 cer.html#isStopped--">isStopped</a>, <a href="../../../../../../org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.html#randomAssignment-org.apache.hadoop.hbase.client.RegionInfo-java.util.List-">randomAssignment</a>, <a href="../../../../../../org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.html#regionOffline-org.apache.hadoop.hbase.client.RegionInfo-">regionOffline</a>, <a href="../../../../../../org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.html#regionOnline-org.apache.hadoop.hbase.client.RegionInfo-org.apache.hadoop.hbase.ServerName-">regionOnline</a>, <a href="../../../../../../org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.html#retainAssignment-java.util.Map-java.util.List-">retainAssignment</a>, <a href="../../../../../../org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.html#roundRobinAssignment-java.util.List-java.util.List-">roundRobinAssignment</a>, <a href="../../../../../../org/apache/hadoop/hbase/master/balancer/BaseLoadBalanc
 er.html#setClusterLoad-java.util.Map-">setClusterLoad</a>, <a href="../../../../../../org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.html#setRackManager-org.apache.hadoop.hbase.master.RackManager-">setRackManager</a>, <a href="../../../../../../org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.html#shouldBeOnMaster-org.apache.hadoop.hbase.client.RegionInfo-">shouldBeOnMaster</a>, <a href="../../../../../../org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.html#stop-java.lang.String-">stop</a></code></li>
+<code><a href="../../../../../../org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.html#assignMasterSystemRegions-java.util.Collection-java.util.List-">assignMasterSystemRegions</a>, <a href="../../../../../../org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.html#balanceMasterRegions-java.util.Map-">balanceMasterRegions</a>, <a href="../../../../../../org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.html#createCluster-java.util.List-java.util.Collection-">createCluster</a>, <a href="../../../../../../org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.html#getConf--">getConf</a>, <a href="../../../../../../org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.html#getRegionAssignmentsByServer-java.util.Collection-">getRegionAssignmentsByServer</a>, <a href="../../../../../../org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.html#initialize--">initialize</a>, <a href="../../../../../../org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.html
 #isStopped--">isStopped</a>, <a href="../../../../../../org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.html#postMasterStartupInitialize--">postMasterStartupInitialize</a>, <a href="../../../../../../org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.html#randomAssignment-org.apache.hadoop.hbase.client.RegionInfo-java.util.List-">randomAssignment</a>, <a href="../../../../../../org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.html#regionOffline-org.apache.hadoop.hbase.client.RegionInfo-">regionOffline</a>, <a href="../../../../../../org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.html#regionOnline-org.apache.hadoop.hbase.client.RegionInfo-org.apache.hadoop.hbase.ServerName-">regionOnline</a>, <a href="../../../../../../org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.html#retainAssignment-java.util.Map-java.util.List-">retainAssignment</a>, <a href="../../../../../../org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.html#roundRobinAssig
 nment-java.util.List-java.util.List-">roundRobinAssignment</a>, <a href="../../../../../../org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.html#setClusterLoad-java.util.Map-">setClusterLoad</a>, <a href="../../../../../../org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.html#setRackManager-org.apache.hadoop.hbase.master.RackManager-">setRackManager</a>, <a href="../../../../../../org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.html#shouldBeOnMaster-org.apache.hadoop.hbase.client.RegionInfo-">shouldBeOnMaster</a>, <a href="../../../../../../org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.html#stop-java.lang.String-">stop</a></code></li>
 </ul>
 <ul class="blockList">
 <li class="blockList"><a name="methods.inherited.from.class.java.lang.Object">

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/621479e1/devapidocs/org/apache/hadoop/hbase/master/balancer/class-use/BaseLoadBalancer.Cluster.html
----------------------------------------------------------------------
diff --git a/devapidocs/org/apache/hadoop/hbase/master/balancer/class-use/BaseLoadBalancer.Cluster.html b/devapidocs/org/apache/hadoop/hbase/master/balancer/class-use/BaseLoadBalancer.Cluster.html
index 361d69b..a372b71 100644
--- a/devapidocs/org/apache/hadoop/hbase/master/balancer/class-use/BaseLoadBalancer.Cluster.html
+++ b/devapidocs/org/apache/hadoop/hbase/master/balancer/class-use/BaseLoadBalancer.Cluster.html
@@ -117,9 +117,8 @@
 <tbody>
 <tr class="altColor">
 <td class="colFirst"><code>protected <a href="../../../../../../../org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.Cluster.html" title="class in org.apache.hadoop.hbase.master.balancer">BaseLoadBalancer.Cluster</a></code></td>
-<td class="colLast"><span class="typeNameLabel">BaseLoadBalancer.</span><code><span class="memberNameLink"><a href="../../../../../../../org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.html#createCluster-java.util.List-java.util.Collection-boolean-">createCluster</a></span>(<a href="https://docs.oracle.com/javase/8/docs/api/java/util/List.html?is-external=true" title="class or interface in java.util">List</a>&lt;<a href="../../../../../../../org/apache/hadoop/hbase/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a>&gt;&nbsp;servers,
-             <a href="https://docs.oracle.com/javase/8/docs/api/java/util/Collection.html?is-external=true" title="class or interface in java.util">Collection</a>&lt;<a href="../../../../../../../org/apache/hadoop/hbase/client/RegionInfo.html" title="interface in org.apache.hadoop.hbase.client">RegionInfo</a>&gt;&nbsp;regions,
-             boolean&nbsp;forceRefresh)</code>&nbsp;</td>
+<td class="colLast"><span class="typeNameLabel">BaseLoadBalancer.</span><code><span class="memberNameLink"><a href="../../../../../../../org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.html#createCluster-java.util.List-java.util.Collection-">createCluster</a></span>(<a href="https://docs.oracle.com/javase/8/docs/api/java/util/List.html?is-external=true" title="class or interface in java.util">List</a>&lt;<a href="../../../../../../../org/apache/hadoop/hbase/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a>&gt;&nbsp;servers,
+             <a href="https://docs.oracle.com/javase/8/docs/api/java/util/Collection.html?is-external=true" title="class or interface in java.util">Collection</a>&lt;<a href="../../../../../../../org/apache/hadoop/hbase/client/RegionInfo.html" title="interface in org.apache.hadoop.hbase.client">RegionInfo</a>&gt;&nbsp;regions)</code>&nbsp;</td>
 </tr>
 </tbody>
 </table>

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

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


[26/29] hbase-site git commit: Published site at 477f9fdb32873387231c5fbbff130ba8bf7b5d68.

Posted by gi...@apache.org.
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/621479e1/checkstyle-aggregate.html
----------------------------------------------------------------------
diff --git a/checkstyle-aggregate.html b/checkstyle-aggregate.html
index ecd60d1..6e95a14 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="20180524" />
+    <meta name="Date-Revision-yyyymmdd" content="20180525" />
     <meta http-equiv="Content-Language" content="en" />
     <title>Apache HBase &#x2013; Checkstyle Results</title>
     <link rel="stylesheet" href="./css/apache-maven-fluido-1.5-HBASE.min.css" />
@@ -284,7 +284,7 @@
 <td>3616</td>
 <td>0</td>
 <td>0</td>
-<td>15863</td></tr></table></div>
+<td>15862</td></tr></table></div>
 <div class="section">
 <h2><a name="Files"></a>Files</h2>
 <table border="0" class="table table-striped">
@@ -5454,4766 +5454,4761 @@
 <td>0</td>
 <td>2</td></tr>
 <tr class="b">
-<td><a href="#org.apache.hadoop.hbase.master.procedure.TruncateTableProcedure.java">org/apache/hadoop/hbase/master/procedure/TruncateTableProcedure.java</a></td>
-<td>0</td>
-<td>0</td>
-<td>1</td></tr>
-<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.master.snapshot.EnabledTableSnapshotHandler.java">org/apache/hadoop/hbase/master/snapshot/EnabledTableSnapshotHandler.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>1</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.master.snapshot.MasterSnapshotVerifier.java">org/apache/hadoop/hbase/master/snapshot/MasterSnapshotVerifier.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>2</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.master.snapshot.SnapshotFileCache.java">org/apache/hadoop/hbase/master/snapshot/SnapshotFileCache.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>2</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.master.snapshot.SnapshotHFileCleaner.java">org/apache/hadoop/hbase/master/snapshot/SnapshotHFileCleaner.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>1</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.master.snapshot.SnapshotManager.java">org/apache/hadoop/hbase/master/snapshot/SnapshotManager.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>16</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.master.snapshot.TakeSnapshotHandler.java">org/apache/hadoop/hbase/master/snapshot/TakeSnapshotHandler.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>3</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.master.snapshot.TestAssignProcedure.java">org/apache/hadoop/hbase/master/snapshot/TestAssignProcedure.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>2</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.master.snapshot.TestSnapshotHFileCleaner.java">org/apache/hadoop/hbase/master/snapshot/TestSnapshotHFileCleaner.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>6</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.master.snapshot.TestSnapshotManager.java">org/apache/hadoop/hbase/master/snapshot/TestSnapshotManager.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>1</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.metrics.BaseSourceImpl.java">org/apache/hadoop/hbase/metrics/BaseSourceImpl.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>9</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.metrics.Interns.java">org/apache/hadoop/hbase/metrics/Interns.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>2</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.metrics.MBeanSourceImpl.java">org/apache/hadoop/hbase/metrics/MBeanSourceImpl.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>1</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.metrics.MetricsInfoImpl.java">org/apache/hadoop/hbase/metrics/MetricsInfoImpl.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>2</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.mob.CachedMobFile.java">org/apache/hadoop/hbase/mob/CachedMobFile.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>1</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.mob.DefaultMobStoreCompactor.java">org/apache/hadoop/hbase/mob/DefaultMobStoreCompactor.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>8</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.mob.DefaultMobStoreFlusher.java">org/apache/hadoop/hbase/mob/DefaultMobStoreFlusher.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>5</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.mob.ExpiredMobFileCleaner.java">org/apache/hadoop/hbase/mob/ExpiredMobFileCleaner.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>2</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.mob.MobCacheConfig.java">org/apache/hadoop/hbase/mob/MobCacheConfig.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>2</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.mob.MobConstants.java">org/apache/hadoop/hbase/mob/MobConstants.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>1</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.mob.MobFile.java">org/apache/hadoop/hbase/mob/MobFile.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>6</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.mob.MobFileCache.java">org/apache/hadoop/hbase/mob/MobFileCache.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>2</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.mob.MobFileName.java">org/apache/hadoop/hbase/mob/MobFileName.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>1</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.mob.MobTestUtil.java">org/apache/hadoop/hbase/mob/MobTestUtil.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>1</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.mob.MobUtils.java">org/apache/hadoop/hbase/mob/MobUtils.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>15</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.mob.TestDefaultMobStoreFlusher.java">org/apache/hadoop/hbase/mob/TestDefaultMobStoreFlusher.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>35</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.mob.TestExpiredMobFileCleaner.java">org/apache/hadoop/hbase/mob/TestExpiredMobFileCleaner.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>1</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.mob.compactions.MobCompactor.java">org/apache/hadoop/hbase/mob/compactions/MobCompactor.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>4</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.mob.compactions.PartitionedMobCompactionRequest.java">org/apache/hadoop/hbase/mob/compactions/PartitionedMobCompactionRequest.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>6</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.mob.compactions.PartitionedMobCompactor.java">org/apache/hadoop/hbase/mob/compactions/PartitionedMobCompactor.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>10</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.mob.compactions.TestMobCompactor.java">org/apache/hadoop/hbase/mob/compactions/TestMobCompactor.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>6</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.mob.compactions.TestPartitionedMobCompactor.java">org/apache/hadoop/hbase/mob/compactions/TestPartitionedMobCompactor.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>9</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.monitoring.LogMonitoring.java">org/apache/hadoop/hbase/monitoring/LogMonitoring.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>2</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.monitoring.MemoryBoundedLogMessageBuffer.java">org/apache/hadoop/hbase/monitoring/MemoryBoundedLogMessageBuffer.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>2</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.monitoring.MonitoredRPCHandlerImpl.java">org/apache/hadoop/hbase/monitoring/MonitoredRPCHandlerImpl.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>4</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.monitoring.MonitoredTaskImpl.java">org/apache/hadoop/hbase/monitoring/MonitoredTaskImpl.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>1</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.monitoring.StateDumpServlet.java">org/apache/hadoop/hbase/monitoring/StateDumpServlet.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>1</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.monitoring.TaskMonitor.java">org/apache/hadoop/hbase/monitoring/TaskMonitor.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>1</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.monitoring.TestTaskMonitor.java">org/apache/hadoop/hbase/monitoring/TestTaskMonitor.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>1</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.monitoring.ThreadMonitoring.java">org/apache/hadoop/hbase/monitoring/ThreadMonitoring.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>3</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.mttr.IntegrationTestMTTR.java">org/apache/hadoop/hbase/mttr/IntegrationTestMTTR.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>9</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.namespace.NamespaceStateManager.java">org/apache/hadoop/hbase/namespace/NamespaceStateManager.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>3</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.namespace.NamespaceTableAndRegionInfo.java">org/apache/hadoop/hbase/namespace/NamespaceTableAndRegionInfo.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>1</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.namespace.TestNamespaceAuditor.java">org/apache/hadoop/hbase/namespace/TestNamespaceAuditor.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>2</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.net.Address.java">org/apache/hadoop/hbase/net/Address.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>4</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.net.TestAddress.java">org/apache/hadoop/hbase/net/TestAddress.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>2</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.nio.ByteBuff.java">org/apache/hadoop/hbase/nio/ByteBuff.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>24</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.nio.MultiByteBuff.java">org/apache/hadoop/hbase/nio/MultiByteBuff.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>29</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.nio.SingleByteBuff.java">org/apache/hadoop/hbase/nio/SingleByteBuff.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>1</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.procedure.MasterProcedureManager.java">org/apache/hadoop/hbase/procedure/MasterProcedureManager.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>9</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.procedure.Procedure.java">org/apache/hadoop/hbase/procedure/Procedure.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>14</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.procedure.ProcedureCoordinator.java">org/apache/hadoop/hbase/procedure/ProcedureCoordinator.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>11</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.procedure.ProcedureCoordinatorRpcs.java">org/apache/hadoop/hbase/procedure/ProcedureCoordinatorRpcs.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>2</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.procedure.ProcedureManagerHost.java">org/apache/hadoop/hbase/procedure/ProcedureManagerHost.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>3</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.procedure.ProcedureMember.java">org/apache/hadoop/hbase/procedure/ProcedureMember.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>16</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.procedure.ProcedureMemberRpcs.java">org/apache/hadoop/hbase/procedure/ProcedureMemberRpcs.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>3</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.procedure.RegionServerProcedureManager.java">org/apache/hadoop/hbase/procedure/RegionServerProcedureManager.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>3</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.procedure.SimpleMasterProcedureManager.java">org/apache/hadoop/hbase/procedure/SimpleMasterProcedureManager.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>1</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.procedure.SimpleRSProcedureManager.java">org/apache/hadoop/hbase/procedure/SimpleRSProcedureManager.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>4</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.procedure.Subprocedure.java">org/apache/hadoop/hbase/procedure/Subprocedure.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>9</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.procedure.TestProcedureCoordinator.java">org/apache/hadoop/hbase/procedure/TestProcedureCoordinator.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>11</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.procedure.TestProcedureDescriber.java">org/apache/hadoop/hbase/procedure/TestProcedureDescriber.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>1</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.procedure.TestProcedureMember.java">org/apache/hadoop/hbase/procedure/TestProcedureMember.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>6</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.procedure.TestZKProcedure.java">org/apache/hadoop/hbase/procedure/TestZKProcedure.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>29</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.procedure.TestZKProcedureControllers.java">org/apache/hadoop/hbase/procedure/TestZKProcedureControllers.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>7</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.procedure.ZKProcedureCoordinator.java">org/apache/hadoop/hbase/procedure/ZKProcedureCoordinator.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>2</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.procedure.ZKProcedureMemberRpcs.java">org/apache/hadoop/hbase/procedure/ZKProcedureMemberRpcs.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>3</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.procedure.ZKProcedureUtil.java">org/apache/hadoop/hbase/procedure/ZKProcedureUtil.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>5</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.procedure.flush.FlushTableSubprocedure.java">org/apache/hadoop/hbase/procedure/flush/FlushTableSubprocedure.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>1</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.procedure.flush.MasterFlushTableProcedureManager.java">org/apache/hadoop/hbase/procedure/flush/MasterFlushTableProcedureManager.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>2</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.procedure.flush.RegionServerFlushTableProcedureManager.java">org/apache/hadoop/hbase/procedure/flush/RegionServerFlushTableProcedureManager.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>10</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.procedure2.AbstractProcedureScheduler.java">org/apache/hadoop/hbase/procedure2/AbstractProcedureScheduler.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>3</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.procedure2.BadProcedureException.java">org/apache/hadoop/hbase/procedure2/BadProcedureException.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>1</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.procedure2.LockAndQueue.java">org/apache/hadoop/hbase/procedure2/LockAndQueue.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>3</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.procedure2.LockedResource.java">org/apache/hadoop/hbase/procedure2/LockedResource.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>2</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.procedure2.Procedure.java">org/apache/hadoop/hbase/procedure2/Procedure.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>10</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.procedure2.ProcedureDeque.java">org/apache/hadoop/hbase/procedure2/ProcedureDeque.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>3</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.procedure2.ProcedureException.java">org/apache/hadoop/hbase/procedure2/ProcedureException.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>1</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.procedure2.ProcedureExecutor.java">org/apache/hadoop/hbase/procedure2/ProcedureExecutor.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>20</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.procedure2.ProcedureScheduler.java">org/apache/hadoop/hbase/procedure2/ProcedureScheduler.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>1</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.procedure2.ProcedureTestingUtility.java">org/apache/hadoop/hbase/procedure2/ProcedureTestingUtility.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>4</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.procedure2.ProcedureUtil.java">org/apache/hadoop/hbase/procedure2/ProcedureUtil.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>3</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.procedure2.RemoteProcedureDispatcher.java">org/apache/hadoop/hbase/procedure2/RemoteProcedureDispatcher.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>4</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.procedure2.RemoteProcedureException.java">org/apache/hadoop/hbase/procedure2/RemoteProcedureException.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>4</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.procedure2.RootProcedureState.java">org/apache/hadoop/hbase/procedure2/RootProcedureState.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>4</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.procedure2.StateMachineProcedure.java">org/apache/hadoop/hbase/procedure2/StateMachineProcedure.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>6</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.procedure2.TestProcedureExecution.java">org/apache/hadoop/hbase/procedure2/TestProcedureExecution.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>2</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.procedure2.TestProcedureExecutor.java">org/apache/hadoop/hbase/procedure2/TestProcedureExecutor.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>1</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.procedure2.TestProcedureMetrics.java">org/apache/hadoop/hbase/procedure2/TestProcedureMetrics.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>1</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.procedure2.TestProcedureNonce.java">org/apache/hadoop/hbase/procedure2/TestProcedureNonce.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>4</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.procedure2.TestProcedureRecovery.java">org/apache/hadoop/hbase/procedure2/TestProcedureRecovery.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>1</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.procedure2.TestProcedureReplayOrder.java">org/apache/hadoop/hbase/procedure2/TestProcedureReplayOrder.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>1</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.procedure2.TestProcedureSchedulerConcurrency.java">org/apache/hadoop/hbase/procedure2/TestProcedureSchedulerConcurrency.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>4</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.procedure2.TestProcedureSuspended.java">org/apache/hadoop/hbase/procedure2/TestProcedureSuspended.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>5</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.procedure2.TestProcedureToString.java">org/apache/hadoop/hbase/procedure2/TestProcedureToString.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>4</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.procedure2.TestStateMachineProcedure.java">org/apache/hadoop/hbase/procedure2/TestStateMachineProcedure.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>3</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.procedure2.TestYieldProcedures.java">org/apache/hadoop/hbase/procedure2/TestYieldProcedures.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>3</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.procedure2.store.ProcedureStore.java">org/apache/hadoop/hbase/procedure2/store/ProcedureStore.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>2</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.procedure2.store.ProcedureStoreBase.java">org/apache/hadoop/hbase/procedure2/store/ProcedureStoreBase.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>1</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.procedure2.store.ProcedureStoreTracker.java">org/apache/hadoop/hbase/procedure2/store/ProcedureStoreTracker.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>3</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.procedure2.store.TestProcedureStoreTracker.java">org/apache/hadoop/hbase/procedure2/store/TestProcedureStoreTracker.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>1</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.procedure2.store.wal.ProcedureWALFile.java">org/apache/hadoop/hbase/procedure2/store/wal/ProcedureWALFile.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>4</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.procedure2.store.wal.ProcedureWALFormat.java">org/apache/hadoop/hbase/procedure2/store/wal/ProcedureWALFormat.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>2</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.procedure2.store.wal.ProcedureWALFormatReader.java">org/apache/hadoop/hbase/procedure2/store/wal/ProcedureWALFormatReader.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>9</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.procedure2.store.wal.ProcedureWALLoaderPerformanceEvaluation.java">org/apache/hadoop/hbase/procedure2/store/wal/ProcedureWALLoaderPerformanceEvaluation.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>7</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.procedure2.store.wal.ProcedureWALPerformanceEvaluation.java">org/apache/hadoop/hbase/procedure2/store/wal/ProcedureWALPerformanceEvaluation.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>4</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.procedure2.store.wal.ProcedureWALPrettyPrinter.java">org/apache/hadoop/hbase/procedure2/store/wal/ProcedureWALPrettyPrinter.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>2</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.procedure2.store.wal.TestStressWALProcedureStore.java">org/apache/hadoop/hbase/procedure2/store/wal/TestStressWALProcedureStore.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>3</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.procedure2.store.wal.TestWALProcedureStore.java">org/apache/hadoop/hbase/procedure2/store/wal/TestWALProcedureStore.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>12</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.procedure2.store.wal.WALProcedureStore.java">org/apache/hadoop/hbase/procedure2/store/wal/WALProcedureStore.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>9</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.procedure2.util.DelayedUtil.java">org/apache/hadoop/hbase/procedure2/util/DelayedUtil.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>4</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.procedure2.util.StringUtils.java">org/apache/hadoop/hbase/procedure2/util/StringUtils.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>4</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.protobuf.ProtobufMagic.java">org/apache/hadoop/hbase/protobuf/ProtobufMagic.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>3</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.protobuf.ProtobufMessageConverter.java">org/apache/hadoop/hbase/protobuf/ProtobufMessageConverter.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>1</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.protobuf.ProtobufUtil.java">org/apache/hadoop/hbase/protobuf/ProtobufUtil.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>106</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.protobuf.ReplicationProtbufUtil.java">org/apache/hadoop/hbase/protobuf/ReplicationProtbufUtil.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>7</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.protobuf.TestProtobufUtil.java">org/apache/hadoop/hbase/protobuf/TestProtobufUtil.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>6</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.protobuf.TestReplicationProtobuf.java">org/apache/hadoop/hbase/protobuf/TestReplicationProtobuf.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>2</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.quotas.ActivePolicyEnforcement.java">org/apache/hadoop/hbase/quotas/ActivePolicyEnforcement.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>1</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.quotas.AverageIntervalRateLimiter.java">org/apache/hadoop/hbase/quotas/AverageIntervalRateLimiter.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>1</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.quotas.DefaultOperationQuota.java">org/apache/hadoop/hbase/quotas/DefaultOperationQuota.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>4</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.quotas.FileSystemUtilizationChore.java">org/apache/hadoop/hbase/quotas/FileSystemUtilizationChore.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>4</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.quotas.FixedIntervalRateLimiter.java">org/apache/hadoop/hbase/quotas/FixedIntervalRateLimiter.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>1</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.quotas.GlobalQuotaSettings.java">org/apache/hadoop/hbase/quotas/GlobalQuotaSettings.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>1</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.quotas.GlobalQuotaSettingsImpl.java">org/apache/hadoop/hbase/quotas/GlobalQuotaSettingsImpl.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>5</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.quotas.MasterSpaceQuotaObserver.java">org/apache/hadoop/hbase/quotas/MasterSpaceQuotaObserver.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>1</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.quotas.NamespaceQuotaSnapshotStore.java">org/apache/hadoop/hbase/quotas/NamespaceQuotaSnapshotStore.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>1</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.quotas.NoopOperationQuota.java">org/apache/hadoop/hbase/quotas/NoopOperationQuota.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>2</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.quotas.NoopQuotaLimiter.java">org/apache/hadoop/hbase/quotas/NoopQuotaLimiter.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>3</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.quotas.OperationQuota.java">org/apache/hadoop/hbase/quotas/OperationQuota.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>1</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.quotas.QuotaCache.java">org/apache/hadoop/hbase/quotas/QuotaCache.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>6</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.quotas.QuotaLimiter.java">org/apache/hadoop/hbase/quotas/QuotaLimiter.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>2</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.quotas.QuotaLimiterFactory.java">org/apache/hadoop/hbase/quotas/QuotaLimiterFactory.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>1</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.quotas.QuotaObserverChore.java">org/apache/hadoop/hbase/quotas/QuotaObserverChore.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>1</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.quotas.QuotaRetriever.java">org/apache/hadoop/hbase/quotas/QuotaRetriever.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>4</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.quotas.QuotaSettings.java">org/apache/hadoop/hbase/quotas/QuotaSettings.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>7</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.quotas.QuotaSettingsFactory.java">org/apache/hadoop/hbase/quotas/QuotaSettingsFactory.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>3</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.quotas.QuotaState.java">org/apache/hadoop/hbase/quotas/QuotaState.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>1</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.quotas.QuotaTableUtil.java">org/apache/hadoop/hbase/quotas/QuotaTableUtil.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>7</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.quotas.QuotaUtil.java">org/apache/hadoop/hbase/quotas/QuotaUtil.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>5</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.quotas.RateLimiter.java">org/apache/hadoop/hbase/quotas/RateLimiter.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>18</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.quotas.RegionServerRpcQuotaManager.java">org/apache/hadoop/hbase/quotas/RegionServerRpcQuotaManager.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>3</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.quotas.RegionServerSpaceQuotaManager.java">org/apache/hadoop/hbase/quotas/RegionServerSpaceQuotaManager.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>4</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.quotas.SnapshotQuotaObserverChore.java">org/apache/hadoop/hbase/quotas/SnapshotQuotaObserverChore.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>1</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.quotas.SpaceLimitSettings.java">org/apache/hadoop/hbase/quotas/SpaceLimitSettings.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>1</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.quotas.SpaceQuotaRefresherChore.java">org/apache/hadoop/hbase/quotas/SpaceQuotaRefresherChore.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>1</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.quotas.SpaceQuotaSnapshot.java">org/apache/hadoop/hbase/quotas/SpaceQuotaSnapshot.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>1</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.quotas.SpaceQuotaSnapshotNotifier.java">org/apache/hadoop/hbase/quotas/SpaceQuotaSnapshotNotifier.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>1</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.quotas.SpaceQuotaSnapshotNotifierFactory.java">org/apache/hadoop/hbase/quotas/SpaceQuotaSnapshotNotifierFactory.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>1</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.quotas.SpaceQuotaSnapshotNotifierForTest.java">org/apache/hadoop/hbase/quotas/SpaceQuotaSnapshotNotifierForTest.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>1</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.quotas.SpaceViolationPolicyEnforcement.java">org/apache/hadoop/hbase/quotas/SpaceViolationPolicyEnforcement.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>1</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.quotas.SpaceViolationPolicyEnforcementFactory.java">org/apache/hadoop/hbase/quotas/SpaceViolationPolicyEnforcementFactory.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>2</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.quotas.TableQuotaSnapshotStore.java">org/apache/hadoop/hbase/quotas/TableQuotaSnapshotStore.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>1</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.quotas.TestFileSystemUtilizationChore.java">org/apache/hadoop/hbase/quotas/TestFileSystemUtilizationChore.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>1</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.quotas.TestMasterSpaceQuotaObserver.java">org/apache/hadoop/hbase/quotas/TestMasterSpaceQuotaObserver.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>1</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.quotas.TestNamespaceQuotaViolationStore.java">org/apache/hadoop/hbase/quotas/TestNamespaceQuotaViolationStore.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>1</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.quotas.TestQuotaFilter.java">org/apache/hadoop/hbase/quotas/TestQuotaFilter.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>3</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.quotas.TestQuotaObserverChoreWithMiniCluster.java">org/apache/hadoop/hbase/quotas/TestQuotaObserverChoreWithMiniCluster.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>6</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.quotas.TestQuotaSettingsFactory.java">org/apache/hadoop/hbase/quotas/TestQuotaSettingsFactory.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>7</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.quotas.TestQuotaStatusRPCs.java">org/apache/hadoop/hbase/quotas/TestQuotaStatusRPCs.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>1</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.quotas.TestQuotaThrottle.java">org/apache/hadoop/hbase/quotas/TestQuotaThrottle.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>2</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.quotas.TestRateLimiter.java">org/apache/hadoop/hbase/quotas/TestRateLimiter.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>1</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.quotas.TestSpaceQuotas.java">org/apache/hadoop/hbase/quotas/TestSpaceQuotas.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>3</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.quotas.TestTableQuotaViolationStore.java">org/apache/hadoop/hbase/quotas/TestTableQuotaViolationStore.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>1</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.quotas.TestTablesWithQuotas.java">org/apache/hadoop/hbase/quotas/TestTablesWithQuotas.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>1</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.quotas.ThrottleSettings.java">org/apache/hadoop/hbase/quotas/ThrottleSettings.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>2</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.quotas.TimeBasedLimiter.java">org/apache/hadoop/hbase/quotas/TimeBasedLimiter.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>7</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.quotas.UserQuotaState.java">org/apache/hadoop/hbase/quotas/UserQuotaState.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>4</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.quotas.policies.BaseViolationPolicyEnforcement.java">org/apache/hadoop/hbase/quotas/policies/BaseViolationPolicyEnforcement.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>1</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.quotas.policies.DefaultViolationPolicyEnforcement.java">org/apache/hadoop/hbase/quotas/policies/DefaultViolationPolicyEnforcement.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>1</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.quotas.policies.DisableTableViolationPolicyEnforcement.java">org/apache/hadoop/hbase/quotas/policies/DisableTableViolationPolicyEnforcement.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>1</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.quotas.policies.NoInsertsViolationPolicyEnforcement.java">org/apache/hadoop/hbase/quotas/policies/NoInsertsViolationPolicyEnforcement.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>1</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.quotas.policies.NoWritesCompactionsViolationPolicyEnforcement.java">org/apache/hadoop/hbase/quotas/policies/NoWritesCompactionsViolationPolicyEnforcement.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>1</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.quotas.policies.NoWritesViolationPolicyEnforcement.java">org/apache/hadoop/hbase/quotas/policies/NoWritesViolationPolicyEnforcement.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>1</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.quotas.policies.TestBulkLoadCheckingViolationPolicyEnforcement.java">org/apache/hadoop/hbase/quotas/policies/TestBulkLoadCheckingViolationPolicyEnforcement.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>4</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.regionserver.AbstractMemStore.java">org/apache/hadoop/hbase/regionserver/AbstractMemStore.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>4</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.regionserver.AbstractMultiFileWriter.java">org/apache/hadoop/hbase/regionserver/AbstractMultiFileWriter.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>2</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.regionserver.AbstractTestDateTieredCompactionPolicy.java">org/apache/hadoop/hbase/regionserver/AbstractTestDateTieredCompactionPolicy.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>1</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.regionserver.AnnotationReadingPriorityFunction.java">org/apache/hadoop/hbase/regionserver/AnnotationReadingPriorityFunction.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>16</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.regionserver.BaseRowProcessor.java">org/apache/hadoop/hbase/regionserver/BaseRowProcessor.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>3</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.regionserver.BusyRegionSplitPolicy.java">org/apache/hadoop/hbase/regionserver/BusyRegionSplitPolicy.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>1</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.regionserver.ByteBufferChunkKeyValue.java">org/apache/hadoop/hbase/regionserver/ByteBufferChunkKeyValue.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>1</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.regionserver.CSLMImmutableSegment.java">org/apache/hadoop/hbase/regionserver/CSLMImmutableSegment.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>1</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.regionserver.CellArrayImmutableSegment.java">org/apache/hadoop/hbase/regionserver/CellArrayImmutableSegment.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>2</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.regionserver.CellArrayMap.java">org/apache/hadoop/hbase/regionserver/CellArrayMap.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>3</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.regionserver.CellChunkMap.java">org/apache/hadoop/hbase/regionserver/CellChunkMap.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>4</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.regionserver.CellFlatMap.java">org/apache/hadoop/hbase/regionserver/CellFlatMap.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>11</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.regionserver.CellSet.java">org/apache/hadoop/hbase/regionserver/CellSet.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>2</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.regionserver.CellSink.java">org/apache/hadoop/hbase/regionserver/CellSink.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>2</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.regionserver.ChangedReadersObserver.java">org/apache/hadoop/hbase/regionserver/ChangedReadersObserver.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>1</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.regionserver.Chunk.java">org/apache/hadoop/hbase/regionserver/Chunk.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>1</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.regionserver.ChunkCreator.java">org/apache/hadoop/hbase/regionserver/ChunkCreator.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>5</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.regionserver.CompactSplit.java">org/apache/hadoop/hbase/regionserver/CompactSplit.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>9</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.regionserver.CompactedHFilesDischargeHandler.java">org/apache/hadoop/hbase/regionserver/CompactedHFilesDischargeHandler.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>2</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.regionserver.CompactedHFilesDischarger.java">org/apache/hadoop/hbase/regionserver/CompactedHFilesDischarger.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>2</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.regionserver.CompactingMemStore.java">org/apache/hadoop/hbase/regionserver/CompactingMemStore.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>8</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.regionserver.CompactionPipeline.java">org/apache/hadoop/hbase/regionserver/CompactionPipeline.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>4</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.regionserver.CompactionTool.java">org/apache/hadoop/hbase/regionserver/CompactionTool.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>3</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.regionserver.CompositeImmutableSegment.java">org/apache/hadoop/hbase/regionserver/CompositeImmutableSegment.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>2</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.regionserver.ConstantSizeRegionSplitPolicy.java">org/apache/hadoop/hbase/regionserver/ConstantSizeRegionSplitPolicy.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>3</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.regionserver.CreateRandomStoreFile.java">org/apache/hadoop/hbase/regionserver/CreateRandomStoreFile.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>4</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.regionserver.DataBlockEncodingTool.java">org/apache/hadoop/hbase/regionserver/DataBlockEncodingTool.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>6</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.regionserver.DateTieredStoreEngine.java">org/apache/hadoop/hbase/regionserver/DateTieredStoreEngine.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>1</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.regionserver.DefaultHeapMemoryTuner.java">org/apache/hadoop/hbase/regionserver/DefaultHeapMemoryTuner.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>31</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.regionserver.DefaultMemStore.java">org/apache/hadoop/hbase/regionserver/DefaultMemStore.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>2</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.regionserver.DefaultStoreFlusher.java">org/apache/hadoop/hbase/regionserver/DefaultStoreFlusher.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>2</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.regionserver.DelegatingKeyValueScanner.java">org/apache/hadoop/hbase/regionserver/DelegatingKeyValueScanner.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>3</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.regionserver.DelimitedKeyPrefixRegionSplitPolicy.java">org/apache/hadoop/hbase/regionserver/DelimitedKeyPrefixRegionSplitPolicy.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>3</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.regionserver.DisabledRegionSplitPolicy.java">org/apache/hadoop/hbase/regionserver/DisabledRegionSplitPolicy.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>1</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.regionserver.FavoredNodesForRegion.java">org/apache/hadoop/hbase/regionserver/FavoredNodesForRegion.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>3</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.regionserver.FifoRpcSchedulerFactory.java">org/apache/hadoop/hbase/regionserver/FifoRpcSchedulerFactory.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>2</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.regionserver.FlushPolicyFactory.java">org/apache/hadoop/hbase/regionserver/FlushPolicyFactory.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>3</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.regionserver.FlushRequestListener.java">org/apache/hadoop/hbase/regionserver/FlushRequestListener.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>1</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.regionserver.FlushRequester.java">org/apache/hadoop/hbase/regionserver/FlushRequester.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>3</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.regionserver.HMobStore.java">org/apache/hadoop/hbase/regionserver/HMobStore.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>8</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.regionserver.HRegion.java">org/apache/hadoop/hbase/regionserver/HRegion.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>205</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.regionserver.HRegionFileSystem.java">org/apache/hadoop/hbase/regionserver/HRegionFileSystem.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>47</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.regionserver.HRegionServer.java">org/apache/hadoop/hbase/regionserver/HRegionServer.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>87</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.regionserver.HRegionServerCommandLine.java">org/apache/hadoop/hbase/regionserver/HRegionServerCommandLine.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>2</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.regionserver.HStore.java">org/apache/hadoop/hbase/regionserver/HStore.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>43</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.regionserver.HStoreFile.java">org/apache/hadoop/hbase/regionserver/HStoreFile.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>6</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.regionserver.HeapMemoryManager.java">org/apache/hadoop/hbase/regionserver/HeapMemoryManager.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>11</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.regionserver.HeapMemoryTuner.java">org/apache/hadoop/hbase/regionserver/HeapMemoryTuner.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>2</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.regionserver.ImmutableSegment.java">org/apache/hadoop/hbase/regionserver/ImmutableSegment.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>2</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.regionserver.IncreasingToUpperBoundRegionSplitPolicy.java">org/apache/hadoop/hbase/regionserver/IncreasingToUpperBoundRegionSplitPolicy.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>3</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.regionserver.InternalScan.java">org/apache/hadoop/hbase/regionserver/InternalScan.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>3</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.regionserver.InternalScanner.java">org/apache/hadoop/hbase/regionserver/InternalScanner.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>2</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.regionserver.KeyPrefixRegionSplitPolicy.java">org/apache/hadoop/hbase/regionserver/KeyPrefixRegionSplitPolicy.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>1</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.regionserver.KeyValueHeap.java">org/apache/hadoop/hbase/regionserver/KeyValueHeap.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>11</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.regionserver.KeyValueScanner.java">org/apache/hadoop/hbase/regionserver/KeyValueScanner.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>4</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.regionserver.LeaseException.java">org/apache/hadoop/hbase/regionserver/LeaseException.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>1</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.regionserver.Leases.java">org/apache/hadoop/hbase/regionserver/Leases.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>10</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.regionserver.LogRoller.java">org/apache/hadoop/hbase/regionserver/LogRoller.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>1</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.regionserver.MemStore.java">org/apache/hadoop/hbase/regionserver/MemStore.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>10</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.regionserver.MemStoreCompactor.java">org/apache/hadoop/hbase/regionserver/MemStoreCompactor.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>1</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.regionserver.MemStoreFlusher.java">org/apache/hadoop/hbase/regionserver/MemStoreFlusher.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>29</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.regionserver.MemStoreLAB.java">org/apache/hadoop/hbase/regionserver/MemStoreLAB.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>1</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.regionserver.MemStoreLABImpl.java">org/apache/hadoop/hbase/regionserver/MemStoreLABImpl.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>2</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.regionserver.MemStoreMergerSegmentsIterator.java">org/apache/hadoop/hbase/regionserver/MemStoreMergerSegmentsIterator.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>1</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.regionserver.MemStoreSegmentsIterator.java">org/apache/hadoop/hbase/regionserver/MemStoreSegmentsIterator.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>1</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.regionserver.MemStoreSnapshot.java">org/apache/hadoop/hbase/regionserver/MemStoreSnapshot.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>1</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.regionserver.MetricsHeapMemoryManagerSourceImpl.java">org/apache/hadoop/hbase/regionserver/MetricsHeapMemoryManagerSourceImpl.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>1</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.regionserver.MetricsRegion.java">org/apache/hadoop/hbase/regionserver/MetricsRegion.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>1</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.regionserver.MetricsRegionAggregateSourceImpl.java">org/apache/hadoop/hbase/regionserver/MetricsRegionAggregateSourceImpl.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>1</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.regionserver.MetricsRegionServer.java">org/apache/hadoop/hbase/regionserver/MetricsRegionServer.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>1</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.regionserver.MetricsRegionServerSourceFactoryImpl.java">org/apache/hadoop/hbase/regionserver/MetricsRegionServerSourceFactoryImpl.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>2</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.regionserver.MetricsRegionServerSourceImpl.java">org/apache/hadoop/hbase/regionserver/MetricsRegionServerSourceImpl.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>5</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.regionserver.MetricsRegionServerWrapperImpl.java">org/apache/hadoop/hbase/regionserver/MetricsRegionServerWrapperImpl.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>1</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.regionserver.MetricsRegionServerWrapperStub.java">org/apache/hadoop/hbase/regionserver/MetricsRegionServerWrapperStub.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>2</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.regionserver.MetricsRegionSourceImpl.java">org/apache/hadoop/hbase/regionserver/MetricsRegionSourceImpl.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>1</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.regionserver.MetricsTable.java">org/apache/hadoop/hbase/regionserver/MetricsTable.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>1</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.regionserver.MetricsTableAggregateSourceImpl.java">org/apache/hadoop/hbase/regionserver/MetricsTableAggregateSourceImpl.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>2</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.regionserver.MetricsTableSourceImpl.java">org/apache/hadoop/hbase/regionserver/MetricsTableSourceImpl.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>3</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.regionserver.MetricsTableWrapperAggregateImpl.java">org/apache/hadoop/hbase/regionserver/MetricsTableWrapperAggregateImpl.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>20</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.regionserver.MiniBatchOperationInProgress.java">org/apache/hadoop/hbase/regionserver/MiniBatchOperationInProgress.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>10</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.regionserver.MobReferenceOnlyFilter.java">org/apache/hadoop/hbase/regionserver/MobReferenceOnlyFilter.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>1</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.regionserver.MultiVersionConcurrencyControl.java">org/apache/hadoop/hbase/regionserver/MultiVersionConcurrencyControl.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>4</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.regionserver.MutableOnlineRegions.java">org/apache/hadoop/hbase/regionserver/MutableOnlineRegions.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>1</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.regionserver.MutableSegment.java">org/apache/hadoop/hbase/regionserver/MutableSegment.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>3</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.regionserver.NoTagByteBufferChunkKeyValue.java">org/apache/hadoop/hbase/regionserver/NoTagByteBufferChunkKeyValue.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>1</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.regionserver.NonLazyKeyValueScanner.java">org/apache/hadoop/hbase/regionserver/NonLazyKeyValueScanner.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>1</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.regionserver.NonReversedNonLazyKeyValueScanner.java">org/apache/hadoop/hbase/regionserver/NonReversedNonLazyKeyValueScanner.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>1</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.regionserver.OOMERegionServer.java">org/apache/hadoop/hbase/regionserver/OOMERegionServer.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>1</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.regionserver.OnlineRegions.java">org/apache/hadoop/hbase/regionserver/OnlineRegions.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>6</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.regionserver.OperationStatus.java">org/apache/hadoop/hbase/regionserver/OperationStatus.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>1</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.regionserver.RSDumpServlet.java">org/apache/hadoop/hbase/regionserver/RSDumpServlet.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>2</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.regionserver.RSRpcServices.java">org/apache/hadoop/hbase/regionserver/RSRpcServices.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>65</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.regionserver.RSStatusServlet.java">org/apache/hadoop/hbase/regionserver/RSStatusServlet.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>5</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.regionserver.Region.java">org/apache/hadoop/hbase/regionserver/Region.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>26</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.regionserver.RegionAsTable.java">org/apache/hadoop/hbase/regionserver/RegionAsTable.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>26</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.regionserver.RegionCoprocessorHost.java">org/apache/hadoop/hbase/regionserver/RegionCoprocessorHost.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>79</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.regionserver.RegionScanner.java">org/apache/hadoop/hbase/regionserver/RegionScanner.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>1</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.regionserver.RegionServerAccounting.java">org/apache/hadoop/hbase/regionserver/RegionServerAccounting.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>1</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.regionserver.RegionServerCoprocessorHost.java">org/apache/hadoop/hbase/regionserver/RegionServerCoprocessorHost.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>7</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.regionserver.RegionServerServices.java">org/apache/hadoop/hbase/regionserver/RegionServerServices.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>6</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.regionserver.RegionServicesForStores.java">org/apache/hadoop/hbase/regionserver/RegionServicesForStores.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>6</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.regionserver.RegionSplitPolicy.java">org/apache/hadoop/hbase/regionserver/RegionSplitPolicy.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>5</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.regionserver.ReplicationSinkService.java">org/apache/hadoop/hbase/regionserver/ReplicationSinkService.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>2</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.regionserver.ReversedKeyValueHeap.java">org/apache/hadoop/hbase/regionserver/ReversedKeyValueHeap.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>7</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.regionserver.ReversedRegionScannerImpl.java">org/apache/hadoop/hbase/regionserver/ReversedRegionScannerImpl.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>4</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.regionserver.ReversedStoreScanner.java">org/apache/hadoop/hbase/regionserver/ReversedStoreScanner.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>2</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.regionserver.RowProcessor.java">org/apache/hadoop/hbase/regionserver/RowProcessor.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>7</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.regionserver.RpcSchedulerFactory.java">org/apache/hadoop/hbase/regionserver/RpcSchedulerFactory.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>2</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.regionserver.ScanInfo.java">org/apache/hadoop/hbase/regionserver/ScanInfo.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>4</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.regionserver.ScanOptions.java">org/apache/hadoop/hbase/regionserver/ScanOptions.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>3</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.regionserver.ScannerContext.java">org/apache/hadoop/hbase/regionserver/ScannerContext.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>9</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.regionserver.ScannerIdGenerator.java">org/apache/hadoop/hbase/regionserver/ScannerIdGenerator.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>7</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.regionserver.SecureBulkLoadEndpointClient.java">org/apache/hadoop/hbase/regionserver/SecureBulkLoadEndpointClient.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>3</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.regionserver.SecureBulkLoadManager.java">org/apache/hadoop/hbase/regionserver/SecureBulkLoadManager.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>3</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.regionserver.Segment.java">org/apache/hadoop/hbase/regionserver/Segment.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>2</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.regionserver.SegmentFactory.java">org/apache/hadoop/hbase/regionserver/SegmentFactory.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>12</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.regionserver.SegmentScanner.java">org/apache/hadoop/hbase/regionserver/SegmentScanner.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>2</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.regionserver.ServerNonceManager.java">org/apache/hadoop/hbase/regionserver/ServerNonceManager.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>8</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.regionserver.ShipperListener.java">org/apache/hadoop/hbase/regionserver/ShipperListener.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>1</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.regionserver.ShutdownHook.java">org/apache/hadoop/hbase/regionserver/ShutdownHook.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>7</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.regionserver.SimpleRpcSchedulerFactory.java">org/apache/hadoop/hbase/regionserver/SimpleRpcSchedulerFactory.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>4</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.regionserver.SplitLogWorker.java">org/apache/hadoop/hbase/regionserver/SplitLogWorker.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>2</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.regionserver.SplitRequest.java">org/apache/hadoop/hbase/regionserver/SplitRequest.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>1</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.regionserver.SteppingSplitPolicy.java">org/apache/hadoop/hbase/regionserver/SteppingSplitPolicy.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>3</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.regionserver.Store.java">org/apache/hadoop/hbase/regionserver/Store.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>4</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.regionserver.StoreFileComparators.java">org/apache/hadoop/hbase/regionserver/StoreFileComparators.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>2</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.regionserver.StoreFileInfo.java">org/apache/hadoop/hbase/regionserver/StoreFileInfo.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>18</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.regionserver.StoreFileManager.java">org/apache/hadoop/hbase/regionserver/StoreFileManager.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>2</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.regionserver.StoreFileReader.java">org/apache/hadoop/hbase/regionserver/StoreFileReader.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>4</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.regionserver.StoreFileScanner.java">org/apache/hadoop/hbase/regionserver/StoreFileScanner.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>10</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.regionserver.StoreFileWriter.java">org/apache/hadoop/hbase/regionserver/StoreFileWriter.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>13</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.regionserver.StoreFlushContext.java">org/apache/hadoop/hbase/regionserver/StoreFlushContext.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>4</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.regionserver.StoreFlusher.java">org/apache/hadoop/hbase/regionserver/StoreFlusher.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>4</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.regionserver.StoreScanner.java">org/apache/hadoop/hbase/regionserver/StoreScanner.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>23</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.regionserver.StoreUtils.java">org/apache/hadoop/hbase/regionserver/StoreUtils.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>1</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.regionserver.StorefileRefresherChore.java">org/apache/hadoop/hbase/regionserver/StorefileRefresherChore.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>3</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.regionserver.StripeMultiFileWriter.java">org/apache/hadoop/hbase/regionserver/StripeMultiFileWriter.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>2</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.regionserver.StripeStoreConfig.java">org/apache/hadoop/hbase/regionserver/StripeStoreConfig.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>1</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.regionserver.StripeStoreEngine.java">org/apache/hadoop/hbase/regionserver/StripeStoreEngine.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>1</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.regionserver.StripeStoreFileManager.java">org/apache/hadoop/hbase/regionserver/StripeStoreFileManager.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>15</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.regionserver.StripeStoreFlusher.java">org/apache/hadoop/hbase/regionserver/StripeStoreFlusher.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>1</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.regionserver.TestAtomicOperation.java">org/apache/hadoop/hbase/regionserver/TestAtomicOperation.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>12</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.regionserver.TestBlocksRead.java">org/apache/hadoop/hbase/regionserver/TestBlocksRead.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>16</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.regionserver.TestBlocksScanned.java">org/apache/hadoop/hbase/regionserver/TestBlocksScanned.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>5</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.regionserver.TestBulkLoad.java">org/apache/hadoop/hbase/regionserver/TestBulkLoad.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>3</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.regionserver.TestCacheOnWriteInSchema.java">org/apache/hadoop/hbase/regionserver/TestCacheOnWriteInSchema.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>2</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.regionserver.TestCellFlatSet.java">org/apache/hadoop/hbase/regionserver/TestCellFlatSet.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>6</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.regionserver.TestCellSkipListSet.java">org/apache/hadoop/hbase/regionserver/TestCellSkipListSet.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>1</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.regionserver.TestClearRegionBlockCache.java">org/apache/hadoop/hbase/regionserver/TestClearRegionBlockCache.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>2</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.regionserver.TestColumnSeeking.java">org/apache/hadoop/hbase/regionserver/TestColumnSeeking.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>6</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.regionserver.TestCompactSplitThread.java">org/apache/hadoop/hbase/regionserver/TestCompactSplitThread.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>2</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.regionserver.TestCompactingMemStore.java">org/apache/hadoop/hbase/regionserver/TestCompactingMemStore.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>16</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.regionserver.TestCompactingToCellFlatMapMemStore.java">org/apache/hadoop/hbase/regionserver/TestCompactingToCellFlatMapMemStore.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>16</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.regionserver.TestCompaction.java">org/apache/hadoop/hbase/regionserver/TestCompaction.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>4</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.regionserver.TestCompactionState.java">org/apache/hadoop/hbase/regionserver/TestCompactionState.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>7</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.regionserver.TestCompoundBloomFilter.java">org/apache/hadoop/hbase/regionserver/TestCompoundBloomFilter.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>17</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.regionserver.TestDateTieredCompactionPolicy.java">org/apache/hadoop/hbase/regionserver/TestDateTieredCompactionPolicy.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>5</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.regionserver.TestDateTieredCompactionPolicyOverflow.java">org/apache/hadoop/hbase/regionserver/TestDateTieredCompactionPolicyOverflow.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>1</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.regionserver.TestDefaultMemStore.java">org/apache/hadoop/hbase/regionserver/TestDefaultMemStore.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>17</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.regionserver.TestDeleteMobTable.java">org/apache/hadoop/hbase/regionserver/TestDeleteMobTable.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>1</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.regionserver.TestEndToEndSplitTransaction.java">org/apache/hadoop/hbase/regionserver/TestEndToEndSplitTransaction.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>4</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.regionserver.TestFSErrorsExposed.java">org/apache/hadoop/hbase/regionserver/TestFSErrorsExposed.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>1</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.regionserver.TestFailedAppendAndSync.java">org/apache/hadoop/hbase/regionserver/TestFailedAppendAndSync.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>8</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.regionserver.TestHMobStore.java">org/apache/hadoop/hbase/regionserver/TestHMobStore.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>11</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.regionserver.TestHRegion.java">org/apache/hadoop/hbase/regionserver/TestHRegion.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>53</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.regionserver.TestHRegionFileSystem.java">org/apache/hadoop/hbase/regionserver/TestHRegionFileSystem.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>5</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.regionserver.TestHRegionInfo.java">org/apache/hadoop/hbase/regionserver/TestHRegionInfo.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>2</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.regionserver.TestHRegionOnCluster.java">org/apache/hadoop/hbase/regionserver/TestHRegionOnCluster.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>2</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.regionserver.TestHRegionReplayEvents.java">org/apache/hadoop/hbase/regionserver/TestHRegionReplayEvents.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>16</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.regionserver.TestHRegionServerBulkLoad.java">org/apache/hadoop/hbase/regionserver/TestHRegionServerBulkLoad.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>8</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.regionserver.TestHRegionServerBulkLoadWithOldClient.java">org/apache/hadoop/hbase/regionserver/TestHRegionServerBulkLoadWithOldClient.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>5</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.regionserver.TestHRegionServerBulkLoadWithOldSecureEndpoint.java">org/apache/hadoop/hbase/regionserver/TestHRegionServerBulkLoadWithOldSecureEndpoint.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>9</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.regionserver.TestHStore.java">org/apache/hadoop/hbase/regionserver/TestHStore.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>39</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.regionserver.TestHStoreFile.java">org/apache/hadoop/hbase/regionserver/TestHStoreFile.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>21</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.regionserver.TestJoinedScanners.java">org/apache/hadoop/hbase/regionserver/TestJoinedScanners.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>1</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.regionserver.TestKeepDeletes.java">org/apache/hadoop/hbase/regionserver/TestKeepDeletes.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>5</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.regionserver.TestKeyValueHeap.java">org/apache/hadoop/hbase/regionserver/TestKeyValueHeap.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>4</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.regionserver.TestKeyValueScanFixture.java">org/apache/hadoop/hbase/regionserver/TestKeyValueScanFixture.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>1</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.regionserver.TestMajorCompaction.java">org/apache/hadoop/hbase/regionserver/TestMajorCompaction.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>6</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.regionserver.TestMasterAddressTracker.java">org/apache/hadoop/hbase/regionserver/TestMasterAddressTracker.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>2</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.regionserver.TestMemStoreLAB.java">org/apache/hadoop/hbase/regionserver/TestMemStoreLAB.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>2</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.regionserver.TestMemstoreLABWithoutPool.java">org/apache/hadoop/hbase/regionserver/TestMemstoreLABWithoutPool.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>1</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.regionserver.TestMetricsRegion.java">org/apache/hadoop/hbase/regionserver/TestMetricsRegion.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>3</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.regionserver.TestMetricsRegionServer.java">org/apache/hadoop/hbase/regionserver/TestMetricsRegionServer.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>2</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.regionserver.TestMetricsRegionSourceImpl.java">org/apache/hadoop/hbase/regionserver/TestMetricsRegionSourceImpl.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>5</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.regionserver.TestMetricsTableAggregate.java">org/apache/hadoop/hbase/regionserver/TestMetricsTableAggregate.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>4</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.regionserver.TestMetricsTableSourceImpl.java">org/apache/hadoop/hbase/regionserver/TestMetricsTableSourceImpl.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>1</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.regionserver.TestMinorCompaction.java">org/apache/hadoop/hbase/regionserver/TestMinorCompaction.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>1</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.regionserver.TestMobStoreScanner.java">org/apache/hadoop/hbase/regionserver/TestMobStoreScanner.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>5</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.regionserver.TestMultiColumnScanner.java">org/apache/hadoop/hbase/regionserver/TestMultiColumnScanner.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>9</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.regionserver.TestMultiLogThreshold.java">org/apache/hadoop/hbase/regionserver/TestMultiLogThreshold.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>11</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.regionserver.TestMultiVersionConcurrencyControl.java">org/apache/hadoop/hbase/regionserver/TestMultiVersionConcurrencyControl.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>1</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.regionserver.TestParallelPut.java">org/apache/hadoop/hbase/regionserver/TestParallelPut.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>1</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.regionserver.TestPerColumnFamilyFlush.java">org/apache/hadoop/hbase/regionserver/TestPerColumnFamilyFlush.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>4</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.regionserver.TestPriorityRpc.java">org/apache/hadoop/hbase/regionserver/TestPriorityRpc.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>4</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.regionserver.TestQosFunction.java">org/apache/hadoop/hbase/regionserver/TestQosFunction.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>1</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.regionserver.TestRSKilledWhenInitializing.java">org/apache/hadoop/hbase/regionserver/TestRSKilledWhenInitializing.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>4</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.regionserver.TestRecoveredEdits.java">org/apache/hadoop/hbase/regionserver/TestRecoveredEdits.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>9</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.regionserver.TestRegionIncrement.java">org/apache/hadoop/hbase/regionserver/TestRegionIncrement.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>9</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.regionserver.TestRegionInfoBuilder.java">org/apache/hadoop/hbase/regionserver/TestRegionInfoBuilder.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>1</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.regionserver.TestRegionMergeTransactionOnCluster.java">org/apache/hadoop/hbase/regionserver/TestRegionMergeTransactionOnCluster.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>1</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.regionserver.TestRegionOpen.java">org/apache/hadoop/hbase/regionserver/TestRegionOpen.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>3</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.regionserver.TestRegionReplicaFailover.java">org/apache/hadoop/hbase/regionserver/TestRegionReplicaFailover.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>3</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.regionserver.TestRegionReplicas.java">org/apache/hadoop/hbase/regionserver/TestRegionReplicas.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>7</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.regionserver.TestRegionServerAbort.java">org/apache/hadoop/hbase/regionserver/TestRegionServerAbort.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>2</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.regionserver.TestRegionServerHostname.java">org/apache/hadoop/hbase/regionserver/TestRegionServerHostname.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>3</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.regionserver.TestRegionServerMetrics.java">org/apache/hadoop/hbase/regionserver/TestRegionServerMetrics.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>5</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.regionserver.TestRegionServerNoMaster.java">org/apache/hadoop/hbase/regionserver/TestRegionServerNoMaster.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>5</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.regionserver.TestRegionServerOnlineConfigChange.java">org/apache/hadoop/hbase/regionserver/TestRegionServerOnlineConfigChange.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>3</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.regionserver.TestRegionServerReadRequestMetrics.java">org/apache/hadoop/hbase/regionserver/TestRegionServerReadRequestMetrics.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>1</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.regionserver.TestRegionServerReportForDuty.java">org/apache/hadoop/hbase/regionserver/TestRegionServerReportForDuty.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>2</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.regionserver.TestRegionSplitPolicy.java">org/apache/hadoop/hbase/regionserver/TestRegionSplitPolicy.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>2</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.regionserver.TestResettingCounters.java">org/apache/hadoop/hbase/regionserver/TestResettingCounters.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>8</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.regionserver.TestReversibleScanners.java">org/apache/hadoop/hbase/regionserver/TestReversibleScanners.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>15</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.regionserver.TestRowTooBig.java">org/apache/hadoop/hbase/regionserver/TestRowTooBig.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>3</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.regionserver.TestScanWithBloomError.java">org/apache/hadoop/hbase/regionserver/TestScanWithBloomError.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>2</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.regionserver.TestScanner.java">org/apache/hadoop/hbase/regionserver/TestScanner.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>10</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.regionserver.TestScannerHeartbeatMessages.java">org/apache/hadoop/hbase/regionserver/TestScannerHeartbeatMessages.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>4</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.regionserver.TestScannerRetriableFailure.java">org/apache/hadoop/hbase/regionserver/TestScannerRetriableFailure.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>1</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.regionserver.TestScannerWithBulkload.java">org/apache/hadoop/hbase/regionserver/TestScannerWithBulkload.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>2</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.regionserver.TestSeekOptimizations.java">org/apache/hadoop/hbase/regionserver/TestSeekOptimizations.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>2</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.regionserver.TestServerCustomProtocol.java">org/apache/hadoop/hbase/regionserver/TestServerCustomProtocol.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>15</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.regionserver.TestServerNonceManager.java">org/apache/hadoop/hbase/regionserver/TestServerNonceManager.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>2</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.regionserver.TestSettingTime

<TRUNCATED>

[14/29] hbase-site git commit: Published site at 477f9fdb32873387231c5fbbff130ba8bf7b5d68.

Posted by gi...@apache.org.
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/621479e1/devapidocs/src-html/org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.Cluster.Action.html
----------------------------------------------------------------------
diff --git a/devapidocs/src-html/org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.Cluster.Action.html b/devapidocs/src-html/org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.Cluster.Action.html
index 7f42212..d4bf03c 100644
--- a/devapidocs/src-html/org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.Cluster.Action.html
+++ b/devapidocs/src-html/org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.Cluster.Action.html
@@ -1159,434 +1159,442 @@
 <span class="sourceLineNo">1151</span>    }<a name="line.1151"></a>
 <span class="sourceLineNo">1152</span>  }<a name="line.1152"></a>
 <span class="sourceLineNo">1153</span><a name="line.1153"></a>
-<span class="sourceLineNo">1154</span>  public void setRackManager(RackManager rackManager) {<a name="line.1154"></a>
-<span class="sourceLineNo">1155</span>    this.rackManager = rackManager;<a name="line.1155"></a>
-<span class="sourceLineNo">1156</span>  }<a name="line.1156"></a>
-<span class="sourceLineNo">1157</span><a name="line.1157"></a>
-<span class="sourceLineNo">1158</span>  protected boolean needsBalance(Cluster c) {<a name="line.1158"></a>
-<span class="sourceLineNo">1159</span>    ClusterLoadState cs = new ClusterLoadState(c.clusterState);<a name="line.1159"></a>
-<span class="sourceLineNo">1160</span>    if (cs.getNumServers() &lt; MIN_SERVER_BALANCE) {<a name="line.1160"></a>
-<span class="sourceLineNo">1161</span>      if (LOG.isDebugEnabled()) {<a name="line.1161"></a>
-<span class="sourceLineNo">1162</span>        LOG.debug("Not running balancer because only " + cs.getNumServers()<a name="line.1162"></a>
-<span class="sourceLineNo">1163</span>            + " active regionserver(s)");<a name="line.1163"></a>
-<span class="sourceLineNo">1164</span>      }<a name="line.1164"></a>
-<span class="sourceLineNo">1165</span>      return false;<a name="line.1165"></a>
-<span class="sourceLineNo">1166</span>    }<a name="line.1166"></a>
-<span class="sourceLineNo">1167</span>    if(areSomeRegionReplicasColocated(c)) return true;<a name="line.1167"></a>
-<span class="sourceLineNo">1168</span>    // Check if we even need to do any load balancing<a name="line.1168"></a>
-<span class="sourceLineNo">1169</span>    // HBASE-3681 check sloppiness first<a name="line.1169"></a>
-<span class="sourceLineNo">1170</span>    float average = cs.getLoadAverage(); // for logging<a name="line.1170"></a>
-<span class="sourceLineNo">1171</span>    int floor = (int) Math.floor(average * (1 - slop));<a name="line.1171"></a>
-<span class="sourceLineNo">1172</span>    int ceiling = (int) Math.ceil(average * (1 + slop));<a name="line.1172"></a>
-<span class="sourceLineNo">1173</span>    if (!(cs.getMaxLoad() &gt; ceiling || cs.getMinLoad() &lt; floor)) {<a name="line.1173"></a>
-<span class="sourceLineNo">1174</span>      NavigableMap&lt;ServerAndLoad, List&lt;RegionInfo&gt;&gt; serversByLoad = cs.getServersByLoad();<a name="line.1174"></a>
-<span class="sourceLineNo">1175</span>      if (LOG.isTraceEnabled()) {<a name="line.1175"></a>
-<span class="sourceLineNo">1176</span>        // If nothing to balance, then don't say anything unless trace-level logging.<a name="line.1176"></a>
-<span class="sourceLineNo">1177</span>        LOG.trace("Skipping load balancing because balanced cluster; " +<a name="line.1177"></a>
-<span class="sourceLineNo">1178</span>          "servers=" + cs.getNumServers() +<a name="line.1178"></a>
-<span class="sourceLineNo">1179</span>          " regions=" + cs.getNumRegions() + " average=" + average +<a name="line.1179"></a>
-<span class="sourceLineNo">1180</span>          " mostloaded=" + serversByLoad.lastKey().getLoad() +<a name="line.1180"></a>
-<span class="sourceLineNo">1181</span>          " leastloaded=" + serversByLoad.firstKey().getLoad());<a name="line.1181"></a>
-<span class="sourceLineNo">1182</span>      }<a name="line.1182"></a>
-<span class="sourceLineNo">1183</span>      return false;<a name="line.1183"></a>
-<span class="sourceLineNo">1184</span>    }<a name="line.1184"></a>
-<span class="sourceLineNo">1185</span>    return true;<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>   * Subclasses should implement this to return true if the cluster has nodes that hosts<a name="line.1189"></a>
-<span class="sourceLineNo">1190</span>   * multiple replicas for the same region, or, if there are multiple racks and the same<a name="line.1190"></a>
-<span class="sourceLineNo">1191</span>   * rack hosts replicas of the same region<a name="line.1191"></a>
-<span class="sourceLineNo">1192</span>   * @param c Cluster information<a name="line.1192"></a>
-<span class="sourceLineNo">1193</span>   * @return whether region replicas are currently co-located<a name="line.1193"></a>
-<span class="sourceLineNo">1194</span>   */<a name="line.1194"></a>
-<span class="sourceLineNo">1195</span>  protected boolean areSomeRegionReplicasColocated(Cluster c) {<a name="line.1195"></a>
-<span class="sourceLineNo">1196</span>    return false;<a name="line.1196"></a>
-<span class="sourceLineNo">1197</span>  }<a name="line.1197"></a>
-<span class="sourceLineNo">1198</span><a name="line.1198"></a>
-<span class="sourceLineNo">1199</span>  /**<a name="line.1199"></a>
-<span class="sourceLineNo">1200</span>   * Generates a bulk assignment plan to be used on cluster startup using a<a name="line.1200"></a>
-<span class="sourceLineNo">1201</span>   * simple round-robin assignment.<a name="line.1201"></a>
-<span class="sourceLineNo">1202</span>   * &lt;p&gt;<a name="line.1202"></a>
-<span class="sourceLineNo">1203</span>   * Takes a list of all the regions and all the servers in the cluster and<a name="line.1203"></a>
-<span class="sourceLineNo">1204</span>   * returns a map of each server to the regions that it should be assigned.<a name="line.1204"></a>
-<span class="sourceLineNo">1205</span>   * &lt;p&gt;<a name="line.1205"></a>
-<span class="sourceLineNo">1206</span>   * Currently implemented as a round-robin assignment. Same invariant as load<a name="line.1206"></a>
-<span class="sourceLineNo">1207</span>   * balancing, all servers holding floor(avg) or ceiling(avg).<a name="line.1207"></a>
-<span class="sourceLineNo">1208</span>   *<a name="line.1208"></a>
-<span class="sourceLineNo">1209</span>   * TODO: Use block locations from HDFS to place regions with their blocks<a name="line.1209"></a>
-<span class="sourceLineNo">1210</span>   *<a name="line.1210"></a>
-<span class="sourceLineNo">1211</span>   * @param regions all regions<a name="line.1211"></a>
-<span class="sourceLineNo">1212</span>   * @param servers all servers<a name="line.1212"></a>
-<span class="sourceLineNo">1213</span>   * @return map of server to the regions it should take, or null if no<a name="line.1213"></a>
-<span class="sourceLineNo">1214</span>   *         assignment is possible (ie. no regions or no servers)<a name="line.1214"></a>
-<span class="sourceLineNo">1215</span>   */<a name="line.1215"></a>
-<span class="sourceLineNo">1216</span>  @Override<a name="line.1216"></a>
-<span class="sourceLineNo">1217</span>  public Map&lt;ServerName, List&lt;RegionInfo&gt;&gt; roundRobinAssignment(List&lt;RegionInfo&gt; regions,<a name="line.1217"></a>
-<span class="sourceLineNo">1218</span>      List&lt;ServerName&gt; servers) throws HBaseIOException {<a name="line.1218"></a>
-<span class="sourceLineNo">1219</span>    metricsBalancer.incrMiscInvocations();<a name="line.1219"></a>
-<span class="sourceLineNo">1220</span>    Map&lt;ServerName, List&lt;RegionInfo&gt;&gt; assignments = assignMasterSystemRegions(regions, servers);<a name="line.1220"></a>
-<span class="sourceLineNo">1221</span>    if (assignments != null &amp;&amp; !assignments.isEmpty()) {<a name="line.1221"></a>
-<span class="sourceLineNo">1222</span>      servers = new ArrayList&lt;&gt;(servers);<a name="line.1222"></a>
-<span class="sourceLineNo">1223</span>      // Guarantee not to put other regions on master<a name="line.1223"></a>
-<span class="sourceLineNo">1224</span>      servers.remove(masterServerName);<a name="line.1224"></a>
-<span class="sourceLineNo">1225</span>      List&lt;RegionInfo&gt; masterRegions = assignments.get(masterServerName);<a name="line.1225"></a>
-<span class="sourceLineNo">1226</span>      if (!masterRegions.isEmpty()) {<a name="line.1226"></a>
-<span class="sourceLineNo">1227</span>        regions = new ArrayList&lt;&gt;(regions);<a name="line.1227"></a>
-<span class="sourceLineNo">1228</span>        regions.removeAll(masterRegions);<a name="line.1228"></a>
-<span class="sourceLineNo">1229</span>      }<a name="line.1229"></a>
-<span class="sourceLineNo">1230</span>    }<a name="line.1230"></a>
-<span class="sourceLineNo">1231</span>    if (regions == null || regions.isEmpty()) {<a name="line.1231"></a>
-<span class="sourceLineNo">1232</span>      return assignments;<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>    int numServers = servers == null ? 0 : servers.size();<a name="line.1235"></a>
-<span class="sourceLineNo">1236</span>    if (numServers == 0) {<a name="line.1236"></a>
-<span class="sourceLineNo">1237</span>      LOG.warn("Wanted to do round robin assignment but no servers to assign to");<a name="line.1237"></a>
-<span class="sourceLineNo">1238</span>      return null;<a name="line.1238"></a>
-<span class="sourceLineNo">1239</span>    }<a name="line.1239"></a>
-<span class="sourceLineNo">1240</span><a name="line.1240"></a>
-<span class="sourceLineNo">1241</span>    // TODO: instead of retainAssignment() and roundRobinAssignment(), we should just run the<a name="line.1241"></a>
-<span class="sourceLineNo">1242</span>    // normal LB.balancerCluster() with unassignedRegions. We only need to have a candidate<a name="line.1242"></a>
-<span class="sourceLineNo">1243</span>    // generator for AssignRegionAction. The LB will ensure the regions are mostly local<a name="line.1243"></a>
-<span class="sourceLineNo">1244</span>    // and balanced. This should also run fast with fewer number of iterations.<a name="line.1244"></a>
-<span class="sourceLineNo">1245</span><a name="line.1245"></a>
-<span class="sourceLineNo">1246</span>    if (numServers == 1) { // Only one server, nothing fancy we can do here<a name="line.1246"></a>
-<span class="sourceLineNo">1247</span>      ServerName server = servers.get(0);<a name="line.1247"></a>
-<span class="sourceLineNo">1248</span>      assignments.put(server, new ArrayList&lt;&gt;(regions));<a name="line.1248"></a>
-<span class="sourceLineNo">1249</span>      return assignments;<a name="line.1249"></a>
-<span class="sourceLineNo">1250</span>    }<a name="line.1250"></a>
-<span class="sourceLineNo">1251</span><a name="line.1251"></a>
-<span class="sourceLineNo">1252</span>    Cluster cluster = createCluster(servers, regions, false);<a name="line.1252"></a>
-<span class="sourceLineNo">1253</span>    List&lt;RegionInfo&gt; unassignedRegions = new ArrayList&lt;&gt;();<a name="line.1253"></a>
-<span class="sourceLineNo">1254</span><a name="line.1254"></a>
-<span class="sourceLineNo">1255</span>    roundRobinAssignment(cluster, regions, unassignedRegions,<a name="line.1255"></a>
-<span class="sourceLineNo">1256</span>      servers, assignments);<a name="line.1256"></a>
-<span class="sourceLineNo">1257</span><a name="line.1257"></a>
-<span class="sourceLineNo">1258</span>    List&lt;RegionInfo&gt; lastFewRegions = new ArrayList&lt;&gt;();<a name="line.1258"></a>
-<span class="sourceLineNo">1259</span>    // assign the remaining by going through the list and try to assign to servers one-by-one<a name="line.1259"></a>
-<span class="sourceLineNo">1260</span>    int serverIdx = RANDOM.nextInt(numServers);<a name="line.1260"></a>
-<span class="sourceLineNo">1261</span>    for (RegionInfo region : unassignedRegions) {<a name="line.1261"></a>
-<span class="sourceLineNo">1262</span>      boolean assigned = false;<a name="line.1262"></a>
-<span class="sourceLineNo">1263</span>      for (int j = 0; j &lt; numServers; j++) { // try all servers one by one<a name="line.1263"></a>
-<span class="sourceLineNo">1264</span>        ServerName serverName = servers.get((j + serverIdx) % numServers);<a name="line.1264"></a>
-<span class="sourceLineNo">1265</span>        if (!cluster.wouldLowerAvailability(region, serverName)) {<a name="line.1265"></a>
-<span class="sourceLineNo">1266</span>          List&lt;RegionInfo&gt; serverRegions =<a name="line.1266"></a>
-<span class="sourceLineNo">1267</span>              assignments.computeIfAbsent(serverName, k -&gt; new ArrayList&lt;&gt;());<a name="line.1267"></a>
-<span class="sourceLineNo">1268</span>          serverRegions.add(region);<a name="line.1268"></a>
-<span class="sourceLineNo">1269</span>          cluster.doAssignRegion(region, serverName);<a name="line.1269"></a>
-<span class="sourceLineNo">1270</span>          serverIdx = (j + serverIdx + 1) % numServers; //remain from next server<a name="line.1270"></a>
-<span class="sourceLineNo">1271</span>          assigned = true;<a name="line.1271"></a>
-<span class="sourceLineNo">1272</span>          break;<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>      if (!assigned) {<a name="line.1275"></a>
-<span class="sourceLineNo">1276</span>        lastFewRegions.add(region);<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>    // just sprinkle the rest of the regions on random regionservers. The balanceCluster will<a name="line.1279"></a>
-<span class="sourceLineNo">1280</span>    // make it optimal later. we can end up with this if numReplicas &gt; numServers.<a name="line.1280"></a>
-<span class="sourceLineNo">1281</span>    for (RegionInfo region : lastFewRegions) {<a name="line.1281"></a>
-<span class="sourceLineNo">1282</span>      int i = RANDOM.nextInt(numServers);<a name="line.1282"></a>
-<span class="sourceLineNo">1283</span>      ServerName server = servers.get(i);<a name="line.1283"></a>
-<span class="sourceLineNo">1284</span>      List&lt;RegionInfo&gt; serverRegions = assignments.computeIfAbsent(server, k -&gt; new ArrayList&lt;&gt;());<a name="line.1284"></a>
-<span class="sourceLineNo">1285</span>      serverRegions.add(region);<a name="line.1285"></a>
-<span class="sourceLineNo">1286</span>      cluster.doAssignRegion(region, server);<a name="line.1286"></a>
-<span class="sourceLineNo">1287</span>    }<a name="line.1287"></a>
-<span class="sourceLineNo">1288</span>    return assignments;<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>  protected Cluster createCluster(List&lt;ServerName&gt; servers,<a name="line.1291"></a>
-<span class="sourceLineNo">1292</span>      Collection&lt;RegionInfo&gt; regions, boolean forceRefresh) {<a name="line.1292"></a>
-<span class="sourceLineNo">1293</span>    if (forceRefresh &amp;&amp; useRegionFinder) {<a name="line.1293"></a>
-<span class="sourceLineNo">1294</span>      regionFinder.refreshAndWait(regions);<a name="line.1294"></a>
-<span class="sourceLineNo">1295</span>    }<a name="line.1295"></a>
-<span class="sourceLineNo">1296</span>    // Get the snapshot of the current assignments for the regions in question, and then create<a name="line.1296"></a>
-<span class="sourceLineNo">1297</span>    // a cluster out of it. Note that we might have replicas already assigned to some servers<a name="line.1297"></a>
-<span class="sourceLineNo">1298</span>    // earlier. So we want to get the snapshot to see those assignments, but this will only contain<a name="line.1298"></a>
-<span class="sourceLineNo">1299</span>    // replicas of the regions that are passed (for performance).<a name="line.1299"></a>
-<span class="sourceLineNo">1300</span>    Map&lt;ServerName, List&lt;RegionInfo&gt;&gt; clusterState = getRegionAssignmentsByServer(regions);<a name="line.1300"></a>
-<span class="sourceLineNo">1301</span><a name="line.1301"></a>
-<span class="sourceLineNo">1302</span>    for (ServerName server : servers) {<a name="line.1302"></a>
-<span class="sourceLineNo">1303</span>      if (!clusterState.containsKey(server)) {<a name="line.1303"></a>
-<span class="sourceLineNo">1304</span>        clusterState.put(server, EMPTY_REGION_LIST);<a name="line.1304"></a>
-<span class="sourceLineNo">1305</span>      }<a name="line.1305"></a>
-<span class="sourceLineNo">1306</span>    }<a name="line.1306"></a>
-<span class="sourceLineNo">1307</span>    return new Cluster(regions, clusterState, null, this.regionFinder,<a name="line.1307"></a>
-<span class="sourceLineNo">1308</span>        rackManager);<a name="line.1308"></a>
-<span class="sourceLineNo">1309</span>  }<a name="line.1309"></a>
+<span class="sourceLineNo">1154</span>  @Override<a name="line.1154"></a>
+<span class="sourceLineNo">1155</span>  public void postMasterStartupInitialize() {<a name="line.1155"></a>
+<span class="sourceLineNo">1156</span>    if (services != null &amp;&amp; regionFinder != null) {<a name="line.1156"></a>
+<span class="sourceLineNo">1157</span>      try {<a name="line.1157"></a>
+<span class="sourceLineNo">1158</span>        Set&lt;RegionInfo&gt; regions =<a name="line.1158"></a>
+<span class="sourceLineNo">1159</span>            services.getAssignmentManager().getRegionStates().getRegionAssignments().keySet();<a name="line.1159"></a>
+<span class="sourceLineNo">1160</span>        regionFinder.refreshAndWait(regions);<a name="line.1160"></a>
+<span class="sourceLineNo">1161</span>      } catch (Exception e) {<a name="line.1161"></a>
+<span class="sourceLineNo">1162</span>        LOG.warn("Refreshing region HDFS Block dist failed with exception, ignoring", e);<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>  }<a name="line.1165"></a>
+<span class="sourceLineNo">1166</span><a name="line.1166"></a>
+<span class="sourceLineNo">1167</span>  public void setRackManager(RackManager rackManager) {<a name="line.1167"></a>
+<span class="sourceLineNo">1168</span>    this.rackManager = rackManager;<a name="line.1168"></a>
+<span class="sourceLineNo">1169</span>  }<a name="line.1169"></a>
+<span class="sourceLineNo">1170</span><a name="line.1170"></a>
+<span class="sourceLineNo">1171</span>  protected boolean needsBalance(Cluster c) {<a name="line.1171"></a>
+<span class="sourceLineNo">1172</span>    ClusterLoadState cs = new ClusterLoadState(c.clusterState);<a name="line.1172"></a>
+<span class="sourceLineNo">1173</span>    if (cs.getNumServers() &lt; MIN_SERVER_BALANCE) {<a name="line.1173"></a>
+<span class="sourceLineNo">1174</span>      if (LOG.isDebugEnabled()) {<a name="line.1174"></a>
+<span class="sourceLineNo">1175</span>        LOG.debug("Not running balancer because only " + cs.getNumServers()<a name="line.1175"></a>
+<span class="sourceLineNo">1176</span>            + " active regionserver(s)");<a name="line.1176"></a>
+<span class="sourceLineNo">1177</span>      }<a name="line.1177"></a>
+<span class="sourceLineNo">1178</span>      return false;<a name="line.1178"></a>
+<span class="sourceLineNo">1179</span>    }<a name="line.1179"></a>
+<span class="sourceLineNo">1180</span>    if(areSomeRegionReplicasColocated(c)) return true;<a name="line.1180"></a>
+<span class="sourceLineNo">1181</span>    // Check if we even need to do any load balancing<a name="line.1181"></a>
+<span class="sourceLineNo">1182</span>    // HBASE-3681 check sloppiness first<a name="line.1182"></a>
+<span class="sourceLineNo">1183</span>    float average = cs.getLoadAverage(); // for logging<a name="line.1183"></a>
+<span class="sourceLineNo">1184</span>    int floor = (int) Math.floor(average * (1 - slop));<a name="line.1184"></a>
+<span class="sourceLineNo">1185</span>    int ceiling = (int) Math.ceil(average * (1 + slop));<a name="line.1185"></a>
+<span class="sourceLineNo">1186</span>    if (!(cs.getMaxLoad() &gt; ceiling || cs.getMinLoad() &lt; floor)) {<a name="line.1186"></a>
+<span class="sourceLineNo">1187</span>      NavigableMap&lt;ServerAndLoad, List&lt;RegionInfo&gt;&gt; serversByLoad = cs.getServersByLoad();<a name="line.1187"></a>
+<span class="sourceLineNo">1188</span>      if (LOG.isTraceEnabled()) {<a name="line.1188"></a>
+<span class="sourceLineNo">1189</span>        // If nothing to balance, then don't say anything unless trace-level logging.<a name="line.1189"></a>
+<span class="sourceLineNo">1190</span>        LOG.trace("Skipping load balancing because balanced cluster; " +<a name="line.1190"></a>
+<span class="sourceLineNo">1191</span>          "servers=" + cs.getNumServers() +<a name="line.1191"></a>
+<span class="sourceLineNo">1192</span>          " regions=" + cs.getNumRegions() + " average=" + average +<a name="line.1192"></a>
+<span class="sourceLineNo">1193</span>          " mostloaded=" + serversByLoad.lastKey().getLoad() +<a name="line.1193"></a>
+<span class="sourceLineNo">1194</span>          " leastloaded=" + serversByLoad.firstKey().getLoad());<a name="line.1194"></a>
+<span class="sourceLineNo">1195</span>      }<a name="line.1195"></a>
+<span class="sourceLineNo">1196</span>      return false;<a name="line.1196"></a>
+<span class="sourceLineNo">1197</span>    }<a name="line.1197"></a>
+<span class="sourceLineNo">1198</span>    return true;<a name="line.1198"></a>
+<span class="sourceLineNo">1199</span>  }<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>   * Subclasses should implement this to return true if the cluster has nodes that hosts<a name="line.1202"></a>
+<span class="sourceLineNo">1203</span>   * multiple replicas for the same region, or, if there are multiple racks and the same<a name="line.1203"></a>
+<span class="sourceLineNo">1204</span>   * rack hosts replicas of the same region<a name="line.1204"></a>
+<span class="sourceLineNo">1205</span>   * @param c Cluster information<a name="line.1205"></a>
+<span class="sourceLineNo">1206</span>   * @return whether region replicas are currently co-located<a name="line.1206"></a>
+<span class="sourceLineNo">1207</span>   */<a name="line.1207"></a>
+<span class="sourceLineNo">1208</span>  protected boolean areSomeRegionReplicasColocated(Cluster c) {<a name="line.1208"></a>
+<span class="sourceLineNo">1209</span>    return false;<a name="line.1209"></a>
+<span class="sourceLineNo">1210</span>  }<a name="line.1210"></a>
+<span class="sourceLineNo">1211</span><a name="line.1211"></a>
+<span class="sourceLineNo">1212</span>  /**<a name="line.1212"></a>
+<span class="sourceLineNo">1213</span>   * Generates a bulk assignment plan to be used on cluster startup using a<a name="line.1213"></a>
+<span class="sourceLineNo">1214</span>   * simple round-robin assignment.<a name="line.1214"></a>
+<span class="sourceLineNo">1215</span>   * &lt;p&gt;<a name="line.1215"></a>
+<span class="sourceLineNo">1216</span>   * Takes a list of all the regions and all the servers in the cluster and<a name="line.1216"></a>
+<span class="sourceLineNo">1217</span>   * returns a map of each server to the regions that it should be assigned.<a name="line.1217"></a>
+<span class="sourceLineNo">1218</span>   * &lt;p&gt;<a name="line.1218"></a>
+<span class="sourceLineNo">1219</span>   * Currently implemented as a round-robin assignment. Same invariant as load<a name="line.1219"></a>
+<span class="sourceLineNo">1220</span>   * balancing, all servers holding floor(avg) or ceiling(avg).<a name="line.1220"></a>
+<span class="sourceLineNo">1221</span>   *<a name="line.1221"></a>
+<span class="sourceLineNo">1222</span>   * TODO: Use block locations from HDFS to place regions with their blocks<a name="line.1222"></a>
+<span class="sourceLineNo">1223</span>   *<a name="line.1223"></a>
+<span class="sourceLineNo">1224</span>   * @param regions all regions<a name="line.1224"></a>
+<span class="sourceLineNo">1225</span>   * @param servers all servers<a name="line.1225"></a>
+<span class="sourceLineNo">1226</span>   * @return map of server to the regions it should take, or null if no<a name="line.1226"></a>
+<span class="sourceLineNo">1227</span>   *         assignment is possible (ie. no regions or no servers)<a name="line.1227"></a>
+<span class="sourceLineNo">1228</span>   */<a name="line.1228"></a>
+<span class="sourceLineNo">1229</span>  @Override<a name="line.1229"></a>
+<span class="sourceLineNo">1230</span>  public Map&lt;ServerName, List&lt;RegionInfo&gt;&gt; roundRobinAssignment(List&lt;RegionInfo&gt; regions,<a name="line.1230"></a>
+<span class="sourceLineNo">1231</span>      List&lt;ServerName&gt; servers) throws HBaseIOException {<a name="line.1231"></a>
+<span class="sourceLineNo">1232</span>    metricsBalancer.incrMiscInvocations();<a name="line.1232"></a>
+<span class="sourceLineNo">1233</span>    Map&lt;ServerName, List&lt;RegionInfo&gt;&gt; assignments = assignMasterSystemRegions(regions, servers);<a name="line.1233"></a>
+<span class="sourceLineNo">1234</span>    if (assignments != null &amp;&amp; !assignments.isEmpty()) {<a name="line.1234"></a>
+<span class="sourceLineNo">1235</span>      servers = new ArrayList&lt;&gt;(servers);<a name="line.1235"></a>
+<span class="sourceLineNo">1236</span>      // Guarantee not to put other regions on master<a name="line.1236"></a>
+<span class="sourceLineNo">1237</span>      servers.remove(masterServerName);<a name="line.1237"></a>
+<span class="sourceLineNo">1238</span>      List&lt;RegionInfo&gt; masterRegions = assignments.get(masterServerName);<a name="line.1238"></a>
+<span class="sourceLineNo">1239</span>      if (!masterRegions.isEmpty()) {<a name="line.1239"></a>
+<span class="sourceLineNo">1240</span>        regions = new ArrayList&lt;&gt;(regions);<a name="line.1240"></a>
+<span class="sourceLineNo">1241</span>        regions.removeAll(masterRegions);<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>    if (regions == null || regions.isEmpty()) {<a name="line.1244"></a>
+<span class="sourceLineNo">1245</span>      return assignments;<a name="line.1245"></a>
+<span class="sourceLineNo">1246</span>    }<a name="line.1246"></a>
+<span class="sourceLineNo">1247</span><a name="line.1247"></a>
+<span class="sourceLineNo">1248</span>    int numServers = servers == null ? 0 : servers.size();<a name="line.1248"></a>
+<span class="sourceLineNo">1249</span>    if (numServers == 0) {<a name="line.1249"></a>
+<span class="sourceLineNo">1250</span>      LOG.warn("Wanted to do round robin assignment but no servers to assign to");<a name="line.1250"></a>
+<span class="sourceLineNo">1251</span>      return null;<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>    // TODO: instead of retainAssignment() and roundRobinAssignment(), we should just run the<a name="line.1254"></a>
+<span class="sourceLineNo">1255</span>    // normal LB.balancerCluster() with unassignedRegions. We only need to have a candidate<a name="line.1255"></a>
+<span class="sourceLineNo">1256</span>    // generator for AssignRegionAction. The LB will ensure the regions are mostly local<a name="line.1256"></a>
+<span class="sourceLineNo">1257</span>    // and balanced. This should also run fast with fewer number of iterations.<a name="line.1257"></a>
+<span class="sourceLineNo">1258</span><a name="line.1258"></a>
+<span class="sourceLineNo">1259</span>    if (numServers == 1) { // Only one server, nothing fancy we can do here<a name="line.1259"></a>
+<span class="sourceLineNo">1260</span>      ServerName server = servers.get(0);<a name="line.1260"></a>
+<span class="sourceLineNo">1261</span>      assignments.put(server, new ArrayList&lt;&gt;(regions));<a name="line.1261"></a>
+<span class="sourceLineNo">1262</span>      return assignments;<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>    Cluster cluster = createCluster(servers, regions);<a name="line.1265"></a>
+<span class="sourceLineNo">1266</span>    List&lt;RegionInfo&gt; unassignedRegions = new ArrayList&lt;&gt;();<a name="line.1266"></a>
+<span class="sourceLineNo">1267</span><a name="line.1267"></a>
+<span class="sourceLineNo">1268</span>    roundRobinAssignment(cluster, regions, unassignedRegions,<a name="line.1268"></a>
+<span class="sourceLineNo">1269</span>      servers, assignments);<a name="line.1269"></a>
+<span class="sourceLineNo">1270</span><a name="line.1270"></a>
+<span class="sourceLineNo">1271</span>    List&lt;RegionInfo&gt; lastFewRegions = new ArrayList&lt;&gt;();<a name="line.1271"></a>
+<span class="sourceLineNo">1272</span>    // assign the remaining by going through the list and try to assign to servers one-by-one<a name="line.1272"></a>
+<span class="sourceLineNo">1273</span>    int serverIdx = RANDOM.nextInt(numServers);<a name="line.1273"></a>
+<span class="sourceLineNo">1274</span>    for (RegionInfo region : unassignedRegions) {<a name="line.1274"></a>
+<span class="sourceLineNo">1275</span>      boolean assigned = false;<a name="line.1275"></a>
+<span class="sourceLineNo">1276</span>      for (int j = 0; j &lt; numServers; j++) { // try all servers one by one<a name="line.1276"></a>
+<span class="sourceLineNo">1277</span>        ServerName serverName = servers.get((j + serverIdx) % numServers);<a name="line.1277"></a>
+<span class="sourceLineNo">1278</span>        if (!cluster.wouldLowerAvailability(region, serverName)) {<a name="line.1278"></a>
+<span class="sourceLineNo">1279</span>          List&lt;RegionInfo&gt; serverRegions =<a name="line.1279"></a>
+<span class="sourceLineNo">1280</span>              assignments.computeIfAbsent(serverName, k -&gt; new ArrayList&lt;&gt;());<a name="line.1280"></a>
+<span class="sourceLineNo">1281</span>          serverRegions.add(region);<a name="line.1281"></a>
+<span class="sourceLineNo">1282</span>          cluster.doAssignRegion(region, serverName);<a name="line.1282"></a>
+<span class="sourceLineNo">1283</span>          serverIdx = (j + serverIdx + 1) % numServers; //remain from next server<a name="line.1283"></a>
+<span class="sourceLineNo">1284</span>          assigned = true;<a name="line.1284"></a>
+<span class="sourceLineNo">1285</span>          break;<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>      if (!assigned) {<a name="line.1288"></a>
+<span class="sourceLineNo">1289</span>        lastFewRegions.add(region);<a name="line.1289"></a>
+<span class="sourceLineNo">1290</span>      }<a name="line.1290"></a>
+<span class="sourceLineNo">1291</span>    }<a name="line.1291"></a>
+<span class="sourceLineNo">1292</span>    // just sprinkle the rest of the regions on random regionservers. The balanceCluster will<a name="line.1292"></a>
+<span class="sourceLineNo">1293</span>    // make it optimal later. we can end up with this if numReplicas &gt; numServers.<a name="line.1293"></a>
+<span class="sourceLineNo">1294</span>    for (RegionInfo region : lastFewRegions) {<a name="line.1294"></a>
+<span class="sourceLineNo">1295</span>      int i = RANDOM.nextInt(numServers);<a name="line.1295"></a>
+<span class="sourceLineNo">1296</span>      ServerName server = servers.get(i);<a name="line.1296"></a>
+<span class="sourceLineNo">1297</span>      List&lt;RegionInfo&gt; serverRegions = assignments.computeIfAbsent(server, k -&gt; new ArrayList&lt;&gt;());<a name="line.1297"></a>
+<span class="sourceLineNo">1298</span>      serverRegions.add(region);<a name="line.1298"></a>
+<span class="sourceLineNo">1299</span>      cluster.doAssignRegion(region, server);<a name="line.1299"></a>
+<span class="sourceLineNo">1300</span>    }<a name="line.1300"></a>
+<span class="sourceLineNo">1301</span>    return assignments;<a name="line.1301"></a>
+<span class="sourceLineNo">1302</span>  }<a name="line.1302"></a>
+<span class="sourceLineNo">1303</span><a name="line.1303"></a>
+<span class="sourceLineNo">1304</span>  protected Cluster createCluster(List&lt;ServerName&gt; servers, Collection&lt;RegionInfo&gt; regions) {<a name="line.1304"></a>
+<span class="sourceLineNo">1305</span>    // Get the snapshot of the current assignments for the regions in question, and then create<a name="line.1305"></a>
+<span class="sourceLineNo">1306</span>    // a cluster out of it. Note that we might have replicas already assigned to some servers<a name="line.1306"></a>
+<span class="sourceLineNo">1307</span>    // earlier. So we want to get the snapshot to see those assignments, but this will only contain<a name="line.1307"></a>
+<span class="sourceLineNo">1308</span>    // replicas of the regions that are passed (for performance).<a name="line.1308"></a>
+<span class="sourceLineNo">1309</span>    Map&lt;ServerName, List&lt;RegionInfo&gt;&gt; clusterState = getRegionAssignmentsByServer(regions);<a name="line.1309"></a>
 <span class="sourceLineNo">1310</span><a name="line.1310"></a>
-<span class="sourceLineNo">1311</span>  private List&lt;ServerName&gt; findIdleServers(List&lt;ServerName&gt; servers) {<a name="line.1311"></a>
-<span class="sourceLineNo">1312</span>    return this.services.getServerManager()<a name="line.1312"></a>
-<span class="sourceLineNo">1313</span>            .getOnlineServersListWithPredicator(servers, IDLE_SERVER_PREDICATOR);<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>  /**<a name="line.1316"></a>
-<span class="sourceLineNo">1317</span>   * Used to assign a single region to a random server.<a name="line.1317"></a>
-<span class="sourceLineNo">1318</span>   */<a name="line.1318"></a>
-<span class="sourceLineNo">1319</span>  @Override<a name="line.1319"></a>
-<span class="sourceLineNo">1320</span>  public ServerName randomAssignment(RegionInfo regionInfo, List&lt;ServerName&gt; servers)<a name="line.1320"></a>
-<span class="sourceLineNo">1321</span>      throws HBaseIOException {<a name="line.1321"></a>
-<span class="sourceLineNo">1322</span>    metricsBalancer.incrMiscInvocations();<a name="line.1322"></a>
-<span class="sourceLineNo">1323</span>    if (servers != null &amp;&amp; servers.contains(masterServerName)) {<a name="line.1323"></a>
-<span class="sourceLineNo">1324</span>      if (shouldBeOnMaster(regionInfo)) {<a name="line.1324"></a>
-<span class="sourceLineNo">1325</span>        return masterServerName;<a name="line.1325"></a>
-<span class="sourceLineNo">1326</span>      }<a name="line.1326"></a>
-<span class="sourceLineNo">1327</span>      if (!LoadBalancer.isTablesOnMaster(getConf())) {<a name="line.1327"></a>
-<span class="sourceLineNo">1328</span>        // Guarantee we do not put any regions on master<a name="line.1328"></a>
-<span class="sourceLineNo">1329</span>        servers = new ArrayList&lt;&gt;(servers);<a name="line.1329"></a>
-<span class="sourceLineNo">1330</span>        servers.remove(masterServerName);<a name="line.1330"></a>
-<span class="sourceLineNo">1331</span>      }<a name="line.1331"></a>
-<span class="sourceLineNo">1332</span>    }<a name="line.1332"></a>
-<span class="sourceLineNo">1333</span><a name="line.1333"></a>
-<span class="sourceLineNo">1334</span>    int numServers = servers == null ? 0 : servers.size();<a name="line.1334"></a>
-<span class="sourceLineNo">1335</span>    if (numServers == 0) {<a name="line.1335"></a>
-<span class="sourceLineNo">1336</span>      LOG.warn("Wanted to retain assignment but no servers to assign to");<a name="line.1336"></a>
-<span class="sourceLineNo">1337</span>      return null;<a name="line.1337"></a>
-<span class="sourceLineNo">1338</span>    }<a name="line.1338"></a>
-<span class="sourceLineNo">1339</span>    if (numServers == 1) { // Only one server, nothing fancy we can do here<a name="line.1339"></a>
-<span class="sourceLineNo">1340</span>      return servers.get(0);<a name="line.1340"></a>
+<span class="sourceLineNo">1311</span>    for (ServerName server : servers) {<a name="line.1311"></a>
+<span class="sourceLineNo">1312</span>      if (!clusterState.containsKey(server)) {<a name="line.1312"></a>
+<span class="sourceLineNo">1313</span>        clusterState.put(server, EMPTY_REGION_LIST);<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>    return new Cluster(regions, clusterState, null, this.regionFinder,<a name="line.1316"></a>
+<span class="sourceLineNo">1317</span>        rackManager);<a name="line.1317"></a>
+<span class="sourceLineNo">1318</span>  }<a name="line.1318"></a>
+<span class="sourceLineNo">1319</span><a name="line.1319"></a>
+<span class="sourceLineNo">1320</span>  private List&lt;ServerName&gt; findIdleServers(List&lt;ServerName&gt; servers) {<a name="line.1320"></a>
+<span class="sourceLineNo">1321</span>    return this.services.getServerManager()<a name="line.1321"></a>
+<span class="sourceLineNo">1322</span>            .getOnlineServersListWithPredicator(servers, IDLE_SERVER_PREDICATOR);<a name="line.1322"></a>
+<span class="sourceLineNo">1323</span>  }<a name="line.1323"></a>
+<span class="sourceLineNo">1324</span><a name="line.1324"></a>
+<span class="sourceLineNo">1325</span>  /**<a name="line.1325"></a>
+<span class="sourceLineNo">1326</span>   * Used to assign a single region to a random server.<a name="line.1326"></a>
+<span class="sourceLineNo">1327</span>   */<a name="line.1327"></a>
+<span class="sourceLineNo">1328</span>  @Override<a name="line.1328"></a>
+<span class="sourceLineNo">1329</span>  public ServerName randomAssignment(RegionInfo regionInfo, List&lt;ServerName&gt; servers)<a name="line.1329"></a>
+<span class="sourceLineNo">1330</span>      throws HBaseIOException {<a name="line.1330"></a>
+<span class="sourceLineNo">1331</span>    metricsBalancer.incrMiscInvocations();<a name="line.1331"></a>
+<span class="sourceLineNo">1332</span>    if (servers != null &amp;&amp; servers.contains(masterServerName)) {<a name="line.1332"></a>
+<span class="sourceLineNo">1333</span>      if (shouldBeOnMaster(regionInfo)) {<a name="line.1333"></a>
+<span class="sourceLineNo">1334</span>        return masterServerName;<a name="line.1334"></a>
+<span class="sourceLineNo">1335</span>      }<a name="line.1335"></a>
+<span class="sourceLineNo">1336</span>      if (!LoadBalancer.isTablesOnMaster(getConf())) {<a name="line.1336"></a>
+<span class="sourceLineNo">1337</span>        // Guarantee we do not put any regions on master<a name="line.1337"></a>
+<span class="sourceLineNo">1338</span>        servers = new ArrayList&lt;&gt;(servers);<a name="line.1338"></a>
+<span class="sourceLineNo">1339</span>        servers.remove(masterServerName);<a name="line.1339"></a>
+<span class="sourceLineNo">1340</span>      }<a name="line.1340"></a>
 <span class="sourceLineNo">1341</span>    }<a name="line.1341"></a>
-<span class="sourceLineNo">1342</span>    List&lt;ServerName&gt; idleServers = findIdleServers(servers);<a name="line.1342"></a>
-<span class="sourceLineNo">1343</span>    if (idleServers.size() == 1) {<a name="line.1343"></a>
-<span class="sourceLineNo">1344</span>      return idleServers.get(0);<a name="line.1344"></a>
-<span class="sourceLineNo">1345</span>    }<a name="line.1345"></a>
-<span class="sourceLineNo">1346</span>    final List&lt;ServerName&gt; finalServers = idleServers.isEmpty() ?<a name="line.1346"></a>
-<span class="sourceLineNo">1347</span>            servers : idleServers;<a name="line.1347"></a>
-<span class="sourceLineNo">1348</span>    List&lt;RegionInfo&gt; regions = Lists.newArrayList(regionInfo);<a name="line.1348"></a>
-<span class="sourceLineNo">1349</span>    Cluster cluster = createCluster(finalServers, regions, false);<a name="line.1349"></a>
-<span class="sourceLineNo">1350</span>    return randomAssignment(cluster, regionInfo, finalServers);<a name="line.1350"></a>
-<span class="sourceLineNo">1351</span>  }<a name="line.1351"></a>
-<span class="sourceLineNo">1352</span><a name="line.1352"></a>
-<span class="sourceLineNo">1353</span>  /**<a name="line.1353"></a>
-<span class="sourceLineNo">1354</span>   * Generates a bulk assignment startup plan, attempting to reuse the existing<a name="line.1354"></a>
-<span class="sourceLineNo">1355</span>   * assignment information from META, but adjusting for the specified list of<a name="line.1355"></a>
-<span class="sourceLineNo">1356</span>   * available/online servers available for assignment.<a name="line.1356"></a>
-<span class="sourceLineNo">1357</span>   * &lt;p&gt;<a name="line.1357"></a>
-<span class="sourceLineNo">1358</span>   * Takes a map of all regions to their existing assignment from META. Also<a name="line.1358"></a>
-<span class="sourceLineNo">1359</span>   * takes a list of online servers for regions to be assigned to. Attempts to<a name="line.1359"></a>
-<span class="sourceLineNo">1360</span>   * retain all assignment, so in some instances initial assignment will not be<a name="line.1360"></a>
-<span class="sourceLineNo">1361</span>   * completely balanced.<a name="line.1361"></a>
-<span class="sourceLineNo">1362</span>   * &lt;p&gt;<a name="line.1362"></a>
-<span class="sourceLineNo">1363</span>   * Any leftover regions without an existing server to be assigned to will be<a name="line.1363"></a>
-<span class="sourceLineNo">1364</span>   * assigned randomly to available servers.<a name="line.1364"></a>
-<span class="sourceLineNo">1365</span>   *<a name="line.1365"></a>
-<span class="sourceLineNo">1366</span>   * @param regions regions and existing assignment from meta<a name="line.1366"></a>
-<span class="sourceLineNo">1367</span>   * @param servers available servers<a name="line.1367"></a>
-<span class="sourceLineNo">1368</span>   * @return map of servers and regions to be assigned to them<a name="line.1368"></a>
-<span class="sourceLineNo">1369</span>   */<a name="line.1369"></a>
-<span class="sourceLineNo">1370</span>  @Override<a name="line.1370"></a>
-<span class="sourceLineNo">1371</span>  public Map&lt;ServerName, List&lt;RegionInfo&gt;&gt; retainAssignment(Map&lt;RegionInfo, ServerName&gt; regions,<a name="line.1371"></a>
-<span class="sourceLineNo">1372</span>      List&lt;ServerName&gt; servers) throws HBaseIOException {<a name="line.1372"></a>
-<span class="sourceLineNo">1373</span>    // Update metrics<a name="line.1373"></a>
-<span class="sourceLineNo">1374</span>    metricsBalancer.incrMiscInvocations();<a name="line.1374"></a>
-<span class="sourceLineNo">1375</span>    Map&lt;ServerName, List&lt;RegionInfo&gt;&gt; assignments = assignMasterSystemRegions(regions.keySet(), servers);<a name="line.1375"></a>
-<span class="sourceLineNo">1376</span>    if (assignments != null &amp;&amp; !assignments.isEmpty()) {<a name="line.1376"></a>
-<span class="sourceLineNo">1377</span>      servers = new ArrayList&lt;&gt;(servers);<a name="line.1377"></a>
-<span class="sourceLineNo">1378</span>      // Guarantee not to put other regions on master<a name="line.1378"></a>
-<span class="sourceLineNo">1379</span>      servers.remove(masterServerName);<a name="line.1379"></a>
-<span class="sourceLineNo">1380</span>      List&lt;RegionInfo&gt; masterRegions = assignments.get(masterServerName);<a name="line.1380"></a>
-<span class="sourceLineNo">1381</span>      regions = regions.entrySet().stream().filter(e -&gt; !masterRegions.contains(e.getKey()))<a name="line.1381"></a>
-<span class="sourceLineNo">1382</span>          .collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue));<a name="line.1382"></a>
-<span class="sourceLineNo">1383</span>    }<a name="line.1383"></a>
-<span class="sourceLineNo">1384</span>    if (regions.isEmpty()) {<a name="line.1384"></a>
-<span class="sourceLineNo">1385</span>      return assignments;<a name="line.1385"></a>
-<span class="sourceLineNo">1386</span>    }<a name="line.1386"></a>
-<span class="sourceLineNo">1387</span><a name="line.1387"></a>
-<span class="sourceLineNo">1388</span>    int numServers = servers == null ? 0 : servers.size();<a name="line.1388"></a>
-<span class="sourceLineNo">1389</span>    if (numServers == 0) {<a name="line.1389"></a>
-<span class="sourceLineNo">1390</span>      LOG.warn("Wanted to do retain assignment but no servers to assign to");<a name="line.1390"></a>
-<span class="sourceLineNo">1391</span>      return null;<a name="line.1391"></a>
+<span class="sourceLineNo">1342</span><a name="line.1342"></a>
+<span class="sourceLineNo">1343</span>    int numServers = servers == null ? 0 : servers.size();<a name="line.1343"></a>
+<span class="sourceLineNo">1344</span>    if (numServers == 0) {<a name="line.1344"></a>
+<span class="sourceLineNo">1345</span>      LOG.warn("Wanted to retain assignment but no servers to assign to");<a name="line.1345"></a>
+<span class="sourceLineNo">1346</span>      return null;<a name="line.1346"></a>
+<span class="sourceLineNo">1347</span>    }<a name="line.1347"></a>
+<span class="sourceLineNo">1348</span>    if (numServers == 1) { // Only one server, nothing fancy we can do here<a name="line.1348"></a>
+<span class="sourceLineNo">1349</span>      return servers.get(0);<a name="line.1349"></a>
+<span class="sourceLineNo">1350</span>    }<a name="line.1350"></a>
+<span class="sourceLineNo">1351</span>    List&lt;ServerName&gt; idleServers = findIdleServers(servers);<a name="line.1351"></a>
+<span class="sourceLineNo">1352</span>    if (idleServers.size() == 1) {<a name="line.1352"></a>
+<span class="sourceLineNo">1353</span>      return idleServers.get(0);<a name="line.1353"></a>
+<span class="sourceLineNo">1354</span>    }<a name="line.1354"></a>
+<span class="sourceLineNo">1355</span>    final List&lt;ServerName&gt; finalServers = idleServers.isEmpty() ?<a name="line.1355"></a>
+<span class="sourceLineNo">1356</span>            servers : idleServers;<a name="line.1356"></a>
+<span class="sourceLineNo">1357</span>    List&lt;RegionInfo&gt; regions = Lists.newArrayList(regionInfo);<a name="line.1357"></a>
+<span class="sourceLineNo">1358</span>    Cluster cluster = createCluster(finalServers, regions);<a name="line.1358"></a>
+<span class="sourceLineNo">1359</span>    return randomAssignment(cluster, regionInfo, finalServers);<a name="line.1359"></a>
+<span class="sourceLineNo">1360</span>  }<a name="line.1360"></a>
+<span class="sourceLineNo">1361</span><a name="line.1361"></a>
+<span class="sourceLineNo">1362</span>  /**<a name="line.1362"></a>
+<span class="sourceLineNo">1363</span>   * Generates a bulk assignment startup plan, attempting to reuse the existing<a name="line.1363"></a>
+<span class="sourceLineNo">1364</span>   * assignment information from META, but adjusting for the specified list of<a name="line.1364"></a>
+<span class="sourceLineNo">1365</span>   * available/online servers available for assignment.<a name="line.1365"></a>
+<span class="sourceLineNo">1366</span>   * &lt;p&gt;<a name="line.1366"></a>
+<span class="sourceLineNo">1367</span>   * Takes a map of all regions to their existing assignment from META. Also<a name="line.1367"></a>
+<span class="sourceLineNo">1368</span>   * takes a list of online servers for regions to be assigned to. Attempts to<a name="line.1368"></a>
+<span class="sourceLineNo">1369</span>   * retain all assignment, so in some instances initial assignment will not be<a name="line.1369"></a>
+<span class="sourceLineNo">1370</span>   * completely balanced.<a name="line.1370"></a>
+<span class="sourceLineNo">1371</span>   * &lt;p&gt;<a name="line.1371"></a>
+<span class="sourceLineNo">1372</span>   * Any leftover regions without an existing server to be assigned to will be<a name="line.1372"></a>
+<span class="sourceLineNo">1373</span>   * assigned randomly to available servers.<a name="line.1373"></a>
+<span class="sourceLineNo">1374</span>   *<a name="line.1374"></a>
+<span class="sourceLineNo">1375</span>   * @param regions regions and existing assignment from meta<a name="line.1375"></a>
+<span class="sourceLineNo">1376</span>   * @param servers available servers<a name="line.1376"></a>
+<span class="sourceLineNo">1377</span>   * @return map of servers and regions to be assigned to them<a name="line.1377"></a>
+<span class="sourceLineNo">1378</span>   */<a name="line.1378"></a>
+<span class="sourceLineNo">1379</span>  @Override<a name="line.1379"></a>
+<span class="sourceLineNo">1380</span>  public Map&lt;ServerName, List&lt;RegionInfo&gt;&gt; retainAssignment(Map&lt;RegionInfo, ServerName&gt; regions,<a name="line.1380"></a>
+<span class="sourceLineNo">1381</span>      List&lt;ServerName&gt; servers) throws HBaseIOException {<a name="line.1381"></a>
+<span class="sourceLineNo">1382</span>    // Update metrics<a name="line.1382"></a>
+<span class="sourceLineNo">1383</span>    metricsBalancer.incrMiscInvocations();<a name="line.1383"></a>
+<span class="sourceLineNo">1384</span>    Map&lt;ServerName, List&lt;RegionInfo&gt;&gt; assignments = assignMasterSystemRegions(regions.keySet(), servers);<a name="line.1384"></a>
+<span class="sourceLineNo">1385</span>    if (assignments != null &amp;&amp; !assignments.isEmpty()) {<a name="line.1385"></a>
+<span class="sourceLineNo">1386</span>      servers = new ArrayList&lt;&gt;(servers);<a name="line.1386"></a>
+<span class="sourceLineNo">1387</span>      // Guarantee not to put other regions on master<a name="line.1387"></a>
+<span class="sourceLineNo">1388</span>      servers.remove(masterServerName);<a name="line.1388"></a>
+<span class="sourceLineNo">1389</span>      List&lt;RegionInfo&gt; masterRegions = assignments.get(masterServerName);<a name="line.1389"></a>
+<span class="sourceLineNo">1390</span>      regions = regions.entrySet().stream().filter(e -&gt; !masterRegions.contains(e.getKey()))<a name="line.1390"></a>
+<span class="sourceLineNo">1391</span>          .collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue));<a name="line.1391"></a>
 <span class="sourceLineNo">1392</span>    }<a name="line.1392"></a>
-<span class="sourceLineNo">1393</span>    if (numServers == 1) { // Only one server, nothing fancy we can do here<a name="line.1393"></a>
-<span class="sourceLineNo">1394</span>      ServerName server = servers.get(0);<a name="line.1394"></a>
-<span class="sourceLineNo">1395</span>      assignments.put(server, new ArrayList&lt;&gt;(regions.keySet()));<a name="line.1395"></a>
-<span class="sourceLineNo">1396</span>      return assignments;<a name="line.1396"></a>
-<span class="sourceLineNo">1397</span>    }<a name="line.1397"></a>
-<span class="sourceLineNo">1398</span><a name="line.1398"></a>
-<span class="sourceLineNo">1399</span>    // Group all of the old assignments by their hostname.<a name="line.1399"></a>
-<span class="sourceLineNo">1400</span>    // We can't group directly by ServerName since the servers all have<a name="line.1400"></a>
-<span class="sourceLineNo">1401</span>    // new start-codes.<a name="line.1401"></a>
-<span class="sourceLineNo">1402</span><a name="line.1402"></a>
-<span class="sourceLineNo">1403</span>    // Group the servers by their hostname. It's possible we have multiple<a name="line.1403"></a>
-<span class="sourceLineNo">1404</span>    // servers on the same host on different ports.<a name="line.1404"></a>
-<span class="sourceLineNo">1405</span>    ArrayListMultimap&lt;String, ServerName&gt; serversByHostname = ArrayListMultimap.create();<a name="line.1405"></a>
-<span class="sourceLineNo">1406</span>    for (ServerName server : servers) {<a name="line.1406"></a>
-<span class="sourceLineNo">1407</span>      assignments.put(server, new ArrayList&lt;&gt;());<a name="line.1407"></a>
-<span class="sourceLineNo">1408</span>      serversByHostname.put(server.getHostnameLowerCase(), server);<a name="line.1408"></a>
-<span class="sourceLineNo">1409</span>    }<a name="line.1409"></a>
-<span class="sourceLineNo">1410</span><a name="line.1410"></a>
-<span class="sourceLineNo">1411</span>    // Collection of the hostnames that used to have regions<a name="line.1411"></a>
-<span class="sourceLineNo">1412</span>    // assigned, but for which we no longer have any RS running<a name="line.1412"></a>
-<span class="sourceLineNo">1413</span>    // after the cluster restart.<a name="line.1413"></a>
-<span class="sourceLineNo">1414</span>    Set&lt;String&gt; oldHostsNoLongerPresent = Sets.newTreeSet();<a name="line.1414"></a>
-<span class="sourceLineNo">1415</span><a name="line.1415"></a>
-<span class="sourceLineNo">1416</span>    // If the old servers aren't present, lets assign those regions later.<a name="line.1416"></a>
-<span class="sourceLineNo">1417</span>    List&lt;RegionInfo&gt; randomAssignRegions = Lists.newArrayList();<a name="line.1417"></a>
-<span class="sourceLineNo">1418</span><a name="line.1418"></a>
-<span class="sourceLineNo">1419</span>    int numRandomAssignments = 0;<a name="line.1419"></a>
-<span class="sourceLineNo">1420</span>    int numRetainedAssigments = 0;<a name="line.1420"></a>
-<span class="sourceLineNo">1421</span><a name="line.1421"></a>
-<span class="sourceLineNo">1422</span>    Cluster cluster = createCluster(servers, regions.keySet(), true);<a name="line.1422"></a>
-<span class="sourceLineNo">1423</span><a name="line.1423"></a>
-<span class="sourceLineNo">1424</span>    for (Map.Entry&lt;RegionInfo, ServerName&gt; entry : regions.entrySet()) {<a name="line.1424"></a>
-<span class="sourceLineNo">1425</span>      RegionInfo region = entry.getKey();<a name="line.1425"></a>
-<span class="sourceLineNo">1426</span>      ServerName oldServerName = entry.getValue();<a name="line.1426"></a>
-<span class="sourceLineNo">1427</span>      List&lt;ServerName&gt; localServers = new ArrayList&lt;&gt;();<a name="line.1427"></a>
-<span class="sourceLineNo">1428</span>      if (oldServerName != null) {<a name="line.1428"></a>
-<span class="sourceLineNo">1429</span>        localServers = serversByHostname.get(oldServerName.getHostnameLowerCase());<a name="line.1429"></a>
-<span class="sourceLineNo">1430</span>      }<a name="line.1430"></a>
-<span class="sourceLineNo">1431</span>      if (localServers.isEmpty()) {<a name="line.1431"></a>
-<span class="sourceLineNo">1432</span>        // No servers on the new cluster match up with this hostname, assign randomly, later.<a name="line.1432"></a>
-<span class="sourceLineNo">1433</span>        randomAssignRegions.add(region);<a name="line.1433"></a>
-<span class="sourceLineNo">1434</span>        if (oldServerName != null) {<a name="line.1434"></a>
-<span class="sourceLineNo">1435</span>          oldHostsNoLongerPresent.add(oldServerName.getHostnameLowerCase());<a name="line.1435"></a>
-<span class="sourceLineNo">1436</span>        }<a name="line.1436"></a>
-<span class="sourceLineNo">1437</span>      } else if (localServers.size() == 1) {<a name="line.1437"></a>
-<span class="sourceLineNo">1438</span>        // the usual case - one new server on same host<a name="line.1438"></a>
-<span class="sourceLineNo">1439</span>        ServerName target = localServers.get(0);<a name="line.1439"></a>
-<span class="sourceLineNo">1440</span>        assignments.get(target).add(region);<a name="line.1440"></a>
-<span class="sourceLineNo">1441</span>        numRetainedAssigments++;<a name="line.1441"></a>
-<span class="sourceLineNo">1442</span>      } else {<a name="line.1442"></a>
-<span class="sourceLineNo">1443</span>        // multiple new servers in the cluster on this same host<a name="line.1443"></a>
-<span class="sourceLineNo">1444</span>        if (localServers.contains(oldServerName)) {<a name="line.1444"></a>
-<span class="sourceLineNo">1445</span>          assignments.get(oldServerName).add(region);<a name="line.1445"></a>
-<span class="sourceLineNo">1446</span>          numRetainedAssigments++;<a name="line.1446"></a>
-<span class="sourceLineNo">1447</span>        } else {<a name="line.1447"></a>
-<span class="sourceLineNo">1448</span>          ServerName target = null;<a name="line.1448"></a>
-<span class="sourceLineNo">1449</span>          for (ServerName tmp : localServers) {<a name="line.1449"></a>
-<span class="sourceLineNo">1450</span>            if (tmp.getPort() == oldServerName.getPort()) {<a name="line.1450"></a>
-<span class="sourceLineNo">1451</span>              target = tmp;<a name="line.1451"></a>
-<span class="sourceLineNo">1452</span>              assignments.get(tmp).add(region);<a name="line.1452"></a>
-<span class="sourceLineNo">1453</span>              numRetainedAssigments++;<a name="line.1453"></a>
-<span class="sourceLineNo">1454</span>              break;<a name="line.1454"></a>
-<span class="sourceLineNo">1455</span>            }<a name="line.1455"></a>
-<span class="sourceLineNo">1456</span>          }<a name="line.1456"></a>
-<span class="sourceLineNo">1457</span>          if (target == null) {<a name="line.1457"></a>
-<span class="sourceLineNo">1458</span>            randomAssignRegions.add(region);<a name="line.1458"></a>
-<span class="sourceLineNo">1459</span>          }<a name="line.1459"></a>
-<span class="sourceLineNo">1460</span>        }<a name="line.1460"></a>
-<span class="sourceLineNo">1461</span>      }<a name="line.1461"></a>
-<span class="sourceLineNo">1462</span>    }<a name="line.1462"></a>
-<span class="sourceLineNo">1463</span><a name="line.1463"></a>
-<span class="sourceLineNo">1464</span>    // If servers from prior assignment aren't present, then lets do randomAssignment on regions.<a name="line.1464"></a>
-<span class="sourceLineNo">1465</span>    if (randomAssignRegions.size() &gt; 0) {<a name="line.1465"></a>
-<span class="sourceLineNo">1466</span>      for (Map.Entry&lt;ServerName, List&lt;RegionInfo&gt;&gt; entry : assignments.entrySet()) {<a name="line.1466"></a>
-<span class="sourceLineNo">1467</span>        ServerName sn = entry.getKey();<a name="line.1467"></a>
-<span class="sourceLineNo">1468</span>        for (RegionInfo region : entry.getValue()) {<a name="line.1468"></a>
-<span class="sourceLineNo">1469</span>          cluster.doAssignRegion(region, sn);<a name="line.1469"></a>
-<span class="sourceLineNo">1470</span>        }<a name="line.1470"></a>
-<span class="sourceLineNo">1471</span>      }<a name="line.1471"></a>
-<span class="sourceLineNo">1472</span>      for (RegionInfo region : randomAssignRegions) {<a name="line.1472"></a>
-<span class="sourceLineNo">1473</span>        ServerName target = randomAssignment(cluster, region, servers);<a name="line.1473"></a>
-<span class="sourceLineNo">1474</span>        assignments.get(target).add(region);<a name="line.1474"></a>
-<span class="sourceLineNo">1475</span>        cluster.doAssignRegion(region, target);<a name="line.1475"></a>
-<span class="sourceLineNo">1476</span>        numRandomAssignments++;<a name="line.1476"></a>
-<span class="sourceLineNo">1477</span>      }<a name="line.1477"></a>
-<span class="sourceLineNo">1478</span>    }<a name="line.1478"></a>
-<span class="sourceLineNo">1479</span><a name="line.1479"></a>
-<span class="sourceLineNo">1480</span>    String randomAssignMsg = "";<a name="line.1480"></a>
-<span class="sourceLineNo">1481</span>    if (numRandomAssignments &gt; 0) {<a name="line.1481"></a>
-<span class="sourceLineNo">1482</span>      randomAssignMsg =<a name="line.1482"></a>
-<span class="sourceLineNo">1483</span>          numRandomAssignments + " regions were assigned "<a name="line.1483"></a>
-<span class="sourceLineNo">1484</span>              + "to random hosts, since the old hosts for these regions are no "<a name="line.1484"></a>
-<span class="sourceLineNo">1485</span>              + "longer present in the cluster. These hosts were:\n  "<a name="line.1485"></a>
-<span class="sourceLineNo">1486</span>              + Joiner.on("\n  ").join(oldHostsNoLongerPresent);<a name="line.1486"></a>
-<span class="sourceLineNo">1487</span>    }<a name="line.1487"></a>
-<span class="sourceLineNo">1488</span><a name="line.1488"></a>
-<span class="sourceLineNo">1489</span>    LOG.info("Reassigned " + regions.size() + " regions. " + numRetainedAssigments<a name="line.1489"></a>
-<span class="sourceLineNo">1490</span>        + " retained the pre-restart assignment. " + randomAssignMsg);<a name="line.1490"></a>
-<span class="sourceLineNo">1491</span>    return assignments;<a name="line.1491"></a>
-<span class="sourceLineNo">1492</span>  }<a name="line.1492"></a>
-<span class="sourceLineNo">1493</span><a name="line.1493"></a>
-<span class="sourceLineNo">1494</span>  @Override<a name="line.1494"></a>
-<span class="sourceLineNo">1495</span>  public void initialize() throws HBaseIOException{<a name="line.1495"></a>
-<span class="sourceLineNo">1496</span>  }<a name="line.1496"></a>
-<span class="sourceLineNo">1497</span><a name="line.1497"></a>
-<span class="sourceLineNo">1498</span>  @Override<a name="line.1498"></a>
-<span class="sourceLineNo">1499</span>  public void regionOnline(RegionInfo regionInfo, ServerName sn) {<a name="line.1499"></a>
+<span class="sourceLineNo">1393</span>    if (regions.isEmpty()) {<a name="line.1393"></a>
+<span class="sourceLineNo">1394</span>      return assignments;<a name="line.1394"></a>
+<span class="sourceLineNo">1395</span>    }<a name="line.1395"></a>
+<span class="sourceLineNo">1396</span><a name="line.1396"></a>
+<span class="sourceLineNo">1397</span>    int numServers = servers == null ? 0 : servers.size();<a name="line.1397"></a>
+<span class="sourceLineNo">1398</span>    if (numServers == 0) {<a name="line.1398"></a>
+<span class="sourceLineNo">1399</span>      LOG.warn("Wanted to do retain assignment but no servers to assign to");<a name="line.1399"></a>
+<span class="sourceLineNo">1400</span>      return null;<a name="line.1400"></a>
+<span class="sourceLineNo">1401</span>    }<a name="line.1401"></a>
+<span class="sourceLineNo">1402</span>    if (numServers == 1) { // Only one server, nothing fancy we can do here<a name="line.1402"></a>
+<span class="sourceLineNo">1403</span>      ServerName server = servers.get(0);<a name="line.1403"></a>
+<span class="sourceLineNo">1404</span>      assignments.put(server, new ArrayList&lt;&gt;(regions.keySet()));<a name="line.1404"></a>
+<span class="sourceLineNo">1405</span>      return assignments;<a name="line.1405"></a>
+<span class="sourceLineNo">1406</span>    }<a name="line.1406"></a>
+<span class="sourceLineNo">1407</span><a name="line.1407"></a>
+<span class="sourceLineNo">1408</span>    // Group all of the old assignments by their hostname.<a name="line.1408"></a>
+<span class="sourceLineNo">1409</span>    // We can't group directly by ServerName since the servers all have<a name="line.1409"></a>
+<span class="sourceLineNo">1410</span>    // new start-codes.<a name="line.1410"></a>
+<span class="sourceLineNo">1411</span><a name="line.1411"></a>
+<span class="sourceLineNo">1412</span>    // Group the servers by their hostname. It's possible we have multiple<a name="line.1412"></a>
+<span class="sourceLineNo">1413</span>    // servers on the same host on different ports.<a name="line.1413"></a>
+<span class="sourceLineNo">1414</span>    ArrayListMultimap&lt;String, ServerName&gt; serversByHostname = ArrayListMultimap.create();<a name="line.1414"></a>
+<span class="sourceLineNo">1415</span>    for (ServerName server : servers) {<a name="line.1415"></a>
+<span class="sourceLineNo">1416</span>      assignments.put(server, new ArrayList&lt;&gt;());<a name="line.1416"></a>
+<span class="sourceLineNo">1417</span>      serversByHostname.put(server.getHostnameLowerCase(), server);<a name="line.1417"></a>
+<span class="sourceLineNo">1418</span>    }<a name="line.1418"></a>
+<span class="sourceLineNo">1419</span><a name="line.1419"></a>
+<span class="sourceLineNo">1420</span>    // Collection of the hostnames that used to have regions<a name="line.1420"></a>
+<span class="sourceLineNo">1421</span>    // assigned, but for which we no longer have any RS running<a name="line.1421"></a>
+<span class="sourceLineNo">1422</span>    // after the cluster restart.<a name="line.1422"></a>
+<span class="sourceLineNo">1423</span>    Set&lt;String&gt; oldHostsNoLongerPresent = Sets.newTreeSet();<a name="line.1423"></a>
+<span class="sourceLineNo">1424</span><a name="line.1424"></a>
+<span class="sourceLineNo">1425</span>    // If the old servers aren't present, lets assign those regions later.<a name="line.1425"></a>
+<span class="sourceLineNo">1426</span>    List&lt;RegionInfo&gt; randomAssignRegions = Lists.newArrayList();<a name="line.1426"></a>
+<span class="sourceLineNo">1427</span><a name="line.1427"></a>
+<span class="sourceLineNo">1428</span>    int numRandomAssignments = 0;<a name="line.1428"></a>
+<span class="sourceLineNo">1429</span>    int numRetainedAssigments = 0;<a name="line.1429"></a>
+<span class="sourceLineNo">1430</span><a name="line.1430"></a>
+<span class="sourceLineNo">1431</span>    for (Map.Entry&lt;RegionInfo, ServerName&gt; entry : regions.entrySet()) {<a name="line.1431"></a>
+<span class="sourceLineNo">1432</span>      RegionInfo region = entry.getKey();<a name="line.1432"></a>
+<span class="sourceLineNo">1433</span>      ServerName oldServerName = entry.getValue();<a name="line.1433"></a>
+<span class="sourceLineNo">1434</span>      List&lt;ServerName&gt; localServers = new ArrayList&lt;&gt;();<a name="line.1434"></a>
+<span class="sourceLineNo">1435</span>      if (oldServerName != null) {<a name="line.1435"></a>
+<span class="sourceLineNo">1436</span>        localServers = serversByHostname.get(oldServerName.getHostnameLowerCase());<a name="line.1436"></a>
+<span class="sourceLineNo">1437</span>      }<a name="line.1437"></a>
+<span class="sourceLineNo">1438</span>      if (localServers.isEmpty()) {<a name="line.1438"></a>
+<span class="sourceLineNo">1439</span>        // No servers on the new cluster match up with this hostname, assign randomly, later.<a name="line.1439"></a>
+<span class="sourceLineNo">1440</span>        randomAssignRegions.add(region);<a name="line.1440"></a>
+<span class="sourceLineNo">1441</span>        if (oldServerName != null) {<a name="line.1441"></a>
+<span class="sourceLineNo">1442</span>          oldHostsNoLongerPresent.add(oldServerName.getHostnameLowerCase());<a name="line.1442"></a>
+<span class="sourceLineNo">1443</span>        }<a name="line.1443"></a>
+<span class="sourceLineNo">1444</span>      } else if (localServers.size() == 1) {<a name="line.1444"></a>
+<span class="sourceLineNo">1445</span>        // the usual case - one new server on same host<a name="line.1445"></a>
+<span class="sourceLineNo">1446</span>        ServerName target = localServers.get(0);<a name="line.1446"></a>
+<span class="sourceLineNo">1447</span>        assignments.get(target).add(region);<a name="line.1447"></a>
+<span class="sourceLineNo">1448</span>        numRetainedAssigments++;<a name="line.1448"></a>
+<span class="sourceLineNo">1449</span>      } else {<a name="line.1449"></a>
+<span class="sourceLineNo">1450</span>        // multiple new servers in the cluster on this same host<a name="line.1450"></a>
+<span class="sourceLineNo">1451</span>        if (localServers.contains(oldServerName)) {<a name="line.1451"></a>
+<span class="sourceLineNo">1452</span>          assignments.get(oldServerName).add(region);<a name="line.1452"></a>
+<span class="sourceLineNo">1453</span>          numRetainedAssigments++;<a name="line.1453"></a>
+<span class="sourceLineNo">1454</span>        } else {<a name="line.1454"></a>
+<span class="sourceLineNo">1455</span>          ServerName target = null;<a name="line.1455"></a>
+<span class="sourceLineNo">1456</span>          for (ServerName tmp : localServers) {<a name="line.1456"></a>
+<span class="sourceLineNo">1457</span>            if (tmp.getPort() == oldServerName.getPort()) {<a name="line.1457"></a>
+<span class="sourceLineNo">1458</span>              target = tmp;<a name="line.1458"></a>
+<span class="sourceLineNo">1459</span>              assignments.get(tmp).add(region);<a name="line.1459"></a>
+<span class="sourceLineNo">1460</span>              numRetainedAssigments++;<a name="line.1460"></a>
+<span class="sourceLineNo">1461</span>              break;<a name="line.1461"></a>
+<span class="sourceLineNo">1462</span>            }<a name="line.1462"></a>
+<span class="sourceLineNo">1463</span>          }<a name="line.1463"></a>
+<span class="sourceLineNo">1464</span>          if (target == null) {<a name="line.1464"></a>
+<span class="sourceLineNo">1465</span>            randomAssignRegions.add(region);<a name="line.1465"></a>
+<span class="sourceLineNo">1466</span>          }<a name="line.1466"></a>
+<span class="sourceLineNo">1467</span>        }<a name="line.1467"></a>
+<span class="sourceLineNo">1468</span>      }<a name="line.1468"></a>
+<span class="sourceLineNo">1469</span>    }<a name="line.1469"></a>
+<span class="sourceLineNo">1470</span><a name="line.1470"></a>
+<span class="sourceLineNo">1471</span>    // If servers from prior assignment aren't present, then lets do randomAssignment on regions.<a name="line.1471"></a>
+<span class="sourceLineNo">1472</span>    if (randomAssignRegions.size() &gt; 0) {<a name="line.1472"></a>
+<span class="sourceLineNo">1473</span>      Cluster cluster = createCluster(servers, regions.keySet());<a name="line.1473"></a>
+<span class="sourceLineNo">1474</span>      for (Map.Entry&lt;ServerName, List&lt;RegionInfo&gt;&gt; entry : assignments.entrySet()) {<a name="line.1474"></a>
+<span class="sourceLineNo">1475</span>        ServerName sn = entry.getKey();<a name="line.1475"></a>
+<span class="sourceLineNo">1476</span>        for (RegionInfo region : entry.getValue()) {<a name="line.1476"></a>
+<span class="sourceLineNo">1477</span>          cluster.doAssignRegion(region, sn);<a name="line.1477"></a>
+<span class="sourceLineNo">1478</span>        }<a name="line.1478"></a>
+<span class="sourceLineNo">1479</span>      }<a name="line.1479"></a>
+<span class="sourceLineNo">1480</span>      for (RegionInfo region : randomAssignRegions) {<a name="line.1480"></a>
+<span class="sourceLineNo">1481</span>        ServerName target = randomAssignment(cluster, region, servers);<a name="line.1481"></a>
+<span class="sourceLineNo">1482</span>        assignments.get(target).add(region);<a name="line.1482"></a>
+<span class="sourceLineNo">1483</span>        cluster.doAssignRegion(region, target);<a name="line.1483"></a>
+<span class="sourceLineNo">1484</span>        numRandomAssignments++;<a name="line.1484"></a>
+<span class="sourceLineNo">1485</span>      }<a name="line.1485"></a>
+<span class="sourceLineNo">1486</span>    }<a name="line.1486"></a>
+<span class="sourceLineNo">1487</span><a name="line.1487"></a>
+<span class="sourceLineNo">1488</span>    String randomAssignMsg = "";<a name="line.1488"></a>
+<span class="sourceLineNo">1489</span>    if (numRandomAssignments &gt; 0) {<a name="line.1489"></a>
+<span class="sourceLineNo">1490</span>      randomAssignMsg =<a name="line.1490"></a>
+<span class="sourceLineNo">1491</span>          numRandomAssignments + " regions were assigned "<a name="line.1491"></a>
+<span class="sourceLineNo">1492</span>              + "to random hosts, since the old hosts for these regions are no "<a name="line.1492"></a>
+<span class="sourceLineNo">1493</span>              + "longer present in the cluster. These hosts were:\n  "<a name="line.1493"></a>
+<span class="sourceLineNo">1494</span>              + Joiner.on("\n  ").join(oldHostsNoLongerPresent);<a name="line.1494"></a>
+<span class="sourceLineNo">1495</span>    }<a name="line.1495"></a>
+<span class="sourceLineNo">1496</span><a name="line.1496"></a>
+<span class="sourceLineNo">1497</span>    LOG.info("Reassigned " + regions.size() + " regions. " + numRetainedAssigments<a name="line.1497"></a>
+<span class="sourceLineNo">1498</span>        + " retained the pre-restart assignment. " + randomAssignMsg);<a name="line.1498"></a>
+<span class="sourceLineNo">1499</span>    return assignments;<a name="line.1499"></a>
 <span class="sourceLineNo">1500</span>  }<a name="line.1500"></a>
 <span class="sourceLineNo">1501</span><a name="line.1501"></a>
 <span class="sourceLineNo">1502</span>  @Override<a name="line.1502"></a>
-<span class="sourceLineNo">1503</span>  public void regionOffline(RegionInfo regionInfo) {<a name="line.1503"></a>
+<span class="sourceLineNo">1503</span>  public void initialize() throws HBaseIOException{<a name="line.1503"></a>
 <span class="sourceLineNo">1504</span>  }<a name="line.1504"></a>
 <span class="sourceLineNo">1505</span><a name="line.1505"></a>
 <span class="sourceLineNo">1506</span>  @Override<a name="line.1506"></a>
-<span class="sourceLineNo">1507</span>  public boolean isStopped() {<a name="line.1507"></a>
-<span class="sourceLineNo">1508</span>    return stopped;<a name="line.1508"></a>
-<span class="sourceLineNo">1509</span>  }<a name="line.1509"></a>
-<span class="sourceLineNo">1510</span><a name="line.1510"></a>
-<span class="sourceLineNo">1511</span>  @Override<a name="line.1511"></a>
-<span class="sourceLineNo">1512</span>  public void stop(String why) {<a name="line.1512"></a>
-<span class="sourceLineNo">1513</span>    LOG.info("Load Balancer stop requested: "+why);<a name="line.1513"></a>
-<span class="sourceLineNo">1514</span>    stopped = true;<a name="line.1514"></a>
-<span class="sourceLineNo">1515</span>  }<a name="line.1515"></a>
-<span class="sourceLineNo">1516</span><a name="line.1516"></a>
-<span class="sourceLineNo">1517</span>  /**<a name="line.1517"></a>
-<span class="sourceLineNo">1518</span>   * Used to assign a single region to a random server.<a name="line.1518"></a>
-<span class="sourceLineNo">1519</span>   */<a name="line.1519"></a>
-<span class="sourceLineNo">1520</span>  private ServerName randomAssignment(Cluster cluster, RegionInfo regionInfo,<a name="line.1520"></a>
-<span class="sourceLineNo">1521</span>      List&lt;ServerName&gt; servers) {<a name="line.1521"></a>
-<span class="sourceLineNo">1522</span>    int numServers = servers.size(); // servers is not null, numServers &gt; 1<a name="line.1522"></a>
-<span class="sourceLineNo">1523</span>    ServerName sn = null;<a name="line.1523"></a>
-<span class="sourceLineNo">1524</span>    final int maxIterations = numServers * 4;<a name="line.1524"></a>
-<span class="sourceLineNo">1525</span>    int iterations = 0;<a name="line.1525"></a>
-<span class="sourceLineNo">1526</span><a name="line.1526"></a>
-<span class="sourceLineNo">1527</span>    do {<a name="line.1527"></a>
-<span class="sourceLineNo">1528</span>      int i = RANDOM.nextInt(numServers);<a name="line.1528"></a>
-<span class="sourceLineNo">1529</span>      sn = servers.get(i);<a name="line.1529"></a>
-<span class="sourceLineNo">1530</span>    } while (cluster.wouldLowerAvailability(regionInfo, sn)<a name="line.1530"></a>
-<span class="sourceLineNo">1531</span>        &amp;&amp; iterations++ &lt; maxIterations);<a name="line.1531"></a>
-<span class="sourceLineNo">1532</span>    cluster.doAssignRegion(regionInfo, sn);<a name="line.1532"></a>
-<span class="sourceLineNo">1533</span>    return sn;<a name="line.1533"></a>
-<span class="sourceLineNo">1534</span>  }<a name="line.1534"></a>
-<span class="sourceLineNo">1535</span><a name="line.1535"></a>
-<span class="sourceLineNo">1536</span>  /**<a name="line.1536"></a>
-<span class="sourceLineNo">1537</span>   * Round robin a list of regions to a list of servers<a name="line.1537"></a>
-<span class="sourceLineNo">1538</span>   */<a name="line.1538"></a>
-<span class="sourceLineNo">1539</span>  private void roundRobinAssignment(Cluster cluster, List&lt;RegionInfo&gt; regions,<a name="line.1539"></a>
-<span class="sourceLineNo">1540</span>      List&lt;RegionInfo&gt; unassignedRegions, List&lt;ServerName&gt; servers,<a name="line.1540"></a>
-<span class="sourceLineNo">1541</span>      Map&lt;ServerName, List&lt;RegionInfo&gt;&gt; assignments) {<a name="line.1541"></a>
-<span class="sourceLineNo">1542</span><a name="line.1542"></a>
-<span class="sourceLineNo">1543</span>    int numServers = servers.size();<a name="line.1543"></a>
-<span class="sourceLineNo">1544</span>    int numRegions = regions.size();<a name="line.1544"></a>
-<span class="sourceLineNo">1545</span>    int max = (int) Math.ceil((float) numRegions / numServers);<a name="line.1545"></a>
-<span class="sourceLineNo">1546</span>    int serverIdx = 0;<a name="line.1546"></a>
-<span class="sourceLineNo">1547</span>    if (numServers &gt; 1) {<a name="line.1547"></a>
-<span class="sourceLineNo">1548</span>      serverIdx = RANDOM.nextInt(numServers);<a name="line.1548"></a>
-<span class="sourceLineNo">1549</span>    }<a name="line.1549"></a>
-<span class="sourceLineNo">1550</span>    int regionIdx = 0;<a name="line.1550"></a>
-<span class="sourceLineNo">1551</span><a name="line.1551"></a>
-<span class="sourceLineNo">1552</span>    for (int j = 0; j &lt; numServers; j++) {<a name="line.1552"></a>
-<span class="sourceLineNo">1553</span>      ServerName server = servers.get((j + serverIdx) % numServers);<a name="line.1553"></a>
-<span class="sourceLineNo">1554</span>      List&lt;RegionInfo&gt; serverRegions = new ArrayList&lt;&gt;(max);<a name="line.1554"></a>
-<span class="sourceLineNo">1555</span>      for (int i = regionIdx; i &lt; numRegions; i += numServers) {<a name="line.1555"></a>
-<span class="sourceLineNo">1556</span>        RegionInfo region = regions.get(i % numRegions);<a name="line.1556"></a>
-<span class="sourceLineNo">1557</span>        if (cluster.wouldLowerAvailability(region, server)) {<a name="line.1557"></a>
-<span class="sourceLineNo">1558</span>          unassignedRegions.add(region);<a name="line.1558"></a>
-<span class="sourceLineNo">1559</span>        } else {<a name="line.1559"></a>
-<span class="sourceLineNo">1560</span>          serverRegions.add(region);<a name="line.1560"></a>
-<span class="sourceLineNo">1561</span>          cluster.doAssignRegion(region, server);<a name="line.1561"></a>
-<span class="sourceLineNo">1562</span>        }<a name="line.1562"></a>
-<span class="sourceLineNo">1563</span>      }<a name="line.1563"></a>
-<span class="sourceLineNo">1564</span>      assignments.put(server, serverRegions);<a name="line.1564"></a>
-<span class="sourceLineNo">1565</span>      regionIdx++;<a name="line.1565"></a>
-<span class="sourceLineNo">1566</span>    }<a name="line.1566"></a>
-<span class="sourceLineNo">1567</span>  }<a name="line.1567"></a>
-<span class="sourceLineNo">1568</span><a name="line.1568"></a>
-<span class="sourceLineNo">1569</span>  protected Map&lt;ServerName, List&lt;RegionInfo&gt;&gt; getRegionAssignmentsByServer(<a name="line.1569"></a>
-<span class="sourceLineNo">1570</span>    Collection&lt;RegionInfo&gt; regions) {<a name="line.1570"></a>
-<span class="sourceLineNo">1571</span>    if (this.services != null &amp;&amp; this.services.getAssignmentManager() != null) {<a name="line.1571"></a>
-<span class="sourceLineNo">1572</span>      return this.services.getAssignmentManager().getSnapShotOfAssignment(regions);<a name="line.1572"></a>
-<span class="sourceLineNo">1573</span>    } else {<a name="line.1573"></a>
-<span class="sourceLineNo">1574</span>      return new HashMap&lt;&gt;();<a name="line.1574"></a>
-<span class="sourceLineNo">1575</span>    }<a name="line.1575"></a>
-<span class="sourceLineNo">1576</span>  }<a name="line.1576"></a>
-<span class="sourceLineNo">1577</span><a name="line.1577"></a>
-<span class="sourceLineNo">1578</span>  @Override<a name="line.1578"></a>
-<span class="sourceLineNo">1579</span>  public void onConfigurationChange(Configuration conf) {<a name="line.1579"></a>
-<span class="sourceLineNo">1580</span>  }<a name="line.1580"></a>
-<span class="sourceLineNo">1581</span>}<a name="line.1581"></a>
+<span class="sourceLineNo">1507</span>  public void regionOnline(RegionInfo regionInfo, ServerName sn) {<a name="line.1507"></a>
+<span class="sourceLineNo">1508</span>  }<a name="line.1508"></a>
+<span class="sourceLineNo">1509</span><a name="line.1509"></a>
+<span class="sourceLineNo">1510</span>  @Override<a name="line.1510"></a>
+<span class="sourceLineNo">1511</span>  public void regionOffline(RegionInfo regionInfo) {<a name="line.1511"></a>
+<span class="sourceLineNo">1512</span>  }<a name="line.1512"></a>
+<span class="sourceLineNo">1513</span><a name="line.1513"></a>
+<span class="sourceLineNo">1514</span>  @Override<a name="line.1514"></a>
+<span class="sourceLineNo">1515</span>  public boolean isStopped() {<a name="line.1515"></a>
+<span class="sourceLineNo">1516</span>    return stopped;<a name="line.1516"></a>
+<span class="sourceLineNo">1517</span>  }<a name="line.1517"></a>
+<span class="sourceLineNo">1518</span><a name="line.1518"></a>
+<span class="sourceLineNo">1519</span>  @Override<a name="line.1519"></a>
+<span class="sourceLineNo">1520</span>  public void stop(String why) {<a name="line.1520"></a>
+<span class="sourceLineNo">1521</span>    LOG.info("Load Balancer stop requested: "+why);<a name="line.1521"></a>
+<span class="sourceLineNo">1522</span>    stopped = true;<a name="line.1522"></a>
+<span class="sourceLineNo">1523</span>  }<a name="line.1523"></a>
+<span class="sourceLineNo">1524</span><a name="line.1524"></a>
+<span class="sourceLineNo">1525</span>  /**<a name="line.1525"></a>
+<span class="sourceLineNo">1526</span>   * Used to assign a single region to a random server.<a name="line.1526"></a>
+<span class="sourceLineNo">1527</span>   */<a name="line.1527"></a>
+<span class="sourceLineNo">1528</span>  private ServerName randomAssignment(Cluster cluster, RegionInfo regionInfo,<a name="line.1528"></a>
+<span class="sourceLineNo">1529</span>      List&lt;ServerName&gt; servers) {<a name="line.1529"></a>
+<span class="sourceLineNo">1530</span>    int numServers = servers.size(); // servers is not null, numServers &gt; 1<a name="line.1530"></a>
+<span class="sourceLineNo">1531</span>    ServerName sn = null;<a name="line.1531"></a>
+<span class="sourceLineNo">1532</span>    final int maxIterations = numServers * 4;<a name="line.1532"></a>
+<span class="sourceLineNo">1533</span>    int iterations = 0;<a name="line.1533"></a>
+<span class="sourceLineNo">1534</span><a name="line.1534"></a>
+<span class="sourceLineNo">1535</span>    do {<a name="line.1535"></a>
+<span class="sourceLineNo">1536</span>      int i = RANDOM.nextInt(numServers);<a name="line.1536"></a>
+<span class="sourceLineNo">1537</span>      sn = servers.get(i);<a name="line.1537"></a>
+<span class="sourceLineNo">1538</span>    } while (cluster.wouldLowerAvailability(regionInfo, sn)<a name="line.1538"></a>
+<span class="sourceLineNo">1539</span>        &amp;&amp; iterations++ &lt; maxIterations);<a name="line.1539"></a>
+<span class="sourceLineNo">1540</span>    cluster.doAssignRegion(regionInfo, sn);<a name="line.1540"></a>
+<span class="sourceLineNo">1541</span>    return sn;<a name="line.1541"></a>
+<span class="sourceLineNo">1542</span>  }<a name="line.1542"></a>
+<span class="sourceLineNo">1543</span><a name="line.1543"></a>
+<span class="sourceLineNo">1544</span>  /**<a name="line.1544"></a>
+<span class="sourceLineNo">1545</span>   * Round robin a list of regions to a list of servers<a name="line.1545"></a>
+<span class="sourceLineNo">1546</span>   */<a name="line.1546"></a>
+<span class="sourceLineNo">1547</span>  private void roundRobinAssignment(Cluster cluster, List&lt;RegionInfo&gt; regions,<a name="line.1547"></a>
+<span class="sourceLineNo">1548</span>      List&lt;RegionInfo&gt; unassignedRegions, List&lt;ServerName&gt; servers,<a name="line.1548"></a>
+<span class="sourceLineNo">1549</span>      Map&lt;ServerName, List&lt;RegionInfo&gt;&gt; assignments) {<a name="line.1549"></a>
+<span class="sourceLineNo">1550</span><a name="line.1550"></a>
+<span class="sourceLineNo">1551</span>    int numServers = servers.size();<a name="line.1551"></a>
+<span class="sourceLineNo">1552</span>    int numRegions = regions.size();<a name="line.1552"></a>
+<span class="sourceLineNo">1553</span>    int max = (int) Math.ceil((float) numRegions / numServers);<a name="line.1553"></a>
+<span class="sourceLineNo">1554</span>    int serverIdx = 0;<a name="line.1554"></a>
+<span class="sourceLineNo">1555</span>    if (numServers &gt; 1) {<a name="line.1555"></a>
+<span class="sourceLineNo">1556</span>      serverIdx = RANDOM.nextInt(numServers);<a name="line.1556"></a>
+<span class="sourceLineNo">1557</span>    }<a name="line.1557"></a>
+<span class="sourceLineNo">1558</span>    int regionIdx = 0;<a name="line.1558"></a>
+<span class="sourceLineNo">1559</span><a name="line.1559"></a>
+<span class="sourceLineNo">1560</span>    for (int j = 0; j &lt; numServers; j++) {<a name="line.1560"></a>
+<span class="sourceLineNo">1561</span>      ServerName server = servers.get((j + serverIdx) % numServers);<a name="line.1561"></a>
+<span class="sourceLineNo">1562</span>      List&lt;RegionInfo&gt; serverRegions = new ArrayList&lt;&gt;(max);<a name="line.1562"></a>
+<span class="sourceLineNo">1563</span>      for (int i = regionIdx; i &lt; numRegions; i += numServers) {<a name="line.1563"></a>
+<span class="sourceLineNo">1564</span>        RegionInfo region = regions.get(i % numRegions);<a name="line.1564"></a>
+<span class="sourceLineNo">1565</span>        if (cluster.wouldLowerAvailability(region, server)) {<a name="line.1565"></a>
+<span class="sourceLineNo">1566</span>          unassignedRegions.add(region);<a name="line.1566"></a>
+<span class="sourceLineNo">1567</span>        } else {<a name="line.1567"></a>
+<span class="sourceLineNo">1568</span>          serverRegions.add(region);<a name="line.1568"></a>
+<span class="sourceLineNo">1569</span>          cluster.doAssignRegion(region, server);<a name="line.1569"></a>
+<span class="sourceLineNo">1570</span>        }<a name="line.1570"></a>
+<span class="sourceLineNo">1571</span>      }<a name="line.1571"></a>
+<span class="sourceLineNo">1572</span>      assignments.put(server, serverRegions);<a name="line.1572"></a>
+<span class="sourceLineNo">1573</span>      regionIdx++;<a name="line.1573"></a>
+<span class="sourceLineNo">1574</span>    }<a name="line.1574"></a>
+<span class="sourceLineNo">1575</span>  }<a name="line.1575"></a>
+<span class="sourceLineNo">1576</span><a name="line.1576"></a>
+<span class="sourceLineNo">1577</span>  protected Map&lt;ServerName, List&lt;RegionInfo&gt;&gt; getRegionAssignmentsByServer(<a name="line.1577"></a>
+<span class="sourceLineNo">1578</span>    Collection&lt;RegionInfo&gt; regions) {<a name="line.1578"></a>
+<span class="sourceLineNo">1579</span>    if (this.services != null &amp;&amp; this.services.getAssignmentManager() != null) {<a name="line.1579"></a>
+<span class="sourceLineNo">1580</span>      return this.services.getAssignmentManager().getSnapShotOfAssignment(regions);<a name="line.1580"></a>
+<span class="sourceLineNo">1581</span>    } else {<a name="line.1581"></a>
+<span class="sourceLineNo">1582</span>      return new HashMap&lt;&gt;();<a name="line.1582"></a>
+<span class="sourceLineNo">1583</span>    }<a name="line.1583"></a>
+<span class="sourceLineNo">1584</span>  }<a name="line.1584"></a>
+<span class="sourceLineNo">1585</span><a name="line.1585"></a>
+<span class="sourceLineNo">1586</span>  @Override<a name="line.1586"></a>
+<span class="sourceLineNo">1587</span>  public void onConfigurationChange(Configuration conf) {<a name="line.1587"></a>
+<span class="sourceLineNo">1588</span>  }<a name="line.1588"></a>
+<span class="sourceLineNo">1589</span>}<a name="line.1589"></a>
 
 
 


[18/29] hbase-site git commit: Published site at 477f9fdb32873387231c5fbbff130ba8bf7b5d68.

Posted by gi...@apache.org.
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/621479e1/devapidocs/src-html/org/apache/hadoop/hbase/master/HMaster.RedirectServlet.html
----------------------------------------------------------------------
diff --git a/devapidocs/src-html/org/apache/hadoop/hbase/master/HMaster.RedirectServlet.html b/devapidocs/src-html/org/apache/hadoop/hbase/master/HMaster.RedirectServlet.html
index 2b1b6c6..adaa381 100644
--- a/devapidocs/src-html/org/apache/hadoop/hbase/master/HMaster.RedirectServlet.html
+++ b/devapidocs/src-html/org/apache/hadoop/hbase/master/HMaster.RedirectServlet.html
@@ -1011,2651 +1011,2662 @@
 <span class="sourceLineNo">1003</span>    }<a name="line.1003"></a>
 <span class="sourceLineNo">1004</span><a name="line.1004"></a>
 <span class="sourceLineNo">1005</span>    zombieDetector.interrupt();<a name="line.1005"></a>
-<span class="sourceLineNo">1006</span>  }<a name="line.1006"></a>
-<span class="sourceLineNo">1007</span><a name="line.1007"></a>
-<span class="sourceLineNo">1008</span>  /**<a name="line.1008"></a>
-<span class="sourceLineNo">1009</span>   * Adds the {@code MasterSpaceQuotaObserver} to the list of configured Master observers to<a name="line.1009"></a>
-<span class="sourceLineNo">1010</span>   * automatically remove space quotas for a table when that table is deleted.<a name="line.1010"></a>
-<span class="sourceLineNo">1011</span>   */<a name="line.1011"></a>
-<span class="sourceLineNo">1012</span>  @VisibleForTesting<a name="line.1012"></a>
-<span class="sourceLineNo">1013</span>  public void updateConfigurationForSpaceQuotaObserver(Configuration conf) {<a name="line.1013"></a>
-<span class="sourceLineNo">1014</span>    // We're configured to not delete quotas on table deletion, so we don't need to add the obs.<a name="line.1014"></a>
-<span class="sourceLineNo">1015</span>    if (!conf.getBoolean(<a name="line.1015"></a>
-<span class="sourceLineNo">1016</span>          MasterSpaceQuotaObserver.REMOVE_QUOTA_ON_TABLE_DELETE,<a name="line.1016"></a>
-<span class="sourceLineNo">1017</span>          MasterSpaceQuotaObserver.REMOVE_QUOTA_ON_TABLE_DELETE_DEFAULT)) {<a name="line.1017"></a>
-<span class="sourceLineNo">1018</span>      return;<a name="line.1018"></a>
-<span class="sourceLineNo">1019</span>    }<a name="line.1019"></a>
-<span class="sourceLineNo">1020</span>    String[] masterCoprocs = conf.getStrings(CoprocessorHost.MASTER_COPROCESSOR_CONF_KEY);<a name="line.1020"></a>
-<span class="sourceLineNo">1021</span>    final int length = null == masterCoprocs ? 0 : masterCoprocs.length;<a name="line.1021"></a>
-<span class="sourceLineNo">1022</span>    String[] updatedCoprocs = new String[length + 1];<a name="line.1022"></a>
-<span class="sourceLineNo">1023</span>    if (length &gt; 0) {<a name="line.1023"></a>
-<span class="sourceLineNo">1024</span>      System.arraycopy(masterCoprocs, 0, updatedCoprocs, 0, masterCoprocs.length);<a name="line.1024"></a>
-<span class="sourceLineNo">1025</span>    }<a name="line.1025"></a>
-<span class="sourceLineNo">1026</span>    updatedCoprocs[length] = MasterSpaceQuotaObserver.class.getName();<a name="line.1026"></a>
-<span class="sourceLineNo">1027</span>    conf.setStrings(CoprocessorHost.MASTER_COPROCESSOR_CONF_KEY, updatedCoprocs);<a name="line.1027"></a>
-<span class="sourceLineNo">1028</span>  }<a name="line.1028"></a>
-<span class="sourceLineNo">1029</span><a name="line.1029"></a>
-<span class="sourceLineNo">1030</span>  private void initMobCleaner() {<a name="line.1030"></a>
-<span class="sourceLineNo">1031</span>    this.expiredMobFileCleanerChore = new ExpiredMobFileCleanerChore(this);<a name="line.1031"></a>
-<span class="sourceLineNo">1032</span>    getChoreService().scheduleChore(expiredMobFileCleanerChore);<a name="line.1032"></a>
-<span class="sourceLineNo">1033</span><a name="line.1033"></a>
-<span class="sourceLineNo">1034</span>    int mobCompactionPeriod = conf.getInt(MobConstants.MOB_COMPACTION_CHORE_PERIOD,<a name="line.1034"></a>
-<span class="sourceLineNo">1035</span>        MobConstants.DEFAULT_MOB_COMPACTION_CHORE_PERIOD);<a name="line.1035"></a>
-<span class="sourceLineNo">1036</span>    if (mobCompactionPeriod &gt; 0) {<a name="line.1036"></a>
-<span class="sourceLineNo">1037</span>      this.mobCompactChore = new MobCompactionChore(this, mobCompactionPeriod);<a name="line.1037"></a>
-<span class="sourceLineNo">1038</span>      getChoreService().scheduleChore(mobCompactChore);<a name="line.1038"></a>
-<span class="sourceLineNo">1039</span>    } else {<a name="line.1039"></a>
-<span class="sourceLineNo">1040</span>      LOG<a name="line.1040"></a>
-<span class="sourceLineNo">1041</span>        .info("The period is " + mobCompactionPeriod + " seconds, MobCompactionChore is disabled");<a name="line.1041"></a>
-<span class="sourceLineNo">1042</span>    }<a name="line.1042"></a>
-<span class="sourceLineNo">1043</span>    this.mobCompactThread = new MasterMobCompactionThread(this);<a name="line.1043"></a>
-<span class="sourceLineNo">1044</span>  }<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>   * Create a {@link MasterMetaBootstrap} instance.<a name="line.1047"></a>
-<span class="sourceLineNo">1048</span>   */<a name="line.1048"></a>
-<span class="sourceLineNo">1049</span>  MasterMetaBootstrap createMetaBootstrap(final HMaster master, final MonitoredTask status) {<a name="line.1049"></a>
-<span class="sourceLineNo">1050</span>    // We put this out here in a method so can do a Mockito.spy and stub it out<a name="line.1050"></a>
-<span class="sourceLineNo">1051</span>    // w/ a mocked up MasterMetaBootstrap.<a name="line.1051"></a>
-<span class="sourceLineNo">1052</span>    return new MasterMetaBootstrap(master, status);<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>  /**<a name="line.1055"></a>
-<span class="sourceLineNo">1056</span>   * Create a {@link ServerManager} instance.<a name="line.1056"></a>
-<span class="sourceLineNo">1057</span>   */<a name="line.1057"></a>
-<span class="sourceLineNo">1058</span>  ServerManager createServerManager(final MasterServices master) throws IOException {<a name="line.1058"></a>
-<span class="sourceLineNo">1059</span>    // We put this out here in a method so can do a Mockito.spy and stub it out<a name="line.1059"></a>
-<span class="sourceLineNo">1060</span>    // w/ a mocked up ServerManager.<a name="line.1060"></a>
-<span class="sourceLineNo">1061</span>    setupClusterConnection();<a name="line.1061"></a>
-<span class="sourceLineNo">1062</span>    return new ServerManager(master);<a name="line.1062"></a>
-<span class="sourceLineNo">1063</span>  }<a name="line.1063"></a>
-<span class="sourceLineNo">1064</span><a name="line.1064"></a>
-<span class="sourceLineNo">1065</span>  private void waitForRegionServers(final MonitoredTask status)<a name="line.1065"></a>
-<span class="sourceLineNo">1066</span>      throws IOException, InterruptedException {<a name="line.1066"></a>
-<span class="sourceLineNo">1067</span>    this.serverManager.waitForRegionServers(status);<a name="line.1067"></a>
-<span class="sourceLineNo">1068</span>    // Check zk for region servers that are up but didn't register<a name="line.1068"></a>
-<span class="sourceLineNo">1069</span>    for (ServerName sn: this.regionServerTracker.getOnlineServers()) {<a name="line.1069"></a>
-<span class="sourceLineNo">1070</span>      // The isServerOnline check is opportunistic, correctness is handled inside<a name="line.1070"></a>
-<span class="sourceLineNo">1071</span>      if (!this.serverManager.isServerOnline(sn) &amp;&amp;<a name="line.1071"></a>
-<span class="sourceLineNo">1072</span>          serverManager.checkAndRecordNewServer(sn, ServerMetricsBuilder.of(sn))) {<a name="line.1072"></a>
-<span class="sourceLineNo">1073</span>        LOG.info("Registered server found up in zk but who has not yet reported in: " + sn);<a name="line.1073"></a>
-<span class="sourceLineNo">1074</span>      }<a name="line.1074"></a>
-<span class="sourceLineNo">1075</span>    }<a name="line.1075"></a>
-<span class="sourceLineNo">1076</span>  }<a name="line.1076"></a>
-<span class="sourceLineNo">1077</span><a name="line.1077"></a>
-<span class="sourceLineNo">1078</span>  void initClusterSchemaService() throws IOException, InterruptedException {<a name="line.1078"></a>
-<span class="sourceLineNo">1079</span>    this.clusterSchemaService = new ClusterSchemaServiceImpl(this);<a name="line.1079"></a>
-<span class="sourceLineNo">1080</span>    this.clusterSchemaService.startAsync();<a name="line.1080"></a>
-<span class="sourceLineNo">1081</span>    try {<a name="line.1081"></a>
-<span class="sourceLineNo">1082</span>      this.clusterSchemaService.awaitRunning(getConfiguration().getInt(<a name="line.1082"></a>
-<span class="sourceLineNo">1083</span>        HBASE_MASTER_WAIT_ON_SERVICE_IN_SECONDS,<a name="line.1083"></a>
-<span class="sourceLineNo">1084</span>        DEFAULT_HBASE_MASTER_WAIT_ON_SERVICE_IN_SECONDS), TimeUnit.SECONDS);<a name="line.1084"></a>
-<span class="sourceLineNo">1085</span>    } catch (TimeoutException toe) {<a name="line.1085"></a>
-<span class="sourceLineNo">1086</span>      throw new IOException("Timedout starting ClusterSchemaService", toe);<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><a name="line.1089"></a>
-<span class="sourceLineNo">1090</span>  void initQuotaManager() throws IOException {<a name="line.1090"></a>
-<span class="sourceLineNo">1091</span>    MasterQuotaManager quotaManager = new MasterQuotaManager(this);<a name="line.1091"></a>
-<span class="sourceLineNo">1092</span>    this.assignmentManager.setRegionStateListener(quotaManager);<a name="line.1092"></a>
-<span class="sourceLineNo">1093</span>    quotaManager.start();<a name="line.1093"></a>
-<span class="sourceLineNo">1094</span>    this.quotaManager = quotaManager;<a name="line.1094"></a>
-<span class="sourceLineNo">1095</span>  }<a name="line.1095"></a>
-<span class="sourceLineNo">1096</span><a name="line.1096"></a>
-<span class="sourceLineNo">1097</span>  SpaceQuotaSnapshotNotifier createQuotaSnapshotNotifier() {<a name="line.1097"></a>
-<span class="sourceLineNo">1098</span>    SpaceQuotaSnapshotNotifier notifier =<a name="line.1098"></a>
-<span class="sourceLineNo">1099</span>        SpaceQuotaSnapshotNotifierFactory.getInstance().create(getConfiguration());<a name="line.1099"></a>
-<span class="sourceLineNo">1100</span>    return notifier;<a name="line.1100"></a>
-<span class="sourceLineNo">1101</span>  }<a name="line.1101"></a>
-<span class="sourceLineNo">1102</span><a name="line.1102"></a>
-<span class="sourceLineNo">1103</span>  boolean isCatalogJanitorEnabled() {<a name="line.1103"></a>
-<span class="sourceLineNo">1104</span>    return catalogJanitorChore != null ?<a name="line.1104"></a>
-<span class="sourceLineNo">1105</span>      catalogJanitorChore.getEnabled() : false;<a name="line.1105"></a>
+<span class="sourceLineNo">1006</span><a name="line.1006"></a>
+<span class="sourceLineNo">1007</span>    /*<a name="line.1007"></a>
+<span class="sourceLineNo">1008</span>     * After master has started up, lets do balancer post startup initialization. Since this runs<a name="line.1008"></a>
+<span class="sourceLineNo">1009</span>     * in activeMasterManager thread, it should be fine.<a name="line.1009"></a>
+<span class="sourceLineNo">1010</span>     */<a name="line.1010"></a>
+<span class="sourceLineNo">1011</span>    long start = System.currentTimeMillis();<a name="line.1011"></a>
+<span class="sourceLineNo">1012</span>    this.balancer.postMasterStartupInitialize();<a name="line.1012"></a>
+<span class="sourceLineNo">1013</span>    if (LOG.isDebugEnabled()) {<a name="line.1013"></a>
+<span class="sourceLineNo">1014</span>      LOG.debug("Balancer post startup initialization complete, took " + (<a name="line.1014"></a>
+<span class="sourceLineNo">1015</span>          (System.currentTimeMillis() - start) / 1000) + " seconds");<a name="line.1015"></a>
+<span class="sourceLineNo">1016</span>    }<a name="line.1016"></a>
+<span class="sourceLineNo">1017</span>  }<a name="line.1017"></a>
+<span class="sourceLineNo">1018</span><a name="line.1018"></a>
+<span class="sourceLineNo">1019</span>  /**<a name="line.1019"></a>
+<span class="sourceLineNo">1020</span>   * Adds the {@code MasterSpaceQuotaObserver} to the list of configured Master observers to<a name="line.1020"></a>
+<span class="sourceLineNo">1021</span>   * automatically remove space quotas for a table when that table is deleted.<a name="line.1021"></a>
+<span class="sourceLineNo">1022</span>   */<a name="line.1022"></a>
+<span class="sourceLineNo">1023</span>  @VisibleForTesting<a name="line.1023"></a>
+<span class="sourceLineNo">1024</span>  public void updateConfigurationForSpaceQuotaObserver(Configuration conf) {<a name="line.1024"></a>
+<span class="sourceLineNo">1025</span>    // We're configured to not delete quotas on table deletion, so we don't need to add the obs.<a name="line.1025"></a>
+<span class="sourceLineNo">1026</span>    if (!conf.getBoolean(<a name="line.1026"></a>
+<span class="sourceLineNo">1027</span>          MasterSpaceQuotaObserver.REMOVE_QUOTA_ON_TABLE_DELETE,<a name="line.1027"></a>
+<span class="sourceLineNo">1028</span>          MasterSpaceQuotaObserver.REMOVE_QUOTA_ON_TABLE_DELETE_DEFAULT)) {<a name="line.1028"></a>
+<span class="sourceLineNo">1029</span>      return;<a name="line.1029"></a>
+<span class="sourceLineNo">1030</span>    }<a name="line.1030"></a>
+<span class="sourceLineNo">1031</span>    String[] masterCoprocs = conf.getStrings(CoprocessorHost.MASTER_COPROCESSOR_CONF_KEY);<a name="line.1031"></a>
+<span class="sourceLineNo">1032</span>    final int length = null == masterCoprocs ? 0 : masterCoprocs.length;<a name="line.1032"></a>
+<span class="sourceLineNo">1033</span>    String[] updatedCoprocs = new String[length + 1];<a name="line.1033"></a>
+<span class="sourceLineNo">1034</span>    if (length &gt; 0) {<a name="line.1034"></a>
+<span class="sourceLineNo">1035</span>      System.arraycopy(masterCoprocs, 0, updatedCoprocs, 0, masterCoprocs.length);<a name="line.1035"></a>
+<span class="sourceLineNo">1036</span>    }<a name="line.1036"></a>
+<span class="sourceLineNo">1037</span>    updatedCoprocs[length] = MasterSpaceQuotaObserver.class.getName();<a name="line.1037"></a>
+<span class="sourceLineNo">1038</span>    conf.setStrings(CoprocessorHost.MASTER_COPROCESSOR_CONF_KEY, updatedCoprocs);<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>  private void initMobCleaner() {<a name="line.1041"></a>
+<span class="sourceLineNo">1042</span>    this.expiredMobFileCleanerChore = new ExpiredMobFileCleanerChore(this);<a name="line.1042"></a>
+<span class="sourceLineNo">1043</span>    getChoreService().scheduleChore(expiredMobFileCleanerChore);<a name="line.1043"></a>
+<span class="sourceLineNo">1044</span><a name="line.1044"></a>
+<span class="sourceLineNo">1045</span>    int mobCompactionPeriod = conf.getInt(MobConstants.MOB_COMPACTION_CHORE_PERIOD,<a name="line.1045"></a>
+<span class="sourceLineNo">1046</span>        MobConstants.DEFAULT_MOB_COMPACTION_CHORE_PERIOD);<a name="line.1046"></a>
+<span class="sourceLineNo">1047</span>    if (mobCompactionPeriod &gt; 0) {<a name="line.1047"></a>
+<span class="sourceLineNo">1048</span>      this.mobCompactChore = new MobCompactionChore(this, mobCompactionPeriod);<a name="line.1048"></a>
+<span class="sourceLineNo">1049</span>      getChoreService().scheduleChore(mobCompactChore);<a name="line.1049"></a>
+<span class="sourceLineNo">1050</span>    } else {<a name="line.1050"></a>
+<span class="sourceLineNo">1051</span>      LOG<a name="line.1051"></a>
+<span class="sourceLineNo">1052</span>        .info("The period is " + mobCompactionPeriod + " seconds, MobCompactionChore is disabled");<a name="line.1052"></a>
+<span class="sourceLineNo">1053</span>    }<a name="line.1053"></a>
+<span class="sourceLineNo">1054</span>    this.mobCompactThread = new MasterMobCompactionThread(this);<a name="line.1054"></a>
+<span class="sourceLineNo">1055</span>  }<a name="line.1055"></a>
+<span class="sourceLineNo">1056</span><a name="line.1056"></a>
+<span class="sourceLineNo">1057</span>  /**<a name="line.1057"></a>
+<span class="sourceLineNo">1058</span>   * Create a {@link MasterMetaBootstrap} instance.<a name="line.1058"></a>
+<span class="sourceLineNo">1059</span>   */<a name="line.1059"></a>
+<span class="sourceLineNo">1060</span>  MasterMetaBootstrap createMetaBootstrap(final HMaster master, final MonitoredTask status) {<a name="line.1060"></a>
+<span class="sourceLineNo">1061</span>    // We put this out here in a method so can do a Mockito.spy and stub it out<a name="line.1061"></a>
+<span class="sourceLineNo">1062</span>    // w/ a mocked up MasterMetaBootstrap.<a name="line.1062"></a>
+<span class="sourceLineNo">1063</span>    return new MasterMetaBootstrap(master, status);<a name="line.1063"></a>
+<span class="sourceLineNo">1064</span>  }<a name="line.1064"></a>
+<span class="sourceLineNo">1065</span><a name="line.1065"></a>
+<span class="sourceLineNo">1066</span>  /**<a name="line.1066"></a>
+<span class="sourceLineNo">1067</span>   * Create a {@link ServerManager} instance.<a name="line.1067"></a>
+<span class="sourceLineNo">1068</span>   */<a name="line.1068"></a>
+<span class="sourceLineNo">1069</span>  ServerManager createServerManager(final MasterServices master) throws IOException {<a name="line.1069"></a>
+<span class="sourceLineNo">1070</span>    // We put this out here in a method so can do a Mockito.spy and stub it out<a name="line.1070"></a>
+<span class="sourceLineNo">1071</span>    // w/ a mocked up ServerManager.<a name="line.1071"></a>
+<span class="sourceLineNo">1072</span>    setupClusterConnection();<a name="line.1072"></a>
+<span class="sourceLineNo">1073</span>    return new ServerManager(master);<a name="line.1073"></a>
+<span class="sourceLineNo">1074</span>  }<a name="line.1074"></a>
+<span class="sourceLineNo">1075</span><a name="line.1075"></a>
+<span class="sourceLineNo">1076</span>  private void waitForRegionServers(final MonitoredTask status)<a name="line.1076"></a>
+<span class="sourceLineNo">1077</span>      throws IOException, InterruptedException {<a name="line.1077"></a>
+<span class="sourceLineNo">1078</span>    this.serverManager.waitForRegionServers(status);<a name="line.1078"></a>
+<span class="sourceLineNo">1079</span>    // Check zk for region servers that are up but didn't register<a name="line.1079"></a>
+<span class="sourceLineNo">1080</span>    for (ServerName sn: this.regionServerTracker.getOnlineServers()) {<a name="line.1080"></a>
+<span class="sourceLineNo">1081</span>      // The isServerOnline check is opportunistic, correctness is handled inside<a name="line.1081"></a>
+<span class="sourceLineNo">1082</span>      if (!this.serverManager.isServerOnline(sn) &amp;&amp;<a name="line.1082"></a>
+<span class="sourceLineNo">1083</span>          serverManager.checkAndRecordNewServer(sn, ServerMetricsBuilder.of(sn))) {<a name="line.1083"></a>
+<span class="sourceLineNo">1084</span>        LOG.info("Registered server found up in zk but who has not yet reported in: " + sn);<a name="line.1084"></a>
+<span class="sourceLineNo">1085</span>      }<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>  void initClusterSchemaService() throws IOException, InterruptedException {<a name="line.1089"></a>
+<span class="sourceLineNo">1090</span>    this.clusterSchemaService = new ClusterSchemaServiceImpl(this);<a name="line.1090"></a>
+<span class="sourceLineNo">1091</span>    this.clusterSchemaService.startAsync();<a name="line.1091"></a>
+<span class="sourceLineNo">1092</span>    try {<a name="line.1092"></a>
+<span class="sourceLineNo">1093</span>      this.clusterSchemaService.awaitRunning(getConfiguration().getInt(<a name="line.1093"></a>
+<span class="sourceLineNo">1094</span>        HBASE_MASTER_WAIT_ON_SERVICE_IN_SECONDS,<a name="line.1094"></a>
+<span class="sourceLineNo">1095</span>        DEFAULT_HBASE_MASTER_WAIT_ON_SERVICE_IN_SECONDS), TimeUnit.SECONDS);<a name="line.1095"></a>
+<span class="sourceLineNo">1096</span>    } catch (TimeoutException toe) {<a name="line.1096"></a>
+<span class="sourceLineNo">1097</span>      throw new IOException("Timedout starting ClusterSchemaService", toe);<a name="line.1097"></a>
+<span class="sourceLineNo">1098</span>    }<a name="line.1098"></a>
+<span class="sourceLineNo">1099</span>  }<a name="line.1099"></a>
+<span class="sourceLineNo">1100</span><a name="line.1100"></a>
+<span class="sourceLineNo">1101</span>  void initQuotaManager() throws IOException {<a name="line.1101"></a>
+<span class="sourceLineNo">1102</span>    MasterQuotaManager quotaManager = new MasterQuotaManager(this);<a name="line.1102"></a>
+<span class="sourceLineNo">1103</span>    this.assignmentManager.setRegionStateListener(quotaManager);<a name="line.1103"></a>
+<span class="sourceLineNo">1104</span>    quotaManager.start();<a name="line.1104"></a>
+<span class="sourceLineNo">1105</span>    this.quotaManager = quotaManager;<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>  boolean isCleanerChoreEnabled() {<a name="line.1108"></a>
-<span class="sourceLineNo">1109</span>    boolean hfileCleanerFlag = true, logCleanerFlag = true;<a name="line.1109"></a>
-<span class="sourceLineNo">1110</span><a name="line.1110"></a>
-<span class="sourceLineNo">1111</span>    if (hfileCleaner != null) {<a name="line.1111"></a>
-<span class="sourceLineNo">1112</span>      hfileCleanerFlag = hfileCleaner.getEnabled();<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>    if (logCleaner != null) {<a name="line.1115"></a>
-<span class="sourceLineNo">1116</span>      logCleanerFlag = logCleaner.getEnabled();<a name="line.1116"></a>
-<span class="sourceLineNo">1117</span>    }<a name="line.1117"></a>
+<span class="sourceLineNo">1108</span>  SpaceQuotaSnapshotNotifier createQuotaSnapshotNotifier() {<a name="line.1108"></a>
+<span class="sourceLineNo">1109</span>    SpaceQuotaSnapshotNotifier notifier =<a name="line.1109"></a>
+<span class="sourceLineNo">1110</span>        SpaceQuotaSnapshotNotifierFactory.getInstance().create(getConfiguration());<a name="line.1110"></a>
+<span class="sourceLineNo">1111</span>    return notifier;<a name="line.1111"></a>
+<span class="sourceLineNo">1112</span>  }<a name="line.1112"></a>
+<span class="sourceLineNo">1113</span><a name="line.1113"></a>
+<span class="sourceLineNo">1114</span>  boolean isCatalogJanitorEnabled() {<a name="line.1114"></a>
+<span class="sourceLineNo">1115</span>    return catalogJanitorChore != null ?<a name="line.1115"></a>
+<span class="sourceLineNo">1116</span>      catalogJanitorChore.getEnabled() : false;<a name="line.1116"></a>
+<span class="sourceLineNo">1117</span>  }<a name="line.1117"></a>
 <span class="sourceLineNo">1118</span><a name="line.1118"></a>
-<span class="sourceLineNo">1119</span>    return (hfileCleanerFlag &amp;&amp; logCleanerFlag);<a name="line.1119"></a>
-<span class="sourceLineNo">1120</span>  }<a name="line.1120"></a>
+<span class="sourceLineNo">1119</span>  boolean isCleanerChoreEnabled() {<a name="line.1119"></a>
+<span class="sourceLineNo">1120</span>    boolean hfileCleanerFlag = true, logCleanerFlag = true;<a name="line.1120"></a>
 <span class="sourceLineNo">1121</span><a name="line.1121"></a>
-<span class="sourceLineNo">1122</span>  @Override<a name="line.1122"></a>
-<span class="sourceLineNo">1123</span>  public TableDescriptors getTableDescriptors() {<a name="line.1123"></a>
-<span class="sourceLineNo">1124</span>    return this.tableDescriptors;<a name="line.1124"></a>
-<span class="sourceLineNo">1125</span>  }<a name="line.1125"></a>
-<span class="sourceLineNo">1126</span><a name="line.1126"></a>
-<span class="sourceLineNo">1127</span>  @Override<a name="line.1127"></a>
-<span class="sourceLineNo">1128</span>  public ServerManager getServerManager() {<a name="line.1128"></a>
-<span class="sourceLineNo">1129</span>    return this.serverManager;<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>  @Override<a name="line.1132"></a>
-<span class="sourceLineNo">1133</span>  public MasterFileSystem getMasterFileSystem() {<a name="line.1133"></a>
-<span class="sourceLineNo">1134</span>    return this.fileSystemManager;<a name="line.1134"></a>
-<span class="sourceLineNo">1135</span>  }<a name="line.1135"></a>
-<span class="sourceLineNo">1136</span><a name="line.1136"></a>
-<span class="sourceLineNo">1137</span>  @Override<a name="line.1137"></a>
-<span class="sourceLineNo">1138</span>  public MasterWalManager getMasterWalManager() {<a name="line.1138"></a>
-<span class="sourceLineNo">1139</span>    return this.walManager;<a name="line.1139"></a>
-<span class="sourceLineNo">1140</span>  }<a name="line.1140"></a>
-<span class="sourceLineNo">1141</span><a name="line.1141"></a>
-<span class="sourceLineNo">1142</span>  @Override<a name="line.1142"></a>
-<span class="sourceLineNo">1143</span>  public TableStateManager getTableStateManager() {<a name="line.1143"></a>
-<span class="sourceLineNo">1144</span>    return tableStateManager;<a name="line.1144"></a>
-<span class="sourceLineNo">1145</span>  }<a name="line.1145"></a>
-<span class="sourceLineNo">1146</span><a name="line.1146"></a>
-<span class="sourceLineNo">1147</span>  /*<a name="line.1147"></a>
-<span class="sourceLineNo">1148</span>   * Start up all services. If any of these threads gets an unhandled exception<a name="line.1148"></a>
-<span class="sourceLineNo">1149</span>   * then they just die with a logged message.  This should be fine because<a name="line.1149"></a>
-<span class="sourceLineNo">1150</span>   * in general, we do not expect the master to get such unhandled exceptions<a name="line.1150"></a>
-<span class="sourceLineNo">1151</span>   *  as OOMEs; it should be lightly loaded. See what HRegionServer does if<a name="line.1151"></a>
-<span class="sourceLineNo">1152</span>   *  need to install an unexpected exception handler.<a name="line.1152"></a>
-<span class="sourceLineNo">1153</span>   */<a name="line.1153"></a>
-<span class="sourceLineNo">1154</span>  private void startServiceThreads() throws IOException{<a name="line.1154"></a>
-<span class="sourceLineNo">1155</span>   // Start the executor service pools<a name="line.1155"></a>
-<span class="sourceLineNo">1156</span>   this.executorService.startExecutorService(ExecutorType.MASTER_OPEN_REGION,<a name="line.1156"></a>
-<span class="sourceLineNo">1157</span>      conf.getInt("hbase.master.executor.openregion.threads", 5));<a name="line.1157"></a>
-<span class="sourceLineNo">1158</span>   this.executorService.startExecutorService(ExecutorType.MASTER_CLOSE_REGION,<a name="line.1158"></a>
-<span class="sourceLineNo">1159</span>      conf.getInt("hbase.master.executor.closeregion.threads", 5));<a name="line.1159"></a>
-<span class="sourceLineNo">1160</span>   this.executorService.startExecutorService(ExecutorType.MASTER_SERVER_OPERATIONS,<a name="line.1160"></a>
-<span class="sourceLineNo">1161</span>      conf.getInt("hbase.master.executor.serverops.threads", 5));<a name="line.1161"></a>
-<span class="sourceLineNo">1162</span>   this.executorService.startExecutorService(ExecutorType.MASTER_META_SERVER_OPERATIONS,<a name="line.1162"></a>
-<span class="sourceLineNo">1163</span>      conf.getInt("hbase.master.executor.meta.serverops.threads", 5));<a name="line.1163"></a>
-<span class="sourceLineNo">1164</span>   this.executorService.startExecutorService(ExecutorType.M_LOG_REPLAY_OPS,<a name="line.1164"></a>
-<span class="sourceLineNo">1165</span>      conf.getInt("hbase.master.executor.logreplayops.threads", 10));<a name="line.1165"></a>
-<span class="sourceLineNo">1166</span><a name="line.1166"></a>
-<span class="sourceLineNo">1167</span>   // We depend on there being only one instance of this executor running<a name="line.1167"></a>
-<span class="sourceLineNo">1168</span>   // at a time.  To do concurrency, would need fencing of enable/disable of<a name="line.1168"></a>
-<span class="sourceLineNo">1169</span>   // tables.<a name="line.1169"></a>
-<span class="sourceLineNo">1170</span>   // Any time changing this maxThreads to &gt; 1, pls see the comment at<a name="line.1170"></a>
-<span class="sourceLineNo">1171</span>   // AccessController#postCompletedCreateTableAction<a name="line.1171"></a>
-<span class="sourceLineNo">1172</span>   this.executorService.startExecutorService(ExecutorType.MASTER_TABLE_OPERATIONS, 1);<a name="line.1172"></a>
-<span class="sourceLineNo">1173</span>   startProcedureExecutor();<a name="line.1173"></a>
-<span class="sourceLineNo">1174</span><a name="line.1174"></a>
-<span class="sourceLineNo">1175</span>    // Initial cleaner chore<a name="line.1175"></a>
-<span class="sourceLineNo">1176</span>    CleanerChore.initChorePool(conf);<a name="line.1176"></a>
-<span class="sourceLineNo">1177</span>   // Start log cleaner thread<a name="line.1177"></a>
-<span class="sourceLineNo">1178</span>   int cleanerInterval = conf.getInt("hbase.master.cleaner.interval", 600 * 1000);<a name="line.1178"></a>
-<span class="sourceLineNo">1179</span>   this.logCleaner =<a name="line.1179"></a>
-<span class="sourceLineNo">1180</span>      new LogCleaner(cleanerInterval,<a name="line.1180"></a>
-<span class="sourceLineNo">1181</span>         this, conf, getMasterWalManager().getFileSystem(),<a name="line.1181"></a>
-<span class="sourceLineNo">1182</span>         getMasterWalManager().getOldLogDir());<a name="line.1182"></a>
-<span class="sourceLineNo">1183</span>    getChoreService().scheduleChore(logCleaner);<a name="line.1183"></a>
-<span class="sourceLineNo">1184</span><a name="line.1184"></a>
-<span class="sourceLineNo">1185</span>    // start the hfile archive cleaner thread<a name="line.1185"></a>
-<span class="sourceLineNo">1186</span>    Path archiveDir = HFileArchiveUtil.getArchivePath(conf);<a name="line.1186"></a>
-<span class="sourceLineNo">1187</span>    Map&lt;String, Object&gt; params = new HashMap&lt;&gt;();<a name="line.1187"></a>
-<span class="sourceLineNo">1188</span>    params.put(MASTER, this);<a name="line.1188"></a>
-<span class="sourceLineNo">1189</span>    this.hfileCleaner = new HFileCleaner(cleanerInterval, this, conf, getMasterFileSystem()<a name="line.1189"></a>
-<span class="sourceLineNo">1190</span>        .getFileSystem(), archiveDir, params);<a name="line.1190"></a>
-<span class="sourceLineNo">1191</span>    getChoreService().scheduleChore(hfileCleaner);<a name="line.1191"></a>
-<span class="sourceLineNo">1192</span><a name="line.1192"></a>
-<span class="sourceLineNo">1193</span>    replicationBarrierCleaner =<a name="line.1193"></a>
-<span class="sourceLineNo">1194</span>      new ReplicationBarrierCleaner(conf, this, getConnection(), replicationPeerManager);<a name="line.1194"></a>
-<span class="sourceLineNo">1195</span>    getChoreService().scheduleChore(replicationBarrierCleaner);<a name="line.1195"></a>
-<span class="sourceLineNo">1196</span><a name="line.1196"></a>
-<span class="sourceLineNo">1197</span>    serviceStarted = true;<a name="line.1197"></a>
-<span class="sourceLineNo">1198</span>    if (LOG.isTraceEnabled()) {<a name="line.1198"></a>
-<span class="sourceLineNo">1199</span>      LOG.trace("Started service threads");<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><a name="line.1202"></a>
-<span class="sourceLineNo">1203</span>  private void cancelChore(ScheduledChore chore) {<a name="line.1203"></a>
-<span class="sourceLineNo">1204</span>    if (chore != null) {<a name="line.1204"></a>
-<span class="sourceLineNo">1205</span>      chore.cancel();<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><a name="line.1208"></a>
-<span class="sourceLineNo">1209</span>  @Override<a name="line.1209"></a>
-<span class="sourceLineNo">1210</span>  protected void stopServiceThreads() {<a name="line.1210"></a>
-<span class="sourceLineNo">1211</span>    if (masterJettyServer != null) {<a name="line.1211"></a>
-<span class="sourceLineNo">1212</span>      LOG.info("Stopping master jetty server");<a name="line.1212"></a>
-<span class="sourceLineNo">1213</span>      try {<a name="line.1213"></a>
-<span class="sourceLineNo">1214</span>        masterJettyServer.stop();<a name="line.1214"></a>
-<span class="sourceLineNo">1215</span>      } catch (Exception e) {<a name="line.1215"></a>
-<span class="sourceLineNo">1216</span>        LOG.error("Failed to stop master jetty server", e);<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>    super.stopServiceThreads();<a name="line.1219"></a>
-<span class="sourceLineNo">1220</span>    stopChores();<a name="line.1220"></a>
-<span class="sourceLineNo">1221</span><a name="line.1221"></a>
-<span class="sourceLineNo">1222</span>    LOG.debug("Stopping service threads");<a name="line.1222"></a>
-<span class="sourceLineNo">1223</span><a name="line.1223"></a>
-<span class="sourceLineNo">1224</span>    if (this.quotaManager != null) {<a name="line.1224"></a>
-<span class="sourceLineNo">1225</span>      this.quotaManager.stop();<a name="line.1225"></a>
-<span class="sourceLineNo">1226</span>    }<a name="line.1226"></a>
-<span class="sourceLineNo">1227</span><a name="line.1227"></a>
-<span class="sourceLineNo">1228</span>    if (this.activeMasterManager != null) {<a name="line.1228"></a>
-<span class="sourceLineNo">1229</span>      this.activeMasterManager.stop();<a name="line.1229"></a>
-<span class="sourceLineNo">1230</span>    }<a name="line.1230"></a>
-<span class="sourceLineNo">1231</span>    if (this.serverManager != null) {<a name="line.1231"></a>
-<span class="sourceLineNo">1232</span>      this.serverManager.stop();<a name="line.1232"></a>
-<span class="sourceLineNo">1233</span>    }<a name="line.1233"></a>
-<span class="sourceLineNo">1234</span>    if (this.assignmentManager != null) {<a name="line.1234"></a>
-<span class="sourceLineNo">1235</span>      this.assignmentManager.stop();<a name="line.1235"></a>
-<span class="sourceLineNo">1236</span>    }<a name="line.1236"></a>
-<span class="sourceLineNo">1237</span><a name="line.1237"></a>
-<span class="sourceLineNo">1238</span>    stopProcedureExecutor();<a name="line.1238"></a>
-<span class="sourceLineNo">1239</span><a name="line.1239"></a>
-<span class="sourceLineNo">1240</span>    if (this.walManager != null) {<a name="line.1240"></a>
-<span class="sourceLineNo">1241</span>      this.walManager.stop();<a name="line.1241"></a>
-<span class="sourceLineNo">1242</span>    }<a name="line.1242"></a>
-<span class="sourceLineNo">1243</span>    if (this.fileSystemManager != null) {<a name="line.1243"></a>
-<span class="sourceLineNo">1244</span>      this.fileSystemManager.stop();<a name="line.1244"></a>
-<span class="sourceLineNo">1245</span>    }<a name="line.1245"></a>
-<span class="sourceLineNo">1246</span>    if (this.mpmHost != null) {<a name="line.1246"></a>
-<span class="sourceLineNo">1247</span>      this.mpmHost.stop("server shutting down.");<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">1122</span>    if (hfileCleaner != null) {<a name="line.1122"></a>
+<span class="sourceLineNo">1123</span>      hfileCleanerFlag = hfileCleaner.getEnabled();<a name="line.1123"></a>
+<span class="sourceLineNo">1124</span>    }<a name="line.1124"></a>
+<span class="sourceLineNo">1125</span><a name="line.1125"></a>
+<span class="sourceLineNo">1126</span>    if (logCleaner != null) {<a name="line.1126"></a>
+<span class="sourceLineNo">1127</span>      logCleanerFlag = logCleaner.getEnabled();<a name="line.1127"></a>
+<span class="sourceLineNo">1128</span>    }<a name="line.1128"></a>
+<span class="sourceLineNo">1129</span><a name="line.1129"></a>
+<span class="sourceLineNo">1130</span>    return (hfileCleanerFlag &amp;&amp; logCleanerFlag);<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>  @Override<a name="line.1133"></a>
+<span class="sourceLineNo">1134</span>  public TableDescriptors getTableDescriptors() {<a name="line.1134"></a>
+<span class="sourceLineNo">1135</span>    return this.tableDescriptors;<a name="line.1135"></a>
+<span class="sourceLineNo">1136</span>  }<a name="line.1136"></a>
+<span class="sourceLineNo">1137</span><a name="line.1137"></a>
+<span class="sourceLineNo">1138</span>  @Override<a name="line.1138"></a>
+<span class="sourceLineNo">1139</span>  public ServerManager getServerManager() {<a name="line.1139"></a>
+<span class="sourceLineNo">1140</span>    return this.serverManager;<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>  @Override<a name="line.1143"></a>
+<span class="sourceLineNo">1144</span>  public MasterFileSystem getMasterFileSystem() {<a name="line.1144"></a>
+<span class="sourceLineNo">1145</span>    return this.fileSystemManager;<a name="line.1145"></a>
+<span class="sourceLineNo">1146</span>  }<a name="line.1146"></a>
+<span class="sourceLineNo">1147</span><a name="line.1147"></a>
+<span class="sourceLineNo">1148</span>  @Override<a name="line.1148"></a>
+<span class="sourceLineNo">1149</span>  public MasterWalManager getMasterWalManager() {<a name="line.1149"></a>
+<span class="sourceLineNo">1150</span>    return this.walManager;<a name="line.1150"></a>
+<span class="sourceLineNo">1151</span>  }<a name="line.1151"></a>
+<span class="sourceLineNo">1152</span><a name="line.1152"></a>
+<span class="sourceLineNo">1153</span>  @Override<a name="line.1153"></a>
+<span class="sourceLineNo">1154</span>  public TableStateManager getTableStateManager() {<a name="line.1154"></a>
+<span class="sourceLineNo">1155</span>    return tableStateManager;<a name="line.1155"></a>
+<span class="sourceLineNo">1156</span>  }<a name="line.1156"></a>
+<span class="sourceLineNo">1157</span><a name="line.1157"></a>
+<span class="sourceLineNo">1158</span>  /*<a name="line.1158"></a>
+<span class="sourceLineNo">1159</span>   * Start up all services. If any of these threads gets an unhandled exception<a name="line.1159"></a>
+<span class="sourceLineNo">1160</span>   * then they just die with a logged message.  This should be fine because<a name="line.1160"></a>
+<span class="sourceLineNo">1161</span>   * in general, we do not expect the master to get such unhandled exceptions<a name="line.1161"></a>
+<span class="sourceLineNo">1162</span>   *  as OOMEs; it should be lightly loaded. See what HRegionServer does if<a name="line.1162"></a>
+<span class="sourceLineNo">1163</span>   *  need to install an unexpected exception handler.<a name="line.1163"></a>
+<span class="sourceLineNo">1164</span>   */<a name="line.1164"></a>
+<span class="sourceLineNo">1165</span>  private void startServiceThreads() throws IOException{<a name="line.1165"></a>
+<span class="sourceLineNo">1166</span>   // Start the executor service pools<a name="line.1166"></a>
+<span class="sourceLineNo">1167</span>   this.executorService.startExecutorService(ExecutorType.MASTER_OPEN_REGION,<a name="line.1167"></a>
+<span class="sourceLineNo">1168</span>      conf.getInt("hbase.master.executor.openregion.threads", 5));<a name="line.1168"></a>
+<span class="sourceLineNo">1169</span>   this.executorService.startExecutorService(ExecutorType.MASTER_CLOSE_REGION,<a name="line.1169"></a>
+<span class="sourceLineNo">1170</span>      conf.getInt("hbase.master.executor.closeregion.threads", 5));<a name="line.1170"></a>
+<span class="sourceLineNo">1171</span>   this.executorService.startExecutorService(ExecutorType.MASTER_SERVER_OPERATIONS,<a name="line.1171"></a>
+<span class="sourceLineNo">1172</span>      conf.getInt("hbase.master.executor.serverops.threads", 5));<a name="line.1172"></a>
+<span class="sourceLineNo">1173</span>   this.executorService.startExecutorService(ExecutorType.MASTER_META_SERVER_OPERATIONS,<a name="line.1173"></a>
+<span class="sourceLineNo">1174</span>      conf.getInt("hbase.master.executor.meta.serverops.threads", 5));<a name="line.1174"></a>
+<span class="sourceLineNo">1175</span>   this.executorService.startExecutorService(ExecutorType.M_LOG_REPLAY_OPS,<a name="line.1175"></a>
+<span class="sourceLineNo">1176</span>      conf.getInt("hbase.master.executor.logreplayops.threads", 10));<a name="line.1176"></a>
+<span class="sourceLineNo">1177</span><a name="line.1177"></a>
+<span class="sourceLineNo">1178</span>   // We depend on there being only one instance of this executor running<a name="line.1178"></a>
+<span class="sourceLineNo">1179</span>   // at a time.  To do concurrency, would need fencing of enable/disable of<a name="line.1179"></a>
+<span class="sourceLineNo">1180</span>   // tables.<a name="line.1180"></a>
+<span class="sourceLineNo">1181</span>   // Any time changing this maxThreads to &gt; 1, pls see the comment at<a name="line.1181"></a>
+<span class="sourceLineNo">1182</span>   // AccessController#postCompletedCreateTableAction<a name="line.1182"></a>
+<span class="sourceLineNo">1183</span>   this.executorService.startExecutorService(ExecutorType.MASTER_TABLE_OPERATIONS, 1);<a name="line.1183"></a>
+<span class="sourceLineNo">1184</span>   startProcedureExecutor();<a name="line.1184"></a>
+<span class="sourceLineNo">1185</span><a name="line.1185"></a>
+<span class="sourceLineNo">1186</span>    // Initial cleaner chore<a name="line.1186"></a>
+<span class="sourceLineNo">1187</span>    CleanerChore.initChorePool(conf);<a name="line.1187"></a>
+<span class="sourceLineNo">1188</span>   // Start log cleaner thread<a name="line.1188"></a>
+<span class="sourceLineNo">1189</span>   int cleanerInterval = conf.getInt("hbase.master.cleaner.interval", 600 * 1000);<a name="line.1189"></a>
+<span class="sourceLineNo">1190</span>   this.logCleaner =<a name="line.1190"></a>
+<span class="sourceLineNo">1191</span>      new LogCleaner(cleanerInterval,<a name="line.1191"></a>
+<span class="sourceLineNo">1192</span>         this, conf, getMasterWalManager().getFileSystem(),<a name="line.1192"></a>
+<span class="sourceLineNo">1193</span>         getMasterWalManager().getOldLogDir());<a name="line.1193"></a>
+<span class="sourceLineNo">1194</span>    getChoreService().scheduleChore(logCleaner);<a name="line.1194"></a>
+<span class="sourceLineNo">1195</span><a name="line.1195"></a>
+<span class="sourceLineNo">1196</span>    // start the hfile archive cleaner thread<a name="line.1196"></a>
+<span class="sourceLineNo">1197</span>    Path archiveDir = HFileArchiveUtil.getArchivePath(conf);<a name="line.1197"></a>
+<span class="sourceLineNo">1198</span>    Map&lt;String, Object&gt; params = new HashMap&lt;&gt;();<a name="line.1198"></a>
+<span class="sourceLineNo">1199</span>    params.put(MASTER, this);<a name="line.1199"></a>
+<span class="sourceLineNo">1200</span>    this.hfileCleaner = new HFileCleaner(cleanerInterval, this, conf, getMasterFileSystem()<a name="line.1200"></a>
+<span class="sourceLineNo">1201</span>        .getFileSystem(), archiveDir, params);<a name="line.1201"></a>
+<span class="sourceLineNo">1202</span>    getChoreService().scheduleChore(hfileCleaner);<a name="line.1202"></a>
+<span class="sourceLineNo">1203</span><a name="line.1203"></a>
+<span class="sourceLineNo">1204</span>    replicationBarrierCleaner =<a name="line.1204"></a>
+<span class="sourceLineNo">1205</span>      new ReplicationBarrierCleaner(conf, this, getConnection(), replicationPeerManager);<a name="line.1205"></a>
+<span class="sourceLineNo">1206</span>    getChoreService().scheduleChore(replicationBarrierCleaner);<a name="line.1206"></a>
+<span class="sourceLineNo">1207</span><a name="line.1207"></a>
+<span class="sourceLineNo">1208</span>    serviceStarted = true;<a name="line.1208"></a>
+<span class="sourceLineNo">1209</span>    if (LOG.isTraceEnabled()) {<a name="line.1209"></a>
+<span class="sourceLineNo">1210</span>      LOG.trace("Started service threads");<a name="line.1210"></a>
+<span class="sourceLineNo">1211</span>    }<a name="line.1211"></a>
+<span class="sourceLineNo">1212</span>  }<a name="line.1212"></a>
+<span class="sourceLineNo">1213</span><a name="line.1213"></a>
+<span class="sourceLineNo">1214</span>  private void cancelChore(ScheduledChore chore) {<a name="line.1214"></a>
+<span class="sourceLineNo">1215</span>    if (chore != null) {<a name="line.1215"></a>
+<span class="sourceLineNo">1216</span>      chore.cancel();<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><a name="line.1219"></a>
+<span class="sourceLineNo">1220</span>  @Override<a name="line.1220"></a>
+<span class="sourceLineNo">1221</span>  protected void stopServiceThreads() {<a name="line.1221"></a>
+<span class="sourceLineNo">1222</span>    if (masterJettyServer != null) {<a name="line.1222"></a>
+<span class="sourceLineNo">1223</span>      LOG.info("Stopping master jetty server");<a name="line.1223"></a>
+<span class="sourceLineNo">1224</span>      try {<a name="line.1224"></a>
+<span class="sourceLineNo">1225</span>        masterJettyServer.stop();<a name="line.1225"></a>
+<span class="sourceLineNo">1226</span>      } catch (Exception e) {<a name="line.1226"></a>
+<span class="sourceLineNo">1227</span>        LOG.error("Failed to stop master jetty server", e);<a name="line.1227"></a>
+<span class="sourceLineNo">1228</span>      }<a name="line.1228"></a>
+<span class="sourceLineNo">1229</span>    }<a name="line.1229"></a>
+<span class="sourceLineNo">1230</span>    super.stopServiceThreads();<a name="line.1230"></a>
+<span class="sourceLineNo">1231</span>    stopChores();<a name="line.1231"></a>
+<span class="sourceLineNo">1232</span><a name="line.1232"></a>
+<span class="sourceLineNo">1233</span>    LOG.debug("Stopping service threads");<a name="line.1233"></a>
+<span class="sourceLineNo">1234</span><a name="line.1234"></a>
+<span class="sourceLineNo">1235</span>    if (this.quotaManager != null) {<a name="line.1235"></a>
+<span class="sourceLineNo">1236</span>      this.quotaManager.stop();<a name="line.1236"></a>
+<span class="sourceLineNo">1237</span>    }<a name="line.1237"></a>
+<span class="sourceLineNo">1238</span><a name="line.1238"></a>
+<span class="sourceLineNo">1239</span>    if (this.activeMasterManager != null) {<a name="line.1239"></a>
+<span class="sourceLineNo">1240</span>      this.activeMasterManager.stop();<a name="line.1240"></a>
+<span class="sourceLineNo">1241</span>    }<a name="line.1241"></a>
+<span class="sourceLineNo">1242</span>    if (this.serverManager != null) {<a name="line.1242"></a>
+<span class="sourceLineNo">1243</span>      this.serverManager.stop();<a name="line.1243"></a>
+<span class="sourceLineNo">1244</span>    }<a name="line.1244"></a>
+<span class="sourceLineNo">1245</span>    if (this.assignmentManager != null) {<a name="line.1245"></a>
+<span class="sourceLineNo">1246</span>      this.assignmentManager.stop();<a name="line.1246"></a>
+<span class="sourceLineNo">1247</span>    }<a name="line.1247"></a>
+<span class="sourceLineNo">1248</span><a name="line.1248"></a>
+<span class="sourceLineNo">1249</span>    stopProcedureExecutor();<a name="line.1249"></a>
 <span class="sourceLineNo">1250</span><a name="line.1250"></a>
-<span class="sourceLineNo">1251</span>  private void startProcedureExecutor() throws IOException {<a name="line.1251"></a>
-<span class="sourceLineNo">1252</span>    final MasterProcedureEnv procEnv = new MasterProcedureEnv(this);<a name="line.1252"></a>
-<span class="sourceLineNo">1253</span>    procedureStore = new WALProcedureStore(conf,<a name="line.1253"></a>
-<span class="sourceLineNo">1254</span>        new MasterProcedureEnv.WALStoreLeaseRecovery(this));<a name="line.1254"></a>
-<span class="sourceLineNo">1255</span>    procedureStore.registerListener(new MasterProcedureEnv.MasterProcedureStoreListener(this));<a name="line.1255"></a>
-<span class="sourceLineNo">1256</span>    MasterProcedureScheduler procedureScheduler = procEnv.getProcedureScheduler();<a name="line.1256"></a>
-<span class="sourceLineNo">1257</span>    procedureExecutor = new ProcedureExecutor&lt;&gt;(conf, procEnv, procedureStore, procedureScheduler);<a name="line.1257"></a>
-<span class="sourceLineNo">1258</span>    configurationManager.registerObserver(procEnv);<a name="line.1258"></a>
-<span class="sourceLineNo">1259</span><a name="line.1259"></a>
-<span class="sourceLineNo">1260</span>    int cpus = Runtime.getRuntime().availableProcessors();<a name="line.1260"></a>
-<span class="sourceLineNo">1261</span>    final int numThreads = conf.getInt(MasterProcedureConstants.MASTER_PROCEDURE_THREADS, Math.max(<a name="line.1261"></a>
-<span class="sourceLineNo">1262</span>      (cpus &gt; 0 ? cpus / 4 : 0), MasterProcedureConstants.DEFAULT_MIN_MASTER_PROCEDURE_THREADS));<a name="line.1262"></a>
-<span class="sourceLineNo">1263</span>    final boolean abortOnCorruption =<a name="line.1263"></a>
-<span class="sourceLineNo">1264</span>      conf.getBoolean(MasterProcedureConstants.EXECUTOR_ABORT_ON_CORRUPTION,<a name="line.1264"></a>
-<span class="sourceLineNo">1265</span>        MasterProcedureConstants.DEFAULT_EXECUTOR_ABORT_ON_CORRUPTION);<a name="line.1265"></a>
-<span class="sourceLineNo">1266</span>    procedureStore.start(numThreads);<a name="line.1266"></a>
-<span class="sourceLineNo">1267</span>    procedureExecutor.start(numThreads, abortOnCorruption);<a name="line.1267"></a>
-<span class="sourceLineNo">1268</span>    procEnv.getRemoteDispatcher().start();<a name="line.1268"></a>
-<span class="sourceLineNo">1269</span>  }<a name="line.1269"></a>
+<span class="sourceLineNo">1251</span>    if (this.walManager != null) {<a name="line.1251"></a>
+<span class="sourceLineNo">1252</span>      this.walManager.stop();<a name="line.1252"></a>
+<span class="sourceLineNo">1253</span>    }<a name="line.1253"></a>
+<span class="sourceLineNo">1254</span>    if (this.fileSystemManager != null) {<a name="line.1254"></a>
+<span class="sourceLineNo">1255</span>      this.fileSystemManager.stop();<a name="line.1255"></a>
+<span class="sourceLineNo">1256</span>    }<a name="line.1256"></a>
+<span class="sourceLineNo">1257</span>    if (this.mpmHost != null) {<a name="line.1257"></a>
+<span class="sourceLineNo">1258</span>      this.mpmHost.stop("server shutting down.");<a name="line.1258"></a>
+<span class="sourceLineNo">1259</span>    }<a name="line.1259"></a>
+<span class="sourceLineNo">1260</span>  }<a name="line.1260"></a>
+<span class="sourceLineNo">1261</span><a name="line.1261"></a>
+<span class="sourceLineNo">1262</span>  private void startProcedureExecutor() throws IOException {<a name="line.1262"></a>
+<span class="sourceLineNo">1263</span>    final MasterProcedureEnv procEnv = new MasterProcedureEnv(this);<a name="line.1263"></a>
+<span class="sourceLineNo">1264</span>    procedureStore = new WALProcedureStore(conf,<a name="line.1264"></a>
+<span class="sourceLineNo">1265</span>        new MasterProcedureEnv.WALStoreLeaseRecovery(this));<a name="line.1265"></a>
+<span class="sourceLineNo">1266</span>    procedureStore.registerListener(new MasterProcedureEnv.MasterProcedureStoreListener(this));<a name="line.1266"></a>
+<span class="sourceLineNo">1267</span>    MasterProcedureScheduler procedureScheduler = procEnv.getProcedureScheduler();<a name="line.1267"></a>
+<span class="sourceLineNo">1268</span>    procedureExecutor = new ProcedureExecutor&lt;&gt;(conf, procEnv, procedureStore, procedureScheduler);<a name="line.1268"></a>
+<span class="sourceLineNo">1269</span>    configurationManager.registerObserver(procEnv);<a name="line.1269"></a>
 <span class="sourceLineNo">1270</span><a name="line.1270"></a>
-<span class="sourceLineNo">1271</span>  private void stopProcedureExecutor() {<a name="line.1271"></a>
-<span class="sourceLineNo">1272</span>    if (procedureExecutor != null) {<a name="line.1272"></a>
-<span class="sourceLineNo">1273</span>      configurationManager.deregisterObserver(procedureExecutor.getEnvironment());<a name="line.1273"></a>
-<span class="sourceLineNo">1274</span>      procedureExecutor.getEnvironment().getRemoteDispatcher().stop();<a name="line.1274"></a>
-<span class="sourceLineNo">1275</span>      procedureExecutor.stop();<a name="line.1275"></a>
-<span class="sourceLineNo">1276</span>      procedureExecutor.join();<a name="line.1276"></a>
-<span class="sourceLineNo">1277</span>      procedureExecutor = null;<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>    if (procedureStore != null) {<a name="line.1280"></a>
-<span class="sourceLineNo">1281</span>      procedureStore.stop(isAborted());<a name="line.1281"></a>
-<span class="sourceLineNo">1282</span>      procedureStore = null;<a name="line.1282"></a>
-<span class="sourceLineNo">1283</span>    }<a name="line.1283"></a>
-<span class="sourceLineNo">1284</span>  }<a name="line.1284"></a>
-<span class="sourceLineNo">1285</span><a name="line.1285"></a>
-<span class="sourceLineNo">1286</span>  private void stopChores() {<a name="line.1286"></a>
-<span class="sourceLineNo">1287</span>    cancelChore(this.expiredMobFileCleanerChore);<a name="line.1287"></a>
-<span class="sourceLineNo">1288</span>    cancelChore(this.mobCompactChore);<a name="line.1288"></a>
-<span class="sourceLineNo">1289</span>    cancelChore(this.balancerChore);<a name="line.1289"></a>
-<span class="sourceLineNo">1290</span>    cancelChore(this.normalizerChore);<a name="line.1290"></a>
-<span class="sourceLineNo">1291</span>    cancelChore(this.clusterStatusChore);<a name="line.1291"></a>
-<span class="sourceLineNo">1292</span>    cancelChore(this.catalogJanitorChore);<a name="line.1292"></a>
-<span class="sourceLineNo">1293</span>    cancelChore(this.clusterStatusPublisherChore);<a name="line.1293"></a>
-<span class="sourceLineNo">1294</span>    if (this.mobCompactThread != null) {<a name="line.1294"></a>
-<span class="sourceLineNo">1295</span>      this.mobCompactThread.close();<a name="line.1295"></a>
-<span class="sourceLineNo">1296</span>    }<a name="line.1296"></a>
-<span class="sourceLineNo">1297</span>    cancelChore(this.clusterStatusPublisherChore);<a name="line.1297"></a>
-<span class="sourceLineNo">1298</span>    cancelChore(this.snapshotQuotaChore);<a name="line.1298"></a>
-<span class="sourceLineNo">1299</span>    cancelChore(this.logCleaner);<a name="line.1299"></a>
-<span class="sourceLineNo">1300</span>    cancelChore(this.hfileCleaner);<a name="line.1300"></a>
-<span class="sourceLineNo">1301</span>    cancelChore(this.replicationBarrierCleaner);<a name="line.1301"></a>
-<span class="sourceLineNo">1302</span>  }<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>   * @return Get remote side's InetAddress<a name="line.1305"></a>
-<span class="sourceLineNo">1306</span>   */<a name="line.1306"></a>
-<span class="sourceLineNo">1307</span>  InetAddress getRemoteInetAddress(final int port,<a name="line.1307"></a>
-<span class="sourceLineNo">1308</span>      final long serverStartCode) throws UnknownHostException {<a name="line.1308"></a>
-<span class="sourceLineNo">1309</span>    // Do it out here in its own little method so can fake an address when<a name="line.1309"></a>
-<span class="sourceLineNo">1310</span>    // mocking up in tests.<a name="line.1310"></a>
-<span class="sourceLineNo">1311</span>    InetAddress ia = RpcServer.getRemoteIp();<a name="line.1311"></a>
-<span class="sourceLineNo">1312</span><a name="line.1312"></a>
-<span class="sourceLineNo">1313</span>    // The call could be from the local regionserver,<a name="line.1313"></a>
-<span class="sourceLineNo">1314</span>    // in which case, there is no remote address.<a name="line.1314"></a>
-<span class="sourceLineNo">1315</span>    if (ia == null &amp;&amp; serverStartCode == startcode) {<a name="line.1315"></a>
-<span class="sourceLineNo">1316</span>      InetSocketAddress isa = rpcServices.getSocketAddress();<a name="line.1316"></a>
-<span class="sourceLineNo">1317</span>      if (isa != null &amp;&amp; isa.getPort() == port) {<a name="line.1317"></a>
-<span class="sourceLineNo">1318</span>        ia = isa.getAddress();<a name="line.1318"></a>
-<span class="sourceLineNo">1319</span>      }<a name="line.1319"></a>
-<span class="sourceLineNo">1320</span>    }<a name="line.1320"></a>
-<span class="sourceLineNo">1321</span>    return ia;<a name="line.1321"></a>
-<span class="sourceLineNo">1322</span>  }<a name="line.1322"></a>
+<span class="sourceLineNo">1271</span>    int cpus = Runtime.getRuntime().availableProcessors();<a name="line.1271"></a>
+<span class="sourceLineNo">1272</span>    final int numThreads = conf.getInt(MasterProcedureConstants.MASTER_PROCEDURE_THREADS, Math.max(<a name="line.1272"></a>
+<span class="sourceLineNo">1273</span>      (cpus &gt; 0 ? cpus / 4 : 0), MasterProcedureConstants.DEFAULT_MIN_MASTER_PROCEDURE_THREADS));<a name="line.1273"></a>
+<span class="sourceLineNo">1274</span>    final boolean abortOnCorruption =<a name="line.1274"></a>
+<span class="sourceLineNo">1275</span>      conf.getBoolean(MasterProcedureConstants.EXECUTOR_ABORT_ON_CORRUPTION,<a name="line.1275"></a>
+<span class="sourceLineNo">1276</span>        MasterProcedureConstants.DEFAULT_EXECUTOR_ABORT_ON_CORRUPTION);<a name="line.1276"></a>
+<span class="sourceLineNo">1277</span>    procedureStore.start(numThreads);<a name="line.1277"></a>
+<span class="sourceLineNo">1278</span>    procedureExecutor.start(numThreads, abortOnCorruption);<a name="line.1278"></a>
+<span class="sourceLineNo">1279</span>    procEnv.getRemoteDispatcher().start();<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>  private void stopProcedureExecutor() {<a name="line.1282"></a>
+<span class="sourceLineNo">1283</span>    if (procedureExecutor != null) {<a name="line.1283"></a>
+<span class="sourceLineNo">1284</span>      configurationManager.deregisterObserver(procedureExecutor.getEnvironment());<a name="line.1284"></a>
+<span class="sourceLineNo">1285</span>      procedureExecutor.getEnvironment().getRemoteDispatcher().stop();<a name="line.1285"></a>
+<span class="sourceLineNo">1286</span>      procedureExecutor.stop();<a name="line.1286"></a>
+<span class="sourceLineNo">1287</span>      procedureExecutor.join();<a name="line.1287"></a>
+<span class="sourceLineNo">1288</span>      procedureExecutor = null;<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>    if (procedureStore != null) {<a name="line.1291"></a>
+<span class="sourceLineNo">1292</span>      procedureStore.stop(isAborted());<a name="line.1292"></a>
+<span class="sourceLineNo">1293</span>      procedureStore = null;<a name="line.1293"></a>
+<span class="sourceLineNo">1294</span>    }<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>  private void stopChores() {<a name="line.1297"></a>
+<span class="sourceLineNo">1298</span>    cancelChore(this.expiredMobFileCleanerChore);<a name="line.1298"></a>
+<span class="sourceLineNo">1299</span>    cancelChore(this.mobCompactChore);<a name="line.1299"></a>
+<span class="sourceLineNo">1300</span>    cancelChore(this.balancerChore);<a name="line.1300"></a>
+<span class="sourceLineNo">1301</span>    cancelChore(this.normalizerChore);<a name="line.1301"></a>
+<span class="sourceLineNo">1302</span>    cancelChore(this.clusterStatusChore);<a name="line.1302"></a>
+<span class="sourceLineNo">1303</span>    cancelChore(this.catalogJanitorChore);<a name="line.1303"></a>
+<span class="sourceLineNo">1304</span>    cancelChore(this.clusterStatusPublisherChore);<a name="line.1304"></a>
+<span class="sourceLineNo">1305</span>    if (this.mobCompactThread != null) {<a name="line.1305"></a>
+<span class="sourceLineNo">1306</span>      this.mobCompactThread.close();<a name="line.1306"></a>
+<span class="sourceLineNo">1307</span>    }<a name="line.1307"></a>
+<span class="sourceLineNo">1308</span>    cancelChore(this.clusterStatusPublisherChore);<a name="line.1308"></a>
+<span class="sourceLineNo">1309</span>    cancelChore(this.snapshotQuotaChore);<a name="line.1309"></a>
+<span class="sourceLineNo">1310</span>    cancelChore(this.logCleaner);<a name="line.1310"></a>
+<span class="sourceLineNo">1311</span>    cancelChore(this.hfileCleaner);<a name="line.1311"></a>
+<span class="sourceLineNo">1312</span>    cancelChore(this.replicationBarrierCleaner);<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>   * @return Get remote side's InetAddress<a name="line.1316"></a>
+<span class="sourceLineNo">1317</span>   */<a name="line.1317"></a>
+<span class="sourceLineNo">1318</span>  InetAddress getRemoteInetAddress(final int port,<a name="line.1318"></a>
+<span class="sourceLineNo">1319</span>      final long serverStartCode) throws UnknownHostException {<a name="line.1319"></a>
+<span class="sourceLineNo">1320</span>    // Do it out here in its own little method so can fake an address when<a name="line.1320"></a>
+<span class="sourceLineNo">1321</span>    // mocking up in tests.<a name="line.1321"></a>
+<span class="sourceLineNo">1322</span>    InetAddress ia = RpcServer.getRemoteIp();<a name="line.1322"></a>
 <span class="sourceLineNo">1323</span><a name="line.1323"></a>
-<span class="sourceLineNo">1324</span>  /**<a name="line.1324"></a>
-<span class="sourceLineNo">1325</span>   * @return Maximum time we should run balancer for<a name="line.1325"></a>
-<span class="sourceLineNo">1326</span>   */<a name="line.1326"></a>
-<span class="sourceLineNo">1327</span>  private int getMaxBalancingTime() {<a name="line.1327"></a>
-<span class="sourceLineNo">1328</span>    int maxBalancingTime = getConfiguration().getInt(HConstants.HBASE_BALANCER_MAX_BALANCING, -1);<a name="line.1328"></a>
-<span class="sourceLineNo">1329</span>    if (maxBalancingTime == -1) {<a name="line.1329"></a>
-<span class="sourceLineNo">1330</span>      // if max balancing time isn't set, defaulting it to period time<a name="line.1330"></a>
-<span class="sourceLineNo">1331</span>      maxBalancingTime = getConfiguration().getInt(HConstants.HBASE_BALANCER_PERIOD,<a name="line.1331"></a>
-<span class="sourceLineNo">1332</span>        HConstants.DEFAULT_HBASE_BALANCER_PERIOD);<a name="line.1332"></a>
-<span class="sourceLineNo">1333</span>    }<a name="line.1333"></a>
-<span class="sourceLineNo">1334</span>    return maxBalancingTime;<a name="line.1334"></a>
-<span class="sourceLineNo">1335</span>  }<a name="line.1335"></a>
-<span class="sourceLineNo">1336</span><a name="line.1336"></a>
-<span class="sourceLineNo">1337</span>  /**<a name="line.1337"></a>
-<span class="sourceLineNo">1338</span>   * @return Maximum number of regions in transition<a name="line.1338"></a>
-<span class="sourceLineNo">1339</span>   */<a name="line.1339"></a>
-<span class="sourceLineNo">1340</span>  private int getMaxRegionsInTransition() {<a name="line.1340"></a>
-<span class="sourceLineNo">1341</span>    int numRegions = this.assignmentManager.getRegionStates().getRegionAssignments().size();<a name="line.1341"></a>
-<span class="sourceLineNo">1342</span>    return Math.max((int) Math.floor(numRegions * this.maxRitPercent), 1);<a name="line.1342"></a>
-<span class="sourceLineNo">1343</span>  }<a name="line.1343"></a>
-<span class="sourceLineNo">1344</span><a name="line.1344"></a>
-<span class="sourceLineNo">1345</span>  /**<a name="line.1345"></a>
-<span class="sourceLineNo">1346</span>   * It first sleep to the next balance plan start time. Meanwhile, throttling by the max<a name="line.1346"></a>
-<span class="sourceLineNo">1347</span>   * number regions in transition to protect availability.<a name="line.1347"></a>
-<span class="sourceLineNo">1348</span>   * @param nextBalanceStartTime The next balance plan start time<a name="line.1348"></a>
-<span class="sourceLineNo">1349</span>   * @param maxRegionsInTransition max number of regions in transition<a name="line.1349"></a>
-<span class="sourceLineNo">1350</span>   * @param cutoffTime when to exit balancer<a name="line.1350"></a>
-<span class="sourceLineNo">1351</span>   */<a name="line.1351"></a>
-<span class="sourceLineNo">1352</span>  private void balanceThrottling(long nextBalanceStartTime, int maxRegionsInTransition,<a name="line.1352"></a>
-<span class="sourceLineNo">1353</span>      long cutoffTime) {<a name="line.1353"></a>
-<span class="sourceLineNo">1354</span>    boolean interrupted = false;<a name="line.1354"></a>
+<span class="sourceLineNo">1324</span>    // The call could be from the local regionserver,<a name="line.1324"></a>
+<span class="sourceLineNo">1325</span>    // in which case, there is no remote address.<a name="line.1325"></a>
+<span class="sourceLineNo">1326</span>    if (ia == null &amp;&amp; serverStartCode == startcode) {<a name="line.1326"></a>
+<span class="sourceLineNo">1327</span>      InetSocketAddress isa = rpcServices.getSocketAddress();<a name="line.1327"></a>
+<span class="sourceLineNo">1328</span>      if (isa != null &amp;&amp; isa.getPort() == port) {<a name="line.1328"></a>
+<span class="sourceLineNo">1329</span>        ia = isa.getAddress();<a name="line.1329"></a>
+<span class="sourceLineNo">1330</span>      }<a name="line.1330"></a>
+<span class="sourceLineNo">1331</span>    }<a name="line.1331"></a>
+<span class="sourceLineNo">1332</span>    return ia;<a name="line.1332"></a>
+<span class="sourceLineNo">1333</span>  }<a name="line.1333"></a>
+<span class="sourceLineNo">1334</span><a name="line.1334"></a>
+<span class="sourceLineNo">1335</span>  /**<a name="line.1335"></a>
+<span class="sourceLineNo">1336</span>   * @return Maximum time we should run balancer for<a name="line.1336"></a>
+<span class="sourceLineNo">1337</span>   */<a name="line.1337"></a>
+<span class="sourceLineNo">1338</span>  private int getMaxBalancingTime() {<a name="line.1338"></a>
+<span class="sourceLineNo">1339</span>    int maxBalancingTime = getConfiguration().getInt(HConstants.HBASE_BALANCER_MAX_BALANCING, -1);<a name="line.1339"></a>
+<span class="sourceLineNo">1340</span>    if (maxBalancingTime == -1) {<a name="line.1340"></a>
+<span class="sourceLineNo">1341</span>      // if max balancing time isn't set, defaulting it to period time<a name="line.1341"></a>
+<span class="sourceLineNo">1342</span>      maxBalancingTime = getConfiguration().getInt(HConstants.HBASE_BALANCER_PERIOD,<a name="line.1342"></a>
+<span class="sourceLineNo">1343</span>        HConstants.DEFAULT_HBASE_BALANCER_PERIOD);<a name="line.1343"></a>
+<span class="sourceLineNo">1344</span>    }<a name="line.1344"></a>
+<span class="sourceLineNo">1345</span>    return maxBalancingTime;<a name="line.1345"></a>
+<span class="sourceLineNo">1346</span>  }<a name="line.1346"></a>
+<span class="sourceLineNo">1347</span><a name="line.1347"></a>
+<span class="sourceLineNo">1348</span>  /**<a name="line.1348"></a>
+<span class="sourceLineNo">1349</span>   * @return Maximum number of regions in transition<a name="line.1349"></a>
+<span class="sourceLineNo">1350</span>   */<a name="line.1350"></a>
+<span class="sourceLineNo">1351</span>  private int getMaxRegionsInTransition() {<a name="line.1351"></a>
+<span class="sourceLineNo">1352</span>    int numRegions = this.assignmentManager.getRegionStates().getRegionAssignments().size();<a name="line.1352"></a>
+<span class="sourceLineNo">1353</span>    return Math.max((int) Math.floor(numRegions * this.maxRitPercent), 1);<a name="line.1353"></a>
+<span class="sourceLineNo">1354</span>  }<a name="line.1354"></a>
 <span class="sourceLineNo">1355</span><a name="line.1355"></a>
-<span class="sourceLineNo">1356</span>    // Sleep to next balance plan start time<a name="line.1356"></a>
-<span class="sourceLineNo">1357</span>    // But if there are zero regions in transition, it can skip sleep to speed up.<a name="line.1357"></a>
-<span class="sourceLineNo">1358</span>    while (!interrupted &amp;&amp; System.currentTimeMillis() &lt; nextBalanceStartTime<a name="line.1358"></a>
-<span class="sourceLineNo">1359</span>        &amp;&amp; this.assignmentManager.getRegionStates().hasRegionsInTransition()) {<a name="line.1359"></a>
-<span class="sourceLineNo">1360</span>      try {<a name="line.1360"></a>
-<span class="sourceLineNo">1361</span>        Thread.sleep(100);<a name="line.1361"></a>
-<span class="sourceLineNo">1362</span>      } catch (InterruptedException ie) {<a name="line.1362"></a>
-<span class="sourceLineNo">1363</span>        interrupted = true;<a name="line.1363"></a>
-<span class="sourceLineNo">1364</span>      }<a name="line.1364"></a>
-<span class="sourceLineNo">1365</span>    }<a name="line.1365"></a>
+<span class="sourceLineNo">1356</span>  /**<a name="line.1356"></a>
+<span class="sourceLineNo">1357</span>   * It first sleep to the next balance plan start time. Meanwhile, throttling by the max<a name="line.1357"></a>
+<span class="sourceLineNo">1358</span>   * number regions in transition to protect availability.<a name="line.1358"></a>
+<span class="sourceLineNo">1359</span>   * @param nextBalanceStartTime The next balance plan start time<a name="line.1359"></a>
+<span class="sourceLineNo">1360</span>   * @param maxRegionsInTransition max number of regions in transition<a name="line.1360"></a>
+<span class="sourceLineNo">1361</span>   * @param cutoffTime when to exit balancer<a name="line.1361"></a>
+<span class="sourceLineNo">1362</span>   */<a name="line.1362"></a>
+<span class="sourceLineNo">1363</span>  private void balanceThrottling(long nextBalanceStartTime, int maxRegionsInTransition,<a name="line.1363"></a>
+<span class="sourceLineNo">1364</span>      long cutoffTime) {<a name="line.1364"></a>
+<span class="sourceLineNo">1365</span>    boolean interrupted = false;<a name="line.1365"></a>
 <span class="sourceLineNo">1366</span><a name="line.1366"></a>
-<span class="sourceLineNo">1367</span>    // Throttling by max number regions in transition<a name="line.1367"></a>
-<span class="sourceLineNo">1368</span>    while (!interrupted<a name="line.1368"></a>
-<span class="sourceLineNo">1369</span>        &amp;&amp; maxRegionsInTransition &gt; 0<a name="line.1369"></a>
-<span class="sourceLineNo">1370</span>        &amp;&amp; this.assignmentManager.getRegionStates().getRegionsInTransitionCount()<a name="line.1370"></a>
-<span class="sourceLineNo">1371</span>        &gt;= maxRegionsInTransition &amp;&amp; System.currentTimeMillis() &lt;= cutoffTime) {<a name="line.1371"></a>
-<span class="sourceLineNo">1372</span>      try {<a name="line.1372"></a>
-<span class="sourceLineNo">1373</span>        // sleep if the number of regions in transition exceeds the limit<a name="line.1373"></a>
-<span class="sourceLineNo">1374</span>        Thread.sleep(100);<a name="line.1374"></a>
-<span class="sourceLineNo">1375</span>      } catch (InterruptedException ie) {<a name="line.1375"></a>
-<span class="sourceLineNo">1376</span>        interrupted = true;<a name="line.1376"></a>
-<span class="sourceLineNo">1377</span>      }<a name="line.1377"></a>
-<span class="sourceLineNo">1378</span>    }<a name="line.1378"></a>
-<span class="sourceLineNo">1379</span><a name="line.1379"></a>
-<span class="sourceLineNo">1380</span>    if (interrupted) Thread.currentThread().interrupt();<a name="line.1380"></a>
-<span class="sourceLineNo">1381</span>  }<a name="line.1381"></a>
-<span class="sourceLineNo">1382</span><a name="line.1382"></a>
-<span class="sourceLineNo">1383</span>  public boolean balance() throws IOException {<a name="line.1383"></a>
-<span class="sourceLineNo">1384</span>    return balance(false);<a name="line.1384"></a>
-<span class="sourceLineNo">1385</span>  }<a name="line.1385"></a>
-<span class="sourceLineNo">1386</span><a name="line.1386"></a>
-<span class="sourceLineNo">1387</span>  public boolean balance(boolean force) throws IOException {<a name="line.1387"></a>
-<span class="sourceLineNo">1388</span>    // if master not initialized, don't run balancer.<a name="line.1388"></a>
-<span class="sourceLineNo">1389</span>    if (!isInitialized()) {<a name="line.1389"></a>
-<span class="sourceLineNo">1390</span>      LOG.debug("Master has not been initialized, don't run balancer.");<a name="line.1390"></a>
-<span class="sourceLineNo">1391</span>      return false;<a name="line.1391"></a>
-<span class="sourceLineNo">1392</span>    }<a name="line.1392"></a>
+<span class="sourceLineNo">1367</span>    // Sleep to next balance plan start time<a name="line.1367"></a>
+<span class="sourceLineNo">1368</span>    // But if there are zero regions in transition, it can skip sleep to speed up.<a name="line.1368"></a>
+<span class="sourceLineNo">1369</span>    while (!interrupted &amp;&amp; System.currentTimeMillis() &lt; nextBalanceStartTime<a name="line.1369"></a>
+<span class="sourceLineNo">1370</span>        &amp;&amp; this.assignmentManager.getRegionStates().hasRegionsInTransition()) {<a name="line.1370"></a>
+<span class="sourceLineNo">1371</span>      try {<a name="line.1371"></a>
+<span class="sourceLineNo">1372</span>        Thread.sleep(100);<a name="line.1372"></a>
+<span class="sourceLineNo">1373</span>      } catch (InterruptedException ie) {<a name="line.1373"></a>
+<span class="sourceLineNo">1374</span>        interrupted = true;<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><a name="line.1377"></a>
+<span class="sourceLineNo">1378</span>    // Throttling by max number regions in transition<a name="line.1378"></a>
+<span class="sourceLineNo">1379</span>    while (!interrupted<a name="line.1379"></a>
+<span class="sourceLineNo">1380</span>        &amp;&amp; maxRegionsInTransition &gt; 0<a name="line.1380"></a>
+<span class="sourceLineNo">1381</span>        &amp;&amp; this.assignmentManager.getRegionStates().getRegionsInTransitionCount()<a name="line.1381"></a>
+<span class="sourceLineNo">1382</span>        &gt;= maxRegionsInTransition &amp;&amp; System.currentTimeMillis() &lt;= cutoffTime) {<a name="line.1382"></a>
+<span class="sourceLineNo">1383</span>      try {<a name="line.1383"></a>
+<span class="sourceLineNo">1384</span>        // sleep if the number of regions in transition exceeds the limit<a name="line.1384"></a>
+<span class="sourceLineNo">1385</span>        Thread.sleep(100);<a name="line.1385"></a>
+<span class="sourceLineNo">1386</span>      } catch (InterruptedException ie) {<a name="line.1386"></a>
+<span class="sourceLineNo">1387</span>        interrupted = true;<a name="line.1387"></a>
+<span class="sourceLineNo">1388</span>      }<a name="line.1388"></a>
+<span class="sourceLineNo">1389</span>    }<a name="line.1389"></a>
+<span class="sourceLineNo">1390</span><a name="line.1390"></a>
+<span class="sourceLineNo">1391</span>    if (interrupted) Thread.currentThread().interrupt();<a name="line.1391"></a>
+<span class="sourceLineNo">1392</span>  }<a name="line.1392"></a>
 <span class="sourceLineNo">1393</span><a name="line.1393"></a>
-<span class="sourceLineNo">1394</span>    if (isInMaintenanceMode()) {<a name="line.1394"></a>
-<span class="sourceLineNo">1395</span>      LOG.info("Master is in maintenanceMode mode, don't run balancer.");<a name="line.1395"></a>
-<span class="sourceLineNo">1396</span>      return false;<a name="line.1396"></a>
-<span class="sourceLineNo">1397</span>    }<a name="line.1397"></a>
-<span class="sourceLineNo">1398</span><a name="line.1398"></a>
-<span class="sourceLineNo">1399</span>    int maxRegionsInTransition = getMaxRegionsInTransition();<a name="line.1399"></a>
-<span class="sourceLineNo">1400</span>    synchronized (this.balancer) {<a name="line.1400"></a>
-<span class="sourceLineNo">1401</span>      // If balance not true, don't run balancer.<a name="line.1401"></a>
-<span class="sourceLineNo">1402</span>      if (!this.loadBalancerTracker.isBalancerOn()) return false;<a name="line.1402"></a>
-<span class="sourceLineNo">1403</span>        // Only allow one balance run at at time.<a name="line.1403"></a>
-<span class="sourceLineNo">1404</span>      if (this.assignmentManager.hasRegionsInTransition()) {<a name="line.1404"></a>
-<span class="sourceLineNo">1405</span>        List&lt;RegionStateNode&gt; regionsInTransition = assignmentManager.getRegionsInTransition();<a name="line.1405"></a>
-<span class="sourceLineNo">1406</span>        // if hbase:meta region is in transition, result of assignment cannot be recorded<a name="line.1406"></a>
-<span class="sourceLineNo">1407</span>        // ignore the force flag in that case<a name="line.1407"></a>
-<span class="sourceLineNo">1408</span>        boolean metaInTransition = assignmentManager.isMetaRegionInTransition();<a name="line.1408"></a>
-<span class="sourceLineNo">1409</span>        String prefix = force &amp;&amp; !metaInTransition ? "R" : "Not r";<a name="line.1409"></a>
-<span class="sourceLineNo">1410</span>        List&lt;RegionStateNode&gt; toPrint = regionsInTransition;<a name="line.1410"></a>
-<span class="sourceLineNo">1411</span>        int max = 5;<a name="line.1411"></a>
-<span class="sourceLineNo">1412</span>        boolean truncated = false;<a name="line.1412"></a>
-<span class="sourceLineNo">1413</span>        if (regionsInTransition.size() &gt; max) {<a name="line.1413"></a>
-<span class="sourceLineNo">1414</span>          toPrint = regionsInTransition.subList(0, max);<a name="line.1414"></a>
-<span class="sourceLineNo">1415</span>          truncated = true;<a name="line.1415"></a>
-<span class="sourceLineNo">1416</span>        }<a name="line.1416"></a>
-<span class="sourceLineNo">1417</span>        LOG.info(prefix + "unning balancer because " + regionsInTransition.size() +<a name="line.1417"></a>
-<span class="sourceLineNo">1418</span>          " region(s) in transition: " + toPrint + (truncated? "(truncated list)": ""));<a name="line.1418"></a>
-<span class="sourceLineNo">1419</span>        if (!force || metaInTransition) return false;<a name="line.1419"></a>
-<span class="sourceLineNo">1420</span>      }<a name="line.1420"></a>
-<span class="sourceLineNo">1421</span>      if (this.serverManager.areDeadServersInProgress()) {<a name="line.1421"></a>
-<span class="sourceLineNo">1422</span>        LOG.info("Not running balancer because processing dead regionserver(s): " +<a name="line.1422"></a>
-<span class="sourceLineNo">1423</span>          this.serverManager.getDeadServers());<a name="line.1423"></a>
-<span class="sourceLineNo">1424</span>        return false;<a name="line.1424"></a>
-<span class="sourceLineNo">1425</span>      }<a name="line.1425"></a>
-<span class="sourceLineNo">1426</span><a name="line.1426"></a>
-<span class="sourceLineNo">1427</span>      if (this.cpHost != null) {<a name="line.1427"></a>
-<span class="sourceLineNo">1428</span>        try {<a name="line.1428"></a>
-<span class="sourceLineNo">1429</span>          if (this.cpHost.preBalance()) {<a name="line.1429"></a>
-<span class="sourceLineNo">1430</span>            LOG.debug("Coprocessor bypassing balancer request");<a name="line.1430"></a>
-<span class="sourceLineNo">1431</span>            return false;<a name="line.1431"></a>
-<span class="sourceLineNo">1432</span>          }<a name="line.1432"></a>
-<span class="sourceLineNo">1433</span>        } catch (IOException ioe) {<a name="line.1433"></a>
-<span class="sourceLineNo">1434</span>          LOG.error("Error invoking master coprocessor preBalance()", ioe);<a name="line.1434"></a>
-<span class="sourceLineNo">1435</span>          return false;<a name="line.1435"></a>
-<span class="sourceLineNo">1436</span>        }<a name="line.1436"></a>
-<span class="sourceLineNo">1437</span>      }<a name="line.1437"></a>
-<span class="sourceLineNo">1438</span><a name="line.1438"></a>
-<span class="sourceLineNo">1439</span>      boolean isByTable = getConfiguration().getBoolean("hbase.master.loadbalance.bytable", false);<a name="line.1439"></a>
-<span class="sourceLineNo">1440</span>      Map&lt;TableName, Map&lt;ServerName, List&lt;RegionInfo&gt;&gt;&gt; assignmentsByTable =<a name="line.1440"></a>
-<span class="sourceLineNo">1441</span>        this.assignmentManager.getRegionStates().getAssignmentsByTable(!isByTable);<a name="line.1441"></a>
-<span class="sourceLineNo">1442</span><a name="line.1442"></a>
-<span class="sourceLineNo">1443</span>      List&lt;RegionPlan&gt; plans = new ArrayList&lt;&gt;();<a name="line.1443"></a>
-<span class="sourceLineNo">1444</span><a name="line.1444"></a>
-<span class="sourceLineNo">1445</span>      //Give the balancer the current cluster state.<a name="line.1445"></a>
-<span class="sourceLineNo">1446</span>      this.balancer.setClusterMetrics(getClusterMetricsWithoutCoprocessor());<a name="line.1446"></a>
-<span class="sourceLineNo">1447</span>      this.balancer.setClusterLoad(assignmentsByTable);<a name="line.1447"></a>
-<span class="sourceLineNo">1448</span><a name="line.1448"></a>
-<span class="sourceLineNo">1449</span>      for (Map&lt;ServerName, List&lt;RegionInfo&gt;&gt; serverMap : assignmentsByTable.values()) {<a name="line.1449"></a>
-<span class="sourceLineNo">1450</span>        serverMap.keySet().removeAll(this.serverManager.getDrainingServersList());<a name="line.1450"></a>
-<span class="sourceLineNo">1451</span>      }<a name="line.1451"></a>
-<span class="sourceLineNo">1452</span>      for (Entry&lt;TableName, Map&lt;ServerName, List&lt;RegionInfo&gt;&gt;&gt; e : assignmentsByTable.entrySet()) {<a name="line.1452"></a>
-<span class="sourceLineNo">1453</span>        List&lt;RegionPlan&gt; partialPlans = this.balancer.balanceCluster(e.getKey(), e.getValue());<a name="line.1453"></a>
-<span class="sourceLineNo">1454</span>        if (partialPlans != null) plans.addAll(partialPlans);<a name="line.1454"></a>
-<span class="sourceLineNo">1455</span>      }<a name="line.1455"></a>
-<span class="sourceLineNo">1456</span><a name="line.1456"></a>
-<span class="sourceLineNo">1457</span>      long balanceStartTime = System.currentTimeMillis();<a name="line.1457"></a>
-<span class="sourceLineNo">1458</span>      long cutoffTime = balanceStartTime + this.maxBlancingTime;<a name="line.1458"></a>
-<span class="sourceLineNo">1459</span>      int rpCount = 0;  // number of RegionPlans balanced so far<a name="line.1459"></a>
-<span class="sourceLineNo">1460</span>      if (plans != null &amp;&amp; !plans.isEmpty()) {<a name="line.1460"></a>
-<span class="sourceLineNo">1461</span>        int balanceInterval = this.maxBlancingTime / plans.size();<a name="line.1461"></a>
-<span class="sourceLineNo">1462</span>        LOG.info("Balancer plans size is " + plans.size() + ", the balance interval is "<a name="line.1462"></a>
-<span class="sourceLineNo">1463</span>            + balanceInterval + " ms, and the max number regions in transition is "<a name="line.1463"></a>
-<span class="sourceLineNo">1464</span>            + maxRegionsInTransition);<a name="line.1464"></a>
-<span class="sourceLineNo">1465</span><a name="line.1465"></a>
-<span class="sourceLineNo">1466</span>        for (RegionPlan plan: plans) {<a name="line.1466"></a>
-<span class="sourceLineNo">1467</span>          LOG.info("balance " + plan);<a name="line.1467"></a>
-<span class="sourceLineNo">1468</span>          //TODO: bulk assign<a name="line.1468"></a>
-<span class="sourceLineNo">1469</span>          this.assignmentManager.moveAsync(plan);<a name="line.1469"></a>
-<span class="sourceLineNo">1470</span>          rpCount++;<a name="line.1470"></a>
-<span class="sourceLineNo">1471</span><a name="line.1471"></a>
-<span class="sourceLineNo">1472</span>          balanceThrottling(balanceStartTime + rpCount * balanceInterval, maxRegionsInTransition,<a name="line.1472"></a>
-<span class="sourceLineNo">1473</span>            cutoffTime);<a name="line.1473"></a>
-<span class="sourceLineNo">1474</span><a name="line.1474"></a>
-<span class="sourceLineNo">1475</span>          // if performing next balance exceeds cutoff time, exit the loop<a name="line.1475"></a>
-<span class="sourceLineNo">1476</span>          if (rpCount &lt; plans.size() &amp;&amp; System.currentTimeMillis() &gt; cutoffTime) {<a name="line.1476"></a>
-<span class="sourceLineNo">1477</span>            // TODO: After balance, there should not be a cutoff time (keeping it as<a name="line.1477"></a>
-<span class="sourceLineNo">1478</span>            // a security net for now)<a name="line.1478"></a>
-<span class="sourceLineNo">1479</span>            LOG.debug("No more balancing till next balance run; maxBalanceTime="<a name="line.1479"></a>
-<span class="sourceLineNo">1480</span>                + this.maxBlancingTime);<a name="line.1480"></a>
-<span class="sourceLineNo">1481</span>            break;<a name="line.1481"></a>
-<span class="sourceLineNo">1482</span>          }<a name="line.1482"></a>
-<span class="sourceLineNo">1483</span>        }<a name="line.1483"></a>
-<span class="sourceLineNo">1484</span>      }<a name="line.1484"></a>
+<span class="sourceLineNo">1394</span>  public boolean balance() throws IOException {<a name="line.1394"></a>
+<span class="sourceLineNo">1395</span>    return balance(false);<a name="line.1395"></a>
+<span class="sourceLineNo">1396</span>  }<a name="line.1396"></a>
+<span class="sourceLineNo">1397</span><a name="line.1397"></a>
+<span class="sourceLineNo">1398</span>  public boolean balance(boolean force) throws IOException {<a name="line.1398"></a>
+<span class="sourceLineNo">1399</span>    // if master not initialized, don't run balancer.<a name="line.1399"></a>
+<span class="sourceLineNo">1400</span>    if (!isInitialized()) {<a name="line.1400"></a>
+<span class="sourceLineNo">1401</span>      LOG.debug("Master has not been initialized, don't run balancer.");<a name="line.1401"></a>
+<span class="sourceLineNo">1402</span>      return false;<a name="line.1402"></a>
+<span class="sourceLineNo">1403</span>    }<a name="line.1403"></a>
+<span class="sourceLineNo">1404</span><a name="line.1404"></a>
+<span class="sourceLineNo">1405</span>    if (isInMaintenanceMode()) {<a name="line.1405"></a>
+<span class="sourceLineNo">1406</span>      LOG.info("Master is in maintenanceMode mode, don't run balancer.");<a name="line.1406"></a>
+<span class="sourceLineNo">1407</span>      return false;<a name="line.1407"></a>
+<span class="sourceLineNo">1408</span>    }<a name="line.1408"></a>
+<span class="sourceLineNo">1409</span><a name="line.1409"></a>
+<span class="sourceLineNo">1410</span>    int maxRegionsInTransition = getMaxRegionsInTransition();<a name="line.1410"></a>
+<span class="sourceLineNo">1411</span>    synchronized (this.ba

<TRUNCATED>

[06/29] hbase-site git commit: Published site at 477f9fdb32873387231c5fbbff130ba8bf7b5d68.

Posted by gi...@apache.org.
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/621479e1/devapidocs/src-html/org/apache/hadoop/hbase/master/procedure/TruncateTableProcedure.html
----------------------------------------------------------------------
diff --git a/devapidocs/src-html/org/apache/hadoop/hbase/master/procedure/TruncateTableProcedure.html b/devapidocs/src-html/org/apache/hadoop/hbase/master/procedure/TruncateTableProcedure.html
index 0b21ef4..9b9c612 100644
--- a/devapidocs/src-html/org/apache/hadoop/hbase/master/procedure/TruncateTableProcedure.html
+++ b/devapidocs/src-html/org/apache/hadoop/hbase/master/procedure/TruncateTableProcedure.html
@@ -44,274 +44,285 @@
 <span class="sourceLineNo">036</span>import org.apache.yetus.audience.InterfaceAudience;<a name="line.36"></a>
 <span class="sourceLineNo">037</span>import org.slf4j.Logger;<a name="line.37"></a>
 <span class="sourceLineNo">038</span>import org.slf4j.LoggerFactory;<a name="line.38"></a>
-<span class="sourceLineNo">039</span>import org.apache.hadoop.hbase.shaded.protobuf.ProtobufUtil;<a name="line.39"></a>
-<span class="sourceLineNo">040</span>import org.apache.hadoop.hbase.shaded.protobuf.generated.HBaseProtos;<a name="line.40"></a>
-<span class="sourceLineNo">041</span>import org.apache.hadoop.hbase.shaded.protobuf.generated.MasterProcedureProtos;<a name="line.41"></a>
-<span class="sourceLineNo">042</span>import org.apache.hadoop.hbase.shaded.protobuf.generated.MasterProcedureProtos.TruncateTableState;<a name="line.42"></a>
-<span class="sourceLineNo">043</span><a name="line.43"></a>
-<span class="sourceLineNo">044</span>@InterfaceAudience.Private<a name="line.44"></a>
-<span class="sourceLineNo">045</span>public class TruncateTableProcedure<a name="line.45"></a>
-<span class="sourceLineNo">046</span>    extends AbstractStateMachineTableProcedure&lt;TruncateTableState&gt; {<a name="line.46"></a>
-<span class="sourceLineNo">047</span>  private static final Logger LOG = LoggerFactory.getLogger(TruncateTableProcedure.class);<a name="line.47"></a>
-<span class="sourceLineNo">048</span><a name="line.48"></a>
-<span class="sourceLineNo">049</span>  private boolean preserveSplits;<a name="line.49"></a>
-<span class="sourceLineNo">050</span>  private List&lt;RegionInfo&gt; regions;<a name="line.50"></a>
-<span class="sourceLineNo">051</span>  private TableDescriptor tableDescriptor;<a name="line.51"></a>
-<span class="sourceLineNo">052</span>  private TableName tableName;<a name="line.52"></a>
-<span class="sourceLineNo">053</span><a name="line.53"></a>
-<span class="sourceLineNo">054</span>  public TruncateTableProcedure() {<a name="line.54"></a>
-<span class="sourceLineNo">055</span>    // Required by the Procedure framework to create the procedure on replay<a name="line.55"></a>
-<span class="sourceLineNo">056</span>    super();<a name="line.56"></a>
-<span class="sourceLineNo">057</span>  }<a name="line.57"></a>
-<span class="sourceLineNo">058</span><a name="line.58"></a>
-<span class="sourceLineNo">059</span>  public TruncateTableProcedure(final MasterProcedureEnv env, final TableName tableName,<a name="line.59"></a>
-<span class="sourceLineNo">060</span>      boolean preserveSplits)<a name="line.60"></a>
-<span class="sourceLineNo">061</span>  throws HBaseIOException {<a name="line.61"></a>
-<span class="sourceLineNo">062</span>    this(env, tableName, preserveSplits, null);<a name="line.62"></a>
-<span class="sourceLineNo">063</span>  }<a name="line.63"></a>
-<span class="sourceLineNo">064</span><a name="line.64"></a>
-<span class="sourceLineNo">065</span>  public TruncateTableProcedure(final MasterProcedureEnv env, final TableName tableName,<a name="line.65"></a>
-<span class="sourceLineNo">066</span>      boolean preserveSplits, ProcedurePrepareLatch latch)<a name="line.66"></a>
-<span class="sourceLineNo">067</span>  throws HBaseIOException {<a name="line.67"></a>
-<span class="sourceLineNo">068</span>    super(env, latch);<a name="line.68"></a>
-<span class="sourceLineNo">069</span>    this.tableName = tableName;<a name="line.69"></a>
-<span class="sourceLineNo">070</span>    preflightChecks(env, false);<a name="line.70"></a>
-<span class="sourceLineNo">071</span>    this.preserveSplits = preserveSplits;<a name="line.71"></a>
-<span class="sourceLineNo">072</span>  }<a name="line.72"></a>
-<span class="sourceLineNo">073</span><a name="line.73"></a>
-<span class="sourceLineNo">074</span>  @Override<a name="line.74"></a>
-<span class="sourceLineNo">075</span>  protected Flow executeFromState(final MasterProcedureEnv env, TruncateTableState state)<a name="line.75"></a>
-<span class="sourceLineNo">076</span>      throws InterruptedException {<a name="line.76"></a>
-<span class="sourceLineNo">077</span>    if (LOG.isTraceEnabled()) {<a name="line.77"></a>
-<span class="sourceLineNo">078</span>      LOG.trace(this + " execute state=" + state);<a name="line.78"></a>
-<span class="sourceLineNo">079</span>    }<a name="line.79"></a>
-<span class="sourceLineNo">080</span>    try {<a name="line.80"></a>
-<span class="sourceLineNo">081</span>      switch (state) {<a name="line.81"></a>
-<span class="sourceLineNo">082</span>        case TRUNCATE_TABLE_PRE_OPERATION:<a name="line.82"></a>
-<span class="sourceLineNo">083</span>          // Verify if we can truncate the table<a name="line.83"></a>
-<span class="sourceLineNo">084</span>          if (!prepareTruncate(env)) {<a name="line.84"></a>
-<span class="sourceLineNo">085</span>            assert isFailed() : "the truncate should have an exception here";<a name="line.85"></a>
-<span class="sourceLineNo">086</span>            return Flow.NO_MORE_STATE;<a name="line.86"></a>
-<span class="sourceLineNo">087</span>          }<a name="line.87"></a>
-<span class="sourceLineNo">088</span><a name="line.88"></a>
-<span class="sourceLineNo">089</span>          // TODO: Move out... in the acquireLock()<a name="line.89"></a>
-<span class="sourceLineNo">090</span>          LOG.debug("waiting for '" + getTableName() + "' regions in transition");<a name="line.90"></a>
-<span class="sourceLineNo">091</span>          regions = env.getAssignmentManager().getRegionStates().getRegionsOfTable(getTableName());<a name="line.91"></a>
-<span class="sourceLineNo">092</span>          assert regions != null &amp;&amp; !regions.isEmpty() : "unexpected 0 regions";<a name="line.92"></a>
-<span class="sourceLineNo">093</span>          ProcedureSyncWait.waitRegionInTransition(env, regions);<a name="line.93"></a>
-<span class="sourceLineNo">094</span><a name="line.94"></a>
-<span class="sourceLineNo">095</span>          // Call coprocessors<a name="line.95"></a>
-<span class="sourceLineNo">096</span>          preTruncate(env);<a name="line.96"></a>
-<span class="sourceLineNo">097</span><a name="line.97"></a>
-<span class="sourceLineNo">098</span>          setNextState(TruncateTableState.TRUNCATE_TABLE_REMOVE_FROM_META);<a name="line.98"></a>
-<span class="sourceLineNo">099</span>          break;<a name="line.99"></a>
-<span class="sourceLineNo">100</span>        case TRUNCATE_TABLE_REMOVE_FROM_META:<a name="line.100"></a>
-<span class="sourceLineNo">101</span>          tableDescriptor = env.getMasterServices().getTableDescriptors()<a name="line.101"></a>
-<span class="sourceLineNo">102</span>              .get(tableName);<a name="line.102"></a>
-<span class="sourceLineNo">103</span>          DeleteTableProcedure.deleteFromMeta(env, getTableName(), regions);<a name="line.103"></a>
-<span class="sourceLineNo">104</span>          DeleteTableProcedure.deleteAssignmentState(env, getTableName());<a name="line.104"></a>
-<span class="sourceLineNo">105</span>          setNextState(TruncateTableState.TRUNCATE_TABLE_CLEAR_FS_LAYOUT);<a name="line.105"></a>
-<span class="sourceLineNo">106</span>          break;<a name="line.106"></a>
-<span class="sourceLineNo">107</span>        case TRUNCATE_TABLE_CLEAR_FS_LAYOUT:<a name="line.107"></a>
-<span class="sourceLineNo">108</span>          DeleteTableProcedure.deleteFromFs(env, getTableName(), regions, true);<a name="line.108"></a>
-<span class="sourceLineNo">109</span>          // NOTE: It's very important that we create new HRegions before next state, so that<a name="line.109"></a>
-<span class="sourceLineNo">110</span>          // they get persisted in procedure state before we start using them for anything.<a name="line.110"></a>
-<span class="sourceLineNo">111</span>          // Otherwise, if we create them in next step and master crashes after creating fs<a name="line.111"></a>
-<span class="sourceLineNo">112</span>          // layout but before saving state, region re-created after recovery will have different<a name="line.112"></a>
-<span class="sourceLineNo">113</span>          // regionId(s) and encoded names. That will lead to unwanted regions in FS layout<a name="line.113"></a>
-<span class="sourceLineNo">114</span>          // (which were created before the crash).<a name="line.114"></a>
-<span class="sourceLineNo">115</span>          if (!preserveSplits) {<a name="line.115"></a>
-<span class="sourceLineNo">116</span>            // if we are not preserving splits, generate a new single region<a name="line.116"></a>
-<span class="sourceLineNo">117</span>            regions = Arrays.asList(ModifyRegionUtils.createRegionInfos(tableDescriptor, null));<a name="line.117"></a>
-<span class="sourceLineNo">118</span>          } else {<a name="line.118"></a>
-<span class="sourceLineNo">119</span>            regions = recreateRegionInfo(regions);<a name="line.119"></a>
-<span class="sourceLineNo">120</span>          }<a name="line.120"></a>
-<span class="sourceLineNo">121</span>          setNextState(TruncateTableState.TRUNCATE_TABLE_CREATE_FS_LAYOUT);<a name="line.121"></a>
-<span class="sourceLineNo">122</span>          break;<a name="line.122"></a>
-<span class="sourceLineNo">123</span>        case TRUNCATE_TABLE_CREATE_FS_LAYOUT:<a name="line.123"></a>
-<span class="sourceLineNo">124</span>          regions = CreateTableProcedure.createFsLayout(env, tableDescriptor, regions);<a name="line.124"></a>
-<span class="sourceLineNo">125</span>          CreateTableProcedure.updateTableDescCache(env, getTableName());<a name="line.125"></a>
-<span class="sourceLineNo">126</span>          setNextState(TruncateTableState.TRUNCATE_TABLE_ADD_TO_META);<a name="line.126"></a>
-<span class="sourceLineNo">127</span>          break;<a name="line.127"></a>
-<span class="sourceLineNo">128</span>        case TRUNCATE_TABLE_ADD_TO_META:<a name="line.128"></a>
-<span class="sourceLineNo">129</span>          regions = CreateTableProcedure.addTableToMeta(env, tableDescriptor, regions);<a name="line.129"></a>
-<span class="sourceLineNo">130</span>          setNextState(TruncateTableState.TRUNCATE_TABLE_ASSIGN_REGIONS);<a name="line.130"></a>
-<span class="sourceLineNo">131</span>          break;<a name="line.131"></a>
-<span class="sourceLineNo">132</span>        case TRUNCATE_TABLE_ASSIGN_REGIONS:<a name="line.132"></a>
-<span class="sourceLineNo">133</span>          CreateTableProcedure.setEnablingState(env, getTableName());<a name="line.133"></a>
-<span class="sourceLineNo">134</span>          addChildProcedure(env.getAssignmentManager().createRoundRobinAssignProcedures(regions));<a name="line.134"></a>
-<span class="sourceLineNo">135</span>          setNextState(TruncateTableState.TRUNCATE_TABLE_POST_OPERATION);<a name="line.135"></a>
-<span class="sourceLineNo">136</span>          tableDescriptor = null;<a name="line.136"></a>
-<span class="sourceLineNo">137</span>          regions = null;<a name="line.137"></a>
-<span class="sourceLineNo">138</span>          break;<a name="line.138"></a>
-<span class="sourceLineNo">139</span>        case TRUNCATE_TABLE_POST_OPERATION:<a name="line.139"></a>
-<span class="sourceLineNo">140</span>          CreateTableProcedure.setEnabledState(env, getTableName());<a name="line.140"></a>
-<span class="sourceLineNo">141</span>          postTruncate(env);<a name="line.141"></a>
-<span class="sourceLineNo">142</span>          LOG.debug("truncate '" + getTableName() + "' completed");<a name="line.142"></a>
-<span class="sourceLineNo">143</span>          return Flow.NO_MORE_STATE;<a name="line.143"></a>
-<span class="sourceLineNo">144</span>        default:<a name="line.144"></a>
-<span class="sourceLineNo">145</span>          throw new UnsupportedOperationException("unhandled state=" + state);<a name="line.145"></a>
-<span class="sourceLineNo">146</span>      }<a name="line.146"></a>
-<span class="sourceLineNo">147</span>    } catch (IOException e) {<a name="line.147"></a>
-<span class="sourceLineNo">148</span>      if (isRollbackSupported(state)) {<a name="line.148"></a>
-<span class="sourceLineNo">149</span>        setFailure("master-truncate-table", e);<a name="line.149"></a>
-<span class="sourceLineNo">150</span>      } else {<a name="line.150"></a>
-<span class="sourceLineNo">151</span>        LOG.warn("Retriable error trying to truncate table=" + getTableName() + " state=" + state, e);<a name="line.151"></a>
-<span class="sourceLineNo">152</span>      }<a name="line.152"></a>
-<span class="sourceLineNo">153</span>    }<a name="line.153"></a>
-<span class="sourceLineNo">154</span>    return Flow.HAS_MORE_STATE;<a name="line.154"></a>
-<span class="sourceLineNo">155</span>  }<a name="line.155"></a>
-<span class="sourceLineNo">156</span><a name="line.156"></a>
-<span class="sourceLineNo">157</span>  @Override<a name="line.157"></a>
-<span class="sourceLineNo">158</span>  protected void rollbackState(final MasterProcedureEnv env, final TruncateTableState state) {<a name="line.158"></a>
-<span class="sourceLineNo">159</span>    if (state == TruncateTableState.TRUNCATE_TABLE_PRE_OPERATION) {<a name="line.159"></a>
-<span class="sourceLineNo">160</span>      // nothing to rollback, pre-truncate is just table-state checks.<a name="line.160"></a>
-<span class="sourceLineNo">161</span>      // We can fail if the table does not exist or is not disabled.<a name="line.161"></a>
-<span class="sourceLineNo">162</span>      // TODO: coprocessor rollback semantic is still undefined.<a name="line.162"></a>
-<span class="sourceLineNo">163</span>      return;<a name="line.163"></a>
-<span class="sourceLineNo">164</span>    }<a name="line.164"></a>
-<span class="sourceLineNo">165</span><a name="line.165"></a>
-<span class="sourceLineNo">166</span>    // The truncate doesn't have a rollback. The execution will succeed, at some point.<a name="line.166"></a>
-<span class="sourceLineNo">167</span>    throw new UnsupportedOperationException("unhandled state=" + state);<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 void completionCleanup(final MasterProcedureEnv env) {<a name="line.171"></a>
-<span class="sourceLineNo">172</span>    releaseSyncLatch();<a name="line.172"></a>
-<span class="sourceLineNo">173</span>  }<a name="line.173"></a>
-<span class="sourceLineNo">174</span><a name="line.174"></a>
-<span class="sourceLineNo">175</span>  @Override<a name="line.175"></a>
-<span class="sourceLineNo">176</span>  protected boolean isRollbackSupported(final TruncateTableState state) {<a name="line.176"></a>
-<span class="sourceLineNo">177</span>    switch (state) {<a name="line.177"></a>
-<span class="sourceLineNo">178</span>      case TRUNCATE_TABLE_PRE_OPERATION:<a name="line.178"></a>
-<span class="sourceLineNo">179</span>        return true;<a name="line.179"></a>
-<span class="sourceLineNo">180</span>      default:<a name="line.180"></a>
-<span class="sourceLineNo">181</span>        return false;<a name="line.181"></a>
-<span class="sourceLineNo">182</span>    }<a name="line.182"></a>
-<span class="sourceLineNo">183</span>  }<a name="line.183"></a>
-<span class="sourceLineNo">184</span><a name="line.184"></a>
-<span class="sourceLineNo">185</span>  @Override<a name="line.185"></a>
-<span class="sourceLineNo">186</span>  protected TruncateTableState getState(final int stateId) {<a name="line.186"></a>
-<span class="sourceLineNo">187</span>    return TruncateTableState.valueOf(stateId);<a name="line.187"></a>
-<span class="sourceLineNo">188</span>  }<a name="line.188"></a>
-<span class="sourceLineNo">189</span><a name="line.189"></a>
-<span class="sourceLineNo">190</span>  @Override<a name="line.190"></a>
-<span class="sourceLineNo">191</span>  protected int getStateId(final TruncateTableState state) {<a name="line.191"></a>
-<span class="sourceLineNo">192</span>    return state.getNumber();<a name="line.192"></a>
-<span class="sourceLineNo">193</span>  }<a name="line.193"></a>
-<span class="sourceLineNo">194</span><a name="line.194"></a>
-<span class="sourceLineNo">195</span>  @Override<a name="line.195"></a>
-<span class="sourceLineNo">196</span>  protected TruncateTableState getInitialState() {<a name="line.196"></a>
-<span class="sourceLineNo">197</span>    return TruncateTableState.TRUNCATE_TABLE_PRE_OPERATION;<a name="line.197"></a>
-<span class="sourceLineNo">198</span>  }<a name="line.198"></a>
-<span class="sourceLineNo">199</span><a name="line.199"></a>
-<span class="sourceLineNo">200</span>  @Override<a name="line.200"></a>
-<span class="sourceLineNo">201</span>  public TableName getTableName() {<a name="line.201"></a>
-<span class="sourceLineNo">202</span>    return tableName;<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>  @Override<a name="line.205"></a>
-<span class="sourceLineNo">206</span>  public TableOperationType getTableOperationType() {<a name="line.206"></a>
-<span class="sourceLineNo">207</span>    return TableOperationType.EDIT;<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>  @Override<a name="line.210"></a>
-<span class="sourceLineNo">211</span>  public void toStringClassDetails(StringBuilder sb) {<a name="line.211"></a>
-<span class="sourceLineNo">212</span>    sb.append(getClass().getSimpleName());<a name="line.212"></a>
-<span class="sourceLineNo">213</span>    sb.append(" (table=");<a name="line.213"></a>
-<span class="sourceLineNo">214</span>    sb.append(getTableName());<a name="line.214"></a>
-<span class="sourceLineNo">215</span>    sb.append(" preserveSplits=");<a name="line.215"></a>
-<span class="sourceLineNo">216</span>    sb.append(preserveSplits);<a name="line.216"></a>
-<span class="sourceLineNo">217</span>    sb.append(")");<a name="line.217"></a>
-<span class="sourceLineNo">218</span>  }<a name="line.218"></a>
-<span class="sourceLineNo">219</span><a name="line.219"></a>
-<span class="sourceLineNo">220</span>  @Override<a name="line.220"></a>
-<span class="sourceLineNo">221</span>  protected void serializeStateData(ProcedureStateSerializer serializer)<a name="line.221"></a>
-<span class="sourceLineNo">222</span>      throws IOException {<a name="line.222"></a>
-<span class="sourceLineNo">223</span>    super.serializeStateData(serializer);<a name="line.223"></a>
-<span class="sourceLineNo">224</span><a name="line.224"></a>
-<span class="sourceLineNo">225</span>    MasterProcedureProtos.TruncateTableStateData.Builder state =<a name="line.225"></a>
-<span class="sourceLineNo">226</span>      MasterProcedureProtos.TruncateTableStateData.newBuilder()<a name="line.226"></a>
-<span class="sourceLineNo">227</span>        .setUserInfo(MasterProcedureUtil.toProtoUserInfo(getUser()))<a name="line.227"></a>
-<span class="sourceLineNo">228</span>        .setPreserveSplits(preserveSplits);<a name="line.228"></a>
-<span class="sourceLineNo">229</span>    if (tableDescriptor != null) {<a name="line.229"></a>
-<span class="sourceLineNo">230</span>      state.setTableSchema(ProtobufUtil.toTableSchema(tableDescriptor));<a name="line.230"></a>
-<span class="sourceLineNo">231</span>    } else {<a name="line.231"></a>
-<span class="sourceLineNo">232</span>      state.setTableName(ProtobufUtil.toProtoTableName(tableName));<a name="line.232"></a>
-<span class="sourceLineNo">233</span>    }<a name="line.233"></a>
-<span class="sourceLineNo">234</span>    if (regions != null) {<a name="line.234"></a>
-<span class="sourceLineNo">235</span>      for (RegionInfo hri: regions) {<a name="line.235"></a>
-<span class="sourceLineNo">236</span>        state.addRegionInfo(ProtobufUtil.toRegionInfo(hri));<a name="line.236"></a>
-<span class="sourceLineNo">237</span>      }<a name="line.237"></a>
-<span class="sourceLineNo">238</span>    }<a name="line.238"></a>
-<span class="sourceLineNo">239</span>    serializer.serialize(state.build());<a name="line.239"></a>
-<span class="sourceLineNo">240</span>  }<a name="line.240"></a>
-<span class="sourceLineNo">241</span><a name="line.241"></a>
-<span class="sourceLineNo">242</span>  @Override<a name="line.242"></a>
-<span class="sourceLineNo">243</span>  protected void deserializeStateData(ProcedureStateSerializer serializer)<a name="line.243"></a>
-<span class="sourceLineNo">244</span>      throws IOException {<a name="line.244"></a>
-<span class="sourceLineNo">245</span>    super.deserializeStateData(serializer);<a name="line.245"></a>
-<span class="sourceLineNo">246</span><a name="line.246"></a>
-<span class="sourceLineNo">247</span>    MasterProcedureProtos.TruncateTableStateData state =<a name="line.247"></a>
-<span class="sourceLineNo">248</span>        serializer.deserialize(MasterProcedureProtos.TruncateTableStateData.class);<a name="line.248"></a>
-<span class="sourceLineNo">249</span>    setUser(MasterProcedureUtil.toUserInfo(state.getUserInfo()));<a name="line.249"></a>
-<span class="sourceLineNo">250</span>    if (state.hasTableSchema()) {<a name="line.250"></a>
-<span class="sourceLineNo">251</span>      tableDescriptor = ProtobufUtil.toTableDescriptor(state.getTableSchema());<a name="line.251"></a>
-<span class="sourceLineNo">252</span>      tableName = tableDescriptor.getTableName();<a name="line.252"></a>
-<span class="sourceLineNo">253</span>    } else {<a name="line.253"></a>
-<span class="sourceLineNo">254</span>      tableName = ProtobufUtil.toTableName(state.getTableName());<a name="line.254"></a>
-<span class="sourceLineNo">255</span>    }<a name="line.255"></a>
-<span class="sourceLineNo">256</span>    preserveSplits = state.getPreserveSplits();<a name="line.256"></a>
-<span class="sourceLineNo">257</span>    if (state.getRegionInfoCount() == 0) {<a name="line.257"></a>
-<span class="sourceLineNo">258</span>      regions = null;<a name="line.258"></a>
-<span class="sourceLineNo">259</span>    } else {<a name="line.259"></a>
-<span class="sourceLineNo">260</span>      regions = new ArrayList&lt;&gt;(state.getRegionInfoCount());<a name="line.260"></a>
-<span class="sourceLineNo">261</span>      for (HBaseProtos.RegionInfo hri: state.getRegionInfoList()) {<a name="line.261"></a>
-<span class="sourceLineNo">262</span>        regions.add(ProtobufUtil.toRegionInfo(hri));<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><a name="line.266"></a>
-<span class="sourceLineNo">267</span>  private static List&lt;RegionInfo&gt; recreateRegionInfo(final List&lt;RegionInfo&gt; regions) {<a name="line.267"></a>
-<span class="sourceLineNo">268</span>    ArrayList&lt;RegionInfo&gt; newRegions = new ArrayList&lt;&gt;(regions.size());<a name="line.268"></a>
-<span class="sourceLineNo">269</span>    for (RegionInfo hri: regions) {<a name="line.269"></a>
-<span class="sourceLineNo">270</span>      newRegions.add(RegionInfoBuilder.newBuilder(hri.getTable())<a name="line.270"></a>
-<span class="sourceLineNo">271</span>          .setStartKey(hri.getStartKey())<a name="line.271"></a>
-<span class="sourceLineNo">272</span>          .setEndKey(hri.getEndKey())<a name="line.272"></a>
-<span class="sourceLineNo">273</span>          .build());<a name="line.273"></a>
-<span class="sourceLineNo">274</span>    }<a name="line.274"></a>
-<span class="sourceLineNo">275</span>    return newRegions;<a name="line.275"></a>
-<span class="sourceLineNo">276</span>  }<a name="line.276"></a>
-<span class="sourceLineNo">277</span><a name="line.277"></a>
-<span class="sourceLineNo">278</span>  private boolean prepareTruncate(final MasterProcedureEnv env) throws IOException {<a name="line.278"></a>
-<span class="sourceLineNo">279</span>    try {<a name="line.279"></a>
-<span class="sourceLineNo">280</span>      env.getMasterServices().checkTableModifiable(getTableName());<a name="line.280"></a>
-<span class="sourceLineNo">281</span>    } catch (TableNotFoundException|TableNotDisabledException e) {<a name="line.281"></a>
-<span class="sourceLineNo">282</span>      setFailure("master-truncate-table", e);<a name="line.282"></a>
-<span class="sourceLineNo">283</span>      return false;<a name="line.283"></a>
-<span class="sourceLineNo">284</span>    }<a name="line.284"></a>
-<span class="sourceLineNo">285</span>    return true;<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>  private boolean preTruncate(final MasterProcedureEnv env)<a name="line.288"></a>
-<span class="sourceLineNo">289</span>      throws IOException, InterruptedException {<a name="line.289"></a>
-<span class="sourceLineNo">290</span>    final MasterCoprocessorHost cpHost = env.getMasterCoprocessorHost();<a name="line.290"></a>
-<span class="sourceLineNo">291</span>    if (cpHost != null) {<a name="line.291"></a>
-<span class="sourceLineNo">292</span>      final TableName tableName = getTableName();<a name="line.292"></a>
-<span class="sourceLineNo">293</span>      cpHost.preTruncateTableAction(tableName, getUser());<a name="line.293"></a>
-<span class="sourceLineNo">294</span>    }<a name="line.294"></a>
-<span class="sourceLineNo">295</span>    return true;<a name="line.295"></a>
-<span class="sourceLineNo">296</span>  }<a name="line.296"></a>
-<span class="sourceLineNo">297</span><a name="line.297"></a>
-<span class="sourceLineNo">298</span>  private void postTruncate(final MasterProcedureEnv env)<a name="line.298"></a>
-<span class="sourceLineNo">299</span>      throws IOException, InterruptedException {<a name="line.299"></a>
-<span class="sourceLineNo">300</span>    final MasterCoprocessorHost cpHost = env.getMasterCoprocessorHost();<a name="line.300"></a>
-<span class="sourceLineNo">301</span>    if (cpHost != null) {<a name="line.301"></a>
-<span class="sourceLineNo">302</span>      final TableName tableName = getTableName();<a name="line.302"></a>
-<span class="sourceLineNo">303</span>      cpHost.postCompletedTruncateTableAction(tableName, getUser());<a name="line.303"></a>
-<span class="sourceLineNo">304</span>    }<a name="line.304"></a>
-<span class="sourceLineNo">305</span>  }<a name="line.305"></a>
-<span class="sourceLineNo">306</span>}<a name="line.306"></a>
+<span class="sourceLineNo">039</span>import org.apache.hbase.thirdparty.com.google.common.annotations.VisibleForTesting;<a name="line.39"></a>
+<span class="sourceLineNo">040</span>import org.apache.hadoop.hbase.shaded.protobuf.ProtobufUtil;<a name="line.40"></a>
+<span class="sourceLineNo">041</span>import org.apache.hadoop.hbase.shaded.protobuf.generated.HBaseProtos;<a name="line.41"></a>
+<span class="sourceLineNo">042</span>import org.apache.hadoop.hbase.shaded.protobuf.generated.MasterProcedureProtos;<a name="line.42"></a>
+<span class="sourceLineNo">043</span>import org.apache.hadoop.hbase.shaded.protobuf.generated.MasterProcedureProtos.TruncateTableState;<a name="line.43"></a>
+<span class="sourceLineNo">044</span><a name="line.44"></a>
+<span class="sourceLineNo">045</span>@InterfaceAudience.Private<a name="line.45"></a>
+<span class="sourceLineNo">046</span>public class TruncateTableProcedure<a name="line.46"></a>
+<span class="sourceLineNo">047</span>    extends AbstractStateMachineTableProcedure&lt;TruncateTableState&gt; {<a name="line.47"></a>
+<span class="sourceLineNo">048</span>  private static final Logger LOG = LoggerFactory.getLogger(TruncateTableProcedure.class);<a name="line.48"></a>
+<span class="sourceLineNo">049</span><a name="line.49"></a>
+<span class="sourceLineNo">050</span>  private boolean preserveSplits;<a name="line.50"></a>
+<span class="sourceLineNo">051</span>  private List&lt;RegionInfo&gt; regions;<a name="line.51"></a>
+<span class="sourceLineNo">052</span>  private TableDescriptor tableDescriptor;<a name="line.52"></a>
+<span class="sourceLineNo">053</span>  private TableName tableName;<a name="line.53"></a>
+<span class="sourceLineNo">054</span><a name="line.54"></a>
+<span class="sourceLineNo">055</span>  public TruncateTableProcedure() {<a name="line.55"></a>
+<span class="sourceLineNo">056</span>    // Required by the Procedure framework to create the procedure on replay<a name="line.56"></a>
+<span class="sourceLineNo">057</span>    super();<a name="line.57"></a>
+<span class="sourceLineNo">058</span>  }<a name="line.58"></a>
+<span class="sourceLineNo">059</span><a name="line.59"></a>
+<span class="sourceLineNo">060</span>  public TruncateTableProcedure(final MasterProcedureEnv env, final TableName tableName,<a name="line.60"></a>
+<span class="sourceLineNo">061</span>      boolean preserveSplits)<a name="line.61"></a>
+<span class="sourceLineNo">062</span>  throws HBaseIOException {<a name="line.62"></a>
+<span class="sourceLineNo">063</span>    this(env, tableName, preserveSplits, null);<a name="line.63"></a>
+<span class="sourceLineNo">064</span>  }<a name="line.64"></a>
+<span class="sourceLineNo">065</span><a name="line.65"></a>
+<span class="sourceLineNo">066</span>  public TruncateTableProcedure(final MasterProcedureEnv env, final TableName tableName,<a name="line.66"></a>
+<span class="sourceLineNo">067</span>      boolean preserveSplits, ProcedurePrepareLatch latch)<a name="line.67"></a>
+<span class="sourceLineNo">068</span>  throws HBaseIOException {<a name="line.68"></a>
+<span class="sourceLineNo">069</span>    super(env, latch);<a name="line.69"></a>
+<span class="sourceLineNo">070</span>    this.tableName = tableName;<a name="line.70"></a>
+<span class="sourceLineNo">071</span>    preflightChecks(env, false);<a name="line.71"></a>
+<span class="sourceLineNo">072</span>    this.preserveSplits = preserveSplits;<a name="line.72"></a>
+<span class="sourceLineNo">073</span>  }<a name="line.73"></a>
+<span class="sourceLineNo">074</span><a name="line.74"></a>
+<span class="sourceLineNo">075</span>  @Override<a name="line.75"></a>
+<span class="sourceLineNo">076</span>  protected Flow executeFromState(final MasterProcedureEnv env, TruncateTableState state)<a name="line.76"></a>
+<span class="sourceLineNo">077</span>      throws InterruptedException {<a name="line.77"></a>
+<span class="sourceLineNo">078</span>    if (LOG.isTraceEnabled()) {<a name="line.78"></a>
+<span class="sourceLineNo">079</span>      LOG.trace(this + " execute state=" + state);<a name="line.79"></a>
+<span class="sourceLineNo">080</span>    }<a name="line.80"></a>
+<span class="sourceLineNo">081</span>    try {<a name="line.81"></a>
+<span class="sourceLineNo">082</span>      switch (state) {<a name="line.82"></a>
+<span class="sourceLineNo">083</span>        case TRUNCATE_TABLE_PRE_OPERATION:<a name="line.83"></a>
+<span class="sourceLineNo">084</span>          // Verify if we can truncate the table<a name="line.84"></a>
+<span class="sourceLineNo">085</span>          if (!prepareTruncate(env)) {<a name="line.85"></a>
+<span class="sourceLineNo">086</span>            assert isFailed() : "the truncate should have an exception here";<a name="line.86"></a>
+<span class="sourceLineNo">087</span>            return Flow.NO_MORE_STATE;<a name="line.87"></a>
+<span class="sourceLineNo">088</span>          }<a name="line.88"></a>
+<span class="sourceLineNo">089</span><a name="line.89"></a>
+<span class="sourceLineNo">090</span>          // TODO: Move out... in the acquireLock()<a name="line.90"></a>
+<span class="sourceLineNo">091</span>          LOG.debug("waiting for '" + getTableName() + "' regions in transition");<a name="line.91"></a>
+<span class="sourceLineNo">092</span>          regions = env.getAssignmentManager().getRegionStates().getRegionsOfTable(getTableName());<a name="line.92"></a>
+<span class="sourceLineNo">093</span>          assert regions != null &amp;&amp; !regions.isEmpty() : "unexpected 0 regions";<a name="line.93"></a>
+<span class="sourceLineNo">094</span>          ProcedureSyncWait.waitRegionInTransition(env, regions);<a name="line.94"></a>
+<span class="sourceLineNo">095</span><a name="line.95"></a>
+<span class="sourceLineNo">096</span>          // Call coprocessors<a name="line.96"></a>
+<span class="sourceLineNo">097</span>          preTruncate(env);<a name="line.97"></a>
+<span class="sourceLineNo">098</span><a name="line.98"></a>
+<span class="sourceLineNo">099</span>          setNextState(TruncateTableState.TRUNCATE_TABLE_REMOVE_FROM_META);<a name="line.99"></a>
+<span class="sourceLineNo">100</span>          break;<a name="line.100"></a>
+<span class="sourceLineNo">101</span>        case TRUNCATE_TABLE_REMOVE_FROM_META:<a name="line.101"></a>
+<span class="sourceLineNo">102</span>          tableDescriptor = env.getMasterServices().getTableDescriptors()<a name="line.102"></a>
+<span class="sourceLineNo">103</span>              .get(tableName);<a name="line.103"></a>
+<span class="sourceLineNo">104</span>          DeleteTableProcedure.deleteFromMeta(env, getTableName(), regions);<a name="line.104"></a>
+<span class="sourceLineNo">105</span>          DeleteTableProcedure.deleteAssignmentState(env, getTableName());<a name="line.105"></a>
+<span class="sourceLineNo">106</span>          setNextState(TruncateTableState.TRUNCATE_TABLE_CLEAR_FS_LAYOUT);<a name="line.106"></a>
+<span class="sourceLineNo">107</span>          break;<a name="line.107"></a>
+<span class="sourceLineNo">108</span>        case TRUNCATE_TABLE_CLEAR_FS_LAYOUT:<a name="line.108"></a>
+<span class="sourceLineNo">109</span>          DeleteTableProcedure.deleteFromFs(env, getTableName(), regions, true);<a name="line.109"></a>
+<span class="sourceLineNo">110</span>          // NOTE: It's very important that we create new HRegions before next state, so that<a name="line.110"></a>
+<span class="sourceLineNo">111</span>          // they get persisted in procedure state before we start using them for anything.<a name="line.111"></a>
+<span class="sourceLineNo">112</span>          // Otherwise, if we create them in next step and master crashes after creating fs<a name="line.112"></a>
+<span class="sourceLineNo">113</span>          // layout but before saving state, region re-created after recovery will have different<a name="line.113"></a>
+<span class="sourceLineNo">114</span>          // regionId(s) and encoded names. That will lead to unwanted regions in FS layout<a name="line.114"></a>
+<span class="sourceLineNo">115</span>          // (which were created before the crash).<a name="line.115"></a>
+<span class="sourceLineNo">116</span>          if (!preserveSplits) {<a name="line.116"></a>
+<span class="sourceLineNo">117</span>            // if we are not preserving splits, generate a new single region<a name="line.117"></a>
+<span class="sourceLineNo">118</span>            regions = Arrays.asList(ModifyRegionUtils.createRegionInfos(tableDescriptor, null));<a name="line.118"></a>
+<span class="sourceLineNo">119</span>          } else {<a name="line.119"></a>
+<span class="sourceLineNo">120</span>            regions = recreateRegionInfo(regions);<a name="line.120"></a>
+<span class="sourceLineNo">121</span>          }<a name="line.121"></a>
+<span class="sourceLineNo">122</span>          setNextState(TruncateTableState.TRUNCATE_TABLE_CREATE_FS_LAYOUT);<a name="line.122"></a>
+<span class="sourceLineNo">123</span>          break;<a name="line.123"></a>
+<span class="sourceLineNo">124</span>        case TRUNCATE_TABLE_CREATE_FS_LAYOUT:<a name="line.124"></a>
+<span class="sourceLineNo">125</span>          DeleteTableProcedure.deleteFromFs(env, getTableName(), regions, true);<a name="line.125"></a>
+<span class="sourceLineNo">126</span>          regions = CreateTableProcedure.createFsLayout(env, tableDescriptor, regions);<a name="line.126"></a>
+<span class="sourceLineNo">127</span>          CreateTableProcedure.updateTableDescCache(env, getTableName());<a name="line.127"></a>
+<span class="sourceLineNo">128</span>          setNextState(TruncateTableState.TRUNCATE_TABLE_ADD_TO_META);<a name="line.128"></a>
+<span class="sourceLineNo">129</span>          break;<a name="line.129"></a>
+<span class="sourceLineNo">130</span>        case TRUNCATE_TABLE_ADD_TO_META:<a name="line.130"></a>
+<span class="sourceLineNo">131</span>          regions = CreateTableProcedure.addTableToMeta(env, tableDescriptor, regions);<a name="line.131"></a>
+<span class="sourceLineNo">132</span>          setNextState(TruncateTableState.TRUNCATE_TABLE_ASSIGN_REGIONS);<a name="line.132"></a>
+<span class="sourceLineNo">133</span>          break;<a name="line.133"></a>
+<span class="sourceLineNo">134</span>        case TRUNCATE_TABLE_ASSIGN_REGIONS:<a name="line.134"></a>
+<span class="sourceLineNo">135</span>          CreateTableProcedure.setEnablingState(env, getTableName());<a name="line.135"></a>
+<span class="sourceLineNo">136</span>          addChildProcedure(env.getAssignmentManager().createRoundRobinAssignProcedures(regions));<a name="line.136"></a>
+<span class="sourceLineNo">137</span>          setNextState(TruncateTableState.TRUNCATE_TABLE_POST_OPERATION);<a name="line.137"></a>
+<span class="sourceLineNo">138</span>          tableDescriptor = null;<a name="line.138"></a>
+<span class="sourceLineNo">139</span>          regions = null;<a name="line.139"></a>
+<span class="sourceLineNo">140</span>          break;<a name="line.140"></a>
+<span class="sourceLineNo">141</span>        case TRUNCATE_TABLE_POST_OPERATION:<a name="line.141"></a>
+<span class="sourceLineNo">142</span>          CreateTableProcedure.setEnabledState(env, getTableName());<a name="line.142"></a>
+<span class="sourceLineNo">143</span>          postTruncate(env);<a name="line.143"></a>
+<span class="sourceLineNo">144</span>          LOG.debug("truncate '" + getTableName() + "' completed");<a name="line.144"></a>
+<span class="sourceLineNo">145</span>          return Flow.NO_MORE_STATE;<a name="line.145"></a>
+<span class="sourceLineNo">146</span>        default:<a name="line.146"></a>
+<span class="sourceLineNo">147</span>          throw new UnsupportedOperationException("unhandled state=" + state);<a name="line.147"></a>
+<span class="sourceLineNo">148</span>      }<a name="line.148"></a>
+<span class="sourceLineNo">149</span>    } catch (IOException e) {<a name="line.149"></a>
+<span class="sourceLineNo">150</span>      if (isRollbackSupported(state)) {<a name="line.150"></a>
+<span class="sourceLineNo">151</span>        setFailure("master-truncate-table", e);<a name="line.151"></a>
+<span class="sourceLineNo">152</span>      } else {<a name="line.152"></a>
+<span class="sourceLineNo">153</span>        LOG.warn("Retriable error trying to truncate table=" + getTableName()<a name="line.153"></a>
+<span class="sourceLineNo">154</span>          + " state=" + state, e);<a name="line.154"></a>
+<span class="sourceLineNo">155</span>      }<a name="line.155"></a>
+<span class="sourceLineNo">156</span>    }<a name="line.156"></a>
+<span class="sourceLineNo">157</span>    return Flow.HAS_MORE_STATE;<a name="line.157"></a>
+<span class="sourceLineNo">158</span>  }<a name="line.158"></a>
+<span class="sourceLineNo">159</span><a name="line.159"></a>
+<span class="sourceLineNo">160</span>  @Override<a name="line.160"></a>
+<span class="sourceLineNo">161</span>  protected void rollbackState(final MasterProcedureEnv env, final TruncateTableState state) {<a name="line.161"></a>
+<span class="sourceLineNo">162</span>    if (state == TruncateTableState.TRUNCATE_TABLE_PRE_OPERATION) {<a name="line.162"></a>
+<span class="sourceLineNo">163</span>      // nothing to rollback, pre-truncate is just table-state checks.<a name="line.163"></a>
+<span class="sourceLineNo">164</span>      // We can fail if the table does not exist or is not disabled.<a name="line.164"></a>
+<span class="sourceLineNo">165</span>      // TODO: coprocessor rollback semantic is still undefined.<a name="line.165"></a>
+<span class="sourceLineNo">166</span>      return;<a name="line.166"></a>
+<span class="sourceLineNo">167</span>    }<a name="line.167"></a>
+<span class="sourceLineNo">168</span><a name="line.168"></a>
+<span class="sourceLineNo">169</span>    // The truncate doesn't have a rollback. The execution will succeed, at some point.<a name="line.169"></a>
+<span class="sourceLineNo">170</span>    throw new UnsupportedOperationException("unhandled state=" + state);<a name="line.170"></a>
+<span class="sourceLineNo">171</span>  }<a name="line.171"></a>
+<span class="sourceLineNo">172</span><a name="line.172"></a>
+<span class="sourceLineNo">173</span>  @Override<a name="line.173"></a>
+<span class="sourceLineNo">174</span>  protected void completionCleanup(final MasterProcedureEnv env) {<a name="line.174"></a>
+<span class="sourceLineNo">175</span>    releaseSyncLatch();<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 boolean isRollbackSupported(final TruncateTableState state) {<a name="line.179"></a>
+<span class="sourceLineNo">180</span>    switch (state) {<a name="line.180"></a>
+<span class="sourceLineNo">181</span>      case TRUNCATE_TABLE_PRE_OPERATION:<a name="line.181"></a>
+<span class="sourceLineNo">182</span>        return true;<a name="line.182"></a>
+<span class="sourceLineNo">183</span>      default:<a name="line.183"></a>
+<span class="sourceLineNo">184</span>        return false;<a name="line.184"></a>
+<span class="sourceLineNo">185</span>    }<a name="line.185"></a>
+<span class="sourceLineNo">186</span>  }<a name="line.186"></a>
+<span class="sourceLineNo">187</span><a name="line.187"></a>
+<span class="sourceLineNo">188</span>  @Override<a name="line.188"></a>
+<span class="sourceLineNo">189</span>  protected TruncateTableState getState(final int stateId) {<a name="line.189"></a>
+<span class="sourceLineNo">190</span>    return TruncateTableState.valueOf(stateId);<a name="line.190"></a>
+<span class="sourceLineNo">191</span>  }<a name="line.191"></a>
+<span class="sourceLineNo">192</span><a name="line.192"></a>
+<span class="sourceLineNo">193</span>  @Override<a name="line.193"></a>
+<span class="sourceLineNo">194</span>  protected int getStateId(final TruncateTableState state) {<a name="line.194"></a>
+<span class="sourceLineNo">195</span>    return state.getNumber();<a name="line.195"></a>
+<span class="sourceLineNo">196</span>  }<a name="line.196"></a>
+<span class="sourceLineNo">197</span><a name="line.197"></a>
+<span class="sourceLineNo">198</span>  @Override<a name="line.198"></a>
+<span class="sourceLineNo">199</span>  protected TruncateTableState getInitialState() {<a name="line.199"></a>
+<span class="sourceLineNo">200</span>    return TruncateTableState.TRUNCATE_TABLE_PRE_OPERATION;<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>  @Override<a name="line.203"></a>
+<span class="sourceLineNo">204</span>  public TableName getTableName() {<a name="line.204"></a>
+<span class="sourceLineNo">205</span>    return tableName;<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>  @Override<a name="line.208"></a>
+<span class="sourceLineNo">209</span>  public TableOperationType getTableOperationType() {<a name="line.209"></a>
+<span class="sourceLineNo">210</span>    return TableOperationType.EDIT;<a name="line.210"></a>
+<span class="sourceLineNo">211</span>  }<a name="line.211"></a>
+<span class="sourceLineNo">212</span><a name="line.212"></a>
+<span class="sourceLineNo">213</span>  @Override<a name="line.213"></a>
+<span class="sourceLineNo">214</span>  public void toStringClassDetails(StringBuilder sb) {<a name="line.214"></a>
+<span class="sourceLineNo">215</span>    sb.append(getClass().getSimpleName());<a name="line.215"></a>
+<span class="sourceLineNo">216</span>    sb.append(" (table=");<a name="line.216"></a>
+<span class="sourceLineNo">217</span>    sb.append(getTableName());<a name="line.217"></a>
+<span class="sourceLineNo">218</span>    sb.append(" preserveSplits=");<a name="line.218"></a>
+<span class="sourceLineNo">219</span>    sb.append(preserveSplits);<a name="line.219"></a>
+<span class="sourceLineNo">220</span>    sb.append(")");<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>  @Override<a name="line.223"></a>
+<span class="sourceLineNo">224</span>  protected void serializeStateData(ProcedureStateSerializer serializer)<a name="line.224"></a>
+<span class="sourceLineNo">225</span>      throws IOException {<a name="line.225"></a>
+<span class="sourceLineNo">226</span>    super.serializeStateData(serializer);<a name="line.226"></a>
+<span class="sourceLineNo">227</span><a name="line.227"></a>
+<span class="sourceLineNo">228</span>    MasterProcedureProtos.TruncateTableStateData.Builder state =<a name="line.228"></a>
+<span class="sourceLineNo">229</span>      MasterProcedureProtos.TruncateTableStateData.newBuilder()<a name="line.229"></a>
+<span class="sourceLineNo">230</span>        .setUserInfo(MasterProcedureUtil.toProtoUserInfo(getUser()))<a name="line.230"></a>
+<span class="sourceLineNo">231</span>        .setPreserveSplits(preserveSplits);<a name="line.231"></a>
+<span class="sourceLineNo">232</span>    if (tableDescriptor != null) {<a name="line.232"></a>
+<span class="sourceLineNo">233</span>      state.setTableSchema(ProtobufUtil.toTableSchema(tableDescriptor));<a name="line.233"></a>
+<span class="sourceLineNo">234</span>    } else {<a name="line.234"></a>
+<span class="sourceLineNo">235</span>      state.setTableName(ProtobufUtil.toProtoTableName(tableName));<a name="line.235"></a>
+<span class="sourceLineNo">236</span>    }<a name="line.236"></a>
+<span class="sourceLineNo">237</span>    if (regions != null) {<a name="line.237"></a>
+<span class="sourceLineNo">238</span>      for (RegionInfo hri: regions) {<a name="line.238"></a>
+<span class="sourceLineNo">239</span>        state.addRegionInfo(ProtobufUtil.toRegionInfo(hri));<a name="line.239"></a>
+<span class="sourceLineNo">240</span>      }<a name="line.240"></a>
+<span class="sourceLineNo">241</span>    }<a name="line.241"></a>
+<span class="sourceLineNo">242</span>    serializer.serialize(state.build());<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>  protected void deserializeStateData(ProcedureStateSerializer serializer)<a name="line.246"></a>
+<span class="sourceLineNo">247</span>      throws IOException {<a name="line.247"></a>
+<span class="sourceLineNo">248</span>    super.deserializeStateData(serializer);<a name="line.248"></a>
+<span class="sourceLineNo">249</span><a name="line.249"></a>
+<span class="sourceLineNo">250</span>    MasterProcedureProtos.TruncateTableStateData state =<a name="line.250"></a>
+<span class="sourceLineNo">251</span>        serializer.deserialize(MasterProcedureProtos.TruncateTableStateData.class);<a name="line.251"></a>
+<span class="sourceLineNo">252</span>    setUser(MasterProcedureUtil.toUserInfo(state.getUserInfo()));<a name="line.252"></a>
+<span class="sourceLineNo">253</span>    if (state.hasTableSchema()) {<a name="line.253"></a>
+<span class="sourceLineNo">254</span>      tableDescriptor = ProtobufUtil.toTableDescriptor(state.getTableSchema());<a name="line.254"></a>
+<span class="sourceLineNo">255</span>      tableName = tableDescriptor.getTableName();<a name="line.255"></a>
+<span class="sourceLineNo">256</span>    } else {<a name="line.256"></a>
+<span class="sourceLineNo">257</span>      tableName = ProtobufUtil.toTableName(state.getTableName());<a name="line.257"></a>
+<span class="sourceLineNo">258</span>    }<a name="line.258"></a>
+<span class="sourceLineNo">259</span>    preserveSplits = state.getPreserveSplits();<a name="line.259"></a>
+<span class="sourceLineNo">260</span>    if (state.getRegionInfoCount() == 0) {<a name="line.260"></a>
+<span class="sourceLineNo">261</span>      regions = null;<a name="line.261"></a>
+<span class="sourceLineNo">262</span>    } else {<a name="line.262"></a>
+<span class="sourceLineNo">263</span>      regions = new ArrayList&lt;&gt;(state.getRegionInfoCount());<a name="line.263"></a>
+<span class="sourceLineNo">264</span>      for (HBaseProtos.RegionInfo hri: state.getRegionInfoList()) {<a name="line.264"></a>
+<span class="sourceLineNo">265</span>        regions.add(ProtobufUtil.toRegionInfo(hri));<a name="line.265"></a>
+<span class="sourceLineNo">266</span>      }<a name="line.266"></a>
+<span class="sourceLineNo">267</span>    }<a name="line.267"></a>
+<span class="sourceLineNo">268</span>  }<a name="line.268"></a>
+<span class="sourceLineNo">269</span><a name="line.269"></a>
+<span class="sourceLineNo">270</span>  private static List&lt;RegionInfo&gt; recreateRegionInfo(final List&lt;RegionInfo&gt; regions) {<a name="line.270"></a>
+<span class="sourceLineNo">271</span>    ArrayList&lt;RegionInfo&gt; newRegions = new ArrayList&lt;&gt;(regions.size());<a name="line.271"></a>
+<span class="sourceLineNo">272</span>    for (RegionInfo hri: regions) {<a name="line.272"></a>
+<span class="sourceLineNo">273</span>      newRegions.add(RegionInfoBuilder.newBuilder(hri.getTable())<a name="line.273"></a>
+<span class="sourceLineNo">274</span>          .setStartKey(hri.getStartKey())<a name="line.274"></a>
+<span class="sourceLineNo">275</span>          .setEndKey(hri.getEndKey())<a name="line.275"></a>
+<span class="sourceLineNo">276</span>          .build());<a name="line.276"></a>
+<span class="sourceLineNo">277</span>    }<a name="line.277"></a>
+<span class="sourceLineNo">278</span>    return newRegions;<a name="line.278"></a>
+<span class="sourceLineNo">279</span>  }<a name="line.279"></a>
+<span class="sourceLineNo">280</span><a name="line.280"></a>
+<span class="sourceLineNo">281</span>  private boolean prepareTruncate(final MasterProcedureEnv env) throws IOException {<a name="line.281"></a>
+<span class="sourceLineNo">282</span>    try {<a name="line.282"></a>
+<span class="sourceLineNo">283</span>      env.getMasterServices().checkTableModifiable(getTableName());<a name="line.283"></a>
+<span class="sourceLineNo">284</span>    } catch (TableNotFoundException|TableNotDisabledException e) {<a name="line.284"></a>
+<span class="sourceLineNo">285</span>      setFailure("master-truncate-table", e);<a name="line.285"></a>
+<span class="sourceLineNo">286</span>      return false;<a name="line.286"></a>
+<span class="sourceLineNo">287</span>    }<a name="line.287"></a>
+<span class="sourceLineNo">288</span>    return true;<a name="line.288"></a>
+<span class="sourceLineNo">289</span>  }<a name="line.289"></a>
+<span class="sourceLineNo">290</span><a name="line.290"></a>
+<span class="sourceLineNo">291</span>  private boolean preTruncate(final MasterProcedureEnv env)<a name="line.291"></a>
+<span class="sourceLineNo">292</span>      throws IOException, InterruptedException {<a name="line.292"></a>
+<span class="sourceLineNo">293</span>    final MasterCoprocessorHost cpHost = env.getMasterCoprocessorHost();<a name="line.293"></a>
+<span class="sourceLineNo">294</span>    if (cpHost != null) {<a name="line.294"></a>
+<span class="sourceLineNo">295</span>      final TableName tableName = getTableName();<a name="line.295"></a>
+<span class="sourceLineNo">296</span>      cpHost.preTruncateTableAction(tableName, getUser());<a name="line.296"></a>
+<span class="sourceLineNo">297</span>    }<a name="line.297"></a>
+<span class="sourceLineNo">298</span>    return true;<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>  private void postTruncate(final MasterProcedureEnv env)<a name="line.301"></a>
+<span class="sourceLineNo">302</span>      throws IOException, InterruptedException {<a name="line.302"></a>
+<span class="sourceLineNo">303</span>    final MasterCoprocessorHost cpHost = env.getMasterCoprocessorHost();<a name="line.303"></a>
+<span class="sourceLineNo">304</span>    if (cpHost != null) {<a name="line.304"></a>
+<span class="sourceLineNo">305</span>      final TableName tableName = getTableName();<a name="line.305"></a>
+<span class="sourceLineNo">306</span>      cpHost.postCompletedTruncateTableAction(tableName, getUser());<a name="line.306"></a>
+<span class="sourceLineNo">307</span>    }<a name="line.307"></a>
+<span class="sourceLineNo">308</span>  }<a name="line.308"></a>
+<span class="sourceLineNo">309</span><a name="line.309"></a>
+<span class="sourceLineNo">310</span>  @VisibleForTesting<a name="line.310"></a>
+<span class="sourceLineNo">311</span>  RegionInfo getFirstRegionInfo() {<a name="line.311"></a>
+<span class="sourceLineNo">312</span>    if (regions == null || regions.isEmpty()) {<a name="line.312"></a>
+<span class="sourceLineNo">313</span>      return null;<a name="line.313"></a>
+<span class="sourceLineNo">314</span>    }<a name="line.314"></a>
+<span class="sourceLineNo">315</span>    return regions.get(0);<a name="line.315"></a>
+<span class="sourceLineNo">316</span>  }<a name="line.316"></a>
+<span class="sourceLineNo">317</span>}<a name="line.317"></a>
 
 
 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/621479e1/devapidocs/src-html/org/apache/hadoop/hbase/master/replication/UpdatePeerConfigProcedure.html
----------------------------------------------------------------------
diff --git a/devapidocs/src-html/org/apache/hadoop/hbase/master/replication/UpdatePeerConfigProcedure.html b/devapidocs/src-html/org/apache/hadoop/hbase/master/replication/UpdatePeerConfigProcedure.html
index 191bf86..3ce74a6 100644
--- a/devapidocs/src-html/org/apache/hadoop/hbase/master/replication/UpdatePeerConfigProcedure.html
+++ b/devapidocs/src-html/org/apache/hadoop/hbase/master/replication/UpdatePeerConfigProcedure.html
@@ -217,21 +217,23 @@
 <span class="sourceLineNo">209</span>    if (oldPeerConfig != null) {<a name="line.209"></a>
 <span class="sourceLineNo">210</span>      builder.setOldPeerConfig(ReplicationPeerConfigUtil.convert(oldPeerConfig));<a name="line.210"></a>
 <span class="sourceLineNo">211</span>    }<a name="line.211"></a>
-<span class="sourceLineNo">212</span>    serializer.serialize(builder.build());<a name="line.212"></a>
-<span class="sourceLineNo">213</span>  }<a name="line.213"></a>
-<span class="sourceLineNo">214</span><a name="line.214"></a>
-<span class="sourceLineNo">215</span>  @Override<a name="line.215"></a>
-<span class="sourceLineNo">216</span>  protected void deserializeStateData(ProcedureStateSerializer serializer) throws IOException {<a name="line.216"></a>
-<span class="sourceLineNo">217</span>    super.deserializeStateData(serializer);<a name="line.217"></a>
-<span class="sourceLineNo">218</span>    UpdatePeerConfigStateData data = serializer.deserialize(UpdatePeerConfigStateData.class);<a name="line.218"></a>
-<span class="sourceLineNo">219</span>    peerConfig = ReplicationPeerConfigUtil.convert(data.getPeerConfig());<a name="line.219"></a>
-<span class="sourceLineNo">220</span>    if (data.hasOldPeerConfig()) {<a name="line.220"></a>
-<span class="sourceLineNo">221</span>      oldPeerConfig = ReplicationPeerConfigUtil.convert(data.getOldPeerConfig());<a name="line.221"></a>
-<span class="sourceLineNo">222</span>    } else {<a name="line.222"></a>
-<span class="sourceLineNo">223</span>      oldPeerConfig = null;<a name="line.223"></a>
-<span class="sourceLineNo">224</span>    }<a name="line.224"></a>
-<span class="sourceLineNo">225</span>  }<a name="line.225"></a>
-<span class="sourceLineNo">226</span>}<a name="line.226"></a>
+<span class="sourceLineNo">212</span>    builder.setEnabled(enabled);<a name="line.212"></a>
+<span class="sourceLineNo">213</span>    serializer.serialize(builder.build());<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>  @Override<a name="line.216"></a>
+<span class="sourceLineNo">217</span>  protected void deserializeStateData(ProcedureStateSerializer serializer) throws IOException {<a name="line.217"></a>
+<span class="sourceLineNo">218</span>    super.deserializeStateData(serializer);<a name="line.218"></a>
+<span class="sourceLineNo">219</span>    UpdatePeerConfigStateData data = serializer.deserialize(UpdatePeerConfigStateData.class);<a name="line.219"></a>
+<span class="sourceLineNo">220</span>    peerConfig = ReplicationPeerConfigUtil.convert(data.getPeerConfig());<a name="line.220"></a>
+<span class="sourceLineNo">221</span>    if (data.hasOldPeerConfig()) {<a name="line.221"></a>
+<span class="sourceLineNo">222</span>      oldPeerConfig = ReplicationPeerConfigUtil.convert(data.getOldPeerConfig());<a name="line.222"></a>
+<span class="sourceLineNo">223</span>    } else {<a name="line.223"></a>
+<span class="sourceLineNo">224</span>      oldPeerConfig = null;<a name="line.224"></a>
+<span class="sourceLineNo">225</span>    }<a name="line.225"></a>
+<span class="sourceLineNo">226</span>    enabled = data.getEnabled();<a name="line.226"></a>
+<span class="sourceLineNo">227</span>  }<a name="line.227"></a>
+<span class="sourceLineNo">228</span>}<a name="line.228"></a>
 
 
 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/621479e1/devapidocs/src-html/org/apache/hadoop/hbase/quotas/SpaceQuotaRefresherChore.html
----------------------------------------------------------------------
diff --git a/devapidocs/src-html/org/apache/hadoop/hbase/quotas/SpaceQuotaRefresherChore.html b/devapidocs/src-html/org/apache/hadoop/hbase/quotas/SpaceQuotaRefresherChore.html
index 35e6cce..c06724c 100644
--- a/devapidocs/src-html/org/apache/hadoop/hbase/quotas/SpaceQuotaRefresherChore.html
+++ b/devapidocs/src-html/org/apache/hadoop/hbase/quotas/SpaceQuotaRefresherChore.html
@@ -120,117 +120,128 @@
 <span class="sourceLineNo">112</span>        }<a name="line.112"></a>
 <span class="sourceLineNo">113</span>      }<a name="line.113"></a>
 <span class="sourceLineNo">114</span><a name="line.114"></a>
-<span class="sourceLineNo">115</span>      // We're intentionally ignoring anything extra with the currentSnapshots. If we were missing<a name="line.115"></a>
-<span class="sourceLineNo">116</span>      // information from the RegionServers to create an accurate SpaceQuotaSnapshot in the Master,<a name="line.116"></a>
-<span class="sourceLineNo">117</span>      // the Master will generate a new SpaceQuotaSnapshot which represents this state. This lets<a name="line.117"></a>
-<span class="sourceLineNo">118</span>      // us avoid having to do anything special with currentSnapshots here.<a name="line.118"></a>
-<span class="sourceLineNo">119</span><a name="line.119"></a>
-<span class="sourceLineNo">120</span>      // Update the snapshots in the manager<a name="line.120"></a>
-<span class="sourceLineNo">121</span>      getManager().updateQuotaSnapshot(newSnapshots);<a name="line.121"></a>
-<span class="sourceLineNo">122</span>    } catch (IOException e) {<a name="line.122"></a>
-<span class="sourceLineNo">123</span>      LOG.warn(<a name="line.123"></a>
-<span class="sourceLineNo">124</span>          "Caught exception while refreshing enforced quota violation policies, will retry.", e);<a name="line.124"></a>
-<span class="sourceLineNo">125</span>    }<a name="line.125"></a>
-<span class="sourceLineNo">126</span>  }<a name="line.126"></a>
-<span class="sourceLineNo">127</span><a name="line.127"></a>
-<span class="sourceLineNo">128</span>  /**<a name="line.128"></a>
-<span class="sourceLineNo">129</span>   * Checks if the given &lt;code&gt;snapshot&lt;/code&gt; is in violation, allowing the snapshot to be null.<a name="line.129"></a>
-<span class="sourceLineNo">130</span>   * If the snapshot is null, this is interpreted as no snapshot which implies not in violation.<a name="line.130"></a>
-<span class="sourceLineNo">131</span>   *<a name="line.131"></a>
-<span class="sourceLineNo">132</span>   * @param snapshot The snapshot to operate on.<a name="line.132"></a>
-<span class="sourceLineNo">133</span>   * @return true if the snapshot is in violation, false otherwise.<a name="line.133"></a>
-<span class="sourceLineNo">134</span>   */<a name="line.134"></a>
-<span class="sourceLineNo">135</span>  boolean isInViolation(SpaceQuotaSnapshot snapshot) {<a name="line.135"></a>
-<span class="sourceLineNo">136</span>    if (snapshot == null) {<a name="line.136"></a>
-<span class="sourceLineNo">137</span>      return false;<a name="line.137"></a>
-<span class="sourceLineNo">138</span>    }<a name="line.138"></a>
-<span class="sourceLineNo">139</span>    return snapshot.getQuotaStatus().isInViolation();<a name="line.139"></a>
-<span class="sourceLineNo">140</span>  }<a name="line.140"></a>
-<span class="sourceLineNo">141</span><a name="line.141"></a>
-<span class="sourceLineNo">142</span>  /**<a name="line.142"></a>
-<span class="sourceLineNo">143</span>   * Reads all quota snapshots from the quota table.<a name="line.143"></a>
-<span class="sourceLineNo">144</span>   *<a name="line.144"></a>
-<span class="sourceLineNo">145</span>   * @return The current "view" of space use by each table.<a name="line.145"></a>
-<span class="sourceLineNo">146</span>   */<a name="line.146"></a>
-<span class="sourceLineNo">147</span>  public Map&lt;TableName, SpaceQuotaSnapshot&gt; fetchSnapshotsFromQuotaTable() throws IOException {<a name="line.147"></a>
-<span class="sourceLineNo">148</span>    try (Table quotaTable = getConnection().getTable(QuotaUtil.QUOTA_TABLE_NAME);<a name="line.148"></a>
-<span class="sourceLineNo">149</span>        ResultScanner scanner = quotaTable.getScanner(QuotaTableUtil.makeQuotaSnapshotScan())) {<a name="line.149"></a>
-<span class="sourceLineNo">150</span>      Map&lt;TableName,SpaceQuotaSnapshot&gt; snapshots = new HashMap&lt;&gt;();<a name="line.150"></a>
-<span class="sourceLineNo">151</span>      for (Result result : scanner) {<a name="line.151"></a>
-<span class="sourceLineNo">152</span>        try {<a name="line.152"></a>
-<span class="sourceLineNo">153</span>          extractQuotaSnapshot(result, snapshots);<a name="line.153"></a>
-<span class="sourceLineNo">154</span>        } catch (IllegalArgumentException e) {<a name="line.154"></a>
-<span class="sourceLineNo">155</span>          final String msg = "Failed to parse result for row " + Bytes.toString(result.getRow());<a name="line.155"></a>
-<span class="sourceLineNo">156</span>          LOG.error(msg, e);<a name="line.156"></a>
-<span class="sourceLineNo">157</span>          throw new IOException(msg, e);<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>      return snapshots;<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>  /**<a name="line.164"></a>
-<span class="sourceLineNo">165</span>   * Wrapper around {@link QuotaTableUtil#extractQuotaSnapshot(Result, Map)} for testing.<a name="line.165"></a>
-<span class="sourceLineNo">166</span>   */<a name="line.166"></a>
-<span class="sourceLineNo">167</span>  void extractQuotaSnapshot(Result result, Map&lt;TableName,SpaceQuotaSnapshot&gt; snapshots) {<a name="line.167"></a>
-<span class="sourceLineNo">168</span>    QuotaTableUtil.extractQuotaSnapshot(result, snapshots);<a name="line.168"></a>
-<span class="sourceLineNo">169</span>  }<a name="line.169"></a>
-<span class="sourceLineNo">170</span><a name="line.170"></a>
-<span class="sourceLineNo">171</span>  Connection getConnection() {<a name="line.171"></a>
-<span class="sourceLineNo">172</span>    return conn;<a name="line.172"></a>
+<span class="sourceLineNo">115</span>      // Disable violation policy for all such tables which have been removed in new snapshot<a name="line.115"></a>
+<span class="sourceLineNo">116</span>      for (TableName tableName : currentSnapshots.keySet()) {<a name="line.116"></a>
+<span class="sourceLineNo">117</span>        // check whether table was removed in new snapshot<a name="line.117"></a>
+<span class="sourceLineNo">118</span>        if (!newSnapshots.containsKey(tableName)) {<a name="line.118"></a>
+<span class="sourceLineNo">119</span>          if (LOG.isTraceEnabled()) {<a name="line.119"></a>
+<span class="sourceLineNo">120</span>            LOG.trace("Removing quota violation policy on " + tableName);<a name="line.120"></a>
+<span class="sourceLineNo">121</span>          }<a name="line.121"></a>
+<span class="sourceLineNo">122</span>          getManager().disableViolationPolicyEnforcement(tableName);<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><a name="line.125"></a>
+<span class="sourceLineNo">126</span>      // We're intentionally ignoring anything extra with the currentSnapshots. If we were missing<a name="line.126"></a>
+<span class="sourceLineNo">127</span>      // information from the RegionServers to create an accurate SpaceQuotaSnapshot in the Master,<a name="line.127"></a>
+<span class="sourceLineNo">128</span>      // the Master will generate a new SpaceQuotaSnapshot which represents this state. This lets<a name="line.128"></a>
+<span class="sourceLineNo">129</span>      // us avoid having to do anything special with currentSnapshots here.<a name="line.129"></a>
+<span class="sourceLineNo">130</span><a name="line.130"></a>
+<span class="sourceLineNo">131</span>      // Update the snapshots in the manager<a name="line.131"></a>
+<span class="sourceLineNo">132</span>      getManager().updateQuotaSnapshot(newSnapshots);<a name="line.132"></a>
+<span class="sourceLineNo">133</span>    } catch (IOException e) {<a name="line.133"></a>
+<span class="sourceLineNo">134</span>      LOG.warn(<a name="line.134"></a>
+<span class="sourceLineNo">135</span>          "Caught exception while refreshing enforced quota violation policies, will retry.", e);<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><a name="line.138"></a>
+<span class="sourceLineNo">139</span>  /**<a name="line.139"></a>
+<span class="sourceLineNo">140</span>   * Checks if the given &lt;code&gt;snapshot&lt;/code&gt; is in violation, allowing the snapshot to be null.<a name="line.140"></a>
+<span class="sourceLineNo">141</span>   * If the snapshot is null, this is interpreted as no snapshot which implies not in violation.<a name="line.141"></a>
+<span class="sourceLineNo">142</span>   *<a name="line.142"></a>
+<span class="sourceLineNo">143</span>   * @param snapshot The snapshot to operate on.<a name="line.143"></a>
+<span class="sourceLineNo">144</span>   * @return true if the snapshot is in violation, false otherwise.<a name="line.144"></a>
+<span class="sourceLineNo">145</span>   */<a name="line.145"></a>
+<span class="sourceLineNo">146</span>  boolean isInViolation(SpaceQuotaSnapshot snapshot) {<a name="line.146"></a>
+<span class="sourceLineNo">147</span>    if (snapshot == null) {<a name="line.147"></a>
+<span class="sourceLineNo">148</span>      return false;<a name="line.148"></a>
+<span class="sourceLineNo">149</span>    }<a name="line.149"></a>
+<span class="sourceLineNo">150</span>    return snapshot.getQuotaStatus().isInViolation();<a name="line.150"></a>
+<span class="sourceLineNo">151</span>  }<a name="line.151"></a>
+<span class="sourceLineNo">152</span><a name="line.152"></a>
+<span class="sourceLineNo">153</span>  /**<a name="line.153"></a>
+<span class="sourceLineNo">154</span>   * Reads all quota snapshots from the quota table.<a name="line.154"></a>
+<span class="sourceLineNo">155</span>   *<a name="line.155"></a>
+<span class="sourceLineNo">156</span>   * @return The current "view" of space use by each table.<a name="line.156"></a>
+<span class="sourceLineNo">157</span>   */<a name="line.157"></a>
+<span class="sourceLineNo">158</span>  public Map&lt;TableName, SpaceQuotaSnapshot&gt; fetchSnapshotsFromQuotaTable() throws IOException {<a name="line.158"></a>
+<span class="sourceLineNo">159</span>    try (Table quotaTable = getConnection().getTable(QuotaUtil.QUOTA_TABLE_NAME);<a name="line.159"></a>
+<span class="sourceLineNo">160</span>        ResultScanner scanner = quotaTable.getScanner(QuotaTableUtil.makeQuotaSnapshotScan())) {<a name="line.160"></a>
+<span class="sourceLineNo">161</span>      Map&lt;TableName,SpaceQuotaSnapshot&gt; snapshots = new HashMap&lt;&gt;();<a name="line.161"></a>
+<span class="sourceLineNo">162</span>      for (Result result : scanner) {<a name="line.162"></a>
+<span class="sourceLineNo">163</span>        try {<a name="line.163"></a>
+<span class="sourceLineNo">164</span>          extractQuotaSnapshot(result, snapshots);<a name="line.164"></a>
+<span class="sourceLineNo">165</span>        } catch (IllegalArgumentException e) {<a name="line.165"></a>
+<span class="sourceLineNo">166</span>          final String msg = "Failed to parse result for row " + Bytes.toString(result.getRow());<a name="line.166"></a>
+<span class="sourceLineNo">167</span>          LOG.error(msg, e);<a name="line.167"></a>
+<span class="sourceLineNo">168</span>          throw new IOException(msg, e);<a name="line.168"></a>
+<span class="sourceLineNo">169</span>        }<a name="line.169"></a>
+<span class="sourceLineNo">170</span>      }<a name="line.170"></a>
+<span class="sourceLineNo">171</span>      return snapshots;<a name="line.171"></a>
+<span class="sourceLineNo">172</span>    }<a name="line.172"></a>
 <span class="sourceLineNo">173</span>  }<a name="line.173"></a>
 <span class="sourceLineNo">174</span><a name="line.174"></a>
-<span class="sourceLineNo">175</span>  RegionServerSpaceQuotaManager getManager() {<a name="line.175"></a>
-<span class="sourceLineNo">176</span>    return manager;<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>   * Extracts the period for the chore from the configuration.<a name="line.180"></a>
-<span class="sourceLineNo">181</span>   *<a name="line.181"></a>
-<span class="sourceLineNo">182</span>   * @param conf The configuration object.<a name="line.182"></a>
-<span class="sourceLineNo">183</span>   * @return The configured chore period or the default value.<a name="line.183"></a>
-<span class="sourceLineNo">184</span>   */<a name="line.184"></a>
-<span class="sourceLineNo">185</span>  static int getPeriod(Configuration conf) {<a name="line.185"></a>
-<span class="sourceLineNo">186</span>    return conf.getInt(POLICY_REFRESHER_CHORE_PERIOD_KEY,<a name="line.186"></a>
-<span class="sourceLineNo">187</span>        POLICY_REFRESHER_CHORE_PERIOD_DEFAULT);<a name="line.187"></a>
+<span class="sourceLineNo">175</span>  /**<a name="line.175"></a>
+<span class="sourceLineNo">176</span>   * Wrapper around {@link QuotaTableUtil#extractQuotaSnapshot(Result, Map)} for testing.<a name="line.176"></a>
+<span class="sourceLineNo">177</span>   */<a name="line.177"></a>
+<span class="sourceLineNo">178</span>  void extractQuotaSnapshot(Result result, Map&lt;TableName,SpaceQuotaSnapshot&gt; snapshots) {<a name="line.178"></a>
+<span class="sourceLineNo">179</span>    QuotaTableUtil.extractQuotaSnapshot(result, snapshots);<a name="line.179"></a>
+<span class="sourceLineNo">180</span>  }<a name="line.180"></a>
+<span class="sourceLineNo">181</span><a name="line.181"></a>
+<span class="sourceLineNo">182</span>  Connection getConnection() {<a name="line.182"></a>
+<span class="sourceLineNo">183</span>    return conn;<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>  RegionServerSpaceQuotaManager getManager() {<a name="line.186"></a>
+<span class="sourceLineNo">187</span>    return manager;<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">191</span>   * Extracts the initial delay for the chore from the configuration.<a name="line.191"></a>
+<span class="sourceLineNo">191</span>   * Extracts the period for the chore from the configuration.<a name="line.191"></a>
 <span class="sourceLineNo">192</span>   *<a name="line.192"></a>
 <span class="sourceLineNo">193</span>   * @param conf The configuration object.<a name="line.193"></a>
-<span class="sourceLineNo">194</span>   * @return The configured chore initial delay or the default value.<a name="line.194"></a>
+<span class="sourceLineNo">194</span>   * @return The configured chore period or the default value.<a name="line.194"></a>
 <span class="sourceLineNo">195</span>   */<a name="line.195"></a>
-<span class="sourceLineNo">196</span>  static long getInitialDelay(Configuration conf) {<a name="line.196"></a>
-<span class="sourceLineNo">197</span>    return conf.getLong(POLICY_REFRESHER_CHORE_DELAY_KEY,<a name="line.197"></a>
-<span class="sourceLineNo">198</span>        POLICY_REFRESHER_CHORE_DELAY_DEFAULT);<a name="line.198"></a>
+<span class="sourceLineNo">196</span>  static int getPeriod(Configuration conf) {<a name="line.196"></a>
+<span class="sourceLineNo">197</span>    return conf.getInt(POLICY_REFRESHER_CHORE_PERIOD_KEY,<a name="line.197"></a>
+<span class="sourceLineNo">198</span>        POLICY_REFRESHER_CHORE_PERIOD_DEFAULT);<a name="line.198"></a>
 <span class="sourceLineNo">199</span>  }<a name="line.199"></a>
 <span class="sourceLineNo">200</span><a name="line.200"></a>
 <span class="sourceLineNo">201</span>  /**<a name="line.201"></a>
-<span class="sourceLineNo">202</span>   * Extracts the time unit for the chore period and initial delay from the configuration. The<a name="line.202"></a>
-<span class="sourceLineNo">203</span>   * configuration value for {@link #POLICY_REFRESHER_CHORE_TIMEUNIT_KEY} must correspond to<a name="line.203"></a>
-<span class="sourceLineNo">204</span>   * a {@link TimeUnit} value.<a name="line.204"></a>
-<span class="sourceLineNo">205</span>   *<a name="line.205"></a>
-<span class="sourceLineNo">206</span>   * @param conf The configuration object.<a name="line.206"></a>
-<span class="sourceLineNo">207</span>   * @return The configured time unit for the chore period and initial delay or the default value.<a name="line.207"></a>
-<span class="sourceLineNo">208</span>   */<a name="line.208"></a>
-<span class="sourceLineNo">209</span>  static TimeUnit getTimeUnit(Configuration conf) {<a name="line.209"></a>
-<span class="sourceLineNo">210</span>    return TimeUnit.valueOf(conf.get(POLICY_REFRESHER_CHORE_TIMEUNIT_KEY,<a name="line.210"></a>
-<span class="sourceLineNo">211</span>        POLICY_REFRESHER_CHORE_TIMEUNIT_DEFAULT));<a name="line.211"></a>
-<span class="sourceLineNo">212</span>  }<a name="line.212"></a>
-<span class="sourceLineNo">213</span><a name="line.213"></a>
-<span class="sourceLineNo">214</span>  /**<a name="line.214"></a>
-<span class="sourceLineNo">215</span>   * Extracts the percent of Regions for a table to have been reported to enable quota violation<a name="line.215"></a>
-<span class="sourceLineNo">216</span>   * state change.<a name="line.216"></a>
-<span class="sourceLineNo">217</span>   *<a name="line.217"></a>
-<span class="sourceLineNo">218</span>   * @param conf The configuration object.<a name="line.218"></a>
-<span class="sourceLineNo">219</span>   * @return The percent of regions reported to use.<a name="line.219"></a>
-<span class="sourceLineNo">220</span>   */<a name="line.220"></a>
-<span class="sourceLineNo">221</span>  static Double getRegionReportPercent(Configuration conf) {<a name="line.221"></a>
-<span class="sourceLineNo">222</span>    return conf.getDouble(POLICY_REFRESHER_CHORE_REPORT_PERCENT_KEY,<a name="line.222"></a>
-<span class="sourceLineNo">223</span>        POLICY_REFRESHER_CHORE_REPORT_PERCENT_DEFAULT);<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">202</span>   * Extracts the initial delay for the chore from the configuration.<a name="line.202"></a>
+<span class="sourceLineNo">203</span>   *<a name="line.203"></a>
+<span class="sourceLineNo">204</span>   * @param conf The configuration object.<a name="line.204"></a>
+<span class="sourceLineNo">205</span>   * @return The configured chore initial delay or the default value.<a name="line.205"></a>
+<span class="sourceLineNo">206</span>   */<a name="line.206"></a>
+<span class="sourceLineNo">207</span>  static long getInitialDelay(Configuration conf) {<a name="line.207"></a>
+<span class="sourceLineNo">208</span>    return conf.getLong(POLICY_REFRESHER_CHORE_DELAY_KEY,<a name="line.208"></a>
+<span class="sourceLineNo">209</span>        POLICY_REFRESHER_CHORE_DELAY_DEFAULT);<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>  /**<a name="line.212"></a>
+<span class="sourceLineNo">213</span>   * Extracts the time unit for the chore period and initial delay from the configuration. The<a name="line.213"></a>
+<span class="sourceLineNo">214</span>   * configuration value for {@link #POLICY_REFRESHER_CHORE_TIMEUNIT_KEY} must correspond to<a name="line.214"></a>
+<span class="sourceLineNo">215</span>   * a {@link TimeUnit} value.<a name="line.215"></a>
+<span class="sourceLineNo">216</span>   *<a name="line.216"></a>
+<span class="sourceLineNo">217</span>   * @param conf The configuration object.<a name="line.217"></a>
+<span class="sourceLineNo">218</span>   * @return The configured time unit for the chore period and initial delay or the default value.<a name="line.218"></a>
+<span class="sourceLineNo">219</span>   */<a name="line.219"></a>
+<span class="sourceLineNo">220</span>  static TimeUnit getTimeUnit(Configuration conf) {<a name="line.220"></a>
+<span class="sourceLineNo">221</span>    return TimeUnit.valueOf(conf.get(POLICY_REFRESHER_CHORE_TIMEUNIT_KEY,<a name="line.221"></a>
+<span class="sourceLineNo">222</span>        POLICY_REFRESHER_CHORE_TIMEUNIT_DEFAULT));<a name="line.222"></a>
+<span class="sourceLineNo">223</span>  }<a name="line.223"></a>
+<span class="sourceLineNo">224</span><a name="line.224"></a>
+<span class="sourceLineNo">225</span>  /**<a name="line.225"></a>
+<span class="sourceLineNo">226</span>   * Extracts the percent of Regions for a table to have been reported to enable quota violation<a name="line.226"></a>
+<span class="sourceLineNo">227</span>   * state change.<a name="line.227"></a>
+<span class="sourceLineNo">228</span>   *<a name="line.228"></a>
+<span class="sourceLineNo">229</span>   * @param conf The configuration object.<a name="line.229"></a>
+<span class="sourceLineNo">230</span>   * @return The percent of regions reported to use.<a name="line.230"></a>
+<span class="sourceLineNo">231</span>   */<a name="line.231"></a>
+<span class="sourceLineNo">232</span>  static Double getRegionReportPercent(Configuration conf) {<a name="line.232"></a>
+<span class="sourceLineNo">233</span>    return conf.getDouble(POLICY_REFRESHER_CHORE_REPORT_PERCENT_KEY,<a name="line.233"></a>
+<span class="sourceLineNo">234</span>        POLICY_REFRESHER_CHORE_REPORT_PERCENT_DEFAULT);<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>
 
 
 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/621479e1/devapidocs/src-html/org/apache/hadoop/hbase/rsgroup/RSGroupBasedLoadBalancer.html
----------------------------------------------------------------------
diff --git a/devapidocs/src-html/org/apache/hadoop/hbase/rsgroup/RSGroupBasedLoadBalancer.html b/devapidocs/src-html/org/apache/hadoop/hbase/rsgroup/RSGroupBasedLoadBalancer.html
index 5aa1703..478b4f2 100644
--- a/devapidocs/src-html/org/apache/hadoop/hbase/rsgroup/RSGroupBasedLoadBalancer.html
+++ b/devapidocs/src-html/org/apache/hadoop/hbase/rsgroup/RSGroupBasedLoadBalancer.html
@@ -474,7 +474,12 @@
 <span class="sourceLineNo">466</span>  public void setRsGroupInfoManager(RSGroupInfoManager rsGroupInfoManager) {<a name="line.466"></a>
 <span class="sourceLineNo">467</span>    this.rsGroupInfoManager = rsGroupInfoManager;<a name="line.467"></a>
 <span class="sourceLineNo">468</span>  }<a name="line.468"></a>
-<span class="sourceLineNo">469</span>}<a name="line.469"></a>
+<span class="sourceLineNo">469</span><a name="line.469"></a>
+<span class="sourceLineNo">470</span>  @Override<a name="line.470"></a>
+<span class="sourceLineNo">471</span>  public void postMasterStartupInitialize() {<a name="line.471"></a>
+<span class="sourceLineNo">472</span>    this.internalBalancer.postMasterStartupInitialize();<a name="line.472"></a>
+<span class="sourceLineNo">473</span>  }<a name="line.473"></a>
+<span class="sourceLineNo">474</span>}<a name="line.474"></a>
 
 
 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/621479e1/downloads.html
----------------------------------------------------------------------
diff --git a/downloads.html b/downloads.html
index bbe098a..ba31f01 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="20180524" />
+    <meta name="Date-Revision-yyyymmdd" content="20180525" />
     <meta http-equiv="Content-Language" content="en" />
     <title>Apache HBase &#x2013; Apache HBase Downloads</title>
     <link rel="stylesheet" href="./css/apache-maven-fluido-1.5-HBASE.min.css" />
@@ -366,7 +366,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-05-24</li>
+                  <li id="publishDate" class="pull-right">Last Published: 2018-05-25</li>
             </p>
                 </div>
 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/621479e1/export_control.html
----------------------------------------------------------------------
diff --git a/export_control.html b/export_control.html
index f197366..1760a46 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="20180524" />
+    <meta name="Date-Revision-yyyymmdd" content="20180525" />
     <meta http-equiv="Content-Language" content="en" />
     <title>Apache HBase &#x2013; 
       Export Control
@@ -331,7 +331,7 @@ for more details.</p>
                         <a href="https://www.apache.org/">The Apache Software Foundation</a>.
             All rights reserved.      
                     
-                  <li id="publishDate" class="pull-right">Last Published: 2018-05-24</li>
+                  <li id="publishDate" class="pull-right">Last Published: 2018-05-25</li>
             </p>
                 </div>
 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/621479e1/index.html
----------------------------------------------------------------------
diff --git a/index.html b/index.html
index 5074c1c..60635d0 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="20180524" />
+    <meta name="Date-Revision-yyyymmdd" content="20180525" />
     <meta http-equiv="Content-Language" content="en" />
     <title>Apache HBase &#x2013; Apache HBaseâ„¢ Home</title>
     <link rel="stylesheet" href="./css/apache-maven-fluido-1.5-HBASE.min.css" />
@@ -411,7 +411,7 @@ Apache HBase is an open-source, distributed, versioned, non-relational database
                         <a href="https://www.apache.org/">The Apache Software Foundation</a>.
             All rights reserved.      
                     
-                  <li id="publishDate" class="pull-right">Last Published: 2018-05-24</li>
+                  <li id="publishDate" class="pull-right">Last Published: 2018-05-25</li>
             </p>
                 </div>
 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/621479e1/integration.html
----------------------------------------------------------------------
diff --git a/integration.html b/integration.html
index 460f98e..ae4554c 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="20180524" />
+    <meta name="Date-Revision-yyyymmdd" content="20180525" />
     <meta http-equiv="Content-Language" content="en" />
     <title>Apache HBase &#x2013; CI Management</title>
     <link rel="stylesheet" href="./css/apache-maven-fluido-1.5-HBASE.min.css" />
@@ -291,7 +291,7 @@
                         <a href="https://www.apache.org/">The Apache Software Foundation</a>.
             All rights reserved.      
                     
-                  <li id="publishDate" class="pull-right">Last Published: 2018-05-24</li>
+                  <li id="publishDate" class="pull-right">Last Published: 2018-05-25</li>
             </p>
                 </div>
 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/621479e1/issue-tracking.html
----------------------------------------------------------------------
diff --git a/issue-tracking.html b/issue-tracking.html
index 1ff2dbf..6dcf5ae 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="20180524" />
+    <meta name="Date-Revision-yyyymmdd" content="20180525" />
     <meta http-equiv="Content-Language" content="en" />
     <title>Apache HBase &#x2013; Issue Management</title>
     <link rel="stylesheet" href="./css/apache-maven-fluido-1.5-HBASE.min.css" />
@@ -288,7 +288,7 @@
                         <a href="https://www.apache.org/">The Apache Software Foundation</a>.
             All rights reserved.      
                     
-                  <li id="publishDate" class="pull-right">Last Published: 2018-05-24</li>
+                  <li id="publishDate" class="pull-right">Last Published: 2018-05-25</li>
             </p>
                 </div>
 


[09/29] hbase-site git commit: Published site at 477f9fdb32873387231c5fbbff130ba8bf7b5d68.

Posted by gi...@apache.org.
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/621479e1/devapidocs/src-html/org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.Cluster.html
----------------------------------------------------------------------
diff --git a/devapidocs/src-html/org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.Cluster.html b/devapidocs/src-html/org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.Cluster.html
index 7f42212..d4bf03c 100644
--- a/devapidocs/src-html/org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.Cluster.html
+++ b/devapidocs/src-html/org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.Cluster.html
@@ -1159,434 +1159,442 @@
 <span class="sourceLineNo">1151</span>    }<a name="line.1151"></a>
 <span class="sourceLineNo">1152</span>  }<a name="line.1152"></a>
 <span class="sourceLineNo">1153</span><a name="line.1153"></a>
-<span class="sourceLineNo">1154</span>  public void setRackManager(RackManager rackManager) {<a name="line.1154"></a>
-<span class="sourceLineNo">1155</span>    this.rackManager = rackManager;<a name="line.1155"></a>
-<span class="sourceLineNo">1156</span>  }<a name="line.1156"></a>
-<span class="sourceLineNo">1157</span><a name="line.1157"></a>
-<span class="sourceLineNo">1158</span>  protected boolean needsBalance(Cluster c) {<a name="line.1158"></a>
-<span class="sourceLineNo">1159</span>    ClusterLoadState cs = new ClusterLoadState(c.clusterState);<a name="line.1159"></a>
-<span class="sourceLineNo">1160</span>    if (cs.getNumServers() &lt; MIN_SERVER_BALANCE) {<a name="line.1160"></a>
-<span class="sourceLineNo">1161</span>      if (LOG.isDebugEnabled()) {<a name="line.1161"></a>
-<span class="sourceLineNo">1162</span>        LOG.debug("Not running balancer because only " + cs.getNumServers()<a name="line.1162"></a>
-<span class="sourceLineNo">1163</span>            + " active regionserver(s)");<a name="line.1163"></a>
-<span class="sourceLineNo">1164</span>      }<a name="line.1164"></a>
-<span class="sourceLineNo">1165</span>      return false;<a name="line.1165"></a>
-<span class="sourceLineNo">1166</span>    }<a name="line.1166"></a>
-<span class="sourceLineNo">1167</span>    if(areSomeRegionReplicasColocated(c)) return true;<a name="line.1167"></a>
-<span class="sourceLineNo">1168</span>    // Check if we even need to do any load balancing<a name="line.1168"></a>
-<span class="sourceLineNo">1169</span>    // HBASE-3681 check sloppiness first<a name="line.1169"></a>
-<span class="sourceLineNo">1170</span>    float average = cs.getLoadAverage(); // for logging<a name="line.1170"></a>
-<span class="sourceLineNo">1171</span>    int floor = (int) Math.floor(average * (1 - slop));<a name="line.1171"></a>
-<span class="sourceLineNo">1172</span>    int ceiling = (int) Math.ceil(average * (1 + slop));<a name="line.1172"></a>
-<span class="sourceLineNo">1173</span>    if (!(cs.getMaxLoad() &gt; ceiling || cs.getMinLoad() &lt; floor)) {<a name="line.1173"></a>
-<span class="sourceLineNo">1174</span>      NavigableMap&lt;ServerAndLoad, List&lt;RegionInfo&gt;&gt; serversByLoad = cs.getServersByLoad();<a name="line.1174"></a>
-<span class="sourceLineNo">1175</span>      if (LOG.isTraceEnabled()) {<a name="line.1175"></a>
-<span class="sourceLineNo">1176</span>        // If nothing to balance, then don't say anything unless trace-level logging.<a name="line.1176"></a>
-<span class="sourceLineNo">1177</span>        LOG.trace("Skipping load balancing because balanced cluster; " +<a name="line.1177"></a>
-<span class="sourceLineNo">1178</span>          "servers=" + cs.getNumServers() +<a name="line.1178"></a>
-<span class="sourceLineNo">1179</span>          " regions=" + cs.getNumRegions() + " average=" + average +<a name="line.1179"></a>
-<span class="sourceLineNo">1180</span>          " mostloaded=" + serversByLoad.lastKey().getLoad() +<a name="line.1180"></a>
-<span class="sourceLineNo">1181</span>          " leastloaded=" + serversByLoad.firstKey().getLoad());<a name="line.1181"></a>
-<span class="sourceLineNo">1182</span>      }<a name="line.1182"></a>
-<span class="sourceLineNo">1183</span>      return false;<a name="line.1183"></a>
-<span class="sourceLineNo">1184</span>    }<a name="line.1184"></a>
-<span class="sourceLineNo">1185</span>    return true;<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>   * Subclasses should implement this to return true if the cluster has nodes that hosts<a name="line.1189"></a>
-<span class="sourceLineNo">1190</span>   * multiple replicas for the same region, or, if there are multiple racks and the same<a name="line.1190"></a>
-<span class="sourceLineNo">1191</span>   * rack hosts replicas of the same region<a name="line.1191"></a>
-<span class="sourceLineNo">1192</span>   * @param c Cluster information<a name="line.1192"></a>
-<span class="sourceLineNo">1193</span>   * @return whether region replicas are currently co-located<a name="line.1193"></a>
-<span class="sourceLineNo">1194</span>   */<a name="line.1194"></a>
-<span class="sourceLineNo">1195</span>  protected boolean areSomeRegionReplicasColocated(Cluster c) {<a name="line.1195"></a>
-<span class="sourceLineNo">1196</span>    return false;<a name="line.1196"></a>
-<span class="sourceLineNo">1197</span>  }<a name="line.1197"></a>
-<span class="sourceLineNo">1198</span><a name="line.1198"></a>
-<span class="sourceLineNo">1199</span>  /**<a name="line.1199"></a>
-<span class="sourceLineNo">1200</span>   * Generates a bulk assignment plan to be used on cluster startup using a<a name="line.1200"></a>
-<span class="sourceLineNo">1201</span>   * simple round-robin assignment.<a name="line.1201"></a>
-<span class="sourceLineNo">1202</span>   * &lt;p&gt;<a name="line.1202"></a>
-<span class="sourceLineNo">1203</span>   * Takes a list of all the regions and all the servers in the cluster and<a name="line.1203"></a>
-<span class="sourceLineNo">1204</span>   * returns a map of each server to the regions that it should be assigned.<a name="line.1204"></a>
-<span class="sourceLineNo">1205</span>   * &lt;p&gt;<a name="line.1205"></a>
-<span class="sourceLineNo">1206</span>   * Currently implemented as a round-robin assignment. Same invariant as load<a name="line.1206"></a>
-<span class="sourceLineNo">1207</span>   * balancing, all servers holding floor(avg) or ceiling(avg).<a name="line.1207"></a>
-<span class="sourceLineNo">1208</span>   *<a name="line.1208"></a>
-<span class="sourceLineNo">1209</span>   * TODO: Use block locations from HDFS to place regions with their blocks<a name="line.1209"></a>
-<span class="sourceLineNo">1210</span>   *<a name="line.1210"></a>
-<span class="sourceLineNo">1211</span>   * @param regions all regions<a name="line.1211"></a>
-<span class="sourceLineNo">1212</span>   * @param servers all servers<a name="line.1212"></a>
-<span class="sourceLineNo">1213</span>   * @return map of server to the regions it should take, or null if no<a name="line.1213"></a>
-<span class="sourceLineNo">1214</span>   *         assignment is possible (ie. no regions or no servers)<a name="line.1214"></a>
-<span class="sourceLineNo">1215</span>   */<a name="line.1215"></a>
-<span class="sourceLineNo">1216</span>  @Override<a name="line.1216"></a>
-<span class="sourceLineNo">1217</span>  public Map&lt;ServerName, List&lt;RegionInfo&gt;&gt; roundRobinAssignment(List&lt;RegionInfo&gt; regions,<a name="line.1217"></a>
-<span class="sourceLineNo">1218</span>      List&lt;ServerName&gt; servers) throws HBaseIOException {<a name="line.1218"></a>
-<span class="sourceLineNo">1219</span>    metricsBalancer.incrMiscInvocations();<a name="line.1219"></a>
-<span class="sourceLineNo">1220</span>    Map&lt;ServerName, List&lt;RegionInfo&gt;&gt; assignments = assignMasterSystemRegions(regions, servers);<a name="line.1220"></a>
-<span class="sourceLineNo">1221</span>    if (assignments != null &amp;&amp; !assignments.isEmpty()) {<a name="line.1221"></a>
-<span class="sourceLineNo">1222</span>      servers = new ArrayList&lt;&gt;(servers);<a name="line.1222"></a>
-<span class="sourceLineNo">1223</span>      // Guarantee not to put other regions on master<a name="line.1223"></a>
-<span class="sourceLineNo">1224</span>      servers.remove(masterServerName);<a name="line.1224"></a>
-<span class="sourceLineNo">1225</span>      List&lt;RegionInfo&gt; masterRegions = assignments.get(masterServerName);<a name="line.1225"></a>
-<span class="sourceLineNo">1226</span>      if (!masterRegions.isEmpty()) {<a name="line.1226"></a>
-<span class="sourceLineNo">1227</span>        regions = new ArrayList&lt;&gt;(regions);<a name="line.1227"></a>
-<span class="sourceLineNo">1228</span>        regions.removeAll(masterRegions);<a name="line.1228"></a>
-<span class="sourceLineNo">1229</span>      }<a name="line.1229"></a>
-<span class="sourceLineNo">1230</span>    }<a name="line.1230"></a>
-<span class="sourceLineNo">1231</span>    if (regions == null || regions.isEmpty()) {<a name="line.1231"></a>
-<span class="sourceLineNo">1232</span>      return assignments;<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>    int numServers = servers == null ? 0 : servers.size();<a name="line.1235"></a>
-<span class="sourceLineNo">1236</span>    if (numServers == 0) {<a name="line.1236"></a>
-<span class="sourceLineNo">1237</span>      LOG.warn("Wanted to do round robin assignment but no servers to assign to");<a name="line.1237"></a>
-<span class="sourceLineNo">1238</span>      return null;<a name="line.1238"></a>
-<span class="sourceLineNo">1239</span>    }<a name="line.1239"></a>
-<span class="sourceLineNo">1240</span><a name="line.1240"></a>
-<span class="sourceLineNo">1241</span>    // TODO: instead of retainAssignment() and roundRobinAssignment(), we should just run the<a name="line.1241"></a>
-<span class="sourceLineNo">1242</span>    // normal LB.balancerCluster() with unassignedRegions. We only need to have a candidate<a name="line.1242"></a>
-<span class="sourceLineNo">1243</span>    // generator for AssignRegionAction. The LB will ensure the regions are mostly local<a name="line.1243"></a>
-<span class="sourceLineNo">1244</span>    // and balanced. This should also run fast with fewer number of iterations.<a name="line.1244"></a>
-<span class="sourceLineNo">1245</span><a name="line.1245"></a>
-<span class="sourceLineNo">1246</span>    if (numServers == 1) { // Only one server, nothing fancy we can do here<a name="line.1246"></a>
-<span class="sourceLineNo">1247</span>      ServerName server = servers.get(0);<a name="line.1247"></a>
-<span class="sourceLineNo">1248</span>      assignments.put(server, new ArrayList&lt;&gt;(regions));<a name="line.1248"></a>
-<span class="sourceLineNo">1249</span>      return assignments;<a name="line.1249"></a>
-<span class="sourceLineNo">1250</span>    }<a name="line.1250"></a>
-<span class="sourceLineNo">1251</span><a name="line.1251"></a>
-<span class="sourceLineNo">1252</span>    Cluster cluster = createCluster(servers, regions, false);<a name="line.1252"></a>
-<span class="sourceLineNo">1253</span>    List&lt;RegionInfo&gt; unassignedRegions = new ArrayList&lt;&gt;();<a name="line.1253"></a>
-<span class="sourceLineNo">1254</span><a name="line.1254"></a>
-<span class="sourceLineNo">1255</span>    roundRobinAssignment(cluster, regions, unassignedRegions,<a name="line.1255"></a>
-<span class="sourceLineNo">1256</span>      servers, assignments);<a name="line.1256"></a>
-<span class="sourceLineNo">1257</span><a name="line.1257"></a>
-<span class="sourceLineNo">1258</span>    List&lt;RegionInfo&gt; lastFewRegions = new ArrayList&lt;&gt;();<a name="line.1258"></a>
-<span class="sourceLineNo">1259</span>    // assign the remaining by going through the list and try to assign to servers one-by-one<a name="line.1259"></a>
-<span class="sourceLineNo">1260</span>    int serverIdx = RANDOM.nextInt(numServers);<a name="line.1260"></a>
-<span class="sourceLineNo">1261</span>    for (RegionInfo region : unassignedRegions) {<a name="line.1261"></a>
-<span class="sourceLineNo">1262</span>      boolean assigned = false;<a name="line.1262"></a>
-<span class="sourceLineNo">1263</span>      for (int j = 0; j &lt; numServers; j++) { // try all servers one by one<a name="line.1263"></a>
-<span class="sourceLineNo">1264</span>        ServerName serverName = servers.get((j + serverIdx) % numServers);<a name="line.1264"></a>
-<span class="sourceLineNo">1265</span>        if (!cluster.wouldLowerAvailability(region, serverName)) {<a name="line.1265"></a>
-<span class="sourceLineNo">1266</span>          List&lt;RegionInfo&gt; serverRegions =<a name="line.1266"></a>
-<span class="sourceLineNo">1267</span>              assignments.computeIfAbsent(serverName, k -&gt; new ArrayList&lt;&gt;());<a name="line.1267"></a>
-<span class="sourceLineNo">1268</span>          serverRegions.add(region);<a name="line.1268"></a>
-<span class="sourceLineNo">1269</span>          cluster.doAssignRegion(region, serverName);<a name="line.1269"></a>
-<span class="sourceLineNo">1270</span>          serverIdx = (j + serverIdx + 1) % numServers; //remain from next server<a name="line.1270"></a>
-<span class="sourceLineNo">1271</span>          assigned = true;<a name="line.1271"></a>
-<span class="sourceLineNo">1272</span>          break;<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>      if (!assigned) {<a name="line.1275"></a>
-<span class="sourceLineNo">1276</span>        lastFewRegions.add(region);<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>    // just sprinkle the rest of the regions on random regionservers. The balanceCluster will<a name="line.1279"></a>
-<span class="sourceLineNo">1280</span>    // make it optimal later. we can end up with this if numReplicas &gt; numServers.<a name="line.1280"></a>
-<span class="sourceLineNo">1281</span>    for (RegionInfo region : lastFewRegions) {<a name="line.1281"></a>
-<span class="sourceLineNo">1282</span>      int i = RANDOM.nextInt(numServers);<a name="line.1282"></a>
-<span class="sourceLineNo">1283</span>      ServerName server = servers.get(i);<a name="line.1283"></a>
-<span class="sourceLineNo">1284</span>      List&lt;RegionInfo&gt; serverRegions = assignments.computeIfAbsent(server, k -&gt; new ArrayList&lt;&gt;());<a name="line.1284"></a>
-<span class="sourceLineNo">1285</span>      serverRegions.add(region);<a name="line.1285"></a>
-<span class="sourceLineNo">1286</span>      cluster.doAssignRegion(region, server);<a name="line.1286"></a>
-<span class="sourceLineNo">1287</span>    }<a name="line.1287"></a>
-<span class="sourceLineNo">1288</span>    return assignments;<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>  protected Cluster createCluster(List&lt;ServerName&gt; servers,<a name="line.1291"></a>
-<span class="sourceLineNo">1292</span>      Collection&lt;RegionInfo&gt; regions, boolean forceRefresh) {<a name="line.1292"></a>
-<span class="sourceLineNo">1293</span>    if (forceRefresh &amp;&amp; useRegionFinder) {<a name="line.1293"></a>
-<span class="sourceLineNo">1294</span>      regionFinder.refreshAndWait(regions);<a name="line.1294"></a>
-<span class="sourceLineNo">1295</span>    }<a name="line.1295"></a>
-<span class="sourceLineNo">1296</span>    // Get the snapshot of the current assignments for the regions in question, and then create<a name="line.1296"></a>
-<span class="sourceLineNo">1297</span>    // a cluster out of it. Note that we might have replicas already assigned to some servers<a name="line.1297"></a>
-<span class="sourceLineNo">1298</span>    // earlier. So we want to get the snapshot to see those assignments, but this will only contain<a name="line.1298"></a>
-<span class="sourceLineNo">1299</span>    // replicas of the regions that are passed (for performance).<a name="line.1299"></a>
-<span class="sourceLineNo">1300</span>    Map&lt;ServerName, List&lt;RegionInfo&gt;&gt; clusterState = getRegionAssignmentsByServer(regions);<a name="line.1300"></a>
-<span class="sourceLineNo">1301</span><a name="line.1301"></a>
-<span class="sourceLineNo">1302</span>    for (ServerName server : servers) {<a name="line.1302"></a>
-<span class="sourceLineNo">1303</span>      if (!clusterState.containsKey(server)) {<a name="line.1303"></a>
-<span class="sourceLineNo">1304</span>        clusterState.put(server, EMPTY_REGION_LIST);<a name="line.1304"></a>
-<span class="sourceLineNo">1305</span>      }<a name="line.1305"></a>
-<span class="sourceLineNo">1306</span>    }<a name="line.1306"></a>
-<span class="sourceLineNo">1307</span>    return new Cluster(regions, clusterState, null, this.regionFinder,<a name="line.1307"></a>
-<span class="sourceLineNo">1308</span>        rackManager);<a name="line.1308"></a>
-<span class="sourceLineNo">1309</span>  }<a name="line.1309"></a>
+<span class="sourceLineNo">1154</span>  @Override<a name="line.1154"></a>
+<span class="sourceLineNo">1155</span>  public void postMasterStartupInitialize() {<a name="line.1155"></a>
+<span class="sourceLineNo">1156</span>    if (services != null &amp;&amp; regionFinder != null) {<a name="line.1156"></a>
+<span class="sourceLineNo">1157</span>      try {<a name="line.1157"></a>
+<span class="sourceLineNo">1158</span>        Set&lt;RegionInfo&gt; regions =<a name="line.1158"></a>
+<span class="sourceLineNo">1159</span>            services.getAssignmentManager().getRegionStates().getRegionAssignments().keySet();<a name="line.1159"></a>
+<span class="sourceLineNo">1160</span>        regionFinder.refreshAndWait(regions);<a name="line.1160"></a>
+<span class="sourceLineNo">1161</span>      } catch (Exception e) {<a name="line.1161"></a>
+<span class="sourceLineNo">1162</span>        LOG.warn("Refreshing region HDFS Block dist failed with exception, ignoring", e);<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>  }<a name="line.1165"></a>
+<span class="sourceLineNo">1166</span><a name="line.1166"></a>
+<span class="sourceLineNo">1167</span>  public void setRackManager(RackManager rackManager) {<a name="line.1167"></a>
+<span class="sourceLineNo">1168</span>    this.rackManager = rackManager;<a name="line.1168"></a>
+<span class="sourceLineNo">1169</span>  }<a name="line.1169"></a>
+<span class="sourceLineNo">1170</span><a name="line.1170"></a>
+<span class="sourceLineNo">1171</span>  protected boolean needsBalance(Cluster c) {<a name="line.1171"></a>
+<span class="sourceLineNo">1172</span>    ClusterLoadState cs = new ClusterLoadState(c.clusterState);<a name="line.1172"></a>
+<span class="sourceLineNo">1173</span>    if (cs.getNumServers() &lt; MIN_SERVER_BALANCE) {<a name="line.1173"></a>
+<span class="sourceLineNo">1174</span>      if (LOG.isDebugEnabled()) {<a name="line.1174"></a>
+<span class="sourceLineNo">1175</span>        LOG.debug("Not running balancer because only " + cs.getNumServers()<a name="line.1175"></a>
+<span class="sourceLineNo">1176</span>            + " active regionserver(s)");<a name="line.1176"></a>
+<span class="sourceLineNo">1177</span>      }<a name="line.1177"></a>
+<span class="sourceLineNo">1178</span>      return false;<a name="line.1178"></a>
+<span class="sourceLineNo">1179</span>    }<a name="line.1179"></a>
+<span class="sourceLineNo">1180</span>    if(areSomeRegionReplicasColocated(c)) return true;<a name="line.1180"></a>
+<span class="sourceLineNo">1181</span>    // Check if we even need to do any load balancing<a name="line.1181"></a>
+<span class="sourceLineNo">1182</span>    // HBASE-3681 check sloppiness first<a name="line.1182"></a>
+<span class="sourceLineNo">1183</span>    float average = cs.getLoadAverage(); // for logging<a name="line.1183"></a>
+<span class="sourceLineNo">1184</span>    int floor = (int) Math.floor(average * (1 - slop));<a name="line.1184"></a>
+<span class="sourceLineNo">1185</span>    int ceiling = (int) Math.ceil(average * (1 + slop));<a name="line.1185"></a>
+<span class="sourceLineNo">1186</span>    if (!(cs.getMaxLoad() &gt; ceiling || cs.getMinLoad() &lt; floor)) {<a name="line.1186"></a>
+<span class="sourceLineNo">1187</span>      NavigableMap&lt;ServerAndLoad, List&lt;RegionInfo&gt;&gt; serversByLoad = cs.getServersByLoad();<a name="line.1187"></a>
+<span class="sourceLineNo">1188</span>      if (LOG.isTraceEnabled()) {<a name="line.1188"></a>
+<span class="sourceLineNo">1189</span>        // If nothing to balance, then don't say anything unless trace-level logging.<a name="line.1189"></a>
+<span class="sourceLineNo">1190</span>        LOG.trace("Skipping load balancing because balanced cluster; " +<a name="line.1190"></a>
+<span class="sourceLineNo">1191</span>          "servers=" + cs.getNumServers() +<a name="line.1191"></a>
+<span class="sourceLineNo">1192</span>          " regions=" + cs.getNumRegions() + " average=" + average +<a name="line.1192"></a>
+<span class="sourceLineNo">1193</span>          " mostloaded=" + serversByLoad.lastKey().getLoad() +<a name="line.1193"></a>
+<span class="sourceLineNo">1194</span>          " leastloaded=" + serversByLoad.firstKey().getLoad());<a name="line.1194"></a>
+<span class="sourceLineNo">1195</span>      }<a name="line.1195"></a>
+<span class="sourceLineNo">1196</span>      return false;<a name="line.1196"></a>
+<span class="sourceLineNo">1197</span>    }<a name="line.1197"></a>
+<span class="sourceLineNo">1198</span>    return true;<a name="line.1198"></a>
+<span class="sourceLineNo">1199</span>  }<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>   * Subclasses should implement this to return true if the cluster has nodes that hosts<a name="line.1202"></a>
+<span class="sourceLineNo">1203</span>   * multiple replicas for the same region, or, if there are multiple racks and the same<a name="line.1203"></a>
+<span class="sourceLineNo">1204</span>   * rack hosts replicas of the same region<a name="line.1204"></a>
+<span class="sourceLineNo">1205</span>   * @param c Cluster information<a name="line.1205"></a>
+<span class="sourceLineNo">1206</span>   * @return whether region replicas are currently co-located<a name="line.1206"></a>
+<span class="sourceLineNo">1207</span>   */<a name="line.1207"></a>
+<span class="sourceLineNo">1208</span>  protected boolean areSomeRegionReplicasColocated(Cluster c) {<a name="line.1208"></a>
+<span class="sourceLineNo">1209</span>    return false;<a name="line.1209"></a>
+<span class="sourceLineNo">1210</span>  }<a name="line.1210"></a>
+<span class="sourceLineNo">1211</span><a name="line.1211"></a>
+<span class="sourceLineNo">1212</span>  /**<a name="line.1212"></a>
+<span class="sourceLineNo">1213</span>   * Generates a bulk assignment plan to be used on cluster startup using a<a name="line.1213"></a>
+<span class="sourceLineNo">1214</span>   * simple round-robin assignment.<a name="line.1214"></a>
+<span class="sourceLineNo">1215</span>   * &lt;p&gt;<a name="line.1215"></a>
+<span class="sourceLineNo">1216</span>   * Takes a list of all the regions and all the servers in the cluster and<a name="line.1216"></a>
+<span class="sourceLineNo">1217</span>   * returns a map of each server to the regions that it should be assigned.<a name="line.1217"></a>
+<span class="sourceLineNo">1218</span>   * &lt;p&gt;<a name="line.1218"></a>
+<span class="sourceLineNo">1219</span>   * Currently implemented as a round-robin assignment. Same invariant as load<a name="line.1219"></a>
+<span class="sourceLineNo">1220</span>   * balancing, all servers holding floor(avg) or ceiling(avg).<a name="line.1220"></a>
+<span class="sourceLineNo">1221</span>   *<a name="line.1221"></a>
+<span class="sourceLineNo">1222</span>   * TODO: Use block locations from HDFS to place regions with their blocks<a name="line.1222"></a>
+<span class="sourceLineNo">1223</span>   *<a name="line.1223"></a>
+<span class="sourceLineNo">1224</span>   * @param regions all regions<a name="line.1224"></a>
+<span class="sourceLineNo">1225</span>   * @param servers all servers<a name="line.1225"></a>
+<span class="sourceLineNo">1226</span>   * @return map of server to the regions it should take, or null if no<a name="line.1226"></a>
+<span class="sourceLineNo">1227</span>   *         assignment is possible (ie. no regions or no servers)<a name="line.1227"></a>
+<span class="sourceLineNo">1228</span>   */<a name="line.1228"></a>
+<span class="sourceLineNo">1229</span>  @Override<a name="line.1229"></a>
+<span class="sourceLineNo">1230</span>  public Map&lt;ServerName, List&lt;RegionInfo&gt;&gt; roundRobinAssignment(List&lt;RegionInfo&gt; regions,<a name="line.1230"></a>
+<span class="sourceLineNo">1231</span>      List&lt;ServerName&gt; servers) throws HBaseIOException {<a name="line.1231"></a>
+<span class="sourceLineNo">1232</span>    metricsBalancer.incrMiscInvocations();<a name="line.1232"></a>
+<span class="sourceLineNo">1233</span>    Map&lt;ServerName, List&lt;RegionInfo&gt;&gt; assignments = assignMasterSystemRegions(regions, servers);<a name="line.1233"></a>
+<span class="sourceLineNo">1234</span>    if (assignments != null &amp;&amp; !assignments.isEmpty()) {<a name="line.1234"></a>
+<span class="sourceLineNo">1235</span>      servers = new ArrayList&lt;&gt;(servers);<a name="line.1235"></a>
+<span class="sourceLineNo">1236</span>      // Guarantee not to put other regions on master<a name="line.1236"></a>
+<span class="sourceLineNo">1237</span>      servers.remove(masterServerName);<a name="line.1237"></a>
+<span class="sourceLineNo">1238</span>      List&lt;RegionInfo&gt; masterRegions = assignments.get(masterServerName);<a name="line.1238"></a>
+<span class="sourceLineNo">1239</span>      if (!masterRegions.isEmpty()) {<a name="line.1239"></a>
+<span class="sourceLineNo">1240</span>        regions = new ArrayList&lt;&gt;(regions);<a name="line.1240"></a>
+<span class="sourceLineNo">1241</span>        regions.removeAll(masterRegions);<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>    if (regions == null || regions.isEmpty()) {<a name="line.1244"></a>
+<span class="sourceLineNo">1245</span>      return assignments;<a name="line.1245"></a>
+<span class="sourceLineNo">1246</span>    }<a name="line.1246"></a>
+<span class="sourceLineNo">1247</span><a name="line.1247"></a>
+<span class="sourceLineNo">1248</span>    int numServers = servers == null ? 0 : servers.size();<a name="line.1248"></a>
+<span class="sourceLineNo">1249</span>    if (numServers == 0) {<a name="line.1249"></a>
+<span class="sourceLineNo">1250</span>      LOG.warn("Wanted to do round robin assignment but no servers to assign to");<a name="line.1250"></a>
+<span class="sourceLineNo">1251</span>      return null;<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>    // TODO: instead of retainAssignment() and roundRobinAssignment(), we should just run the<a name="line.1254"></a>
+<span class="sourceLineNo">1255</span>    // normal LB.balancerCluster() with unassignedRegions. We only need to have a candidate<a name="line.1255"></a>
+<span class="sourceLineNo">1256</span>    // generator for AssignRegionAction. The LB will ensure the regions are mostly local<a name="line.1256"></a>
+<span class="sourceLineNo">1257</span>    // and balanced. This should also run fast with fewer number of iterations.<a name="line.1257"></a>
+<span class="sourceLineNo">1258</span><a name="line.1258"></a>
+<span class="sourceLineNo">1259</span>    if (numServers == 1) { // Only one server, nothing fancy we can do here<a name="line.1259"></a>
+<span class="sourceLineNo">1260</span>      ServerName server = servers.get(0);<a name="line.1260"></a>
+<span class="sourceLineNo">1261</span>      assignments.put(server, new ArrayList&lt;&gt;(regions));<a name="line.1261"></a>
+<span class="sourceLineNo">1262</span>      return assignments;<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>    Cluster cluster = createCluster(servers, regions);<a name="line.1265"></a>
+<span class="sourceLineNo">1266</span>    List&lt;RegionInfo&gt; unassignedRegions = new ArrayList&lt;&gt;();<a name="line.1266"></a>
+<span class="sourceLineNo">1267</span><a name="line.1267"></a>
+<span class="sourceLineNo">1268</span>    roundRobinAssignment(cluster, regions, unassignedRegions,<a name="line.1268"></a>
+<span class="sourceLineNo">1269</span>      servers, assignments);<a name="line.1269"></a>
+<span class="sourceLineNo">1270</span><a name="line.1270"></a>
+<span class="sourceLineNo">1271</span>    List&lt;RegionInfo&gt; lastFewRegions = new ArrayList&lt;&gt;();<a name="line.1271"></a>
+<span class="sourceLineNo">1272</span>    // assign the remaining by going through the list and try to assign to servers one-by-one<a name="line.1272"></a>
+<span class="sourceLineNo">1273</span>    int serverIdx = RANDOM.nextInt(numServers);<a name="line.1273"></a>
+<span class="sourceLineNo">1274</span>    for (RegionInfo region : unassignedRegions) {<a name="line.1274"></a>
+<span class="sourceLineNo">1275</span>      boolean assigned = false;<a name="line.1275"></a>
+<span class="sourceLineNo">1276</span>      for (int j = 0; j &lt; numServers; j++) { // try all servers one by one<a name="line.1276"></a>
+<span class="sourceLineNo">1277</span>        ServerName serverName = servers.get((j + serverIdx) % numServers);<a name="line.1277"></a>
+<span class="sourceLineNo">1278</span>        if (!cluster.wouldLowerAvailability(region, serverName)) {<a name="line.1278"></a>
+<span class="sourceLineNo">1279</span>          List&lt;RegionInfo&gt; serverRegions =<a name="line.1279"></a>
+<span class="sourceLineNo">1280</span>              assignments.computeIfAbsent(serverName, k -&gt; new ArrayList&lt;&gt;());<a name="line.1280"></a>
+<span class="sourceLineNo">1281</span>          serverRegions.add(region);<a name="line.1281"></a>
+<span class="sourceLineNo">1282</span>          cluster.doAssignRegion(region, serverName);<a name="line.1282"></a>
+<span class="sourceLineNo">1283</span>          serverIdx = (j + serverIdx + 1) % numServers; //remain from next server<a name="line.1283"></a>
+<span class="sourceLineNo">1284</span>          assigned = true;<a name="line.1284"></a>
+<span class="sourceLineNo">1285</span>          break;<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>      if (!assigned) {<a name="line.1288"></a>
+<span class="sourceLineNo">1289</span>        lastFewRegions.add(region);<a name="line.1289"></a>
+<span class="sourceLineNo">1290</span>      }<a name="line.1290"></a>
+<span class="sourceLineNo">1291</span>    }<a name="line.1291"></a>
+<span class="sourceLineNo">1292</span>    // just sprinkle the rest of the regions on random regionservers. The balanceCluster will<a name="line.1292"></a>
+<span class="sourceLineNo">1293</span>    // make it optimal later. we can end up with this if numReplicas &gt; numServers.<a name="line.1293"></a>
+<span class="sourceLineNo">1294</span>    for (RegionInfo region : lastFewRegions) {<a name="line.1294"></a>
+<span class="sourceLineNo">1295</span>      int i = RANDOM.nextInt(numServers);<a name="line.1295"></a>
+<span class="sourceLineNo">1296</span>      ServerName server = servers.get(i);<a name="line.1296"></a>
+<span class="sourceLineNo">1297</span>      List&lt;RegionInfo&gt; serverRegions = assignments.computeIfAbsent(server, k -&gt; new ArrayList&lt;&gt;());<a name="line.1297"></a>
+<span class="sourceLineNo">1298</span>      serverRegions.add(region);<a name="line.1298"></a>
+<span class="sourceLineNo">1299</span>      cluster.doAssignRegion(region, server);<a name="line.1299"></a>
+<span class="sourceLineNo">1300</span>    }<a name="line.1300"></a>
+<span class="sourceLineNo">1301</span>    return assignments;<a name="line.1301"></a>
+<span class="sourceLineNo">1302</span>  }<a name="line.1302"></a>
+<span class="sourceLineNo">1303</span><a name="line.1303"></a>
+<span class="sourceLineNo">1304</span>  protected Cluster createCluster(List&lt;ServerName&gt; servers, Collection&lt;RegionInfo&gt; regions) {<a name="line.1304"></a>
+<span class="sourceLineNo">1305</span>    // Get the snapshot of the current assignments for the regions in question, and then create<a name="line.1305"></a>
+<span class="sourceLineNo">1306</span>    // a cluster out of it. Note that we might have replicas already assigned to some servers<a name="line.1306"></a>
+<span class="sourceLineNo">1307</span>    // earlier. So we want to get the snapshot to see those assignments, but this will only contain<a name="line.1307"></a>
+<span class="sourceLineNo">1308</span>    // replicas of the regions that are passed (for performance).<a name="line.1308"></a>
+<span class="sourceLineNo">1309</span>    Map&lt;ServerName, List&lt;RegionInfo&gt;&gt; clusterState = getRegionAssignmentsByServer(regions);<a name="line.1309"></a>
 <span class="sourceLineNo">1310</span><a name="line.1310"></a>
-<span class="sourceLineNo">1311</span>  private List&lt;ServerName&gt; findIdleServers(List&lt;ServerName&gt; servers) {<a name="line.1311"></a>
-<span class="sourceLineNo">1312</span>    return this.services.getServerManager()<a name="line.1312"></a>
-<span class="sourceLineNo">1313</span>            .getOnlineServersListWithPredicator(servers, IDLE_SERVER_PREDICATOR);<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>  /**<a name="line.1316"></a>
-<span class="sourceLineNo">1317</span>   * Used to assign a single region to a random server.<a name="line.1317"></a>
-<span class="sourceLineNo">1318</span>   */<a name="line.1318"></a>
-<span class="sourceLineNo">1319</span>  @Override<a name="line.1319"></a>
-<span class="sourceLineNo">1320</span>  public ServerName randomAssignment(RegionInfo regionInfo, List&lt;ServerName&gt; servers)<a name="line.1320"></a>
-<span class="sourceLineNo">1321</span>      throws HBaseIOException {<a name="line.1321"></a>
-<span class="sourceLineNo">1322</span>    metricsBalancer.incrMiscInvocations();<a name="line.1322"></a>
-<span class="sourceLineNo">1323</span>    if (servers != null &amp;&amp; servers.contains(masterServerName)) {<a name="line.1323"></a>
-<span class="sourceLineNo">1324</span>      if (shouldBeOnMaster(regionInfo)) {<a name="line.1324"></a>
-<span class="sourceLineNo">1325</span>        return masterServerName;<a name="line.1325"></a>
-<span class="sourceLineNo">1326</span>      }<a name="line.1326"></a>
-<span class="sourceLineNo">1327</span>      if (!LoadBalancer.isTablesOnMaster(getConf())) {<a name="line.1327"></a>
-<span class="sourceLineNo">1328</span>        // Guarantee we do not put any regions on master<a name="line.1328"></a>
-<span class="sourceLineNo">1329</span>        servers = new ArrayList&lt;&gt;(servers);<a name="line.1329"></a>
-<span class="sourceLineNo">1330</span>        servers.remove(masterServerName);<a name="line.1330"></a>
-<span class="sourceLineNo">1331</span>      }<a name="line.1331"></a>
-<span class="sourceLineNo">1332</span>    }<a name="line.1332"></a>
-<span class="sourceLineNo">1333</span><a name="line.1333"></a>
-<span class="sourceLineNo">1334</span>    int numServers = servers == null ? 0 : servers.size();<a name="line.1334"></a>
-<span class="sourceLineNo">1335</span>    if (numServers == 0) {<a name="line.1335"></a>
-<span class="sourceLineNo">1336</span>      LOG.warn("Wanted to retain assignment but no servers to assign to");<a name="line.1336"></a>
-<span class="sourceLineNo">1337</span>      return null;<a name="line.1337"></a>
-<span class="sourceLineNo">1338</span>    }<a name="line.1338"></a>
-<span class="sourceLineNo">1339</span>    if (numServers == 1) { // Only one server, nothing fancy we can do here<a name="line.1339"></a>
-<span class="sourceLineNo">1340</span>      return servers.get(0);<a name="line.1340"></a>
+<span class="sourceLineNo">1311</span>    for (ServerName server : servers) {<a name="line.1311"></a>
+<span class="sourceLineNo">1312</span>      if (!clusterState.containsKey(server)) {<a name="line.1312"></a>
+<span class="sourceLineNo">1313</span>        clusterState.put(server, EMPTY_REGION_LIST);<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>    return new Cluster(regions, clusterState, null, this.regionFinder,<a name="line.1316"></a>
+<span class="sourceLineNo">1317</span>        rackManager);<a name="line.1317"></a>
+<span class="sourceLineNo">1318</span>  }<a name="line.1318"></a>
+<span class="sourceLineNo">1319</span><a name="line.1319"></a>
+<span class="sourceLineNo">1320</span>  private List&lt;ServerName&gt; findIdleServers(List&lt;ServerName&gt; servers) {<a name="line.1320"></a>
+<span class="sourceLineNo">1321</span>    return this.services.getServerManager()<a name="line.1321"></a>
+<span class="sourceLineNo">1322</span>            .getOnlineServersListWithPredicator(servers, IDLE_SERVER_PREDICATOR);<a name="line.1322"></a>
+<span class="sourceLineNo">1323</span>  }<a name="line.1323"></a>
+<span class="sourceLineNo">1324</span><a name="line.1324"></a>
+<span class="sourceLineNo">1325</span>  /**<a name="line.1325"></a>
+<span class="sourceLineNo">1326</span>   * Used to assign a single region to a random server.<a name="line.1326"></a>
+<span class="sourceLineNo">1327</span>   */<a name="line.1327"></a>
+<span class="sourceLineNo">1328</span>  @Override<a name="line.1328"></a>
+<span class="sourceLineNo">1329</span>  public ServerName randomAssignment(RegionInfo regionInfo, List&lt;ServerName&gt; servers)<a name="line.1329"></a>
+<span class="sourceLineNo">1330</span>      throws HBaseIOException {<a name="line.1330"></a>
+<span class="sourceLineNo">1331</span>    metricsBalancer.incrMiscInvocations();<a name="line.1331"></a>
+<span class="sourceLineNo">1332</span>    if (servers != null &amp;&amp; servers.contains(masterServerName)) {<a name="line.1332"></a>
+<span class="sourceLineNo">1333</span>      if (shouldBeOnMaster(regionInfo)) {<a name="line.1333"></a>
+<span class="sourceLineNo">1334</span>        return masterServerName;<a name="line.1334"></a>
+<span class="sourceLineNo">1335</span>      }<a name="line.1335"></a>
+<span class="sourceLineNo">1336</span>      if (!LoadBalancer.isTablesOnMaster(getConf())) {<a name="line.1336"></a>
+<span class="sourceLineNo">1337</span>        // Guarantee we do not put any regions on master<a name="line.1337"></a>
+<span class="sourceLineNo">1338</span>        servers = new ArrayList&lt;&gt;(servers);<a name="line.1338"></a>
+<span class="sourceLineNo">1339</span>        servers.remove(masterServerName);<a name="line.1339"></a>
+<span class="sourceLineNo">1340</span>      }<a name="line.1340"></a>
 <span class="sourceLineNo">1341</span>    }<a name="line.1341"></a>
-<span class="sourceLineNo">1342</span>    List&lt;ServerName&gt; idleServers = findIdleServers(servers);<a name="line.1342"></a>
-<span class="sourceLineNo">1343</span>    if (idleServers.size() == 1) {<a name="line.1343"></a>
-<span class="sourceLineNo">1344</span>      return idleServers.get(0);<a name="line.1344"></a>
-<span class="sourceLineNo">1345</span>    }<a name="line.1345"></a>
-<span class="sourceLineNo">1346</span>    final List&lt;ServerName&gt; finalServers = idleServers.isEmpty() ?<a name="line.1346"></a>
-<span class="sourceLineNo">1347</span>            servers : idleServers;<a name="line.1347"></a>
-<span class="sourceLineNo">1348</span>    List&lt;RegionInfo&gt; regions = Lists.newArrayList(regionInfo);<a name="line.1348"></a>
-<span class="sourceLineNo">1349</span>    Cluster cluster = createCluster(finalServers, regions, false);<a name="line.1349"></a>
-<span class="sourceLineNo">1350</span>    return randomAssignment(cluster, regionInfo, finalServers);<a name="line.1350"></a>
-<span class="sourceLineNo">1351</span>  }<a name="line.1351"></a>
-<span class="sourceLineNo">1352</span><a name="line.1352"></a>
-<span class="sourceLineNo">1353</span>  /**<a name="line.1353"></a>
-<span class="sourceLineNo">1354</span>   * Generates a bulk assignment startup plan, attempting to reuse the existing<a name="line.1354"></a>
-<span class="sourceLineNo">1355</span>   * assignment information from META, but adjusting for the specified list of<a name="line.1355"></a>
-<span class="sourceLineNo">1356</span>   * available/online servers available for assignment.<a name="line.1356"></a>
-<span class="sourceLineNo">1357</span>   * &lt;p&gt;<a name="line.1357"></a>
-<span class="sourceLineNo">1358</span>   * Takes a map of all regions to their existing assignment from META. Also<a name="line.1358"></a>
-<span class="sourceLineNo">1359</span>   * takes a list of online servers for regions to be assigned to. Attempts to<a name="line.1359"></a>
-<span class="sourceLineNo">1360</span>   * retain all assignment, so in some instances initial assignment will not be<a name="line.1360"></a>
-<span class="sourceLineNo">1361</span>   * completely balanced.<a name="line.1361"></a>
-<span class="sourceLineNo">1362</span>   * &lt;p&gt;<a name="line.1362"></a>
-<span class="sourceLineNo">1363</span>   * Any leftover regions without an existing server to be assigned to will be<a name="line.1363"></a>
-<span class="sourceLineNo">1364</span>   * assigned randomly to available servers.<a name="line.1364"></a>
-<span class="sourceLineNo">1365</span>   *<a name="line.1365"></a>
-<span class="sourceLineNo">1366</span>   * @param regions regions and existing assignment from meta<a name="line.1366"></a>
-<span class="sourceLineNo">1367</span>   * @param servers available servers<a name="line.1367"></a>
-<span class="sourceLineNo">1368</span>   * @return map of servers and regions to be assigned to them<a name="line.1368"></a>
-<span class="sourceLineNo">1369</span>   */<a name="line.1369"></a>
-<span class="sourceLineNo">1370</span>  @Override<a name="line.1370"></a>
-<span class="sourceLineNo">1371</span>  public Map&lt;ServerName, List&lt;RegionInfo&gt;&gt; retainAssignment(Map&lt;RegionInfo, ServerName&gt; regions,<a name="line.1371"></a>
-<span class="sourceLineNo">1372</span>      List&lt;ServerName&gt; servers) throws HBaseIOException {<a name="line.1372"></a>
-<span class="sourceLineNo">1373</span>    // Update metrics<a name="line.1373"></a>
-<span class="sourceLineNo">1374</span>    metricsBalancer.incrMiscInvocations();<a name="line.1374"></a>
-<span class="sourceLineNo">1375</span>    Map&lt;ServerName, List&lt;RegionInfo&gt;&gt; assignments = assignMasterSystemRegions(regions.keySet(), servers);<a name="line.1375"></a>
-<span class="sourceLineNo">1376</span>    if (assignments != null &amp;&amp; !assignments.isEmpty()) {<a name="line.1376"></a>
-<span class="sourceLineNo">1377</span>      servers = new ArrayList&lt;&gt;(servers);<a name="line.1377"></a>
-<span class="sourceLineNo">1378</span>      // Guarantee not to put other regions on master<a name="line.1378"></a>
-<span class="sourceLineNo">1379</span>      servers.remove(masterServerName);<a name="line.1379"></a>
-<span class="sourceLineNo">1380</span>      List&lt;RegionInfo&gt; masterRegions = assignments.get(masterServerName);<a name="line.1380"></a>
-<span class="sourceLineNo">1381</span>      regions = regions.entrySet().stream().filter(e -&gt; !masterRegions.contains(e.getKey()))<a name="line.1381"></a>
-<span class="sourceLineNo">1382</span>          .collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue));<a name="line.1382"></a>
-<span class="sourceLineNo">1383</span>    }<a name="line.1383"></a>
-<span class="sourceLineNo">1384</span>    if (regions.isEmpty()) {<a name="line.1384"></a>
-<span class="sourceLineNo">1385</span>      return assignments;<a name="line.1385"></a>
-<span class="sourceLineNo">1386</span>    }<a name="line.1386"></a>
-<span class="sourceLineNo">1387</span><a name="line.1387"></a>
-<span class="sourceLineNo">1388</span>    int numServers = servers == null ? 0 : servers.size();<a name="line.1388"></a>
-<span class="sourceLineNo">1389</span>    if (numServers == 0) {<a name="line.1389"></a>
-<span class="sourceLineNo">1390</span>      LOG.warn("Wanted to do retain assignment but no servers to assign to");<a name="line.1390"></a>
-<span class="sourceLineNo">1391</span>      return null;<a name="line.1391"></a>
+<span class="sourceLineNo">1342</span><a name="line.1342"></a>
+<span class="sourceLineNo">1343</span>    int numServers = servers == null ? 0 : servers.size();<a name="line.1343"></a>
+<span class="sourceLineNo">1344</span>    if (numServers == 0) {<a name="line.1344"></a>
+<span class="sourceLineNo">1345</span>      LOG.warn("Wanted to retain assignment but no servers to assign to");<a name="line.1345"></a>
+<span class="sourceLineNo">1346</span>      return null;<a name="line.1346"></a>
+<span class="sourceLineNo">1347</span>    }<a name="line.1347"></a>
+<span class="sourceLineNo">1348</span>    if (numServers == 1) { // Only one server, nothing fancy we can do here<a name="line.1348"></a>
+<span class="sourceLineNo">1349</span>      return servers.get(0);<a name="line.1349"></a>
+<span class="sourceLineNo">1350</span>    }<a name="line.1350"></a>
+<span class="sourceLineNo">1351</span>    List&lt;ServerName&gt; idleServers = findIdleServers(servers);<a name="line.1351"></a>
+<span class="sourceLineNo">1352</span>    if (idleServers.size() == 1) {<a name="line.1352"></a>
+<span class="sourceLineNo">1353</span>      return idleServers.get(0);<a name="line.1353"></a>
+<span class="sourceLineNo">1354</span>    }<a name="line.1354"></a>
+<span class="sourceLineNo">1355</span>    final List&lt;ServerName&gt; finalServers = idleServers.isEmpty() ?<a name="line.1355"></a>
+<span class="sourceLineNo">1356</span>            servers : idleServers;<a name="line.1356"></a>
+<span class="sourceLineNo">1357</span>    List&lt;RegionInfo&gt; regions = Lists.newArrayList(regionInfo);<a name="line.1357"></a>
+<span class="sourceLineNo">1358</span>    Cluster cluster = createCluster(finalServers, regions);<a name="line.1358"></a>
+<span class="sourceLineNo">1359</span>    return randomAssignment(cluster, regionInfo, finalServers);<a name="line.1359"></a>
+<span class="sourceLineNo">1360</span>  }<a name="line.1360"></a>
+<span class="sourceLineNo">1361</span><a name="line.1361"></a>
+<span class="sourceLineNo">1362</span>  /**<a name="line.1362"></a>
+<span class="sourceLineNo">1363</span>   * Generates a bulk assignment startup plan, attempting to reuse the existing<a name="line.1363"></a>
+<span class="sourceLineNo">1364</span>   * assignment information from META, but adjusting for the specified list of<a name="line.1364"></a>
+<span class="sourceLineNo">1365</span>   * available/online servers available for assignment.<a name="line.1365"></a>
+<span class="sourceLineNo">1366</span>   * &lt;p&gt;<a name="line.1366"></a>
+<span class="sourceLineNo">1367</span>   * Takes a map of all regions to their existing assignment from META. Also<a name="line.1367"></a>
+<span class="sourceLineNo">1368</span>   * takes a list of online servers for regions to be assigned to. Attempts to<a name="line.1368"></a>
+<span class="sourceLineNo">1369</span>   * retain all assignment, so in some instances initial assignment will not be<a name="line.1369"></a>
+<span class="sourceLineNo">1370</span>   * completely balanced.<a name="line.1370"></a>
+<span class="sourceLineNo">1371</span>   * &lt;p&gt;<a name="line.1371"></a>
+<span class="sourceLineNo">1372</span>   * Any leftover regions without an existing server to be assigned to will be<a name="line.1372"></a>
+<span class="sourceLineNo">1373</span>   * assigned randomly to available servers.<a name="line.1373"></a>
+<span class="sourceLineNo">1374</span>   *<a name="line.1374"></a>
+<span class="sourceLineNo">1375</span>   * @param regions regions and existing assignment from meta<a name="line.1375"></a>
+<span class="sourceLineNo">1376</span>   * @param servers available servers<a name="line.1376"></a>
+<span class="sourceLineNo">1377</span>   * @return map of servers and regions to be assigned to them<a name="line.1377"></a>
+<span class="sourceLineNo">1378</span>   */<a name="line.1378"></a>
+<span class="sourceLineNo">1379</span>  @Override<a name="line.1379"></a>
+<span class="sourceLineNo">1380</span>  public Map&lt;ServerName, List&lt;RegionInfo&gt;&gt; retainAssignment(Map&lt;RegionInfo, ServerName&gt; regions,<a name="line.1380"></a>
+<span class="sourceLineNo">1381</span>      List&lt;ServerName&gt; servers) throws HBaseIOException {<a name="line.1381"></a>
+<span class="sourceLineNo">1382</span>    // Update metrics<a name="line.1382"></a>
+<span class="sourceLineNo">1383</span>    metricsBalancer.incrMiscInvocations();<a name="line.1383"></a>
+<span class="sourceLineNo">1384</span>    Map&lt;ServerName, List&lt;RegionInfo&gt;&gt; assignments = assignMasterSystemRegions(regions.keySet(), servers);<a name="line.1384"></a>
+<span class="sourceLineNo">1385</span>    if (assignments != null &amp;&amp; !assignments.isEmpty()) {<a name="line.1385"></a>
+<span class="sourceLineNo">1386</span>      servers = new ArrayList&lt;&gt;(servers);<a name="line.1386"></a>
+<span class="sourceLineNo">1387</span>      // Guarantee not to put other regions on master<a name="line.1387"></a>
+<span class="sourceLineNo">1388</span>      servers.remove(masterServerName);<a name="line.1388"></a>
+<span class="sourceLineNo">1389</span>      List&lt;RegionInfo&gt; masterRegions = assignments.get(masterServerName);<a name="line.1389"></a>
+<span class="sourceLineNo">1390</span>      regions = regions.entrySet().stream().filter(e -&gt; !masterRegions.contains(e.getKey()))<a name="line.1390"></a>
+<span class="sourceLineNo">1391</span>          .collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue));<a name="line.1391"></a>
 <span class="sourceLineNo">1392</span>    }<a name="line.1392"></a>
-<span class="sourceLineNo">1393</span>    if (numServers == 1) { // Only one server, nothing fancy we can do here<a name="line.1393"></a>
-<span class="sourceLineNo">1394</span>      ServerName server = servers.get(0);<a name="line.1394"></a>
-<span class="sourceLineNo">1395</span>      assignments.put(server, new ArrayList&lt;&gt;(regions.keySet()));<a name="line.1395"></a>
-<span class="sourceLineNo">1396</span>      return assignments;<a name="line.1396"></a>
-<span class="sourceLineNo">1397</span>    }<a name="line.1397"></a>
-<span class="sourceLineNo">1398</span><a name="line.1398"></a>
-<span class="sourceLineNo">1399</span>    // Group all of the old assignments by their hostname.<a name="line.1399"></a>
-<span class="sourceLineNo">1400</span>    // We can't group directly by ServerName since the servers all have<a name="line.1400"></a>
-<span class="sourceLineNo">1401</span>    // new start-codes.<a name="line.1401"></a>
-<span class="sourceLineNo">1402</span><a name="line.1402"></a>
-<span class="sourceLineNo">1403</span>    // Group the servers by their hostname. It's possible we have multiple<a name="line.1403"></a>
-<span class="sourceLineNo">1404</span>    // servers on the same host on different ports.<a name="line.1404"></a>
-<span class="sourceLineNo">1405</span>    ArrayListMultimap&lt;String, ServerName&gt; serversByHostname = ArrayListMultimap.create();<a name="line.1405"></a>
-<span class="sourceLineNo">1406</span>    for (ServerName server : servers) {<a name="line.1406"></a>
-<span class="sourceLineNo">1407</span>      assignments.put(server, new ArrayList&lt;&gt;());<a name="line.1407"></a>
-<span class="sourceLineNo">1408</span>      serversByHostname.put(server.getHostnameLowerCase(), server);<a name="line.1408"></a>
-<span class="sourceLineNo">1409</span>    }<a name="line.1409"></a>
-<span class="sourceLineNo">1410</span><a name="line.1410"></a>
-<span class="sourceLineNo">1411</span>    // Collection of the hostnames that used to have regions<a name="line.1411"></a>
-<span class="sourceLineNo">1412</span>    // assigned, but for which we no longer have any RS running<a name="line.1412"></a>
-<span class="sourceLineNo">1413</span>    // after the cluster restart.<a name="line.1413"></a>
-<span class="sourceLineNo">1414</span>    Set&lt;String&gt; oldHostsNoLongerPresent = Sets.newTreeSet();<a name="line.1414"></a>
-<span class="sourceLineNo">1415</span><a name="line.1415"></a>
-<span class="sourceLineNo">1416</span>    // If the old servers aren't present, lets assign those regions later.<a name="line.1416"></a>
-<span class="sourceLineNo">1417</span>    List&lt;RegionInfo&gt; randomAssignRegions = Lists.newArrayList();<a name="line.1417"></a>
-<span class="sourceLineNo">1418</span><a name="line.1418"></a>
-<span class="sourceLineNo">1419</span>    int numRandomAssignments = 0;<a name="line.1419"></a>
-<span class="sourceLineNo">1420</span>    int numRetainedAssigments = 0;<a name="line.1420"></a>
-<span class="sourceLineNo">1421</span><a name="line.1421"></a>
-<span class="sourceLineNo">1422</span>    Cluster cluster = createCluster(servers, regions.keySet(), true);<a name="line.1422"></a>
-<span class="sourceLineNo">1423</span><a name="line.1423"></a>
-<span class="sourceLineNo">1424</span>    for (Map.Entry&lt;RegionInfo, ServerName&gt; entry : regions.entrySet()) {<a name="line.1424"></a>
-<span class="sourceLineNo">1425</span>      RegionInfo region = entry.getKey();<a name="line.1425"></a>
-<span class="sourceLineNo">1426</span>      ServerName oldServerName = entry.getValue();<a name="line.1426"></a>
-<span class="sourceLineNo">1427</span>      List&lt;ServerName&gt; localServers = new ArrayList&lt;&gt;();<a name="line.1427"></a>
-<span class="sourceLineNo">1428</span>      if (oldServerName != null) {<a name="line.1428"></a>
-<span class="sourceLineNo">1429</span>        localServers = serversByHostname.get(oldServerName.getHostnameLowerCase());<a name="line.1429"></a>
-<span class="sourceLineNo">1430</span>      }<a name="line.1430"></a>
-<span class="sourceLineNo">1431</span>      if (localServers.isEmpty()) {<a name="line.1431"></a>
-<span class="sourceLineNo">1432</span>        // No servers on the new cluster match up with this hostname, assign randomly, later.<a name="line.1432"></a>
-<span class="sourceLineNo">1433</span>        randomAssignRegions.add(region);<a name="line.1433"></a>
-<span class="sourceLineNo">1434</span>        if (oldServerName != null) {<a name="line.1434"></a>
-<span class="sourceLineNo">1435</span>          oldHostsNoLongerPresent.add(oldServerName.getHostnameLowerCase());<a name="line.1435"></a>
-<span class="sourceLineNo">1436</span>        }<a name="line.1436"></a>
-<span class="sourceLineNo">1437</span>      } else if (localServers.size() == 1) {<a name="line.1437"></a>
-<span class="sourceLineNo">1438</span>        // the usual case - one new server on same host<a name="line.1438"></a>
-<span class="sourceLineNo">1439</span>        ServerName target = localServers.get(0);<a name="line.1439"></a>
-<span class="sourceLineNo">1440</span>        assignments.get(target).add(region);<a name="line.1440"></a>
-<span class="sourceLineNo">1441</span>        numRetainedAssigments++;<a name="line.1441"></a>
-<span class="sourceLineNo">1442</span>      } else {<a name="line.1442"></a>
-<span class="sourceLineNo">1443</span>        // multiple new servers in the cluster on this same host<a name="line.1443"></a>
-<span class="sourceLineNo">1444</span>        if (localServers.contains(oldServerName)) {<a name="line.1444"></a>
-<span class="sourceLineNo">1445</span>          assignments.get(oldServerName).add(region);<a name="line.1445"></a>
-<span class="sourceLineNo">1446</span>          numRetainedAssigments++;<a name="line.1446"></a>
-<span class="sourceLineNo">1447</span>        } else {<a name="line.1447"></a>
-<span class="sourceLineNo">1448</span>          ServerName target = null;<a name="line.1448"></a>
-<span class="sourceLineNo">1449</span>          for (ServerName tmp : localServers) {<a name="line.1449"></a>
-<span class="sourceLineNo">1450</span>            if (tmp.getPort() == oldServerName.getPort()) {<a name="line.1450"></a>
-<span class="sourceLineNo">1451</span>              target = tmp;<a name="line.1451"></a>
-<span class="sourceLineNo">1452</span>              assignments.get(tmp).add(region);<a name="line.1452"></a>
-<span class="sourceLineNo">1453</span>              numRetainedAssigments++;<a name="line.1453"></a>
-<span class="sourceLineNo">1454</span>              break;<a name="line.1454"></a>
-<span class="sourceLineNo">1455</span>            }<a name="line.1455"></a>
-<span class="sourceLineNo">1456</span>          }<a name="line.1456"></a>
-<span class="sourceLineNo">1457</span>          if (target == null) {<a name="line.1457"></a>
-<span class="sourceLineNo">1458</span>            randomAssignRegions.add(region);<a name="line.1458"></a>
-<span class="sourceLineNo">1459</span>          }<a name="line.1459"></a>
-<span class="sourceLineNo">1460</span>        }<a name="line.1460"></a>
-<span class="sourceLineNo">1461</span>      }<a name="line.1461"></a>
-<span class="sourceLineNo">1462</span>    }<a name="line.1462"></a>
-<span class="sourceLineNo">1463</span><a name="line.1463"></a>
-<span class="sourceLineNo">1464</span>    // If servers from prior assignment aren't present, then lets do randomAssignment on regions.<a name="line.1464"></a>
-<span class="sourceLineNo">1465</span>    if (randomAssignRegions.size() &gt; 0) {<a name="line.1465"></a>
-<span class="sourceLineNo">1466</span>      for (Map.Entry&lt;ServerName, List&lt;RegionInfo&gt;&gt; entry : assignments.entrySet()) {<a name="line.1466"></a>
-<span class="sourceLineNo">1467</span>        ServerName sn = entry.getKey();<a name="line.1467"></a>
-<span class="sourceLineNo">1468</span>        for (RegionInfo region : entry.getValue()) {<a name="line.1468"></a>
-<span class="sourceLineNo">1469</span>          cluster.doAssignRegion(region, sn);<a name="line.1469"></a>
-<span class="sourceLineNo">1470</span>        }<a name="line.1470"></a>
-<span class="sourceLineNo">1471</span>      }<a name="line.1471"></a>
-<span class="sourceLineNo">1472</span>      for (RegionInfo region : randomAssignRegions) {<a name="line.1472"></a>
-<span class="sourceLineNo">1473</span>        ServerName target = randomAssignment(cluster, region, servers);<a name="line.1473"></a>
-<span class="sourceLineNo">1474</span>        assignments.get(target).add(region);<a name="line.1474"></a>
-<span class="sourceLineNo">1475</span>        cluster.doAssignRegion(region, target);<a name="line.1475"></a>
-<span class="sourceLineNo">1476</span>        numRandomAssignments++;<a name="line.1476"></a>
-<span class="sourceLineNo">1477</span>      }<a name="line.1477"></a>
-<span class="sourceLineNo">1478</span>    }<a name="line.1478"></a>
-<span class="sourceLineNo">1479</span><a name="line.1479"></a>
-<span class="sourceLineNo">1480</span>    String randomAssignMsg = "";<a name="line.1480"></a>
-<span class="sourceLineNo">1481</span>    if (numRandomAssignments &gt; 0) {<a name="line.1481"></a>
-<span class="sourceLineNo">1482</span>      randomAssignMsg =<a name="line.1482"></a>
-<span class="sourceLineNo">1483</span>          numRandomAssignments + " regions were assigned "<a name="line.1483"></a>
-<span class="sourceLineNo">1484</span>              + "to random hosts, since the old hosts for these regions are no "<a name="line.1484"></a>
-<span class="sourceLineNo">1485</span>              + "longer present in the cluster. These hosts were:\n  "<a name="line.1485"></a>
-<span class="sourceLineNo">1486</span>              + Joiner.on("\n  ").join(oldHostsNoLongerPresent);<a name="line.1486"></a>
-<span class="sourceLineNo">1487</span>    }<a name="line.1487"></a>
-<span class="sourceLineNo">1488</span><a name="line.1488"></a>
-<span class="sourceLineNo">1489</span>    LOG.info("Reassigned " + regions.size() + " regions. " + numRetainedAssigments<a name="line.1489"></a>
-<span class="sourceLineNo">1490</span>        + " retained the pre-restart assignment. " + randomAssignMsg);<a name="line.1490"></a>
-<span class="sourceLineNo">1491</span>    return assignments;<a name="line.1491"></a>
-<span class="sourceLineNo">1492</span>  }<a name="line.1492"></a>
-<span class="sourceLineNo">1493</span><a name="line.1493"></a>
-<span class="sourceLineNo">1494</span>  @Override<a name="line.1494"></a>
-<span class="sourceLineNo">1495</span>  public void initialize() throws HBaseIOException{<a name="line.1495"></a>
-<span class="sourceLineNo">1496</span>  }<a name="line.1496"></a>
-<span class="sourceLineNo">1497</span><a name="line.1497"></a>
-<span class="sourceLineNo">1498</span>  @Override<a name="line.1498"></a>
-<span class="sourceLineNo">1499</span>  public void regionOnline(RegionInfo regionInfo, ServerName sn) {<a name="line.1499"></a>
+<span class="sourceLineNo">1393</span>    if (regions.isEmpty()) {<a name="line.1393"></a>
+<span class="sourceLineNo">1394</span>      return assignments;<a name="line.1394"></a>
+<span class="sourceLineNo">1395</span>    }<a name="line.1395"></a>
+<span class="sourceLineNo">1396</span><a name="line.1396"></a>
+<span class="sourceLineNo">1397</span>    int numServers = servers == null ? 0 : servers.size();<a name="line.1397"></a>
+<span class="sourceLineNo">1398</span>    if (numServers == 0) {<a name="line.1398"></a>
+<span class="sourceLineNo">1399</span>      LOG.warn("Wanted to do retain assignment but no servers to assign to");<a name="line.1399"></a>
+<span class="sourceLineNo">1400</span>      return null;<a name="line.1400"></a>
+<span class="sourceLineNo">1401</span>    }<a name="line.1401"></a>
+<span class="sourceLineNo">1402</span>    if (numServers == 1) { // Only one server, nothing fancy we can do here<a name="line.1402"></a>
+<span class="sourceLineNo">1403</span>      ServerName server = servers.get(0);<a name="line.1403"></a>
+<span class="sourceLineNo">1404</span>      assignments.put(server, new ArrayList&lt;&gt;(regions.keySet()));<a name="line.1404"></a>
+<span class="sourceLineNo">1405</span>      return assignments;<a name="line.1405"></a>
+<span class="sourceLineNo">1406</span>    }<a name="line.1406"></a>
+<span class="sourceLineNo">1407</span><a name="line.1407"></a>
+<span class="sourceLineNo">1408</span>    // Group all of the old assignments by their hostname.<a name="line.1408"></a>
+<span class="sourceLineNo">1409</span>    // We can't group directly by ServerName since the servers all have<a name="line.1409"></a>
+<span class="sourceLineNo">1410</span>    // new start-codes.<a name="line.1410"></a>
+<span class="sourceLineNo">1411</span><a name="line.1411"></a>
+<span class="sourceLineNo">1412</span>    // Group the servers by their hostname. It's possible we have multiple<a name="line.1412"></a>
+<span class="sourceLineNo">1413</span>    // servers on the same host on different ports.<a name="line.1413"></a>
+<span class="sourceLineNo">1414</span>    ArrayListMultimap&lt;String, ServerName&gt; serversByHostname = ArrayListMultimap.create();<a name="line.1414"></a>
+<span class="sourceLineNo">1415</span>    for (ServerName server : servers) {<a name="line.1415"></a>
+<span class="sourceLineNo">1416</span>      assignments.put(server, new ArrayList&lt;&gt;());<a name="line.1416"></a>
+<span class="sourceLineNo">1417</span>      serversByHostname.put(server.getHostnameLowerCase(), server);<a name="line.1417"></a>
+<span class="sourceLineNo">1418</span>    }<a name="line.1418"></a>
+<span class="sourceLineNo">1419</span><a name="line.1419"></a>
+<span class="sourceLineNo">1420</span>    // Collection of the hostnames that used to have regions<a name="line.1420"></a>
+<span class="sourceLineNo">1421</span>    // assigned, but for which we no longer have any RS running<a name="line.1421"></a>
+<span class="sourceLineNo">1422</span>    // after the cluster restart.<a name="line.1422"></a>
+<span class="sourceLineNo">1423</span>    Set&lt;String&gt; oldHostsNoLongerPresent = Sets.newTreeSet();<a name="line.1423"></a>
+<span class="sourceLineNo">1424</span><a name="line.1424"></a>
+<span class="sourceLineNo">1425</span>    // If the old servers aren't present, lets assign those regions later.<a name="line.1425"></a>
+<span class="sourceLineNo">1426</span>    List&lt;RegionInfo&gt; randomAssignRegions = Lists.newArrayList();<a name="line.1426"></a>
+<span class="sourceLineNo">1427</span><a name="line.1427"></a>
+<span class="sourceLineNo">1428</span>    int numRandomAssignments = 0;<a name="line.1428"></a>
+<span class="sourceLineNo">1429</span>    int numRetainedAssigments = 0;<a name="line.1429"></a>
+<span class="sourceLineNo">1430</span><a name="line.1430"></a>
+<span class="sourceLineNo">1431</span>    for (Map.Entry&lt;RegionInfo, ServerName&gt; entry : regions.entrySet()) {<a name="line.1431"></a>
+<span class="sourceLineNo">1432</span>      RegionInfo region = entry.getKey();<a name="line.1432"></a>
+<span class="sourceLineNo">1433</span>      ServerName oldServerName = entry.getValue();<a name="line.1433"></a>
+<span class="sourceLineNo">1434</span>      List&lt;ServerName&gt; localServers = new ArrayList&lt;&gt;();<a name="line.1434"></a>
+<span class="sourceLineNo">1435</span>      if (oldServerName != null) {<a name="line.1435"></a>
+<span class="sourceLineNo">1436</span>        localServers = serversByHostname.get(oldServerName.getHostnameLowerCase());<a name="line.1436"></a>
+<span class="sourceLineNo">1437</span>      }<a name="line.1437"></a>
+<span class="sourceLineNo">1438</span>      if (localServers.isEmpty()) {<a name="line.1438"></a>
+<span class="sourceLineNo">1439</span>        // No servers on the new cluster match up with this hostname, assign randomly, later.<a name="line.1439"></a>
+<span class="sourceLineNo">1440</span>        randomAssignRegions.add(region);<a name="line.1440"></a>
+<span class="sourceLineNo">1441</span>        if (oldServerName != null) {<a name="line.1441"></a>
+<span class="sourceLineNo">1442</span>          oldHostsNoLongerPresent.add(oldServerName.getHostnameLowerCase());<a name="line.1442"></a>
+<span class="sourceLineNo">1443</span>        }<a name="line.1443"></a>
+<span class="sourceLineNo">1444</span>      } else if (localServers.size() == 1) {<a name="line.1444"></a>
+<span class="sourceLineNo">1445</span>        // the usual case - one new server on same host<a name="line.1445"></a>
+<span class="sourceLineNo">1446</span>        ServerName target = localServers.get(0);<a name="line.1446"></a>
+<span class="sourceLineNo">1447</span>        assignments.get(target).add(region);<a name="line.1447"></a>
+<span class="sourceLineNo">1448</span>        numRetainedAssigments++;<a name="line.1448"></a>
+<span class="sourceLineNo">1449</span>      } else {<a name="line.1449"></a>
+<span class="sourceLineNo">1450</span>        // multiple new servers in the cluster on this same host<a name="line.1450"></a>
+<span class="sourceLineNo">1451</span>        if (localServers.contains(oldServerName)) {<a name="line.1451"></a>
+<span class="sourceLineNo">1452</span>          assignments.get(oldServerName).add(region);<a name="line.1452"></a>
+<span class="sourceLineNo">1453</span>          numRetainedAssigments++;<a name="line.1453"></a>
+<span class="sourceLineNo">1454</span>        } else {<a name="line.1454"></a>
+<span class="sourceLineNo">1455</span>          ServerName target = null;<a name="line.1455"></a>
+<span class="sourceLineNo">1456</span>          for (ServerName tmp : localServers) {<a name="line.1456"></a>
+<span class="sourceLineNo">1457</span>            if (tmp.getPort() == oldServerName.getPort()) {<a name="line.1457"></a>
+<span class="sourceLineNo">1458</span>              target = tmp;<a name="line.1458"></a>
+<span class="sourceLineNo">1459</span>              assignments.get(tmp).add(region);<a name="line.1459"></a>
+<span class="sourceLineNo">1460</span>              numRetainedAssigments++;<a name="line.1460"></a>
+<span class="sourceLineNo">1461</span>              break;<a name="line.1461"></a>
+<span class="sourceLineNo">1462</span>            }<a name="line.1462"></a>
+<span class="sourceLineNo">1463</span>          }<a name="line.1463"></a>
+<span class="sourceLineNo">1464</span>          if (target == null) {<a name="line.1464"></a>
+<span class="sourceLineNo">1465</span>            randomAssignRegions.add(region);<a name="line.1465"></a>
+<span class="sourceLineNo">1466</span>          }<a name="line.1466"></a>
+<span class="sourceLineNo">1467</span>        }<a name="line.1467"></a>
+<span class="sourceLineNo">1468</span>      }<a name="line.1468"></a>
+<span class="sourceLineNo">1469</span>    }<a name="line.1469"></a>
+<span class="sourceLineNo">1470</span><a name="line.1470"></a>
+<span class="sourceLineNo">1471</span>    // If servers from prior assignment aren't present, then lets do randomAssignment on regions.<a name="line.1471"></a>
+<span class="sourceLineNo">1472</span>    if (randomAssignRegions.size() &gt; 0) {<a name="line.1472"></a>
+<span class="sourceLineNo">1473</span>      Cluster cluster = createCluster(servers, regions.keySet());<a name="line.1473"></a>
+<span class="sourceLineNo">1474</span>      for (Map.Entry&lt;ServerName, List&lt;RegionInfo&gt;&gt; entry : assignments.entrySet()) {<a name="line.1474"></a>
+<span class="sourceLineNo">1475</span>        ServerName sn = entry.getKey();<a name="line.1475"></a>
+<span class="sourceLineNo">1476</span>        for (RegionInfo region : entry.getValue()) {<a name="line.1476"></a>
+<span class="sourceLineNo">1477</span>          cluster.doAssignRegion(region, sn);<a name="line.1477"></a>
+<span class="sourceLineNo">1478</span>        }<a name="line.1478"></a>
+<span class="sourceLineNo">1479</span>      }<a name="line.1479"></a>
+<span class="sourceLineNo">1480</span>      for (RegionInfo region : randomAssignRegions) {<a name="line.1480"></a>
+<span class="sourceLineNo">1481</span>        ServerName target = randomAssignment(cluster, region, servers);<a name="line.1481"></a>
+<span class="sourceLineNo">1482</span>        assignments.get(target).add(region);<a name="line.1482"></a>
+<span class="sourceLineNo">1483</span>        cluster.doAssignRegion(region, target);<a name="line.1483"></a>
+<span class="sourceLineNo">1484</span>        numRandomAssignments++;<a name="line.1484"></a>
+<span class="sourceLineNo">1485</span>      }<a name="line.1485"></a>
+<span class="sourceLineNo">1486</span>    }<a name="line.1486"></a>
+<span class="sourceLineNo">1487</span><a name="line.1487"></a>
+<span class="sourceLineNo">1488</span>    String randomAssignMsg = "";<a name="line.1488"></a>
+<span class="sourceLineNo">1489</span>    if (numRandomAssignments &gt; 0) {<a name="line.1489"></a>
+<span class="sourceLineNo">1490</span>      randomAssignMsg =<a name="line.1490"></a>
+<span class="sourceLineNo">1491</span>          numRandomAssignments + " regions were assigned "<a name="line.1491"></a>
+<span class="sourceLineNo">1492</span>              + "to random hosts, since the old hosts for these regions are no "<a name="line.1492"></a>
+<span class="sourceLineNo">1493</span>              + "longer present in the cluster. These hosts were:\n  "<a name="line.1493"></a>
+<span class="sourceLineNo">1494</span>              + Joiner.on("\n  ").join(oldHostsNoLongerPresent);<a name="line.1494"></a>
+<span class="sourceLineNo">1495</span>    }<a name="line.1495"></a>
+<span class="sourceLineNo">1496</span><a name="line.1496"></a>
+<span class="sourceLineNo">1497</span>    LOG.info("Reassigned " + regions.size() + " regions. " + numRetainedAssigments<a name="line.1497"></a>
+<span class="sourceLineNo">1498</span>        + " retained the pre-restart assignment. " + randomAssignMsg);<a name="line.1498"></a>
+<span class="sourceLineNo">1499</span>    return assignments;<a name="line.1499"></a>
 <span class="sourceLineNo">1500</span>  }<a name="line.1500"></a>
 <span class="sourceLineNo">1501</span><a name="line.1501"></a>
 <span class="sourceLineNo">1502</span>  @Override<a name="line.1502"></a>
-<span class="sourceLineNo">1503</span>  public void regionOffline(RegionInfo regionInfo) {<a name="line.1503"></a>
+<span class="sourceLineNo">1503</span>  public void initialize() throws HBaseIOException{<a name="line.1503"></a>
 <span class="sourceLineNo">1504</span>  }<a name="line.1504"></a>
 <span class="sourceLineNo">1505</span><a name="line.1505"></a>
 <span class="sourceLineNo">1506</span>  @Override<a name="line.1506"></a>
-<span class="sourceLineNo">1507</span>  public boolean isStopped() {<a name="line.1507"></a>
-<span class="sourceLineNo">1508</span>    return stopped;<a name="line.1508"></a>
-<span class="sourceLineNo">1509</span>  }<a name="line.1509"></a>
-<span class="sourceLineNo">1510</span><a name="line.1510"></a>
-<span class="sourceLineNo">1511</span>  @Override<a name="line.1511"></a>
-<span class="sourceLineNo">1512</span>  public void stop(String why) {<a name="line.1512"></a>
-<span class="sourceLineNo">1513</span>    LOG.info("Load Balancer stop requested: "+why);<a name="line.1513"></a>
-<span class="sourceLineNo">1514</span>    stopped = true;<a name="line.1514"></a>
-<span class="sourceLineNo">1515</span>  }<a name="line.1515"></a>
-<span class="sourceLineNo">1516</span><a name="line.1516"></a>
-<span class="sourceLineNo">1517</span>  /**<a name="line.1517"></a>
-<span class="sourceLineNo">1518</span>   * Used to assign a single region to a random server.<a name="line.1518"></a>
-<span class="sourceLineNo">1519</span>   */<a name="line.1519"></a>
-<span class="sourceLineNo">1520</span>  private ServerName randomAssignment(Cluster cluster, RegionInfo regionInfo,<a name="line.1520"></a>
-<span class="sourceLineNo">1521</span>      List&lt;ServerName&gt; servers) {<a name="line.1521"></a>
-<span class="sourceLineNo">1522</span>    int numServers = servers.size(); // servers is not null, numServers &gt; 1<a name="line.1522"></a>
-<span class="sourceLineNo">1523</span>    ServerName sn = null;<a name="line.1523"></a>
-<span class="sourceLineNo">1524</span>    final int maxIterations = numServers * 4;<a name="line.1524"></a>
-<span class="sourceLineNo">1525</span>    int iterations = 0;<a name="line.1525"></a>
-<span class="sourceLineNo">1526</span><a name="line.1526"></a>
-<span class="sourceLineNo">1527</span>    do {<a name="line.1527"></a>
-<span class="sourceLineNo">1528</span>      int i = RANDOM.nextInt(numServers);<a name="line.1528"></a>
-<span class="sourceLineNo">1529</span>      sn = servers.get(i);<a name="line.1529"></a>
-<span class="sourceLineNo">1530</span>    } while (cluster.wouldLowerAvailability(regionInfo, sn)<a name="line.1530"></a>
-<span class="sourceLineNo">1531</span>        &amp;&amp; iterations++ &lt; maxIterations);<a name="line.1531"></a>
-<span class="sourceLineNo">1532</span>    cluster.doAssignRegion(regionInfo, sn);<a name="line.1532"></a>
-<span class="sourceLineNo">1533</span>    return sn;<a name="line.1533"></a>
-<span class="sourceLineNo">1534</span>  }<a name="line.1534"></a>
-<span class="sourceLineNo">1535</span><a name="line.1535"></a>
-<span class="sourceLineNo">1536</span>  /**<a name="line.1536"></a>
-<span class="sourceLineNo">1537</span>   * Round robin a list of regions to a list of servers<a name="line.1537"></a>
-<span class="sourceLineNo">1538</span>   */<a name="line.1538"></a>
-<span class="sourceLineNo">1539</span>  private void roundRobinAssignment(Cluster cluster, List&lt;RegionInfo&gt; regions,<a name="line.1539"></a>
-<span class="sourceLineNo">1540</span>      List&lt;RegionInfo&gt; unassignedRegions, List&lt;ServerName&gt; servers,<a name="line.1540"></a>
-<span class="sourceLineNo">1541</span>      Map&lt;ServerName, List&lt;RegionInfo&gt;&gt; assignments) {<a name="line.1541"></a>
-<span class="sourceLineNo">1542</span><a name="line.1542"></a>
-<span class="sourceLineNo">1543</span>    int numServers = servers.size();<a name="line.1543"></a>
-<span class="sourceLineNo">1544</span>    int numRegions = regions.size();<a name="line.1544"></a>
-<span class="sourceLineNo">1545</span>    int max = (int) Math.ceil((float) numRegions / numServers);<a name="line.1545"></a>
-<span class="sourceLineNo">1546</span>    int serverIdx = 0;<a name="line.1546"></a>
-<span class="sourceLineNo">1547</span>    if (numServers &gt; 1) {<a name="line.1547"></a>
-<span class="sourceLineNo">1548</span>      serverIdx = RANDOM.nextInt(numServers);<a name="line.1548"></a>
-<span class="sourceLineNo">1549</span>    }<a name="line.1549"></a>
-<span class="sourceLineNo">1550</span>    int regionIdx = 0;<a name="line.1550"></a>
-<span class="sourceLineNo">1551</span><a name="line.1551"></a>
-<span class="sourceLineNo">1552</span>    for (int j = 0; j &lt; numServers; j++) {<a name="line.1552"></a>
-<span class="sourceLineNo">1553</span>      ServerName server = servers.get((j + serverIdx) % numServers);<a name="line.1553"></a>
-<span class="sourceLineNo">1554</span>      List&lt;RegionInfo&gt; serverRegions = new ArrayList&lt;&gt;(max);<a name="line.1554"></a>
-<span class="sourceLineNo">1555</span>      for (int i = regionIdx; i &lt; numRegions; i += numServers) {<a name="line.1555"></a>
-<span class="sourceLineNo">1556</span>        RegionInfo region = regions.get(i % numRegions);<a name="line.1556"></a>
-<span class="sourceLineNo">1557</span>        if (cluster.wouldLowerAvailability(region, server)) {<a name="line.1557"></a>
-<span class="sourceLineNo">1558</span>          unassignedRegions.add(region);<a name="line.1558"></a>
-<span class="sourceLineNo">1559</span>        } else {<a name="line.1559"></a>
-<span class="sourceLineNo">1560</span>          serverRegions.add(region);<a name="line.1560"></a>
-<span class="sourceLineNo">1561</span>          cluster.doAssignRegion(region, server);<a name="line.1561"></a>
-<span class="sourceLineNo">1562</span>        }<a name="line.1562"></a>
-<span class="sourceLineNo">1563</span>      }<a name="line.1563"></a>
-<span class="sourceLineNo">1564</span>      assignments.put(server, serverRegions);<a name="line.1564"></a>
-<span class="sourceLineNo">1565</span>      regionIdx++;<a name="line.1565"></a>
-<span class="sourceLineNo">1566</span>    }<a name="line.1566"></a>
-<span class="sourceLineNo">1567</span>  }<a name="line.1567"></a>
-<span class="sourceLineNo">1568</span><a name="line.1568"></a>
-<span class="sourceLineNo">1569</span>  protected Map&lt;ServerName, List&lt;RegionInfo&gt;&gt; getRegionAssignmentsByServer(<a name="line.1569"></a>
-<span class="sourceLineNo">1570</span>    Collection&lt;RegionInfo&gt; regions) {<a name="line.1570"></a>
-<span class="sourceLineNo">1571</span>    if (this.services != null &amp;&amp; this.services.getAssignmentManager() != null) {<a name="line.1571"></a>
-<span class="sourceLineNo">1572</span>      return this.services.getAssignmentManager().getSnapShotOfAssignment(regions);<a name="line.1572"></a>
-<span class="sourceLineNo">1573</span>    } else {<a name="line.1573"></a>
-<span class="sourceLineNo">1574</span>      return new HashMap&lt;&gt;();<a name="line.1574"></a>
-<span class="sourceLineNo">1575</span>    }<a name="line.1575"></a>
-<span class="sourceLineNo">1576</span>  }<a name="line.1576"></a>
-<span class="sourceLineNo">1577</span><a name="line.1577"></a>
-<span class="sourceLineNo">1578</span>  @Override<a name="line.1578"></a>
-<span class="sourceLineNo">1579</span>  public void onConfigurationChange(Configuration conf) {<a name="line.1579"></a>
-<span class="sourceLineNo">1580</span>  }<a name="line.1580"></a>
-<span class="sourceLineNo">1581</span>}<a name="line.1581"></a>
+<span class="sourceLineNo">1507</span>  public void regionOnline(RegionInfo regionInfo, ServerName sn) {<a name="line.1507"></a>
+<span class="sourceLineNo">1508</span>  }<a name="line.1508"></a>
+<span class="sourceLineNo">1509</span><a name="line.1509"></a>
+<span class="sourceLineNo">1510</span>  @Override<a name="line.1510"></a>
+<span class="sourceLineNo">1511</span>  public void regionOffline(RegionInfo regionInfo) {<a name="line.1511"></a>
+<span class="sourceLineNo">1512</span>  }<a name="line.1512"></a>
+<span class="sourceLineNo">1513</span><a name="line.1513"></a>
+<span class="sourceLineNo">1514</span>  @Override<a name="line.1514"></a>
+<span class="sourceLineNo">1515</span>  public boolean isStopped() {<a name="line.1515"></a>
+<span class="sourceLineNo">1516</span>    return stopped;<a name="line.1516"></a>
+<span class="sourceLineNo">1517</span>  }<a name="line.1517"></a>
+<span class="sourceLineNo">1518</span><a name="line.1518"></a>
+<span class="sourceLineNo">1519</span>  @Override<a name="line.1519"></a>
+<span class="sourceLineNo">1520</span>  public void stop(String why) {<a name="line.1520"></a>
+<span class="sourceLineNo">1521</span>    LOG.info("Load Balancer stop requested: "+why);<a name="line.1521"></a>
+<span class="sourceLineNo">1522</span>    stopped = true;<a name="line.1522"></a>
+<span class="sourceLineNo">1523</span>  }<a name="line.1523"></a>
+<span class="sourceLineNo">1524</span><a name="line.1524"></a>
+<span class="sourceLineNo">1525</span>  /**<a name="line.1525"></a>
+<span class="sourceLineNo">1526</span>   * Used to assign a single region to a random server.<a name="line.1526"></a>
+<span class="sourceLineNo">1527</span>   */<a name="line.1527"></a>
+<span class="sourceLineNo">1528</span>  private ServerName randomAssignment(Cluster cluster, RegionInfo regionInfo,<a name="line.1528"></a>
+<span class="sourceLineNo">1529</span>      List&lt;ServerName&gt; servers) {<a name="line.1529"></a>
+<span class="sourceLineNo">1530</span>    int numServers = servers.size(); // servers is not null, numServers &gt; 1<a name="line.1530"></a>
+<span class="sourceLineNo">1531</span>    ServerName sn = null;<a name="line.1531"></a>
+<span class="sourceLineNo">1532</span>    final int maxIterations = numServers * 4;<a name="line.1532"></a>
+<span class="sourceLineNo">1533</span>    int iterations = 0;<a name="line.1533"></a>
+<span class="sourceLineNo">1534</span><a name="line.1534"></a>
+<span class="sourceLineNo">1535</span>    do {<a name="line.1535"></a>
+<span class="sourceLineNo">1536</span>      int i = RANDOM.nextInt(numServers);<a name="line.1536"></a>
+<span class="sourceLineNo">1537</span>      sn = servers.get(i);<a name="line.1537"></a>
+<span class="sourceLineNo">1538</span>    } while (cluster.wouldLowerAvailability(regionInfo, sn)<a name="line.1538"></a>
+<span class="sourceLineNo">1539</span>        &amp;&amp; iterations++ &lt; maxIterations);<a name="line.1539"></a>
+<span class="sourceLineNo">1540</span>    cluster.doAssignRegion(regionInfo, sn);<a name="line.1540"></a>
+<span class="sourceLineNo">1541</span>    return sn;<a name="line.1541"></a>
+<span class="sourceLineNo">1542</span>  }<a name="line.1542"></a>
+<span class="sourceLineNo">1543</span><a name="line.1543"></a>
+<span class="sourceLineNo">1544</span>  /**<a name="line.1544"></a>
+<span class="sourceLineNo">1545</span>   * Round robin a list of regions to a list of servers<a name="line.1545"></a>
+<span class="sourceLineNo">1546</span>   */<a name="line.1546"></a>
+<span class="sourceLineNo">1547</span>  private void roundRobinAssignment(Cluster cluster, List&lt;RegionInfo&gt; regions,<a name="line.1547"></a>
+<span class="sourceLineNo">1548</span>      List&lt;RegionInfo&gt; unassignedRegions, List&lt;ServerName&gt; servers,<a name="line.1548"></a>
+<span class="sourceLineNo">1549</span>      Map&lt;ServerName, List&lt;RegionInfo&gt;&gt; assignments) {<a name="line.1549"></a>
+<span class="sourceLineNo">1550</span><a name="line.1550"></a>
+<span class="sourceLineNo">1551</span>    int numServers = servers.size();<a name="line.1551"></a>
+<span class="sourceLineNo">1552</span>    int numRegions = regions.size();<a name="line.1552"></a>
+<span class="sourceLineNo">1553</span>    int max = (int) Math.ceil((float) numRegions / numServers);<a name="line.1553"></a>
+<span class="sourceLineNo">1554</span>    int serverIdx = 0;<a name="line.1554"></a>
+<span class="sourceLineNo">1555</span>    if (numServers &gt; 1) {<a name="line.1555"></a>
+<span class="sourceLineNo">1556</span>      serverIdx = RANDOM.nextInt(numServers);<a name="line.1556"></a>
+<span class="sourceLineNo">1557</span>    }<a name="line.1557"></a>
+<span class="sourceLineNo">1558</span>    int regionIdx = 0;<a name="line.1558"></a>
+<span class="sourceLineNo">1559</span><a name="line.1559"></a>
+<span class="sourceLineNo">1560</span>    for (int j = 0; j &lt; numServers; j++) {<a name="line.1560"></a>
+<span class="sourceLineNo">1561</span>      ServerName server = servers.get((j + serverIdx) % numServers);<a name="line.1561"></a>
+<span class="sourceLineNo">1562</span>      List&lt;RegionInfo&gt; serverRegions = new ArrayList&lt;&gt;(max);<a name="line.1562"></a>
+<span class="sourceLineNo">1563</span>      for (int i = regionIdx; i &lt; numRegions; i += numServers) {<a name="line.1563"></a>
+<span class="sourceLineNo">1564</span>        RegionInfo region = regions.get(i % numRegions);<a name="line.1564"></a>
+<span class="sourceLineNo">1565</span>        if (cluster.wouldLowerAvailability(region, server)) {<a name="line.1565"></a>
+<span class="sourceLineNo">1566</span>          unassignedRegions.add(region);<a name="line.1566"></a>
+<span class="sourceLineNo">1567</span>        } else {<a name="line.1567"></a>
+<span class="sourceLineNo">1568</span>          serverRegions.add(region);<a name="line.1568"></a>
+<span class="sourceLineNo">1569</span>          cluster.doAssignRegion(region, server);<a name="line.1569"></a>
+<span class="sourceLineNo">1570</span>        }<a name="line.1570"></a>
+<span class="sourceLineNo">1571</span>      }<a name="line.1571"></a>
+<span class="sourceLineNo">1572</span>      assignments.put(server, serverRegions);<a name="line.1572"></a>
+<span class="sourceLineNo">1573</span>      regionIdx++;<a name="line.1573"></a>
+<span class="sourceLineNo">1574</span>    }<a name="line.1574"></a>
+<span class="sourceLineNo">1575</span>  }<a name="line.1575"></a>
+<span class="sourceLineNo">1576</span><a name="line.1576"></a>
+<span class="sourceLineNo">1577</span>  protected Map&lt;ServerName, List&lt;RegionInfo&gt;&gt; getRegionAssignmentsByServer(<a name="line.1577"></a>
+<span class="sourceLineNo">1578</span>    Collection&lt;RegionInfo&gt; regions) {<a name="line.1578"></a>
+<span class="sourceLineNo">1579</span>    if (this.services != null &amp;&amp; this.services.getAssignmentManager() != null) {<a name="line.1579"></a>
+<span class="sourceLineNo">1580</span>      return this.services.getAssignmentManager().getSnapShotOfAssignment(regions);<a name="line.1580"></a>
+<span class="sourceLineNo">1581</span>    } else {<a name="line.1581"></a>
+<span class="sourceLineNo">1582</span>      return new HashMap&lt;&gt;();<a name="line.1582"></a>
+<span class="sourceLineNo">1583</span>    }<a name="line.1583"></a>
+<span class="sourceLineNo">1584</span>  }<a name="line.1584"></a>
+<span class="sourceLineNo">1585</span><a name="line.1585"></a>
+<span class="sourceLineNo">1586</span>  @Override<a name="line.1586"></a>
+<span class="sourceLineNo">1587</span>  public void onConfigurationChange(Configuration conf) {<a name="line.1587"></a>
+<span class="sourceLineNo">1588</span>  }<a name="line.1588"></a>
+<span class="sourceLineNo">1589</span>}<a name="line.1589"></a>
 
 
 


[20/29] hbase-site git commit: Published site at 477f9fdb32873387231c5fbbff130ba8bf7b5d68.

Posted by gi...@apache.org.
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/621479e1/devapidocs/src-html/org/apache/hadoop/hbase/master/HMaster.InitializationMonitor.html
----------------------------------------------------------------------
diff --git a/devapidocs/src-html/org/apache/hadoop/hbase/master/HMaster.InitializationMonitor.html b/devapidocs/src-html/org/apache/hadoop/hbase/master/HMaster.InitializationMonitor.html
index 2b1b6c6..adaa381 100644
--- a/devapidocs/src-html/org/apache/hadoop/hbase/master/HMaster.InitializationMonitor.html
+++ b/devapidocs/src-html/org/apache/hadoop/hbase/master/HMaster.InitializationMonitor.html
@@ -1011,2651 +1011,2662 @@
 <span class="sourceLineNo">1003</span>    }<a name="line.1003"></a>
 <span class="sourceLineNo">1004</span><a name="line.1004"></a>
 <span class="sourceLineNo">1005</span>    zombieDetector.interrupt();<a name="line.1005"></a>
-<span class="sourceLineNo">1006</span>  }<a name="line.1006"></a>
-<span class="sourceLineNo">1007</span><a name="line.1007"></a>
-<span class="sourceLineNo">1008</span>  /**<a name="line.1008"></a>
-<span class="sourceLineNo">1009</span>   * Adds the {@code MasterSpaceQuotaObserver} to the list of configured Master observers to<a name="line.1009"></a>
-<span class="sourceLineNo">1010</span>   * automatically remove space quotas for a table when that table is deleted.<a name="line.1010"></a>
-<span class="sourceLineNo">1011</span>   */<a name="line.1011"></a>
-<span class="sourceLineNo">1012</span>  @VisibleForTesting<a name="line.1012"></a>
-<span class="sourceLineNo">1013</span>  public void updateConfigurationForSpaceQuotaObserver(Configuration conf) {<a name="line.1013"></a>
-<span class="sourceLineNo">1014</span>    // We're configured to not delete quotas on table deletion, so we don't need to add the obs.<a name="line.1014"></a>
-<span class="sourceLineNo">1015</span>    if (!conf.getBoolean(<a name="line.1015"></a>
-<span class="sourceLineNo">1016</span>          MasterSpaceQuotaObserver.REMOVE_QUOTA_ON_TABLE_DELETE,<a name="line.1016"></a>
-<span class="sourceLineNo">1017</span>          MasterSpaceQuotaObserver.REMOVE_QUOTA_ON_TABLE_DELETE_DEFAULT)) {<a name="line.1017"></a>
-<span class="sourceLineNo">1018</span>      return;<a name="line.1018"></a>
-<span class="sourceLineNo">1019</span>    }<a name="line.1019"></a>
-<span class="sourceLineNo">1020</span>    String[] masterCoprocs = conf.getStrings(CoprocessorHost.MASTER_COPROCESSOR_CONF_KEY);<a name="line.1020"></a>
-<span class="sourceLineNo">1021</span>    final int length = null == masterCoprocs ? 0 : masterCoprocs.length;<a name="line.1021"></a>
-<span class="sourceLineNo">1022</span>    String[] updatedCoprocs = new String[length + 1];<a name="line.1022"></a>
-<span class="sourceLineNo">1023</span>    if (length &gt; 0) {<a name="line.1023"></a>
-<span class="sourceLineNo">1024</span>      System.arraycopy(masterCoprocs, 0, updatedCoprocs, 0, masterCoprocs.length);<a name="line.1024"></a>
-<span class="sourceLineNo">1025</span>    }<a name="line.1025"></a>
-<span class="sourceLineNo">1026</span>    updatedCoprocs[length] = MasterSpaceQuotaObserver.class.getName();<a name="line.1026"></a>
-<span class="sourceLineNo">1027</span>    conf.setStrings(CoprocessorHost.MASTER_COPROCESSOR_CONF_KEY, updatedCoprocs);<a name="line.1027"></a>
-<span class="sourceLineNo">1028</span>  }<a name="line.1028"></a>
-<span class="sourceLineNo">1029</span><a name="line.1029"></a>
-<span class="sourceLineNo">1030</span>  private void initMobCleaner() {<a name="line.1030"></a>
-<span class="sourceLineNo">1031</span>    this.expiredMobFileCleanerChore = new ExpiredMobFileCleanerChore(this);<a name="line.1031"></a>
-<span class="sourceLineNo">1032</span>    getChoreService().scheduleChore(expiredMobFileCleanerChore);<a name="line.1032"></a>
-<span class="sourceLineNo">1033</span><a name="line.1033"></a>
-<span class="sourceLineNo">1034</span>    int mobCompactionPeriod = conf.getInt(MobConstants.MOB_COMPACTION_CHORE_PERIOD,<a name="line.1034"></a>
-<span class="sourceLineNo">1035</span>        MobConstants.DEFAULT_MOB_COMPACTION_CHORE_PERIOD);<a name="line.1035"></a>
-<span class="sourceLineNo">1036</span>    if (mobCompactionPeriod &gt; 0) {<a name="line.1036"></a>
-<span class="sourceLineNo">1037</span>      this.mobCompactChore = new MobCompactionChore(this, mobCompactionPeriod);<a name="line.1037"></a>
-<span class="sourceLineNo">1038</span>      getChoreService().scheduleChore(mobCompactChore);<a name="line.1038"></a>
-<span class="sourceLineNo">1039</span>    } else {<a name="line.1039"></a>
-<span class="sourceLineNo">1040</span>      LOG<a name="line.1040"></a>
-<span class="sourceLineNo">1041</span>        .info("The period is " + mobCompactionPeriod + " seconds, MobCompactionChore is disabled");<a name="line.1041"></a>
-<span class="sourceLineNo">1042</span>    }<a name="line.1042"></a>
-<span class="sourceLineNo">1043</span>    this.mobCompactThread = new MasterMobCompactionThread(this);<a name="line.1043"></a>
-<span class="sourceLineNo">1044</span>  }<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>   * Create a {@link MasterMetaBootstrap} instance.<a name="line.1047"></a>
-<span class="sourceLineNo">1048</span>   */<a name="line.1048"></a>
-<span class="sourceLineNo">1049</span>  MasterMetaBootstrap createMetaBootstrap(final HMaster master, final MonitoredTask status) {<a name="line.1049"></a>
-<span class="sourceLineNo">1050</span>    // We put this out here in a method so can do a Mockito.spy and stub it out<a name="line.1050"></a>
-<span class="sourceLineNo">1051</span>    // w/ a mocked up MasterMetaBootstrap.<a name="line.1051"></a>
-<span class="sourceLineNo">1052</span>    return new MasterMetaBootstrap(master, status);<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>  /**<a name="line.1055"></a>
-<span class="sourceLineNo">1056</span>   * Create a {@link ServerManager} instance.<a name="line.1056"></a>
-<span class="sourceLineNo">1057</span>   */<a name="line.1057"></a>
-<span class="sourceLineNo">1058</span>  ServerManager createServerManager(final MasterServices master) throws IOException {<a name="line.1058"></a>
-<span class="sourceLineNo">1059</span>    // We put this out here in a method so can do a Mockito.spy and stub it out<a name="line.1059"></a>
-<span class="sourceLineNo">1060</span>    // w/ a mocked up ServerManager.<a name="line.1060"></a>
-<span class="sourceLineNo">1061</span>    setupClusterConnection();<a name="line.1061"></a>
-<span class="sourceLineNo">1062</span>    return new ServerManager(master);<a name="line.1062"></a>
-<span class="sourceLineNo">1063</span>  }<a name="line.1063"></a>
-<span class="sourceLineNo">1064</span><a name="line.1064"></a>
-<span class="sourceLineNo">1065</span>  private void waitForRegionServers(final MonitoredTask status)<a name="line.1065"></a>
-<span class="sourceLineNo">1066</span>      throws IOException, InterruptedException {<a name="line.1066"></a>
-<span class="sourceLineNo">1067</span>    this.serverManager.waitForRegionServers(status);<a name="line.1067"></a>
-<span class="sourceLineNo">1068</span>    // Check zk for region servers that are up but didn't register<a name="line.1068"></a>
-<span class="sourceLineNo">1069</span>    for (ServerName sn: this.regionServerTracker.getOnlineServers()) {<a name="line.1069"></a>
-<span class="sourceLineNo">1070</span>      // The isServerOnline check is opportunistic, correctness is handled inside<a name="line.1070"></a>
-<span class="sourceLineNo">1071</span>      if (!this.serverManager.isServerOnline(sn) &amp;&amp;<a name="line.1071"></a>
-<span class="sourceLineNo">1072</span>          serverManager.checkAndRecordNewServer(sn, ServerMetricsBuilder.of(sn))) {<a name="line.1072"></a>
-<span class="sourceLineNo">1073</span>        LOG.info("Registered server found up in zk but who has not yet reported in: " + sn);<a name="line.1073"></a>
-<span class="sourceLineNo">1074</span>      }<a name="line.1074"></a>
-<span class="sourceLineNo">1075</span>    }<a name="line.1075"></a>
-<span class="sourceLineNo">1076</span>  }<a name="line.1076"></a>
-<span class="sourceLineNo">1077</span><a name="line.1077"></a>
-<span class="sourceLineNo">1078</span>  void initClusterSchemaService() throws IOException, InterruptedException {<a name="line.1078"></a>
-<span class="sourceLineNo">1079</span>    this.clusterSchemaService = new ClusterSchemaServiceImpl(this);<a name="line.1079"></a>
-<span class="sourceLineNo">1080</span>    this.clusterSchemaService.startAsync();<a name="line.1080"></a>
-<span class="sourceLineNo">1081</span>    try {<a name="line.1081"></a>
-<span class="sourceLineNo">1082</span>      this.clusterSchemaService.awaitRunning(getConfiguration().getInt(<a name="line.1082"></a>
-<span class="sourceLineNo">1083</span>        HBASE_MASTER_WAIT_ON_SERVICE_IN_SECONDS,<a name="line.1083"></a>
-<span class="sourceLineNo">1084</span>        DEFAULT_HBASE_MASTER_WAIT_ON_SERVICE_IN_SECONDS), TimeUnit.SECONDS);<a name="line.1084"></a>
-<span class="sourceLineNo">1085</span>    } catch (TimeoutException toe) {<a name="line.1085"></a>
-<span class="sourceLineNo">1086</span>      throw new IOException("Timedout starting ClusterSchemaService", toe);<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><a name="line.1089"></a>
-<span class="sourceLineNo">1090</span>  void initQuotaManager() throws IOException {<a name="line.1090"></a>
-<span class="sourceLineNo">1091</span>    MasterQuotaManager quotaManager = new MasterQuotaManager(this);<a name="line.1091"></a>
-<span class="sourceLineNo">1092</span>    this.assignmentManager.setRegionStateListener(quotaManager);<a name="line.1092"></a>
-<span class="sourceLineNo">1093</span>    quotaManager.start();<a name="line.1093"></a>
-<span class="sourceLineNo">1094</span>    this.quotaManager = quotaManager;<a name="line.1094"></a>
-<span class="sourceLineNo">1095</span>  }<a name="line.1095"></a>
-<span class="sourceLineNo">1096</span><a name="line.1096"></a>
-<span class="sourceLineNo">1097</span>  SpaceQuotaSnapshotNotifier createQuotaSnapshotNotifier() {<a name="line.1097"></a>
-<span class="sourceLineNo">1098</span>    SpaceQuotaSnapshotNotifier notifier =<a name="line.1098"></a>
-<span class="sourceLineNo">1099</span>        SpaceQuotaSnapshotNotifierFactory.getInstance().create(getConfiguration());<a name="line.1099"></a>
-<span class="sourceLineNo">1100</span>    return notifier;<a name="line.1100"></a>
-<span class="sourceLineNo">1101</span>  }<a name="line.1101"></a>
-<span class="sourceLineNo">1102</span><a name="line.1102"></a>
-<span class="sourceLineNo">1103</span>  boolean isCatalogJanitorEnabled() {<a name="line.1103"></a>
-<span class="sourceLineNo">1104</span>    return catalogJanitorChore != null ?<a name="line.1104"></a>
-<span class="sourceLineNo">1105</span>      catalogJanitorChore.getEnabled() : false;<a name="line.1105"></a>
+<span class="sourceLineNo">1006</span><a name="line.1006"></a>
+<span class="sourceLineNo">1007</span>    /*<a name="line.1007"></a>
+<span class="sourceLineNo">1008</span>     * After master has started up, lets do balancer post startup initialization. Since this runs<a name="line.1008"></a>
+<span class="sourceLineNo">1009</span>     * in activeMasterManager thread, it should be fine.<a name="line.1009"></a>
+<span class="sourceLineNo">1010</span>     */<a name="line.1010"></a>
+<span class="sourceLineNo">1011</span>    long start = System.currentTimeMillis();<a name="line.1011"></a>
+<span class="sourceLineNo">1012</span>    this.balancer.postMasterStartupInitialize();<a name="line.1012"></a>
+<span class="sourceLineNo">1013</span>    if (LOG.isDebugEnabled()) {<a name="line.1013"></a>
+<span class="sourceLineNo">1014</span>      LOG.debug("Balancer post startup initialization complete, took " + (<a name="line.1014"></a>
+<span class="sourceLineNo">1015</span>          (System.currentTimeMillis() - start) / 1000) + " seconds");<a name="line.1015"></a>
+<span class="sourceLineNo">1016</span>    }<a name="line.1016"></a>
+<span class="sourceLineNo">1017</span>  }<a name="line.1017"></a>
+<span class="sourceLineNo">1018</span><a name="line.1018"></a>
+<span class="sourceLineNo">1019</span>  /**<a name="line.1019"></a>
+<span class="sourceLineNo">1020</span>   * Adds the {@code MasterSpaceQuotaObserver} to the list of configured Master observers to<a name="line.1020"></a>
+<span class="sourceLineNo">1021</span>   * automatically remove space quotas for a table when that table is deleted.<a name="line.1021"></a>
+<span class="sourceLineNo">1022</span>   */<a name="line.1022"></a>
+<span class="sourceLineNo">1023</span>  @VisibleForTesting<a name="line.1023"></a>
+<span class="sourceLineNo">1024</span>  public void updateConfigurationForSpaceQuotaObserver(Configuration conf) {<a name="line.1024"></a>
+<span class="sourceLineNo">1025</span>    // We're configured to not delete quotas on table deletion, so we don't need to add the obs.<a name="line.1025"></a>
+<span class="sourceLineNo">1026</span>    if (!conf.getBoolean(<a name="line.1026"></a>
+<span class="sourceLineNo">1027</span>          MasterSpaceQuotaObserver.REMOVE_QUOTA_ON_TABLE_DELETE,<a name="line.1027"></a>
+<span class="sourceLineNo">1028</span>          MasterSpaceQuotaObserver.REMOVE_QUOTA_ON_TABLE_DELETE_DEFAULT)) {<a name="line.1028"></a>
+<span class="sourceLineNo">1029</span>      return;<a name="line.1029"></a>
+<span class="sourceLineNo">1030</span>    }<a name="line.1030"></a>
+<span class="sourceLineNo">1031</span>    String[] masterCoprocs = conf.getStrings(CoprocessorHost.MASTER_COPROCESSOR_CONF_KEY);<a name="line.1031"></a>
+<span class="sourceLineNo">1032</span>    final int length = null == masterCoprocs ? 0 : masterCoprocs.length;<a name="line.1032"></a>
+<span class="sourceLineNo">1033</span>    String[] updatedCoprocs = new String[length + 1];<a name="line.1033"></a>
+<span class="sourceLineNo">1034</span>    if (length &gt; 0) {<a name="line.1034"></a>
+<span class="sourceLineNo">1035</span>      System.arraycopy(masterCoprocs, 0, updatedCoprocs, 0, masterCoprocs.length);<a name="line.1035"></a>
+<span class="sourceLineNo">1036</span>    }<a name="line.1036"></a>
+<span class="sourceLineNo">1037</span>    updatedCoprocs[length] = MasterSpaceQuotaObserver.class.getName();<a name="line.1037"></a>
+<span class="sourceLineNo">1038</span>    conf.setStrings(CoprocessorHost.MASTER_COPROCESSOR_CONF_KEY, updatedCoprocs);<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>  private void initMobCleaner() {<a name="line.1041"></a>
+<span class="sourceLineNo">1042</span>    this.expiredMobFileCleanerChore = new ExpiredMobFileCleanerChore(this);<a name="line.1042"></a>
+<span class="sourceLineNo">1043</span>    getChoreService().scheduleChore(expiredMobFileCleanerChore);<a name="line.1043"></a>
+<span class="sourceLineNo">1044</span><a name="line.1044"></a>
+<span class="sourceLineNo">1045</span>    int mobCompactionPeriod = conf.getInt(MobConstants.MOB_COMPACTION_CHORE_PERIOD,<a name="line.1045"></a>
+<span class="sourceLineNo">1046</span>        MobConstants.DEFAULT_MOB_COMPACTION_CHORE_PERIOD);<a name="line.1046"></a>
+<span class="sourceLineNo">1047</span>    if (mobCompactionPeriod &gt; 0) {<a name="line.1047"></a>
+<span class="sourceLineNo">1048</span>      this.mobCompactChore = new MobCompactionChore(this, mobCompactionPeriod);<a name="line.1048"></a>
+<span class="sourceLineNo">1049</span>      getChoreService().scheduleChore(mobCompactChore);<a name="line.1049"></a>
+<span class="sourceLineNo">1050</span>    } else {<a name="line.1050"></a>
+<span class="sourceLineNo">1051</span>      LOG<a name="line.1051"></a>
+<span class="sourceLineNo">1052</span>        .info("The period is " + mobCompactionPeriod + " seconds, MobCompactionChore is disabled");<a name="line.1052"></a>
+<span class="sourceLineNo">1053</span>    }<a name="line.1053"></a>
+<span class="sourceLineNo">1054</span>    this.mobCompactThread = new MasterMobCompactionThread(this);<a name="line.1054"></a>
+<span class="sourceLineNo">1055</span>  }<a name="line.1055"></a>
+<span class="sourceLineNo">1056</span><a name="line.1056"></a>
+<span class="sourceLineNo">1057</span>  /**<a name="line.1057"></a>
+<span class="sourceLineNo">1058</span>   * Create a {@link MasterMetaBootstrap} instance.<a name="line.1058"></a>
+<span class="sourceLineNo">1059</span>   */<a name="line.1059"></a>
+<span class="sourceLineNo">1060</span>  MasterMetaBootstrap createMetaBootstrap(final HMaster master, final MonitoredTask status) {<a name="line.1060"></a>
+<span class="sourceLineNo">1061</span>    // We put this out here in a method so can do a Mockito.spy and stub it out<a name="line.1061"></a>
+<span class="sourceLineNo">1062</span>    // w/ a mocked up MasterMetaBootstrap.<a name="line.1062"></a>
+<span class="sourceLineNo">1063</span>    return new MasterMetaBootstrap(master, status);<a name="line.1063"></a>
+<span class="sourceLineNo">1064</span>  }<a name="line.1064"></a>
+<span class="sourceLineNo">1065</span><a name="line.1065"></a>
+<span class="sourceLineNo">1066</span>  /**<a name="line.1066"></a>
+<span class="sourceLineNo">1067</span>   * Create a {@link ServerManager} instance.<a name="line.1067"></a>
+<span class="sourceLineNo">1068</span>   */<a name="line.1068"></a>
+<span class="sourceLineNo">1069</span>  ServerManager createServerManager(final MasterServices master) throws IOException {<a name="line.1069"></a>
+<span class="sourceLineNo">1070</span>    // We put this out here in a method so can do a Mockito.spy and stub it out<a name="line.1070"></a>
+<span class="sourceLineNo">1071</span>    // w/ a mocked up ServerManager.<a name="line.1071"></a>
+<span class="sourceLineNo">1072</span>    setupClusterConnection();<a name="line.1072"></a>
+<span class="sourceLineNo">1073</span>    return new ServerManager(master);<a name="line.1073"></a>
+<span class="sourceLineNo">1074</span>  }<a name="line.1074"></a>
+<span class="sourceLineNo">1075</span><a name="line.1075"></a>
+<span class="sourceLineNo">1076</span>  private void waitForRegionServers(final MonitoredTask status)<a name="line.1076"></a>
+<span class="sourceLineNo">1077</span>      throws IOException, InterruptedException {<a name="line.1077"></a>
+<span class="sourceLineNo">1078</span>    this.serverManager.waitForRegionServers(status);<a name="line.1078"></a>
+<span class="sourceLineNo">1079</span>    // Check zk for region servers that are up but didn't register<a name="line.1079"></a>
+<span class="sourceLineNo">1080</span>    for (ServerName sn: this.regionServerTracker.getOnlineServers()) {<a name="line.1080"></a>
+<span class="sourceLineNo">1081</span>      // The isServerOnline check is opportunistic, correctness is handled inside<a name="line.1081"></a>
+<span class="sourceLineNo">1082</span>      if (!this.serverManager.isServerOnline(sn) &amp;&amp;<a name="line.1082"></a>
+<span class="sourceLineNo">1083</span>          serverManager.checkAndRecordNewServer(sn, ServerMetricsBuilder.of(sn))) {<a name="line.1083"></a>
+<span class="sourceLineNo">1084</span>        LOG.info("Registered server found up in zk but who has not yet reported in: " + sn);<a name="line.1084"></a>
+<span class="sourceLineNo">1085</span>      }<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>  void initClusterSchemaService() throws IOException, InterruptedException {<a name="line.1089"></a>
+<span class="sourceLineNo">1090</span>    this.clusterSchemaService = new ClusterSchemaServiceImpl(this);<a name="line.1090"></a>
+<span class="sourceLineNo">1091</span>    this.clusterSchemaService.startAsync();<a name="line.1091"></a>
+<span class="sourceLineNo">1092</span>    try {<a name="line.1092"></a>
+<span class="sourceLineNo">1093</span>      this.clusterSchemaService.awaitRunning(getConfiguration().getInt(<a name="line.1093"></a>
+<span class="sourceLineNo">1094</span>        HBASE_MASTER_WAIT_ON_SERVICE_IN_SECONDS,<a name="line.1094"></a>
+<span class="sourceLineNo">1095</span>        DEFAULT_HBASE_MASTER_WAIT_ON_SERVICE_IN_SECONDS), TimeUnit.SECONDS);<a name="line.1095"></a>
+<span class="sourceLineNo">1096</span>    } catch (TimeoutException toe) {<a name="line.1096"></a>
+<span class="sourceLineNo">1097</span>      throw new IOException("Timedout starting ClusterSchemaService", toe);<a name="line.1097"></a>
+<span class="sourceLineNo">1098</span>    }<a name="line.1098"></a>
+<span class="sourceLineNo">1099</span>  }<a name="line.1099"></a>
+<span class="sourceLineNo">1100</span><a name="line.1100"></a>
+<span class="sourceLineNo">1101</span>  void initQuotaManager() throws IOException {<a name="line.1101"></a>
+<span class="sourceLineNo">1102</span>    MasterQuotaManager quotaManager = new MasterQuotaManager(this);<a name="line.1102"></a>
+<span class="sourceLineNo">1103</span>    this.assignmentManager.setRegionStateListener(quotaManager);<a name="line.1103"></a>
+<span class="sourceLineNo">1104</span>    quotaManager.start();<a name="line.1104"></a>
+<span class="sourceLineNo">1105</span>    this.quotaManager = quotaManager;<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>  boolean isCleanerChoreEnabled() {<a name="line.1108"></a>
-<span class="sourceLineNo">1109</span>    boolean hfileCleanerFlag = true, logCleanerFlag = true;<a name="line.1109"></a>
-<span class="sourceLineNo">1110</span><a name="line.1110"></a>
-<span class="sourceLineNo">1111</span>    if (hfileCleaner != null) {<a name="line.1111"></a>
-<span class="sourceLineNo">1112</span>      hfileCleanerFlag = hfileCleaner.getEnabled();<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>    if (logCleaner != null) {<a name="line.1115"></a>
-<span class="sourceLineNo">1116</span>      logCleanerFlag = logCleaner.getEnabled();<a name="line.1116"></a>
-<span class="sourceLineNo">1117</span>    }<a name="line.1117"></a>
+<span class="sourceLineNo">1108</span>  SpaceQuotaSnapshotNotifier createQuotaSnapshotNotifier() {<a name="line.1108"></a>
+<span class="sourceLineNo">1109</span>    SpaceQuotaSnapshotNotifier notifier =<a name="line.1109"></a>
+<span class="sourceLineNo">1110</span>        SpaceQuotaSnapshotNotifierFactory.getInstance().create(getConfiguration());<a name="line.1110"></a>
+<span class="sourceLineNo">1111</span>    return notifier;<a name="line.1111"></a>
+<span class="sourceLineNo">1112</span>  }<a name="line.1112"></a>
+<span class="sourceLineNo">1113</span><a name="line.1113"></a>
+<span class="sourceLineNo">1114</span>  boolean isCatalogJanitorEnabled() {<a name="line.1114"></a>
+<span class="sourceLineNo">1115</span>    return catalogJanitorChore != null ?<a name="line.1115"></a>
+<span class="sourceLineNo">1116</span>      catalogJanitorChore.getEnabled() : false;<a name="line.1116"></a>
+<span class="sourceLineNo">1117</span>  }<a name="line.1117"></a>
 <span class="sourceLineNo">1118</span><a name="line.1118"></a>
-<span class="sourceLineNo">1119</span>    return (hfileCleanerFlag &amp;&amp; logCleanerFlag);<a name="line.1119"></a>
-<span class="sourceLineNo">1120</span>  }<a name="line.1120"></a>
+<span class="sourceLineNo">1119</span>  boolean isCleanerChoreEnabled() {<a name="line.1119"></a>
+<span class="sourceLineNo">1120</span>    boolean hfileCleanerFlag = true, logCleanerFlag = true;<a name="line.1120"></a>
 <span class="sourceLineNo">1121</span><a name="line.1121"></a>
-<span class="sourceLineNo">1122</span>  @Override<a name="line.1122"></a>
-<span class="sourceLineNo">1123</span>  public TableDescriptors getTableDescriptors() {<a name="line.1123"></a>
-<span class="sourceLineNo">1124</span>    return this.tableDescriptors;<a name="line.1124"></a>
-<span class="sourceLineNo">1125</span>  }<a name="line.1125"></a>
-<span class="sourceLineNo">1126</span><a name="line.1126"></a>
-<span class="sourceLineNo">1127</span>  @Override<a name="line.1127"></a>
-<span class="sourceLineNo">1128</span>  public ServerManager getServerManager() {<a name="line.1128"></a>
-<span class="sourceLineNo">1129</span>    return this.serverManager;<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>  @Override<a name="line.1132"></a>
-<span class="sourceLineNo">1133</span>  public MasterFileSystem getMasterFileSystem() {<a name="line.1133"></a>
-<span class="sourceLineNo">1134</span>    return this.fileSystemManager;<a name="line.1134"></a>
-<span class="sourceLineNo">1135</span>  }<a name="line.1135"></a>
-<span class="sourceLineNo">1136</span><a name="line.1136"></a>
-<span class="sourceLineNo">1137</span>  @Override<a name="line.1137"></a>
-<span class="sourceLineNo">1138</span>  public MasterWalManager getMasterWalManager() {<a name="line.1138"></a>
-<span class="sourceLineNo">1139</span>    return this.walManager;<a name="line.1139"></a>
-<span class="sourceLineNo">1140</span>  }<a name="line.1140"></a>
-<span class="sourceLineNo">1141</span><a name="line.1141"></a>
-<span class="sourceLineNo">1142</span>  @Override<a name="line.1142"></a>
-<span class="sourceLineNo">1143</span>  public TableStateManager getTableStateManager() {<a name="line.1143"></a>
-<span class="sourceLineNo">1144</span>    return tableStateManager;<a name="line.1144"></a>
-<span class="sourceLineNo">1145</span>  }<a name="line.1145"></a>
-<span class="sourceLineNo">1146</span><a name="line.1146"></a>
-<span class="sourceLineNo">1147</span>  /*<a name="line.1147"></a>
-<span class="sourceLineNo">1148</span>   * Start up all services. If any of these threads gets an unhandled exception<a name="line.1148"></a>
-<span class="sourceLineNo">1149</span>   * then they just die with a logged message.  This should be fine because<a name="line.1149"></a>
-<span class="sourceLineNo">1150</span>   * in general, we do not expect the master to get such unhandled exceptions<a name="line.1150"></a>
-<span class="sourceLineNo">1151</span>   *  as OOMEs; it should be lightly loaded. See what HRegionServer does if<a name="line.1151"></a>
-<span class="sourceLineNo">1152</span>   *  need to install an unexpected exception handler.<a name="line.1152"></a>
-<span class="sourceLineNo">1153</span>   */<a name="line.1153"></a>
-<span class="sourceLineNo">1154</span>  private void startServiceThreads() throws IOException{<a name="line.1154"></a>
-<span class="sourceLineNo">1155</span>   // Start the executor service pools<a name="line.1155"></a>
-<span class="sourceLineNo">1156</span>   this.executorService.startExecutorService(ExecutorType.MASTER_OPEN_REGION,<a name="line.1156"></a>
-<span class="sourceLineNo">1157</span>      conf.getInt("hbase.master.executor.openregion.threads", 5));<a name="line.1157"></a>
-<span class="sourceLineNo">1158</span>   this.executorService.startExecutorService(ExecutorType.MASTER_CLOSE_REGION,<a name="line.1158"></a>
-<span class="sourceLineNo">1159</span>      conf.getInt("hbase.master.executor.closeregion.threads", 5));<a name="line.1159"></a>
-<span class="sourceLineNo">1160</span>   this.executorService.startExecutorService(ExecutorType.MASTER_SERVER_OPERATIONS,<a name="line.1160"></a>
-<span class="sourceLineNo">1161</span>      conf.getInt("hbase.master.executor.serverops.threads", 5));<a name="line.1161"></a>
-<span class="sourceLineNo">1162</span>   this.executorService.startExecutorService(ExecutorType.MASTER_META_SERVER_OPERATIONS,<a name="line.1162"></a>
-<span class="sourceLineNo">1163</span>      conf.getInt("hbase.master.executor.meta.serverops.threads", 5));<a name="line.1163"></a>
-<span class="sourceLineNo">1164</span>   this.executorService.startExecutorService(ExecutorType.M_LOG_REPLAY_OPS,<a name="line.1164"></a>
-<span class="sourceLineNo">1165</span>      conf.getInt("hbase.master.executor.logreplayops.threads", 10));<a name="line.1165"></a>
-<span class="sourceLineNo">1166</span><a name="line.1166"></a>
-<span class="sourceLineNo">1167</span>   // We depend on there being only one instance of this executor running<a name="line.1167"></a>
-<span class="sourceLineNo">1168</span>   // at a time.  To do concurrency, would need fencing of enable/disable of<a name="line.1168"></a>
-<span class="sourceLineNo">1169</span>   // tables.<a name="line.1169"></a>
-<span class="sourceLineNo">1170</span>   // Any time changing this maxThreads to &gt; 1, pls see the comment at<a name="line.1170"></a>
-<span class="sourceLineNo">1171</span>   // AccessController#postCompletedCreateTableAction<a name="line.1171"></a>
-<span class="sourceLineNo">1172</span>   this.executorService.startExecutorService(ExecutorType.MASTER_TABLE_OPERATIONS, 1);<a name="line.1172"></a>
-<span class="sourceLineNo">1173</span>   startProcedureExecutor();<a name="line.1173"></a>
-<span class="sourceLineNo">1174</span><a name="line.1174"></a>
-<span class="sourceLineNo">1175</span>    // Initial cleaner chore<a name="line.1175"></a>
-<span class="sourceLineNo">1176</span>    CleanerChore.initChorePool(conf);<a name="line.1176"></a>
-<span class="sourceLineNo">1177</span>   // Start log cleaner thread<a name="line.1177"></a>
-<span class="sourceLineNo">1178</span>   int cleanerInterval = conf.getInt("hbase.master.cleaner.interval", 600 * 1000);<a name="line.1178"></a>
-<span class="sourceLineNo">1179</span>   this.logCleaner =<a name="line.1179"></a>
-<span class="sourceLineNo">1180</span>      new LogCleaner(cleanerInterval,<a name="line.1180"></a>
-<span class="sourceLineNo">1181</span>         this, conf, getMasterWalManager().getFileSystem(),<a name="line.1181"></a>
-<span class="sourceLineNo">1182</span>         getMasterWalManager().getOldLogDir());<a name="line.1182"></a>
-<span class="sourceLineNo">1183</span>    getChoreService().scheduleChore(logCleaner);<a name="line.1183"></a>
-<span class="sourceLineNo">1184</span><a name="line.1184"></a>
-<span class="sourceLineNo">1185</span>    // start the hfile archive cleaner thread<a name="line.1185"></a>
-<span class="sourceLineNo">1186</span>    Path archiveDir = HFileArchiveUtil.getArchivePath(conf);<a name="line.1186"></a>
-<span class="sourceLineNo">1187</span>    Map&lt;String, Object&gt; params = new HashMap&lt;&gt;();<a name="line.1187"></a>
-<span class="sourceLineNo">1188</span>    params.put(MASTER, this);<a name="line.1188"></a>
-<span class="sourceLineNo">1189</span>    this.hfileCleaner = new HFileCleaner(cleanerInterval, this, conf, getMasterFileSystem()<a name="line.1189"></a>
-<span class="sourceLineNo">1190</span>        .getFileSystem(), archiveDir, params);<a name="line.1190"></a>
-<span class="sourceLineNo">1191</span>    getChoreService().scheduleChore(hfileCleaner);<a name="line.1191"></a>
-<span class="sourceLineNo">1192</span><a name="line.1192"></a>
-<span class="sourceLineNo">1193</span>    replicationBarrierCleaner =<a name="line.1193"></a>
-<span class="sourceLineNo">1194</span>      new ReplicationBarrierCleaner(conf, this, getConnection(), replicationPeerManager);<a name="line.1194"></a>
-<span class="sourceLineNo">1195</span>    getChoreService().scheduleChore(replicationBarrierCleaner);<a name="line.1195"></a>
-<span class="sourceLineNo">1196</span><a name="line.1196"></a>
-<span class="sourceLineNo">1197</span>    serviceStarted = true;<a name="line.1197"></a>
-<span class="sourceLineNo">1198</span>    if (LOG.isTraceEnabled()) {<a name="line.1198"></a>
-<span class="sourceLineNo">1199</span>      LOG.trace("Started service threads");<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><a name="line.1202"></a>
-<span class="sourceLineNo">1203</span>  private void cancelChore(ScheduledChore chore) {<a name="line.1203"></a>
-<span class="sourceLineNo">1204</span>    if (chore != null) {<a name="line.1204"></a>
-<span class="sourceLineNo">1205</span>      chore.cancel();<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><a name="line.1208"></a>
-<span class="sourceLineNo">1209</span>  @Override<a name="line.1209"></a>
-<span class="sourceLineNo">1210</span>  protected void stopServiceThreads() {<a name="line.1210"></a>
-<span class="sourceLineNo">1211</span>    if (masterJettyServer != null) {<a name="line.1211"></a>
-<span class="sourceLineNo">1212</span>      LOG.info("Stopping master jetty server");<a name="line.1212"></a>
-<span class="sourceLineNo">1213</span>      try {<a name="line.1213"></a>
-<span class="sourceLineNo">1214</span>        masterJettyServer.stop();<a name="line.1214"></a>
-<span class="sourceLineNo">1215</span>      } catch (Exception e) {<a name="line.1215"></a>
-<span class="sourceLineNo">1216</span>        LOG.error("Failed to stop master jetty server", e);<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>    super.stopServiceThreads();<a name="line.1219"></a>
-<span class="sourceLineNo">1220</span>    stopChores();<a name="line.1220"></a>
-<span class="sourceLineNo">1221</span><a name="line.1221"></a>
-<span class="sourceLineNo">1222</span>    LOG.debug("Stopping service threads");<a name="line.1222"></a>
-<span class="sourceLineNo">1223</span><a name="line.1223"></a>
-<span class="sourceLineNo">1224</span>    if (this.quotaManager != null) {<a name="line.1224"></a>
-<span class="sourceLineNo">1225</span>      this.quotaManager.stop();<a name="line.1225"></a>
-<span class="sourceLineNo">1226</span>    }<a name="line.1226"></a>
-<span class="sourceLineNo">1227</span><a name="line.1227"></a>
-<span class="sourceLineNo">1228</span>    if (this.activeMasterManager != null) {<a name="line.1228"></a>
-<span class="sourceLineNo">1229</span>      this.activeMasterManager.stop();<a name="line.1229"></a>
-<span class="sourceLineNo">1230</span>    }<a name="line.1230"></a>
-<span class="sourceLineNo">1231</span>    if (this.serverManager != null) {<a name="line.1231"></a>
-<span class="sourceLineNo">1232</span>      this.serverManager.stop();<a name="line.1232"></a>
-<span class="sourceLineNo">1233</span>    }<a name="line.1233"></a>
-<span class="sourceLineNo">1234</span>    if (this.assignmentManager != null) {<a name="line.1234"></a>
-<span class="sourceLineNo">1235</span>      this.assignmentManager.stop();<a name="line.1235"></a>
-<span class="sourceLineNo">1236</span>    }<a name="line.1236"></a>
-<span class="sourceLineNo">1237</span><a name="line.1237"></a>
-<span class="sourceLineNo">1238</span>    stopProcedureExecutor();<a name="line.1238"></a>
-<span class="sourceLineNo">1239</span><a name="line.1239"></a>
-<span class="sourceLineNo">1240</span>    if (this.walManager != null) {<a name="line.1240"></a>
-<span class="sourceLineNo">1241</span>      this.walManager.stop();<a name="line.1241"></a>
-<span class="sourceLineNo">1242</span>    }<a name="line.1242"></a>
-<span class="sourceLineNo">1243</span>    if (this.fileSystemManager != null) {<a name="line.1243"></a>
-<span class="sourceLineNo">1244</span>      this.fileSystemManager.stop();<a name="line.1244"></a>
-<span class="sourceLineNo">1245</span>    }<a name="line.1245"></a>
-<span class="sourceLineNo">1246</span>    if (this.mpmHost != null) {<a name="line.1246"></a>
-<span class="sourceLineNo">1247</span>      this.mpmHost.stop("server shutting down.");<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">1122</span>    if (hfileCleaner != null) {<a name="line.1122"></a>
+<span class="sourceLineNo">1123</span>      hfileCleanerFlag = hfileCleaner.getEnabled();<a name="line.1123"></a>
+<span class="sourceLineNo">1124</span>    }<a name="line.1124"></a>
+<span class="sourceLineNo">1125</span><a name="line.1125"></a>
+<span class="sourceLineNo">1126</span>    if (logCleaner != null) {<a name="line.1126"></a>
+<span class="sourceLineNo">1127</span>      logCleanerFlag = logCleaner.getEnabled();<a name="line.1127"></a>
+<span class="sourceLineNo">1128</span>    }<a name="line.1128"></a>
+<span class="sourceLineNo">1129</span><a name="line.1129"></a>
+<span class="sourceLineNo">1130</span>    return (hfileCleanerFlag &amp;&amp; logCleanerFlag);<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>  @Override<a name="line.1133"></a>
+<span class="sourceLineNo">1134</span>  public TableDescriptors getTableDescriptors() {<a name="line.1134"></a>
+<span class="sourceLineNo">1135</span>    return this.tableDescriptors;<a name="line.1135"></a>
+<span class="sourceLineNo">1136</span>  }<a name="line.1136"></a>
+<span class="sourceLineNo">1137</span><a name="line.1137"></a>
+<span class="sourceLineNo">1138</span>  @Override<a name="line.1138"></a>
+<span class="sourceLineNo">1139</span>  public ServerManager getServerManager() {<a name="line.1139"></a>
+<span class="sourceLineNo">1140</span>    return this.serverManager;<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>  @Override<a name="line.1143"></a>
+<span class="sourceLineNo">1144</span>  public MasterFileSystem getMasterFileSystem() {<a name="line.1144"></a>
+<span class="sourceLineNo">1145</span>    return this.fileSystemManager;<a name="line.1145"></a>
+<span class="sourceLineNo">1146</span>  }<a name="line.1146"></a>
+<span class="sourceLineNo">1147</span><a name="line.1147"></a>
+<span class="sourceLineNo">1148</span>  @Override<a name="line.1148"></a>
+<span class="sourceLineNo">1149</span>  public MasterWalManager getMasterWalManager() {<a name="line.1149"></a>
+<span class="sourceLineNo">1150</span>    return this.walManager;<a name="line.1150"></a>
+<span class="sourceLineNo">1151</span>  }<a name="line.1151"></a>
+<span class="sourceLineNo">1152</span><a name="line.1152"></a>
+<span class="sourceLineNo">1153</span>  @Override<a name="line.1153"></a>
+<span class="sourceLineNo">1154</span>  public TableStateManager getTableStateManager() {<a name="line.1154"></a>
+<span class="sourceLineNo">1155</span>    return tableStateManager;<a name="line.1155"></a>
+<span class="sourceLineNo">1156</span>  }<a name="line.1156"></a>
+<span class="sourceLineNo">1157</span><a name="line.1157"></a>
+<span class="sourceLineNo">1158</span>  /*<a name="line.1158"></a>
+<span class="sourceLineNo">1159</span>   * Start up all services. If any of these threads gets an unhandled exception<a name="line.1159"></a>
+<span class="sourceLineNo">1160</span>   * then they just die with a logged message.  This should be fine because<a name="line.1160"></a>
+<span class="sourceLineNo">1161</span>   * in general, we do not expect the master to get such unhandled exceptions<a name="line.1161"></a>
+<span class="sourceLineNo">1162</span>   *  as OOMEs; it should be lightly loaded. See what HRegionServer does if<a name="line.1162"></a>
+<span class="sourceLineNo">1163</span>   *  need to install an unexpected exception handler.<a name="line.1163"></a>
+<span class="sourceLineNo">1164</span>   */<a name="line.1164"></a>
+<span class="sourceLineNo">1165</span>  private void startServiceThreads() throws IOException{<a name="line.1165"></a>
+<span class="sourceLineNo">1166</span>   // Start the executor service pools<a name="line.1166"></a>
+<span class="sourceLineNo">1167</span>   this.executorService.startExecutorService(ExecutorType.MASTER_OPEN_REGION,<a name="line.1167"></a>
+<span class="sourceLineNo">1168</span>      conf.getInt("hbase.master.executor.openregion.threads", 5));<a name="line.1168"></a>
+<span class="sourceLineNo">1169</span>   this.executorService.startExecutorService(ExecutorType.MASTER_CLOSE_REGION,<a name="line.1169"></a>
+<span class="sourceLineNo">1170</span>      conf.getInt("hbase.master.executor.closeregion.threads", 5));<a name="line.1170"></a>
+<span class="sourceLineNo">1171</span>   this.executorService.startExecutorService(ExecutorType.MASTER_SERVER_OPERATIONS,<a name="line.1171"></a>
+<span class="sourceLineNo">1172</span>      conf.getInt("hbase.master.executor.serverops.threads", 5));<a name="line.1172"></a>
+<span class="sourceLineNo">1173</span>   this.executorService.startExecutorService(ExecutorType.MASTER_META_SERVER_OPERATIONS,<a name="line.1173"></a>
+<span class="sourceLineNo">1174</span>      conf.getInt("hbase.master.executor.meta.serverops.threads", 5));<a name="line.1174"></a>
+<span class="sourceLineNo">1175</span>   this.executorService.startExecutorService(ExecutorType.M_LOG_REPLAY_OPS,<a name="line.1175"></a>
+<span class="sourceLineNo">1176</span>      conf.getInt("hbase.master.executor.logreplayops.threads", 10));<a name="line.1176"></a>
+<span class="sourceLineNo">1177</span><a name="line.1177"></a>
+<span class="sourceLineNo">1178</span>   // We depend on there being only one instance of this executor running<a name="line.1178"></a>
+<span class="sourceLineNo">1179</span>   // at a time.  To do concurrency, would need fencing of enable/disable of<a name="line.1179"></a>
+<span class="sourceLineNo">1180</span>   // tables.<a name="line.1180"></a>
+<span class="sourceLineNo">1181</span>   // Any time changing this maxThreads to &gt; 1, pls see the comment at<a name="line.1181"></a>
+<span class="sourceLineNo">1182</span>   // AccessController#postCompletedCreateTableAction<a name="line.1182"></a>
+<span class="sourceLineNo">1183</span>   this.executorService.startExecutorService(ExecutorType.MASTER_TABLE_OPERATIONS, 1);<a name="line.1183"></a>
+<span class="sourceLineNo">1184</span>   startProcedureExecutor();<a name="line.1184"></a>
+<span class="sourceLineNo">1185</span><a name="line.1185"></a>
+<span class="sourceLineNo">1186</span>    // Initial cleaner chore<a name="line.1186"></a>
+<span class="sourceLineNo">1187</span>    CleanerChore.initChorePool(conf);<a name="line.1187"></a>
+<span class="sourceLineNo">1188</span>   // Start log cleaner thread<a name="line.1188"></a>
+<span class="sourceLineNo">1189</span>   int cleanerInterval = conf.getInt("hbase.master.cleaner.interval", 600 * 1000);<a name="line.1189"></a>
+<span class="sourceLineNo">1190</span>   this.logCleaner =<a name="line.1190"></a>
+<span class="sourceLineNo">1191</span>      new LogCleaner(cleanerInterval,<a name="line.1191"></a>
+<span class="sourceLineNo">1192</span>         this, conf, getMasterWalManager().getFileSystem(),<a name="line.1192"></a>
+<span class="sourceLineNo">1193</span>         getMasterWalManager().getOldLogDir());<a name="line.1193"></a>
+<span class="sourceLineNo">1194</span>    getChoreService().scheduleChore(logCleaner);<a name="line.1194"></a>
+<span class="sourceLineNo">1195</span><a name="line.1195"></a>
+<span class="sourceLineNo">1196</span>    // start the hfile archive cleaner thread<a name="line.1196"></a>
+<span class="sourceLineNo">1197</span>    Path archiveDir = HFileArchiveUtil.getArchivePath(conf);<a name="line.1197"></a>
+<span class="sourceLineNo">1198</span>    Map&lt;String, Object&gt; params = new HashMap&lt;&gt;();<a name="line.1198"></a>
+<span class="sourceLineNo">1199</span>    params.put(MASTER, this);<a name="line.1199"></a>
+<span class="sourceLineNo">1200</span>    this.hfileCleaner = new HFileCleaner(cleanerInterval, this, conf, getMasterFileSystem()<a name="line.1200"></a>
+<span class="sourceLineNo">1201</span>        .getFileSystem(), archiveDir, params);<a name="line.1201"></a>
+<span class="sourceLineNo">1202</span>    getChoreService().scheduleChore(hfileCleaner);<a name="line.1202"></a>
+<span class="sourceLineNo">1203</span><a name="line.1203"></a>
+<span class="sourceLineNo">1204</span>    replicationBarrierCleaner =<a name="line.1204"></a>
+<span class="sourceLineNo">1205</span>      new ReplicationBarrierCleaner(conf, this, getConnection(), replicationPeerManager);<a name="line.1205"></a>
+<span class="sourceLineNo">1206</span>    getChoreService().scheduleChore(replicationBarrierCleaner);<a name="line.1206"></a>
+<span class="sourceLineNo">1207</span><a name="line.1207"></a>
+<span class="sourceLineNo">1208</span>    serviceStarted = true;<a name="line.1208"></a>
+<span class="sourceLineNo">1209</span>    if (LOG.isTraceEnabled()) {<a name="line.1209"></a>
+<span class="sourceLineNo">1210</span>      LOG.trace("Started service threads");<a name="line.1210"></a>
+<span class="sourceLineNo">1211</span>    }<a name="line.1211"></a>
+<span class="sourceLineNo">1212</span>  }<a name="line.1212"></a>
+<span class="sourceLineNo">1213</span><a name="line.1213"></a>
+<span class="sourceLineNo">1214</span>  private void cancelChore(ScheduledChore chore) {<a name="line.1214"></a>
+<span class="sourceLineNo">1215</span>    if (chore != null) {<a name="line.1215"></a>
+<span class="sourceLineNo">1216</span>      chore.cancel();<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><a name="line.1219"></a>
+<span class="sourceLineNo">1220</span>  @Override<a name="line.1220"></a>
+<span class="sourceLineNo">1221</span>  protected void stopServiceThreads() {<a name="line.1221"></a>
+<span class="sourceLineNo">1222</span>    if (masterJettyServer != null) {<a name="line.1222"></a>
+<span class="sourceLineNo">1223</span>      LOG.info("Stopping master jetty server");<a name="line.1223"></a>
+<span class="sourceLineNo">1224</span>      try {<a name="line.1224"></a>
+<span class="sourceLineNo">1225</span>        masterJettyServer.stop();<a name="line.1225"></a>
+<span class="sourceLineNo">1226</span>      } catch (Exception e) {<a name="line.1226"></a>
+<span class="sourceLineNo">1227</span>        LOG.error("Failed to stop master jetty server", e);<a name="line.1227"></a>
+<span class="sourceLineNo">1228</span>      }<a name="line.1228"></a>
+<span class="sourceLineNo">1229</span>    }<a name="line.1229"></a>
+<span class="sourceLineNo">1230</span>    super.stopServiceThreads();<a name="line.1230"></a>
+<span class="sourceLineNo">1231</span>    stopChores();<a name="line.1231"></a>
+<span class="sourceLineNo">1232</span><a name="line.1232"></a>
+<span class="sourceLineNo">1233</span>    LOG.debug("Stopping service threads");<a name="line.1233"></a>
+<span class="sourceLineNo">1234</span><a name="line.1234"></a>
+<span class="sourceLineNo">1235</span>    if (this.quotaManager != null) {<a name="line.1235"></a>
+<span class="sourceLineNo">1236</span>      this.quotaManager.stop();<a name="line.1236"></a>
+<span class="sourceLineNo">1237</span>    }<a name="line.1237"></a>
+<span class="sourceLineNo">1238</span><a name="line.1238"></a>
+<span class="sourceLineNo">1239</span>    if (this.activeMasterManager != null) {<a name="line.1239"></a>
+<span class="sourceLineNo">1240</span>      this.activeMasterManager.stop();<a name="line.1240"></a>
+<span class="sourceLineNo">1241</span>    }<a name="line.1241"></a>
+<span class="sourceLineNo">1242</span>    if (this.serverManager != null) {<a name="line.1242"></a>
+<span class="sourceLineNo">1243</span>      this.serverManager.stop();<a name="line.1243"></a>
+<span class="sourceLineNo">1244</span>    }<a name="line.1244"></a>
+<span class="sourceLineNo">1245</span>    if (this.assignmentManager != null) {<a name="line.1245"></a>
+<span class="sourceLineNo">1246</span>      this.assignmentManager.stop();<a name="line.1246"></a>
+<span class="sourceLineNo">1247</span>    }<a name="line.1247"></a>
+<span class="sourceLineNo">1248</span><a name="line.1248"></a>
+<span class="sourceLineNo">1249</span>    stopProcedureExecutor();<a name="line.1249"></a>
 <span class="sourceLineNo">1250</span><a name="line.1250"></a>
-<span class="sourceLineNo">1251</span>  private void startProcedureExecutor() throws IOException {<a name="line.1251"></a>
-<span class="sourceLineNo">1252</span>    final MasterProcedureEnv procEnv = new MasterProcedureEnv(this);<a name="line.1252"></a>
-<span class="sourceLineNo">1253</span>    procedureStore = new WALProcedureStore(conf,<a name="line.1253"></a>
-<span class="sourceLineNo">1254</span>        new MasterProcedureEnv.WALStoreLeaseRecovery(this));<a name="line.1254"></a>
-<span class="sourceLineNo">1255</span>    procedureStore.registerListener(new MasterProcedureEnv.MasterProcedureStoreListener(this));<a name="line.1255"></a>
-<span class="sourceLineNo">1256</span>    MasterProcedureScheduler procedureScheduler = procEnv.getProcedureScheduler();<a name="line.1256"></a>
-<span class="sourceLineNo">1257</span>    procedureExecutor = new ProcedureExecutor&lt;&gt;(conf, procEnv, procedureStore, procedureScheduler);<a name="line.1257"></a>
-<span class="sourceLineNo">1258</span>    configurationManager.registerObserver(procEnv);<a name="line.1258"></a>
-<span class="sourceLineNo">1259</span><a name="line.1259"></a>
-<span class="sourceLineNo">1260</span>    int cpus = Runtime.getRuntime().availableProcessors();<a name="line.1260"></a>
-<span class="sourceLineNo">1261</span>    final int numThreads = conf.getInt(MasterProcedureConstants.MASTER_PROCEDURE_THREADS, Math.max(<a name="line.1261"></a>
-<span class="sourceLineNo">1262</span>      (cpus &gt; 0 ? cpus / 4 : 0), MasterProcedureConstants.DEFAULT_MIN_MASTER_PROCEDURE_THREADS));<a name="line.1262"></a>
-<span class="sourceLineNo">1263</span>    final boolean abortOnCorruption =<a name="line.1263"></a>
-<span class="sourceLineNo">1264</span>      conf.getBoolean(MasterProcedureConstants.EXECUTOR_ABORT_ON_CORRUPTION,<a name="line.1264"></a>
-<span class="sourceLineNo">1265</span>        MasterProcedureConstants.DEFAULT_EXECUTOR_ABORT_ON_CORRUPTION);<a name="line.1265"></a>
-<span class="sourceLineNo">1266</span>    procedureStore.start(numThreads);<a name="line.1266"></a>
-<span class="sourceLineNo">1267</span>    procedureExecutor.start(numThreads, abortOnCorruption);<a name="line.1267"></a>
-<span class="sourceLineNo">1268</span>    procEnv.getRemoteDispatcher().start();<a name="line.1268"></a>
-<span class="sourceLineNo">1269</span>  }<a name="line.1269"></a>
+<span class="sourceLineNo">1251</span>    if (this.walManager != null) {<a name="line.1251"></a>
+<span class="sourceLineNo">1252</span>      this.walManager.stop();<a name="line.1252"></a>
+<span class="sourceLineNo">1253</span>    }<a name="line.1253"></a>
+<span class="sourceLineNo">1254</span>    if (this.fileSystemManager != null) {<a name="line.1254"></a>
+<span class="sourceLineNo">1255</span>      this.fileSystemManager.stop();<a name="line.1255"></a>
+<span class="sourceLineNo">1256</span>    }<a name="line.1256"></a>
+<span class="sourceLineNo">1257</span>    if (this.mpmHost != null) {<a name="line.1257"></a>
+<span class="sourceLineNo">1258</span>      this.mpmHost.stop("server shutting down.");<a name="line.1258"></a>
+<span class="sourceLineNo">1259</span>    }<a name="line.1259"></a>
+<span class="sourceLineNo">1260</span>  }<a name="line.1260"></a>
+<span class="sourceLineNo">1261</span><a name="line.1261"></a>
+<span class="sourceLineNo">1262</span>  private void startProcedureExecutor() throws IOException {<a name="line.1262"></a>
+<span class="sourceLineNo">1263</span>    final MasterProcedureEnv procEnv = new MasterProcedureEnv(this);<a name="line.1263"></a>
+<span class="sourceLineNo">1264</span>    procedureStore = new WALProcedureStore(conf,<a name="line.1264"></a>
+<span class="sourceLineNo">1265</span>        new MasterProcedureEnv.WALStoreLeaseRecovery(this));<a name="line.1265"></a>
+<span class="sourceLineNo">1266</span>    procedureStore.registerListener(new MasterProcedureEnv.MasterProcedureStoreListener(this));<a name="line.1266"></a>
+<span class="sourceLineNo">1267</span>    MasterProcedureScheduler procedureScheduler = procEnv.getProcedureScheduler();<a name="line.1267"></a>
+<span class="sourceLineNo">1268</span>    procedureExecutor = new ProcedureExecutor&lt;&gt;(conf, procEnv, procedureStore, procedureScheduler);<a name="line.1268"></a>
+<span class="sourceLineNo">1269</span>    configurationManager.registerObserver(procEnv);<a name="line.1269"></a>
 <span class="sourceLineNo">1270</span><a name="line.1270"></a>
-<span class="sourceLineNo">1271</span>  private void stopProcedureExecutor() {<a name="line.1271"></a>
-<span class="sourceLineNo">1272</span>    if (procedureExecutor != null) {<a name="line.1272"></a>
-<span class="sourceLineNo">1273</span>      configurationManager.deregisterObserver(procedureExecutor.getEnvironment());<a name="line.1273"></a>
-<span class="sourceLineNo">1274</span>      procedureExecutor.getEnvironment().getRemoteDispatcher().stop();<a name="line.1274"></a>
-<span class="sourceLineNo">1275</span>      procedureExecutor.stop();<a name="line.1275"></a>
-<span class="sourceLineNo">1276</span>      procedureExecutor.join();<a name="line.1276"></a>
-<span class="sourceLineNo">1277</span>      procedureExecutor = null;<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>    if (procedureStore != null) {<a name="line.1280"></a>
-<span class="sourceLineNo">1281</span>      procedureStore.stop(isAborted());<a name="line.1281"></a>
-<span class="sourceLineNo">1282</span>      procedureStore = null;<a name="line.1282"></a>
-<span class="sourceLineNo">1283</span>    }<a name="line.1283"></a>
-<span class="sourceLineNo">1284</span>  }<a name="line.1284"></a>
-<span class="sourceLineNo">1285</span><a name="line.1285"></a>
-<span class="sourceLineNo">1286</span>  private void stopChores() {<a name="line.1286"></a>
-<span class="sourceLineNo">1287</span>    cancelChore(this.expiredMobFileCleanerChore);<a name="line.1287"></a>
-<span class="sourceLineNo">1288</span>    cancelChore(this.mobCompactChore);<a name="line.1288"></a>
-<span class="sourceLineNo">1289</span>    cancelChore(this.balancerChore);<a name="line.1289"></a>
-<span class="sourceLineNo">1290</span>    cancelChore(this.normalizerChore);<a name="line.1290"></a>
-<span class="sourceLineNo">1291</span>    cancelChore(this.clusterStatusChore);<a name="line.1291"></a>
-<span class="sourceLineNo">1292</span>    cancelChore(this.catalogJanitorChore);<a name="line.1292"></a>
-<span class="sourceLineNo">1293</span>    cancelChore(this.clusterStatusPublisherChore);<a name="line.1293"></a>
-<span class="sourceLineNo">1294</span>    if (this.mobCompactThread != null) {<a name="line.1294"></a>
-<span class="sourceLineNo">1295</span>      this.mobCompactThread.close();<a name="line.1295"></a>
-<span class="sourceLineNo">1296</span>    }<a name="line.1296"></a>
-<span class="sourceLineNo">1297</span>    cancelChore(this.clusterStatusPublisherChore);<a name="line.1297"></a>
-<span class="sourceLineNo">1298</span>    cancelChore(this.snapshotQuotaChore);<a name="line.1298"></a>
-<span class="sourceLineNo">1299</span>    cancelChore(this.logCleaner);<a name="line.1299"></a>
-<span class="sourceLineNo">1300</span>    cancelChore(this.hfileCleaner);<a name="line.1300"></a>
-<span class="sourceLineNo">1301</span>    cancelChore(this.replicationBarrierCleaner);<a name="line.1301"></a>
-<span class="sourceLineNo">1302</span>  }<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>   * @return Get remote side's InetAddress<a name="line.1305"></a>
-<span class="sourceLineNo">1306</span>   */<a name="line.1306"></a>
-<span class="sourceLineNo">1307</span>  InetAddress getRemoteInetAddress(final int port,<a name="line.1307"></a>
-<span class="sourceLineNo">1308</span>      final long serverStartCode) throws UnknownHostException {<a name="line.1308"></a>
-<span class="sourceLineNo">1309</span>    // Do it out here in its own little method so can fake an address when<a name="line.1309"></a>
-<span class="sourceLineNo">1310</span>    // mocking up in tests.<a name="line.1310"></a>
-<span class="sourceLineNo">1311</span>    InetAddress ia = RpcServer.getRemoteIp();<a name="line.1311"></a>
-<span class="sourceLineNo">1312</span><a name="line.1312"></a>
-<span class="sourceLineNo">1313</span>    // The call could be from the local regionserver,<a name="line.1313"></a>
-<span class="sourceLineNo">1314</span>    // in which case, there is no remote address.<a name="line.1314"></a>
-<span class="sourceLineNo">1315</span>    if (ia == null &amp;&amp; serverStartCode == startcode) {<a name="line.1315"></a>
-<span class="sourceLineNo">1316</span>      InetSocketAddress isa = rpcServices.getSocketAddress();<a name="line.1316"></a>
-<span class="sourceLineNo">1317</span>      if (isa != null &amp;&amp; isa.getPort() == port) {<a name="line.1317"></a>
-<span class="sourceLineNo">1318</span>        ia = isa.getAddress();<a name="line.1318"></a>
-<span class="sourceLineNo">1319</span>      }<a name="line.1319"></a>
-<span class="sourceLineNo">1320</span>    }<a name="line.1320"></a>
-<span class="sourceLineNo">1321</span>    return ia;<a name="line.1321"></a>
-<span class="sourceLineNo">1322</span>  }<a name="line.1322"></a>
+<span class="sourceLineNo">1271</span>    int cpus = Runtime.getRuntime().availableProcessors();<a name="line.1271"></a>
+<span class="sourceLineNo">1272</span>    final int numThreads = conf.getInt(MasterProcedureConstants.MASTER_PROCEDURE_THREADS, Math.max(<a name="line.1272"></a>
+<span class="sourceLineNo">1273</span>      (cpus &gt; 0 ? cpus / 4 : 0), MasterProcedureConstants.DEFAULT_MIN_MASTER_PROCEDURE_THREADS));<a name="line.1273"></a>
+<span class="sourceLineNo">1274</span>    final boolean abortOnCorruption =<a name="line.1274"></a>
+<span class="sourceLineNo">1275</span>      conf.getBoolean(MasterProcedureConstants.EXECUTOR_ABORT_ON_CORRUPTION,<a name="line.1275"></a>
+<span class="sourceLineNo">1276</span>        MasterProcedureConstants.DEFAULT_EXECUTOR_ABORT_ON_CORRUPTION);<a name="line.1276"></a>
+<span class="sourceLineNo">1277</span>    procedureStore.start(numThreads);<a name="line.1277"></a>
+<span class="sourceLineNo">1278</span>    procedureExecutor.start(numThreads, abortOnCorruption);<a name="line.1278"></a>
+<span class="sourceLineNo">1279</span>    procEnv.getRemoteDispatcher().start();<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>  private void stopProcedureExecutor() {<a name="line.1282"></a>
+<span class="sourceLineNo">1283</span>    if (procedureExecutor != null) {<a name="line.1283"></a>
+<span class="sourceLineNo">1284</span>      configurationManager.deregisterObserver(procedureExecutor.getEnvironment());<a name="line.1284"></a>
+<span class="sourceLineNo">1285</span>      procedureExecutor.getEnvironment().getRemoteDispatcher().stop();<a name="line.1285"></a>
+<span class="sourceLineNo">1286</span>      procedureExecutor.stop();<a name="line.1286"></a>
+<span class="sourceLineNo">1287</span>      procedureExecutor.join();<a name="line.1287"></a>
+<span class="sourceLineNo">1288</span>      procedureExecutor = null;<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>    if (procedureStore != null) {<a name="line.1291"></a>
+<span class="sourceLineNo">1292</span>      procedureStore.stop(isAborted());<a name="line.1292"></a>
+<span class="sourceLineNo">1293</span>      procedureStore = null;<a name="line.1293"></a>
+<span class="sourceLineNo">1294</span>    }<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>  private void stopChores() {<a name="line.1297"></a>
+<span class="sourceLineNo">1298</span>    cancelChore(this.expiredMobFileCleanerChore);<a name="line.1298"></a>
+<span class="sourceLineNo">1299</span>    cancelChore(this.mobCompactChore);<a name="line.1299"></a>
+<span class="sourceLineNo">1300</span>    cancelChore(this.balancerChore);<a name="line.1300"></a>
+<span class="sourceLineNo">1301</span>    cancelChore(this.normalizerChore);<a name="line.1301"></a>
+<span class="sourceLineNo">1302</span>    cancelChore(this.clusterStatusChore);<a name="line.1302"></a>
+<span class="sourceLineNo">1303</span>    cancelChore(this.catalogJanitorChore);<a name="line.1303"></a>
+<span class="sourceLineNo">1304</span>    cancelChore(this.clusterStatusPublisherChore);<a name="line.1304"></a>
+<span class="sourceLineNo">1305</span>    if (this.mobCompactThread != null) {<a name="line.1305"></a>
+<span class="sourceLineNo">1306</span>      this.mobCompactThread.close();<a name="line.1306"></a>
+<span class="sourceLineNo">1307</span>    }<a name="line.1307"></a>
+<span class="sourceLineNo">1308</span>    cancelChore(this.clusterStatusPublisherChore);<a name="line.1308"></a>
+<span class="sourceLineNo">1309</span>    cancelChore(this.snapshotQuotaChore);<a name="line.1309"></a>
+<span class="sourceLineNo">1310</span>    cancelChore(this.logCleaner);<a name="line.1310"></a>
+<span class="sourceLineNo">1311</span>    cancelChore(this.hfileCleaner);<a name="line.1311"></a>
+<span class="sourceLineNo">1312</span>    cancelChore(this.replicationBarrierCleaner);<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>   * @return Get remote side's InetAddress<a name="line.1316"></a>
+<span class="sourceLineNo">1317</span>   */<a name="line.1317"></a>
+<span class="sourceLineNo">1318</span>  InetAddress getRemoteInetAddress(final int port,<a name="line.1318"></a>
+<span class="sourceLineNo">1319</span>      final long serverStartCode) throws UnknownHostException {<a name="line.1319"></a>
+<span class="sourceLineNo">1320</span>    // Do it out here in its own little method so can fake an address when<a name="line.1320"></a>
+<span class="sourceLineNo">1321</span>    // mocking up in tests.<a name="line.1321"></a>
+<span class="sourceLineNo">1322</span>    InetAddress ia = RpcServer.getRemoteIp();<a name="line.1322"></a>
 <span class="sourceLineNo">1323</span><a name="line.1323"></a>
-<span class="sourceLineNo">1324</span>  /**<a name="line.1324"></a>
-<span class="sourceLineNo">1325</span>   * @return Maximum time we should run balancer for<a name="line.1325"></a>
-<span class="sourceLineNo">1326</span>   */<a name="line.1326"></a>
-<span class="sourceLineNo">1327</span>  private int getMaxBalancingTime() {<a name="line.1327"></a>
-<span class="sourceLineNo">1328</span>    int maxBalancingTime = getConfiguration().getInt(HConstants.HBASE_BALANCER_MAX_BALANCING, -1);<a name="line.1328"></a>
-<span class="sourceLineNo">1329</span>    if (maxBalancingTime == -1) {<a name="line.1329"></a>
-<span class="sourceLineNo">1330</span>      // if max balancing time isn't set, defaulting it to period time<a name="line.1330"></a>
-<span class="sourceLineNo">1331</span>      maxBalancingTime = getConfiguration().getInt(HConstants.HBASE_BALANCER_PERIOD,<a name="line.1331"></a>
-<span class="sourceLineNo">1332</span>        HConstants.DEFAULT_HBASE_BALANCER_PERIOD);<a name="line.1332"></a>
-<span class="sourceLineNo">1333</span>    }<a name="line.1333"></a>
-<span class="sourceLineNo">1334</span>    return maxBalancingTime;<a name="line.1334"></a>
-<span class="sourceLineNo">1335</span>  }<a name="line.1335"></a>
-<span class="sourceLineNo">1336</span><a name="line.1336"></a>
-<span class="sourceLineNo">1337</span>  /**<a name="line.1337"></a>
-<span class="sourceLineNo">1338</span>   * @return Maximum number of regions in transition<a name="line.1338"></a>
-<span class="sourceLineNo">1339</span>   */<a name="line.1339"></a>
-<span class="sourceLineNo">1340</span>  private int getMaxRegionsInTransition() {<a name="line.1340"></a>
-<span class="sourceLineNo">1341</span>    int numRegions = this.assignmentManager.getRegionStates().getRegionAssignments().size();<a name="line.1341"></a>
-<span class="sourceLineNo">1342</span>    return Math.max((int) Math.floor(numRegions * this.maxRitPercent), 1);<a name="line.1342"></a>
-<span class="sourceLineNo">1343</span>  }<a name="line.1343"></a>
-<span class="sourceLineNo">1344</span><a name="line.1344"></a>
-<span class="sourceLineNo">1345</span>  /**<a name="line.1345"></a>
-<span class="sourceLineNo">1346</span>   * It first sleep to the next balance plan start time. Meanwhile, throttling by the max<a name="line.1346"></a>
-<span class="sourceLineNo">1347</span>   * number regions in transition to protect availability.<a name="line.1347"></a>
-<span class="sourceLineNo">1348</span>   * @param nextBalanceStartTime The next balance plan start time<a name="line.1348"></a>
-<span class="sourceLineNo">1349</span>   * @param maxRegionsInTransition max number of regions in transition<a name="line.1349"></a>
-<span class="sourceLineNo">1350</span>   * @param cutoffTime when to exit balancer<a name="line.1350"></a>
-<span class="sourceLineNo">1351</span>   */<a name="line.1351"></a>
-<span class="sourceLineNo">1352</span>  private void balanceThrottling(long nextBalanceStartTime, int maxRegionsInTransition,<a name="line.1352"></a>
-<span class="sourceLineNo">1353</span>      long cutoffTime) {<a name="line.1353"></a>
-<span class="sourceLineNo">1354</span>    boolean interrupted = false;<a name="line.1354"></a>
+<span class="sourceLineNo">1324</span>    // The call could be from the local regionserver,<a name="line.1324"></a>
+<span class="sourceLineNo">1325</span>    // in which case, there is no remote address.<a name="line.1325"></a>
+<span class="sourceLineNo">1326</span>    if (ia == null &amp;&amp; serverStartCode == startcode) {<a name="line.1326"></a>
+<span class="sourceLineNo">1327</span>      InetSocketAddress isa = rpcServices.getSocketAddress();<a name="line.1327"></a>
+<span class="sourceLineNo">1328</span>      if (isa != null &amp;&amp; isa.getPort() == port) {<a name="line.1328"></a>
+<span class="sourceLineNo">1329</span>        ia = isa.getAddress();<a name="line.1329"></a>
+<span class="sourceLineNo">1330</span>      }<a name="line.1330"></a>
+<span class="sourceLineNo">1331</span>    }<a name="line.1331"></a>
+<span class="sourceLineNo">1332</span>    return ia;<a name="line.1332"></a>
+<span class="sourceLineNo">1333</span>  }<a name="line.1333"></a>
+<span class="sourceLineNo">1334</span><a name="line.1334"></a>
+<span class="sourceLineNo">1335</span>  /**<a name="line.1335"></a>
+<span class="sourceLineNo">1336</span>   * @return Maximum time we should run balancer for<a name="line.1336"></a>
+<span class="sourceLineNo">1337</span>   */<a name="line.1337"></a>
+<span class="sourceLineNo">1338</span>  private int getMaxBalancingTime() {<a name="line.1338"></a>
+<span class="sourceLineNo">1339</span>    int maxBalancingTime = getConfiguration().getInt(HConstants.HBASE_BALANCER_MAX_BALANCING, -1);<a name="line.1339"></a>
+<span class="sourceLineNo">1340</span>    if (maxBalancingTime == -1) {<a name="line.1340"></a>
+<span class="sourceLineNo">1341</span>      // if max balancing time isn't set, defaulting it to period time<a name="line.1341"></a>
+<span class="sourceLineNo">1342</span>      maxBalancingTime = getConfiguration().getInt(HConstants.HBASE_BALANCER_PERIOD,<a name="line.1342"></a>
+<span class="sourceLineNo">1343</span>        HConstants.DEFAULT_HBASE_BALANCER_PERIOD);<a name="line.1343"></a>
+<span class="sourceLineNo">1344</span>    }<a name="line.1344"></a>
+<span class="sourceLineNo">1345</span>    return maxBalancingTime;<a name="line.1345"></a>
+<span class="sourceLineNo">1346</span>  }<a name="line.1346"></a>
+<span class="sourceLineNo">1347</span><a name="line.1347"></a>
+<span class="sourceLineNo">1348</span>  /**<a name="line.1348"></a>
+<span class="sourceLineNo">1349</span>   * @return Maximum number of regions in transition<a name="line.1349"></a>
+<span class="sourceLineNo">1350</span>   */<a name="line.1350"></a>
+<span class="sourceLineNo">1351</span>  private int getMaxRegionsInTransition() {<a name="line.1351"></a>
+<span class="sourceLineNo">1352</span>    int numRegions = this.assignmentManager.getRegionStates().getRegionAssignments().size();<a name="line.1352"></a>
+<span class="sourceLineNo">1353</span>    return Math.max((int) Math.floor(numRegions * this.maxRitPercent), 1);<a name="line.1353"></a>
+<span class="sourceLineNo">1354</span>  }<a name="line.1354"></a>
 <span class="sourceLineNo">1355</span><a name="line.1355"></a>
-<span class="sourceLineNo">1356</span>    // Sleep to next balance plan start time<a name="line.1356"></a>
-<span class="sourceLineNo">1357</span>    // But if there are zero regions in transition, it can skip sleep to speed up.<a name="line.1357"></a>
-<span class="sourceLineNo">1358</span>    while (!interrupted &amp;&amp; System.currentTimeMillis() &lt; nextBalanceStartTime<a name="line.1358"></a>
-<span class="sourceLineNo">1359</span>        &amp;&amp; this.assignmentManager.getRegionStates().hasRegionsInTransition()) {<a name="line.1359"></a>
-<span class="sourceLineNo">1360</span>      try {<a name="line.1360"></a>
-<span class="sourceLineNo">1361</span>        Thread.sleep(100);<a name="line.1361"></a>
-<span class="sourceLineNo">1362</span>      } catch (InterruptedException ie) {<a name="line.1362"></a>
-<span class="sourceLineNo">1363</span>        interrupted = true;<a name="line.1363"></a>
-<span class="sourceLineNo">1364</span>      }<a name="line.1364"></a>
-<span class="sourceLineNo">1365</span>    }<a name="line.1365"></a>
+<span class="sourceLineNo">1356</span>  /**<a name="line.1356"></a>
+<span class="sourceLineNo">1357</span>   * It first sleep to the next balance plan start time. Meanwhile, throttling by the max<a name="line.1357"></a>
+<span class="sourceLineNo">1358</span>   * number regions in transition to protect availability.<a name="line.1358"></a>
+<span class="sourceLineNo">1359</span>   * @param nextBalanceStartTime The next balance plan start time<a name="line.1359"></a>
+<span class="sourceLineNo">1360</span>   * @param maxRegionsInTransition max number of regions in transition<a name="line.1360"></a>
+<span class="sourceLineNo">1361</span>   * @param cutoffTime when to exit balancer<a name="line.1361"></a>
+<span class="sourceLineNo">1362</span>   */<a name="line.1362"></a>
+<span class="sourceLineNo">1363</span>  private void balanceThrottling(long nextBalanceStartTime, int maxRegionsInTransition,<a name="line.1363"></a>
+<span class="sourceLineNo">1364</span>      long cutoffTime) {<a name="line.1364"></a>
+<span class="sourceLineNo">1365</span>    boolean interrupted = false;<a name="line.1365"></a>
 <span class="sourceLineNo">1366</span><a name="line.1366"></a>
-<span class="sourceLineNo">1367</span>    // Throttling by max number regions in transition<a name="line.1367"></a>
-<span class="sourceLineNo">1368</span>    while (!interrupted<a name="line.1368"></a>
-<span class="sourceLineNo">1369</span>        &amp;&amp; maxRegionsInTransition &gt; 0<a name="line.1369"></a>
-<span class="sourceLineNo">1370</span>        &amp;&amp; this.assignmentManager.getRegionStates().getRegionsInTransitionCount()<a name="line.1370"></a>
-<span class="sourceLineNo">1371</span>        &gt;= maxRegionsInTransition &amp;&amp; System.currentTimeMillis() &lt;= cutoffTime) {<a name="line.1371"></a>
-<span class="sourceLineNo">1372</span>      try {<a name="line.1372"></a>
-<span class="sourceLineNo">1373</span>        // sleep if the number of regions in transition exceeds the limit<a name="line.1373"></a>
-<span class="sourceLineNo">1374</span>        Thread.sleep(100);<a name="line.1374"></a>
-<span class="sourceLineNo">1375</span>      } catch (InterruptedException ie) {<a name="line.1375"></a>
-<span class="sourceLineNo">1376</span>        interrupted = true;<a name="line.1376"></a>
-<span class="sourceLineNo">1377</span>      }<a name="line.1377"></a>
-<span class="sourceLineNo">1378</span>    }<a name="line.1378"></a>
-<span class="sourceLineNo">1379</span><a name="line.1379"></a>
-<span class="sourceLineNo">1380</span>    if (interrupted) Thread.currentThread().interrupt();<a name="line.1380"></a>
-<span class="sourceLineNo">1381</span>  }<a name="line.1381"></a>
-<span class="sourceLineNo">1382</span><a name="line.1382"></a>
-<span class="sourceLineNo">1383</span>  public boolean balance() throws IOException {<a name="line.1383"></a>
-<span class="sourceLineNo">1384</span>    return balance(false);<a name="line.1384"></a>
-<span class="sourceLineNo">1385</span>  }<a name="line.1385"></a>
-<span class="sourceLineNo">1386</span><a name="line.1386"></a>
-<span class="sourceLineNo">1387</span>  public boolean balance(boolean force) throws IOException {<a name="line.1387"></a>
-<span class="sourceLineNo">1388</span>    // if master not initialized, don't run balancer.<a name="line.1388"></a>
-<span class="sourceLineNo">1389</span>    if (!isInitialized()) {<a name="line.1389"></a>
-<span class="sourceLineNo">1390</span>      LOG.debug("Master has not been initialized, don't run balancer.");<a name="line.1390"></a>
-<span class="sourceLineNo">1391</span>      return false;<a name="line.1391"></a>
-<span class="sourceLineNo">1392</span>    }<a name="line.1392"></a>
+<span class="sourceLineNo">1367</span>    // Sleep to next balance plan start time<a name="line.1367"></a>
+<span class="sourceLineNo">1368</span>    // But if there are zero regions in transition, it can skip sleep to speed up.<a name="line.1368"></a>
+<span class="sourceLineNo">1369</span>    while (!interrupted &amp;&amp; System.currentTimeMillis() &lt; nextBalanceStartTime<a name="line.1369"></a>
+<span class="sourceLineNo">1370</span>        &amp;&amp; this.assignmentManager.getRegionStates().hasRegionsInTransition()) {<a name="line.1370"></a>
+<span class="sourceLineNo">1371</span>      try {<a name="line.1371"></a>
+<span class="sourceLineNo">1372</span>        Thread.sleep(100);<a name="line.1372"></a>
+<span class="sourceLineNo">1373</span>      } catch (InterruptedException ie) {<a name="line.1373"></a>
+<span class="sourceLineNo">1374</span>        interrupted = true;<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><a name="line.1377"></a>
+<span class="sourceLineNo">1378</span>    // Throttling by max number regions in transition<a name="line.1378"></a>
+<span class="sourceLineNo">1379</span>    while (!interrupted<a name="line.1379"></a>
+<span class="sourceLineNo">1380</span>        &amp;&amp; maxRegionsInTransition &gt; 0<a name="line.1380"></a>
+<span class="sourceLineNo">1381</span>        &amp;&amp; this.assignmentManager.getRegionStates().getRegionsInTransitionCount()<a name="line.1381"></a>
+<span class="sourceLineNo">1382</span>        &gt;= maxRegionsInTransition &amp;&amp; System.currentTimeMillis() &lt;= cutoffTime) {<a name="line.1382"></a>
+<span class="sourceLineNo">1383</span>      try {<a name="line.1383"></a>
+<span class="sourceLineNo">1384</span>        // sleep if the number of regions in transition exceeds the limit<a name="line.1384"></a>
+<span class="sourceLineNo">1385</span>        Thread.sleep(100);<a name="line.1385"></a>
+<span class="sourceLineNo">1386</span>      } catch (InterruptedException ie) {<a name="line.1386"></a>
+<span class="sourceLineNo">1387</span>        interrupted = true;<a name="line.1387"></a>
+<span class="sourceLineNo">1388</span>      }<a name="line.1388"></a>
+<span class="sourceLineNo">1389</span>    }<a name="line.1389"></a>
+<span class="sourceLineNo">1390</span><a name="line.1390"></a>
+<span class="sourceLineNo">1391</span>    if (interrupted) Thread.currentThread().interrupt();<a name="line.1391"></a>
+<span class="sourceLineNo">1392</span>  }<a name="line.1392"></a>
 <span class="sourceLineNo">1393</span><a name="line.1393"></a>
-<span class="sourceLineNo">1394</span>    if (isInMaintenanceMode()) {<a name="line.1394"></a>
-<span class="sourceLineNo">1395</span>      LOG.info("Master is in maintenanceMode mode, don't run balancer.");<a name="line.1395"></a>
-<span class="sourceLineNo">1396</span>      return false;<a name="line.1396"></a>
-<span class="sourceLineNo">1397</span>    }<a name="line.1397"></a>
-<span class="sourceLineNo">1398</span><a name="line.1398"></a>
-<span class="sourceLineNo">1399</span>    int maxRegionsInTransition = getMaxRegionsInTransition();<a name="line.1399"></a>
-<span class="sourceLineNo">1400</span>    synchronized (this.balancer) {<a name="line.1400"></a>
-<span class="sourceLineNo">1401</span>      // If balance not true, don't run balancer.<a name="line.1401"></a>
-<span class="sourceLineNo">1402</span>      if (!this.loadBalancerTracker.isBalancerOn()) return false;<a name="line.1402"></a>
-<span class="sourceLineNo">1403</span>        // Only allow one balance run at at time.<a name="line.1403"></a>
-<span class="sourceLineNo">1404</span>      if (this.assignmentManager.hasRegionsInTransition()) {<a name="line.1404"></a>
-<span class="sourceLineNo">1405</span>        List&lt;RegionStateNode&gt; regionsInTransition = assignmentManager.getRegionsInTransition();<a name="line.1405"></a>
-<span class="sourceLineNo">1406</span>        // if hbase:meta region is in transition, result of assignment cannot be recorded<a name="line.1406"></a>
-<span class="sourceLineNo">1407</span>        // ignore the force flag in that case<a name="line.1407"></a>
-<span class="sourceLineNo">1408</span>        boolean metaInTransition = assignmentManager.isMetaRegionInTransition();<a name="line.1408"></a>
-<span class="sourceLineNo">1409</span>        String prefix = force &amp;&amp; !metaInTransition ? "R" : "Not r";<a name="line.1409"></a>
-<span class="sourceLineNo">1410</span>        List&lt;RegionStateNode&gt; toPrint = regionsInTransition;<a name="line.1410"></a>
-<span class="sourceLineNo">1411</span>        int max = 5;<a name="line.1411"></a>
-<span class="sourceLineNo">1412</span>        boolean truncated = false;<a name="line.1412"></a>
-<span class="sourceLineNo">1413</span>        if (regionsInTransition.size() &gt; max) {<a name="line.1413"></a>
-<span class="sourceLineNo">1414</span>          toPrint = regionsInTransition.subList(0, max);<a name="line.1414"></a>
-<span class="sourceLineNo">1415</span>          truncated = true;<a name="line.1415"></a>
-<span class="sourceLineNo">1416</span>        }<a name="line.1416"></a>
-<span class="sourceLineNo">1417</span>        LOG.info(prefix + "unning balancer because " + regionsInTransition.size() +<a name="line.1417"></a>
-<span class="sourceLineNo">1418</span>          " region(s) in transition: " + toPrint + (truncated? "(truncated list)": ""));<a name="line.1418"></a>
-<span class="sourceLineNo">1419</span>        if (!force || metaInTransition) return false;<a name="line.1419"></a>
-<span class="sourceLineNo">1420</span>      }<a name="line.1420"></a>
-<span class="sourceLineNo">1421</span>      if (this.serverManager.areDeadServersInProgress()) {<a name="line.1421"></a>
-<span class="sourceLineNo">1422</span>        LOG.info("Not running balancer because processing dead regionserver(s): " +<a name="line.1422"></a>
-<span class="sourceLineNo">1423</span>          this.serverManager.getDeadServers());<a name="line.1423"></a>
-<span class="sourceLineNo">1424</span>        return false;<a name="line.1424"></a>
-<span class="sourceLineNo">1425</span>      }<a name="line.1425"></a>
-<span class="sourceLineNo">1426</span><a name="line.1426"></a>
-<span class="sourceLineNo">1427</span>      if (this.cpHost != null) {<a name="line.1427"></a>
-<span class="sourceLineNo">1428</span>        try {<a name="line.1428"></a>
-<span class="sourceLineNo">1429</span>          if (this.cpHost.preBalance()) {<a name="line.1429"></a>
-<span class="sourceLineNo">1430</span>            LOG.debug("Coprocessor bypassing balancer request");<a name="line.1430"></a>
-<span class="sourceLineNo">1431</span>            return false;<a name="line.1431"></a>
-<span class="sourceLineNo">1432</span>          }<a name="line.1432"></a>
-<span class="sourceLineNo">1433</span>        } catch (IOException ioe) {<a name="line.1433"></a>
-<span class="sourceLineNo">1434</span>          LOG.error("Error invoking master coprocessor preBalance()", ioe);<a name="line.1434"></a>
-<span class="sourceLineNo">1435</span>          return false;<a name="line.1435"></a>
-<span class="sourceLineNo">1436</span>        }<a name="line.1436"></a>
-<span class="sourceLineNo">1437</span>      }<a name="line.1437"></a>
-<span class="sourceLineNo">1438</span><a name="line.1438"></a>
-<span class="sourceLineNo">1439</span>      boolean isByTable = getConfiguration().getBoolean("hbase.master.loadbalance.bytable", false);<a name="line.1439"></a>
-<span class="sourceLineNo">1440</span>      Map&lt;TableName, Map&lt;ServerName, List&lt;RegionInfo&gt;&gt;&gt; assignmentsByTable =<a name="line.1440"></a>
-<span class="sourceLineNo">1441</span>        this.assignmentManager.getRegionStates().getAssignmentsByTable(!isByTable);<a name="line.1441"></a>
-<span class="sourceLineNo">1442</span><a name="line.1442"></a>
-<span class="sourceLineNo">1443</span>      List&lt;RegionPlan&gt; plans = new ArrayList&lt;&gt;();<a name="line.1443"></a>
-<span class="sourceLineNo">1444</span><a name="line.1444"></a>
-<span class="sourceLineNo">1445</span>      //Give the balancer the current cluster state.<a name="line.1445"></a>
-<span class="sourceLineNo">1446</span>      this.balancer.setClusterMetrics(getClusterMetricsWithoutCoprocessor());<a name="line.1446"></a>
-<span class="sourceLineNo">1447</span>      this.balancer.setClusterLoad(assignmentsByTable);<a name="line.1447"></a>
-<span class="sourceLineNo">1448</span><a name="line.1448"></a>
-<span class="sourceLineNo">1449</span>      for (Map&lt;ServerName, List&lt;RegionInfo&gt;&gt; serverMap : assignmentsByTable.values()) {<a name="line.1449"></a>
-<span class="sourceLineNo">1450</span>        serverMap.keySet().removeAll(this.serverManager.getDrainingServersList());<a name="line.1450"></a>
-<span class="sourceLineNo">1451</span>      }<a name="line.1451"></a>
-<span class="sourceLineNo">1452</span>      for (Entry&lt;TableName, Map&lt;ServerName, List&lt;RegionInfo&gt;&gt;&gt; e : assignmentsByTable.entrySet()) {<a name="line.1452"></a>
-<span class="sourceLineNo">1453</span>        List&lt;RegionPlan&gt; partialPlans = this.balancer.balanceCluster(e.getKey(), e.getValue());<a name="line.1453"></a>
-<span class="sourceLineNo">1454</span>        if (partialPlans != null) plans.addAll(partialPlans);<a name="line.1454"></a>
-<span class="sourceLineNo">1455</span>      }<a name="line.1455"></a>
-<span class="sourceLineNo">1456</span><a name="line.1456"></a>
-<span class="sourceLineNo">1457</span>      long balanceStartTime = System.currentTimeMillis();<a name="line.1457"></a>
-<span class="sourceLineNo">1458</span>      long cutoffTime = balanceStartTime + this.maxBlancingTime;<a name="line.1458"></a>
-<span class="sourceLineNo">1459</span>      int rpCount = 0;  // number of RegionPlans balanced so far<a name="line.1459"></a>
-<span class="sourceLineNo">1460</span>      if (plans != null &amp;&amp; !plans.isEmpty()) {<a name="line.1460"></a>
-<span class="sourceLineNo">1461</span>        int balanceInterval = this.maxBlancingTime / plans.size();<a name="line.1461"></a>
-<span class="sourceLineNo">1462</span>        LOG.info("Balancer plans size is " + plans.size() + ", the balance interval is "<a name="line.1462"></a>
-<span class="sourceLineNo">1463</span>            + balanceInterval + " ms, and the max number regions in transition is "<a name="line.1463"></a>
-<span class="sourceLineNo">1464</span>            + maxRegionsInTransition);<a name="line.1464"></a>
-<span class="sourceLineNo">1465</span><a name="line.1465"></a>
-<span class="sourceLineNo">1466</span>        for (RegionPlan plan: plans) {<a name="line.1466"></a>
-<span class="sourceLineNo">1467</span>          LOG.info("balance " + plan);<a name="line.1467"></a>
-<span class="sourceLineNo">1468</span>          //TODO: bulk assign<a name="line.1468"></a>
-<span class="sourceLineNo">1469</span>          this.assignmentManager.moveAsync(plan);<a name="line.1469"></a>
-<span class="sourceLineNo">1470</span>          rpCount++;<a name="line.1470"></a>
-<span class="sourceLineNo">1471</span><a name="line.1471"></a>
-<span class="sourceLineNo">1472</span>          balanceThrottling(balanceStartTime + rpCount * balanceInterval, maxRegionsInTransition,<a name="line.1472"></a>
-<span class="sourceLineNo">1473</span>            cutoffTime);<a name="line.1473"></a>
-<span class="sourceLineNo">1474</span><a name="line.1474"></a>
-<span class="sourceLineNo">1475</span>          // if performing next balance exceeds cutoff time, exit the loop<a name="line.1475"></a>
-<span class="sourceLineNo">1476</span>          if (rpCount &lt; plans.size() &amp;&amp; System.currentTimeMillis() &gt; cutoffTime) {<a name="line.1476"></a>
-<span class="sourceLineNo">1477</span>            // TODO: After balance, there should not be a cutoff time (keeping it as<a name="line.1477"></a>
-<span class="sourceLineNo">1478</span>            // a security net for now)<a name="line.1478"></a>
-<span class="sourceLineNo">1479</span>            LOG.debug("No more balancing till next balance run; maxBalanceTime="<a name="line.1479"></a>
-<span class="sourceLineNo">1480</span>                + this.maxBlancingTime);<a name="line.1480"></a>
-<span class="sourceLineNo">1481</span>            break;<a name="line.1481"></a>
-<span class="sourceLineNo">1482</span>          }<a name="line.1482"></a>
-<span class="sourceLineNo">1483</span>        }<a name="line.1483"></a>
-<span class="sourceLineNo">1484</span>      }<a name="line.1484"></a>
+<span class="sourceLineNo">1394</span>  public boolean balance() throws IOException {<a name="line.1394"></a>
+<span class="sourceLineNo">1395</span>    return balance(false);<a name="line.1395"></a>
+<span class="sourceLineNo">1396</span>  }<a name="line.1396"></a>
+<span class="sourceLineNo">1397</span><a name="line.1397"></a>
+<span class="sourceLineNo">1398</span>  public boolean balance(boolean force) throws IOException {<a name="line.1398"></a>
+<span class="sourceLineNo">1399</span>    // if master not initialized, don't run balancer.<a name="line.1399"></a>
+<span class="sourceLineNo">1400</span>    if (!isInitialized()) {<a name="line.1400"></a>
+<span class="sourceLineNo">1401</span>      LOG.debug("Master has not been initialized, don't run balancer.");<a name="line.1401"></a>
+<span class="sourceLineNo">1402</span>      return false;<a name="line.1402"></a>
+<span class="sourceLineNo">1403</span>    }<a name="line.1403"></a>
+<span class="sourceLineNo">1404</span><a name="line.1404"></a>
+<span class="sourceLineNo">1405</span>    if (isInMaintenanceMode()) {<a name="line.1405"></a>
+<span class="sourceLineNo">1406</span>      LOG.info("Master is in maintenanceMode mode, don't run balancer.");<a name="line.1406"></a>
+<span class="sourceLineNo">1407</span>      return false;<a name="line.1407"></a>
+<span class="sourceLineNo">1408</span>    }<a name="line.1408"></a>
+<span class="sourceLineNo">1409</span><a name="line.1409"></a>
+<span class="sourceLineNo">1410</span>    int maxRegionsInTransition = getMaxRegionsInTransition();<a name="line.1410"></a>
+<span class="sourceLineNo">1411</

<TRUNCATED>

[28/29] hbase-site git commit: Published site at 477f9fdb32873387231c5fbbff130ba8bf7b5d68.

Posted by gi...@apache.org.
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/621479e1/apache_hbase_reference_guide.pdf
----------------------------------------------------------------------
diff --git a/apache_hbase_reference_guide.pdf b/apache_hbase_reference_guide.pdf
index 6b32e2b..29c6304 100644
--- a/apache_hbase_reference_guide.pdf
+++ b/apache_hbase_reference_guide.pdf
@@ -5,16 +5,16 @@
 /Author (Apache HBase Team)
 /Creator (Asciidoctor PDF 1.5.0.alpha.15, based on Prawn 2.2.2)
 /Producer (Apache HBase Team)
-/ModDate (D:20180524144504+00'00')
-/CreationDate (D:20180524144504+00'00')
+/ModDate (D:20180525144453+00'00')
+/CreationDate (D:20180525144453+00'00')
 >>
 endobj
 2 0 obj
 << /Type /Catalog
 /Pages 3 0 R
 /Names 26 0 R
-/Outlines 4644 0 R
-/PageLabels 4871 0 R
+/Outlines 4647 0 R
+/PageLabels 4874 0 R
 /PageMode /UseOutlines
 /OpenAction [7 0 R /FitH 842.89]
 /ViewerPreferences << /DisplayDocTitle true
@@ -23,8 +23,8 @@ endobj
 endobj
 3 0 obj
 << /Type /Pages
-/Count 724
-/Kids [7 0 R 12 0 R 14 0 R 16 0 R 18 0 R 20 0 R 22 0 R 24 0 R 44 0 R 47 0 R 50 0 R 54 0 R 61 0 R 63 0 R 67 0 R 69 0 R 71 0 R 78 0 R 81 0 R 83 0 R 89 0 R 92 0 R 94 0 R 96 0 R 103 0 R 110 0 R 115 0 R 117 0 R 133 0 R 138 0 R 146 0 R 155 0 R 163 0 R 172 0 R 183 0 R 187 0 R 189 0 R 193 0 R 202 0 R 211 0 R 219 0 R 228 0 R 233 0 R 242 0 R 250 0 R 259 0 R 272 0 R 279 0 R 289 0 R 297 0 R 305 0 R 312 0 R 320 0 R 327 0 R 333 0 R 340 0 R 348 0 R 357 0 R 366 0 R 380 0 R 387 0 R 395 0 R 402 0 R 410 0 R 419 0 R 429 0 R 437 0 R 444 0 R 453 0 R 465 0 R 475 0 R 482 0 R 489 0 R 497 0 R 506 0 R 514 0 R 519 0 R 523 0 R 528 0 R 532 0 R 548 0 R 559 0 R 563 0 R 578 0 R 583 0 R 588 0 R 590 0 R 592 0 R 595 0 R 597 0 R 599 0 R 607 0 R 613 0 R 618 0 R 623 0 R 630 0 R 640 0 R 648 0 R 652 0 R 656 0 R 658 0 R 668 0 R 683 0 R 690 0 R 702 0 R 711 0 R 721 0 R 734 0 R 755 0 R 762 0 R 766 0 R 772 0 R 775 0 R 779 0 R 783 0 R 786 0 R 789 0 R 791 0 R 794 0 R 798 0 R 800 0 R 804 0 R 810 0 R 815 0 R 819 0 R 822 0 R 828 0 R
  830 0 R 834 0 R 842 0 R 844 0 R 847 0 R 850 0 R 853 0 R 856 0 R 870 0 R 878 0 R 889 0 R 900 0 R 906 0 R 916 0 R 927 0 R 930 0 R 934 0 R 937 0 R 942 0 R 951 0 R 959 0 R 963 0 R 967 0 R 972 0 R 976 0 R 978 0 R 994 0 R 1005 0 R 1010 0 R 1017 0 R 1020 0 R 1028 0 R 1036 0 R 1041 0 R 1046 0 R 1051 0 R 1053 0 R 1055 0 R 1057 0 R 1067 0 R 1075 0 R 1079 0 R 1086 0 R 1093 0 R 1101 0 R 1105 0 R 1111 0 R 1116 0 R 1124 0 R 1128 0 R 1133 0 R 1135 0 R 1141 0 R 1149 0 R 1155 0 R 1162 0 R 1173 0 R 1177 0 R 1179 0 R 1181 0 R 1185 0 R 1188 0 R 1193 0 R 1196 0 R 1208 0 R 1212 0 R 1218 0 R 1226 0 R 1231 0 R 1235 0 R 1239 0 R 1241 0 R 1244 0 R 1247 0 R 1250 0 R 1254 0 R 1258 0 R 1262 0 R 1267 0 R 1271 0 R 1274 0 R 1276 0 R 1286 0 R 1289 0 R 1297 0 R 1306 0 R 1312 0 R 1316 0 R 1318 0 R 1329 0 R 1332 0 R 1338 0 R 1346 0 R 1349 0 R 1356 0 R 1364 0 R 1366 0 R 1368 0 R 1377 0 R 1379 0 R 1381 0 R 1384 0 R 1386 0 R 1388 0 R 1390 0 R 1392 0 R 1395 0 R 1399 0 R 1404 0 R 1406 0 R 1408 0 R 1410 0 R 1415 0 R 1422 0
  R 1428 0 R 1431 0 R 1433 0 R 1436 0 R 1440 0 R 1444 0 R 1447 0 R 1449 0 R 1451 0 R 1454 0 R 1459 0 R 1465 0 R 1473 0 R 1487 0 R 1501 0 R 1504 0 R 1509 0 R 1522 0 R 1527 0 R 1542 0 R 1550 0 R 1554 0 R 1563 0 R 1578 0 R 1592 0 R 1600 0 R 1605 0 R 1616 0 R 1621 0 R 1627 0 R 1633 0 R 1645 0 R 1648 0 R 1657 0 R 1660 0 R 1669 0 R 1675 0 R 1679 0 R 1691 0 R 1696 0 R 1702 0 R 1704 0 R 1711 0 R 1719 0 R 1727 0 R 1731 0 R 1733 0 R 1735 0 R 1747 0 R 1753 0 R 1762 0 R 1768 0 R 1781 0 R 1787 0 R 1793 0 R 1804 0 R 1810 0 R 1815 0 R 1820 0 R 1823 0 R 1826 0 R 1831 0 R 1836 0 R 1843 0 R 1847 0 R 1852 0 R 1861 0 R 1866 0 R 1871 0 R 1873 0 R 1882 0 R 1889 0 R 1895 0 R 1900 0 R 1904 0 R 1908 0 R 1913 0 R 1918 0 R 1924 0 R 1926 0 R 1928 0 R 1931 0 R 1942 0 R 1945 0 R 1952 0 R 1960 0 R 1965 0 R 1969 0 R 1974 0 R 1976 0 R 1979 0 R 1984 0 R 1987 0 R 1989 0 R 1992 0 R 1995 0 R 1998 0 R 2008 0 R 2013 0 R 2018 0 R 2020 0 R 2028 0 R 2035 0 R 2042 0 R 2048 0 R 2053 0 R 2055 0 R 2064 0 R 2074 0 R 2084 0 R 2090
  0 R 2097 0 R 2099 0 R 2104 0 R 2106 0 R 2108 0 R 2112 0 R 2115 0 R 2118 0 R 2123 0 R 2127 0 R 2138 0 R 2141 0 R 2146 0 R 2149 0 R 2151 0 R 2156 0 R 2166 0 R 2168 0 R 2170 0 R 2172 0 R 2174 0 R 2177 0 R 2179 0 R 2181 0 R 2184 0 R 2186 0 R 2188 0 R 2192 0 R 2197 0 R 2206 0 R 2208 0 R 2210 0 R 2216 0 R 2218 0 R 2223 0 R 2225 0 R 2227 0 R 2234 0 R 2239 0 R 2243 0 R 2248 0 R 2252 0 R 2254 0 R 2256 0 R 2260 0 R 2263 0 R 2265 0 R 2267 0 R 2271 0 R 2273 0 R 2276 0 R 2278 0 R 2280 0 R 2282 0 R 2289 0 R 2292 0 R 2297 0 R 2299 0 R 2301 0 R 2303 0 R 2305 0 R 2313 0 R 2324 0 R 2338 0 R 2349 0 R 2353 0 R 2358 0 R 2362 0 R 2365 0 R 2370 0 R 2376 0 R 2378 0 R 2381 0 R 2383 0 R 2385 0 R 2387 0 R 2392 0 R 2394 0 R 2407 0 R 2410 0 R 2418 0 R 2424 0 R 2436 0 R 2450 0 R 2463 0 R 2482 0 R 2484 0 R 2486 0 R 2490 0 R 2508 0 R 2514 0 R 2526 0 R 2530 0 R 2534 0 R 2543 0 R 2555 0 R 2560 0 R 2570 0 R 2583 0 R 2602 0 R 2611 0 R 2614 0 R 2623 0 R 2640 0 R 2647 0 R 2650 0 R 2655 0 R 2659 0 R 2662 0 R 2671 0 R 26
 80 0 R 2683 0 R 2685 0 R 2689 0 R 2703 0 R 2712 0 R 2717 0 R 2721 0 R 2724 0 R 2726 0 R 2728 0 R 2730 0 R 2735 0 R 2748 0 R 2758 0 R 2766 0 R 2772 0 R 2777 0 R 2788 0 R 2795 0 R 2801 0 R 2803 0 R 2812 0 R 2820 0 R 2822 0 R 2830 0 R 2838 0 R 2840 0 R 2849 0 R 2852 0 R 2862 0 R 2866 0 R 2875 0 R 2883 0 R 2888 0 R 2892 0 R 2896 0 R 2898 0 R 2904 0 R 2908 0 R 2912 0 R 2918 0 R 2924 0 R 2927 0 R 2933 0 R 2937 0 R 2946 0 R 2951 0 R 2957 0 R 2967 0 R 2973 0 R 2980 0 R 2983 0 R 2986 0 R 2993 0 R 2998 0 R 3001 0 R 3006 0 R 3016 0 R 3021 0 R 3023 0 R 3027 0 R 3034 0 R 3037 0 R 3048 0 R 3051 0 R 3058 0 R 3066 0 R 3070 0 R 3080 0 R 3085 0 R 3089 0 R 3097 0 R 3102 0 R 3106 0 R 3108 0 R 3119 0 R 3124 0 R 3127 0 R 3129 0 R 3131 0 R 3141 0 R 3148 0 R 3152 0 R 3155 0 R 3161 0 R 3165 0 R 3168 0 R 3172 0 R 3177 0 R 3185 0 R 3190 0 R 3195 0 R 3200 0 R 3202 0 R 3205 0 R 3207 0 R 3211 0 R 3222 0 R 3224 0 R 3228 0 R 3231 0 R 3235 0 R 3238 0 R 3242 0 R 3244 0 R 3257 0 R 3262 0 R 3267 0 R 3273 0 R 3281 0 R 
 3283 0 R 3291 0 R 3309 0 R 3320 0 R 3327 0 R 3343 0 R 3346 0 R 3351 0 R 3353 0 R 3360 0 R 3365 0 R 3368 0 R 3370 0 R 3372 0 R 3374 0 R 3377 0 R 3395 0 R 3398 0 R 3403 0 R 3409 0 R 3419 0 R 3424 0 R 3434 0 R 3444 0 R 3452 0 R 3457 0 R 3463 0 R 3468 0 R 3471 0 R 3479 0 R 3483 0 R 3488 0 R 3493 0 R 3506 0 R 3509 0 R 3515 0 R 3521 0 R 3526 0 R 3535 0 R 3544 0 R 3550 0 R 3559 0 R 3568 0 R 3573 0 R 3579 0 R 3585 0 R 3589 0 R 3591 0 R 3597 0 R 3604 0 R 3606 0 R 3612 0 R 3614 0 R 3620 0 R 3628 0 R 3634 0 R 3643 0 R 3650 0 R 3661 0 R 3671 0 R 3683 0 R 3696 0 R 3699 0 R 3701 0 R 3706 0 R 3721 0 R 3727 0 R 3733 0 R 3737 0 R 3740 0 R 3745 0 R 3747 0 R 3751 0 R 3753 0 R 3757 0 R 3760 0 R 3763 0 R 3771 0 R 3773 0 R 3777 0 R 3780 0 R 3788 0 R 3796 0 R 3800 0 R 3803 0 R 3805 0 R 3809 0 R 3814 0 R 3819 0 R 3822 0 R 3831 0 R 3836 0 R 3840 0 R 3843 0 R 3851 0 R 3856 0 R 3864 0 R 3869 0 R 3871 0 R 3877 0 R 3879 0 R 3884 0 R 3888 0 R 3894 0 R 3898 0 R 3910 0 R 3926 0 R 3941 0 R 3946 0 R 3949 0 R 3952 0 
 R 3958 0 R 3963 0 R 3965 0 R 3967 0 R 3969 0 R 3971 0 R 3973 0 R 3982 0 R 3986 0 R 3990 0 R 3994 0 R 3996 0 R 4003 0 R 4013 0 R 4022 0 R 4025 0 R 4028 0 R 4030 0 R 4037 0 R 4044 0 R 4054 0 R 4058 0 R 4061 0 R 4065 0 R 4069 0 R 4075 0 R 4078 0 R 4094 0 R 4099 0 R 4122 0 R 4126 0 R 4133 0 R 4144 0 R 4153 0 R 4156 0 R 4159 0 R 4162 0 R 4178 0 R 4183 0 R 4190 0 R]
+/Count 725
+/Kids [7 0 R 12 0 R 14 0 R 16 0 R 18 0 R 20 0 R 22 0 R 24 0 R 44 0 R 47 0 R 50 0 R 54 0 R 61 0 R 63 0 R 67 0 R 69 0 R 71 0 R 78 0 R 81 0 R 83 0 R 89 0 R 92 0 R 94 0 R 96 0 R 103 0 R 110 0 R 115 0 R 117 0 R 133 0 R 138 0 R 146 0 R 155 0 R 163 0 R 172 0 R 183 0 R 187 0 R 189 0 R 193 0 R 202 0 R 211 0 R 219 0 R 228 0 R 233 0 R 242 0 R 250 0 R 259 0 R 272 0 R 279 0 R 289 0 R 297 0 R 305 0 R 312 0 R 320 0 R 327 0 R 333 0 R 340 0 R 348 0 R 357 0 R 366 0 R 380 0 R 387 0 R 395 0 R 402 0 R 410 0 R 419 0 R 429 0 R 437 0 R 444 0 R 453 0 R 465 0 R 475 0 R 482 0 R 489 0 R 497 0 R 506 0 R 514 0 R 519 0 R 523 0 R 528 0 R 532 0 R 548 0 R 559 0 R 563 0 R 578 0 R 583 0 R 588 0 R 590 0 R 592 0 R 595 0 R 597 0 R 599 0 R 607 0 R 613 0 R 618 0 R 623 0 R 630 0 R 640 0 R 648 0 R 652 0 R 656 0 R 658 0 R 668 0 R 683 0 R 690 0 R 702 0 R 711 0 R 721 0 R 734 0 R 755 0 R 762 0 R 766 0 R 772 0 R 775 0 R 779 0 R 783 0 R 786 0 R 789 0 R 791 0 R 794 0 R 798 0 R 800 0 R 804 0 R 810 0 R 815 0 R 819 0 R 822 0 R 828 0 R
  830 0 R 834 0 R 842 0 R 844 0 R 847 0 R 850 0 R 853 0 R 856 0 R 870 0 R 878 0 R 889 0 R 900 0 R 906 0 R 916 0 R 927 0 R 930 0 R 934 0 R 937 0 R 942 0 R 951 0 R 959 0 R 963 0 R 967 0 R 972 0 R 976 0 R 978 0 R 994 0 R 1005 0 R 1010 0 R 1017 0 R 1020 0 R 1028 0 R 1036 0 R 1041 0 R 1046 0 R 1051 0 R 1053 0 R 1055 0 R 1057 0 R 1067 0 R 1075 0 R 1079 0 R 1086 0 R 1093 0 R 1101 0 R 1105 0 R 1111 0 R 1116 0 R 1124 0 R 1128 0 R 1133 0 R 1135 0 R 1141 0 R 1149 0 R 1155 0 R 1162 0 R 1173 0 R 1177 0 R 1179 0 R 1181 0 R 1185 0 R 1188 0 R 1193 0 R 1196 0 R 1208 0 R 1212 0 R 1218 0 R 1226 0 R 1231 0 R 1235 0 R 1239 0 R 1241 0 R 1244 0 R 1247 0 R 1250 0 R 1254 0 R 1258 0 R 1262 0 R 1267 0 R 1271 0 R 1274 0 R 1276 0 R 1286 0 R 1289 0 R 1297 0 R 1306 0 R 1312 0 R 1316 0 R 1318 0 R 1329 0 R 1332 0 R 1338 0 R 1346 0 R 1349 0 R 1356 0 R 1364 0 R 1366 0 R 1368 0 R 1377 0 R 1379 0 R 1381 0 R 1384 0 R 1386 0 R 1388 0 R 1390 0 R 1392 0 R 1395 0 R 1399 0 R 1404 0 R 1406 0 R 1408 0 R 1410 0 R 1415 0 R 1422 0
  R 1428 0 R 1431 0 R 1433 0 R 1436 0 R 1440 0 R 1444 0 R 1447 0 R 1449 0 R 1451 0 R 1454 0 R 1459 0 R 1465 0 R 1473 0 R 1487 0 R 1501 0 R 1504 0 R 1509 0 R 1522 0 R 1527 0 R 1542 0 R 1550 0 R 1554 0 R 1563 0 R 1578 0 R 1592 0 R 1600 0 R 1605 0 R 1616 0 R 1621 0 R 1627 0 R 1633 0 R 1645 0 R 1648 0 R 1657 0 R 1660 0 R 1669 0 R 1675 0 R 1679 0 R 1691 0 R 1696 0 R 1702 0 R 1704 0 R 1711 0 R 1719 0 R 1727 0 R 1731 0 R 1733 0 R 1735 0 R 1747 0 R 1753 0 R 1762 0 R 1768 0 R 1781 0 R 1787 0 R 1793 0 R 1804 0 R 1810 0 R 1815 0 R 1820 0 R 1823 0 R 1826 0 R 1831 0 R 1836 0 R 1843 0 R 1847 0 R 1852 0 R 1861 0 R 1866 0 R 1871 0 R 1873 0 R 1882 0 R 1889 0 R 1895 0 R 1900 0 R 1904 0 R 1908 0 R 1913 0 R 1918 0 R 1924 0 R 1926 0 R 1928 0 R 1931 0 R 1942 0 R 1945 0 R 1952 0 R 1960 0 R 1965 0 R 1969 0 R 1974 0 R 1976 0 R 1979 0 R 1984 0 R 1987 0 R 1989 0 R 1992 0 R 1995 0 R 1998 0 R 2008 0 R 2013 0 R 2018 0 R 2020 0 R 2028 0 R 2035 0 R 2042 0 R 2048 0 R 2053 0 R 2055 0 R 2064 0 R 2074 0 R 2084 0 R 2090
  0 R 2097 0 R 2099 0 R 2104 0 R 2106 0 R 2108 0 R 2112 0 R 2115 0 R 2118 0 R 2123 0 R 2127 0 R 2138 0 R 2141 0 R 2146 0 R 2149 0 R 2151 0 R 2156 0 R 2166 0 R 2168 0 R 2170 0 R 2172 0 R 2174 0 R 2177 0 R 2179 0 R 2181 0 R 2184 0 R 2186 0 R 2188 0 R 2192 0 R 2197 0 R 2206 0 R 2208 0 R 2210 0 R 2216 0 R 2218 0 R 2223 0 R 2225 0 R 2227 0 R 2234 0 R 2239 0 R 2243 0 R 2248 0 R 2252 0 R 2254 0 R 2256 0 R 2260 0 R 2263 0 R 2265 0 R 2267 0 R 2271 0 R 2273 0 R 2276 0 R 2278 0 R 2280 0 R 2282 0 R 2289 0 R 2292 0 R 2297 0 R 2299 0 R 2301 0 R 2303 0 R 2305 0 R 2313 0 R 2324 0 R 2338 0 R 2349 0 R 2353 0 R 2358 0 R 2362 0 R 2365 0 R 2370 0 R 2376 0 R 2378 0 R 2381 0 R 2383 0 R 2385 0 R 2387 0 R 2392 0 R 2394 0 R 2407 0 R 2410 0 R 2418 0 R 2424 0 R 2436 0 R 2450 0 R 2463 0 R 2482 0 R 2484 0 R 2486 0 R 2490 0 R 2508 0 R 2514 0 R 2526 0 R 2530 0 R 2534 0 R 2543 0 R 2555 0 R 2560 0 R 2570 0 R 2583 0 R 2602 0 R 2611 0 R 2614 0 R 2623 0 R 2640 0 R 2647 0 R 2650 0 R 2655 0 R 2659 0 R 2662 0 R 2671 0 R 26
 80 0 R 2683 0 R 2685 0 R 2689 0 R 2703 0 R 2712 0 R 2717 0 R 2721 0 R 2724 0 R 2726 0 R 2728 0 R 2730 0 R 2735 0 R 2748 0 R 2758 0 R 2766 0 R 2772 0 R 2777 0 R 2788 0 R 2795 0 R 2801 0 R 2803 0 R 2812 0 R 2820 0 R 2822 0 R 2830 0 R 2838 0 R 2840 0 R 2849 0 R 2852 0 R 2862 0 R 2866 0 R 2875 0 R 2883 0 R 2888 0 R 2892 0 R 2896 0 R 2898 0 R 2904 0 R 2908 0 R 2912 0 R 2918 0 R 2924 0 R 2927 0 R 2933 0 R 2937 0 R 2946 0 R 2951 0 R 2957 0 R 2967 0 R 2973 0 R 2980 0 R 2983 0 R 2986 0 R 2993 0 R 2998 0 R 3001 0 R 3006 0 R 3016 0 R 3021 0 R 3023 0 R 3027 0 R 3034 0 R 3037 0 R 3048 0 R 3051 0 R 3058 0 R 3066 0 R 3070 0 R 3080 0 R 3085 0 R 3089 0 R 3097 0 R 3102 0 R 3106 0 R 3108 0 R 3119 0 R 3124 0 R 3127 0 R 3129 0 R 3131 0 R 3141 0 R 3148 0 R 3152 0 R 3155 0 R 3161 0 R 3165 0 R 3168 0 R 3172 0 R 3177 0 R 3185 0 R 3190 0 R 3195 0 R 3200 0 R 3202 0 R 3205 0 R 3207 0 R 3211 0 R 3222 0 R 3224 0 R 3228 0 R 3231 0 R 3235 0 R 3238 0 R 3242 0 R 3244 0 R 3257 0 R 3262 0 R 3267 0 R 3273 0 R 3281 0 R 
 3283 0 R 3291 0 R 3309 0 R 3320 0 R 3327 0 R 3343 0 R 3346 0 R 3351 0 R 3353 0 R 3360 0 R 3363 0 R 3368 0 R 3371 0 R 3373 0 R 3375 0 R 3377 0 R 3380 0 R 3398 0 R 3401 0 R 3406 0 R 3412 0 R 3422 0 R 3427 0 R 3437 0 R 3447 0 R 3455 0 R 3460 0 R 3466 0 R 3471 0 R 3474 0 R 3482 0 R 3486 0 R 3491 0 R 3496 0 R 3509 0 R 3512 0 R 3518 0 R 3524 0 R 3529 0 R 3538 0 R 3547 0 R 3553 0 R 3562 0 R 3571 0 R 3576 0 R 3582 0 R 3588 0 R 3592 0 R 3594 0 R 3600 0 R 3607 0 R 3609 0 R 3615 0 R 3617 0 R 3623 0 R 3631 0 R 3637 0 R 3646 0 R 3653 0 R 3664 0 R 3674 0 R 3686 0 R 3699 0 R 3702 0 R 3704 0 R 3709 0 R 3724 0 R 3730 0 R 3736 0 R 3740 0 R 3743 0 R 3748 0 R 3750 0 R 3754 0 R 3756 0 R 3760 0 R 3763 0 R 3766 0 R 3774 0 R 3776 0 R 3780 0 R 3783 0 R 3791 0 R 3799 0 R 3803 0 R 3806 0 R 3808 0 R 3812 0 R 3817 0 R 3822 0 R 3825 0 R 3834 0 R 3839 0 R 3843 0 R 3846 0 R 3854 0 R 3859 0 R 3867 0 R 3872 0 R 3874 0 R 3880 0 R 3882 0 R 3887 0 R 3891 0 R 3897 0 R 3901 0 R 3913 0 R 3929 0 R 3944 0 R 3949 0 R 3952 0 
 R 3955 0 R 3961 0 R 3966 0 R 3968 0 R 3970 0 R 3972 0 R 3974 0 R 3976 0 R 3985 0 R 3989 0 R 3993 0 R 3997 0 R 3999 0 R 4006 0 R 4016 0 R 4025 0 R 4028 0 R 4031 0 R 4033 0 R 4040 0 R 4047 0 R 4057 0 R 4061 0 R 4064 0 R 4068 0 R 4072 0 R 4078 0 R 4081 0 R 4097 0 R 4102 0 R 4125 0 R 4129 0 R 4136 0 R 4147 0 R 4156 0 R 4159 0 R 4162 0 R 4165 0 R 4181 0 R 4186 0 R 4193 0 R]
 >>
 endobj
 4 0 obj
@@ -187,11 +187,11 @@ endobj
 << /Type /Font
 /BaseFont /71be00+NotoSerif
 /Subtype /TrueType
-/FontDescriptor 4873 0 R
+/FontDescriptor 4876 0 R
 /FirstChar 32
 /LastChar 255
-/Widths 4875 0 R
-/ToUnicode 4874 0 R
+/Widths 4878 0 R
+/ToUnicode 4877 0 R
 >>
 endobj
 11 0 obj
@@ -1750,7 +1750,7 @@ endobj
 /F1.0 10 0 R
 >>
 >>
-/Annots [4192 0 R 4193 0 R 4194 0 R 4195 0 R 4196 0 R 4197 0 R 4198 0 R 4199 0 R 4200 0 R 4201 0 R 4202 0 R 4203 0 R 4204 0 R 4205 0 R 4206 0 R 4207 0 R 4208 0 R 4209 0 R 4210 0 R 4211 0 R 4212 0 R 4213 0 R 4214 0 R 4215 0 R 4216 0 R 4217 0 R 4218 0 R 4219 0 R 4220 0 R 4221 0 R 4222 0 R 4223 0 R 4224 0 R 4225 0 R 4226 0 R 4227 0 R 4228 0 R 4229 0 R 4230 0 R 4231 0 R 4232 0 R 4233 0 R 4234 0 R 4235 0 R 4236 0 R 4237 0 R 4238 0 R 4239 0 R 4240 0 R 4241 0 R 4242 0 R 4243 0 R 4244 0 R 4245 0 R 4246 0 R 4247 0 R 4248 0 R 4249 0 R 4250 0 R 4251 0 R 4252 0 R 4253 0 R 4254 0 R 4255 0 R 4256 0 R 4257 0 R 4258 0 R 4259 0 R 4260 0 R 4261 0 R 4262 0 R 4263 0 R 4264 0 R 4265 0 R 4266 0 R 4267 0 R]
+/Annots [4195 0 R 4196 0 R 4197 0 R 4198 0 R 4199 0 R 4200 0 R 4201 0 R 4202 0 R 4203 0 R 4204 0 R 4205 0 R 4206 0 R 4207 0 R 4208 0 R 4209 0 R 4210 0 R 4211 0 R 4212 0 R 4213 0 R 4214 0 R 4215 0 R 4216 0 R 4217 0 R 4218 0 R 4219 0 R 4220 0 R 4221 0 R 4222 0 R 4223 0 R 4224 0 R 4225 0 R 4226 0 R 4227 0 R 4228 0 R 4229 0 R 4230 0 R 4231 0 R 4232 0 R 4233 0 R 4234 0 R 4235 0 R 4236 0 R 4237 0 R 4238 0 R 4239 0 R 4240 0 R 4241 0 R 4242 0 R 4243 0 R 4244 0 R 4245 0 R 4246 0 R 4247 0 R 4248 0 R 4249 0 R 4250 0 R 4251 0 R 4252 0 R 4253 0 R 4254 0 R 4255 0 R 4256 0 R 4257 0 R 4258 0 R 4259 0 R 4260 0 R 4261 0 R 4262 0 R 4263 0 R 4264 0 R 4265 0 R 4266 0 R 4267 0 R 4268 0 R 4269 0 R 4270 0 R]
 >>
 endobj
 13 0 obj
@@ -3417,7 +3417,7 @@ endobj
 /Font << /F1.0 10 0 R
 >>
 >>
-/Annots [4268 0 R 4269 0 R 4270 0 R 4271 0 R 4272 0 R 4273 0 R 4274 0 R 4275 0 R 4276 0 R 4277 0 R 4278 0 R 4279 0 R 4280 0 R 4281 0 R 4282 0 R 4283 0 R 4284 0 R 4285 0 R 4286 0 R 4287 0 R 4288 0 R 4289 0 R 4290 0 R 4291 0 R 4292 0 R 4293 0 R 4294 0 R 4295 0 R 4296 0 R 4297 0 R 4298 0 R 4299 0 R 4300 0 R 4301 0 R 4302 0 R 4303 0 R 4304 0 R 4305 0 R 4306 0 R 4307 0 R 4308 0 R 4309 0 R 4310 0 R 4311 0 R 4312 0 R 4313 0 R 4314 0 R 4315 0 R 4316 0 R 4317 0 R 4318 0 R 4319 0 R 4320 0 R 4321 0 R 4322 0 R 4323 0 R 4324 0 R 4325 0 R 4326 0 R 4327 0 R 4328 0 R 4329 0 R 4330 0 R 4331 0 R 4332 0 R 4333 0 R 4334 0 R 4335 0 R 4336 0 R 4337 0 R 4338 0 R 4339 0 R 4340 0 R 4341 0 R 4342 0 R 4343 0 R 4344 0 R 4345 0 R 4346 0 R 4347 0 R 4348 0 R 4349 0 R]
+/Annots [4271 0 R 4272 0 R 4273 0 R 4274 0 R 4275 0 R 4276 0 R 4277 0 R 4278 0 R 4279 0 R 4280 0 R 4281 0 R 4282 0 R 4283 0 R 4284 0 R 4285 0 R 4286 0 R 4287 0 R 4288 0 R 4289 0 R 4290 0 R 4291 0 R 4292 0 R 4293 0 R 4294 0 R 4295 0 R 4296 0 R 4297 0 R 4298 0 R 4299 0 R 4300 0 R 4301 0 R 4302 0 R 4303 0 R 4304 0 R 4305 0 R 4306 0 R 4307 0 R 4308 0 R 4309 0 R 4310 0 R 4311 0 R 4312 0 R 4313 0 R 4314 0 R 4315 0 R 4316 0 R 4317 0 R 4318 0 R 4319 0 R 4320 0 R 4321 0 R 4322 0 R 4323 0 R 4324 0 R 4325 0 R 4326 0 R 4327 0 R 4328 0 R 4329 0 R 4330 0 R 4331 0 R 4332 0 R 4333 0 R 4334 0 R 4335 0 R 4336 0 R 4337 0 R 4338 0 R 4339 0 R 4340 0 R 4341 0 R 4342 0 R 4343 0 R 4344 0 R 4345 0 R 4346 0 R 4347 0 R 4348 0 R 4349 0 R 4350 0 R 4351 0 R 4352 0 R]
 >>
 endobj
 15 0 obj
@@ -5084,7 +5084,7 @@ endobj
 /Font << /F1.0 10 0 R
 >>
 >>
-/Annots [4350 0 R 4351 0 R 4352 0 R 4353 0 R 4354 0 R 4355 0 R 4356 0 R 4357 0 R 4358 0 R 4359 0 R 4360 0 R 4361 0 R 4362 0 R 4363 0 R 4364 0 R 4365 0 R 4366 0 R 4367 0 R 4368 0 R 4369 0 R 4370 0 R 4371 0 R 4372 0 R 4373 0 R 4374 0 R 4375 0 R 4376 0 R 4377 0 R 4378 0 R 4379 0 R 4380 0 R 4381 0 R 4382 0 R 4383 0 R 4384 0 R 4385 0 R 4386 0 R 4387 0 R 4388 0 R 4389 0 R 4390 0 R 4391 0 R 4392 0 R 4393 0 R 4394 0 R 4395 0 R 4396 0 R 4397 0 R 4398 0 R 4399 0 R 4400 0 R 4401 0 R 4402 0 R 4403 0 R 4404 0 R 4405 0 R 4406 0 R 4407 0 R 4408 0 R 4409 0 R 4410 0 R 4411 0 R 4412 0 R 4413 0 R 4414 0 R 4415 0 R 4416 0 R 4417 0 R 4418 0 R 4419 0 R 4420 0 R 4421 0 R 4422 0 R 4423 0 R 4424 0 R 4425 0 R 4426 0 R 4427 0 R 4428 0 R 4429 0 R 4430 0 R 4431 0 R]
+/Annots [4353 0 R 4354 0 R 4355 0 R 4356 0 R 4357 0 R 4358 0 R 4359 0 R 4360 0 R 4361 0 R 4362 0 R 4363 0 R 4364 0 R 4365 0 R 4366 0 R 4367 0 R 4368 0 R 4369 0 R 4370 0 R 4371 0 R 4372 0 R 4373 0 R 4374 0 R 4375 0 R 4376 0 R 4377 0 R 4378 0 R 4379 0 R 4380 0 R 4381 0 R 4382 0 R 4383 0 R 4384 0 R 4385 0 R 4386 0 R 4387 0 R 4388 0 R 4389 0 R 4390 0 R 4391 0 R 4392 0 R 4393 0 R 4394 0 R 4395 0 R 4396 0 R 4397 0 R 4398 0 R 4399 0 R 4400 0 R 4401 0 R 4402 0 R 4403 0 R 4404 0 R 4405 0 R 4406 0 R 4407 0 R 4408 0 R 4409 0 R 4410 0 R 4411 0 R 4412 0 R 4413 0 R 4414 0 R 4415 0 R 4416 0 R 4417 0 R 4418 0 R 4419 0 R 4420 0 R 4421 0 R 4422 0 R 4423 0 R 4424 0 R 4425 0 R 4426 0 R 4427 0 R 4428 0 R 4429 0 R 4430 0 R 4431 0 R 4432 0 R 4433 0 R 4434 0 R]
 >>
 endobj
 17 0 obj
@@ -6751,7 +6751,7 @@ endobj
 /Font << /F1.0 10 0 R
 >>
 >>
-/Annots [4432 0 R 4433 0 R 4434 0 R 4435 0 R 4436 0 R 4437 0 R 4438 0 R 4439 0 R 4440 0 R 4441 0 R 4442 0 R 4443 0 R 4444 0 R 4445 0 R 4446 0 R 4447 0 R 4448 0 R 4449 0 R 4450 0 R 4451 0 R 4452 0 R 4453 0 R 4454 0 R 4455 0 R 4456 0 R 4457 0 R 4458 0 R 4459 0 R 4460 0 R 4461 0 R 4462 0 R 4463 0 R 4464 0 R 4465 0 R 4466 0 R 4467 0 R 4468 0 R 4469 0 R 4470 0 R 4471 0 R 4472 0 R 4473 0 R 4474 0 R 4475 0 R 4476 0 R 4477 0 R 4478 0 R 4479 0 R 4480 0 R 4481 0 R 4482 0 R 4483 0 R 4484 0 R 4485 0 R 4486 0 R 4487 0 R 4488 0 R 4489 0 R 4490 0 R 4491 0 R 4492 0 R 4493 0 R 4494 0 R 4495 0 R 4496 0 R 4497 0 R 4498 0 R 4499 0 R 4500 0 R 4501 0 R 4502 0 R 4503 0 R 4504 0 R 4505 0 R 4506 0 R 4507 0 R 4508 0 R 4509 0 R 4510 0 R 4511 0 R 4512 0 R 4513 0 R]
+/Annots [4435 0 R 4436 0 R 4437 0 R 4438 0 R 4439 0 R 4440 0 R 4441 0 R 4442 0 R 4443 0 R 4444 0 R 4445 0 R 4446 0 R 4447 0 R 4448 0 R 4449 0 R 4450 0 R 4451 0 R 4452 0 R 4453 0 R 4454 0 R 4455 0 R 4456 0 R 4457 0 R 4458 0 R 4459 0 R 4460 0 R 4461 0 R 4462 0 R 4463 0 R 4464 0 R 4465 0 R 4466 0 R 4467 0 R 4468 0 R 4469 0 R 4470 0 R 4471 0 R 4472 0 R 4473 0 R 4474 0 R 4475 0 R 4476 0 R 4477 0 R 4478 0 R 4479 0 R 4480 0 R 4481 0 R 4482 0 R 4483 0 R 4484 0 R 4485 0 R 4486 0 R 4487 0 R 4488 0 R 4489 0 R 4490 0 R 4491 0 R 4492 0 R 4493 0 R 4494 0 R 4495 0 R 4496 0 R 4497 0 R 4498 0 R 4499 0 R 4500 0 R 4501 0 R 4502 0 R 4503 0 R 4504 0 R 4505 0 R 4506 0 R 4507 0 R 4508 0 R 4509 0 R 4510 0 R 4511 0 R 4512 0 R 4513 0 R 4514 0 R 4515 0 R 4516 0 R]
 >>
 endobj
 19 0 obj
@@ -7556,7 +7556,7 @@ ET
 BT
 529.4315 443.556 Td
 /F1.0 10.5 Tf
-<353736> Tj
+<353737> Tj
 ET
 
 0.0 0.0 0.0 SCN
@@ -7596,7 +7596,7 @@ ET
 BT
 529.4315 425.076 Td
 /F1.0 10.5 Tf
-<353831> Tj
+<353832> Tj
 ET
 
 0.0 0.0 0.0 SCN
@@ -7636,7 +7636,7 @@ ET
 BT
 529.4315 406.596 Td
 /F1.0 10.5 Tf
-<353832> Tj
+<353833> Tj
 ET
 
 0.0 0.0 0.0 SCN
@@ -7676,7 +7676,7 @@ ET
 BT
 529.4315 388.116 Td
 /F1.0 10.5 Tf
-<353835> Tj
+<353836> Tj
 ET
 
 0.0 0.0 0.0 SCN
@@ -7716,7 +7716,7 @@ ET
 BT
 529.4315 369.636 Td
 /F1.0 10.5 Tf
-<353836> Tj
+<353837> Tj
 ET
 
 0.0 0.0 0.0 SCN
@@ -7756,7 +7756,7 @@ ET
 BT
 529.4315 351.156 Td
 /F1.0 10.5 Tf
-<353839> Tj
+<353930> Tj
 ET
 
 0.0 0.0 0.0 SCN
@@ -7796,7 +7796,7 @@ ET
 BT
 529.4315 332.676 Td
 /F1.0 10.5 Tf
-<353933> Tj
+<353934> Tj
 ET
 
 0.0 0.0 0.0 SCN
@@ -7836,7 +7836,7 @@ ET
 BT
 529.4315 314.196 Td
 /F1.0 10.5 Tf
-<363031> Tj
+<363032> Tj
 ET
 
 0.0 0.0 0.0 SCN
@@ -7876,7 +7876,7 @@ ET
 BT
 529.4315 295.716 Td
 /F1.0 10.5 Tf
-<363032> Tj
+<363033> Tj
 ET
 
 0.0 0.0 0.0 SCN
@@ -7916,7 +7916,7 @@ ET
 BT
 529.4315 277.236 Td
 /F1.0 10.5 Tf
-<363033> Tj
+<363034> Tj
 ET
 
 0.0 0.0 0.0 SCN
@@ -7967,7 +7967,7 @@ ET
 BT
 529.4315 258.756 Td
 /F1.0 10.5 Tf
-<363034> Tj
+<363035> Tj
 ET
 
 0.0 0.0 0.0 SCN
@@ -8007,7 +8007,7 @@ ET
 BT
 529.4315 240.276 Td
 /F1.0 10.5 Tf
-<363035> Tj
+<363036> Tj
 ET
 
 0.0 0.0 0.0 SCN
@@ -8047,7 +8047,7 @@ ET
 BT
 529.4315 221.796 Td
 /F1.0 10.5 Tf
-<363139> Tj
+<363230> Tj
 ET
 
 0.0 0.0 0.0 SCN
@@ -8087,7 +8087,7 @@ ET
 BT
 529.4315 203.316 Td
 /F1.0 10.5 Tf
-<363333> Tj
+<363334> Tj
 ET
 
 0.0 0.0 0.0 SCN
@@ -8127,7 +8127,7 @@ ET
 BT
 529.4315 184.836 Td
 /F1.0 10.5 Tf
-<363334> Tj
+<363335> Tj
 ET
 
 0.0 0.0 0.0 SCN
@@ -8167,7 +8167,7 @@ ET
 BT
 529.4315 166.356 Td
 /F1.0 10.5 Tf
-<363336> Tj
+<363337> Tj
 ET
 
 0.0 0.0 0.0 SCN
@@ -8207,7 +8207,7 @@ ET
 BT
 529.4315 147.876 Td
 /F1.0 10.5 Tf
-<363338> Tj
+<363339> Tj
 ET
 
 0.0 0.0 0.0 SCN
@@ -8247,7 +8247,7 @@ ET
 BT
 529.4315 129.396 Td
 /F1.0 10.5 Tf
-<363430> Tj
+<363431> Tj
 ET
 
 0.0 0.0 0.0 SCN
@@ -8287,7 +8287,7 @@ ET
 BT
 529.4315 110.916 Td
 /F1.0 10.5 Tf
-<363432> Tj
+<363433> Tj
 ET
 
 0.0 0.0 0.0 SCN
@@ -8327,7 +8327,7 @@ ET
 BT
 529.4315 92.436 Td
 /F1.0 10.5 Tf
-<363433> Tj
+<363434> Tj
 ET
 
 0.0 0.0 0.0 SCN
@@ -8367,7 +8367,7 @@ ET
 BT
 529.4315 73.956 Td
 /F1.0 10.5 Tf
-<363435> Tj
+<363436> Tj
 ET
 
 0.0 0.0 0.0 SCN
@@ -8407,7 +8407,7 @@ ET
 BT
 529.4315 55.476 Td
 /F1.0 10.5 Tf
-<363437> Tj
+<363438> Tj
 ET
 
 0.0 0.0 0.0 SCN
@@ -8429,7 +8429,7 @@ endobj
 /Font << /F1.0 10 0 R
 >>
 >>
-/Annots [4514 0 R 4515 0 R 4516 0 R 4517 0 R 4518 0 R 4519 0 R 4520 0 R 4521 0 R 4522 0 R 4523 0 R 4524 0 R 4525 0 R 4526 0 R 4527 0 R 4528 0 R 4529 0 R 4530 0 R 4531 0 R 4532 0 R 4533 0 R 4534 0 R 4535 0 R 4536 0 R 4537 0 R 4538 0 R 4539 0 R 4540 0 R 4541 0 R 4542 0 R 4543 0 R 4544 0 R 4545 0 R 4546 0 R 4547 0 R 4548 0 R 4549 0 R 4550 0 R 4551 0 R 4552 0 R 4553 0 R 4554 0 R 4555 0 R 4556 0 R 4557 0 R 4558 0 R 4559 0 R 4560 0 R 4561 0 R 4562 0 R 4563 0 R 4564 0 R 4565 0 R 4566 0 R 4567 0 R 4568 0 R 4569 0 R 4570 0 R 4571 0 R 4572 0 R 4573 0 R 4574 0 R 4575 0 R 4576 0 R 4577 0 R 4578 0 R 4579 0 R 4580 0 R 4581 0 R 4582 0 R 4583 0 R 4584 0 R 4585 0 R 4586 0 R 4587 0 R 4588 0 R 4589 0 R 4590 0 R 4591 0 R 4592 0 R 4593 0 R 4594 0 R 4595 0 R 4596 0 R 4597 0 R]
+/Annots [4517 0 R 4518 0 R 4519 0 R 4520 0 R 4521 0 R 4522 0 R 4523 0 R 4524 0 R 4525 0 R 4526 0 R 4527 0 R 4528 0 R 4529 0 R 4530 0 R 4531 0 R 4532 0 R 4533 0 R 4534 0 R 4535 0 R 4536 0 R 4537 0 R 4538 0 R 4539 0 R 4540 0 R 4541 0 R 4542 0 R 4543 0 R 4544 0 R 4545 0 R 4546 0 R 4547 0 R 4548 0 R 4549 0 R 4550 0 R 4551 0 R 4552 0 R 4553 0 R 4554 0 R 4555 0 R 4556 0 R 4557 0 R 4558 0 R 4559 0 R 4560 0 R 4561 0 R 4562 0 R 4563 0 R 4564 0 R 4565 0 R 4566 0 R 4567 0 R 4568 0 R 4569 0 R 4570 0 R 4571 0 R 4572 0 R 4573 0 R 4574 0 R 4575 0 R 4576 0 R 4577 0 R 4578 0 R 4579 0 R 4580 0 R 4581 0 R 4582 0 R 4583 0 R 4584 0 R 4585 0 R 4586 0 R 4587 0 R 4588 0 R 4589 0 R 4590 0 R 4591 0 R 4592 0 R 4593 0 R 4594 0 R 4595 0 R 4596 0 R 4597 0 R 4598 0 R 4599 0 R 4600 0 R]
 >>
 endobj
 21 0 obj
@@ -8474,7 +8474,7 @@ ET
 BT
 529.4315 794.676 Td
 /F1.0 10.5 Tf
-<363438> Tj
+<363439> Tj
 ET
 
 0.0 0.0 0.0 SCN
@@ -8514,7 +8514,7 @@ ET
 BT
 529.4315 776.196 Td
 /F1.0 10.5 Tf
-<363535> Tj
+<363536> Tj
 ET
 
 0.0 0.0 0.0 SCN
@@ -8554,7 +8554,7 @@ ET
 BT
 529.4315 757.716 Td
 /F1.0 10.5 Tf
-<363536> Tj
+<363537> Tj
 ET
 
 0.0 0.0 0.0 SCN
@@ -8594,7 +8594,7 @@ ET
 BT
 529.4315 739.236 Td
 /F1.0 10.5 Tf
-<363537> Tj
+<363538> Tj
 ET
 
 0.0 0.0 0.0 SCN
@@ -8634,7 +8634,7 @@ ET
 BT
 529.4315 720.756 Td
 /F1.0 10.5 Tf
-<363538> Tj
+<363539> Tj
 ET
 
 0.0 0.0 0.0 SCN
@@ -8674,7 +8674,7 @@ ET
 BT
 529.4315 702.276 Td
 /F1.0 10.5 Tf
-<363539> Tj
+<363630> Tj
 ET
 
 0.0 0.0 0.0 SCN
@@ -8714,7 +8714,7 @@ ET
 BT
 529.4315 683.796 Td
 /F1.0 10.5 Tf
-<363630> Tj
+<363631> Tj
 ET
 
 0.0 0.0 0.0 SCN
@@ -8754,7 +8754,7 @@ ET
 BT
 529.4315 665.316 Td
 /F1.0 10.5 Tf
-<363731> Tj
+<363732> Tj
 ET
 
 0.0 0.0 0.0 SCN
@@ -8794,7 +8794,7 @@ ET
 BT
 529.4315 646.836 Td
 /F1.0 10.5 Tf
-<363734> Tj
+<363735> Tj
 ET
 
 0.0 0.0 0.0 SCN
@@ -8834,7 +8834,7 @@ ET
 BT
 529.4315 628.356 Td
 /F1.0 10.5 Tf
-<363738> Tj
+<363739> Tj
 ET
 
 0.0 0.0 0.0 SCN
@@ -8874,7 +8874,7 @@ ET
 BT
 529.4315 609.876 Td
 /F1.0 10.5 Tf
-<363834> Tj
+<363835> Tj
 ET
 
 0.0 0.0 0.0 SCN
@@ -8914,7 +8914,7 @@ ET
 BT
 529.4315 591.396 Td
 /F1.0 10.5 Tf
-<363935> Tj
+<363936> Tj
 ET
 
 0.0 0.0 0.0 SCN
@@ -8954,7 +8954,7 @@ ET
 BT
 529.4315 572.916 Td
 /F1.0 10.5 Tf
-<363936> Tj
+<363937> Tj
 ET
 
 0.0 0.0 0.0 SCN
@@ -8994,7 +8994,7 @@ ET
 BT
 529.4315 554.436 Td
 /F1.0 10.5 Tf
-<363937> Tj
+<363938> Tj
 ET
 
 0.0 0.0 0.0 SCN
@@ -9034,7 +9034,7 @@ ET
 BT
 529.4315 535.956 Td
 /F1.0 10.5 Tf
-<373036> Tj
+<373037> Tj
 ET
 
 0.0 0.0 0.0 SCN
@@ -9074,7 +9074,7 @@ ET
 BT
 529.4315 517.476 Td
 /F1.0 10.5 Tf
-<373037> Tj
+<373038> Tj
 ET
 
 0.0 0.0 0.0 SCN
@@ -9114,7 +9114,7 @@ ET
 BT
 529.4315 498.996 Td
 /F1.0 10.5 Tf
-<373038> Tj
+<373039> Tj
 ET
 
 0.0 0.0 0.0 SCN
@@ -9154,7 +9154,7 @@ ET
 BT
 529.4315 480.516 Td
 /F1.0 10.5 Tf
-<373039> Tj
+<373130> Tj
 ET
 
 0.0 0.0 0.0 SCN
@@ -9194,7 +9194,7 @@ ET
 BT
 529.4315 462.036 Td
 /F1.0 10.5 Tf
-<373130> Tj
+<373131> Tj
 ET
 
 0.0 0.0 0.0 SCN
@@ -9234,7 +9234,7 @@ ET
 BT
 529.4315 443.556 Td
 /F1.0 10.5 Tf
-<373132> Tj
+<373133> Tj
 ET
 
 0.0 0.0 0.0 SCN
@@ -9274,7 +9274,7 @@ ET
 BT
 529.4315 425.076 Td
 /F1.0 10.5 Tf
-<373133> Tj
+<373134> Tj
 ET
 
 0.0 0.0 0.0 SCN
@@ -9314,7 +9314,7 @@ ET
 BT
 529.4315 406.596 Td
 /F1.0 10.5 Tf
-<373134> Tj
+<373135> Tj
 ET
 
 0.0 0.0 0.0 SCN
@@ -9336,7 +9336,7 @@ endobj
 /Font << /F1.0 10 0 R
 >>
 >>
-/Annots [4598 0 R 4599 0 R 4600 0 R 4601 0 R 4602 0 R 4603 0 R 4604 0 R 4605 0 R 4606 0 R 4607 0 R 4608 0 R 4609 0 R 4610 0 R 4611 0 R 4612 0 R 4613 0 R 4614 0 R 4615 0 R 4616 0 R 4617 0 R 4618 0 R 4619 0 R 4620 0 R 4621 0 R 4622 0 R 4623 0 R 4624 0 R 4625 0 R 4626 0 R 4627 0 R 4628 0 R 4629 0 R 4630 0 R 4631 0 R 4632 0 R 4633 0 R 4634 0 R 4635 0 R 4636 0 R 4637 0 R 4638 0 R 4639 0 R 4640 0 R 4641 0 R]
+/Annots [4601 0 R 4602 0 R 4603 0 R 4604 0 R 4605 0 R 4606 0 R 4607 0 R 4608 0 R 4609 0 R 4610 0 R 4611 0 R 4612 0 R 4613 0 R 4614 0 R 4615 0 R 4616 0 R 4617 0 R 4618 0 R 4619 0 R 4620 0 R 4621 0 R 4622 0 R 4623 0 R 4624 0 R 4625 0 R 4626 0 R 4627 0 R 4628 0 R 4629 0 R 4630 0 R 4631 0 R 4632 0 R 4633 0 R 4634 0 R 4635 0 R 4636 0 R 4637 0 R 4638 0 R 4639 0 R 4640 0 R 4641 0 R 4642 0 R 4643 0 R 4644 0 R]
 >>
 endobj
 23 0 obj
@@ -10148,7 +10148,7 @@ endobj
 /F4.0 35 0 R
 /F1.1 38 0 R
 >>
-/XObject << /Stamp1 4642 0 R
+/XObject << /Stamp1 4645 0 R
 >>
 >>
 /Annots [30 0 R 31 0 R 32 0 R 34 0 R 36 0 R 37 0 R 39 0 R 40 0 R 41 0 R]
@@ -10163,7 +10163,7 @@ endobj
 >>
 endobj
 27 0 obj
-<< /Kids [643 0 R 3659 0 R 1935 0 R 644 0 R 4019 0 R 1165 0 R 2550 0 R 3791 0 R]
+<< /Kids [643 0 R 3662 0 R 1935 0 R 644 0 R 4022 0 R 1165 0 R 2550 0 R 3794 0 R]
 >>
 endobj
 28 0 obj
@@ -10173,11 +10173,11 @@ endobj
 << /Type /Font
 /BaseFont /358635+NotoSerif-Bold
 /Subtype /TrueType
-/FontDescriptor 4877 0 R
+/FontDescriptor 4880 0 R
 /FirstChar 32
 /LastChar 255
-/Widths 4879 0 R
-/ToUnicode 4878 0 R
+/Widths 4882 0 R
+/ToUnicode 4881 0 R
 >>
 endobj
 30 0 obj
@@ -10217,11 +10217,11 @@ endobj
 << /Type /Font
 /BaseFont /260f03+NotoSerif-Italic
 /Subtype /TrueType
-/FontDescriptor 4881 0 R
+/FontDescriptor 4884 0 R
 /FirstChar 32
 /LastChar 255
-/Widths 4883 0 R
-/ToUnicode 4882 0 R
+/Widths 4886 0 R
+/ToUnicode 4885 0 R
 >>
 endobj
 34 0 obj
@@ -10239,11 +10239,11 @@ endobj
 << /Type /Font
 /BaseFont /c7d210+mplus1mn-regular
 /Subtype /TrueType
-/FontDescriptor 4885 0 R
+/FontDescriptor 4888 0 R
 /FirstChar 32
 /LastChar 255
-/Widths 4887 0 R
-/ToUnicode 4886 0 R
+/Widths 4890 0 R
+/ToUnicode 4889 0 R
 >>
 endobj
 36 0 obj
@@ -10269,11 +10269,11 @@ endobj
 << /Type /Font
 /BaseFont /34c70d+NotoSerif
 /Subtype /TrueType
-/FontDescriptor 4889 0 R
+/FontDescriptor 4892 0 R
 /FirstChar 32
 /LastChar 255
-/Widths 4891 0 R
-/ToUnicode 4890 0 R
+/Widths 4894 0 R
+/ToUnicode 4893 0 R
 >>
 endobj
 39 0 obj
@@ -10707,7 +10707,7 @@ endobj
 /F5.1 45 0 R
 /F2.0 29 0 R
 >>
-/XObject << /Stamp2 4643 0 R
+/XObject << /Stamp2 4646 0 R
 >>
 >>
 >>
@@ -10716,11 +10716,11 @@ endobj
 << /Type /Font
 /BaseFont /26ec65+FontAwesome
 /Subtype /TrueType
-/FontDescriptor 4893 0 R
+/FontDescriptor 4896 0 R
 /FirstChar 32
 /LastChar 255
-/Widths 4895 0 R
-/ToUnicode 4894 0 R
+/Widths 4898 0 R
+/ToUnicode 4897 0 R
 >>
 endobj
 46 0 obj
@@ -10778,7 +10778,7 @@ endobj
 /Font << /F2.0 29 0 R
 /F1.0 10 0 R
 >>
-/XObject << /Stamp1 4642 0 R
+/XObject << /Stamp1 4645 0 R
 >>
 >>
 >>
@@ -10863,7 +10863,7 @@ endobj
 /Font << /F2.0 29 0 R
 /F1.0 10 0 R
 >>
-/XObject << /Stamp2 4643 0 R
+/XObject << /Stamp2 4646 0 R
 >>
 >>
 /Annots [52 0 R]
@@ -12436,7 +12436,7 @@ endobj
 /F1.1 38 0 R
 /F4.0 35 0 R
 >>
-/XObject << /Stamp1 4642 0 R
+/XObject << /Stamp1 4645 0 R
 >>
 >>
 /Annots [57 0 R 59 0 R]
@@ -13556,7 +13556,7 @@ endobj
 /F1.0 10 0 R
 /F5.1 45 0 R
 >>
-/XObject << /Stamp2 4643 0 R
+/XObject << /Stamp2 4646 0 R
 >>
 >>
 >>
@@ -14435,7 +14435,7 @@ endobj
 /F3.0 33 0 R
 /F5.1 45 0 R
 >>
-/XObject << /Stamp1 4642 0 R
+/XObject << /Stamp1 4645 0 R
 >>
 >>
 /Annots [64 0 R]
@@ -15225,7 +15225,7 @@ endobj
 /Font << /F4.0 35 0 R
 /F1.0 10 0 R
 >>
-/XObject << /Stamp2 4643 0 R
+/XObject << /Stamp2 4646 0 R
 >>
 >>
 >>
@@ -15944,7 +15944,7 @@ endobj
 /Font << /F4.0 35 0 R
 /F1.0 10 0 R
 >>
-/XObject << /Stamp1 4642 0 R
+/XObject << /Stamp1 4645 0 R
 >>
 >>
 >>
@@ -16820,7 +16820,7 @@ endobj
 /F2.0 29 0 R
 /F5.1 45 0 R
 >>
-/XObject << /Stamp2 4643 0 R
+/XObject << /Stamp2 4646 0 R
 >>
 >>
 /Annots [73 0 R 74 0 R 75 0 R 76 0 R]
@@ -17810,7 +17810,7 @@ endobj
 /F1.0 10 0 R
 /F3.0 33 0 R
 >>
-/XObject << /Stamp1 4642 0 R
+/XObject << /Stamp1 4645 0 R
 >>
 >>
 /Annots [79 0 R]
@@ -18733,7 +18733,7 @@ endobj
 /F4.0 35 0 R
 /F3.0 33 0 R
 >>
-/XObject << /Stamp2 4643 0 R
+/XObject << /Stamp2 4646 0 R
 >>
 >>
 >>
@@ -20244,7 +20244,7 @@ endobj
 /F4.0 35 0 R
 /F5.1 45 0 R
 >>
-/XObject << /Stamp1 4642 0 R
+/XObject << /Stamp1 4645 0 R
 >>
 >>
 /Annots [84 0 R 86 0 R]
@@ -21592,7 +21592,7 @@ endobj
 /F4.0 35 0 R
 /F3.0 33 0 R
 >>
-/XObject << /Stamp2 4643 0 R
+/XObject << /Stamp2 4646 0 R
 >>
 >>
 /Annots [90 0 R]
@@ -22666,7 +22666,7 @@ endobj
 /F1.0 10 0 R
 /F3.0 33 0 R
 >>
-/XObject << /Stamp1 4642 0 R
+/XObject << /Stamp1 4645 0 R
 >>
 >>
 >>
@@ -23389,7 +23389,7 @@ endobj
 /F1.0 10 0 R
 /F3.0 33 0 R
 >>
-/XObject << /Stamp2 4643 0 R
+/XObject << /Stamp2 4646 0 R
 >>
 >>
 >>
@@ -24028,7 +24028,7 @@ endobj
 /F4.0 35 0 R
 /F2.0 29 0 R
 >>
-/XObject << /Stamp1 4642 0 R
+/XObject << /Stamp1 4645 0 R
 >>
 >>
 /Annots [97 0 R 98 0 R 99 0 R 101 0 R]
@@ -24272,7 +24272,7 @@ endobj
 /Font << /F2.0 29 0 R
 /F1.0 10 0 R
 >>
-/XObject << /Stamp2 4643 0 R
+/XObject << /Stamp2 4646 0 R
 >>
 >>
 /Annots [105 0 R 106 0 R 107 0 R 108 0 R]
@@ -25144,7 +25144,7 @@ endobj
 /F4.0 35 0 R
 /F5.1 45 0 R
 >>
-/XObject << /Stamp1 4642 0 R
+/XObject << /Stamp1 4645 0 R
 >>
 >>
 /Annots [112 0 R 113 0 R]
@@ -25424,7 +25424,7 @@ endobj
 /F1.0 10 0 R
 /F4.0 35 0 R
 >>
-/XObject << /Stamp2 4643 0 R
+/XObject << /Stamp2 4646 0 R
 >>
 >>
 >>
@@ -26904,7 +26904,7 @@ endobj
 /F5.1 45 0 R
 /F4.0 35 0 R
 >>
-/XObject << /Stamp1 4642 0 R
+/XObject << /Stamp1 4645 0 R
 >>
 >>
 /Annots [120 0 R 121 0 R 122 0 R 123 0 R 124 0 R 125 0 R 126 0 R 128 0 R 129 0 R 130 0 R 131 0 R]
@@ -27944,7 +27944,7 @@ endobj
 /F2.0 29 0 R
 /F4.0 35 0 R
 >>
-/XObject << /Stamp2 4643 0 R
+/XObject << /Stamp2 4646 0 R
 >>
 >>
 /Annots [134 0 R 136 0 R]
@@ -28697,7 +28697,7 @@ endobj
 /F2.0 29 0 R
 /F5.1 45 0 R
 >>
-/XObject << /Stamp1 4642 0 R
+/XObject << /Stamp1 4645 0 R
 >>
 >>
 /Annots [139 0 R 141 0 R 142 0 R 143 0 R 144 0 R]
@@ -31256,7 +31256,7 @@ endobj
 /F2.0 29 0 R
 /F5.1 45 0 R
 >>
-/XObject << /Stamp2 4643 0 R
+/XObject << /Stamp2 4646 0 R
 >>
 >>
 /Annots [147 0 R 148 0 R 149 0 R 150 0 R 151 0 R 152 0 R 153 0 R]
@@ -32057,7 +32057,7 @@ endobj
 /F2.0 29 0 R
 /F4.0 35 0 R
 >>
-/XObject << /Stamp1 4642 0 R
+/XObject << /Stamp1 4645 0 R
 >>
 >>
 /Annots [159 0 R 160 0 R]
@@ -32068,12 +32068,12 @@ endobj
 endobj
 157 0 obj
 << /Limits [(__anchor-top) (adding.new.node)]
-/Names [(__anchor-top) 25 0 R (__indexterm-2002) 3553 0 R (__indexterm-2004) 3555 0 R (__indexterm-2006) 3557 0 R (__indexterm-2008) 3560 0 R (acid) 938 0 R (acl) 3358 0 R (add-metric-name-and-function-to-hadoop-compat-interface) 3653 0 R (add-the-implementation-to-both-hadoop-1-and-hadoop-2-compat-modules) 3655 0 R (add.metrics) 3651 0 R (adding-a-new-chapter-to-the-hbase-reference-guide) 3895 0 R (adding.new.node) 3104 0 R]
+/Names [(__anchor-top) 25 0 R (__indexterm-2002) 3556 0 R (__indexterm-2004) 3558 0 R (__indexterm-2006) 3560 0 R (__indexterm-2008) 3563 0 R (acid) 938 0 R (acl) 3361 0 R (add-metric-name-and-function-to-hadoop-compat-interface) 3656 0 R (add-the-implementation-to-both-hadoop-1-and-hadoop-2-compat-modules) 3658 0 R (add.metrics) 3654 0 R (adding-a-new-chapter-to-the-hbase-reference-guide) 3898 0 R (adding.new.node) 3104 0 R]
 >>
 endobj
 158 0 obj
 << /Limits [(io.storefile.bloom.block.size) (jdk-version-requirements)]
-/Names [(io.storefile.bloom.block.size) 358 0 R (irbrc) 801 0 R (irc) 3389 0 R (isolate-system-tables) 3355 0 R (java) 119 0 R (java-2) 1938 0 R (java-3) 1943 0 R (java.client.config) 516 0 R (jdk-issues) 2919 0 R (jdk-version-requirements) 56 0 R]
+/Names [(io.storefile.bloom.block.size) 358 0 R (irbrc) 801 0 R (irc) 3392 0 R (isolate-system-tables) 3355 0 R (java) 119 0 R (java-2) 1938 0 R (java-3) 1943 0 R (java.client.config) 516 0 R (jdk-issues) 2919 0 R (jdk-version-requirements) 56 0 R]
 >>
 endobj
 159 0 obj
@@ -33212,7 +33212,7 @@ endobj
 /F4.0 35 0 R
 /F1.1 38 0 R
 >>
-/XObject << /Stamp2 4643 0 R
+/XObject << /Stamp2 4646 0 R
 >>
 >>
 /Annots [165 0 R 166 0 R 168 0 R]
@@ -34012,7 +34012,7 @@ endobj
 /F5.1 45 0 R
 /F4.0 35 0 R
 >>
-/XObject << /Stamp1 4642 0 R
+/XObject << /Stamp1 4645 0 R
 >>
 >>
 /Annots [173 0 R 174 0 R 175 0 R 177 0 R 178 0 R 180 0 R 181 0 R]
@@ -35484,7 +35484,7 @@ endobj
 /F1.0 10 0 R
 /F4.0 35 0 R
 >>
-/XObject << /Stamp2 4643 0 R
+/XObject << /Stamp2 4646 0 R
 >>
 >>
 /Annots [184 0 R 185 0 R]
@@ -35909,7 +35909,7 @@ endobj
 /F4.0 35 0 R
 /F3.0 33 0 R
 >>
-/XObject << /Stamp1 4642 0 R
+/XObject << /Stamp1 4645 0 R
 >>
 >>
 >>
@@ -36565,7 +36565,7 @@ endobj
 /F3.0 33 0 R
 /F4.0 35 0 R
 >>
-/XObject << /Stamp2 4643 0 R
+/XObject << /Stamp2 4646 0 R
 >>
 >>
 /Annots [191 0 R]
@@ -37332,7 +37332,7 @@ endobj
 /F4.0 35 0 R
 /F1.1 38 0 R
 >>
-/XObject << /Stamp1 4642 0 R
+/XObject << /Stamp1 4645 0 R
 >>
 >>
 /Annots [196 0 R]
@@ -37863,7 +37863,7 @@ endobj
 /F3.0 33 0 R
 /F1.0 10 0 R
 >>
-/XObject << /Stamp2 4643 0 R
+/XObject << /Stamp2 4646 0 R
 >>
 >>
 >>
@@ -37879,7 +37879,7 @@ endobj
 endobj
 206 0 obj
 << /Limits [(getshortmidpointkey-an-optimization-for-data-index-block) (handling-of-errors-during-log-splitting)]
-/Names [(getshortmidpointkey-an-optimization-for-data-index-block) 4076 0 R (getting.involved) 3378 0 R (getting_started) 48 0 R (git.best.practices) 3656 0 R (git.patch.flow) 3711 0 R (goals) 4170 0 R (guide-for-hbase-committers) 3685 0 R (guidelines-for-deploying-a-coprocessor) 2388 0 R (guidelines-for-reporting-effective-issues) 3396 0 R (hadoop) 140 0 R (hadoop.native.lib) 3992 0 R (hadoop.policy.file) 383 0 R (handling-of-errors-during-log-splitting) 1680 0 R]
+/Names [(getshortmidpointkey-an-optimization-for-data-index-block) 4079 0 R (getting.involved) 3381 0 R (getting_started) 48 0 R (git.best.practices) 3659 0 R (git.patch.flow) 3714 0 R (goals) 4173 0 R (guide-for-hbase-committers) 3688 0 R (guidelines-for-deploying-a-coprocessor) 2388 0 R (guidelines-for-reporting-effective-issues) 3399 0 R (hadoop) 140 0 R (hadoop.native.lib) 3995 0 R (hadoop.policy.file) 383 0 R (handling-of-errors-during-log-splitting) 1680 0 R]
 >>
 endobj
 207 0 obj
@@ -38409,7 +38409,7 @@ endobj
 /F3.0 33 0 R
 /F1.0 10 0 R
 >>
-/XObject << /Stamp1 4642 0 R
+/XObject << /Stamp1 4645 0 R
 >>
 >>
 >>
@@ -38931,7 +38931,7 @@ endobj
 /F1.0 10 0 R
 /F4.0 35 0 R
 >>
-/XObject << /Stamp2 4643 0 R
+/XObject << /Stamp2 4646 0 R
 >>
 >>
 >>
@@ -39566,7 +39566,7 @@ endobj
 /F3.0 33 0 R
 /F1.0 10 0 R
 >>
-/XObject << /Stamp1 4642 0 R
+/XObject << /Stamp1 4645 0 R
 >>
 >>
 >>
@@ -40075,7 +40075,7 @@ endobj
 /F3.0 33 0 R
 /F4.0 35 0 R
 >>
-/XObject << /Stamp2 4643 0 R
+/XObject << /Stamp2 4646 0 R
 >>
 >>
 >>
@@ -40606,7 +40606,7 @@ endobj
 /F3.0 33 0 R
 /F4.0 35 0 R
 >>
-/XObject << /Stamp1 4642 0 R
+/XObject << /Stamp1 4645 0 R
 >>
 >>
 >>
@@ -41185,7 +41185,7 @@ endobj
 /F3.0 33 0 R
 /F1.0 10 0 R
 >>
-/XObject << /Stamp2 4643 0 R
+/XObject << /Stamp2 4646 0 R
 >>
 >>
 /Annots [252 0 R 253 0 R]
@@ -41752,7 +41752,7 @@ endobj
 /F1.0 10 0 R
 /F4.0 35 0 R
 >>
-/XObject << /Stamp1 4642 0 R
+/XObject << /Stamp1 4645 0 R
 >>
 >>
 /Annots [261 0 R 262 0 R 264 0 R 265 0 R]
@@ -41816,7 +41816,7 @@ endobj
 endobj
 268 0 obj
 << /Limits [(hbase.table.lock.enable) (hbase.tmp.dir)]
-/Names [(hbase.table.lock.enable) 408 0 R (hbase.table.max.rowsize) 411 0 R (hbase.tags) 1357 0 R (hbase.tests) 3536 0 R (hbase.tests.categories) 3580 0 R (hbase.tests.cluster) 3582 0 R (hbase.tests.example.code) 3583 0 R (hbase.tests.rules) 3576 0 R (hbase.tests.sleeps) 3581 0 R (hbase.tests.writing) 3575 0 R (hbase.thrift.maxQueuedRequests) 415 0 R (hbase.thrift.maxWorkerThreads) 414 0 R (hbase.thrift.minWorkerThreads) 413 0 R (hbase.tmp.dir) 198 0 R]
+/Names [(hbase.table.lock.enable) 408 0 R (hbase.table.max.rowsize) 411 0 R (hbase.tags) 1357 0 R (hbase.tests) 3539 0 R (hbase.tests.categories) 3583 0 R (hbase.tests.cluster) 3585 0 R (hbase.tests.example.code) 3586 0 R (hbase.tests.rules) 3579 0 R (hbase.tests.sleeps) 3584 0 R (hbase.tests.writing) 3578 0 R (hbase.thrift.maxQueuedRequests) 415 0 R (hbase.thrift.maxWorkerThreads) 414 0 R (hbase.thrift.minWorkerThreads) 413 0 R (hbase.tmp.dir) 198 0 R]
 >>
 endobj
 269 0 obj
@@ -42372,7 +42372,7 @@ endobj
 /F1.0 10 0 R
 /F1.1 38 0 R
 >>
-/XObject << /Stamp2 4643 0 R
+/XObject << /Stamp2 4646 0 R
 >>
 >>
 >>
@@ -42967,7 +42967,7 @@ endobj
 /F4.0 35 0 R
 /F1.0 10 0 R
 >>
-/XObject << /Stamp1 4642 0 R
+/XObject << /Stamp1 4645 0 R
 >>
 >>
 /Annots [285 0 R 286 0 R]
@@ -42987,7 +42987,7 @@ endobj
 endobj
 284 0 obj
 << /Limits [(hbase.cluster.distributed) (hbase.data.umask.enable)]
-/Names [(hbase.cluster.distributed) 200 0 R (hbase.column.max.version) 434 0 R (hbase.commit.msg.format) 3837 0 R (hbase.coordinated.state.manager.class) 477 0 R (hbase.coprocessor.abortonerror) 399 0 R (hbase.coprocessor.enabled) 392 0 R (hbase.coprocessor.master.classes) 398 0 R (hbase.coprocessor.region.classes) 397 0 R (hbase.coprocessor.user.enabled) 396 0 R (hbase.data.umask) 425 0 R (hbase.data.umask.enable) 424 0 R]
+/Names [(hbase.cluster.distributed) 200 0 R (hbase.column.max.version) 434 0 R (hbase.commit.msg.format) 3840 0 R (hbase.coordinated.state.manager.class) 477 0 R (hbase.coprocessor.abortonerror) 399 0 R (hbase.coprocessor.enabled) 392 0 R (hbase.coprocessor.master.classes) 398 0 R (hbase.coprocessor.region.classes) 397 0 R (hbase.coprocessor.user.enabled) 396 0 R (hbase.data.umask) 425 0 R (hbase.data.umask.enable) 424 0 R]
 >>
 endobj
 285 0 obj
@@ -43533,7 +43533,7 @@ endobj
 /F3.0 33 0 R
 /F4.0 35 0 R
 >>
-/XObject << /Stamp2 4643 0 R
+/XObject << /Stamp2 4646 0 R
 >>
 >>
 >>
@@ -44024,7 +44024,7 @@ endobj
 /F3.0 33 0 R
 /F4.0 35 0 R
 >>
-/XObject << /Stamp1 4642 0 R
+/XObject << /Stamp1 4645 0 R
 >>
 >>
 >>
@@ -44596,7 +44596,7 @@ endobj
 /F3.0 33 0 R
 /F1.0 10 0 R
 >>
-/XObject << /Stamp2 4643 0 R
+/XObject << /Stamp2 4646 0 R
 >>
 >>
 >>
@@ -45157,7 +45157,7 @@ endobj
 /F3.0 33 0 R
 /F1.0 10 0 R
 >>
-/XObject << /Stamp1 4642 0 R
+/XObject << /Stamp1 4645 0 R
 >>
 >>
 >>
@@ -45754,7 +45754,7 @@ endobj
 /F3.0 33 0 R
 /F1.0 10 0 R
 >>
-/XObject << /Stamp2 4643 0 R
+/XObject << /Stamp2 4646 0 R
 >>
 >>
 >>
@@ -46358,7 +46358,7 @@ endobj
 /F3.0 33 0 R
 /F4.0 35 0 R
 >>
-/XObject << /Stamp1 4642 0 R
+/XObject << /Stamp1 4645 0 R
 >>
 >>
 >>
@@ -46901,7 +46901,7 @@ endobj
 /F1.0 10 0 R
 /F4.0 35 0 R
 >>
-/XObject << /Stamp2 4643 0 R
+/XObject << /Stamp2 4646 0 R
 >>
 >>
 >>
@@ -47409,7 +47409,7 @@ endobj
 /F3.0 33 0 R
 /F4.0 35 0 R
 >>
-/XObject << /Stamp1 4642 0 R
+/XObject << /Stamp1 4645 0 R
 >>
 >>
 >>
@@ -47984,7 +47984,7 @@ endobj
 /F3.0 33 0 R
 /F1.0 10 0 R
 >>
-/XObject << /Stamp2 4643 0 R
+/XObject << /Stamp2 4646 0 R
 >>
 >>
 /Annots [350 0 R 354 0 R]
@@ -48553,7 +48553,7 @@ endobj
 /F3.0 33 0 R
 /F4.0 35 0 R
 >>
-/XObject << /Stamp1 4642 0 R
+/XObject << /Stamp1 4645 0 R
 >>
 >>
 >>
@@ -48563,7 +48563,7 @@ endobj
 endobj
 359 0 obj
 << /Limits [(quota) (regions.arch)]
-/Names [(quota) 3216 0 R (read-api-and-usage) 1939 0 R (read-hbase-shell-commands-from-a-command-file) 787 0 R (reading-filtering-and-sending-edits) 3196 0 R (reading_cells_with_labels) 1411 0 R (recommended.configurations.hdfs) 546 0 R (recommended_configurations) 541 0 R (recommended_configurations.zk) 542 0 R (region-overlap-repairs) 3950 0 R (region-replication-for-meta-table-s-region) 1916 0 R (regions.arch) 1712 0 R]
+/Names [(quota) 3216 0 R (read-api-and-usage) 1939 0 R (read-hbase-shell-commands-from-a-command-file) 787 0 R (reading-filtering-and-sending-edits) 3196 0 R (reading_cells_with_labels) 1411 0 R (recommended.configurations.hdfs) 546 0 R (recommended_configurations) 541 0 R (recommended_configurations.zk) 542 0 R (region-overlap-repairs) 3953 0 R (region-replication-for-meta-table-s-region) 1916 0 R (regions.arch) 1712 0 R]
 >>
 endobj
 360 0 obj
@@ -49164,7 +49164,7 @@ endobj
 /F4.0 35 0 R
 /F1.0 10 0 R
 >>
-/XObject << /Stamp2 4643 0 R
+/XObject << /Stamp2 4646 0 R
 >>
 >>
 /Annots [370 0 R 371 0 R 373 0 R 375 0 R 376 0 R]
@@ -49175,7 +49175,7 @@ endobj
 endobj
 368 0 obj
 << /Limits [(hbase.regionserver.thrift.compact) (hbase.rootdir.perms)]
-/Names [(hbase.regionserver.thrift.compact) 420 0 R (hbase.regionserver.thrift.framed) 416 0 R (hbase.regionserver.thrift.framed.max_frame_size_in_mb) 417 0 R (hbase.release.announcement) 3516 0 R (hbase.replication.management) 3166 0 R (hbase.replication.rpc.codec) 486 0 R (hbase.replication.source.maxthreads) 487 0 R (hbase.rest-csrf.browser-useragents-regex) 470 0 R (hbase.rest.csrf.enabled) 469 0 R (hbase.rest.filter.classes) 458 0 R (hbase.rest.port) 400 0 R (hbase.rest.readonly) 403 0 R (hbase.rest.support.proxyuser) 406 0 R (hbase.rest.threads.max) 404 0 R (hbase.rest.threads.min) 405 0 R (hbase.rolling.restart) 635 0 R (hbase.rolling.upgrade) 631 0 R (hbase.rootdir) 199 0 R (hbase.rootdir.perms) 421 0 R]
+/Names [(hbase.regionserver.thrift.compact) 420 0 R (hbase.regionserver.thrift.framed) 416 0 R (hbase.regionserver.thrift.framed.max_frame_size_in_mb) 417 0 R (hbase.release.announcement) 3519 0 R (hbase.replication.management) 3166 0 R (hbase.replication.rpc.codec) 486 0 R (hbase.replication.source.maxthreads) 487 0 R (hbase.rest-csrf.browser-useragents-regex) 470 0 R (hbase.rest.csrf.enabled) 469 0 R (hbase.rest.filter.classes) 458 0 R (hbase.rest.port) 400 0 R (hbase.rest.readonly) 403 0 R (hbase.rest.support.proxyuser) 406 0 R (hbase.rest.threads.max) 404 0 R (hbase.rest.threads.min) 405 0 R (hbase.rolling.restart) 635 0 R (hbase.rolling.upgrade) 631 0 R (hbase.rootdir) 199 0 R (hbase.rootdir.perms) 421 0 R]
 >>
 endobj
 369 0 obj
@@ -49755,7 +49755,7 @@ endobj
 /F3.0 33 0 R
 /F1.0 10 0 R
 >>
-/XObject << /Stamp1 4642 0 R
+/XObject << /Stamp1 4645 0 R
 >>
 >>
 >>
@@ -50297,7 +50297,7 @@ endobj
 /F3.0 33 0 R
 /F4.0 35 0 R
 >>
-/XObject << /Stamp2 4643 0 R
+/XObject << /Stamp2 4646 0 R
 >>
 >>
 >>
@@ -50848,7 +50848,7 @@ endobj
 /F3.0 33 0 R
 /F1.0 10 0 R
 >>
-/XObject << /Stamp1 4642 0 R
+/XObject << /Stamp1 4645 0 R
 >>
 >>
 >>
@@ -51367,7 +51367,7 @@ endobj
 /F3.0 33 0 R
 /F1.0 10 0 R
 >>
-/XObject << /Stamp2 4643 0 R
+/XObject << /Stamp2 4646 0 R
 >>
 >>
 >>
@@ -51885,7 +51885,7 @@ endobj
 /F3.0 33 0 R
 /F1.0 10 0 R
 >>
-/XObject << /Stamp1 4642 0 R
+/XObject << /Stamp1 4645 0 R
 >>
 >>
 >>
@@ -51895,7 +51895,7 @@ endobj
 endobj
 412 0 obj
 << /Limits [(hbase.zookeeper.property.maxClientCnxns) (hfile.block.index.cacheonwrite)]
-/Names [(hbase.zookeeper.property.maxClientCnxns) 273 0 R (hbase.zookeeper.property.syncLimit) 267 0 R (hbase.zookeeper.quorum) 203 0 R (hbase_apis) 2142 0 R (hbase_default_configurations) 197 0 R (hbase_env) 530 0 R (hbase_metrics) 3109 0 R (hbase_mob) 1953 0 R (hbase_site) 526 0 R (hbase_supported_tested_definitions) 42 0 R (hbck) 3007 0 R (hbck.in.depth) 3942 0 R (health.check) 3003 0 R (hedged.reads) 2606 0 R (hfile) 1769 0 R (hfile-format) 1770 0 R (hfile-format-2) 4045 0 R (hfile.block.bloom.cacheonwrite) 355 0 R (hfile.block.cache.size) 344 0 R (hfile.block.index.cacheonwrite) 345 0 R]
+/Names [(hbase.zookeeper.property.maxClientCnxns) 273 0 R (hbase.zookeeper.property.syncLimit) 267 0 R (hbase.zookeeper.quorum) 203 0 R (hbase_apis) 2142 0 R (hbase_default_configurations) 197 0 R (hbase_env) 530 0 R (hbase_metrics) 3109 0 R (hbase_mob) 1953 0 R (hbase_site) 526 0 R (hbase_supported_tested_definitions) 42 0 R (hbck) 3007 0 R (hbck.in.depth) 3945 0 R (health.check) 3003 0 R (hedged.reads) 2606 0 R (hfile) 1769 0 R (hfile-format) 1770 0 R (hfile-format-2) 4048 0 R (hfile.block.bloom.cacheonwrite) 355 0 R (hfile.block.cache.size) 344 0 R (hfile.block.index.cacheonwrite) 345 0 R]
 >>
 endobj
 413 0 obj
@@ -52381,7 +52381,7 @@ endobj
 /F3.0 33 0 R
 /F1.0 10 0 R
 >>
-/XObject << /Stamp2 4643 0 R
+/XObject << /Stamp2 4646 0 R
 >>
 >>
 >>
@@ -52394,7 +52394,7 @@ endobj
 endobj
 422 0 obj
 << /Limits [(hbase.rpc) (hbase.secure.spnego.ui)]
-/Names [(hbase.rpc) 4163 0 R (hbase.rpc.rows.warning.threshold) 509 0 R (hbase.rpc.shortoperation.timeout) 367 0 R (hbase.rpc.timeout) 361 0 R (hbase.rs.cacheblocksonwrite) 360 0 R (hbase.secure.bulkload) 1437 0 R (hbase.secure.configuration) 1277 0 R (hbase.secure.enable) 1441 0 R (hbase.secure.simpleconfiguration) 1319 0 R (hbase.secure.spnego.ui) 1272 0 R]
+/Names [(hbase.rpc) 4166 0 R (hbase.rpc.rows.warning.threshold) 509 0 R (hbase.rpc.shortoperation.timeout) 367 0 R (hbase.rpc.timeout) 361 0 R (hbase.rs.cacheblocksonwrite) 360 0 R (hbase.secure.bulkload) 1437 0 R (hbase.secure.configuration) 1277 0 R (hbase.secure.enable) 1441 0 R (hbase.secure.simpleconfiguration) 1319 0 R (hbase.secure.spnego.ui) 1272 0 R]
 >>
 endobj
 423 0 obj
@@ -52915,7 +52915,7 @@ endobj
 /F3.0 33 0 R
 /F4.0 35 0 R
 >>
-/XObject << /Stamp1 4642 0 R
+/XObject << /Stamp1 4645 0 R
 >>
 >>
 >>
@@ -53483,7 +53483,7 @@ endobj
 /F3.0 33 0 R
 /F1.0 10 0 R
 >>
-/XObject << /Stamp2 4643 0 R
+/XObject << /Stamp2 4646 0 R
 >>
 >>
 >>
@@ -54000,7 +54000,7 @@ endobj
 /F3.0 33 0 R
 /F1.0 10 0 R
 >>
-/XObject << /Stamp1 4642 0 R
+/XObject << /Stamp1 4645 0 R
 >>
 >>
 >>
@@ -54543,7 +54543,7 @@ endobj
 /F3.0 33 0 R
 /F1.0 10 0 R
 >>
-/XObject << /Stamp2 4643 0 R
+/XObject << /Stamp2 4646 0 R
 >>
 >>
 /Annots [461 0 R 462 0 R]
@@ -55190,7 +55190,7 @@ endobj
 /F4.0 35 0 R
 /F6.0 471 0 R
 >>
-/XObject << /Stamp1 4642 0 R
+/XObject << /Stamp1 4645 0 R
 >>
 >>
 /Annots [467 0 R 468 0 R]
@@ -55231,11 +55231,11 @@ endobj
 << /Type /Font
 /BaseFont /066905+mplus1mn-bold
 /Subtype /TrueType
-/FontDescriptor 4897 0 R
+/FontDescriptor 4900 0 R
 /FirstChar 32
 /LastChar 255
-/Widths 4899 0 R
-/ToUnicode 4898 0 R
+/Widths 4902 0 R
+/ToUnicode 4901 0 R
 >>
 endobj
 472 0 obj
@@ -55801,7 +55801,7 @@ endobj
 /F3.0 33 0 R
 /F1.0 10 0 R
 >>
-/XObject << /Stamp2 4643 0 R
+/XObject << /Stamp2 4646 0 R
 >>
 >>
 >>
@@ -55814,7 +55814,7 @@ endobj
 endobj
 478 0 obj
 << /Limits [(hbase.defaults.for.version.skip) (hbase.hregion.percolumnfamilyflush.size.lower.bound.min)]
-/Names [(hbase.defaults.for.version.skip) 407 0 R (hbase.dfs.client.read.shortcircuit.buffer.size) 439 0 R (hbase.display.keys) 391 0 R (hbase.dynamic.jars.dir) 456 0 R (hbase.encryption.server) 1424 0 R (hbase.env.sh) 511 0 R (hbase.fix.version.in.jira) 3825 0 R (hbase.history) 4123 0 R (hbase.hregion.majorcompaction) 314 0 R (hbase.hregion.majorcompaction.jitter) 315 0 R (hbase.hregion.max.filesize) 313 0 R (hbase.hregion.memstore.block.multiplier) 309 0 R (hbase.hregion.memstore.flush.size) 306 0 R (hbase.hregion.memstore.mslab.enabled) 310 0 R (hbase.hregion.percolumnfamilyflush.size.lower.bound.min) 307 0 R]
+/Names [(hbase.defaults.for.version.skip) 407 0 R (hbase.dfs.client.read.shortcircuit.buffer.size) 439 0 R (hbase.display.keys) 391 0 R (hbase.dynamic.jars.dir) 456 0 R (hbase.encryption.server) 1424 0 R (hbase.env.sh) 511 0 R (hbase.fix.version.in.jira) 3828 0 R (hbase.history) 4126 0 R (hbase.hregion.majorcompaction) 314 0 R (hbase.hregion.majorcompaction.jitter) 315 0 R (hbase.hregion.max.filesize) 313 0 R (hbase.hregion.memstore.block.multiplier) 309 0 R (hbase.hregion.memstore.flush.size) 306 0 R (hbase.hregion.memstore.mslab.enabled) 310 0 R (hbase.hregion.percolumnfamilyflush.size.lower.bound.min) 307 0 R]
 >>
 endobj
 479 0 obj
@@ -56353,7 +56353,7 @@ endobj
 /F3.0 33 0 R
 /F4.0 35 0 R
 >>
-/XObject << /Stamp1 4642 0 R
+/XObject << /Stamp1 4645 0 R
 >>
 >>
 >>
@@ -56868,7 +56868,7 @@ endobj
 /F3.0 33 0 R
 /F4.0 35 0 R
 >>
-/XObject << /Stamp2 4643 0 R
+/XObject << /Stamp2 4646 0 R
 >>
 >>
 >>
@@ -57379,7 +57379,7 @@ endobj
 /F3.0 33 0 R
 /F4.0 35 0 R
 >>
-/XObject << /Stamp1 4642 0 R
+/XObject << /Stamp1 4645 0 R
 >>
 >>
 >>
@@ -57395,7 +57395,7 @@ endobj
 endobj
 501 0 obj
 << /Limits [(hbase.mob.file.cache.size) (hbase.org.site.contributing)]
-/Names [(hbase.mob.file.cache.size) 492 0 R (hbase.moduletest.run) 3545 0 R (hbase.moduletest.shell) 3540 0 R (hbase.moduletests) 3538 0 R (hbase.normalizer.min.region.count) 300 0 R (hbase.normalizer.period) 299 0 R (hbase.offpeak.end.hour) 335 0 R (hbase.offpeak.start.hour) 334 0 R (hbase.org) 3527 0 R (hbase.org.site.contributing) 3529 0 R]
+/Names [(hbase.mob.file.cache.size) 492 0 R (hbase.moduletest.run) 3548 0 R (hbase.moduletest.shell) 3543 0 R (hbase.moduletests) 3541 0 R (hbase.normalizer.min.region.count) 300 0 R (hbase.normalizer.period) 299 0 R (hbase.offpeak.end.hour) 335 0 R (hbase.offpeak.start.hour) 334 0 R (hbase.org) 3530 0 R (hbase.org.site.contributing) 3532 0 R]
 >>
 endobj
 502 0 obj
@@ -57910,7 +57910,7 @@ endobj
 /F1.0 10 0 R
 /F2.0 29 0 R
 >>
-/XObject << /Stamp2 4643 0 R
+/XObject << /Stamp2 4646 0 R
 >>
 >>
 >>
@@ -59021,7 +59021,7 @@ endobj
 /F3.0 33 0 R
 /F4.0 35 0 R
 >>
-/XObject << /Stamp1 4642 0 R
+/XObject << /Stamp1 4645 0 R
 >>
 >>
 /Annots [517 0 R]
@@ -59869,7 +59869,7 @@ endobj
 /F4.0 35 0 R
 /F2.0 29 0 R
 >>
-/XObject << /Stamp2 4643 0 R
+/XObject << /Stamp2 4646 0 R
 >>
 >>
 /Annots [520 0 R]
@@ -61326,7 +61326,7 @@ endobj
 /F3.0 33 0 R
 /F1.1 38 0 R
 >>
-/XObject << /Stamp1 4642 0 R
+/XObject << /Stamp1 4645 0 R
 >>
 >>
 >>
@@ -61850,7 +61850,7 @@ endobj
 /F1.0 10 0 R
 /F4.0 35 0 R
 >>
-/XObject << /Stamp2 4643 0 R
+/XObject << /Stamp2 4646 0 R
 >>
 >>
 >>
@@ -62503,7 +62503,7 @@ endobj
 /F4.0 35 0 R
 /F1.1 38 0 R
 >>
-/XObject << /Stamp1 4642 0 R
+/XObject << /Stamp1 4645 0 R
 >>
 >>
 /Annots [535 0 R 536 0 R 538 0 R 539 0 R 540 0 R 545 0 R]
@@ -63258,7 +63258,7 @@ endobj
 /F2.0 29 0 R
 /F1.1 38 0 R
 >>
-/XObject << /Stamp2 4643 0 R
+/XObject << /Stamp2 4646 0 R
 >>
 >>
 /Annots [551 0 R 554 0 R 557 0 R]
@@ -63297,7 +63297,7 @@ endobj
 endobj
 556 0 obj
 << /Limits [(configuration) (coprocessor-implementation-overview)]
-/Names [(configuration) 104 0 R (configuration-2) 3138 0 R (configuration-3) 3913 0 R (configuration-files) 111 0 R (configuration-from-scratch) 3810 0 R (configuration-properties) 1921 0 R (configure-mob-compaction-mergeable-threshold) 1962 0 R (configure-mob-compaction-policy) 1961 0 R (configuring-columns-for-mob) 1958 0 R (configuring-server-wide-behavior-of-bloom-filters) 2512 0 R (configuring-the-rest-server-and-client) 2161 0 R (confirm) 190 0 R (connection-setup) 4175 0 R (constraints) 1076 0 R (contributing-to-documentation-or-other-strings) 3848 0 R (coprocessor-implementation-overview) 2317 0 R]
+/Names [(configuration) 104 0 R (configuration-2) 3138 0 R (configuration-3) 3916 0 R (configuration-files) 111 0 R (configuration-from-scratch) 3813 0 R (configuration-properties) 1921 0 R (configure-mob-compaction-mergeable-threshold) 1962 0 R (configure-mob-compaction-policy) 1961 0 R (configuring-columns-for-mob) 1958 0 R (configuring-server-wide-behavior-of-bloom-filters) 2512 0 R (configuring-the-rest-server-and-client) 2161 0 R (confirm) 190 0 R (connection-setup) 4178 0 R (constraints) 1076 0 R (contributing-to-documentation-or-other-strings) 3851 0 R (coprocessor-implementation-overview) 2317 0 R]
 >>
 endobj
 557 0 obj
@@ -64159,7 +64159,7 @@ endobj
 /F4.0 35 0 R
 /F5.1 45 0 R
 >>
-/XObject << /Stamp1 4642 0 R
+/XObject << /Stamp1 4645 0 R
 >>
 >>
 /Annots [561 0 R]
@@ -64973,7 +64973,7 @@ endobj
 /F5.1 45 0 R
 /F3.0 33 0 R
 >>
-/XObject << /Stamp2 4643 0 R
+/XObject << /Stamp2 4646 0 R
 >>
 >>
 /Annots [565 0 R 566 0 R 567 0 R 571 0 R 574 0 R 575 0 R 576 0 R]
@@ -65715,7 +65715,7 @@ endobj
 /F1.1 38 0 R
 /F4.0 35 0 R
 >>
-/XObject << /Stamp1 4642 0 R
+/XObject << /Stamp1 4645 0 R
 >>
 >>
 /Annots [580 0 R 581 0 R]
@@ -67147,7 +67147,7 @@ endobj
 /F1.0 10 0 R
 /F3.0 33 0 R
 >>
-/XObject << /Stamp2 4643 0 R
+/XObject << /Stamp2 4646 0 R
 >>
 >>
 /Annots [585 0 R 586 0 R]
@@ -67924,7 +67924,7 @@ endobj
 /F1.0 10 0 R
 /F3.0 33 0 R
 >>
-/XObject << /Stamp1 4642 0 R
+/XObject << /Stamp1 4645 0 R
 >>
 >>
 >>
@@ -68625,7 +68625,7 @@ endobj
 /F3.0 33 0 R
 /F5.1 45 0 R
 >>
-/XObject << /Stamp2 4643 0 R
+/XObject << /Stamp2 4646 0 R
 >>
 >>
 >>
@@ -69956,7 +69956,7 @@ endobj
 /F4.0 35 0 R
 /F3.0 33 0 R
 >>
-/XObject << /Stamp1 4642 0 R
+/XObject << /Stamp1 4645 0 R
 >>
 >>
 >>
@@ -71451,7 +71451,7 @@ endobj
 /Font << /F2.0 29 0 R
 /F1.0 10 0 R
 >>
-/XObject << /Stamp2 4643 0 R
+/XObject << /Stamp2 4646 0 R
 >>
 >>
 >>
@@ -71617,7 +71617,7 @@ endobj
 /Font << /F2.0 29 0 R
 /F1.0 10 0 R
 >>
-/XObject << /Stamp1 4642 0 R
+/XObject << /Stamp1 4645 0 R
 >>
 >>
 >>
@@ -71815,7 +71815,7 @@ endobj
 /Font << /F2.0 29 0 R
 /F1.0 10 0 R
 >>
-/XObject << /Stamp2 4643 0 R
+/XObject << /Stamp2 4646 0 R
 >>
 >>
 /Annots [601 0 R 602 0 R 603 0 R 604 0 R 605 0 R]
@@ -72569,7 +72569,7 @@ endobj
 /F1.0 10 0 R
 /F3.0 33 0 R
 >>
-/XObject << /Stamp1 4642 0 R
+/XObject << /Stamp1 4645 0 R
 >>
 >>
 /Annots [610 0 R]
@@ -73512,7 +73512,7 @@ endobj
 /F3.0 33 0 R
 /F4.0 35 0 R
 >>
-/XObject << /Stamp2 4643 0 R
+/XObject << /Stamp2 4646 0 R
 >>
 >>
 /Annots [614 0 R 615 0 R 616 0 R]
@@ -75900,7 +75900,7 @@ endobj
 /F1.1 38 0 R
 /F4.0 35 0 R
 >>
-/XObject << /Stamp1 4642 0 R
+/XObject << /Stamp1 4645 0 R
 >>
 >>
 /Annots [620 0 R 621 0 R]
@@ -76785,7 +76785,7 @@ endobj
 /F2.0 29 0 R
 /F3.0 33 0 R
 >>
-/XObject << /Stamp2 4643 0 R
+/XObject << /Stamp2 4646 0 R
 >>
 >>
 /Annots [624 0 R]
@@ -77259,7 +77259,7 @@ endobj
 /F4.0 35 0 R
 /F3.0 33 0 R
 >>
-/XObject << /Stamp1 4642 0 R
+/XObject << /Stamp1 4645 0 R
 >>
 >>
 /Annots [632 0 R 633 0 R 634 0 R 636 0 R 637 0 R 638 0 R]
@@ -78051,7 +78051,7 @@ endobj
 /F1.0 10 0 R
 /F3.0 33 0 R
 >>
-/XObject << /Stamp2 4643 0 R
+/XObject << /Stamp2 4646 0 R
 >>
 >>
 /Annots [646 0 R]
@@ -78067,12 +78067,12 @@ endobj
 endobj
 643 0 obj
 << /Limits [(__anchor-top) (cascading)]
-/Kids [157 0 R 3654 0 R 1880 0 R 1461 0 R 3890 0 R 1624 0 R 4071 0 R 2110 0 R 2068 0 R 2025 0 R 2059 0 R 3459 0 R]
+/Kids [157 0 R 3657 0 R 1880 0 R 1461 0 R 3893 0 R 1624 0 R 4074 0 R 2110 0 R 2068 0 R 2025 0 R 2059 0 R 3462 0 R]
 >>
 endobj
 644 0 obj
 << /Limits [(hbase.mob.file.cache.size) (hbase.zookeeper.property.initLimit)]
-/Kids [501 0 R 4018 0 R 441 0 R 239 0 R 368 0 R 422 0 R 4164 0 R 455 0 R 268 0 R 3577 0 R 3548 0 R]
+/Kids [501 0 R 4021 0 R 441 0 R 239 0 R 368 0 R 422 0 R 4167 0 R 455 0 R 268 0 R 3580 0 R 3551 0 R]
 >>
 endobj
 645 0 obj
@@ -78736,7 +78736,7 @@ endobj
 /F1.0 10 0 R
 /F3.0 33 0 R
 >>
-/XObject << /Stamp1 4642 0 R
+/XObject << /Stamp1 4645 0 R
 >>
 >>
 >>
@@ -79451,7 +79451,7 @@ endobj
 /F1.0 10 0 R
 /F2.0 29 0 R
 >>
-/XObject << /Stamp2 4643 0 R
+/XObject << /Stamp2 4646 0 R
 >>
 >>
 /Annots [654 0 R]
@@ -79918,7 +79918,7 @@ endobj
 /F3.0 33 0 R
 /F4.0 35 0 R
 >>
-/XObject << /Stamp1 4642 0 R
+/XObject << /Stamp1 4645 0 R
 >>
 >>
 >>
@@ -80638,7 +80638,7 @@ endobj
 /F1.0 10 0 R
 /F3.0 33 0 R
 >>
-/XObject << /Stamp2 4643 0 R
+/XObject << /Stamp2 4646 0 R
 >>
 >>
 /Annots [663 0 R 666 0 R]
@@ -81904,7 +81904,7 @@ endobj
 /F3.0 33 0 R
 /F2.0 29 0 R
 >>
-/XObject << /Stamp1 4642 0 R
+/XObject << /Stamp1 4645 0 R
 >>
 >>
 /Annots [669 0 R 670 0 R 671 0 R 672 0 R 673 0 R 674 0 R 675 0 R 676 0 R 679 0 R 680 0 R 681 0 R]
@@ -82840,7 +82840,7 @@ endobj
 /Font << /F1.0 10 0 R
 /F3.0 33 0 R
 >>
-/XObject << /Stamp2 4643 0 R
+/XObject << /Stamp2 4646 0 R
 >>
 >>
 /Annots [684 0 R 685 0 R 688 0 R]
@@ -83769,7 +83769,7 @@ endobj
 /F3.0 33 0 R
 /F4.0 35 0 R
 >>
-/XObject << /Stamp1 4642 0 R
+/XObject << /Stamp1 4645 0 R
 >>
 >>
 /Annots [693 0 R 695 0 R 697 0 R 698 0 R 699 0 R]
@@ -84534,7 +84534,7 @@ endobj
 /Font << /F3.0 33 0 R
 /F1.0 10 0 R
 >>
-/XObject << /Stamp2 4643 0 R
+/XObject << /Stamp2 4646 0 R
 >>
 >>
 /Annots [704 0 R 707 0 R 708 0 R]
@@ -85561,7 +85561,7 @@ endobj
 /F3.0 33 0 R
 /F4.0 35 0 R
 >>
-/XObject << /Stamp1 4642 0 R
+/XObject << /Stamp1 4645 0 R
 >>
 >>
 /Annots [713 0 R 715 0 R 717 0 R]
@@ -86332,7 +86332,7 @@ endobj
 /F3.0 33 0 R
 /F2.0 29 0 R
 >>
-/XObject << /Stamp2 4643 0 R
+/XObject << /Stamp2 4646 0 R
 >>
 >>
 /Annots [722 0 R 728 0 R 729 0 R 730 0 R]
@@ -87412,7 +87412,7 @@ endobj
 /F2.0 29 0 R
 /F4.0 35 0 R
 >>
-/XObject << /Stamp1 4642 0 R
+/XObject << /Stamp1 4645 0 R
 >>
 >>
 /Annots [736 0 R 737 0 R 738 0 R 740 0 R 741 0 R 742 0 R 743 0 R 744 0 R 745 0 R 746 0 R 747 0 R 748 0 R 749 0 R 750 0 R 751 0 R 752 0 R 753 0 R]
@@ -88216,7 +88216,7 @@ endobj
 /F1.0 10 0 R
 /F4.0 35 0 R
 >>
-/XObject << /Stamp2 4643 0 R
+/XObject << /Stamp2 4646 0 R
 >>
 >>
 >>
@@ -88406,7 +88406,7 @@ endobj
 /Font << /F1.0 10 0 R
 /F2.0 29 0 R
 >>
-/XObject << /Stamp1 4642 0 R
+/XObject << /Stamp1 4645 0 R
 >>
 >>
 >>
@@ -88760,7 +88760,7 @@ endobj
 /F1.0 10 0 R
 /F4.0 35 0 R
 >>
-/XObject << /Stamp2 4643 0 R
+/XObject << /Stamp2 4646 0 R
 >>
 >>
 /Annots [768 0 R 769 0 R 770 0 R]
@@ -88961,7 +88961,7 @@ endobj
 /F3.0 33 0 R
 /F4.0 35 0 R
 >>
-/XObject << /Stamp1 4642 0 R
+/XObject << /Stamp1 4645 0 R
 >>
 >>
 >>
@@ -89199,7 +89199,7 @@ endobj
 /F1.0 10 0 R
 /F4.0 35 0 R
 >>
-/XObject << /Stamp2 4643 0 R
+/XObject << /Stamp2 4646 0 R
 >>
 >>
 /Annots [777 0 R]
@@ -89795,7 +89795,7 @@ endobj
 /F3.0 33 0 R
 /F4.0 35 0 R
 >>
-/XObject << /Stamp1 4642 0 R
+/XObject << /Stamp1 4645 0 R
 >>
 >>
 /Annots [781 0 R]
@@ -90332,7 +90332,7 @@ endobj
 /F4.0 35 0 R
 /F2.0 29 0 R
 >>
-/XObject << /Stamp2 4643 0 R
+/XObject << /Stamp2 4646 0 R
 >>
 >>
 >>
@@ -90582,7 +90582,7 @@ endobj
 /F3.0 33 0 R
 /F4.0 35 0 R
 >>
-/XObject << /Stamp1 4642 0 R
+/XObject << /Stamp1 4645 0 R
 >>
 >>
 >>
@@ -91066,7 +91066,7 @@ endobj
 /F1.0 10 0 R
 /F4.0 35 0 R
 >>
-/XObject << /Stamp2 4643 0 R
+/XObject << /Stamp2 4646 0 R
 >>
 >>
 >>
@@ -91341,7 +91341,7 @@ endobj
 /F4.0 35 0 R
 /F3.0 33 0 R
 >>
-/XObject << /Stamp1 4642 0 R
+/XObject << /Stamp1 4645 0 R
 >>
 >>
 >>
@@ -91778,7 +91778,7 @@ endobj
 /F1.0 10 0 R
 /F4.0 35 0 R
 >>
-/XObject << /Stamp2 4643 0 R
+/XObject << /Stamp2 4646 0 R
 >>
 >>
 >>
@@ -92341,7 +92341,7 @@ endobj
 /Font << /F4.0 35 0 R
 /F1.0 10 0 R
 >>
-/XObject << /Stamp1 4642 0 R
+/XObject << /Stamp1 4645 0 R
 >>
 >>
 >>
@@ -92952,7 +92952,7 @@ endobj
 /F3.0 33 0 R
 /F1.0 10 0 R
 >>
-/XObject << /Stamp2 4643 0 R
+/XObject << /Stamp2 4646 0 R
 >>
 >>
 >>
@@ -94122,7 +94122,7 @@ endobj
 /F2.0 29 0 R
 /F4.0 35 0 R
 >>
-/XObject << /Stamp1 4642 0 R
+/XObject << /Stamp1 4645 0 R
 >>
 >>
 /Annots [805 0 R]
@@ -94144,7 +94144,7 @@ endobj
 endobj
 807 0 obj
 << /Limits [(multiple-typed-queues) (new.version.behavior)]
-/Names [(multiple-typed-queues) 3229 0 R (multiwal) 1672 0 R (nagles) 573 0 R (namespace) 835 0 R (namespace_creation) 839 0 R (namespace_quotas) 3225 0 R (namespace_special) 840 0 R (network-saturation-the-winner) 2949 0 R (new-committers) 3686 0 R (new.version.behavior) 914 0 R]
+/Names [(multiple-typed-queues) 3229 0 R (multiwal) 1672 0 R (nagles) 573 0 R (namespace) 835 0 R (namespace_creation) 839 0 R (namespace_quotas) 3225 0 R (namespace_special) 840 0 R (network-saturation-the-winner) 2949 0 R (new-committers) 3689 0 R (new.version.behavior) 914 0 R]
 >>
 endobj
 808 0 obj
@@ -99408,7 +99408,7 @@ endobj
 /F2.0 29 0 R
 /F1.1 38 0 R
 >>
-/XObject << /Stamp2 4643 0 R
+/XObject << /Stamp2 4646 0 R
 >>
 >>
 >>
@@ -99784,7 +99784,7 @@ endobj
 /F2.0 29 0 R
 /F1.0 10 0 R
 >>
-/XObject << /Stamp1 4642 0 R
+/XObject << /Stamp1 4645 0 R
 >>
 >>
 >>
@@ -100399,7 +100399,7 @@ endobj
 /F3.0 33 0 R
 /F4.0 35 0 R
 >>
-/XObject << /Stamp2 4643 0 R
+/XObject << /Stamp2 4646 0 R
 >>
 >>
 >>
@@ -102940,7 +102940,7 @@ endobj
 /F5.1 45 0 R
 /F3.0 33 0 R
 >>
-/XObject << /Stamp1 4642 0 R
+/XObject << /Stamp1 4645 0 R
 >>
 >>
 /Annots [824 0 R 825 0 R 826 0 R]
@@ -105959,7 +105959,7 @@ endobj
 /Font << /F4.0 35 0 R
 /F1.0 10 0 R
 >>
-/XObject << /Stamp2 4643 0 R
+/XObject << /Stamp2 4646 0 R
 >>
 >>
 >>
@@ -107393,7 +107393,7 @@ endobj
 /F3.0 33 0 R
 /F4.0 35 0 R
 >>
-/XObject << /Stamp1 4642 0 R
+/XObject << /Stamp1 4645 0 R
 >>
 >>
 /Annots [832 0 R]
@@ -108177,7 +108177,7 @@ endobj
 /F4.0 35 0 R
 /F3.0 33 0 R
 >>
-/XObject << /Stamp2 4643 0 R
+/XObject << /Stamp2 4646 0 R
 >>
 >>
 /Annots [836 0 R 837 0 R 838 0 R]
@@ -108379,7 +108379,7 @@ endobj
 /F4.0 35 0 R
 /F1.0 10 0 R
 >>
-/XObject << /Stamp1 4642 0 R
+/XObject << /Stamp1 4645 0 R
 >>
 >>
 >>
@@ -108450,7 +108450,7 @@ endobj
 /Font << /F2.0 29 0 R
 /F1.0 10 0 R
 >>
-/XObject << /Stamp2 4643 0 R
+/XObject << /Stamp2 4646 0 R
 >>
 >>
 >>
@@ -108554,7 +108554,7 @@ endobj
 /Font << /F2.0 29 0 R
 /F1.0 10 0 R
 >>
-/XObject << /Stamp1 4642 0 R
+/XObject << /Stamp1 4645 0 R
 >>
 >>
 >>
@@ -108971,7 +108971,7 @@ endobj
 /F3.0 33 0 R
 /F4.0 35 0 R
 >>
-/XObject << /Stamp2 4643 0 R
+/XObject << /Stamp2 4646 0 R
 >>
 >>
 >>
@@ -109091,7 +109091,7 @@ endobj
 /F3.0 33 0 R
 /F4.0 35 0 R
 >>
-/XObject << /Stamp1 4642 0 R
+/XObject << /Stamp1 4645 0 R
 >>
 >>
 >>
@@ -111278,7 +111278,7 @@ endobj
 /F1.0 10 0 R
 /F4.0 35 0 R
 >>
-/XObject << /Stamp2 4643 0 R
+/XObject << /Stamp2 4646 0 R
 >>
 >>
 /Annots [858 0 R 860 0 R 861 0 R 863 0 R 864 0 R 865 0 R 867 0 R 868 0 R]
@@ -111607,7 +111607,7 @@ endobj
 /F1.0 10 0 R
 /F3.0 33 0 R
 >>
-/XObject << /Stamp1 4642 0 R
+/XObject << /Stamp1 4645 0 R
 >>
 >>
 /Annots [873 0 R 874 0 R 875 0 R 876 0 R]
@@ -111618,7 +111618,7 @@ endobj
 endobj
 872 0 obj
 << /Limits [(dfs.datanode.failed.volumes.tolerated) (dm.column.metadata)]
-/Names [(dfs.datanode.failed.volumes.tolerated) 549 0 R (dfs.datanode.max.transfer.threads) 156 0 R (dfs.domain.socket.path) 438 0 R (dialog) 3717 0 R (direct.memory) 1629 0 R (disable-nagle-for-rpc) 1138 0 R (disable.splitting) 560 0 R (disabling-metrics) 3116 0 R (disabling.blockcache) 572 0 R (discovering.available.metrics) 3117 0 R (distributed) 170 0 R (distributed.log.replay.failure.reasons) 1700 0 R (distributed.log.splitting) 1688 0 R (dm.column.metadata) 931 0 R]
+/Names [(dfs.datanode.failed.volumes.tolerated) 549 0 R (dfs.datanode.max.transfer.threads) 156 0 R (dfs.domain.socket.path) 438 0 R (dialog) 3720 0 R (direct.memory) 1629 0 R (disable-nagle-for-rpc) 1138 0 R (disable.splitting) 560 0 R (disabling-metrics) 3116 0 R (disabling.blockcache) 572 0 R (discovering.available.metrics) 3117 0 R (distributed) 170 0 R (distributed.log.replay.failure.reasons) 1700 0 R (distributed.log.splitting) 1688 0 R (dm.column.metadata) 931 0 R]
 >>
 endobj
 873 0 obj
@@ -112627,7 +112627,7 @@ endobj
 /F7.0 886 0 R
 /F7.1 887 0 R
 >>
-/XObject << /Stamp2 4643 0 R
+/XObject << /Stamp2 4646 0 R
 >>
 >>
 /Annots [881 0 R 882 0 R 885 0 R]
@@ -112638,7 +112638,7 @@ endobj
 endobj
 880 0 obj
 << /Limits [(upgrade2.0.ui.splitmerge.by.row) (using-the-code-rolling-restart-sh-code-script)]
-/Names [(upgrade2.0.ui.splitmerge.by.row) 709 0 R (upgrade2.0.zkconfig) 700 0 R (upgrading) 600 0 R (upgrading-2) 3908 0 R (use-cases-for-observer-coprocessors) 2329 0 R (user-interface) 1932 0 R (using-existing-zookeeper-ensemble) 3781 0 R (using-hbase-shell) 2367 0 R (using-rest-endpoints) 2164 0 R (using-secure-http-https-for-the-web-ui) 1268 0 R (using-the-code-rolling-restart-sh-code-script) 3095 0 R]
+/Names [(upgrade2.0.ui.splitmerge.by.row) 709 0 R (upgrade2.0.zkconfig) 700 0 R (upgrading) 600 0 R (upgrading-2) 3911 0 R (use-cases-for-observer-coprocessors) 2329 0 R (user-interface) 1932 0 R (using-existing-zookeeper-ensemble) 3784 0 R (using-hbase-shell) 2367 0 R (using-rest-endpoints) 2164 0 R (using-secure-http-https-for-the-web-ui) 1268 0 R (using-the-code-rolling-restart-sh-code-script) 3095 0 R]
 >>
 endobj
 881 0 obj
@@ -112668,7 +112668,7 @@ endobj
 endobj
 884 0 obj
 << /Limits [(rowcounter) (save-the-dataframe)]
-/Names [(rowcounter) 3052 0 R (rowcounter-example) 1213 0 R (rowkey.design) 973 0 R (rowkey.regionsplits) 1015 0 R (rowkey.scope) 1012 0 R (rpc) 4172 0 R (rpc.configs) 4191 0 R (rpc.logging) 2678 0 R (rs.failover.details) 3198 0 R (rs_metrics) 3125 0 R (rsgroup) 3347 0 R (run-canary-test-as-daemon-mode) 2990 0 R (run.insitu) 3648 0 R (running-canary-in-a-kerberos-enabled-cluster) 2996 0 R (running-hbck-to-identify-inconsistencies) 3943 0 R (running-multiple-workloads-on-a-single-cluster) 3212 0 R (running-the-shell-in-non-interactive-mode) 776 0 R (save-the-dataframe) 2287 0 R]
+/Names [(rowcounter) 3052 0 R (rowcounter-example) 1213 0 R (rowkey.design) 973 0 R (rowkey.regionsplits) 1015 0 R (rowkey.scope) 1012 0 R (rpc) 4175 0 R (rpc.configs) 4194 0 R (rpc.logging) 2678 0 R (rs.failover.details) 3198 0 R (rs_metrics) 3125 0 R (rsgroup) 3347 0 R (run-canary-test-as-daemon-mode) 2990 0 R (run.insitu) 3651 0 R (running-canary-in-a-kerberos-enabled-cluster) 2996 0 R (running-hbck-to-identify-inconsistencies) 3946 0 R (running-multiple-workloads-on-a-single-cluster) 3212 0 R (running-the-shell-in-non-interactive-mode) 776 0 R (save-the-dataframe) 2287 0 R]
 >>
 endobj
 885 0 obj
@@ -112686,22 +112686,22 @@ endobj
 << /Type /Font
 /BaseFont /0c7a4a+mplus-1p-regular
 /Subtype /TrueType
-/FontDescriptor 4901 0 R
+/FontDescriptor 4904 0 R
 /FirstChar 32
 /LastChar 255
-/Widths 4903 0 R
-/ToUnicode 4902 0 R
+/Widths 4906 0 R
+/ToUnicode 4905 0 R
 >>
 endobj
 887 0 obj
 << /Type /Font
 /BaseFont /a99fc7+mplus-1p-regular
 /Subtype /TrueType
-/FontDescriptor 4905 0 R
+/FontDescriptor 4908 0 R
 /FirstChar 32
 /LastChar 255
-/Widths 4907 0 R
-/ToUnicode 4906 0 R
+/Widths 4910 0 R
+/ToUnicode 4909 0 R
 >>
 endobj
 888 0 obj
@@ -114569,7 +114569,7 @@ endobj
 /F7.1 887 0 R
 /F2.0 29 0 R
 >>
-/XObject << /Stamp1 4642 0 R
+/XObject << /Stamp1 4645 0 R
 >>
 >>
 /Annots [890 0 R 891 0 R 894 0 R 895 0 R 896 0 R 897 0 R]
@@ -118505,7 +118505,7 @@ endobj
 /F1.0 10 0 R
 /F4.0 35 0 R
 >>
-/XObject << /Stamp2 4643 0 R
+/XObject << /Stamp2 4646 0 R
 >>
 >>
 >>
@@ -119487,7 +119487,7 @@ endobj
 /F1.1 38 0 R
 /F5.1 45 0 R
 >>
-/XObject << /Stamp1 4642 0 R
+/XObject << /Stamp1 4645 0 R
 >>
 >>
 /Annots [908 0 R 909 0 R 910 0 R 911 0 R 912 0 R 913 0 R]
@@ -120379,7 +120379,7 @@ endobj
 /F2.0 29 0 R
 /F3.0 33 0 R
 >>
-/XObject << /Stamp2 4643 0 R
+/XObject << /Stamp2 4646 0 R
 >>
 >>
 /Annots [917 0 R 918 0 R 920 0 R 921 0 R 923 0 R 925 0 R]
@@ -120544,7 +120544,7 @@ endobj
 /Font << /F2.0 29 0 R
 /F1.0 10 0 R
 >>
-/XObject << /Stamp1 4642 0 R
+/XObject << /Stamp1 4645 0 R
 >>
 >>
 >>
@@ -120711,7 +120711,7 @@ endobj
 /Font << /F2.0 29 0 R
 /F1.0 10 0 R
 >>
-/XObject << /Stamp2 4643 0 R
+/XObject << /Stamp2 4646 0 R
 >>
 >>
 /Annots [932 0 R]
@@ -120940,7 +120940,7 @@ endobj
 /Font << /F2.0 29 0 R
 /F1.0 10 0 R
 >>
-/XObject << /Stamp1 4642 0 R
+/XObject << /Stamp1 4645 0 R
 >>
 >>
 >>
@@ -121058,7 +121058,7 @@ endobj
 /Font << /F2.0 29 0 R
 /F1.0 10 0 R
 >>
-/XObject << /Stamp2 4643 0 R
+/XObject << /Stamp2 4646 0 R
 >>
 >>
 /Annots [939 0 R 940 0 R]
@@ -121471,7 +121471,7 @@ endobj
 /F1.0 10 0 R
 /F1.1 38 0 R
 >>
-/XObject << /Stamp1 4642 0 R
+/XObject << /Stamp1 4645 0 R
 >>
 >>
 /Annots [944 0 R 945 0 R 946 0 R 947 0 R 948 0 R 949 0 R]
@@ -122946,7 +122946,7 @@ endobj
 /F4.0 35 0 R
 /F5.1 45 0 R
 >>
-/XObject << /Stamp2 4643 0 R
+/XObject << /Stamp2 4646 0 R
 >>
 >>
 /Annots [953 0 R 954 0 R 955 0 R 957 0 R]
@@ -123466,7 +123466,7 @@ endobj
 /Font << /F2.0 29 0 R
 /F1.0 10 0 R
 >>
-/XObject << /Stamp1 4642 0 R
+/XObject << /Stamp1 4645 0 R
 >>
 >>
 /Annots [961 0 R]
@@ -123683,7 +123683,7 @@ endobj
 /Font << /F2.0 29 0 R
 /F1.0 10 0 R
 >>
-/XObject << /Stamp2 4643 0 R
+/XObject << /Stamp2 4646 0 R
 >>
 >>
 /Annots [965 0 R]
@@ -124000,7 +124000,7 @@ endobj
 /Font << /F2.0 29 0 R
 /F1.0 10 0 R
 >>
-/XObject << /Stamp1 4642 0 R
+/XObject << /Stamp1 4645 0 R
 >>
 >>
 /Annots [969 0 R]
@@ -124416,7 +124416,7 @@ endobj
 /F1.0 10 0 R
 /F3.0 33 0 R
 >>
-/XObject << /Stamp2 4643 0 R
+/XObject << /Stamp2 4646 0 R
 >>
 >>
 >>
@@ -125145,7 +125145,7 @@ endobj
 /F1.0 10 0 R
 /F4.0 35 0 R
 >>
-/XObject << /Stamp1 4642 0 R
+/XObject << /Stamp1 4645 0 R
 >>
 >>
 >>
@@ -126078,7 +126078,7 @@ endobj
 /F4.0 35 0 R
 /F2.0 29 0 R
 >>
-/XObject << /Stamp2 4643 0 R
+/XObject << /Stamp2 4646 0 R
 >>
 >>
 /Annots [979 0 R 980 0 R 981 0 R 982 0 R 985 0 R 986 0 R 987 0 R 988 0 R 989 0 R 991 0 R 992 0 R]
@@ -126708,7 +126708,7 @@ endobj
 /F2.0 29 0 R
 /F1.1 38 0 R
 >>
-/XObject << /Stamp1 4642 0 R
+/XObject << /Stamp1 4645 0 R
 >>
 >>
 /Annots [995 0 R 996 0 R 997 0 R 999 0 R 1001 0 R]
@@ -130289,7 +130289,7 @@ endobj
 /F5.1 45 0 R
 /F3.0 33 0 R
 >>
-/XObject << /Stamp2 4643 0 R
+/XObject << /Stamp2 4646 0 R
 >>
 >>
 /Annots [1007 0 R 1008 0 R]
@@ -131007,7 +131007,7 @@ endobj
 /F2.0 29 0 R
 /F3.0 33 0 R
 >>
-/XObject << /Stamp1 4642 0 R
+/XObject << /Stamp1 4645 0 R
 >>
 >>
 /Annots [1011 0 R]
@@ -131029,7 +131029,7 @@ endobj
 endobj
 1014 0 obj
 << /Limits [(cf.in.memory) (client.connection.pooling)]
-/Names [(cf.in.memory) 2518 0 R (cf.keep.deleted) 1047 0 R (changes-of-note) 661 0 R (changing.compression) 4020 0 R (changing.rowkeys) 1013 0 R (chaos.monkey.properties) 3608 0 R (checking-for-success-or-failure-in-scripts) 784 0 R (choosing-region-servers-to-replicate-to) 3191 0 R (cleaning-logs) 3197 0 R (client) 4176 0 R (client-side-configuration-for-secure-operation) 1283 0 R (client-side-configuration-for-secure-operation-rest-gateway) 1308 0 R (client-side-configuration-for-simple-user-access-operation) 1330 0 R (client-side-configuration-for-simple-user-access-operation-rest-gateway) 1335 0 R (client-side-configuration-for-simple-user-access-operation-thrift-gateway) 1333 0 R (client-side-properties) 1929 0 R (client.connection.pooling) 1489 0 R]
+/Names [(cf.in.memory) 2518 0 R (cf.keep.deleted) 1047 0 R (changes-of-note) 661 0 R (changing.compression) 4023 0 R (changing.rowkeys) 1013 0 R (chaos.monkey.properties) 3611 0 R (checking-for-success-or-failure-in-scripts) 784 0 R (choosing-region-servers-to-replicate-to) 3191 0 R (cleaning-logs) 3197 0 R (client) 4179 0 R (client-side-configuration-for-secure-operation) 1283 0 R (client-side-configuration-for-secure-operation-rest-gateway) 1308 0 R (client-side-configuration-for-simple-user-access-operation) 1330 0 R (client-side-configuration-for-simple-user-access-operation-rest-gateway) 1335 0 R (client-side-configuration-for-simple-user-access-operation-thrift-gateway) 1333 0 R (client-side-properties) 1929 0 R (client.connection.pooling) 1489 0 R]
 >>
 endobj
 1015 0 obj
@@ -134784,7 +134784,7 @@ endobj
 /F3.0 33 0 R
 /F4.0 35 0 R
 >>
-/XObject << /Stamp2 4643 0 R
+/XObject << /Stamp2 4646 0 R
 >>
 >>
 /Annots [1018 0 R]
@@ -135257,7 +135257,7 @@ endobj
 /F1.0 10 0 R
 /F3.0 33 0 R
 >>
-/XObject << /Stamp1 4642 0 R
+/XObject << /Stamp1 4645 0 R
 >>
 >>
 /Annots [1023 0 R 1024 0 R 1026 0 R]
@@ -135637,7 +135637,7 @@ endobj
 /F1.0 10 0 R
 /F4.0 35 0 R
 >>
-/XObject << /Stamp2 4643 0 R
+/XObject << /Stamp2 4646 0 R
 >>
 >>
 /Annots [1030 0 R 1031 0 R 1032 0 R 1034 0 R]
@@ -135778,7 +135778,7 @@ endobj
 /Font << /F2.0 29 0 R
 /F1.0 10 0 R
 >>
-/XObject << /Stamp1 4642 0 R
+/XObject << /Stamp1 4645 0 R
 >>
 >>
 /Annots [1039 0 R]
@@ -135789,7 +135789,7 @@ endobj
 endobj
 1038 0 obj
 << /Limits [(schema.versions) (sect.zookeeper.session.timeout)]
-/Names [(schema.versions) 1021 0 R (schema.versions.max) 1022 0 R (scopes) 3960 0 R (scripting) 773 0 R (secondary-replica-failover) 1920 0 R (secondary.indexes) 1058 0 R (secondary.indexes.coproc) 1072 0 R (secondary.indexes.dualwrite) 1068 0 R (secondary.indexes.filter) 1062 0 R (secondary.indexes.periodic) 1064 0 R (secondary.indexes.summary) 1070 0 R (sect.zookeeper.session.timeout) 543 0 R]
+/Names [(schema.versions) 1021 0 R (schema.versions.max) 1022 0 R (scopes) 3963 0 R (scripting) 773 0 R (secondary-replica-failover) 1920 0 R (secondary.indexes) 1058 0 R (secondary.indexes.coproc) 1072 0 R (secondary.indexes.dualwrite) 1068 0 R (secondary.indexes.filter) 1062 0 R (secondary.indexes.periodic) 1064 0 R (secondary.indexes.summary) 1070 0 R (sect.zookeeper.session.timeout) 543 0 R]
 >>
 endobj
 1039 0 obj
@@ -136215,7 +136215,7 @@ endobj
 /F3.0 33 0 R
 /F4.0 35 0 R
 >>
-/XObject << /Stamp2 4643 0 R
+/XObject << /Stamp2 4646 0 R
 >>
 >>
 /Annots [1043 0 R 1044 0 R]
@@ -136906,7 +136906,7 @@ endobj
 /F7.0 886 0 R
 /F7.1 887 0 R
 >>
-/XObject << /Stamp1 4642 0 R
+/XObject << /Stamp1 4645 0 R
 >>
 >>
 /Annots [1048 0 R 1049 0 R]
@@ -142621,7 +142621,7 @@ endobj
 /Font << /F4.0 35 0 R
 /F1.0 10 0 R
 >>
-/XObject << /Stamp2 4643 0 R
+/XObject << /Stamp2 4646 0 R
 >>
 >>
 >>
@@ -148567,7 +148567,7 @@ endobj
 /Font << /F4.0 35 0 R
 /F1.0 10 0 R
 >>
-/XObject << /Stamp1 4642 0 R
+/XObject << /Stamp1 4645 0 R
 >>
 >>
 >>
@@ -149653,7 +149653,7 @@ endobj
 /F1.0 10 0 R
 /F3.0 33 0 R
 >>
-/XObject << /Stamp2 4643 0 R
+/XObject << /Stamp2 4646 0 R
 >>
 >>
 >>
@@ -150339,7 +150339,7 @@ endobj
 /F1.0 10 0 R
 /F3.0 33 0 R
 >>
-/XObject << /Stamp1 4642 0 R
+/XObject << /Stamp1 4645 0 R
 >>
 >>
 /Annots [1059 0 R 1060 0 R 1061 0 R 1063 0 R 1065 0 R]
@@ -150644,7 +150644,7 @@ endobj
 /Font << /F2.0 29 0 R
 /F1.0 10 0 R
 >>
-/XObject << /Stamp2 4643 0 R
+/XObject << /Stamp2 4646 0 R
 >>
 >>
 /Annots [1069 0 R 1071 0 R 1073 0 R]
@@ -150852,7 +150852,7 @@ endobj
 /Font << /F2.0 29 0 R
 /F1.0 10 0 R
 >>
-/XObject << /Stamp1 4642 0 R
+/XObject << /Stamp1 4645 0 R
 >>
 >>
 /Annots [1077 0 R]
@@ -151648,7 +151648,7 @@ endobj
 /F1.0 10 0 R
 /F4.0 35 0 R
 >>
-/XObject << /Stamp2 4643 0 R
+/XObject << /Stamp2 4646 0 R
 >>
 >>
 /Annots [1081 0 R 1084 0 R]
@@ -152626,7 +152626,7 @@ endobj
 /F5.1 45 0 R
 /F3.0 33 0 R
 >>
-/XObject << /Stamp1 4642 0 R
+/XObject << /Stamp1 4645 0 R
 >>
 >>
 /Annots [1089 0 R 1090 0 R]
@@ -153306,7 +153306,7 @@ endobj
 /F4.0 35 0 R
 /F2.0 29 0 R
 >>
-/XObject << /Stamp2 4643 0 R
+/XObject << /Stamp2 4646 0 R
 >>
 >>
 /Annots [1094 0 R 1096 0 R 1097 0 R 1098 0 R]
@@ -154059,7 +154059,7 @@ endobj
 /F3.0 33 0 R
 /F2.0 29 0 R
 >>
-/XObject << /Stamp1 4642 0 R
+/XObject << /Stamp1 4645 0 R
 >>
 >>
 /Annots [1102 0 R]
@@ -154695,7 +154695,7 @@ endobj
 /F2.0 29 0 R
 /F4.0 35 0 R
 >>
-/XObject << /Stamp2 4643 0 R
+/XObject << /Stamp2 4646 0 R
 >>
 >>
 /Annots [1109 0 R]
@@ -155499,7 +155499,7 @@ endobj
 /F1.0 10 0 R
 /F4.0 35 0 R
 >>
-/XObject << /Stamp1 4642 0 R
+/XObject << /Stamp1 4645 0 R
 >>
 >>
 /Annots [1113 0 R]
@@ -156062,7 +156062,7 @@ endobj
 /Font << /F2.0 29 0 R
 /F1.0 10 0 R
 >>
-/XObject << /Stamp2 4643 0 R
+/XObject << /Stamp2 4646 0 R
 >>
 >>
 /Annots [1118 0 R]
@@ -157621,7 +157621,7 @@ endobj
 /F4.0 35 0 R
 /F1.1 38 0 R
 >>
-/XObject << /Stamp1 4642 0 R
+/XObject << /Stamp1 4645 0 R
 >>
 >>
 /Annots [1125 0 R]
@@ -158365,7 +158365,7 @@ endobj
 /F2.0 29 0 R
 /F4.0 35 0 R
 >>
-/XObject << /Stamp2 4643 0 R
+/XObject << /Stamp2 4646 0 R
 >>
 >>
 /Annots [1129 0 R 1130 0 R 1131 0 R]
@@ -158533,7 +158533,7 @@ endobj
 /Resources << /ProcSet [/PDF /Text /ImageB /ImageC /ImageI]
 /Font << /F1.0 10 0 R
 >>
-/XObject << /Stamp1 4642 0 R
+/XObject << /Stamp1 4645 0 R
 >>
 >>
 >>
@@ -159679,7 +159679,7 @@ endobj
 /F4.0 35 0 R
 /F1.1 38 0 R
 >>
-/XObject << /Stamp2 4643 0 R
+/XObject << /Stamp2 4646 0 R
 >>
 >>
 >>
@@ -160957,7 +160957,7 @@ endobj
 /F2.0 29 0 R
 /F3.0 33 0 R
 >>
-/XObject << /Stamp1 4642 0 R
+/XObject << /Stamp1 4645 0 R
 >>
 >>
 /Annots [1143 0 R 1144 0 R 1145 0 R 1146 0 R 1147 0 R]
@@ -161706,7 +161706,7 @@ endobj
 /F1.0 10 0 R
 /F4.0 35 0 R
 >>
-/XObject << /Stamp2 4643 0 R
+/XObject << /Stamp2 4646 0 R
 >>
 >>
 >>
@@ -161722,7 +161722,7 @@ endobj
 endobj
 1153 0 obj
 << /Limits [(others) (perf.general)]
-/Names [(others) 2295 0 R (output) 3142 0 R (package) 3439 0 R (page-allocation-failure) 2914 0 R (passing-vm-options-to-the-shell) 792 0 R (passwordless.ssh.quickstart) 87 0 R (perf.99th.percentile) 2453 0 R (perf.batch.loading) 2536 0 R (perf.casestudy) 2656 0 R (perf.compactions.and.splits) 2454 0 R (perf.compression) 2521 0 R (perf.compression.however) 2524 0 R (perf.configurations) 2451 0 R (perf.deleting) 2615 0 R (perf.deleting.queue) 2616 0 R (perf.deleting.rpc) 2620 0 R (perf.ec2) 2648 0 R (perf.general) 2531 0 R]
+/Names [(others) 2295 0 R (output) 3142 0 R (package) 3442 0 R (page-allocation-failure) 2914 0 R (passing-vm-options-to-the-shell) 792 0 R (passwordless.ssh.quickstart) 87 0 R (perf.99th.percentile) 2453 0 R (perf.batch.loading) 2536 0 R (perf.casestudy) 2656 0 R (perf.compactions.and.splits) 2454 0 R (perf.compression) 2521 0 R (perf.compression.however) 2524 0 R (perf.configurations) 2451 0 R (perf.deleting) 2615 0 R (perf.deleting.queue) 2616 0 R (perf.deleting.rpc) 2620 0 R (perf.ec2) 2648 0 R (perf.general) 2531 0 R]
 >>
 endobj
 1154 0 obj
@@ -162557,7 +162557,7 @@ endobj
 /F1.1 38 0 R
 /F7.0 886 0 R
 >>
-/XObject << /Stamp1 4642 0 R
+/XObject << /Stamp1 4645 0 R
 >>
 >>
 /Annots [1160 0 R]
@@ -163105,7 +163105,7 @@ endobj
 /F4.0 35 0 R
 /F3.0 33 0 R
 >>
-/XObject << /Stamp2 4643 0 R
+/XObject << /Stamp2 4646 0 R
 >>
 >>
 /Annots [1166 0 R 1167 0 R 1168 0 R 1169 0 R 1170 0 R 1171 0 R]
@@ -163121,7 +163121,7 @@ endobj
 endobj
 1165 0 obj
 << /Limits [(multiple-typed-queues) (schema.updates)]
-/Kids [807 0 R 4067 0 R 1858 0 R 3322 0 R 3251 0 R 3072 0 R 1153 0 R 2549 0 R 2585 0 R 2455 0 R 2562 0 R 2414 0 R 359 0 R 3217 0 R 1587 0 R 2953 0 R 3679 0 R 884 0 R 3053 0 R 1108 0 R]
+/Kids [807 0 R 4070 0 R 1858 0 R 3322 0 R 3251 0 R 3072 0 R 1153 0 R 2549 0 R 2585 0 R 2455 0 R 2562 0 R 2414 0 R 359 0 R 3217 0 R 1587 0 R 2953 0 R 3682 0 R 884 0 R 3053 0 R 1108 0 R]
 >>
 endobj
 1166 0 obj
@@ -164195,7 +164195,7 @@ endobj
 /F3.0 33 0 R
 /F1.1 38 0 R
 >>
-/XObject << /Stamp1 4642 0 R
+/XObject << /Stamp1 4645 0 R
 >>
 >>
 /Annots [1175 0 R]
@@ -164822,7 +164822,7 @@ endobj
 /Font << /F4.0 35 0 R
 /F1.0 10 0 R
 >>
-/XObject << /Stamp2 4643 0 R
+/XObject << /Stamp2 4646 0 R
 >>
 >>
 >>
@@ -165152,7 +165152,7 @@ endobj
 /F4.0 35 0 R
 /F3.0 33 0 R
 >>
-/XObject << /Stamp1 4642 0 R
+/XObject << /Stamp1 4645 0 R
 >>
 >>
 >>
@@ -165905,7 +165905,7 @@ endobj
 /Font << /F4.0 35 0 R
 /F1.0 10 0 R
 >>
-/XObject << /Stamp2 4643 0 R
+/XObject << /Stamp2 4646 0 R
 >>
 >>
 /Annots [1182 0 R 1183 0 R]
@@ -166343,7 +166343,7 @@ endobj
 /Font << /F1.0 10 0 R
 /F4.0 35 0 R
 >>
-/XObject << /Stamp1 4642 0 R
+/XObject << /Stamp1 4645 0 R
 >>
 >>
 /Annots [1186 0 R]
@@ -166871,7 +166871,7 @@ endobj
 /F4.0 35 0 R
 /F3.0 33 0 R
 >>
-/XObject << /Stamp2 4643 0 R
+/XObject << /Stamp2 4646 0 R
 >>
 >>
 /Annots [1190 0 R 1191 0 R]
@@ -167185,7 +167185,7 @@ endobj
 /F1.0 10 0 R
 /F4.0 35 0 R
 >>
-/XObject << /Stamp1 4642 0 R
+/XObject << /Stamp1 4645 0 R
 >>
 >>
 >>
@@ -167937,7 +167937,7 @@ endobj
 /F1.0 10 0 R
 /F4.0 35 0 R
 >>
-/XObject << /Stamp2 4643 0 R
+/XObject << /Stamp2 4646 0 R
 >>
 >>
 /Annots [1198 0 R 1199 0 R 1200 0 R 1201 0 R 1202 0 R 1203 0 R 1204 0 R 1205 0 R 1206 0 R]
@@ -168174,7 +168174,7 @@ endobj
 /Font << /F2.0 29 0 R
 /F1.0 10 0 R
 >>
-/XObject << /Stamp1 4642 0 R
+/XObject << /Stamp1 4645 0 R
 >>
 >>
 /Annots [1210 0 R]
@@ -168483,7 +168483,7 @@ endobj
 /F1.0 10 0 R
 /F4.0 35 0 R
 >>
-/XObject << /Stamp2 4643 0 R
+/XObject << /Stamp2 4646 0 R
 >>
 >>
 /Annots [1214 0 R 1215 0 R 1216 0 R]
@@ -168735,7 +168735,7 @@ endobj
 /F1.0 10 0 R
 /F4.0 35 0 R
 >>
-/XObject << /Stamp1 4642 0 R
+/XObject << /Stamp1 4645 0 R
 >>
 >>
 /Annots [1222 0 R 1224 0 R]
@@ -171291,7 +171291,7 @@ endobj
 /F1.0 10 0 R
 /F4.0 35 0 R
 >>
-/XObject << /Stamp2 4643 0 R
+/XObject << /Stamp2 4646 0 R
 >>
 >>
 /Annots [1229 0 R]
@@ -173548,7 +173548,7 @@ endobj
 /F1.0 10 0 R
 /F4.0 35 0 R
 >>
-/XObject << /Stamp1 4642 0 R
+/XObject << /Stamp1 4645 0 R
 >>
 >>
 /Annots [1233 0 R]
@@ -175504,7 +175504,7 @@ endobj
 /F1.0 10 0 R
 /F2.0 29 0 R
 >>
-/XObject << /Stamp2 4643 0 R
+/XObject << /Stamp2 4646 0 R
 >>
 >>
 >>
@@ -179505,7 +179505,7 @@ endobj
 /Font << /F4.0 35 0 R
 /F1.0 10 0 R
 >>
-/XObject << /Stamp1 4642 0 R
+/XObject << /Stamp1 4645 0 R
 >>
 >>
 >>
@@ -181764,7 +181764,7 @@ endobj
 /F4.0 35 0 R
 /F2.0 29 0 R
 >>
-/XObject << /Stamp2 4643 0 R
+/XObject << /Stamp2 4646 0 R
 >>
 >>
 >>
@@ -185219,7 +185219,7 @@ endobj
 /F1.0 10 0 R
 /F2.0 29 0 R
 >>
-/XObject << /Stamp1 4642 0 R
+/XObject << /Stamp1 4645 0 R
 >>
 >>
 >>
@@ -186826,7 +186826,7 @@ endobj
 /F4.0 35 0 R
 /F2.0 29 0 R
 >>
-/XObject << /Stamp2 4643 0 R
+/XObject << /Stamp2 4646 0 R
 >>
 >>
 >>
@@ -187990,7 +187990,7 @@ endobj
 /F1.0 10 0 R
 /F4.0 35 0 R
 >>
-/XObject << /Stamp1 4642 0 R
+/XObject << /Stamp1 4645 0 R
 >>
 >>
 >>
@@ -188147,7 +188147,7 @@ endobj
 /Font << /F2.0 29 0 R
 /F1.0 10 0 R
 >>
-/XObject << /Stamp2 4643 0 R
+/XObject << /Stamp2 4646 0 R
 >>
 >>
 /Annots [1256 0 R]
@@ -191605,7 +191605,7 @@ endobj
 /F1.0 10 0 R
 /F4.0 35 0 R
 >>
-/XObject << /Stamp1 4642 0 R
+/XObject << /Stamp1 4645 0 R
 >>
 >>
 /Annots [1260 0 R]
@@ -191960,7 +191960,7 @@ endobj
 /F3.0 33 0 R
 /F1.0 10 0 R
 >>
-/XObject << /Stamp2 4643 0 R
+/XObject << /Stamp2 4646 0 R
 >>
 >>
 /Annots [1264 0 R 1265 0 R]
@@ -192579,7 +192579,7 @@ endobj
 /F3.0 33 0 R
 /F5.1 45 0 R
 >>
-/XObject << /Stamp1 4642 0 R
+/XObject << /Stamp1 4645 0 R
 >>
 >>
 /Annots [1269 0 R]
@@ -193169,7 +193169,7 @@ endobj
 /F4.0 35 0 R
 /F3.0 33 0 R
 >>
-/XObject << /Stamp2 4643 0 R
+/XObject << /Stamp2 4646 0 R
 >>
 >>
 >>
@@ -193965,7 +193965,7 @@ endobj
 /Font << /F4.0 35 0 R
 /F1.0 10 0 R
 >>
-/XObject << /Stamp1 4642 0 R
+/XObject << /Stamp1 4645 0 R
 >>
 >>
 >>
@@ -194813,7 +194813,7 @@ endobj
 /F1.0 10 0 R
 /F4.0 35 0 R
 >>
-/XObject << /Stamp2 4643 0 R
+/XObject << /Stamp2 4646 0 R
 >>
 >>
 /Annots [1278 0 R 1279 0 R 1282 0 R 1284 0 R]
@@ -196518,7 +196518,7 @@ endobj
 /F4.0 35 0 R
 /F2.0 29 0 R
 >>
-/XObject << /Stamp1 4642 0 R
+/XObject << /Stamp1 4645 0 R
 >>
 >>
 >>
@@ -197653,7 +197653,7 @@ endobj
 /F2.0 29 0 R
 /F5.1 45 0 R
 >>
-/XObject << /Stamp2 4643 0 R
+/XObject << /Stamp2 4646 0 R
 >>
 >>
 /Annots [1291 0 R 1293 0 R 1294 0 R 1295 0 R]
@@ -197663,11 +197663,11 @@ endobj
 << /Type /Font
 /BaseFont /294f18+mplus1mn-italic
 /Subtype /TrueType
-/FontDescriptor 4909 0 R
+/FontDescriptor 4912 0 R
 /FirstChar 32
 /LastChar 255
-/Widths 4911 0 R
-/ToUnicode 4910 0 R
+/Widths 4914 0 R
+/ToUnicode 4913 0 R
 >>
 endobj
 1291 0 obj
@@ -198878,7 +198878,7 @@ endobj
 /F2.0 29 0 R
 /F6.0 471 0 R
 >>
-/XObject << /Stamp1 4642 0 R
+/XObject << /Stamp1 4645 0 R
 >>
 >>
 /Annots [1298 0 R 1299 0 R 1300 0 R 1301 0 R 1303 0 R 1304 0 R]
@@ -200109,7 +200109,7 @@ endobj
 /F3.0 33 0 R
 /F8.0 1290 0 R
 >>
-/XObject << /Stamp2 4643 0 R
+/XObject << /Stamp2 4646 0 R
 >>
 >>
 /Annots [1307 0 R 1309 0 R 1310 0 R]
@@ -201135,7 +201135,7 @@ endobj
 /F3.0 33 0 R
 /F2.0 29 0 R
 >>
-/XObject << /Stamp1 4642 0 R
+/XObject << /Stamp1 4645 0 R
 >>
 >>
 /Annots [1313 0 R]
@@ -202060,7 +202060,7 @@ endobj
 /F1.0 10 0 R
 /F3.0 33 0 R
 >>
-/XObject << /Stamp2 4643 0 R
+/XObject << /Stamp2 4646 0 R
 >>
 >>
 >>
@@ -202421,7 +202421,7 @@ endobj
 /F1.0 10 0 R
 /F4.0 35 0 R
 >>
-/XObject << /Stamp1 4642 0 R
+/XObject << /Stamp1 4645 0 R
 >>
 >>
 /Annots [1320 0 R 1321 0 R 1323 0 R 1324 0 R]
@@ -202479,7 +202479,7 @@ endobj
 endobj
 1327 0 obj
 << /Limits [(shell-tricks) (space-quotas)]
-/Names [(shell-tricks) 795 0 R (shell_exercises) 65 0 R (shortcircuit.reads) 1142 0 R (simple-versus-secure-access) 1322 0 R (slack) 3385 0 R (slowness-due-to-high-processor-usage) 2948 0 R (snappy.compression.installation) 4011 0 R (snapshot-errors-due-to-reverse-dns) 2847 0 R (snapshots_azure) 3284 0 R (snapshots_s3) 3277 0 R (space-quotas) 3232 0 R]
+/Names [(shell-tricks) 795 0 R (shell_exercises) 65 0 R (shortcircuit.reads) 1142 0 R (simple-versus-secure-access) 1322 0 R (slack) 3388 0 R (slowness-due-to-high-processor-usage) 2948 0 R (snappy.compression.installation) 4014 0 R (snapshot-errors-due-to-reverse-dns) 2847 0 R (snapshots_azure) 3284 0 R (snapshots_s3) 3277 0 R (space-quotas) 3232 0 R]
 >>
 endobj
 1328 0 obj
@@ -203577,7 +203577,7 @@ endobj
 /F1.0 10 0 R
 /F2.0 29 0 R
 >>
-/XObject << /Stamp2 4643 0 R
+/XObject << /Stamp2 4646 0 R
 >>
 >>
 >>
@@ -204599,7 +204599,7 @@ endobj
 /F1.0 10 0 R
 /F2.0 29 0 R
 >>
-/XObject << /Stamp1 4642 0 R
+/XObject << /Stamp1 4645 0 R
 >>
 >>
 /Annots [1334 0 R 1336 0 R]
@@ -205366,7 +205366,7 @@ endobj
 /F1.0 10 0 R
 /F4.0 35 0 R
 >>
-/XObject << /Stamp2 4643 0 R
+/XObject << /Stamp2 4646 0 R
 >>
 >>
 /Annots [1341 0 R 1342 0 R 1343 0 R]
@@ -205704,7 +205704,7 @@ endobj
 /F4.0 35 0 R
 /F7.0 886 0 R
 >>
-/XObject << /Stamp1 4642 0 R
+/XObject << /Stamp1 4645 0 R
 >>
 >>
 /Annots [1347 0 R]
@@ -206567,7 +206567,7 @@ endobj
 /F3.0 33 0 R
 /F4.0 35 0 R
 >>
-/XObject << /Stamp2 4643 0 R
+/XObject << /Stamp2 4646 0 R
 >>
 >>
 /Annots [1351 0 R 1353 0 R 1354 0 R]
@@ -207287,7 +207287,7 @@ endobj
 /F4.0 35 0 R
 /F5.1 45 0 R
 >>
-/XObject << /Stamp1 4642 0 R
+/XObject << /Stamp1 4645 0 R
 >>
 >>
 /Annots [1359 0 R]
@@ -208505,7 +208505,7 @@ endobj
 /F3.0 33 0 R
 /F4.0 35 0 R
 >>
-/XObject << /Stamp2 4643 0 R
+/XObject << /Stamp2 4646 0 R
 >>
 >>
 >>
@@ -210234,7 +210234,7 @@ endobj
 /F4.0 35 0 R
 /F2.0 29 0 R
 >>
-/XObject << /Stamp1 4642 0 R
+/XObject << /Stamp1 4645 0 R
 >>
 >>
 >>
@@ -211208,7 +211208,7 @@ endobj
 /F3.0 33 0 R
 /F5.1 45 0 R
 >>
-/XObject << /Stamp2 4643 0 R
+/XObject << /Stamp2 4646 0 R
 >>
 >>
 /Annots [1369 0 R 1371 0 R 1373 0 R 1374 0 R 1375 0 R]
@@ -212052,7 +212052,7 @@ endobj
 /F1.0 10 0 R
 /F3.0 33 0 R
 >>
-/XObject << /Stamp1 4642 0 R
+/XObject << /Stamp1 4645 0 R
 >>
 >>
 >>
@@ -213247,7 +213247,7 @@ endobj
 /Font << /F4.0 35 0 R
 /F1.0 10 0 R
 >>
-/XObject << /Stamp2 4643 0 R
+/XObject << /Stamp2 4646 0 R
 >>
 >>
 >>
@@ -214284,7 +214284,7 @@ endobj
 /F2.0 29 0 R
 /F5.1 45 0 R
 >>
-/XObject << /Stamp1 4642 0 R
+/XObject << /Stamp1 4645 0 R
 >>
 >>
 >>
@@ -215006,7 +215006,7 @@ endobj
 /F1.1 38 0 R
 /F4.0 35 0 R
 >>
-/XObject << /Stamp2 4643 0 R
+/XObject << /Stamp2 4646 0 R
 >>
 >>
 >>
@@ -215364,7 +215364,7 @@ endobj
 /F1.0 10 0 R
 /F4.0 35 0 R
 >>
-/XObject << /Stamp1 4642 0 R
+/XObject << /Stamp1 4645 0 R
 >>
 >>
 >>
@@ -218597,7 +218597,7 @@ endobj
 /F4.0 35 0 R
 /F7.0 886 0 R
 >>
-/XObject << /Stamp2 4643 0 R
+/XObject << /Stamp2 4646 0 R
 >>
 >>
 >>
@@ -221448,7 +221448,7 @@ endobj
 /F3.0 33 0 R
 /F4.0 35 0 R
 >>
-/XObject << /Stamp1 4642 0 R
+/XObject << /Stamp1 4645 0 R
 >>
 >>
 >>
@@ -224307,7 +224307,7 @@ endobj
 /F2.0 29 0 R
 /F1.0 10 0 R
 >>
-/XObject << /Stamp2 4643 0 R
+/XObject << /Stamp2 4646 0 R
 >>
 >>
 >>
@@ -225401,7 +225401,7 @@ endobj
 /F5.1 45 0 R
 /F2.0 29 0 R
 >>
-/XObject << /Stamp1 4642 0 R
+/XObject << /Stamp1 4645 0 R
 >>
 >>
 /Annots [1396 0 R 1397 0 R]
@@ -226238,7 +226238,7 @@ endobj
 /F4.0 35 0 R
 /F5.1 45 0 R
 >>
-/XObject << /Stamp2 4643 0 R
+/XObject << /Stamp2 4646 0 R
 >>
 >>
 /Annots [1401 0 R]
@@ -228353,7 +228353,7 @@ endobj
 /F1.0 10 0 R
 /F4.0 35 0 R
 >>
-/XObject << /Stamp1 4642 0 R
+/XObject << /Stamp1 4645 0 R
 >>
 >>
 >>
@@ -230028,7 +230028,7 @@ endobj
 /F1.0 10 0 R
 /F3.0 33 0 R
 >>
-/XObject << /Stamp2 4643 0 R
+/XObject << /Stamp2 4646 0 R
 >>
 >>
 >>
@@ -231238,7 +231238,7 @@ endobj
 /F1.0 10 0 R
 /F3.0 33 0 R
 >>
-/XObject << /Stamp1 4642 0 R
+/XObject << /Stamp1 4645 0 R
 >>
 >>
 >>
@@ -234106,7 +234106,7 @@ endobj
 /F1.0 10 0 R
 /F3.0 33 0 R
 >>
-/XObject << /Stamp2 4643 0 R
+/XObject << /Stamp2 4646 0 R
 >>
 >>
 /

<TRUNCATED>

[16/29] hbase-site git commit: Published site at 477f9fdb32873387231c5fbbff130ba8bf7b5d68.

Posted by gi...@apache.org.
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/621479e1/devapidocs/src-html/org/apache/hadoop/hbase/master/LoadBalancer.html
----------------------------------------------------------------------
diff --git a/devapidocs/src-html/org/apache/hadoop/hbase/master/LoadBalancer.html b/devapidocs/src-html/org/apache/hadoop/hbase/master/LoadBalancer.html
index 733c29d..dd47dc9 100644
--- a/devapidocs/src-html/org/apache/hadoop/hbase/master/LoadBalancer.html
+++ b/devapidocs/src-html/org/apache/hadoop/hbase/master/LoadBalancer.html
@@ -168,16 +168,21 @@
 <span class="sourceLineNo">160</span>  void onConfigurationChange(Configuration conf);<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>   * @return true if Master carries regions<a name="line.163"></a>
+<span class="sourceLineNo">163</span>   * If balancer needs to do initialization after Master has started up, lets do that here.<a name="line.163"></a>
 <span class="sourceLineNo">164</span>   */<a name="line.164"></a>
-<span class="sourceLineNo">165</span>  static boolean isTablesOnMaster(Configuration conf) {<a name="line.165"></a>
-<span class="sourceLineNo">166</span>    return conf.getBoolean(TABLES_ON_MASTER, false);<a name="line.166"></a>
-<span class="sourceLineNo">167</span>  }<a name="line.167"></a>
-<span class="sourceLineNo">168</span><a name="line.168"></a>
-<span class="sourceLineNo">169</span>  static boolean isSystemTablesOnlyOnMaster(Configuration conf) {<a name="line.169"></a>
-<span class="sourceLineNo">170</span>    return conf.getBoolean(SYSTEM_TABLES_ON_MASTER, false);<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">165</span>  void postMasterStartupInitialize();<a name="line.165"></a>
+<span class="sourceLineNo">166</span><a name="line.166"></a>
+<span class="sourceLineNo">167</span>  /**<a name="line.167"></a>
+<span class="sourceLineNo">168</span>   * @return true if Master carries regions<a name="line.168"></a>
+<span class="sourceLineNo">169</span>   */<a name="line.169"></a>
+<span class="sourceLineNo">170</span>  static boolean isTablesOnMaster(Configuration conf) {<a name="line.170"></a>
+<span class="sourceLineNo">171</span>    return conf.getBoolean(TABLES_ON_MASTER, false);<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>  static boolean isSystemTablesOnlyOnMaster(Configuration conf) {<a name="line.174"></a>
+<span class="sourceLineNo">175</span>    return conf.getBoolean(SYSTEM_TABLES_ON_MASTER, false);<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>
 
 
 


[24/29] hbase-site git commit: Published site at 477f9fdb32873387231c5fbbff130ba8bf7b5d68.

Posted by gi...@apache.org.
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/621479e1/devapidocs/org/apache/hadoop/hbase/master/HMaster.html
----------------------------------------------------------------------
diff --git a/devapidocs/org/apache/hadoop/hbase/master/HMaster.html b/devapidocs/org/apache/hadoop/hbase/master/HMaster.html
index 9412c02..9e6fbef 100644
--- a/devapidocs/org/apache/hadoop/hbase/master/HMaster.html
+++ b/devapidocs/org/apache/hadoop/hbase/master/HMaster.html
@@ -2379,7 +2379,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/master/MasterServices
 <ul class="blockList">
 <li class="blockList">
 <h4>updateConfigurationForSpaceQuotaObserver</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/master/HMaster.html#line.1013">updateConfigurationForSpaceQuotaObserver</a>(org.apache.hadoop.conf.Configuration&nbsp;conf)</pre>
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/master/HMaster.html#line.1024">updateConfigurationForSpaceQuotaObserver</a>(org.apache.hadoop.conf.Configuration&nbsp;conf)</pre>
 <div class="block">Adds the <code>MasterSpaceQuotaObserver</code> to the list of configured Master observers to
  automatically remove space quotas for a table when that table is deleted.</div>
 </li>
@@ -2390,7 +2390,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/master/MasterServices
 <ul class="blockList">
 <li class="blockList">
 <h4>initMobCleaner</h4>
-<pre>private&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/master/HMaster.html#line.1030">initMobCleaner</a>()</pre>
+<pre>private&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/master/HMaster.html#line.1041">initMobCleaner</a>()</pre>
 </li>
 </ul>
 <a name="createMetaBootstrap-org.apache.hadoop.hbase.master.HMaster-org.apache.hadoop.hbase.monitoring.MonitoredTask-">
@@ -2399,7 +2399,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/master/MasterServices
 <ul class="blockList">
 <li class="blockList">
 <h4>createMetaBootstrap</h4>
-<pre><a href="../../../../../org/apache/hadoop/hbase/master/MasterMetaBootstrap.html" title="class in org.apache.hadoop.hbase.master">MasterMetaBootstrap</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/master/HMaster.html#line.1049">createMetaBootstrap</a>(<a href="../../../../../org/apache/hadoop/hbase/master/HMaster.html" title="class in org.apache.hadoop.hbase.master">HMaster</a>&nbsp;master,
+<pre><a href="../../../../../org/apache/hadoop/hbase/master/MasterMetaBootstrap.html" title="class in org.apache.hadoop.hbase.master">MasterMetaBootstrap</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/master/HMaster.html#line.1060">createMetaBootstrap</a>(<a href="../../../../../org/apache/hadoop/hbase/master/HMaster.html" title="class in org.apache.hadoop.hbase.master">HMaster</a>&nbsp;master,
                                         <a href="../../../../../org/apache/hadoop/hbase/monitoring/MonitoredTask.html" title="interface in org.apache.hadoop.hbase.monitoring">MonitoredTask</a>&nbsp;status)</pre>
 <div class="block">Create a <a href="../../../../../org/apache/hadoop/hbase/master/MasterMetaBootstrap.html" title="class in org.apache.hadoop.hbase.master"><code>MasterMetaBootstrap</code></a> instance.</div>
 </li>
@@ -2410,7 +2410,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/master/MasterServices
 <ul class="blockList">
 <li class="blockList">
 <h4>createServerManager</h4>
-<pre><a href="../../../../../org/apache/hadoop/hbase/master/ServerManager.html" title="class in org.apache.hadoop.hbase.master">ServerManager</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/master/HMaster.html#line.1058">createServerManager</a>(<a href="../../../../../org/apache/hadoop/hbase/master/MasterServices.html" title="interface in org.apache.hadoop.hbase.master">MasterServices</a>&nbsp;master)
+<pre><a href="../../../../../org/apache/hadoop/hbase/master/ServerManager.html" title="class in org.apache.hadoop.hbase.master">ServerManager</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/master/HMaster.html#line.1069">createServerManager</a>(<a href="../../../../../org/apache/hadoop/hbase/master/MasterServices.html" title="interface in org.apache.hadoop.hbase.master">MasterServices</a>&nbsp;master)
                            throws <a href="https://docs.oracle.com/javase/8/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</a></pre>
 <div class="block">Create a <a href="../../../../../org/apache/hadoop/hbase/master/ServerManager.html" title="class in org.apache.hadoop.hbase.master"><code>ServerManager</code></a> instance.</div>
 <dl>
@@ -2425,7 +2425,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/master/MasterServices
 <ul class="blockList">
 <li class="blockList">
 <h4>waitForRegionServers</h4>
-<pre>private&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/master/HMaster.html#line.1065">waitForRegionServers</a>(<a href="../../../../../org/apache/hadoop/hbase/monitoring/MonitoredTask.html" title="interface in org.apache.hadoop.hbase.monitoring">MonitoredTask</a>&nbsp;status)
+<pre>private&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/master/HMaster.html#line.1076">waitForRegionServers</a>(<a href="../../../../../org/apache/hadoop/hbase/monitoring/MonitoredTask.html" title="interface in org.apache.hadoop.hbase.monitoring">MonitoredTask</a>&nbsp;status)
                            throws <a href="https://docs.oracle.com/javase/8/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</a>,
                                   <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/InterruptedException.html?is-external=true" title="class or interface in java.lang">InterruptedException</a></pre>
 <dl>
@@ -2441,7 +2441,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/master/MasterServices
 <ul class="blockList">
 <li class="blockList">
 <h4>initClusterSchemaService</h4>
-<pre>void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/master/HMaster.html#line.1078">initClusterSchemaService</a>()
+<pre>void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/master/HMaster.html#line.1089">initClusterSchemaService</a>()
                        throws <a href="https://docs.oracle.com/javase/8/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</a>,
                               <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/InterruptedException.html?is-external=true" title="class or interface in java.lang">InterruptedException</a></pre>
 <dl>
@@ -2457,7 +2457,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/master/MasterServices
 <ul class="blockList">
 <li class="blockList">
 <h4>initQuotaManager</h4>
-<pre>void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/master/HMaster.html#line.1090">initQuotaManager</a>()
+<pre>void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/master/HMaster.html#line.1101">initQuotaManager</a>()
                throws <a href="https://docs.oracle.com/javase/8/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</a></pre>
 <dl>
 <dt><span class="throwsLabel">Throws:</span></dt>
@@ -2471,7 +2471,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/master/MasterServices
 <ul class="blockList">
 <li class="blockList">
 <h4>createQuotaSnapshotNotifier</h4>
-<pre><a href="../../../../../org/apache/hadoop/hbase/quotas/SpaceQuotaSnapshotNotifier.html" title="interface in org.apache.hadoop.hbase.quotas">SpaceQuotaSnapshotNotifier</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/master/HMaster.html#line.1097">createQuotaSnapshotNotifier</a>()</pre>
+<pre><a href="../../../../../org/apache/hadoop/hbase/quotas/SpaceQuotaSnapshotNotifier.html" title="interface in org.apache.hadoop.hbase.quotas">SpaceQuotaSnapshotNotifier</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/master/HMaster.html#line.1108">createQuotaSnapshotNotifier</a>()</pre>
 </li>
 </ul>
 <a name="isCatalogJanitorEnabled--">
@@ -2480,7 +2480,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/master/MasterServices
 <ul class="blockList">
 <li class="blockList">
 <h4>isCatalogJanitorEnabled</h4>
-<pre>boolean&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/master/HMaster.html#line.1103">isCatalogJanitorEnabled</a>()</pre>
+<pre>boolean&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/master/HMaster.html#line.1114">isCatalogJanitorEnabled</a>()</pre>
 </li>
 </ul>
 <a name="isCleanerChoreEnabled--">
@@ -2489,7 +2489,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/master/MasterServices
 <ul class="blockList">
 <li class="blockList">
 <h4>isCleanerChoreEnabled</h4>
-<pre>boolean&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/master/HMaster.html#line.1108">isCleanerChoreEnabled</a>()</pre>
+<pre>boolean&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/master/HMaster.html#line.1119">isCleanerChoreEnabled</a>()</pre>
 </li>
 </ul>
 <a name="getTableDescriptors--">
@@ -2498,7 +2498,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/master/MasterServices
 <ul class="blockList">
 <li class="blockList">
 <h4>getTableDescriptors</h4>
-<pre>public&nbsp;<a href="../../../../../org/apache/hadoop/hbase/TableDescriptors.html" title="interface in org.apache.hadoop.hbase">TableDescriptors</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/master/HMaster.html#line.1123">getTableDescriptors</a>()</pre>
+<pre>public&nbsp;<a href="../../../../../org/apache/hadoop/hbase/TableDescriptors.html" title="interface in org.apache.hadoop.hbase">TableDescriptors</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/master/HMaster.html#line.1134">getTableDescriptors</a>()</pre>
 <dl>
 <dt><span class="overrideSpecifyLabel">Specified by:</span></dt>
 <dd><code><a href="../../../../../org/apache/hadoop/hbase/master/MasterServices.html#getTableDescriptors--">getTableDescriptors</a></code>&nbsp;in interface&nbsp;<code><a href="../../../../../org/apache/hadoop/hbase/master/MasterServices.html" title="interface in org.apache.hadoop.hbase.master">MasterServices</a></code></dd>
@@ -2515,7 +2515,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/master/MasterServices
 <ul class="blockList">
 <li class="blockList">
 <h4>getServerManager</h4>
-<pre>public&nbsp;<a href="../../../../../org/apache/hadoop/hbase/master/ServerManager.html" title="class in org.apache.hadoop.hbase.master">ServerManager</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/master/HMaster.html#line.1128">getServerManager</a>()</pre>
+<pre>public&nbsp;<a href="../../../../../org/apache/hadoop/hbase/master/ServerManager.html" title="class in org.apache.hadoop.hbase.master">ServerManager</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/master/HMaster.html#line.1139">getServerManager</a>()</pre>
 <dl>
 <dt><span class="overrideSpecifyLabel">Specified by:</span></dt>
 <dd><code><a href="../../../../../org/apache/hadoop/hbase/master/MasterServices.html#getServerManager--">getServerManager</a></code>&nbsp;in interface&nbsp;<code><a href="../../../../../org/apache/hadoop/hbase/master/MasterServices.html" title="interface in org.apache.hadoop.hbase.master">MasterServices</a></code></dd>
@@ -2530,7 +2530,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/master/MasterServices
 <ul class="blockList">
 <li class="blockList">
 <h4>getMasterFileSystem</h4>
-<pre>public&nbsp;<a href="../../../../../org/apache/hadoop/hbase/master/MasterFileSystem.html" title="class in org.apache.hadoop.hbase.master">MasterFileSystem</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/master/HMaster.html#line.1133">getMasterFileSystem</a>()</pre>
+<pre>public&nbsp;<a href="../../../../../org/apache/hadoop/hbase/master/MasterFileSystem.html" title="class in org.apache.hadoop.hbase.master">MasterFileSystem</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/master/HMaster.html#line.1144">getMasterFileSystem</a>()</pre>
 <dl>
 <dt><span class="overrideSpecifyLabel">Specified by:</span></dt>
 <dd><code><a href="../../../../../org/apache/hadoop/hbase/master/MasterServices.html#getMasterFileSystem--">getMasterFileSystem</a></code>&nbsp;in interface&nbsp;<code><a href="../../../../../org/apache/hadoop/hbase/master/MasterServices.html" title="interface in org.apache.hadoop.hbase.master">MasterServices</a></code></dd>
@@ -2545,7 +2545,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/master/MasterServices
 <ul class="blockList">
 <li class="blockList">
 <h4>getMasterWalManager</h4>
-<pre>public&nbsp;<a href="../../../../../org/apache/hadoop/hbase/master/MasterWalManager.html" title="class in org.apache.hadoop.hbase.master">MasterWalManager</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/master/HMaster.html#line.1138">getMasterWalManager</a>()</pre>
+<pre>public&nbsp;<a href="../../../../../org/apache/hadoop/hbase/master/MasterWalManager.html" title="class in org.apache.hadoop.hbase.master">MasterWalManager</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/master/HMaster.html#line.1149">getMasterWalManager</a>()</pre>
 <dl>
 <dt><span class="overrideSpecifyLabel">Specified by:</span></dt>
 <dd><code><a href="../../../../../org/apache/hadoop/hbase/master/MasterServices.html#getMasterWalManager--">getMasterWalManager</a></code>&nbsp;in interface&nbsp;<code><a href="../../../../../org/apache/hadoop/hbase/master/MasterServices.html" title="interface in org.apache.hadoop.hbase.master">MasterServices</a></code></dd>
@@ -2560,7 +2560,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/master/MasterServices
 <ul class="blockList">
 <li class="blockList">
 <h4>getTableStateManager</h4>
-<pre>public&nbsp;<a href="../../../../../org/apache/hadoop/hbase/master/TableStateManager.html" title="class in org.apache.hadoop.hbase.master">TableStateManager</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/master/HMaster.html#line.1143">getTableStateManager</a>()</pre>
+<pre>public&nbsp;<a href="../../../../../org/apache/hadoop/hbase/master/TableStateManager.html" title="class in org.apache.hadoop.hbase.master">TableStateManager</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/master/HMaster.html#line.1154">getTableStateManager</a>()</pre>
 <dl>
 <dt><span class="overrideSpecifyLabel">Specified by:</span></dt>
 <dd><code><a href="../../../../../org/apache/hadoop/hbase/master/MasterServices.html#getTableStateManager--">getTableStateManager</a></code>&nbsp;in interface&nbsp;<code><a href="../../../../../org/apache/hadoop/hbase/master/MasterServices.html" title="interface in org.apache.hadoop.hbase.master">MasterServices</a></code></dd>
@@ -2575,7 +2575,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/master/MasterServices
 <ul class="blockList">
 <li class="blockList">
 <h4>startServiceThreads</h4>
-<pre>private&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/master/HMaster.html#line.1154">startServiceThreads</a>()
+<pre>private&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/master/HMaster.html#line.1165">startServiceThreads</a>()
                           throws <a href="https://docs.oracle.com/javase/8/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</a></pre>
 <dl>
 <dt><span class="throwsLabel">Throws:</span></dt>
@@ -2589,7 +2589,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/master/MasterServices
 <ul class="blockList">
 <li class="blockList">
 <h4>cancelChore</h4>
-<pre>private&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/master/HMaster.html#line.1203">cancelChore</a>(<a href="../../../../../org/apache/hadoop/hbase/ScheduledChore.html" title="class in org.apache.hadoop.hbase">ScheduledChore</a>&nbsp;chore)</pre>
+<pre>private&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/master/HMaster.html#line.1214">cancelChore</a>(<a href="../../../../../org/apache/hadoop/hbase/ScheduledChore.html" title="class in org.apache.hadoop.hbase">ScheduledChore</a>&nbsp;chore)</pre>
 </li>
 </ul>
 <a name="stopServiceThreads--">
@@ -2598,7 +2598,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/master/MasterServices
 <ul class="blockList">
 <li class="blockList">
 <h4>stopServiceThreads</h4>
-<pre>protected&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/master/HMaster.html#line.1210">stopServiceThreads</a>()</pre>
+<pre>protected&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/master/HMaster.html#line.1221">stopServiceThreads</a>()</pre>
 <div class="block"><span class="descfrmTypeLabel">Description copied from class:&nbsp;<code><a href="../../../../../org/apache/hadoop/hbase/regionserver/HRegionServer.html#stopServiceThreads--">HRegionServer</a></code></span></div>
 <div class="block">Wait on all threads to finish. Presumption is that all closes and stops
  have already been called.</div>
@@ -2614,7 +2614,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/master/MasterServices
 <ul class="blockList">
 <li class="blockList">
 <h4>startProcedureExecutor</h4>
-<pre>private&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/master/HMaster.html#line.1251">startProcedureExecutor</a>()
+<pre>private&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/master/HMaster.html#line.1262">startProcedureExecutor</a>()
                              throws <a href="https://docs.oracle.com/javase/8/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</a></pre>
 <dl>
 <dt><span class="throwsLabel">Throws:</span></dt>
@@ -2628,7 +2628,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/master/MasterServices
 <ul class="blockList">
 <li class="blockList">
 <h4>stopProcedureExecutor</h4>
-<pre>private&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/master/HMaster.html#line.1271">stopProcedureExecutor</a>()</pre>
+<pre>private&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/master/HMaster.html#line.1282">stopProcedureExecutor</a>()</pre>
 </li>
 </ul>
 <a name="stopChores--">
@@ -2637,7 +2637,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/master/MasterServices
 <ul class="blockList">
 <li class="blockList">
 <h4>stopChores</h4>
-<pre>private&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/master/HMaster.html#line.1286">stopChores</a>()</pre>
+<pre>private&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/master/HMaster.html#line.1297">stopChores</a>()</pre>
 </li>
 </ul>
 <a name="getRemoteInetAddress-int-long-">
@@ -2646,7 +2646,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/master/MasterServices
 <ul class="blockList">
 <li class="blockList">
 <h4>getRemoteInetAddress</h4>
-<pre><a href="https://docs.oracle.com/javase/8/docs/api/java/net/InetAddress.html?is-external=true" title="class or interface in java.net">InetAddress</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/master/HMaster.html#line.1307">getRemoteInetAddress</a>(int&nbsp;port,
+<pre><a href="https://docs.oracle.com/javase/8/docs/api/java/net/InetAddress.html?is-external=true" title="class or interface in java.net">InetAddress</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/master/HMaster.html#line.1318">getRemoteInetAddress</a>(int&nbsp;port,
                                  long&nbsp;serverStartCode)
                           throws <a href="https://docs.oracle.com/javase/8/docs/api/java/net/UnknownHostException.html?is-external=true" title="class or interface in java.net">UnknownHostException</a></pre>
 <dl>
@@ -2663,7 +2663,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/master/MasterServices
 <ul class="blockList">
 <li class="blockList">
 <h4>getMaxBalancingTime</h4>
-<pre>private&nbsp;int&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/master/HMaster.html#line.1327">getMaxBalancingTime</a>()</pre>
+<pre>private&nbsp;int&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/master/HMaster.html#line.1338">getMaxBalancingTime</a>()</pre>
 <dl>
 <dt><span class="returnLabel">Returns:</span></dt>
 <dd>Maximum time we should run balancer for</dd>
@@ -2676,7 +2676,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/master/MasterServices
 <ul class="blockList">
 <li class="blockList">
 <h4>getMaxRegionsInTransition</h4>
-<pre>private&nbsp;int&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/master/HMaster.html#line.1340">getMaxRegionsInTransition</a>()</pre>
+<pre>private&nbsp;int&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/master/HMaster.html#line.1351">getMaxRegionsInTransition</a>()</pre>
 <dl>
 <dt><span class="returnLabel">Returns:</span></dt>
 <dd>Maximum number of regions in transition</dd>
@@ -2689,7 +2689,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/master/MasterServices
 <ul class="blockList">
 <li class="blockList">
 <h4>balanceThrottling</h4>
-<pre>private&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/master/HMaster.html#line.1352">balanceThrottling</a>(long&nbsp;nextBalanceStartTime,
+<pre>private&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/master/HMaster.html#line.1363">balanceThrottling</a>(long&nbsp;nextBalanceStartTime,
                                int&nbsp;maxRegionsInTransition,
                                long&nbsp;cutoffTime)</pre>
 <div class="block">It first sleep to the next balance plan start time. Meanwhile, throttling by the max
@@ -2708,7 +2708,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/master/MasterServices
 <ul class="blockList">
 <li class="blockList">
 <h4>balance</h4>
-<pre>public&nbsp;boolean&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/master/HMaster.html#line.1383">balance</a>()
+<pre>public&nbsp;boolean&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/master/HMaster.html#line.1394">balance</a>()
                 throws <a href="https://docs.oracle.com/javase/8/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</a></pre>
 <dl>
 <dt><span class="throwsLabel">Throws:</span></dt>
@@ -2722,7 +2722,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/master/MasterServices
 <ul class="blockList">
 <li class="blockList">
 <h4>balance</h4>
-<pre>public&nbsp;boolean&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/master/HMaster.html#line.1387">balance</a>(boolean&nbsp;force)
+<pre>public&nbsp;boolean&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/master/HMaster.html#line.1398">balance</a>(boolean&nbsp;force)
                 throws <a href="https://docs.oracle.com/javase/8/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</a></pre>
 <dl>
 <dt><span class="throwsLabel">Throws:</span></dt>
@@ -2736,7 +2736,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/master/MasterServices
 <ul class="blockList">
 <li class="blockList">
 <h4>getRegionNormalizer</h4>
-<pre>public&nbsp;<a href="../../../../../org/apache/hadoop/hbase/master/normalizer/RegionNormalizer.html" title="interface in org.apache.hadoop.hbase.master.normalizer">RegionNormalizer</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/master/HMaster.html#line.1502">getRegionNormalizer</a>()</pre>
+<pre>public&nbsp;<a href="../../../../../org/apache/hadoop/hbase/master/normalizer/RegionNormalizer.html" title="interface in org.apache.hadoop.hbase.master.normalizer">RegionNormalizer</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/master/HMaster.html#line.1513">getRegionNormalizer</a>()</pre>
 <dl>
 <dt><span class="overrideSpecifyLabel">Specified by:</span></dt>
 <dd><code><a href="../../../../../org/apache/hadoop/hbase/master/MasterServices.html#getRegionNormalizer--">getRegionNormalizer</a></code>&nbsp;in interface&nbsp;<code><a href="../../../../../org/apache/hadoop/hbase/master/MasterServices.html" title="interface in org.apache.hadoop.hbase.master">MasterServices</a></code></dd>
@@ -2751,7 +2751,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/master/MasterServices
 <ul class="blockList">
 <li class="blockList">
 <h4>normalizeRegions</h4>
-<pre>public&nbsp;boolean&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/master/HMaster.html#line.1513">normalizeRegions</a>()
+<pre>public&nbsp;boolean&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/master/HMaster.html#line.1524">normalizeRegions</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">Perform normalization of cluster (invoked by <a href="../../../../../org/apache/hadoop/hbase/master/normalizer/RegionNormalizerChore.html" title="class in org.apache.hadoop.hbase.master.normalizer"><code>RegionNormalizerChore</code></a>).</div>
 <dl>
@@ -2770,7 +2770,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/master/MasterServices
 <ul class="blockList">
 <li class="blockList">
 <h4>getClientIdAuditPrefix</h4>
-<pre>public&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/master/HMaster.html#line.1571">getClientIdAuditPrefix</a>()</pre>
+<pre>public&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/master/HMaster.html#line.1582">getClientIdAuditPrefix</a>()</pre>
 <dl>
 <dt><span class="overrideSpecifyLabel">Specified by:</span></dt>
 <dd><code><a href="../../../../../org/apache/hadoop/hbase/master/MasterServices.html#getClientIdAuditPrefix--">getClientIdAuditPrefix</a></code>&nbsp;in interface&nbsp;<code><a href="../../../../../org/apache/hadoop/hbase/master/MasterServices.html" title="interface in org.apache.hadoop.hbase.master">MasterServices</a></code></dd>
@@ -2785,7 +2785,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/master/MasterServices
 <ul class="blockList">
 <li class="blockList">
 <h4>setCatalogJanitorEnabled</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/master/HMaster.html#line.1582">setCatalogJanitorEnabled</a>(boolean&nbsp;b)</pre>
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/master/HMaster.html#line.1593">setCatalogJanitorEnabled</a>(boolean&nbsp;b)</pre>
 <div class="block">Switch for the background CatalogJanitor thread.
  Used for testing.  The thread will continue to run.  It will just be a noop
  if disabled.</div>
@@ -2801,7 +2801,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/master/MasterServices
 <ul class="blockList">
 <li class="blockList">
 <h4>mergeRegions</h4>
-<pre>public&nbsp;long&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/master/HMaster.html#line.1587">mergeRegions</a>(<a href="../../../../../org/apache/hadoop/hbase/client/RegionInfo.html" title="interface in org.apache.hadoop.hbase.client">RegionInfo</a>[]&nbsp;regionsToMerge,
+<pre>public&nbsp;long&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/master/HMaster.html#line.1598">mergeRegions</a>(<a href="../../../../../org/apache/hadoop/hbase/client/RegionInfo.html" title="interface in org.apache.hadoop.hbase.client">RegionInfo</a>[]&nbsp;regionsToMerge,
                          boolean&nbsp;forcible,
                          long&nbsp;nonceGroup,
                          long&nbsp;nonce)
@@ -2829,7 +2829,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/master/MasterServices
 <ul class="blockList">
 <li class="blockList">
 <h4>splitRegion</h4>
-<pre>public&nbsp;long&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/master/HMaster.html#line.1635">splitRegion</a>(<a href="../../../../../org/apache/hadoop/hbase/client/RegionInfo.html" title="interface in org.apache.hadoop.hbase.client">RegionInfo</a>&nbsp;regionInfo,
+<pre>public&nbsp;long&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/master/HMaster.html#line.1646">splitRegion</a>(<a href="../../../../../org/apache/hadoop/hbase/client/RegionInfo.html" title="interface in org.apache.hadoop.hbase.client">RegionInfo</a>&nbsp;regionInfo,
                         byte[]&nbsp;splitRow,
                         long&nbsp;nonceGroup,
                         long&nbsp;nonce)
@@ -2857,7 +2857,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/master/MasterServices
 <ul class="blockList">
 <li class="blockList">
 <h4>move</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/master/HMaster.html#line.1661">move</a>(byte[]&nbsp;encodedRegionName,
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/master/HMaster.html#line.1672">move</a>(byte[]&nbsp;encodedRegionName,
                  byte[]&nbsp;destServerName)
           throws <a href="../../../../../org/apache/hadoop/hbase/HBaseIOException.html" title="class in org.apache.hadoop.hbase">HBaseIOException</a></pre>
 <dl>
@@ -2872,7 +2872,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/master/MasterServices
 <ul class="blockList">
 <li class="blockList">
 <h4>createTable</h4>
-<pre>public&nbsp;long&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/master/HMaster.html#line.1751">createTable</a>(<a href="../../../../../org/apache/hadoop/hbase/client/TableDescriptor.html" title="interface in org.apache.hadoop.hbase.client">TableDescriptor</a>&nbsp;tableDescriptor,
+<pre>public&nbsp;long&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/master/HMaster.html#line.1762">createTable</a>(<a href="../../../../../org/apache/hadoop/hbase/client/TableDescriptor.html" title="interface in org.apache.hadoop.hbase.client">TableDescriptor</a>&nbsp;tableDescriptor,
                         byte[][]&nbsp;splitKeys,
                         long&nbsp;nonceGroup,
                         long&nbsp;nonce)
@@ -2897,7 +2897,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/master/MasterServices
 <ul class="blockList">
 <li class="blockList">
 <h4>createSystemTable</h4>
-<pre>public&nbsp;long&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/master/HMaster.html#line.1793">createSystemTable</a>(<a href="../../../../../org/apache/hadoop/hbase/client/TableDescriptor.html" title="interface in org.apache.hadoop.hbase.client">TableDescriptor</a>&nbsp;tableDescriptor)
+<pre>public&nbsp;long&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/master/HMaster.html#line.1804">createSystemTable</a>(<a href="../../../../../org/apache/hadoop/hbase/client/TableDescriptor.html" title="interface in org.apache.hadoop.hbase.client">TableDescriptor</a>&nbsp;tableDescriptor)
                        throws <a href="https://docs.oracle.com/javase/8/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</a></pre>
 <div class="block"><span class="descfrmTypeLabel">Description copied from interface:&nbsp;<code><a href="../../../../../org/apache/hadoop/hbase/master/MasterServices.html#createSystemTable-org.apache.hadoop.hbase.client.TableDescriptor-">MasterServices</a></code></span></div>
 <div class="block">Create a system table using the given table definition.</div>
@@ -2918,7 +2918,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/master/MasterServices
 <ul class="blockList">
 <li class="blockList">
 <h4>sanityCheckTableDescriptor</h4>
-<pre>private&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/master/HMaster.html#line.1821">sanityCheckTableDescriptor</a>(<a href="../../../../../org/apache/hadoop/hbase/client/TableDescriptor.html" title="interface in org.apache.hadoop.hbase.client">TableDescriptor</a>&nbsp;htd)
+<pre>private&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/master/HMaster.html#line.1832">sanityCheckTableDescriptor</a>(<a href="../../../../../org/apache/hadoop/hbase/client/TableDescriptor.html" title="interface in org.apache.hadoop.hbase.client">TableDescriptor</a>&nbsp;htd)
                                  throws <a href="https://docs.oracle.com/javase/8/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</a></pre>
 <div class="block">Checks whether the table conforms to some sane limits, and configured
  values (compression, etc) work. Throws an exception if something is wrong.</div>
@@ -2934,7 +2934,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/master/MasterServices
 <ul class="blockList">
 <li class="blockList">
 <h4>checkReplicationScope</h4>
-<pre>private&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/master/HMaster.html#line.1936">checkReplicationScope</a>(<a href="../../../../../org/apache/hadoop/hbase/client/ColumnFamilyDescriptor.html" title="interface in org.apache.hadoop.hbase.client">ColumnFamilyDescriptor</a>&nbsp;hcd)
+<pre>private&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/master/HMaster.html#line.1947">checkReplicationScope</a>(<a href="../../../../../org/apache/hadoop/hbase/client/ColumnFamilyDescriptor.html" title="interface in org.apache.hadoop.hbase.client">ColumnFamilyDescriptor</a>&nbsp;hcd)
                             throws <a href="https://docs.oracle.com/javase/8/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</a></pre>
 <dl>
 <dt><span class="throwsLabel">Throws:</span></dt>
@@ -2948,7 +2948,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/master/MasterServices
 <ul class="blockList">
 <li class="blockList">
 <h4>checkCompactionPolicy</h4>
-<pre>private&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/master/HMaster.html#line.1948">checkCompactionPolicy</a>(org.apache.hadoop.conf.Configuration&nbsp;conf,
+<pre>private&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/master/HMaster.html#line.1959">checkCompactionPolicy</a>(org.apache.hadoop.conf.Configuration&nbsp;conf,
                                    <a href="../../../../../org/apache/hadoop/hbase/client/TableDescriptor.html" title="interface in org.apache.hadoop.hbase.client">TableDescriptor</a>&nbsp;htd)
                             throws <a href="https://docs.oracle.com/javase/8/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</a></pre>
 <dl>
@@ -2963,7 +2963,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/master/MasterServices
 <ul class="blockList">
 <li class="blockList">
 <h4>warnOrThrowExceptionForFailure</h4>
-<pre>private static&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/master/HMaster.html#line.2006">warnOrThrowExceptionForFailure</a>(boolean&nbsp;logWarn,
+<pre>private static&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/master/HMaster.html#line.2017">warnOrThrowExceptionForFailure</a>(boolean&nbsp;logWarn,
                                                    <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;confKey,
                                                    <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;message,
                                                    <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>&nbsp;cause)
@@ -2980,7 +2980,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/master/MasterServices
 <ul class="blockList">
 <li class="blockList">
 <h4>startActiveMasterManager</h4>
-<pre>private&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/master/HMaster.html#line.2015">startActiveMasterManager</a>(int&nbsp;infoPort)
+<pre>private&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/master/HMaster.html#line.2026">startActiveMasterManager</a>(int&nbsp;infoPort)
                                throws org.apache.zookeeper.KeeperException</pre>
 <dl>
 <dt><span class="throwsLabel">Throws:</span></dt>
@@ -2994,7 +2994,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/master/MasterServices
 <ul class="blockList">
 <li class="blockList">
 <h4>checkCompression</h4>
-<pre>private&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/master/HMaster.html#line.2068">checkCompression</a>(<a href="../../../../../org/apache/hadoop/hbase/client/TableDescriptor.html" title="interface in org.apache.hadoop.hbase.client">TableDescriptor</a>&nbsp;htd)
+<pre>private&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/master/HMaster.html#line.2079">checkCompression</a>(<a href="../../../../../org/apache/hadoop/hbase/client/TableDescriptor.html" title="interface in org.apache.hadoop.hbase.client">TableDescriptor</a>&nbsp;htd)
                        throws <a href="https://docs.oracle.com/javase/8/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</a></pre>
 <dl>
 <dt><span class="throwsLabel">Throws:</span></dt>
@@ -3008,7 +3008,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/master/MasterServices
 <ul class="blockList">
 <li class="blockList">
 <h4>checkCompression</h4>
-<pre>private&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/master/HMaster.html#line.2076">checkCompression</a>(<a href="../../../../../org/apache/hadoop/hbase/client/ColumnFamilyDescriptor.html" title="interface in org.apache.hadoop.hbase.client">ColumnFamilyDescriptor</a>&nbsp;hcd)
+<pre>private&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/master/HMaster.html#line.2087">checkCompression</a>(<a href="../../../../../org/apache/hadoop/hbase/client/ColumnFamilyDescriptor.html" title="interface in org.apache.hadoop.hbase.client">ColumnFamilyDescriptor</a>&nbsp;hcd)
                        throws <a href="https://docs.oracle.com/javase/8/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</a></pre>
 <dl>
 <dt><span class="throwsLabel">Throws:</span></dt>
@@ -3022,7 +3022,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/master/MasterServices
 <ul class="blockList">
 <li class="blockList">
 <h4>checkEncryption</h4>
-<pre>private&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/master/HMaster.html#line.2083">checkEncryption</a>(org.apache.hadoop.conf.Configuration&nbsp;conf,
+<pre>private&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/master/HMaster.html#line.2094">checkEncryption</a>(org.apache.hadoop.conf.Configuration&nbsp;conf,
                              <a href="../../../../../org/apache/hadoop/hbase/client/TableDescriptor.html" title="interface in org.apache.hadoop.hbase.client">TableDescriptor</a>&nbsp;htd)
                       throws <a href="https://docs.oracle.com/javase/8/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</a></pre>
 <dl>
@@ -3037,7 +3037,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/master/MasterServices
 <ul class="blockList">
 <li class="blockList">
 <h4>checkEncryption</h4>
-<pre>private&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/master/HMaster.html#line.2091">checkEncryption</a>(org.apache.hadoop.conf.Configuration&nbsp;conf,
+<pre>private&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/master/HMaster.html#line.2102">checkEncryption</a>(org.apache.hadoop.conf.Configuration&nbsp;conf,
                              <a href="../../../../../org/apache/hadoop/hbase/client/ColumnFamilyDescriptor.html" title="interface in org.apache.hadoop.hbase.client">ColumnFamilyDescriptor</a>&nbsp;hcd)
                       throws <a href="https://docs.oracle.com/javase/8/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</a></pre>
 <dl>
@@ -3052,7 +3052,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/master/MasterServices
 <ul class="blockList">
 <li class="blockList">
 <h4>checkClassLoading</h4>
-<pre>private&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/master/HMaster.html#line.2097">checkClassLoading</a>(org.apache.hadoop.conf.Configuration&nbsp;conf,
+<pre>private&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/master/HMaster.html#line.2108">checkClassLoading</a>(org.apache.hadoop.conf.Configuration&nbsp;conf,
                                <a href="../../../../../org/apache/hadoop/hbase/client/TableDescriptor.html" title="interface in org.apache.hadoop.hbase.client">TableDescriptor</a>&nbsp;htd)
                         throws <a href="https://docs.oracle.com/javase/8/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</a></pre>
 <dl>
@@ -3067,7 +3067,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/master/MasterServices
 <ul class="blockList">
 <li class="blockList">
 <h4>isCatalogTable</h4>
-<pre>private static&nbsp;boolean&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/master/HMaster.html#line.2103">isCatalogTable</a>(<a href="../../../../../org/apache/hadoop/hbase/TableName.html" title="class in org.apache.hadoop.hbase">TableName</a>&nbsp;tableName)</pre>
+<pre>private static&nbsp;boolean&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/master/HMaster.html#line.2114">isCatalogTable</a>(<a href="../../../../../org/apache/hadoop/hbase/TableName.html" title="class in org.apache.hadoop.hbase">TableName</a>&nbsp;tableName)</pre>
 </li>
 </ul>
 <a name="deleteTable-org.apache.hadoop.hbase.TableName-long-long-">
@@ -3076,7 +3076,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/master/MasterServices
 <ul class="blockList">
 <li class="blockList">
 <h4>deleteTable</h4>
-<pre>public&nbsp;long&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/master/HMaster.html#line.2108">deleteTable</a>(<a href="../../../../../org/apache/hadoop/hbase/TableName.html" title="class in org.apache.hadoop.hbase">TableName</a>&nbsp;tableName,
+<pre>public&nbsp;long&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/master/HMaster.html#line.2119">deleteTable</a>(<a href="../../../../../org/apache/hadoop/hbase/TableName.html" title="class in org.apache.hadoop.hbase">TableName</a>&nbsp;tableName,
                         long&nbsp;nonceGroup,
                         long&nbsp;nonce)
                  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>
@@ -3098,7 +3098,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/master/MasterServices
 <ul class="blockList">
 <li class="blockList">
 <h4>truncateTable</h4>
-<pre>public&nbsp;long&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/master/HMaster.html#line.2142">truncateTable</a>(<a href="../../../../../org/apache/hadoop/hbase/TableName.html" title="class in org.apache.hadoop.hbase">TableName</a>&nbsp;tableName,
+<pre>public&nbsp;long&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/master/HMaster.html#line.2153">truncateTable</a>(<a href="../../../../../org/apache/hadoop/hbase/TableName.html" title="class in org.apache.hadoop.hbase">TableName</a>&nbsp;tableName,
                           boolean&nbsp;preserveSplits,
                           long&nbsp;nonceGroup,
                           long&nbsp;nonce)
@@ -3122,7 +3122,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/master/MasterServices
 <ul class="blockList">
 <li class="blockList">
 <h4>addColumn</h4>
-<pre>public&nbsp;long&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/master/HMaster.html#line.2172">addColumn</a>(<a href="../../../../../org/apache/hadoop/hbase/TableName.html" title="class in org.apache.hadoop.hbase">TableName</a>&nbsp;tableName,
+<pre>public&nbsp;long&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/master/HMaster.html#line.2183">addColumn</a>(<a href="../../../../../org/apache/hadoop/hbase/TableName.html" title="class in org.apache.hadoop.hbase">TableName</a>&nbsp;tableName,
                       <a href="../../../../../org/apache/hadoop/hbase/client/ColumnFamilyDescriptor.html" title="interface in org.apache.hadoop.hbase.client">ColumnFamilyDescriptor</a>&nbsp;column,
                       long&nbsp;nonceGroup,
                       long&nbsp;nonce)
@@ -3146,7 +3146,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/master/MasterServices
 <ul class="blockList">
 <li class="blockList">
 <h4>modifyColumn</h4>
-<pre>public&nbsp;long&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/master/HMaster.html#line.2193">modifyColumn</a>(<a href="../../../../../org/apache/hadoop/hbase/TableName.html" title="class in org.apache.hadoop.hbase">TableName</a>&nbsp;tableName,
+<pre>public&nbsp;long&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/master/HMaster.html#line.2204">modifyColumn</a>(<a href="../../../../../org/apache/hadoop/hbase/TableName.html" title="class in org.apache.hadoop.hbase">TableName</a>&nbsp;tableName,
                          <a href="../../../../../org/apache/hadoop/hbase/client/ColumnFamilyDescriptor.html" title="interface in org.apache.hadoop.hbase.client">ColumnFamilyDescriptor</a>&nbsp;descriptor,
                          long&nbsp;nonceGroup,
                          long&nbsp;nonce)
@@ -3170,7 +3170,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/master/MasterServices
 <ul class="blockList">
 <li class="blockList">
 <h4>deleteColumn</h4>
-<pre>public&nbsp;long&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/master/HMaster.html#line.2217">deleteColumn</a>(<a href="../../../../../org/apache/hadoop/hbase/TableName.html" title="class in org.apache.hadoop.hbase">TableName</a>&nbsp;tableName,
+<pre>public&nbsp;long&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/master/HMaster.html#line.2228">deleteColumn</a>(<a href="../../../../../org/apache/hadoop/hbase/TableName.html" title="class in org.apache.hadoop.hbase">TableName</a>&nbsp;tableName,
                          byte[]&nbsp;columnName,
                          long&nbsp;nonceGroup,
                          long&nbsp;nonce)
@@ -3194,7 +3194,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/master/MasterServices
 <ul class="blockList">
 <li class="blockList">
 <h4>enableTable</h4>
-<pre>public&nbsp;long&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/master/HMaster.html#line.2243">enableTable</a>(<a href="../../../../../org/apache/hadoop/hbase/TableName.html" title="class in org.apache.hadoop.hbase">TableName</a>&nbsp;tableName,
+<pre>public&nbsp;long&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/master/HMaster.html#line.2254">enableTable</a>(<a href="../../../../../org/apache/hadoop/hbase/TableName.html" title="class in org.apache.hadoop.hbase">TableName</a>&nbsp;tableName,
                         long&nbsp;nonceGroup,
                         long&nbsp;nonce)
                  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>
@@ -3216,7 +3216,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/master/MasterServices
 <ul class="blockList">
 <li class="blockList">
 <h4>disableTable</h4>
-<pre>public&nbsp;long&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/master/HMaster.html#line.2296">disableTable</a>(<a href="../../../../../org/apache/hadoop/hbase/TableName.html" title="class in org.apache.hadoop.hbase">TableName</a>&nbsp;tableName,
+<pre>public&nbsp;long&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/master/HMaster.html#line.2307">disableTable</a>(<a href="../../../../../org/apache/hadoop/hbase/TableName.html" title="class in org.apache.hadoop.hbase">TableName</a>&nbsp;tableName,
                          long&nbsp;nonceGroup,
                          long&nbsp;nonce)
                   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>
@@ -3238,7 +3238,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/master/MasterServices
 <ul class="blockList">
 <li class="blockList">
 <h4>getTableRegionForRow</h4>
-<pre><a href="../../../../../org/apache/hadoop/hbase/util/Pair.html" title="class in org.apache.hadoop.hbase.util">Pair</a>&lt;<a href="../../../../../org/apache/hadoop/hbase/client/RegionInfo.html" title="interface in org.apache.hadoop.hbase.client">RegionInfo</a>,<a href="../../../../../org/apache/hadoop/hbase/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a>&gt;&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/master/HMaster.html#line.2338">getTableRegionForRow</a>(<a href="../../../../../org/apache/hadoop/hbase/TableName.html" title="class in org.apache.hadoop.hbase">TableName</a>&nbsp;tableName,
+<pre><a href="../../../../../org/apache/hadoop/hbase/util/Pair.html" title="class in org.apache.hadoop.hbase.util">Pair</a>&lt;<a href="../../../../../org/apache/hadoop/hbase/client/RegionInfo.html" title="interface in org.apache.hadoop.hbase.client">RegionInfo</a>,<a href="../../../../../org/apache/hadoop/hbase/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a>&gt;&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/master/HMaster.html#line.2349">getTableRegionForRow</a>(<a href="../../../../../org/apache/hadoop/hbase/TableName.html" title="class in org.apache.hadoop.hbase">TableName</a>&nbsp;tableName,
                                                  byte[]&nbsp;rowKey)
                                           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">Return the region and current deployment for the region containing
@@ -3257,7 +3257,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/master/MasterServices
 <ul class="blockList">
 <li class="blockList">
 <h4>modifyTable</h4>
-<pre>public&nbsp;long&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/master/HMaster.html#line.2365">modifyTable</a>(<a href="../../../../../org/apache/hadoop/hbase/TableName.html" title="class in org.apache.hadoop.hbase">TableName</a>&nbsp;tableName,
+<pre>public&nbsp;long&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/master/HMaster.html#line.2376">modifyTable</a>(<a href="../../../../../org/apache/hadoop/hbase/TableName.html" title="class in org.apache.hadoop.hbase">TableName</a>&nbsp;tableName,
                         <a href="../../../../../org/apache/hadoop/hbase/client/TableDescriptor.html" title="interface in org.apache.hadoop.hbase.client">TableDescriptor</a>&nbsp;newDescriptor,
                         long&nbsp;nonceGroup,
                         long&nbsp;nonce)
@@ -3281,7 +3281,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/master/MasterServices
 <ul class="blockList">
 <li class="blockList">
 <h4>restoreSnapshot</h4>
-<pre>public&nbsp;long&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/master/HMaster.html#line.2400">restoreSnapshot</a>(org.apache.hadoop.hbase.shaded.protobuf.generated.SnapshotProtos.SnapshotDescription&nbsp;snapshotDesc,
+<pre>public&nbsp;long&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/master/HMaster.html#line.2411">restoreSnapshot</a>(org.apache.hadoop.hbase.shaded.protobuf.generated.SnapshotProtos.SnapshotDescription&nbsp;snapshotDesc,
                             long&nbsp;nonceGroup,
                             long&nbsp;nonce,
                             boolean&nbsp;restoreAcl)
@@ -3298,7 +3298,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/master/MasterServices
 <ul class="blockList">
 <li class="blockList">
 <h4>checkTableExists</h4>
-<pre>private&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/master/HMaster.html#line.2424">checkTableExists</a>(<a href="../../../../../org/apache/hadoop/hbase/TableName.html" title="class in org.apache.hadoop.hbase">TableName</a>&nbsp;tableName)
+<pre>private&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/master/HMaster.html#line.2435">checkTableExists</a>(<a href="../../../../../org/apache/hadoop/hbase/TableName.html" title="class in org.apache.hadoop.hbase">TableName</a>&nbsp;tableName)
                        throws <a href="https://docs.oracle.com/javase/8/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</a>,
                               <a href="../../../../../org/apache/hadoop/hbase/TableNotFoundException.html" title="class in org.apache.hadoop.hbase">TableNotFoundException</a></pre>
 <dl>
@@ -3314,7 +3314,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/master/MasterServices
 <ul class="blockList">
 <li class="blockList">
 <h4>checkTableModifiable</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/master/HMaster.html#line.2432">checkTableModifiable</a>(<a href="../../../../../org/apache/hadoop/hbase/TableName.html" title="class in org.apache.hadoop.hbase">TableName</a>&nbsp;tableName)
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/master/HMaster.html#line.2443">checkTableModifiable</a>(<a href="../../../../../org/apache/hadoop/hbase/TableName.html" title="class in org.apache.hadoop.hbase">TableName</a>&nbsp;tableName)
                           throws <a href="https://docs.oracle.com/javase/8/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</a>,
                                  <a href="../../../../../org/apache/hadoop/hbase/TableNotFoundException.html" title="class in org.apache.hadoop.hbase">TableNotFoundException</a>,
                                  <a href="../../../../../org/apache/hadoop/hbase/TableNotDisabledException.html" title="class in org.apache.hadoop.hbase">TableNotDisabledException</a></pre>
@@ -3338,7 +3338,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/master/MasterServices
 <ul class="blockList">
 <li class="blockList">
 <h4>getClusterMetricsWithoutCoprocessor</h4>
-<pre>public&nbsp;<a href="../../../../../org/apache/hadoop/hbase/ClusterMetrics.html" title="interface in org.apache.hadoop.hbase">ClusterMetrics</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/master/HMaster.html#line.2444">getClusterMetricsWithoutCoprocessor</a>()
+<pre>public&nbsp;<a href="../../../../../org/apache/hadoop/hbase/ClusterMetrics.html" title="interface in org.apache.hadoop.hbase">ClusterMetrics</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/master/HMaster.html#line.2455">getClusterMetricsWithoutCoprocessor</a>()
                                                    throws <a href="https://docs.oracle.com/javase/8/docs/api/java/io/InterruptedIOException.html?is-external=true" title="class or interface in java.io">InterruptedIOException</a></pre>
 <dl>
 <dt><span class="throwsLabel">Throws:</span></dt>
@@ -3352,7 +3352,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/master/MasterServices
 <ul class="blockList">
 <li class="blockList">
 <h4>getClusterMetricsWithoutCoprocessor</h4>
-<pre>public&nbsp;<a href="../../../../../org/apache/hadoop/hbase/ClusterMetrics.html" title="interface in org.apache.hadoop.hbase">ClusterMetrics</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/master/HMaster.html#line.2448">getClusterMetricsWithoutCoprocessor</a>(<a href="https://docs.oracle.com/javase/8/docs/api/java/util/EnumSet.html?is-external=true" title="class or interface in java.util">EnumSet</a>&lt;<a href="../../../../../org/apache/hadoop/hbase/ClusterMetrics.Option.html" title="enum in org.apache.hadoop.hbase">ClusterMetrics.Option</a>&gt;&nbsp;options)
+<pre>public&nbsp;<a href="../../../../../org/apache/hadoop/hbase/ClusterMetrics.html" title="interface in org.apache.hadoop.hbase">ClusterMetrics</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/master/HMaster.html#line.2459">getClusterMetricsWithoutCoprocessor</a>(<a href="https://docs.oracle.com/javase/8/docs/api/java/util/EnumSet.html?is-external=true" title="class or interface in java.util">EnumSet</a>&lt;<a href="../../../../../org/apache/hadoop/hbase/ClusterMetrics.Option.html" title="enum in org.apache.hadoop.hbase">ClusterMetrics.Option</a>&gt;&nbsp;options)
                                                    throws <a href="https://docs.oracle.com/javase/8/docs/api/java/io/InterruptedIOException.html?is-external=true" title="class or interface in java.io">InterruptedIOException</a></pre>
 <dl>
 <dt><span class="throwsLabel">Throws:</span></dt>
@@ -3366,7 +3366,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/master/MasterServices
 <ul class="blockList">
 <li class="blockList">
 <h4>getClusterMetrics</h4>
-<pre>public&nbsp;<a href="../../../../../org/apache/hadoop/hbase/ClusterMetrics.html" title="interface in org.apache.hadoop.hbase">ClusterMetrics</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/master/HMaster.html#line.2510">getClusterMetrics</a>()
+<pre>public&nbsp;<a href="../../../../../org/apache/hadoop/hbase/ClusterMetrics.html" title="interface in org.apache.hadoop.hbase">ClusterMetrics</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/master/HMaster.html#line.2521">getClusterMetrics</a>()
                                  throws <a href="https://docs.oracle.com/javase/8/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</a></pre>
 <dl>
 <dt><span class="returnLabel">Returns:</span></dt>
@@ -3382,7 +3382,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/master/MasterServices
 <ul class="blockList">
 <li class="blockList">
 <h4>getClusterMetrics</h4>
-<pre>public&nbsp;<a href="../../../../../org/apache/hadoop/hbase/ClusterMetrics.html" title="interface in org.apache.hadoop.hbase">ClusterMetrics</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/master/HMaster.html#line.2514">getClusterMetrics</a>(<a href="https://docs.oracle.com/javase/8/docs/api/java/util/EnumSet.html?is-external=true" title="class or interface in java.util">EnumSet</a>&lt;<a href="../../../../../org/apache/hadoop/hbase/ClusterMetrics.Option.html" title="enum in org.apache.hadoop.hbase">ClusterMetrics.Option</a>&gt;&nbsp;options)
+<pre>public&nbsp;<a href="../../../../../org/apache/hadoop/hbase/ClusterMetrics.html" title="interface in org.apache.hadoop.hbase">ClusterMetrics</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/master/HMaster.html#line.2525">getClusterMetrics</a>(<a href="https://docs.oracle.com/javase/8/docs/api/java/util/EnumSet.html?is-external=true" title="class or interface in java.util">EnumSet</a>&lt;<a href="../../../../../org/apache/hadoop/hbase/ClusterMetrics.Option.html" title="enum in org.apache.hadoop.hbase">ClusterMetrics.Option</a>&gt;&nbsp;options)
                                  throws <a href="https://docs.oracle.com/javase/8/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</a></pre>
 <dl>
 <dt><span class="throwsLabel">Throws:</span></dt>
@@ -3396,7 +3396,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/master/MasterServices
 <ul class="blockList">
 <li class="blockList">
 <h4>getBackupMasters</h4>
-<pre>private&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/util/List.html?is-external=true" title="class or interface in java.util">List</a>&lt;<a href="../../../../../org/apache/hadoop/hbase/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a>&gt;&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/master/HMaster.html#line.2525">getBackupMasters</a>()
+<pre>private&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/util/List.html?is-external=true" title="class or interface in java.util">List</a>&lt;<a href="../../../../../org/apache/hadoop/hbase/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a>&gt;&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/master/HMaster.html#line.2536">getBackupMasters</a>()
                                    throws <a href="https://docs.oracle.com/javase/8/docs/api/java/io/InterruptedIOException.html?is-external=true" title="class or interface in java.io">InterruptedIOException</a></pre>
 <dl>
 <dt><span class="throwsLabel">Throws:</span></dt>
@@ -3410,7 +3410,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/master/MasterServices
 <ul class="blockList">
 <li class="blockList">
 <h4>getLoadedCoprocessors</h4>
-<pre>public static&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/master/HMaster.html#line.2578">getLoadedCoprocessors</a>()</pre>
+<pre>public static&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/master/HMaster.html#line.2589">getLoadedCoprocessors</a>()</pre>
 <div class="block">The set of loaded coprocessors is stored in a static set. Since it's
  statically allocated, it does not require that HMaster's cpHost be
  initialized prior to accessing it.</div>
@@ -3426,7 +3426,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/master/MasterServices
 <ul class="blockList">
 <li class="blockList">
 <h4>getMasterStartTime</h4>
-<pre>public&nbsp;long&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/master/HMaster.html#line.2585">getMasterStartTime</a>()</pre>
+<pre>public&nbsp;long&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/master/HMaster.html#line.2596">getMasterStartTime</a>()</pre>
 <dl>
 <dt><span class="returnLabel">Returns:</span></dt>
 <dd>timestamp in millis when HMaster was started.</dd>
@@ -3439,7 +3439,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/master/MasterServices
 <ul class="blockList">
 <li class="blockList">
 <h4>getMasterActiveTime</h4>
-<pre>public&nbsp;long&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/master/HMaster.html#line.2592">getMasterActiveTime</a>()</pre>
+<pre>public&nbsp;long&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/master/HMaster.html#line.2603">getMasterActiveTime</a>()</pre>
 <dl>
 <dt><span class="returnLabel">Returns:</span></dt>
 <dd>timestamp in millis when HMaster became the active master.</dd>
@@ -3452,7 +3452,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/master/MasterServices
 <ul class="blockList">
 <li class="blockList">
 <h4>getMasterFinishedInitializationTime</h4>
-<pre>public&nbsp;long&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/master/HMaster.html#line.2599">getMasterFinishedInitializationTime</a>()</pre>
+<pre>public&nbsp;long&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/master/HMaster.html#line.2610">getMasterFinishedInitializationTime</a>()</pre>
 <dl>
 <dt><span class="returnLabel">Returns:</span></dt>
 <dd>timestamp in millis when HMaster finished becoming the active master</dd>
@@ -3465,7 +3465,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/master/MasterServices
 <ul class="blockList">
 <li class="blockList">
 <h4>getNumWALFiles</h4>
-<pre>public&nbsp;int&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/master/HMaster.html#line.2603">getNumWALFiles</a>()</pre>
+<pre>public&nbsp;int&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/master/HMaster.html#line.2614">getNumWALFiles</a>()</pre>
 </li>
 </ul>
 <a name="getWalProcedureStore--">
@@ -3474,7 +3474,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/master/MasterServices
 <ul class="blockList">
 <li class="blockList">
 <h4>getWalProcedureStore</h4>
-<pre>public&nbsp;<a href="../../../../../org/apache/hadoop/hbase/procedure2/store/wal/WALProcedureStore.html" title="class in org.apache.hadoop.hbase.procedure2.store.wal">WALProcedureStore</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/master/HMaster.html#line.2607">getWalProcedureStore</a>()</pre>
+<pre>public&nbsp;<a href="../../../../../org/apache/hadoop/hbase/procedure2/store/wal/WALProcedureStore.html" title="class in org.apache.hadoop.hbase.procedure2.store.wal">WALProcedureStore</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/master/HMaster.html#line.2618">getWalProcedureStore</a>()</pre>
 </li>
 </ul>
 <a name="getRegionServerInfoPort-org.apache.hadoop.hbase.ServerName-">
@@ -3483,7 +3483,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/master/MasterServices
 <ul class="blockList">
 <li class="blockList">
 <h4>getRegionServerInfoPort</h4>
-<pre>public&nbsp;int&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/master/HMaster.html#line.2611">getRegionServerInfoPort</a>(<a href="../../../../../org/apache/hadoop/hbase/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a>&nbsp;sn)</pre>
+<pre>public&nbsp;int&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/master/HMaster.html#line.2622">getRegionServerInfoPort</a>(<a href="../../../../../org/apache/hadoop/hbase/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a>&nbsp;sn)</pre>
 </li>
 </ul>
 <a name="getRegionServerVersion-org.apache.hadoop.hbase.ServerName-">
@@ -3492,7 +3492,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/master/MasterServices
 <ul class="blockList">
 <li class="blockList">
 <h4>getRegionServerVersion</h4>
-<pre>public&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/master/HMaster.html#line.2621">getRegionServerVersion</a>(<a href="../../../../../org/apache/hadoop/hbase/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a>&nbsp;sn)</pre>
+<pre>public&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/master/HMaster.html#line.2632">getRegionServerVersion</a>(<a href="../../../../../org/apache/hadoop/hbase/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a>&nbsp;sn)</pre>
 <dl>
 <dt><span class="overrideSpecifyLabel">Specified by:</span></dt>
 <dd><code><a href="../../../../../org/apache/hadoop/hbase/master/MasterServices.html#getRegionServerVersion-org.apache.hadoop.hbase.ServerName-">getRegionServerVersion</a></code>&nbsp;in interface&nbsp;<code><a href="../../../../../org/apache/hadoop/hbase/master/MasterServices.html" title="interface in org.apache.hadoop.hbase.master">MasterServices</a></code></dd>
@@ -3505,7 +3505,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/master/MasterServices
 <ul class="blockList">
 <li class="blockList">
 <h4>checkIfShouldMoveSystemRegionAsync</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/master/HMaster.html#line.2630">checkIfShouldMoveSystemRegionAsync</a>()</pre>
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/master/HMaster.html#line.2641">checkIfShouldMoveSystemRegionAsync</a>()</pre>
 <div class="block"><span class="descfrmTypeLabel">Description copied from interface:&nbsp;<code><a href="../../../../../org/apache/hadoop/hbase/master/MasterServices.html#checkIfShouldMoveSystemRegionAsync--">MasterServices</a></code></span></div>
 <div class="block">Called when a new RegionServer is added to the cluster.
  Checks if new server has a newer version than any existing server and will move system tables
@@ -3522,7 +3522,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/master/MasterServices
 <ul class="blockList">
 <li class="blockList">
 <h4>getMasterCoprocessors</h4>
-<pre>public&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>[]&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/master/HMaster.html#line.2637">getMasterCoprocessors</a>()</pre>
+<pre>public&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>[]&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/master/HMaster.html#line.2648">getMasterCoprocessors</a>()</pre>
 <dl>
 <dt><span class="returnLabel">Returns:</span></dt>
 <dd>array of coprocessor SimpleNames.</dd>
@@ -3535,7 +3535,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/master/MasterServices
 <ul class="blockList">
 <li class="blockList">
 <h4>abort</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/master/HMaster.html#line.2643">abort</a>(<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;reason,
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/master/HMaster.html#line.2654">abort</a>(<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;reason,
                   <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Throwable.html?is-external=true" title="class or interface in java.lang">Throwable</a>&nbsp;cause)</pre>
 <div class="block"><span class="descfrmTypeLabel">Description copied from class:&nbsp;<code><a href="../../../../../org/apache/hadoop/hbase/regionserver/HRegionServer.html#abort-java.lang.String-java.lang.Throwable-">HRegionServer</a></code></span></div>
 <div class="block">Cause the server to exit without closing the regions it is serving, the log
@@ -3558,7 +3558,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/master/MasterServices
 <ul class="blockList">
 <li class="blockList">
 <h4>getZooKeeper</h4>
-<pre>public&nbsp;<a href="../../../../../org/apache/hadoop/hbase/zookeeper/ZKWatcher.html" title="class in org.apache.hadoop.hbase.zookeeper">ZKWatcher</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/master/HMaster.html#line.2667">getZooKeeper</a>()</pre>
+<pre>public&nbsp;<a href="../../../../../org/apache/hadoop/hbase/zookeeper/ZKWatcher.html" title="class in org.apache.hadoop.hbase.zookeeper">ZKWatcher</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/master/HMaster.html#line.2678">getZooKeeper</a>()</pre>
 <div class="block"><span class="descfrmTypeLabel">Description copied from interface:&nbsp;<code><a href="../../../../../org/apache/hadoop/hbase/Server.html#getZooKeeper--">Server</a></code></span></div>
 <div class="block">Gets the ZooKeeper instance for this server.</div>
 <dl>
@@ -3575,7 +3575,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/master/MasterServices
 <ul class="blockList">
 <li class="blockList">
 <h4>getMasterCoprocessorHost</h4>
-<pre>public&nbsp;<a href="../../../../../org/apache/hadoop/hbase/master/MasterCoprocessorHost.html" title="class in org.apache.hadoop.hbase.master">MasterCoprocessorHost</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/master/HMaster.html#line.2672">getMasterCoprocessorHost</a>()</pre>
+<pre>public&nbsp;<a href="../../../../../org/apache/hadoop/hbase/master/MasterCoprocessorHost.html" title="class in org.apache.hadoop.hbase.master">MasterCoprocessorHost</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/master/HMaster.html#line.2683">getMasterCoprocessorHost</a>()</pre>
 <dl>
 <dt><span class="overrideSpecifyLabel">Specified by:</span></dt>
 <dd><code><a href="../../../../../org/apache/hadoop/hbase/master/MasterServices.html#getMasterCoprocessorHost--">getMasterCoprocessorHost</a></code>&nbsp;in interface&nbsp;<code><a href="../../../../../org/apache/hadoop/hbase/master/MasterServices.html" title="interface in org.apache.hadoop.hbase.master">MasterServices</a></code></dd>
@@ -3590,7 +3590,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/master/MasterServices
 <ul class="blockList">
 <li class="blockList">
 <h4>getMasterQuotaManager</h4>
-<pre>public&nbsp;<a href="../../../../../org/apache/hadoop/hbase/quotas/MasterQuotaManager.html" title="class in org.apache.hadoop.hbase.quotas">MasterQuotaManager</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/master/HMaster.html#line.2677">getMasterQuotaManager</a>()</pre>
+<pre>public&nbsp;<a href="../../../../../org/apache/hadoop/hbase/quotas/MasterQuotaManager.html" title="class in org.apache.hadoop.hbase.quotas">MasterQuotaManager</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/master/HMaster.html#line.2688">getMasterQuotaManager</a>()</pre>
 <dl>
 <dt><span class="overrideSpecifyLabel">Specified by:</span></dt>
 <dd><code><a href="../../../../../org/apache/hadoop/hbase/master/MasterServices.html#getMasterQuotaManager--">getMasterQuotaManager</a></code>&nbsp;in interface&nbsp;<code><a href="../../../../../org/apache/hadoop/hbase/master/MasterServices.html" title="interface in org.apache.hadoop.hbase.master">MasterServices</a></code></dd>
@@ -3605,7 +3605,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/master/MasterServices
 <ul class="blockList">
 <li class="blockList">
 <h4>getMasterProcedureExecutor</h4>
-<pre>public&nbsp;<a href="../../../../../org/apache/hadoop/hbase/procedure2/ProcedureExecutor.html" title="class in org.apache.hadoop.hbase.procedure2">ProcedureExecutor</a>&lt;<a href="../../../../../org/apache/hadoop/hbase/master/procedure/MasterProcedureEnv.html" title="class in org.apache.hadoop.hbase.master.procedure">MasterProcedureEnv</a>&gt;&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/master/HMaster.html#line.2682">getMasterProcedureExecutor</a>()</pre>
+<pre>public&nbsp;<a href="../../../../../org/apache/hadoop/hbase/procedure2/ProcedureExecutor.html" title="class in org.apache.hadoop.hbase.procedure2">ProcedureExecutor</a>&lt;<a href="../../../../../org/apache/hadoop/hbase/master/procedure/MasterProcedureEnv.html" title="class in org.apache.hadoop.hbase.master.procedure">MasterProcedureEnv</a>&gt;&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/master/HMaster.html#line.2693">getMasterProcedureExecutor</a>()</pre>
 <dl>
 <dt><span class="overrideSpecifyLabel">Specified by:</span></dt>
 <dd><code><a href="../../../../../org/apache/hadoop/hbase/master/MasterServices.html#getMasterProcedureExecutor--">getMasterProcedureExecutor</a></code>&nbsp;in interface&nbsp;<code><a href="../../../../../org/apache/hadoop/hbase/master/MasterServices.html" title="interface in org.apache.hadoop.hbase.master">MasterServices</a></code></dd>
@@ -3620,7 +3620,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/master/MasterServices
 <ul class="blockList">
 <li class="blockList">
 <h4>getServerName</h4>
-<pre>public&nbsp;<a href="../../../../../org/apache/hadoop/hbase/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/master/HMaster.html#line.2687">getServerName</a>()</pre>
+<pre>public&nbsp;<a href="../../../../../org/apache/hadoop/hbase/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/master/HMaster.html#line.2698">getServerName</a>()</pre>
 <dl>
 <dt><span class="overrideSpecifyLabel">Specified by:</span></dt>
 <dd><code><a href="../../../../../org/apache/hadoop/hbase/Server.html#getServerName--">getServerName</a></code>&nbsp;in interface&nbsp;<code><a href="../../../../../org/apache/hadoop/hbase/Server.html" title="interface in org.apache.hadoop.hbase">Server</a></code></dd>
@@ -3637,7 +3637,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/master/MasterServices
 <ul class="blockList">
 <li class="blockList">
 <h4>getAssignmentManager</h4>
-<pre>public&nbsp;<a href="../../../../../org/apache/hadoop/hbase/master/assignment/AssignmentManager.html" title="class in org.apache.hadoop.hbase.master.assignment">AssignmentManager</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/master/HMaster.html#line.2692">getAssignmentManager</a>()</pre>
+<pre>public&nbsp;<a href="../../../../../org/apache/hadoop/hbase/master/assignment/AssignmentManager.html" title="class in org.apache.hadoop.hbase.master.assignment">AssignmentManager</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/master/HMaster.html#line.2703">getAssignmentManager</a>()</pre>
 <dl>
 <dt><span class="overrideSpecifyLabel">Specified by:</span></dt>
 <dd><code><a href="../../../../../org/apache/hadoop/hbase/master/MasterServices.html#getAssignmentManager--">getAssignmentManager</a></code>&nbsp;in interface&nbsp;<code><a href="../../../../../org/apache/hadoop/hbase/master/MasterServices.html" title="interface in org.apache.hadoop.hbase.master">MasterServices</a></code></dd>
@@ -3652,7 +3652,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/master/MasterServices
 <ul class="blockList">
 <li class="blockList">
 <h4>getCatalogJanitor</h4>
-<pre>public&nbsp;<a href="../../../../../org/apache/hadoop/hbase/master/CatalogJanitor.html" title="class in org.apache.hadoop.hbase.master">CatalogJanitor</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/master/HMaster.html#line.2697">getCatalogJanitor</a>()</pre>
+<pre>public&nbsp;<a href="../../../../../org/apache/hadoop/hbase/master/CatalogJanitor.html" title="class in org.apache.hadoop.hbase.master">CatalogJanitor</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/master/HMaster.html#line.2708">getCatalogJanitor</a>()</pre>
 <dl>
 <dt><span class="overrideSpecifyLabel">Specified by:</span></dt>
 <dd><code><a href="../../../../../org/apache/hadoop/hbase/master/MasterServices.html#getCatalogJanitor--">getCatalogJanitor</a></code>&nbsp;in interface&nbsp;<code><a href="../../../../../org/apache/hadoop/hbase/master/MasterServices.html" title="interface in org.apache.hadoop.hbase.master">MasterServices</a></code></dd>
@@ -3667,7 +3667,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/master/MasterServices
 <ul class="blockList">
 <li class="blockList">
 <h4>getRegionServerFatalLogBuffer</h4>
-<pre>public&nbsp;<a href="../../../../../org/apache/hadoop/hbase/monitoring/MemoryBoundedLogMessageBuffer.html" title="class in org.apache.hadoop.hbase.monitoring">MemoryBoundedLogMessageBuffer</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/master/HMaster.html#line.2701">getRegionServerFatalLogBuffer</a>()</pre>
+<pre>public&nbsp;<a href="../../../../../org/apache/hadoop/hbase/monitoring/MemoryBoundedLogMessageBuffer.html" title="class in org.apache.hadoop.hbase.monitoring">MemoryBoundedLogMessageBuffer</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/master/HMaster.html#line.2712">getRegionServerFatalLogBuffer</a>()</pre>
 </li>
 </ul>
 <a name="shutdown--">
@@ -3676,7 +3676,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/master/MasterServices
 <ul class="blockList">
 <li class="blockList">
 <h4>shutdown</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/master/HMaster.html#line.2709">shutdown</a>()
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/master/HMaster.html#line.2720">shutdown</a>()
               throws <a href="https://docs.oracle.com/javase/8/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</a></pre>
 <div class="block">Shutdown the cluster.
  Master runs a coordinated stop of all RegionServers and then itself.</div>
@@ -3692,7 +3692,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/master/MasterServices
 <ul class="blockList">
 <li class="blockList">
 <h4>stopMaster</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/master/HMaster.html#line.2741">stopMaster</a>()
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/master/HMaster.html#line.2752">stopMaster</a>()
                 throws <a href="https://docs.oracle.com/javase/8/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</a></pre>
 <dl>
 <dt><span class="throwsLabel">Throws:</span></dt>
@@ -3706,7 +3706,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/master/MasterServices
 <ul class="blockList">
 <li class="blockList">
 <h4>stop</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/master/HMaster.html#line.2749">stop</a>(<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;msg)</pre>
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/master/HMaster.html#line.2760">stop</a>(<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;msg)</pre>
 <div class="block"><span class="descfrmTypeLabel">Description copied from interface:&nbsp;<code><a href="../../../../../org/apache/hadoop/hbase/Stoppable.html#stop-java.lang.String-">Stoppable</a></code></span></div>
 <div class="block">Stop this service.
  Implementers should favor logging errors over throwing RuntimeExceptions.</div>
@@ -3726,7 +3726,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/master/MasterServices
 <ul class="blockList">
 <li class="blockList">
 <h4>checkServiceStarted</h4>
-<pre>void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/master/HMaster.html#line.2758">checkServiceStarted</a>()
+<pre>void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/master/HMaster.html#line.2769">checkServiceStarted</a>()
                   throws <a href="../../../../../org/apache/hadoop/hbase/ipc/ServerNotRunningYetException.html" title="class in org.apache.hadoop.hbase.ipc">ServerNotRunningYetException</a></pre>
 <dl>
 <dt><span class="throwsLabel">Throws:</span></dt>
@@ -3740,7 +3740,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/master/MasterServices
 <ul class="blockList">
 <li class="blockList">
 <h4>checkInitialized</h4>
-<pre>void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/master/HMaster.html#line.2770">checkInitialized</a>()
+<pre>void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/master/HMaster.html#line.2781">checkInitialized</a>()
                throws <a href="../../../../../org/apache/hadoop/hbase/PleaseHoldException.html" title="class in org.apache.hadoop.hbase">PleaseHoldException</a>,
                       <a href="../../../../../org/apache/hadoop/hbase/ipc/ServerNotRunningYetException.html" title="class in org.apache.hadoop.hbase.ipc">ServerNotRunningYetException</a>,
                       <a href="../../../../../org/apache/hadoop/hbase/MasterNotRunningException.html" title="class in org.apache.hadoop.hbase">MasterNotRunningException</a>,
@@ -3760,7 +3760,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/master/MasterServices
 <ul class="blockList">
 <li class="blockList">
 <h4>isActiveMaster</h4>
-<pre>public&nbsp;boolean&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/master/HMaster.html#line.2790">isActiveMaster</a>()</pre>
+<pre>public&nbsp;boolean&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/master/HMaster.html#line.2801">isActiveMaster</a>()</pre>
 <div class="block">Report whether this master is currently the active master or not.
  If not active master, we are parked on ZK waiting to become active.
 
@@ -3779,7 +3779,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/master/MasterServices
 <ul class="blockList">
 <li class="blockList">
 <h4>isInitialized</h4>
-<pre>public&nbsp;boolean&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/master/HMaster.html#line.2804">isInitialized</a>()</pre>
+<pre>public&nbsp;boolean&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/master/HMaster.html#line.2815">isInitialized</a>()</pre>
 <div class="block">Report whether this master has completed with its initialization and is
  ready.  If ready, the master is also the active master.  A standby master
  is never ready.
@@ -3799,7 +3799,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/master/MasterServices
 <ul class="blockList">
 <li class="blockList">
 <h4>isInMaintenanceMode</h4>
-<pre>public&nbsp;boolean&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/master/HMaster.html#line.2814">isInMaintenanceMode</a>()</pre>
+<pre>public&nbsp;boolean&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/master/HMaster.html#line.2825">isInMaintenanceMode</a>()</pre>
 <div class="block">Report whether this master is in maintenance mode.</div>
 <dl>
 <dt><span class="overrideSpecifyLabel">Specified by:</span></dt>
@@ -3815,7 +3815,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/master/MasterServices
 <ul class="blockList">
 <li class="blockList">
 <h4>setInitialized</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/master/HMaster.html#line.2819">setInitialized</a>(boolean&nbsp;isInitialized)</pre>
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/master/HMaster.html#line.2830">setInitialized</a>(boolean&nbsp;isInitialized)</pre>
 </li>
 </ul>
 <a name="getInitializedEvent--">
@@ -3824,7 +3824,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/master/MasterServices
 <ul class="blockList">
 <li class="blockList">
 <h4>getInitializedEvent</h4>
-<pre>public&nbsp;<a href="../../../../../org/apache/hadoop/hbase/procedure2/ProcedureEvent.html" title="class in org.apache.hadoop.hbase.procedure2">ProcedureEvent</a>&lt;?&gt;&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/master/HMaster.html#line.2824">getInitializedEvent</a>()</pre>
+<pre>public&nbsp;<a href="../../../../../org/apache/hadoop/hbase/procedure2/ProcedureEvent.html" title="class in org.apache.hadoop.hbase.procedure2">ProcedureEvent</a>&lt;?&gt;&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/master/HMaster.html#line.2835">getInitializedEvent</a>()</pre>
 <dl>
 <dt><span class="overrideSpecifyLabel">Specified by:</span></dt>
 <dd><code><a href="../../../../../org/apache/hadoop/hbase/master/MasterServices.html#getInitializedEvent--">getInitializedEvent</a></code>&nbsp;in interface&nbsp;<code><a href="../../../../../org/apache/hadoop/hbase/master/MasterServices.html" title="interface in org.apache.hadoop.hbase.master">MasterServices</a></code></dd>
@@ -3839,7 +3839,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/master/MasterServices
 <ul class="blockList">
 <li class="blockList">
 <h4>isServerCrashProcessingEnabled</h4>
-<pre>public&nbsp;boolean&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/master/HMaster.html#line.2834">isServerCrashProcessingEnabled</a>()</pre>
+<pre>public&nbsp;boolean&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/master/HMaster.html#line.2845">isServerCrashProcessingEnabled</a>()</pre>
 <div class="block">ServerCrashProcessingEnabled is set false before completing assignMeta to prevent processing
  of crashed servers.<

<TRUNCATED>

[13/29] hbase-site git commit: Published site at 477f9fdb32873387231c5fbbff130ba8bf7b5d68.

Posted by gi...@apache.org.
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/621479e1/devapidocs/src-html/org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.Cluster.AssignRegionAction.html
----------------------------------------------------------------------
diff --git a/devapidocs/src-html/org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.Cluster.AssignRegionAction.html b/devapidocs/src-html/org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.Cluster.AssignRegionAction.html
index 7f42212..d4bf03c 100644
--- a/devapidocs/src-html/org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.Cluster.AssignRegionAction.html
+++ b/devapidocs/src-html/org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.Cluster.AssignRegionAction.html
@@ -1159,434 +1159,442 @@
 <span class="sourceLineNo">1151</span>    }<a name="line.1151"></a>
 <span class="sourceLineNo">1152</span>  }<a name="line.1152"></a>
 <span class="sourceLineNo">1153</span><a name="line.1153"></a>
-<span class="sourceLineNo">1154</span>  public void setRackManager(RackManager rackManager) {<a name="line.1154"></a>
-<span class="sourceLineNo">1155</span>    this.rackManager = rackManager;<a name="line.1155"></a>
-<span class="sourceLineNo">1156</span>  }<a name="line.1156"></a>
-<span class="sourceLineNo">1157</span><a name="line.1157"></a>
-<span class="sourceLineNo">1158</span>  protected boolean needsBalance(Cluster c) {<a name="line.1158"></a>
-<span class="sourceLineNo">1159</span>    ClusterLoadState cs = new ClusterLoadState(c.clusterState);<a name="line.1159"></a>
-<span class="sourceLineNo">1160</span>    if (cs.getNumServers() &lt; MIN_SERVER_BALANCE) {<a name="line.1160"></a>
-<span class="sourceLineNo">1161</span>      if (LOG.isDebugEnabled()) {<a name="line.1161"></a>
-<span class="sourceLineNo">1162</span>        LOG.debug("Not running balancer because only " + cs.getNumServers()<a name="line.1162"></a>
-<span class="sourceLineNo">1163</span>            + " active regionserver(s)");<a name="line.1163"></a>
-<span class="sourceLineNo">1164</span>      }<a name="line.1164"></a>
-<span class="sourceLineNo">1165</span>      return false;<a name="line.1165"></a>
-<span class="sourceLineNo">1166</span>    }<a name="line.1166"></a>
-<span class="sourceLineNo">1167</span>    if(areSomeRegionReplicasColocated(c)) return true;<a name="line.1167"></a>
-<span class="sourceLineNo">1168</span>    // Check if we even need to do any load balancing<a name="line.1168"></a>
-<span class="sourceLineNo">1169</span>    // HBASE-3681 check sloppiness first<a name="line.1169"></a>
-<span class="sourceLineNo">1170</span>    float average = cs.getLoadAverage(); // for logging<a name="line.1170"></a>
-<span class="sourceLineNo">1171</span>    int floor = (int) Math.floor(average * (1 - slop));<a name="line.1171"></a>
-<span class="sourceLineNo">1172</span>    int ceiling = (int) Math.ceil(average * (1 + slop));<a name="line.1172"></a>
-<span class="sourceLineNo">1173</span>    if (!(cs.getMaxLoad() &gt; ceiling || cs.getMinLoad() &lt; floor)) {<a name="line.1173"></a>
-<span class="sourceLineNo">1174</span>      NavigableMap&lt;ServerAndLoad, List&lt;RegionInfo&gt;&gt; serversByLoad = cs.getServersByLoad();<a name="line.1174"></a>
-<span class="sourceLineNo">1175</span>      if (LOG.isTraceEnabled()) {<a name="line.1175"></a>
-<span class="sourceLineNo">1176</span>        // If nothing to balance, then don't say anything unless trace-level logging.<a name="line.1176"></a>
-<span class="sourceLineNo">1177</span>        LOG.trace("Skipping load balancing because balanced cluster; " +<a name="line.1177"></a>
-<span class="sourceLineNo">1178</span>          "servers=" + cs.getNumServers() +<a name="line.1178"></a>
-<span class="sourceLineNo">1179</span>          " regions=" + cs.getNumRegions() + " average=" + average +<a name="line.1179"></a>
-<span class="sourceLineNo">1180</span>          " mostloaded=" + serversByLoad.lastKey().getLoad() +<a name="line.1180"></a>
-<span class="sourceLineNo">1181</span>          " leastloaded=" + serversByLoad.firstKey().getLoad());<a name="line.1181"></a>
-<span class="sourceLineNo">1182</span>      }<a name="line.1182"></a>
-<span class="sourceLineNo">1183</span>      return false;<a name="line.1183"></a>
-<span class="sourceLineNo">1184</span>    }<a name="line.1184"></a>
-<span class="sourceLineNo">1185</span>    return true;<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>   * Subclasses should implement this to return true if the cluster has nodes that hosts<a name="line.1189"></a>
-<span class="sourceLineNo">1190</span>   * multiple replicas for the same region, or, if there are multiple racks and the same<a name="line.1190"></a>
-<span class="sourceLineNo">1191</span>   * rack hosts replicas of the same region<a name="line.1191"></a>
-<span class="sourceLineNo">1192</span>   * @param c Cluster information<a name="line.1192"></a>
-<span class="sourceLineNo">1193</span>   * @return whether region replicas are currently co-located<a name="line.1193"></a>
-<span class="sourceLineNo">1194</span>   */<a name="line.1194"></a>
-<span class="sourceLineNo">1195</span>  protected boolean areSomeRegionReplicasColocated(Cluster c) {<a name="line.1195"></a>
-<span class="sourceLineNo">1196</span>    return false;<a name="line.1196"></a>
-<span class="sourceLineNo">1197</span>  }<a name="line.1197"></a>
-<span class="sourceLineNo">1198</span><a name="line.1198"></a>
-<span class="sourceLineNo">1199</span>  /**<a name="line.1199"></a>
-<span class="sourceLineNo">1200</span>   * Generates a bulk assignment plan to be used on cluster startup using a<a name="line.1200"></a>
-<span class="sourceLineNo">1201</span>   * simple round-robin assignment.<a name="line.1201"></a>
-<span class="sourceLineNo">1202</span>   * &lt;p&gt;<a name="line.1202"></a>
-<span class="sourceLineNo">1203</span>   * Takes a list of all the regions and all the servers in the cluster and<a name="line.1203"></a>
-<span class="sourceLineNo">1204</span>   * returns a map of each server to the regions that it should be assigned.<a name="line.1204"></a>
-<span class="sourceLineNo">1205</span>   * &lt;p&gt;<a name="line.1205"></a>
-<span class="sourceLineNo">1206</span>   * Currently implemented as a round-robin assignment. Same invariant as load<a name="line.1206"></a>
-<span class="sourceLineNo">1207</span>   * balancing, all servers holding floor(avg) or ceiling(avg).<a name="line.1207"></a>
-<span class="sourceLineNo">1208</span>   *<a name="line.1208"></a>
-<span class="sourceLineNo">1209</span>   * TODO: Use block locations from HDFS to place regions with their blocks<a name="line.1209"></a>
-<span class="sourceLineNo">1210</span>   *<a name="line.1210"></a>
-<span class="sourceLineNo">1211</span>   * @param regions all regions<a name="line.1211"></a>
-<span class="sourceLineNo">1212</span>   * @param servers all servers<a name="line.1212"></a>
-<span class="sourceLineNo">1213</span>   * @return map of server to the regions it should take, or null if no<a name="line.1213"></a>
-<span class="sourceLineNo">1214</span>   *         assignment is possible (ie. no regions or no servers)<a name="line.1214"></a>
-<span class="sourceLineNo">1215</span>   */<a name="line.1215"></a>
-<span class="sourceLineNo">1216</span>  @Override<a name="line.1216"></a>
-<span class="sourceLineNo">1217</span>  public Map&lt;ServerName, List&lt;RegionInfo&gt;&gt; roundRobinAssignment(List&lt;RegionInfo&gt; regions,<a name="line.1217"></a>
-<span class="sourceLineNo">1218</span>      List&lt;ServerName&gt; servers) throws HBaseIOException {<a name="line.1218"></a>
-<span class="sourceLineNo">1219</span>    metricsBalancer.incrMiscInvocations();<a name="line.1219"></a>
-<span class="sourceLineNo">1220</span>    Map&lt;ServerName, List&lt;RegionInfo&gt;&gt; assignments = assignMasterSystemRegions(regions, servers);<a name="line.1220"></a>
-<span class="sourceLineNo">1221</span>    if (assignments != null &amp;&amp; !assignments.isEmpty()) {<a name="line.1221"></a>
-<span class="sourceLineNo">1222</span>      servers = new ArrayList&lt;&gt;(servers);<a name="line.1222"></a>
-<span class="sourceLineNo">1223</span>      // Guarantee not to put other regions on master<a name="line.1223"></a>
-<span class="sourceLineNo">1224</span>      servers.remove(masterServerName);<a name="line.1224"></a>
-<span class="sourceLineNo">1225</span>      List&lt;RegionInfo&gt; masterRegions = assignments.get(masterServerName);<a name="line.1225"></a>
-<span class="sourceLineNo">1226</span>      if (!masterRegions.isEmpty()) {<a name="line.1226"></a>
-<span class="sourceLineNo">1227</span>        regions = new ArrayList&lt;&gt;(regions);<a name="line.1227"></a>
-<span class="sourceLineNo">1228</span>        regions.removeAll(masterRegions);<a name="line.1228"></a>
-<span class="sourceLineNo">1229</span>      }<a name="line.1229"></a>
-<span class="sourceLineNo">1230</span>    }<a name="line.1230"></a>
-<span class="sourceLineNo">1231</span>    if (regions == null || regions.isEmpty()) {<a name="line.1231"></a>
-<span class="sourceLineNo">1232</span>      return assignments;<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>    int numServers = servers == null ? 0 : servers.size();<a name="line.1235"></a>
-<span class="sourceLineNo">1236</span>    if (numServers == 0) {<a name="line.1236"></a>
-<span class="sourceLineNo">1237</span>      LOG.warn("Wanted to do round robin assignment but no servers to assign to");<a name="line.1237"></a>
-<span class="sourceLineNo">1238</span>      return null;<a name="line.1238"></a>
-<span class="sourceLineNo">1239</span>    }<a name="line.1239"></a>
-<span class="sourceLineNo">1240</span><a name="line.1240"></a>
-<span class="sourceLineNo">1241</span>    // TODO: instead of retainAssignment() and roundRobinAssignment(), we should just run the<a name="line.1241"></a>
-<span class="sourceLineNo">1242</span>    // normal LB.balancerCluster() with unassignedRegions. We only need to have a candidate<a name="line.1242"></a>
-<span class="sourceLineNo">1243</span>    // generator for AssignRegionAction. The LB will ensure the regions are mostly local<a name="line.1243"></a>
-<span class="sourceLineNo">1244</span>    // and balanced. This should also run fast with fewer number of iterations.<a name="line.1244"></a>
-<span class="sourceLineNo">1245</span><a name="line.1245"></a>
-<span class="sourceLineNo">1246</span>    if (numServers == 1) { // Only one server, nothing fancy we can do here<a name="line.1246"></a>
-<span class="sourceLineNo">1247</span>      ServerName server = servers.get(0);<a name="line.1247"></a>
-<span class="sourceLineNo">1248</span>      assignments.put(server, new ArrayList&lt;&gt;(regions));<a name="line.1248"></a>
-<span class="sourceLineNo">1249</span>      return assignments;<a name="line.1249"></a>
-<span class="sourceLineNo">1250</span>    }<a name="line.1250"></a>
-<span class="sourceLineNo">1251</span><a name="line.1251"></a>
-<span class="sourceLineNo">1252</span>    Cluster cluster = createCluster(servers, regions, false);<a name="line.1252"></a>
-<span class="sourceLineNo">1253</span>    List&lt;RegionInfo&gt; unassignedRegions = new ArrayList&lt;&gt;();<a name="line.1253"></a>
-<span class="sourceLineNo">1254</span><a name="line.1254"></a>
-<span class="sourceLineNo">1255</span>    roundRobinAssignment(cluster, regions, unassignedRegions,<a name="line.1255"></a>
-<span class="sourceLineNo">1256</span>      servers, assignments);<a name="line.1256"></a>
-<span class="sourceLineNo">1257</span><a name="line.1257"></a>
-<span class="sourceLineNo">1258</span>    List&lt;RegionInfo&gt; lastFewRegions = new ArrayList&lt;&gt;();<a name="line.1258"></a>
-<span class="sourceLineNo">1259</span>    // assign the remaining by going through the list and try to assign to servers one-by-one<a name="line.1259"></a>
-<span class="sourceLineNo">1260</span>    int serverIdx = RANDOM.nextInt(numServers);<a name="line.1260"></a>
-<span class="sourceLineNo">1261</span>    for (RegionInfo region : unassignedRegions) {<a name="line.1261"></a>
-<span class="sourceLineNo">1262</span>      boolean assigned = false;<a name="line.1262"></a>
-<span class="sourceLineNo">1263</span>      for (int j = 0; j &lt; numServers; j++) { // try all servers one by one<a name="line.1263"></a>
-<span class="sourceLineNo">1264</span>        ServerName serverName = servers.get((j + serverIdx) % numServers);<a name="line.1264"></a>
-<span class="sourceLineNo">1265</span>        if (!cluster.wouldLowerAvailability(region, serverName)) {<a name="line.1265"></a>
-<span class="sourceLineNo">1266</span>          List&lt;RegionInfo&gt; serverRegions =<a name="line.1266"></a>
-<span class="sourceLineNo">1267</span>              assignments.computeIfAbsent(serverName, k -&gt; new ArrayList&lt;&gt;());<a name="line.1267"></a>
-<span class="sourceLineNo">1268</span>          serverRegions.add(region);<a name="line.1268"></a>
-<span class="sourceLineNo">1269</span>          cluster.doAssignRegion(region, serverName);<a name="line.1269"></a>
-<span class="sourceLineNo">1270</span>          serverIdx = (j + serverIdx + 1) % numServers; //remain from next server<a name="line.1270"></a>
-<span class="sourceLineNo">1271</span>          assigned = true;<a name="line.1271"></a>
-<span class="sourceLineNo">1272</span>          break;<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>      if (!assigned) {<a name="line.1275"></a>
-<span class="sourceLineNo">1276</span>        lastFewRegions.add(region);<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>    // just sprinkle the rest of the regions on random regionservers. The balanceCluster will<a name="line.1279"></a>
-<span class="sourceLineNo">1280</span>    // make it optimal later. we can end up with this if numReplicas &gt; numServers.<a name="line.1280"></a>
-<span class="sourceLineNo">1281</span>    for (RegionInfo region : lastFewRegions) {<a name="line.1281"></a>
-<span class="sourceLineNo">1282</span>      int i = RANDOM.nextInt(numServers);<a name="line.1282"></a>
-<span class="sourceLineNo">1283</span>      ServerName server = servers.get(i);<a name="line.1283"></a>
-<span class="sourceLineNo">1284</span>      List&lt;RegionInfo&gt; serverRegions = assignments.computeIfAbsent(server, k -&gt; new ArrayList&lt;&gt;());<a name="line.1284"></a>
-<span class="sourceLineNo">1285</span>      serverRegions.add(region);<a name="line.1285"></a>
-<span class="sourceLineNo">1286</span>      cluster.doAssignRegion(region, server);<a name="line.1286"></a>
-<span class="sourceLineNo">1287</span>    }<a name="line.1287"></a>
-<span class="sourceLineNo">1288</span>    return assignments;<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>  protected Cluster createCluster(List&lt;ServerName&gt; servers,<a name="line.1291"></a>
-<span class="sourceLineNo">1292</span>      Collection&lt;RegionInfo&gt; regions, boolean forceRefresh) {<a name="line.1292"></a>
-<span class="sourceLineNo">1293</span>    if (forceRefresh &amp;&amp; useRegionFinder) {<a name="line.1293"></a>
-<span class="sourceLineNo">1294</span>      regionFinder.refreshAndWait(regions);<a name="line.1294"></a>
-<span class="sourceLineNo">1295</span>    }<a name="line.1295"></a>
-<span class="sourceLineNo">1296</span>    // Get the snapshot of the current assignments for the regions in question, and then create<a name="line.1296"></a>
-<span class="sourceLineNo">1297</span>    // a cluster out of it. Note that we might have replicas already assigned to some servers<a name="line.1297"></a>
-<span class="sourceLineNo">1298</span>    // earlier. So we want to get the snapshot to see those assignments, but this will only contain<a name="line.1298"></a>
-<span class="sourceLineNo">1299</span>    // replicas of the regions that are passed (for performance).<a name="line.1299"></a>
-<span class="sourceLineNo">1300</span>    Map&lt;ServerName, List&lt;RegionInfo&gt;&gt; clusterState = getRegionAssignmentsByServer(regions);<a name="line.1300"></a>
-<span class="sourceLineNo">1301</span><a name="line.1301"></a>
-<span class="sourceLineNo">1302</span>    for (ServerName server : servers) {<a name="line.1302"></a>
-<span class="sourceLineNo">1303</span>      if (!clusterState.containsKey(server)) {<a name="line.1303"></a>
-<span class="sourceLineNo">1304</span>        clusterState.put(server, EMPTY_REGION_LIST);<a name="line.1304"></a>
-<span class="sourceLineNo">1305</span>      }<a name="line.1305"></a>
-<span class="sourceLineNo">1306</span>    }<a name="line.1306"></a>
-<span class="sourceLineNo">1307</span>    return new Cluster(regions, clusterState, null, this.regionFinder,<a name="line.1307"></a>
-<span class="sourceLineNo">1308</span>        rackManager);<a name="line.1308"></a>
-<span class="sourceLineNo">1309</span>  }<a name="line.1309"></a>
+<span class="sourceLineNo">1154</span>  @Override<a name="line.1154"></a>
+<span class="sourceLineNo">1155</span>  public void postMasterStartupInitialize() {<a name="line.1155"></a>
+<span class="sourceLineNo">1156</span>    if (services != null &amp;&amp; regionFinder != null) {<a name="line.1156"></a>
+<span class="sourceLineNo">1157</span>      try {<a name="line.1157"></a>
+<span class="sourceLineNo">1158</span>        Set&lt;RegionInfo&gt; regions =<a name="line.1158"></a>
+<span class="sourceLineNo">1159</span>            services.getAssignmentManager().getRegionStates().getRegionAssignments().keySet();<a name="line.1159"></a>
+<span class="sourceLineNo">1160</span>        regionFinder.refreshAndWait(regions);<a name="line.1160"></a>
+<span class="sourceLineNo">1161</span>      } catch (Exception e) {<a name="line.1161"></a>
+<span class="sourceLineNo">1162</span>        LOG.warn("Refreshing region HDFS Block dist failed with exception, ignoring", e);<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>  }<a name="line.1165"></a>
+<span class="sourceLineNo">1166</span><a name="line.1166"></a>
+<span class="sourceLineNo">1167</span>  public void setRackManager(RackManager rackManager) {<a name="line.1167"></a>
+<span class="sourceLineNo">1168</span>    this.rackManager = rackManager;<a name="line.1168"></a>
+<span class="sourceLineNo">1169</span>  }<a name="line.1169"></a>
+<span class="sourceLineNo">1170</span><a name="line.1170"></a>
+<span class="sourceLineNo">1171</span>  protected boolean needsBalance(Cluster c) {<a name="line.1171"></a>
+<span class="sourceLineNo">1172</span>    ClusterLoadState cs = new ClusterLoadState(c.clusterState);<a name="line.1172"></a>
+<span class="sourceLineNo">1173</span>    if (cs.getNumServers() &lt; MIN_SERVER_BALANCE) {<a name="line.1173"></a>
+<span class="sourceLineNo">1174</span>      if (LOG.isDebugEnabled()) {<a name="line.1174"></a>
+<span class="sourceLineNo">1175</span>        LOG.debug("Not running balancer because only " + cs.getNumServers()<a name="line.1175"></a>
+<span class="sourceLineNo">1176</span>            + " active regionserver(s)");<a name="line.1176"></a>
+<span class="sourceLineNo">1177</span>      }<a name="line.1177"></a>
+<span class="sourceLineNo">1178</span>      return false;<a name="line.1178"></a>
+<span class="sourceLineNo">1179</span>    }<a name="line.1179"></a>
+<span class="sourceLineNo">1180</span>    if(areSomeRegionReplicasColocated(c)) return true;<a name="line.1180"></a>
+<span class="sourceLineNo">1181</span>    // Check if we even need to do any load balancing<a name="line.1181"></a>
+<span class="sourceLineNo">1182</span>    // HBASE-3681 check sloppiness first<a name="line.1182"></a>
+<span class="sourceLineNo">1183</span>    float average = cs.getLoadAverage(); // for logging<a name="line.1183"></a>
+<span class="sourceLineNo">1184</span>    int floor = (int) Math.floor(average * (1 - slop));<a name="line.1184"></a>
+<span class="sourceLineNo">1185</span>    int ceiling = (int) Math.ceil(average * (1 + slop));<a name="line.1185"></a>
+<span class="sourceLineNo">1186</span>    if (!(cs.getMaxLoad() &gt; ceiling || cs.getMinLoad() &lt; floor)) {<a name="line.1186"></a>
+<span class="sourceLineNo">1187</span>      NavigableMap&lt;ServerAndLoad, List&lt;RegionInfo&gt;&gt; serversByLoad = cs.getServersByLoad();<a name="line.1187"></a>
+<span class="sourceLineNo">1188</span>      if (LOG.isTraceEnabled()) {<a name="line.1188"></a>
+<span class="sourceLineNo">1189</span>        // If nothing to balance, then don't say anything unless trace-level logging.<a name="line.1189"></a>
+<span class="sourceLineNo">1190</span>        LOG.trace("Skipping load balancing because balanced cluster; " +<a name="line.1190"></a>
+<span class="sourceLineNo">1191</span>          "servers=" + cs.getNumServers() +<a name="line.1191"></a>
+<span class="sourceLineNo">1192</span>          " regions=" + cs.getNumRegions() + " average=" + average +<a name="line.1192"></a>
+<span class="sourceLineNo">1193</span>          " mostloaded=" + serversByLoad.lastKey().getLoad() +<a name="line.1193"></a>
+<span class="sourceLineNo">1194</span>          " leastloaded=" + serversByLoad.firstKey().getLoad());<a name="line.1194"></a>
+<span class="sourceLineNo">1195</span>      }<a name="line.1195"></a>
+<span class="sourceLineNo">1196</span>      return false;<a name="line.1196"></a>
+<span class="sourceLineNo">1197</span>    }<a name="line.1197"></a>
+<span class="sourceLineNo">1198</span>    return true;<a name="line.1198"></a>
+<span class="sourceLineNo">1199</span>  }<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>   * Subclasses should implement this to return true if the cluster has nodes that hosts<a name="line.1202"></a>
+<span class="sourceLineNo">1203</span>   * multiple replicas for the same region, or, if there are multiple racks and the same<a name="line.1203"></a>
+<span class="sourceLineNo">1204</span>   * rack hosts replicas of the same region<a name="line.1204"></a>
+<span class="sourceLineNo">1205</span>   * @param c Cluster information<a name="line.1205"></a>
+<span class="sourceLineNo">1206</span>   * @return whether region replicas are currently co-located<a name="line.1206"></a>
+<span class="sourceLineNo">1207</span>   */<a name="line.1207"></a>
+<span class="sourceLineNo">1208</span>  protected boolean areSomeRegionReplicasColocated(Cluster c) {<a name="line.1208"></a>
+<span class="sourceLineNo">1209</span>    return false;<a name="line.1209"></a>
+<span class="sourceLineNo">1210</span>  }<a name="line.1210"></a>
+<span class="sourceLineNo">1211</span><a name="line.1211"></a>
+<span class="sourceLineNo">1212</span>  /**<a name="line.1212"></a>
+<span class="sourceLineNo">1213</span>   * Generates a bulk assignment plan to be used on cluster startup using a<a name="line.1213"></a>
+<span class="sourceLineNo">1214</span>   * simple round-robin assignment.<a name="line.1214"></a>
+<span class="sourceLineNo">1215</span>   * &lt;p&gt;<a name="line.1215"></a>
+<span class="sourceLineNo">1216</span>   * Takes a list of all the regions and all the servers in the cluster and<a name="line.1216"></a>
+<span class="sourceLineNo">1217</span>   * returns a map of each server to the regions that it should be assigned.<a name="line.1217"></a>
+<span class="sourceLineNo">1218</span>   * &lt;p&gt;<a name="line.1218"></a>
+<span class="sourceLineNo">1219</span>   * Currently implemented as a round-robin assignment. Same invariant as load<a name="line.1219"></a>
+<span class="sourceLineNo">1220</span>   * balancing, all servers holding floor(avg) or ceiling(avg).<a name="line.1220"></a>
+<span class="sourceLineNo">1221</span>   *<a name="line.1221"></a>
+<span class="sourceLineNo">1222</span>   * TODO: Use block locations from HDFS to place regions with their blocks<a name="line.1222"></a>
+<span class="sourceLineNo">1223</span>   *<a name="line.1223"></a>
+<span class="sourceLineNo">1224</span>   * @param regions all regions<a name="line.1224"></a>
+<span class="sourceLineNo">1225</span>   * @param servers all servers<a name="line.1225"></a>
+<span class="sourceLineNo">1226</span>   * @return map of server to the regions it should take, or null if no<a name="line.1226"></a>
+<span class="sourceLineNo">1227</span>   *         assignment is possible (ie. no regions or no servers)<a name="line.1227"></a>
+<span class="sourceLineNo">1228</span>   */<a name="line.1228"></a>
+<span class="sourceLineNo">1229</span>  @Override<a name="line.1229"></a>
+<span class="sourceLineNo">1230</span>  public Map&lt;ServerName, List&lt;RegionInfo&gt;&gt; roundRobinAssignment(List&lt;RegionInfo&gt; regions,<a name="line.1230"></a>
+<span class="sourceLineNo">1231</span>      List&lt;ServerName&gt; servers) throws HBaseIOException {<a name="line.1231"></a>
+<span class="sourceLineNo">1232</span>    metricsBalancer.incrMiscInvocations();<a name="line.1232"></a>
+<span class="sourceLineNo">1233</span>    Map&lt;ServerName, List&lt;RegionInfo&gt;&gt; assignments = assignMasterSystemRegions(regions, servers);<a name="line.1233"></a>
+<span class="sourceLineNo">1234</span>    if (assignments != null &amp;&amp; !assignments.isEmpty()) {<a name="line.1234"></a>
+<span class="sourceLineNo">1235</span>      servers = new ArrayList&lt;&gt;(servers);<a name="line.1235"></a>
+<span class="sourceLineNo">1236</span>      // Guarantee not to put other regions on master<a name="line.1236"></a>
+<span class="sourceLineNo">1237</span>      servers.remove(masterServerName);<a name="line.1237"></a>
+<span class="sourceLineNo">1238</span>      List&lt;RegionInfo&gt; masterRegions = assignments.get(masterServerName);<a name="line.1238"></a>
+<span class="sourceLineNo">1239</span>      if (!masterRegions.isEmpty()) {<a name="line.1239"></a>
+<span class="sourceLineNo">1240</span>        regions = new ArrayList&lt;&gt;(regions);<a name="line.1240"></a>
+<span class="sourceLineNo">1241</span>        regions.removeAll(masterRegions);<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>    if (regions == null || regions.isEmpty()) {<a name="line.1244"></a>
+<span class="sourceLineNo">1245</span>      return assignments;<a name="line.1245"></a>
+<span class="sourceLineNo">1246</span>    }<a name="line.1246"></a>
+<span class="sourceLineNo">1247</span><a name="line.1247"></a>
+<span class="sourceLineNo">1248</span>    int numServers = servers == null ? 0 : servers.size();<a name="line.1248"></a>
+<span class="sourceLineNo">1249</span>    if (numServers == 0) {<a name="line.1249"></a>
+<span class="sourceLineNo">1250</span>      LOG.warn("Wanted to do round robin assignment but no servers to assign to");<a name="line.1250"></a>
+<span class="sourceLineNo">1251</span>      return null;<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>    // TODO: instead of retainAssignment() and roundRobinAssignment(), we should just run the<a name="line.1254"></a>
+<span class="sourceLineNo">1255</span>    // normal LB.balancerCluster() with unassignedRegions. We only need to have a candidate<a name="line.1255"></a>
+<span class="sourceLineNo">1256</span>    // generator for AssignRegionAction. The LB will ensure the regions are mostly local<a name="line.1256"></a>
+<span class="sourceLineNo">1257</span>    // and balanced. This should also run fast with fewer number of iterations.<a name="line.1257"></a>
+<span class="sourceLineNo">1258</span><a name="line.1258"></a>
+<span class="sourceLineNo">1259</span>    if (numServers == 1) { // Only one server, nothing fancy we can do here<a name="line.1259"></a>
+<span class="sourceLineNo">1260</span>      ServerName server = servers.get(0);<a name="line.1260"></a>
+<span class="sourceLineNo">1261</span>      assignments.put(server, new ArrayList&lt;&gt;(regions));<a name="line.1261"></a>
+<span class="sourceLineNo">1262</span>      return assignments;<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>    Cluster cluster = createCluster(servers, regions);<a name="line.1265"></a>
+<span class="sourceLineNo">1266</span>    List&lt;RegionInfo&gt; unassignedRegions = new ArrayList&lt;&gt;();<a name="line.1266"></a>
+<span class="sourceLineNo">1267</span><a name="line.1267"></a>
+<span class="sourceLineNo">1268</span>    roundRobinAssignment(cluster, regions, unassignedRegions,<a name="line.1268"></a>
+<span class="sourceLineNo">1269</span>      servers, assignments);<a name="line.1269"></a>
+<span class="sourceLineNo">1270</span><a name="line.1270"></a>
+<span class="sourceLineNo">1271</span>    List&lt;RegionInfo&gt; lastFewRegions = new ArrayList&lt;&gt;();<a name="line.1271"></a>
+<span class="sourceLineNo">1272</span>    // assign the remaining by going through the list and try to assign to servers one-by-one<a name="line.1272"></a>
+<span class="sourceLineNo">1273</span>    int serverIdx = RANDOM.nextInt(numServers);<a name="line.1273"></a>
+<span class="sourceLineNo">1274</span>    for (RegionInfo region : unassignedRegions) {<a name="line.1274"></a>
+<span class="sourceLineNo">1275</span>      boolean assigned = false;<a name="line.1275"></a>
+<span class="sourceLineNo">1276</span>      for (int j = 0; j &lt; numServers; j++) { // try all servers one by one<a name="line.1276"></a>
+<span class="sourceLineNo">1277</span>        ServerName serverName = servers.get((j + serverIdx) % numServers);<a name="line.1277"></a>
+<span class="sourceLineNo">1278</span>        if (!cluster.wouldLowerAvailability(region, serverName)) {<a name="line.1278"></a>
+<span class="sourceLineNo">1279</span>          List&lt;RegionInfo&gt; serverRegions =<a name="line.1279"></a>
+<span class="sourceLineNo">1280</span>              assignments.computeIfAbsent(serverName, k -&gt; new ArrayList&lt;&gt;());<a name="line.1280"></a>
+<span class="sourceLineNo">1281</span>          serverRegions.add(region);<a name="line.1281"></a>
+<span class="sourceLineNo">1282</span>          cluster.doAssignRegion(region, serverName);<a name="line.1282"></a>
+<span class="sourceLineNo">1283</span>          serverIdx = (j + serverIdx + 1) % numServers; //remain from next server<a name="line.1283"></a>
+<span class="sourceLineNo">1284</span>          assigned = true;<a name="line.1284"></a>
+<span class="sourceLineNo">1285</span>          break;<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>      if (!assigned) {<a name="line.1288"></a>
+<span class="sourceLineNo">1289</span>        lastFewRegions.add(region);<a name="line.1289"></a>
+<span class="sourceLineNo">1290</span>      }<a name="line.1290"></a>
+<span class="sourceLineNo">1291</span>    }<a name="line.1291"></a>
+<span class="sourceLineNo">1292</span>    // just sprinkle the rest of the regions on random regionservers. The balanceCluster will<a name="line.1292"></a>
+<span class="sourceLineNo">1293</span>    // make it optimal later. we can end up with this if numReplicas &gt; numServers.<a name="line.1293"></a>
+<span class="sourceLineNo">1294</span>    for (RegionInfo region : lastFewRegions) {<a name="line.1294"></a>
+<span class="sourceLineNo">1295</span>      int i = RANDOM.nextInt(numServers);<a name="line.1295"></a>
+<span class="sourceLineNo">1296</span>      ServerName server = servers.get(i);<a name="line.1296"></a>
+<span class="sourceLineNo">1297</span>      List&lt;RegionInfo&gt; serverRegions = assignments.computeIfAbsent(server, k -&gt; new ArrayList&lt;&gt;());<a name="line.1297"></a>
+<span class="sourceLineNo">1298</span>      serverRegions.add(region);<a name="line.1298"></a>
+<span class="sourceLineNo">1299</span>      cluster.doAssignRegion(region, server);<a name="line.1299"></a>
+<span class="sourceLineNo">1300</span>    }<a name="line.1300"></a>
+<span class="sourceLineNo">1301</span>    return assignments;<a name="line.1301"></a>
+<span class="sourceLineNo">1302</span>  }<a name="line.1302"></a>
+<span class="sourceLineNo">1303</span><a name="line.1303"></a>
+<span class="sourceLineNo">1304</span>  protected Cluster createCluster(List&lt;ServerName&gt; servers, Collection&lt;RegionInfo&gt; regions) {<a name="line.1304"></a>
+<span class="sourceLineNo">1305</span>    // Get the snapshot of the current assignments for the regions in question, and then create<a name="line.1305"></a>
+<span class="sourceLineNo">1306</span>    // a cluster out of it. Note that we might have replicas already assigned to some servers<a name="line.1306"></a>
+<span class="sourceLineNo">1307</span>    // earlier. So we want to get the snapshot to see those assignments, but this will only contain<a name="line.1307"></a>
+<span class="sourceLineNo">1308</span>    // replicas of the regions that are passed (for performance).<a name="line.1308"></a>
+<span class="sourceLineNo">1309</span>    Map&lt;ServerName, List&lt;RegionInfo&gt;&gt; clusterState = getRegionAssignmentsByServer(regions);<a name="line.1309"></a>
 <span class="sourceLineNo">1310</span><a name="line.1310"></a>
-<span class="sourceLineNo">1311</span>  private List&lt;ServerName&gt; findIdleServers(List&lt;ServerName&gt; servers) {<a name="line.1311"></a>
-<span class="sourceLineNo">1312</span>    return this.services.getServerManager()<a name="line.1312"></a>
-<span class="sourceLineNo">1313</span>            .getOnlineServersListWithPredicator(servers, IDLE_SERVER_PREDICATOR);<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>  /**<a name="line.1316"></a>
-<span class="sourceLineNo">1317</span>   * Used to assign a single region to a random server.<a name="line.1317"></a>
-<span class="sourceLineNo">1318</span>   */<a name="line.1318"></a>
-<span class="sourceLineNo">1319</span>  @Override<a name="line.1319"></a>
-<span class="sourceLineNo">1320</span>  public ServerName randomAssignment(RegionInfo regionInfo, List&lt;ServerName&gt; servers)<a name="line.1320"></a>
-<span class="sourceLineNo">1321</span>      throws HBaseIOException {<a name="line.1321"></a>
-<span class="sourceLineNo">1322</span>    metricsBalancer.incrMiscInvocations();<a name="line.1322"></a>
-<span class="sourceLineNo">1323</span>    if (servers != null &amp;&amp; servers.contains(masterServerName)) {<a name="line.1323"></a>
-<span class="sourceLineNo">1324</span>      if (shouldBeOnMaster(regionInfo)) {<a name="line.1324"></a>
-<span class="sourceLineNo">1325</span>        return masterServerName;<a name="line.1325"></a>
-<span class="sourceLineNo">1326</span>      }<a name="line.1326"></a>
-<span class="sourceLineNo">1327</span>      if (!LoadBalancer.isTablesOnMaster(getConf())) {<a name="line.1327"></a>
-<span class="sourceLineNo">1328</span>        // Guarantee we do not put any regions on master<a name="line.1328"></a>
-<span class="sourceLineNo">1329</span>        servers = new ArrayList&lt;&gt;(servers);<a name="line.1329"></a>
-<span class="sourceLineNo">1330</span>        servers.remove(masterServerName);<a name="line.1330"></a>
-<span class="sourceLineNo">1331</span>      }<a name="line.1331"></a>
-<span class="sourceLineNo">1332</span>    }<a name="line.1332"></a>
-<span class="sourceLineNo">1333</span><a name="line.1333"></a>
-<span class="sourceLineNo">1334</span>    int numServers = servers == null ? 0 : servers.size();<a name="line.1334"></a>
-<span class="sourceLineNo">1335</span>    if (numServers == 0) {<a name="line.1335"></a>
-<span class="sourceLineNo">1336</span>      LOG.warn("Wanted to retain assignment but no servers to assign to");<a name="line.1336"></a>
-<span class="sourceLineNo">1337</span>      return null;<a name="line.1337"></a>
-<span class="sourceLineNo">1338</span>    }<a name="line.1338"></a>
-<span class="sourceLineNo">1339</span>    if (numServers == 1) { // Only one server, nothing fancy we can do here<a name="line.1339"></a>
-<span class="sourceLineNo">1340</span>      return servers.get(0);<a name="line.1340"></a>
+<span class="sourceLineNo">1311</span>    for (ServerName server : servers) {<a name="line.1311"></a>
+<span class="sourceLineNo">1312</span>      if (!clusterState.containsKey(server)) {<a name="line.1312"></a>
+<span class="sourceLineNo">1313</span>        clusterState.put(server, EMPTY_REGION_LIST);<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>    return new Cluster(regions, clusterState, null, this.regionFinder,<a name="line.1316"></a>
+<span class="sourceLineNo">1317</span>        rackManager);<a name="line.1317"></a>
+<span class="sourceLineNo">1318</span>  }<a name="line.1318"></a>
+<span class="sourceLineNo">1319</span><a name="line.1319"></a>
+<span class="sourceLineNo">1320</span>  private List&lt;ServerName&gt; findIdleServers(List&lt;ServerName&gt; servers) {<a name="line.1320"></a>
+<span class="sourceLineNo">1321</span>    return this.services.getServerManager()<a name="line.1321"></a>
+<span class="sourceLineNo">1322</span>            .getOnlineServersListWithPredicator(servers, IDLE_SERVER_PREDICATOR);<a name="line.1322"></a>
+<span class="sourceLineNo">1323</span>  }<a name="line.1323"></a>
+<span class="sourceLineNo">1324</span><a name="line.1324"></a>
+<span class="sourceLineNo">1325</span>  /**<a name="line.1325"></a>
+<span class="sourceLineNo">1326</span>   * Used to assign a single region to a random server.<a name="line.1326"></a>
+<span class="sourceLineNo">1327</span>   */<a name="line.1327"></a>
+<span class="sourceLineNo">1328</span>  @Override<a name="line.1328"></a>
+<span class="sourceLineNo">1329</span>  public ServerName randomAssignment(RegionInfo regionInfo, List&lt;ServerName&gt; servers)<a name="line.1329"></a>
+<span class="sourceLineNo">1330</span>      throws HBaseIOException {<a name="line.1330"></a>
+<span class="sourceLineNo">1331</span>    metricsBalancer.incrMiscInvocations();<a name="line.1331"></a>
+<span class="sourceLineNo">1332</span>    if (servers != null &amp;&amp; servers.contains(masterServerName)) {<a name="line.1332"></a>
+<span class="sourceLineNo">1333</span>      if (shouldBeOnMaster(regionInfo)) {<a name="line.1333"></a>
+<span class="sourceLineNo">1334</span>        return masterServerName;<a name="line.1334"></a>
+<span class="sourceLineNo">1335</span>      }<a name="line.1335"></a>
+<span class="sourceLineNo">1336</span>      if (!LoadBalancer.isTablesOnMaster(getConf())) {<a name="line.1336"></a>
+<span class="sourceLineNo">1337</span>        // Guarantee we do not put any regions on master<a name="line.1337"></a>
+<span class="sourceLineNo">1338</span>        servers = new ArrayList&lt;&gt;(servers);<a name="line.1338"></a>
+<span class="sourceLineNo">1339</span>        servers.remove(masterServerName);<a name="line.1339"></a>
+<span class="sourceLineNo">1340</span>      }<a name="line.1340"></a>
 <span class="sourceLineNo">1341</span>    }<a name="line.1341"></a>
-<span class="sourceLineNo">1342</span>    List&lt;ServerName&gt; idleServers = findIdleServers(servers);<a name="line.1342"></a>
-<span class="sourceLineNo">1343</span>    if (idleServers.size() == 1) {<a name="line.1343"></a>
-<span class="sourceLineNo">1344</span>      return idleServers.get(0);<a name="line.1344"></a>
-<span class="sourceLineNo">1345</span>    }<a name="line.1345"></a>
-<span class="sourceLineNo">1346</span>    final List&lt;ServerName&gt; finalServers = idleServers.isEmpty() ?<a name="line.1346"></a>
-<span class="sourceLineNo">1347</span>            servers : idleServers;<a name="line.1347"></a>
-<span class="sourceLineNo">1348</span>    List&lt;RegionInfo&gt; regions = Lists.newArrayList(regionInfo);<a name="line.1348"></a>
-<span class="sourceLineNo">1349</span>    Cluster cluster = createCluster(finalServers, regions, false);<a name="line.1349"></a>
-<span class="sourceLineNo">1350</span>    return randomAssignment(cluster, regionInfo, finalServers);<a name="line.1350"></a>
-<span class="sourceLineNo">1351</span>  }<a name="line.1351"></a>
-<span class="sourceLineNo">1352</span><a name="line.1352"></a>
-<span class="sourceLineNo">1353</span>  /**<a name="line.1353"></a>
-<span class="sourceLineNo">1354</span>   * Generates a bulk assignment startup plan, attempting to reuse the existing<a name="line.1354"></a>
-<span class="sourceLineNo">1355</span>   * assignment information from META, but adjusting for the specified list of<a name="line.1355"></a>
-<span class="sourceLineNo">1356</span>   * available/online servers available for assignment.<a name="line.1356"></a>
-<span class="sourceLineNo">1357</span>   * &lt;p&gt;<a name="line.1357"></a>
-<span class="sourceLineNo">1358</span>   * Takes a map of all regions to their existing assignment from META. Also<a name="line.1358"></a>
-<span class="sourceLineNo">1359</span>   * takes a list of online servers for regions to be assigned to. Attempts to<a name="line.1359"></a>
-<span class="sourceLineNo">1360</span>   * retain all assignment, so in some instances initial assignment will not be<a name="line.1360"></a>
-<span class="sourceLineNo">1361</span>   * completely balanced.<a name="line.1361"></a>
-<span class="sourceLineNo">1362</span>   * &lt;p&gt;<a name="line.1362"></a>
-<span class="sourceLineNo">1363</span>   * Any leftover regions without an existing server to be assigned to will be<a name="line.1363"></a>
-<span class="sourceLineNo">1364</span>   * assigned randomly to available servers.<a name="line.1364"></a>
-<span class="sourceLineNo">1365</span>   *<a name="line.1365"></a>
-<span class="sourceLineNo">1366</span>   * @param regions regions and existing assignment from meta<a name="line.1366"></a>
-<span class="sourceLineNo">1367</span>   * @param servers available servers<a name="line.1367"></a>
-<span class="sourceLineNo">1368</span>   * @return map of servers and regions to be assigned to them<a name="line.1368"></a>
-<span class="sourceLineNo">1369</span>   */<a name="line.1369"></a>
-<span class="sourceLineNo">1370</span>  @Override<a name="line.1370"></a>
-<span class="sourceLineNo">1371</span>  public Map&lt;ServerName, List&lt;RegionInfo&gt;&gt; retainAssignment(Map&lt;RegionInfo, ServerName&gt; regions,<a name="line.1371"></a>
-<span class="sourceLineNo">1372</span>      List&lt;ServerName&gt; servers) throws HBaseIOException {<a name="line.1372"></a>
-<span class="sourceLineNo">1373</span>    // Update metrics<a name="line.1373"></a>
-<span class="sourceLineNo">1374</span>    metricsBalancer.incrMiscInvocations();<a name="line.1374"></a>
-<span class="sourceLineNo">1375</span>    Map&lt;ServerName, List&lt;RegionInfo&gt;&gt; assignments = assignMasterSystemRegions(regions.keySet(), servers);<a name="line.1375"></a>
-<span class="sourceLineNo">1376</span>    if (assignments != null &amp;&amp; !assignments.isEmpty()) {<a name="line.1376"></a>
-<span class="sourceLineNo">1377</span>      servers = new ArrayList&lt;&gt;(servers);<a name="line.1377"></a>
-<span class="sourceLineNo">1378</span>      // Guarantee not to put other regions on master<a name="line.1378"></a>
-<span class="sourceLineNo">1379</span>      servers.remove(masterServerName);<a name="line.1379"></a>
-<span class="sourceLineNo">1380</span>      List&lt;RegionInfo&gt; masterRegions = assignments.get(masterServerName);<a name="line.1380"></a>
-<span class="sourceLineNo">1381</span>      regions = regions.entrySet().stream().filter(e -&gt; !masterRegions.contains(e.getKey()))<a name="line.1381"></a>
-<span class="sourceLineNo">1382</span>          .collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue));<a name="line.1382"></a>
-<span class="sourceLineNo">1383</span>    }<a name="line.1383"></a>
-<span class="sourceLineNo">1384</span>    if (regions.isEmpty()) {<a name="line.1384"></a>
-<span class="sourceLineNo">1385</span>      return assignments;<a name="line.1385"></a>
-<span class="sourceLineNo">1386</span>    }<a name="line.1386"></a>
-<span class="sourceLineNo">1387</span><a name="line.1387"></a>
-<span class="sourceLineNo">1388</span>    int numServers = servers == null ? 0 : servers.size();<a name="line.1388"></a>
-<span class="sourceLineNo">1389</span>    if (numServers == 0) {<a name="line.1389"></a>
-<span class="sourceLineNo">1390</span>      LOG.warn("Wanted to do retain assignment but no servers to assign to");<a name="line.1390"></a>
-<span class="sourceLineNo">1391</span>      return null;<a name="line.1391"></a>
+<span class="sourceLineNo">1342</span><a name="line.1342"></a>
+<span class="sourceLineNo">1343</span>    int numServers = servers == null ? 0 : servers.size();<a name="line.1343"></a>
+<span class="sourceLineNo">1344</span>    if (numServers == 0) {<a name="line.1344"></a>
+<span class="sourceLineNo">1345</span>      LOG.warn("Wanted to retain assignment but no servers to assign to");<a name="line.1345"></a>
+<span class="sourceLineNo">1346</span>      return null;<a name="line.1346"></a>
+<span class="sourceLineNo">1347</span>    }<a name="line.1347"></a>
+<span class="sourceLineNo">1348</span>    if (numServers == 1) { // Only one server, nothing fancy we can do here<a name="line.1348"></a>
+<span class="sourceLineNo">1349</span>      return servers.get(0);<a name="line.1349"></a>
+<span class="sourceLineNo">1350</span>    }<a name="line.1350"></a>
+<span class="sourceLineNo">1351</span>    List&lt;ServerName&gt; idleServers = findIdleServers(servers);<a name="line.1351"></a>
+<span class="sourceLineNo">1352</span>    if (idleServers.size() == 1) {<a name="line.1352"></a>
+<span class="sourceLineNo">1353</span>      return idleServers.get(0);<a name="line.1353"></a>
+<span class="sourceLineNo">1354</span>    }<a name="line.1354"></a>
+<span class="sourceLineNo">1355</span>    final List&lt;ServerName&gt; finalServers = idleServers.isEmpty() ?<a name="line.1355"></a>
+<span class="sourceLineNo">1356</span>            servers : idleServers;<a name="line.1356"></a>
+<span class="sourceLineNo">1357</span>    List&lt;RegionInfo&gt; regions = Lists.newArrayList(regionInfo);<a name="line.1357"></a>
+<span class="sourceLineNo">1358</span>    Cluster cluster = createCluster(finalServers, regions);<a name="line.1358"></a>
+<span class="sourceLineNo">1359</span>    return randomAssignment(cluster, regionInfo, finalServers);<a name="line.1359"></a>
+<span class="sourceLineNo">1360</span>  }<a name="line.1360"></a>
+<span class="sourceLineNo">1361</span><a name="line.1361"></a>
+<span class="sourceLineNo">1362</span>  /**<a name="line.1362"></a>
+<span class="sourceLineNo">1363</span>   * Generates a bulk assignment startup plan, attempting to reuse the existing<a name="line.1363"></a>
+<span class="sourceLineNo">1364</span>   * assignment information from META, but adjusting for the specified list of<a name="line.1364"></a>
+<span class="sourceLineNo">1365</span>   * available/online servers available for assignment.<a name="line.1365"></a>
+<span class="sourceLineNo">1366</span>   * &lt;p&gt;<a name="line.1366"></a>
+<span class="sourceLineNo">1367</span>   * Takes a map of all regions to their existing assignment from META. Also<a name="line.1367"></a>
+<span class="sourceLineNo">1368</span>   * takes a list of online servers for regions to be assigned to. Attempts to<a name="line.1368"></a>
+<span class="sourceLineNo">1369</span>   * retain all assignment, so in some instances initial assignment will not be<a name="line.1369"></a>
+<span class="sourceLineNo">1370</span>   * completely balanced.<a name="line.1370"></a>
+<span class="sourceLineNo">1371</span>   * &lt;p&gt;<a name="line.1371"></a>
+<span class="sourceLineNo">1372</span>   * Any leftover regions without an existing server to be assigned to will be<a name="line.1372"></a>
+<span class="sourceLineNo">1373</span>   * assigned randomly to available servers.<a name="line.1373"></a>
+<span class="sourceLineNo">1374</span>   *<a name="line.1374"></a>
+<span class="sourceLineNo">1375</span>   * @param regions regions and existing assignment from meta<a name="line.1375"></a>
+<span class="sourceLineNo">1376</span>   * @param servers available servers<a name="line.1376"></a>
+<span class="sourceLineNo">1377</span>   * @return map of servers and regions to be assigned to them<a name="line.1377"></a>
+<span class="sourceLineNo">1378</span>   */<a name="line.1378"></a>
+<span class="sourceLineNo">1379</span>  @Override<a name="line.1379"></a>
+<span class="sourceLineNo">1380</span>  public Map&lt;ServerName, List&lt;RegionInfo&gt;&gt; retainAssignment(Map&lt;RegionInfo, ServerName&gt; regions,<a name="line.1380"></a>
+<span class="sourceLineNo">1381</span>      List&lt;ServerName&gt; servers) throws HBaseIOException {<a name="line.1381"></a>
+<span class="sourceLineNo">1382</span>    // Update metrics<a name="line.1382"></a>
+<span class="sourceLineNo">1383</span>    metricsBalancer.incrMiscInvocations();<a name="line.1383"></a>
+<span class="sourceLineNo">1384</span>    Map&lt;ServerName, List&lt;RegionInfo&gt;&gt; assignments = assignMasterSystemRegions(regions.keySet(), servers);<a name="line.1384"></a>
+<span class="sourceLineNo">1385</span>    if (assignments != null &amp;&amp; !assignments.isEmpty()) {<a name="line.1385"></a>
+<span class="sourceLineNo">1386</span>      servers = new ArrayList&lt;&gt;(servers);<a name="line.1386"></a>
+<span class="sourceLineNo">1387</span>      // Guarantee not to put other regions on master<a name="line.1387"></a>
+<span class="sourceLineNo">1388</span>      servers.remove(masterServerName);<a name="line.1388"></a>
+<span class="sourceLineNo">1389</span>      List&lt;RegionInfo&gt; masterRegions = assignments.get(masterServerName);<a name="line.1389"></a>
+<span class="sourceLineNo">1390</span>      regions = regions.entrySet().stream().filter(e -&gt; !masterRegions.contains(e.getKey()))<a name="line.1390"></a>
+<span class="sourceLineNo">1391</span>          .collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue));<a name="line.1391"></a>
 <span class="sourceLineNo">1392</span>    }<a name="line.1392"></a>
-<span class="sourceLineNo">1393</span>    if (numServers == 1) { // Only one server, nothing fancy we can do here<a name="line.1393"></a>
-<span class="sourceLineNo">1394</span>      ServerName server = servers.get(0);<a name="line.1394"></a>
-<span class="sourceLineNo">1395</span>      assignments.put(server, new ArrayList&lt;&gt;(regions.keySet()));<a name="line.1395"></a>
-<span class="sourceLineNo">1396</span>      return assignments;<a name="line.1396"></a>
-<span class="sourceLineNo">1397</span>    }<a name="line.1397"></a>
-<span class="sourceLineNo">1398</span><a name="line.1398"></a>
-<span class="sourceLineNo">1399</span>    // Group all of the old assignments by their hostname.<a name="line.1399"></a>
-<span class="sourceLineNo">1400</span>    // We can't group directly by ServerName since the servers all have<a name="line.1400"></a>
-<span class="sourceLineNo">1401</span>    // new start-codes.<a name="line.1401"></a>
-<span class="sourceLineNo">1402</span><a name="line.1402"></a>
-<span class="sourceLineNo">1403</span>    // Group the servers by their hostname. It's possible we have multiple<a name="line.1403"></a>
-<span class="sourceLineNo">1404</span>    // servers on the same host on different ports.<a name="line.1404"></a>
-<span class="sourceLineNo">1405</span>    ArrayListMultimap&lt;String, ServerName&gt; serversByHostname = ArrayListMultimap.create();<a name="line.1405"></a>
-<span class="sourceLineNo">1406</span>    for (ServerName server : servers) {<a name="line.1406"></a>
-<span class="sourceLineNo">1407</span>      assignments.put(server, new ArrayList&lt;&gt;());<a name="line.1407"></a>
-<span class="sourceLineNo">1408</span>      serversByHostname.put(server.getHostnameLowerCase(), server);<a name="line.1408"></a>
-<span class="sourceLineNo">1409</span>    }<a name="line.1409"></a>
-<span class="sourceLineNo">1410</span><a name="line.1410"></a>
-<span class="sourceLineNo">1411</span>    // Collection of the hostnames that used to have regions<a name="line.1411"></a>
-<span class="sourceLineNo">1412</span>    // assigned, but for which we no longer have any RS running<a name="line.1412"></a>
-<span class="sourceLineNo">1413</span>    // after the cluster restart.<a name="line.1413"></a>
-<span class="sourceLineNo">1414</span>    Set&lt;String&gt; oldHostsNoLongerPresent = Sets.newTreeSet();<a name="line.1414"></a>
-<span class="sourceLineNo">1415</span><a name="line.1415"></a>
-<span class="sourceLineNo">1416</span>    // If the old servers aren't present, lets assign those regions later.<a name="line.1416"></a>
-<span class="sourceLineNo">1417</span>    List&lt;RegionInfo&gt; randomAssignRegions = Lists.newArrayList();<a name="line.1417"></a>
-<span class="sourceLineNo">1418</span><a name="line.1418"></a>
-<span class="sourceLineNo">1419</span>    int numRandomAssignments = 0;<a name="line.1419"></a>
-<span class="sourceLineNo">1420</span>    int numRetainedAssigments = 0;<a name="line.1420"></a>
-<span class="sourceLineNo">1421</span><a name="line.1421"></a>
-<span class="sourceLineNo">1422</span>    Cluster cluster = createCluster(servers, regions.keySet(), true);<a name="line.1422"></a>
-<span class="sourceLineNo">1423</span><a name="line.1423"></a>
-<span class="sourceLineNo">1424</span>    for (Map.Entry&lt;RegionInfo, ServerName&gt; entry : regions.entrySet()) {<a name="line.1424"></a>
-<span class="sourceLineNo">1425</span>      RegionInfo region = entry.getKey();<a name="line.1425"></a>
-<span class="sourceLineNo">1426</span>      ServerName oldServerName = entry.getValue();<a name="line.1426"></a>
-<span class="sourceLineNo">1427</span>      List&lt;ServerName&gt; localServers = new ArrayList&lt;&gt;();<a name="line.1427"></a>
-<span class="sourceLineNo">1428</span>      if (oldServerName != null) {<a name="line.1428"></a>
-<span class="sourceLineNo">1429</span>        localServers = serversByHostname.get(oldServerName.getHostnameLowerCase());<a name="line.1429"></a>
-<span class="sourceLineNo">1430</span>      }<a name="line.1430"></a>
-<span class="sourceLineNo">1431</span>      if (localServers.isEmpty()) {<a name="line.1431"></a>
-<span class="sourceLineNo">1432</span>        // No servers on the new cluster match up with this hostname, assign randomly, later.<a name="line.1432"></a>
-<span class="sourceLineNo">1433</span>        randomAssignRegions.add(region);<a name="line.1433"></a>
-<span class="sourceLineNo">1434</span>        if (oldServerName != null) {<a name="line.1434"></a>
-<span class="sourceLineNo">1435</span>          oldHostsNoLongerPresent.add(oldServerName.getHostnameLowerCase());<a name="line.1435"></a>
-<span class="sourceLineNo">1436</span>        }<a name="line.1436"></a>
-<span class="sourceLineNo">1437</span>      } else if (localServers.size() == 1) {<a name="line.1437"></a>
-<span class="sourceLineNo">1438</span>        // the usual case - one new server on same host<a name="line.1438"></a>
-<span class="sourceLineNo">1439</span>        ServerName target = localServers.get(0);<a name="line.1439"></a>
-<span class="sourceLineNo">1440</span>        assignments.get(target).add(region);<a name="line.1440"></a>
-<span class="sourceLineNo">1441</span>        numRetainedAssigments++;<a name="line.1441"></a>
-<span class="sourceLineNo">1442</span>      } else {<a name="line.1442"></a>
-<span class="sourceLineNo">1443</span>        // multiple new servers in the cluster on this same host<a name="line.1443"></a>
-<span class="sourceLineNo">1444</span>        if (localServers.contains(oldServerName)) {<a name="line.1444"></a>
-<span class="sourceLineNo">1445</span>          assignments.get(oldServerName).add(region);<a name="line.1445"></a>
-<span class="sourceLineNo">1446</span>          numRetainedAssigments++;<a name="line.1446"></a>
-<span class="sourceLineNo">1447</span>        } else {<a name="line.1447"></a>
-<span class="sourceLineNo">1448</span>          ServerName target = null;<a name="line.1448"></a>
-<span class="sourceLineNo">1449</span>          for (ServerName tmp : localServers) {<a name="line.1449"></a>
-<span class="sourceLineNo">1450</span>            if (tmp.getPort() == oldServerName.getPort()) {<a name="line.1450"></a>
-<span class="sourceLineNo">1451</span>              target = tmp;<a name="line.1451"></a>
-<span class="sourceLineNo">1452</span>              assignments.get(tmp).add(region);<a name="line.1452"></a>
-<span class="sourceLineNo">1453</span>              numRetainedAssigments++;<a name="line.1453"></a>
-<span class="sourceLineNo">1454</span>              break;<a name="line.1454"></a>
-<span class="sourceLineNo">1455</span>            }<a name="line.1455"></a>
-<span class="sourceLineNo">1456</span>          }<a name="line.1456"></a>
-<span class="sourceLineNo">1457</span>          if (target == null) {<a name="line.1457"></a>
-<span class="sourceLineNo">1458</span>            randomAssignRegions.add(region);<a name="line.1458"></a>
-<span class="sourceLineNo">1459</span>          }<a name="line.1459"></a>
-<span class="sourceLineNo">1460</span>        }<a name="line.1460"></a>
-<span class="sourceLineNo">1461</span>      }<a name="line.1461"></a>
-<span class="sourceLineNo">1462</span>    }<a name="line.1462"></a>
-<span class="sourceLineNo">1463</span><a name="line.1463"></a>
-<span class="sourceLineNo">1464</span>    // If servers from prior assignment aren't present, then lets do randomAssignment on regions.<a name="line.1464"></a>
-<span class="sourceLineNo">1465</span>    if (randomAssignRegions.size() &gt; 0) {<a name="line.1465"></a>
-<span class="sourceLineNo">1466</span>      for (Map.Entry&lt;ServerName, List&lt;RegionInfo&gt;&gt; entry : assignments.entrySet()) {<a name="line.1466"></a>
-<span class="sourceLineNo">1467</span>        ServerName sn = entry.getKey();<a name="line.1467"></a>
-<span class="sourceLineNo">1468</span>        for (RegionInfo region : entry.getValue()) {<a name="line.1468"></a>
-<span class="sourceLineNo">1469</span>          cluster.doAssignRegion(region, sn);<a name="line.1469"></a>
-<span class="sourceLineNo">1470</span>        }<a name="line.1470"></a>
-<span class="sourceLineNo">1471</span>      }<a name="line.1471"></a>
-<span class="sourceLineNo">1472</span>      for (RegionInfo region : randomAssignRegions) {<a name="line.1472"></a>
-<span class="sourceLineNo">1473</span>        ServerName target = randomAssignment(cluster, region, servers);<a name="line.1473"></a>
-<span class="sourceLineNo">1474</span>        assignments.get(target).add(region);<a name="line.1474"></a>
-<span class="sourceLineNo">1475</span>        cluster.doAssignRegion(region, target);<a name="line.1475"></a>
-<span class="sourceLineNo">1476</span>        numRandomAssignments++;<a name="line.1476"></a>
-<span class="sourceLineNo">1477</span>      }<a name="line.1477"></a>
-<span class="sourceLineNo">1478</span>    }<a name="line.1478"></a>
-<span class="sourceLineNo">1479</span><a name="line.1479"></a>
-<span class="sourceLineNo">1480</span>    String randomAssignMsg = "";<a name="line.1480"></a>
-<span class="sourceLineNo">1481</span>    if (numRandomAssignments &gt; 0) {<a name="line.1481"></a>
-<span class="sourceLineNo">1482</span>      randomAssignMsg =<a name="line.1482"></a>
-<span class="sourceLineNo">1483</span>          numRandomAssignments + " regions were assigned "<a name="line.1483"></a>
-<span class="sourceLineNo">1484</span>              + "to random hosts, since the old hosts for these regions are no "<a name="line.1484"></a>
-<span class="sourceLineNo">1485</span>              + "longer present in the cluster. These hosts were:\n  "<a name="line.1485"></a>
-<span class="sourceLineNo">1486</span>              + Joiner.on("\n  ").join(oldHostsNoLongerPresent);<a name="line.1486"></a>
-<span class="sourceLineNo">1487</span>    }<a name="line.1487"></a>
-<span class="sourceLineNo">1488</span><a name="line.1488"></a>
-<span class="sourceLineNo">1489</span>    LOG.info("Reassigned " + regions.size() + " regions. " + numRetainedAssigments<a name="line.1489"></a>
-<span class="sourceLineNo">1490</span>        + " retained the pre-restart assignment. " + randomAssignMsg);<a name="line.1490"></a>
-<span class="sourceLineNo">1491</span>    return assignments;<a name="line.1491"></a>
-<span class="sourceLineNo">1492</span>  }<a name="line.1492"></a>
-<span class="sourceLineNo">1493</span><a name="line.1493"></a>
-<span class="sourceLineNo">1494</span>  @Override<a name="line.1494"></a>
-<span class="sourceLineNo">1495</span>  public void initialize() throws HBaseIOException{<a name="line.1495"></a>
-<span class="sourceLineNo">1496</span>  }<a name="line.1496"></a>
-<span class="sourceLineNo">1497</span><a name="line.1497"></a>
-<span class="sourceLineNo">1498</span>  @Override<a name="line.1498"></a>
-<span class="sourceLineNo">1499</span>  public void regionOnline(RegionInfo regionInfo, ServerName sn) {<a name="line.1499"></a>
+<span class="sourceLineNo">1393</span>    if (regions.isEmpty()) {<a name="line.1393"></a>
+<span class="sourceLineNo">1394</span>      return assignments;<a name="line.1394"></a>
+<span class="sourceLineNo">1395</span>    }<a name="line.1395"></a>
+<span class="sourceLineNo">1396</span><a name="line.1396"></a>
+<span class="sourceLineNo">1397</span>    int numServers = servers == null ? 0 : servers.size();<a name="line.1397"></a>
+<span class="sourceLineNo">1398</span>    if (numServers == 0) {<a name="line.1398"></a>
+<span class="sourceLineNo">1399</span>      LOG.warn("Wanted to do retain assignment but no servers to assign to");<a name="line.1399"></a>
+<span class="sourceLineNo">1400</span>      return null;<a name="line.1400"></a>
+<span class="sourceLineNo">1401</span>    }<a name="line.1401"></a>
+<span class="sourceLineNo">1402</span>    if (numServers == 1) { // Only one server, nothing fancy we can do here<a name="line.1402"></a>
+<span class="sourceLineNo">1403</span>      ServerName server = servers.get(0);<a name="line.1403"></a>
+<span class="sourceLineNo">1404</span>      assignments.put(server, new ArrayList&lt;&gt;(regions.keySet()));<a name="line.1404"></a>
+<span class="sourceLineNo">1405</span>      return assignments;<a name="line.1405"></a>
+<span class="sourceLineNo">1406</span>    }<a name="line.1406"></a>
+<span class="sourceLineNo">1407</span><a name="line.1407"></a>
+<span class="sourceLineNo">1408</span>    // Group all of the old assignments by their hostname.<a name="line.1408"></a>
+<span class="sourceLineNo">1409</span>    // We can't group directly by ServerName since the servers all have<a name="line.1409"></a>
+<span class="sourceLineNo">1410</span>    // new start-codes.<a name="line.1410"></a>
+<span class="sourceLineNo">1411</span><a name="line.1411"></a>
+<span class="sourceLineNo">1412</span>    // Group the servers by their hostname. It's possible we have multiple<a name="line.1412"></a>
+<span class="sourceLineNo">1413</span>    // servers on the same host on different ports.<a name="line.1413"></a>
+<span class="sourceLineNo">1414</span>    ArrayListMultimap&lt;String, ServerName&gt; serversByHostname = ArrayListMultimap.create();<a name="line.1414"></a>
+<span class="sourceLineNo">1415</span>    for (ServerName server : servers) {<a name="line.1415"></a>
+<span class="sourceLineNo">1416</span>      assignments.put(server, new ArrayList&lt;&gt;());<a name="line.1416"></a>
+<span class="sourceLineNo">1417</span>      serversByHostname.put(server.getHostnameLowerCase(), server);<a name="line.1417"></a>
+<span class="sourceLineNo">1418</span>    }<a name="line.1418"></a>
+<span class="sourceLineNo">1419</span><a name="line.1419"></a>
+<span class="sourceLineNo">1420</span>    // Collection of the hostnames that used to have regions<a name="line.1420"></a>
+<span class="sourceLineNo">1421</span>    // assigned, but for which we no longer have any RS running<a name="line.1421"></a>
+<span class="sourceLineNo">1422</span>    // after the cluster restart.<a name="line.1422"></a>
+<span class="sourceLineNo">1423</span>    Set&lt;String&gt; oldHostsNoLongerPresent = Sets.newTreeSet();<a name="line.1423"></a>
+<span class="sourceLineNo">1424</span><a name="line.1424"></a>
+<span class="sourceLineNo">1425</span>    // If the old servers aren't present, lets assign those regions later.<a name="line.1425"></a>
+<span class="sourceLineNo">1426</span>    List&lt;RegionInfo&gt; randomAssignRegions = Lists.newArrayList();<a name="line.1426"></a>
+<span class="sourceLineNo">1427</span><a name="line.1427"></a>
+<span class="sourceLineNo">1428</span>    int numRandomAssignments = 0;<a name="line.1428"></a>
+<span class="sourceLineNo">1429</span>    int numRetainedAssigments = 0;<a name="line.1429"></a>
+<span class="sourceLineNo">1430</span><a name="line.1430"></a>
+<span class="sourceLineNo">1431</span>    for (Map.Entry&lt;RegionInfo, ServerName&gt; entry : regions.entrySet()) {<a name="line.1431"></a>
+<span class="sourceLineNo">1432</span>      RegionInfo region = entry.getKey();<a name="line.1432"></a>
+<span class="sourceLineNo">1433</span>      ServerName oldServerName = entry.getValue();<a name="line.1433"></a>
+<span class="sourceLineNo">1434</span>      List&lt;ServerName&gt; localServers = new ArrayList&lt;&gt;();<a name="line.1434"></a>
+<span class="sourceLineNo">1435</span>      if (oldServerName != null) {<a name="line.1435"></a>
+<span class="sourceLineNo">1436</span>        localServers = serversByHostname.get(oldServerName.getHostnameLowerCase());<a name="line.1436"></a>
+<span class="sourceLineNo">1437</span>      }<a name="line.1437"></a>
+<span class="sourceLineNo">1438</span>      if (localServers.isEmpty()) {<a name="line.1438"></a>
+<span class="sourceLineNo">1439</span>        // No servers on the new cluster match up with this hostname, assign randomly, later.<a name="line.1439"></a>
+<span class="sourceLineNo">1440</span>        randomAssignRegions.add(region);<a name="line.1440"></a>
+<span class="sourceLineNo">1441</span>        if (oldServerName != null) {<a name="line.1441"></a>
+<span class="sourceLineNo">1442</span>          oldHostsNoLongerPresent.add(oldServerName.getHostnameLowerCase());<a name="line.1442"></a>
+<span class="sourceLineNo">1443</span>        }<a name="line.1443"></a>
+<span class="sourceLineNo">1444</span>      } else if (localServers.size() == 1) {<a name="line.1444"></a>
+<span class="sourceLineNo">1445</span>        // the usual case - one new server on same host<a name="line.1445"></a>
+<span class="sourceLineNo">1446</span>        ServerName target = localServers.get(0);<a name="line.1446"></a>
+<span class="sourceLineNo">1447</span>        assignments.get(target).add(region);<a name="line.1447"></a>
+<span class="sourceLineNo">1448</span>        numRetainedAssigments++;<a name="line.1448"></a>
+<span class="sourceLineNo">1449</span>      } else {<a name="line.1449"></a>
+<span class="sourceLineNo">1450</span>        // multiple new servers in the cluster on this same host<a name="line.1450"></a>
+<span class="sourceLineNo">1451</span>        if (localServers.contains(oldServerName)) {<a name="line.1451"></a>
+<span class="sourceLineNo">1452</span>          assignments.get(oldServerName).add(region);<a name="line.1452"></a>
+<span class="sourceLineNo">1453</span>          numRetainedAssigments++;<a name="line.1453"></a>
+<span class="sourceLineNo">1454</span>        } else {<a name="line.1454"></a>
+<span class="sourceLineNo">1455</span>          ServerName target = null;<a name="line.1455"></a>
+<span class="sourceLineNo">1456</span>          for (ServerName tmp : localServers) {<a name="line.1456"></a>
+<span class="sourceLineNo">1457</span>            if (tmp.getPort() == oldServerName.getPort()) {<a name="line.1457"></a>
+<span class="sourceLineNo">1458</span>              target = tmp;<a name="line.1458"></a>
+<span class="sourceLineNo">1459</span>              assignments.get(tmp).add(region);<a name="line.1459"></a>
+<span class="sourceLineNo">1460</span>              numRetainedAssigments++;<a name="line.1460"></a>
+<span class="sourceLineNo">1461</span>              break;<a name="line.1461"></a>
+<span class="sourceLineNo">1462</span>            }<a name="line.1462"></a>
+<span class="sourceLineNo">1463</span>          }<a name="line.1463"></a>
+<span class="sourceLineNo">1464</span>          if (target == null) {<a name="line.1464"></a>
+<span class="sourceLineNo">1465</span>            randomAssignRegions.add(region);<a name="line.1465"></a>
+<span class="sourceLineNo">1466</span>          }<a name="line.1466"></a>
+<span class="sourceLineNo">1467</span>        }<a name="line.1467"></a>
+<span class="sourceLineNo">1468</span>      }<a name="line.1468"></a>
+<span class="sourceLineNo">1469</span>    }<a name="line.1469"></a>
+<span class="sourceLineNo">1470</span><a name="line.1470"></a>
+<span class="sourceLineNo">1471</span>    // If servers from prior assignment aren't present, then lets do randomAssignment on regions.<a name="line.1471"></a>
+<span class="sourceLineNo">1472</span>    if (randomAssignRegions.size() &gt; 0) {<a name="line.1472"></a>
+<span class="sourceLineNo">1473</span>      Cluster cluster = createCluster(servers, regions.keySet());<a name="line.1473"></a>
+<span class="sourceLineNo">1474</span>      for (Map.Entry&lt;ServerName, List&lt;RegionInfo&gt;&gt; entry : assignments.entrySet()) {<a name="line.1474"></a>
+<span class="sourceLineNo">1475</span>        ServerName sn = entry.getKey();<a name="line.1475"></a>
+<span class="sourceLineNo">1476</span>        for (RegionInfo region : entry.getValue()) {<a name="line.1476"></a>
+<span class="sourceLineNo">1477</span>          cluster.doAssignRegion(region, sn);<a name="line.1477"></a>
+<span class="sourceLineNo">1478</span>        }<a name="line.1478"></a>
+<span class="sourceLineNo">1479</span>      }<a name="line.1479"></a>
+<span class="sourceLineNo">1480</span>      for (RegionInfo region : randomAssignRegions) {<a name="line.1480"></a>
+<span class="sourceLineNo">1481</span>        ServerName target = randomAssignment(cluster, region, servers);<a name="line.1481"></a>
+<span class="sourceLineNo">1482</span>        assignments.get(target).add(region);<a name="line.1482"></a>
+<span class="sourceLineNo">1483</span>        cluster.doAssignRegion(region, target);<a name="line.1483"></a>
+<span class="sourceLineNo">1484</span>        numRandomAssignments++;<a name="line.1484"></a>
+<span class="sourceLineNo">1485</span>      }<a name="line.1485"></a>
+<span class="sourceLineNo">1486</span>    }<a name="line.1486"></a>
+<span class="sourceLineNo">1487</span><a name="line.1487"></a>
+<span class="sourceLineNo">1488</span>    String randomAssignMsg = "";<a name="line.1488"></a>
+<span class="sourceLineNo">1489</span>    if (numRandomAssignments &gt; 0) {<a name="line.1489"></a>
+<span class="sourceLineNo">1490</span>      randomAssignMsg =<a name="line.1490"></a>
+<span class="sourceLineNo">1491</span>          numRandomAssignments + " regions were assigned "<a name="line.1491"></a>
+<span class="sourceLineNo">1492</span>              + "to random hosts, since the old hosts for these regions are no "<a name="line.1492"></a>
+<span class="sourceLineNo">1493</span>              + "longer present in the cluster. These hosts were:\n  "<a name="line.1493"></a>
+<span class="sourceLineNo">1494</span>              + Joiner.on("\n  ").join(oldHostsNoLongerPresent);<a name="line.1494"></a>
+<span class="sourceLineNo">1495</span>    }<a name="line.1495"></a>
+<span class="sourceLineNo">1496</span><a name="line.1496"></a>
+<span class="sourceLineNo">1497</span>    LOG.info("Reassigned " + regions.size() + " regions. " + numRetainedAssigments<a name="line.1497"></a>
+<span class="sourceLineNo">1498</span>        + " retained the pre-restart assignment. " + randomAssignMsg);<a name="line.1498"></a>
+<span class="sourceLineNo">1499</span>    return assignments;<a name="line.1499"></a>
 <span class="sourceLineNo">1500</span>  }<a name="line.1500"></a>
 <span class="sourceLineNo">1501</span><a name="line.1501"></a>
 <span class="sourceLineNo">1502</span>  @Override<a name="line.1502"></a>
-<span class="sourceLineNo">1503</span>  public void regionOffline(RegionInfo regionInfo) {<a name="line.1503"></a>
+<span class="sourceLineNo">1503</span>  public void initialize() throws HBaseIOException{<a name="line.1503"></a>
 <span class="sourceLineNo">1504</span>  }<a name="line.1504"></a>
 <span class="sourceLineNo">1505</span><a name="line.1505"></a>
 <span class="sourceLineNo">1506</span>  @Override<a name="line.1506"></a>
-<span class="sourceLineNo">1507</span>  public boolean isStopped() {<a name="line.1507"></a>
-<span class="sourceLineNo">1508</span>    return stopped;<a name="line.1508"></a>
-<span class="sourceLineNo">1509</span>  }<a name="line.1509"></a>
-<span class="sourceLineNo">1510</span><a name="line.1510"></a>
-<span class="sourceLineNo">1511</span>  @Override<a name="line.1511"></a>
-<span class="sourceLineNo">1512</span>  public void stop(String why) {<a name="line.1512"></a>
-<span class="sourceLineNo">1513</span>    LOG.info("Load Balancer stop requested: "+why);<a name="line.1513"></a>
-<span class="sourceLineNo">1514</span>    stopped = true;<a name="line.1514"></a>
-<span class="sourceLineNo">1515</span>  }<a name="line.1515"></a>
-<span class="sourceLineNo">1516</span><a name="line.1516"></a>
-<span class="sourceLineNo">1517</span>  /**<a name="line.1517"></a>
-<span class="sourceLineNo">1518</span>   * Used to assign a single region to a random server.<a name="line.1518"></a>
-<span class="sourceLineNo">1519</span>   */<a name="line.1519"></a>
-<span class="sourceLineNo">1520</span>  private ServerName randomAssignment(Cluster cluster, RegionInfo regionInfo,<a name="line.1520"></a>
-<span class="sourceLineNo">1521</span>      List&lt;ServerName&gt; servers) {<a name="line.1521"></a>
-<span class="sourceLineNo">1522</span>    int numServers = servers.size(); // servers is not null, numServers &gt; 1<a name="line.1522"></a>
-<span class="sourceLineNo">1523</span>    ServerName sn = null;<a name="line.1523"></a>
-<span class="sourceLineNo">1524</span>    final int maxIterations = numServers * 4;<a name="line.1524"></a>
-<span class="sourceLineNo">1525</span>    int iterations = 0;<a name="line.1525"></a>
-<span class="sourceLineNo">1526</span><a name="line.1526"></a>
-<span class="sourceLineNo">1527</span>    do {<a name="line.1527"></a>
-<span class="sourceLineNo">1528</span>      int i = RANDOM.nextInt(numServers);<a name="line.1528"></a>
-<span class="sourceLineNo">1529</span>      sn = servers.get(i);<a name="line.1529"></a>
-<span class="sourceLineNo">1530</span>    } while (cluster.wouldLowerAvailability(regionInfo, sn)<a name="line.1530"></a>
-<span class="sourceLineNo">1531</span>        &amp;&amp; iterations++ &lt; maxIterations);<a name="line.1531"></a>
-<span class="sourceLineNo">1532</span>    cluster.doAssignRegion(regionInfo, sn);<a name="line.1532"></a>
-<span class="sourceLineNo">1533</span>    return sn;<a name="line.1533"></a>
-<span class="sourceLineNo">1534</span>  }<a name="line.1534"></a>
-<span class="sourceLineNo">1535</span><a name="line.1535"></a>
-<span class="sourceLineNo">1536</span>  /**<a name="line.1536"></a>
-<span class="sourceLineNo">1537</span>   * Round robin a list of regions to a list of servers<a name="line.1537"></a>
-<span class="sourceLineNo">1538</span>   */<a name="line.1538"></a>
-<span class="sourceLineNo">1539</span>  private void roundRobinAssignment(Cluster cluster, List&lt;RegionInfo&gt; regions,<a name="line.1539"></a>
-<span class="sourceLineNo">1540</span>      List&lt;RegionInfo&gt; unassignedRegions, List&lt;ServerName&gt; servers,<a name="line.1540"></a>
-<span class="sourceLineNo">1541</span>      Map&lt;ServerName, List&lt;RegionInfo&gt;&gt; assignments) {<a name="line.1541"></a>
-<span class="sourceLineNo">1542</span><a name="line.1542"></a>
-<span class="sourceLineNo">1543</span>    int numServers = servers.size();<a name="line.1543"></a>
-<span class="sourceLineNo">1544</span>    int numRegions = regions.size();<a name="line.1544"></a>
-<span class="sourceLineNo">1545</span>    int max = (int) Math.ceil((float) numRegions / numServers);<a name="line.1545"></a>
-<span class="sourceLineNo">1546</span>    int serverIdx = 0;<a name="line.1546"></a>
-<span class="sourceLineNo">1547</span>    if (numServers &gt; 1) {<a name="line.1547"></a>
-<span class="sourceLineNo">1548</span>      serverIdx = RANDOM.nextInt(numServers);<a name="line.1548"></a>
-<span class="sourceLineNo">1549</span>    }<a name="line.1549"></a>
-<span class="sourceLineNo">1550</span>    int regionIdx = 0;<a name="line.1550"></a>
-<span class="sourceLineNo">1551</span><a name="line.1551"></a>
-<span class="sourceLineNo">1552</span>    for (int j = 0; j &lt; numServers; j++) {<a name="line.1552"></a>
-<span class="sourceLineNo">1553</span>      ServerName server = servers.get((j + serverIdx) % numServers);<a name="line.1553"></a>
-<span class="sourceLineNo">1554</span>      List&lt;RegionInfo&gt; serverRegions = new ArrayList&lt;&gt;(max);<a name="line.1554"></a>
-<span class="sourceLineNo">1555</span>      for (int i = regionIdx; i &lt; numRegions; i += numServers) {<a name="line.1555"></a>
-<span class="sourceLineNo">1556</span>        RegionInfo region = regions.get(i % numRegions);<a name="line.1556"></a>
-<span class="sourceLineNo">1557</span>        if (cluster.wouldLowerAvailability(region, server)) {<a name="line.1557"></a>
-<span class="sourceLineNo">1558</span>          unassignedRegions.add(region);<a name="line.1558"></a>
-<span class="sourceLineNo">1559</span>        } else {<a name="line.1559"></a>
-<span class="sourceLineNo">1560</span>          serverRegions.add(region);<a name="line.1560"></a>
-<span class="sourceLineNo">1561</span>          cluster.doAssignRegion(region, server);<a name="line.1561"></a>
-<span class="sourceLineNo">1562</span>        }<a name="line.1562"></a>
-<span class="sourceLineNo">1563</span>      }<a name="line.1563"></a>
-<span class="sourceLineNo">1564</span>      assignments.put(server, serverRegions);<a name="line.1564"></a>
-<span class="sourceLineNo">1565</span>      regionIdx++;<a name="line.1565"></a>
-<span class="sourceLineNo">1566</span>    }<a name="line.1566"></a>
-<span class="sourceLineNo">1567</span>  }<a name="line.1567"></a>
-<span class="sourceLineNo">1568</span><a name="line.1568"></a>
-<span class="sourceLineNo">1569</span>  protected Map&lt;ServerName, List&lt;RegionInfo&gt;&gt; getRegionAssignmentsByServer(<a name="line.1569"></a>
-<span class="sourceLineNo">1570</span>    Collection&lt;RegionInfo&gt; regions) {<a name="line.1570"></a>
-<span class="sourceLineNo">1571</span>    if (this.services != null &amp;&amp; this.services.getAssignmentManager() != null) {<a name="line.1571"></a>
-<span class="sourceLineNo">1572</span>      return this.services.getAssignmentManager().getSnapShotOfAssignment(regions);<a name="line.1572"></a>
-<span class="sourceLineNo">1573</span>    } else {<a name="line.1573"></a>
-<span class="sourceLineNo">1574</span>      return new HashMap&lt;&gt;();<a name="line.1574"></a>
-<span class="sourceLineNo">1575</span>    }<a name="line.1575"></a>
-<span class="sourceLineNo">1576</span>  }<a name="line.1576"></a>
-<span class="sourceLineNo">1577</span><a name="line.1577"></a>
-<span class="sourceLineNo">1578</span>  @Override<a name="line.1578"></a>
-<span class="sourceLineNo">1579</span>  public void onConfigurationChange(Configuration conf) {<a name="line.1579"></a>
-<span class="sourceLineNo">1580</span>  }<a name="line.1580"></a>
-<span class="sourceLineNo">1581</span>}<a name="line.1581"></a>
+<span class="sourceLineNo">1507</span>  public void regionOnline(RegionInfo regionInfo, ServerName sn) {<a name="line.1507"></a>
+<span class="sourceLineNo">1508</span>  }<a name="line.1508"></a>
+<span class="sourceLineNo">1509</span><a name="line.1509"></a>
+<span class="sourceLineNo">1510</span>  @Override<a name="line.1510"></a>
+<span class="sourceLineNo">1511</span>  public void regionOffline(RegionInfo regionInfo) {<a name="line.1511"></a>
+<span class="sourceLineNo">1512</span>  }<a name="line.1512"></a>
+<span class="sourceLineNo">1513</span><a name="line.1513"></a>
+<span class="sourceLineNo">1514</span>  @Override<a name="line.1514"></a>
+<span class="sourceLineNo">1515</span>  public boolean isStopped() {<a name="line.1515"></a>
+<span class="sourceLineNo">1516</span>    return stopped;<a name="line.1516"></a>
+<span class="sourceLineNo">1517</span>  }<a name="line.1517"></a>
+<span class="sourceLineNo">1518</span><a name="line.1518"></a>
+<span class="sourceLineNo">1519</span>  @Override<a name="line.1519"></a>
+<span class="sourceLineNo">1520</span>  public void stop(String why) {<a name="line.1520"></a>
+<span class="sourceLineNo">1521</span>    LOG.info("Load Balancer stop requested: "+why);<a name="line.1521"></a>
+<span class="sourceLineNo">1522</span>    stopped = true;<a name="line.1522"></a>
+<span class="sourceLineNo">1523</span>  }<a name="line.1523"></a>
+<span class="sourceLineNo">1524</span><a name="line.1524"></a>
+<span class="sourceLineNo">1525</span>  /**<a name="line.1525"></a>
+<span class="sourceLineNo">1526</span>   * Used to assign a single region to a random server.<a name="line.1526"></a>
+<span class="sourceLineNo">1527</span>   */<a name="line.1527"></a>
+<span class="sourceLineNo">1528</span>  private ServerName randomAssignment(Cluster cluster, RegionInfo regionInfo,<a name="line.1528"></a>
+<span class="sourceLineNo">1529</span>      List&lt;ServerName&gt; servers) {<a name="line.1529"></a>
+<span class="sourceLineNo">1530</span>    int numServers = servers.size(); // servers is not null, numServers &gt; 1<a name="line.1530"></a>
+<span class="sourceLineNo">1531</span>    ServerName sn = null;<a name="line.1531"></a>
+<span class="sourceLineNo">1532</span>    final int maxIterations = numServers * 4;<a name="line.1532"></a>
+<span class="sourceLineNo">1533</span>    int iterations = 0;<a name="line.1533"></a>
+<span class="sourceLineNo">1534</span><a name="line.1534"></a>
+<span class="sourceLineNo">1535</span>    do {<a name="line.1535"></a>
+<span class="sourceLineNo">1536</span>      int i = RANDOM.nextInt(numServers);<a name="line.1536"></a>
+<span class="sourceLineNo">1537</span>      sn = servers.get(i);<a name="line.1537"></a>
+<span class="sourceLineNo">1538</span>    } while (cluster.wouldLowerAvailability(regionInfo, sn)<a name="line.1538"></a>
+<span class="sourceLineNo">1539</span>        &amp;&amp; iterations++ &lt; maxIterations);<a name="line.1539"></a>
+<span class="sourceLineNo">1540</span>    cluster.doAssignRegion(regionInfo, sn);<a name="line.1540"></a>
+<span class="sourceLineNo">1541</span>    return sn;<a name="line.1541"></a>
+<span class="sourceLineNo">1542</span>  }<a name="line.1542"></a>
+<span class="sourceLineNo">1543</span><a name="line.1543"></a>
+<span class="sourceLineNo">1544</span>  /**<a name="line.1544"></a>
+<span class="sourceLineNo">1545</span>   * Round robin a list of regions to a list of servers<a name="line.1545"></a>
+<span class="sourceLineNo">1546</span>   */<a name="line.1546"></a>
+<span class="sourceLineNo">1547</span>  private void roundRobinAssignment(Cluster cluster, List&lt;RegionInfo&gt; regions,<a name="line.1547"></a>
+<span class="sourceLineNo">1548</span>      List&lt;RegionInfo&gt; unassignedRegions, List&lt;ServerName&gt; servers,<a name="line.1548"></a>
+<span class="sourceLineNo">1549</span>      Map&lt;ServerName, List&lt;RegionInfo&gt;&gt; assignments) {<a name="line.1549"></a>
+<span class="sourceLineNo">1550</span><a name="line.1550"></a>
+<span class="sourceLineNo">1551</span>    int numServers = servers.size();<a name="line.1551"></a>
+<span class="sourceLineNo">1552</span>    int numRegions = regions.size();<a name="line.1552"></a>
+<span class="sourceLineNo">1553</span>    int max = (int) Math.ceil((float) numRegions / numServers);<a name="line.1553"></a>
+<span class="sourceLineNo">1554</span>    int serverIdx = 0;<a name="line.1554"></a>
+<span class="sourceLineNo">1555</span>    if (numServers &gt; 1) {<a name="line.1555"></a>
+<span class="sourceLineNo">1556</span>      serverIdx = RANDOM.nextInt(numServers);<a name="line.1556"></a>
+<span class="sourceLineNo">1557</span>    }<a name="line.1557"></a>
+<span class="sourceLineNo">1558</span>    int regionIdx = 0;<a name="line.1558"></a>
+<span class="sourceLineNo">1559</span><a name="line.1559"></a>
+<span class="sourceLineNo">1560</span>    for (int j = 0; j &lt; numServers; j++) {<a name="line.1560"></a>
+<span class="sourceLineNo">1561</span>      ServerName server = servers.get((j + serverIdx) % numServers);<a name="line.1561"></a>
+<span class="sourceLineNo">1562</span>      List&lt;RegionInfo&gt; serverRegions = new ArrayList&lt;&gt;(max);<a name="line.1562"></a>
+<span class="sourceLineNo">1563</span>      for (int i = regionIdx; i &lt; numRegions; i += numServers) {<a name="line.1563"></a>
+<span class="sourceLineNo">1564</span>        RegionInfo region = regions.get(i % numRegions);<a name="line.1564"></a>
+<span class="sourceLineNo">1565</span>        if (cluster.wouldLowerAvailability(region, server)) {<a name="line.1565"></a>
+<span class="sourceLineNo">1566</span>          unassignedRegions.add(region);<a name="line.1566"></a>
+<span class="sourceLineNo">1567</span>        } else {<a name="line.1567"></a>
+<span class="sourceLineNo">1568</span>          serverRegions.add(region);<a name="line.1568"></a>
+<span class="sourceLineNo">1569</span>          cluster.doAssignRegion(region, server);<a name="line.1569"></a>
+<span class="sourceLineNo">1570</span>        }<a name="line.1570"></a>
+<span class="sourceLineNo">1571</span>      }<a name="line.1571"></a>
+<span class="sourceLineNo">1572</span>      assignments.put(server, serverRegions);<a name="line.1572"></a>
+<span class="sourceLineNo">1573</span>      regionIdx++;<a name="line.1573"></a>
+<span class="sourceLineNo">1574</span>    }<a name="line.1574"></a>
+<span class="sourceLineNo">1575</span>  }<a name="line.1575"></a>
+<span class="sourceLineNo">1576</span><a name="line.1576"></a>
+<span class="sourceLineNo">1577</span>  protected Map&lt;ServerName, List&lt;RegionInfo&gt;&gt; getRegionAssignmentsByServer(<a name="line.1577"></a>
+<span class="sourceLineNo">1578</span>    Collection&lt;RegionInfo&gt; regions) {<a name="line.1578"></a>
+<span class="sourceLineNo">1579</span>    if (this.services != null &amp;&amp; this.services.getAssignmentManager() != null) {<a name="line.1579"></a>
+<span class="sourceLineNo">1580</span>      return this.services.getAssignmentManager().getSnapShotOfAssignment(regions);<a name="line.1580"></a>
+<span class="sourceLineNo">1581</span>    } else {<a name="line.1581"></a>
+<span class="sourceLineNo">1582</span>      return new HashMap&lt;&gt;();<a name="line.1582"></a>
+<span class="sourceLineNo">1583</span>    }<a name="line.1583"></a>
+<span class="sourceLineNo">1584</span>  }<a name="line.1584"></a>
+<span class="sourceLineNo">1585</span><a name="line.1585"></a>
+<span class="sourceLineNo">1586</span>  @Override<a name="line.1586"></a>
+<span class="sourceLineNo">1587</span>  public void onConfigurationChange(Configuration conf) {<a name="line.1587"></a>
+<span class="sourceLineNo">1588</span>  }<a name="line.1588"></a>
+<span class="sourceLineNo">1589</span>}<a name="line.1589"></a>
 
 
 


[15/29] hbase-site git commit: Published site at 477f9fdb32873387231c5fbbff130ba8bf7b5d68.

Posted by gi...@apache.org.
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/621479e1/devapidocs/src-html/org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.Cluster.Action.Type.html
----------------------------------------------------------------------
diff --git a/devapidocs/src-html/org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.Cluster.Action.Type.html b/devapidocs/src-html/org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.Cluster.Action.Type.html
index 7f42212..d4bf03c 100644
--- a/devapidocs/src-html/org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.Cluster.Action.Type.html
+++ b/devapidocs/src-html/org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.Cluster.Action.Type.html
@@ -1159,434 +1159,442 @@
 <span class="sourceLineNo">1151</span>    }<a name="line.1151"></a>
 <span class="sourceLineNo">1152</span>  }<a name="line.1152"></a>
 <span class="sourceLineNo">1153</span><a name="line.1153"></a>
-<span class="sourceLineNo">1154</span>  public void setRackManager(RackManager rackManager) {<a name="line.1154"></a>
-<span class="sourceLineNo">1155</span>    this.rackManager = rackManager;<a name="line.1155"></a>
-<span class="sourceLineNo">1156</span>  }<a name="line.1156"></a>
-<span class="sourceLineNo">1157</span><a name="line.1157"></a>
-<span class="sourceLineNo">1158</span>  protected boolean needsBalance(Cluster c) {<a name="line.1158"></a>
-<span class="sourceLineNo">1159</span>    ClusterLoadState cs = new ClusterLoadState(c.clusterState);<a name="line.1159"></a>
-<span class="sourceLineNo">1160</span>    if (cs.getNumServers() &lt; MIN_SERVER_BALANCE) {<a name="line.1160"></a>
-<span class="sourceLineNo">1161</span>      if (LOG.isDebugEnabled()) {<a name="line.1161"></a>
-<span class="sourceLineNo">1162</span>        LOG.debug("Not running balancer because only " + cs.getNumServers()<a name="line.1162"></a>
-<span class="sourceLineNo">1163</span>            + " active regionserver(s)");<a name="line.1163"></a>
-<span class="sourceLineNo">1164</span>      }<a name="line.1164"></a>
-<span class="sourceLineNo">1165</span>      return false;<a name="line.1165"></a>
-<span class="sourceLineNo">1166</span>    }<a name="line.1166"></a>
-<span class="sourceLineNo">1167</span>    if(areSomeRegionReplicasColocated(c)) return true;<a name="line.1167"></a>
-<span class="sourceLineNo">1168</span>    // Check if we even need to do any load balancing<a name="line.1168"></a>
-<span class="sourceLineNo">1169</span>    // HBASE-3681 check sloppiness first<a name="line.1169"></a>
-<span class="sourceLineNo">1170</span>    float average = cs.getLoadAverage(); // for logging<a name="line.1170"></a>
-<span class="sourceLineNo">1171</span>    int floor = (int) Math.floor(average * (1 - slop));<a name="line.1171"></a>
-<span class="sourceLineNo">1172</span>    int ceiling = (int) Math.ceil(average * (1 + slop));<a name="line.1172"></a>
-<span class="sourceLineNo">1173</span>    if (!(cs.getMaxLoad() &gt; ceiling || cs.getMinLoad() &lt; floor)) {<a name="line.1173"></a>
-<span class="sourceLineNo">1174</span>      NavigableMap&lt;ServerAndLoad, List&lt;RegionInfo&gt;&gt; serversByLoad = cs.getServersByLoad();<a name="line.1174"></a>
-<span class="sourceLineNo">1175</span>      if (LOG.isTraceEnabled()) {<a name="line.1175"></a>
-<span class="sourceLineNo">1176</span>        // If nothing to balance, then don't say anything unless trace-level logging.<a name="line.1176"></a>
-<span class="sourceLineNo">1177</span>        LOG.trace("Skipping load balancing because balanced cluster; " +<a name="line.1177"></a>
-<span class="sourceLineNo">1178</span>          "servers=" + cs.getNumServers() +<a name="line.1178"></a>
-<span class="sourceLineNo">1179</span>          " regions=" + cs.getNumRegions() + " average=" + average +<a name="line.1179"></a>
-<span class="sourceLineNo">1180</span>          " mostloaded=" + serversByLoad.lastKey().getLoad() +<a name="line.1180"></a>
-<span class="sourceLineNo">1181</span>          " leastloaded=" + serversByLoad.firstKey().getLoad());<a name="line.1181"></a>
-<span class="sourceLineNo">1182</span>      }<a name="line.1182"></a>
-<span class="sourceLineNo">1183</span>      return false;<a name="line.1183"></a>
-<span class="sourceLineNo">1184</span>    }<a name="line.1184"></a>
-<span class="sourceLineNo">1185</span>    return true;<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>   * Subclasses should implement this to return true if the cluster has nodes that hosts<a name="line.1189"></a>
-<span class="sourceLineNo">1190</span>   * multiple replicas for the same region, or, if there are multiple racks and the same<a name="line.1190"></a>
-<span class="sourceLineNo">1191</span>   * rack hosts replicas of the same region<a name="line.1191"></a>
-<span class="sourceLineNo">1192</span>   * @param c Cluster information<a name="line.1192"></a>
-<span class="sourceLineNo">1193</span>   * @return whether region replicas are currently co-located<a name="line.1193"></a>
-<span class="sourceLineNo">1194</span>   */<a name="line.1194"></a>
-<span class="sourceLineNo">1195</span>  protected boolean areSomeRegionReplicasColocated(Cluster c) {<a name="line.1195"></a>
-<span class="sourceLineNo">1196</span>    return false;<a name="line.1196"></a>
-<span class="sourceLineNo">1197</span>  }<a name="line.1197"></a>
-<span class="sourceLineNo">1198</span><a name="line.1198"></a>
-<span class="sourceLineNo">1199</span>  /**<a name="line.1199"></a>
-<span class="sourceLineNo">1200</span>   * Generates a bulk assignment plan to be used on cluster startup using a<a name="line.1200"></a>
-<span class="sourceLineNo">1201</span>   * simple round-robin assignment.<a name="line.1201"></a>
-<span class="sourceLineNo">1202</span>   * &lt;p&gt;<a name="line.1202"></a>
-<span class="sourceLineNo">1203</span>   * Takes a list of all the regions and all the servers in the cluster and<a name="line.1203"></a>
-<span class="sourceLineNo">1204</span>   * returns a map of each server to the regions that it should be assigned.<a name="line.1204"></a>
-<span class="sourceLineNo">1205</span>   * &lt;p&gt;<a name="line.1205"></a>
-<span class="sourceLineNo">1206</span>   * Currently implemented as a round-robin assignment. Same invariant as load<a name="line.1206"></a>
-<span class="sourceLineNo">1207</span>   * balancing, all servers holding floor(avg) or ceiling(avg).<a name="line.1207"></a>
-<span class="sourceLineNo">1208</span>   *<a name="line.1208"></a>
-<span class="sourceLineNo">1209</span>   * TODO: Use block locations from HDFS to place regions with their blocks<a name="line.1209"></a>
-<span class="sourceLineNo">1210</span>   *<a name="line.1210"></a>
-<span class="sourceLineNo">1211</span>   * @param regions all regions<a name="line.1211"></a>
-<span class="sourceLineNo">1212</span>   * @param servers all servers<a name="line.1212"></a>
-<span class="sourceLineNo">1213</span>   * @return map of server to the regions it should take, or null if no<a name="line.1213"></a>
-<span class="sourceLineNo">1214</span>   *         assignment is possible (ie. no regions or no servers)<a name="line.1214"></a>
-<span class="sourceLineNo">1215</span>   */<a name="line.1215"></a>
-<span class="sourceLineNo">1216</span>  @Override<a name="line.1216"></a>
-<span class="sourceLineNo">1217</span>  public Map&lt;ServerName, List&lt;RegionInfo&gt;&gt; roundRobinAssignment(List&lt;RegionInfo&gt; regions,<a name="line.1217"></a>
-<span class="sourceLineNo">1218</span>      List&lt;ServerName&gt; servers) throws HBaseIOException {<a name="line.1218"></a>
-<span class="sourceLineNo">1219</span>    metricsBalancer.incrMiscInvocations();<a name="line.1219"></a>
-<span class="sourceLineNo">1220</span>    Map&lt;ServerName, List&lt;RegionInfo&gt;&gt; assignments = assignMasterSystemRegions(regions, servers);<a name="line.1220"></a>
-<span class="sourceLineNo">1221</span>    if (assignments != null &amp;&amp; !assignments.isEmpty()) {<a name="line.1221"></a>
-<span class="sourceLineNo">1222</span>      servers = new ArrayList&lt;&gt;(servers);<a name="line.1222"></a>
-<span class="sourceLineNo">1223</span>      // Guarantee not to put other regions on master<a name="line.1223"></a>
-<span class="sourceLineNo">1224</span>      servers.remove(masterServerName);<a name="line.1224"></a>
-<span class="sourceLineNo">1225</span>      List&lt;RegionInfo&gt; masterRegions = assignments.get(masterServerName);<a name="line.1225"></a>
-<span class="sourceLineNo">1226</span>      if (!masterRegions.isEmpty()) {<a name="line.1226"></a>
-<span class="sourceLineNo">1227</span>        regions = new ArrayList&lt;&gt;(regions);<a name="line.1227"></a>
-<span class="sourceLineNo">1228</span>        regions.removeAll(masterRegions);<a name="line.1228"></a>
-<span class="sourceLineNo">1229</span>      }<a name="line.1229"></a>
-<span class="sourceLineNo">1230</span>    }<a name="line.1230"></a>
-<span class="sourceLineNo">1231</span>    if (regions == null || regions.isEmpty()) {<a name="line.1231"></a>
-<span class="sourceLineNo">1232</span>      return assignments;<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>    int numServers = servers == null ? 0 : servers.size();<a name="line.1235"></a>
-<span class="sourceLineNo">1236</span>    if (numServers == 0) {<a name="line.1236"></a>
-<span class="sourceLineNo">1237</span>      LOG.warn("Wanted to do round robin assignment but no servers to assign to");<a name="line.1237"></a>
-<span class="sourceLineNo">1238</span>      return null;<a name="line.1238"></a>
-<span class="sourceLineNo">1239</span>    }<a name="line.1239"></a>
-<span class="sourceLineNo">1240</span><a name="line.1240"></a>
-<span class="sourceLineNo">1241</span>    // TODO: instead of retainAssignment() and roundRobinAssignment(), we should just run the<a name="line.1241"></a>
-<span class="sourceLineNo">1242</span>    // normal LB.balancerCluster() with unassignedRegions. We only need to have a candidate<a name="line.1242"></a>
-<span class="sourceLineNo">1243</span>    // generator for AssignRegionAction. The LB will ensure the regions are mostly local<a name="line.1243"></a>
-<span class="sourceLineNo">1244</span>    // and balanced. This should also run fast with fewer number of iterations.<a name="line.1244"></a>
-<span class="sourceLineNo">1245</span><a name="line.1245"></a>
-<span class="sourceLineNo">1246</span>    if (numServers == 1) { // Only one server, nothing fancy we can do here<a name="line.1246"></a>
-<span class="sourceLineNo">1247</span>      ServerName server = servers.get(0);<a name="line.1247"></a>
-<span class="sourceLineNo">1248</span>      assignments.put(server, new ArrayList&lt;&gt;(regions));<a name="line.1248"></a>
-<span class="sourceLineNo">1249</span>      return assignments;<a name="line.1249"></a>
-<span class="sourceLineNo">1250</span>    }<a name="line.1250"></a>
-<span class="sourceLineNo">1251</span><a name="line.1251"></a>
-<span class="sourceLineNo">1252</span>    Cluster cluster = createCluster(servers, regions, false);<a name="line.1252"></a>
-<span class="sourceLineNo">1253</span>    List&lt;RegionInfo&gt; unassignedRegions = new ArrayList&lt;&gt;();<a name="line.1253"></a>
-<span class="sourceLineNo">1254</span><a name="line.1254"></a>
-<span class="sourceLineNo">1255</span>    roundRobinAssignment(cluster, regions, unassignedRegions,<a name="line.1255"></a>
-<span class="sourceLineNo">1256</span>      servers, assignments);<a name="line.1256"></a>
-<span class="sourceLineNo">1257</span><a name="line.1257"></a>
-<span class="sourceLineNo">1258</span>    List&lt;RegionInfo&gt; lastFewRegions = new ArrayList&lt;&gt;();<a name="line.1258"></a>
-<span class="sourceLineNo">1259</span>    // assign the remaining by going through the list and try to assign to servers one-by-one<a name="line.1259"></a>
-<span class="sourceLineNo">1260</span>    int serverIdx = RANDOM.nextInt(numServers);<a name="line.1260"></a>
-<span class="sourceLineNo">1261</span>    for (RegionInfo region : unassignedRegions) {<a name="line.1261"></a>
-<span class="sourceLineNo">1262</span>      boolean assigned = false;<a name="line.1262"></a>
-<span class="sourceLineNo">1263</span>      for (int j = 0; j &lt; numServers; j++) { // try all servers one by one<a name="line.1263"></a>
-<span class="sourceLineNo">1264</span>        ServerName serverName = servers.get((j + serverIdx) % numServers);<a name="line.1264"></a>
-<span class="sourceLineNo">1265</span>        if (!cluster.wouldLowerAvailability(region, serverName)) {<a name="line.1265"></a>
-<span class="sourceLineNo">1266</span>          List&lt;RegionInfo&gt; serverRegions =<a name="line.1266"></a>
-<span class="sourceLineNo">1267</span>              assignments.computeIfAbsent(serverName, k -&gt; new ArrayList&lt;&gt;());<a name="line.1267"></a>
-<span class="sourceLineNo">1268</span>          serverRegions.add(region);<a name="line.1268"></a>
-<span class="sourceLineNo">1269</span>          cluster.doAssignRegion(region, serverName);<a name="line.1269"></a>
-<span class="sourceLineNo">1270</span>          serverIdx = (j + serverIdx + 1) % numServers; //remain from next server<a name="line.1270"></a>
-<span class="sourceLineNo">1271</span>          assigned = true;<a name="line.1271"></a>
-<span class="sourceLineNo">1272</span>          break;<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>      if (!assigned) {<a name="line.1275"></a>
-<span class="sourceLineNo">1276</span>        lastFewRegions.add(region);<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>    // just sprinkle the rest of the regions on random regionservers. The balanceCluster will<a name="line.1279"></a>
-<span class="sourceLineNo">1280</span>    // make it optimal later. we can end up with this if numReplicas &gt; numServers.<a name="line.1280"></a>
-<span class="sourceLineNo">1281</span>    for (RegionInfo region : lastFewRegions) {<a name="line.1281"></a>
-<span class="sourceLineNo">1282</span>      int i = RANDOM.nextInt(numServers);<a name="line.1282"></a>
-<span class="sourceLineNo">1283</span>      ServerName server = servers.get(i);<a name="line.1283"></a>
-<span class="sourceLineNo">1284</span>      List&lt;RegionInfo&gt; serverRegions = assignments.computeIfAbsent(server, k -&gt; new ArrayList&lt;&gt;());<a name="line.1284"></a>
-<span class="sourceLineNo">1285</span>      serverRegions.add(region);<a name="line.1285"></a>
-<span class="sourceLineNo">1286</span>      cluster.doAssignRegion(region, server);<a name="line.1286"></a>
-<span class="sourceLineNo">1287</span>    }<a name="line.1287"></a>
-<span class="sourceLineNo">1288</span>    return assignments;<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>  protected Cluster createCluster(List&lt;ServerName&gt; servers,<a name="line.1291"></a>
-<span class="sourceLineNo">1292</span>      Collection&lt;RegionInfo&gt; regions, boolean forceRefresh) {<a name="line.1292"></a>
-<span class="sourceLineNo">1293</span>    if (forceRefresh &amp;&amp; useRegionFinder) {<a name="line.1293"></a>
-<span class="sourceLineNo">1294</span>      regionFinder.refreshAndWait(regions);<a name="line.1294"></a>
-<span class="sourceLineNo">1295</span>    }<a name="line.1295"></a>
-<span class="sourceLineNo">1296</span>    // Get the snapshot of the current assignments for the regions in question, and then create<a name="line.1296"></a>
-<span class="sourceLineNo">1297</span>    // a cluster out of it. Note that we might have replicas already assigned to some servers<a name="line.1297"></a>
-<span class="sourceLineNo">1298</span>    // earlier. So we want to get the snapshot to see those assignments, but this will only contain<a name="line.1298"></a>
-<span class="sourceLineNo">1299</span>    // replicas of the regions that are passed (for performance).<a name="line.1299"></a>
-<span class="sourceLineNo">1300</span>    Map&lt;ServerName, List&lt;RegionInfo&gt;&gt; clusterState = getRegionAssignmentsByServer(regions);<a name="line.1300"></a>
-<span class="sourceLineNo">1301</span><a name="line.1301"></a>
-<span class="sourceLineNo">1302</span>    for (ServerName server : servers) {<a name="line.1302"></a>
-<span class="sourceLineNo">1303</span>      if (!clusterState.containsKey(server)) {<a name="line.1303"></a>
-<span class="sourceLineNo">1304</span>        clusterState.put(server, EMPTY_REGION_LIST);<a name="line.1304"></a>
-<span class="sourceLineNo">1305</span>      }<a name="line.1305"></a>
-<span class="sourceLineNo">1306</span>    }<a name="line.1306"></a>
-<span class="sourceLineNo">1307</span>    return new Cluster(regions, clusterState, null, this.regionFinder,<a name="line.1307"></a>
-<span class="sourceLineNo">1308</span>        rackManager);<a name="line.1308"></a>
-<span class="sourceLineNo">1309</span>  }<a name="line.1309"></a>
+<span class="sourceLineNo">1154</span>  @Override<a name="line.1154"></a>
+<span class="sourceLineNo">1155</span>  public void postMasterStartupInitialize() {<a name="line.1155"></a>
+<span class="sourceLineNo">1156</span>    if (services != null &amp;&amp; regionFinder != null) {<a name="line.1156"></a>
+<span class="sourceLineNo">1157</span>      try {<a name="line.1157"></a>
+<span class="sourceLineNo">1158</span>        Set&lt;RegionInfo&gt; regions =<a name="line.1158"></a>
+<span class="sourceLineNo">1159</span>            services.getAssignmentManager().getRegionStates().getRegionAssignments().keySet();<a name="line.1159"></a>
+<span class="sourceLineNo">1160</span>        regionFinder.refreshAndWait(regions);<a name="line.1160"></a>
+<span class="sourceLineNo">1161</span>      } catch (Exception e) {<a name="line.1161"></a>
+<span class="sourceLineNo">1162</span>        LOG.warn("Refreshing region HDFS Block dist failed with exception, ignoring", e);<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>  }<a name="line.1165"></a>
+<span class="sourceLineNo">1166</span><a name="line.1166"></a>
+<span class="sourceLineNo">1167</span>  public void setRackManager(RackManager rackManager) {<a name="line.1167"></a>
+<span class="sourceLineNo">1168</span>    this.rackManager = rackManager;<a name="line.1168"></a>
+<span class="sourceLineNo">1169</span>  }<a name="line.1169"></a>
+<span class="sourceLineNo">1170</span><a name="line.1170"></a>
+<span class="sourceLineNo">1171</span>  protected boolean needsBalance(Cluster c) {<a name="line.1171"></a>
+<span class="sourceLineNo">1172</span>    ClusterLoadState cs = new ClusterLoadState(c.clusterState);<a name="line.1172"></a>
+<span class="sourceLineNo">1173</span>    if (cs.getNumServers() &lt; MIN_SERVER_BALANCE) {<a name="line.1173"></a>
+<span class="sourceLineNo">1174</span>      if (LOG.isDebugEnabled()) {<a name="line.1174"></a>
+<span class="sourceLineNo">1175</span>        LOG.debug("Not running balancer because only " + cs.getNumServers()<a name="line.1175"></a>
+<span class="sourceLineNo">1176</span>            + " active regionserver(s)");<a name="line.1176"></a>
+<span class="sourceLineNo">1177</span>      }<a name="line.1177"></a>
+<span class="sourceLineNo">1178</span>      return false;<a name="line.1178"></a>
+<span class="sourceLineNo">1179</span>    }<a name="line.1179"></a>
+<span class="sourceLineNo">1180</span>    if(areSomeRegionReplicasColocated(c)) return true;<a name="line.1180"></a>
+<span class="sourceLineNo">1181</span>    // Check if we even need to do any load balancing<a name="line.1181"></a>
+<span class="sourceLineNo">1182</span>    // HBASE-3681 check sloppiness first<a name="line.1182"></a>
+<span class="sourceLineNo">1183</span>    float average = cs.getLoadAverage(); // for logging<a name="line.1183"></a>
+<span class="sourceLineNo">1184</span>    int floor = (int) Math.floor(average * (1 - slop));<a name="line.1184"></a>
+<span class="sourceLineNo">1185</span>    int ceiling = (int) Math.ceil(average * (1 + slop));<a name="line.1185"></a>
+<span class="sourceLineNo">1186</span>    if (!(cs.getMaxLoad() &gt; ceiling || cs.getMinLoad() &lt; floor)) {<a name="line.1186"></a>
+<span class="sourceLineNo">1187</span>      NavigableMap&lt;ServerAndLoad, List&lt;RegionInfo&gt;&gt; serversByLoad = cs.getServersByLoad();<a name="line.1187"></a>
+<span class="sourceLineNo">1188</span>      if (LOG.isTraceEnabled()) {<a name="line.1188"></a>
+<span class="sourceLineNo">1189</span>        // If nothing to balance, then don't say anything unless trace-level logging.<a name="line.1189"></a>
+<span class="sourceLineNo">1190</span>        LOG.trace("Skipping load balancing because balanced cluster; " +<a name="line.1190"></a>
+<span class="sourceLineNo">1191</span>          "servers=" + cs.getNumServers() +<a name="line.1191"></a>
+<span class="sourceLineNo">1192</span>          " regions=" + cs.getNumRegions() + " average=" + average +<a name="line.1192"></a>
+<span class="sourceLineNo">1193</span>          " mostloaded=" + serversByLoad.lastKey().getLoad() +<a name="line.1193"></a>
+<span class="sourceLineNo">1194</span>          " leastloaded=" + serversByLoad.firstKey().getLoad());<a name="line.1194"></a>
+<span class="sourceLineNo">1195</span>      }<a name="line.1195"></a>
+<span class="sourceLineNo">1196</span>      return false;<a name="line.1196"></a>
+<span class="sourceLineNo">1197</span>    }<a name="line.1197"></a>
+<span class="sourceLineNo">1198</span>    return true;<a name="line.1198"></a>
+<span class="sourceLineNo">1199</span>  }<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>   * Subclasses should implement this to return true if the cluster has nodes that hosts<a name="line.1202"></a>
+<span class="sourceLineNo">1203</span>   * multiple replicas for the same region, or, if there are multiple racks and the same<a name="line.1203"></a>
+<span class="sourceLineNo">1204</span>   * rack hosts replicas of the same region<a name="line.1204"></a>
+<span class="sourceLineNo">1205</span>   * @param c Cluster information<a name="line.1205"></a>
+<span class="sourceLineNo">1206</span>   * @return whether region replicas are currently co-located<a name="line.1206"></a>
+<span class="sourceLineNo">1207</span>   */<a name="line.1207"></a>
+<span class="sourceLineNo">1208</span>  protected boolean areSomeRegionReplicasColocated(Cluster c) {<a name="line.1208"></a>
+<span class="sourceLineNo">1209</span>    return false;<a name="line.1209"></a>
+<span class="sourceLineNo">1210</span>  }<a name="line.1210"></a>
+<span class="sourceLineNo">1211</span><a name="line.1211"></a>
+<span class="sourceLineNo">1212</span>  /**<a name="line.1212"></a>
+<span class="sourceLineNo">1213</span>   * Generates a bulk assignment plan to be used on cluster startup using a<a name="line.1213"></a>
+<span class="sourceLineNo">1214</span>   * simple round-robin assignment.<a name="line.1214"></a>
+<span class="sourceLineNo">1215</span>   * &lt;p&gt;<a name="line.1215"></a>
+<span class="sourceLineNo">1216</span>   * Takes a list of all the regions and all the servers in the cluster and<a name="line.1216"></a>
+<span class="sourceLineNo">1217</span>   * returns a map of each server to the regions that it should be assigned.<a name="line.1217"></a>
+<span class="sourceLineNo">1218</span>   * &lt;p&gt;<a name="line.1218"></a>
+<span class="sourceLineNo">1219</span>   * Currently implemented as a round-robin assignment. Same invariant as load<a name="line.1219"></a>
+<span class="sourceLineNo">1220</span>   * balancing, all servers holding floor(avg) or ceiling(avg).<a name="line.1220"></a>
+<span class="sourceLineNo">1221</span>   *<a name="line.1221"></a>
+<span class="sourceLineNo">1222</span>   * TODO: Use block locations from HDFS to place regions with their blocks<a name="line.1222"></a>
+<span class="sourceLineNo">1223</span>   *<a name="line.1223"></a>
+<span class="sourceLineNo">1224</span>   * @param regions all regions<a name="line.1224"></a>
+<span class="sourceLineNo">1225</span>   * @param servers all servers<a name="line.1225"></a>
+<span class="sourceLineNo">1226</span>   * @return map of server to the regions it should take, or null if no<a name="line.1226"></a>
+<span class="sourceLineNo">1227</span>   *         assignment is possible (ie. no regions or no servers)<a name="line.1227"></a>
+<span class="sourceLineNo">1228</span>   */<a name="line.1228"></a>
+<span class="sourceLineNo">1229</span>  @Override<a name="line.1229"></a>
+<span class="sourceLineNo">1230</span>  public Map&lt;ServerName, List&lt;RegionInfo&gt;&gt; roundRobinAssignment(List&lt;RegionInfo&gt; regions,<a name="line.1230"></a>
+<span class="sourceLineNo">1231</span>      List&lt;ServerName&gt; servers) throws HBaseIOException {<a name="line.1231"></a>
+<span class="sourceLineNo">1232</span>    metricsBalancer.incrMiscInvocations();<a name="line.1232"></a>
+<span class="sourceLineNo">1233</span>    Map&lt;ServerName, List&lt;RegionInfo&gt;&gt; assignments = assignMasterSystemRegions(regions, servers);<a name="line.1233"></a>
+<span class="sourceLineNo">1234</span>    if (assignments != null &amp;&amp; !assignments.isEmpty()) {<a name="line.1234"></a>
+<span class="sourceLineNo">1235</span>      servers = new ArrayList&lt;&gt;(servers);<a name="line.1235"></a>
+<span class="sourceLineNo">1236</span>      // Guarantee not to put other regions on master<a name="line.1236"></a>
+<span class="sourceLineNo">1237</span>      servers.remove(masterServerName);<a name="line.1237"></a>
+<span class="sourceLineNo">1238</span>      List&lt;RegionInfo&gt; masterRegions = assignments.get(masterServerName);<a name="line.1238"></a>
+<span class="sourceLineNo">1239</span>      if (!masterRegions.isEmpty()) {<a name="line.1239"></a>
+<span class="sourceLineNo">1240</span>        regions = new ArrayList&lt;&gt;(regions);<a name="line.1240"></a>
+<span class="sourceLineNo">1241</span>        regions.removeAll(masterRegions);<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>    if (regions == null || regions.isEmpty()) {<a name="line.1244"></a>
+<span class="sourceLineNo">1245</span>      return assignments;<a name="line.1245"></a>
+<span class="sourceLineNo">1246</span>    }<a name="line.1246"></a>
+<span class="sourceLineNo">1247</span><a name="line.1247"></a>
+<span class="sourceLineNo">1248</span>    int numServers = servers == null ? 0 : servers.size();<a name="line.1248"></a>
+<span class="sourceLineNo">1249</span>    if (numServers == 0) {<a name="line.1249"></a>
+<span class="sourceLineNo">1250</span>      LOG.warn("Wanted to do round robin assignment but no servers to assign to");<a name="line.1250"></a>
+<span class="sourceLineNo">1251</span>      return null;<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>    // TODO: instead of retainAssignment() and roundRobinAssignment(), we should just run the<a name="line.1254"></a>
+<span class="sourceLineNo">1255</span>    // normal LB.balancerCluster() with unassignedRegions. We only need to have a candidate<a name="line.1255"></a>
+<span class="sourceLineNo">1256</span>    // generator for AssignRegionAction. The LB will ensure the regions are mostly local<a name="line.1256"></a>
+<span class="sourceLineNo">1257</span>    // and balanced. This should also run fast with fewer number of iterations.<a name="line.1257"></a>
+<span class="sourceLineNo">1258</span><a name="line.1258"></a>
+<span class="sourceLineNo">1259</span>    if (numServers == 1) { // Only one server, nothing fancy we can do here<a name="line.1259"></a>
+<span class="sourceLineNo">1260</span>      ServerName server = servers.get(0);<a name="line.1260"></a>
+<span class="sourceLineNo">1261</span>      assignments.put(server, new ArrayList&lt;&gt;(regions));<a name="line.1261"></a>
+<span class="sourceLineNo">1262</span>      return assignments;<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>    Cluster cluster = createCluster(servers, regions);<a name="line.1265"></a>
+<span class="sourceLineNo">1266</span>    List&lt;RegionInfo&gt; unassignedRegions = new ArrayList&lt;&gt;();<a name="line.1266"></a>
+<span class="sourceLineNo">1267</span><a name="line.1267"></a>
+<span class="sourceLineNo">1268</span>    roundRobinAssignment(cluster, regions, unassignedRegions,<a name="line.1268"></a>
+<span class="sourceLineNo">1269</span>      servers, assignments);<a name="line.1269"></a>
+<span class="sourceLineNo">1270</span><a name="line.1270"></a>
+<span class="sourceLineNo">1271</span>    List&lt;RegionInfo&gt; lastFewRegions = new ArrayList&lt;&gt;();<a name="line.1271"></a>
+<span class="sourceLineNo">1272</span>    // assign the remaining by going through the list and try to assign to servers one-by-one<a name="line.1272"></a>
+<span class="sourceLineNo">1273</span>    int serverIdx = RANDOM.nextInt(numServers);<a name="line.1273"></a>
+<span class="sourceLineNo">1274</span>    for (RegionInfo region : unassignedRegions) {<a name="line.1274"></a>
+<span class="sourceLineNo">1275</span>      boolean assigned = false;<a name="line.1275"></a>
+<span class="sourceLineNo">1276</span>      for (int j = 0; j &lt; numServers; j++) { // try all servers one by one<a name="line.1276"></a>
+<span class="sourceLineNo">1277</span>        ServerName serverName = servers.get((j + serverIdx) % numServers);<a name="line.1277"></a>
+<span class="sourceLineNo">1278</span>        if (!cluster.wouldLowerAvailability(region, serverName)) {<a name="line.1278"></a>
+<span class="sourceLineNo">1279</span>          List&lt;RegionInfo&gt; serverRegions =<a name="line.1279"></a>
+<span class="sourceLineNo">1280</span>              assignments.computeIfAbsent(serverName, k -&gt; new ArrayList&lt;&gt;());<a name="line.1280"></a>
+<span class="sourceLineNo">1281</span>          serverRegions.add(region);<a name="line.1281"></a>
+<span class="sourceLineNo">1282</span>          cluster.doAssignRegion(region, serverName);<a name="line.1282"></a>
+<span class="sourceLineNo">1283</span>          serverIdx = (j + serverIdx + 1) % numServers; //remain from next server<a name="line.1283"></a>
+<span class="sourceLineNo">1284</span>          assigned = true;<a name="line.1284"></a>
+<span class="sourceLineNo">1285</span>          break;<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>      if (!assigned) {<a name="line.1288"></a>
+<span class="sourceLineNo">1289</span>        lastFewRegions.add(region);<a name="line.1289"></a>
+<span class="sourceLineNo">1290</span>      }<a name="line.1290"></a>
+<span class="sourceLineNo">1291</span>    }<a name="line.1291"></a>
+<span class="sourceLineNo">1292</span>    // just sprinkle the rest of the regions on random regionservers. The balanceCluster will<a name="line.1292"></a>
+<span class="sourceLineNo">1293</span>    // make it optimal later. we can end up with this if numReplicas &gt; numServers.<a name="line.1293"></a>
+<span class="sourceLineNo">1294</span>    for (RegionInfo region : lastFewRegions) {<a name="line.1294"></a>
+<span class="sourceLineNo">1295</span>      int i = RANDOM.nextInt(numServers);<a name="line.1295"></a>
+<span class="sourceLineNo">1296</span>      ServerName server = servers.get(i);<a name="line.1296"></a>
+<span class="sourceLineNo">1297</span>      List&lt;RegionInfo&gt; serverRegions = assignments.computeIfAbsent(server, k -&gt; new ArrayList&lt;&gt;());<a name="line.1297"></a>
+<span class="sourceLineNo">1298</span>      serverRegions.add(region);<a name="line.1298"></a>
+<span class="sourceLineNo">1299</span>      cluster.doAssignRegion(region, server);<a name="line.1299"></a>
+<span class="sourceLineNo">1300</span>    }<a name="line.1300"></a>
+<span class="sourceLineNo">1301</span>    return assignments;<a name="line.1301"></a>
+<span class="sourceLineNo">1302</span>  }<a name="line.1302"></a>
+<span class="sourceLineNo">1303</span><a name="line.1303"></a>
+<span class="sourceLineNo">1304</span>  protected Cluster createCluster(List&lt;ServerName&gt; servers, Collection&lt;RegionInfo&gt; regions) {<a name="line.1304"></a>
+<span class="sourceLineNo">1305</span>    // Get the snapshot of the current assignments for the regions in question, and then create<a name="line.1305"></a>
+<span class="sourceLineNo">1306</span>    // a cluster out of it. Note that we might have replicas already assigned to some servers<a name="line.1306"></a>
+<span class="sourceLineNo">1307</span>    // earlier. So we want to get the snapshot to see those assignments, but this will only contain<a name="line.1307"></a>
+<span class="sourceLineNo">1308</span>    // replicas of the regions that are passed (for performance).<a name="line.1308"></a>
+<span class="sourceLineNo">1309</span>    Map&lt;ServerName, List&lt;RegionInfo&gt;&gt; clusterState = getRegionAssignmentsByServer(regions);<a name="line.1309"></a>
 <span class="sourceLineNo">1310</span><a name="line.1310"></a>
-<span class="sourceLineNo">1311</span>  private List&lt;ServerName&gt; findIdleServers(List&lt;ServerName&gt; servers) {<a name="line.1311"></a>
-<span class="sourceLineNo">1312</span>    return this.services.getServerManager()<a name="line.1312"></a>
-<span class="sourceLineNo">1313</span>            .getOnlineServersListWithPredicator(servers, IDLE_SERVER_PREDICATOR);<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>  /**<a name="line.1316"></a>
-<span class="sourceLineNo">1317</span>   * Used to assign a single region to a random server.<a name="line.1317"></a>
-<span class="sourceLineNo">1318</span>   */<a name="line.1318"></a>
-<span class="sourceLineNo">1319</span>  @Override<a name="line.1319"></a>
-<span class="sourceLineNo">1320</span>  public ServerName randomAssignment(RegionInfo regionInfo, List&lt;ServerName&gt; servers)<a name="line.1320"></a>
-<span class="sourceLineNo">1321</span>      throws HBaseIOException {<a name="line.1321"></a>
-<span class="sourceLineNo">1322</span>    metricsBalancer.incrMiscInvocations();<a name="line.1322"></a>
-<span class="sourceLineNo">1323</span>    if (servers != null &amp;&amp; servers.contains(masterServerName)) {<a name="line.1323"></a>
-<span class="sourceLineNo">1324</span>      if (shouldBeOnMaster(regionInfo)) {<a name="line.1324"></a>
-<span class="sourceLineNo">1325</span>        return masterServerName;<a name="line.1325"></a>
-<span class="sourceLineNo">1326</span>      }<a name="line.1326"></a>
-<span class="sourceLineNo">1327</span>      if (!LoadBalancer.isTablesOnMaster(getConf())) {<a name="line.1327"></a>
-<span class="sourceLineNo">1328</span>        // Guarantee we do not put any regions on master<a name="line.1328"></a>
-<span class="sourceLineNo">1329</span>        servers = new ArrayList&lt;&gt;(servers);<a name="line.1329"></a>
-<span class="sourceLineNo">1330</span>        servers.remove(masterServerName);<a name="line.1330"></a>
-<span class="sourceLineNo">1331</span>      }<a name="line.1331"></a>
-<span class="sourceLineNo">1332</span>    }<a name="line.1332"></a>
-<span class="sourceLineNo">1333</span><a name="line.1333"></a>
-<span class="sourceLineNo">1334</span>    int numServers = servers == null ? 0 : servers.size();<a name="line.1334"></a>
-<span class="sourceLineNo">1335</span>    if (numServers == 0) {<a name="line.1335"></a>
-<span class="sourceLineNo">1336</span>      LOG.warn("Wanted to retain assignment but no servers to assign to");<a name="line.1336"></a>
-<span class="sourceLineNo">1337</span>      return null;<a name="line.1337"></a>
-<span class="sourceLineNo">1338</span>    }<a name="line.1338"></a>
-<span class="sourceLineNo">1339</span>    if (numServers == 1) { // Only one server, nothing fancy we can do here<a name="line.1339"></a>
-<span class="sourceLineNo">1340</span>      return servers.get(0);<a name="line.1340"></a>
+<span class="sourceLineNo">1311</span>    for (ServerName server : servers) {<a name="line.1311"></a>
+<span class="sourceLineNo">1312</span>      if (!clusterState.containsKey(server)) {<a name="line.1312"></a>
+<span class="sourceLineNo">1313</span>        clusterState.put(server, EMPTY_REGION_LIST);<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>    return new Cluster(regions, clusterState, null, this.regionFinder,<a name="line.1316"></a>
+<span class="sourceLineNo">1317</span>        rackManager);<a name="line.1317"></a>
+<span class="sourceLineNo">1318</span>  }<a name="line.1318"></a>
+<span class="sourceLineNo">1319</span><a name="line.1319"></a>
+<span class="sourceLineNo">1320</span>  private List&lt;ServerName&gt; findIdleServers(List&lt;ServerName&gt; servers) {<a name="line.1320"></a>
+<span class="sourceLineNo">1321</span>    return this.services.getServerManager()<a name="line.1321"></a>
+<span class="sourceLineNo">1322</span>            .getOnlineServersListWithPredicator(servers, IDLE_SERVER_PREDICATOR);<a name="line.1322"></a>
+<span class="sourceLineNo">1323</span>  }<a name="line.1323"></a>
+<span class="sourceLineNo">1324</span><a name="line.1324"></a>
+<span class="sourceLineNo">1325</span>  /**<a name="line.1325"></a>
+<span class="sourceLineNo">1326</span>   * Used to assign a single region to a random server.<a name="line.1326"></a>
+<span class="sourceLineNo">1327</span>   */<a name="line.1327"></a>
+<span class="sourceLineNo">1328</span>  @Override<a name="line.1328"></a>
+<span class="sourceLineNo">1329</span>  public ServerName randomAssignment(RegionInfo regionInfo, List&lt;ServerName&gt; servers)<a name="line.1329"></a>
+<span class="sourceLineNo">1330</span>      throws HBaseIOException {<a name="line.1330"></a>
+<span class="sourceLineNo">1331</span>    metricsBalancer.incrMiscInvocations();<a name="line.1331"></a>
+<span class="sourceLineNo">1332</span>    if (servers != null &amp;&amp; servers.contains(masterServerName)) {<a name="line.1332"></a>
+<span class="sourceLineNo">1333</span>      if (shouldBeOnMaster(regionInfo)) {<a name="line.1333"></a>
+<span class="sourceLineNo">1334</span>        return masterServerName;<a name="line.1334"></a>
+<span class="sourceLineNo">1335</span>      }<a name="line.1335"></a>
+<span class="sourceLineNo">1336</span>      if (!LoadBalancer.isTablesOnMaster(getConf())) {<a name="line.1336"></a>
+<span class="sourceLineNo">1337</span>        // Guarantee we do not put any regions on master<a name="line.1337"></a>
+<span class="sourceLineNo">1338</span>        servers = new ArrayList&lt;&gt;(servers);<a name="line.1338"></a>
+<span class="sourceLineNo">1339</span>        servers.remove(masterServerName);<a name="line.1339"></a>
+<span class="sourceLineNo">1340</span>      }<a name="line.1340"></a>
 <span class="sourceLineNo">1341</span>    }<a name="line.1341"></a>
-<span class="sourceLineNo">1342</span>    List&lt;ServerName&gt; idleServers = findIdleServers(servers);<a name="line.1342"></a>
-<span class="sourceLineNo">1343</span>    if (idleServers.size() == 1) {<a name="line.1343"></a>
-<span class="sourceLineNo">1344</span>      return idleServers.get(0);<a name="line.1344"></a>
-<span class="sourceLineNo">1345</span>    }<a name="line.1345"></a>
-<span class="sourceLineNo">1346</span>    final List&lt;ServerName&gt; finalServers = idleServers.isEmpty() ?<a name="line.1346"></a>
-<span class="sourceLineNo">1347</span>            servers : idleServers;<a name="line.1347"></a>
-<span class="sourceLineNo">1348</span>    List&lt;RegionInfo&gt; regions = Lists.newArrayList(regionInfo);<a name="line.1348"></a>
-<span class="sourceLineNo">1349</span>    Cluster cluster = createCluster(finalServers, regions, false);<a name="line.1349"></a>
-<span class="sourceLineNo">1350</span>    return randomAssignment(cluster, regionInfo, finalServers);<a name="line.1350"></a>
-<span class="sourceLineNo">1351</span>  }<a name="line.1351"></a>
-<span class="sourceLineNo">1352</span><a name="line.1352"></a>
-<span class="sourceLineNo">1353</span>  /**<a name="line.1353"></a>
-<span class="sourceLineNo">1354</span>   * Generates a bulk assignment startup plan, attempting to reuse the existing<a name="line.1354"></a>
-<span class="sourceLineNo">1355</span>   * assignment information from META, but adjusting for the specified list of<a name="line.1355"></a>
-<span class="sourceLineNo">1356</span>   * available/online servers available for assignment.<a name="line.1356"></a>
-<span class="sourceLineNo">1357</span>   * &lt;p&gt;<a name="line.1357"></a>
-<span class="sourceLineNo">1358</span>   * Takes a map of all regions to their existing assignment from META. Also<a name="line.1358"></a>
-<span class="sourceLineNo">1359</span>   * takes a list of online servers for regions to be assigned to. Attempts to<a name="line.1359"></a>
-<span class="sourceLineNo">1360</span>   * retain all assignment, so in some instances initial assignment will not be<a name="line.1360"></a>
-<span class="sourceLineNo">1361</span>   * completely balanced.<a name="line.1361"></a>
-<span class="sourceLineNo">1362</span>   * &lt;p&gt;<a name="line.1362"></a>
-<span class="sourceLineNo">1363</span>   * Any leftover regions without an existing server to be assigned to will be<a name="line.1363"></a>
-<span class="sourceLineNo">1364</span>   * assigned randomly to available servers.<a name="line.1364"></a>
-<span class="sourceLineNo">1365</span>   *<a name="line.1365"></a>
-<span class="sourceLineNo">1366</span>   * @param regions regions and existing assignment from meta<a name="line.1366"></a>
-<span class="sourceLineNo">1367</span>   * @param servers available servers<a name="line.1367"></a>
-<span class="sourceLineNo">1368</span>   * @return map of servers and regions to be assigned to them<a name="line.1368"></a>
-<span class="sourceLineNo">1369</span>   */<a name="line.1369"></a>
-<span class="sourceLineNo">1370</span>  @Override<a name="line.1370"></a>
-<span class="sourceLineNo">1371</span>  public Map&lt;ServerName, List&lt;RegionInfo&gt;&gt; retainAssignment(Map&lt;RegionInfo, ServerName&gt; regions,<a name="line.1371"></a>
-<span class="sourceLineNo">1372</span>      List&lt;ServerName&gt; servers) throws HBaseIOException {<a name="line.1372"></a>
-<span class="sourceLineNo">1373</span>    // Update metrics<a name="line.1373"></a>
-<span class="sourceLineNo">1374</span>    metricsBalancer.incrMiscInvocations();<a name="line.1374"></a>
-<span class="sourceLineNo">1375</span>    Map&lt;ServerName, List&lt;RegionInfo&gt;&gt; assignments = assignMasterSystemRegions(regions.keySet(), servers);<a name="line.1375"></a>
-<span class="sourceLineNo">1376</span>    if (assignments != null &amp;&amp; !assignments.isEmpty()) {<a name="line.1376"></a>
-<span class="sourceLineNo">1377</span>      servers = new ArrayList&lt;&gt;(servers);<a name="line.1377"></a>
-<span class="sourceLineNo">1378</span>      // Guarantee not to put other regions on master<a name="line.1378"></a>
-<span class="sourceLineNo">1379</span>      servers.remove(masterServerName);<a name="line.1379"></a>
-<span class="sourceLineNo">1380</span>      List&lt;RegionInfo&gt; masterRegions = assignments.get(masterServerName);<a name="line.1380"></a>
-<span class="sourceLineNo">1381</span>      regions = regions.entrySet().stream().filter(e -&gt; !masterRegions.contains(e.getKey()))<a name="line.1381"></a>
-<span class="sourceLineNo">1382</span>          .collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue));<a name="line.1382"></a>
-<span class="sourceLineNo">1383</span>    }<a name="line.1383"></a>
-<span class="sourceLineNo">1384</span>    if (regions.isEmpty()) {<a name="line.1384"></a>
-<span class="sourceLineNo">1385</span>      return assignments;<a name="line.1385"></a>
-<span class="sourceLineNo">1386</span>    }<a name="line.1386"></a>
-<span class="sourceLineNo">1387</span><a name="line.1387"></a>
-<span class="sourceLineNo">1388</span>    int numServers = servers == null ? 0 : servers.size();<a name="line.1388"></a>
-<span class="sourceLineNo">1389</span>    if (numServers == 0) {<a name="line.1389"></a>
-<span class="sourceLineNo">1390</span>      LOG.warn("Wanted to do retain assignment but no servers to assign to");<a name="line.1390"></a>
-<span class="sourceLineNo">1391</span>      return null;<a name="line.1391"></a>
+<span class="sourceLineNo">1342</span><a name="line.1342"></a>
+<span class="sourceLineNo">1343</span>    int numServers = servers == null ? 0 : servers.size();<a name="line.1343"></a>
+<span class="sourceLineNo">1344</span>    if (numServers == 0) {<a name="line.1344"></a>
+<span class="sourceLineNo">1345</span>      LOG.warn("Wanted to retain assignment but no servers to assign to");<a name="line.1345"></a>
+<span class="sourceLineNo">1346</span>      return null;<a name="line.1346"></a>
+<span class="sourceLineNo">1347</span>    }<a name="line.1347"></a>
+<span class="sourceLineNo">1348</span>    if (numServers == 1) { // Only one server, nothing fancy we can do here<a name="line.1348"></a>
+<span class="sourceLineNo">1349</span>      return servers.get(0);<a name="line.1349"></a>
+<span class="sourceLineNo">1350</span>    }<a name="line.1350"></a>
+<span class="sourceLineNo">1351</span>    List&lt;ServerName&gt; idleServers = findIdleServers(servers);<a name="line.1351"></a>
+<span class="sourceLineNo">1352</span>    if (idleServers.size() == 1) {<a name="line.1352"></a>
+<span class="sourceLineNo">1353</span>      return idleServers.get(0);<a name="line.1353"></a>
+<span class="sourceLineNo">1354</span>    }<a name="line.1354"></a>
+<span class="sourceLineNo">1355</span>    final List&lt;ServerName&gt; finalServers = idleServers.isEmpty() ?<a name="line.1355"></a>
+<span class="sourceLineNo">1356</span>            servers : idleServers;<a name="line.1356"></a>
+<span class="sourceLineNo">1357</span>    List&lt;RegionInfo&gt; regions = Lists.newArrayList(regionInfo);<a name="line.1357"></a>
+<span class="sourceLineNo">1358</span>    Cluster cluster = createCluster(finalServers, regions);<a name="line.1358"></a>
+<span class="sourceLineNo">1359</span>    return randomAssignment(cluster, regionInfo, finalServers);<a name="line.1359"></a>
+<span class="sourceLineNo">1360</span>  }<a name="line.1360"></a>
+<span class="sourceLineNo">1361</span><a name="line.1361"></a>
+<span class="sourceLineNo">1362</span>  /**<a name="line.1362"></a>
+<span class="sourceLineNo">1363</span>   * Generates a bulk assignment startup plan, attempting to reuse the existing<a name="line.1363"></a>
+<span class="sourceLineNo">1364</span>   * assignment information from META, but adjusting for the specified list of<a name="line.1364"></a>
+<span class="sourceLineNo">1365</span>   * available/online servers available for assignment.<a name="line.1365"></a>
+<span class="sourceLineNo">1366</span>   * &lt;p&gt;<a name="line.1366"></a>
+<span class="sourceLineNo">1367</span>   * Takes a map of all regions to their existing assignment from META. Also<a name="line.1367"></a>
+<span class="sourceLineNo">1368</span>   * takes a list of online servers for regions to be assigned to. Attempts to<a name="line.1368"></a>
+<span class="sourceLineNo">1369</span>   * retain all assignment, so in some instances initial assignment will not be<a name="line.1369"></a>
+<span class="sourceLineNo">1370</span>   * completely balanced.<a name="line.1370"></a>
+<span class="sourceLineNo">1371</span>   * &lt;p&gt;<a name="line.1371"></a>
+<span class="sourceLineNo">1372</span>   * Any leftover regions without an existing server to be assigned to will be<a name="line.1372"></a>
+<span class="sourceLineNo">1373</span>   * assigned randomly to available servers.<a name="line.1373"></a>
+<span class="sourceLineNo">1374</span>   *<a name="line.1374"></a>
+<span class="sourceLineNo">1375</span>   * @param regions regions and existing assignment from meta<a name="line.1375"></a>
+<span class="sourceLineNo">1376</span>   * @param servers available servers<a name="line.1376"></a>
+<span class="sourceLineNo">1377</span>   * @return map of servers and regions to be assigned to them<a name="line.1377"></a>
+<span class="sourceLineNo">1378</span>   */<a name="line.1378"></a>
+<span class="sourceLineNo">1379</span>  @Override<a name="line.1379"></a>
+<span class="sourceLineNo">1380</span>  public Map&lt;ServerName, List&lt;RegionInfo&gt;&gt; retainAssignment(Map&lt;RegionInfo, ServerName&gt; regions,<a name="line.1380"></a>
+<span class="sourceLineNo">1381</span>      List&lt;ServerName&gt; servers) throws HBaseIOException {<a name="line.1381"></a>
+<span class="sourceLineNo">1382</span>    // Update metrics<a name="line.1382"></a>
+<span class="sourceLineNo">1383</span>    metricsBalancer.incrMiscInvocations();<a name="line.1383"></a>
+<span class="sourceLineNo">1384</span>    Map&lt;ServerName, List&lt;RegionInfo&gt;&gt; assignments = assignMasterSystemRegions(regions.keySet(), servers);<a name="line.1384"></a>
+<span class="sourceLineNo">1385</span>    if (assignments != null &amp;&amp; !assignments.isEmpty()) {<a name="line.1385"></a>
+<span class="sourceLineNo">1386</span>      servers = new ArrayList&lt;&gt;(servers);<a name="line.1386"></a>
+<span class="sourceLineNo">1387</span>      // Guarantee not to put other regions on master<a name="line.1387"></a>
+<span class="sourceLineNo">1388</span>      servers.remove(masterServerName);<a name="line.1388"></a>
+<span class="sourceLineNo">1389</span>      List&lt;RegionInfo&gt; masterRegions = assignments.get(masterServerName);<a name="line.1389"></a>
+<span class="sourceLineNo">1390</span>      regions = regions.entrySet().stream().filter(e -&gt; !masterRegions.contains(e.getKey()))<a name="line.1390"></a>
+<span class="sourceLineNo">1391</span>          .collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue));<a name="line.1391"></a>
 <span class="sourceLineNo">1392</span>    }<a name="line.1392"></a>
-<span class="sourceLineNo">1393</span>    if (numServers == 1) { // Only one server, nothing fancy we can do here<a name="line.1393"></a>
-<span class="sourceLineNo">1394</span>      ServerName server = servers.get(0);<a name="line.1394"></a>
-<span class="sourceLineNo">1395</span>      assignments.put(server, new ArrayList&lt;&gt;(regions.keySet()));<a name="line.1395"></a>
-<span class="sourceLineNo">1396</span>      return assignments;<a name="line.1396"></a>
-<span class="sourceLineNo">1397</span>    }<a name="line.1397"></a>
-<span class="sourceLineNo">1398</span><a name="line.1398"></a>
-<span class="sourceLineNo">1399</span>    // Group all of the old assignments by their hostname.<a name="line.1399"></a>
-<span class="sourceLineNo">1400</span>    // We can't group directly by ServerName since the servers all have<a name="line.1400"></a>
-<span class="sourceLineNo">1401</span>    // new start-codes.<a name="line.1401"></a>
-<span class="sourceLineNo">1402</span><a name="line.1402"></a>
-<span class="sourceLineNo">1403</span>    // Group the servers by their hostname. It's possible we have multiple<a name="line.1403"></a>
-<span class="sourceLineNo">1404</span>    // servers on the same host on different ports.<a name="line.1404"></a>
-<span class="sourceLineNo">1405</span>    ArrayListMultimap&lt;String, ServerName&gt; serversByHostname = ArrayListMultimap.create();<a name="line.1405"></a>
-<span class="sourceLineNo">1406</span>    for (ServerName server : servers) {<a name="line.1406"></a>
-<span class="sourceLineNo">1407</span>      assignments.put(server, new ArrayList&lt;&gt;());<a name="line.1407"></a>
-<span class="sourceLineNo">1408</span>      serversByHostname.put(server.getHostnameLowerCase(), server);<a name="line.1408"></a>
-<span class="sourceLineNo">1409</span>    }<a name="line.1409"></a>
-<span class="sourceLineNo">1410</span><a name="line.1410"></a>
-<span class="sourceLineNo">1411</span>    // Collection of the hostnames that used to have regions<a name="line.1411"></a>
-<span class="sourceLineNo">1412</span>    // assigned, but for which we no longer have any RS running<a name="line.1412"></a>
-<span class="sourceLineNo">1413</span>    // after the cluster restart.<a name="line.1413"></a>
-<span class="sourceLineNo">1414</span>    Set&lt;String&gt; oldHostsNoLongerPresent = Sets.newTreeSet();<a name="line.1414"></a>
-<span class="sourceLineNo">1415</span><a name="line.1415"></a>
-<span class="sourceLineNo">1416</span>    // If the old servers aren't present, lets assign those regions later.<a name="line.1416"></a>
-<span class="sourceLineNo">1417</span>    List&lt;RegionInfo&gt; randomAssignRegions = Lists.newArrayList();<a name="line.1417"></a>
-<span class="sourceLineNo">1418</span><a name="line.1418"></a>
-<span class="sourceLineNo">1419</span>    int numRandomAssignments = 0;<a name="line.1419"></a>
-<span class="sourceLineNo">1420</span>    int numRetainedAssigments = 0;<a name="line.1420"></a>
-<span class="sourceLineNo">1421</span><a name="line.1421"></a>
-<span class="sourceLineNo">1422</span>    Cluster cluster = createCluster(servers, regions.keySet(), true);<a name="line.1422"></a>
-<span class="sourceLineNo">1423</span><a name="line.1423"></a>
-<span class="sourceLineNo">1424</span>    for (Map.Entry&lt;RegionInfo, ServerName&gt; entry : regions.entrySet()) {<a name="line.1424"></a>
-<span class="sourceLineNo">1425</span>      RegionInfo region = entry.getKey();<a name="line.1425"></a>
-<span class="sourceLineNo">1426</span>      ServerName oldServerName = entry.getValue();<a name="line.1426"></a>
-<span class="sourceLineNo">1427</span>      List&lt;ServerName&gt; localServers = new ArrayList&lt;&gt;();<a name="line.1427"></a>
-<span class="sourceLineNo">1428</span>      if (oldServerName != null) {<a name="line.1428"></a>
-<span class="sourceLineNo">1429</span>        localServers = serversByHostname.get(oldServerName.getHostnameLowerCase());<a name="line.1429"></a>
-<span class="sourceLineNo">1430</span>      }<a name="line.1430"></a>
-<span class="sourceLineNo">1431</span>      if (localServers.isEmpty()) {<a name="line.1431"></a>
-<span class="sourceLineNo">1432</span>        // No servers on the new cluster match up with this hostname, assign randomly, later.<a name="line.1432"></a>
-<span class="sourceLineNo">1433</span>        randomAssignRegions.add(region);<a name="line.1433"></a>
-<span class="sourceLineNo">1434</span>        if (oldServerName != null) {<a name="line.1434"></a>
-<span class="sourceLineNo">1435</span>          oldHostsNoLongerPresent.add(oldServerName.getHostnameLowerCase());<a name="line.1435"></a>
-<span class="sourceLineNo">1436</span>        }<a name="line.1436"></a>
-<span class="sourceLineNo">1437</span>      } else if (localServers.size() == 1) {<a name="line.1437"></a>
-<span class="sourceLineNo">1438</span>        // the usual case - one new server on same host<a name="line.1438"></a>
-<span class="sourceLineNo">1439</span>        ServerName target = localServers.get(0);<a name="line.1439"></a>
-<span class="sourceLineNo">1440</span>        assignments.get(target).add(region);<a name="line.1440"></a>
-<span class="sourceLineNo">1441</span>        numRetainedAssigments++;<a name="line.1441"></a>
-<span class="sourceLineNo">1442</span>      } else {<a name="line.1442"></a>
-<span class="sourceLineNo">1443</span>        // multiple new servers in the cluster on this same host<a name="line.1443"></a>
-<span class="sourceLineNo">1444</span>        if (localServers.contains(oldServerName)) {<a name="line.1444"></a>
-<span class="sourceLineNo">1445</span>          assignments.get(oldServerName).add(region);<a name="line.1445"></a>
-<span class="sourceLineNo">1446</span>          numRetainedAssigments++;<a name="line.1446"></a>
-<span class="sourceLineNo">1447</span>        } else {<a name="line.1447"></a>
-<span class="sourceLineNo">1448</span>          ServerName target = null;<a name="line.1448"></a>
-<span class="sourceLineNo">1449</span>          for (ServerName tmp : localServers) {<a name="line.1449"></a>
-<span class="sourceLineNo">1450</span>            if (tmp.getPort() == oldServerName.getPort()) {<a name="line.1450"></a>
-<span class="sourceLineNo">1451</span>              target = tmp;<a name="line.1451"></a>
-<span class="sourceLineNo">1452</span>              assignments.get(tmp).add(region);<a name="line.1452"></a>
-<span class="sourceLineNo">1453</span>              numRetainedAssigments++;<a name="line.1453"></a>
-<span class="sourceLineNo">1454</span>              break;<a name="line.1454"></a>
-<span class="sourceLineNo">1455</span>            }<a name="line.1455"></a>
-<span class="sourceLineNo">1456</span>          }<a name="line.1456"></a>
-<span class="sourceLineNo">1457</span>          if (target == null) {<a name="line.1457"></a>
-<span class="sourceLineNo">1458</span>            randomAssignRegions.add(region);<a name="line.1458"></a>
-<span class="sourceLineNo">1459</span>          }<a name="line.1459"></a>
-<span class="sourceLineNo">1460</span>        }<a name="line.1460"></a>
-<span class="sourceLineNo">1461</span>      }<a name="line.1461"></a>
-<span class="sourceLineNo">1462</span>    }<a name="line.1462"></a>
-<span class="sourceLineNo">1463</span><a name="line.1463"></a>
-<span class="sourceLineNo">1464</span>    // If servers from prior assignment aren't present, then lets do randomAssignment on regions.<a name="line.1464"></a>
-<span class="sourceLineNo">1465</span>    if (randomAssignRegions.size() &gt; 0) {<a name="line.1465"></a>
-<span class="sourceLineNo">1466</span>      for (Map.Entry&lt;ServerName, List&lt;RegionInfo&gt;&gt; entry : assignments.entrySet()) {<a name="line.1466"></a>
-<span class="sourceLineNo">1467</span>        ServerName sn = entry.getKey();<a name="line.1467"></a>
-<span class="sourceLineNo">1468</span>        for (RegionInfo region : entry.getValue()) {<a name="line.1468"></a>
-<span class="sourceLineNo">1469</span>          cluster.doAssignRegion(region, sn);<a name="line.1469"></a>
-<span class="sourceLineNo">1470</span>        }<a name="line.1470"></a>
-<span class="sourceLineNo">1471</span>      }<a name="line.1471"></a>
-<span class="sourceLineNo">1472</span>      for (RegionInfo region : randomAssignRegions) {<a name="line.1472"></a>
-<span class="sourceLineNo">1473</span>        ServerName target = randomAssignment(cluster, region, servers);<a name="line.1473"></a>
-<span class="sourceLineNo">1474</span>        assignments.get(target).add(region);<a name="line.1474"></a>
-<span class="sourceLineNo">1475</span>        cluster.doAssignRegion(region, target);<a name="line.1475"></a>
-<span class="sourceLineNo">1476</span>        numRandomAssignments++;<a name="line.1476"></a>
-<span class="sourceLineNo">1477</span>      }<a name="line.1477"></a>
-<span class="sourceLineNo">1478</span>    }<a name="line.1478"></a>
-<span class="sourceLineNo">1479</span><a name="line.1479"></a>
-<span class="sourceLineNo">1480</span>    String randomAssignMsg = "";<a name="line.1480"></a>
-<span class="sourceLineNo">1481</span>    if (numRandomAssignments &gt; 0) {<a name="line.1481"></a>
-<span class="sourceLineNo">1482</span>      randomAssignMsg =<a name="line.1482"></a>
-<span class="sourceLineNo">1483</span>          numRandomAssignments + " regions were assigned "<a name="line.1483"></a>
-<span class="sourceLineNo">1484</span>              + "to random hosts, since the old hosts for these regions are no "<a name="line.1484"></a>
-<span class="sourceLineNo">1485</span>              + "longer present in the cluster. These hosts were:\n  "<a name="line.1485"></a>
-<span class="sourceLineNo">1486</span>              + Joiner.on("\n  ").join(oldHostsNoLongerPresent);<a name="line.1486"></a>
-<span class="sourceLineNo">1487</span>    }<a name="line.1487"></a>
-<span class="sourceLineNo">1488</span><a name="line.1488"></a>
-<span class="sourceLineNo">1489</span>    LOG.info("Reassigned " + regions.size() + " regions. " + numRetainedAssigments<a name="line.1489"></a>
-<span class="sourceLineNo">1490</span>        + " retained the pre-restart assignment. " + randomAssignMsg);<a name="line.1490"></a>
-<span class="sourceLineNo">1491</span>    return assignments;<a name="line.1491"></a>
-<span class="sourceLineNo">1492</span>  }<a name="line.1492"></a>
-<span class="sourceLineNo">1493</span><a name="line.1493"></a>
-<span class="sourceLineNo">1494</span>  @Override<a name="line.1494"></a>
-<span class="sourceLineNo">1495</span>  public void initialize() throws HBaseIOException{<a name="line.1495"></a>
-<span class="sourceLineNo">1496</span>  }<a name="line.1496"></a>
-<span class="sourceLineNo">1497</span><a name="line.1497"></a>
-<span class="sourceLineNo">1498</span>  @Override<a name="line.1498"></a>
-<span class="sourceLineNo">1499</span>  public void regionOnline(RegionInfo regionInfo, ServerName sn) {<a name="line.1499"></a>
+<span class="sourceLineNo">1393</span>    if (regions.isEmpty()) {<a name="line.1393"></a>
+<span class="sourceLineNo">1394</span>      return assignments;<a name="line.1394"></a>
+<span class="sourceLineNo">1395</span>    }<a name="line.1395"></a>
+<span class="sourceLineNo">1396</span><a name="line.1396"></a>
+<span class="sourceLineNo">1397</span>    int numServers = servers == null ? 0 : servers.size();<a name="line.1397"></a>
+<span class="sourceLineNo">1398</span>    if (numServers == 0) {<a name="line.1398"></a>
+<span class="sourceLineNo">1399</span>      LOG.warn("Wanted to do retain assignment but no servers to assign to");<a name="line.1399"></a>
+<span class="sourceLineNo">1400</span>      return null;<a name="line.1400"></a>
+<span class="sourceLineNo">1401</span>    }<a name="line.1401"></a>
+<span class="sourceLineNo">1402</span>    if (numServers == 1) { // Only one server, nothing fancy we can do here<a name="line.1402"></a>
+<span class="sourceLineNo">1403</span>      ServerName server = servers.get(0);<a name="line.1403"></a>
+<span class="sourceLineNo">1404</span>      assignments.put(server, new ArrayList&lt;&gt;(regions.keySet()));<a name="line.1404"></a>
+<span class="sourceLineNo">1405</span>      return assignments;<a name="line.1405"></a>
+<span class="sourceLineNo">1406</span>    }<a name="line.1406"></a>
+<span class="sourceLineNo">1407</span><a name="line.1407"></a>
+<span class="sourceLineNo">1408</span>    // Group all of the old assignments by their hostname.<a name="line.1408"></a>
+<span class="sourceLineNo">1409</span>    // We can't group directly by ServerName since the servers all have<a name="line.1409"></a>
+<span class="sourceLineNo">1410</span>    // new start-codes.<a name="line.1410"></a>
+<span class="sourceLineNo">1411</span><a name="line.1411"></a>
+<span class="sourceLineNo">1412</span>    // Group the servers by their hostname. It's possible we have multiple<a name="line.1412"></a>
+<span class="sourceLineNo">1413</span>    // servers on the same host on different ports.<a name="line.1413"></a>
+<span class="sourceLineNo">1414</span>    ArrayListMultimap&lt;String, ServerName&gt; serversByHostname = ArrayListMultimap.create();<a name="line.1414"></a>
+<span class="sourceLineNo">1415</span>    for (ServerName server : servers) {<a name="line.1415"></a>
+<span class="sourceLineNo">1416</span>      assignments.put(server, new ArrayList&lt;&gt;());<a name="line.1416"></a>
+<span class="sourceLineNo">1417</span>      serversByHostname.put(server.getHostnameLowerCase(), server);<a name="line.1417"></a>
+<span class="sourceLineNo">1418</span>    }<a name="line.1418"></a>
+<span class="sourceLineNo">1419</span><a name="line.1419"></a>
+<span class="sourceLineNo">1420</span>    // Collection of the hostnames that used to have regions<a name="line.1420"></a>
+<span class="sourceLineNo">1421</span>    // assigned, but for which we no longer have any RS running<a name="line.1421"></a>
+<span class="sourceLineNo">1422</span>    // after the cluster restart.<a name="line.1422"></a>
+<span class="sourceLineNo">1423</span>    Set&lt;String&gt; oldHostsNoLongerPresent = Sets.newTreeSet();<a name="line.1423"></a>
+<span class="sourceLineNo">1424</span><a name="line.1424"></a>
+<span class="sourceLineNo">1425</span>    // If the old servers aren't present, lets assign those regions later.<a name="line.1425"></a>
+<span class="sourceLineNo">1426</span>    List&lt;RegionInfo&gt; randomAssignRegions = Lists.newArrayList();<a name="line.1426"></a>
+<span class="sourceLineNo">1427</span><a name="line.1427"></a>
+<span class="sourceLineNo">1428</span>    int numRandomAssignments = 0;<a name="line.1428"></a>
+<span class="sourceLineNo">1429</span>    int numRetainedAssigments = 0;<a name="line.1429"></a>
+<span class="sourceLineNo">1430</span><a name="line.1430"></a>
+<span class="sourceLineNo">1431</span>    for (Map.Entry&lt;RegionInfo, ServerName&gt; entry : regions.entrySet()) {<a name="line.1431"></a>
+<span class="sourceLineNo">1432</span>      RegionInfo region = entry.getKey();<a name="line.1432"></a>
+<span class="sourceLineNo">1433</span>      ServerName oldServerName = entry.getValue();<a name="line.1433"></a>
+<span class="sourceLineNo">1434</span>      List&lt;ServerName&gt; localServers = new ArrayList&lt;&gt;();<a name="line.1434"></a>
+<span class="sourceLineNo">1435</span>      if (oldServerName != null) {<a name="line.1435"></a>
+<span class="sourceLineNo">1436</span>        localServers = serversByHostname.get(oldServerName.getHostnameLowerCase());<a name="line.1436"></a>
+<span class="sourceLineNo">1437</span>      }<a name="line.1437"></a>
+<span class="sourceLineNo">1438</span>      if (localServers.isEmpty()) {<a name="line.1438"></a>
+<span class="sourceLineNo">1439</span>        // No servers on the new cluster match up with this hostname, assign randomly, later.<a name="line.1439"></a>
+<span class="sourceLineNo">1440</span>        randomAssignRegions.add(region);<a name="line.1440"></a>
+<span class="sourceLineNo">1441</span>        if (oldServerName != null) {<a name="line.1441"></a>
+<span class="sourceLineNo">1442</span>          oldHostsNoLongerPresent.add(oldServerName.getHostnameLowerCase());<a name="line.1442"></a>
+<span class="sourceLineNo">1443</span>        }<a name="line.1443"></a>
+<span class="sourceLineNo">1444</span>      } else if (localServers.size() == 1) {<a name="line.1444"></a>
+<span class="sourceLineNo">1445</span>        // the usual case - one new server on same host<a name="line.1445"></a>
+<span class="sourceLineNo">1446</span>        ServerName target = localServers.get(0);<a name="line.1446"></a>
+<span class="sourceLineNo">1447</span>        assignments.get(target).add(region);<a name="line.1447"></a>
+<span class="sourceLineNo">1448</span>        numRetainedAssigments++;<a name="line.1448"></a>
+<span class="sourceLineNo">1449</span>      } else {<a name="line.1449"></a>
+<span class="sourceLineNo">1450</span>        // multiple new servers in the cluster on this same host<a name="line.1450"></a>
+<span class="sourceLineNo">1451</span>        if (localServers.contains(oldServerName)) {<a name="line.1451"></a>
+<span class="sourceLineNo">1452</span>          assignments.get(oldServerName).add(region);<a name="line.1452"></a>
+<span class="sourceLineNo">1453</span>          numRetainedAssigments++;<a name="line.1453"></a>
+<span class="sourceLineNo">1454</span>        } else {<a name="line.1454"></a>
+<span class="sourceLineNo">1455</span>          ServerName target = null;<a name="line.1455"></a>
+<span class="sourceLineNo">1456</span>          for (ServerName tmp : localServers) {<a name="line.1456"></a>
+<span class="sourceLineNo">1457</span>            if (tmp.getPort() == oldServerName.getPort()) {<a name="line.1457"></a>
+<span class="sourceLineNo">1458</span>              target = tmp;<a name="line.1458"></a>
+<span class="sourceLineNo">1459</span>              assignments.get(tmp).add(region);<a name="line.1459"></a>
+<span class="sourceLineNo">1460</span>              numRetainedAssigments++;<a name="line.1460"></a>
+<span class="sourceLineNo">1461</span>              break;<a name="line.1461"></a>
+<span class="sourceLineNo">1462</span>            }<a name="line.1462"></a>
+<span class="sourceLineNo">1463</span>          }<a name="line.1463"></a>
+<span class="sourceLineNo">1464</span>          if (target == null) {<a name="line.1464"></a>
+<span class="sourceLineNo">1465</span>            randomAssignRegions.add(region);<a name="line.1465"></a>
+<span class="sourceLineNo">1466</span>          }<a name="line.1466"></a>
+<span class="sourceLineNo">1467</span>        }<a name="line.1467"></a>
+<span class="sourceLineNo">1468</span>      }<a name="line.1468"></a>
+<span class="sourceLineNo">1469</span>    }<a name="line.1469"></a>
+<span class="sourceLineNo">1470</span><a name="line.1470"></a>
+<span class="sourceLineNo">1471</span>    // If servers from prior assignment aren't present, then lets do randomAssignment on regions.<a name="line.1471"></a>
+<span class="sourceLineNo">1472</span>    if (randomAssignRegions.size() &gt; 0) {<a name="line.1472"></a>
+<span class="sourceLineNo">1473</span>      Cluster cluster = createCluster(servers, regions.keySet());<a name="line.1473"></a>
+<span class="sourceLineNo">1474</span>      for (Map.Entry&lt;ServerName, List&lt;RegionInfo&gt;&gt; entry : assignments.entrySet()) {<a name="line.1474"></a>
+<span class="sourceLineNo">1475</span>        ServerName sn = entry.getKey();<a name="line.1475"></a>
+<span class="sourceLineNo">1476</span>        for (RegionInfo region : entry.getValue()) {<a name="line.1476"></a>
+<span class="sourceLineNo">1477</span>          cluster.doAssignRegion(region, sn);<a name="line.1477"></a>
+<span class="sourceLineNo">1478</span>        }<a name="line.1478"></a>
+<span class="sourceLineNo">1479</span>      }<a name="line.1479"></a>
+<span class="sourceLineNo">1480</span>      for (RegionInfo region : randomAssignRegions) {<a name="line.1480"></a>
+<span class="sourceLineNo">1481</span>        ServerName target = randomAssignment(cluster, region, servers);<a name="line.1481"></a>
+<span class="sourceLineNo">1482</span>        assignments.get(target).add(region);<a name="line.1482"></a>
+<span class="sourceLineNo">1483</span>        cluster.doAssignRegion(region, target);<a name="line.1483"></a>
+<span class="sourceLineNo">1484</span>        numRandomAssignments++;<a name="line.1484"></a>
+<span class="sourceLineNo">1485</span>      }<a name="line.1485"></a>
+<span class="sourceLineNo">1486</span>    }<a name="line.1486"></a>
+<span class="sourceLineNo">1487</span><a name="line.1487"></a>
+<span class="sourceLineNo">1488</span>    String randomAssignMsg = "";<a name="line.1488"></a>
+<span class="sourceLineNo">1489</span>    if (numRandomAssignments &gt; 0) {<a name="line.1489"></a>
+<span class="sourceLineNo">1490</span>      randomAssignMsg =<a name="line.1490"></a>
+<span class="sourceLineNo">1491</span>          numRandomAssignments + " regions were assigned "<a name="line.1491"></a>
+<span class="sourceLineNo">1492</span>              + "to random hosts, since the old hosts for these regions are no "<a name="line.1492"></a>
+<span class="sourceLineNo">1493</span>              + "longer present in the cluster. These hosts were:\n  "<a name="line.1493"></a>
+<span class="sourceLineNo">1494</span>              + Joiner.on("\n  ").join(oldHostsNoLongerPresent);<a name="line.1494"></a>
+<span class="sourceLineNo">1495</span>    }<a name="line.1495"></a>
+<span class="sourceLineNo">1496</span><a name="line.1496"></a>
+<span class="sourceLineNo">1497</span>    LOG.info("Reassigned " + regions.size() + " regions. " + numRetainedAssigments<a name="line.1497"></a>
+<span class="sourceLineNo">1498</span>        + " retained the pre-restart assignment. " + randomAssignMsg);<a name="line.1498"></a>
+<span class="sourceLineNo">1499</span>    return assignments;<a name="line.1499"></a>
 <span class="sourceLineNo">1500</span>  }<a name="line.1500"></a>
 <span class="sourceLineNo">1501</span><a name="line.1501"></a>
 <span class="sourceLineNo">1502</span>  @Override<a name="line.1502"></a>
-<span class="sourceLineNo">1503</span>  public void regionOffline(RegionInfo regionInfo) {<a name="line.1503"></a>
+<span class="sourceLineNo">1503</span>  public void initialize() throws HBaseIOException{<a name="line.1503"></a>
 <span class="sourceLineNo">1504</span>  }<a name="line.1504"></a>
 <span class="sourceLineNo">1505</span><a name="line.1505"></a>
 <span class="sourceLineNo">1506</span>  @Override<a name="line.1506"></a>
-<span class="sourceLineNo">1507</span>  public boolean isStopped() {<a name="line.1507"></a>
-<span class="sourceLineNo">1508</span>    return stopped;<a name="line.1508"></a>
-<span class="sourceLineNo">1509</span>  }<a name="line.1509"></a>
-<span class="sourceLineNo">1510</span><a name="line.1510"></a>
-<span class="sourceLineNo">1511</span>  @Override<a name="line.1511"></a>
-<span class="sourceLineNo">1512</span>  public void stop(String why) {<a name="line.1512"></a>
-<span class="sourceLineNo">1513</span>    LOG.info("Load Balancer stop requested: "+why);<a name="line.1513"></a>
-<span class="sourceLineNo">1514</span>    stopped = true;<a name="line.1514"></a>
-<span class="sourceLineNo">1515</span>  }<a name="line.1515"></a>
-<span class="sourceLineNo">1516</span><a name="line.1516"></a>
-<span class="sourceLineNo">1517</span>  /**<a name="line.1517"></a>
-<span class="sourceLineNo">1518</span>   * Used to assign a single region to a random server.<a name="line.1518"></a>
-<span class="sourceLineNo">1519</span>   */<a name="line.1519"></a>
-<span class="sourceLineNo">1520</span>  private ServerName randomAssignment(Cluster cluster, RegionInfo regionInfo,<a name="line.1520"></a>
-<span class="sourceLineNo">1521</span>      List&lt;ServerName&gt; servers) {<a name="line.1521"></a>
-<span class="sourceLineNo">1522</span>    int numServers = servers.size(); // servers is not null, numServers &gt; 1<a name="line.1522"></a>
-<span class="sourceLineNo">1523</span>    ServerName sn = null;<a name="line.1523"></a>
-<span class="sourceLineNo">1524</span>    final int maxIterations = numServers * 4;<a name="line.1524"></a>
-<span class="sourceLineNo">1525</span>    int iterations = 0;<a name="line.1525"></a>
-<span class="sourceLineNo">1526</span><a name="line.1526"></a>
-<span class="sourceLineNo">1527</span>    do {<a name="line.1527"></a>
-<span class="sourceLineNo">1528</span>      int i = RANDOM.nextInt(numServers);<a name="line.1528"></a>
-<span class="sourceLineNo">1529</span>      sn = servers.get(i);<a name="line.1529"></a>
-<span class="sourceLineNo">1530</span>    } while (cluster.wouldLowerAvailability(regionInfo, sn)<a name="line.1530"></a>
-<span class="sourceLineNo">1531</span>        &amp;&amp; iterations++ &lt; maxIterations);<a name="line.1531"></a>
-<span class="sourceLineNo">1532</span>    cluster.doAssignRegion(regionInfo, sn);<a name="line.1532"></a>
-<span class="sourceLineNo">1533</span>    return sn;<a name="line.1533"></a>
-<span class="sourceLineNo">1534</span>  }<a name="line.1534"></a>
-<span class="sourceLineNo">1535</span><a name="line.1535"></a>
-<span class="sourceLineNo">1536</span>  /**<a name="line.1536"></a>
-<span class="sourceLineNo">1537</span>   * Round robin a list of regions to a list of servers<a name="line.1537"></a>
-<span class="sourceLineNo">1538</span>   */<a name="line.1538"></a>
-<span class="sourceLineNo">1539</span>  private void roundRobinAssignment(Cluster cluster, List&lt;RegionInfo&gt; regions,<a name="line.1539"></a>
-<span class="sourceLineNo">1540</span>      List&lt;RegionInfo&gt; unassignedRegions, List&lt;ServerName&gt; servers,<a name="line.1540"></a>
-<span class="sourceLineNo">1541</span>      Map&lt;ServerName, List&lt;RegionInfo&gt;&gt; assignments) {<a name="line.1541"></a>
-<span class="sourceLineNo">1542</span><a name="line.1542"></a>
-<span class="sourceLineNo">1543</span>    int numServers = servers.size();<a name="line.1543"></a>
-<span class="sourceLineNo">1544</span>    int numRegions = regions.size();<a name="line.1544"></a>
-<span class="sourceLineNo">1545</span>    int max = (int) Math.ceil((float) numRegions / numServers);<a name="line.1545"></a>
-<span class="sourceLineNo">1546</span>    int serverIdx = 0;<a name="line.1546"></a>
-<span class="sourceLineNo">1547</span>    if (numServers &gt; 1) {<a name="line.1547"></a>
-<span class="sourceLineNo">1548</span>      serverIdx = RANDOM.nextInt(numServers);<a name="line.1548"></a>
-<span class="sourceLineNo">1549</span>    }<a name="line.1549"></a>
-<span class="sourceLineNo">1550</span>    int regionIdx = 0;<a name="line.1550"></a>
-<span class="sourceLineNo">1551</span><a name="line.1551"></a>
-<span class="sourceLineNo">1552</span>    for (int j = 0; j &lt; numServers; j++) {<a name="line.1552"></a>
-<span class="sourceLineNo">1553</span>      ServerName server = servers.get((j + serverIdx) % numServers);<a name="line.1553"></a>
-<span class="sourceLineNo">1554</span>      List&lt;RegionInfo&gt; serverRegions = new ArrayList&lt;&gt;(max);<a name="line.1554"></a>
-<span class="sourceLineNo">1555</span>      for (int i = regionIdx; i &lt; numRegions; i += numServers) {<a name="line.1555"></a>
-<span class="sourceLineNo">1556</span>        RegionInfo region = regions.get(i % numRegions);<a name="line.1556"></a>
-<span class="sourceLineNo">1557</span>        if (cluster.wouldLowerAvailability(region, server)) {<a name="line.1557"></a>
-<span class="sourceLineNo">1558</span>          unassignedRegions.add(region);<a name="line.1558"></a>
-<span class="sourceLineNo">1559</span>        } else {<a name="line.1559"></a>
-<span class="sourceLineNo">1560</span>          serverRegions.add(region);<a name="line.1560"></a>
-<span class="sourceLineNo">1561</span>          cluster.doAssignRegion(region, server);<a name="line.1561"></a>
-<span class="sourceLineNo">1562</span>        }<a name="line.1562"></a>
-<span class="sourceLineNo">1563</span>      }<a name="line.1563"></a>
-<span class="sourceLineNo">1564</span>      assignments.put(server, serverRegions);<a name="line.1564"></a>
-<span class="sourceLineNo">1565</span>      regionIdx++;<a name="line.1565"></a>
-<span class="sourceLineNo">1566</span>    }<a name="line.1566"></a>
-<span class="sourceLineNo">1567</span>  }<a name="line.1567"></a>
-<span class="sourceLineNo">1568</span><a name="line.1568"></a>
-<span class="sourceLineNo">1569</span>  protected Map&lt;ServerName, List&lt;RegionInfo&gt;&gt; getRegionAssignmentsByServer(<a name="line.1569"></a>
-<span class="sourceLineNo">1570</span>    Collection&lt;RegionInfo&gt; regions) {<a name="line.1570"></a>
-<span class="sourceLineNo">1571</span>    if (this.services != null &amp;&amp; this.services.getAssignmentManager() != null) {<a name="line.1571"></a>
-<span class="sourceLineNo">1572</span>      return this.services.getAssignmentManager().getSnapShotOfAssignment(regions);<a name="line.1572"></a>
-<span class="sourceLineNo">1573</span>    } else {<a name="line.1573"></a>
-<span class="sourceLineNo">1574</span>      return new HashMap&lt;&gt;();<a name="line.1574"></a>
-<span class="sourceLineNo">1575</span>    }<a name="line.1575"></a>
-<span class="sourceLineNo">1576</span>  }<a name="line.1576"></a>
-<span class="sourceLineNo">1577</span><a name="line.1577"></a>
-<span class="sourceLineNo">1578</span>  @Override<a name="line.1578"></a>
-<span class="sourceLineNo">1579</span>  public void onConfigurationChange(Configuration conf) {<a name="line.1579"></a>
-<span class="sourceLineNo">1580</span>  }<a name="line.1580"></a>
-<span class="sourceLineNo">1581</span>}<a name="line.1581"></a>
+<span class="sourceLineNo">1507</span>  public void regionOnline(RegionInfo regionInfo, ServerName sn) {<a name="line.1507"></a>
+<span class="sourceLineNo">1508</span>  }<a name="line.1508"></a>
+<span class="sourceLineNo">1509</span><a name="line.1509"></a>
+<span class="sourceLineNo">1510</span>  @Override<a name="line.1510"></a>
+<span class="sourceLineNo">1511</span>  public void regionOffline(RegionInfo regionInfo) {<a name="line.1511"></a>
+<span class="sourceLineNo">1512</span>  }<a name="line.1512"></a>
+<span class="sourceLineNo">1513</span><a name="line.1513"></a>
+<span class="sourceLineNo">1514</span>  @Override<a name="line.1514"></a>
+<span class="sourceLineNo">1515</span>  public boolean isStopped() {<a name="line.1515"></a>
+<span class="sourceLineNo">1516</span>    return stopped;<a name="line.1516"></a>
+<span class="sourceLineNo">1517</span>  }<a name="line.1517"></a>
+<span class="sourceLineNo">1518</span><a name="line.1518"></a>
+<span class="sourceLineNo">1519</span>  @Override<a name="line.1519"></a>
+<span class="sourceLineNo">1520</span>  public void stop(String why) {<a name="line.1520"></a>
+<span class="sourceLineNo">1521</span>    LOG.info("Load Balancer stop requested: "+why);<a name="line.1521"></a>
+<span class="sourceLineNo">1522</span>    stopped = true;<a name="line.1522"></a>
+<span class="sourceLineNo">1523</span>  }<a name="line.1523"></a>
+<span class="sourceLineNo">1524</span><a name="line.1524"></a>
+<span class="sourceLineNo">1525</span>  /**<a name="line.1525"></a>
+<span class="sourceLineNo">1526</span>   * Used to assign a single region to a random server.<a name="line.1526"></a>
+<span class="sourceLineNo">1527</span>   */<a name="line.1527"></a>
+<span class="sourceLineNo">1528</span>  private ServerName randomAssignment(Cluster cluster, RegionInfo regionInfo,<a name="line.1528"></a>
+<span class="sourceLineNo">1529</span>      List&lt;ServerName&gt; servers) {<a name="line.1529"></a>
+<span class="sourceLineNo">1530</span>    int numServers = servers.size(); // servers is not null, numServers &gt; 1<a name="line.1530"></a>
+<span class="sourceLineNo">1531</span>    ServerName sn = null;<a name="line.1531"></a>
+<span class="sourceLineNo">1532</span>    final int maxIterations = numServers * 4;<a name="line.1532"></a>
+<span class="sourceLineNo">1533</span>    int iterations = 0;<a name="line.1533"></a>
+<span class="sourceLineNo">1534</span><a name="line.1534"></a>
+<span class="sourceLineNo">1535</span>    do {<a name="line.1535"></a>
+<span class="sourceLineNo">1536</span>      int i = RANDOM.nextInt(numServers);<a name="line.1536"></a>
+<span class="sourceLineNo">1537</span>      sn = servers.get(i);<a name="line.1537"></a>
+<span class="sourceLineNo">1538</span>    } while (cluster.wouldLowerAvailability(regionInfo, sn)<a name="line.1538"></a>
+<span class="sourceLineNo">1539</span>        &amp;&amp; iterations++ &lt; maxIterations);<a name="line.1539"></a>
+<span class="sourceLineNo">1540</span>    cluster.doAssignRegion(regionInfo, sn);<a name="line.1540"></a>
+<span class="sourceLineNo">1541</span>    return sn;<a name="line.1541"></a>
+<span class="sourceLineNo">1542</span>  }<a name="line.1542"></a>
+<span class="sourceLineNo">1543</span><a name="line.1543"></a>
+<span class="sourceLineNo">1544</span>  /**<a name="line.1544"></a>
+<span class="sourceLineNo">1545</span>   * Round robin a list of regions to a list of servers<a name="line.1545"></a>
+<span class="sourceLineNo">1546</span>   */<a name="line.1546"></a>
+<span class="sourceLineNo">1547</span>  private void roundRobinAssignment(Cluster cluster, List&lt;RegionInfo&gt; regions,<a name="line.1547"></a>
+<span class="sourceLineNo">1548</span>      List&lt;RegionInfo&gt; unassignedRegions, List&lt;ServerName&gt; servers,<a name="line.1548"></a>
+<span class="sourceLineNo">1549</span>      Map&lt;ServerName, List&lt;RegionInfo&gt;&gt; assignments) {<a name="line.1549"></a>
+<span class="sourceLineNo">1550</span><a name="line.1550"></a>
+<span class="sourceLineNo">1551</span>    int numServers = servers.size();<a name="line.1551"></a>
+<span class="sourceLineNo">1552</span>    int numRegions = regions.size();<a name="line.1552"></a>
+<span class="sourceLineNo">1553</span>    int max = (int) Math.ceil((float) numRegions / numServers);<a name="line.1553"></a>
+<span class="sourceLineNo">1554</span>    int serverIdx = 0;<a name="line.1554"></a>
+<span class="sourceLineNo">1555</span>    if (numServers &gt; 1) {<a name="line.1555"></a>
+<span class="sourceLineNo">1556</span>      serverIdx = RANDOM.nextInt(numServers);<a name="line.1556"></a>
+<span class="sourceLineNo">1557</span>    }<a name="line.1557"></a>
+<span class="sourceLineNo">1558</span>    int regionIdx = 0;<a name="line.1558"></a>
+<span class="sourceLineNo">1559</span><a name="line.1559"></a>
+<span class="sourceLineNo">1560</span>    for (int j = 0; j &lt; numServers; j++) {<a name="line.1560"></a>
+<span class="sourceLineNo">1561</span>      ServerName server = servers.get((j + serverIdx) % numServers);<a name="line.1561"></a>
+<span class="sourceLineNo">1562</span>      List&lt;RegionInfo&gt; serverRegions = new ArrayList&lt;&gt;(max);<a name="line.1562"></a>
+<span class="sourceLineNo">1563</span>      for (int i = regionIdx; i &lt; numRegions; i += numServers) {<a name="line.1563"></a>
+<span class="sourceLineNo">1564</span>        RegionInfo region = regions.get(i % numRegions);<a name="line.1564"></a>
+<span class="sourceLineNo">1565</span>        if (cluster.wouldLowerAvailability(region, server)) {<a name="line.1565"></a>
+<span class="sourceLineNo">1566</span>          unassignedRegions.add(region);<a name="line.1566"></a>
+<span class="sourceLineNo">1567</span>        } else {<a name="line.1567"></a>
+<span class="sourceLineNo">1568</span>          serverRegions.add(region);<a name="line.1568"></a>
+<span class="sourceLineNo">1569</span>          cluster.doAssignRegion(region, server);<a name="line.1569"></a>
+<span class="sourceLineNo">1570</span>        }<a name="line.1570"></a>
+<span class="sourceLineNo">1571</span>      }<a name="line.1571"></a>
+<span class="sourceLineNo">1572</span>      assignments.put(server, serverRegions);<a name="line.1572"></a>
+<span class="sourceLineNo">1573</span>      regionIdx++;<a name="line.1573"></a>
+<span class="sourceLineNo">1574</span>    }<a name="line.1574"></a>
+<span class="sourceLineNo">1575</span>  }<a name="line.1575"></a>
+<span class="sourceLineNo">1576</span><a name="line.1576"></a>
+<span class="sourceLineNo">1577</span>  protected Map&lt;ServerName, List&lt;RegionInfo&gt;&gt; getRegionAssignmentsByServer(<a name="line.1577"></a>
+<span class="sourceLineNo">1578</span>    Collection&lt;RegionInfo&gt; regions) {<a name="line.1578"></a>
+<span class="sourceLineNo">1579</span>    if (this.services != null &amp;&amp; this.services.getAssignmentManager() != null) {<a name="line.1579"></a>
+<span class="sourceLineNo">1580</span>      return this.services.getAssignmentManager().getSnapShotOfAssignment(regions);<a name="line.1580"></a>
+<span class="sourceLineNo">1581</span>    } else {<a name="line.1581"></a>
+<span class="sourceLineNo">1582</span>      return new HashMap&lt;&gt;();<a name="line.1582"></a>
+<span class="sourceLineNo">1583</span>    }<a name="line.1583"></a>
+<span class="sourceLineNo">1584</span>  }<a name="line.1584"></a>
+<span class="sourceLineNo">1585</span><a name="line.1585"></a>
+<span class="sourceLineNo">1586</span>  @Override<a name="line.1586"></a>
+<span class="sourceLineNo">1587</span>  public void onConfigurationChange(Configuration conf) {<a name="line.1587"></a>
+<span class="sourceLineNo">1588</span>  }<a name="line.1588"></a>
+<span class="sourceLineNo">1589</span>}<a name="line.1589"></a>