You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@hbase.apache.org by gi...@apache.org on 2018/10/19 14:53:12 UTC

[01/46] hbase-site git commit: Published site at 05d22ed960204183fbd9bd16f1dbca6410ccde76.

Repository: hbase-site
Updated Branches:
  refs/heads/asf-site 156057826 -> 3649682c3


http://git-wip-us.apache.org/repos/asf/hbase-site/blob/3649682c/testdevapidocs/src-html/org/apache/hadoop/hbase/master/TestMasterRepairMode.html
----------------------------------------------------------------------
diff --git a/testdevapidocs/src-html/org/apache/hadoop/hbase/master/TestMasterRepairMode.html b/testdevapidocs/src-html/org/apache/hadoop/hbase/master/TestMasterRepairMode.html
new file mode 100644
index 0000000..806b007
--- /dev/null
+++ b/testdevapidocs/src-html/org/apache/hadoop/hbase/master/TestMasterRepairMode.html
@@ -0,0 +1,213 @@
+<!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;<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.assertNotNull;<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.util.Arrays;<a name="line.24"></a>
+<span class="sourceLineNo">025</span>import java.util.stream.Stream;<a name="line.25"></a>
+<span class="sourceLineNo">026</span>import java.util.stream.StreamSupport;<a name="line.26"></a>
+<span class="sourceLineNo">027</span><a name="line.27"></a>
+<span class="sourceLineNo">028</span>import org.apache.hadoop.conf.Configuration;<a name="line.28"></a>
+<span class="sourceLineNo">029</span>import org.apache.hadoop.hbase.HBaseClassTestRule;<a name="line.29"></a>
+<span class="sourceLineNo">030</span>import org.apache.hadoop.hbase.HBaseTestingUtility;<a name="line.30"></a>
+<span class="sourceLineNo">031</span>import org.apache.hadoop.hbase.HConstants;<a name="line.31"></a>
+<span class="sourceLineNo">032</span>import org.apache.hadoop.hbase.StartMiniClusterOption;<a name="line.32"></a>
+<span class="sourceLineNo">033</span>import org.apache.hadoop.hbase.TableName;<a name="line.33"></a>
+<span class="sourceLineNo">034</span>import org.apache.hadoop.hbase.client.Connection;<a name="line.34"></a>
+<span class="sourceLineNo">035</span>import org.apache.hadoop.hbase.client.Put;<a name="line.35"></a>
+<span class="sourceLineNo">036</span>import org.apache.hadoop.hbase.client.Result;<a name="line.36"></a>
+<span class="sourceLineNo">037</span>import org.apache.hadoop.hbase.client.ResultScanner;<a name="line.37"></a>
+<span class="sourceLineNo">038</span>import org.apache.hadoop.hbase.client.Scan;<a name="line.38"></a>
+<span class="sourceLineNo">039</span>import org.apache.hadoop.hbase.client.Table;<a name="line.39"></a>
+<span class="sourceLineNo">040</span>import org.apache.hadoop.hbase.testclassification.MasterTests;<a name="line.40"></a>
+<span class="sourceLineNo">041</span>import org.apache.hadoop.hbase.testclassification.MediumTests;<a name="line.41"></a>
+<span class="sourceLineNo">042</span>import org.apache.hadoop.hbase.util.Bytes;<a name="line.42"></a>
+<span class="sourceLineNo">043</span><a name="line.43"></a>
+<span class="sourceLineNo">044</span>import org.junit.After;<a name="line.44"></a>
+<span class="sourceLineNo">045</span>import org.junit.Before;<a name="line.45"></a>
+<span class="sourceLineNo">046</span>import org.junit.ClassRule;<a name="line.46"></a>
+<span class="sourceLineNo">047</span>import org.junit.Rule;<a name="line.47"></a>
+<span class="sourceLineNo">048</span>import org.junit.Test;<a name="line.48"></a>
+<span class="sourceLineNo">049</span>import org.junit.experimental.categories.Category;<a name="line.49"></a>
+<span class="sourceLineNo">050</span>import org.junit.rules.TestName;<a name="line.50"></a>
+<span class="sourceLineNo">051</span><a name="line.51"></a>
+<span class="sourceLineNo">052</span>import org.slf4j.Logger;<a name="line.52"></a>
+<span class="sourceLineNo">053</span>import org.slf4j.LoggerFactory;<a name="line.53"></a>
+<span class="sourceLineNo">054</span><a name="line.54"></a>
+<span class="sourceLineNo">055</span>@Category({MasterTests.class, MediumTests.class})<a name="line.55"></a>
+<span class="sourceLineNo">056</span>public class TestMasterRepairMode {<a name="line.56"></a>
+<span class="sourceLineNo">057</span><a name="line.57"></a>
+<span class="sourceLineNo">058</span>  @ClassRule<a name="line.58"></a>
+<span class="sourceLineNo">059</span>  public static final HBaseClassTestRule CLASS_RULE =<a name="line.59"></a>
+<span class="sourceLineNo">060</span>      HBaseClassTestRule.forClass(TestMasterRepairMode.class);<a name="line.60"></a>
+<span class="sourceLineNo">061</span><a name="line.61"></a>
+<span class="sourceLineNo">062</span>  @Rule<a name="line.62"></a>
+<span class="sourceLineNo">063</span>  public TestName name = new TestName();<a name="line.63"></a>
+<span class="sourceLineNo">064</span><a name="line.64"></a>
+<span class="sourceLineNo">065</span>  private static final Logger LOG = LoggerFactory.getLogger(TestMasterRepairMode.class);<a name="line.65"></a>
+<span class="sourceLineNo">066</span><a name="line.66"></a>
+<span class="sourceLineNo">067</span>  private static final byte[] FAMILYNAME = Bytes.toBytes("fam");<a name="line.67"></a>
+<span class="sourceLineNo">068</span><a name="line.68"></a>
+<span class="sourceLineNo">069</span>  private static HBaseTestingUtility TEST_UTIL;<a name="line.69"></a>
+<span class="sourceLineNo">070</span><a name="line.70"></a>
+<span class="sourceLineNo">071</span>  @Before<a name="line.71"></a>
+<span class="sourceLineNo">072</span>  public void setUp() throws Exception {<a name="line.72"></a>
+<span class="sourceLineNo">073</span>    TEST_UTIL = new HBaseTestingUtility();<a name="line.73"></a>
+<span class="sourceLineNo">074</span>  }<a name="line.74"></a>
+<span class="sourceLineNo">075</span><a name="line.75"></a>
+<span class="sourceLineNo">076</span>  @After<a name="line.76"></a>
+<span class="sourceLineNo">077</span>  public void tearDown() throws Exception {<a name="line.77"></a>
+<span class="sourceLineNo">078</span>    TEST_UTIL.shutdownMiniCluster();<a name="line.78"></a>
+<span class="sourceLineNo">079</span>  }<a name="line.79"></a>
+<span class="sourceLineNo">080</span><a name="line.80"></a>
+<span class="sourceLineNo">081</span>  private void enableMaintenanceMode() {<a name="line.81"></a>
+<span class="sourceLineNo">082</span>    Configuration c = TEST_UTIL.getConfiguration();<a name="line.82"></a>
+<span class="sourceLineNo">083</span>    c.setBoolean(HMaster.MAINTENANCE_MODE, true);<a name="line.83"></a>
+<span class="sourceLineNo">084</span>    c.setInt("hbase.master.init.timeout.localHBaseCluster", 30000);<a name="line.84"></a>
+<span class="sourceLineNo">085</span>  }<a name="line.85"></a>
+<span class="sourceLineNo">086</span><a name="line.86"></a>
+<span class="sourceLineNo">087</span>  @Test<a name="line.87"></a>
+<span class="sourceLineNo">088</span>  public void testNewCluster() throws Exception {<a name="line.88"></a>
+<span class="sourceLineNo">089</span>    enableMaintenanceMode();<a name="line.89"></a>
+<span class="sourceLineNo">090</span><a name="line.90"></a>
+<span class="sourceLineNo">091</span>    TEST_UTIL.startMiniCluster(StartMiniClusterOption.builder()<a name="line.91"></a>
+<span class="sourceLineNo">092</span>        .numRegionServers(0)<a name="line.92"></a>
+<span class="sourceLineNo">093</span>        .numDataNodes(3)<a name="line.93"></a>
+<span class="sourceLineNo">094</span>        .build());<a name="line.94"></a>
+<span class="sourceLineNo">095</span><a name="line.95"></a>
+<span class="sourceLineNo">096</span>    Connection conn = TEST_UTIL.getConnection();<a name="line.96"></a>
+<span class="sourceLineNo">097</span>    assertTrue(conn.getAdmin().isMasterInMaintenanceMode());<a name="line.97"></a>
+<span class="sourceLineNo">098</span><a name="line.98"></a>
+<span class="sourceLineNo">099</span>    try (Table table = conn.getTable(TableName.META_TABLE_NAME);<a name="line.99"></a>
+<span class="sourceLineNo">100</span>        ResultScanner scanner = table.getScanner(new Scan())) {<a name="line.100"></a>
+<span class="sourceLineNo">101</span>      assertNotNull("Could not read meta.", scanner.next());<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><a name="line.104"></a>
+<span class="sourceLineNo">105</span>  @Test<a name="line.105"></a>
+<span class="sourceLineNo">106</span>  public void testExistingCluster() throws Exception {<a name="line.106"></a>
+<span class="sourceLineNo">107</span>    TableName testRepairMode = TableName.valueOf(name.getMethodName());<a name="line.107"></a>
+<span class="sourceLineNo">108</span><a name="line.108"></a>
+<span class="sourceLineNo">109</span>    TEST_UTIL.startMiniCluster();<a name="line.109"></a>
+<span class="sourceLineNo">110</span>    Table t = TEST_UTIL.createTable(testRepairMode, FAMILYNAME);<a name="line.110"></a>
+<span class="sourceLineNo">111</span>    Put p = new Put(Bytes.toBytes("r"));<a name="line.111"></a>
+<span class="sourceLineNo">112</span>    p.addColumn(FAMILYNAME, Bytes.toBytes("c"), new byte[0]);<a name="line.112"></a>
+<span class="sourceLineNo">113</span>    t.put(p);<a name="line.113"></a>
+<span class="sourceLineNo">114</span><a name="line.114"></a>
+<span class="sourceLineNo">115</span>    TEST_UTIL.shutdownMiniHBaseCluster();<a name="line.115"></a>
+<span class="sourceLineNo">116</span><a name="line.116"></a>
+<span class="sourceLineNo">117</span>    LOG.info("Starting master-only");<a name="line.117"></a>
+<span class="sourceLineNo">118</span><a name="line.118"></a>
+<span class="sourceLineNo">119</span>    enableMaintenanceMode();<a name="line.119"></a>
+<span class="sourceLineNo">120</span>    TEST_UTIL.startMiniHBaseCluster(StartMiniClusterOption.builder()<a name="line.120"></a>
+<span class="sourceLineNo">121</span>        .numRegionServers(0).createRootDir(false).build());<a name="line.121"></a>
+<span class="sourceLineNo">122</span><a name="line.122"></a>
+<span class="sourceLineNo">123</span>    Connection conn = TEST_UTIL.getConnection();<a name="line.123"></a>
+<span class="sourceLineNo">124</span>    assertTrue(conn.getAdmin().isMasterInMaintenanceMode());<a name="line.124"></a>
+<span class="sourceLineNo">125</span><a name="line.125"></a>
+<span class="sourceLineNo">126</span>    try (Table table = conn.getTable(TableName.META_TABLE_NAME);<a name="line.126"></a>
+<span class="sourceLineNo">127</span>        ResultScanner scanner = table.getScanner(HConstants.TABLE_FAMILY);<a name="line.127"></a>
+<span class="sourceLineNo">128</span>        Stream&lt;Result&gt; results = StreamSupport.stream(scanner.spliterator(), false)) {<a name="line.128"></a>
+<span class="sourceLineNo">129</span>      assertTrue("Did not find user table records while reading hbase:meta",<a name="line.129"></a>
+<span class="sourceLineNo">130</span>          results.anyMatch(r -&gt; Arrays.equals(r.getRow(), testRepairMode.getName())));<a name="line.130"></a>
+<span class="sourceLineNo">131</span>    }<a name="line.131"></a>
+<span class="sourceLineNo">132</span><a name="line.132"></a>
+<span class="sourceLineNo">133</span>    try (Table table = conn.getTable(testRepairMode);<a name="line.133"></a>
+<span class="sourceLineNo">134</span>        ResultScanner scanner = table.getScanner(new Scan())) {<a name="line.134"></a>
+<span class="sourceLineNo">135</span>      scanner.next();<a name="line.135"></a>
+<span class="sourceLineNo">136</span>      fail("Should not be able to access user-space tables in repair mode.");<a name="line.136"></a>
+<span class="sourceLineNo">137</span>    } catch (Exception e) {<a name="line.137"></a>
+<span class="sourceLineNo">138</span>      // Expected<a name="line.138"></a>
+<span class="sourceLineNo">139</span>    }<a name="line.139"></a>
+<span class="sourceLineNo">140</span>  }<a name="line.140"></a>
+<span class="sourceLineNo">141</span>}<a name="line.141"></a>
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+</pre>
+</div>
+</body>
+</html>


[29/46] hbase-site git commit: Published site at 05d22ed960204183fbd9bd16f1dbca6410ccde76.

Posted by gi...@apache.org.
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/3649682c/devapidocs/src-html/org/apache/hadoop/hbase/master/MasterRpcServices.BalanceSwitchMode.html
----------------------------------------------------------------------
diff --git a/devapidocs/src-html/org/apache/hadoop/hbase/master/MasterRpcServices.BalanceSwitchMode.html b/devapidocs/src-html/org/apache/hadoop/hbase/master/MasterRpcServices.BalanceSwitchMode.html
index 684e709..4365cc5 100644
--- a/devapidocs/src-html/org/apache/hadoop/hbase/master/MasterRpcServices.BalanceSwitchMode.html
+++ b/devapidocs/src-html/org/apache/hadoop/hbase/master/MasterRpcServices.BalanceSwitchMode.html
@@ -361,7 +361,7 @@
 <span class="sourceLineNo">353</span>      throws IOException {<a name="line.353"></a>
 <span class="sourceLineNo">354</span>    // RpcServer at HM by default enable ByteBufferPool iff HM having user table region in it<a name="line.354"></a>
 <span class="sourceLineNo">355</span>    boolean reservoirEnabled = conf.getBoolean(RESERVOIR_ENABLED_KEY,<a name="line.355"></a>
-<span class="sourceLineNo">356</span>        (LoadBalancer.isTablesOnMaster(conf) &amp;&amp; !LoadBalancer.isSystemTablesOnlyOnMaster(conf)));<a name="line.356"></a>
+<span class="sourceLineNo">356</span>        LoadBalancer.isMasterCanHostUserRegions(conf));<a name="line.356"></a>
 <span class="sourceLineNo">357</span>    try {<a name="line.357"></a>
 <span class="sourceLineNo">358</span>      return RpcServerFactory.createRpcServer(server, name, getServices(),<a name="line.358"></a>
 <span class="sourceLineNo">359</span>          bindAddress, // use final bindAddress for this server.<a name="line.359"></a>
@@ -1532,934 +1532,930 @@
 <span class="sourceLineNo">1524</span>      final RpcController controller,<a name="line.1524"></a>
 <span class="sourceLineNo">1525</span>      final IsInMaintenanceModeRequest request) throws ServiceException {<a name="line.1525"></a>
 <span class="sourceLineNo">1526</span>    IsInMaintenanceModeResponse.Builder response = IsInMaintenanceModeResponse.newBuilder();<a name="line.1526"></a>
-<span class="sourceLineNo">1527</span>    try {<a name="line.1527"></a>
-<span class="sourceLineNo">1528</span>      response.setInMaintenanceMode(master.isInMaintenanceMode());<a name="line.1528"></a>
-<span class="sourceLineNo">1529</span>    } catch (IOException e) {<a name="line.1529"></a>
-<span class="sourceLineNo">1530</span>      throw new ServiceException(e);<a name="line.1530"></a>
-<span class="sourceLineNo">1531</span>    }<a name="line.1531"></a>
-<span class="sourceLineNo">1532</span>    return response.build();<a name="line.1532"></a>
-<span class="sourceLineNo">1533</span>  }<a name="line.1533"></a>
-<span class="sourceLineNo">1534</span><a name="line.1534"></a>
-<span class="sourceLineNo">1535</span>  @Override<a name="line.1535"></a>
-<span class="sourceLineNo">1536</span>  public UnassignRegionResponse unassignRegion(RpcController controller,<a name="line.1536"></a>
-<span class="sourceLineNo">1537</span>      UnassignRegionRequest req) throws ServiceException {<a name="line.1537"></a>
-<span class="sourceLineNo">1538</span>    try {<a name="line.1538"></a>
-<span class="sourceLineNo">1539</span>      final byte [] regionName = req.getRegion().getValue().toByteArray();<a name="line.1539"></a>
-<span class="sourceLineNo">1540</span>      RegionSpecifierType type = req.getRegion().getType();<a name="line.1540"></a>
-<span class="sourceLineNo">1541</span>      final boolean force = req.getForce();<a name="line.1541"></a>
-<span class="sourceLineNo">1542</span>      UnassignRegionResponse urr = UnassignRegionResponse.newBuilder().build();<a name="line.1542"></a>
-<span class="sourceLineNo">1543</span><a name="line.1543"></a>
-<span class="sourceLineNo">1544</span>      master.checkInitialized();<a name="line.1544"></a>
-<span class="sourceLineNo">1545</span>      if (type != RegionSpecifierType.REGION_NAME) {<a name="line.1545"></a>
-<span class="sourceLineNo">1546</span>        LOG.warn("unassignRegion specifier type: expected: " + RegionSpecifierType.REGION_NAME<a name="line.1546"></a>
-<span class="sourceLineNo">1547</span>          + " actual: " + type);<a name="line.1547"></a>
-<span class="sourceLineNo">1548</span>      }<a name="line.1548"></a>
-<span class="sourceLineNo">1549</span>      Pair&lt;RegionInfo, ServerName&gt; pair =<a name="line.1549"></a>
-<span class="sourceLineNo">1550</span>        MetaTableAccessor.getRegion(master.getConnection(), regionName);<a name="line.1550"></a>
-<span class="sourceLineNo">1551</span>      if (Bytes.equals(RegionInfoBuilder.FIRST_META_REGIONINFO.getRegionName(),regionName)) {<a name="line.1551"></a>
-<span class="sourceLineNo">1552</span>        pair = new Pair&lt;&gt;(RegionInfoBuilder.FIRST_META_REGIONINFO,<a name="line.1552"></a>
-<span class="sourceLineNo">1553</span>            master.getMetaTableLocator().getMetaRegionLocation(master.getZooKeeper()));<a name="line.1553"></a>
-<span class="sourceLineNo">1554</span>      }<a name="line.1554"></a>
-<span class="sourceLineNo">1555</span>      if (pair == null) {<a name="line.1555"></a>
-<span class="sourceLineNo">1556</span>        throw new UnknownRegionException(Bytes.toString(regionName));<a name="line.1556"></a>
-<span class="sourceLineNo">1557</span>      }<a name="line.1557"></a>
-<span class="sourceLineNo">1558</span><a name="line.1558"></a>
-<span class="sourceLineNo">1559</span>      RegionInfo hri = pair.getFirst();<a name="line.1559"></a>
-<span class="sourceLineNo">1560</span>      if (master.cpHost != null) {<a name="line.1560"></a>
-<span class="sourceLineNo">1561</span>        master.cpHost.preUnassign(hri, force);<a name="line.1561"></a>
-<span class="sourceLineNo">1562</span>      }<a name="line.1562"></a>
-<span class="sourceLineNo">1563</span>      LOG.debug(master.getClientIdAuditPrefix() + " unassign " + hri.getRegionNameAsString()<a name="line.1563"></a>
-<span class="sourceLineNo">1564</span>          + " in current location if it is online and reassign.force=" + force);<a name="line.1564"></a>
-<span class="sourceLineNo">1565</span>      master.getAssignmentManager().unassign(hri);<a name="line.1565"></a>
-<span class="sourceLineNo">1566</span>      if (master.cpHost != null) {<a name="line.1566"></a>
-<span class="sourceLineNo">1567</span>        master.cpHost.postUnassign(hri, force);<a name="line.1567"></a>
-<span class="sourceLineNo">1568</span>      }<a name="line.1568"></a>
-<span class="sourceLineNo">1569</span><a name="line.1569"></a>
-<span class="sourceLineNo">1570</span>      return urr;<a name="line.1570"></a>
-<span class="sourceLineNo">1571</span>    } catch (IOException ioe) {<a name="line.1571"></a>
-<span class="sourceLineNo">1572</span>      throw new ServiceException(ioe);<a name="line.1572"></a>
-<span class="sourceLineNo">1573</span>    }<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>  @Override<a name="line.1576"></a>
-<span class="sourceLineNo">1577</span>  public ReportRegionStateTransitionResponse reportRegionStateTransition(RpcController c,<a name="line.1577"></a>
-<span class="sourceLineNo">1578</span>      ReportRegionStateTransitionRequest req) throws ServiceException {<a name="line.1578"></a>
-<span class="sourceLineNo">1579</span>    try {<a name="line.1579"></a>
-<span class="sourceLineNo">1580</span>      master.checkServiceStarted();<a name="line.1580"></a>
-<span class="sourceLineNo">1581</span>      return master.getAssignmentManager().reportRegionStateTransition(req);<a name="line.1581"></a>
-<span class="sourceLineNo">1582</span>    } catch (IOException ioe) {<a name="line.1582"></a>
-<span class="sourceLineNo">1583</span>      throw new ServiceException(ioe);<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><a name="line.1586"></a>
-<span class="sourceLineNo">1587</span>  @Override<a name="line.1587"></a>
-<span class="sourceLineNo">1588</span>  public SetQuotaResponse setQuota(RpcController c, SetQuotaRequest req)<a name="line.1588"></a>
-<span class="sourceLineNo">1589</span>      throws ServiceException {<a name="line.1589"></a>
-<span class="sourceLineNo">1590</span>    try {<a name="line.1590"></a>
-<span class="sourceLineNo">1591</span>      master.checkInitialized();<a name="line.1591"></a>
-<span class="sourceLineNo">1592</span>      return master.getMasterQuotaManager().setQuota(req);<a name="line.1592"></a>
-<span class="sourceLineNo">1593</span>    } catch (Exception e) {<a name="line.1593"></a>
-<span class="sourceLineNo">1594</span>      throw new ServiceException(e);<a name="line.1594"></a>
-<span class="sourceLineNo">1595</span>    }<a name="line.1595"></a>
-<span class="sourceLineNo">1596</span>  }<a name="line.1596"></a>
-<span class="sourceLineNo">1597</span><a name="line.1597"></a>
-<span class="sourceLineNo">1598</span>  @Override<a name="line.1598"></a>
-<span class="sourceLineNo">1599</span>  public MajorCompactionTimestampResponse getLastMajorCompactionTimestamp(RpcController controller,<a name="line.1599"></a>
-<span class="sourceLineNo">1600</span>      MajorCompactionTimestampRequest request) throws ServiceException {<a name="line.1600"></a>
-<span class="sourceLineNo">1601</span>    MajorCompactionTimestampResponse.Builder response =<a name="line.1601"></a>
-<span class="sourceLineNo">1602</span>        MajorCompactionTimestampResponse.newBuilder();<a name="line.1602"></a>
-<span class="sourceLineNo">1603</span>    try {<a name="line.1603"></a>
-<span class="sourceLineNo">1604</span>      master.checkInitialized();<a name="line.1604"></a>
-<span class="sourceLineNo">1605</span>      response.setCompactionTimestamp(master.getLastMajorCompactionTimestamp(ProtobufUtil<a name="line.1605"></a>
-<span class="sourceLineNo">1606</span>          .toTableName(request.getTableName())));<a name="line.1606"></a>
-<span class="sourceLineNo">1607</span>    } catch (IOException e) {<a name="line.1607"></a>
-<span class="sourceLineNo">1608</span>      throw new ServiceException(e);<a name="line.1608"></a>
-<span class="sourceLineNo">1609</span>    }<a name="line.1609"></a>
-<span class="sourceLineNo">1610</span>    return response.build();<a name="line.1610"></a>
-<span class="sourceLineNo">1611</span>  }<a name="line.1611"></a>
-<span class="sourceLineNo">1612</span><a name="line.1612"></a>
-<span class="sourceLineNo">1613</span>  @Override<a name="line.1613"></a>
-<span class="sourceLineNo">1614</span>  public MajorCompactionTimestampResponse getLastMajorCompactionTimestampForRegion(<a name="line.1614"></a>
-<span class="sourceLineNo">1615</span>      RpcController controller, MajorCompactionTimestampForRegionRequest request)<a name="line.1615"></a>
-<span class="sourceLineNo">1616</span>      throws ServiceException {<a name="line.1616"></a>
-<span class="sourceLineNo">1617</span>    MajorCompactionTimestampResponse.Builder response =<a name="line.1617"></a>
-<span class="sourceLineNo">1618</span>        MajorCompactionTimestampResponse.newBuilder();<a name="line.1618"></a>
-<span class="sourceLineNo">1619</span>    try {<a name="line.1619"></a>
-<span class="sourceLineNo">1620</span>      master.checkInitialized();<a name="line.1620"></a>
-<span class="sourceLineNo">1621</span>      response.setCompactionTimestamp(master.getLastMajorCompactionTimestampForRegion(request<a name="line.1621"></a>
-<span class="sourceLineNo">1622</span>          .getRegion().getValue().toByteArray()));<a name="line.1622"></a>
-<span class="sourceLineNo">1623</span>    } catch (IOException e) {<a name="line.1623"></a>
-<span class="sourceLineNo">1624</span>      throw new ServiceException(e);<a name="line.1624"></a>
-<span class="sourceLineNo">1625</span>    }<a name="line.1625"></a>
-<span class="sourceLineNo">1626</span>    return response.build();<a name="line.1626"></a>
-<span class="sourceLineNo">1627</span>  }<a name="line.1627"></a>
-<span class="sourceLineNo">1628</span><a name="line.1628"></a>
-<span class="sourceLineNo">1629</span>  /**<a name="line.1629"></a>
-<span class="sourceLineNo">1630</span>   * Compact a region on the master.<a name="line.1630"></a>
-<span class="sourceLineNo">1631</span>   *<a name="line.1631"></a>
-<span class="sourceLineNo">1632</span>   * @param controller the RPC controller<a name="line.1632"></a>
-<span class="sourceLineNo">1633</span>   * @param request the request<a name="line.1633"></a>
-<span class="sourceLineNo">1634</span>   * @throws ServiceException<a name="line.1634"></a>
-<span class="sourceLineNo">1635</span>   */<a name="line.1635"></a>
-<span class="sourceLineNo">1636</span>  @Override<a name="line.1636"></a>
-<span class="sourceLineNo">1637</span>  @QosPriority(priority=HConstants.ADMIN_QOS)<a name="line.1637"></a>
-<span class="sourceLineNo">1638</span>  public CompactRegionResponse compactRegion(final RpcController controller,<a name="line.1638"></a>
-<span class="sourceLineNo">1639</span>    final CompactRegionRequest request) throws ServiceException {<a name="line.1639"></a>
-<span class="sourceLineNo">1640</span>    try {<a name="line.1640"></a>
-<span class="sourceLineNo">1641</span>      master.checkInitialized();<a name="line.1641"></a>
-<span class="sourceLineNo">1642</span>      byte[] regionName = request.getRegion().getValue().toByteArray();<a name="line.1642"></a>
-<span class="sourceLineNo">1643</span>      TableName tableName = RegionInfo.getTable(regionName);<a name="line.1643"></a>
-<span class="sourceLineNo">1644</span>      // if the region is a mob region, do the mob file compaction.<a name="line.1644"></a>
-<span class="sourceLineNo">1645</span>      if (MobUtils.isMobRegionName(tableName, regionName)) {<a name="line.1645"></a>
-<span class="sourceLineNo">1646</span>        checkHFileFormatVersionForMob();<a name="line.1646"></a>
-<span class="sourceLineNo">1647</span>        return compactMob(request, tableName);<a name="line.1647"></a>
-<span class="sourceLineNo">1648</span>      } else {<a name="line.1648"></a>
-<span class="sourceLineNo">1649</span>        return super.compactRegion(controller, request);<a name="line.1649"></a>
-<span class="sourceLineNo">1650</span>      }<a name="line.1650"></a>
-<span class="sourceLineNo">1651</span>    } catch (IOException ie) {<a name="line.1651"></a>
-<span class="sourceLineNo">1652</span>      throw new ServiceException(ie);<a name="line.1652"></a>
-<span class="sourceLineNo">1653</span>    }<a name="line.1653"></a>
-<span class="sourceLineNo">1654</span>  }<a name="line.1654"></a>
-<span class="sourceLineNo">1655</span><a name="line.1655"></a>
-<span class="sourceLineNo">1656</span>  /**<a name="line.1656"></a>
-<span class="sourceLineNo">1657</span>   * check configured hfile format version before to do compaction<a name="line.1657"></a>
-<span class="sourceLineNo">1658</span>   * @throws IOException throw IOException<a name="line.1658"></a>
-<span class="sourceLineNo">1659</span>   */<a name="line.1659"></a>
-<span class="sourceLineNo">1660</span>  private void checkHFileFormatVersionForMob() throws IOException {<a name="line.1660"></a>
-<span class="sourceLineNo">1661</span>    if (HFile.getFormatVersion(master.getConfiguration()) &lt; HFile.MIN_FORMAT_VERSION_WITH_TAGS) {<a name="line.1661"></a>
-<span class="sourceLineNo">1662</span>      LOG.error("A minimum HFile version of " + HFile.MIN_FORMAT_VERSION_WITH_TAGS<a name="line.1662"></a>
-<span class="sourceLineNo">1663</span>          + " is required for MOB compaction. Compaction will not run.");<a name="line.1663"></a>
-<span class="sourceLineNo">1664</span>      throw new IOException("A minimum HFile version of " + HFile.MIN_FORMAT_VERSION_WITH_TAGS<a name="line.1664"></a>
-<span class="sourceLineNo">1665</span>          + " is required for MOB feature. Consider setting " + HFile.FORMAT_VERSION_KEY<a name="line.1665"></a>
-<span class="sourceLineNo">1666</span>          + " accordingly.");<a name="line.1666"></a>
-<span class="sourceLineNo">1667</span>    }<a name="line.1667"></a>
-<span class="sourceLineNo">1668</span>  }<a name="line.1668"></a>
-<span class="sourceLineNo">1669</span><a name="line.1669"></a>
-<span class="sourceLineNo">1670</span>  @Override<a name="line.1670"></a>
-<span class="sourceLineNo">1671</span>  @QosPriority(priority=HConstants.ADMIN_QOS)<a name="line.1671"></a>
-<span class="sourceLineNo">1672</span>  public GetRegionInfoResponse getRegionInfo(final RpcController controller,<a name="line.1672"></a>
-<span class="sourceLineNo">1673</span>    final GetRegionInfoRequest request) throws ServiceException {<a name="line.1673"></a>
-<span class="sourceLineNo">1674</span>    byte[] regionName = request.getRegion().getValue().toByteArray();<a name="line.1674"></a>
-<span class="sourceLineNo">1675</span>    TableName tableName = RegionInfo.getTable(regionName);<a name="line.1675"></a>
-<span class="sourceLineNo">1676</span>    if (MobUtils.isMobRegionName(tableName, regionName)) {<a name="line.1676"></a>
-<span class="sourceLineNo">1677</span>      // a dummy region info contains the compaction state.<a name="line.1677"></a>
-<span class="sourceLineNo">1678</span>      RegionInfo mobRegionInfo = MobUtils.getMobRegionInfo(tableName);<a name="line.1678"></a>
-<span class="sourceLineNo">1679</span>      GetRegionInfoResponse.Builder builder = GetRegionInfoResponse.newBuilder();<a name="line.1679"></a>
-<span class="sourceLineNo">1680</span>      builder.setRegionInfo(ProtobufUtil.toRegionInfo(mobRegionInfo));<a name="line.1680"></a>
-<span class="sourceLineNo">1681</span>      if (request.hasCompactionState() &amp;&amp; request.getCompactionState()) {<a name="line.1681"></a>
-<span class="sourceLineNo">1682</span>        builder.setCompactionState(master.getMobCompactionState(tableName));<a name="line.1682"></a>
-<span class="sourceLineNo">1683</span>      }<a name="line.1683"></a>
-<span class="sourceLineNo">1684</span>      return builder.build();<a name="line.1684"></a>
-<span class="sourceLineNo">1685</span>    } else {<a name="line.1685"></a>
-<span class="sourceLineNo">1686</span>      return super.getRegionInfo(controller, request);<a name="line.1686"></a>
-<span class="sourceLineNo">1687</span>    }<a name="line.1687"></a>
-<span class="sourceLineNo">1688</span>  }<a name="line.1688"></a>
-<span class="sourceLineNo">1689</span><a name="line.1689"></a>
-<span class="sourceLineNo">1690</span>  /**<a name="line.1690"></a>
-<span class="sourceLineNo">1691</span>   * Compacts the mob files in the current table.<a name="line.1691"></a>
-<span class="sourceLineNo">1692</span>   * @param request the request.<a name="line.1692"></a>
-<span class="sourceLineNo">1693</span>   * @param tableName the current table name.<a name="line.1693"></a>
-<span class="sourceLineNo">1694</span>   * @return The response of the mob file compaction.<a name="line.1694"></a>
-<span class="sourceLineNo">1695</span>   * @throws IOException<a name="line.1695"></a>
-<span class="sourceLineNo">1696</span>   */<a name="line.1696"></a>
-<span class="sourceLineNo">1697</span>  private CompactRegionResponse compactMob(final CompactRegionRequest request,<a name="line.1697"></a>
-<span class="sourceLineNo">1698</span>    TableName tableName) throws IOException {<a name="line.1698"></a>
-<span class="sourceLineNo">1699</span>    if (!master.getTableStateManager().isTableState(tableName, TableState.State.ENABLED)) {<a name="line.1699"></a>
-<span class="sourceLineNo">1700</span>      throw new DoNotRetryIOException("Table " + tableName + " is not enabled");<a name="line.1700"></a>
-<span class="sourceLineNo">1701</span>    }<a name="line.1701"></a>
-<span class="sourceLineNo">1702</span>    boolean allFiles = false;<a name="line.1702"></a>
-<span class="sourceLineNo">1703</span>    List&lt;ColumnFamilyDescriptor&gt; compactedColumns = new ArrayList&lt;&gt;();<a name="line.1703"></a>
-<span class="sourceLineNo">1704</span>    ColumnFamilyDescriptor[] hcds = master.getTableDescriptors().get(tableName).getColumnFamilies();<a name="line.1704"></a>
-<span class="sourceLineNo">1705</span>    byte[] family = null;<a name="line.1705"></a>
-<span class="sourceLineNo">1706</span>    if (request.hasFamily()) {<a name="line.1706"></a>
-<span class="sourceLineNo">1707</span>      family = request.getFamily().toByteArray();<a name="line.1707"></a>
-<span class="sourceLineNo">1708</span>      for (ColumnFamilyDescriptor hcd : hcds) {<a name="line.1708"></a>
-<span class="sourceLineNo">1709</span>        if (Bytes.equals(family, hcd.getName())) {<a name="line.1709"></a>
-<span class="sourceLineNo">1710</span>          if (!hcd.isMobEnabled()) {<a name="line.1710"></a>
-<span class="sourceLineNo">1711</span>            LOG.error("Column family " + hcd.getNameAsString() + " is not a mob column family");<a name="line.1711"></a>
-<span class="sourceLineNo">1712</span>            throw new DoNotRetryIOException("Column family " + hcd.getNameAsString()<a name="line.1712"></a>
-<span class="sourceLineNo">1713</span>                    + " is not a mob column family");<a name="line.1713"></a>
-<span class="sourceLineNo">1714</span>          }<a name="line.1714"></a>
-<span class="sourceLineNo">1715</span>          compactedColumns.add(hcd);<a name="line.1715"></a>
-<span class="sourceLineNo">1716</span>        }<a name="line.1716"></a>
-<span class="sourceLineNo">1717</span>      }<a name="line.1717"></a>
-<span class="sourceLineNo">1718</span>    } else {<a name="line.1718"></a>
-<span class="sourceLineNo">1719</span>      for (ColumnFamilyDescriptor hcd : hcds) {<a name="line.1719"></a>
-<span class="sourceLineNo">1720</span>        if (hcd.isMobEnabled()) {<a name="line.1720"></a>
-<span class="sourceLineNo">1721</span>          compactedColumns.add(hcd);<a name="line.1721"></a>
-<span class="sourceLineNo">1722</span>        }<a name="line.1722"></a>
-<span class="sourceLineNo">1723</span>      }<a name="line.1723"></a>
-<span class="sourceLineNo">1724</span>    }<a name="line.1724"></a>
-<span class="sourceLineNo">1725</span>    if (compactedColumns.isEmpty()) {<a name="line.1725"></a>
-<span class="sourceLineNo">1726</span>      LOG.error("No mob column families are assigned in the mob compaction");<a name="line.1726"></a>
-<span class="sourceLineNo">1727</span>      throw new DoNotRetryIOException(<a name="line.1727"></a>
-<span class="sourceLineNo">1728</span>              "No mob column families are assigned in the mob compaction");<a name="line.1728"></a>
-<span class="sourceLineNo">1729</span>    }<a name="line.1729"></a>
-<span class="sourceLineNo">1730</span>    if (request.hasMajor() &amp;&amp; request.getMajor()) {<a name="line.1730"></a>
-<span class="sourceLineNo">1731</span>      allFiles = true;<a name="line.1731"></a>
-<span class="sourceLineNo">1732</span>    }<a name="line.1732"></a>
-<span class="sourceLineNo">1733</span>    String familyLogMsg = (family != null) ? Bytes.toString(family) : "";<a name="line.1733"></a>
-<span class="sourceLineNo">1734</span>    if (LOG.isTraceEnabled()) {<a name="line.1734"></a>
-<span class="sourceLineNo">1735</span>      LOG.trace("User-triggered mob compaction requested for table: "<a name="line.1735"></a>
-<span class="sourceLineNo">1736</span>              + tableName.getNameAsString() + " for column family: " + familyLogMsg);<a name="line.1736"></a>
-<span class="sourceLineNo">1737</span>    }<a name="line.1737"></a>
-<span class="sourceLineNo">1738</span>    master.requestMobCompaction(tableName, compactedColumns, allFiles);<a name="line.1738"></a>
-<span class="sourceLineNo">1739</span>    return CompactRegionResponse.newBuilder().build();<a name="line.1739"></a>
-<span class="sourceLineNo">1740</span>  }<a name="line.1740"></a>
-<span class="sourceLineNo">1741</span><a name="line.1741"></a>
-<span class="sourceLineNo">1742</span>  @Override<a name="line.1742"></a>
-<span class="sourceLineNo">1743</span>  public IsBalancerEnabledResponse isBalancerEnabled(RpcController controller,<a name="line.1743"></a>
-<span class="sourceLineNo">1744</span>      IsBalancerEnabledRequest request) throws ServiceException {<a name="line.1744"></a>
-<span class="sourceLineNo">1745</span>    IsBalancerEnabledResponse.Builder response = IsBalancerEnabledResponse.newBuilder();<a name="line.1745"></a>
-<span class="sourceLineNo">1746</span>    response.setEnabled(master.isBalancerOn());<a name="line.1746"></a>
-<span class="sourceLineNo">1747</span>    return response.build();<a name="line.1747"></a>
-<span class="sourceLineNo">1748</span>  }<a name="line.1748"></a>
-<span class="sourceLineNo">1749</span><a name="line.1749"></a>
-<span class="sourceLineNo">1750</span>  @Override<a name="line.1750"></a>
-<span class="sourceLineNo">1751</span>  public SetSplitOrMergeEnabledResponse setSplitOrMergeEnabled(RpcController controller,<a name="line.1751"></a>
-<span class="sourceLineNo">1752</span>    SetSplitOrMergeEnabledRequest request) throws ServiceException {<a name="line.1752"></a>
-<span class="sourceLineNo">1753</span>    SetSplitOrMergeEnabledResponse.Builder response = SetSplitOrMergeEnabledResponse.newBuilder();<a name="line.1753"></a>
-<span class="sourceLineNo">1754</span>    try {<a name="line.1754"></a>
-<span class="sourceLineNo">1755</span>      master.checkInitialized();<a name="line.1755"></a>
-<span class="sourceLineNo">1756</span>      boolean newValue = request.getEnabled();<a name="line.1756"></a>
-<span class="sourceLineNo">1757</span>      for (MasterProtos.MasterSwitchType masterSwitchType: request.getSwitchTypesList()) {<a name="line.1757"></a>
-<span class="sourceLineNo">1758</span>        MasterSwitchType switchType = convert(masterSwitchType);<a name="line.1758"></a>
-<span class="sourceLineNo">1759</span>        boolean oldValue = master.isSplitOrMergeEnabled(switchType);<a name="line.1759"></a>
-<span class="sourceLineNo">1760</span>        response.addPrevValue(oldValue);<a name="line.1760"></a>
+<span class="sourceLineNo">1527</span>    response.setInMaintenanceMode(master.isInMaintenanceMode());<a name="line.1527"></a>
+<span class="sourceLineNo">1528</span>    return response.build();<a name="line.1528"></a>
+<span class="sourceLineNo">1529</span>  }<a name="line.1529"></a>
+<span class="sourceLineNo">1530</span><a name="line.1530"></a>
+<span class="sourceLineNo">1531</span>  @Override<a name="line.1531"></a>
+<span class="sourceLineNo">1532</span>  public UnassignRegionResponse unassignRegion(RpcController controller,<a name="line.1532"></a>
+<span class="sourceLineNo">1533</span>      UnassignRegionRequest req) throws ServiceException {<a name="line.1533"></a>
+<span class="sourceLineNo">1534</span>    try {<a name="line.1534"></a>
+<span class="sourceLineNo">1535</span>      final byte [] regionName = req.getRegion().getValue().toByteArray();<a name="line.1535"></a>
+<span class="sourceLineNo">1536</span>      RegionSpecifierType type = req.getRegion().getType();<a name="line.1536"></a>
+<span class="sourceLineNo">1537</span>      final boolean force = req.getForce();<a name="line.1537"></a>
+<span class="sourceLineNo">1538</span>      UnassignRegionResponse urr = UnassignRegionResponse.newBuilder().build();<a name="line.1538"></a>
+<span class="sourceLineNo">1539</span><a name="line.1539"></a>
+<span class="sourceLineNo">1540</span>      master.checkInitialized();<a name="line.1540"></a>
+<span class="sourceLineNo">1541</span>      if (type != RegionSpecifierType.REGION_NAME) {<a name="line.1541"></a>
+<span class="sourceLineNo">1542</span>        LOG.warn("unassignRegion specifier type: expected: " + RegionSpecifierType.REGION_NAME<a name="line.1542"></a>
+<span class="sourceLineNo">1543</span>          + " actual: " + type);<a name="line.1543"></a>
+<span class="sourceLineNo">1544</span>      }<a name="line.1544"></a>
+<span class="sourceLineNo">1545</span>      Pair&lt;RegionInfo, ServerName&gt; pair =<a name="line.1545"></a>
+<span class="sourceLineNo">1546</span>        MetaTableAccessor.getRegion(master.getConnection(), regionName);<a name="line.1546"></a>
+<span class="sourceLineNo">1547</span>      if (Bytes.equals(RegionInfoBuilder.FIRST_META_REGIONINFO.getRegionName(),regionName)) {<a name="line.1547"></a>
+<span class="sourceLineNo">1548</span>        pair = new Pair&lt;&gt;(RegionInfoBuilder.FIRST_META_REGIONINFO,<a name="line.1548"></a>
+<span class="sourceLineNo">1549</span>            master.getMetaTableLocator().getMetaRegionLocation(master.getZooKeeper()));<a name="line.1549"></a>
+<span class="sourceLineNo">1550</span>      }<a name="line.1550"></a>
+<span class="sourceLineNo">1551</span>      if (pair == null) {<a name="line.1551"></a>
+<span class="sourceLineNo">1552</span>        throw new UnknownRegionException(Bytes.toString(regionName));<a name="line.1552"></a>
+<span class="sourceLineNo">1553</span>      }<a name="line.1553"></a>
+<span class="sourceLineNo">1554</span><a name="line.1554"></a>
+<span class="sourceLineNo">1555</span>      RegionInfo hri = pair.getFirst();<a name="line.1555"></a>
+<span class="sourceLineNo">1556</span>      if (master.cpHost != null) {<a name="line.1556"></a>
+<span class="sourceLineNo">1557</span>        master.cpHost.preUnassign(hri, force);<a name="line.1557"></a>
+<span class="sourceLineNo">1558</span>      }<a name="line.1558"></a>
+<span class="sourceLineNo">1559</span>      LOG.debug(master.getClientIdAuditPrefix() + " unassign " + hri.getRegionNameAsString()<a name="line.1559"></a>
+<span class="sourceLineNo">1560</span>          + " in current location if it is online and reassign.force=" + force);<a name="line.1560"></a>
+<span class="sourceLineNo">1561</span>      master.getAssignmentManager().unassign(hri);<a name="line.1561"></a>
+<span class="sourceLineNo">1562</span>      if (master.cpHost != null) {<a name="line.1562"></a>
+<span class="sourceLineNo">1563</span>        master.cpHost.postUnassign(hri, force);<a name="line.1563"></a>
+<span class="sourceLineNo">1564</span>      }<a name="line.1564"></a>
+<span class="sourceLineNo">1565</span><a name="line.1565"></a>
+<span class="sourceLineNo">1566</span>      return urr;<a name="line.1566"></a>
+<span class="sourceLineNo">1567</span>    } catch (IOException ioe) {<a name="line.1567"></a>
+<span class="sourceLineNo">1568</span>      throw new ServiceException(ioe);<a name="line.1568"></a>
+<span class="sourceLineNo">1569</span>    }<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>  @Override<a name="line.1572"></a>
+<span class="sourceLineNo">1573</span>  public ReportRegionStateTransitionResponse reportRegionStateTransition(RpcController c,<a name="line.1573"></a>
+<span class="sourceLineNo">1574</span>      ReportRegionStateTransitionRequest req) throws ServiceException {<a name="line.1574"></a>
+<span class="sourceLineNo">1575</span>    try {<a name="line.1575"></a>
+<span class="sourceLineNo">1576</span>      master.checkServiceStarted();<a name="line.1576"></a>
+<span class="sourceLineNo">1577</span>      return master.getAssignmentManager().reportRegionStateTransition(req);<a name="line.1577"></a>
+<span class="sourceLineNo">1578</span>    } catch (IOException ioe) {<a name="line.1578"></a>
+<span class="sourceLineNo">1579</span>      throw new ServiceException(ioe);<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">1582</span><a name="line.1582"></a>
+<span class="sourceLineNo">1583</span>  @Override<a name="line.1583"></a>
+<span class="sourceLineNo">1584</span>  public SetQuotaResponse setQuota(RpcController c, SetQuotaRequest req)<a name="line.1584"></a>
+<span class="sourceLineNo">1585</span>      throws ServiceException {<a name="line.1585"></a>
+<span class="sourceLineNo">1586</span>    try {<a name="line.1586"></a>
+<span class="sourceLineNo">1587</span>      master.checkInitialized();<a name="line.1587"></a>
+<span class="sourceLineNo">1588</span>      return master.getMasterQuotaManager().setQuota(req);<a name="line.1588"></a>
+<span class="sourceLineNo">1589</span>    } catch (Exception e) {<a name="line.1589"></a>
+<span class="sourceLineNo">1590</span>      throw new ServiceException(e);<a name="line.1590"></a>
+<span class="sourceLineNo">1591</span>    }<a name="line.1591"></a>
+<span class="sourceLineNo">1592</span>  }<a name="line.1592"></a>
+<span class="sourceLineNo">1593</span><a name="line.1593"></a>
+<span class="sourceLineNo">1594</span>  @Override<a name="line.1594"></a>
+<span class="sourceLineNo">1595</span>  public MajorCompactionTimestampResponse getLastMajorCompactionTimestamp(RpcController controller,<a name="line.1595"></a>
+<span class="sourceLineNo">1596</span>      MajorCompactionTimestampRequest request) throws ServiceException {<a name="line.1596"></a>
+<span class="sourceLineNo">1597</span>    MajorCompactionTimestampResponse.Builder response =<a name="line.1597"></a>
+<span class="sourceLineNo">1598</span>        MajorCompactionTimestampResponse.newBuilder();<a name="line.1598"></a>
+<span class="sourceLineNo">1599</span>    try {<a name="line.1599"></a>
+<span class="sourceLineNo">1600</span>      master.checkInitialized();<a name="line.1600"></a>
+<span class="sourceLineNo">1601</span>      response.setCompactionTimestamp(master.getLastMajorCompactionTimestamp(ProtobufUtil<a name="line.1601"></a>
+<span class="sourceLineNo">1602</span>          .toTableName(request.getTableName())));<a name="line.1602"></a>
+<span class="sourceLineNo">1603</span>    } catch (IOException e) {<a name="line.1603"></a>
+<span class="sourceLineNo">1604</span>      throw new ServiceException(e);<a name="line.1604"></a>
+<span class="sourceLineNo">1605</span>    }<a name="line.1605"></a>
+<span class="sourceLineNo">1606</span>    return response.build();<a name="line.1606"></a>
+<span class="sourceLineNo">1607</span>  }<a name="line.1607"></a>
+<span class="sourceLineNo">1608</span><a name="line.1608"></a>
+<span class="sourceLineNo">1609</span>  @Override<a name="line.1609"></a>
+<span class="sourceLineNo">1610</span>  public MajorCompactionTimestampResponse getLastMajorCompactionTimestampForRegion(<a name="line.1610"></a>
+<span class="sourceLineNo">1611</span>      RpcController controller, MajorCompactionTimestampForRegionRequest request)<a name="line.1611"></a>
+<span class="sourceLineNo">1612</span>      throws ServiceException {<a name="line.1612"></a>
+<span class="sourceLineNo">1613</span>    MajorCompactionTimestampResponse.Builder response =<a name="line.1613"></a>
+<span class="sourceLineNo">1614</span>        MajorCompactionTimestampResponse.newBuilder();<a name="line.1614"></a>
+<span class="sourceLineNo">1615</span>    try {<a name="line.1615"></a>
+<span class="sourceLineNo">1616</span>      master.checkInitialized();<a name="line.1616"></a>
+<span class="sourceLineNo">1617</span>      response.setCompactionTimestamp(master.getLastMajorCompactionTimestampForRegion(request<a name="line.1617"></a>
+<span class="sourceLineNo">1618</span>          .getRegion().getValue().toByteArray()));<a name="line.1618"></a>
+<span class="sourceLineNo">1619</span>    } catch (IOException e) {<a name="line.1619"></a>
+<span class="sourceLineNo">1620</span>      throw new ServiceException(e);<a name="line.1620"></a>
+<span class="sourceLineNo">1621</span>    }<a name="line.1621"></a>
+<span class="sourceLineNo">1622</span>    return response.build();<a name="line.1622"></a>
+<span class="sourceLineNo">1623</span>  }<a name="line.1623"></a>
+<span class="sourceLineNo">1624</span><a name="line.1624"></a>
+<span class="sourceLineNo">1625</span>  /**<a name="line.1625"></a>
+<span class="sourceLineNo">1626</span>   * Compact a region on the master.<a name="line.1626"></a>
+<span class="sourceLineNo">1627</span>   *<a name="line.1627"></a>
+<span class="sourceLineNo">1628</span>   * @param controller the RPC controller<a name="line.1628"></a>
+<span class="sourceLineNo">1629</span>   * @param request the request<a name="line.1629"></a>
+<span class="sourceLineNo">1630</span>   * @throws ServiceException<a name="line.1630"></a>
+<span class="sourceLineNo">1631</span>   */<a name="line.1631"></a>
+<span class="sourceLineNo">1632</span>  @Override<a name="line.1632"></a>
+<span class="sourceLineNo">1633</span>  @QosPriority(priority=HConstants.ADMIN_QOS)<a name="line.1633"></a>
+<span class="sourceLineNo">1634</span>  public CompactRegionResponse compactRegion(final RpcController controller,<a name="line.1634"></a>
+<span class="sourceLineNo">1635</span>    final CompactRegionRequest request) throws ServiceException {<a name="line.1635"></a>
+<span class="sourceLineNo">1636</span>    try {<a name="line.1636"></a>
+<span class="sourceLineNo">1637</span>      master.checkInitialized();<a name="line.1637"></a>
+<span class="sourceLineNo">1638</span>      byte[] regionName = request.getRegion().getValue().toByteArray();<a name="line.1638"></a>
+<span class="sourceLineNo">1639</span>      TableName tableName = RegionInfo.getTable(regionName);<a name="line.1639"></a>
+<span class="sourceLineNo">1640</span>      // if the region is a mob region, do the mob file compaction.<a name="line.1640"></a>
+<span class="sourceLineNo">1641</span>      if (MobUtils.isMobRegionName(tableName, regionName)) {<a name="line.1641"></a>
+<span class="sourceLineNo">1642</span>        checkHFileFormatVersionForMob();<a name="line.1642"></a>
+<span class="sourceLineNo">1643</span>        return compactMob(request, tableName);<a name="line.1643"></a>
+<span class="sourceLineNo">1644</span>      } else {<a name="line.1644"></a>
+<span class="sourceLineNo">1645</span>        return super.compactRegion(controller, request);<a name="line.1645"></a>
+<span class="sourceLineNo">1646</span>      }<a name="line.1646"></a>
+<span class="sourceLineNo">1647</span>    } catch (IOException ie) {<a name="line.1647"></a>
+<span class="sourceLineNo">1648</span>      throw new ServiceException(ie);<a name="line.1648"></a>
+<span class="sourceLineNo">1649</span>    }<a name="line.1649"></a>
+<span class="sourceLineNo">1650</span>  }<a name="line.1650"></a>
+<span class="sourceLineNo">1651</span><a name="line.1651"></a>
+<span class="sourceLineNo">1652</span>  /**<a name="line.1652"></a>
+<span class="sourceLineNo">1653</span>   * check configured hfile format version before to do compaction<a name="line.1653"></a>
+<span class="sourceLineNo">1654</span>   * @throws IOException throw IOException<a name="line.1654"></a>
+<span class="sourceLineNo">1655</span>   */<a name="line.1655"></a>
+<span class="sourceLineNo">1656</span>  private void checkHFileFormatVersionForMob() throws IOException {<a name="line.1656"></a>
+<span class="sourceLineNo">1657</span>    if (HFile.getFormatVersion(master.getConfiguration()) &lt; HFile.MIN_FORMAT_VERSION_WITH_TAGS) {<a name="line.1657"></a>
+<span class="sourceLineNo">1658</span>      LOG.error("A minimum HFile version of " + HFile.MIN_FORMAT_VERSION_WITH_TAGS<a name="line.1658"></a>
+<span class="sourceLineNo">1659</span>          + " is required for MOB compaction. Compaction will not run.");<a name="line.1659"></a>
+<span class="sourceLineNo">1660</span>      throw new IOException("A minimum HFile version of " + HFile.MIN_FORMAT_VERSION_WITH_TAGS<a name="line.1660"></a>
+<span class="sourceLineNo">1661</span>          + " is required for MOB feature. Consider setting " + HFile.FORMAT_VERSION_KEY<a name="line.1661"></a>
+<span class="sourceLineNo">1662</span>          + " accordingly.");<a name="line.1662"></a>
+<span class="sourceLineNo">1663</span>    }<a name="line.1663"></a>
+<span class="sourceLineNo">1664</span>  }<a name="line.1664"></a>
+<span class="sourceLineNo">1665</span><a name="line.1665"></a>
+<span class="sourceLineNo">1666</span>  @Override<a name="line.1666"></a>
+<span class="sourceLineNo">1667</span>  @QosPriority(priority=HConstants.ADMIN_QOS)<a name="line.1667"></a>
+<span class="sourceLineNo">1668</span>  public GetRegionInfoResponse getRegionInfo(final RpcController controller,<a name="line.1668"></a>
+<span class="sourceLineNo">1669</span>    final GetRegionInfoRequest request) throws ServiceException {<a name="line.1669"></a>
+<span class="sourceLineNo">1670</span>    byte[] regionName = request.getRegion().getValue().toByteArray();<a name="line.1670"></a>
+<span class="sourceLineNo">1671</span>    TableName tableName = RegionInfo.getTable(regionName);<a name="line.1671"></a>
+<span class="sourceLineNo">1672</span>    if (MobUtils.isMobRegionName(tableName, regionName)) {<a name="line.1672"></a>
+<span class="sourceLineNo">1673</span>      // a dummy region info contains the compaction state.<a name="line.1673"></a>
+<span class="sourceLineNo">1674</span>      RegionInfo mobRegionInfo = MobUtils.getMobRegionInfo(tableName);<a name="line.1674"></a>
+<span class="sourceLineNo">1675</span>      GetRegionInfoResponse.Builder builder = GetRegionInfoResponse.newBuilder();<a name="line.1675"></a>
+<span class="sourceLineNo">1676</span>      builder.setRegionInfo(ProtobufUtil.toRegionInfo(mobRegionInfo));<a name="line.1676"></a>
+<span class="sourceLineNo">1677</span>      if (request.hasCompactionState() &amp;&amp; request.getCompactionState()) {<a name="line.1677"></a>
+<span class="sourceLineNo">1678</span>        builder.setCompactionState(master.getMobCompactionState(tableName));<a name="line.1678"></a>
+<span class="sourceLineNo">1679</span>      }<a name="line.1679"></a>
+<span class="sourceLineNo">1680</span>      return builder.build();<a name="line.1680"></a>
+<span class="sourceLineNo">1681</span>    } else {<a name="line.1681"></a>
+<span class="sourceLineNo">1682</span>      return super.getRegionInfo(controller, request);<a name="line.1682"></a>
+<span class="sourceLineNo">1683</span>    }<a name="line.1683"></a>
+<span class="sourceLineNo">1684</span>  }<a name="line.1684"></a>
+<span class="sourceLineNo">1685</span><a name="line.1685"></a>
+<span class="sourceLineNo">1686</span>  /**<a name="line.1686"></a>
+<span class="sourceLineNo">1687</span>   * Compacts the mob files in the current table.<a name="line.1687"></a>
+<span class="sourceLineNo">1688</span>   * @param request the request.<a name="line.1688"></a>
+<span class="sourceLineNo">1689</span>   * @param tableName the current table name.<a name="line.1689"></a>
+<span class="sourceLineNo">1690</span>   * @return The response of the mob file compaction.<a name="line.1690"></a>
+<span class="sourceLineNo">1691</span>   * @throws IOException<a name="line.1691"></a>
+<span class="sourceLineNo">1692</span>   */<a name="line.1692"></a>
+<span class="sourceLineNo">1693</span>  private CompactRegionResponse compactMob(final CompactRegionRequest request,<a name="line.1693"></a>
+<span class="sourceLineNo">1694</span>    TableName tableName) throws IOException {<a name="line.1694"></a>
+<span class="sourceLineNo">1695</span>    if (!master.getTableStateManager().isTableState(tableName, TableState.State.ENABLED)) {<a name="line.1695"></a>
+<span class="sourceLineNo">1696</span>      throw new DoNotRetryIOException("Table " + tableName + " is not enabled");<a name="line.1696"></a>
+<span class="sourceLineNo">1697</span>    }<a name="line.1697"></a>
+<span class="sourceLineNo">1698</span>    boolean allFiles = false;<a name="line.1698"></a>
+<span class="sourceLineNo">1699</span>    List&lt;ColumnFamilyDescriptor&gt; compactedColumns = new ArrayList&lt;&gt;();<a name="line.1699"></a>
+<span class="sourceLineNo">1700</span>    ColumnFamilyDescriptor[] hcds = master.getTableDescriptors().get(tableName).getColumnFamilies();<a name="line.1700"></a>
+<span class="sourceLineNo">1701</span>    byte[] family = null;<a name="line.1701"></a>
+<span class="sourceLineNo">1702</span>    if (request.hasFamily()) {<a name="line.1702"></a>
+<span class="sourceLineNo">1703</span>      family = request.getFamily().toByteArray();<a name="line.1703"></a>
+<span class="sourceLineNo">1704</span>      for (ColumnFamilyDescriptor hcd : hcds) {<a name="line.1704"></a>
+<span class="sourceLineNo">1705</span>        if (Bytes.equals(family, hcd.getName())) {<a name="line.1705"></a>
+<span class="sourceLineNo">1706</span>          if (!hcd.isMobEnabled()) {<a name="line.1706"></a>
+<span class="sourceLineNo">1707</span>            LOG.error("Column family " + hcd.getNameAsString() + " is not a mob column family");<a name="line.1707"></a>
+<span class="sourceLineNo">1708</span>            throw new DoNotRetryIOException("Column family " + hcd.getNameAsString()<a name="line.1708"></a>
+<span class="sourceLineNo">1709</span>                    + " is not a mob column family");<a name="line.1709"></a>
+<span class="sourceLineNo">1710</span>          }<a name="line.1710"></a>
+<span class="sourceLineNo">1711</span>          compactedColumns.add(hcd);<a name="line.1711"></a>
+<span class="sourceLineNo">1712</span>        }<a name="line.1712"></a>
+<span class="sourceLineNo">1713</span>      }<a name="line.1713"></a>
+<span class="sourceLineNo">1714</span>    } else {<a name="line.1714"></a>
+<span class="sourceLineNo">1715</span>      for (ColumnFamilyDescriptor hcd : hcds) {<a name="line.1715"></a>
+<span class="sourceLineNo">1716</span>        if (hcd.isMobEnabled()) {<a name="line.1716"></a>
+<span class="sourceLineNo">1717</span>          compactedColumns.add(hcd);<a name="line.1717"></a>
+<span class="sourceLineNo">1718</span>        }<a name="line.1718"></a>
+<span class="sourceLineNo">1719</span>      }<a name="line.1719"></a>
+<span class="sourceLineNo">1720</span>    }<a name="line.1720"></a>
+<span class="sourceLineNo">1721</span>    if (compactedColumns.isEmpty()) {<a name="line.1721"></a>
+<span class="sourceLineNo">1722</span>      LOG.error("No mob column families are assigned in the mob compaction");<a name="line.1722"></a>
+<span class="sourceLineNo">1723</span>      throw new DoNotRetryIOException(<a name="line.1723"></a>
+<span class="sourceLineNo">1724</span>              "No mob column families are assigned in the mob compaction");<a name="line.1724"></a>
+<span class="sourceLineNo">1725</span>    }<a name="line.1725"></a>
+<span class="sourceLineNo">1726</span>    if (request.hasMajor() &amp;&amp; request.getMajor()) {<a name="line.1726"></a>
+<span class="sourceLineNo">1727</span>      allFiles = true;<a name="line.1727"></a>
+<span class="sourceLineNo">1728</span>    }<a name="line.1728"></a>
+<span class="sourceLineNo">1729</span>    String familyLogMsg = (family != null) ? Bytes.toString(family) : "";<a name="line.1729"></a>
+<span class="sourceLineNo">1730</span>    if (LOG.isTraceEnabled()) {<a name="line.1730"></a>
+<span class="sourceLineNo">1731</span>      LOG.trace("User-triggered mob compaction requested for table: "<a name="line.1731"></a>
+<span class="sourceLineNo">1732</span>              + tableName.getNameAsString() + " for column family: " + familyLogMsg);<a name="line.1732"></a>
+<span class="sourceLineNo">1733</span>    }<a name="line.1733"></a>
+<span class="sourceLineNo">1734</span>    master.requestMobCompaction(tableName, compactedColumns, allFiles);<a name="line.1734"></a>
+<span class="sourceLineNo">1735</span>    return CompactRegionResponse.newBuilder().build();<a name="line.1735"></a>
+<span class="sourceLineNo">1736</span>  }<a name="line.1736"></a>
+<span class="sourceLineNo">1737</span><a name="line.1737"></a>
+<span class="sourceLineNo">1738</span>  @Override<a name="line.1738"></a>
+<span class="sourceLineNo">1739</span>  public IsBalancerEnabledResponse isBalancerEnabled(RpcController controller,<a name="line.1739"></a>
+<span class="sourceLineNo">1740</span>      IsBalancerEnabledRequest request) throws ServiceException {<a name="line.1740"></a>
+<span class="sourceLineNo">1741</span>    IsBalancerEnabledResponse.Builder response = IsBalancerEnabledResponse.newBuilder();<a name="line.1741"></a>
+<span class="sourceLineNo">1742</span>    response.setEnabled(master.isBalancerOn());<a name="line.1742"></a>
+<span class="sourceLineNo">1743</span>    return response.build();<a name="line.1743"></a>
+<span class="sourceLineNo">1744</span>  }<a name="line.1744"></a>
+<span class="sourceLineNo">1745</span><a name="line.1745"></a>
+<span class="sourceLineNo">1746</span>  @Override<a name="line.1746"></a>
+<span class="sourceLineNo">1747</span>  public SetSplitOrMergeEnabledResponse setSplitOrMergeEnabled(RpcController controller,<a name="line.1747"></a>
+<span class="sourceLineNo">1748</span>    SetSplitOrMergeEnabledRequest request) throws ServiceException {<a name="line.1748"></a>
+<span class="sourceLineNo">1749</span>    SetSplitOrMergeEnabledResponse.Builder response = SetSplitOrMergeEnabledResponse.newBuilder();<a name="line.1749"></a>
+<span class="sourceLineNo">1750</span>    try {<a name="line.1750"></a>
+<span class="sourceLineNo">1751</span>      master.checkInitialized();<a name="line.1751"></a>
+<span class="sourceLineNo">1752</span>      boolean newValue = request.getEnabled();<a name="line.1752"></a>
+<span class="sourceLineNo">1753</span>      for (MasterProtos.MasterSwitchType masterSwitchType: request.getSwitchTypesList()) {<a name="line.1753"></a>
+<span class="sourceLineNo">1754</span>        MasterSwitchType switchType = convert(masterSwitchType);<a name="line.1754"></a>
+<span class="sourceLineNo">1755</span>        boolean oldValue = master.isSplitOrMergeEnabled(switchType);<a name="line.1755"></a>
+<span class="sourceLineNo">1756</span>        response.addPrevValue(oldValue);<a name="line.1756"></a>
+<span class="sourceLineNo">1757</span>        if (master.cpHost != null) {<a name="line.1757"></a>
+<span class="sourceLineNo">1758</span>          master.cpHost.preSetSplitOrMergeEnabled(newValue, switchType);<a name="line.1758"></a>
+<span class="sourceLineNo">1759</span>        }<a name="line.1759"></a>
+<span class="sourceLineNo">1760</span>        master.getSplitOrMergeTracker().setSplitOrMergeEnabled(newValue, switchType);<a name="line.1760"></a>
 <span class="sourceLineNo">1761</span>        if (master.cpHost != null) {<a name="line.1761"></a>
-<span class="sourceLineNo">1762</span>          master.cpHost.preSetSplitOrMergeEnabled(newValue, switchType);<a name="line.1762"></a>
+<span class="sourceLineNo">1762</span>          master.cpHost.postSetSplitOrMergeEnabled(newValue, switchType);<a name="line.1762"></a>
 <span class="sourceLineNo">1763</span>        }<a name="line.1763"></a>
-<span class="sourceLineNo">1764</span>        master.getSplitOrMergeTracker().setSplitOrMergeEnabled(newValue, switchType);<a name="line.1764"></a>
-<span class="sourceLineNo">1765</span>        if (master.cpHost != null) {<a name="line.1765"></a>
-<span class="sourceLineNo">1766</span>          master.cpHost.postSetSplitOrMergeEnabled(newValue, switchType);<a name="line.1766"></a>
-<span class="sourceLineNo">1767</span>        }<a name="line.1767"></a>
-<span class="sourceLineNo">1768</span>      }<a name="line.1768"></a>
-<span class="sourceLineNo">1769</span>    } catch (IOException e) {<a name="line.1769"></a>
-<span class="sourceLineNo">1770</span>      throw new ServiceException(e);<a name="line.1770"></a>
-<span class="sourceLineNo">1771</span>    } catch (KeeperException e) {<a name="line.1771"></a>
-<span class="sourceLineNo">1772</span>      throw new ServiceException(e);<a name="line.1772"></a>
-<span class="sourceLineNo">1773</span>    }<a name="line.1773"></a>
-<span class="sourceLineNo">1774</span>    return response.build();<a name="line.1774"></a>
-<span class="sourceLineNo">1775</span>  }<a name="line.1775"></a>
-<span class="sourceLineNo">1776</span><a name="line.1776"></a>
-<span class="sourceLineNo">1777</span>  @Override<a name="line.1777"></a>
-<span class="sourceLineNo">1778</span>  public IsSplitOrMergeEnabledResponse isSplitOrMergeEnabled(RpcController controller,<a name="line.1778"></a>
-<span class="sourceLineNo">1779</span>    IsSplitOrMergeEnabledRequest request) throws ServiceException {<a name="line.1779"></a>
-<span class="sourceLineNo">1780</span>    IsSplitOrMergeEnabledResponse.Builder response = IsSplitOrMergeEnabledResponse.newBuilder();<a name="line.1780"></a>
-<span class="sourceLineNo">1781</span>    response.setEnabled(master.isSplitOrMergeEnabled(convert(request.getSwitchType())));<a name="line.1781"></a>
-<span class="sourceLineNo">1782</span>    return response.build();<a name="line.1782"></a>
-<span class="sourceLineNo">1783</span>  }<a name="line.1783"></a>
-<span class="sourceLineNo">1784</span><a name="line.1784"></a>
-<span class="sourceLineNo">1785</span>  @Override<a name="line.1785"></a>
-<span class="sourceLineNo">1786</span>  public NormalizeResponse normalize(RpcController controller,<a name="line.1786"></a>
-<span class="sourceLineNo">1787</span>      NormalizeRequest request) throws ServiceException {<a name="line.1787"></a>
-<span class="sourceLineNo">1788</span>    rpcPreCheck("normalize");<a name="line.1788"></a>
-<span class="sourceLineNo">1789</span>    try {<a name="line.1789"></a>
-<span class="sourceLineNo">1790</span>      return NormalizeResponse.newBuilder().setNormalizerRan(master.normalizeRegions()).build();<a name="line.1790"></a>
-<span class="sourceLineNo">1791</span>    } catch (IOException ex) {<a name="line.1791"></a>
-<span class="sourceLineNo">1792</span>      throw new ServiceException(ex);<a name="line.1792"></a>
-<span class="sourceLineNo">1793</span>    }<a name="line.1793"></a>
-<span class="sourceLineNo">1794</span>  }<a name="line.1794"></a>
-<span class="sourceLineNo">1795</span><a name="line.1795"></a>
-<span class="sourceLineNo">1796</span>  @Override<a name="line.1796"></a>
-<span class="sourceLineNo">1797</span>  public SetNormalizerRunningResponse setNormalizerRunning(RpcController controller,<a name="line.1797"></a>
-<span class="sourceLineNo">1798</span>      SetNormalizerRunningRequest request) throws ServiceException {<a name="line.1798"></a>
-<span class="sourceLineNo">1799</span>    rpcPreCheck("setNormalizerRunning");<a name="line.1799"></a>
-<span class="sourceLineNo">1800</span><a name="line.1800"></a>
-<span class="sourceLineNo">1801</span>    // Sets normalizer on/off flag in ZK.<a name="line.1801"></a>
-<span class="sourceLineNo">1802</span>    boolean prevValue = master.getRegionNormalizerTracker().isNormalizerOn();<a name="line.1802"></a>
-<span class="sourceLineNo">1803</span>    boolean newValue = request.getOn();<a name="line.1803"></a>
-<span class="sourceLineNo">1804</span>    try {<a name="line.1804"></a>
-<span class="sourceLineNo">1805</span>      master.getRegionNormalizerTracker().setNormalizerOn(newValue);<a name="line.1805"></a>
-<span class="sourceLineNo">1806</span>    } catch (KeeperException ke) {<a name="line.1806"></a>
-<span class="sourceLineNo">1807</span>      LOG.warn("Error flipping normalizer switch", ke);<a name="line.1807"></a>
-<span class="sourceLineNo">1808</span>    }<a name="line.1808"></a>
-<span class="sourceLineNo">1809</span>    LOG.info("{} set normalizerSwitch={}", master.getClientIdAuditPrefix(), newValue);<a name="line.1809"></a>
-<span class="sourceLineNo">1810</span>    return SetNormalizerRunningResponse.newBuilder().setPrevNormalizerValue(prevValue).build();<a name="line.1810"></a>
-<span class="sourceLineNo">1811</span>  }<a name="line.1811"></a>
-<span class="sourceLineNo">1812</span><a name="line.1812"></a>
-<span class="sourceLineNo">1813</span>  @Override<a name="line.1813"></a>
-<span class="sourceLineNo">1814</span>  public IsNormalizerEnabledResponse isNormalizerEnabled(RpcController controller,<a name="line.1814"></a>
-<span class="sourceLineNo">1815</span>      IsNormalizerEnabledRequest request) throws ServiceException {<a name="line.1815"></a>
-<span class="sourceLineNo">1816</span>    IsNormalizerEnabledResponse.Builder response = IsNormalizerEnabledResponse.newBuilder();<a name="line.1816"></a>
-<span class="sourceLineNo">1817</span>    response.setEnabled(master.isNormalizerOn());<a name="line.1817"></a>
-<span class="sourceLineNo">1818</span>    return response.build();<a name="line.1818"></a>
-<span class="sourceLineNo">1819</span>  }<a name="line.1819"></a>
-<span class="sourceLineNo">1820</span><a name="line.1820"></a>
-<span class="sourceLineNo">1821</span>  /**<a name="line.1821"></a>
-<span class="sourceLineNo">1822</span>   * Returns the security capabilities in effect on the cluster<a name="line.1822"></a>
-<span class="sourceLineNo">1823</span>   */<a name="line.1823"></a>
-<span class="sourceLineNo">1824</span>  @Override<a name="line.1824"></a>
-<span class="sourceLineNo">1825</span>  public SecurityCapabilitiesResponse getSecurityCapabilities(RpcController controller,<a name="line.1825"></a>
-<span class="sourceLineNo">1826</span>      SecurityCapabilitiesRequest request) throws ServiceException {<a name="line.1826"></a>
-<span class="sourceLineNo">1827</span>    SecurityCapabilitiesResponse.Builder response = SecurityCapabilitiesResponse.newBuilder();<a name="line.1827"></a>
-<span class="sourceLineNo">1828</span>    try {<a name="line.1828"></a>
-<span class="sourceLineNo">1829</span>      master.checkInitialized();<a name="line.1829"></a>
-<span class="sourceLineNo">1830</span>      Set&lt;SecurityCapabilitiesResponse.Capability&gt; capabilities = new HashSet&lt;&gt;();<a name="line.1830"></a>
-<span class="sourceLineNo">1831</span>      // Authentication<a name="line.1831"></a>
-<span class="sourceLineNo">1832</span>      if (User.isHBaseSecurityEnabled(master.getConfiguration())) {<a name="line.1832"></a>
-<span class="sourceLineNo">1833</span>        capabilities.add(SecurityCapabilitiesResponse.Capability.SECURE_AUTHENTICATION);<a name="line.1833"></a>
-<span class="sourceLineNo">1834</span>      } else {<a name="line.1834"></a>
-<span class="sourceLineNo">1835</span>        capabilities.add(SecurityCapabilitiesResponse.Capability.SIMPLE_AUTHENTICATION);<a name="line.1835"></a>
-<span class="sourceLineNo">1836</span>      }<a name="line.1836"></a>
-<span class="sourceLineNo">1837</span>      // A coprocessor that implements AccessControlService can provide AUTHORIZATION and<a name="line.1837"></a>
-<span class="sourceLineNo">1838</span>      // CELL_AUTHORIZATION<a name="line.1838"></a>
-<span class="sourceLineNo">1839</span>      if (master.cpHost != null &amp;&amp; hasAccessControlServiceCoprocessor(master.cpHost)) {<a name="line.1839"></a>
-<span class="sourceLineNo">1840</span>        if (AccessChecker.isAuthorizationSupported(master.getConfiguration())) {<a name="line.1840"></a>
-<span class="sourceLineNo">1841</span>          capabilities.add(SecurityCapabilitiesResponse.Capability.AUTHORIZATION);<a name="line.1841"></a>
-<span class="sourceLineNo">1842</span>        }<a name="line.1842"></a>
-<span class="sourceLineNo">1843</span>        if (AccessController.isCellAuthorizationSupported(master.getConfiguration())) {<a name="line.1843"></a>
-<span class="sourceLineNo">1844</span>          capabilities.add(SecurityCapabilitiesResponse.Capability.CELL_AUTHORIZATION);<a name="line.1844"></a>
-<span class="sourceLineNo">1845</span>        }<a name="line.1845"></a>
-<span class="sourceLineNo">1846</span>      }<a name="line.1846"></a>
-<span class="sourceLineNo">1847</span>      // A coprocessor that implements VisibilityLabelsService can provide CELL_VISIBILITY.<a name="line.1847"></a>
-<span class="sourceLineNo">1848</span>      if (master.cpHost != null &amp;&amp; hasVisibilityLabelsServiceCoprocessor(master.cpHost)) {<a name="line.1848"></a>
-<span class="sourceLineNo">1849</span>        if (VisibilityController.isCellAuthorizationSupported(master.getConfiguration())) {<a name="line.1849"></a>
-<span class="sourceLineNo">1850</span>          capabilities.add(SecurityCapabilitiesResponse.Capability.CELL_VISIBILITY);<a name="line.1850"></a>
-<span class="sourceLineNo">1851</span>        }<a name="line.1851"></a>
-<span class="sourceLineNo">1852</span>      }<a name="line.1852"></a>
-<span class="sourceLineNo">1853</span>      response.addAllCapabilities(capabilities);<a name="line.1853"></a>
-<span class="sourceLineNo">1854</span>    } catch (IOException e) {<a name="line.1854"></a>
-<span class="sourceLineNo">1855</span>      throw new ServiceException(e);<a name="line.1855"></a>
-<span class="sourceLineNo">1856</span>    }<a name="line.1856"></a>
-<span class="sourceLineNo">1857</span>    return response.build();<a name="line.1857"></a>
-<span class="sourceLineNo">1858</span>  }<a name="line.1858"></a>
-<span class="sourceLineNo">1859</span><a name="line.1859"></a>
-<span class="sourceLineNo">1860</span>  /**<a name="line.1860"></a>
-<span class="sourceLineNo">1861</span>   * Determines if there is a MasterCoprocessor deployed which implements<a name="line.1861"></a>
-<span class="sourceLineNo">1862</span>   * {@link org.apache.hadoop.hbase.protobuf.generated.AccessControlProtos.AccessControlService.Interface}.<a name="line.1862"></a>
-<span class="sourceLineNo">1863</span>   */<a name="line.1863"></a>
-<span class="sourceLineNo">1864</span>  boolean hasAccessControlServiceCoprocessor(MasterCoprocessorHost cpHost) {<a name="line.1864"></a>
-<span class="sourceLineNo">1865</span>    return checkCoprocessorWithService(<a name="line.1865"></a>
-<span class="sourceLineNo">1866</span>        cpHost.findCoprocessors(MasterCoprocessor.class), AccessControlService.Interface.class);<a name="line.1866"></a>
-<span class="sourceLineNo">1867</span>  }<a name="line.1867"></a>
-<span class="sourceLineNo">1868</span><a name="line.1868"></a>
-<span class="sourceLineNo">1869</span>  /**<a name="line.1869"></a>
-<span class="sourceLineNo">1870</span>   * Determines if there is a MasterCoprocessor deployed which implements<a name="line.1870"></a>
-<span class="sourceLineNo">1871</span>   * {@link org.apache.hadoop.hbase.protobuf.generated.VisibilityLabelsProtos.VisibilityLabelsService.Interface}.<a name="line.1871"></a>
-<span class="sourceLineNo">1872</span>   */<a name="line.1872"></a>
-<span class="sourceLineNo">1873</span>  boolean hasVisibilityLabelsServiceCoprocessor(MasterCoprocessorHost cpHost) {<a name="line.1873"></a>
-<span class="sourceLineNo">1874</span>    return checkCoprocessorWithService(<a name="line.1874"></a>
-<span class="sourceLineNo">1875</span>        cpHost.findCoprocessors(MasterCoprocessor.class),<a name="line.1875"></a>
-<span class="sourceLineNo">1876</span>        VisibilityLabelsService.Interface.class);<a name="line.1876"></a>
-<span class="sourceLineNo">1877</span>  }<a name="line.1877"></a>
-<span class="sourceLineNo">1878</span><a name="line.1878"></a>
-<span class="sourceLineNo">1879</span>  /**<a name="line.1879"></a>
-<span class="sourceLineNo">1880</span>   * Determines if there is a coprocessor implementation in the provided argument which extends<a name="line.1880"></a>
-<span class="sourceLineNo">1881</span>   * or implements the provided {@code service}.<a name="line.1881"></a>
-<span class="sourceLineNo">1882</span>   */<a name="line.1882"></a>
-<span class="sourceLineNo">1883</span>  boolean checkCoprocessorWithService(<a name="line.1883"></a>
-<span class="sourceLineNo">1884</span>      List&lt;MasterCoprocessor&gt; coprocessorsToCheck, Class&lt;?&gt; service) {<a name="line.1884"></a>
-<span class="sourceLineNo">1885</span>    if (coprocessorsToCheck == null || coprocessorsToCheck.isEmpty()) {<a name="line.1885"></a>
-<span class="sourceLineNo">1886</span>      return false;<a name="line.1886"></a>
-<span class="sourceLineNo">1887</span>    }<a name="line.1887"></a>
-<span class="sourceLineNo">1888</span>    for (MasterCoprocessor cp : coprocessorsToCheck) {<a name="line.1888"></a>
-<span class="sourceLineNo">1889</span>      if (service.isAssignableFrom(cp.getClass())) {<a name="line.1889"></a>
-<span class="sourceLineNo">1890</span>        return true;<a name="line.1890"></a>
-<span class="sourceLineNo">1891</span>      }<a name="line.1891"></a>
-<span class="sourceLineNo">1892</span>    }<a name="line.1892"></a>
-<span class="sourceLineNo">1893</span>    return false;<a name="line.1893"></a>
-<span class="sourceLineNo">1894</span>  }<a name="line.1894"></a>
-<span class="sourceLineNo">1895</span><a name="line.1895"></a>
-<span class="sourceLineNo">1896</span>  private MasterSwitchType convert(MasterProtos.MasterSwitchType switchType) {<a name="line.1896"></a>
-<span class="sourceLineNo">1897</span>    switch (switchType) {<a name="line.1897"></a>
-<span class="sourceLineNo">1898</span>      case SPLIT:<a name="line.1898"></a>
-<span class="sourceLineNo">1899</span>        return MasterSwitchType.SPLIT;<a name="line.1899"></a>
-<span class="sourceLineNo">1900</span>      case MERGE:<a name="line.1900"></a>
-<span class="sourceLineNo">1901</span>        return MasterSwitchType.MERGE;<a name="line.1901"></a>
-<span class="sourceLineNo">1902</span>      default:<a name="line.1902"></a>
-<span class="sourceLineNo">1903</span>        break;<a name="line.1903"></a>
-<span class="sourceLineNo">1904</span>    }<a name="line.1904"></a>
-<span class="sourceLineNo">1905</span>    return null;<a name="line.1905"></a>
-<span class="sourceLineNo">1906</span>  }<a name="line.1906"></a>
-<span class="sourceLineNo">1907</span><a name="line.1907"></a>
-<span class="sourceLineNo">1908</span>  @Override<a name="line.1908"></a>
-<span class="sourceLineNo">1909</span>  public AddReplicationPeerResponse addReplicationPeer(RpcController controller,<a name="line.1909"></a>
-<span class="sourceLineNo">1910</span>      AddReplicationPeerRequest request) throws ServiceException {<a name="line.1910"></a>
-<span class="sourceLineNo">1911</span>    try {<a name="line.1911"></a>
-<span class="sourceLineNo">1912</span>      long procId = master.addReplicationPeer(request.getPeerId(),<a name="line.1912"></a>
-<span class="sourceLineNo">1913</span>        ReplicationPeerConfigUtil.convert(request.getPeerConfig()),<a name="line.1913"></a>
-<span class="sourceLineNo">1914</span>        request.getPeerState().getState().equals(ReplicationState.State.ENABLED));<a name="line.1914"></a>
-<span class="sourceLineNo">1915</span>      return AddReplicationPeerResponse.newBuilder().setProcId(procId).build();<a name="line.1915"></a>
-<span class="sourceLineNo">1916</span>    } catch (ReplicationException | IOException e) {<a name="line.1916"></a>
-<span class="sourceLineNo">1917</span>      throw new ServiceException(e);<a name="line.1917"></a>
-<span class="sourceLineNo">1918</span>    }<a name="line.1918"></a>
-<span class="sourceLineNo">1919</span>  }<a name="line.1919"></a>
-<span class="sourceLineNo">1920</span><a name="line.1920"></a>
-<span class="sourceLineNo">1921</span>  @Override<a name="line.1921"></a>
-<span class="sourceLineNo">1922</span>  public RemoveReplicationPeerResponse removeReplicationPeer(RpcController controller,<a name="line.1922"></a>
-<span class="sourceLineNo">1923</span>      RemoveReplicationPeerRequest request) throws ServiceException {<a name="line.1923"></a>
-<span class="sourceLineNo">1924</span>    try {<a name="line.1924"></a>
-<span class="sourceLineNo">1925</span>      long procId = master.removeReplicationPeer(request.getPeerId());<a name="line.1925"></a>
-<span class="sourceLineNo">1926</span>      return RemoveReplicationPeerResponse.newBuilder().setProcId(procId).build();<a name="line.1926"></a>
-<span class="sourceLineNo">1927</span>    } catch (ReplicationException | IOException e) {<a name="line.1927"></a>
-<span class="sourceLineNo">1928</span>      throw new ServiceException(e);<a name="line.1928"></a>
-<span class="sourceLineNo">1929</span>    }<a name="line.1929"></a>
-<span class="sourceLineNo">1930</span>  }<a name="line.1930"></a>
-<span class="sourceLineNo">1931</span><a name="line.1931"></a>
-<span class="sourceLineNo">1932</span>  @Override<a name="line.1932"></a>
-<span class="sourceLineNo">1933</span>  public EnableReplicationPeerResponse enableReplicationPeer(RpcController controller,<a name="line.1933"></a>
-<span class="sourceLineNo">1934</span>      EnableReplicationPeerRequest request) throws ServiceException {<a name="line.1934"></a>
-<span class="sourceLineNo">1935</span>    try {<a name="line.1935"></a>
-<span class="sourceLineNo">1936</span>      long procId = master.enableReplicationPeer(request.getPeerId());<a name="line.1936"></a>
-<span class="sourceLineNo">1937</span>      return EnableReplicationPeerResponse.newBuilder().setProcId(procId).build();<a name="line.1937"></a>
-<span class="sourceLineNo">1938</span>    } catch (ReplicationException | IOException e) {<a name="line.1938"></a>
-<span class="sourceLineNo">1939</span>      throw new ServiceException(e);<a name="line.1939"></a>
-<span class="sourceLineNo">1940</span>    }<a name="line.1940"></a>
-<span class="sourceLineNo">1941</span>  }<a name="line.1941"></a>
-<span class="sourceLineNo">1942</span><a name="line.1942"></a>
-<span class="sourceLineNo">1943</span>  @Override<a name="line.1943"></a>
-<span class="sourceLineNo">1944</span>  public DisableReplicationPeerResponse disableReplicationPeer(RpcController controller,<a name="line.1944"></a>
-<span class="sourceLineNo">1945</span>      DisableReplicationPeerRequest request) throws ServiceException {<a name="line.1945"></a>
-<span class="sourceLineNo">1946</span>    try {<a name="line.1946"></a>
-<span class="sourceLineNo">1947</span>      long procId = master.disableReplicationPeer(request.getPeerId());<a name="line.1947"></a>
-<span class="sourceLineNo">1948</span>      return DisableReplicationPeerResponse.newBuilder().setProcId(procId).build();<a name="line.1948"></a>
-<span class="sourceLineNo">1949</span>    } catch (ReplicationException | IOException e) {<a name="line.1949"></a>
-<span class="sourceLineNo">1950</span>      throw new ServiceException(e);<a name="line.1950"></a>
-<span class="sourceLineNo">1951</span>    }<a name="line.1951"></a>
-<span class="sourceLineNo">1952</span>  }<a name="line.1952"></a>
-<span class="sourceLineNo">1953</span><a name="line.1953"></a>
-<span class="sourceLineNo">1954</span>  @Override<a name="line.1954"></a>
-<span class="sourceLineNo">1955</span>  public GetReplicationPeerConfigResponse getReplicationPeerConfig(RpcController controller,<a name="line.1955"></a>
-<span class="sourceLineNo">1956</span>      GetReplicationPeerConfigRequest request) throws ServiceException {<a name="line.1956"></a>
-<span class="sourceLineNo">1957</span>    GetReplicationPeerConfigResponse.Builder response = GetReplicationPeerConfigResponse<a name="line.1957"></a>
-<span class="sourceLineNo">1958</span>        .newBuilder();<a name="line.1958"></a>
-<span class="sourceLineNo">1959</span>    try {<a name="line.1959"></a>
-<span class="sourceLineNo">1960</span>      String peerId = request.getPeerId();<a name="line.1960"></a>
-<span class="sourceLineNo">1961</span>      ReplicationPeerConfig peerConfig = master.getReplicationPeerConfig(peerId);<a name="line.1961"></a>
-<span class="sourceLineNo">1962</span>      response.setPeerId(peerId);<a name="line.1962"></a>
-<span class="sourceLineNo">1963</span>      response.setPeerConfig(ReplicationPeerConfigUtil.convert(peerConfig));<a name="line.1963"></a>
-<span class="sourceLineNo">1964</span>    } catch (ReplicationException | IOException e) {<a name="line.1964"></a>
-<span class="sourceLineNo">1965</span>      throw new ServiceException(e);<a name="line.1965"></a>
-<span class="sourceLineNo">1966</span>    }<a name="line.1966"></a>
-<span class="sourceLineNo">1967</span>    return response.build();<a name="line.1967"></a>
-<span class="sourceLineNo">1968</span>  }<a name="line.1968"></a>
-<span class="sourceLineNo">1969</span><a name="line.1969"></a>
-<span class="sourceLineNo">1970</span>  @Override<a name="line.1970"></a>
-<span class="sourceLineNo">1971</span>  public UpdateReplicationPeerConfigResponse updateReplicationPeerConfig(RpcController controller,<a name="line.1971"></a>
-<span class="sourceLineNo">1972</span>      UpdateReplicationPeerConfigRequest request) throws ServiceException {<a name="line.1972"></a>
-<span class="sourceLineNo">1973</span>    try {<a name="line.1973"></a>
-<span class="sourceLineNo">1974</span>      long procId = master.updateReplicationPeerConfig(request.getPeerId(),<a name="line.1974"></a>
-<span class="sourceLineNo">1975</span>        ReplicationPeerConfigUtil.convert(request.getPeerConfig()));<a name="line.1975"></a>
-<span class="sourceLineNo">1976</span>      return UpdateReplicationPeerConfigResponse.newBuilder().setProcId(procId).build();<a name="line.1976"></a>
-<span class="sourceLineNo">1977</span>    } catch (ReplicationException | IOException e) {<a name="line.1977"></a>
-<span class="sourceLineNo">1978</span>      throw new ServiceException(e);<a name="line.1978"></a>
-<span class="sourceLineNo">1979</span>    }<a name="line.1979"></a>
-<span class="sourceLineNo">1980</span>  }<a name="line.1980"></a>
-<span class="sourceLineNo">1981</span><a name="line.1981"></a>
-<span class="sourceLineNo">1982</span>  @Override<a name="line.1982"></a>
-<span class="sourceLineNo">1983</span>  public TransitReplicationPeerSyncReplicationStateResponse<a name="line.1983"></a>
-<span class="sourceLineNo">1984</span>      transitReplicationPeerSyncReplicationState(RpcController controller,<a name="line.1984"></a>
-<span class="sourceLineNo">1985</span>          TransitReplicationPeerSyncReplicationStateRequest request) throws ServiceException {<a name="line.1985"></a>
-<span class="sourceLineNo">1986</span>    try {<a name="line.1986"></a>
-<span class="sourceLineNo">1987</span>      long procId = master.transitReplicationPeerSyncReplicationState(request.getPeerId(),<a name="line.1987"></a>
-<span class="sourceLineNo">1988</span>        ReplicationPeerConfigUtil.toSyncReplicationState(request.getSyncReplicationState()));<a name="line.1988"></a>
-<span class="sourceLineNo">1989</span>      return TransitReplicationPeerSyncReplicationStateResponse.newBuilder().setProcId(procId)<a name="line.1989"></a>
-<span class="sourceLineNo">1990</span>          .build();<a name="line.1990"></a>
-<span class="sourceLineNo">1991</span>    } catch (ReplicationException | IOException e) {<a name="line.1991"></a>
-<span class="sourceLineNo">1992</span>      throw new ServiceException(e);<a name="line.1992"></a>
-<span class="sourceLineNo">1993</span>    }<a name="line.1993"></a>
-<span class="sourceLineNo">1994</span>  }<a name="line.1994"></a>
-<span class="sourceLineNo">1995</span><a name="line.1995"></a>
-<span class="sourceLineNo">1996</span>  @Override<a name="line.1996"></a>
-<span class="sourceLineNo">1997</span>  public ListReplicationPeersResponse listReplicationPeers(RpcController controller,<a name="line.1997"></a>
-<span class="sourceLineNo">1998</span>      ListReplicationPeersRequest request) throws ServiceException {<a name="line.1998"></a>
-<span class="sourceLineNo">1999</span>    ListReplicationPeersResponse.Builder response = ListReplicationPeersResponse.newBuilder();<a name="line.1999"></a>
-<span class="sourceLineNo">2000</span>    try {<a name="line.2000"></a>
-<span class="sourceLineNo">2001</span>      List&lt;ReplicationPeerDescription&gt; peers = master<a name="line.2001"></a>
-<span class="sourceLineNo">2002</span>          .listReplicationPeers(request.hasRegex() ? request.getRegex() : null);<a name="line.2002"></a>
-<span class="sourceLineNo">2003</span>      for (ReplicationPeerDescription peer : peers) {<a name="line.2003"></a>
-<span class="sourceLineNo">2004</span>        response.addPeerDesc(ReplicationPeerConfigUtil.toProtoReplicationPeerDescription(peer));<a name="line.2004"></a>
-<span class="sourceLineNo">2005</span>      }<a name="line.2005"></a>
-<span class="sourceLineNo">2006</span>    } catch (ReplicationException | IOException e) {<a name="line.2006"></a>
-<span class="sourceLineNo">2007</span>      throw new ServiceException(e);<a name="line.2007"></a>
-<span class="sourceLineNo">2008</span>    }<a name="line.2008"></a>
-<span class="sourceLineNo">2009</span>    return response.build();<a name="line.2009"></a>
-<span class="sourceLineNo">2010</span>  }<a name="line.2010"></a>
-<span class="sourceLineNo">2011</span><a name="line.2011"></a>
-<span class="sourceLineNo">2012</span>  @Override<a name="line.2012"></a>
-<span class="sourceLineNo">2013</span>  public ListDecommissionedRegionServersResponse listDecommissionedRegionServers(<a name="line.2013"></a>
-<span class="sourceLineNo">2014</span>      RpcController controller, ListDecommissionedRegionServersRequest request)<a name="line.2014"></a>
-<span class="sourceLineNo">2015</span>      throws ServiceException {<a name="line.2015"></a>
-<span class="sourceLineNo">2016</span>    ListDecommissionedRegionServersResponse.Builder response =<a name="line.2016"></a>
-<span class="sourceLineNo">2017</span>        ListDecommissionedRegionServersResponse.newBuilder();<a name="line.2017"></a>
-<span class="sourceLineNo">2018</span>    try {<a name="line.2018"></a>
-<span class="sourceLineNo">2019</span>      master.checkInitialized();<a name="line.2019"></a>
-<span class="sourceLineNo">2020</span>      if (master.cpHost != null) {<a name="line.2020"></a>
-<span class="sourceLineNo">2021</span>        master.cpHost.preListDecommissionedRegionServers();<a name="line.2021"></a>
-<span class="sourceLineNo">2022</span>      }<a name="line.2022"></a>
-<span class="sourceLineNo">2023</span>      List&lt;ServerName&gt; servers = master.listDecommissionedRegionServers();<a name="line.2023"></a>
-<span class="sourceLineNo">2024</span>      response.addAllServerName((servers.stream().map(server -&gt; ProtobufUtil.toServerName(server)))<a name="line.2024"></a>
-<span class="sourceLineNo">2025</span>          .collect(Collectors.toList()));<a name="line.2025"></a>
-<span class="sourceLineNo">2026</span>      if (master.cpHost != null) {<a name="line.2026"></a>
-<span class="sourceLineNo">2027</span>        master.cpHost.postListDecommissionedRegionServers();<a name="line.2027"></a>
-<span class="sourceLineNo">2028</span>      }<a name="line.2028"></a>
-<span class="sourceLineNo">2029</span>    } catch (IOException io) {<a name="line.2029"></a>
-<span class="sourceLineNo">2030</span>      throw new ServiceException(io);<a name="line.2030"></a>
-<span class="sourceLineNo">2031</span>    }<a name="line.2031"></a>
-<span class="sourceLineNo">2032</span><a name="line.2032"></a>
-<span class="sourceLineNo">2033</span>    return response.build();<a name="line.2033"></a>
-<span class="sourceLineNo">2034</span>  }<a name="line.2034"></a>
-<span class="sourceLineNo">2035</span><a name="line.2035"></a>
-<span class="sourceLineNo">2036</span>  @Override<a name="line.2036"></a>
-<span class="sourceLineNo">2037</span>  public DecommissionRegionServersResponse decommissionRegionServers(RpcController controller,<a name="line.2037"></a>
-<span class="sourceLineNo">2038</span>      DecommissionRegionServersRequest request) throws ServiceException {<a name="line.2038"></a>
-<span class="sourceLineNo">2039</span>    try {<a name="line.2039"></a>
-<span class="sourceLineNo">2040</span>      master.checkInitialized();<a name="line.2040"></a>
-<span class="sourceLineNo">2041</span>      List&lt;ServerName&gt; servers = request.getServerNameList().stream()<a name="line.2041"></a>
-<span class="sourceLineNo">2042</span>          .map(pbServer -&gt; ProtobufUtil.toServerName(pbServer)).collect(Collectors.toList());<a name="line.2042"></a>
-<span class="sourceLineNo">2043</span>      boolean offload = request.getOffload();<a name="line.2043"></a>
+<span class="sourceLineNo">1764</span>      }<a name="line.1764"></a>
+<span class="sourceLineNo">1765</span>    } catch (IOException e) {<a name="line.1765"></a>
+<span class="sourceLineNo">1766</span>      throw new ServiceException(e);<a name="line.1766"></a>
+<span class="sourceLineNo">1767</span>    } catch (KeeperException e) {<a name="line.1767"></a>
+<span class="sourceLineNo">1768</span>      throw new ServiceException(e);<a name="line.1768"></a>
+<span class="sourceLineNo">1769</span>    }<a name="line.1769"></a>
+<span class="sourceLineNo">1770</span>    return response.build();<a name="line.1770"></a>
+<span class="sourceLineNo">1771</span>  }<a name="line.1771"></a>
+<span class="sourceLineNo">1772</span><a name="line.1772"></a>
+<span class="sourceLineNo">1773</span>  @Override<a name="line.1773"></a>
+<span class="sourceLineNo">1774</span>  public IsSplitOrMergeEnabledResponse isSplitOrMergeEnabled(RpcController controller,<a name="line.1774"></a>
+<span class="sourceLineNo">1775</span>    IsSplitOrMergeEnabledRequest request) throws ServiceException {<a name="line.1775"></a>
+<span class="sourceLineNo">1776</span>    IsSplitOrMergeEnabledResponse.Builder response = IsSplitOrMergeEnabledResponse.newBuilder();<a name="line.1776"></a>
+<span class="sourceLineNo">1777</span>    response.setEnabled(master.isSplitOrMergeEnabled(convert(request.getSwitchType())));<a name="line.1777"></a>
+<span class="sourceLineNo">1778</span>    return response.build();<a name="line.1778"></a>
+<span class="sourceLineNo">1779</span>  }<a name="line.1779"></a>
+<span class="sourceLineNo">1780</span><a name="line.1780"></a>
+<span class="sourceLineNo">1781</span>  @Override<a name="line.1781"></a>
+<span class="sourceLineNo">1782</span>  public NormalizeResponse normalize(RpcController controller,<a name="line.1782"></a>
+<span class="sourceLineNo">1783</span>      NormalizeRequest request) throws ServiceException {<a name="line.1783"></a>
+<span class="sourceLineNo">1784</span>    rpcPreCheck("normalize");<a name="line.1784"></a>
+<span class="sourceLineNo">1785</span>    try {<a name="line.1785"></a>
+<span class="sourceLineNo">1786</span>      return NormalizeResponse.newBuilder().setNormalizerRan(master.normalizeRegions()).build();<a name="line.1786"></a>
+<span class="sourceLineNo">1787</span>    } catch (IOException ex) {<a name="line.1787"></a>
+<span class="sourceLineNo">1788</span>      throw new ServiceException(ex);<a name="line.1788"></a>
+<span class="sourceLineNo">1789</span>    }<a name="line.1789"></a>
+<span class="sourceLineNo">1790</span>  }<a name="line.1790"></a>
+<span class="sourceLineNo">1791</span><a name="line.1791"></a>
+<span class="sourceLineNo">1792</span>  @Override<a name="line.1792"></a>
+<span class="sourceLineNo">1793</span>  public SetNormalizerRunningResponse setNormalizerRunning(RpcController controller,<a name="line.1793"></a>
+<span class="sourceLineNo">1794</span>      SetNormalizerRunningRequest request) throws ServiceException {<a name="line.1794"></a>
+<span class="sourceLineNo">1795</span>    rpcPreCheck("setNormalizerRunning");<a name="line.1795"></a>
+<span class="sourceLineNo">1796</span><a name="line.1796"></a>
+<span class="sourceLineNo">1797</span>    // Sets normalizer on/off flag in ZK.<a name="line.1797"></a>
+<span class="sourceLineNo">1798</span>    boolean prevValue = master.getRegionNormalizerTracker().isNormalizerOn();<a name="line.1798"></a>
+<span class="sourceLineNo">1799</span>    boolean newValue = request.getOn();<a name="line.1799"></a>
+<span class="sourceLineNo">1800</span>    try {<a name="line.1800"></a>
+<span class="sourceLineNo">1801</span>      master.getRegionNormalizerTracker().setNormalizerOn(newValue);<a name="line.1801"></a>
+<span class="sourceLineNo">1802</span>    } catch (KeeperException ke) {<a name="line.1802"></a>
+<span class="sourceLineNo">1803</span>      LOG.warn("Error flipping normalizer switch", ke);<a name="line.1803"></a>
+<span class="sourceLineNo">1804</span>    }<a name="line.1804"></a>
+<span class="sourceLineNo">1805</span>    LOG.info("{} set normalizerSwitch={}", master.getClientIdAuditPrefix(), newValue);<a name="line.1805"></a>
+<span class="sourceLineNo">1806</span>    return SetNormalizerRunningResponse.newBuilder().setPrevNormalizerValue(prevValue).build();<a name="line.1806"></a>
+<span class="sourceLineNo">1807</span>  }<a name="line.1807"></a>
+<span class="sourceLineNo">1808</span><a name="line.1808"></a>
+<span class="sourceLineNo">1809</span>  @Override<a name="line.1809"></a>
+<span class="sourceLineNo">1810</span>  public IsNormalizerEnabledResponse isNormalizerEnabled(RpcController controller,<a name="line.1810"></a>
+<span class="sourceLineNo">1811</span>      IsNormalizerEnabledRequest request) throws ServiceException {<a name="line.1811"></a>
+<span class="sourceLineNo">1812</span>    IsNormalizerEnabledResponse.Builder response = IsNormalizerEnabledResponse.newBuilder();<a name="line.1812"></a>
+<span class="sourceLineNo">1813</span>    response.setEnabled(master.isNormalizerOn());<a name="line.1813"></a>
+<span class="sourceLineNo">1814</span>    return response.build();<a name="line.1814"></a>
+<span class="sourceLineNo">1815</span>  }<a name="line.1815"></a>
+<span class="sourceLineNo">1816</span><a name="line.1816"></a>
+<span class="sourceLineNo">1817</span>  /**<a name="line.1817"></a>
+<span class="sourceLineNo">1818</span>   * Returns the security capabilities in effect on the cluster<a name="line.1818"></a>
+<span class="sourceLineNo">1819</span>   */<a name="line.1819"></a>
+<span class="sourceLineNo">1820</span>  @Override<a name="line.1820"></a>
+<span class="sourceLineNo">1821</span>  public SecurityCapabilitiesResponse getSecurityCapabilities(RpcController controller,<a name="line.1821"></a>
+<span class="sourceLineNo">1822</span>      SecurityCapabilitiesRequest request) throws ServiceException {<a name="line.1822"></a>
+<span class="sourceLineNo">1823</span>    SecurityCapabilitiesResponse.Builder response = SecurityCapabilitiesResponse.newBuilder();<a name="line.1823"></a>
+<span class="sourceLineNo">1824</span>    try {<a name="line.1824"></a>
+<span class="sourceLineNo">1825</span>      master.checkInitialized();<a name="line.1825"></a>
+<span class="sourceLineNo">1826</span>      Set&lt;SecurityCapabilitiesResponse.Capability&gt; capabilities = new HashSet&lt;&gt;();<a name="line.1826"></a>
+<span class="sourceLineNo">1827</span>      // Authentication<a name="line.1827"></a>
+<span class="sourceLineNo">1828</span>      if (User.isHBaseSecurityEnabled(master.getConfiguration())) {<a name="line.1828"></a>
+<span class="sourceLineNo">1829</span>        capabilities.add(SecurityCapabilitiesResponse.Capability.SECURE_AUTHENTICATION);<a name="line.1829"></a>
+<span class="sourceLineNo">1830</span>      } else {<a name="line.1830"></a>
+<span class="sourceLineNo">1831</span>        capabilities.add(SecurityCapabilitiesResponse.Capability.SIMPLE_AUTHENTICATION);<a name="line.1831"></a>
+<span class="sourceLineNo">1832</span>      }<a name="line.1832"></a>
+<span class="sourceLineNo">1833</span>      // A coprocessor that implements AccessControlService can provide AUTHORIZATION and<a name="line.1833"></a>
+<span class="sourceLineNo">1834</span>      // CELL_AUTHORIZATION<a name="line.1834"></a>
+<span class="sourceLineNo">1835</span>      if (master.cpHost != null &amp;&amp; hasAccessControlServiceCoprocessor(master.cpHost)) {<a name="line.1835"></a>
+<span class="sourceLineNo">1836</span>        if (AccessChecker.isAuthorizationSupported(master.getConfiguration())) {<a name="line.1836"></a>
+<span class="sourceLineNo">1837</span>          capabilities.add(SecurityCapabilitiesResponse.Capability.AUTHORIZATION);<a name="line.1837"></a>
+<span class="sourceLineNo">1838</span>        }<a name="line.1838"></a>
+<span class="sourceLineNo">1839</span>        if (AccessController.isCellAuthorizationSupported(master.getConfiguration())) {<a name="line.1839"></a>
+<span class="sourceLineNo">1840</span>          capabilities.add(SecurityCapabilitiesResponse.Capability.CELL_AUTHORIZATION);<a name="line.1840"></a>
+<span class="sourceLineNo">1841</span>        }<a name="line.1841"></a>
+<span class="sourceLineNo">1842</span>      }<a name="line.1842"></a>
+<span class="sourceLineNo">1843</span>      // A coprocessor that implements VisibilityLabelsService can provide CELL_VISIBILITY.<a name="line.1843"></a>
+<span class="sourceLineNo">1844</span>      if (master.cpHost != null &amp;&amp; hasVisibilityLabelsServiceCoprocessor(master.cpHost)) {<a name="line.1844"></a>
+<span class="sourceLineNo">1845</span>        if (VisibilityController.isCellAuthorizationSupported(master.getConfiguration())) {<a name="line.1845"></a>
+<span class="sourceLineNo">1846</span>          capabilities.add(SecurityCapabilitiesResponse.Capability.CELL_VISIBILITY);<a name="line.1846"></a>
+<span class="sourceLineNo">1847</span>        }<a name="line.1847"></a>
+<span class="sourceLineNo">1848</span>      }<a name="line.1848"></a>
+<span class="sourceLineNo">1849</span>      response.addAllCapabilities(capabilities);<a name="line.1849"></a>
+<span class="sourceLineNo">1850</span>    } catch (IOException e) {<a name="line.1850"></a>
+<span class="sourceLineNo">1851</span>      throw new ServiceException(e);<a name="line.1851"></a>

<TRUNCATED>

[42/46] hbase-site git commit: Published site at 05d22ed960204183fbd9bd16f1dbca6410ccde76.

Posted by gi...@apache.org.
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/3649682c/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 4fa473a..6f4077e 100644
--- a/devapidocs/org/apache/hadoop/hbase/master/HMaster.html
+++ b/devapidocs/org/apache/hadoop/hbase/master/HMaster.html
@@ -128,7 +128,7 @@ var activeTableTab = "activeTableTab";
 <hr>
 <br>
 <pre>@InterfaceAudience.LimitedPrivate(value="Tools")
-public class <a href="../../../../../src-html/org/apache/hadoop/hbase/master/HMaster.html#line.254">HMaster</a>
+public class <a href="../../../../../src-html/org/apache/hadoop/hbase/master/HMaster.html#line.253">HMaster</a>
 extends <a href="../../../../../org/apache/hadoop/hbase/regionserver/HRegionServer.html" title="class in org.apache.hadoop.hbase.regionserver">HRegionServer</a>
 implements <a href="../../../../../org/apache/hadoop/hbase/master/MasterServices.html" title="interface in org.apache.hadoop.hbase.master">MasterServices</a></pre>
 <div class="block">HMaster is the "master server" for HBase. An HBase cluster has one active
@@ -306,168 +306,172 @@ implements <a href="../../../../../org/apache/hadoop/hbase/master/MasterServices
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/master/HMaster.html#logCleaner">logCleaner</a></span></code>&nbsp;</td>
 </tr>
 <tr class="rowColor">
-<td class="colFirst"><code>private <a href="../../../../../org/apache/hadoop/hbase/zookeeper/MasterMaintenanceModeTracker.html" title="class in org.apache.hadoop.hbase.zookeeper">MasterMaintenanceModeTracker</a></code></td>
-<td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/master/HMaster.html#maintenanceModeTracker">maintenanceModeTracker</a></span></code>&nbsp;</td>
+<td class="colFirst"><code>(package private) static <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a></code></td>
+<td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/master/HMaster.html#MAINTENANCE_MODE">MAINTENANCE_MODE</a></span></code>&nbsp;</td>
 </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/HMaster.html#maintenanceMode">maintenanceMode</a></span></code>&nbsp;</td>
+</tr>
+<tr class="rowColor">
 <td class="colFirst"><code>static <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a></code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/master/HMaster.html#MASTER">MASTER</a></span></code>&nbsp;</td>
 </tr>
-<tr class="rowColor">
+<tr class="altColor">
 <td class="colFirst"><code>private long</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/master/HMaster.html#masterActiveTime">masterActiveTime</a></span></code>&nbsp;</td>
 </tr>
-<tr class="altColor">
+<tr class="rowColor">
 <td class="colFirst"><code>(package private) <a href="../../../../../org/apache/hadoop/hbase/master/zksyncer/MasterAddressSyncer.html" title="class in org.apache.hadoop.hbase.master.zksyncer">MasterAddressSyncer</a></code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/master/HMaster.html#masterAddressSyncer">masterAddressSyncer</a></span></code>&nbsp;</td>
 </tr>
-<tr class="rowColor">
+<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/HMaster.html#masterCheckCompression">masterCheckCompression</a></span></code>&nbsp;</td>
 </tr>
-<tr class="altColor">
+<tr class="rowColor">
 <td class="colFirst"><code>private boolean</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/master/HMaster.html#masterCheckEncryption">masterCheckEncryption</a></span></code>&nbsp;</td>
 </tr>
-<tr class="rowColor">
+<tr class="altColor">
 <td class="colFirst"><code>private long</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/master/HMaster.html#masterFinishedInitializationTime">masterFinishedInitializationTime</a></span></code>&nbsp;</td>
 </tr>
-<tr class="altColor">
+<tr class="rowColor">
 <td class="colFirst"><code>private org.eclipse.jetty.server.Server</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/master/HMaster.html#masterJettyServer">masterJettyServer</a></span></code>
 <div class="block">jetty server for master to redirect requests to regionserver infoServer</div>
 </td>
 </tr>
-<tr class="rowColor">
+<tr class="altColor">
 <td class="colFirst"><code>private int</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/master/HMaster.html#maxBlancingTime">maxBlancingTime</a></span></code>&nbsp;</td>
 </tr>
-<tr class="altColor">
+<tr class="rowColor">
 <td class="colFirst"><code>private double</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/master/HMaster.html#maxRitPercent">maxRitPercent</a></span></code>&nbsp;</td>
 </tr>
-<tr class="rowColor">
+<tr class="altColor">
 <td class="colFirst"><code>private long</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/master/HMaster.html#mergePlanCount">mergePlanCount</a></span></code>&nbsp;</td>
 </tr>
-<tr class="altColor">
+<tr class="rowColor">
 <td class="colFirst"><code>(package private) <a href="../../../../../org/apache/hadoop/hbase/master/zksyncer/MetaLocationSyncer.html" title="class in org.apache.hadoop.hbase.master.zksyncer">MetaLocationSyncer</a></code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/master/HMaster.html#metaLocationSyncer">metaLocationSyncer</a></span></code>&nbsp;</td>
 </tr>
-<tr class="rowColor">
+<tr class="altColor">
 <td class="colFirst"><code>(package private) <a href="../../../../../org/apache/hadoop/hbase/master/MetricsMaster.html" title="class in org.apache.hadoop.hbase.master">MetricsMaster</a></code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/master/HMaster.html#metricsMaster">metricsMaster</a></span></code>&nbsp;</td>
 </tr>
-<tr class="altColor">
+<tr class="rowColor">
 <td class="colFirst"><code>private <a href="../../../../../org/apache/hadoop/hbase/master/MobCompactionChore.html" title="class in org.apache.hadoop.hbase.master">MobCompactionChore</a></code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/master/HMaster.html#mobCompactChore">mobCompactChore</a></span></code>&nbsp;</td>
 </tr>
-<tr class="rowColor">
+<tr class="altColor">
 <td class="colFirst"><code>private <a href="../../../../../org/apache/hadoop/hbase/util/IdLock.html" title="class in org.apache.hadoop.hbase.util">IdLock</a></code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/master/HMaster.html#mobCompactionLock">mobCompactionLock</a></span></code>&nbsp;</td>
 </tr>
-<tr class="altColor">
+<tr class="rowColor">
 <td class="colFirst"><code>private <a href="https://docs.oracle.com/javase/8/docs/api/java/util/Map.html?is-external=true" title="class or interface in java.util">Map</a>&lt;<a href="../../../../../org/apache/hadoop/hbase/TableName.html" title="class in org.apache.hadoop.hbase">TableName</a>,<a href="https://docs.oracle.com/javase/8/docs/api/java/util/concurrent/atomic/AtomicInteger.html?is-external=true" title="class or interface in java.util.concurrent.atomic">AtomicInteger</a>&gt;</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/master/HMaster.html#mobCompactionStates">mobCompactionStates</a></span></code>&nbsp;</td>
 </tr>
-<tr class="rowColor">
+<tr class="altColor">
 <td class="colFirst"><code>private <a href="../../../../../org/apache/hadoop/hbase/master/MasterMobCompactionThread.html" title="class in org.apache.hadoop.hbase.master">MasterMobCompactionThread</a></code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/master/HMaster.html#mobCompactThread">mobCompactThread</a></span></code>&nbsp;</td>
 </tr>
-<tr class="altColor">
+<tr class="rowColor">
 <td class="colFirst"><code>private <a href="../../../../../org/apache/hadoop/hbase/procedure/MasterProcedureManagerHost.html" title="class in org.apache.hadoop.hbase.procedure">MasterProcedureManagerHost</a></code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/master/HMaster.html#mpmHost">mpmHost</a></span></code>&nbsp;</td>
 </tr>
-<tr class="rowColor">
+<tr class="altColor">
 <td class="colFirst"><code>private <a href="../../../../../org/apache/hadoop/hbase/master/normalizer/RegionNormalizer.html" title="interface in org.apache.hadoop.hbase.master.normalizer">RegionNormalizer</a></code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/master/HMaster.html#normalizer">normalizer</a></span></code>&nbsp;</td>
 </tr>
-<tr class="altColor">
+<tr class="rowColor">
 <td class="colFirst"><code>private <a href="../../../../../org/apache/hadoop/hbase/master/normalizer/RegionNormalizerChore.html" title="class in org.apache.hadoop.hbase.master.normalizer">RegionNormalizerChore</a></code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/master/HMaster.html#normalizerChore">normalizerChore</a></span></code>&nbsp;</td>
 </tr>
-<tr class="rowColor">
+<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/HMaster.html#preLoadTableDescriptors">preLoadTableDescriptors</a></span></code>&nbsp;</td>
 </tr>
-<tr class="altColor">
+<tr class="rowColor">
 <td class="colFirst"><code>private <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;</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/master/HMaster.html#procedureExecutor">procedureExecutor</a></span></code>&nbsp;</td>
 </tr>
-<tr class="rowColor">
+<tr class="altColor">
 <td class="colFirst"><code>private <a href="../../../../../org/apache/hadoop/hbase/procedure2/store/wal/WALProcedureStore.html" title="class in org.apache.hadoop.hbase.procedure2.store.wal">WALProcedureStore</a></code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/master/HMaster.html#procedureStore">procedureStore</a></span></code>&nbsp;</td>
 </tr>
-<tr class="altColor">
+<tr class="rowColor">
 <td class="colFirst"><code>private <a href="../../../../../org/apache/hadoop/hbase/quotas/MasterQuotaManager.html" title="class in org.apache.hadoop.hbase.quotas">MasterQuotaManager</a></code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/master/HMaster.html#quotaManager">quotaManager</a></span></code>&nbsp;</td>
 </tr>
-<tr class="rowColor">
+<tr class="altColor">
 <td class="colFirst"><code>private <a href="../../../../../org/apache/hadoop/hbase/quotas/QuotaObserverChore.html" title="class in org.apache.hadoop.hbase.quotas">QuotaObserverChore</a></code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/master/HMaster.html#quotaObserverChore">quotaObserverChore</a></span></code>&nbsp;</td>
 </tr>
-<tr class="altColor">
+<tr class="rowColor">
 <td class="colFirst"><code>private <a href="../../../../../org/apache/hadoop/hbase/zookeeper/RegionNormalizerTracker.html" title="class in org.apache.hadoop.hbase.zookeeper">RegionNormalizerTracker</a></code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/master/HMaster.html#regionNormalizerTracker">regionNormalizerTracker</a></span></code>&nbsp;</td>
 </tr>
-<tr class="rowColor">
+<tr class="altColor">
 <td class="colFirst"><code>private <a href="../../../../../org/apache/hadoop/hbase/master/RegionServerTracker.html" title="class in org.apache.hadoop.hbase.master">RegionServerTracker</a></code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/master/HMaster.html#regionServerTracker">regionServerTracker</a></span></code>&nbsp;</td>
 </tr>
-<tr class="altColor">
+<tr class="rowColor">
 <td class="colFirst"><code>private <a href="../../../../../org/apache/hadoop/hbase/master/cleaner/ReplicationBarrierCleaner.html" title="class in org.apache.hadoop.hbase.master.cleaner">ReplicationBarrierCleaner</a></code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/master/HMaster.html#replicationBarrierCleaner">replicationBarrierCleaner</a></span></code>&nbsp;</td>
 </tr>
-<tr class="rowColor">
+<tr class="altColor">
 <td class="colFirst"><code>private <a href="../../../../../org/apache/hadoop/hbase/master/replication/ReplicationPeerManager.html" title="class in org.apache.hadoop.hbase.master.replication">ReplicationPeerManager</a></code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/master/HMaster.html#replicationPeerManager">replicationPeerManager</a></span></code>&nbsp;</td>
 </tr>
-<tr class="altColor">
+<tr class="rowColor">
 <td class="colFirst"><code>(package private) <a href="../../../../../org/apache/hadoop/hbase/monitoring/MemoryBoundedLogMessageBuffer.html" title="class in org.apache.hadoop.hbase.monitoring">MemoryBoundedLogMessageBuffer</a></code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/master/HMaster.html#rsFatals">rsFatals</a></span></code>&nbsp;</td>
 </tr>
-<tr class="rowColor">
+<tr class="altColor">
 <td class="colFirst"><code>private <a href="../../../../../org/apache/hadoop/hbase/master/ServerManager.html" title="class in org.apache.hadoop.hbase.master">ServerManager</a></code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/master/HMaster.html#serverManager">serverManager</a></span></code>&nbsp;</td>
 </tr>
-<tr class="altColor">
+<tr class="rowColor">
 <td class="colFirst"><code>(package private) boolean</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/master/HMaster.html#serviceStarted">serviceStarted</a></span></code>&nbsp;</td>
 </tr>
-<tr class="rowColor">
+<tr class="altColor">
 <td class="colFirst"><code>(package private) <a href="../../../../../org/apache/hadoop/hbase/master/snapshot/SnapshotManager.html" title="class in org.apache.hadoop.hbase.master.snapshot">SnapshotManager</a></code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/master/HMaster.html#snapshotManager">snapshotManager</a></span></code>&nbsp;</td>
 </tr>
-<tr class="altColor">
+<tr class="rowColor">
 <td class="colFirst"><code>private <a href="../../../../../org/apache/hadoop/hbase/quotas/SnapshotQuotaObserverChore.html" title="class in org.apache.hadoop.hbase.quotas">SnapshotQuotaObserverChore</a></code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/master/HMaster.html#snapshotQuotaChore">snapshotQuotaChore</a></span></code>&nbsp;</td>
 </tr>
-<tr class="rowColor">
+<tr class="altColor">
 <td class="colFirst"><code>private <a href="../../../../../org/apache/hadoop/hbase/quotas/SpaceQuotaSnapshotNotifier.html" title="interface in org.apache.hadoop.hbase.quotas">SpaceQuotaSnapshotNotifier</a></code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/master/HMaster.html#spaceQuotaSnapshotNotifier">spaceQuotaSnapshotNotifier</a></span></code>&nbsp;</td>
 </tr>
-<tr class="altColor">
+<tr class="rowColor">
 <td class="colFirst"><code>private <a href="../../../../../org/apache/hadoop/hbase/master/SplitOrMergeTracker.html" title="class in org.apache.hadoop.hbase.master">SplitOrMergeTracker</a></code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/master/HMaster.html#splitOrMergeTracker">splitOrMergeTracker</a></span></code>&nbsp;</td>
 </tr>
-<tr class="rowColor">
+<tr class="altColor">
 <td class="colFirst"><code>private long</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/master/HMaster.html#splitPlanCount">splitPlanCount</a></span></code>&nbsp;</td>
 </tr>
-<tr class="altColor">
+<tr class="rowColor">
 <td class="colFirst"><code>private <a href="../../../../../org/apache/hadoop/hbase/master/replication/SyncReplicationReplayWALManager.html" title="class in org.apache.hadoop.hbase.master.replication">SyncReplicationReplayWALManager</a></code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/master/HMaster.html#syncReplicationReplayWALManager">syncReplicationReplayWALManager</a></span></code>&nbsp;</td>
 </tr>
-<tr class="rowColor">
+<tr class="altColor">
 <td class="colFirst"><code>private <a href="../../../../../org/apache/hadoop/hbase/master/TableStateManager.html" title="class in org.apache.hadoop.hbase.master">TableStateManager</a></code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/master/HMaster.html#tableStateManager">tableStateManager</a></span></code>&nbsp;</td>
 </tr>
-<tr class="altColor">
-<td class="colFirst"><code>private static org.apache.hbase.thirdparty.com.google.common.collect.ImmutableSet&lt;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Class.html?is-external=true" title="class or interface in java.lang">Class</a>&lt;?&gt;&gt;</code></td>
+<tr class="rowColor">
+<td class="colFirst"><code>private static org.apache.hbase.thirdparty.com.google.common.collect.ImmutableSet&lt;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Class.html?is-external=true" title="class or interface in java.lang">Class</a>&lt;? extends <a href="../../../../../org/apache/hadoop/hbase/procedure2/Procedure.html" title="class in org.apache.hadoop.hbase.procedure2">Procedure</a>&gt;&gt;</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/master/HMaster.html#UNSUPPORTED_PROCEDURES">UNSUPPORTED_PROCEDURES</a></span></code>&nbsp;</td>
 </tr>
-<tr class="rowColor">
+<tr class="altColor">
 <td class="colFirst"><code>private <a href="../../../../../org/apache/hadoop/hbase/master/MasterWalManager.html" title="class in org.apache.hadoop.hbase.master">MasterWalManager</a></code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/master/HMaster.html#walManager">walManager</a></span></code>&nbsp;</td>
 </tr>
@@ -1535,7 +1539,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/master/MasterServices
 <ul class="blockList">
 <li class="blockList">
 <h4>LOG</h4>
-<pre>private static&nbsp;org.slf4j.Logger <a href="../../../../../src-html/org/apache/hadoop/hbase/master/HMaster.html#line.255">LOG</a></pre>
+<pre>private static&nbsp;org.slf4j.Logger <a href="../../../../../src-html/org/apache/hadoop/hbase/master/HMaster.html#line.254">LOG</a></pre>
 </li>
 </ul>
 <a name="MASTER">
@@ -1544,7 +1548,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/master/MasterServices
 <ul class="blockList">
 <li class="blockList">
 <h4>MASTER</h4>
-<pre>public static final&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/master/HMaster.html#line.311">MASTER</a></pre>
+<pre>public static final&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/master/HMaster.html#line.310">MASTER</a></pre>
 <dl>
 <dt><span class="seeLabel">See Also:</span></dt>
 <dd><a href="../../../../../constant-values.html#org.apache.hadoop.hbase.master.HMaster.MASTER">Constant Field Values</a></dd>
@@ -1557,7 +1561,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/master/MasterServices
 <ul class="blockList">
 <li class="blockList">
 <h4>activeMasterManager</h4>
-<pre>private final&nbsp;<a href="../../../../../org/apache/hadoop/hbase/master/ActiveMasterManager.html" title="class in org.apache.hadoop.hbase.master">ActiveMasterManager</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/master/HMaster.html#line.314">activeMasterManager</a></pre>
+<pre>private final&nbsp;<a href="../../../../../org/apache/hadoop/hbase/master/ActiveMasterManager.html" title="class in org.apache.hadoop.hbase.master">ActiveMasterManager</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/master/HMaster.html#line.313">activeMasterManager</a></pre>
 </li>
 </ul>
 <a name="regionServerTracker">
@@ -1566,7 +1570,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/master/MasterServices
 <ul class="blockList">
 <li class="blockList">
 <h4>regionServerTracker</h4>
-<pre>private&nbsp;<a href="../../../../../org/apache/hadoop/hbase/master/RegionServerTracker.html" title="class in org.apache.hadoop.hbase.master">RegionServerTracker</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/master/HMaster.html#line.316">regionServerTracker</a></pre>
+<pre>private&nbsp;<a href="../../../../../org/apache/hadoop/hbase/master/RegionServerTracker.html" title="class in org.apache.hadoop.hbase.master">RegionServerTracker</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/master/HMaster.html#line.315">regionServerTracker</a></pre>
 </li>
 </ul>
 <a name="drainingServerTracker">
@@ -1575,7 +1579,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/master/MasterServices
 <ul class="blockList">
 <li class="blockList">
 <h4>drainingServerTracker</h4>
-<pre>private&nbsp;<a href="../../../../../org/apache/hadoop/hbase/master/DrainingServerTracker.html" title="class in org.apache.hadoop.hbase.master">DrainingServerTracker</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/master/HMaster.html#line.318">drainingServerTracker</a></pre>
+<pre>private&nbsp;<a href="../../../../../org/apache/hadoop/hbase/master/DrainingServerTracker.html" title="class in org.apache.hadoop.hbase.master">DrainingServerTracker</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/master/HMaster.html#line.317">drainingServerTracker</a></pre>
 </li>
 </ul>
 <a name="loadBalancerTracker">
@@ -1584,7 +1588,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/master/MasterServices
 <ul class="blockList">
 <li class="blockList">
 <h4>loadBalancerTracker</h4>
-<pre><a href="../../../../../org/apache/hadoop/hbase/zookeeper/LoadBalancerTracker.html" title="class in org.apache.hadoop.hbase.zookeeper">LoadBalancerTracker</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/master/HMaster.html#line.320">loadBalancerTracker</a></pre>
+<pre><a href="../../../../../org/apache/hadoop/hbase/zookeeper/LoadBalancerTracker.html" title="class in org.apache.hadoop.hbase.zookeeper">LoadBalancerTracker</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/master/HMaster.html#line.319">loadBalancerTracker</a></pre>
 </li>
 </ul>
 <a name="metaLocationSyncer">
@@ -1593,7 +1597,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/master/MasterServices
 <ul class="blockList">
 <li class="blockList">
 <h4>metaLocationSyncer</h4>
-<pre><a href="../../../../../org/apache/hadoop/hbase/master/zksyncer/MetaLocationSyncer.html" title="class in org.apache.hadoop.hbase.master.zksyncer">MetaLocationSyncer</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/master/HMaster.html#line.322">metaLocationSyncer</a></pre>
+<pre><a href="../../../../../org/apache/hadoop/hbase/master/zksyncer/MetaLocationSyncer.html" title="class in org.apache.hadoop.hbase.master.zksyncer">MetaLocationSyncer</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/master/HMaster.html#line.321">metaLocationSyncer</a></pre>
 </li>
 </ul>
 <a name="masterAddressSyncer">
@@ -1602,7 +1606,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/master/MasterServices
 <ul class="blockList">
 <li class="blockList">
 <h4>masterAddressSyncer</h4>
-<pre><a href="../../../../../org/apache/hadoop/hbase/master/zksyncer/MasterAddressSyncer.html" title="class in org.apache.hadoop.hbase.master.zksyncer">MasterAddressSyncer</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/master/HMaster.html#line.324">masterAddressSyncer</a></pre>
+<pre><a href="../../../../../org/apache/hadoop/hbase/master/zksyncer/MasterAddressSyncer.html" title="class in org.apache.hadoop.hbase.master.zksyncer">MasterAddressSyncer</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/master/HMaster.html#line.323">masterAddressSyncer</a></pre>
 </li>
 </ul>
 <a name="splitOrMergeTracker">
@@ -1611,7 +1615,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/master/MasterServices
 <ul class="blockList">
 <li class="blockList">
 <h4>splitOrMergeTracker</h4>
-<pre>private&nbsp;<a href="../../../../../org/apache/hadoop/hbase/master/SplitOrMergeTracker.html" title="class in org.apache.hadoop.hbase.master">SplitOrMergeTracker</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/master/HMaster.html#line.327">splitOrMergeTracker</a></pre>
+<pre>private&nbsp;<a href="../../../../../org/apache/hadoop/hbase/master/SplitOrMergeTracker.html" title="class in org.apache.hadoop.hbase.master">SplitOrMergeTracker</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/master/HMaster.html#line.326">splitOrMergeTracker</a></pre>
 </li>
 </ul>
 <a name="regionNormalizerTracker">
@@ -1620,16 +1624,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/master/MasterServices
 <ul class="blockList">
 <li class="blockList">
 <h4>regionNormalizerTracker</h4>
-<pre>private&nbsp;<a href="../../../../../org/apache/hadoop/hbase/zookeeper/RegionNormalizerTracker.html" title="class in org.apache.hadoop.hbase.zookeeper">RegionNormalizerTracker</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/master/HMaster.html#line.330">regionNormalizerTracker</a></pre>
-</li>
-</ul>
-<a name="maintenanceModeTracker">
-<!--   -->
-</a>
-<ul class="blockList">
-<li class="blockList">
-<h4>maintenanceModeTracker</h4>
-<pre>private&nbsp;<a href="../../../../../org/apache/hadoop/hbase/zookeeper/MasterMaintenanceModeTracker.html" title="class in org.apache.hadoop.hbase.zookeeper">MasterMaintenanceModeTracker</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/master/HMaster.html#line.333">maintenanceModeTracker</a></pre>
+<pre>private&nbsp;<a href="../../../../../org/apache/hadoop/hbase/zookeeper/RegionNormalizerTracker.html" title="class in org.apache.hadoop.hbase.zookeeper">RegionNormalizerTracker</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/master/HMaster.html#line.329">regionNormalizerTracker</a></pre>
 </li>
 </ul>
 <a name="clusterSchemaService">
@@ -1638,7 +1633,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/master/MasterServices
 <ul class="blockList">
 <li class="blockList">
 <h4>clusterSchemaService</h4>
-<pre>private&nbsp;<a href="../../../../../org/apache/hadoop/hbase/master/ClusterSchemaService.html" title="interface in org.apache.hadoop.hbase.master">ClusterSchemaService</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/master/HMaster.html#line.335">clusterSchemaService</a></pre>
+<pre>private&nbsp;<a href="../../../../../org/apache/hadoop/hbase/master/ClusterSchemaService.html" title="interface in org.apache.hadoop.hbase.master">ClusterSchemaService</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/master/HMaster.html#line.331">clusterSchemaService</a></pre>
 </li>
 </ul>
 <a name="HBASE_MASTER_WAIT_ON_SERVICE_IN_SECONDS">
@@ -1647,7 +1642,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/master/MasterServices
 <ul class="blockList">
 <li class="blockList">
 <h4>HBASE_MASTER_WAIT_ON_SERVICE_IN_SECONDS</h4>
-<pre>public static final&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/master/HMaster.html#line.337">HBASE_MASTER_WAIT_ON_SERVICE_IN_SECONDS</a></pre>
+<pre>public static final&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/master/HMaster.html#line.333">HBASE_MASTER_WAIT_ON_SERVICE_IN_SECONDS</a></pre>
 <dl>
 <dt><span class="seeLabel">See Also:</span></dt>
 <dd><a href="../../../../../constant-values.html#org.apache.hadoop.hbase.master.HMaster.HBASE_MASTER_WAIT_ON_SERVICE_IN_SECONDS">Constant Field Values</a></dd>
@@ -1660,7 +1655,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/master/MasterServices
 <ul class="blockList">
 <li class="blockList">
 <h4>DEFAULT_HBASE_MASTER_WAIT_ON_SERVICE_IN_SECONDS</h4>
-<pre>public static final&nbsp;int <a href="../../../../../src-html/org/apache/hadoop/hbase/master/HMaster.html#line.339">DEFAULT_HBASE_MASTER_WAIT_ON_SERVICE_IN_SECONDS</a></pre>
+<pre>public static final&nbsp;int <a href="../../../../../src-html/org/apache/hadoop/hbase/master/HMaster.html#line.335">DEFAULT_HBASE_MASTER_WAIT_ON_SERVICE_IN_SECONDS</a></pre>
 <dl>
 <dt><span class="seeLabel">See Also:</span></dt>
 <dd><a href="../../../../../constant-values.html#org.apache.hadoop.hbase.master.HMaster.DEFAULT_HBASE_MASTER_WAIT_ON_SERVICE_IN_SECONDS">Constant Field Values</a></dd>
@@ -1673,7 +1668,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/master/MasterServices
 <ul class="blockList">
 <li class="blockList">
 <h4>metricsMaster</h4>
-<pre>final&nbsp;<a href="../../../../../org/apache/hadoop/hbase/master/MetricsMaster.html" title="class in org.apache.hadoop.hbase.master">MetricsMaster</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/master/HMaster.html#line.342">metricsMaster</a></pre>
+<pre>final&nbsp;<a href="../../../../../org/apache/hadoop/hbase/master/MetricsMaster.html" title="class in org.apache.hadoop.hbase.master">MetricsMaster</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/master/HMaster.html#line.338">metricsMaster</a></pre>
 </li>
 </ul>
 <a name="fileSystemManager">
@@ -1682,7 +1677,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/master/MasterServices
 <ul class="blockList">
 <li class="blockList">
 <h4>fileSystemManager</h4>
-<pre>private&nbsp;<a href="../../../../../org/apache/hadoop/hbase/master/MasterFileSystem.html" title="class in org.apache.hadoop.hbase.master">MasterFileSystem</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/master/HMaster.html#line.344">fileSystemManager</a></pre>
+<pre>private&nbsp;<a href="../../../../../org/apache/hadoop/hbase/master/MasterFileSystem.html" title="class in org.apache.hadoop.hbase.master">MasterFileSystem</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/master/HMaster.html#line.340">fileSystemManager</a></pre>
 </li>
 </ul>
 <a name="walManager">
@@ -1691,7 +1686,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/master/MasterServices
 <ul class="blockList">
 <li class="blockList">
 <h4>walManager</h4>
-<pre>private&nbsp;<a href="../../../../../org/apache/hadoop/hbase/master/MasterWalManager.html" title="class in org.apache.hadoop.hbase.master">MasterWalManager</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/master/HMaster.html#line.345">walManager</a></pre>
+<pre>private&nbsp;<a href="../../../../../org/apache/hadoop/hbase/master/MasterWalManager.html" title="class in org.apache.hadoop.hbase.master">MasterWalManager</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/master/HMaster.html#line.341">walManager</a></pre>
 </li>
 </ul>
 <a name="serverManager">
@@ -1700,7 +1695,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/master/MasterServices
 <ul class="blockList">
 <li class="blockList">
 <h4>serverManager</h4>
-<pre>private volatile&nbsp;<a href="../../../../../org/apache/hadoop/hbase/master/ServerManager.html" title="class in org.apache.hadoop.hbase.master">ServerManager</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/master/HMaster.html#line.348">serverManager</a></pre>
+<pre>private volatile&nbsp;<a href="../../../../../org/apache/hadoop/hbase/master/ServerManager.html" title="class in org.apache.hadoop.hbase.master">ServerManager</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/master/HMaster.html#line.344">serverManager</a></pre>
 </li>
 </ul>
 <a name="assignmentManager">
@@ -1709,7 +1704,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/master/MasterServices
 <ul class="blockList">
 <li class="blockList">
 <h4>assignmentManager</h4>
-<pre>private&nbsp;<a href="../../../../../org/apache/hadoop/hbase/master/assignment/AssignmentManager.html" title="class in org.apache.hadoop.hbase.master.assignment">AssignmentManager</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/master/HMaster.html#line.351">assignmentManager</a></pre>
+<pre>private&nbsp;<a href="../../../../../org/apache/hadoop/hbase/master/assignment/AssignmentManager.html" title="class in org.apache.hadoop.hbase.master.assignment">AssignmentManager</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/master/HMaster.html#line.347">assignmentManager</a></pre>
 </li>
 </ul>
 <a name="replicationPeerManager">
@@ -1718,7 +1713,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/master/MasterServices
 <ul class="blockList">
 <li class="blockList">
 <h4>replicationPeerManager</h4>
-<pre>private&nbsp;<a href="../../../../../org/apache/hadoop/hbase/master/replication/ReplicationPeerManager.html" title="class in org.apache.hadoop.hbase.master.replication">ReplicationPeerManager</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/master/HMaster.html#line.354">replicationPeerManager</a></pre>
+<pre>private&nbsp;<a href="../../../../../org/apache/hadoop/hbase/master/replication/ReplicationPeerManager.html" title="class in org.apache.hadoop.hbase.master.replication">ReplicationPeerManager</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/master/HMaster.html#line.350">replicationPeerManager</a></pre>
 </li>
 </ul>
 <a name="syncReplicationReplayWALManager">
@@ -1727,7 +1722,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/master/MasterServices
 <ul class="blockList">
 <li class="blockList">
 <h4>syncReplicationReplayWALManager</h4>
-<pre>private&nbsp;<a href="../../../../../org/apache/hadoop/hbase/master/replication/SyncReplicationReplayWALManager.html" title="class in org.apache.hadoop.hbase.master.replication">SyncReplicationReplayWALManager</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/master/HMaster.html#line.356">syncReplicationReplayWALManager</a></pre>
+<pre>private&nbsp;<a href="../../../../../org/apache/hadoop/hbase/master/replication/SyncReplicationReplayWALManager.html" title="class in org.apache.hadoop.hbase.master.replication">SyncReplicationReplayWALManager</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/master/HMaster.html#line.352">syncReplicationReplayWALManager</a></pre>
 </li>
 </ul>
 <a name="rsFatals">
@@ -1736,7 +1731,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/master/MasterServices
 <ul class="blockList">
 <li class="blockList">
 <h4>rsFatals</h4>
-<pre><a href="../../../../../org/apache/hadoop/hbase/monitoring/MemoryBoundedLogMessageBuffer.html" title="class in org.apache.hadoop.hbase.monitoring">MemoryBoundedLogMessageBuffer</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/master/HMaster.html#line.361">rsFatals</a></pre>
+<pre><a href="../../../../../org/apache/hadoop/hbase/monitoring/MemoryBoundedLogMessageBuffer.html" title="class in org.apache.hadoop.hbase.monitoring">MemoryBoundedLogMessageBuffer</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/master/HMaster.html#line.357">rsFatals</a></pre>
 </li>
 </ul>
 <a name="activeMaster">
@@ -1745,7 +1740,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/master/MasterServices
 <ul class="blockList">
 <li class="blockList">
 <h4>activeMaster</h4>
-<pre>private volatile&nbsp;boolean <a href="../../../../../src-html/org/apache/hadoop/hbase/master/HMaster.html#line.364">activeMaster</a></pre>
+<pre>private volatile&nbsp;boolean <a href="../../../../../src-html/org/apache/hadoop/hbase/master/HMaster.html#line.360">activeMaster</a></pre>
 </li>
 </ul>
 <a name="initialized">
@@ -1754,7 +1749,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/master/MasterServices
 <ul class="blockList">
 <li class="blockList">
 <h4>initialized</h4>
-<pre>private final&nbsp;<a href="../../../../../org/apache/hadoop/hbase/procedure2/ProcedureEvent.html" title="class in org.apache.hadoop.hbase.procedure2">ProcedureEvent</a>&lt;?&gt; <a href="../../../../../src-html/org/apache/hadoop/hbase/master/HMaster.html#line.367">initialized</a></pre>
+<pre>private final&nbsp;<a href="../../../../../org/apache/hadoop/hbase/procedure2/ProcedureEvent.html" title="class in org.apache.hadoop.hbase.procedure2">ProcedureEvent</a>&lt;?&gt; <a href="../../../../../src-html/org/apache/hadoop/hbase/master/HMaster.html#line.363">initialized</a></pre>
 </li>
 </ul>
 <a name="serviceStarted">
@@ -1763,7 +1758,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/master/MasterServices
 <ul class="blockList">
 <li class="blockList">
 <h4>serviceStarted</h4>
-<pre>volatile&nbsp;boolean <a href="../../../../../src-html/org/apache/hadoop/hbase/master/HMaster.html#line.371">serviceStarted</a></pre>
+<pre>volatile&nbsp;boolean <a href="../../../../../src-html/org/apache/hadoop/hbase/master/HMaster.html#line.367">serviceStarted</a></pre>
 </li>
 </ul>
 <a name="maxBlancingTime">
@@ -1772,7 +1767,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/master/MasterServices
 <ul class="blockList">
 <li class="blockList">
 <h4>maxBlancingTime</h4>
-<pre>private final&nbsp;int <a href="../../../../../src-html/org/apache/hadoop/hbase/master/HMaster.html#line.374">maxBlancingTime</a></pre>
+<pre>private final&nbsp;int <a href="../../../../../src-html/org/apache/hadoop/hbase/master/HMaster.html#line.370">maxBlancingTime</a></pre>
 </li>
 </ul>
 <a name="maxRitPercent">
@@ -1781,7 +1776,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/master/MasterServices
 <ul class="blockList">
 <li class="blockList">
 <h4>maxRitPercent</h4>
-<pre>private final&nbsp;double <a href="../../../../../src-html/org/apache/hadoop/hbase/master/HMaster.html#line.376">maxRitPercent</a></pre>
+<pre>private final&nbsp;double <a href="../../../../../src-html/org/apache/hadoop/hbase/master/HMaster.html#line.372">maxRitPercent</a></pre>
 </li>
 </ul>
 <a name="lockManager">
@@ -1790,7 +1785,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/master/MasterServices
 <ul class="blockList">
 <li class="blockList">
 <h4>lockManager</h4>
-<pre>private final&nbsp;<a href="../../../../../org/apache/hadoop/hbase/master/locking/LockManager.html" title="class in org.apache.hadoop.hbase.master.locking">LockManager</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/master/HMaster.html#line.378">lockManager</a></pre>
+<pre>private final&nbsp;<a href="../../../../../org/apache/hadoop/hbase/master/locking/LockManager.html" title="class in org.apache.hadoop.hbase.master.locking">LockManager</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/master/HMaster.html#line.374">lockManager</a></pre>
 </li>
 </ul>
 <a name="balancer">
@@ -1799,7 +1794,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/master/MasterServices
 <ul class="blockList">
 <li class="blockList">
 <h4>balancer</h4>
-<pre>private&nbsp;<a href="../../../../../org/apache/hadoop/hbase/master/LoadBalancer.html" title="interface in org.apache.hadoop.hbase.master">LoadBalancer</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/master/HMaster.html#line.380">balancer</a></pre>
+<pre>private&nbsp;<a href="../../../../../org/apache/hadoop/hbase/master/LoadBalancer.html" title="interface in org.apache.hadoop.hbase.master">LoadBalancer</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/master/HMaster.html#line.376">balancer</a></pre>
 </li>
 </ul>
 <a name="normalizer">
@@ -1808,7 +1803,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/master/MasterServices
 <ul class="blockList">
 <li class="blockList">
 <h4>normalizer</h4>
-<pre>private&nbsp;<a href="../../../../../org/apache/hadoop/hbase/master/normalizer/RegionNormalizer.html" title="interface in org.apache.hadoop.hbase.master.normalizer">RegionNormalizer</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/master/HMaster.html#line.381">normalizer</a></pre>
+<pre>private&nbsp;<a href="../../../../../org/apache/hadoop/hbase/master/normalizer/RegionNormalizer.html" title="interface in org.apache.hadoop.hbase.master.normalizer">RegionNormalizer</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/master/HMaster.html#line.377">normalizer</a></pre>
 </li>
 </ul>
 <a name="balancerChore">
@@ -1817,7 +1812,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/master/MasterServices
 <ul class="blockList">
 <li class="blockList">
 <h4>balancerChore</h4>
-<pre>private&nbsp;<a href="../../../../../org/apache/hadoop/hbase/master/balancer/BalancerChore.html" title="class in org.apache.hadoop.hbase.master.balancer">BalancerChore</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/master/HMaster.html#line.382">balancerChore</a></pre>
+<pre>private&nbsp;<a href="../../../../../org/apache/hadoop/hbase/master/balancer/BalancerChore.html" title="class in org.apache.hadoop.hbase.master.balancer">BalancerChore</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/master/HMaster.html#line.378">balancerChore</a></pre>
 </li>
 </ul>
 <a name="normalizerChore">
@@ -1826,7 +1821,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/master/MasterServices
 <ul class="blockList">
 <li class="blockList">
 <h4>normalizerChore</h4>
-<pre>private&nbsp;<a href="../../../../../org/apache/hadoop/hbase/master/normalizer/RegionNormalizerChore.html" title="class in org.apache.hadoop.hbase.master.normalizer">RegionNormalizerChore</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/master/HMaster.html#line.383">normalizerChore</a></pre>
+<pre>private&nbsp;<a href="../../../../../org/apache/hadoop/hbase/master/normalizer/RegionNormalizerChore.html" title="class in org.apache.hadoop.hbase.master.normalizer">RegionNormalizerChore</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/master/HMaster.html#line.379">normalizerChore</a></pre>
 </li>
 </ul>
 <a name="clusterStatusChore">
@@ -1835,7 +1830,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/master/MasterServices
 <ul class="blockList">
 <li class="blockList">
 <h4>clusterStatusChore</h4>
-<pre>private&nbsp;<a href="../../../../../org/apache/hadoop/hbase/master/balancer/ClusterStatusChore.html" title="class in org.apache.hadoop.hbase.master.balancer">ClusterStatusChore</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/master/HMaster.html#line.384">clusterStatusChore</a></pre>
+<pre>private&nbsp;<a href="../../../../../org/apache/hadoop/hbase/master/balancer/ClusterStatusChore.html" title="class in org.apache.hadoop.hbase.master.balancer">ClusterStatusChore</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/master/HMaster.html#line.380">clusterStatusChore</a></pre>
 </li>
 </ul>
 <a name="clusterStatusPublisherChore">
@@ -1844,7 +1839,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/master/MasterServices
 <ul class="blockList">
 <li class="blockList">
 <h4>clusterStatusPublisherChore</h4>
-<pre>private&nbsp;<a href="../../../../../org/apache/hadoop/hbase/master/ClusterStatusPublisher.html" title="class in org.apache.hadoop.hbase.master">ClusterStatusPublisher</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/master/HMaster.html#line.385">clusterStatusPublisherChore</a></pre>
+<pre>private&nbsp;<a href="../../../../../org/apache/hadoop/hbase/master/ClusterStatusPublisher.html" title="class in org.apache.hadoop.hbase.master">ClusterStatusPublisher</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/master/HMaster.html#line.381">clusterStatusPublisherChore</a></pre>
 </li>
 </ul>
 <a name="catalogJanitorChore">
@@ -1853,7 +1848,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/master/MasterServices
 <ul class="blockList">
 <li class="blockList">
 <h4>catalogJanitorChore</h4>
-<pre><a href="../../../../../org/apache/hadoop/hbase/master/CatalogJanitor.html" title="class in org.apache.hadoop.hbase.master">CatalogJanitor</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/master/HMaster.html#line.387">catalogJanitorChore</a></pre>
+<pre><a href="../../../../../org/apache/hadoop/hbase/master/CatalogJanitor.html" title="class in org.apache.hadoop.hbase.master">CatalogJanitor</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/master/HMaster.html#line.383">catalogJanitorChore</a></pre>
 </li>
 </ul>
 <a name="logCleaner">
@@ -1862,7 +1857,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/master/MasterServices
 <ul class="blockList">
 <li class="blockList">
 <h4>logCleaner</h4>
-<pre>private&nbsp;<a href="../../../../../org/apache/hadoop/hbase/master/cleaner/LogCleaner.html" title="class in org.apache.hadoop.hbase.master.cleaner">LogCleaner</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/master/HMaster.html#line.388">logCleaner</a></pre>
+<pre>private&nbsp;<a href="../../../../../org/apache/hadoop/hbase/master/cleaner/LogCleaner.html" title="class in org.apache.hadoop.hbase.master.cleaner">LogCleaner</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/master/HMaster.html#line.384">logCleaner</a></pre>
 </li>
 </ul>
 <a name="hfileCleaner">
@@ -1871,7 +1866,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/master/MasterServices
 <ul class="blockList">
 <li class="blockList">
 <h4>hfileCleaner</h4>
-<pre>private&nbsp;<a href="../../../../../org/apache/hadoop/hbase/master/cleaner/HFileCleaner.html" title="class in org.apache.hadoop.hbase.master.cleaner">HFileCleaner</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/master/HMaster.html#line.389">hfileCleaner</a></pre>
+<pre>private&nbsp;<a href="../../../../../org/apache/hadoop/hbase/master/cleaner/HFileCleaner.html" title="class in org.apache.hadoop.hbase.master.cleaner">HFileCleaner</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/master/HMaster.html#line.385">hfileCleaner</a></pre>
 </li>
 </ul>
 <a name="replicationBarrierCleaner">
@@ -1880,7 +1875,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/master/MasterServices
 <ul class="blockList">
 <li class="blockList">
 <h4>replicationBarrierCleaner</h4>
-<pre>private&nbsp;<a href="../../../../../org/apache/hadoop/hbase/master/cleaner/ReplicationBarrierCleaner.html" title="class in org.apache.hadoop.hbase.master.cleaner">ReplicationBarrierCleaner</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/master/HMaster.html#line.390">replicationBarrierCleaner</a></pre>
+<pre>private&nbsp;<a href="../../../../../org/apache/hadoop/hbase/master/cleaner/ReplicationBarrierCleaner.html" title="class in org.apache.hadoop.hbase.master.cleaner">ReplicationBarrierCleaner</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/master/HMaster.html#line.386">replicationBarrierCleaner</a></pre>
 </li>
 </ul>
 <a name="expiredMobFileCleanerChore">
@@ -1889,7 +1884,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/master/MasterServices
 <ul class="blockList">
 <li class="blockList">
 <h4>expiredMobFileCleanerChore</h4>
-<pre>private&nbsp;<a href="../../../../../org/apache/hadoop/hbase/master/ExpiredMobFileCleanerChore.html" title="class in org.apache.hadoop.hbase.master">ExpiredMobFileCleanerChore</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/master/HMaster.html#line.391">expiredMobFileCleanerChore</a></pre>
+<pre>private&nbsp;<a href="../../../../../org/apache/hadoop/hbase/master/ExpiredMobFileCleanerChore.html" title="class in org.apache.hadoop.hbase.master">ExpiredMobFileCleanerChore</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/master/HMaster.html#line.387">expiredMobFileCleanerChore</a></pre>
 </li>
 </ul>
 <a name="mobCompactChore">
@@ -1898,7 +1893,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/master/MasterServices
 <ul class="blockList">
 <li class="blockList">
 <h4>mobCompactChore</h4>
-<pre>private&nbsp;<a href="../../../../../org/apache/hadoop/hbase/master/MobCompactionChore.html" title="class in org.apache.hadoop.hbase.master">MobCompactionChore</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/master/HMaster.html#line.392">mobCompactChore</a></pre>
+<pre>private&nbsp;<a href="../../../../../org/apache/hadoop/hbase/master/MobCompactionChore.html" title="class in org.apache.hadoop.hbase.master">MobCompactionChore</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/master/HMaster.html#line.388">mobCompactChore</a></pre>
 </li>
 </ul>
 <a name="mobCompactThread">
@@ -1907,7 +1902,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/master/MasterServices
 <ul class="blockList">
 <li class="blockList">
 <h4>mobCompactThread</h4>
-<pre>private&nbsp;<a href="../../../../../org/apache/hadoop/hbase/master/MasterMobCompactionThread.html" title="class in org.apache.hadoop.hbase.master">MasterMobCompactionThread</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/master/HMaster.html#line.393">mobCompactThread</a></pre>
+<pre>private&nbsp;<a href="../../../../../org/apache/hadoop/hbase/master/MasterMobCompactionThread.html" title="class in org.apache.hadoop.hbase.master">MasterMobCompactionThread</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/master/HMaster.html#line.389">mobCompactThread</a></pre>
 </li>
 </ul>
 <a name="mobCompactionLock">
@@ -1916,7 +1911,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/master/MasterServices
 <ul class="blockList">
 <li class="blockList">
 <h4>mobCompactionLock</h4>
-<pre>private final&nbsp;<a href="../../../../../org/apache/hadoop/hbase/util/IdLock.html" title="class in org.apache.hadoop.hbase.util">IdLock</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/master/HMaster.html#line.395">mobCompactionLock</a></pre>
+<pre>private final&nbsp;<a href="../../../../../org/apache/hadoop/hbase/util/IdLock.html" title="class in org.apache.hadoop.hbase.util">IdLock</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/master/HMaster.html#line.391">mobCompactionLock</a></pre>
 </li>
 </ul>
 <a name="mobCompactionStates">
@@ -1925,7 +1920,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/master/MasterServices
 <ul class="blockList">
 <li class="blockList">
 <h4>mobCompactionStates</h4>
-<pre>private&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/util/Map.html?is-external=true" title="class or interface in java.util">Map</a>&lt;<a href="../../../../../org/apache/hadoop/hbase/TableName.html" title="class in org.apache.hadoop.hbase">TableName</a>,<a href="https://docs.oracle.com/javase/8/docs/api/java/util/concurrent/atomic/AtomicInteger.html?is-external=true" title="class or interface in java.util.concurrent.atomic">AtomicInteger</a>&gt; <a href="../../../../../src-html/org/apache/hadoop/hbase/master/HMaster.html#line.398">mobCompactionStates</a></pre>
+<pre>private&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/util/Map.html?is-external=true" title="class or interface in java.util">Map</a>&lt;<a href="../../../../../org/apache/hadoop/hbase/TableName.html" title="class in org.apache.hadoop.hbase">TableName</a>,<a href="https://docs.oracle.com/javase/8/docs/api/java/util/concurrent/atomic/AtomicInteger.html?is-external=true" title="class or interface in java.util.concurrent.atomic">AtomicInteger</a>&gt; <a href="../../../../../src-html/org/apache/hadoop/hbase/master/HMaster.html#line.394">mobCompactionStates</a></pre>
 </li>
 </ul>
 <a name="cpHost">
@@ -1934,7 +1929,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/master/MasterServices
 <ul class="blockList">
 <li class="blockList">
 <h4>cpHost</h4>
-<pre><a href="../../../../../org/apache/hadoop/hbase/master/MasterCoprocessorHost.html" title="class in org.apache.hadoop.hbase.master">MasterCoprocessorHost</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/master/HMaster.html#line.400">cpHost</a></pre>
+<pre><a href="../../../../../org/apache/hadoop/hbase/master/MasterCoprocessorHost.html" title="class in org.apache.hadoop.hbase.master">MasterCoprocessorHost</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/master/HMaster.html#line.396">cpHost</a></pre>
 </li>
 </ul>
 <a name="preLoadTableDescriptors">
@@ -1943,7 +1938,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/master/MasterServices
 <ul class="blockList">
 <li class="blockList">
 <h4>preLoadTableDescriptors</h4>
-<pre>private final&nbsp;boolean <a href="../../../../../src-html/org/apache/hadoop/hbase/master/HMaster.html#line.402">preLoadTableDescriptors</a></pre>
+<pre>private final&nbsp;boolean <a href="../../../../../src-html/org/apache/hadoop/hbase/master/HMaster.html#line.398">preLoadTableDescriptors</a></pre>
 </li>
 </ul>
 <a name="masterActiveTime">
@@ -1952,7 +1947,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/master/MasterServices
 <ul class="blockList">
 <li class="blockList">
 <h4>masterActiveTime</h4>
-<pre>private&nbsp;long <a href="../../../../../src-html/org/apache/hadoop/hbase/master/HMaster.html#line.405">masterActiveTime</a></pre>
+<pre>private&nbsp;long <a href="../../../../../src-html/org/apache/hadoop/hbase/master/HMaster.html#line.401">masterActiveTime</a></pre>
 </li>
 </ul>
 <a name="masterFinishedInitializationTime">
@@ -1961,7 +1956,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/master/MasterServices
 <ul class="blockList">
 <li class="blockList">
 <h4>masterFinishedInitializationTime</h4>
-<pre>private&nbsp;long <a href="../../../../../src-html/org/apache/hadoop/hbase/master/HMaster.html#line.408">masterFinishedInitializationTime</a></pre>
+<pre>private&nbsp;long <a href="../../../../../src-html/org/apache/hadoop/hbase/master/HMaster.html#line.404">masterFinishedInitializationTime</a></pre>
 </li>
 </ul>
 <a name="masterCheckCompression">
@@ -1970,7 +1965,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/master/MasterServices
 <ul class="blockList">
 <li class="blockList">
 <h4>masterCheckCompression</h4>
-<pre>private final&nbsp;boolean <a href="../../../../../src-html/org/apache/hadoop/hbase/master/HMaster.html#line.411">masterCheckCompression</a></pre>
+<pre>private final&nbsp;boolean <a href="../../../../../src-html/org/apache/hadoop/hbase/master/HMaster.html#line.407">masterCheckCompression</a></pre>
 </li>
 </ul>
 <a name="masterCheckEncryption">
@@ -1979,7 +1974,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/master/MasterServices
 <ul class="blockList">
 <li class="blockList">
 <h4>masterCheckEncryption</h4>
-<pre>private final&nbsp;boolean <a href="../../../../../src-html/org/apache/hadoop/hbase/master/HMaster.html#line.414">masterCheckEncryption</a></pre>
+<pre>private final&nbsp;boolean <a href="../../../../../src-html/org/apache/hadoop/hbase/master/HMaster.html#line.410">masterCheckEncryption</a></pre>
 </li>
 </ul>
 <a name="coprocessorServiceHandlers">
@@ -1988,7 +1983,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/master/MasterServices
 <ul class="blockList">
 <li class="blockList">
 <h4>coprocessorServiceHandlers</h4>
-<pre><a href="https://docs.oracle.com/javase/8/docs/api/java/util/Map.html?is-external=true" title="class or interface in java.util">Map</a>&lt;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>,com.google.protobuf.Service&gt; <a href="../../../../../src-html/org/apache/hadoop/hbase/master/HMaster.html#line.416">coprocessorServiceHandlers</a></pre>
+<pre><a href="https://docs.oracle.com/javase/8/docs/api/java/util/Map.html?is-external=true" title="class or interface in java.util">Map</a>&lt;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>,com.google.protobuf.Service&gt; <a href="../../../../../src-html/org/apache/hadoop/hbase/master/HMaster.html#line.412">coprocessorServiceHandlers</a></pre>
 </li>
 </ul>
 <a name="snapshotManager">
@@ -1997,7 +1992,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/master/MasterServices
 <ul class="blockList">
 <li class="blockList">
 <h4>snapshotManager</h4>
-<pre><a href="../../../../../org/apache/hadoop/hbase/master/snapshot/SnapshotManager.html" title="class in org.apache.hadoop.hbase.master.snapshot">SnapshotManager</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/master/HMaster.html#line.419">snapshotManager</a></pre>
+<pre><a href="../../../../../org/apache/hadoop/hbase/master/snapshot/SnapshotManager.html" title="class in org.apache.hadoop.hbase.master.snapshot">SnapshotManager</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/master/HMaster.html#line.415">snapshotManager</a></pre>
 </li>
 </ul>
 <a name="mpmHost">
@@ -2006,7 +2001,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/master/MasterServices
 <ul class="blockList">
 <li class="blockList">
 <h4>mpmHost</h4>
-<pre>private&nbsp;<a href="../../../../../org/apache/hadoop/hbase/procedure/MasterProcedureManagerHost.html" title="class in org.apache.hadoop.hbase.procedure">MasterProcedureManagerHost</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/master/HMaster.html#line.421">mpmHost</a></pre>
+<pre>private&nbsp;<a href="../../../../../org/apache/hadoop/hbase/procedure/MasterProcedureManagerHost.html" title="class in org.apache.hadoop.hbase.procedure">MasterProcedureManagerHost</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/master/HMaster.html#line.417">mpmHost</a></pre>
 </li>
 </ul>
 <a name="quotaManager">
@@ -2015,7 +2010,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/master/MasterServices
 <ul class="blockList">
 <li class="blockList">
 <h4>quotaManager</h4>
-<pre>private volatile&nbsp;<a href="../../../../../org/apache/hadoop/hbase/quotas/MasterQuotaManager.html" title="class in org.apache.hadoop.hbase.quotas">MasterQuotaManager</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/master/HMaster.html#line.424">quotaManager</a></pre>
+<pre>private volatile&nbsp;<a href="../../../../../org/apache/hadoop/hbase/quotas/MasterQuotaManager.html" title="class in org.apache.hadoop.hbase.quotas">MasterQuotaManager</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/master/HMaster.html#line.420">quotaManager</a></pre>
 </li>
 </ul>
 <a name="spaceQuotaSnapshotNotifier">
@@ -2024,7 +2019,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/master/MasterServices
 <ul class="blockList">
 <li class="blockList">
 <h4>spaceQuotaSnapshotNotifier</h4>
-<pre>private&nbsp;<a href="../../../../../org/apache/hadoop/hbase/quotas/SpaceQuotaSnapshotNotifier.html" title="interface in org.apache.hadoop.hbase.quotas">SpaceQuotaSnapshotNotifier</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/master/HMaster.html#line.425">spaceQuotaSnapshotNotifier</a></pre>
+<pre>private&nbsp;<a href="../../../../../org/apache/hadoop/hbase/quotas/SpaceQuotaSnapshotNotifier.html" title="interface in org.apache.hadoop.hbase.quotas">SpaceQuotaSnapshotNotifier</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/master/HMaster.html#line.421">spaceQuotaSnapshotNotifier</a></pre>
 </li>
 </ul>
 <a name="quotaObserverChore">
@@ -2033,7 +2028,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/master/MasterServices
 <ul class="blockList">
 <li class="blockList">
 <h4>quotaObserverChore</h4>
-<pre>private&nbsp;<a href="../../../../../org/apache/hadoop/hbase/quotas/QuotaObserverChore.html" title="class in org.apache.hadoop.hbase.quotas">QuotaObserverChore</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/master/HMaster.html#line.426">quotaObserverChore</a></pre>
+<pre>private&nbsp;<a href="../../../../../org/apache/hadoop/hbase/quotas/QuotaObserverChore.html" title="class in org.apache.hadoop.hbase.quotas">QuotaObserverChore</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/master/HMaster.html#line.422">quotaObserverChore</a></pre>
 </li>
 </ul>
 <a name="snapshotQuotaChore">
@@ -2042,7 +2037,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/master/MasterServices
 <ul class="blockList">
 <li class="blockList">
 <h4>snapshotQuotaChore</h4>
-<pre>private&nbsp;<a href="../../../../../org/apache/hadoop/hbase/quotas/SnapshotQuotaObserverChore.html" title="class in org.apache.hadoop.hbase.quotas">SnapshotQuotaObserverChore</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/master/HMaster.html#line.427">snapshotQuotaChore</a></pre>
+<pre>private&nbsp;<a href="../../../../../org/apache/hadoop/hbase/quotas/SnapshotQuotaObserverChore.html" title="class in org.apache.hadoop.hbase.quotas">SnapshotQuotaObserverChore</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/master/HMaster.html#line.423">snapshotQuotaChore</a></pre>
 </li>
 </ul>
 <a name="procedureExecutor">
@@ -2051,7 +2046,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/master/MasterServices
 <ul class="blockList">
 <li class="blockList">
 <h4>procedureExecutor</h4>
-<pre>private&nbsp;<a href="../../../../../org/apache/hadoop/hbase/procedure2/ProcedureExecutor.html" title="class in org.apache.hadoop.hbase.procedure2">ProcedureExecutor</a>&lt;<a href="../../../../../org/apache/hadoop/hbase/master/procedure/MasterProcedureEnv.html" title="class in org.apache.hadoop.hbase.master.procedure">MasterProcedureEnv</a>&gt; <a href="../../../../../src-html/org/apache/hadoop/hbase/master/HMaster.html#line.429">procedureExecutor</a></pre>
+<pre>private&nbsp;<a href="../../../../../org/apache/hadoop/hbase/procedure2/ProcedureExecutor.html" title="class in org.apache.hadoop.hbase.procedure2">ProcedureExecutor</a>&lt;<a href="../../../../../org/apache/hadoop/hbase/master/procedure/MasterProcedureEnv.html" title="class in org.apache.hadoop.hbase.master.procedure">MasterProcedureEnv</a>&gt; <a href="../../../../../src-html/org/apache/hadoop/hbase/master/HMaster.html#line.425">procedureExecutor</a></pre>
 </li>
 </ul>
 <a name="procedureStore">
@@ -2060,7 +2055,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/master/MasterServices
 <ul class="blockList">
 <li class="blockList">
 <h4>procedureStore</h4>
-<pre>private&nbsp;<a href="../../../../../org/apache/hadoop/hbase/procedure2/store/wal/WALProcedureStore.html" title="class in org.apache.hadoop.hbase.procedure2.store.wal">WALProcedureStore</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/master/HMaster.html#line.430">procedureStore</a></pre>
+<pre>private&nbsp;<a href="../../../../../org/apache/hadoop/hbase/procedure2/store/wal/WALProcedureStore.html" title="class in org.apache.hadoop.hbase.procedure2.store.wal">WALProcedureStore</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/master/HMaster.html#line.426">procedureStore</a></pre>
 </li>
 </ul>
 <a name="tableStateManager">
@@ -2069,7 +2064,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/master/MasterServices
 <ul class="blockList">
 <li class="blockList">
 <h4>tableStateManager</h4>
-<pre>private&nbsp;<a href="../../../../../org/apache/hadoop/hbase/master/TableStateManager.html" title="class in org.apache.hadoop.hbase.master">TableStateManager</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/master/HMaster.html#line.433">tableStateManager</a></pre>
+<pre>private&nbsp;<a href="../../../../../org/apache/hadoop/hbase/master/TableStateManager.html" title="class in org.apache.hadoop.hbase.master">TableStateManager</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/master/HMaster.html#line.429">tableStateManager</a></pre>
 </li>
 </ul>
 <a name="splitPlanCount">
@@ -2078,7 +2073,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/master/MasterServices
 <ul class="blockList">
 <li class="blockList">
 <h4>splitPlanCount</h4>
-<pre>private&nbsp;long <a href="../../../../../src-html/org/apache/hadoop/hbase/master/HMaster.html#line.435">splitPlanCount</a></pre>
+<pre>private&nbsp;long <a href="../../../../../src-html/org/apache/hadoop/hbase/master/HMaster.html#line.431">splitPlanCount</a></pre>
 </li>
 </ul>
 <a name="mergePlanCount">
@@ -2087,7 +2082,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/master/MasterServices
 <ul class="blockList">
 <li class="blockList">
 <h4>mergePlanCount</h4>
-<pre>private&nbsp;long <a href="../../../../../src-html/org/apache/hadoop/hbase/master/HMaster.html#line.436">mergePlanCount</a></pre>
+<pre>private&nbsp;long <a href="../../../../../src-html/org/apache/hadoop/hbase/master/HMaster.html#line.432">mergePlanCount</a></pre>
 </li>
 </ul>
 <a name="favoredNodesManager">
@@ -2096,7 +2091,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/master/MasterServices
 <ul class="blockList">
 <li class="blockList">
 <h4>favoredNodesManager</h4>
-<pre>private&nbsp;<a href="../../../../../org/apache/hadoop/hbase/favored/FavoredNodesManager.html" title="class in org.apache.hadoop.hbase.favored">FavoredNodesManager</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/master/HMaster.html#line.439">favoredNodesManager</a></pre>
+<pre>private&nbsp;<a href="../../../../../org/apache/hadoop/hbase/favored/FavoredNodesManager.html" title="class in org.apache.hadoop.hbase.favored">FavoredNodesManager</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/master/HMaster.html#line.435">favoredNodesManager</a></pre>
 </li>
 </ul>
 <a name="masterJettyServer">
@@ -2105,17 +2100,39 @@ implements <a href="../../../../../org/apache/hadoop/hbase/master/MasterServices
 <ul class="blockList">
 <li class="blockList">
 <h4>masterJettyServer</h4>
-<pre>private&nbsp;org.eclipse.jetty.server.Server <a href="../../../../../src-html/org/apache/hadoop/hbase/master/HMaster.html#line.442">masterJettyServer</a></pre>
+<pre>private&nbsp;org.eclipse.jetty.server.Server <a href="../../../../../src-html/org/apache/hadoop/hbase/master/HMaster.html#line.438">masterJettyServer</a></pre>
 <div class="block">jetty server for master to redirect requests to regionserver infoServer</div>
 </li>
 </ul>
+<a name="maintenanceMode">
+<!--   -->
+</a>
+<ul class="blockList">
+<li class="blockList">
+<h4>maintenanceMode</h4>
+<pre>private final&nbsp;boolean <a href="../../../../../src-html/org/apache/hadoop/hbase/master/HMaster.html#line.442">maintenanceMode</a></pre>
+</li>
+</ul>
+<a name="MAINTENANCE_MODE">
+<!--   -->
+</a>
+<ul class="blockList">
+<li class="blockList">
+<h4>MAINTENANCE_MODE</h4>
+<pre>static final&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/master/HMaster.html#line.443">MAINTENANCE_MODE</a></pre>
+<dl>
+<dt><span class="seeLabel">See Also:</span></dt>
+<dd><a href="../../../../../constant-values.html#org.apache.hadoop.hbase.master.HMaster.MAINTENANCE_MODE">Constant Field Values</a></dd>
+</dl>
+</li>
+</ul>
 <a name="UNSUPPORTED_PROCEDURES">
 <!--   -->
 </a>
 <ul class="blockListLast">
 <li class="blockList">
 <h4>UNSUPPORTED_PROCEDURES</h4>
-<pre>private static final&nbsp;org.apache.hbase.thirdparty.com.google.common.collect.ImmutableSet&lt;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Class.html?is-external=true" title="class or interface in java.lang">Class</a>&lt;?&gt;&gt; <a href="../../../../../src-html/org/apache/hadoop/hbase/master/HMaster.html#line.811">UNSUPPORTED_PROCEDURES</a></pre>
+<pre>private static final&nbsp;org.apache.hbase.thirdparty.com.google.common.collect.ImmutableSet&lt;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Class.html?is-external=true" title="class or interface in java.lang">Class</a>&lt;? extends <a href="../../../../../org/apache/hadoop/hbase/procedure2/Procedure.html" title="class in org.apache.hadoop.hbase.procedure2">Procedure</a>&gt;&gt; <a href="../../../../../src-html/org/apache/hadoop/hbase/master/HMaster.html#line.822">UNSUPPORTED_PROCEDURES</a></pre>
 </li>
 </ul>
 </li>
@@ -2132,7 +2149,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/master/MasterServices
 <ul class="blockListLast">
 <li class="blockList">
 <h4>HMaster</h4>
-<pre>public&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/master/HMaster.html#line.498">HMaster</a>(org.apache.hadoop.conf.Configuration&nbsp;conf)
+<pre>public&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/master/HMaster.html#line.499">HMaster</a>(org.apache.hadoop.conf.Configuration&nbsp;conf)
         throws <a href="https://docs.oracle.com/javase/8/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</a>,
                org.apache.zookeeper.KeeperException</pre>
 <div class="block">Initializes the HMaster. The steps are as follows:
@@ -2166,7 +2183,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/master/MasterServices
 <ul class="blockList">
 <li class="blockList">
 <h4>getUseThisHostnameInstead</h4>
-<pre>protected&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/master/HMaster.html#line.569">getUseThisHostnameInstead</a>(org.apache.hadoop.conf.Configuration&nbsp;conf)</pre>
+<pre>protected&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/master/HMaster.html#line.580">getUseThisHostnameInstead</a>(org.apache.hadoop.conf.Configuration&nbsp;conf)</pre>
 <dl>
 <dt><span class="overrideSpecifyLabel">Overrides:</span></dt>
 <dd><code><a href="../../../../../org/apache/hadoop/hbase/regionserver/HRegionServer.html#getUseThisHostnameInstead-org.apache.hadoop.conf.Configuration-">getUseThisHostnameInstead</a></code>&nbsp;in class&nbsp;<code><a href="../../../../../org/apache/hadoop/hbase/regionserver/HRegionServer.html" title="class in org.apache.hadoop.hbase.regionserver">HRegionServer</a></code></dd>
@@ -2179,7 +2196,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/master/MasterServices
 <ul class="blockList">
 <li class="blockList">
 <h4>run</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/master/HMaster.html#line.576">run</a>()</pre>
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/master/HMaster.html#line.587">run</a>()</pre>
 <div class="block"><span class="descfrmTypeLabel">Description copied from class:&nbsp;<code><a href="../../../../../org/apache/hadoop/hbase/regionserver/HRegionServer.html#run--">HRegionServer</a></code></span></div>
 <div class="block">The HRegionServer sticks in this loop until closed.</div>
 <dl>
@@ -2196,7 +2213,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/master/MasterServices
 <ul class="blockList">
 <li class="blockList">
 <h4>putUpJettyServer</h4>
-<pre>private&nbsp;int&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/master/HMaster.html#line.614">putUpJettyServer</a>()
+<pre>private&nbsp;int&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/master/HMaster.html#line.625">putUpJettyServer</a>()
                       throws <a href="https://docs.oracle.com/javase/8/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</a></pre>
 <dl>
 <dt><span class="throwsLabel">Throws:</span></dt>
@@ -2210,7 +2227,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/master/MasterServices
 <ul class="blockList">
 <li class="blockList">
 <h4>getMetaTableObserver</h4>
-<pre>protected&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/util/function/Function.html?is-external=true" title="class or interface in java.util.function">Function</a>&lt;<a href="../../../../../org/apache/hadoop/hbase/client/TableDescriptorBuilder.html" title="class in org.apache.hadoop.hbase.client">TableDescriptorBuilder</a>,<a href="../../../../../org/apache/hadoop/hbase/client/TableDescriptorBuilder.html" title="class in org.apache.hadoop.hbase.client">TableDescriptorBuilder</a>&gt;&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/master/HMaster.html#line.664">getMetaTableObserver</a>()</pre>
+<pre>protected&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/util/function/Function.html?is-external=true" title="class or interface in java.util.function">Function</a>&lt;<a href="../../../../../org/apache/hadoop/hbase/client/TableDescriptorBuilder.html" title="class in org.apache.hadoop.hbase.client">TableDescriptorBuilder</a>,<a href="../../../../../org/apache/hadoop/hbase/client/TableDescriptorBuilder.html" title="class in org.apache.hadoop.hbase.client">TableDescriptorBuilder</a>&gt;&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/master/HMaster.html#line.675">getMetaTableObserver</a>()</pre>
 <dl>
 <dt><span class="overrideSpecifyLabel">Overrides:</span></dt>
 <dd><code><a href="../../../../../org/apache/hadoop/hbase/regionserver/HRegionServer.html#getMetaTableObserver--">getMetaTableObserver</a></code>&nbsp;in class&nbsp;<code><a href="../../../../../org/apache/hadoop/hbase/regionserver/HRegionServer.html" title="class in org.apache.hadoop.hbase.regionserver">HRegionServer</a></code></dd>
@@ -2223,7 +2240,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/master/MasterServices
 <ul class="blockList">
 <li class="blockList">
 <h4>login</h4>
-<pre>protected&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/master/HMaster.html#line.671">login</a>(<a href="../../../../../org/apache/hadoop/hbase/security/UserProvider.html" title="class in org.apache.hadoop.hbase.security">UserProvider</a>&nbsp;user,
+<pre>protected&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/master/HMaster.html#line.682">login</a>(<a href="../../../../../org/apache/hadoop/hbase/security/UserProvider.html" title="class in org.apache.hadoop.hbase.security">UserProvider</a>&nbsp;user,
                      <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;host)
               throws <a href="https://docs.oracle.com/javase/8/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</a></pre>
 <div class="block">For compatibility, if failed with regionserver credentials, try the master one</div>
@@ -2241,7 +2258,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/master/MasterServices
 <ul class="blockList">
 <li class="blockList">
 <h4>waitForMasterActive</h4>
-<pre>protected&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/master/HMaster.html#line.686">waitForMasterActive</a>()</pre>
+<pre>protected&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/master/HMaster.html#line.697">waitForMasterActive</a>()</pre>
 <div class="block">If configured to put regions on active master,
  wait till a backup master becomes active.
  Otherwise, loop till the server is stopped or aborted.</div>
@@ -2257,7 +2274,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/master/MasterServices
 <ul class="blockList">
 <li class="blockList">
 <h4>getMasterRpcServices</h4>
-<pre>public&nbsp;<a href="../../../../../org/apache/hadoop/hbase/master/MasterRpcServices.html" title="class in org.apache.hadoop.hbase.master">MasterRpcServices</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/master/HMaster.html#line.694">getMasterRpcServices</a>()</pre>
+<pre>public&nbsp;<a href="../../../../../org/apache/hadoop/hbase/master/MasterRpcServices.html" title="class in org.apache.hadoop.hbase.master">MasterRpcServices</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/master/HMaster.html#line.708">getMasterRpcServices</a>()</pre>
 </li>
 </ul>
 <a name="balanceSwitch-boolean-">
@@ -2266,7 +2283,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/master/MasterServices
 <ul class="blockList">
 <li class="blockList">
 <h4>balanceSwitch</h4>
-<pre>public&nbsp;boolean&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/master/HMaster.html#line.698">balanceSwitch</a>(boolean&nbsp;b)
+<pre>public&nbsp;boolean&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/master/HMaster.html#line.712">balanceSwitch</a>(boolean&nbsp;b)
                       throws <a href="https://docs.oracle.com/javase/8/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</a></pre>
 <dl>
 <dt><span class="throwsLabel">Throws:</span></dt>
@@ -2280,7 +2297,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/master/MasterServices
 <ul class="blockList">
 <li class="blockList">
 <h4>getProcessName</h4>
-<pre>protected&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/master/HMaster.html#line.703">getProcessName</a>()</pre>
+<pre>protected&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/master/HMaster.html#line.717">getProcessName</a>()</pre>
 <dl>
 <dt><span class="overrideSpecifyLabel">Overrides:</span></dt>
 <dd><code><a href="../../../../../org/apache/hadoop/hbase/regionserver/HRegionServer.html#getProcessName--">getProcessName</a></code>&nbsp;in class&nbsp;<code><a href="../../../../../org/apache/hadoop/hbase/regionserver/HRegionServer.html" title="class in org.apache.hadoop.hbase.regionserver">HRegionServer</a></code></dd>
@@ -2293,7 +2310,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/master/MasterServices
 <ul class="blockList">
 <li class="blockList">
 <h4>canCreateBaseZNode</h4>
-<pre>protected&nbsp;boolean&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/master/HMaster.html#line.708">canCreateBaseZNode</a>()</pre>
+<pre>protected&nbsp;boolean&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/master/HMaster.html#line.722">canCreateBaseZNode</a>()</pre>
 <dl>
 <dt><span class="overrideSpecifyLabel">Overrides:</span></dt>
 <dd><code><a href="../../../../../org/apache/hadoop/hbase/regionserver/HRegionServer.html#canCreateBaseZNode--">canCreateBaseZNode</a></code>&nbsp;in class&nbsp;<code><a href="../../../../../org/apache/hadoop/hbase/regionserver/HRegionServer.html" title="class in org.apache.hadoop.hbase.regionserver">HRegionServer</a></code></dd>
@@ -2306,7 +2323,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/master/MasterServices
 <ul class="blockList">
 <li class="blockList">
 <h4>canUpdateTableDescriptor</h4>
-<pre>protected&nbsp;boolean&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/master/HMaster.html#line.713">canUpdateTableDescriptor</a>()</pre>
+<pre>protected&nbsp;boolean&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/master/HMaster.html#line.727">canUpdateTableDescriptor</a>()</pre>
 <dl>
 <dt><span class="overrideSpecifyLabel">Overrides:</span></dt>
 <dd><code><a href="../../../../../org/apache/hadoop/hbase/regionserver/HRegionServer.html#canUpdateTableDescriptor--">canUpdateTableDescriptor</a></code>&nbsp;in class&nbsp;<code><a href="../../../../../org/apache/hadoop/hbase/regionserver/HRegionServer.html" title="class in org.apache.hadoop.hbase.regionserver">HRegionServer</a></code></dd>
@@ -2319,7 +2336,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/master/MasterServices
 <ul class="blockList">
 <li class="blockList">
 <h4>createRpcServices</h4>
-<pre>protected&nbsp;<a href="../../../../../org/apache/hadoop/hbase/regionserver/RSRpcServices.html" title="class in org.apache.hadoop.hbase.regionserver">RSRpcServices</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/master/HMaster.html#line.718">createRpcServices</a>()
+<pre>protected&nbsp;<a href="../../../../../org/apache/hadoop/hbase/regionserver/RSRpcServices.html" title="class in org.apache.hadoop.hbase.regionserver">RSRpcServices</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/master/HMaster.html#line.732">createRpcServices</a>()
                                    throws <a href="https://docs.oracle.com/javase/8/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</a></pre>
 <dl>
 <dt><span class="overrideSpecifyLabel">Overrides:</span></dt>
@@ -2335,7 +2352,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/master/MasterServices
 <ul class="blockList">
 <li class="blockList">
 <h4>configureInfoServer</h4>
-<pre>protected&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/master/HMaster.html#line.723">configureInfoServer</a>()</pre>
+<pre>protected&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/master/HMaster.html#line.737">configureInfoServer</a>()</pre>
 <dl>
 <dt><span class="overrideSpecifyLabel">Overrides:</span></dt>
 <dd><code><a href="../../../../../org/apache/hadoop/hbase/regionserver/HRegionServer.html#configureInfoServer--">configureInfoServer</a></code>&nbsp;in class&nbsp;<code><a href="../../../../../org/apache/hadoop/hbase/regionserver/HRegionServer.html" title="class in org.apache.hadoop.hbase.regionserver">HRegionServer</a></code></dd>
@@ -2348,7 +2365,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/master/MasterServices
 <ul class="blockList">
 <li class="blockList">
 <h4>getDumpServlet</h4>
-<pre>protected&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Class.html?is-external=true" title="class or interface in java.lang">Class</a>&lt;? extends javax.servlet.http.HttpServlet&gt;&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/master/HMaster.html#line.732">getDumpServlet</a>()</pre>
+<pre>protected&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Class.html?is-external=true" title="class or interface in java.lang">Class</a>&lt;? extends javax.servlet.http.HttpServlet&gt;&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/master/HMaster.html#line.746">getDumpServlet</a>()</pre>
 <dl>
 <dt><span class="overrideSpecifyLabel">Overrides:</span></dt>
 <dd><code><a href="../../../../../org/apache/hadoop/hbase/regionserver/HRegionServer.html#getDumpServlet--">getDumpServlet</a></code>&nbsp;in class&nbsp;<code><a href="../../../../../org/apache/hadoop/hbase/regionserver/HRegionServer.html" title="class in org.apache.hadoop.hbase.regionserver">HRegionServer</a></code></dd>
@@ -2361,7 +2378,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/master/MasterServices
 <ul class="blockList">
 <li class="blockList">
 <h4>getMasterMetrics</h4>
-<pre>public&nbsp;<a href="../../../../../org/apache/hadoop/hbase/master/MetricsMaster.html" title="class in org.apache.hadoop.hbase.master">MetricsMaster</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/master/HMaster.html#line.737">getMasterMetrics</a>()</pre>
+<pre>public&nbsp;<a href="../../../../../org/apache/hadoop/hbase/master/MetricsMaster.html" title="class in org.apache.hadoop.hbase.master">MetricsMaster</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/master/HMaster.html#line.751">getMasterMetrics</a>()</pre>
 <dl>
 <dt><span class="overrideSpecifyLabel">Specified by:</span></dt>
 <dd><code><a href="../../../../../org/apache/hadoop/hbase/master/MasterServices.html#getMasterMetrics--">getMasterMetrics</a></code>&nbsp;in interface&nbsp;<code><a href="../../../../../org/apache/hadoop/hbase/master/MasterServices.html" title="interface in org.apache.hadoop.hbase.master">MasterServices</a></code></dd>
@@ -2376,7 +2393,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/master/MasterServices
 <ul class="blockList">
 <li class="blockList">
 <h4>initializeZKBasedSystemTrackers</h4>
-<pre>protected&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/master/HMaster.html#line.751">initializeZKBasedSystemTrackers</a>()
+<pre>protected&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/master/HMaster.html#line.765">initializeZKBasedSystemTrackers</a>()
                                         throws <a href="https://docs.oracle.com/javase/8/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</a>,
                                                <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/InterruptedException.html?is-external=true" title="class or interface in java.lang">InterruptedException</a>,
                                                org.apache.zookeeper.KeeperException,
@@ -2403,7 +2420,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/master/MasterServices
 <ul class="blockList">
 <li class="blockList">
 <h4>checkUnsupportedProcedure</h4>
-<pre>private&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/master/HMaster.html#line.821">checkUnsupportedProcedure</a>(<a href="https://docs.oracle.com/javase/8/docs/api/java/util/Map.html?is-external=true" title="class or interface in java.util">Map</a>&lt;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Class.html?is-external=true" title="class or interface in java.lang">Class</a>&lt;? extends <a href="../../../../../org/apache/hadoop/hbase/procedure2/Procedure.html" title="class in org.apache.hadoop.hbase.procedure2">Procedure</a>&gt;,<a href="https://docs.oracle.com/javase/8/docs/api/java/util/List.html?is-external=true" title="class or interface in java.util">List</a>&lt;<a href="../../../../../org/apache/hadoop/hbase/procedure2/Procedure.html" title="class in org.apache.hadoop.hbase.procedure2">Procedure</a>&lt;<a href="../../../../../org/apache/hadoop/hbase/master/procedure/MasterProcedureEnv.html" title="class in org.apache.hadoop.hbase.
 master.procedure">MasterProcedureEnv</a>&gt;&gt;&gt;&nbsp;procsByType)
+<pre>private&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/master/HMaster.html#line.832">checkUnsupportedProcedure</a>(<a href="https://docs.oracle.com/javase/8/docs/api/java/util/Map.html?is-external=true" title="class or interface in java.util">Map</a>&lt;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Class.html?is-external=true" title="class or interface in java.lang">Class</a>&lt;? extends <a href="../../../../../org/apache/hadoop/hbase/procedure2/Procedure.html" title="class in org.apache.hadoop.hbase.procedure2">Procedure</a>&gt;,<a href="https://docs.oracle.com/javase/8/docs/api/java/util/List.html?is-external=true"

<TRUNCATED>

[44/46] hbase-site git commit: Published site at 05d22ed960204183fbd9bd16f1dbca6410ccde76.

Posted by gi...@apache.org.
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/3649682c/book.html
----------------------------------------------------------------------
diff --git a/book.html b/book.html
index 7a3f350..623c48c 100644
--- a/book.html
+++ b/book.html
@@ -25204,6 +25204,28 @@ To invoke:</p>
 </div>
 </div>
 </div>
+<div class="sect3">
+<h4 id="trouble.tools.maintenancemode"><a class="anchor" href="#trouble.tools.maintenancemode"></a>130.1.4. Maintenance Mode</h4>
+<div class="paragraph">
+<p>If the cluster has gotten stuck in some state and the standard techniques aren&#8217;t making progress,
+ it is possible to restart the cluster in "maintenance mode." This mode features drastically
+ reduced capabilities and surface area, making it easier to enact very low-level changes such
+ as repairing/recovering the <code>hbase:meta</code> table.</p>
+</div>
+<div class="paragraph">
+<p>To enter maintenance mode, set <code>hbase.master.maintenance_mode</code> to <code>true</code> either in your
+<code>hbase-site.xml</code> or via system propery when starting the master process (<code>-D&#8230;&#8203;=true</code>). Entering
+and exiting this mode requires a service restart, however the typical use will be when HBase Master
+is already facing startup difficulties.</p>
+</div>
+<div class="paragraph">
+<p>When maintenance mode is enabled, the master will host all system tables - ensure that it has
+enough memory to do so. RegionServers will not be assigned any regions from user-space tables;
+in fact, they will go completely unused while in maintenance mode. Additionally, the master will
+not load any coprocessors, will not run any normalization or merge/split operations, and will not
+enforce quotas.</p>
+</div>
+</div>
 </div>
 <div class="sect2">
 <h3 id="trouble.tools.external"><a class="anchor" href="#trouble.tools.external"></a>130.2. External Tools</h3>
@@ -41302,7 +41324,7 @@ org/apache/hadoop/hbase/security/access/AccessControlClient.revoke:(Lorg/apache/
 <div id="footer">
 <div id="footer-text">
 Version 3.0.0-SNAPSHOT<br>
-Last updated 2018-10-18 14:33:07 UTC
+Last updated 2018-10-19 14:32:59 UTC
 </div>
 </div>
 </body>

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

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/3649682c/checkstyle-aggregate.html
----------------------------------------------------------------------
diff --git a/checkstyle-aggregate.html b/checkstyle-aggregate.html
index d59cbc5..f3f40d9 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="20181018" />
+    <meta name="Date-Revision-yyyymmdd" content="20181019" />
     <meta http-equiv="Content-Language" content="en" />
     <title>Apache HBase &#x2013; Checkstyle Results</title>
     <link rel="stylesheet" href="./css/apache-maven-fluido-1.4-HBase.min.css" />
@@ -291,7 +291,7 @@
 <th><img src="images/icon_warning_sml.gif" alt="" />&#160;Warnings</th>
 <th><img src="images/icon_error_sml.gif" alt="" />&#160;Errors</th></tr>
 <tr class="b">
-<td>3793</td>
+<td>3794</td>
 <td>0</td>
 <td>0</td>
 <td>15111</td></tr></table></div>
@@ -60240,919 +60240,919 @@
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 101).</td>
-<td>451</td></tr>
+<td>452</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'ctor def' child has incorrect indentation level 7, expected level should be 6.</td>
-<td>454</td></tr>
+<td>455</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'ctor def' child has incorrect indentation level 7, expected level should be 6.</td>
-<td>455</td></tr>
+<td>456</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 101).</td>
-<td>465</td></tr>
+<td>466</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 105).</td>
-<td>467</td></tr>
+<td>468</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 109).</td>
-<td>468</td></tr>
+<td>469</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 103).</td>
-<td>470</td></tr>
+<td>471</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 118).</td>
-<td>471</td></tr>
+<td>472</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 120).</td>
-<td>472</td></tr>
+<td>473</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 103).</td>
-<td>473</td></tr>
+<td>474</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 115).</td>
-<td>477</td></tr>
+<td>478</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 104).</td>
-<td>506</td></tr>
+<td>517</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 114).</td>
-<td>651</td></tr>
+<td>662</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 131).</td>
-<td>665</td></tr>
+<td>676</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
-<td>795</td></tr>
+<td>806</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>MethodLength</td>
-<td>Method length is 279 lines (max allowed is 150).</td>
-<td>893</td></tr>
+<td>Method length is 286 lines (max allowed is 150).</td>
+<td>904</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'method def' child has incorrect indentation level 3, expected level should be 4.</td>
-<td>1384</td></tr>
+<td>1402</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'method def' child has incorrect indentation level 3, expected level should be 4.</td>
-<td>1386</td></tr>
+<td>1404</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'method def' child has incorrect indentation level 3, expected level should be 4.</td>
-<td>1388</td></tr>
+<td>1406</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'method def' child has incorrect indentation level 3, expected level should be 4.</td>
-<td>1390</td></tr>
+<td>1408</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'method def' child has incorrect indentation level 3, expected level should be 4.</td>
-<td>1392</td></tr>
+<td>1410</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'method def' child has incorrect indentation level 3, expected level should be 4.</td>
-<td>1400</td></tr>
+<td>1418</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'method def' child has incorrect indentation level 3, expected level should be 4.</td>
-<td>1401</td></tr>
+<td>1419</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'method def' child has incorrect indentation level 3, expected level should be 4.</td>
-<td>1406</td></tr>
+<td>1424</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'method def' child has incorrect indentation level 3, expected level should be 4.</td>
-<td>1407</td></tr>
+<td>1425</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
-<td>1621</td></tr>
+<td>1639</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
-<td>1643</td></tr>
+<td>1661</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
-<td>1660</td></tr>
+<td>1678</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
-<td>1695</td></tr>
+<td>1713</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>whitespace</td>
 <td>MethodParamPad</td>
 <td>'(' is preceded with whitespace.</td>
-<td>1846</td></tr>
+<td>1864</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>whitespace</td>
 <td>MethodParamPad</td>
 <td>'(' is preceded with whitespace.</td>
-<td>1850</td></tr>
+<td>1868</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'method def modifier' has incorrect indentation level 6, expected level should be one of the following: 8, 10.</td>
-<td>1862</td></tr>
+<td>1880</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'method def' child has incorrect indentation level 8, expected level should be one of the following: 10, 12.</td>
-<td>1864</td></tr>
+<td>1882</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'method def' child has incorrect indentation level 8, expected level should be one of the following: 10, 12.</td>
-<td>1866</td></tr>
+<td>1884</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'method def' child has incorrect indentation level 8, expected level should be one of the following: 10, 12.</td>
-<td>1869</td></tr>
+<td>1887</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'method def' child has incorrect indentation level 8, expected level should be one of the following: 10, 12.</td>
-<td>1872</td></tr>
+<td>1890</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'method def rcurly' has incorrect indentation level 6, expected level should be one of the following: 8, 10.</td>
-<td>1873</td></tr>
+<td>1891</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'method def modifier' has incorrect indentation level 6, expected level should be one of the following: 8, 10.</td>
-<td>1875</td></tr>
+<td>1893</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'method def' child has incorrect indentation level 8, expected level should be one of the following: 10, 12.</td>
-<td>1877</td></tr>
+<td>1895</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'method def rcurly' has incorrect indentation level 6, expected level should be one of the following: 8, 10.</td>
-<td>1878</td></tr>
+<td>1896</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'object def rcurly' has incorrect indentation level 4, expected level should be one of the following: 6, 8.</td>
-<td>1879</td></tr>
+<td>1897</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'throws' has incorrect indentation level 2, expected level should be 4.</td>
-<td>1885</td></tr>
+<td>1903</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'method def modifier' has incorrect indentation level 6, expected level should be one of the following: 8, 10.</td>
-<td>1889</td></tr>
+<td>1907</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'method def' child has incorrect indentation level 8, expected level should be one of the following: 10, 12.</td>
-<td>1891</td></tr>
+<td>1909</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'method def' child has incorrect indentation level 8, expected level should be one of the following: 10, 12.</td>
-<td>1892</td></tr>
+<td>1910</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'method def' child has incorrect indentation level 8, expected level should be one of the following: 10, 12.</td>
-<td>1895</td></tr>
+<td>1913</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'method def rcurly' has incorrect indentation level 6, expected level should be one of the following: 8, 10.</td>
-<td>1896</td></tr>
+<td>1914</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'method def modifier' has incorrect indentation level 6, expected level should be one of the following: 8, 10.</td>
-<td>1898</td></tr>
+<td>1916</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'method def' child has incorrect indentation level 8, expected level should be one of the following: 10, 12.</td>
-<td>1900</td></tr>
+<td>1918</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'method def rcurly' has incorrect indentation level 6, expected level should be one of the following: 8, 10.</td>
-<td>1901</td></tr>
+<td>1919</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'object def rcurly' has incorrect indentation level 4, expected level should be one of the following: 6, 8.</td>
-<td>1902</td></tr>
+<td>1920</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 116).</td>
-<td>1921</td></tr>
+<td>1939</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 105).</td>
-<td>1923</td></tr>
+<td>1941</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'method def modifier' has incorrect indentation level 6, expected level should be one of the following: 8, 10.</td>
-<td>2014</td></tr>
+<td>2032</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'method def' child has incorrect indentation level 8, expected level should be one of the following: 10, 12.</td>
-<td>2016</td></tr>
+<td>2034</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'method def' child has incorrect indentation level 8, expected level should be one of the following: 10, 12.</td>
-<td>2018</td></tr>
+<td>2036</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'method def' child has incorrect indentation level 8, expected level should be one of the following: 10, 12.</td>
-<td>2025</td></tr>
+<td>2043</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'method def' child has incorrect indentation level 8, expected level should be one of the following: 10, 12.</td>
-<td>2026</td></tr>
+<td>2044</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'method def' child has incorrect indentation level 8, expected level should be one of the following: 10, 12.</td>
-<td>2028</td></tr>
+<td>2046</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'method def' child has incorrect indentation level 8, expected level should be one of the following: 10, 12.</td>
-<td>2030</td></tr>
+<td>2048</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'method def rcurly' has incorrect indentation level 6, expected level should be one of the following: 8, 10.</td>
-<td>2031</td></tr>
+<td>2049</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'method def modifier' has incorrect indentation level 6, expected level should be one of the following: 8, 10.</td>
-<td>2033</td></tr>
+<td>2051</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'method def' child has incorrect indentation level 8, expected level should be one of the following: 10, 12.</td>
-<td>2035</td></tr>
+<td>2053</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'method def rcurly' has incorrect indentation level 6, expected level should be one of the following: 8, 10.</td>
-<td>2036</td></tr>
+<td>2054</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'object def rcurly' has incorrect indentation level 4, expected level should be one of the following: 6, 8.</td>
-<td>2037</td></tr>
+<td>2055</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
-<td>2067</td></tr>
+<td>2085</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'throws' has incorrect indentation level 2, expected level should be 4.</td>
-<td>2329</td></tr>
+<td>2347</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
-<td>2330</td></tr>
+<td>2348</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'throws' has incorrect indentation level 2, expected level should be 4.</td>
-<td>2337</td></tr>
+<td>2355</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
-<td>2338</td></tr>
+<td>2356</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'throws' has incorrect indentation level 2, expected level should be 4.</td>
-<td>2344</td></tr>
+<td>2362</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
-<td>2345</td></tr>
+<td>2363</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'throws' has incorrect indentation level 2, expected level should be 4.</td>
-<td>2352</td></tr>
+<td>2370</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
-<td>2353</td></tr>
+<td>2371</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'throws' has incorrect indentation level 2, expected level should be 4.</td>
-<td>2358</td></tr>
+<td>2376</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'method def modifier' has incorrect indentation level 6, expected level should be one of the following: 8, 10.</td>
-<td>2376</td></tr>
+<td>2394</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'method def' child has incorrect indentation level 8, expected level should be one of the following: 10, 12.</td>
-<td>2378</td></tr>
+<td>2396</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'method def' child has incorrect indentation level 8, expected level should be one of the following: 10, 12.</td>
-<td>2380</td></tr>
+<td>2398</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'method def' child has incorrect indentation level 8, expected level should be one of the following: 10, 12.</td>
-<td>2386</td></tr>
+<td>2404</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'method def' child has incorrect indentation level 8, expected level should be one of the following: 10, 12.</td>
-<td>2387</td></tr>
+<td>2405</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'method def' child has incorrect indentation level 8, expected level should be one of the following: 10, 12.</td>
-<td>2389</td></tr>
+<td>2407</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'method def' child has incorrect indentation level 8, expected level should be one of the following: 10, 12.</td>
-<td>2391</td></tr>
+<td>2409</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'method def rcurly' has incorrect indentation level 6, expected level should be one of the following: 8, 10.</td>
-<td>2392</td></tr>
+<td>2410</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'method def modifier' has incorrect indentation level 6, expected level should be one of the following: 8, 10.</td>
-<td>2394</td></tr>
+<td>2412</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'method def' child has incorrect indentation level 8, expected level should be one of the following: 10, 12.</td>
-<td>2396</td></tr>
+<td>2414</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'method def rcurly' has incorrect indentation level 6, expected level should be one of the following: 8, 10.</td>
-<td>2397</td></tr>
+<td>2415</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'object def rcurly' has incorrect indentation level 4, expected level should be one of the following: 6, 8.</td>
-<td>2398</td></tr>
+<td>2416</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'method def modifier' has incorrect indentation level 6, expected level should be one of the following: 8, 10.</td>
-<td>2411</td></tr>
+<td>2429</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'method def' child has incorrect indentation level 8, expected level should be one of the following: 10, 12.</td>
-<td>2413</td></tr>
+<td>2431</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'method def' child has incorrect indentation level 8, expected level should be one of the following: 10, 12.</td>
-<td>2415</td></tr>
+<td>2433</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'method def' child has incorrect indentation level 8, expected level should be one of the following: 10, 12.</td>
-<td>2416</td></tr>
+<td>2434</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'method def' child has incorrect indentation level 8, expected level should be one of the following: 10, 12.</td>
-<td>2417</td></tr>
+<td>2435</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'method def' child has incorrect indentation level 8, expected level should be one of the following: 10, 12.</td>
-<td>2419</td></tr>
+<td>2437</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'method def' child has incorrect indentation level 8, expected level should be one of the following: 10, 12.</td>
-<td>2421</td></tr>
+<td>2439</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'method def rcurly' has incorrect indentation level 6, expected level should be one of the following: 8, 10.</td>
-<td>2422</td></tr>
+<td>2440</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'method def modifier' has incorrect indentation level 6, expected level should be one of the following: 8, 10.</td>
-<td>2424</td></tr>
+<td>2442</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'method def' child has incorrect indentation level 8, expected level should be one of the following: 10, 12.</td>
-<td>2426</td></tr>
+<td>2444</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'method def rcurly' has incorrect indentation level 6, expected level should be one of the following: 8, 10.</td>
-<td>2427</td></tr>
+<td>2445</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'object def rcurly' has incorrect indentation level 4, expected level should be one of the following: 6, 8.</td>
-<td>2428</td></tr>
+<td>2446</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'method def modifier' has incorrect indentation level 6, expected level should be one of the following: 8, 10.</td>
-<td>2511</td></tr>
+<td>2529</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'method def' child has incorrect indentation level 8, expected level should be one of the following: 10, 12.</td>
-<td>2513</td></tr>
+<td>2531</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'method def' child has incorrect indentation level 8, expected level should be one of the following: 10, 12.</td>
-<td>2519</td></tr>
+<td>2537</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'if' has incorrect indentation level 8, expected level should be one of the following: 10, 12.</td>
-<td>2520</td></tr>
+<td>2538</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'if' has incorrect indentation level 10, expected level should be one of the following: 12, 14.</td>
-<td>2521</td></tr>
+<td>2539</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'if' child has incorrect indentation level 12, expected level should be one of the following: 14, 16.</td>
-<td>2522</td></tr>
+<td>2540</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'if' has incorrect indentation level 12, expected level should be one of the following: 14, 16.</td>
-<td>2523</td></tr>
+<td>2541</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'if' child has incorrect indentation level 14, expected level should be one of the following: 16, 18.</td>
-<td>2524</td></tr>
+<td>2542</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'if' has incorrect indentation level 14, expected level should be one of the following: 16, 18.</td>
-<td>2525</td></tr>
+<td>2543</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'if' child has incorrect indentation level 16, expected level should be one of the following: 18, 20.</td>
-<td>2526</td></tr>
+<td>2544</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'if rcurly' has incorrect indentation level 14, expected level should be one of the following: 16, 18.</td>
-<td>2528</td></tr>
+<td>2546</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'if rcurly' has incorrect indentation level 12, expected level should be one of the following: 14, 16.</td>
-<td>2529</td></tr>
+<td>2547</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'if rcurly' has incorrect indentation level 10, expected level should be one of the following: 12, 14.</td>
-<td>2530</td></tr>
+<td>2548</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'if' child has incorrect indentation level 12, expected level should be one of the following: 14, 16.</td>
-<td>2531</td></tr>
+<td>2549</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'if rcurly' has incorrect indentation level 10, expected level should be one of the following: 12, 14.</td>
-<td>2532</td></tr>
+<td>2550</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'if rcurly' has incorrect indentation level 8, expected level should be one of the following: 10, 12.</td>
-<td>2533</td></tr>
+<td>2551</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'method def' child has incorrect indentation level 8, expected level should be one of the following: 10, 12.</td>
-<td>2535</td></tr>
+<td>2553</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'method def' child has incorrect indentation level 8, expected level should be one of the following: 10, 12.</td>
-<td>2542</td></tr>
+<td>2560</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'method def' child has incorrect indentation level 8, expected level should be one of the following: 10, 12.</td>
-<td>2543</td></tr>
+<td>2561</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'method def' child has incorrect indentation level 8, expected level should be one of the following: 10, 12.</td>
-<td>2545</td></tr>
+<td>2563</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'method def' child has incorrect indentation level 8, expected level should be one of the following: 10, 12.</td>
-<td>2547</td></tr>
+<td>2565</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'method def rcurly' has incorrect indentation level 6, expected level should be one of the following: 8, 10.</td>
-<td>2548</td></tr>
+<td>2566</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'method def modifier' has incorrect indentation level 6, expected level should be one of the following: 8, 10.</td>
-<td>2550</td></tr>
+<td>2568</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'method def' child has incorrect indentation level 8, expected level should be one of the following: 10, 12.</td>
-<td>2552</td></tr>
+<td>2570</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'method def rcurly' has incorrect indentation level 6, expected level should be one of the following: 8, 10.</td>
-<td>2553</td></tr>
+<td>2571</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'object def rcurly' has incorrect indentation level 4, expected level should be one of the following: 6, 8.</td>
-<td>2554</td></tr>
+<td>2572</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'method def modifier' has incorrect indentation level 6, expected level should be one of the following: 8, 10.</td>
-<td>2564</td></tr>
+<td>2582</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'method def' child has incorrect indentation level 8, expected level should be one of the following: 10, 12.</td>
-<td>2566</td></tr>
+<td>2584</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'method def' child has incorrect indentation level 8, expected level should be one of the following: 10, 12.</td>
-<td>2568</td></tr>
+<td>2586</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'method def' child has incorrect indentation level 8, expected level should be one of the following: 10, 12.</td>
-<td>2578</td></tr>
+<td>2596</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'method def' child has incorrect indentation level 8, expected level should be one of the following: 10, 12.</td>
-<td>2579</td></tr>
+<td>2597</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'method def' child has incorrect indentation level 8, expected level should be one of the following: 10, 12.</td>
-<td>2581</td></tr>
+<td>2599</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'method def' child has incorrect indentation level 8, expected level should be one of the following: 10, 12.</td>
-<td>2583</td></tr>
+<td>2601</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'method def rcurly' has incorrect indentation level 6, expected level should be one of the following: 8, 10.</td>
-<td>2584</td></tr>
+<td>2602</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'method def modifier' has incorrect indentation level 6, expected level should be one of the following: 8, 10.</td>
-<td>2586</td></tr>
+<td>2604</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'method def' child has incorrect indentation level 8, expected level should be one of the following: 10, 12.</td>
-<td>2588</td></tr>
+<td>2606</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'method def rcurly' has incorrect indentation level 6, expected level should be one of the following: 8, 10.</td>
-<td>2589</td></tr>
+<td>2607</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'object def rcurly' has incorrect indentation level 4, expected level should be one of the following: 6, 8.</td>
-<td>2590</td></tr>
+<td>2608</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'throws' has incorrect indentation level 2, expected level should be 4.</td>
-<td>2602</td></tr>
+<td>2620</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'method def modifier' has incorrect indentation level 6, expected level should be one of the following: 8, 10.</td>
-<td>2687</td></tr>
+<td>2705</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'method def rcurly' has incorrect indentation level 6, expected level should be one of the following: 8, 10.</td>
-<td>2691</td></tr>
+<td>2709</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'method def modifier' has incorrect indentation level 6, expected level should be one of the following: 8, 10.</td>
-<td>2693</td></tr>
+<td>2711</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'method def' child has incorrect indentation level 8, expected level should be one of the following: 10, 12.</td>
-<td>2695</td></tr>
+<td>2713</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'method def rcurly' has incorrect indentation level 6, expected level should be one of the following: 8, 10.</td>
-<td>2696</td></tr>
+<td>2714</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'object def rcurly' has incorrect indentation level 4, expected level should be one of the following: 6, 8.</td>
-<td>2697</td></tr>
+<td>2715</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
-<td>3158</td></tr>
+<td>3173</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
-<td>3334</td></tr>
+<td>3349</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
-<td>3336</td></tr>
+<td>3351</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'throws' has incorrect indentation level 2, expected level should be 4.</td>
-<td>3429</td></tr>
+<td>3444</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'for' construct must use '{}'s.</td>
-<td>3459</td></tr>
+<td>3474</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
-<td>3466</td></tr>
+<td>3481</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'throws' has incorrect indentation level 2, expected level should be 4.</td>
-<td>3471</td></tr>
+<td>3486</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
-<td>3500</td></tr>
+<td>3515</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 111).</td>
-<td>3598</td></tr></table></div>
+<td>3613</td></tr></table></div>
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.master.HMasterCommandLine.java">org/apache/hadoop/hbase/master/HMasterCommandLine.java</h3>
 <table border="0" class="table table-striped">
@@ -61212,91 +61212,91 @@
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
-<td>70</td></tr>
+<td>69</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
-<td>76</td></tr>
+<td>75</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
-<td>82</td></tr>
+<td>81</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
-<td>88</td></tr>
+<td>87</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
-<td>89</td></tr>
+<td>88</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
-<td>97</td></tr>
+<td>96</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
-<td>105</td></tr>
+<td>104</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
-<td>106</td></tr>
+<td>105</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
-<td>116</td></tr>
+<td>115</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
-<td>117</td></tr>
+<td>116</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
-<td>129</td></tr>
+<td>128</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
-<td>138</td></tr>
+<td>137</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
-<td>144</td></tr>
+<td>143</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
-<td>145</td></tr>
+<td>144</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
-<td>151</td></tr></table></div>
+<td>150</td></tr></table></div>
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.master.MasterCoprocessorHost.java">org/apache/hadoop/hbase/master/MasterCoprocessorHost.java</h3>
 <table border="0" class="table table-striped">
@@ -61572,13 +61572,13 @@
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
-<td>1634</td></tr>
+<td>1630</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
-<td>1695</td></tr></table></div>
+<td>1691</td></tr></table></div>
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.master.MasterServices.java">org/apache/hadoop/hbase/master/MasterServices.java</h3>
 <table border="0" class="table table-striped">
@@ -62400,31 +62400,31 @@
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
-<td>790</td></tr>
+<td>793</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 106).</td>
-<td>819</td></tr>
+<td>822</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 106).</td>
-<td>832</td></tr>
+<td>835</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 107).</td>
-<td>833</td></tr>
+<td>836</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 103).</td>
-<td>855</td></tr></table></div>
+<td>858</td></tr></table></div>
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.master.SnapshotOfRegionAssignmentFromMeta.java">org/apache/hadoop/hbase/master/SnapshotOfRegionAssignmentFromMeta.java</h3>
 <table border="0" class="table table-striped">
@@ -65115,37 +65115,37 @@
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
-<td>1061</td></tr>
+<td>1057</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
-<td>1067</td></tr>
+<td>1063</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
-<td>1090</td></tr>
+<td>1086</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
-<td>1092</td></tr>
+<td>1088</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
-<td>1181</td></tr>
+<td>1180</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 105).</td>
-<td>1409</td></tr></table></div>
+<td>1408</td></tr></table></div>
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.master.balancer.ClusterLoadState.java">org/apache/hadoop/hbase/master/balancer/ClusterLoadState.java</h3>
 <table border="0" class="table table-striped">
@@ -77444,404 +77444,404 @@
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>MethodLength</td>
-<td>Method length is 227 lines (max allowed is 150).</td>
+<td>Method length is 228 lines (max allowed is 150).</td>
 <td>931</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
-<td>1054</td></tr>
+<td>1055</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
-<td>1055</td></tr>
+<td>1056</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
-<td>1056</td></tr>
+<td>1057</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>EmptyBlock</td>
 <td>Must have at least one statement.</td>
-<td>1064</td></tr>
+<td>1065</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
-<td>1077</td></tr>
+<td>1078</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
-<td>1165</td></tr>
+<td>1166</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
-<td>1379</td></tr>
+<td>1380</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'throws' has incorrect indentation level 2, expected level should be 4.</td>
-<td>1475</td></tr>
+<td>1476</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'initialCountPercentage' has incorrect indentation level 6, expected level should be 8.</td>
-<td>1585</td></tr>
+<td>1586</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
-<td>1688</td></tr>
+<td>1689</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'method call' child has incorrect indentation level 16, expected level should be 18.</td>
-<td>1745</td></tr>
+<td>1746</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 115).</td>
-<td>1771</td></tr>
+<td>1772</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
-<td>1779</td></tr>
+<td>1780</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
-<td>1843</td></tr>
+<td>1844</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'HConstants' has incorrect indentation level 6, expected level should be 8.</td>
-<td>1895</td></tr>
+<td>1896</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'conf' has incorrect indentation level 4, expected level should be 6.</td>
-<td>1909</td></tr>
+<td>1910</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'&quot;hbase.regionserver.wal.max.splitters&quot;' has incorrect indentation level 4, expected level should be 6.</td>
-<td>1930</td></tr>
+<td>1931</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'method call' child has incorrect indentation level 4, expected level should be 6.</td>
-<td>1945</td></tr>
+<td>1946</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
-<td>1950</td></tr>
+<td>1951</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
-<td>1951</td></tr>
+<td>1952</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
-<td>1952</td></tr>
+<td>1953</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
-<td>1953</td></tr>
+<td>1954</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
-<td>1954</td></tr>
+<td>1955</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
-<td>1955</td></tr>
+<td>1956</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
-<td>1956</td></tr>
+<td>1957</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'method call' child has incorrect indentation level 4, expected level should be 6.</td>
-<td>1961</td></tr>
+<td>1962</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
-<td>2044</td></tr>
+<td>2045</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
-<td>2057</td></tr>
+<td>2058</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
-<td>2314</td></tr>
+<td>2315</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
-<td>2470</td></tr>
+<td>2471</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>JavadocTagContinuationIndentation</td>
 <td>Line continuation have incorrect indentation level, expected level should be 2.</td>
-<td>2486</td></tr>
+<td>2487</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>JavadocTagContinuationIndentation</td>
 <td>Line continuation have incorrect indentation level, expected level should be 2.</td>
-<td>2592</td></tr>
+<td>2593</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
-<td>2606</td></tr>
+<td>2607</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
-<td>2608</td></tr>
+<td>2609</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
-<td>2695</td></tr>
+<td>2696</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
-<td>2700</td></tr>
+<td>2701</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
-<td>3015</td></tr>
+<td>3016</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
-<td>3016</td></tr>
+<td>3017</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
-<td>3053</td></tr>
+<td>3054</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'method def' child has incorrect indentation level 5, expected level should be 4.</td>
-<td>3058</td></tr>
+<td>3059</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'synchronized' has incorrect indentation level 5, expected level should be 4.</td>
-<td>3059</td></tr>
+<td>3060</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'for' has incorrect indentation level 7, expected level should be 6.</td>
-<td>3060</td></tr>
+<td>3061</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'for' child has incorrect indentation level 9, expected level should be 8.</td>
-<td>3061</td></tr>
+<td>3062</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'if' has incorrect indentation level 9, expected level should be 8.</td>
-<td>3062</td></tr>
+<td>3063</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'if' child has incorrect indentation level 11, expected level should be 10.</td>
-<td>3063</td></tr>
+<td>3064</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'if rcurly' has incorrect indentation level 9, expected level should be 8.</td>
-<td>3064</td></tr>
+<td>3065</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'for rcurly' has incorrect indentation level 7, expected level should be 6.</td>
-<td>3065</td></tr>
+<td>3066</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'synchronized rcurly' has incorrect indentation level 5, expected level should be 4.</td>
-<td>3066</td></tr>
+<td>3067</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'method def' child has incorrect indentation level 5, expected level should be 4.</td>
-<td>3067</td></tr>
+<td>3068</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'method def rcurly' has incorrect indentation level 3, expected level should be 2.</td>
-<td>3068</td></tr>
+<td>3069</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
-<td>3219</td></tr>
+<td>3220</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
-<td>3252</td></tr>
+<td>3253</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
-<td>3279</td></tr>
+<td>3280</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
-<td>3293</td></tr>
+<td>3294</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
-<td>3401</td></tr>
+<td>3402</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'ctor def rcurly' has incorrect indentation level 5, expected level should be 4.</td>
-<td>3423</td></tr>
+<td>3424</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'method def' child has incorrect indentation level 8, expected level should be 4.</td>
-<td>3495</td></tr>
+<td>3496</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>LeftCurly</td>
 <td>'{' at column 48 should have line break after.</td>
-<td>3516</td></tr>
+<td>3517</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>LeftCurly</td>
 <td>'{' at column 46 should have line break after.</td>
-<td>3517</td></tr>
+<td>3518</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 105).</td>
-<td>3564</td></tr>
+<td>3565</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'method def modifier' has incorrect indentation level 8, expected level should be one of the following: 10, 12.</td>
-<td>3584</td></tr>
+<td>3585</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'if' has incorrect indentation level 10, expected level should be one of the following: 12, 14.</td>
-<td>3586</td></tr>
+<td>3587</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'if' child has incorrect indentation level 12, expected level should be one of the following: 14, 16.</td>
-<td>3587</td></tr>
+<td>3588</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'if rcurly' has incorrect indentation level 10, expected level should be one of the following: 12, 14.</td>
-<td>3588</td></tr>
+<td>3589</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'method def rcurly' has incorrect indentation level 8, expected level should be one of the following: 10, 12.</td>
-<td>3589</td></tr>
+<td>3590</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'object def rcurly' has incorrect indentation level 6, expected level should be one of the following: 8, 10.</td>
-<td>3590</td></tr></table></div>
+<td>3591</td></tr></table></div>
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.regionserver.HRegionServerCommandLine.java">org/apache/hadoop/hbase/regionserver/HRegionServerCommandLine.java</h3>
 <table border="0" class="table table-striped">
@@ -79647,139 +79647,139 @@
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
-<td>2504</td></tr>
+<td>2506</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
-<td>2690</td></tr>
+<td>2692</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>MethodLength</td>
 <td>Method length is 157 lines (max allowed is 150).</td>
-<td>2859</td></tr>
+<td>2861</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'case' child has incorrect indentation level 8, expected level should be 10.</td>
-<td>2995</td></tr>
+<td>2997</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'if' has incorrect indentation level 10, expected level should be 12.</td>
-<td>2996</td></tr>
+<td>2998</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'if' child has incorrect indentation level 12, expected level should be 14.</td>
-<td>2997</td></tr>
+<td>2999</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'if rcurly' has incorrect indentation level 10, expected level should be 12.</td>
-<td>2998</td></tr>
+<td>3000</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'else' child has incorrect indentation level 12, expected level should be 14.</td>
-<td>2999</td></tr>
+<td>3001</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'else rcurly' has incorrect indentation level 10, expected level should be 12.</td>
-<td>3001</td></tr>
+<td>3003</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'block' child has incorrect indentation level 10, expected level should be 12.</td>
-<td>3002</td></tr>
+<td>3004</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'case' child has incorrect indentation level 8, expected level should be 10.</td>
-<td>3003</td></tr>
+<td>3005</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'if' has incorrect indentation level 10, expected level should be 12.</td>
-<td>3004</td></tr>
+<td>3006</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'if' child has incorrect indentation level 12, expected level should be 14.</td>
-<td>3005</td></tr>
+<td>3007</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'if rcurly' has incorrect indentation level 10, expected level should be 12.</td>
-<td>3006</td></tr>
+<td>3008</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'else' child has incorrect indentation level 12, expected level should be 14.</td>
-<td>3007</td></tr>
+<td>3009</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'else rcurly' has incorrect indentation level 10, expected level should be 12.</td>
-<td>3009</td></tr>
+<td>3011</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'block' child has incorrect indentation level 10, expected level should be 12.</td>
-<td>3010</td></tr>
+<td>3012</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'case' child has incorrect indentation level 8, expected level should be 10.</td>
-<td>3011</td></tr>
+<td>3013</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'block' child has incorrect indentation level 10, expected level should be 12.</td>
-<td>3012</td></tr>
+<td>3014</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>annotation</td>
 <td>MissingDeprecated</td>
 <td>Must include both @java.lang.Deprecated annotation and @deprecated Javadoc tag with description.</td>
-<td>3022</td></tr>
+<td>3024</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>MethodLength</td>
 <td>Method length is 185 lines (max allowed is 150).</td>
-<td>3175</td></tr>
+<td>3177</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
-<td>3369</td></tr>
+<td>3371</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>MethodLength</td>
 <td>Method length is 232 lines (max allowed is 150).</td>
-<td>3371</td></tr></table></div>
+<td>3373</td></tr></table></div>
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.regionserver.RSStatusServlet.java">org/apache/hadoop/hbase/regionserver/RSStatusServlet.java</h3>
 <table border="0" class="table table-striped">
@@ -117499,7 +117499,7 @@
                         <a href="https://www.apache.org/">The Apache Software Foundation</a>.
             All rights reserved.      
                     
-                  <li id="publishDate" class="pull-right">Last Published: 2018-10-18</li>
+                  <li id="publishDate" class="pull-right">Last Published: 2018-10-19</li>
             </p>
                 </div>
 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/3649682c/checkstyle.rss
----------------------------------------------------------------------
diff --git a/checkstyle.rss b/checkstyle.rss
index 82040af..46b579f 100644
--- a/checkstyle.rss
+++ b/checkstyle.rss
@@ -25,7 +25,7 @@ under the License.
     <language>en-us</language>
     <copyright>&#169;2007 - 2018 The Apache Software Foundation</copyright>
     <item>
-      <title>File: 3793,
+      <title>File: 3794,
              Errors: 15111,
              Warnings: 0,
              Infos: 0
@@ -14270,6 +14270,20 @@ under the License.
               </tr>
                           <tr>
                 <td>
+                  <a href="http://hbase.apache.org/checkstyle.html#org.apache.hadoop.hbase.master.TestMasterRepairMode.java">org/apache/hadoop/hbase/master/TestMasterRepairMode.java</a>
+                </td>
+                <td>
+                  0
+                </td>
+                <td>
+                  0
+                </td>
+                <td>
+                  0
+                </td>
+              </tr>
+                          <tr>
+                <td>
                   <a href="http://hbase.apache.org/checkstyle.html#org.apache.hadoop.hbase.regionserver.wal.WALClosedException.java">org/apache/hadoop/hbase/regionserver/wal/WALClosedException.java</a>
                 </td>
                 <td>

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

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

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/3649682c/dependency-convergence.html
----------------------------------------------------------------------
diff --git a/dependency-convergence.html b/dependency-convergence.html
index d8028b7..9c4a8f9 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="20181018" />
+    <meta name="Date-Revision-yyyymmdd" content="20181019" />
     <meta http-equiv="Content-Language" content="en" />
     <title>Apache HBase &#x2013; Reactor Dependency Convergence</title>
     <link rel="stylesheet" href="./css/apache-maven-fluido-1.4-HBase.min.css" />
@@ -889,7 +889,7 @@
                         <a href="https://www.apache.org/">The Apache Software Foundation</a>.
             All rights reserved.      
                     
-                  <li id="publishDate" class="pull-right">Last Published: 2018-10-18</li>
+                  <li id="publishDate" class="pull-right">Last Published: 2018-10-19</li>
             </p>
                 </div>
 

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

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/3649682c/dependency-management.html
----------------------------------------------------------------------
diff --git a/dependency-management.html b/dependency-management.html
index 895efda..daaa731 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="20181018" />
+    <meta name="Date-Revision-yyyymmdd" content="20181019" />
     <meta http-equiv="Content-Language" content="en" />
     <title>Apache HBase &#x2013; Project Dependency Management</title>
     <link rel="stylesheet" href="./css/apache-maven-fluido-1.4-HBase.min.css" />
@@ -1015,7 +1015,7 @@
                         <a href="https://www.apache.org/">The Apache Software Foundation</a>.
             All rights reserved.      
                     
-                  <li id="publishDate" class="pull-right">Last Published: 2018-10-18</li>
+                  <li id="publishDate" class="pull-right">Last Published: 2018-10-19</li>
             </p>
                 </div>
 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/3649682c/devapidocs/constant-values.html
----------------------------------------------------------------------
diff --git a/devapidocs/constant-values.html b/devapidocs/constant-values.html
index 2d806b1..d66575b 100644
--- a/devapidocs/constant-values.html
+++ b/devapidocs/constant-values.html
@@ -3824,7 +3824,7 @@
 <!--   -->
 </a><code>public&nbsp;static&nbsp;final&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a></code></td>
 <td><code><a href="org/apache/hadoop/hbase/Version.html#date">date</a></code></td>
-<td class="colLast"><code>"Thu Oct 18 14:45:14 UTC 2018"</code></td>
+<td class="colLast"><code>"Fri Oct 19 14:44:21 UTC 2018"</code></td>
 </tr>
 <tr class="rowColor">
 <td class="colFirst"><a name="org.apache.hadoop.hbase.Version.revision">
@@ -3838,7 +3838,7 @@
 <!--   -->
 </a><code>public&nbsp;static&nbsp;final&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a></code></td>
 <td><code><a href="org/apache/hadoop/hbase/Version.html#srcChecksum">srcChecksum</a></code></td>
-<td class="colLast"><code>"30708e3bbe5d7ba352acafec60c82407"</code></td>
+<td class="colLast"><code>"c51cc8d717ab9de60f9aa01fa53257c3"</code></td>
 </tr>
 <tr class="rowColor">
 <td class="colFirst"><a name="org.apache.hadoop.hbase.Version.url">
@@ -13212,6 +13212,13 @@
 <td class="colLast"><code>"hbase.master.wait.on.service.seconds"</code></td>
 </tr>
 <tr class="altColor">
+<td class="colFirst"><a name="org.apache.hadoop.hbase.master.HMaster.MAINTENANCE_MODE">
+<!--   -->
+</a><code>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/master/HMaster.html#MAINTENANCE_MODE">MAINTENANCE_MODE</a></code></td>
+<td class="colLast"><code>"hbase.master.maintenance_mode"</code></td>
+</tr>
+<tr class="rowColor">
 <td class="colFirst"><a name="org.apache.hadoop.hbase.master.HMaster.MASTER">
 <!--   -->
 </a><code>public&nbsp;static&nbsp;final&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a></code></td>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/3649682c/devapidocs/index-all.html
----------------------------------------------------------------------
diff --git a/devapidocs/index-all.html b/devapidocs/index-all.html
index 447aaaa..054fc48 100644
--- a/devapidocs/index-all.html
+++ b/devapidocs/index-all.html
@@ -64057,6 +64057,8 @@
 </dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/security/token/AuthenticationTokenSecretManager.LeaderElector.html#isMaster--">isMaster()</a></span> - Method in class org.apache.hadoop.hbase.security.token.<a href="org/apache/hadoop/hbase/security/token/AuthenticationTokenSecretManager.LeaderElector.html" title="class in org.apache.hadoop.hbase.security.token">AuthenticationTokenSecretManager.LeaderElector</a></dt>
 <dd>&nbsp;</dd>
+<dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/master/LoadBalancer.html#isMasterCanHostUserRegions-org.apache.hadoop.conf.Configuration-">isMasterCanHostUserRegions(Configuration)</a></span> - Static 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>&nbsp;</dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/client/Admin.html#isMasterInMaintenanceMode--">isMasterInMaintenanceMode()</a></span> - Method in interface org.apache.hadoop.hbase.client.<a href="org/apache/hadoop/hbase/client/Admin.html" title="interface in org.apache.hadoop.hbase.client">Admin</a></dt>
 <dd>
 <div class="block">Check whether Master is in maintenance mode.</div>
@@ -71271,7 +71273,11 @@
 <dd>&nbsp;</dd>
 <dt><span class="memberNameLink"><a href="org/apache/hbase/archetypes/exemplars/shaded_client/HelloHBase.html#main-java.lang.String:A-">main(String[])</a></span> - Static method in class org.apache.hbase.archetypes.exemplars.shaded_client.<a href="org/apache/hbase/archetypes/exemplars/shaded_client/HelloHBase.html" title="class in org.apache.hbase.archetypes.exemplars.shaded_client">HelloHBase</a></dt>
 <dd>&nbsp;</dd>
-<dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/master/HMaster.html#maintenanceModeTracker">maintenanceModeTracker</a></span> - Variable in class org.apache.hadoop.hbase.master.<a href="org/apache/hadoop/hbase/master/HMaster.html" title="class in org.apache.hadoop.hbase.master">HMaster</a></dt>
+<dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/master/HMaster.html#MAINTENANCE_MODE">MAINTENANCE_MODE</a></span> - Static variable in class org.apache.hadoop.hbase.master.<a href="org/apache/hadoop/hbase/master/HMaster.html" title="class in org.apache.hadoop.hbase.master">HMaster</a></dt>
+<dd>&nbsp;</dd>
+<dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.html#maintenanceMode">maintenanceMode</a></span> - Variable 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/HMaster.html#maintenanceMode">maintenanceMode</a></span> - Variable in class org.apache.hadoop.hbase.master.<a href="org/apache/hadoop/hbase/master/HMaster.html" title="class in org.apache.hadoop.hbase.master">HMaster</a></dt>
 <dd>&nbsp;</dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/regionserver/CompactionTool.CompactionMapper.html#major">major</a></span> - Variable in class org.apache.hadoop.hbase.regionserver.<a href="org/apache/hadoop/hbase/regionserver/CompactionTool.CompactionMapper.html" title="class in org.apache.hadoop.hbase.regionserver">CompactionTool.CompactionMapper</a></dt>
 <dd>&nbsp;</dd>
@@ -113507,8 +113513,6 @@ service.</div>
 </dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/quotas/QuotaObserverChore.html#tableSnapshotStore">tableSnapshotStore</a></span> - Variable in class org.apache.hadoop.hbase.quotas.<a href="org/apache/hadoop/hbase/quotas/QuotaObserverChore.html" title="class in org.apache.hadoop.hbase.quotas">QuotaObserverChore</a></dt>
 <dd>&nbsp;</dd>
-<dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.html#tablesOnMaster">tablesOnMaster</a></span> - Variable 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/ZNodeClearer.html#tablesOnMaster-org.apache.hadoop.conf.Configuration-">tablesOnMaster(Configuration)</a></span> - Static method in class org.apache.hadoop.hbase.<a href="org/apache/hadoop/hbase/ZNodeClearer.html" title="class in org.apache.hadoop.hbase">ZNodeClearer</a></dt>
 <dd>&nbsp;</dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/regionserver/MetricsTable.html#tableSourceAgg">tableSourceAgg</a></span> - Variable in class org.apache.hadoop.hbase.regionserver.<a href="org/apache/hadoop/hbase/regionserver/MetricsTable.html" title="class in org.apache.hadoop.hbase.regionserver">MetricsTable</a></dt>


[46/46] hbase-site git commit: Published site at 05d22ed960204183fbd9bd16f1dbca6410ccde76.

Posted by gi...@apache.org.
Published site at 05d22ed960204183fbd9bd16f1dbca6410ccde76.


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

Branch: refs/heads/asf-site
Commit: 3649682c3a66364761c84da6e58095ec0fc00f49
Parents: 1560578
Author: jenkins <bu...@apache.org>
Authored: Fri Oct 19 14:52:51 2018 +0000
Committer: jenkins <bu...@apache.org>
Committed: Fri Oct 19 14:52:51 2018 +0000

----------------------------------------------------------------------
 acid-semantics.html                             |     4 +-
 apache_hbase_reference_guide.pdf                | 25947 +++++++++--------
 book.html                                       |    24 +-
 bulk-loads.html                                 |     4 +-
 checkstyle-aggregate.html                       |   550 +-
 checkstyle.rss                                  |    16 +-
 coc.html                                        |     4 +-
 dependencies.html                               |     4 +-
 dependency-convergence.html                     |     4 +-
 dependency-info.html                            |     4 +-
 dependency-management.html                      |     4 +-
 devapidocs/constant-values.html                 |    11 +-
 devapidocs/index-all.html                       |    10 +-
 .../hadoop/hbase/backup/package-tree.html       |     4 +-
 .../hadoop/hbase/client/package-tree.html       |    24 +-
 .../hadoop/hbase/coprocessor/package-tree.html  |     2 +-
 .../hbase/favored/FavoredNodeLoadBalancer.html  |     4 +-
 .../hadoop/hbase/filter/package-tree.html       |    10 +-
 .../hadoop/hbase/io/hfile/package-tree.html     |     8 +-
 .../apache/hadoop/hbase/ipc/package-tree.html   |     2 +-
 .../hadoop/hbase/mapreduce/package-tree.html    |     4 +-
 .../master/HMaster.InitializationMonitor.html   |    20 +-
 .../master/HMaster.MasterStoppedException.html  |     4 +-
 .../hbase/master/HMaster.RedirectServlet.html   |    12 +-
 .../master/HMaster.TableDescriptorGetter.html   |     4 +-
 .../org/apache/hadoop/hbase/master/HMaster.html |   608 +-
 .../master/HMasterCommandLine.LocalHMaster.html |     2 +-
 .../hadoop/hbase/master/LoadBalancer.html       |    75 +-
 .../hadoop/hbase/master/MasterRpcServices.html  |    88 +-
 .../hadoop/hbase/master/MasterServices.html     |     3 +-
 .../ServerManager.FlushedSequenceIdFlusher.html |     6 +-
 .../hadoop/hbase/master/ServerManager.html      |    46 +-
 .../hbase/master/balancer/BaseLoadBalancer.html |    96 +-
 .../balancer/FavoredStochasticBalancer.html     |     4 +-
 .../master/balancer/SimpleLoadBalancer.html     |     4 +-
 .../master/balancer/StochasticLoadBalancer.html |     4 +-
 .../hadoop/hbase/master/package-tree.html       |     6 +-
 .../hbase/master/procedure/package-tree.html    |     4 +-
 .../org/apache/hadoop/hbase/package-tree.html   |    18 +-
 .../hbase/procedure2/class-use/Procedure.html   |    13 +
 .../hadoop/hbase/procedure2/package-tree.html   |     6 +-
 .../hadoop/hbase/quotas/package-tree.html       |     4 +-
 .../HRegionServer.CompactionChecker.html        |    14 +-
 .../HRegionServer.MovedRegionInfo.html          |    16 +-
 .../HRegionServer.MovedRegionsCleaner.html      |    16 +-
 .../HRegionServer.PeriodicMemStoreFlusher.html  |    14 +-
 .../hbase/regionserver/HRegionServer.html       |   302 +-
 .../hbase/regionserver/RSRpcServices.html       |    58 +-
 .../hadoop/hbase/regionserver/package-tree.html |    20 +-
 .../regionserver/querymatcher/package-tree.html |     2 +-
 .../hbase/regionserver/wal/package-tree.html    |     2 +-
 .../hadoop/hbase/replication/package-tree.html  |     2 +-
 .../hadoop/hbase/rest/model/package-tree.html   |     2 +-
 .../hbase/rsgroup/RSGroupBasedLoadBalancer.html |     2 +-
 .../hbase/rsgroup/RSGroupableBalancer.html      |     2 +-
 .../hbase/security/access/package-tree.html     |     2 +-
 .../hadoop/hbase/thrift/package-tree.html       |     2 +-
 .../org/apache/hadoop/hbase/util/IdLock.html    |     8 +-
 .../apache/hadoop/hbase/util/package-tree.html  |     8 +-
 .../apache/hadoop/hbase/wal/package-tree.html   |     2 +-
 .../zookeeper/MasterMaintenanceModeTracker.html |    26 +-
 .../class-use/MasterMaintenanceModeTracker.html |    42 +-
 .../hadoop/hbase/zookeeper/package-use.html     |    13 +-
 .../org/apache/hadoop/hbase/Version.html        |     4 +-
 .../master/HMaster.InitializationMonitor.html   |  7334 ++---
 .../master/HMaster.MasterStoppedException.html  |  7334 ++---
 .../hbase/master/HMaster.RedirectServlet.html   |  7334 ++---
 .../master/HMaster.TableDescriptorGetter.html   |  7334 ++---
 .../org/apache/hadoop/hbase/master/HMaster.html |  7334 ++---
 .../hadoop/hbase/master/LoadBalancer.html       |   245 +-
 .../MasterRpcServices.BalanceSwitchMode.html    |  1840 +-
 .../hadoop/hbase/master/MasterRpcServices.html  |  1840 +-
 .../hadoop/hbase/master/MasterServices.html     |     2 +-
 .../ServerManager.FlushedSequenceIdFlusher.html |   835 +-
 .../hadoop/hbase/master/ServerManager.html      |   835 +-
 .../BaseLoadBalancer.Cluster.Action.Type.html   |  1241 +-
 .../BaseLoadBalancer.Cluster.Action.html        |  1241 +-
 ...LoadBalancer.Cluster.AssignRegionAction.html |  1241 +-
 .../BaseLoadBalancer.Cluster.LocalityType.html  |  1241 +-
 ...seLoadBalancer.Cluster.MoveRegionAction.html |  1241 +-
 ...eLoadBalancer.Cluster.SwapRegionsAction.html |  1241 +-
 .../balancer/BaseLoadBalancer.Cluster.html      |  1241 +-
 .../BaseLoadBalancer.DefaultRackManager.html    |  1241 +-
 .../hbase/master/balancer/BaseLoadBalancer.html |  1241 +-
 .../HRegionServer.CompactionChecker.html        |  5695 ++--
 .../HRegionServer.MovedRegionInfo.html          |  5695 ++--
 .../HRegionServer.MovedRegionsCleaner.html      |  5695 ++--
 .../HRegionServer.PeriodicMemStoreFlusher.html  |  5695 ++--
 .../hbase/regionserver/HRegionServer.html       |  5695 ++--
 .../regionserver/RSRpcServices.LogDelegate.html |  2560 +-
 ...SRpcServices.RegionScannerCloseCallBack.html |  2560 +-
 .../RSRpcServices.RegionScannerHolder.html      |  2560 +-
 ...pcServices.RegionScannerShippedCallBack.html |  2560 +-
 ...RpcServices.RegionScannersCloseCallBack.html |  2560 +-
 .../RSRpcServices.ScannerListener.html          |  2560 +-
 .../hbase/regionserver/RSRpcServices.html       |  2560 +-
 .../apache/hadoop/hbase/util/IdLock.Entry.html  |   233 +-
 .../org/apache/hadoop/hbase/util/IdLock.html    |   233 +-
 .../zookeeper/MasterMaintenanceModeTracker.html |   110 +-
 downloads.html                                  |     4 +-
 export_control.html                             |     4 +-
 index.html                                      |     4 +-
 integration.html                                |     4 +-
 issue-tracking.html                             |     4 +-
 license.html                                    |     4 +-
 mail-lists.html                                 |     4 +-
 metrics.html                                    |     4 +-
 old_news.html                                   |     4 +-
 plugin-management.html                          |     4 +-
 plugins.html                                    |     4 +-
 poweredbyhbase.html                             |     4 +-
 project-info.html                               |     4 +-
 project-reports.html                            |     4 +-
 project-summary.html                            |     4 +-
 pseudo-distributed.html                         |     4 +-
 replication.html                                |     4 +-
 resources.html                                  |     4 +-
 source-repository.html                          |     4 +-
 sponsors.html                                   |     4 +-
 supportingprojects.html                         |     4 +-
 team-list.html                                  |     4 +-
 testdevapidocs/allclasses-frame.html            |     1 +
 testdevapidocs/allclasses-noframe.html          |     1 +
 testdevapidocs/index-all.html                   |    24 +
 .../hbase/TestZooKeeper.MockLoadBalancer.html   |     4 +-
 .../hadoop/hbase/backup/package-tree.html       |     2 +-
 .../hbase/class-use/HBaseClassTestRule.html     |    22 +-
 .../hbase/class-use/HBaseTestingUtility.html    |    48 +-
 .../hadoop/hbase/io/hfile/package-tree.html     |     2 +-
 .../TestCloseAnOpeningRegion.MockHMaster.html   |     2 +-
 .../master/TestGetReplicationLoad.MyMaster.html |     2 +-
 .../apache/hadoop/hbase/master/TestMaster.html  |    24 +-
 .../master/TestMasterMetrics.MyMaster.html      |     2 +-
 .../hbase/master/TestMasterQosFunction.html     |     4 +-
 .../hbase/master/TestMasterRepairMode.html      |   432 +
 .../TestMasterRestartAfterDisablingTable.html   |     4 +-
 .../TestShutdownBackupMaster.MockHMaster.html   |     2 +-
 .../LoadOnlyFavoredStochasticBalancer.html      |     4 +-
 .../TestBaseLoadBalancer.MockBalancer.html      |     4 +-
 .../master/class-use/TestMasterRepairMode.html  |   125 +
 .../hadoop/hbase/master/package-frame.html      |     1 +
 .../hadoop/hbase/master/package-summary.html    |    56 +-
 .../hadoop/hbase/master/package-tree.html       |     1 +
 .../org/apache/hadoop/hbase/package-tree.html   |     8 +-
 .../hadoop/hbase/procedure/package-tree.html    |     8 +-
 .../hadoop/hbase/procedure2/package-tree.html   |     4 +-
 .../hadoop/hbase/regionserver/package-tree.html |     4 +-
 .../apache/hadoop/hbase/test/package-tree.html  |     4 +-
 .../apache/hadoop/hbase/wal/package-tree.html   |     2 +-
 testdevapidocs/overview-tree.html               |     1 +
 .../apache/hadoop/hbase/master/TestMaster.html  |   395 +-
 .../hbase/master/TestMasterRepairMode.html      |   213 +
 152 files changed, 65735 insertions(+), 64396 deletions(-)
----------------------------------------------------------------------


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


[02/46] hbase-site git commit: Published site at 05d22ed960204183fbd9bd16f1dbca6410ccde76.

Posted by gi...@apache.org.
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/3649682c/testdevapidocs/org/apache/hadoop/hbase/master/class-use/TestMasterRepairMode.html
----------------------------------------------------------------------
diff --git a/testdevapidocs/org/apache/hadoop/hbase/master/class-use/TestMasterRepairMode.html b/testdevapidocs/org/apache/hadoop/hbase/master/class-use/TestMasterRepairMode.html
new file mode 100644
index 0000000..bb95426
--- /dev/null
+++ b/testdevapidocs/org/apache/hadoop/hbase/master/class-use/TestMasterRepairMode.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.TestMasterRepairMode (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.TestMasterRepairMode (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/TestMasterRepairMode.html" title="class in org.apache.hadoop.hbase.master">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/class-use/TestMasterRepairMode.html" target="_top">Frames</a></li>
+<li><a href="TestMasterRepairMode.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.TestMasterRepairMode" class="title">Uses of Class<br>org.apache.hadoop.hbase.master.TestMasterRepairMode</h2>
+</div>
+<div class="classUseContainer">No usage of org.apache.hadoop.hbase.master.TestMasterRepairMode</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/TestMasterRepairMode.html" title="class in org.apache.hadoop.hbase.master">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/class-use/TestMasterRepairMode.html" target="_top">Frames</a></li>
+<li><a href="TestMasterRepairMode.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/3649682c/testdevapidocs/org/apache/hadoop/hbase/master/package-frame.html
----------------------------------------------------------------------
diff --git a/testdevapidocs/org/apache/hadoop/hbase/master/package-frame.html b/testdevapidocs/org/apache/hadoop/hbase/master/package-frame.html
index 388884c..437b713 100644
--- a/testdevapidocs/org/apache/hadoop/hbase/master/package-frame.html
+++ b/testdevapidocs/org/apache/hadoop/hbase/master/package-frame.html
@@ -58,6 +58,7 @@
 <li><a href="TestMasterNoCluster.html" title="class in org.apache.hadoop.hbase.master" target="classFrame">TestMasterNoCluster</a></li>
 <li><a href="TestMasterOperationsForRegionReplicas.html" title="class in org.apache.hadoop.hbase.master" target="classFrame">TestMasterOperationsForRegionReplicas</a></li>
 <li><a href="TestMasterQosFunction.html" title="class in org.apache.hadoop.hbase.master" target="classFrame">TestMasterQosFunction</a></li>
+<li><a href="TestMasterRepairMode.html" title="class in org.apache.hadoop.hbase.master" target="classFrame">TestMasterRepairMode</a></li>
 <li><a href="TestMasterRestartAfterDisablingTable.html" title="class in org.apache.hadoop.hbase.master" target="classFrame">TestMasterRestartAfterDisablingTable</a></li>
 <li><a href="TestMasterShutdown.html" title="class in org.apache.hadoop.hbase.master" target="classFrame">TestMasterShutdown</a></li>
 <li><a href="TestMasterStatusServlet.html" title="class in org.apache.hadoop.hbase.master" target="classFrame">TestMasterStatusServlet</a></li>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/3649682c/testdevapidocs/org/apache/hadoop/hbase/master/package-summary.html
----------------------------------------------------------------------
diff --git a/testdevapidocs/org/apache/hadoop/hbase/master/package-summary.html b/testdevapidocs/org/apache/hadoop/hbase/master/package-summary.html
index f1f4d8f..ee288d0 100644
--- a/testdevapidocs/org/apache/hadoop/hbase/master/package-summary.html
+++ b/testdevapidocs/org/apache/hadoop/hbase/master/package-summary.html
@@ -283,135 +283,139 @@
 <td class="colLast">&nbsp;</td>
 </tr>
 <tr class="altColor">
-<td class="colFirst"><a href="../../../../../org/apache/hadoop/hbase/master/TestMasterRestartAfterDisablingTable.html" title="class in org.apache.hadoop.hbase.master">TestMasterRestartAfterDisablingTable</a></td>
+<td class="colFirst"><a href="../../../../../org/apache/hadoop/hbase/master/TestMasterRepairMode.html" title="class in org.apache.hadoop.hbase.master">TestMasterRepairMode</a></td>
 <td class="colLast">&nbsp;</td>
 </tr>
 <tr class="rowColor">
-<td class="colFirst"><a href="../../../../../org/apache/hadoop/hbase/master/TestMasterShutdown.html" title="class in org.apache.hadoop.hbase.master">TestMasterShutdown</a></td>
+<td class="colFirst"><a href="../../../../../org/apache/hadoop/hbase/master/TestMasterRestartAfterDisablingTable.html" title="class in org.apache.hadoop.hbase.master">TestMasterRestartAfterDisablingTable</a></td>
 <td class="colLast">&nbsp;</td>
 </tr>
 <tr class="altColor">
+<td class="colFirst"><a href="../../../../../org/apache/hadoop/hbase/master/TestMasterShutdown.html" title="class in org.apache.hadoop.hbase.master">TestMasterShutdown</a></td>
+<td class="colLast">&nbsp;</td>
+</tr>
+<tr class="rowColor">
 <td class="colFirst"><a href="../../../../../org/apache/hadoop/hbase/master/TestMasterStatusServlet.html" title="class in org.apache.hadoop.hbase.master">TestMasterStatusServlet</a></td>
 <td class="colLast">
 <div class="block">Tests for the master status page and its template.</div>
 </td>
 </tr>
-<tr class="rowColor">
+<tr class="altColor">
 <td class="colFirst"><a href="../../../../../org/apache/hadoop/hbase/master/TestMasterTransitions.html" title="class in org.apache.hadoop.hbase.master">TestMasterTransitions</a></td>
 <td class="colLast">
 <div class="block">Test transitions of state across the master.</div>
 </td>
 </tr>
-<tr class="altColor">
+<tr class="rowColor">
 <td class="colFirst"><a href="../../../../../org/apache/hadoop/hbase/master/TestMergeTableRegionsWhileRSCrash.html" title="class in org.apache.hadoop.hbase.master">TestMergeTableRegionsWhileRSCrash</a></td>
 <td class="colLast">&nbsp;</td>
 </tr>
-<tr class="rowColor">
+<tr class="altColor">
 <td class="colFirst"><a href="../../../../../org/apache/hadoop/hbase/master/TestMetaAssignmentWithStopMaster.html" title="class in org.apache.hadoop.hbase.master">TestMetaAssignmentWithStopMaster</a></td>
 <td class="colLast">&nbsp;</td>
 </tr>
-<tr class="altColor">
+<tr class="rowColor">
 <td class="colFirst"><a href="../../../../../org/apache/hadoop/hbase/master/TestMetaShutdownHandler.html" title="class in org.apache.hadoop.hbase.master">TestMetaShutdownHandler</a></td>
 <td class="colLast">
 <div class="block">Tests handling of meta-carrying region server failover.</div>
 </td>
 </tr>
-<tr class="rowColor">
+<tr class="altColor">
 <td class="colFirst"><a href="../../../../../org/apache/hadoop/hbase/master/TestMetaShutdownHandler.MyRegionServer.html" title="class in org.apache.hadoop.hbase.master">TestMetaShutdownHandler.MyRegionServer</a></td>
 <td class="colLast">&nbsp;</td>
 </tr>
-<tr class="altColor">
+<tr class="rowColor">
 <td class="colFirst"><a href="../../../../../org/apache/hadoop/hbase/master/TestMetricsMasterProcSourceImpl.html" title="class in org.apache.hadoop.hbase.master">TestMetricsMasterProcSourceImpl</a></td>
 <td class="colLast">
 <div class="block">Test for MetricsMasterProcSourceImpl</div>
 </td>
 </tr>
-<tr class="rowColor">
+<tr class="altColor">
 <td class="colFirst"><a href="../../../../../org/apache/hadoop/hbase/master/TestMetricsMasterSourceFactory.html" title="class in org.apache.hadoop.hbase.master">TestMetricsMasterSourceFactory</a></td>
 <td class="colLast">
 <div class="block">Test for the CompatibilitySingletonFactory and building MetricsMasterSource</div>
 </td>
 </tr>
-<tr class="altColor">
+<tr class="rowColor">
 <td class="colFirst"><a href="../../../../../org/apache/hadoop/hbase/master/TestMetricsMasterSourceImpl.html" title="class in org.apache.hadoop.hbase.master">TestMetricsMasterSourceImpl</a></td>
 <td class="colLast">
 <div class="block">Test for MetricsMasterSourceImpl</div>
 </td>
 </tr>
-<tr class="rowColor">
+<tr class="altColor">
 <td class="colFirst"><a href="../../../../../org/apache/hadoop/hbase/master/TestMirroringTableStateManager.html" title="class in org.apache.hadoop.hbase.master">TestMirroringTableStateManager</a></td>
 <td class="colLast">
 <div class="block">Tests that table state is mirrored out to zookeeper for hbase-1.x clients.</div>
 </td>
 </tr>
-<tr class="altColor">
+<tr class="rowColor">
 <td class="colFirst"><a href="../../../../../org/apache/hadoop/hbase/master/TestRegionPlacement.html" title="class in org.apache.hadoop.hbase.master">TestRegionPlacement</a></td>
 <td class="colLast">&nbsp;</td>
 </tr>
-<tr class="rowColor">
+<tr class="altColor">
 <td class="colFirst"><a href="../../../../../org/apache/hadoop/hbase/master/TestRegionPlacement2.html" title="class in org.apache.hadoop.hbase.master">TestRegionPlacement2</a></td>
 <td class="colLast">&nbsp;</td>
 </tr>
-<tr class="altColor">
+<tr class="rowColor">
 <td class="colFirst"><a href="../../../../../org/apache/hadoop/hbase/master/TestRegionPlan.html" title="class in org.apache.hadoop.hbase.master">TestRegionPlan</a></td>
 <td class="colLast">&nbsp;</td>
 </tr>
-<tr class="rowColor">
+<tr class="altColor">
 <td class="colFirst"><a href="../../../../../org/apache/hadoop/hbase/master/TestRegionState.html" title="class in org.apache.hadoop.hbase.master">TestRegionState</a></td>
 <td class="colLast">&nbsp;</td>
 </tr>
-<tr class="altColor">
+<tr class="rowColor">
 <td class="colFirst"><a href="../../../../../org/apache/hadoop/hbase/master/TestRestartCluster.html" title="class in org.apache.hadoop.hbase.master">TestRestartCluster</a></td>
 <td class="colLast">&nbsp;</td>
 </tr>
-<tr class="rowColor">
+<tr class="altColor">
 <td class="colFirst"><a href="../../../../../org/apache/hadoop/hbase/master/TestRollingRestart.html" title="class in org.apache.hadoop.hbase.master">TestRollingRestart</a></td>
 <td class="colLast">
 <div class="block">Tests the restarting of everything as done during rolling restarts.</div>
 </td>
 </tr>
-<tr class="altColor">
+<tr class="rowColor">
 <td class="colFirst"><a href="../../../../../org/apache/hadoop/hbase/master/TestServerCrashProcedureCarryingMetaStuck.html" title="class in org.apache.hadoop.hbase.master">TestServerCrashProcedureCarryingMetaStuck</a></td>
 <td class="colLast">&nbsp;</td>
 </tr>
-<tr class="rowColor">
+<tr class="altColor">
 <td class="colFirst"><a href="../../../../../org/apache/hadoop/hbase/master/TestServerCrashProcedureStuck.html" title="class in org.apache.hadoop.hbase.master">TestServerCrashProcedureStuck</a></td>
 <td class="colLast">
 <div class="block">Testcase for HBASE-20634</div>
 </td>
 </tr>
-<tr class="altColor">
+<tr class="rowColor">
 <td class="colFirst"><a href="../../../../../org/apache/hadoop/hbase/master/TestShutdownBackupMaster.html" title="class in org.apache.hadoop.hbase.master">TestShutdownBackupMaster</a></td>
 <td class="colLast">
 <div class="block">Test to confirm that we will not hang when stop a backup master which is trying to become the
  active master.</div>
 </td>
 </tr>
-<tr class="rowColor">
+<tr class="altColor">
 <td class="colFirst"><a href="../../../../../org/apache/hadoop/hbase/master/TestShutdownBackupMaster.MockHMaster.html" title="class in org.apache.hadoop.hbase.master">TestShutdownBackupMaster.MockHMaster</a></td>
 <td class="colLast">&nbsp;</td>
 </tr>
-<tr class="altColor">
+<tr class="rowColor">
 <td class="colFirst"><a href="../../../../../org/apache/hadoop/hbase/master/TestShutdownWithNoRegionServer.html" title="class in org.apache.hadoop.hbase.master">TestShutdownWithNoRegionServer</a></td>
 <td class="colLast">
 <div class="block">Testcase to confirm that we will not hang when shutdown a cluster with no live region servers.</div>
 </td>
 </tr>
-<tr class="rowColor">
+<tr class="altColor">
 <td class="colFirst"><a href="../../../../../org/apache/hadoop/hbase/master/TestSplitLogManager.html" title="class in org.apache.hadoop.hbase.master">TestSplitLogManager</a></td>
 <td class="colLast">&nbsp;</td>
 </tr>
-<tr class="rowColor">
+<tr class="altColor">
 <td class="colFirst"><a href="../../../../../org/apache/hadoop/hbase/master/TestSplitRegionWhileRSCrash.html" title="class in org.apache.hadoop.hbase.master">TestSplitRegionWhileRSCrash</a></td>
 <td class="colLast">&nbsp;</td>
 </tr>
-<tr class="altColor">
+<tr class="rowColor">
 <td class="colFirst"><a href="../../../../../org/apache/hadoop/hbase/master/TestTableStateManager.html" title="class in org.apache.hadoop.hbase.master">TestTableStateManager</a></td>
 <td class="colLast">
 <div class="block">Tests the default table lock manager</div>
 </td>
 </tr>
-<tr class="rowColor">
+<tr class="altColor">
 <td class="colFirst"><a href="../../../../../org/apache/hadoop/hbase/master/TestWarmupRegion.html" title="class in org.apache.hadoop.hbase.master">TestWarmupRegion</a></td>
 <td class="colLast">
 <div class="block">Run tests that use the HBase clients; <code>HTable</code>.</div>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/3649682c/testdevapidocs/org/apache/hadoop/hbase/master/package-tree.html
----------------------------------------------------------------------
diff --git a/testdevapidocs/org/apache/hadoop/hbase/master/package-tree.html b/testdevapidocs/org/apache/hadoop/hbase/master/package-tree.html
index 46e073a..bf9125b 100644
--- a/testdevapidocs/org/apache/hadoop/hbase/master/package-tree.html
+++ b/testdevapidocs/org/apache/hadoop/hbase/master/package-tree.html
@@ -166,6 +166,7 @@
 <li type="circle">org.apache.hadoop.hbase.master.<a href="../../../../../org/apache/hadoop/hbase/master/TestMasterMetricsWrapper.html" title="class in org.apache.hadoop.hbase.master"><span class="typeNameLink">TestMasterMetricsWrapper</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.master.<a href="../../../../../org/apache/hadoop/hbase/master/TestMasterNoCluster.html" title="class in org.apache.hadoop.hbase.master"><span class="typeNameLink">TestMasterNoCluster</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.master.<a href="../../../../../org/apache/hadoop/hbase/master/TestMasterOperationsForRegionReplicas.html" title="class in org.apache.hadoop.hbase.master"><span class="typeNameLink">TestMasterOperationsForRegionReplicas</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.master.<a href="../../../../../org/apache/hadoop/hbase/master/TestMasterRepairMode.html" title="class in org.apache.hadoop.hbase.master"><span class="typeNameLink">TestMasterRepairMode</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.master.<a href="../../../../../org/apache/hadoop/hbase/master/TestMasterRestartAfterDisablingTable.html" title="class in org.apache.hadoop.hbase.master"><span class="typeNameLink">TestMasterRestartAfterDisablingTable</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.master.<a href="../../../../../org/apache/hadoop/hbase/master/TestMasterShutdown.html" title="class in org.apache.hadoop.hbase.master"><span class="typeNameLink">TestMasterShutdown</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.master.<a href="../../../../../org/apache/hadoop/hbase/master/TestMasterStatusServlet.html" title="class in org.apache.hadoop.hbase.master"><span class="typeNameLink">TestMasterStatusServlet</span></a></li>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/3649682c/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 d1a161c..576f2d6 100644
--- a/testdevapidocs/org/apache/hadoop/hbase/package-tree.html
+++ b/testdevapidocs/org/apache/hadoop/hbase/package-tree.html
@@ -579,14 +579,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.<a href="../../../../org/apache/hadoop/hbase/HBaseClusterManager.CommandProvider.Operation.html" title="enum in org.apache.hadoop.hbase"><span class="typeNameLink">HBaseClusterManager.CommandProvider.Operation</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.<a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.Counter.html" title="enum in org.apache.hadoop.hbase"><span class="typeNameLink">PerformanceEvaluation.Counter</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.<a href="../../../../org/apache/hadoop/hbase/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/ScanPerformanceEvaluation.ScanCounter.html" title="enum in org.apache.hadoop.hbase"><span class="typeNameLink">ScanPerformanceEvaluation.ScanCounter</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.<a href="../../../../org/apache/hadoop/hbase/RESTApiClusterManager.RoleCommand.html" title="enum in org.apache.hadoop.hbase"><span class="typeNameLink">RESTApiClusterManager.RoleCommand</span></a></li>
-<li type="circle">org.apache.hadoop.hbase.<a href="../../../../org/apache/hadoop/hbase/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/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/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/IntegrationTestRegionReplicaPerf.Stat.html" title="enum in org.apache.hadoop.hbase"><span class="typeNameLink">IntegrationTestRegionReplicaPerf.Stat</span></a></li>
-<li type="circle">org.apache.hadoop.hbase.<a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.Counter.html" title="enum in org.apache.hadoop.hbase"><span class="typeNameLink">PerformanceEvaluation.Counter</span></a></li>
-<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>
 </ul>
 </li>

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

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/3649682c/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 0e49281..637c135 100644
--- a/testdevapidocs/org/apache/hadoop/hbase/regionserver/package-tree.html
+++ b/testdevapidocs/org/apache/hadoop/hbase/regionserver/package-tree.html
@@ -672,11 +672,11 @@
 <ul>
 <li type="circle">java.lang.<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Enum.html?is-external=true" title="class or interface in java.lang"><span class="typeNameLink">Enum</span></a>&lt;E&gt; (implements java.lang.<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Comparable.html?is-external=true" title="class or interface in java.lang">Comparable</a>&lt;T&gt;, java.io.<a href="https://docs.oracle.com/javase/8/docs/api/java/io/Serializable.html?is-external=true" title="class or interface in java.io">Serializable</a>)
 <ul>
-<li type="circle">org.apache.hadoop.hbase.regionserver.<a href="../../../../../org/apache/hadoop/hbase/regionserver/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/TestCacheOnWriteInSchema.CacheOnWriteType.html" title="enum in org.apache.hadoop.hbase.regionserver"><span class="typeNameLink">TestCacheOnWriteInSchema.CacheOnWriteType</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.regionserver.<a href="../../../../../org/apache/hadoop/hbase/regionserver/TestRegionServerReadRequestMetrics.Metric.html" title="enum in org.apache.hadoop.hbase.regionserver"><span class="typeNameLink">TestRegionServerReadRequestMetrics.Metric</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.regionserver.<a href="../../../../../org/apache/hadoop/hbase/regionserver/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/DataBlockEncodingTool.Manipulation.html" title="enum in org.apache.hadoop.hbase.regionserver"><span class="typeNameLink">DataBlockEncodingTool.Manipulation</span></a></li>
-<li type="circle">org.apache.hadoop.hbase.regionserver.<a href="../../../../../org/apache/hadoop/hbase/regionserver/TestRegionServerReadRequestMetrics.Metric.html" title="enum in org.apache.hadoop.hbase.regionserver"><span class="typeNameLink">TestRegionServerReadRequestMetrics.Metric</span></a></li>
 </ul>
 </li>
 </ul>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/3649682c/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 db9b7a6..1499365 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/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/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.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>
 </ul>
 </li>
 </ul>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/3649682c/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 fa9e769..9e0700e 100644
--- a/testdevapidocs/org/apache/hadoop/hbase/wal/package-tree.html
+++ b/testdevapidocs/org/apache/hadoop/hbase/wal/package-tree.html
@@ -142,8 +142,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.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>
+<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>
 </ul>
 </li>
 </ul>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/3649682c/testdevapidocs/overview-tree.html
----------------------------------------------------------------------
diff --git a/testdevapidocs/overview-tree.html b/testdevapidocs/overview-tree.html
index af84415..95eb6af 100644
--- a/testdevapidocs/overview-tree.html
+++ b/testdevapidocs/overview-tree.html
@@ -3092,6 +3092,7 @@
 <li type="circle">org.apache.hadoop.hbase.quotas.<a href="org/apache/hadoop/hbase/quotas/TestMasterQuotaManager.html" title="class in org.apache.hadoop.hbase.quotas"><span class="typeNameLink">TestMasterQuotaManager</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.quotas.<a href="org/apache/hadoop/hbase/quotas/TestMasterQuotasObserver.html" title="class in org.apache.hadoop.hbase.quotas"><span class="typeNameLink">TestMasterQuotasObserver</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.quotas.<a href="org/apache/hadoop/hbase/quotas/TestMasterQuotasObserverWithMocks.html" title="class in org.apache.hadoop.hbase.quotas"><span class="typeNameLink">TestMasterQuotasObserverWithMocks</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.master.<a href="org/apache/hadoop/hbase/master/TestMasterRepairMode.html" title="class in org.apache.hadoop.hbase.master"><span class="typeNameLink">TestMasterRepairMode</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.replication.<a href="org/apache/hadoop/hbase/replication/TestMasterReplication.html" title="class in org.apache.hadoop.hbase.replication"><span class="typeNameLink">TestMasterReplication</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.replication.<a href="org/apache/hadoop/hbase/replication/TestMasterReplication.CoprocessorCounter.html" title="class in org.apache.hadoop.hbase.replication"><span class="typeNameLink">TestMasterReplication.CoprocessorCounter</span></a> (implements org.apache.hadoop.hbase.coprocessor.RegionCoprocessor, org.apache.hadoop.hbase.coprocessor.RegionObserver)</li>
 <li type="circle">org.apache.hadoop.hbase.master.<a href="org/apache/hadoop/hbase/master/TestMasterRestartAfterDisablingTable.html" title="class in org.apache.hadoop.hbase.master"><span class="typeNameLink">TestMasterRestartAfterDisablingTable</span></a></li>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/3649682c/testdevapidocs/src-html/org/apache/hadoop/hbase/master/TestMaster.html
----------------------------------------------------------------------
diff --git a/testdevapidocs/src-html/org/apache/hadoop/hbase/master/TestMaster.html b/testdevapidocs/src-html/org/apache/hadoop/hbase/master/TestMaster.html
index 0b93098..d5e0461 100644
--- a/testdevapidocs/src-html/org/apache/hadoop/hbase/master/TestMaster.html
+++ b/testdevapidocs/src-html/org/apache/hadoop/hbase/master/TestMaster.html
@@ -82,204 +82,203 @@
 <span class="sourceLineNo">074</span><a name="line.74"></a>
 <span class="sourceLineNo">075</span>  private static final HBaseTestingUtility TEST_UTIL = new HBaseTestingUtility();<a name="line.75"></a>
 <span class="sourceLineNo">076</span>  private static final Logger LOG = LoggerFactory.getLogger(TestMaster.class);<a name="line.76"></a>
-<span class="sourceLineNo">077</span>  private static final TableName TABLENAME =<a name="line.77"></a>
-<span class="sourceLineNo">078</span>      TableName.valueOf("TestMaster");<a name="line.78"></a>
-<span class="sourceLineNo">079</span>  private static final byte[] FAMILYNAME = Bytes.toBytes("fam");<a name="line.79"></a>
-<span class="sourceLineNo">080</span>  private static Admin admin;<a name="line.80"></a>
-<span class="sourceLineNo">081</span><a name="line.81"></a>
-<span class="sourceLineNo">082</span>  @Rule<a name="line.82"></a>
-<span class="sourceLineNo">083</span>  public TestName name = new TestName();<a name="line.83"></a>
-<span class="sourceLineNo">084</span><a name="line.84"></a>
-<span class="sourceLineNo">085</span>  @BeforeClass<a name="line.85"></a>
-<span class="sourceLineNo">086</span>  public static void beforeAllTests() throws Exception {<a name="line.86"></a>
-<span class="sourceLineNo">087</span>    // we will retry operations when PleaseHoldException is thrown<a name="line.87"></a>
-<span class="sourceLineNo">088</span>    TEST_UTIL.getConfiguration().setInt(HConstants.HBASE_CLIENT_RETRIES_NUMBER, 3);<a name="line.88"></a>
-<span class="sourceLineNo">089</span>    // Start a cluster of two regionservers.<a name="line.89"></a>
-<span class="sourceLineNo">090</span>    TEST_UTIL.startMiniCluster(2);<a name="line.90"></a>
-<span class="sourceLineNo">091</span>    admin = TEST_UTIL.getAdmin();<a name="line.91"></a>
-<span class="sourceLineNo">092</span>  }<a name="line.92"></a>
-<span class="sourceLineNo">093</span><a name="line.93"></a>
-<span class="sourceLineNo">094</span>  @AfterClass<a name="line.94"></a>
-<span class="sourceLineNo">095</span>  public static void afterAllTests() throws Exception {<a name="line.95"></a>
-<span class="sourceLineNo">096</span>    TEST_UTIL.shutdownMiniCluster();<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>  @Test<a name="line.99"></a>
-<span class="sourceLineNo">100</span>  @SuppressWarnings("deprecation")<a name="line.100"></a>
-<span class="sourceLineNo">101</span>  public void testMasterOpsWhileSplitting() throws Exception {<a name="line.101"></a>
-<span class="sourceLineNo">102</span>    MiniHBaseCluster cluster = TEST_UTIL.getHBaseCluster();<a name="line.102"></a>
-<span class="sourceLineNo">103</span>    HMaster m = cluster.getMaster();<a name="line.103"></a>
-<span class="sourceLineNo">104</span><a name="line.104"></a>
-<span class="sourceLineNo">105</span>    try (Table ht = TEST_UTIL.createTable(TABLENAME, FAMILYNAME)) {<a name="line.105"></a>
-<span class="sourceLineNo">106</span>      assertTrue(m.getTableStateManager().isTableState(TABLENAME, TableState.State.ENABLED));<a name="line.106"></a>
-<span class="sourceLineNo">107</span>      TEST_UTIL.loadTable(ht, FAMILYNAME, false);<a name="line.107"></a>
-<span class="sourceLineNo">108</span>    }<a name="line.108"></a>
-<span class="sourceLineNo">109</span><a name="line.109"></a>
-<span class="sourceLineNo">110</span>    List&lt;Pair&lt;RegionInfo, ServerName&gt;&gt; tableRegions = MetaTableAccessor.getTableRegionsAndLocations(<a name="line.110"></a>
-<span class="sourceLineNo">111</span>        m.getConnection(), TABLENAME);<a name="line.111"></a>
-<span class="sourceLineNo">112</span>    LOG.info("Regions after load: " + Joiner.on(',').join(tableRegions));<a name="line.112"></a>
-<span class="sourceLineNo">113</span>    assertEquals(1, tableRegions.size());<a name="line.113"></a>
-<span class="sourceLineNo">114</span>    assertArrayEquals(HConstants.EMPTY_START_ROW,<a name="line.114"></a>
-<span class="sourceLineNo">115</span>        tableRegions.get(0).getFirst().getStartKey());<a name="line.115"></a>
-<span class="sourceLineNo">116</span>    assertArrayEquals(HConstants.EMPTY_END_ROW,<a name="line.116"></a>
-<span class="sourceLineNo">117</span>        tableRegions.get(0).getFirst().getEndKey());<a name="line.117"></a>
-<span class="sourceLineNo">118</span><a name="line.118"></a>
-<span class="sourceLineNo">119</span>    // Now trigger a split and stop when the split is in progress<a name="line.119"></a>
-<span class="sourceLineNo">120</span>    LOG.info("Splitting table");<a name="line.120"></a>
-<span class="sourceLineNo">121</span>    TEST_UTIL.getAdmin().split(TABLENAME);<a name="line.121"></a>
-<span class="sourceLineNo">122</span><a name="line.122"></a>
-<span class="sourceLineNo">123</span>    LOG.info("Making sure we can call getTableRegions while opening");<a name="line.123"></a>
-<span class="sourceLineNo">124</span>    while (tableRegions.size() &lt; 3) {<a name="line.124"></a>
-<span class="sourceLineNo">125</span>      tableRegions = MetaTableAccessor.getTableRegionsAndLocations(m.getConnection(),<a name="line.125"></a>
-<span class="sourceLineNo">126</span>          TABLENAME, false);<a name="line.126"></a>
-<span class="sourceLineNo">127</span>      Thread.sleep(100);<a name="line.127"></a>
-<span class="sourceLineNo">128</span>    }<a name="line.128"></a>
-<span class="sourceLineNo">129</span>    LOG.info("Regions: " + Joiner.on(',').join(tableRegions));<a name="line.129"></a>
-<span class="sourceLineNo">130</span>    // We have three regions because one is split-in-progress<a name="line.130"></a>
-<span class="sourceLineNo">131</span>    assertEquals(3, tableRegions.size());<a name="line.131"></a>
-<span class="sourceLineNo">132</span>    LOG.info("Making sure we can call getTableRegionClosest while opening");<a name="line.132"></a>
-<span class="sourceLineNo">133</span>    Pair&lt;RegionInfo, ServerName&gt; pair =<a name="line.133"></a>
-<span class="sourceLineNo">134</span>        m.getTableRegionForRow(TABLENAME, Bytes.toBytes("cde"));<a name="line.134"></a>
-<span class="sourceLineNo">135</span>    LOG.info("Result is: " + pair);<a name="line.135"></a>
-<span class="sourceLineNo">136</span>    Pair&lt;RegionInfo, ServerName&gt; tableRegionFromName =<a name="line.136"></a>
-<span class="sourceLineNo">137</span>        MetaTableAccessor.getRegion(m.getConnection(),<a name="line.137"></a>
-<span class="sourceLineNo">138</span>          pair.getFirst().getRegionName());<a name="line.138"></a>
-<span class="sourceLineNo">139</span>    assertTrue(RegionInfo.COMPARATOR.compare(tableRegionFromName.getFirst(), pair.getFirst()) == 0);<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 testMoveRegionWhenNotInitialized() {<a name="line.143"></a>
-<span class="sourceLineNo">144</span>    MiniHBaseCluster cluster = TEST_UTIL.getHBaseCluster();<a name="line.144"></a>
-<span class="sourceLineNo">145</span>    HMaster m = cluster.getMaster();<a name="line.145"></a>
-<span class="sourceLineNo">146</span>    try {<a name="line.146"></a>
-<span class="sourceLineNo">147</span>      m.setInitialized(false); // fake it, set back later<a name="line.147"></a>
-<span class="sourceLineNo">148</span>      RegionInfo meta = RegionInfoBuilder.FIRST_META_REGIONINFO;<a name="line.148"></a>
-<span class="sourceLineNo">149</span>      m.move(meta.getEncodedNameAsBytes(), null);<a name="line.149"></a>
-<span class="sourceLineNo">150</span>      fail("Region should not be moved since master is not initialized");<a name="line.150"></a>
-<span class="sourceLineNo">151</span>    } catch (IOException ioe) {<a name="line.151"></a>
-<span class="sourceLineNo">152</span>      assertTrue(ioe instanceof PleaseHoldException);<a name="line.152"></a>
-<span class="sourceLineNo">153</span>    } finally {<a name="line.153"></a>
-<span class="sourceLineNo">154</span>      m.setInitialized(true);<a name="line.154"></a>
-<span class="sourceLineNo">155</span>    }<a name="line.155"></a>
-<span class="sourceLineNo">156</span>  }<a name="line.156"></a>
-<span class="sourceLineNo">157</span><a name="line.157"></a>
-<span class="sourceLineNo">158</span>  @Test<a name="line.158"></a>
-<span class="sourceLineNo">159</span>  public void testMoveThrowsUnknownRegionException() throws IOException {<a name="line.159"></a>
-<span class="sourceLineNo">160</span>    final TableName tableName = TableName.valueOf(name.getMethodName());<a name="line.160"></a>
-<span class="sourceLineNo">161</span>    HTableDescriptor htd = new HTableDescriptor(tableName);<a name="line.161"></a>
-<span class="sourceLineNo">162</span>    HColumnDescriptor hcd = new HColumnDescriptor("value");<a name="line.162"></a>
-<span class="sourceLineNo">163</span>    htd.addFamily(hcd);<a name="line.163"></a>
-<span class="sourceLineNo">164</span><a name="line.164"></a>
-<span class="sourceLineNo">165</span>    admin.createTable(htd, null);<a name="line.165"></a>
-<span class="sourceLineNo">166</span>    try {<a name="line.166"></a>
-<span class="sourceLineNo">167</span>      RegionInfo hri = RegionInfoBuilder.newBuilder(tableName)<a name="line.167"></a>
-<span class="sourceLineNo">168</span>          .setStartKey(Bytes.toBytes("A"))<a name="line.168"></a>
-<span class="sourceLineNo">169</span>          .setEndKey(Bytes.toBytes("Z"))<a name="line.169"></a>
-<span class="sourceLineNo">170</span>          .build();<a name="line.170"></a>
-<span class="sourceLineNo">171</span>      admin.move(hri.getEncodedNameAsBytes(), null);<a name="line.171"></a>
-<span class="sourceLineNo">172</span>      fail("Region should not be moved since it is fake");<a name="line.172"></a>
-<span class="sourceLineNo">173</span>    } catch (IOException ioe) {<a name="line.173"></a>
-<span class="sourceLineNo">174</span>      assertTrue(ioe instanceof UnknownRegionException);<a name="line.174"></a>
-<span class="sourceLineNo">175</span>    } finally {<a name="line.175"></a>
-<span class="sourceLineNo">176</span>      TEST_UTIL.deleteTable(tableName);<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>  @Test<a name="line.180"></a>
-<span class="sourceLineNo">181</span>  public void testMoveThrowsPleaseHoldException() throws IOException {<a name="line.181"></a>
-<span class="sourceLineNo">182</span>    final TableName tableName = TableName.valueOf(name.getMethodName());<a name="line.182"></a>
-<span class="sourceLineNo">183</span>    HMaster master = TEST_UTIL.getMiniHBaseCluster().getMaster();<a name="line.183"></a>
-<span class="sourceLineNo">184</span>    HTableDescriptor htd = new HTableDescriptor(tableName);<a name="line.184"></a>
-<span class="sourceLineNo">185</span>    HColumnDescriptor hcd = new HColumnDescriptor("value");<a name="line.185"></a>
-<span class="sourceLineNo">186</span>    htd.addFamily(hcd);<a name="line.186"></a>
-<span class="sourceLineNo">187</span><a name="line.187"></a>
-<span class="sourceLineNo">188</span>    admin.createTable(htd, null);<a name="line.188"></a>
-<span class="sourceLineNo">189</span>    try {<a name="line.189"></a>
-<span class="sourceLineNo">190</span>      List&lt;RegionInfo&gt; tableRegions = admin.getRegions(tableName);<a name="line.190"></a>
-<span class="sourceLineNo">191</span><a name="line.191"></a>
-<span class="sourceLineNo">192</span>      master.setInitialized(false); // fake it, set back later<a name="line.192"></a>
-<span class="sourceLineNo">193</span>      admin.move(tableRegions.get(0).getEncodedNameAsBytes(), null);<a name="line.193"></a>
-<span class="sourceLineNo">194</span>      fail("Region should not be moved since master is not initialized");<a name="line.194"></a>
-<span class="sourceLineNo">195</span>    } catch (IOException ioe) {<a name="line.195"></a>
-<span class="sourceLineNo">196</span>      assertTrue(StringUtils.stringifyException(ioe).contains("PleaseHoldException"));<a name="line.196"></a>
-<span class="sourceLineNo">197</span>    } finally {<a name="line.197"></a>
-<span class="sourceLineNo">198</span>      master.setInitialized(true);<a name="line.198"></a>
-<span class="sourceLineNo">199</span>      TEST_UTIL.deleteTable(tableName);<a name="line.199"></a>
-<span class="sourceLineNo">200</span>    }<a name="line.200"></a>
-<span class="sourceLineNo">201</span>  }<a name="line.201"></a>
-<span class="sourceLineNo">202</span><a name="line.202"></a>
-<span class="sourceLineNo">203</span>  @Test<a name="line.203"></a>
-<span class="sourceLineNo">204</span>  public void testFlushedSequenceIdPersistLoad() throws Exception {<a name="line.204"></a>
-<span class="sourceLineNo">205</span>    Configuration conf = TEST_UTIL.getConfiguration();<a name="line.205"></a>
-<span class="sourceLineNo">206</span>    int msgInterval = conf.getInt("hbase.regionserver.msginterval", 100);<a name="line.206"></a>
-<span class="sourceLineNo">207</span>    // insert some data into META<a name="line.207"></a>
-<span class="sourceLineNo">208</span>    TableName tableName = TableName.valueOf("testFlushSeqId");<a name="line.208"></a>
-<span class="sourceLineNo">209</span>    HTableDescriptor desc = new HTableDescriptor(tableName);<a name="line.209"></a>
-<span class="sourceLineNo">210</span>    desc.addFamily(new HColumnDescriptor(Bytes.toBytes("cf")));<a name="line.210"></a>
-<span class="sourceLineNo">211</span>    Table table = TEST_UTIL.createTable(desc, null);<a name="line.211"></a>
-<span class="sourceLineNo">212</span>    // flush META region<a name="line.212"></a>
-<span class="sourceLineNo">213</span>    TEST_UTIL.flush(TableName.META_TABLE_NAME);<a name="line.213"></a>
-<span class="sourceLineNo">214</span>    // wait for regionserver report<a name="line.214"></a>
-<span class="sourceLineNo">215</span>    Threads.sleep(msgInterval * 2);<a name="line.215"></a>
-<span class="sourceLineNo">216</span>    // record flush seqid before cluster shutdown<a name="line.216"></a>
-<span class="sourceLineNo">217</span>    Map&lt;byte[], Long&gt; regionMapBefore =<a name="line.217"></a>
-<span class="sourceLineNo">218</span>        TEST_UTIL.getHBaseCluster().getMaster().getServerManager()<a name="line.218"></a>
-<span class="sourceLineNo">219</span>            .getFlushedSequenceIdByRegion();<a name="line.219"></a>
-<span class="sourceLineNo">220</span>    // restart hbase cluster which will cause flushed sequence id persist and reload<a name="line.220"></a>
-<span class="sourceLineNo">221</span>    TEST_UTIL.getMiniHBaseCluster().shutdown();<a name="line.221"></a>
-<span class="sourceLineNo">222</span>    TEST_UTIL.restartHBaseCluster(2);<a name="line.222"></a>
-<span class="sourceLineNo">223</span>    TEST_UTIL.waitUntilNoRegionsInTransition();<a name="line.223"></a>
-<span class="sourceLineNo">224</span>    // check equality after reloading flushed sequence id map<a name="line.224"></a>
-<span class="sourceLineNo">225</span>    Map&lt;byte[], Long&gt; regionMapAfter =<a name="line.225"></a>
-<span class="sourceLineNo">226</span>        TEST_UTIL.getHBaseCluster().getMaster().getServerManager()<a name="line.226"></a>
-<span class="sourceLineNo">227</span>            .getFlushedSequenceIdByRegion();<a name="line.227"></a>
-<span class="sourceLineNo">228</span>    assertTrue(regionMapBefore.equals(regionMapAfter));<a name="line.228"></a>
-<span class="sourceLineNo">229</span>  }<a name="line.229"></a>
-<span class="sourceLineNo">230</span><a name="line.230"></a>
-<span class="sourceLineNo">231</span>  @Test<a name="line.231"></a>
-<span class="sourceLineNo">232</span>  public void testBlockingHbkc1WithLockFile() throws IOException {<a name="line.232"></a>
-<span class="sourceLineNo">233</span>    // This is how the patch to the lock file is created inside in HBaseFsck. Too hard to use its<a name="line.233"></a>
-<span class="sourceLineNo">234</span>    // actual method without disturbing HBaseFsck... Do the below mimic instead.<a name="line.234"></a>
-<span class="sourceLineNo">235</span>    Path hbckLockPath = new Path(HBaseFsck.getTmpDir(TEST_UTIL.getConfiguration()),<a name="line.235"></a>
-<span class="sourceLineNo">236</span>        HBaseFsck.HBCK_LOCK_FILE);<a name="line.236"></a>
-<span class="sourceLineNo">237</span>    FileSystem fs = TEST_UTIL.getTestFileSystem();<a name="line.237"></a>
-<span class="sourceLineNo">238</span>    assertTrue(fs.exists(hbckLockPath));<a name="line.238"></a>
-<span class="sourceLineNo">239</span>    TEST_UTIL.getMiniHBaseCluster().<a name="line.239"></a>
-<span class="sourceLineNo">240</span>        killMaster(TEST_UTIL.getMiniHBaseCluster().getMaster().getServerName());<a name="line.240"></a>
-<span class="sourceLineNo">241</span>    assertTrue(fs.exists(hbckLockPath));<a name="line.241"></a>
-<span class="sourceLineNo">242</span>    TEST_UTIL.getMiniHBaseCluster().startMaster();<a name="line.242"></a>
-<span class="sourceLineNo">243</span>    TEST_UTIL.waitFor(30000, () -&gt; TEST_UTIL.getMiniHBaseCluster().getMaster() != null &amp;&amp;<a name="line.243"></a>
-<span class="sourceLineNo">244</span>        TEST_UTIL.getMiniHBaseCluster().getMaster().isInitialized());<a name="line.244"></a>
-<span class="sourceLineNo">245</span>    assertTrue(fs.exists(hbckLockPath));<a name="line.245"></a>
-<span class="sourceLineNo">246</span>    // Start a second Master. Should be fine.<a name="line.246"></a>
-<span class="sourceLineNo">247</span>    TEST_UTIL.getMiniHBaseCluster().startMaster();<a name="line.247"></a>
-<span class="sourceLineNo">248</span>    assertTrue(fs.exists(hbckLockPath));<a name="line.248"></a>
-<span class="sourceLineNo">249</span>    fs.delete(hbckLockPath, true);<a name="line.249"></a>
-<span class="sourceLineNo">250</span>    assertFalse(fs.exists(hbckLockPath));<a name="line.250"></a>
-<span class="sourceLineNo">251</span>    // Kill all Masters.<a name="line.251"></a>
-<span class="sourceLineNo">252</span>    TEST_UTIL.getMiniHBaseCluster().getLiveMasterThreads().stream().<a name="line.252"></a>
-<span class="sourceLineNo">253</span>        map(sn -&gt; sn.getMaster().getServerName()).forEach(sn -&gt; {<a name="line.253"></a>
-<span class="sourceLineNo">254</span>          try {<a name="line.254"></a>
-<span class="sourceLineNo">255</span>            TEST_UTIL.getMiniHBaseCluster().killMaster(sn);<a name="line.255"></a>
-<span class="sourceLineNo">256</span>          } catch (IOException e) {<a name="line.256"></a>
-<span class="sourceLineNo">257</span>            e.printStackTrace();<a name="line.257"></a>
-<span class="sourceLineNo">258</span>          }<a name="line.258"></a>
-<span class="sourceLineNo">259</span>        });<a name="line.259"></a>
-<span class="sourceLineNo">260</span>    // Start a new one.<a name="line.260"></a>
-<span class="sourceLineNo">261</span>    TEST_UTIL.getMiniHBaseCluster().startMaster();<a name="line.261"></a>
-<span class="sourceLineNo">262</span>    TEST_UTIL.waitFor(30000, () -&gt; TEST_UTIL.getMiniHBaseCluster().getMaster() != null &amp;&amp;<a name="line.262"></a>
-<span class="sourceLineNo">263</span>        TEST_UTIL.getMiniHBaseCluster().getMaster().isInitialized());<a name="line.263"></a>
-<span class="sourceLineNo">264</span>    // Assert lock gets put in place again.<a name="line.264"></a>
-<span class="sourceLineNo">265</span>    assertTrue(fs.exists(hbckLockPath));<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>  @Test<a name="line.268"></a>
-<span class="sourceLineNo">269</span>  public void testMasterBlockCache() {<a name="line.269"></a>
-<span class="sourceLineNo">270</span>    // Master not carry table in default, so no need to instantiate block cache, too.<a name="line.270"></a>
-<span class="sourceLineNo">271</span>    assertNull(TEST_UTIL.getMiniHBaseCluster().getMaster().getCacheConfig().getBlockCache());<a name="line.271"></a>
-<span class="sourceLineNo">272</span>  }<a name="line.272"></a>
-<span class="sourceLineNo">273</span>}<a name="line.273"></a>
-<span class="sourceLineNo">274</span><a name="line.274"></a>
+<span class="sourceLineNo">077</span>  private static final TableName TABLENAME = TableName.valueOf("TestMaster");<a name="line.77"></a>
+<span class="sourceLineNo">078</span>  private static final byte[] FAMILYNAME = Bytes.toBytes("fam");<a name="line.78"></a>
+<span class="sourceLineNo">079</span>  private static Admin admin;<a name="line.79"></a>
+<span class="sourceLineNo">080</span><a name="line.80"></a>
+<span class="sourceLineNo">081</span>  @Rule<a name="line.81"></a>
+<span class="sourceLineNo">082</span>  public TestName name = new TestName();<a name="line.82"></a>
+<span class="sourceLineNo">083</span><a name="line.83"></a>
+<span class="sourceLineNo">084</span>  @BeforeClass<a name="line.84"></a>
+<span class="sourceLineNo">085</span>  public static void beforeAllTests() throws Exception {<a name="line.85"></a>
+<span class="sourceLineNo">086</span>    // we will retry operations when PleaseHoldException is thrown<a name="line.86"></a>
+<span class="sourceLineNo">087</span>    TEST_UTIL.getConfiguration().setInt(HConstants.HBASE_CLIENT_RETRIES_NUMBER, 3);<a name="line.87"></a>
+<span class="sourceLineNo">088</span>    // Start a cluster of two regionservers.<a name="line.88"></a>
+<span class="sourceLineNo">089</span>    TEST_UTIL.startMiniCluster(2);<a name="line.89"></a>
+<span class="sourceLineNo">090</span>    admin = TEST_UTIL.getAdmin();<a name="line.90"></a>
+<span class="sourceLineNo">091</span>  }<a name="line.91"></a>
+<span class="sourceLineNo">092</span><a name="line.92"></a>
+<span class="sourceLineNo">093</span>  @AfterClass<a name="line.93"></a>
+<span class="sourceLineNo">094</span>  public static void afterAllTests() throws Exception {<a name="line.94"></a>
+<span class="sourceLineNo">095</span>    TEST_UTIL.shutdownMiniCluster();<a name="line.95"></a>
+<span class="sourceLineNo">096</span>  }<a name="line.96"></a>
+<span class="sourceLineNo">097</span><a name="line.97"></a>
+<span class="sourceLineNo">098</span>  @Test<a name="line.98"></a>
+<span class="sourceLineNo">099</span>  @SuppressWarnings("deprecation")<a name="line.99"></a>
+<span class="sourceLineNo">100</span>  public void testMasterOpsWhileSplitting() throws Exception {<a name="line.100"></a>
+<span class="sourceLineNo">101</span>    MiniHBaseCluster cluster = TEST_UTIL.getHBaseCluster();<a name="line.101"></a>
+<span class="sourceLineNo">102</span>    HMaster m = cluster.getMaster();<a name="line.102"></a>
+<span class="sourceLineNo">103</span><a name="line.103"></a>
+<span class="sourceLineNo">104</span>    try (Table ht = TEST_UTIL.createTable(TABLENAME, FAMILYNAME)) {<a name="line.104"></a>
+<span class="sourceLineNo">105</span>      assertTrue(m.getTableStateManager().isTableState(TABLENAME, TableState.State.ENABLED));<a name="line.105"></a>
+<span class="sourceLineNo">106</span>      TEST_UTIL.loadTable(ht, FAMILYNAME, false);<a name="line.106"></a>
+<span class="sourceLineNo">107</span>    }<a name="line.107"></a>
+<span class="sourceLineNo">108</span><a name="line.108"></a>
+<span class="sourceLineNo">109</span>    List&lt;Pair&lt;RegionInfo, ServerName&gt;&gt; tableRegions = MetaTableAccessor.getTableRegionsAndLocations(<a name="line.109"></a>
+<span class="sourceLineNo">110</span>        m.getConnection(), TABLENAME);<a name="line.110"></a>
+<span class="sourceLineNo">111</span>    LOG.info("Regions after load: " + Joiner.on(',').join(tableRegions));<a name="line.111"></a>
+<span class="sourceLineNo">112</span>    assertEquals(1, tableRegions.size());<a name="line.112"></a>
+<span class="sourceLineNo">113</span>    assertArrayEquals(HConstants.EMPTY_START_ROW,<a name="line.113"></a>
+<span class="sourceLineNo">114</span>        tableRegions.get(0).getFirst().getStartKey());<a name="line.114"></a>
+<span class="sourceLineNo">115</span>    assertArrayEquals(HConstants.EMPTY_END_ROW,<a name="line.115"></a>
+<span class="sourceLineNo">116</span>        tableRegions.get(0).getFirst().getEndKey());<a name="line.116"></a>
+<span class="sourceLineNo">117</span><a name="line.117"></a>
+<span class="sourceLineNo">118</span>    // Now trigger a split and stop when the split is in progress<a name="line.118"></a>
+<span class="sourceLineNo">119</span>    LOG.info("Splitting table");<a name="line.119"></a>
+<span class="sourceLineNo">120</span>    TEST_UTIL.getAdmin().split(TABLENAME);<a name="line.120"></a>
+<span class="sourceLineNo">121</span><a name="line.121"></a>
+<span class="sourceLineNo">122</span>    LOG.info("Making sure we can call getTableRegions while opening");<a name="line.122"></a>
+<span class="sourceLineNo">123</span>    while (tableRegions.size() &lt; 3) {<a name="line.123"></a>
+<span class="sourceLineNo">124</span>      tableRegions = MetaTableAccessor.getTableRegionsAndLocations(m.getConnection(),<a name="line.124"></a>
+<span class="sourceLineNo">125</span>          TABLENAME, false);<a name="line.125"></a>
+<span class="sourceLineNo">126</span>      Thread.sleep(100);<a name="line.126"></a>
+<span class="sourceLineNo">127</span>    }<a name="line.127"></a>
+<span class="sourceLineNo">128</span>    LOG.info("Regions: " + Joiner.on(',').join(tableRegions));<a name="line.128"></a>
+<span class="sourceLineNo">129</span>    // We have three regions because one is split-in-progress<a name="line.129"></a>
+<span class="sourceLineNo">130</span>    assertEquals(3, tableRegions.size());<a name="line.130"></a>
+<span class="sourceLineNo">131</span>    LOG.info("Making sure we can call getTableRegionClosest while opening");<a name="line.131"></a>
+<span class="sourceLineNo">132</span>    Pair&lt;RegionInfo, ServerName&gt; pair =<a name="line.132"></a>
+<span class="sourceLineNo">133</span>        m.getTableRegionForRow(TABLENAME, Bytes.toBytes("cde"));<a name="line.133"></a>
+<span class="sourceLineNo">134</span>    LOG.info("Result is: " + pair);<a name="line.134"></a>
+<span class="sourceLineNo">135</span>    Pair&lt;RegionInfo, ServerName&gt; tableRegionFromName =<a name="line.135"></a>
+<span class="sourceLineNo">136</span>        MetaTableAccessor.getRegion(m.getConnection(),<a name="line.136"></a>
+<span class="sourceLineNo">137</span>          pair.getFirst().getRegionName());<a name="line.137"></a>
+<span class="sourceLineNo">138</span>    assertTrue(RegionInfo.COMPARATOR.compare(tableRegionFromName.getFirst(), pair.getFirst()) == 0);<a name="line.138"></a>
+<span class="sourceLineNo">139</span>  }<a name="line.139"></a>
+<span class="sourceLineNo">140</span><a name="line.140"></a>
+<span class="sourceLineNo">141</span>  @Test<a name="line.141"></a>
+<span class="sourceLineNo">142</span>  public void testMoveRegionWhenNotInitialized() {<a name="line.142"></a>
+<span class="sourceLineNo">143</span>    MiniHBaseCluster cluster = TEST_UTIL.getHBaseCluster();<a name="line.143"></a>
+<span class="sourceLineNo">144</span>    HMaster m = cluster.getMaster();<a name="line.144"></a>
+<span class="sourceLineNo">145</span>    try {<a name="line.145"></a>
+<span class="sourceLineNo">146</span>      m.setInitialized(false); // fake it, set back later<a name="line.146"></a>
+<span class="sourceLineNo">147</span>      RegionInfo meta = RegionInfoBuilder.FIRST_META_REGIONINFO;<a name="line.147"></a>
+<span class="sourceLineNo">148</span>      m.move(meta.getEncodedNameAsBytes(), null);<a name="line.148"></a>
+<span class="sourceLineNo">149</span>      fail("Region should not be moved since master is not initialized");<a name="line.149"></a>
+<span class="sourceLineNo">150</span>    } catch (IOException ioe) {<a name="line.150"></a>
+<span class="sourceLineNo">151</span>      assertTrue(ioe instanceof PleaseHoldException);<a name="line.151"></a>
+<span class="sourceLineNo">152</span>    } finally {<a name="line.152"></a>
+<span class="sourceLineNo">153</span>      m.setInitialized(true);<a name="line.153"></a>
+<span class="sourceLineNo">154</span>    }<a name="line.154"></a>
+<span class="sourceLineNo">155</span>  }<a name="line.155"></a>
+<span class="sourceLineNo">156</span><a name="line.156"></a>
+<span class="sourceLineNo">157</span>  @Test<a name="line.157"></a>
+<span class="sourceLineNo">158</span>  public void testMoveThrowsUnknownRegionException() throws IOException {<a name="line.158"></a>
+<span class="sourceLineNo">159</span>    final TableName tableName = TableName.valueOf(name.getMethodName());<a name="line.159"></a>
+<span class="sourceLineNo">160</span>    HTableDescriptor htd = new HTableDescriptor(tableName);<a name="line.160"></a>
+<span class="sourceLineNo">161</span>    HColumnDescriptor hcd = new HColumnDescriptor("value");<a name="line.161"></a>
+<span class="sourceLineNo">162</span>    htd.addFamily(hcd);<a name="line.162"></a>
+<span class="sourceLineNo">163</span><a name="line.163"></a>
+<span class="sourceLineNo">164</span>    admin.createTable(htd, null);<a name="line.164"></a>
+<span class="sourceLineNo">165</span>    try {<a name="line.165"></a>
+<span class="sourceLineNo">166</span>      RegionInfo hri = RegionInfoBuilder.newBuilder(tableName)<a name="line.166"></a>
+<span class="sourceLineNo">167</span>          .setStartKey(Bytes.toBytes("A"))<a name="line.167"></a>
+<span class="sourceLineNo">168</span>          .setEndKey(Bytes.toBytes("Z"))<a name="line.168"></a>
+<span class="sourceLineNo">169</span>          .build();<a name="line.169"></a>
+<span class="sourceLineNo">170</span>      admin.move(hri.getEncodedNameAsBytes(), null);<a name="line.170"></a>
+<span class="sourceLineNo">171</span>      fail("Region should not be moved since it is fake");<a name="line.171"></a>
+<span class="sourceLineNo">172</span>    } catch (IOException ioe) {<a name="line.172"></a>
+<span class="sourceLineNo">173</span>      assertTrue(ioe instanceof UnknownRegionException);<a name="line.173"></a>
+<span class="sourceLineNo">174</span>    } finally {<a name="line.174"></a>
+<span class="sourceLineNo">175</span>      TEST_UTIL.deleteTable(tableName);<a name="line.175"></a>
+<span class="sourceLineNo">176</span>    }<a name="line.176"></a>
+<span class="sourceLineNo">177</span>  }<a name="line.177"></a>
+<span class="sourceLineNo">178</span><a name="line.178"></a>
+<span class="sourceLineNo">179</span>  @Test<a name="line.179"></a>
+<span class="sourceLineNo">180</span>  public void testMoveThrowsPleaseHoldException() throws IOException {<a name="line.180"></a>
+<span class="sourceLineNo">181</span>    final TableName tableName = TableName.valueOf(name.getMethodName());<a name="line.181"></a>
+<span class="sourceLineNo">182</span>    HMaster master = TEST_UTIL.getMiniHBaseCluster().getMaster();<a name="line.182"></a>
+<span class="sourceLineNo">183</span>    HTableDescriptor htd = new HTableDescriptor(tableName);<a name="line.183"></a>
+<span class="sourceLineNo">184</span>    HColumnDescriptor hcd = new HColumnDescriptor("value");<a name="line.184"></a>
+<span class="sourceLineNo">185</span>    htd.addFamily(hcd);<a name="line.185"></a>
+<span class="sourceLineNo">186</span><a name="line.186"></a>
+<span class="sourceLineNo">187</span>    admin.createTable(htd, null);<a name="line.187"></a>
+<span class="sourceLineNo">188</span>    try {<a name="line.188"></a>
+<span class="sourceLineNo">189</span>      List&lt;RegionInfo&gt; tableRegions = admin.getRegions(tableName);<a name="line.189"></a>
+<span class="sourceLineNo">190</span><a name="line.190"></a>
+<span class="sourceLineNo">191</span>      master.setInitialized(false); // fake it, set back later<a name="line.191"></a>
+<span class="sourceLineNo">192</span>      admin.move(tableRegions.get(0).getEncodedNameAsBytes(), null);<a name="line.192"></a>
+<span class="sourceLineNo">193</span>      fail("Region should not be moved since master is not initialized");<a name="line.193"></a>
+<span class="sourceLineNo">194</span>    } catch (IOException ioe) {<a name="line.194"></a>
+<span class="sourceLineNo">195</span>      assertTrue(StringUtils.stringifyException(ioe).contains("PleaseHoldException"));<a name="line.195"></a>
+<span class="sourceLineNo">196</span>    } finally {<a name="line.196"></a>
+<span class="sourceLineNo">197</span>      master.setInitialized(true);<a name="line.197"></a>
+<span class="sourceLineNo">198</span>      TEST_UTIL.deleteTable(tableName);<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>  @Test<a name="line.202"></a>
+<span class="sourceLineNo">203</span>  public void testFlushedSequenceIdPersistLoad() throws Exception {<a name="line.203"></a>
+<span class="sourceLineNo">204</span>    Configuration conf = TEST_UTIL.getConfiguration();<a name="line.204"></a>
+<span class="sourceLineNo">205</span>    int msgInterval = conf.getInt("hbase.regionserver.msginterval", 100);<a name="line.205"></a>
+<span class="sourceLineNo">206</span>    // insert some data into META<a name="line.206"></a>
+<span class="sourceLineNo">207</span>    TableName tableName = TableName.valueOf("testFlushSeqId");<a name="line.207"></a>
+<span class="sourceLineNo">208</span>    HTableDescriptor desc = new HTableDescriptor(tableName);<a name="line.208"></a>
+<span class="sourceLineNo">209</span>    desc.addFamily(new HColumnDescriptor(Bytes.toBytes("cf")));<a name="line.209"></a>
+<span class="sourceLineNo">210</span>    Table table = TEST_UTIL.createTable(desc, null);<a name="line.210"></a>
+<span class="sourceLineNo">211</span>    // flush META region<a name="line.211"></a>
+<span class="sourceLineNo">212</span>    TEST_UTIL.flush(TableName.META_TABLE_NAME);<a name="line.212"></a>
+<span class="sourceLineNo">213</span>    // wait for regionserver report<a name="line.213"></a>
+<span class="sourceLineNo">214</span>    Threads.sleep(msgInterval * 2);<a name="line.214"></a>
+<span class="sourceLineNo">215</span>    // record flush seqid before cluster shutdown<a name="line.215"></a>
+<span class="sourceLineNo">216</span>    Map&lt;byte[], Long&gt; regionMapBefore =<a name="line.216"></a>
+<span class="sourceLineNo">217</span>        TEST_UTIL.getHBaseCluster().getMaster().getServerManager()<a name="line.217"></a>
+<span class="sourceLineNo">218</span>            .getFlushedSequenceIdByRegion();<a name="line.218"></a>
+<span class="sourceLineNo">219</span>    // restart hbase cluster which will cause flushed sequence id persist and reload<a name="line.219"></a>
+<span class="sourceLineNo">220</span>    TEST_UTIL.getMiniHBaseCluster().shutdown();<a name="line.220"></a>
+<span class="sourceLineNo">221</span>    TEST_UTIL.restartHBaseCluster(2);<a name="line.221"></a>
+<span class="sourceLineNo">222</span>    TEST_UTIL.waitUntilNoRegionsInTransition();<a name="line.222"></a>
+<span class="sourceLineNo">223</span>    // check equality after reloading flushed sequence id map<a name="line.223"></a>
+<span class="sourceLineNo">224</span>    Map&lt;byte[], Long&gt; regionMapAfter =<a name="line.224"></a>
+<span class="sourceLineNo">225</span>        TEST_UTIL.getHBaseCluster().getMaster().getServerManager()<a name="line.225"></a>
+<span class="sourceLineNo">226</span>            .getFlushedSequenceIdByRegion();<a name="line.226"></a>
+<span class="sourceLineNo">227</span>    assertTrue(regionMapBefore.equals(regionMapAfter));<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 testBlockingHbkc1WithLockFile() throws IOException {<a name="line.231"></a>
+<span class="sourceLineNo">232</span>    // This is how the patch to the lock file is created inside in HBaseFsck. Too hard to use its<a name="line.232"></a>
+<span class="sourceLineNo">233</span>    // actual method without disturbing HBaseFsck... Do the below mimic instead.<a name="line.233"></a>
+<span class="sourceLineNo">234</span>    Path hbckLockPath = new Path(HBaseFsck.getTmpDir(TEST_UTIL.getConfiguration()),<a name="line.234"></a>
+<span class="sourceLineNo">235</span>        HBaseFsck.HBCK_LOCK_FILE);<a name="line.235"></a>
+<span class="sourceLineNo">236</span>    FileSystem fs = TEST_UTIL.getTestFileSystem();<a name="line.236"></a>
+<span class="sourceLineNo">237</span>    assertTrue(fs.exists(hbckLockPath));<a name="line.237"></a>
+<span class="sourceLineNo">238</span>    TEST_UTIL.getMiniHBaseCluster().<a name="line.238"></a>
+<span class="sourceLineNo">239</span>        killMaster(TEST_UTIL.getMiniHBaseCluster().getMaster().getServerName());<a name="line.239"></a>
+<span class="sourceLineNo">240</span>    assertTrue(fs.exists(hbckLockPath));<a name="line.240"></a>
+<span class="sourceLineNo">241</span>    TEST_UTIL.getMiniHBaseCluster().startMaster();<a name="line.241"></a>
+<span class="sourceLineNo">242</span>    TEST_UTIL.waitFor(30000, () -&gt; TEST_UTIL.getMiniHBaseCluster().getMaster() != null &amp;&amp;<a name="line.242"></a>
+<span class="sourceLineNo">243</span>        TEST_UTIL.getMiniHBaseCluster().getMaster().isInitialized());<a name="line.243"></a>
+<span class="sourceLineNo">244</span>    assertTrue(fs.exists(hbckLockPath));<a name="line.244"></a>
+<span class="sourceLineNo">245</span>    // Start a second Master. Should be fine.<a name="line.245"></a>
+<span class="sourceLineNo">246</span>    TEST_UTIL.getMiniHBaseCluster().startMaster();<a name="line.246"></a>
+<span class="sourceLineNo">247</span>    assertTrue(fs.exists(hbckLockPath));<a name="line.247"></a>
+<span class="sourceLineNo">248</span>    fs.delete(hbckLockPath, true);<a name="line.248"></a>
+<span class="sourceLineNo">249</span>    assertFalse(fs.exists(hbckLockPath));<a name="line.249"></a>
+<span class="sourceLineNo">250</span>    // Kill all Masters.<a name="line.250"></a>
+<span class="sourceLineNo">251</span>    TEST_UTIL.getMiniHBaseCluster().getLiveMasterThreads().stream().<a name="line.251"></a>
+<span class="sourceLineNo">252</span>        map(sn -&gt; sn.getMaster().getServerName()).forEach(sn -&gt; {<a name="line.252"></a>
+<span class="sourceLineNo">253</span>          try {<a name="line.253"></a>
+<span class="sourceLineNo">254</span>            TEST_UTIL.getMiniHBaseCluster().killMaster(sn);<a name="line.254"></a>
+<span class="sourceLineNo">255</span>          } catch (IOException e) {<a name="line.255"></a>
+<span class="sourceLineNo">256</span>            e.printStackTrace();<a name="line.256"></a>
+<span class="sourceLineNo">257</span>          }<a name="line.257"></a>
+<span class="sourceLineNo">258</span>        });<a name="line.258"></a>
+<span class="sourceLineNo">259</span>    // Start a new one.<a name="line.259"></a>
+<span class="sourceLineNo">260</span>    TEST_UTIL.getMiniHBaseCluster().startMaster();<a name="line.260"></a>
+<span class="sourceLineNo">261</span>    TEST_UTIL.waitFor(30000, () -&gt; TEST_UTIL.getMiniHBaseCluster().getMaster() != null &amp;&amp;<a name="line.261"></a>
+<span class="sourceLineNo">262</span>        TEST_UTIL.getMiniHBaseCluster().getMaster().isInitialized());<a name="line.262"></a>
+<span class="sourceLineNo">263</span>    // Assert lock gets put in place again.<a name="line.263"></a>
+<span class="sourceLineNo">264</span>    assertTrue(fs.exists(hbckLockPath));<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>  @Test<a name="line.267"></a>
+<span class="sourceLineNo">268</span>  public void testMasterBlockCache() {<a name="line.268"></a>
+<span class="sourceLineNo">269</span>    // Master not carry table in default, so no need to instantiate block cache, too.<a name="line.269"></a>
+<span class="sourceLineNo">270</span>    assertNull(TEST_UTIL.getMiniHBaseCluster().getMaster().getCacheConfig().getBlockCache());<a name="line.270"></a>
+<span class="sourceLineNo">271</span>  }<a name="line.271"></a>
+<span class="sourceLineNo">272</span>}<a name="line.272"></a>
+<span class="sourceLineNo">273</span><a name="line.273"></a>
 
 
 


[26/46] hbase-site git commit: Published site at 05d22ed960204183fbd9bd16f1dbca6410ccde76.

Posted by gi...@apache.org.
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/3649682c/devapidocs/src-html/org/apache/hadoop/hbase/master/ServerManager.html
----------------------------------------------------------------------
diff --git a/devapidocs/src-html/org/apache/hadoop/hbase/master/ServerManager.html b/devapidocs/src-html/org/apache/hadoop/hbase/master/ServerManager.html
index c13e4a4..f1c0bc3 100644
--- a/devapidocs/src-html/org/apache/hadoop/hbase/master/ServerManager.html
+++ b/devapidocs/src-html/org/apache/hadoop/hbase/master/ServerManager.html
@@ -769,423 +769,426 @@
 <span class="sourceLineNo">761</span>   * RegionServers to check-in.<a name="line.761"></a>
 <span class="sourceLineNo">762</span>   */<a name="line.762"></a>
 <span class="sourceLineNo">763</span>  private int getMinToStart() {<a name="line.763"></a>
-<span class="sourceLineNo">764</span>    // One server should be enough to get us off the ground.<a name="line.764"></a>
-<span class="sourceLineNo">765</span>    int requiredMinToStart = 1;<a name="line.765"></a>
-<span class="sourceLineNo">766</span>    if (LoadBalancer.isTablesOnMaster(master.getConfiguration())) {<a name="line.766"></a>
-<span class="sourceLineNo">767</span>      if (LoadBalancer.isSystemTablesOnlyOnMaster(master.getConfiguration())) {<a name="line.767"></a>
-<span class="sourceLineNo">768</span>        // If Master is carrying regions but NOT user-space regions, it<a name="line.768"></a>
-<span class="sourceLineNo">769</span>        // still shows as a 'server'. We need at least one more server to check<a name="line.769"></a>
-<span class="sourceLineNo">770</span>        // in before we can start up so set defaultMinToStart to 2.<a name="line.770"></a>
-<span class="sourceLineNo">771</span>        requiredMinToStart = requiredMinToStart + 1;<a name="line.771"></a>
-<span class="sourceLineNo">772</span>      }<a name="line.772"></a>
-<span class="sourceLineNo">773</span>    }<a name="line.773"></a>
-<span class="sourceLineNo">774</span>    int minToStart = this.master.getConfiguration().getInt(WAIT_ON_REGIONSERVERS_MINTOSTART, -1);<a name="line.774"></a>
-<span class="sourceLineNo">775</span>    // Ensure we are never less than requiredMinToStart else stuff won't work.<a name="line.775"></a>
-<span class="sourceLineNo">776</span>    return minToStart == -1 || minToStart &lt; requiredMinToStart? requiredMinToStart: minToStart;<a name="line.776"></a>
-<span class="sourceLineNo">777</span>  }<a name="line.777"></a>
-<span class="sourceLineNo">778</span><a name="line.778"></a>
-<span class="sourceLineNo">779</span>  /**<a name="line.779"></a>
-<span class="sourceLineNo">780</span>   * Wait for the region servers to report in.<a name="line.780"></a>
-<span class="sourceLineNo">781</span>   * We will wait until one of this condition is met:<a name="line.781"></a>
-<span class="sourceLineNo">782</span>   *  - the master is stopped<a name="line.782"></a>
-<span class="sourceLineNo">783</span>   *  - the 'hbase.master.wait.on.regionservers.maxtostart' number of<a name="line.783"></a>
-<span class="sourceLineNo">784</span>   *    region servers is reached<a name="line.784"></a>
-<span class="sourceLineNo">785</span>   *  - the 'hbase.master.wait.on.regionservers.mintostart' is reached AND<a name="line.785"></a>
-<span class="sourceLineNo">786</span>   *   there have been no new region server in for<a name="line.786"></a>
-<span class="sourceLineNo">787</span>   *      'hbase.master.wait.on.regionservers.interval' time AND<a name="line.787"></a>
-<span class="sourceLineNo">788</span>   *   the 'hbase.master.wait.on.regionservers.timeout' is reached<a name="line.788"></a>
-<span class="sourceLineNo">789</span>   *<a name="line.789"></a>
-<span class="sourceLineNo">790</span>   * @throws InterruptedException<a name="line.790"></a>
-<span class="sourceLineNo">791</span>   */<a name="line.791"></a>
-<span class="sourceLineNo">792</span>  public void waitForRegionServers(MonitoredTask status) throws InterruptedException {<a name="line.792"></a>
-<span class="sourceLineNo">793</span>    final long interval = this.master.getConfiguration().<a name="line.793"></a>
-<span class="sourceLineNo">794</span>        getLong(WAIT_ON_REGIONSERVERS_INTERVAL, 1500);<a name="line.794"></a>
-<span class="sourceLineNo">795</span>    final long timeout = this.master.getConfiguration().<a name="line.795"></a>
-<span class="sourceLineNo">796</span>        getLong(WAIT_ON_REGIONSERVERS_TIMEOUT, 4500);<a name="line.796"></a>
-<span class="sourceLineNo">797</span>    // Min is not an absolute; just a friction making us wait longer on server checkin.<a name="line.797"></a>
-<span class="sourceLineNo">798</span>    int minToStart = getMinToStart();<a name="line.798"></a>
-<span class="sourceLineNo">799</span>    int maxToStart = this.master.getConfiguration().<a name="line.799"></a>
-<span class="sourceLineNo">800</span>        getInt(WAIT_ON_REGIONSERVERS_MAXTOSTART, Integer.MAX_VALUE);<a name="line.800"></a>
-<span class="sourceLineNo">801</span>    if (maxToStart &lt; minToStart) {<a name="line.801"></a>
-<span class="sourceLineNo">802</span>      LOG.warn(String.format("The value of '%s' (%d) is set less than '%s' (%d), ignoring.",<a name="line.802"></a>
-<span class="sourceLineNo">803</span>          WAIT_ON_REGIONSERVERS_MAXTOSTART, maxToStart,<a name="line.803"></a>
-<span class="sourceLineNo">804</span>          WAIT_ON_REGIONSERVERS_MINTOSTART, minToStart));<a name="line.804"></a>
-<span class="sourceLineNo">805</span>      maxToStart = Integer.MAX_VALUE;<a name="line.805"></a>
-<span class="sourceLineNo">806</span>    }<a name="line.806"></a>
-<span class="sourceLineNo">807</span><a name="line.807"></a>
-<span class="sourceLineNo">808</span>    long now =  System.currentTimeMillis();<a name="line.808"></a>
-<span class="sourceLineNo">809</span>    final long startTime = now;<a name="line.809"></a>
-<span class="sourceLineNo">810</span>    long slept = 0;<a name="line.810"></a>
-<span class="sourceLineNo">811</span>    long lastLogTime = 0;<a name="line.811"></a>
-<span class="sourceLineNo">812</span>    long lastCountChange = startTime;<a name="line.812"></a>
-<span class="sourceLineNo">813</span>    int count = countOfRegionServers();<a name="line.813"></a>
-<span class="sourceLineNo">814</span>    int oldCount = 0;<a name="line.814"></a>
-<span class="sourceLineNo">815</span>    // This while test is a little hard to read. We try to comment it in below but in essence:<a name="line.815"></a>
-<span class="sourceLineNo">816</span>    // Wait if Master is not stopped and the number of regionservers that have checked-in is<a name="line.816"></a>
-<span class="sourceLineNo">817</span>    // less than the maxToStart. Both of these conditions will be true near universally.<a name="line.817"></a>
-<span class="sourceLineNo">818</span>    // Next, we will keep cycling if ANY of the following three conditions are true:<a name="line.818"></a>
-<span class="sourceLineNo">819</span>    // 1. The time since a regionserver registered is &lt; interval (means servers are actively checking in).<a name="line.819"></a>
-<span class="sourceLineNo">820</span>    // 2. We are under the total timeout.<a name="line.820"></a>
-<span class="sourceLineNo">821</span>    // 3. The count of servers is &lt; minimum.<a name="line.821"></a>
-<span class="sourceLineNo">822</span>    for (ServerListener listener: this.listeners) {<a name="line.822"></a>
-<span class="sourceLineNo">823</span>      listener.waiting();<a name="line.823"></a>
-<span class="sourceLineNo">824</span>    }<a name="line.824"></a>
-<span class="sourceLineNo">825</span>    while (!this.master.isStopped() &amp;&amp; !isClusterShutdown() &amp;&amp; count &lt; maxToStart &amp;&amp;<a name="line.825"></a>
-<span class="sourceLineNo">826</span>        ((lastCountChange + interval) &gt; now || timeout &gt; slept || count &lt; minToStart)) {<a name="line.826"></a>
-<span class="sourceLineNo">827</span>      // Log some info at every interval time or if there is a change<a name="line.827"></a>
-<span class="sourceLineNo">828</span>      if (oldCount != count || lastLogTime + interval &lt; now) {<a name="line.828"></a>
-<span class="sourceLineNo">829</span>        lastLogTime = now;<a name="line.829"></a>
-<span class="sourceLineNo">830</span>        String msg =<a name="line.830"></a>
-<span class="sourceLineNo">831</span>            "Waiting on regionserver count=" + count + "; waited="+<a name="line.831"></a>
-<span class="sourceLineNo">832</span>                slept + "ms, expecting min=" + minToStart + " server(s), max="+ getStrForMax(maxToStart) +<a name="line.832"></a>
-<span class="sourceLineNo">833</span>                " server(s), " + "timeout=" + timeout + "ms, lastChange=" + (lastCountChange - now) + "ms";<a name="line.833"></a>
-<span class="sourceLineNo">834</span>        LOG.info(msg);<a name="line.834"></a>
-<span class="sourceLineNo">835</span>        status.setStatus(msg);<a name="line.835"></a>
-<span class="sourceLineNo">836</span>      }<a name="line.836"></a>
-<span class="sourceLineNo">837</span><a name="line.837"></a>
-<span class="sourceLineNo">838</span>      // We sleep for some time<a name="line.838"></a>
-<span class="sourceLineNo">839</span>      final long sleepTime = 50;<a name="line.839"></a>
-<span class="sourceLineNo">840</span>      Thread.sleep(sleepTime);<a name="line.840"></a>
-<span class="sourceLineNo">841</span>      now =  System.currentTimeMillis();<a name="line.841"></a>
-<span class="sourceLineNo">842</span>      slept = now - startTime;<a name="line.842"></a>
-<span class="sourceLineNo">843</span><a name="line.843"></a>
-<span class="sourceLineNo">844</span>      oldCount = count;<a name="line.844"></a>
-<span class="sourceLineNo">845</span>      count = countOfRegionServers();<a name="line.845"></a>
-<span class="sourceLineNo">846</span>      if (count != oldCount) {<a name="line.846"></a>
-<span class="sourceLineNo">847</span>        lastCountChange = now;<a name="line.847"></a>
-<span class="sourceLineNo">848</span>      }<a name="line.848"></a>
-<span class="sourceLineNo">849</span>    }<a name="line.849"></a>
-<span class="sourceLineNo">850</span>    // Did we exit the loop because cluster is going down?<a name="line.850"></a>
-<span class="sourceLineNo">851</span>    if (isClusterShutdown()) {<a name="line.851"></a>
-<span class="sourceLineNo">852</span>      this.master.stop("Cluster shutdown");<a name="line.852"></a>
-<span class="sourceLineNo">853</span>    }<a name="line.853"></a>
-<span class="sourceLineNo">854</span>    LOG.info("Finished waiting on RegionServer count=" + count + "; waited=" + slept + "ms," +<a name="line.854"></a>
-<span class="sourceLineNo">855</span>        " expected min=" + minToStart + " server(s), max=" +  getStrForMax(maxToStart) + " server(s),"+<a name="line.855"></a>
-<span class="sourceLineNo">856</span>        " master is "+ (this.master.isStopped() ? "stopped.": "running"));<a name="line.856"></a>
-<span class="sourceLineNo">857</span>  }<a name="line.857"></a>
-<span class="sourceLineNo">858</span><a name="line.858"></a>
-<span class="sourceLineNo">859</span>  private String getStrForMax(final int max) {<a name="line.859"></a>
-<span class="sourceLineNo">860</span>    return max == Integer.MAX_VALUE? "NO_LIMIT": Integer.toString(max);<a name="line.860"></a>
-<span class="sourceLineNo">861</span>  }<a name="line.861"></a>
-<span class="sourceLineNo">862</span><a name="line.862"></a>
-<span class="sourceLineNo">863</span>  /**<a name="line.863"></a>
-<span class="sourceLineNo">864</span>   * @return A copy of the internal list of online servers.<a name="line.864"></a>
-<span class="sourceLineNo">865</span>   */<a name="line.865"></a>
-<span class="sourceLineNo">866</span>  public List&lt;ServerName&gt; getOnlineServersList() {<a name="line.866"></a>
-<span class="sourceLineNo">867</span>    // TODO: optimize the load balancer call so we don't need to make a new list<a name="line.867"></a>
-<span class="sourceLineNo">868</span>    // TODO: FIX. THIS IS POPULAR CALL.<a name="line.868"></a>
-<span class="sourceLineNo">869</span>    return new ArrayList&lt;&gt;(this.onlineServers.keySet());<a name="line.869"></a>
-<span class="sourceLineNo">870</span>  }<a name="line.870"></a>
-<span class="sourceLineNo">871</span><a name="line.871"></a>
-<span class="sourceLineNo">872</span>  /**<a name="line.872"></a>
-<span class="sourceLineNo">873</span>   * @param keys The target server name<a name="line.873"></a>
-<span class="sourceLineNo">874</span>   * @param idleServerPredicator Evaluates the server on the given load<a name="line.874"></a>
-<span class="sourceLineNo">875</span>   * @return A copy of the internal list of online servers matched by the predicator<a name="line.875"></a>
-<span class="sourceLineNo">876</span>   */<a name="line.876"></a>
-<span class="sourceLineNo">877</span>  public List&lt;ServerName&gt; getOnlineServersListWithPredicator(List&lt;ServerName&gt; keys,<a name="line.877"></a>
-<span class="sourceLineNo">878</span>    Predicate&lt;ServerMetrics&gt; idleServerPredicator) {<a name="line.878"></a>
-<span class="sourceLineNo">879</span>    List&lt;ServerName&gt; names = new ArrayList&lt;&gt;();<a name="line.879"></a>
-<span class="sourceLineNo">880</span>    if (keys != null &amp;&amp; idleServerPredicator != null) {<a name="line.880"></a>
-<span class="sourceLineNo">881</span>      keys.forEach(name -&gt; {<a name="line.881"></a>
-<span class="sourceLineNo">882</span>        ServerMetrics load = onlineServers.get(name);<a name="line.882"></a>
-<span class="sourceLineNo">883</span>        if (load != null) {<a name="line.883"></a>
-<span class="sourceLineNo">884</span>          if (idleServerPredicator.test(load)) {<a name="line.884"></a>
-<span class="sourceLineNo">885</span>            names.add(name);<a name="line.885"></a>
-<span class="sourceLineNo">886</span>          }<a name="line.886"></a>
-<span class="sourceLineNo">887</span>        }<a name="line.887"></a>
-<span class="sourceLineNo">888</span>      });<a name="line.888"></a>
-<span class="sourceLineNo">889</span>    }<a name="line.889"></a>
-<span class="sourceLineNo">890</span>    return names;<a name="line.890"></a>
-<span class="sourceLineNo">891</span>  }<a name="line.891"></a>
-<span class="sourceLineNo">892</span><a name="line.892"></a>
-<span class="sourceLineNo">893</span>  /**<a name="line.893"></a>
-<span class="sourceLineNo">894</span>   * @return A copy of the internal list of draining servers.<a name="line.894"></a>
-<span class="sourceLineNo">895</span>   */<a name="line.895"></a>
-<span class="sourceLineNo">896</span>  public List&lt;ServerName&gt; getDrainingServersList() {<a name="line.896"></a>
-<span class="sourceLineNo">897</span>    return new ArrayList&lt;&gt;(this.drainingServers);<a name="line.897"></a>
-<span class="sourceLineNo">898</span>  }<a name="line.898"></a>
-<span class="sourceLineNo">899</span><a name="line.899"></a>
-<span class="sourceLineNo">900</span>  public boolean isServerOnline(ServerName serverName) {<a name="line.900"></a>
-<span class="sourceLineNo">901</span>    return serverName != null &amp;&amp; onlineServers.containsKey(serverName);<a name="line.901"></a>
-<span class="sourceLineNo">902</span>  }<a name="line.902"></a>
-<span class="sourceLineNo">903</span><a name="line.903"></a>
-<span class="sourceLineNo">904</span>  /**<a name="line.904"></a>
-<span class="sourceLineNo">905</span>   * Check if a server is known to be dead.  A server can be online,<a name="line.905"></a>
-<span class="sourceLineNo">906</span>   * or known to be dead, or unknown to this manager (i.e, not online,<a name="line.906"></a>
-<span class="sourceLineNo">907</span>   * not known to be dead either. it is simply not tracked by the<a name="line.907"></a>
-<span class="sourceLineNo">908</span>   * master any more, for example, a very old previous instance).<a name="line.908"></a>
-<span class="sourceLineNo">909</span>   */<a name="line.909"></a>
-<span class="sourceLineNo">910</span>  public synchronized boolean isServerDead(ServerName serverName) {<a name="line.910"></a>
-<span class="sourceLineNo">911</span>    return serverName == null || deadservers.isDeadServer(serverName);<a name="line.911"></a>
-<span class="sourceLineNo">912</span>  }<a name="line.912"></a>
-<span class="sourceLineNo">913</span><a name="line.913"></a>
-<span class="sourceLineNo">914</span>  public void shutdownCluster() {<a name="line.914"></a>
-<span class="sourceLineNo">915</span>    String statusStr = "Cluster shutdown requested of master=" + this.master.getServerName();<a name="line.915"></a>
-<span class="sourceLineNo">916</span>    LOG.info(statusStr);<a name="line.916"></a>
-<span class="sourceLineNo">917</span>    this.clusterShutdown.set(true);<a name="line.917"></a>
-<span class="sourceLineNo">918</span>    if (onlineServers.isEmpty()) {<a name="line.918"></a>
-<span class="sourceLineNo">919</span>      // we do not synchronize here so this may cause a double stop, but not a big deal<a name="line.919"></a>
-<span class="sourceLineNo">920</span>      master.stop("OnlineServer=0 right after cluster shutdown set");<a name="line.920"></a>
-<span class="sourceLineNo">921</span>    }<a name="line.921"></a>
-<span class="sourceLineNo">922</span>  }<a name="line.922"></a>
-<span class="sourceLineNo">923</span><a name="line.923"></a>
-<span class="sourceLineNo">924</span>  public boolean isClusterShutdown() {<a name="line.924"></a>
-<span class="sourceLineNo">925</span>    return this.clusterShutdown.get();<a name="line.925"></a>
-<span class="sourceLineNo">926</span>  }<a name="line.926"></a>
-<span class="sourceLineNo">927</span><a name="line.927"></a>
-<span class="sourceLineNo">928</span>  /**<a name="line.928"></a>
-<span class="sourceLineNo">929</span>   * start chore in ServerManager<a name="line.929"></a>
-<span class="sourceLineNo">930</span>   */<a name="line.930"></a>
-<span class="sourceLineNo">931</span>  public void startChore() {<a name="line.931"></a>
-<span class="sourceLineNo">932</span>    Configuration c = master.getConfiguration();<a name="line.932"></a>
-<span class="sourceLineNo">933</span>    if (persistFlushedSequenceId) {<a name="line.933"></a>
-<span class="sourceLineNo">934</span>      // when reach here, RegionStates should loaded, firstly, we call remove deleted regions<a name="line.934"></a>
-<span class="sourceLineNo">935</span>      removeDeletedRegionFromLoadedFlushedSequenceIds();<a name="line.935"></a>
-<span class="sourceLineNo">936</span>      int flushPeriod = c.getInt(FLUSHEDSEQUENCEID_FLUSHER_INTERVAL,<a name="line.936"></a>
-<span class="sourceLineNo">937</span>          FLUSHEDSEQUENCEID_FLUSHER_INTERVAL_DEFAULT);<a name="line.937"></a>
-<span class="sourceLineNo">938</span>      flushedSeqIdFlusher = new FlushedSequenceIdFlusher(<a name="line.938"></a>
-<span class="sourceLineNo">939</span>          "FlushedSequenceIdFlusher", flushPeriod);<a name="line.939"></a>
-<span class="sourceLineNo">940</span>      master.getChoreService().scheduleChore(flushedSeqIdFlusher);<a name="line.940"></a>
-<span class="sourceLineNo">941</span>    }<a name="line.941"></a>
-<span class="sourceLineNo">942</span>  }<a name="line.942"></a>
-<span class="sourceLineNo">943</span><a name="line.943"></a>
-<span class="sourceLineNo">944</span>  /**<a name="line.944"></a>
-<span class="sourceLineNo">945</span>   * Stop the ServerManager.<a name="line.945"></a>
-<span class="sourceLineNo">946</span>   */<a name="line.946"></a>
-<span class="sourceLineNo">947</span>  public void stop() {<a name="line.947"></a>
-<span class="sourceLineNo">948</span>    if (flushedSeqIdFlusher != null) {<a name="line.948"></a>
-<span class="sourceLineNo">949</span>      flushedSeqIdFlusher.cancel();<a name="line.949"></a>
-<span class="sourceLineNo">950</span>    }<a name="line.950"></a>
-<span class="sourceLineNo">951</span>    if (persistFlushedSequenceId) {<a name="line.951"></a>
-<span class="sourceLineNo">952</span>      try {<a name="line.952"></a>
-<span class="sourceLineNo">953</span>        persistRegionLastFlushedSequenceIds();<a name="line.953"></a>
-<span class="sourceLineNo">954</span>      } catch (IOException e) {<a name="line.954"></a>
-<span class="sourceLineNo">955</span>        LOG.warn("Failed to persist last flushed sequence id of regions"<a name="line.955"></a>
-<span class="sourceLineNo">956</span>            + " to file system", e);<a name="line.956"></a>
-<span class="sourceLineNo">957</span>      }<a name="line.957"></a>
-<span class="sourceLineNo">958</span>    }<a name="line.958"></a>
-<span class="sourceLineNo">959</span>  }<a name="line.959"></a>
-<span class="sourceLineNo">960</span><a name="line.960"></a>
-<span class="sourceLineNo">961</span>  /**<a name="line.961"></a>
-<span class="sourceLineNo">962</span>   * Creates a list of possible destinations for a region. It contains the online servers, but not<a name="line.962"></a>
-<span class="sourceLineNo">963</span>   *  the draining or dying servers.<a name="line.963"></a>
-<span class="sourceLineNo">964</span>   *  @param serversToExclude can be null if there is no server to exclude<a name="line.964"></a>
-<span class="sourceLineNo">965</span>   */<a name="line.965"></a>
-<span class="sourceLineNo">966</span>  public List&lt;ServerName&gt; createDestinationServersList(final List&lt;ServerName&gt; serversToExclude){<a name="line.966"></a>
-<span class="sourceLineNo">967</span>    final List&lt;ServerName&gt; destServers = getOnlineServersList();<a name="line.967"></a>
-<span class="sourceLineNo">968</span><a name="line.968"></a>
-<span class="sourceLineNo">969</span>    if (serversToExclude != null) {<a name="line.969"></a>
-<span class="sourceLineNo">970</span>      destServers.removeAll(serversToExclude);<a name="line.970"></a>
-<span class="sourceLineNo">971</span>    }<a name="line.971"></a>
-<span class="sourceLineNo">972</span><a name="line.972"></a>
-<span class="sourceLineNo">973</span>    // Loop through the draining server list and remove them from the server list<a name="line.973"></a>
-<span class="sourceLineNo">974</span>    final List&lt;ServerName&gt; drainingServersCopy = getDrainingServersList();<a name="line.974"></a>
-<span class="sourceLineNo">975</span>    destServers.removeAll(drainingServersCopy);<a name="line.975"></a>
-<span class="sourceLineNo">976</span><a name="line.976"></a>
-<span class="sourceLineNo">977</span>    return destServers;<a name="line.977"></a>
-<span class="sourceLineNo">978</span>  }<a name="line.978"></a>
+<span class="sourceLineNo">764</span>    if (master.isInMaintenanceMode()) {<a name="line.764"></a>
+<span class="sourceLineNo">765</span>      // If in maintenance mode, then master hosting meta will be the only server available<a name="line.765"></a>
+<span class="sourceLineNo">766</span>      return 1;<a name="line.766"></a>
+<span class="sourceLineNo">767</span>    }<a name="line.767"></a>
+<span class="sourceLineNo">768</span><a name="line.768"></a>
+<span class="sourceLineNo">769</span>    int minimumRequired = 1;<a name="line.769"></a>
+<span class="sourceLineNo">770</span>    if (LoadBalancer.isTablesOnMaster(master.getConfiguration()) &amp;&amp;<a name="line.770"></a>
+<span class="sourceLineNo">771</span>        LoadBalancer.isSystemTablesOnlyOnMaster(master.getConfiguration())) {<a name="line.771"></a>
+<span class="sourceLineNo">772</span>      // If Master is carrying regions it will show up as a 'server', but is not handling user-<a name="line.772"></a>
+<span class="sourceLineNo">773</span>      // space regions, so we need a second server.<a name="line.773"></a>
+<span class="sourceLineNo">774</span>      minimumRequired = 2;<a name="line.774"></a>
+<span class="sourceLineNo">775</span>    }<a name="line.775"></a>
+<span class="sourceLineNo">776</span><a name="line.776"></a>
+<span class="sourceLineNo">777</span>    int minToStart = this.master.getConfiguration().getInt(WAIT_ON_REGIONSERVERS_MINTOSTART, -1);<a name="line.777"></a>
+<span class="sourceLineNo">778</span>    // Ensure we are never less than minimumRequired else stuff won't work.<a name="line.778"></a>
+<span class="sourceLineNo">779</span>    return Math.max(minToStart, minimumRequired);<a name="line.779"></a>
+<span class="sourceLineNo">780</span>  }<a name="line.780"></a>
+<span class="sourceLineNo">781</span><a name="line.781"></a>
+<span class="sourceLineNo">782</span>  /**<a name="line.782"></a>
+<span class="sourceLineNo">783</span>   * Wait for the region servers to report in.<a name="line.783"></a>
+<span class="sourceLineNo">784</span>   * We will wait until one of this condition is met:<a name="line.784"></a>
+<span class="sourceLineNo">785</span>   *  - the master is stopped<a name="line.785"></a>
+<span class="sourceLineNo">786</span>   *  - the 'hbase.master.wait.on.regionservers.maxtostart' number of<a name="line.786"></a>
+<span class="sourceLineNo">787</span>   *    region servers is reached<a name="line.787"></a>
+<span class="sourceLineNo">788</span>   *  - the 'hbase.master.wait.on.regionservers.mintostart' is reached AND<a name="line.788"></a>
+<span class="sourceLineNo">789</span>   *   there have been no new region server in for<a name="line.789"></a>
+<span class="sourceLineNo">790</span>   *      'hbase.master.wait.on.regionservers.interval' time AND<a name="line.790"></a>
+<span class="sourceLineNo">791</span>   *   the 'hbase.master.wait.on.regionservers.timeout' is reached<a name="line.791"></a>
+<span class="sourceLineNo">792</span>   *<a name="line.792"></a>
+<span class="sourceLineNo">793</span>   * @throws InterruptedException<a name="line.793"></a>
+<span class="sourceLineNo">794</span>   */<a name="line.794"></a>
+<span class="sourceLineNo">795</span>  public void waitForRegionServers(MonitoredTask status) throws InterruptedException {<a name="line.795"></a>
+<span class="sourceLineNo">796</span>    final long interval = this.master.getConfiguration().<a name="line.796"></a>
+<span class="sourceLineNo">797</span>        getLong(WAIT_ON_REGIONSERVERS_INTERVAL, 1500);<a name="line.797"></a>
+<span class="sourceLineNo">798</span>    final long timeout = this.master.getConfiguration().<a name="line.798"></a>
+<span class="sourceLineNo">799</span>        getLong(WAIT_ON_REGIONSERVERS_TIMEOUT, 4500);<a name="line.799"></a>
+<span class="sourceLineNo">800</span>    // Min is not an absolute; just a friction making us wait longer on server checkin.<a name="line.800"></a>
+<span class="sourceLineNo">801</span>    int minToStart = getMinToStart();<a name="line.801"></a>
+<span class="sourceLineNo">802</span>    int maxToStart = this.master.getConfiguration().<a name="line.802"></a>
+<span class="sourceLineNo">803</span>        getInt(WAIT_ON_REGIONSERVERS_MAXTOSTART, Integer.MAX_VALUE);<a name="line.803"></a>
+<span class="sourceLineNo">804</span>    if (maxToStart &lt; minToStart) {<a name="line.804"></a>
+<span class="sourceLineNo">805</span>      LOG.warn(String.format("The value of '%s' (%d) is set less than '%s' (%d), ignoring.",<a name="line.805"></a>
+<span class="sourceLineNo">806</span>          WAIT_ON_REGIONSERVERS_MAXTOSTART, maxToStart,<a name="line.806"></a>
+<span class="sourceLineNo">807</span>          WAIT_ON_REGIONSERVERS_MINTOSTART, minToStart));<a name="line.807"></a>
+<span class="sourceLineNo">808</span>      maxToStart = Integer.MAX_VALUE;<a name="line.808"></a>
+<span class="sourceLineNo">809</span>    }<a name="line.809"></a>
+<span class="sourceLineNo">810</span><a name="line.810"></a>
+<span class="sourceLineNo">811</span>    long now =  System.currentTimeMillis();<a name="line.811"></a>
+<span class="sourceLineNo">812</span>    final long startTime = now;<a name="line.812"></a>
+<span class="sourceLineNo">813</span>    long slept = 0;<a name="line.813"></a>
+<span class="sourceLineNo">814</span>    long lastLogTime = 0;<a name="line.814"></a>
+<span class="sourceLineNo">815</span>    long lastCountChange = startTime;<a name="line.815"></a>
+<span class="sourceLineNo">816</span>    int count = countOfRegionServers();<a name="line.816"></a>
+<span class="sourceLineNo">817</span>    int oldCount = 0;<a name="line.817"></a>
+<span class="sourceLineNo">818</span>    // This while test is a little hard to read. We try to comment it in below but in essence:<a name="line.818"></a>
+<span class="sourceLineNo">819</span>    // Wait if Master is not stopped and the number of regionservers that have checked-in is<a name="line.819"></a>
+<span class="sourceLineNo">820</span>    // less than the maxToStart. Both of these conditions will be true near universally.<a name="line.820"></a>
+<span class="sourceLineNo">821</span>    // Next, we will keep cycling if ANY of the following three conditions are true:<a name="line.821"></a>
+<span class="sourceLineNo">822</span>    // 1. The time since a regionserver registered is &lt; interval (means servers are actively checking in).<a name="line.822"></a>
+<span class="sourceLineNo">823</span>    // 2. We are under the total timeout.<a name="line.823"></a>
+<span class="sourceLineNo">824</span>    // 3. The count of servers is &lt; minimum.<a name="line.824"></a>
+<span class="sourceLineNo">825</span>    for (ServerListener listener: this.listeners) {<a name="line.825"></a>
+<span class="sourceLineNo">826</span>      listener.waiting();<a name="line.826"></a>
+<span class="sourceLineNo">827</span>    }<a name="line.827"></a>
+<span class="sourceLineNo">828</span>    while (!this.master.isStopped() &amp;&amp; !isClusterShutdown() &amp;&amp; count &lt; maxToStart &amp;&amp;<a name="line.828"></a>
+<span class="sourceLineNo">829</span>        ((lastCountChange + interval) &gt; now || timeout &gt; slept || count &lt; minToStart)) {<a name="line.829"></a>
+<span class="sourceLineNo">830</span>      // Log some info at every interval time or if there is a change<a name="line.830"></a>
+<span class="sourceLineNo">831</span>      if (oldCount != count || lastLogTime + interval &lt; now) {<a name="line.831"></a>
+<span class="sourceLineNo">832</span>        lastLogTime = now;<a name="line.832"></a>
+<span class="sourceLineNo">833</span>        String msg =<a name="line.833"></a>
+<span class="sourceLineNo">834</span>            "Waiting on regionserver count=" + count + "; waited="+<a name="line.834"></a>
+<span class="sourceLineNo">835</span>                slept + "ms, expecting min=" + minToStart + " server(s), max="+ getStrForMax(maxToStart) +<a name="line.835"></a>
+<span class="sourceLineNo">836</span>                " server(s), " + "timeout=" + timeout + "ms, lastChange=" + (lastCountChange - now) + "ms";<a name="line.836"></a>
+<span class="sourceLineNo">837</span>        LOG.info(msg);<a name="line.837"></a>
+<span class="sourceLineNo">838</span>        status.setStatus(msg);<a name="line.838"></a>
+<span class="sourceLineNo">839</span>      }<a name="line.839"></a>
+<span class="sourceLineNo">840</span><a name="line.840"></a>
+<span class="sourceLineNo">841</span>      // We sleep for some time<a name="line.841"></a>
+<span class="sourceLineNo">842</span>      final long sleepTime = 50;<a name="line.842"></a>
+<span class="sourceLineNo">843</span>      Thread.sleep(sleepTime);<a name="line.843"></a>
+<span class="sourceLineNo">844</span>      now =  System.currentTimeMillis();<a name="line.844"></a>
+<span class="sourceLineNo">845</span>      slept = now - startTime;<a name="line.845"></a>
+<span class="sourceLineNo">846</span><a name="line.846"></a>
+<span class="sourceLineNo">847</span>      oldCount = count;<a name="line.847"></a>
+<span class="sourceLineNo">848</span>      count = countOfRegionServers();<a name="line.848"></a>
+<span class="sourceLineNo">849</span>      if (count != oldCount) {<a name="line.849"></a>
+<span class="sourceLineNo">850</span>        lastCountChange = now;<a name="line.850"></a>
+<span class="sourceLineNo">851</span>      }<a name="line.851"></a>
+<span class="sourceLineNo">852</span>    }<a name="line.852"></a>
+<span class="sourceLineNo">853</span>    // Did we exit the loop because cluster is going down?<a name="line.853"></a>
+<span class="sourceLineNo">854</span>    if (isClusterShutdown()) {<a name="line.854"></a>
+<span class="sourceLineNo">855</span>      this.master.stop("Cluster shutdown");<a name="line.855"></a>
+<span class="sourceLineNo">856</span>    }<a name="line.856"></a>
+<span class="sourceLineNo">857</span>    LOG.info("Finished waiting on RegionServer count=" + count + "; waited=" + slept + "ms," +<a name="line.857"></a>
+<span class="sourceLineNo">858</span>        " expected min=" + minToStart + " server(s), max=" +  getStrForMax(maxToStart) + " server(s),"+<a name="line.858"></a>
+<span class="sourceLineNo">859</span>        " master is "+ (this.master.isStopped() ? "stopped.": "running"));<a name="line.859"></a>
+<span class="sourceLineNo">860</span>  }<a name="line.860"></a>
+<span class="sourceLineNo">861</span><a name="line.861"></a>
+<span class="sourceLineNo">862</span>  private String getStrForMax(final int max) {<a name="line.862"></a>
+<span class="sourceLineNo">863</span>    return max == Integer.MAX_VALUE? "NO_LIMIT": Integer.toString(max);<a name="line.863"></a>
+<span class="sourceLineNo">864</span>  }<a name="line.864"></a>
+<span class="sourceLineNo">865</span><a name="line.865"></a>
+<span class="sourceLineNo">866</span>  /**<a name="line.866"></a>
+<span class="sourceLineNo">867</span>   * @return A copy of the internal list of online servers.<a name="line.867"></a>
+<span class="sourceLineNo">868</span>   */<a name="line.868"></a>
+<span class="sourceLineNo">869</span>  public List&lt;ServerName&gt; getOnlineServersList() {<a name="line.869"></a>
+<span class="sourceLineNo">870</span>    // TODO: optimize the load balancer call so we don't need to make a new list<a name="line.870"></a>
+<span class="sourceLineNo">871</span>    // TODO: FIX. THIS IS POPULAR CALL.<a name="line.871"></a>
+<span class="sourceLineNo">872</span>    return new ArrayList&lt;&gt;(this.onlineServers.keySet());<a name="line.872"></a>
+<span class="sourceLineNo">873</span>  }<a name="line.873"></a>
+<span class="sourceLineNo">874</span><a name="line.874"></a>
+<span class="sourceLineNo">875</span>  /**<a name="line.875"></a>
+<span class="sourceLineNo">876</span>   * @param keys The target server name<a name="line.876"></a>
+<span class="sourceLineNo">877</span>   * @param idleServerPredicator Evaluates the server on the given load<a name="line.877"></a>
+<span class="sourceLineNo">878</span>   * @return A copy of the internal list of online servers matched by the predicator<a name="line.878"></a>
+<span class="sourceLineNo">879</span>   */<a name="line.879"></a>
+<span class="sourceLineNo">880</span>  public List&lt;ServerName&gt; getOnlineServersListWithPredicator(List&lt;ServerName&gt; keys,<a name="line.880"></a>
+<span class="sourceLineNo">881</span>    Predicate&lt;ServerMetrics&gt; idleServerPredicator) {<a name="line.881"></a>
+<span class="sourceLineNo">882</span>    List&lt;ServerName&gt; names = new ArrayList&lt;&gt;();<a name="line.882"></a>
+<span class="sourceLineNo">883</span>    if (keys != null &amp;&amp; idleServerPredicator != null) {<a name="line.883"></a>
+<span class="sourceLineNo">884</span>      keys.forEach(name -&gt; {<a name="line.884"></a>
+<span class="sourceLineNo">885</span>        ServerMetrics load = onlineServers.get(name);<a name="line.885"></a>
+<span class="sourceLineNo">886</span>        if (load != null) {<a name="line.886"></a>
+<span class="sourceLineNo">887</span>          if (idleServerPredicator.test(load)) {<a name="line.887"></a>
+<span class="sourceLineNo">888</span>            names.add(name);<a name="line.888"></a>
+<span class="sourceLineNo">889</span>          }<a name="line.889"></a>
+<span class="sourceLineNo">890</span>        }<a name="line.890"></a>
+<span class="sourceLineNo">891</span>      });<a name="line.891"></a>
+<span class="sourceLineNo">892</span>    }<a name="line.892"></a>
+<span class="sourceLineNo">893</span>    return names;<a name="line.893"></a>
+<span class="sourceLineNo">894</span>  }<a name="line.894"></a>
+<span class="sourceLineNo">895</span><a name="line.895"></a>
+<span class="sourceLineNo">896</span>  /**<a name="line.896"></a>
+<span class="sourceLineNo">897</span>   * @return A copy of the internal list of draining servers.<a name="line.897"></a>
+<span class="sourceLineNo">898</span>   */<a name="line.898"></a>
+<span class="sourceLineNo">899</span>  public List&lt;ServerName&gt; getDrainingServersList() {<a name="line.899"></a>
+<span class="sourceLineNo">900</span>    return new ArrayList&lt;&gt;(this.drainingServers);<a name="line.900"></a>
+<span class="sourceLineNo">901</span>  }<a name="line.901"></a>
+<span class="sourceLineNo">902</span><a name="line.902"></a>
+<span class="sourceLineNo">903</span>  public boolean isServerOnline(ServerName serverName) {<a name="line.903"></a>
+<span class="sourceLineNo">904</span>    return serverName != null &amp;&amp; onlineServers.containsKey(serverName);<a name="line.904"></a>
+<span class="sourceLineNo">905</span>  }<a name="line.905"></a>
+<span class="sourceLineNo">906</span><a name="line.906"></a>
+<span class="sourceLineNo">907</span>  /**<a name="line.907"></a>
+<span class="sourceLineNo">908</span>   * Check if a server is known to be dead.  A server can be online,<a name="line.908"></a>
+<span class="sourceLineNo">909</span>   * or known to be dead, or unknown to this manager (i.e, not online,<a name="line.909"></a>
+<span class="sourceLineNo">910</span>   * not known to be dead either. it is simply not tracked by the<a name="line.910"></a>
+<span class="sourceLineNo">911</span>   * master any more, for example, a very old previous instance).<a name="line.911"></a>
+<span class="sourceLineNo">912</span>   */<a name="line.912"></a>
+<span class="sourceLineNo">913</span>  public synchronized boolean isServerDead(ServerName serverName) {<a name="line.913"></a>
+<span class="sourceLineNo">914</span>    return serverName == null || deadservers.isDeadServer(serverName);<a name="line.914"></a>
+<span class="sourceLineNo">915</span>  }<a name="line.915"></a>
+<span class="sourceLineNo">916</span><a name="line.916"></a>
+<span class="sourceLineNo">917</span>  public void shutdownCluster() {<a name="line.917"></a>
+<span class="sourceLineNo">918</span>    String statusStr = "Cluster shutdown requested of master=" + this.master.getServerName();<a name="line.918"></a>
+<span class="sourceLineNo">919</span>    LOG.info(statusStr);<a name="line.919"></a>
+<span class="sourceLineNo">920</span>    this.clusterShutdown.set(true);<a name="line.920"></a>
+<span class="sourceLineNo">921</span>    if (onlineServers.isEmpty()) {<a name="line.921"></a>
+<span class="sourceLineNo">922</span>      // we do not synchronize here so this may cause a double stop, but not a big deal<a name="line.922"></a>
+<span class="sourceLineNo">923</span>      master.stop("OnlineServer=0 right after cluster shutdown set");<a name="line.923"></a>
+<span class="sourceLineNo">924</span>    }<a name="line.924"></a>
+<span class="sourceLineNo">925</span>  }<a name="line.925"></a>
+<span class="sourceLineNo">926</span><a name="line.926"></a>
+<span class="sourceLineNo">927</span>  public boolean isClusterShutdown() {<a name="line.927"></a>
+<span class="sourceLineNo">928</span>    return this.clusterShutdown.get();<a name="line.928"></a>
+<span class="sourceLineNo">929</span>  }<a name="line.929"></a>
+<span class="sourceLineNo">930</span><a name="line.930"></a>
+<span class="sourceLineNo">931</span>  /**<a name="line.931"></a>
+<span class="sourceLineNo">932</span>   * start chore in ServerManager<a name="line.932"></a>
+<span class="sourceLineNo">933</span>   */<a name="line.933"></a>
+<span class="sourceLineNo">934</span>  public void startChore() {<a name="line.934"></a>
+<span class="sourceLineNo">935</span>    Configuration c = master.getConfiguration();<a name="line.935"></a>
+<span class="sourceLineNo">936</span>    if (persistFlushedSequenceId) {<a name="line.936"></a>
+<span class="sourceLineNo">937</span>      // when reach here, RegionStates should loaded, firstly, we call remove deleted regions<a name="line.937"></a>
+<span class="sourceLineNo">938</span>      removeDeletedRegionFromLoadedFlushedSequenceIds();<a name="line.938"></a>
+<span class="sourceLineNo">939</span>      int flushPeriod = c.getInt(FLUSHEDSEQUENCEID_FLUSHER_INTERVAL,<a name="line.939"></a>
+<span class="sourceLineNo">940</span>          FLUSHEDSEQUENCEID_FLUSHER_INTERVAL_DEFAULT);<a name="line.940"></a>
+<span class="sourceLineNo">941</span>      flushedSeqIdFlusher = new FlushedSequenceIdFlusher(<a name="line.941"></a>
+<span class="sourceLineNo">942</span>          "FlushedSequenceIdFlusher", flushPeriod);<a name="line.942"></a>
+<span class="sourceLineNo">943</span>      master.getChoreService().scheduleChore(flushedSeqIdFlusher);<a name="line.943"></a>
+<span class="sourceLineNo">944</span>    }<a name="line.944"></a>
+<span class="sourceLineNo">945</span>  }<a name="line.945"></a>
+<span class="sourceLineNo">946</span><a name="line.946"></a>
+<span class="sourceLineNo">947</span>  /**<a name="line.947"></a>
+<span class="sourceLineNo">948</span>   * Stop the ServerManager.<a name="line.948"></a>
+<span class="sourceLineNo">949</span>   */<a name="line.949"></a>
+<span class="sourceLineNo">950</span>  public void stop() {<a name="line.950"></a>
+<span class="sourceLineNo">951</span>    if (flushedSeqIdFlusher != null) {<a name="line.951"></a>
+<span class="sourceLineNo">952</span>      flushedSeqIdFlusher.cancel();<a name="line.952"></a>
+<span class="sourceLineNo">953</span>    }<a name="line.953"></a>
+<span class="sourceLineNo">954</span>    if (persistFlushedSequenceId) {<a name="line.954"></a>
+<span class="sourceLineNo">955</span>      try {<a name="line.955"></a>
+<span class="sourceLineNo">956</span>        persistRegionLastFlushedSequenceIds();<a name="line.956"></a>
+<span class="sourceLineNo">957</span>      } catch (IOException e) {<a name="line.957"></a>
+<span class="sourceLineNo">958</span>        LOG.warn("Failed to persist last flushed sequence id of regions"<a name="line.958"></a>
+<span class="sourceLineNo">959</span>            + " to file system", e);<a name="line.959"></a>
+<span class="sourceLineNo">960</span>      }<a name="line.960"></a>
+<span class="sourceLineNo">961</span>    }<a name="line.961"></a>
+<span class="sourceLineNo">962</span>  }<a name="line.962"></a>
+<span class="sourceLineNo">963</span><a name="line.963"></a>
+<span class="sourceLineNo">964</span>  /**<a name="line.964"></a>
+<span class="sourceLineNo">965</span>   * Creates a list of possible destinations for a region. It contains the online servers, but not<a name="line.965"></a>
+<span class="sourceLineNo">966</span>   *  the draining or dying servers.<a name="line.966"></a>
+<span class="sourceLineNo">967</span>   *  @param serversToExclude can be null if there is no server to exclude<a name="line.967"></a>
+<span class="sourceLineNo">968</span>   */<a name="line.968"></a>
+<span class="sourceLineNo">969</span>  public List&lt;ServerName&gt; createDestinationServersList(final List&lt;ServerName&gt; serversToExclude){<a name="line.969"></a>
+<span class="sourceLineNo">970</span>    final List&lt;ServerName&gt; destServers = getOnlineServersList();<a name="line.970"></a>
+<span class="sourceLineNo">971</span><a name="line.971"></a>
+<span class="sourceLineNo">972</span>    if (serversToExclude != null) {<a name="line.972"></a>
+<span class="sourceLineNo">973</span>      destServers.removeAll(serversToExclude);<a name="line.973"></a>
+<span class="sourceLineNo">974</span>    }<a name="line.974"></a>
+<span class="sourceLineNo">975</span><a name="line.975"></a>
+<span class="sourceLineNo">976</span>    // Loop through the draining server list and remove them from the server list<a name="line.976"></a>
+<span class="sourceLineNo">977</span>    final List&lt;ServerName&gt; drainingServersCopy = getDrainingServersList();<a name="line.977"></a>
+<span class="sourceLineNo">978</span>    destServers.removeAll(drainingServersCopy);<a name="line.978"></a>
 <span class="sourceLineNo">979</span><a name="line.979"></a>
-<span class="sourceLineNo">980</span>  /**<a name="line.980"></a>
-<span class="sourceLineNo">981</span>   * Calls {@link #createDestinationServersList} without server to exclude.<a name="line.981"></a>
-<span class="sourceLineNo">982</span>   */<a name="line.982"></a>
-<span class="sourceLineNo">983</span>  public List&lt;ServerName&gt; createDestinationServersList(){<a name="line.983"></a>
-<span class="sourceLineNo">984</span>    return createDestinationServersList(null);<a name="line.984"></a>
-<span class="sourceLineNo">985</span>  }<a name="line.985"></a>
-<span class="sourceLineNo">986</span><a name="line.986"></a>
-<span class="sourceLineNo">987</span>  /**<a name="line.987"></a>
-<span class="sourceLineNo">988</span>   * To clear any dead server with same host name and port of any online server<a name="line.988"></a>
-<span class="sourceLineNo">989</span>   */<a name="line.989"></a>
-<span class="sourceLineNo">990</span>  void clearDeadServersWithSameHostNameAndPortOfOnlineServer() {<a name="line.990"></a>
-<span class="sourceLineNo">991</span>    for (ServerName serverName : getOnlineServersList()) {<a name="line.991"></a>
-<span class="sourceLineNo">992</span>      deadservers.cleanAllPreviousInstances(serverName);<a name="line.992"></a>
-<span class="sourceLineNo">993</span>    }<a name="line.993"></a>
-<span class="sourceLineNo">994</span>  }<a name="line.994"></a>
-<span class="sourceLineNo">995</span><a name="line.995"></a>
-<span class="sourceLineNo">996</span>  /**<a name="line.996"></a>
-<span class="sourceLineNo">997</span>   * Called by delete table and similar to notify the ServerManager that a region was removed.<a name="line.997"></a>
-<span class="sourceLineNo">998</span>   */<a name="line.998"></a>
-<span class="sourceLineNo">999</span>  public void removeRegion(final RegionInfo regionInfo) {<a name="line.999"></a>
-<span class="sourceLineNo">1000</span>    final byte[] encodedName = regionInfo.getEncodedNameAsBytes();<a name="line.1000"></a>
-<span class="sourceLineNo">1001</span>    storeFlushedSequenceIdsByRegion.remove(encodedName);<a name="line.1001"></a>
-<span class="sourceLineNo">1002</span>    flushedSequenceIdByRegion.remove(encodedName);<a name="line.1002"></a>
-<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>  @VisibleForTesting<a name="line.1005"></a>
-<span class="sourceLineNo">1006</span>  public boolean isRegionInServerManagerStates(final RegionInfo hri) {<a name="line.1006"></a>
-<span class="sourceLineNo">1007</span>    final byte[] encodedName = hri.getEncodedNameAsBytes();<a name="line.1007"></a>
-<span class="sourceLineNo">1008</span>    return (storeFlushedSequenceIdsByRegion.containsKey(encodedName)<a name="line.1008"></a>
-<span class="sourceLineNo">1009</span>        || flushedSequenceIdByRegion.containsKey(encodedName));<a name="line.1009"></a>
-<span class="sourceLineNo">1010</span>  }<a name="line.1010"></a>
-<span class="sourceLineNo">1011</span><a name="line.1011"></a>
-<span class="sourceLineNo">1012</span>  /**<a name="line.1012"></a>
-<span class="sourceLineNo">1013</span>   * Called by delete table and similar to notify the ServerManager that a region was removed.<a name="line.1013"></a>
-<span class="sourceLineNo">1014</span>   */<a name="line.1014"></a>
-<span class="sourceLineNo">1015</span>  public void removeRegions(final List&lt;RegionInfo&gt; regions) {<a name="line.1015"></a>
-<span class="sourceLineNo">1016</span>    for (RegionInfo hri: regions) {<a name="line.1016"></a>
-<span class="sourceLineNo">1017</span>      removeRegion(hri);<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><a name="line.1020"></a>
-<span class="sourceLineNo">1021</span>  /**<a name="line.1021"></a>
-<span class="sourceLineNo">1022</span>   * May return 0 when server is not online.<a name="line.1022"></a>
-<span class="sourceLineNo">1023</span>   */<a name="line.1023"></a>
-<span class="sourceLineNo">1024</span>  public int getVersionNumber(ServerName serverName) {<a name="line.1024"></a>
-<span class="sourceLineNo">1025</span>    ServerMetrics serverMetrics = onlineServers.get(serverName);<a name="line.1025"></a>
-<span class="sourceLineNo">1026</span>    return serverMetrics != null ? serverMetrics.getVersionNumber() : 0;<a name="line.1026"></a>
-<span class="sourceLineNo">1027</span>  }<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>   * May return "0.0.0" when server is not online<a name="line.1030"></a>
-<span class="sourceLineNo">1031</span>   */<a name="line.1031"></a>
-<span class="sourceLineNo">1032</span>  public String getVersion(ServerName serverName) {<a name="line.1032"></a>
-<span class="sourceLineNo">1033</span>    ServerMetrics serverMetrics = onlineServers.get(serverName);<a name="line.1033"></a>
-<span class="sourceLineNo">1034</span>    return serverMetrics != null ? serverMetrics.getVersion() : "0.0.0";<a name="line.1034"></a>
-<span class="sourceLineNo">1035</span>  }<a name="line.1035"></a>
-<span class="sourceLineNo">1036</span><a name="line.1036"></a>
-<span class="sourceLineNo">1037</span>  public int getInfoPort(ServerName serverName) {<a name="line.1037"></a>
-<span class="sourceLineNo">1038</span>    ServerMetrics serverMetrics = onlineServers.get(serverName);<a name="line.1038"></a>
-<span class="sourceLineNo">1039</span>    return serverMetrics != null ? serverMetrics.getInfoServerPort() : 0;<a name="line.1039"></a>
-<span class="sourceLineNo">1040</span>  }<a name="line.1040"></a>
-<span class="sourceLineNo">1041</span><a name="line.1041"></a>
-<span class="sourceLineNo">1042</span>  /**<a name="line.1042"></a>
-<span class="sourceLineNo">1043</span>   * Persist last flushed sequence id of each region to HDFS<a name="line.1043"></a>
-<span class="sourceLineNo">1044</span>   * @throws IOException if persit to HDFS fails<a name="line.1044"></a>
-<span class="sourceLineNo">1045</span>   */<a name="line.1045"></a>
-<span class="sourceLineNo">1046</span>  private void persistRegionLastFlushedSequenceIds() throws IOException {<a name="line.1046"></a>
-<span class="sourceLineNo">1047</span>    if (isFlushSeqIdPersistInProgress) {<a name="line.1047"></a>
-<span class="sourceLineNo">1048</span>      return;<a name="line.1048"></a>
-<span class="sourceLineNo">1049</span>    }<a name="line.1049"></a>
-<span class="sourceLineNo">1050</span>    isFlushSeqIdPersistInProgress = true;<a name="line.1050"></a>
-<span class="sourceLineNo">1051</span>    try {<a name="line.1051"></a>
-<span class="sourceLineNo">1052</span>      Configuration conf = master.getConfiguration();<a name="line.1052"></a>
-<span class="sourceLineNo">1053</span>      Path rootDir = FSUtils.getRootDir(conf);<a name="line.1053"></a>
-<span class="sourceLineNo">1054</span>      Path lastFlushedSeqIdPath = new Path(rootDir, LAST_FLUSHED_SEQ_ID_FILE);<a name="line.1054"></a>
-<span class="sourceLineNo">1055</span>      FileSystem fs = FileSystem.get(conf);<a name="line.1055"></a>
-<span class="sourceLineNo">1056</span>      if (fs.exists(lastFlushedSeqIdPath)) {<a name="line.1056"></a>
-<span class="sourceLineNo">1057</span>        LOG.info("Rewriting .lastflushedseqids file at: "<a name="line.1057"></a>
-<span class="sourceLineNo">1058</span>            + lastFlushedSeqIdPath);<a name="line.1058"></a>
-<span class="sourceLineNo">1059</span>        if (!fs.delete(lastFlushedSeqIdPath, false)) {<a name="line.1059"></a>
-<span class="sourceLineNo">1060</span>          throw new IOException("Unable to remove existing "<a name="line.1060"></a>
-<span class="sourceLineNo">1061</span>              + lastFlushedSeqIdPath);<a name="line.1061"></a>
-<span class="sourceLineNo">1062</span>        }<a name="line.1062"></a>
-<span class="sourceLineNo">1063</span>      } else {<a name="line.1063"></a>
-<span class="sourceLineNo">1064</span>        LOG.info("Writing .lastflushedseqids file at: " + lastFlushedSeqIdPath);<a name="line.1064"></a>
-<span class="sourceLineNo">1065</span>      }<a name="line.1065"></a>
-<span class="sourceLineNo">1066</span>      FSDataOutputStream out = fs.create(lastFlushedSeqIdPath);<a name="line.1066"></a>
-<span class="sourceLineNo">1067</span>      FlushedSequenceId.Builder flushedSequenceIdBuilder =<a name="line.1067"></a>
-<span class="sourceLineNo">1068</span>          FlushedSequenceId.newBuilder();<a name="line.1068"></a>
-<span class="sourceLineNo">1069</span>      try {<a name="line.1069"></a>
-<span class="sourceLineNo">1070</span>        for (Entry&lt;byte[], Long&gt; entry : flushedSequenceIdByRegion.entrySet()) {<a name="line.1070"></a>
-<span class="sourceLineNo">1071</span>          FlushedRegionSequenceId.Builder flushedRegionSequenceIdBuilder =<a name="line.1071"></a>
-<span class="sourceLineNo">1072</span>              FlushedRegionSequenceId.newBuilder();<a name="line.1072"></a>
-<span class="sourceLineNo">1073</span>          flushedRegionSequenceIdBuilder.setRegionEncodedName(<a name="line.1073"></a>
-<span class="sourceLineNo">1074</span>              ByteString.copyFrom(entry.getKey()));<a name="line.1074"></a>
-<span class="sourceLineNo">1075</span>          flushedRegionSequenceIdBuilder.setSeqId(entry.getValue());<a name="line.1075"></a>
-<span class="sourceLineNo">1076</span>          ConcurrentNavigableMap&lt;byte[], Long&gt; storeSeqIds =<a name="line.1076"></a>
-<span class="sourceLineNo">1077</span>              storeFlushedSequenceIdsByRegion.get(entry.getKey());<a name="line.1077"></a>
-<span class="sourceLineNo">1078</span>          if (storeSeqIds != null) {<a name="line.1078"></a>
-<span class="sourceLineNo">1079</span>            for (Entry&lt;byte[], Long&gt; store : storeSeqIds.entrySet()) {<a name="line.1079"></a>
-<span class="sourceLineNo">1080</span>              FlushedStoreSequenceId.Builder flushedStoreSequenceIdBuilder =<a name="line.1080"></a>
-<span class="sourceLineNo">1081</span>                  FlushedStoreSequenceId.newBuilder();<a name="line.1081"></a>
-<span class="sourceLineNo">1082</span>              flushedStoreSequenceIdBuilder.setFamily(ByteString.copyFrom(store.getKey()));<a name="line.1082"></a>
-<span class="sourceLineNo">1083</span>              flushedStoreSequenceIdBuilder.setSeqId(store.getValue());<a name="line.1083"></a>
-<span class="sourceLineNo">1084</span>              flushedRegionSequenceIdBuilder.addStores(flushedStoreSequenceIdBuilder);<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>          flushedSequenceIdBuilder.addRegionSequenceId(flushedRegionSequenceIdBuilder);<a name="line.1087"></a>
-<span class="sourceLineNo">1088</span>        }<a name="line.1088"></a>
-<span class="sourceLineNo">1089</span>        flushedSequenceIdBuilder.build().writeDelimitedTo(out);<a name="line.1089"></a>
-<span class="sourceLineNo">1090</span>      } finally {<a name="line.1090"></a>
-<span class="sourceLineNo">1091</span>        if (out != null) {<a name="line.1091"></a>
-<span class="sourceLineNo">1092</span>          out.close();<a name="line.1092"></a>
-<span class="sourceLineNo">1093</span>        }<a name="line.1093"></a>
-<span class="sourceLineNo">1094</span>      }<a name="line.1094"></a>
-<span class="sourceLineNo">1095</span>    } finally {<a name="line.1095"></a>
-<span class="sourceLineNo">1096</span>      isFlushSeqIdPersistInProgress = false;<a name="line.1096"></a>
-<span class="sourceLineNo">1097</span>    }<a name="line.1097"></a>
-<span class="sourceLineNo">1098</span>  }<a name="line.1098"></a>
-<span class="sourceLineNo">1099</span><a name="line.1099"></a>
-<span class="sourceLineNo">1100</span>  /**<a name="line.1100"></a>
-<span class="sourceLineNo">1101</span>   * Load last flushed sequence id of each region from HDFS, if persisted<a name="line.1101"></a>
-<span class="sourceLineNo">1102</span>   */<a name="line.1102"></a>
-<span class="sourceLineNo">1103</span>  public void loadLastFlushedSequenceIds() throws IOException {<a name="line.1103"></a>
-<span class="sourceLineNo">1104</span>    if (!persistFlushedSequenceId) {<a name="line.1104"></a>
-<span class="sourceLineNo">1105</span>      return;<a name="line.1105"></a>
-<span class="sourceLineNo">1106</span>    }<a name="line.1106"></a>
-<span class="sourceLineNo">1107</span>    Configuration conf = master.getConfiguration();<a name="line.1107"></a>
-<span class="sourceLineNo">1108</span>    Path rootDir = FSUtils.getRootDir(conf);<a name="line.1108"></a>
-<span class="sourceLineNo">1109</span>    Path lastFlushedSeqIdPath = new Path(rootDir, LAST_FLUSHED_SEQ_ID_FILE);<a name="line.1109"></a>
-<span class="sourceLineNo">1110</span>    FileSystem fs = FileSystem.get(conf);<a name="line.1110"></a>
-<span class="sourceLineNo">1111</span>    if (!fs.exists(lastFlushedSeqIdPath)) {<a name="line.1111"></a>
-<span class="sourceLineNo">1112</span>      LOG.info("No .lastflushedseqids found at" + lastFlushedSeqIdPath<a name="line.1112"></a>
-<span class="sourceLineNo">1113</span>          + " will record last flushed sequence id"<a name="line.1113"></a>
-<span class="sourceLineNo">1114</span>          + " for regions by regionserver report all over again");<a name="line.1114"></a>
-<span class="sourceLineNo">1115</span>      return;<a name="line.1115"></a>
-<span class="sourceLineNo">1116</span>    } else {<a name="line.1116"></a>
-<span class="sourceLineNo">1117</span>      LOG.info("begin to load .lastflushedseqids at " + lastFlushedSeqIdPath);<a name="line.1117"></a>
-<span class="sourceLineNo">1118</span>    }<a name="line.1118"></a>
-<span class="sourceLineNo">1119</span>    FSDataInputStream in = fs.open(lastFlushedSeqIdPath);<a name="line.1119"></a>
-<span class="sourceLineNo">1120</span>    try {<a name="line.1120"></a>
-<span class="sourceLineNo">1121</span>      FlushedSequenceId flushedSequenceId =<a name="line.1121"></a>
-<span class="sourceLineNo">1122</span>          FlushedSequenceId.parseDelimitedFrom(in);<a name="line.1122"></a>
-<span class="sourceLineNo">1123</span>      for (FlushedRegionSequenceId flushedRegionSequenceId : flushedSequenceId<a name="line.1123"></a>
-<span class="sourceLineNo">1124</span>          .getRegionSequenceIdList()) {<a name="line.1124"></a>
-<span class="sourceLineNo">1125</span>        byte[] encodedRegionName = flushedRegionSequenceId<a name="line.1125"></a>
-<span class="sourceLineNo">1126</span>            .getRegionEncodedName().toByteArray();<a name="line.1126"></a>
-<span class="sourceLineNo">1127</span>        flushedSequenceIdByRegion<a name="line.1127"></a>
-<span class="sourceLineNo">1128</span>            .putIfAbsent(encodedRegionName, flushedRegionSequenceId.getSeqId());<a name="line.1128"></a>
-<span class="sourceLineNo">1129</span>        if (flushedRegionSequenceId.getStoresList() != null<a name="line.1129"></a>
-<span class="sourceLineNo">1130</span>            &amp;&amp; flushedRegionSequenceId.getStoresList().size() != 0) {<a name="line.1130"></a>
-<span class="sourceLineNo">1131</span>          ConcurrentNavigableMap&lt;byte[], Long&gt; storeFlushedSequenceId =<a name="line.1131"></a>
-<span class="sourceLineNo">1132</span>              computeIfAbsent(storeFlushedSequenceIdsByRegion, encodedRegionName,<a name="line.1132"></a>
-<span class="sourceLineNo">1133</span>                () -&gt; new ConcurrentSkipListMap&lt;&gt;(Bytes.BYTES_COMPARATOR));<a name="line.1133"></a>
-<span class="sourceLineNo">1134</span>          for (FlushedStoreSequenceId flushedStoreSequenceId : flushedRegionSequenceId<a name="line.1134"></a>
-<span class="sourceLineNo">1135</span>              .getStoresList()) {<a name="line.1135"></a>
-<span class="sourceLineNo">1136</span>            storeFlushedSequenceId<a name="line.1136"></a>
-<span class="sourceLineNo">1137</span>                .put(flushedStoreSequenceId.getFamily().toByteArray(),<a name="line.1137"></a>
-<span class="sourceLineNo">1138</span>                    flushedStoreSequenceId.getSeqId());<a name="line.1138"></a>
-<span class="sourceLineNo">1139</span>          }<a name="line.1139"></a>
-<span class="sourceLineNo">1140</span>        }<a name="line.1140"></a>
-<span class="sourceLineNo">1141</span>      }<a name="line.1141"></a>
-<span class="sourceLineNo">1142</span>    } finally {<a name="line.1142"></a>
-<span class="sourceLineNo">1143</span>      in.close();<a name="line.1143"></a>
-<span class="sourceLineNo">1144</span>    }<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>   * Regions may have been removed between latest persist of FlushedSequenceIds<a name="line.1148"></a>
-<span class="sourceLineNo">1149</span>   * and master abort. So after loading FlushedSequenceIds from file, and after<a name="line.1149"></a>
-<span class="sourceLineNo">1150</span>   * meta loaded, we need to remove the deleted region according to RegionStates.<a name="line.1150"></a>
-<span class="sourceLineNo">1151</span>   */<a name="line.1151"></a>
-<span class="sourceLineNo">1152</span>  public void removeDeletedRegionFromLoadedFlushedSequenceIds() {<a name="line.1152"></a>
-<span class="sourceLineNo">1153</span>    RegionStates regionStates = master.getAssignmentManager().getRegionStates();<a name="line.1153"></a>
-<span class="sourceLineNo">1154</span>    Iterator&lt;byte[]&gt; it = flushedSequenceIdByRegion.keySet().iterator();<a name="line.1154"></a>
-<span class="sourceLineNo">1155</span>    while(it.hasNext()) {<a name="line.1155"></a>
-<span class="sourceLineNo">1156</span>      byte[] regionEncodedName = it.next();<a name="line.1156"></a>
-<span class="sourceLineNo">1157</span>      if (regionStates.getRegionState(Bytes.toStringBinary(regionEncodedName)) == null) {<a name="line.1157"></a>
-<span class="sourceLineNo">1158</span>        it.remove();<a name="line.1158"></a>
-<span class="sourceLineNo">1159</span>        storeFlushedSequenceIdsByRegion.remove(regionEncodedName);<a name="line.1159"></a>
-<span class="sourceLineNo">1160</span>      }<a name="line.1160"></a>
-<span class="sourceLineNo">1161</span>    }<a name="line.1161"></a>
-<span class="sourceLineNo">1162</span>  }<a name="line.1162"></a>
-<span class="sourceLineNo">1163</span><a name="line.1163"></a>
-<span class="sourceLineNo">1164</span>  private class FlushedSequenceIdFlusher extends ScheduledChore {<a name="line.1164"></a>
-<span class="sourceLineNo">1165</span><a name="line.1165"></a>
-<span class="sourceLineNo">1166</span>    public FlushedSequenceIdFlusher(String name, int p) {<a name="line.1166"></a>
-<span class="sourceLineNo">1167</span>      super(name, master, p, 60 * 1000); //delay one minute before first execute<a name="line.1167"></a>
-<span class="sourceLineNo">1168</span>    }<a name="line.1168"></a>
-<span class="sourceLineNo">1169</span><a name="line.1169"></a>
-<span class="sourceLineNo">1170</span>    @Override<a name="line.1170"></a>
-<span class="sourceLineNo">1171</span>    protected void chore() {<a name="line.1171"></a>
-<span class="sourceLineNo">1172</span>      try {<a name="line.1172"></a>
-<span class="sourceLineNo">1173</span>        persistRegionLastFlushedSequenceIds();<a name="line.1173"></a>
-<span class="sourceLineNo">1174</span>      } catch (IOException e) {<a name="line.1174"></a>
-<span class="sourceLineNo">1175</span>        LOG.debug("Failed to persist last flushed sequence id of regions"<a name="line.1175"></a>
-<span class="sourceLineNo">1176</span>            + " to file system", e);<a name="line.1176"></a>
-<span class="sourceLineNo">1177</span>      }<a name="line.1177"></a>
-<span class="sourceLineNo">1178</span>    }<a name="line.1178"></a>
-<span class="sourceLineNo">1179</span>  }<a name="line.1179"></a>
-<span class="sourceLineNo">1180</span>}<a name="line.1180"></a>
+<span class="sourceLineNo">980</span>    return destServers;<a name="line.980"></a>
+<span class="sourceLineNo">981</span>  }<a name="line.981"></a>
+<span class="sourceLineNo">982</span><a name="line.982"></a>
+<span class="sourceLineNo">983</span>  /**<a name="line.983"></a>
+<span class="sourceLineNo">984</span>   * Calls {@link #createDestinationServersList} without server to exclude.<a name="line.984"></a>
+<span class="sourceLineNo">985</span>   */<a name="line.985"></a>
+<span class="sourceLineNo">986</span>  public List&lt;ServerName&gt; createDestinationServersList(){<a name="line.986"></a>
+<span class="sourceLineNo">987</span>    return createDestinationServersList(null);<a name="line.987"></a>
+<span class="sourceLineNo">988</span>  }<a name="line.988"></a>
+<span class="sourceLineNo">989</span><a name="line.989"></a>
+<span class="sourceLineNo">990</span>  /**<a name="line.990"></a>
+<span class="sourceLineNo">991</span>   * To clear any dead server with same host name and port of any online server<a name="line.991"></a>
+<span class="sourceLineNo">992</span>   */<a name="line.992"></a>
+<span class="sourceLineNo">993</span>  void clearDeadServersWithSameHostNameAndPortOfOnlineServer() {<a name="line.993"></a>
+<span class="sourceLineNo">994</span>    for (ServerName serverName : getOnlineServersList()) {<a name="line.994"></a>
+<span class="sourceLineNo">995</span>      deadservers.cleanAllPreviousInstances(serverName);<a name="line.995"></a>
+<span class="sourceLineNo">996</span>    }<a name="line.996"></a>
+<span class="sourceLineNo">997</span>  }<a name="line.997"></a>
+<span class="sourceLineNo">998</span><a name="line.998"></a>
+<span class="sourceLineNo">999</span>  /**<a name="line.999"></a>
+<span class="sourceLineNo">1000</span>   * Called by delete table and similar to notify the ServerManager that a region was removed.<a name="line.1000"></a>
+<span class="sourceLineNo">1001</span>   */<a name="line.1001"></a>
+<span class="sourceLineNo">1002</span>  public void removeRegion(final RegionInfo regionInfo) {<a name="line.1002"></a>
+<span class="sourceLineNo">1003</span>    final byte[] encodedName = regionInfo.getEncodedNameAsBytes();<a name="line.1003"></a>
+<span class="sourceLineNo">1004</span>    storeFlushedSequenceIdsByRegion.remove(encodedName);<a name="line.1004"></a>
+<span class="sourceLineNo">1005</span>    flushedSequenceIdByRegion.remove(encodedName);<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>  @VisibleForTesting<a name="line.1008"></a>
+<span class="sourceLineNo">1009</span>  public boolean isRegionInServerManagerStates(final RegionInfo hri) {<a name="line.1009"></a>
+<span class="sourceLineNo">1010</span>    final byte[] encodedName = hri.getEncodedNameAsBytes();<a name="line.1010"></a>
+<span class="sourceLineNo">1011</span>    return (storeFlushedSequenceIdsByRegion.containsKey(encodedName)<a name="line.1011"></a>
+<span class="sourceLineNo">1012</span>        || flushedSequenceIdByRegion.containsKey(encodedName));<a name="line.1012"></a>
+<span class="sourceLineNo">1013</span>  }<a name="line.1013"></a>
+<span class="sourceLineNo">1014</span><a name="line.1014"></a>
+<span class="sourceLineNo">1015</span>  /**<a name="line.1015"></a>
+<span class="sourceLineNo">1016</span>   * Called by delete table and similar to notify the ServerManager that a region was removed.<a name="line.1016"></a>
+<span class="sourceLineNo">1017</span>   */<a name="line.1017"></a>
+<span class="sourceLineNo">1018</span>  public void removeRegions(final List&lt;RegionInfo&gt; regions) {<a name="line.1018"></a>
+<span class="sourceLineNo">1019</span>    for (RegionInfo hri: regions) {<a name="line.1019"></a>
+<span class="sourceLineNo">1020</span>      removeRegion(hri);<a name="line.1020"></a>
+<span class="sourceLineNo">1021</span>    }<a name="line.1021"></a>
+<span class="sourceLineNo">1022</span>  }<a name="line.1022"></a>
+<span class="sourceLineNo">1023</span><a name="line.1023"></a>
+<span class="sourceLineNo">1024</span>  /**<a name="line.1024"></a>
+<span class="sourceLineNo">1025</span>   * May return 0 when server is not online.<a name="line.1025"></a>
+<span class="sourceLineNo">1026</span>   */<a name="line.1026"></a>
+<span class="sourceLineNo">1027</span>  public int getVersionNumber(ServerName serverName) {<a name="line.1027"></a>
+<span class="sourceLineNo">1028</span>    ServerMetrics serverMetrics = onlineServers.get(serverName);<a name="line.1028"></a>
+<span class="sourceLineNo">1029</span>    return serverMetrics != null ? serverMetrics.getVersionNumber() : 0;<a name="line.1029"></a>
+<span class="sourceLineNo">1030</span>  }<a name="line.1030"></a>
+<span class="sourceLineNo">1031</span><a name="line.1031"></a>
+<span class="sourceLineNo">1032</span>  /**<a name="line.1032"></a>
+<span class="sourceLineNo">1033</span>   * May return "0.0.0" when server is not online<a name="line.1033"></a>
+<span class="sourceLineNo">1034</span>   */<a name="line.1034"></a>
+<span class="sourceLineNo">1035</span>  public String getVersion(ServerName serverName) {<a name="line.1035"></a>
+<span class="sourceLineNo">1036</span>    ServerMetrics serverMetrics = onlineServers.get(serverName);<a name="line.1036"></a>
+<span class="sourceLineNo">1037</span>    return serverMetrics != null ? serverMetrics.getVersion() : "0.0.0";<a name="line.1037"></a>
+<span class="sourceLineNo">1038</span>  }<a name="line.1038"></a>
+<span class="sourceLineNo">1039</span><a name="line.1039"></a>
+<span class="sourceLineNo">1040</span>  public int getInfoPort(ServerName serverName) {<a name="line.1040"></a>
+<span class="sourceLineNo">1041</span>    ServerMetrics serverMetrics = onlineServers.get(serverName);<a name="line.1041"></a>
+<span class="sourceLineNo">1042</span>    return serverMetrics != null ? serverMetrics.getInfoServerPort() : 0;<a name="line.1042"></a>
+<span class="sourceLineNo">1043</span>  }<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>   * Persist last flushed sequence id of each region to HDFS<a name="line.1046"></a>
+<span class="sourceLineNo">1047</span>   * @throws IOException if persit to HDFS fails<a name="line.1047"></a>
+<span class="sourceLineNo">1048</span>   */<a name="line.1048"></a>
+<span class="sourceLineNo">1049</span>  private void persistRegionLastFlushedSequenceIds() throws IOException {<a name="line.1049"></a>
+<span class="sourceLineNo">1050</span>    if (isFlushSeqIdPersistInProgress) {<a name="line.1050"></a>
+<span class="sourceLineNo">1051</span>      return;<a name="line.1051"></a>
+<span class="sourceLineNo">1052</span>    }<a name="line.1052"></a>
+<span class="sourceLineNo">1053</span>    isFlushSeqIdPersistInProgress = true;<a name="line.1053"></a>
+<span class="sourceLineNo">1054</span>    try {<a name="line.1054"></a>
+<span class="sourceLineNo">1055</span>      Configuration conf = master.getConfiguration();<a name="line.1055"></a>
+<span class="sourceLineNo">1056</span>      Path rootDir = FSUtils.getRootDir(conf);<a name="line.1056"></a>
+<span class="sourceLineNo">1057</span>      Path lastFlushedSeqIdPath = new Path(rootDir, LAST_FLUSHED_SEQ_ID_FILE);<a name="line.1057"></a>
+<span class="sourceLineNo">1058</span>      FileSystem fs = FileSystem.get(conf);<a name="line.1058"></a>
+<span class="sourceLineNo">1059</span>      if (fs.exists(lastFlushedSeqIdPath)) {<a name="line.1059"></a>
+<span class="sourceLineNo">1060</span>        LOG.info("Rewriting .lastflushedseqids file at: "<a name="line.1060"></a>
+<span class="sourceLineNo">1061</span>            + lastFlushedSeqIdPath);<a name="line.1061"></a>
+<span class="sourceLineNo">1062</span>        if (!fs.delete(lastFlushedSeqIdPath, false)) {<a name="line.1062"></a>
+<span class="sourceLineNo">1063</span>          throw new IOException("Unable to remove existing "<a name="line.1063"></a>
+<span class="sourceLineNo">1064</span>              + lastFlushedSeqIdPath);<a name="line.1064"></a>
+<span class="sourceLineNo">1065</span>        }<a name="line.1065"></a>
+<span class="sourceLineNo">1066</span>      } else {<a name="line.1066"></a>
+<span class="sourceLineNo">1067</span>        LOG.info("Writing .lastflushedseqids file at: " + lastFlushedSeqIdPath);<a name="line.1067"></a>
+<span class="sourceLineNo">1068</span>      }<a name="line.1068"></a>
+<span class="sourceLineNo">1069</span>      FSDataOutputStream out = fs.create(lastFlushedSeqIdPath);<a name="line.1069"></a>
+<span class="sourceLineNo">1070</span>      FlushedSequenceId.Builder flushedSequenceIdBuilder =<a name="line.1070"></a>
+<span class="sourceLineNo">1071</span>          FlushedSequenceId.newBuilder();<a name="line.1071"></a>
+<span class="sourceLineNo">1072</span>      try {<a name="line.1072"></a>
+<span class="sourceLineNo">1073</span>        for (Entry&lt;byte[], Long&gt; entry : flushedSequenceIdByRegion.entrySet()) {<a name="line.1073"></a>
+<span class="sourceLineNo">1074</span>          FlushedRegionSequenceId.Builder flushedRegionSequenceIdBuilder =<a name="line.1074"></a>
+<span class="sourceLineNo">1075</span>              FlushedRegionSequenceId.newBuilder();<a name="line.1075"></a>
+<span class="sourceLineNo">1076</span>          flushedRegionSequenceIdBuilder.setRegionEncodedName(<a name="line.1076"></a>
+<span class="sourceLineNo">1077</span>              ByteString.copyFrom(entry.getKey()));<a name="line.1077"></a>
+<span class="sourceLineNo">1078</span>          flushedRegionSequenceIdBuilder.setSeqId(entry.getValue());<a name="line.1078"></a>
+<span class="sourceLineNo">1079</span>          ConcurrentNavigableMap&lt;byte[], Long&gt; storeSeqIds =<a name="line.1079"></a>
+<span class="sourceLineNo">1080</span>              storeFlushedSequenceIdsByRegion.get(entry.getKey());<a name="line.1080"></a>
+<span class="sourceLineNo">1081</span>          if (storeSeqIds != null) {<a name="line.1081"></a>
+<span class="sourceLineNo">1082</span>            for (Entry&lt;byte[], Long&gt; store : storeSeqIds.entrySet()) {<a name="line.1082"></a>
+<span class="sourceLineNo">1083</span>              FlushedStoreSequenceId.Builder flushedStoreSequenceIdBuilder =<a name="line.1083"></a>
+<span class="sourceLineNo">1084</span>                  FlushedStoreSequenceId.newBuilder();<a name="line.1084"></a>
+<span class="sourceLineNo">1085</span>              flushedStoreSequenceIdBuilder.setFamily(ByteString.copyFrom(store.getKey()));<a name="line.1085"></a>
+<span class="sourceLineNo">1086</span>              flushedStoreSequenceIdBuilder.setSeqId(store.getValue());<a name="line.1086"></a>
+<span class="sourceLineNo">1087</span>              flushedRegionSequenceIdBuilder.addStores(flushedStoreSequenceIdBuilder);<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>          flushedSequenceIdBuilder.addRegionSequenceId(flushedRegionSequenceIdBuilder);<a name="line.1090"></a>
+<span class="sourceLineNo">1091</span>        }<a name="line.1091"></a>
+<span class="sourceLineNo">1092</span>        flushedSequenceIdBuilder.build().writeDelimitedTo(out);<a name="line.1092"></a>
+<span class="sourceLineNo">1093</span>      } finally {<a name="line.1093"></a>
+<span class="sourceLineNo">1094</span>        if (out != null) {<a name="line.1094"></a>
+<span class="sourceLineNo">1095</span>          out.close();<a name="line.1095"></a>
+<span class="sourceLineNo">1096</span>        }<a name="line.1096"></a>
+<span class="sourceLineNo">1097</span>      }<a name="line.1097"></a>
+<span class="sourceLineNo">1098</span>    } finally {<a name="line.1098"></a>
+<span class="sourceLineNo">1099</span>      isFlushSeqIdPersistInProgress = false;<a name="line.1099"></a>
+<span class="sourceLineNo">1100</span>    }<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>  /**<a name="line.1103"></a>
+<span class="sourceLineNo">1104</span>   * Load last flushed sequence id of each region from HDFS, if persisted<a name="line.1104"></a>
+<span class="sourceLineNo">1105</span>   */<a name="line.1105"></a>
+<span class="sourceLineNo">1106</span>  public void loadLastFlushedSequenceIds() throws IOException {<a name="line.1106"></a>
+<span class="sourceLineNo">1107</span>    if (!persistFlushedSequenceId) {<a name="line.1107"></a>
+<span class="sourceLineNo">1108</span>      return;<a name="line.1108"></a>
+<span class="sourceLineNo">1109</span>    }<a name="line.1109"></a>
+<span class="sourceLineNo">1110</span>    Configuration conf = master.getConfiguration();<a name="line.1110"></a>
+<span class="sourceLineNo">1111</span>    Path rootDir = FSUtils.getRootDir(conf);<a name="line.1111"></a>
+<span class="sourceLineNo">1112</span>    Path lastFlushedSeqIdPath = new Path(rootDir, LAST_FLUSHED_SEQ_ID_FILE);<a name="line.1112"></a>
+<span class="sourceLineNo">1113</span>    FileSystem fs = FileSystem.get(conf);<a name="line.1113"></a>
+<span class="sourceLineNo">1114</span>    if (!fs.exists(lastFlushedSeqIdPath)) {<a name="line.1114"></a>
+<span class="sourceLineNo">1115</span>      LOG.info("No .lastflushedseqids found at" + lastFlushedSeqIdPath<a name="line.1115"></a>
+<span class="sourceLineNo">1116</span>          + " will record last flushed sequence id"<a name="line.1116"></a>
+<span class="sourceLineNo">1117</span>          + " for regions by regionserver report all over again");<a name="line.1117"></a>
+<span class="sourceLineNo">1118</span>      return;<a name="line.1118"></a>
+<span class="sourceLineNo">1119</span>    } else {<a name="line.1119"></a>
+<span class="sourceLineNo">1120</span>      LOG.info("begin to load .lastflushedseqids at " + lastFlushedSeqIdPath);<a name="line.1120"></a>
+<span class="sourceLineNo">1121</span>    }<a name="line.1121"></a>
+<span class="sourceLineNo">1122</span>    FSDataInputStream in = fs.open(lastFlushedSeqIdPath);<a name="line.1122"></a>
+<span class="sourceLineNo">1123</span>    try {<a name="line.1123"></a>
+<span class="sourceLineNo">1124</span>      FlushedSequenceId flushedSequenceId =<a name="line.1124"></a>
+<span class="sourceLineNo">1125</span>          FlushedSequenceId.parseDelimitedFrom(in);<a name="line.1125"></a>
+<span class="sourceLineNo">1126</span>      for (FlushedRegionSequenceId flushedRegionSequenceId : flushedSequenceId<a name="line.1126"></a>
+<span class="sourceLineNo">1127</span>          .getRegionSequenceIdList()) {<a name="line.1127"></a>
+<span class="sourceLineNo">1128</span>        byte[] encodedRegionName = flushedRegionSequenceId<a name="line.1128"></a>
+<span class="sourceLineNo">1129</span>            .getRegionEncodedName().toByteArray();<a name="line.1129"></a>
+<span class="sourceLineNo">1130</span>        flushedSequenceIdByRegion<a name="line.1130"></a>
+<span class="sourceLineNo">1131</span>            .putIfAbsent(encodedRegionName, flushedRegionSequenceId.getSeqId());<a name="line.1131"></a>
+<span class="sourceLineNo">1132</span>        if (flushedRegionSequenceId.getStoresList() != null<a name="line.1132"></a>
+<span class="sourceLineNo">1133</span>            &amp;&amp; flushedRegionSequenceId.getStoresList().size() != 0) {<a name="line.1133"></a>
+<span class="sourceLineNo">1134</span>          ConcurrentNavigableMap&lt;byte[], Long&gt; storeFlushedSequenceId =<a name="line.1134"></a>
+<span class="sourceLineNo">1135</span>              computeIfAbsent(storeFlushedSequenceIdsByRegion, encodedRegionName,<a name="line.1135"></a>
+<span class="sourceLineNo">1136</span>                () -&gt; new ConcurrentSkipListMap&lt;&gt;(Bytes.BYTES_COMPARATOR));<a name="line.1136"></a>
+<span class="sourceLineNo">1137</span>          for (FlushedStoreSequenceId flushedStoreSequenceId : flushedRegionSequenceId<a name="line.1137"></a>
+<span class="sourceLineNo">1138</span>              .getStoresList()) {<a name="line.1138"></a>
+<span class="sourceLineNo">1139</span>            storeFlushedSequenceId<a name="line.1139"></a>
+<span class="sourceLineNo">1140</span>                .put(flushedStoreSequenceId.getFamily().toByteArray(),<a name="line.1140"></a>
+<span class="sourceLineNo">1141</span>                    flushedStoreSequenceId.getSeqId());<a name="line.1141"></a>
+<span class="sourceLineNo">1142</span>          }<a name="line.1142"></a>
+<span class="sourceLineNo">1143</span>        }<a name="line.1143"></a>
+<span class="sourceLineNo">1144</span>      }<a name="line.1144"></a>
+<span class="sourceLineNo">1145</span>    } finally {<a name="line.1145"></a>
+<span class="sourceLineNo">1146</span>      in.close();<a name="line.1146"></a>
+<span class="sourceLineNo">1147</span>    }<a name="line.1147"></a>
+<span class="sourceLineNo">1148</span>  }<a name="line.1148"></a>
+<span class="sourceLineNo">1149</span><a name="line.1149"></a>
+<span class="sourceLineNo">1150</span>  /**<a name="line.1150"></a>
+<span class="sourceLineNo">1151</span>   * Regions may have been removed between latest persist of FlushedSequenceIds<a name="line.1151"></a>
+<span class="sourceLineNo">1152</span>   * and master abort. So after loading FlushedSequenceIds from file, and after<a name="line.1152"></a>
+<span class="sourceLineNo">1153</span>   * meta loaded, we need to remove the deleted region according to RegionStates.<a name="line.1153"></a>
+<span class="sourceLineNo">1154</span>   */<a name="line.1154"></a>
+<span class="sourceLineNo">1155</span>  public void removeDeletedRegionFromLoadedFlushedSequenceIds() {<a name="line.1155"></a>
+<span class="sourceLineNo">1156</span>    RegionStates regionStates = master.getAssignmentManager().getRegionStates();<a name="line.1156"></a>
+<span class="sourceLineNo">1157</span>    Iterator&lt;byte[]&gt; it = flushedSequenceIdByRegion.keySet().iterator();<a name="line.1157"></a>
+<span class="sourceLineNo">1158</span>    while(it.hasNext()) {<a name="line.1158"></a>
+<span class="sourceLineNo">1159</span>      byte[] regionEncodedName = it.next();<a name="line.1159"></a>
+<span class="sourceLineNo">1160</span>      if (regionStates.getRegionState(Bytes.toStringBinary(regionEncodedName)) == null) {<a name="line.1160"></a>
+<span class="sourceLineNo">1161</span>        it.remove();<a name="line.1161"></a>
+<span class="sourceLineNo">1162</span>        storeFlushedSequenceIdsByRegion.remove(regionEncodedName);<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>  private class FlushedSequenceIdFlusher extends ScheduledChore {<a name="line.1167"></a>
+<span class="sourceLineNo">1168</span><a name="line.1168"></a>
+<span class="sourceLineNo">1169</span>    public FlushedSequenceIdFlusher(String name, int p) {<a name="line.1169"></a>
+<span class="sourceLineNo">1170</span>      super(name, master, p, 60 * 1000); //delay one minute before first execute<a name="line.1170"></a>
+<span class="sourceLineNo">1171</span>    }<a name="line.1171"></a>
+<span class="sourceLineNo">1172</span><a name="line.1172"></a>
+<span class="sourceLineNo">1173</span>    @Override<a name="line.1173"></a>
+<span class="sourceLineNo">1174</span>    protected void chore() {<a name="line.1174"></a>
+<span class="sourceLineNo">1175</span>      try {<a name="line.1175"></a>
+<span class="sourceLineNo">1176</span>        persistRegionLastFlushedSequenceIds();<a name="line.1176"></a>
+<span class="sourceLineNo">1177</span>      } catch (IOException e) {<a name="line.1177"></a>
+<span class="sourceLineNo">1178</span>        LOG.debug("Failed to persist last flushed sequence id of regions"<a name="line.1178"></a>
+<span class="sourceLineNo">1179</span>            + " to file system", e);<a name="line.1179"></a>
+<span class="sourceLineNo">1180</span>      }<a name="line.1180"></a>
+<span class="sourceLineNo">1181</span>    }<a name="line.1181"></a>
+<span class="sourceLineNo">1182</span>  }<a name="line.1182"></a>
+<span class="sourceLineNo">1183</span>}<a name="line.1183"></a>
 
 
 


[20/46] hbase-site git commit: Published site at 05d22ed960204183fbd9bd16f1dbca6410ccde76.

Posted by gi...@apache.org.
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/3649682c/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 c307d41..d82bfd8 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
@@ -1020,8 +1020,8 @@
 <span class="sourceLineNo">1012</span>  protected ClusterMetrics clusterStatus = null;<a name="line.1012"></a>
 <span class="sourceLineNo">1013</span>  protected ServerName masterServerName;<a name="line.1013"></a>
 <span class="sourceLineNo">1014</span>  protected MasterServices services;<a name="line.1014"></a>
-<span class="sourceLineNo">1015</span>  protected boolean tablesOnMaster;<a name="line.1015"></a>
-<span class="sourceLineNo">1016</span>  protected boolean onlySystemTablesOnMaster;<a name="line.1016"></a>
+<span class="sourceLineNo">1015</span>  protected boolean onlySystemTablesOnMaster;<a name="line.1015"></a>
+<span class="sourceLineNo">1016</span>  protected boolean maintenanceMode;<a name="line.1016"></a>
 <span class="sourceLineNo">1017</span><a name="line.1017"></a>
 <span class="sourceLineNo">1018</span>  @Override<a name="line.1018"></a>
 <span class="sourceLineNo">1019</span>  public void setConf(Configuration conf) {<a name="line.1019"></a>
@@ -1033,627 +1033,626 @@
 <span class="sourceLineNo">1025</span>    if (overallSlop &lt; 0) overallSlop = 0;<a name="line.1025"></a>
 <span class="sourceLineNo">1026</span>    else if (overallSlop &gt; 1) overallSlop = 1;<a name="line.1026"></a>
 <span class="sourceLineNo">1027</span><a name="line.1027"></a>
-<span class="sourceLineNo">1028</span>    this.tablesOnMaster = LoadBalancer.isTablesOnMaster(this.config);<a name="line.1028"></a>
-<span class="sourceLineNo">1029</span>    this.onlySystemTablesOnMaster = LoadBalancer.isSystemTablesOnlyOnMaster(this.config);<a name="line.1029"></a>
-<span class="sourceLineNo">1030</span>    // If system tables on master, implies tablesOnMaster = true.<a name="line.1030"></a>
-<span class="sourceLineNo">1031</span>    if (this.onlySystemTablesOnMaster &amp;&amp; !this.tablesOnMaster) {<a name="line.1031"></a>
-<span class="sourceLineNo">1032</span>      LOG.warn("Set " + TABLES_ON_MASTER + "=true because " + SYSTEM_TABLES_ON_MASTER + "=true");<a name="line.1032"></a>
-<span class="sourceLineNo">1033</span>      this.tablesOnMaster = true;<a name="line.1033"></a>
-<span class="sourceLineNo">1034</span>    }<a name="line.1034"></a>
-<span class="sourceLineNo">1035</span>    this.rackManager = new RackManager(getConf());<a name="line.1035"></a>
-<span class="sourceLineNo">1036</span>    if (useRegionFinder) {<a name="line.1036"></a>
-<span class="sourceLineNo">1037</span>      regionFinder.setConf(conf);<a name="line.1037"></a>
-<span class="sourceLineNo">1038</span>    }<a name="line.1038"></a>
-<span class="sourceLineNo">1039</span>    // Print out base configs. Don't print overallSlop since it for simple balancer exclusively.<a name="line.1039"></a>
-<span class="sourceLineNo">1040</span>    LOG.info("slop=" + this.slop + ", tablesOnMaster=" + this.tablesOnMaster +<a name="line.1040"></a>
-<span class="sourceLineNo">1041</span>      ", systemTablesOnMaster=" + this.onlySystemTablesOnMaster);<a name="line.1041"></a>
+<span class="sourceLineNo">1028</span>    this.onlySystemTablesOnMaster = LoadBalancer.isSystemTablesOnlyOnMaster(this.config);<a name="line.1028"></a>
+<span class="sourceLineNo">1029</span><a name="line.1029"></a>
+<span class="sourceLineNo">1030</span>    this.rackManager = new RackManager(getConf());<a name="line.1030"></a>
+<span class="sourceLineNo">1031</span>    if (useRegionFinder) {<a name="line.1031"></a>
+<span class="sourceLineNo">1032</span>      regionFinder.setConf(conf);<a name="line.1032"></a>
+<span class="sourceLineNo">1033</span>    }<a name="line.1033"></a>
+<span class="sourceLineNo">1034</span>    // Print out base configs. Don't print overallSlop since it for simple balancer exclusively.<a name="line.1034"></a>
+<span class="sourceLineNo">1035</span>    LOG.info("slop={}, systemTablesOnMaster={}",<a name="line.1035"></a>
+<span class="sourceLineNo">1036</span>        this.slop, this.onlySystemTablesOnMaster);<a name="line.1036"></a>
+<span class="sourceLineNo">1037</span>  }<a name="line.1037"></a>
+<span class="sourceLineNo">1038</span><a name="line.1038"></a>
+<span class="sourceLineNo">1039</span>  protected void setSlop(Configuration conf) {<a name="line.1039"></a>
+<span class="sourceLineNo">1040</span>    this.slop = conf.getFloat("hbase.regions.slop", (float) 0.2);<a name="line.1040"></a>
+<span class="sourceLineNo">1041</span>    this.overallSlop = conf.getFloat("hbase.regions.overallSlop", slop);<a name="line.1041"></a>
 <span class="sourceLineNo">1042</span>  }<a name="line.1042"></a>
 <span class="sourceLineNo">1043</span><a name="line.1043"></a>
-<span class="sourceLineNo">1044</span>  protected void setSlop(Configuration conf) {<a name="line.1044"></a>
-<span class="sourceLineNo">1045</span>    this.slop = conf.getFloat("hbase.regions.slop", (float) 0.2);<a name="line.1045"></a>
-<span class="sourceLineNo">1046</span>    this.overallSlop = conf.getFloat("hbase.regions.overallSlop", slop);<a name="line.1046"></a>
-<span class="sourceLineNo">1047</span>  }<a name="line.1047"></a>
-<span class="sourceLineNo">1048</span><a name="line.1048"></a>
-<span class="sourceLineNo">1049</span>  /**<a name="line.1049"></a>
-<span class="sourceLineNo">1050</span>   * Check if a region belongs to some system table.<a name="line.1050"></a>
-<span class="sourceLineNo">1051</span>   * If so, the primary replica may be expected to be put on the master regionserver.<a name="line.1051"></a>
-<span class="sourceLineNo">1052</span>   */<a name="line.1052"></a>
-<span class="sourceLineNo">1053</span>  public boolean shouldBeOnMaster(RegionInfo region) {<a name="line.1053"></a>
-<span class="sourceLineNo">1054</span>    return this.onlySystemTablesOnMaster &amp;&amp; region.getTable().isSystemTable();<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>   * Balance the regions that should be on master regionserver.<a name="line.1058"></a>
-<span class="sourceLineNo">1059</span>   */<a name="line.1059"></a>
-<span class="sourceLineNo">1060</span>  protected List&lt;RegionPlan&gt; balanceMasterRegions(Map&lt;ServerName, List&lt;RegionInfo&gt;&gt; clusterMap) {<a name="line.1060"></a>
-<span class="sourceLineNo">1061</span>    if (masterServerName == null || clusterMap == null || clusterMap.size() &lt;= 1) return null;<a name="line.1061"></a>
-<span class="sourceLineNo">1062</span>    List&lt;RegionPlan&gt; plans = null;<a name="line.1062"></a>
-<span class="sourceLineNo">1063</span>    List&lt;RegionInfo&gt; regions = clusterMap.get(masterServerName);<a name="line.1063"></a>
-<span class="sourceLineNo">1064</span>    if (regions != null) {<a name="line.1064"></a>
-<span class="sourceLineNo">1065</span>      Iterator&lt;ServerName&gt; keyIt = null;<a name="line.1065"></a>
-<span class="sourceLineNo">1066</span>      for (RegionInfo region: regions) {<a name="line.1066"></a>
-<span class="sourceLineNo">1067</span>        if (shouldBeOnMaster(region)) continue;<a name="line.1067"></a>
-<span class="sourceLineNo">1068</span><a name="line.1068"></a>
-<span class="sourceLineNo">1069</span>        // Find a non-master regionserver to host the region<a name="line.1069"></a>
-<span class="sourceLineNo">1070</span>        if (keyIt == null || !keyIt.hasNext()) {<a name="line.1070"></a>
-<span class="sourceLineNo">1071</span>          keyIt = clusterMap.keySet().iterator();<a name="line.1071"></a>
-<span class="sourceLineNo">1072</span>        }<a name="line.1072"></a>
-<span class="sourceLineNo">1073</span>        ServerName dest = keyIt.next();<a name="line.1073"></a>
-<span class="sourceLineNo">1074</span>        if (masterServerName.equals(dest)) {<a name="line.1074"></a>
-<span class="sourceLineNo">1075</span>          if (!keyIt.hasNext()) {<a name="line.1075"></a>
-<span class="sourceLineNo">1076</span>            keyIt = clusterMap.keySet().iterator();<a name="line.1076"></a>
-<span class="sourceLineNo">1077</span>          }<a name="line.1077"></a>
-<span class="sourceLineNo">1078</span>          dest = keyIt.next();<a name="line.1078"></a>
-<span class="sourceLineNo">1079</span>        }<a name="line.1079"></a>
-<span class="sourceLineNo">1080</span><a name="line.1080"></a>
-<span class="sourceLineNo">1081</span>        // Move this region away from the master regionserver<a name="line.1081"></a>
-<span class="sourceLineNo">1082</span>        RegionPlan plan = new RegionPlan(region, masterServerName, dest);<a name="line.1082"></a>
-<span class="sourceLineNo">1083</span>        if (plans == null) {<a name="line.1083"></a>
-<span class="sourceLineNo">1084</span>          plans = new ArrayList&lt;&gt;();<a name="line.1084"></a>
-<span class="sourceLineNo">1085</span>        }<a name="line.1085"></a>
-<span class="sourceLineNo">1086</span>        plans.add(plan);<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>    for (Map.Entry&lt;ServerName, List&lt;RegionInfo&gt;&gt; server: clusterMap.entrySet()) {<a name="line.1089"></a>
-<span class="sourceLineNo">1090</span>      if (masterServerName.equals(server.getKey())) continue;<a name="line.1090"></a>
-<span class="sourceLineNo">1091</span>      for (RegionInfo region: server.getValue()) {<a name="line.1091"></a>
-<span class="sourceLineNo">1092</span>        if (!shouldBeOnMaster(region)) continue;<a name="line.1092"></a>
-<span class="sourceLineNo">1093</span><a name="line.1093"></a>
-<span class="sourceLineNo">1094</span>        // Move this region to the master regionserver<a name="line.1094"></a>
-<span class="sourceLineNo">1095</span>        RegionPlan plan = new RegionPlan(region, server.getKey(), masterServerName);<a name="line.1095"></a>
-<span class="sourceLineNo">1096</span>        if (plans == null) {<a name="line.1096"></a>
-<span class="sourceLineNo">1097</span>          plans = new ArrayList&lt;&gt;();<a name="line.1097"></a>
-<span class="sourceLineNo">1098</span>        }<a name="line.1098"></a>
-<span class="sourceLineNo">1099</span>        plans.add(plan);<a name="line.1099"></a>
-<span class="sourceLineNo">1100</span>      }<a name="line.1100"></a>
-<span class="sourceLineNo">1101</span>    }<a name="line.1101"></a>
-<span class="sourceLineNo">1102</span>    return plans;<a name="line.1102"></a>
-<span class="sourceLineNo">1103</span>  }<a name="line.1103"></a>
-<span class="sourceLineNo">1104</span><a name="line.1104"></a>
-<span class="sourceLineNo">1105</span>  /**<a name="line.1105"></a>
-<span class="sourceLineNo">1106</span>   * If master is configured to carry system tables only, in here is<a name="line.1106"></a>
-<span class="sourceLineNo">1107</span>   * where we figure what to assign it.<a name="line.1107"></a>
-<span class="sourceLineNo">1108</span>   */<a name="line.1108"></a>
-<span class="sourceLineNo">1109</span>  protected Map&lt;ServerName, List&lt;RegionInfo&gt;&gt; assignMasterSystemRegions(<a name="line.1109"></a>
-<span class="sourceLineNo">1110</span>      Collection&lt;RegionInfo&gt; regions, List&lt;ServerName&gt; servers) {<a name="line.1110"></a>
-<span class="sourceLineNo">1111</span>    if (servers == null || regions == null || regions.isEmpty()) {<a name="line.1111"></a>
-<span class="sourceLineNo">1112</span>      return null;<a name="line.1112"></a>
-<span class="sourceLineNo">1113</span>    }<a name="line.1113"></a>
-<span class="sourceLineNo">1114</span>    Map&lt;ServerName, List&lt;RegionInfo&gt;&gt; assignments = new TreeMap&lt;&gt;();<a name="line.1114"></a>
-<span class="sourceLineNo">1115</span>    if (this.onlySystemTablesOnMaster) {<a name="line.1115"></a>
-<span class="sourceLineNo">1116</span>      if (masterServerName != null &amp;&amp; servers.contains(masterServerName)) {<a name="line.1116"></a>
-<span class="sourceLineNo">1117</span>        assignments.put(masterServerName, new ArrayList&lt;&gt;());<a name="line.1117"></a>
-<span class="sourceLineNo">1118</span>        for (RegionInfo region : regions) {<a name="line.1118"></a>
-<span class="sourceLineNo">1119</span>          if (shouldBeOnMaster(region)) {<a name="line.1119"></a>
-<span class="sourceLineNo">1120</span>            assignments.get(masterServerName).add(region);<a name="line.1120"></a>
-<span class="sourceLineNo">1121</span>          }<a name="line.1121"></a>
-<span class="sourceLineNo">1122</span>        }<a name="line.1122"></a>
-<span class="sourceLineNo">1123</span>      }<a name="line.1123"></a>
-<span class="sourceLineNo">1124</span>    }<a name="line.1124"></a>
-<span class="sourceLineNo">1125</span>    return assignments;<a name="line.1125"></a>
-<span class="sourceLineNo">1126</span>  }<a name="line.1126"></a>
-<span class="sourceLineNo">1127</span><a name="line.1127"></a>
-<span class="sourceLineNo">1128</span>  @Override<a name="line.1128"></a>
-<span class="sourceLineNo">1129</span>  public Configuration getConf() {<a name="line.1129"></a>
-<span class="sourceLineNo">1130</span>    return this.config;<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 synchronized void setClusterMetrics(ClusterMetrics st) {<a name="line.1134"></a>
-<span class="sourceLineNo">1135</span>    this.clusterStatus = st;<a name="line.1135"></a>
-<span class="sourceLineNo">1136</span>    if (useRegionFinder) {<a name="line.1136"></a>
-<span class="sourceLineNo">1137</span>      regionFinder.setClusterMetrics(st);<a name="line.1137"></a>
-<span class="sourceLineNo">1138</span>    }<a name="line.1138"></a>
-<span class="sourceLineNo">1139</span>  }<a name="line.1139"></a>
-<span class="sourceLineNo">1140</span><a name="line.1140"></a>
-<span class="sourceLineNo">1141</span>  @Override<a name="line.1141"></a>
-<span class="sourceLineNo">1142</span>  public void setClusterLoad(Map&lt;TableName, Map&lt;ServerName, List&lt;RegionInfo&gt;&gt;&gt; clusterLoad){<a name="line.1142"></a>
-<span class="sourceLineNo">1143</span><a name="line.1143"></a>
-<span class="sourceLineNo">1144</span>  }<a name="line.1144"></a>
-<span class="sourceLineNo">1145</span><a name="line.1145"></a>
-<span class="sourceLineNo">1146</span>  @Override<a name="line.1146"></a>
-<span class="sourceLineNo">1147</span>  public void setMasterServices(MasterServices masterServices) {<a name="line.1147"></a>
-<span class="sourceLineNo">1148</span>    masterServerName = masterServices.getServerName();<a name="line.1148"></a>
-<span class="sourceLineNo">1149</span>    this.services = masterServices;<a name="line.1149"></a>
-<span class="sourceLineNo">1150</span>    if (useRegionFinder) {<a name="line.1150"></a>
-<span class="sourceLineNo">1151</span>      this.regionFinder.setServices(masterServices);<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><a name="line.1154"></a>
-<span class="sourceLineNo">1155</span>  @Override<a name="line.1155"></a>
-<span class="sourceLineNo">1156</span>  public void postMasterStartupInitialize() {<a name="line.1156"></a>
-<span class="sourceLineNo">1157</span>    if (services != null &amp;&amp; regionFinder != null) {<a name="line.1157"></a>
-<span class="sourceLineNo">1158</span>      try {<a name="line.1158"></a>
-<span class="sourceLineNo">1159</span>        Set&lt;RegionInfo&gt; regions =<a name="line.1159"></a>
-<span class="sourceLineNo">1160</span>            services.getAssignmentManager().getRegionStates().getRegionAssignments().keySet();<a name="line.1160"></a>
-<span class="sourceLineNo">1161</span>        regionFinder.refreshAndWait(regions);<a name="line.1161"></a>
-<span class="sourceLineNo">1162</span>      } catch (Exception e) {<a name="line.1162"></a>
-<span class="sourceLineNo">1163</span>        LOG.warn("Refreshing region HDFS Block dist failed with exception, ignoring", e);<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><a name="line.1167"></a>
-<span class="sourceLineNo">1168</span>  public void setRackManager(RackManager rackManager) {<a name="line.1168"></a>
-<span class="sourceLineNo">1169</span>    this.rackManager = rackManager;<a name="line.1169"></a>
-<span class="sourceLineNo">1170</span>  }<a name="line.1170"></a>
-<span class="sourceLineNo">1171</span><a name="line.1171"></a>
-<span class="sourceLineNo">1172</span>  protected boolean needsBalance(Cluster c) {<a name="line.1172"></a>
-<span class="sourceLineNo">1173</span>    ClusterLoadState cs = new ClusterLoadState(c.clusterState);<a name="line.1173"></a>
-<span class="sourceLineNo">1174</span>    if (cs.getNumServers() &lt; MIN_SERVER_BALANCE) {<a name="line.1174"></a>
-<span class="sourceLineNo">1175</span>      if (LOG.isDebugEnabled()) {<a name="line.1175"></a>
-<span class="sourceLineNo">1176</span>        LOG.debug("Not running balancer because only " + cs.getNumServers()<a name="line.1176"></a>
-<span class="sourceLineNo">1177</span>            + " active regionserver(s)");<a name="line.1177"></a>
-<span class="sourceLineNo">1178</span>      }<a name="line.1178"></a>
-<span class="sourceLineNo">1179</span>      return false;<a name="line.1179"></a>
-<span class="sourceLineNo">1180</span>    }<a name="line.1180"></a>
-<span class="sourceLineNo">1181</span>    if(areSomeRegionReplicasColocated(c)) return true;<a name="line.1181"></a>
-<span class="sourceLineNo">1182</span>    // Check if we even need to do any load balancing<a name="line.1182"></a>
-<span class="sourceLineNo">1183</span>    // HBASE-3681 check sloppiness first<a name="line.1183"></a>
-<span class="sourceLineNo">1184</span>    float average = cs.getLoadAverage(); // for logging<a name="line.1184"></a>
-<span class="sourceLineNo">1185</span>    int floor = (int) Math.floor(average * (1 - slop));<a name="line.1185"></a>
-<span class="sourceLineNo">1186</span>    int ceiling = (int) Math.ceil(average * (1 + slop));<a name="line.1186"></a>
-<span class="sourceLineNo">1187</span>    if (!(cs.getMaxLoad() &gt; ceiling || cs.getMinLoad() &lt; floor)) {<a name="line.1187"></a>
-<span class="sourceLineNo">1188</span>      NavigableMap&lt;ServerAndLoad, List&lt;RegionInfo&gt;&gt; serversByLoad = cs.getServersByLoad();<a name="line.1188"></a>
-<span class="sourceLineNo">1189</span>      if (LOG.isTraceEnabled()) {<a name="line.1189"></a>
-<span class="sourceLineNo">1190</span>        // If nothing to balance, then don't say anything unless trace-level logging.<a name="line.1190"></a>
-<span class="sourceLineNo">1191</span>        LOG.trace("Skipping load balancing because balanced cluster; " +<a name="line.1191"></a>
-<span class="sourceLineNo">1192</span>          "servers=" + cs.getNumServers() +<a name="line.1192"></a>
-<span class="sourceLineNo">1193</span>          " regions=" + cs.getNumRegions() + " average=" + average +<a name="line.1193"></a>
-<span class="sourceLineNo">1194</span>          " mostloaded=" + serversByLoad.lastKey().getLoad() +<a name="line.1194"></a>
-<span class="sourceLineNo">1195</span>          " leastloaded=" + serversByLoad.firstKey().getLoad());<a name="line.1195"></a>
-<span class="sourceLineNo">1196</span>      }<a name="line.1196"></a>
-<span class="sourceLineNo">1197</span>      return false;<a name="line.1197"></a>
-<span class="sourceLineNo">1198</span>    }<a name="line.1198"></a>
-<span class="sourceLineNo">1199</span>    return true;<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>   * Subclasses should implement this to return true if the cluster has nodes that hosts<a name="line.1203"></a>
-<span class="sourceLineNo">1204</span>   * multiple replicas for the same region, or, if there are multiple racks and the same<a name="line.1204"></a>
-<span class="sourceLineNo">1205</span>   * rack hosts replicas of the same region<a name="line.1205"></a>
-<span class="sourceLineNo">1206</span>   * @param c Cluster information<a name="line.1206"></a>
-<span class="sourceLineNo">1207</span>   * @return whether region replicas are currently co-located<a name="line.1207"></a>
-<span class="sourceLineNo">1208</span>   */<a name="line.1208"></a>
-<span class="sourceLineNo">1209</span>  protected boolean areSomeRegionReplicasColocated(Cluster c) {<a name="line.1209"></a>
-<span class="sourceLineNo">1210</span>    return false;<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>   * Generates a bulk assignment plan to be used on cluster startup using a<a name="line.1214"></a>
-<span class="sourceLineNo">1215</span>   * simple round-robin assignment.<a name="line.1215"></a>
-<span class="sourceLineNo">1216</span>   * &lt;p&gt;<a name="line.1216"></a>
-<span class="sourceLineNo">1217</span>   * Takes a list of all the regions and all the servers in the cluster and<a name="line.1217"></a>
-<span class="sourceLineNo">1218</span>   * returns a map of each server to the regions that it should be assigned.<a name="line.1218"></a>
-<span class="sourceLineNo">1219</span>   * &lt;p&gt;<a name="line.1219"></a>
-<span class="sourceLineNo">1220</span>   * Currently implemented as a round-robin assignment. Same invariant as load<a name="line.1220"></a>
-<span class="sourceLineNo">1221</span>   * balancing, all servers holding floor(avg) or ceiling(avg).<a name="line.1221"></a>
-<span class="sourceLineNo">1222</span>   *<a name="line.1222"></a>
-<span class="sourceLineNo">1223</span>   * TODO: Use block locations from HDFS to place regions with their blocks<a name="line.1223"></a>
-<span class="sourceLineNo">1224</span>   *<a name="line.1224"></a>
-<span class="sourceLineNo">1225</span>   * @param regions all regions<a name="line.1225"></a>
-<span class="sourceLineNo">1226</span>   * @param servers all servers<a name="line.1226"></a>
-<span class="sourceLineNo">1227</span>   * @return map of server to the regions it should take, or null if no<a name="line.1227"></a>
-<span class="sourceLineNo">1228</span>   *         assignment is possible (ie. no regions or no servers)<a name="line.1228"></a>
-<span class="sourceLineNo">1229</span>   */<a name="line.1229"></a>
-<span class="sourceLineNo">1230</span>  @Override<a name="line.1230"></a>
-<span class="sourceLineNo">1231</span>  public Map&lt;ServerName, List&lt;RegionInfo&gt;&gt; roundRobinAssignment(List&lt;RegionInfo&gt; regions,<a name="line.1231"></a>
-<span class="sourceLineNo">1232</span>      List&lt;ServerName&gt; servers) throws HBaseIOException {<a name="line.1232"></a>
-<span class="sourceLineNo">1233</span>    metricsBalancer.incrMiscInvocations();<a name="line.1233"></a>
-<span class="sourceLineNo">1234</span>    Map&lt;ServerName, List&lt;RegionInfo&gt;&gt; assignments = assignMasterSystemRegions(regions, servers);<a name="line.1234"></a>
-<span class="sourceLineNo">1235</span>    if (assignments != null &amp;&amp; !assignments.isEmpty()) {<a name="line.1235"></a>
-<span class="sourceLineNo">1236</span>      servers = new ArrayList&lt;&gt;(servers);<a name="line.1236"></a>
-<span class="sourceLineNo">1237</span>      // Guarantee not to put other regions on master<a name="line.1237"></a>
-<span class="sourceLineNo">1238</span>      servers.remove(masterServerName);<a name="line.1238"></a>
-<span class="sourceLineNo">1239</span>      List&lt;RegionInfo&gt; masterRegions = assignments.get(masterServerName);<a name="line.1239"></a>
-<span class="sourceLineNo">1240</span>      if (!masterRegions.isEmpty()) {<a name="line.1240"></a>
-<span class="sourceLineNo">1241</span>        regions = new ArrayList&lt;&gt;(regions);<a name="line.1241"></a>
-<span class="sourceLineNo">1242</span>        regions.removeAll(masterRegions);<a name="line.1242"></a>
-<span class="sourceLineNo">1243</span>      }<a name="line.1243"></a>
-<span class="sourceLineNo">1244</span>    }<a name="line.1244"></a>
-<span class="sourceLineNo">1245</span>    if (regions == null || regions.isEmpty()) {<a name="line.1245"></a>
-<span class="sourceLineNo">1246</span>      return assignments;<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>    int numServers = servers == null ? 0 : servers.size();<a name="line.1249"></a>
-<span class="sourceLineNo">1250</span>    if (numServers == 0) {<a name="line.1250"></a>
-<span class="sourceLineNo">1251</span>      LOG.warn("Wanted to do round robin assignment but no servers to assign to");<a name="line.1251"></a>
-<span class="sourceLineNo">1252</span>      return null;<a name="line.1252"></a>
-<span class="sourceLineNo">1253</span>    }<a name="line.1253"></a>
-<span class="sourceLineNo">1254</span><a name="line.1254"></a>
-<span class="sourceLineNo">1255</span>    // TODO: instead of retainAssignment() and roundRobinAssignment(), we should just run the<a name="line.1255"></a>
-<span class="sourceLineNo">1256</span>    // normal LB.balancerCluster() with unassignedRegions. We only need to have a candidate<a name="line.1256"></a>
-<span class="sourceLineNo">1257</span>    // generator for AssignRegionAction. The LB will ensure the regions are mostly local<a name="line.1257"></a>
-<span class="sourceLineNo">1258</span>    // and balanced. This should also run fast with fewer number of iterations.<a name="line.1258"></a>
-<span class="sourceLineNo">1259</span><a name="line.1259"></a>
-<span class="sourceLineNo">1260</span>    if (numServers == 1) { // Only one server, nothing fancy we can do here<a name="line.1260"></a>
-<span class="sourceLineNo">1261</span>      ServerName server = servers.get(0);<a name="line.1261"></a>
-<span class="sourceLineNo">1262</span>      assignments.put(server, new ArrayList&lt;&gt;(regions));<a name="line.1262"></a>
-<span class="sourceLineNo">1263</span>      return assignments;<a name="line.1263"></a>
-<span class="sourceLineNo">1264</span>    }<a name="line.1264"></a>
-<span class="sourceLineNo">1265</span><a name="line.1265"></a>
-<span class="sourceLineNo">1266</span>    Cluster cluster = createCluster(servers, regions, false);<a name="line.1266"></a>
-<span class="sourceLineNo">1267</span>    List&lt;RegionInfo&gt; unassignedRegions = new ArrayList&lt;&gt;();<a name="line.1267"></a>
-<span class="sourceLineNo">1268</span><a name="line.1268"></a>
-<span class="sourceLineNo">1269</span>    roundRobinAssignment(cluster, regions, unassignedRegions,<a name="line.1269"></a>
-<span class="sourceLineNo">1270</span>      servers, assignments);<a name="line.1270"></a>
-<span class="sourceLineNo">1271</span><a name="line.1271"></a>
-<span class="sourceLineNo">1272</span>    List&lt;RegionInfo&gt; lastFewRegions = new ArrayList&lt;&gt;();<a name="line.1272"></a>
-<span class="sourceLineNo">1273</span>    // assign the remaining by going through the list and try to assign to servers one-by-one<a name="line.1273"></a>
-<span class="sourceLineNo">1274</span>    int serverIdx = RANDOM.nextInt(numServers);<a name="line.1274"></a>
-<span class="sourceLineNo">1275</span>    OUTER : for (RegionInfo region : unassignedRegions) {<a name="line.1275"></a>
-<span class="sourceLineNo">1276</span>      boolean assigned = false;<a name="line.1276"></a>
-<span class="sourceLineNo">1277</span>      INNER : for (int j = 0; j &lt; numServers; j++) { // try all servers one by one<a name="line.1277"></a>
-<span class="sourceLineNo">1278</span>        ServerName serverName = servers.get((j + serverIdx) % numServers);<a name="line.1278"></a>
-<span class="sourceLineNo">1279</span>        if (!cluster.wouldLowerAvailability(region, serverName)) {<a name="line.1279"></a>
-<span class="sourceLineNo">1280</span>          List&lt;RegionInfo&gt; serverRegions =<a name="line.1280"></a>
-<span class="sourceLineNo">1281</span>              assignments.computeIfAbsent(serverName, k -&gt; new ArrayList&lt;&gt;());<a name="line.1281"></a>
-<span class="sourceLineNo">1282</span>          if (!RegionReplicaUtil.isDefaultReplica(region.getReplicaId())) {<a name="line.1282"></a>
-<span class="sourceLineNo">1283</span>            // if the region is not a default replica<a name="line.1283"></a>
-<span class="sourceLineNo">1284</span>            // check if the assignments map has the other replica region on this server<a name="line.1284"></a>
-<span class="sourceLineNo">1285</span>            for (RegionInfo hri : serverRegions) {<a name="line.1285"></a>
-<span class="sourceLineNo">1286</span>              if (RegionReplicaUtil.isReplicasForSameRegion(region, hri)) {<a name="line.1286"></a>
-<span class="sourceLineNo">1287</span>                if (LOG.isTraceEnabled()) {<a name="line.1287"></a>
-<span class="sourceLineNo">1288</span>                  LOG.trace("Skipping the server, " + serverName<a name="line.1288"></a>
-<span class="sourceLineNo">1289</span>                      + " , got the same server for the region " + region);<a name="line.1289"></a>
-<span class="sourceLineNo">1290</span>                }<a name="line.1290"></a>
-<span class="sourceLineNo">1291</span>                // do not allow this case. The unassignedRegions we got because the<a name="line.1291"></a>
-<span class="sourceLineNo">1292</span>                // replica region in this list was not assigned because of lower availablity issue.<a name="line.1292"></a>
-<span class="sourceLineNo">1293</span>                // So when we assign here we should ensure that as far as possible the server being<a name="line.1293"></a>
-<span class="sourceLineNo">1294</span>                // selected does not have the server where the replica region was not assigned.<a name="line.1294"></a>
-<span class="sourceLineNo">1295</span>                continue INNER; // continue the inner loop, ie go to the next server<a name="line.1295"></a>
-<span class="sourceLineNo">1296</span>              }<a name="line.1296"></a>
-<span class="sourceLineNo">1297</span>            }<a name="line.1297"></a>
-<span class="sourceLineNo">1298</span>          }<a name="line.1298"></a>
-<span class="sourceLineNo">1299</span>          serverRegions.add(region);<a name="line.1299"></a>
-<span class="sourceLineNo">1300</span>          cluster.doAssignRegion(region, serverName);<a name="line.1300"></a>
-<span class="sourceLineNo">1301</span>          serverIdx = (j + serverIdx + 1) % numServers; //remain from next server<a name="line.1301"></a>
-<span class="sourceLineNo">1302</span>          assigned = true;<a name="line.1302"></a>
-<span class="sourceLineNo">1303</span>          break;<a name="line.1303"></a>
-<span class="sourceLineNo">1304</span>        }<a name="line.1304"></a>
-<span class="sourceLineNo">1305</span>      }<a name="line.1305"></a>
-<span class="sourceLineNo">1306</span>      if (!assigned) {<a name="line.1306"></a>
-<span class="sourceLineNo">1307</span>        lastFewRegions.add(region);<a name="line.1307"></a>
-<span class="sourceLineNo">1308</span>      }<a name="line.1308"></a>
-<span class="sourceLineNo">1309</span>    }<a name="line.1309"></a>
-<span class="sourceLineNo">1310</span>    // just sprinkle the rest of the regions on random regionservers. The balanceCluster will<a name="line.1310"></a>
-<span class="sourceLineNo">1311</span>    // make it optimal later. we can end up with this if numReplicas &gt; numServers.<a name="line.1311"></a>
-<span class="sourceLineNo">1312</span>    for (RegionInfo region : lastFewRegions) {<a name="line.1312"></a>
-<span class="sourceLineNo">1313</span>      int i = RANDOM.nextInt(numServers);<a name="line.1313"></a>
-<span class="sourceLineNo">1314</span>      ServerName server = servers.get(i);<a name="line.1314"></a>
-<span class="sourceLineNo">1315</span>      List&lt;RegionInfo&gt; serverRegions = assignments.computeIfAbsent(server, k -&gt; new ArrayList&lt;&gt;());<a name="line.1315"></a>
-<span class="sourceLineNo">1316</span>      serverRegions.add(region);<a name="line.1316"></a>
-<span class="sourceLineNo">1317</span>      cluster.doAssignRegion(region, server);<a name="line.1317"></a>
-<span class="sourceLineNo">1318</span>    }<a name="line.1318"></a>
-<span class="sourceLineNo">1319</span>    return assignments;<a name="line.1319"></a>
-<span class="sourceLineNo">1320</span>  }<a name="line.1320"></a>
-<span class="sourceLineNo">1321</span><a name="line.1321"></a>
-<span class="sourceLineNo">1322</span>  protected Cluster createCluster(List&lt;ServerName&gt; servers, Collection&lt;RegionInfo&gt; regions,<a name="line.1322"></a>
-<span class="sourceLineNo">1323</span>      boolean hasRegionReplica) {<a name="line.1323"></a>
-<span class="sourceLineNo">1324</span>    // Get the snapshot of the current assignments for the regions in question, and then create<a name="line.1324"></a>
-<span class="sourceLineNo">1325</span>    // a cluster out of it. Note that we might have replicas already assigned to some servers<a name="line.1325"></a>
-<span class="sourceLineNo">1326</span>    // earlier. So we want to get the snapshot to see those assignments, but this will only contain<a name="line.1326"></a>
-<span class="sourceLineNo">1327</span>    // replicas of the regions that are passed (for performance).<a name="line.1327"></a>
-<span class="sourceLineNo">1328</span>    Map&lt;ServerName, List&lt;RegionInfo&gt;&gt; clusterState = null;<a name="line.1328"></a>
-<span class="sourceLineNo">1329</span>    if (!hasRegionReplica) {<a name="line.1329"></a>
-<span class="sourceLineNo">1330</span>      clusterState = getRegionAssignmentsByServer(regions);<a name="line.1330"></a>
-<span class="sourceLineNo">1331</span>    } else {<a name="line.1331"></a>
-<span class="sourceLineNo">1332</span>      // for the case where we have region replica it is better we get the entire cluster's snapshot<a name="line.1332"></a>
-<span class="sourceLineNo">1333</span>      clusterState = getRegionAssignmentsByServer(null);<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>    for (ServerName server : servers) {<a name="line.1336"></a>
-<span class="sourceLineNo">1337</span>      if (!clusterState.containsKey(server)) {<a name="line.1337"></a>
-<span class="sourceLineNo">1338</span>        clusterState.put(server, EMPTY_REGION_LIST);<a name="line.1338"></a>
-<span class="sourceLineNo">1339</span>      }<a name="line.1339"></a>
-<span class="sourceLineNo">1340</span>    }<a name="line.1340"></a>
-<span class="sourceLineNo">1341</span>    return new Cluster(regions, clusterState, null, this.regionFinder,<a name="line.1341"></a>
-<span class="sourceLineNo">1342</span>        rackManager);<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>  private List&lt;ServerName&gt; findIdleServers(List&lt;ServerName&gt; servers) {<a name="line.1345"></a>
-<span class="sourceLineNo">1346</span>    return this.services.getServerManager()<a name="line.1346"></a>
-<span class="sourceLineNo">1347</span>            .getOnlineServersListWithPredicator(servers, IDLE_SERVER_PREDICATOR);<a name="line.1347"></a>
-<span class="sourceLineNo">1348</span>  }<a name="line.1348"></a>
-<span class="sourceLineNo">1349</span><a name="line.1349"></a>
-<span class="sourceLineNo">1350</span>  /**<a name="line.1350"></a>
-<span class="sourceLineNo">1351</span>   * Used to assign a single region to a random server.<a name="line.1351"></a>
-<span class="sourceLineNo">1352</span>   */<a name="line.1352"></a>
-<span class="sourceLineNo">1353</span>  @Override<a name="line.1353"></a>
-<span class="sourceLineNo">1354</span>  public ServerName randomAssignment(RegionInfo regionInfo, List&lt;ServerName&gt; servers)<a name="line.1354"></a>
-<span class="sourceLineNo">1355</span>      throws HBaseIOException {<a name="line.1355"></a>
-<span class="sourceLineNo">1356</span>    metricsBalancer.incrMiscInvocations();<a name="line.1356"></a>
-<span class="sourceLineNo">1357</span>    if (servers != null &amp;&amp; servers.contains(masterServerName)) {<a name="line.1357"></a>
-<span class="sourceLineNo">1358</span>      if (shouldBeOnMaster(regionInfo)) {<a name="line.1358"></a>
-<span class="sourceLineNo">1359</span>        return masterServerName;<a name="line.1359"></a>
-<span class="sourceLineNo">1360</span>      }<a name="line.1360"></a>
-<span class="sourceLineNo">1361</span>      if (!LoadBalancer.isTablesOnMaster(getConf())) {<a name="line.1361"></a>
-<span class="sourceLineNo">1362</span>        // Guarantee we do not put any regions on master<a name="line.1362"></a>
-<span class="sourceLineNo">1363</span>        servers = new ArrayList&lt;&gt;(servers);<a name="line.1363"></a>
-<span class="sourceLineNo">1364</span>        servers.remove(masterServerName);<a name="line.1364"></a>
-<span class="sourceLineNo">1365</span>      }<a name="line.1365"></a>
-<span class="sourceLineNo">1366</span>    }<a name="line.1366"></a>
-<span class="sourceLineNo">1367</span><a name="line.1367"></a>
-<span class="sourceLineNo">1368</span>    int numServers = servers == null ? 0 : servers.size();<a name="line.1368"></a>
-<span class="sourceLineNo">1369</span>    if (numServers == 0) {<a name="line.1369"></a>
-<span class="sourceLineNo">1370</span>      LOG.warn("Wanted to retain assignment but no servers to assign to");<a name="line.1370"></a>
-<span class="sourceLineNo">1371</span>      return null;<a name="line.1371"></a>
-<span class="sourceLineNo">1372</span>    }<a name="line.1372"></a>
-<span class="sourceLineNo">1373</span>    if (numServers == 1) { // Only one server, nothing fancy we can do here<a name="line.1373"></a>
-<span class="sourceLineNo">1374</span>      return servers.get(0);<a name="line.1374"></a>
-<span class="sourceLineNo">1375</span>    }<a name="line.1375"></a>
-<span class="sourceLineNo">1376</span>    List&lt;ServerName&gt; idleServers = findIdleServers(servers);<a name="line.1376"></a>
-<span class="sourceLineNo">1377</span>    if (idleServers.size() == 1) {<a name="line.1377"></a>
-<span class="sourceLineNo">1378</span>      return idleServers.get(0);<a name="line.1378"></a>
-<span class="sourceLineNo">1379</span>    }<a name="line.1379"></a>
-<span class="sourceLineNo">1380</span>    final List&lt;ServerName&gt; finalServers = idleServers.isEmpty() ?<a name="line.1380"></a>
-<span class="sourceLineNo">1381</span>            servers : idleServers;<a name="line.1381"></a>
-<span class="sourceLineNo">1382</span>    List&lt;RegionInfo&gt; regions = Lists.newArrayList(regionInfo);<a name="line.1382"></a>
-<span class="sourceLineNo">1383</span>    Cluster cluster = createCluster(finalServers, regions, false);<a name="line.1383"></a>
-<span class="sourceLineNo">1384</span>    return randomAssignment(cluster, regionInfo, finalServers);<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>  /**<a name="line.1387"></a>
-<span class="sourceLineNo">1388</span>   * Generates a bulk assignment startup plan, attempting to reuse the existing<a name="line.1388"></a>
-<span class="sourceLineNo">1389</span>   * assignment information from META, but adjusting for the specified list of<a name="line.1389"></a>
-<span class="sourceLineNo">1390</span>   * available/online servers available for assignment.<a name="line.1390"></a>
-<span class="sourceLineNo">1391</span>   * &lt;p&gt;<a name="line.1391"></a>
-<span class="sourceLineNo">1392</span>   * Takes a map of all regions to their existing assignment from META. Also<a name="line.1392"></a>
-<span class="sourceLineNo">1393</span>   * takes a list of online servers for regions to be assigned to. Attempts to<a name="line.1393"></a>
-<span class="sourceLineNo">1394</span>   * retain all assignment, so in some instances initial assignment will not be<a name="line.1394"></a>
-<span class="sourceLineNo">1395</span>   * completely balanced.<a name="line.1395"></a>
-<span class="sourceLineNo">1396</span>   * &lt;p&gt;<a name="line.1396"></a>
-<span class="sourceLineNo">1397</span>   * Any leftover regions without an existing server to be assigned to will be<a name="line.1397"></a>
-<span class="sourceLineNo">1398</span>   * assigned randomly to available servers.<a name="line.1398"></a>
-<span class="sourceLineNo">1399</span>   *<a name="line.1399"></a>
-<span class="sourceLineNo">1400</span>   * @param regions regions and existing assignment from meta<a name="line.1400"></a>
-<span class="sourceLineNo">1401</span>   * @param servers available servers<a name="line.1401"></a>
-<span class="sourceLineNo">1402</span>   * @return map of servers and regions to be assigned to them<a name="line.1402"></a>
-<span class="sourceLineNo">1403</span>   */<a name="line.1403"></a>
-<span class="sourceLineNo">1404</span>  @Override<a name="line.1404"></a>
-<span class="sourceLineNo">1405</span>  public Map&lt;ServerName, List&lt;RegionInfo&gt;&gt; retainAssignment(Map&lt;RegionInfo, ServerName&gt; regions,<a name="line.1405"></a>
-<span class="sourceLineNo">1406</span>      List&lt;ServerName&gt; servers) throws HBaseIOException {<a name="line.1406"></a>
-<span class="sourceLineNo">1407</span>    // Update metrics<a name="line.1407"></a>
-<span class="sourceLineNo">1408</span>    metricsBalancer.incrMiscInvocations();<a name="line.1408"></a>
-<span class="sourceLineNo">1409</span>    Map&lt;ServerName, List&lt;RegionInfo&gt;&gt; assignments = assignMasterSystemRegions(regions.keySet(), servers);<a name="line.1409"></a>
-<span class="sourceLineNo">1410</span>    if (assignments != null &amp;&amp; !assignments.isEmpty()) {<a name="line.1410"></a>
-<span class="sourceLineNo">1411</span>      servers = new ArrayList&lt;&gt;(servers);<a name="line.1411"></a>
-<span class="sourceLineNo">1412</span>      // Guarantee not to put other regions on master<a name="line.1412"></a>
-<span class="sourceLineNo">1413</span>      servers.remove(masterServerName);<a name="line.1413"></a>
-<span class="sourceLineNo">1414</span>      List&lt;RegionInfo&gt; masterRegions = assignments.get(masterServerName);<a name="line.1414"></a>
-<span class="sourceLineNo">1415</span>      regions = regions.entrySet().stream().filter(e -&gt; !masterRegions.contains(e.getKey()))<a name="line.1415"></a>
-<span class="sourceLineNo">1416</span>          .collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue));<a name="line.1416"></a>
-<span class="sourceLineNo">1417</span>    }<a name="line.1417"></a>
-<span class="sourceLineNo">1418</span>    if (regions.isEmpty()) {<a name="line.1418"></a>
-<span class="sourceLineNo">1419</span>      return assignments;<a name="line.1419"></a>
-<span class="sourceLineNo">1420</span>    }<a name="line.1420"></a>
-<span class="sourceLineNo">1421</span><a name="line.1421"></a>
-<span class="sourceLineNo">1422</span>    int numServers = servers == null ? 0 : servers.size();<a name="line.1422"></a>
-<span class="sourceLineNo">1423</span>    if (numServers == 0) {<a name="line.1423"></a>
-<span class="sourceLineNo">1424</span>      LOG.warn("Wanted to do retain assignment but no servers to assign to");<a name="line.1424"></a>
-<span class="sourceLineNo">1425</span>      return null;<a name="line.1425"></a>
-<span class="sourceLineNo">1426</span>    }<a name="line.1426"></a>
-<span class="sourceLineNo">1427</span>    if (numServers == 1) { // Only one server, nothing fancy we can do here<a name="line.1427"></a>
-<span class="sourceLineNo">1428</span>      ServerName server = servers.get(0);<a name="line.1428"></a>
-<span class="sourceLineNo">1429</span>      assignments.put(server, new ArrayList&lt;&gt;(regions.keySet()));<a name="line.1429"></a>
-<span class="sourceLineNo">1430</span>      return assignments;<a name="line.1430"></a>
-<span class="sourceLineNo">1431</span>    }<a name="line.1431"></a>
-<span class="sourceLineNo">1432</span><a name="line.1432"></a>
-<span class="sourceLineNo">1433</span>    // Group all of the old assignments by their hostname.<a name="line.1433"></a>
-<span class="sourceLineNo">1434</span>    // We can't group directly by ServerName since the servers all have<a name="line.1434"></a>
-<span class="sourceLineNo">1435</span>    // new start-codes.<a name="line.1435"></a>
-<span class="sourceLineNo">1436</span><a name="line.1436"></a>
-<span class="sourceLineNo">1437</span>    // Group the servers by their hostname. It's possible we have multiple<a name="line.1437"></a>
-<span class="sourceLineNo">1438</span>    // servers on the same host on different ports.<a name="line.1438"></a>
-<span class="sourceLineNo">1439</span>    ArrayListMultimap&lt;String, ServerName&gt; serversByHostname = ArrayListMultimap.create();<a name="line.1439"></a>
-<span class="sourceLineNo">1440</span>    for (ServerName server : servers) {<a name="line.1440"></a>
-<span class="sourceLineNo">1441</span>      assignments.put(server, new ArrayList&lt;&gt;());<a name="line.1441"></a>
-<span class="sourceLineNo">1442</span>      serversByHostname.put(server.getHostnameLowerCase(), server);<a name="line.1442"></a>
-<span class="sourceLineNo">1443</span>    }<a name="line.1443"></a>
-<span class="sourceLineNo">1444</span><a name="line.1444"></a>
-<span class="sourceLineNo">1445</span>    // Collection of the hostnames that used to have regions<a name="line.1445"></a>
-<span class="sourceLineNo">1446</span>    // assigned, but for which we no longer have any RS running<a name="line.1446"></a>
-<span class="sourceLineNo">1447</span>    // after the cluster restart.<a name="line.1447"></a>
-<span class="sourceLineNo">1448</span>    Set&lt;String&gt; oldHostsNoLongerPresent = Sets.newTreeSet();<a name="line.1448"></a>
-<span class="sourceLineNo">1449</span><a name="line.1449"></a>
-<span class="sourceLineNo">1450</span>    // If the old servers aren't present, lets assign those regions later.<a name="line.1450"></a>
-<span class="sourceLineNo">1451</span>    List&lt;RegionInfo&gt; randomAssignRegions = Lists.newArrayList();<a name="line.1451"></a>
-<span class="sourceLineNo">1452</span><a name="line.1452"></a>
-<span class="sourceLineNo">1453</span>    int numRandomAssignments = 0;<a name="line.1453"></a>
-<span class="sourceLineNo">1454</span>    int numRetainedAssigments = 0;<a name="line.1454"></a>
-<span class="sourceLineNo">1455</span>    boolean hasRegionReplica = false;<a name="line.1455"></a>
-<span class="sourceLineNo">1456</span>    for (Map.Entry&lt;RegionInfo, ServerName&gt; entry : regions.entrySet()) {<a name="line.1456"></a>
-<span class="sourceLineNo">1457</span>      RegionInfo region = entry.getKey();<a name="line.1457"></a>
-<span class="sourceLineNo">1458</span>      ServerName oldServerName = entry.getValue();<a name="line.1458"></a>
-<span class="sourceLineNo">1459</span>      // In the current set of regions even if one has region replica let us go with<a name="line.1459"></a>
-<span class="sourceLineNo">1460</span>      // getting the entire snapshot<a name="line.1460"></a>
-<span class="sourceLineNo">1461</span>      if (this.services != null) { // for tests<a name="line.1461"></a>
-<span class="sourceLineNo">1462</span>        AssignmentManager am = this.services.getAssignmentManager();<a name="line.1462"></a>
-<span class="sourceLineNo">1463</span>        if (am != null) {<a name="line.1463"></a>
-<span class="sourceLineNo">1464</span>          RegionStates states = am.getRegionStates();<a name="line.1464"></a>
-<span class="sourceLineNo">1465</span>          if (!hasRegionReplica &amp;&amp; states != null &amp;&amp; states.isReplicaAvailableForRegion(region)) {<a name="line.1465"></a>
-<span class="sourceLineNo">1466</span>            hasRegionReplica = true;<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>      List&lt;ServerName&gt; localServers = new ArrayList&lt;&gt;();<a name="line.1470"></a>
-<span class="sourceLineNo">1471</span>      if (oldServerName != null) {<a name="line.1471"></a>
-<span class="sourceLineNo">1472</span>        localServers = serversByHostname.get(oldServerName.getHostnameLowerCase());<a name="line.1472"></a>
-<span class="sourceLineNo">1473</span>      }<a name="line.1473"></a>
-<span class="sourceLineNo">1474</span>      if (localServers.isEmpty()) {<a name="line.1474"></a>
-<span class="sourceLineNo">1475</span>        // No servers on the new cluster match up with this hostname, assign randomly, later.<a name="line.1475"></a>
-<span class="sourceLineNo">1476</span>        randomAssignRegions.add(region);<a name="line.1476"></a>
-<span class="sourceLineNo">1477</span>        if (oldServerName != null) {<a name="line.1477"></a>
-<span class="sourceLineNo">1478</span>          oldHostsNoLongerPresent.add(oldServerName.getHostnameLowerCase());<a name="line.1478"></a>
-<span class="sourceLineNo">1479</span>        }<a name="line.1479"></a>
-<span class="sourceLineNo">1480</span>      } else if (localServers.size() == 1) {<a name="line.1480"></a>
-<span class="sourceLineNo">1481</span>        // the usual case - one new server on same host<a name="line.1481"></a>
-<span class="sourceLineNo">1482</span>        ServerName target = localServers.get(0);<a name="line.1482"></a>
-<span class="sourceLineNo">1483</span>        assignments.get(target).add(region);<a name="line.1483"></a>
-<span class="sourceLineNo">1484</span>        numRetainedAssigments++;<a name="line.1484"></a>
-<span class="sourceLineNo">1485</span>      } else {<a name="line.1485"></a>
-<span class="sourceLineNo">1486</span>        // multiple new servers in the cluster on this same host<a name="line.1486"></a>
-<span class="sourceLineNo">1487</span>        if (localServers.contains(oldServerName)) {<a name="line.1487"></a>
-<span class="sourceLineNo">1488</span>          assignments.get(oldServerName).add(region);<a name="line.1488"></a>
-<span class="sourceLineNo">1489</span>          numRetainedAssigments++;<a name="line.1489"></a>
-<span class="sourceLineNo">1490</span>        } else {<a name="line.1490"></a>
-<span class="sourceLineNo">1491</span>          ServerName target = null;<a name="line.1491"></a>
-<span class="sourceLineNo">1492</span>          for (ServerName tmp : localServers) {<a name="line.1492"></a>
-<span class="sourceLineNo">1493</span>            if (tmp.getPort() == oldServerName.getPort()) {<a name="line.1493"></a>
-<span class="sourceLineNo">1494</span>              target = tmp;<a name="line.1494"></a>
-<span class="sourceLineNo">1495</span>              assignments.get(tmp).add(region);<a name="line.1495"></a>
-<span class="sourceLineNo">1496</span>              numRetainedAssigments++;<a name="line.1496"></a>
-<span class="sourceLineNo">1497</span>              break;<a name="line.1497"></a>
-<span class="sourceLineNo">1498</span>            }<a name="line.1498"></a>
-<span class="sourceLineNo">1499</span>          }<a name="line.1499"></a>
-<span class="sourceLineNo">1500</span>          if (target == null) {<a name="line.1500"></a>
-<span class="sourceLineNo">1501</span>            randomAssignRegions.add(region);<a name="line.1501"></a>
-<span class="sourceLineNo">1502</span>          }<a name="line.1502"></a>
-<span class="sourceLineNo">1503</span>        }<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><a name="line.1506"></a>
-<span class="sourceLineNo">1507</span>    // If servers from prior assignment aren't present, then lets do randomAssignment on regions.<a name="line.1507"></a>
-<span class="sourceLineNo">1508</span>    if (randomAssignRegions.size() &gt; 0) {<a name="line.1508"></a>
-<span class="sourceLineNo">1509</span>      Cluster cluster = createCluster(servers, regions.keySet(), hasRegionReplica);<a name="line.1509"></a>
-<span class="sourceLineNo">1510</span>      for (Map.Entry&lt;ServerName, List&lt;RegionInfo&gt;&gt; entry : assignments.entrySet()) {<a name="line.1510"></a>
-<span class="sourceLineNo">1511</span>        ServerName sn = entry.getKey();<a name="line.1511"></a>
-<span class="sourceLineNo">1512</span>        for (RegionInfo region : entry.getValue()) {<a name="line.1512"></a>
-<span class="sourceLineNo">1513</span>          cluster.doAssignRegion(region, sn);<a name="line.1513"></a>
-<span class="sourceLineNo">1514</span>        }<a name="line.1514"></a>
-<span class="sourceLineNo">1515</span>      }<a name="line.1515"></a>
-<span class="sourceLineNo">1516</span>      for (RegionInfo region : randomAssignRegions) {<a name="line.1516"></a>
-<span class="sourceLineNo">1517</span>        ServerName target = randomAssignment(cluster, region, servers);<a name="line.1517"></a>
-<span class="sourceLineNo">1518</span>        assignments.get(target).add(region);<a name="line.1518"></a>
-<span class="sourceLineNo">1519</span>        numRandomAssignments++;<a name="line.1519"></a>
-<span class="sourceLineNo">1520</span>      }<a name="line.1520"></a>
-<span class="sourceLineNo">1521</span>    }<a name="line.1521"></a>
-<span class="sourceLineNo">1522</span><a name="line.1522"></a>
-<span class="sourceLineNo">1523</span>    String randomAssignMsg = "";<a name="line.1523"></a>
-<span class="sourceLineNo">1524</span>    if (numRandomAssignments &gt; 0) {<a name="line.1524"></a>
-<span class="sourceLineNo">1525</span>      randomAssignMsg =<a name="line.1525"></a>
-<span class="sourceLineNo">1526</span>          numRandomAssignments + " regions were assigned "<a name="line.1526"></a>
-<span class="sourceLineNo">1527</span>              + "to random hosts, since the old hosts for these regions are no "<a name="line.1527"></a>
-<span class="sourceLineNo">1528</span>              + "longer present in the cluster. These hosts were:\n  "<a name="line.1528"></a>
-<span class="sourceLineNo">1529</span>              + Joiner.on("\n  ").join(oldHostsNoLongerPresent);<a name="line.1529"></a>
-<span class="sourceLineNo">1530</span>    }<a name="line.1530"></a>
-<span class="sourceLineNo">1531</span><a name="line.1531"></a>
-<span class="sourceLineNo">1532</span>    LOG.info("Reassigned " + regions.size() + " regions. " + numRetainedAssigments<a name="line.1532"></a>
-<span class="sourceLineNo">1533</span>        + " retained the pre-restart assignment. " + randomAssignMsg);<a name="line.1533"></a>
-<span class="sourceLineNo">1534</span>    return assignments;<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>  @Override<a name="line.1537"></a>
-<span class="sourceLineNo">1538</span>  public void initialize() throws HBaseIOException{<a name="line.1538"></a>
-<span class="sourceLineNo">1539</span>  }<a name="line.1539"></a>
-<span class="sourceLineNo">1540</span><a name="line.1540"></a>
-<span class="sourceLineNo">1541</span>  @Override<a name="line.1541"></a>
-<span class="sourceLineNo">1542</span>  public void regionOnline(RegionInfo regionInfo, ServerName sn) {<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>  @Override<a name="line.1545"></a>
-<span class="sourceLineNo">1546</span>  public void regionOffline(RegionInfo regionInfo) {<a name="line.1546"></a>
-<span class="sourceLineNo">1547</span>  }<a name="line.1547"></a>
-<span class="sourceLineNo">1548</span><a name="line.1548"></a>
-<span class="sourceLineNo">1549</span>  @Override<a name="line.1549"></a>
-<span class="sourceLineNo">1550</span>  public boolean isStopped() {<a name="line.1550"></a>
-<span class="sourceLineNo">1551</span>    return stopped;<a name="line.1551"></a>
-<span class="sourceLineNo">1552</span>  }<a name="line.1552"></a>
-<span class="sourceLineNo">1553</span><a name="line.1553"></a>
-<span class="sourceLineNo">1554</span>  @Override<a name="line.1554"></a>
-<span class="sourceLineNo">1555</span>  public void stop(String why) {<a name="line.1555"></a>
-<span class="sourceLineNo">1556</span>    LOG.info("Load Balancer stop requested: "+why);<a name="line.1556"></a>
-<span class="sourceLineNo">1557</span>    stopped = true;<a name="line.1557"></a>
-<span class="sourceLineNo">1558</span>  }<a name="line.1558"></a>
-<span class="sourceLineNo">1559</span><a name="line.1559"></a>
-<span class="sourceLineNo">1560</span>  /**<a name="line.1560"></a>
-<span class="sourceLineNo">1561</span>  * Updates the balancer status tag reported to JMX<a name="line.1561"></a>
-<span class="sourceLineNo">1562</span>  */<a name="line.1562"></a>
-<span class="sourceLineNo">1563</span>  public void updateBalancerStatus(boolean status) {<a name="line.1563"></a>
-<span class="sourceLineNo">1564</span>    metricsBalancer.balancerStatus(status);<a name="line.1564"></a>
-<span class="sourceLineNo">1565</span>  }<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>   * Used to assign a single region to a random server.<a name="line.1568"></a>
-<span class="sourceLineNo">1569</span>   */<a name="line.1569"></a>
-<span class="sourceLineNo">1570</span>  private ServerName randomAssignment(Cluster cluster, RegionInfo regionInfo,<a name="line.1570"></a>
-<span class="sourceLineNo">1571</span>      List&lt;ServerName&gt; servers) {<a name="line.1571"></a>
-<span class="sourceLineNo">1572</span>    int numServers = servers.size(); // servers is not null, numServers &gt; 1<a name="line.1572"></a>
-<span class="sourceLineNo">1573</span>    ServerName sn = null;<a name="line.1573"></a>
-<span class="sourceLineNo">1574</span>    final int maxIterations = numServers * 4;<a name="line.1574"></a>
-<span class="sourceLineNo">1575</span>    int iterations = 0;<a name="line.1575"></a>
-<span class="sourceLineNo">1576</span>    List&lt;ServerName&gt; usedSNs = new ArrayList&lt;&gt;(servers.size());<a name="line.1576"></a>
-<span class="sourceLineNo">1577</span>    do {<a name="line.1577"></a>
-<span class="sourceLineNo">1578</span>      int i = RANDOM.nextInt(numServers);<a name="line.1578"></a>
-<span class="sourceLineNo">1579</span>      sn = servers.get(i);<a name="line.1579"></a>
-<span class="sourceLineNo">1580</span>      if (!usedSNs.contains(sn)) {<a name="line.1580"></a>
-<span class="sourceLineNo">1581</span>        usedSNs.add(sn);<a name="line.1581"></a>
-<span class="sourceLineNo">1582</span>      }<a name="line.1582"></a>
-<span class="sourceLineNo">1583</span>    } while (cluster.wouldLowerAvailability(regionInfo, sn)<a name="line.1583"></a>
-<span class="sourceLineNo">1584</span>        &amp;&amp; iterations++ &lt; maxIterations);<a name="line.1584"></a>
-<span class="sourceLineNo">1585</span>    if (iterations &gt;= maxIterations) {<a name="line.1585"></a>
-<span class="sourceLineNo">1586</span>      // We have reached the max. Means the servers that we collected is still lowering the<a name="line.1586"></a>
-<span class="sourceLineNo">1587</span>      // availability<a name="line.1587"></a>
-<span class="sourceLineNo">1588</span>      for (ServerName unusedServer : servers) {<a name="line.1588"></a>
-<span class="sourceLineNo">1589</span>        if (!usedSNs.contains(unusedServer)) {<a name="line.1589"></a>
-<span class="sourceLineNo">1590</span>          // check if any other unused server is there for us to use.<a name="line.1590"></a>
-<span class="sourceLineNo">1591</span>          // If so use it. Else we have not other go but to go with one of them<a name="line.1591"></a>
-<span class="sourceLineNo">1592</span>          if (!cluster.wouldLowerAvailability(regionInfo, unusedServer)) {<a name="line.1592"></a>
-<span class="sourceLineNo">1593</span>            sn = unusedServer;<a name="line.1593"></a>
-<span class="sourceLineNo">1594</span>            break;<a name="line.1594"></a>
-<span class="sourceLineNo">1595</span>          }<a name="line.1595"></a>
-<span class="sourceLineNo">1596</span>        }<a name="line.1596"></a>
-<span class="sourceLineNo">1597</span>      }<a name="line.1597"></a>
-<span class="sourceLineNo">1598</span>    }<a name="line.1598"></a>
-<span class="sourceLineNo">1599</span>    cluster.doAssignRegion(regionInfo, sn);<a name="line.1599"></a>
-<span class="sourceLineNo">1600</span>    return sn;<a name="line.1600"></a>
-<span class="sourceLineNo">1601</span>  }<a name="line.1601"></a>
-<span class="sourceLineNo">1602</span><a name="line.1602"></a>
-<span class="sourceLineNo">1603</span>  /**<a name="line.1603"></a>
-<span class="sourceLineNo">1604</span>   * Round robin a list of regions to a list of servers<a name="line.1604"></a>
-<span class="sourceLineNo">1605</span>   */<a name="line.1605"></a>
-<span class="sourceLineNo">1606</span>  private void roundRobinAssignment(Cluster cluster, List&lt;RegionInfo&gt; regions,<a name="line.1606"></a>
-<span class="sourceLineNo">1607</span>      List&lt;RegionInfo&gt; unassignedRegions, List&lt;ServerName&gt; servers,<a name="line.1607"></a>
-<span class="sourceLineNo">1608</span>      Map&lt;ServerName, List&lt;RegionInfo&gt;&gt; assignments) {<a name="line.1608"></a>
-<span class="sourceLineNo">1609</span><a name="line.1609"></a>
-<span class="sourceLineNo">1610</span>    int numServers = servers.size();<a name="line.1610"></a>
-<span class="sourceLineNo">1611</span>    int numRegions = regions.size();<a name="line.1611"></a>
-<span class="sourceLineNo">1612</span>    int max = (int) Math.ceil((float) numRegions / numServers);<a name="line.1612"></a>
-<span class="sourceLineNo">1613</span>    int serverIdx = 0;<a name="line.1613"></a>
-<span class="sourceLineNo">1614</span>    if (numServers &gt; 1) {<a name="line.1614"></a>
-<span class="sourceLineNo">1615</span>      serverIdx = RANDOM.nextInt(numServers);<a name="line.1615"></a>
-<span class="sourceLineNo">1616</span>    }<a name="line.1616"></a>
-<span class="sourceLineNo">1617</span>    int regionIdx = 0;<a name="line.1617"></a>
-<span class="sourceLineNo">1618</span><a name="line.1618"></a>
-<span class="sourceLineNo">1619</span>    for (int j = 0; j &lt; numServers; j++) {<a name="line.1619"></a>
-<span class="sourceLineNo">1620</span>      ServerName server = servers.get((j + serverIdx) % numServers);<a name="line.1620"></a>
-<span class="sourceLineNo">1621</span>      List&lt;RegionInfo&gt; serverRegions = new ArrayList&lt;&gt;(max);<a name="line.1621"></a>
-<span class="sourceLineNo">1622</span>      for (int i = regionIdx; i &lt; numRegions; i += numServers) {<a name="line.1622"></a>
-<span class="sourceLineNo">1623</span>        RegionInfo region = regions.get(i % numRegions);<a name="line.1623"></a>
-<span class="sourceLineNo">1624</span>        if (cluster.wouldLowerAvailability(region, server)) {<a name="line.1624"></a>
-<span class="sourceLineNo">1625</span>          unassignedRegions.add(region);<a name="line.1625"></a>
-<span class="sourceLineNo">1626</span>        } else {<a name="line.1626"></a>
-<span class="sourceLineNo">1627</span>          serverRegions.add(region);<a name="line.1627"></a>
-<span class="sourceLineNo">1628</span>          cluster.doAssignRegion(region, server);<a name="line.1628"></a>
-<span class="sourceLineNo">1629</span>        }<a name="line.1629"></a>
-<span class="sourceLineNo">1630</span>      }<a name="line.1630"></a>
-<span class="sourceLineNo">1631</span>      assignments.put(server, serverRegions);<a name="line.1631"></a>
-<span class="sourceLineNo">1632</span>      regionIdx++;<a name="line.1632"></a>
-<span class="sourceLineNo">1633</span>    }<a name="line.1633"></a>
-<span class="sourceLineNo">1634</span>  }<a name="line.1634"></a>
-<span class="sourceLineNo">1635</span><a name="line.1635"></a>
-<span class="sourceLineNo">1636</span>  protected Map&lt;ServerName, List&lt;RegionInfo&gt;&gt; getRegionAssignmentsByServer(<a name="line.1636"></a>
-<span class="sourceLineNo">1637</span>    Collection&lt;RegionInfo&gt; regions) {<a name="line.1637"></a>
-<span class="sourceLineNo">1638</span>    if (this.services != null &amp;&amp; this.services.getAssignmentManager() != null) {<a name="line.1638"></a>
-<span class="sourceLineNo">1639</span>      return this.services.getAssignmentManager().getSnapShotOfAssignment(regions);<a name="line.1639"></a>
-<span class="sourceLineNo">1640</span>    } else {<a name="line.1640"></a>
-<span class="sourceLineNo">1641</span>      return new HashMap&lt;&gt;();<a name="line.1641"></a>
-<span class="sourceLineNo">1642</span>    }<a name="line.1642"></a>
-<span class="sourceLineNo">1643</span>  }<a name="line.1643"></a>
-<span class="sourceLineNo">1644</span><a name="line.1644"></a>
-<span class="sourceLineNo">1645</span>  @Override<a name="line.1645"></a>
-<span class="sourceLineNo">1646</span>  public void onConfigurationChange(Configuration conf) {<a name="line.1646"></a>
-<span class="sourceLineNo">1647</span>  }<a name="line.1647"></a>
-<span class="sourceLineNo">1648</span>}<a name="line.1648"></a>
+<span class="sourceLineNo">1044</span>  /**<a name="line.1044"></a>
+<span class="sourceLineNo">1045</span>   * Check if a region belongs to some system table.<a name="line.1045"></a>
+<span class="sourceLineNo">1046</span>   * If so, the primary replica may be expected to be put on the master regionserver.<a name="line.1046"></a>
+<span class="sourceLineNo">1047</span>   */<a name="line.1047"></a>
+<span class="sourceLineNo">1048</span>  public boolean shouldBeOnMaster(RegionInfo region) {<a name="line.1048"></a>
+<span class="sourceLineNo">1049</span>    return (this.maintenanceMode || this.onlySystemTablesOnMaster)<a name="line.1049"></a>
+<span class="sourceLineNo">1050</span>        &amp;&amp; region.getTable().isSystemTable();<a name="line.1050"></a>
+<span class="sourceLineNo">1051</span>  }<a name="line.1051"></a>
+<span class="sourceLineNo">1052</span><a name="line.1052"></a>
+<span class="sourceLineNo">1053</span>  /**<a name="line.1053"></a>
+<span class="sourceLineNo">1054</span>   * Balance the regions that should be on master regionserver.<a name="line.1054"></a>
+<span class="sourceLineNo">1055</span>   */<a name="line.1055"></a>
+<span class="sourceLineNo">1056</span>  protected List&lt;RegionPlan&gt; balanceMasterRegions(Map&lt;ServerName, List&lt;RegionInfo&gt;&gt; clusterMap) {<a name="line.1056"></a>
+<span class="sourceLineNo">1057</span>    if (masterServerName == null || clusterMap == null || clusterMap.size() &lt;= 1) return null;<a name="line.1057"></a>
+<span class="sourceLineNo">1058</span>    List&lt;RegionPlan&gt; plans = null;<a name="line.1058"></a>
+<span class="sourceLineNo">1059</span>    List&lt;RegionInfo&gt; regions = clusterMap.get(masterServerName);<a name="line.1059"></a>
+<span class="sourceLineNo">1060</span>    if (regions != null) {<a name="line.1060"></a>
+<span class="sourceLineNo">1061</span>      Iterator&lt;ServerName&gt; keyIt = null;<a name="line.1061"></a>
+<span class="sourceLineNo">1062</span>      for (RegionInfo region: regions) {<a name="line.1062"></a>
+<span class="sourceLineNo">1063</span>        if (shouldBeOnMaster(region)) continue;<a name="line.1063"></a>
+<span class="sourceLineNo">1064</span><a name="line.1064"></a>
+<span class="sourceLineNo">1065</span>        // Find a non-master regionserver to host the region<a name="line.1065"></a>
+<span class="sourceLineNo">1066</span>        if (keyIt == null || !keyIt.hasNext()) {<a name="line.1066"></a>
+<span class="sourceLineNo">1067</span>          keyIt = clusterMap.keySet().iterator();<a name="line.1067"></a>
+<span class="sourceLineNo">1068</span>        }<a name="line.1068"></a>
+<span class="sourceLineNo">1069</span>        ServerName dest = keyIt.next();<a name="line.1069"></a>
+<span class="sourceLineNo">1070</span>        if (masterServerName.equals(dest)) {<a name="line.1070"></a>
+<span class="sourceLineNo">1071</span>          if (!keyIt.hasNext()) {<a name="line.1071"></a>
+<span class="sourceLineNo">1072</span>            keyIt = clusterMap.keySet().iterator();<a name="line.1072"></a>
+<span class="sourceLineNo">1073</span>          }<a name="line.1073"></a>
+<span class="sourceLineNo">1074</span>          dest = keyIt.next();<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>        // Move this region away from the master regionserver<a name="line.1077"></a>
+<span class="sourceLineNo">1078</span>        RegionPlan plan = new RegionPlan(region, masterServerName, dest);<a name="line.1078"></a>
+<span class="sourceLineNo">1079</span>        if (plans == null) {<a name="line.1079"></a>
+<span class="sourceLineNo">1080</span>          plans = new ArrayList&lt;&gt;();<a name="line.1080"></a>
+<span class="sourceLineNo">1081</span>        }<a name="line.1081"></a>
+<span class="sourceLineNo">1082</span>        plans.add(plan);<a name="line.1082"></a>
+<span class="sourceLineNo">1083</span>      }<a name="line.1083"></a>
+<span class="sourceLineNo">1084</span>    }<a name="line.1084"></a>
+<span class="sourceLineNo">1085</span>    for (Map.Entry&lt;ServerName, List&lt;RegionInfo&gt;&gt; server: clusterMap.entrySet()) {<a name="line.1085"></a>
+<span class="sourceLineNo">1086</span>      if (masterServerName.equals(server.getKey())) continue;<a name="line.1086"></a>
+<span class="sourceLineNo">1087</span>      for (RegionInfo region: server.getValue()) {<a name="line.1087"></a>
+<span class="sourceLineNo">1088</span>        if (!shouldBeOnMaster(region)) continue;<a name="line.1088"></a>
+<span class="sourceLineNo">1089</span><a name="line.1089"></a>
+<span class="sourceLineNo">1090</span>        // Move this region to the master regionserver<a name="line.1090"></a>
+<span class="sourceLineNo">1091</span>        RegionPlan plan = new RegionPlan(region, server.getKey(), masterServerName);<a name="line.1091"></a>
+<span class="sourceLineNo">1092</span>        if (plans == null) {<a name="line.1092"></a>
+<span class="sourceLineNo">1093</span>          plans = new ArrayList&lt;&gt;();<a name="line.1093"></a>
+<span class="sourceLineNo">1094</span>        }<a name="line.1094"></a>
+<span class="sourceLineNo">1095</span>        plans.add(plan);<a name="line.1095"></a>
+<span class="sourceLineNo">1096</span>      }<a name="line.1096"></a>
+<span class="sourceLineNo">1097</span>    }<a name="line.1097"></a>
+<span class="sourceLineNo">1098</span>    return plans;<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>  /**<a name="line.1101"></a>
+<span class="sourceLineNo">1102</span>   * If master is configured to carry system tables only, in here is<a name="line.1102"></a>
+<span class="sourceLineNo">1103</span>   * where we figure what to assign it.<a name="line.1103"></a>
+<span class="sourceLineNo">1104</span>   */<a name="line.1104"></a>
+<span class="sourceLineNo">1105</span>  protected Map&lt;ServerName, List&lt;RegionInfo&gt;&gt; assignMasterSystemRegions(<a name="line.1105"></a>
+<span class="sourceLineNo">1106</span>      Collection&lt;RegionInfo&gt; regions, List&lt;ServerName&gt; servers) {<a name="line.1106"></a>
+<span class="sourceLineNo">1107</span>    if (servers == null || regions == null || regions.isEmpty()) {<a name="line.1107"></a>
+<span class="sourceLineNo">1108</span>      return null;<a name="line.1108"></a>
+<span class="sourceLineNo">1109</span>    }<a name="line.1109"></a>
+<span class="sourceLineNo">1110</span>    Map&lt;ServerName, List&lt;RegionInfo&gt;&gt; assignments = new TreeMap&lt;&gt;();<a name="line.1110"></a>
+<span class="sourceLineNo">1111</span>    if (this.maintenanceMode || this.onlySystemTablesOnMaster) {<a name="line.1111"></a>
+<span class="sourceLineNo">1112</span>      if (masterServerName != null &amp;&amp; servers.contains(masterServerName)) {<a name="line.1112"></a>
+<span class="sourceLineNo">1113</span>        assignments.put(masterServerName, new ArrayList&lt;&gt;());<a name="line.1113"></a>
+<span class="sourceLineNo">1114</span>        for (RegionInfo region : regions) {<a name="line.1114"></a>
+<span class="sourceLineNo">1115</span>          if (shouldBeOnMaster(region)) {<a name="line.1115"></a>
+<span class="sourceLineNo">1116</span>            assignments.get(masterServerName).add(region);<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>      }<a name="line.1119"></a>
+<span class="sourceLineNo">1120</span>    }<a name="line.1120"></a>
+<span class="sourceLineNo">1121</span>    return assignments;<a name="line.1121"></a>
+<span class="sourceLineNo">1122</span>  }<a name="line.1122"></a>
+<span class="sourceLineNo">1123</span><a name="line.1123"></a>
+<span class="sourceLineNo">1124</span>  @Override<a name="line.1124"></a>
+<span class="sourceLineNo">1125</span>  public Configuration getConf() {<a name="line.1125"></a>
+<span class="sourceLineNo">1126</span>    return this.config;<a name="line.1126"></a>
+<span class="sourceLineNo">1127</span>  }<a name="line.1127"></a>
+<span class="sourceLineNo">1128</span><a name="line.1128"></a>
+<span class="sourceLineNo">1129</span>  @Override<a name="line.1129"></a>
+<span class="sourceLineNo">1130</span>  public synchronized void setClusterMetrics(ClusterMetrics st) {<a name="line.1130"></a>
+<span class="sourceLineNo">1131</span>    this.clusterStatus = st;<a name="line.1131"></a>
+<span class="sourceLineNo">1132</span>    if (useRegionFinder) {<a name="line.1132"></a>
+<span class="sourceLineNo">1133</span>      regionFinder.setClusterMetrics(st);<a name="line.1133"></a>
+<span class="sourceLineNo">1134</span>    }<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 void setClusterLoad(Map&lt;TableName, Map&lt;ServerName, List&lt;RegionInfo&gt;&gt;&gt; clusterLoad){<a name="line.1138"></a>
+<span class="sourceLineNo">1139</span><a name="line.1139"></a>
+<span class="sourceLineNo">1140</span>  }<a name="line.1140"></a>
+<span class="sourceLineNo">1141</span><a name="line.1141"></a>
+<span class="sourceLineNo">1142</span>  @Override<a name="line.1142"></a>
+<span class="sourceLineNo">1143</span>  public void setMasterServices(MasterServices masterServices) {<a name="line.1143"></a>
+<span class="sourceLineNo">1144</span>    masterServerName = masterServices.getServerName();<a name="line.1144"></a>
+<span class="sourceLineNo">1145</span>    this.services = masterServices;<a name="line.1145"></a>
+<span class="sourceLineNo">1146</span>    if (useRegionFinder) {<a name="line.1146"></a>
+<span class="sourceLineNo">1147</span>      this.regionFinder.setServices(masterServices);<a name="line.1147"></a>
+<span class="sourceLineNo">1148</span>    }<a name="line.1148"></a>
+<span class="sourceLineNo">1149</span>    if (this.services.isInMaintenanceMode()) {<a name="line.1149"></a>
+<span class="sourceLineNo">1150</span>      this.maintenanceMode = true;<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><a name="line.1153"></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 (this.maintenanceMode || 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=

<TRUNCATED>

[15/46] hbase-site git commit: Published site at 05d22ed960204183fbd9bd16f1dbca6410ccde76.

Posted by gi...@apache.org.
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/3649682c/devapidocs/src-html/org/apache/hadoop/hbase/regionserver/HRegionServer.MovedRegionInfo.html
----------------------------------------------------------------------
diff --git a/devapidocs/src-html/org/apache/hadoop/hbase/regionserver/HRegionServer.MovedRegionInfo.html b/devapidocs/src-html/org/apache/hadoop/hbase/regionserver/HRegionServer.MovedRegionInfo.html
index 90087b4..b2a9771 100644
--- a/devapidocs/src-html/org/apache/hadoop/hbase/regionserver/HRegionServer.MovedRegionInfo.html
+++ b/devapidocs/src-html/org/apache/hadoop/hbase/regionserver/HRegionServer.MovedRegionInfo.html
@@ -956,2857 +956,2858 @@
 <span class="sourceLineNo">948</span>      // Try and register with the Master; tell it we are here.  Break if server is stopped or the<a name="line.948"></a>
 <span class="sourceLineNo">949</span>      // clusterup flag is down or hdfs went wacky. Once registered successfully, go ahead and start<a name="line.949"></a>
 <span class="sourceLineNo">950</span>      // up all Services. Use RetryCounter to get backoff in case Master is struggling to come up.<a name="line.950"></a>
-<span class="sourceLineNo">951</span>      RetryCounterFactory rcf = new RetryCounterFactory(Integer.MAX_VALUE,<a name="line.951"></a>
-<span class="sourceLineNo">952</span>          this.sleeper.getPeriod(), 1000 * 60 * 5);<a name="line.952"></a>
-<span class="sourceLineNo">953</span>      RetryCounter rc = rcf.create();<a name="line.953"></a>
-<span class="sourceLineNo">954</span>      while (keepLooping()) {<a name="line.954"></a>
-<span class="sourceLineNo">955</span>        RegionServerStartupResponse w = reportForDuty();<a name="line.955"></a>
-<span class="sourceLineNo">956</span>        if (w == null) {<a name="line.956"></a>
-<span class="sourceLineNo">957</span>          long sleepTime = rc.getBackoffTimeAndIncrementAttempts();<a name="line.957"></a>
-<span class="sourceLineNo">958</span>          LOG.warn("reportForDuty failed; sleeping {} ms and then retrying.", sleepTime);<a name="line.958"></a>
-<span class="sourceLineNo">959</span>          this.sleeper.sleep(sleepTime);<a name="line.959"></a>
-<span class="sourceLineNo">960</span>        } else {<a name="line.960"></a>
-<span class="sourceLineNo">961</span>          handleReportForDutyResponse(w);<a name="line.961"></a>
-<span class="sourceLineNo">962</span>          break;<a name="line.962"></a>
-<span class="sourceLineNo">963</span>        }<a name="line.963"></a>
-<span class="sourceLineNo">964</span>      }<a name="line.964"></a>
-<span class="sourceLineNo">965</span><a name="line.965"></a>
-<span class="sourceLineNo">966</span>      if (!isStopped() &amp;&amp; isHealthy()) {<a name="line.966"></a>
-<span class="sourceLineNo">967</span>        // start the snapshot handler and other procedure handlers,<a name="line.967"></a>
-<span class="sourceLineNo">968</span>        // since the server is ready to run<a name="line.968"></a>
-<span class="sourceLineNo">969</span>        if (this.rspmHost != null) {<a name="line.969"></a>
-<span class="sourceLineNo">970</span>          this.rspmHost.start();<a name="line.970"></a>
-<span class="sourceLineNo">971</span>        }<a name="line.971"></a>
-<span class="sourceLineNo">972</span>        // Start the Quota Manager<a name="line.972"></a>
-<span class="sourceLineNo">973</span>        if (this.rsQuotaManager != null) {<a name="line.973"></a>
-<span class="sourceLineNo">974</span>          rsQuotaManager.start(getRpcServer().getScheduler());<a name="line.974"></a>
-<span class="sourceLineNo">975</span>        }<a name="line.975"></a>
-<span class="sourceLineNo">976</span>        if (this.rsSpaceQuotaManager != null) {<a name="line.976"></a>
-<span class="sourceLineNo">977</span>          this.rsSpaceQuotaManager.start();<a name="line.977"></a>
-<span class="sourceLineNo">978</span>        }<a name="line.978"></a>
-<span class="sourceLineNo">979</span>      }<a name="line.979"></a>
-<span class="sourceLineNo">980</span><a name="line.980"></a>
-<span class="sourceLineNo">981</span>      // We registered with the Master.  Go into run mode.<a name="line.981"></a>
-<span class="sourceLineNo">982</span>      long lastMsg = System.currentTimeMillis();<a name="line.982"></a>
-<span class="sourceLineNo">983</span>      long oldRequestCount = -1;<a name="line.983"></a>
-<span class="sourceLineNo">984</span>      // The main run loop.<a name="line.984"></a>
-<span class="sourceLineNo">985</span>      while (!isStopped() &amp;&amp; isHealthy()) {<a name="line.985"></a>
-<span class="sourceLineNo">986</span>        if (!isClusterUp()) {<a name="line.986"></a>
-<span class="sourceLineNo">987</span>          if (isOnlineRegionsEmpty()) {<a name="line.987"></a>
-<span class="sourceLineNo">988</span>            stop("Exiting; cluster shutdown set and not carrying any regions");<a name="line.988"></a>
-<span class="sourceLineNo">989</span>          } else if (!this.stopping) {<a name="line.989"></a>
-<span class="sourceLineNo">990</span>            this.stopping = true;<a name="line.990"></a>
-<span class="sourceLineNo">991</span>            LOG.info("Closing user regions");<a name="line.991"></a>
-<span class="sourceLineNo">992</span>            closeUserRegions(this.abortRequested);<a name="line.992"></a>
-<span class="sourceLineNo">993</span>          } else if (this.stopping) {<a name="line.993"></a>
-<span class="sourceLineNo">994</span>            boolean allUserRegionsOffline = areAllUserRegionsOffline();<a name="line.994"></a>
-<span class="sourceLineNo">995</span>            if (allUserRegionsOffline) {<a name="line.995"></a>
-<span class="sourceLineNo">996</span>              // Set stopped if no more write requests tp meta tables<a name="line.996"></a>
-<span class="sourceLineNo">997</span>              // since last time we went around the loop.  Any open<a name="line.997"></a>
-<span class="sourceLineNo">998</span>              // meta regions will be closed on our way out.<a name="line.998"></a>
-<span class="sourceLineNo">999</span>              if (oldRequestCount == getWriteRequestCount()) {<a name="line.999"></a>
-<span class="sourceLineNo">1000</span>                stop("Stopped; only catalog regions remaining online");<a name="line.1000"></a>
-<span class="sourceLineNo">1001</span>                break;<a name="line.1001"></a>
-<span class="sourceLineNo">1002</span>              }<a name="line.1002"></a>
-<span class="sourceLineNo">1003</span>              oldRequestCount = getWriteRequestCount();<a name="line.1003"></a>
-<span class="sourceLineNo">1004</span>            } else {<a name="line.1004"></a>
-<span class="sourceLineNo">1005</span>              // Make sure all regions have been closed -- some regions may<a name="line.1005"></a>
-<span class="sourceLineNo">1006</span>              // have not got it because we were splitting at the time of<a name="line.1006"></a>
-<span class="sourceLineNo">1007</span>              // the call to closeUserRegions.<a name="line.1007"></a>
-<span class="sourceLineNo">1008</span>              closeUserRegions(this.abortRequested);<a name="line.1008"></a>
-<span class="sourceLineNo">1009</span>            }<a name="line.1009"></a>
-<span class="sourceLineNo">1010</span>            LOG.debug("Waiting on " + getOnlineRegionsAsPrintableString());<a name="line.1010"></a>
-<span class="sourceLineNo">1011</span>          }<a name="line.1011"></a>
-<span class="sourceLineNo">1012</span>        }<a name="line.1012"></a>
-<span class="sourceLineNo">1013</span>        long now = System.currentTimeMillis();<a name="line.1013"></a>
-<span class="sourceLineNo">1014</span>        if ((now - lastMsg) &gt;= msgInterval) {<a name="line.1014"></a>
-<span class="sourceLineNo">1015</span>          tryRegionServerReport(lastMsg, now);<a name="line.1015"></a>
-<span class="sourceLineNo">1016</span>          lastMsg = System.currentTimeMillis();<a name="line.1016"></a>
-<span class="sourceLineNo">1017</span>        }<a name="line.1017"></a>
-<span class="sourceLineNo">1018</span>        if (!isStopped() &amp;&amp; !isAborted()) {<a name="line.1018"></a>
-<span class="sourceLineNo">1019</span>          this.sleeper.sleep();<a name="line.1019"></a>
-<span class="sourceLineNo">1020</span>        }<a name="line.1020"></a>
-<span class="sourceLineNo">1021</span>      } // for<a name="line.1021"></a>
-<span class="sourceLineNo">1022</span>    } catch (Throwable t) {<a name="line.1022"></a>
-<span class="sourceLineNo">1023</span>      if (!rpcServices.checkOOME(t)) {<a name="line.1023"></a>
-<span class="sourceLineNo">1024</span>        String prefix = t instanceof YouAreDeadException? "": "Unhandled: ";<a name="line.1024"></a>
-<span class="sourceLineNo">1025</span>        abort(prefix + t.getMessage(), t);<a name="line.1025"></a>
-<span class="sourceLineNo">1026</span>      }<a name="line.1026"></a>
-<span class="sourceLineNo">1027</span>    }<a name="line.1027"></a>
-<span class="sourceLineNo">1028</span>    if (this.leases != null) {<a name="line.1028"></a>
-<span class="sourceLineNo">1029</span>      this.leases.closeAfterLeasesExpire();<a name="line.1029"></a>
-<span class="sourceLineNo">1030</span>    }<a name="line.1030"></a>
-<span class="sourceLineNo">1031</span>    if (this.splitLogWorker != null) {<a name="line.1031"></a>
-<span class="sourceLineNo">1032</span>      splitLogWorker.stop();<a name="line.1032"></a>
-<span class="sourceLineNo">1033</span>    }<a name="line.1033"></a>
-<span class="sourceLineNo">1034</span>    if (this.infoServer != null) {<a name="line.1034"></a>
-<span class="sourceLineNo">1035</span>      LOG.info("Stopping infoServer");<a name="line.1035"></a>
-<span class="sourceLineNo">1036</span>      try {<a name="line.1036"></a>
-<span class="sourceLineNo">1037</span>        this.infoServer.stop();<a name="line.1037"></a>
-<span class="sourceLineNo">1038</span>      } catch (Exception e) {<a name="line.1038"></a>
-<span class="sourceLineNo">1039</span>        LOG.error("Failed to stop infoServer", e);<a name="line.1039"></a>
-<span class="sourceLineNo">1040</span>      }<a name="line.1040"></a>
-<span class="sourceLineNo">1041</span>    }<a name="line.1041"></a>
-<span class="sourceLineNo">1042</span>    // Send cache a shutdown.<a name="line.1042"></a>
-<span class="sourceLineNo">1043</span>    if (cacheConfig != null &amp;&amp; cacheConfig.isBlockCacheEnabled()) {<a name="line.1043"></a>
-<span class="sourceLineNo">1044</span>      cacheConfig.getBlockCache().shutdown();<a name="line.1044"></a>
-<span class="sourceLineNo">1045</span>    }<a name="line.1045"></a>
-<span class="sourceLineNo">1046</span>    mobCacheConfig.getMobFileCache().shutdown();<a name="line.1046"></a>
-<span class="sourceLineNo">1047</span><a name="line.1047"></a>
-<span class="sourceLineNo">1048</span>    if (movedRegionsCleaner != null) {<a name="line.1048"></a>
-<span class="sourceLineNo">1049</span>      movedRegionsCleaner.stop("Region Server stopping");<a name="line.1049"></a>
-<span class="sourceLineNo">1050</span>    }<a name="line.1050"></a>
-<span class="sourceLineNo">1051</span><a name="line.1051"></a>
-<span class="sourceLineNo">1052</span>    // Send interrupts to wake up threads if sleeping so they notice shutdown.<a name="line.1052"></a>
-<span class="sourceLineNo">1053</span>    // TODO: Should we check they are alive? If OOME could have exited already<a name="line.1053"></a>
-<span class="sourceLineNo">1054</span>    if (this.hMemManager != null) this.hMemManager.stop();<a name="line.1054"></a>
-<span class="sourceLineNo">1055</span>    if (this.cacheFlusher != null) this.cacheFlusher.interruptIfNecessary();<a name="line.1055"></a>
-<span class="sourceLineNo">1056</span>    if (this.compactSplitThread != null) this.compactSplitThread.interruptIfNecessary();<a name="line.1056"></a>
-<span class="sourceLineNo">1057</span>    sendShutdownInterrupt();<a name="line.1057"></a>
-<span class="sourceLineNo">1058</span><a name="line.1058"></a>
-<span class="sourceLineNo">1059</span>    // Stop the snapshot and other procedure handlers, forcefully killing all running tasks<a name="line.1059"></a>
-<span class="sourceLineNo">1060</span>    if (rspmHost != null) {<a name="line.1060"></a>
-<span class="sourceLineNo">1061</span>      rspmHost.stop(this.abortRequested || this.killed);<a name="line.1061"></a>
-<span class="sourceLineNo">1062</span>    }<a name="line.1062"></a>
-<span class="sourceLineNo">1063</span><a name="line.1063"></a>
-<span class="sourceLineNo">1064</span>    if (this.killed) {<a name="line.1064"></a>
-<span class="sourceLineNo">1065</span>      // Just skip out w/o closing regions.  Used when testing.<a name="line.1065"></a>
-<span class="sourceLineNo">1066</span>    } else if (abortRequested) {<a name="line.1066"></a>
-<span class="sourceLineNo">1067</span>      if (this.fsOk) {<a name="line.1067"></a>
-<span class="sourceLineNo">1068</span>        closeUserRegions(abortRequested); // Don't leave any open file handles<a name="line.1068"></a>
-<span class="sourceLineNo">1069</span>      }<a name="line.1069"></a>
-<span class="sourceLineNo">1070</span>      LOG.info("aborting server " + this.serverName);<a name="line.1070"></a>
-<span class="sourceLineNo">1071</span>    } else {<a name="line.1071"></a>
-<span class="sourceLineNo">1072</span>      closeUserRegions(abortRequested);<a name="line.1072"></a>
-<span class="sourceLineNo">1073</span>      LOG.info("stopping server " + this.serverName);<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>    // so callers waiting for meta without timeout can stop<a name="line.1076"></a>
-<span class="sourceLineNo">1077</span>    if (this.metaTableLocator != null) this.metaTableLocator.stop();<a name="line.1077"></a>
-<span class="sourceLineNo">1078</span>    if (this.clusterConnection != null &amp;&amp; !clusterConnection.isClosed()) {<a name="line.1078"></a>
-<span class="sourceLineNo">1079</span>      try {<a name="line.1079"></a>
-<span class="sourceLineNo">1080</span>        this.clusterConnection.close();<a name="line.1080"></a>
-<span class="sourceLineNo">1081</span>      } catch (IOException e) {<a name="line.1081"></a>
-<span class="sourceLineNo">1082</span>        // Although the {@link Closeable} interface throws an {@link<a name="line.1082"></a>
-<span class="sourceLineNo">1083</span>        // IOException}, in reality, the implementation would never do that.<a name="line.1083"></a>
-<span class="sourceLineNo">1084</span>        LOG.warn("Attempt to close server's short circuit ClusterConnection failed.", e);<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>    // Closing the compactSplit thread before closing meta regions<a name="line.1088"></a>
-<span class="sourceLineNo">1089</span>    if (!this.killed &amp;&amp; containsMetaTableRegions()) {<a name="line.1089"></a>
-<span class="sourceLineNo">1090</span>      if (!abortRequested || this.fsOk) {<a name="line.1090"></a>
-<span class="sourceLineNo">1091</span>        if (this.compactSplitThread != null) {<a name="line.1091"></a>
-<span class="sourceLineNo">1092</span>          this.compactSplitThread.join();<a name="line.1092"></a>
-<span class="sourceLineNo">1093</span>          this.compactSplitThread = null;<a name="line.1093"></a>
-<span class="sourceLineNo">1094</span>        }<a name="line.1094"></a>
-<span class="sourceLineNo">1095</span>        closeMetaTableRegions(abortRequested);<a name="line.1095"></a>
-<span class="sourceLineNo">1096</span>      }<a name="line.1096"></a>
-<span class="sourceLineNo">1097</span>    }<a name="line.1097"></a>
-<span class="sourceLineNo">1098</span><a name="line.1098"></a>
-<span class="sourceLineNo">1099</span>    if (!this.killed &amp;&amp; this.fsOk) {<a name="line.1099"></a>
-<span class="sourceLineNo">1100</span>      waitOnAllRegionsToClose(abortRequested);<a name="line.1100"></a>
-<span class="sourceLineNo">1101</span>      LOG.info("stopping server " + this.serverName + "; all regions closed.");<a name="line.1101"></a>
-<span class="sourceLineNo">1102</span>    }<a name="line.1102"></a>
-<span class="sourceLineNo">1103</span><a name="line.1103"></a>
-<span class="sourceLineNo">1104</span>    // Stop the quota manager<a name="line.1104"></a>
-<span class="sourceLineNo">1105</span>    if (rsQuotaManager != null) {<a name="line.1105"></a>
-<span class="sourceLineNo">1106</span>      rsQuotaManager.stop();<a name="line.1106"></a>
-<span class="sourceLineNo">1107</span>    }<a name="line.1107"></a>
-<span class="sourceLineNo">1108</span>    if (rsSpaceQuotaManager != null) {<a name="line.1108"></a>
-<span class="sourceLineNo">1109</span>      rsSpaceQuotaManager.stop();<a name="line.1109"></a>
-<span class="sourceLineNo">1110</span>      rsSpaceQuotaManager = null;<a name="line.1110"></a>
-<span class="sourceLineNo">1111</span>    }<a name="line.1111"></a>
-<span class="sourceLineNo">1112</span><a name="line.1112"></a>
-<span class="sourceLineNo">1113</span>    //fsOk flag may be changed when closing regions throws exception.<a name="line.1113"></a>
-<span class="sourceLineNo">1114</span>    if (this.fsOk) {<a name="line.1114"></a>
-<span class="sourceLineNo">1115</span>      shutdownWAL(!abortRequested);<a name="line.1115"></a>
-<span class="sourceLineNo">1116</span>    }<a name="line.1116"></a>
-<span class="sourceLineNo">1117</span><a name="line.1117"></a>
-<span class="sourceLineNo">1118</span>    // Make sure the proxy is down.<a name="line.1118"></a>
-<span class="sourceLineNo">1119</span>    if (this.rssStub != null) {<a name="line.1119"></a>
-<span class="sourceLineNo">1120</span>      this.rssStub = null;<a name="line.1120"></a>
-<span class="sourceLineNo">1121</span>    }<a name="line.1121"></a>
-<span class="sourceLineNo">1122</span>    if (this.lockStub != null) {<a name="line.1122"></a>
-<span class="sourceLineNo">1123</span>      this.lockStub = null;<a name="line.1123"></a>
-<span class="sourceLineNo">1124</span>    }<a name="line.1124"></a>
-<span class="sourceLineNo">1125</span>    if (this.rpcClient != null) {<a name="line.1125"></a>
-<span class="sourceLineNo">1126</span>      this.rpcClient.close();<a name="line.1126"></a>
-<span class="sourceLineNo">1127</span>    }<a name="line.1127"></a>
-<span class="sourceLineNo">1128</span>    if (this.leases != null) {<a name="line.1128"></a>
-<span class="sourceLineNo">1129</span>      this.leases.close();<a name="line.1129"></a>
-<span class="sourceLineNo">1130</span>    }<a name="line.1130"></a>
-<span class="sourceLineNo">1131</span>    if (this.pauseMonitor != null) {<a name="line.1131"></a>
-<span class="sourceLineNo">1132</span>      this.pauseMonitor.stop();<a name="line.1132"></a>
-<span class="sourceLineNo">1133</span>    }<a name="line.1133"></a>
-<span class="sourceLineNo">1134</span><a name="line.1134"></a>
-<span class="sourceLineNo">1135</span>    if (!killed) {<a name="line.1135"></a>
-<span class="sourceLineNo">1136</span>      stopServiceThreads();<a name="line.1136"></a>
-<span class="sourceLineNo">1137</span>    }<a name="line.1137"></a>
-<span class="sourceLineNo">1138</span><a name="line.1138"></a>
-<span class="sourceLineNo">1139</span>    if (this.rpcServices != null) {<a name="line.1139"></a>
-<span class="sourceLineNo">1140</span>      this.rpcServices.stop();<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>    try {<a name="line.1143"></a>
-<span class="sourceLineNo">1144</span>      deleteMyEphemeralNode();<a name="line.1144"></a>
-<span class="sourceLineNo">1145</span>    } catch (KeeperException.NoNodeException nn) {<a name="line.1145"></a>
-<span class="sourceLineNo">1146</span>    } catch (KeeperException e) {<a name="line.1146"></a>
-<span class="sourceLineNo">1147</span>      LOG.warn("Failed deleting my ephemeral node", e);<a name="line.1147"></a>
-<span class="sourceLineNo">1148</span>    }<a name="line.1148"></a>
-<span class="sourceLineNo">1149</span>    // We may have failed to delete the znode at the previous step, but<a name="line.1149"></a>
-<span class="sourceLineNo">1150</span>    //  we delete the file anyway: a second attempt to delete the znode is likely to fail again.<a name="line.1150"></a>
-<span class="sourceLineNo">1151</span>    ZNodeClearer.deleteMyEphemeralNodeOnDisk();<a name="line.1151"></a>
-<span class="sourceLineNo">1152</span><a name="line.1152"></a>
-<span class="sourceLineNo">1153</span>    if (this.zooKeeper != null) {<a name="line.1153"></a>
-<span class="sourceLineNo">1154</span>      this.zooKeeper.close();<a name="line.1154"></a>
-<span class="sourceLineNo">1155</span>    }<a name="line.1155"></a>
-<span class="sourceLineNo">1156</span>    this.shutDown = true;<a name="line.1156"></a>
-<span class="sourceLineNo">1157</span>    LOG.info("Exiting; stopping=" + this.serverName + "; zookeeper connection closed.");<a name="line.1157"></a>
-<span class="sourceLineNo">1158</span>  }<a name="line.1158"></a>
-<span class="sourceLineNo">1159</span><a name="line.1159"></a>
-<span class="sourceLineNo">1160</span>  private boolean containsMetaTableRegions() {<a name="line.1160"></a>
-<span class="sourceLineNo">1161</span>    return onlineRegions.containsKey(RegionInfoBuilder.FIRST_META_REGIONINFO.getEncodedName());<a name="line.1161"></a>
-<span class="sourceLineNo">1162</span>  }<a name="line.1162"></a>
-<span class="sourceLineNo">1163</span><a name="line.1163"></a>
-<span class="sourceLineNo">1164</span>  private boolean areAllUserRegionsOffline() {<a name="line.1164"></a>
-<span class="sourceLineNo">1165</span>    if (getNumberOfOnlineRegions() &gt; 2) return false;<a name="line.1165"></a>
-<span class="sourceLineNo">1166</span>    boolean allUserRegionsOffline = true;<a name="line.1166"></a>
-<span class="sourceLineNo">1167</span>    for (Map.Entry&lt;String, HRegion&gt; e: this.onlineRegions.entrySet()) {<a name="line.1167"></a>
-<span class="sourceLineNo">1168</span>      if (!e.getValue().getRegionInfo().isMetaRegion()) {<a name="line.1168"></a>
-<span class="sourceLineNo">1169</span>        allUserRegionsOffline = false;<a name="line.1169"></a>
-<span class="sourceLineNo">1170</span>        break;<a name="line.1170"></a>
-<span class="sourceLineNo">1171</span>      }<a name="line.1171"></a>
-<span class="sourceLineNo">1172</span>    }<a name="line.1172"></a>
-<span class="sourceLineNo">1173</span>    return allUserRegionsOffline;<a name="line.1173"></a>
-<span class="sourceLineNo">1174</span>  }<a name="line.1174"></a>
-<span class="sourceLineNo">1175</span><a name="line.1175"></a>
-<span class="sourceLineNo">1176</span>  /**<a name="line.1176"></a>
-<span class="sourceLineNo">1177</span>   * @return Current write count for all online regions.<a name="line.1177"></a>
-<span class="sourceLineNo">1178</span>   */<a name="line.1178"></a>
-<span class="sourceLineNo">1179</span>  private long getWriteRequestCount() {<a name="line.1179"></a>
-<span class="sourceLineNo">1180</span>    long writeCount = 0;<a name="line.1180"></a>
-<span class="sourceLineNo">1181</span>    for (Map.Entry&lt;String, HRegion&gt; e: this.onlineRegions.entrySet()) {<a name="line.1181"></a>
-<span class="sourceLineNo">1182</span>      writeCount += e.getValue().getWriteRequestsCount();<a name="line.1182"></a>
-<span class="sourceLineNo">1183</span>    }<a name="line.1183"></a>
-<span class="sourceLineNo">1184</span>    return writeCount;<a name="line.1184"></a>
-<span class="sourceLineNo">1185</span>  }<a name="line.1185"></a>
-<span class="sourceLineNo">1186</span><a name="line.1186"></a>
-<span class="sourceLineNo">1187</span>  @VisibleForTesting<a name="line.1187"></a>
-<span class="sourceLineNo">1188</span>  protected void tryRegionServerReport(long reportStartTime, long reportEndTime)<a name="line.1188"></a>
-<span class="sourceLineNo">1189</span>      throws IOException {<a name="line.1189"></a>
-<span class="sourceLineNo">1190</span>    RegionServerStatusService.BlockingInterface rss = rssStub;<a name="line.1190"></a>
-<span class="sourceLineNo">1191</span>    if (rss == null) {<a name="line.1191"></a>
-<span class="sourceLineNo">1192</span>      // the current server could be stopping.<a name="line.1192"></a>
-<span class="sourceLineNo">1193</span>      return;<a name="line.1193"></a>
-<span class="sourceLineNo">1194</span>    }<a name="line.1194"></a>
-<span class="sourceLineNo">1195</span>    ClusterStatusProtos.ServerLoad sl = buildServerLoad(reportStartTime, reportEndTime);<a name="line.1195"></a>
-<span class="sourceLineNo">1196</span>    try {<a name="line.1196"></a>
-<span class="sourceLineNo">1197</span>      RegionServerReportRequest.Builder request = RegionServerReportRequest.newBuilder();<a name="line.1197"></a>
-<span class="sourceLineNo">1198</span>      request.setServer(ProtobufUtil.toServerName(this.serverName));<a name="line.1198"></a>
-<span class="sourceLineNo">1199</span>      request.setLoad(sl);<a name="line.1199"></a>
-<span class="sourceLineNo">1200</span>      rss.regionServerReport(null, request.build());<a name="line.1200"></a>
-<span class="sourceLineNo">1201</span>    } catch (ServiceException se) {<a name="line.1201"></a>
-<span class="sourceLineNo">1202</span>      IOException ioe = ProtobufUtil.getRemoteException(se);<a name="line.1202"></a>
-<span class="sourceLineNo">1203</span>      if (ioe instanceof YouAreDeadException) {<a name="line.1203"></a>
-<span class="sourceLineNo">1204</span>        // This will be caught and handled as a fatal error in run()<a name="line.1204"></a>
-<span class="sourceLineNo">1205</span>        throw ioe;<a name="line.1205"></a>
-<span class="sourceLineNo">1206</span>      }<a name="line.1206"></a>
-<span class="sourceLineNo">1207</span>      if (rssStub == rss) {<a name="line.1207"></a>
-<span class="sourceLineNo">1208</span>        rssStub = null;<a name="line.1208"></a>
-<span class="sourceLineNo">1209</span>      }<a name="line.1209"></a>
-<span class="sourceLineNo">1210</span>      // Couldn't connect to the master, get location from zk and reconnect<a name="line.1210"></a>
-<span class="sourceLineNo">1211</span>      // Method blocks until new master is found or we are stopped<a name="line.1211"></a>
-<span class="sourceLineNo">1212</span>      createRegionServerStatusStub(true);<a name="line.1212"></a>
-<span class="sourceLineNo">1213</span>    }<a name="line.1213"></a>
-<span class="sourceLineNo">1214</span>  }<a name="line.1214"></a>
-<span class="sourceLineNo">1215</span><a name="line.1215"></a>
-<span class="sourceLineNo">1216</span>  /**<a name="line.1216"></a>
-<span class="sourceLineNo">1217</span>   * Reports the given map of Regions and their size on the filesystem to the active Master.<a name="line.1217"></a>
-<span class="sourceLineNo">1218</span>   *<a name="line.1218"></a>
-<span class="sourceLineNo">1219</span>   * @param regionSizeStore The store containing region sizes<a name="line.1219"></a>
-<span class="sourceLineNo">1220</span>   * @return false if FileSystemUtilizationChore should pause reporting to master. true otherwise<a name="line.1220"></a>
-<span class="sourceLineNo">1221</span>   */<a name="line.1221"></a>
-<span class="sourceLineNo">1222</span>  public boolean reportRegionSizesForQuotas(RegionSizeStore regionSizeStore) {<a name="line.1222"></a>
-<span class="sourceLineNo">1223</span>    RegionServerStatusService.BlockingInterface rss = rssStub;<a name="line.1223"></a>
-<span class="sourceLineNo">1224</span>    if (rss == null) {<a name="line.1224"></a>
-<span class="sourceLineNo">1225</span>      // the current server could be stopping.<a name="line.1225"></a>
-<span class="sourceLineNo">1226</span>      LOG.trace("Skipping Region size report to HMaster as stub is null");<a name="line.1226"></a>
-<span class="sourceLineNo">1227</span>      return true;<a name="line.1227"></a>
-<span class="sourceLineNo">1228</span>    }<a name="line.1228"></a>
-<span class="sourceLineNo">1229</span>    try {<a name="line.1229"></a>
-<span class="sourceLineNo">1230</span>      buildReportAndSend(rss, regionSizeStore);<a name="line.1230"></a>
-<span class="sourceLineNo">1231</span>    } catch (ServiceException se) {<a name="line.1231"></a>
-<span class="sourceLineNo">1232</span>      IOException ioe = ProtobufUtil.getRemoteException(se);<a name="line.1232"></a>
-<span class="sourceLineNo">1233</span>      if (ioe instanceof PleaseHoldException) {<a name="line.1233"></a>
-<span class="sourceLineNo">1234</span>        LOG.trace("Failed to report region sizes to Master because it is initializing."<a name="line.1234"></a>
-<span class="sourceLineNo">1235</span>            + " This will be retried.", ioe);<a name="line.1235"></a>
-<span class="sourceLineNo">1236</span>        // The Master is coming up. Will retry the report later. Avoid re-creating the stub.<a name="line.1236"></a>
-<span class="sourceLineNo">1237</span>        return true;<a name="line.1237"></a>
-<span class="sourceLineNo">1238</span>      }<a name="line.1238"></a>
-<span class="sourceLineNo">1239</span>      if (rssStub == rss) {<a name="line.1239"></a>
-<span class="sourceLineNo">1240</span>        rssStub = null;<a name="line.1240"></a>
-<span class="sourceLineNo">1241</span>      }<a name="line.1241"></a>
-<span class="sourceLineNo">1242</span>      createRegionServerStatusStub(true);<a name="line.1242"></a>
-<span class="sourceLineNo">1243</span>      if (ioe instanceof DoNotRetryIOException) {<a name="line.1243"></a>
-<span class="sourceLineNo">1244</span>        DoNotRetryIOException doNotRetryEx = (DoNotRetryIOException) ioe;<a name="line.1244"></a>
-<span class="sourceLineNo">1245</span>        if (doNotRetryEx.getCause() != null) {<a name="line.1245"></a>
-<span class="sourceLineNo">1246</span>          Throwable t = doNotRetryEx.getCause();<a name="line.1246"></a>
-<span class="sourceLineNo">1247</span>          if (t instanceof UnsupportedOperationException) {<a name="line.1247"></a>
-<span class="sourceLineNo">1248</span>            LOG.debug("master doesn't support ReportRegionSpaceUse, pause before retrying");<a name="line.1248"></a>
-<span class="sourceLineNo">1249</span>            return false;<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>      }<a name="line.1252"></a>
-<span class="sourceLineNo">1253</span>      LOG.debug("Failed to report region sizes to Master. This will be retried.", ioe);<a name="line.1253"></a>
-<span class="sourceLineNo">1254</span>    }<a name="line.1254"></a>
-<span class="sourceLineNo">1255</span>    return true;<a name="line.1255"></a>
-<span class="sourceLineNo">1256</span>  }<a name="line.1256"></a>
-<span class="sourceLineNo">1257</span><a name="line.1257"></a>
-<span class="sourceLineNo">1258</span>  /**<a name="line.1258"></a>
-<span class="sourceLineNo">1259</span>   * Builds the region size report and sends it to the master. Upon successful sending of the<a name="line.1259"></a>
-<span class="sourceLineNo">1260</span>   * report, the region sizes that were sent are marked as sent.<a name="line.1260"></a>
-<span class="sourceLineNo">1261</span>   *<a name="line.1261"></a>
-<span class="sourceLineNo">1262</span>   * @param rss The stub to send to the Master<a name="line.1262"></a>
-<span class="sourceLineNo">1263</span>   * @param regionSizeStore The store containing region sizes<a name="line.1263"></a>
-<span class="sourceLineNo">1264</span>   */<a name="line.1264"></a>
-<span class="sourceLineNo">1265</span>  void buildReportAndSend(RegionServerStatusService.BlockingInterface rss,<a name="line.1265"></a>
-<span class="sourceLineNo">1266</span>      RegionSizeStore regionSizeStore) throws ServiceException {<a name="line.1266"></a>
-<span class="sourceLineNo">1267</span>    RegionSpaceUseReportRequest request =<a name="line.1267"></a>
-<span class="sourceLineNo">1268</span>        buildRegionSpaceUseReportRequest(Objects.requireNonNull(regionSizeStore));<a name="line.1268"></a>
-<span class="sourceLineNo">1269</span>    rss.reportRegionSpaceUse(null, request);<a name="line.1269"></a>
-<span class="sourceLineNo">1270</span>    // Record the number of size reports sent<a name="line.1270"></a>
-<span class="sourceLineNo">1271</span>    if (metricsRegionServer != null) {<a name="line.1271"></a>
-<span class="sourceLineNo">1272</span>      metricsRegionServer.incrementNumRegionSizeReportsSent(regionSizeStore.size());<a name="line.1272"></a>
-<span class="sourceLineNo">1273</span>    }<a name="line.1273"></a>
-<span class="sourceLineNo">1274</span>  }<a name="line.1274"></a>
-<span class="sourceLineNo">1275</span><a name="line.1275"></a>
-<span class="sourceLineNo">1276</span>  /**<a name="line.1276"></a>
-<span class="sourceLineNo">1277</span>   * Builds a {@link RegionSpaceUseReportRequest} protobuf message from the region size map.<a name="line.1277"></a>
-<span class="sourceLineNo">1278</span>   *<a name="line.1278"></a>
-<span class="sourceLineNo">1279</span>   * @param regionSizes The size in bytes of regions<a name="line.1279"></a>
-<span class="sourceLineNo">1280</span>   * @return The corresponding protocol buffer message.<a name="line.1280"></a>
-<span class="sourceLineNo">1281</span>   */<a name="line.1281"></a>
-<span class="sourceLineNo">1282</span>  RegionSpaceUseReportRequest buildRegionSpaceUseReportRequest(RegionSizeStore regionSizes) {<a name="line.1282"></a>
-<span class="sourceLineNo">1283</span>    RegionSpaceUseReportRequest.Builder request = RegionSpaceUseReportRequest.newBuilder();<a name="line.1283"></a>
-<span class="sourceLineNo">1284</span>    for (Entry&lt;RegionInfo, RegionSize&gt; entry : regionSizes) {<a name="line.1284"></a>
-<span class="sourceLineNo">1285</span>      request.addSpaceUse(convertRegionSize(entry.getKey(), entry.getValue().getSize()));<a name="line.1285"></a>
-<span class="sourceLineNo">1286</span>    }<a name="line.1286"></a>
-<span class="sourceLineNo">1287</span>    return request.build();<a name="line.1287"></a>
-<span class="sourceLineNo">1288</span>  }<a name="line.1288"></a>
-<span class="sourceLineNo">1289</span><a name="line.1289"></a>
-<span class="sourceLineNo">1290</span>  /**<a name="line.1290"></a>
-<span class="sourceLineNo">1291</span>   * Converts a pair of {@link RegionInfo} and {@code long} into a {@link RegionSpaceUse}<a name="line.1291"></a>
-<span class="sourceLineNo">1292</span>   * protobuf message.<a name="line.1292"></a>
-<span class="sourceLineNo">1293</span>   *<a name="line.1293"></a>
-<span class="sourceLineNo">1294</span>   * @param regionInfo The RegionInfo<a name="line.1294"></a>
-<span class="sourceLineNo">1295</span>   * @param sizeInBytes The size in bytes of the Region<a name="line.1295"></a>
-<span class="sourceLineNo">1296</span>   * @return The protocol buffer<a name="line.1296"></a>
-<span class="sourceLineNo">1297</span>   */<a name="line.1297"></a>
-<span class="sourceLineNo">1298</span>  RegionSpaceUse convertRegionSize(RegionInfo regionInfo, Long sizeInBytes) {<a name="line.1298"></a>
-<span class="sourceLineNo">1299</span>    return RegionSpaceUse.newBuilder()<a name="line.1299"></a>
-<span class="sourceLineNo">1300</span>        .setRegionInfo(ProtobufUtil.toRegionInfo(Objects.requireNonNull(regionInfo)))<a name="line.1300"></a>
-<span class="sourceLineNo">1301</span>        .setRegionSize(Objects.requireNonNull(sizeInBytes))<a name="line.1301"></a>
-<span class="sourceLineNo">1302</span>        .build();<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>  ClusterStatusProtos.ServerLoad buildServerLoad(long reportStartTime, long reportEndTime)<a name="line.1305"></a>
-<span class="sourceLineNo">1306</span>      throws IOException {<a name="line.1306"></a>
-<span class="sourceLineNo">1307</span>    // We're getting the MetricsRegionServerWrapper here because the wrapper computes requests<a name="line.1307"></a>
-<span class="sourceLineNo">1308</span>    // per second, and other metrics  As long as metrics are part of ServerLoad it's best to use<a name="line.1308"></a>
-<span class="sourceLineNo">1309</span>    // the wrapper to compute those numbers in one place.<a name="line.1309"></a>
-<span class="sourceLineNo">1310</span>    // In the long term most of these should be moved off of ServerLoad and the heart beat.<a name="line.1310"></a>
-<span class="sourceLineNo">1311</span>    // Instead they should be stored in an HBase table so that external visibility into HBase is<a name="line.1311"></a>
-<span class="sourceLineNo">1312</span>    // improved; Additionally the load balancer will be able to take advantage of a more complete<a name="line.1312"></a>
-<span class="sourceLineNo">1313</span>    // history.<a name="line.1313"></a>
-<span class="sourceLineNo">1314</span>    MetricsRegionServerWrapper regionServerWrapper = metricsRegionServer.getRegionServerWrapper();<a name="line.1314"></a>
-<span class="sourceLineNo">1315</span>    Collection&lt;HRegion&gt; regions = getOnlineRegionsLocalContext();<a name="line.1315"></a>
-<span class="sourceLineNo">1316</span>    long usedMemory = -1L;<a name="line.1316"></a>
-<span class="sourceLineNo">1317</span>    long maxMemory = -1L;<a name="line.1317"></a>
-<span class="sourceLineNo">1318</span>    final MemoryUsage usage = MemorySizeUtil.safeGetHeapMemoryUsage();<a name="line.1318"></a>
-<span class="sourceLineNo">1319</span>    if (usage != null) {<a name="line.1319"></a>
-<span class="sourceLineNo">1320</span>      usedMemory = usage.getUsed();<a name="line.1320"></a>
-<span class="sourceLineNo">1321</span>      maxMemory = usage.getMax();<a name="line.1321"></a>
-<span class="sourceLineNo">1322</span>    }<a name="line.1322"></a>
-<span class="sourceLineNo">1323</span><a name="line.1323"></a>
-<span class="sourceLineNo">1324</span>    ClusterStatusProtos.ServerLoad.Builder serverLoad = ClusterStatusProtos.ServerLoad.newBuilder();<a name="line.1324"></a>
-<span class="sourceLineNo">1325</span>    serverLoad.setNumberOfRequests((int) regionServerWrapper.getRequestsPerSecond());<a name="line.1325"></a>
-<span class="sourceLineNo">1326</span>    serverLoad.setTotalNumberOfRequests(regionServerWrapper.getTotalRequestCount());<a name="line.1326"></a>
-<span class="sourceLineNo">1327</span>    serverLoad.setUsedHeapMB((int)(usedMemory / 1024 / 1024));<a name="line.1327"></a>
-<span class="sourceLineNo">1328</span>    serverLoad.setMaxHeapMB((int) (maxMemory / 1024 / 1024));<a name="line.1328"></a>
-<span class="sourceLineNo">1329</span>    Set&lt;String&gt; coprocessors = getWAL(null).getCoprocessorHost().getCoprocessors();<a name="line.1329"></a>
-<span class="sourceLineNo">1330</span>    Builder coprocessorBuilder = Coprocessor.newBuilder();<a name="line.1330"></a>
-<span class="sourceLineNo">1331</span>    for (String coprocessor : coprocessors) {<a name="line.1331"></a>
-<span class="sourceLineNo">1332</span>      serverLoad.addCoprocessors(coprocessorBuilder.setName(coprocessor).build());<a name="line.1332"></a>
-<span class="sourceLineNo">1333</span>    }<a name="line.1333"></a>
-<span class="sourceLineNo">1334</span>    RegionLoad.Builder regionLoadBldr = RegionLoad.newBuilder();<a name="line.1334"></a>
-<span class="sourceLineNo">1335</span>    RegionSpecifier.Builder regionSpecifier = RegionSpecifier.newBuilder();<a name="line.1335"></a>
-<span class="sourceLineNo">1336</span>    for (HRegion region : regions) {<a name="line.1336"></a>
-<span class="sourceLineNo">1337</span>      if (region.getCoprocessorHost() != null) {<a name="line.1337"></a>
-<span class="sourceLineNo">1338</span>        Set&lt;String&gt; regionCoprocessors = region.getCoprocessorHost().getCoprocessors();<a name="line.1338"></a>
-<span class="sourceLineNo">1339</span>        Iterator&lt;String&gt; iterator = regionCoprocessors.iterator();<a name="line.1339"></a>
-<span class="sourceLineNo">1340</span>        while (iterator.hasNext()) {<a name="line.1340"></a>
-<span class="sourceLineNo">1341</span>          serverLoad.addCoprocessors(coprocessorBuilder.setName(iterator.next()).build());<a name="line.1341"></a>
-<span class="sourceLineNo">1342</span>        }<a name="line.1342"></a>
-<span class="sourceLineNo">1343</span>      }<a name="line.1343"></a>
-<span class="sourceLineNo">1344</span>      serverLoad.addRegionLoads(createRegionLoad(region, regionLoadBldr, regionSpecifier));<a name="line.1344"></a>
-<span class="sourceLineNo">1345</span>      for (String coprocessor : getWAL(region.getRegionInfo()).getCoprocessorHost()<a name="line.1345"></a>
-<span class="sourceLineNo">1346</span>          .getCoprocessors()) {<a name="line.1346"></a>
-<span class="sourceLineNo">1347</span>        serverLoad.addCoprocessors(coprocessorBuilder.setName(coprocessor).build());<a name="line.1347"></a>
-<span class="sourceLineNo">1348</span>      }<a name="line.1348"></a>
-<span class="sourceLineNo">1349</span>    }<a name="line.1349"></a>
-<span class="sourceLineNo">1350</span>    serverLoad.setReportStartTime(reportStartTime);<a name="line.1350"></a>
-<span class="sourceLineNo">1351</span>    serverLoad.setReportEndTime(reportEndTime);<a name="line.1351"></a>
-<span class="sourceLineNo">1352</span>    if (this.infoServer != null) {<a name="line.1352"></a>
-<span class="sourceLineNo">1353</span>      serverLoad.setInfoServerPort(this.infoServer.getPort());<a name="line.1353"></a>
-<span class="sourceLineNo">1354</span>    } else {<a name="line.1354"></a>
-<span class="sourceLineNo">1355</span>      serverLoad.setInfoServerPort(-1);<a name="line.1355"></a>
-<span class="sourceLineNo">1356</span>    }<a name="line.1356"></a>
-<span class="sourceLineNo">1357</span><a name="line.1357"></a>
-<span class="sourceLineNo">1358</span>    // for the replicationLoad purpose. Only need to get from one executorService<a name="line.1358"></a>
-<span class="sourceLineNo">1359</span>    // either source or sink will get the same info<a name="line.1359"></a>
-<span class="sourceLineNo">1360</span>    ReplicationSourceService rsources = getReplicationSourceService();<a name="line.1360"></a>
-<span class="sourceLineNo">1361</span><a name="line.1361"></a>
-<span class="sourceLineNo">1362</span>    if (rsources != null) {<a name="line.1362"></a>
-<span class="sourceLineNo">1363</span>      // always refresh first to get the latest value<a name="line.1363"></a>
-<span class="sourceLineNo">1364</span>      ReplicationLoad rLoad = rsources.refreshAndGetReplicationLoad();<a name="line.1364"></a>
-<span class="sourceLineNo">1365</span>      if (rLoad != null) {<a name="line.1365"></a>
-<span class="sourceLineNo">1366</span>        serverLoad.setReplLoadSink(rLoad.getReplicationLoadSink());<a name="line.1366"></a>
-<span class="sourceLineNo">1367</span>        for (ClusterStatusProtos.ReplicationLoadSource rLS : rLoad.getReplicationLoadSourceList()) {<a name="line.1367"></a>
-<span class="sourceLineNo">1368</span>          serverLoad.addReplLoadSource(rLS);<a name="line.1368"></a>
-<span class="sourceLineNo">1369</span>        }<a name="line.1369"></a>
-<span class="sourceLineNo">1370</span>      }<a name="line.1370"></a>
-<span class="sourceLineNo">1371</span>    }<a name="line.1371"></a>
-<span class="sourceLineNo">1372</span><a name="line.1372"></a>
-<span class="sourceLineNo">1373</span>    return serverLoad.build();<a name="line.1373"></a>
-<span class="sourceLineNo">1374</span>  }<a name="line.1374"></a>
-<span class="sourceLineNo">1375</span><a name="line.1375"></a>
-<span class="sourceLineNo">1376</span>  String getOnlineRegionsAsPrintableString() {<a name="line.1376"></a>
-<span class="sourceLineNo">1377</span>    StringBuilder sb = new StringBuilder();<a name="line.1377"></a>
-<span class="sourceLineNo">1378</span>    for (Region r: this.onlineRegions.values()) {<a name="line.1378"></a>
-<span class="sourceLineNo">1379</span>      if (sb.length() &gt; 0) sb.append(", ");<a name="line.1379"></a>
-<span class="sourceLineNo">1380</span>      sb.append(r.getRegionInfo().getEncodedName());<a name="line.1380"></a>
-<span class="sourceLineNo">1381</span>    }<a name="line.1381"></a>
-<span class="sourceLineNo">1382</span>    return sb.toString();<a name="line.1382"></a>
-<span class="sourceLineNo">1383</span>  }<a name="line.1383"></a>
-<span class="sourceLineNo">1384</span><a name="line.1384"></a>
-<span class="sourceLineNo">1385</span>  /**<a name="line.1385"></a>
-<span class="sourceLineNo">1386</span>   * Wait on regions close.<a name="line.1386"></a>
-<span class="sourceLineNo">1387</span>   */<a name="line.1387"></a>
-<span class="sourceLineNo">1388</span>  private void waitOnAllRegionsToClose(final boolean abort) {<a name="line.1388"></a>
-<span class="sourceLineNo">1389</span>    // Wait till all regions are closed before going out.<a name="line.1389"></a>
-<span class="sourceLineNo">1390</span>    int lastCount = -1;<a name="line.1390"></a>
-<span class="sourceLineNo">1391</span>    long previousLogTime = 0;<a name="line.1391"></a>
-<span class="sourceLineNo">1392</span>    Set&lt;String&gt; closedRegions = new HashSet&lt;&gt;();<a name="line.1392"></a>
-<span class="sourceLineNo">1393</span>    boolean interrupted = false;<a name="line.1393"></a>
-<span class="sourceLineNo">1394</span>    try {<a name="line.1394"></a>
-<span class="sourceLineNo">1395</span>      while (!isOnlineRegionsEmpty()) {<a name="line.1395"></a>
-<span class="sourceLineNo">1396</span>        int count = getNumberOfOnlineRegions();<a name="line.1396"></a>
-<span class="sourceLineNo">1397</span>        // Only print a message if the count of regions has changed.<a name="line.1397"></a>
-<span class="sourceLineNo">1398</span>        if (count != lastCount) {<a name="line.1398"></a>
-<span class="sourceLineNo">1399</span>          // Log every second at most<a name="line.1399"></a>
-<span class="sourceLineNo">1400</span>          if (System.currentTimeMillis() &gt; (previousLogTime + 1000)) {<a name="line.1400"></a>
-<span class="sourceLineNo">1401</span>            previousLogTime = System.currentTimeMillis();<a name="line.1401"></a>
-<span class="sourceLineNo">1402</span>            lastCount = count;<a name="line.1402"></a>
-<span class="sourceLineNo">1403</span>            LOG.info("Waiting on " + count + " regions to close");<a name="line.1403"></a>
-<span class="sourceLineNo">1404</span>            // Only print out regions still closing if a small number else will<a name="line.1404"></a>
-<span class="sourceLineNo">1405</span>            // swamp the log.<a name="line.1405"></a>
-<span class="sourceLineNo">1406</span>            if (count &lt; 10 &amp;&amp; LOG.isDebugEnabled()) {<a name="line.1406"></a>
-<span class="sourceLineNo">1407</span>              LOG.debug("Online Regions=" + this.onlineRegions);<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>        }<a name="line.1410"></a>
-<span class="sourceLineNo">1411</span>        // Ensure all user regions have been sent a close. Use this to<a name="line.1411"></a>
-<span class="sourceLineNo">1412</span>        // protect against the case where an open comes in after we start the<a name="line.1412"></a>
-<span class="sourceLineNo">1413</span>        // iterator of onlineRegions to close all user regions.<a name="line.1413"></a>
-<span class="sourceLineNo">1414</span>        for (Map.Entry&lt;String, HRegion&gt; e : this.onlineRegions.entrySet()) {<a name="line.1414"></a>
-<span class="sourceLineNo">1415</span>          RegionInfo hri = e.getValue().getRegionInfo();<a name="line.1415"></a>
-<span class="sourceLineNo">1416</span>          if (!this.regionsInTransitionInRS.containsKey(hri.getEncodedNameAsBytes()) &amp;&amp;<a name="line.1416"></a>
-<span class="sourceLineNo">1417</span>              !closedRegions.contains(hri.getEncodedName())) {<a name="line.1417"></a>
-<span class="sourceLineNo">1418</span>            closedRegions.add(hri.getEncodedName());<a name="line.1418"></a>
-<span class="sourceLineNo">1419</span>            // Don't update zk with this close transition; pass false.<a name="line.1419"></a>
-<span class="sourceLineNo">1420</span>            closeRegionIgnoreErrors(hri, abort);<a name="line.1420"></a>
-<span class="sourceLineNo">1421</span>          }<a name="line.1421"></a>
-<span class="sourceLineNo">1422</span>        }<a name="line.1422"></a>
-<span class="sourceLineNo">1423</span>        // No regions in RIT, we could stop waiting now.<a name="line.1423"></a>
-<span class="sourceLineNo">1424</span>        if (this.regionsInTransitionInRS.isEmpty()) {<a name="line.1424"></a>
-<span class="sourceLineNo">1425</span>          if (!isOnlineRegionsEmpty()) {<a name="line.1425"></a>
-<span class="sourceLineNo">1426</span>            LOG.info("We were exiting though online regions are not empty," +<a name="line.1426"></a>
-<span class="sourceLineNo">1427</span>                " because some regions failed closing");<a name="line.1427"></a>
-<span class="sourceLineNo">1428</span>          }<a name="line.1428"></a>
-<span class="sourceLineNo">1429</span>          break;<a name="line.1429"></a>
-<span class="sourceLineNo">1430</span>        }<a name="line.1430"></a>
-<span class="sourceLineNo">1431</span>        if (sleep(200)) {<a name="line.1431"></a>
-<span class="sourceLineNo">1432</span>          interrupted = true;<a name="line.1432"></a>
-<span class="sourceLineNo">1433</span>        }<a name="line.1433"></a>
-<span class="sourceLineNo">1434</span>      }<a name="line.1434"></a>
-<span class="sourceLineNo">1435</span>    } finally {<a name="line.1435"></a>
-<span class="sourceLineNo">1436</span>      if (interrupted) {<a name="line.1436"></a>
-<span class="sourceLineNo">1437</span>        Thread.currentThread().interrupt();<a name="line.1437"></a>
-<span class="sourceLineNo">1438</span>      }<a name="line.1438"></a>
-<span class="sourceLineNo">1439</span>    }<a name="line.1439"></a>
-<span class="sourceLineNo">1440</span>  }<a name="line.1440"></a>
-<span class="sourceLineNo">1441</span><a name="line.1441"></a>
-<span class="sourceLineNo">1442</span>  private boolean sleep(long millis) {<a name="line.1442"></a>
-<span class="sourceLineNo">1443</span>    boolean interrupted = false;<a name="line.1443"></a>
-<span class="sourceLineNo">1444</span>    try {<a name="line.1444"></a>
-<span class="sourceLineNo">1445</span>      Thread.sleep(millis);<a name="line.1445"></a>
-<span class="sourceLineNo">1446</span>    } catch (InterruptedException e) {<a name="line.1446"></a>
-<span class="sourceLineNo">1447</span>      LOG.warn("Interrupted while sleeping");<a name="line.1447"></a>
-<span class="sourceLineNo">1448</span>      interrupted = true;<a name="line.1448"></a>
-<span class="sourceLineNo">1449</span>    }<a name="line.1449"></a>
-<span class="sourceLineNo">1450</span>    return interrupted;<a name="line.1450"></a>
-<span class="sourceLineNo">1451</span>  }<a name="line.1451"></a>
-<span class="sourceLineNo">1452</span><a name="line.1452"></a>
-<span class="sourceLineNo">1453</span>  private void shutdownWAL(final boolean close) {<a name="line.1453"></a>
-<span class="sourceLineNo">1454</span>    if (this.walFactory != null) {<a name="line.1454"></a>
-<span class="sourceLineNo">1455</span>      try {<a name="line.1455"></a>
-<span class="sourceLineNo">1456</span>        if (close) {<a name="line.1456"></a>
-<span class="sourceLineNo">1457</span>          walFactory.close();<a name="line.1457"></a>
-<span class="sourceLineNo">1458</span>        } else {<a name="line.1458"></a>
-<span class="sourceLineNo">1459</span>          walFactory.shutdown();<a name="line.1459"></a>
-<span class="sourceLineNo">1460</span>        }<a name="line.1460"></a>
-<span class="sourceLineNo">1461</span>      } catch (Throwable e) {<a name="line.1461"></a>
-<span class="sourceLineNo">1462</span>        e = e instanceof RemoteException ? ((RemoteException) e).unwrapRemoteException() : e;<a name="line.1462"></a>
-<span class="sourceLineNo">1463</span>        LOG.error("Shutdown / close of WAL failed: " + e);<a name="line.1463"></a>
-<span class="sourceLineNo">1464</span>        LOG.debug("Shutdown / close exception details:", e);<a name="line.1464"></a>
-<span class="sourceLineNo">1465</span>      }<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>   * Run init. Sets up wal and starts up all server threads.<a name="line.1470"></a>
-<span class="sourceLineNo">1471</span>   *<a name="line.1471"></a>
-<span class="sourceLineNo">1472</span>   * @param c Extra configuration.<a name="line.1472"></a>
-<span class="sourceLineNo">1473</span>   */<a name="line.1473"></a>
-<span class="sourceLineNo">1474</span>  protected void handleReportForDutyResponse(final RegionServerStartupResponse c)<a name="line.1474"></a>
-<span class="sourceLineNo">1475</span>  throws IOException {<a name="line.1475"></a>
-<span class="sourceLineNo">1476</span>    try {<a name="line.1476"></a>
-<span class="sourceLineNo">1477</span>      boolean updateRootDir = false;<a name="line.1477"></a>
-<span class="sourceLineNo">1478</span>      for (NameStringPair e : c.getMapEntriesList()) {<a name="line.1478"></a>
-<span class="sourceLineNo">1479</span>        String key = e.getName();<a name="line.1479"></a>
-<span class="sourceLineNo">1480</span>        // The hostname the master sees us as.<a name="line.1480"></a>
-<span class="sourceLineNo">1481</span>        if (key.equals(HConstants.KEY_FOR_HOSTNAME_SEEN_BY_MASTER)) {<a name="line.1481"></a>
-<span class="sourceLineNo">1482</span>          String hostnameFromMasterPOV = e.getValue();<a name="line.1482"></a>
-<span class="sourceLineNo">1483</span>          this.serverName = ServerName.valueOf(hostnameFromMasterPOV, rpcServices.isa.getPort(),<a name="line.1483"></a>
-<span class="sourceLineNo">1484</span>              this.startcode);<a name="line.1484"></a>
-<span class="sourceLineNo">1485</span>          if (!StringUtils.isBlank(useThisHostnameInstead) &amp;&amp;<a name="line.1485"></a>
-<span class="sourceLineNo">1486</span>              !hostnameFromMasterPOV.equals(useThisHostnameInstead)) {<a name="line.1486"></a>
-<span class="sourceLineNo">1487</span>            String msg = "Master passed us a different hostname to use; was=" +<a name="line.1487"></a>
-<span class="sourceLineNo">1488</span>                this.useThisHostnameInstead + ", but now=" + hostnameFromMasterPOV;<a name="line.1488"></a>
-<span class="sourceLineNo">1489</span>            LOG.error(msg);<a name="line.1489"></a>
-<span class="sourceLineNo">1490</span>            throw new IOException(msg);<a name="line.1490"></a>
-<span class="sourceLineNo">1491</span>          }<a name="line.1491"></a>
-<span class="sourceLineNo">1492</span>          if (StringUtils.isBlank(useThisHostnameInstead) &amp;&amp;<a name="line.1492"></a>
-<span class="sourceLineNo">1493</span>              !hostnameFromMasterPOV.equals(rpcServices.isa.getHostName())) {<a name="line.1493"></a>
-<span class="sourceLineNo">1494</span>            String msg = "Master passed us a different hostname to use; was=" +<a name="line.1494"></a>
-<span class="sourceLineNo">1495</span>                rpcServices.isa.getHostName() + ", but now=" + hostnameFromMasterPOV;<a name="line.1495"></a>
-<span class="sourceLineNo">1496</span>            LOG.error(msg);<a name="line.1496"></a>
-<span class="sourceLineNo">1497</span>          }<a name="line.1497"></a>
-<span class="sourceLineNo">1498</span>          continue;<a name="line.1498"></a>
-<span class="sourceLineNo">1499</span>        }<a name="line.1499"></a>
-<span class="sourceLineNo">1500</span><a name="line.1500"></a>
-<span class="sourceLineNo">1501</span>        String value = e.getValue();<a name="line.1501"></a>
-<span class="sourceLineNo">1502</span>        if (key.equals(HConstants.HBASE_DIR)) {<a name="line.1502"></a>
-<span class="sourceLineNo">1503</span>          if (value != null &amp;&amp; !value.equals(conf.get(HConstants.HBASE_DIR))) {<a name="line.1503"></a>
-<span class="sourceLineNo">1504</span>            updateRootDir = true;<a name="line.1504"></a>
-<span class="sourceLineNo">1505</span>          }<a name="line.1505"></a>
-<span class="sourceLineNo">1506</span>        }<a name="line.1506"></a>
-<span class="sourceLineNo">1507</span><a name="line.1507"></a>
-<span class="sourceLineNo">1508</span>        if (LOG.isDebugEnabled()) {<a name="line.1508"></a>
-<span class="sourceLineNo">1509</span>          LOG.debug("Config from master: " + key + "=" + value);<a name="line.1509"></a>
-<span class="sourceLineNo">1510</span>        }<a name="line.1510"></a>
-<span class="sourceLineNo">1511</span>        this.conf.set(key, value);<a name="line.1511"></a>
-<span class="sourceLineNo">1512</span>      }<a name="line.1512"></a>
-<span class="sourceLineNo">1513</span>      // Set our ephemeral znode up in zookeeper now we have a name.<a name="line.1513"></a>
-<span class="sourceLineNo">1514</span>      createMyEphemeralNode();<a name="line.1514"></a>
-<span class="sourceLineNo">1515</span><a name="line.1515"></a>
-<span class="sourceLineNo">1516</span>      if (updateRootDir) {<a name="line.1516"></a>
-<span class="sourceLineNo">1517</span>        // initialize file system by the config fs.defaultFS and hbase.rootdir from master<a name="line.1517"></a>
-<span class="sourceLineNo">1518</span>        initializeFileSystem();<a name="line.1518"></a>
-<span class="sourceLineNo">1519</span>      }<a name="line.1519"></a>
-<span class="sourceLineNo">1520</span><a name="line.1520"></a>
-<span class="sourceLineNo">1521</span>      // hack! Maps DFSClient =&gt; RegionServer for logs.  HDFS made this<a name="line.1521"></a>
-<span class="sourceLineNo">1522</span>      // config param for task trackers, but we can piggyback off of it.<a name="line.1522"></a>
-<span class="sourceLineNo">1523</span>      if (this.conf.get("mapreduce.task.attempt.id") == null) {<a name="line.1523"></a>
-<span class="sourceLineNo">1524</span>        this.conf.set("mapreduce.task.attempt.id", "hb_rs_" + this.serverName.toString());<a name="line.1524"></a>
-<span class="sourceLineNo">1525</span>      }<a name="line.1525"></a>
-<span class="sourceLineNo">1526</span><a name="line.1526"></a>
-<span class="sourceLineNo">1527</span>      // Save it in a file, this will allow to see if we crash<a name="line.1527"></a>
-<span class="sourceLineNo">1528</span>      ZNodeClearer.writeMyEphemeralNodeOnDisk(getMyEphemeralNodePath());<a name="line.1528"></a>
-<span class="sourceLineNo">1529</span><a name="line.1529"></a>
-<span class="sourceLineNo">1530</span>      // This call sets up an initialized replication and WAL. Later we start it up.<a name="line.1530"></a>
-<span class="sourceLineNo">1531</span>      setupWALAndReplication();<a name="line.1531"></a>
-<span class="sourceLineNo">1532</span>      // Init in here rather than in constructor after thread name has been set<a name="line.1532"></a>
-<span class="sourceLineNo">1533</span>      this.metricsTable = new MetricsTable(new MetricsTableWrapperAggregateImpl(this));<a name="line.1533"></a>
-<span class="sourceLineNo">1534</span>      this.metricsRegionServer = new MetricsRegionServer(<a name="line.1534"></a>
-<span class="sourceLineNo">1535</span>          new MetricsRegionServerWrapperImpl(this), conf, metricsTable);<a name="line.1535"></a>
-<span class="sourceLineNo">1536</span>      // Now that we have a metrics source, start the pause monitor<a name="line.1536"></a>
-<span class="sourceLineNo">1537</span>      this.pauseMonitor = new JvmPauseMonitor(conf, getMetrics().getMetricsSource());<a name="line.1537"></a>
-<span class="sourceLineNo">1538</span>      pauseMonitor.start();<a name="line.1538"></a>
-<span class="sourceLineNo">1539</span><a name="line.1539"></a>
-<span class="sourceLineNo">1540</span>      // There is a rare case where we do NOT want services to start. Check config.<a name="line.1540"></a>
-<span class="sourceLineNo">1541</span>      if (getConfiguration().getBoolean("hbase.regionserver.workers", true)) {<a name="line.1541"></a>
-<span class="sourceLineNo">1542</span>        startServices();<a name="line.1542"></a>
-<span class="sourceLineNo">1543</span>      }<a name="line.1543"></a>
-<span class="sourceLineNo">1544</span>      // In here we start up the replication Service. Above we initialized it. TODO. Reconcile.<a name="line.1544"></a>
-<span class="sourceLineNo">1545</span>      // or make sense of it.<a name="line.1545"></a>
-<span class="sourceLineNo">1546</span>      startReplicationService();<a name="line.1546"></a>
-<span class="sourceLineNo">1547</span><a name="line.1547"></a>
+<span class="sourceLineNo">951</span>      LOG.debug("About to register with Master.");<a name="line.951"></a>
+<span class="sourceLineNo">952</span>      RetryCounterFactory rcf = new RetryCounterFactory(Integer.MAX_VALUE,<a name="line.952"></a>
+<span class="sourceLineNo">953</span>          this.sleeper.getPeriod(), 1000 * 60 * 5);<a name="line.953"></a>
+<span class="sourceLineNo">954</span>      RetryCounter rc = rcf.create();<a name="line.954"></a>
+<span class="sourceLineNo">955</span>      while (keepLooping()) {<a name="line.955"></a>
+<span class="sourceLineNo">956</span>        RegionServerStartupResponse w = reportForDuty();<a name="line.956"></a>
+<span class="sourceLineNo">957</span>        if (w == null) {<a name="line.957"></a>
+<span class="sourceLineNo">958</span>          long sleepTime = rc.getBackoffTimeAndIncrementAttempts();<a name="line.958"></a>
+<span class="sourceLineNo">959</span>          LOG.warn("reportForDuty failed; sleeping {} ms and then retrying.", sleepTime);<a name="line.959"></a>
+<span class="sourceLineNo">960</span>          this.sleeper.sleep(sleepTime);<a name="line.960"></a>
+<span class="sourceLineNo">961</span>        } else {<a name="line.961"></a>
+<span class="sourceLineNo">962</span>          handleReportForDutyResponse(w);<a name="line.962"></a>
+<span class="sourceLineNo">963</span>          break;<a name="line.963"></a>
+<span class="sourceLineNo">964</span>        }<a name="line.964"></a>
+<span class="sourceLineNo">965</span>      }<a name="line.965"></a>
+<span class="sourceLineNo">966</span><a name="line.966"></a>
+<span class="sourceLineNo">967</span>      if (!isStopped() &amp;&amp; isHealthy()) {<a name="line.967"></a>
+<span class="sourceLineNo">968</span>        // start the snapshot handler and other procedure handlers,<a name="line.968"></a>
+<span class="sourceLineNo">969</span>        // since the server is ready to run<a name="line.969"></a>
+<span class="sourceLineNo">970</span>        if (this.rspmHost != null) {<a name="line.970"></a>
+<span class="sourceLineNo">971</span>          this.rspmHost.start();<a name="line.971"></a>
+<span class="sourceLineNo">972</span>        }<a name="line.972"></a>
+<span class="sourceLineNo">973</span>        // Start the Quota Manager<a name="line.973"></a>
+<span class="sourceLineNo">974</span>        if (this.rsQuotaManager != null) {<a name="line.974"></a>
+<span class="sourceLineNo">975</span>          rsQuotaManager.start(getRpcServer().getScheduler());<a name="line.975"></a>
+<span class="sourceLineNo">976</span>        }<a name="line.976"></a>
+<span class="sourceLineNo">977</span>        if (this.rsSpaceQuotaManager != null) {<a name="line.977"></a>
+<span class="sourceLineNo">978</span>          this.rsSpaceQuotaManager.start();<a name="line.978"></a>
+<span class="sourceLineNo">979</span>        }<a name="line.979"></a>
+<span class="sourceLineNo">980</span>      }<a name="line.980"></a>
+<span class="sourceLineNo">981</span><a name="line.981"></a>
+<span class="sourceLineNo">982</span>      // We registered with the Master.  Go into run mode.<a name="line.982"></a>
+<span class="sourceLineNo">983</span>      long lastMsg = System.currentTimeMillis();<a name="line.983"></a>
+<span class="sourceLineNo">984</span>      long oldRequestCount = -1;<a name="line.984"></a>
+<span class="sourceLineNo">985</span>      // The main run loop.<a name="line.985"></a>
+<span class="sourceLineNo">986</span>      while (!isStopped() &amp;&amp; isHealthy()) {<a name="line.986"></a>
+<span class="sourceLineNo">987</span>        if (!isClusterUp()) {<a name="line.987"></a>
+<span class="sourceLineNo">988</span>          if (isOnlineRegionsEmpty()) {<a name="line.988"></a>
+<span class="sourceLineNo">989</span>            stop("Exiting; cluster shutdown set and not carrying any regions");<a name="line.989"></a>
+<span class="sourceLineNo">990</span>          } else if (!this.stopping) {<a name="line.990"></a>
+<span class="sourceLineNo">991</span>            this.stopping = true;<a name="line.991"></a>
+<span class="sourceLineNo">992</span>            LOG.info("Closing user regions");<a name="line.992"></a>
+<span class="sourceLineNo">993</span>            closeUserRegions(this.abortRequested);<a name="line.993"></a>
+<span class="sourceLineNo">994</span>          } else if (this.stopping) {<a name="line.994"></a>
+<span class="sourceLineNo">995</span>            boolean allUserRegionsOffline = areAllUserRegionsOffline();<a name="line.995"></a>
+<span class="sourceLineNo">996</span>            if (allUserRegionsOffline) {<a name="line.996"></a>
+<span class="sourceLineNo">997</span>              // Set stopped if no more write requests tp meta tables<a name="line.997"></a>
+<span class="sourceLineNo">998</span>              // since last time we went around the loop.  Any open<a name="line.998"></a>
+<span class="sourceLineNo">999</span>              // meta regions will be closed on our way out.<a name="line.999"></a>
+<span class="sourceLineNo">1000</span>              if (oldRequestCount == getWriteRequestCount()) {<a name="line.1000"></a>
+<span class="sourceLineNo">1001</span>                stop("Stopped; only catalog regions remaining online");<a name="line.1001"></a>
+<span class="sourceLineNo">1002</span>                break;<a name="line.1002"></a>
+<span class="sourceLineNo">1003</span>              }<a name="line.1003"></a>
+<span class="sourceLineNo">1004</span>              oldRequestCount = getWriteRequestCount();<a name="line.1004"></a>
+<span class="sourceLineNo">1005</span>            } else {<a name="line.1005"></a>
+<span class="sourceLineNo">1006</span>              // Make sure all regions have been closed -- some regions may<a name="line.1006"></a>
+<span class="sourceLineNo">1007</span>              // have not got it because we were splitting at the time of<a name="line.1007"></a>
+<span class="sourceLineNo">1008</span>              // the call to closeUserRegions.<a name="line.1008"></a>
+<span class="sourceLineNo">1009</span>              closeUserRegions(this.abortRequested);<a name="line.1009"></a>
+<span class="sourceLineNo">1010</span>            }<a name="line.1010"></a>
+<span class="sourceLineNo">1011</span>            LOG.debug("Waiting on " + getOnlineRegionsAsPrintableString());<a name="line.1011"></a>
+<span class="sourceLineNo">1012</span>          }<a name="line.1012"></a>
+<span class="sourceLineNo">1013</span>        }<a name="line.1013"></a>
+<span class="sourceLineNo">1014</span>        long now = System.currentTimeMillis();<a name="line.1014"></a>
+<span class="sourceLineNo">1015</span>        if ((now - lastMsg) &gt;= msgInterval) {<a name="line.1015"></a>
+<span class="sourceLineNo">1016</span>          tryRegionServerReport(lastMsg, now);<a name="line.1016"></a>
+<span class="sourceLineNo">1017</span>          lastMsg = System.currentTimeMillis();<a name="line.1017"></a>
+<span class="sourceLineNo">1018</span>        }<a name="line.1018"></a>
+<span class="sourceLineNo">1019</span>        if (!isStopped() &amp;&amp; !isAborted()) {<a name="line.1019"></a>
+<span class="sourceLineNo">1020</span>          this.sleeper.sleep();<a name="line.1020"></a>
+<span class="sourceLineNo">1021</span>        }<a name="line.1021"></a>
+<span class="sourceLineNo">1022</span>      } // for<a name="line.1022"></a>
+<span class="sourceLineNo">1023</span>    } catch (Throwable t) {<a name="line.1023"></a>
+<span class="sourceLineNo">1024</span>      if (!rpcServices.checkOOME(t)) {<a name="line.1024"></a>
+<span class="sourceLineNo">1025</span>        String prefix = t instanceof YouAreDeadException? "": "Unhandled: ";<a name="line.1025"></a>
+<span class="sourceLineNo">1026</span>        abort(prefix + t.getMessage(), t);<a name="line.1026"></a>
+<span class="sourceLineNo">1027</span>      }<a name="line.1027"></a>
+<span class="sourceLineNo">1028</span>    }<a name="line.1028"></a>
+<span class="sourceLineNo">1029</span>    if (this.leases != null) {<a name="line.1029"></a>
+<span class="sourceLineNo">1030</span>      this.leases.closeAfterLeasesExpire();<a name="line.1030"></a>
+<span class="sourceLineNo">1031</span>    }<a name="line.1031"></a>
+<span class="sourceLineNo">1032</span>    if (this.splitLogWorker != null) {<a name="line.1032"></a>
+<span class="sourceLineNo">1033</span>      splitLogWorker.stop();<a name="line.1033"></a>
+<span class="sourceLineNo">1034</span>    }<a name="line.1034"></a>
+<span class="sourceLineNo">1035</span>    if (this.infoServer != null) {<a name="line.1035"></a>
+<span class="sourceLineNo">1036</span>      LOG.info("Stopping infoServer");<a name="line.1036"></a>
+<span class="sourceLineNo">1037</span>      try {<a name="line.1037"></a>
+<span class="sourceLineNo">1038</span>        this.infoServer.stop();<a name="line.1038"></a>
+<span class="sourceLineNo">1039</span>      } catch (Exception e) {<a name="line.1039"></a>
+<span class="sourceLineNo">1040</span>        LOG.error("Failed to stop infoServer", e);<a name="line.1040"></a>
+<span class="sourceLineNo">1041</span>      }<a name="line.1041"></a>
+<span class="sourceLineNo">1042</span>    }<a name="line.1042"></a>
+<span class="sourceLineNo">1043</span>    // Send cache a shutdown.<a name="line.1043"></a>
+<span class="sourceLineNo">1044</span>    if (cacheConfig != null &amp;&amp; cacheConfig.isBlockCacheEnabled()) {<a name="line.1044"></a>
+<span class="sourceLineNo">1045</span>      cacheConfig.getBlockCache().shutdown();<a name="line.1045"></a>
+<span class="sourceLineNo">1046</span>    }<a name="line.1046"></a>
+<span class="sourceLineNo">1047</span>    mobCacheConfig.getMobFileCache().shutdown();<a name="line.1047"></a>
+<span class="sourceLineNo">1048</span><a name="line.1048"></a>
+<span class="sourceLineNo">1049</span>    if (movedRegionsCleaner != null) {<a name="line.1049"></a>
+<span class="sourceLineNo">1050</span>      movedRegionsCleaner.stop("Region Server stopping");<a name="line.1050"></a>
+<span class="sourceLineNo">1051</span>    }<a name="line.1051"></a>
+<span class="sourceLineNo">1052</span><a name="line.1052"></a>
+<span class="sourceLineNo">1053</span>    // Send interrupts to wake up threads if sleeping so they notice shutdown.<a name="line.1053"></a>
+<span class="sourceLineNo">1054</span>    // TODO: Should we check they are alive? If OOME could have exited already<a name="line.1054"></a>
+<span class="sourceLineNo">1055</span>    if (this.hMemManager != null) this.hMemManager.stop();<a name="line.1055"></a>
+<span class="sourceLineNo">1056</span>    if (this.cacheFlusher != null) this.cacheFlusher.interruptIfNecessary();<a name="line.1056"></a>
+<span class="sourceLineNo">1057</span>    if (this.compactSplitThread != null) this.compactSplitThread.interruptIfNecessary();<a name="line.1057"></a>
+<span class="sourceLineNo">1058</span>    sendShutdownInterrupt();<a name="line.1058"></a>
+<span class="sourceLineNo">1059</span><a name="line.1059"></a>
+<span class="sourceLineNo">1060</span>    // Stop the snapshot and other procedure handlers, forcefully killing all running tasks<a name="line.1060"></a>
+<span class="sourceLineNo">1061</span>    if (rspmHost != null) {<a name="line.1061"></a>
+<span class="sourceLineNo">1062</span>      rspmHost.stop(this.abortRequested || this.killed);<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>    if (this.killed) {<a name="line.1065"></a>
+<span class="sourceLineNo">1066</span>      // Just skip out w/o closing regions.  Used when testing.<a name="line.1066"></a>
+<span class="sourceLineNo">1067</span>    } else if (abortRequested) {<a name="line.1067"></a>
+<span class="sourceLineNo">1068</span>      if (this.fsOk) {<a name="line.1068"></a>
+<span class="sourceLineNo">1069</span>        closeUserRegions(abortRequested); // Don't leave any open file handles<a name="line.1069"></a>
+<span class="sourceLineNo">1070</span>      }<a name="line.1070"></a>
+<span class="sourceLineNo">1071</span>      LOG.info("aborting server " + this.serverName);<a name="line.1071"></a>
+<span class="sourceLineNo">1072</span>    } else {<a name="line.1072"></a>
+<span class="sourceLineNo">1073</span>      closeUserRegions(abortRequested);<a name="line.1073"></a>
+<span class="sourceLineNo">1074</span>      LOG.info("stopping server " + this.serverName);<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>    // so callers waiting for meta without timeout can stop<a name="line.1077"></a>
+<span class="sourceLineNo">1078</span>    if (this.metaTableLocator != null) this.metaTableLocator.stop();<a name="line.1078"></a>
+<span class="sourceLineNo">1079</span>    if (this.clusterConnection != null &amp;&amp; !clusterConnection.isClosed()) {<a name="line.1079"></a>
+<span class="sourceLineNo">1080</span>      try {<a name="line.1080"></a>
+<span class="sourceLineNo">1081</span>        this.clusterConnection.close();<a name="line.1081"></a>
+<span class="sourceLineNo">1082</span>      } catch (IOException e) {<a name="line.1082"></a>
+<span class="sourceLineNo">1083</span>        // Although the {@link Closeable} interface throws an {@link<a name="line.1083"></a>
+<span class="sourceLineNo">1084</span>        // IOException}, in reality, the implementation would never do that.<a name="line.1084"></a>
+<span class="sourceLineNo">1085</span>        LOG.warn("Attempt to close server's short circuit ClusterConnection failed.", e);<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>    // Closing the compactSplit thread before closing meta regions<a name="line.1089"></a>
+<span class="sourceLineNo">1090</span>    if (!this.killed &amp;&amp; containsMetaTableRegions()) {<a name="line.1090"></a>
+<span class="sourceLineNo">1091</span>      if (!abortRequested || this.fsOk) {<a name="line.1091"></a>
+<span class="sourceLineNo">1092</span>        if (this.compactSplitThread != null) {<a name="line.1092"></a>
+<span class="sourceLineNo">1093</span>          this.compactSplitThread.join();<a name="line.1093"></a>
+<span class="sourceLineNo">1094</span>          this.compactSplitThread = null;<a name="line.1094"></a>
+<span class="sourceLineNo">1095</span>        }<a name="line.1095"></a>
+<span class="sourceLineNo">1096</span>        closeMetaTableRegions(abortRequested);<a name="line.1096"></a>
+<span class="sourceLineNo">1097</span>      }<a name="line.1097"></a>
+<span class="sourceLineNo">1098</span>    }<a name="line.1098"></a>
+<span class="sourceLineNo">1099</span><a name="line.1099"></a>
+<span class="sourceLineNo">1100</span>    if (!this.killed &amp;&amp; this.fsOk) {<a name="line.1100"></a>
+<span class="sourceLineNo">1101</span>      waitOnAllRegionsToClose(abortRequested);<a name="line.1101"></a>
+<span class="sourceLineNo">1102</span>      LOG.info("stopping server " + this.serverName + "; all regions closed.");<a name="line.1102"></a>
+<span class="sourceLineNo">1103</span>    }<a name="line.1103"></a>
+<span class="sourceLineNo">1104</span><a name="line.1104"></a>
+<span class="sourceLineNo">1105</span>    // Stop the quota manager<a name="line.1105"></a>
+<span class="sourceLineNo">1106</span>    if (rsQuotaManager != null) {<a name="line.1106"></a>
+<span class="sourceLineNo">1107</span>      rsQuotaManager.stop();<a name="line.1107"></a>
+<span class="sourceLineNo">1108</span>    }<a name="line.1108"></a>
+<span class="sourceLineNo">1109</span>    if (rsSpaceQuotaManager != null) {<a name="line.1109"></a>
+<span class="sourceLineNo">1110</span>      rsSpaceQuotaManager.stop();<a name="line.1110"></a>
+<span class="sourceLineNo">1111</span>      rsSpaceQuotaManager = null;<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>    //fsOk flag may be changed when closing regions throws exception.<a name="line.1114"></a>
+<span class="sourceLineNo">1115</span>    if (this.fsOk) {<a name="line.1115"></a>
+<span class="sourceLineNo">1116</span>      shutdownWAL(!abortRequested);<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>    // Make sure the proxy is down.<a name="line.1119"></a>
+<span class="sourceLineNo">1120</span>    if (this.rssStub != null) {<a name="line.1120"></a>
+<span class="sourceLineNo">1121</span>      this.rssStub = null;<a name="line.1121"></a>
+<span class="sourceLineNo">1122</span>    }<a name="line.1122"></a>
+<span class="sourceLineNo">1123</span>    if (this.lockStub != null) {<a name="line.1123"></a>
+<span class="sourceLineNo">1124</span>      this.lockStub = null;<a name="line.1124"></a>
+<span class="sourceLineNo">1125</span>    }<a name="line.1125"></a>
+<span class="sourceLineNo">1126</span>    if (this.rpcClient != null) {<a name="line.1126"></a>
+<span class="sourceLineNo">1127</span>      this.rpcClient.close();<a name="line.1127"></a>
+<span class="sourceLineNo">1128</span>    }<a name="line.1128"></a>
+<span class="sourceLineNo">1129</span>    if (this.leases != null) {<a name="line.1129"></a>
+<span class="sourceLineNo">1130</span>      this.leases.close();<a name="line.1130"></a>
+<span class="sourceLineNo">1131</span>    }<a name="line.1131"></a>
+<span class="sourceLineNo">1132</span>    if (this.pauseMonitor != null) {<a name="line.1132"></a>
+<span class="sourceLineNo">1133</span>      this.pauseMonitor.stop();<a name="line.1133"></a>
+<span class="sourceLineNo">1134</span>    }<a name="line.1134"></a>
+<span class="sourceLineNo">1135</span><a name="line.1135"></a>
+<span class="sourceLineNo">1136</span>    if (!killed) {<a name="line.1136"></a>
+<span class="sourceLineNo">1137</span>      stopServiceThreads();<a name="line.1137"></a>
+<span class="sourceLineNo">1138</span>    }<a name="line.1138"></a>
+<span class="sourceLineNo">1139</span><a name="line.1139"></a>
+<span class="sourceLineNo">1140</span>    if (this.rpcServices != null) {<a name="line.1140"></a>
+<span class="sourceLineNo">1141</span>      this.rpcServices.stop();<a name="line.1141"></a>
+<span class="sourceLineNo">1142</span>    }<a name="line.1142"></a>
+<span class="sourceLineNo">1143</span><a name="line.1143"></a>
+<span class="sourceLineNo">1144</span>    try {<a name="line.1144"></a>
+<span class="sourceLineNo">1145</span>      deleteMyEphemeralNode();<a name="line.1145"></a>
+<span class="sourceLineNo">1146</span>    } catch (KeeperException.NoNodeException nn) {<a name="line.1146"></a>
+<span class="sourceLineNo">1147</span>    } catch (KeeperException e) {<a name="line.1147"></a>
+<span class="sourceLineNo">1148</span>      LOG.warn("Failed deleting my ephemeral node", e);<a name="line.1148"></a>
+<span class="sourceLineNo">1149</span>    }<a name="line.1149"></a>
+<span class="sourceLineNo">1150</span>    // We may have failed to delete the znode at the previous step, but<a name="line.1150"></a>
+<span class="sourceLineNo">1151</span>    //  we delete the file anyway: a second attempt to delete the znode is likely to fail again.<a name="line.1151"></a>
+<span class="sourceLineNo">1152</span>    ZNodeClearer.deleteMyEphemeralNodeOnDisk();<a name="line.1152"></a>
+<span class="sourceLineNo">1153</span><a name="line.1153"></a>
+<span class="sourceLineNo">1154</span>    if (this.zooKeeper != null) {<a name="line.1154"></a>
+<span class="sourceLineNo">1155</span>      this.zooKeeper.close();<a name="line.1155"></a>
+<span class="sourceLineNo">1156</span>    }<a name="line.1156"></a>
+<span class="sourceLineNo">1157</span>    this.shutDown = true;<a name="line.1157"></a>
+<span class="sourceLineNo">1158</span>    LOG.info("Exiting; stopping=" + this.serverName + "; zookeeper connection closed.");<a name="line.1158"></a>
+<span class="sourceLineNo">1159</span>  }<a name="line.1159"></a>
+<span class="sourceLineNo">1160</span><a name="line.1160"></a>
+<span class="sourceLineNo">1161</span>  private boolean containsMetaTableRegions() {<a name="line.1161"></a>
+<span class="sourceLineNo">1162</span>    return onlineRegions.containsKey(RegionInfoBuilder.FIRST_META_REGIONINFO.getEncodedName());<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>  private boolean areAllUserRegionsOffline() {<a name="line.1165"></a>
+<span class="sourceLineNo">1166</span>    if (getNumberOfOnlineRegions() &gt; 2) return false;<a name="line.1166"></a>
+<span class="sourceLineNo">1167</span>    boolean allUserRegionsOffline = true;<a name="line.1167"></a>
+<span class="sourceLineNo">1168</span>    for (Map.Entry&lt;String, HRegion&gt; e: this.onlineRegions.entrySet()) {<a name="line.1168"></a>
+<span class="sourceLineNo">1169</span>      if (!e.getValue().getRegionInfo().isMetaRegion()) {<a name="line.1169"></a>
+<span class="sourceLineNo">1170</span>        allUserRegionsOffline = false;<a name="line.1170"></a>
+<span class="sourceLineNo">1171</span>        break;<a name="line.1171"></a>
+<span class="sourceLineNo">1172</span>      }<a name="line.1172"></a>
+<span class="sourceLineNo">1173</span>    }<a name="line.1173"></a>
+<span class="sourceLineNo">1174</span>    return allUserRegionsOffline;<a name="line.1174"></a>
+<span class="sourceLineNo">1175</span>  }<a name="line.1175"></a>
+<span class="sourceLineNo">1176</span><a name="line.1176"></a>
+<span class="sourceLineNo">1177</span>  /**<a name="line.1177"></a>
+<span class="sourceLineNo">1178</span>   * @return Current write count for all online regions.<a name="line.1178"></a>
+<span class="sourceLineNo">1179</span>   */<a name="line.1179"></a>
+<span class="sourceLineNo">1180</span>  private long getWriteRequestCount() {<a name="line.1180"></a>
+<span class="sourceLineNo">1181</span>    long writeCount = 0;<a name="line.1181"></a>
+<span class="sourceLineNo">1182</span>    for (Map.Entry&lt;String, HRegion&gt; e: this.onlineRegions.entrySet()) {<a name="line.1182"></a>
+<span class="sourceLineNo">1183</span>      writeCount += e.getValue().getWriteRequestsCount();<a name="line.1183"></a>
+<span class="sourceLineNo">1184</span>    }<a name="line.1184"></a>
+<span class="sourceLineNo">1185</span>    return writeCount;<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>  @VisibleForTesting<a name="line.1188"></a>
+<span class="sourceLineNo">1189</span>  protected void tryRegionServerReport(long reportStartTime, long reportEndTime)<a name="line.1189"></a>
+<span class="sourceLineNo">1190</span>      throws IOException {<a name="line.1190"></a>
+<span class="sourceLineNo">1191</span>    RegionServerStatusService.BlockingInterface rss = rssStub;<a name="line.1191"></a>
+<span class="sourceLineNo">1192</span>    if (rss == null) {<a name="line.1192"></a>
+<span class="sourceLineNo">1193</span>      // the current server could be stopping.<a name="line.1193"></a>
+<span class="sourceLineNo">1194</span>      return;<a name="line.1194"></a>
+<span class="sourceLineNo">1195</span>    }<a name="line.1195"></a>
+<span class="sourceLineNo">1196</span>    ClusterStatusProtos.ServerLoad sl = buildServerLoad(reportStartTime, reportEndTime);<a name="line.1196"></a>
+<span class="sourceLineNo">1197</span>    try {<a name="line.1197"></a>
+<span class="sourceLineNo">1198</span>      RegionServerReportRequest.Builder request = RegionServerReportRequest.newBuilder();<a name="line.1198"></a>
+<span class="sourceLineNo">1199</span>      request.setServer(ProtobufUtil.toServerName(this.serverName));<a name="line.1199"></a>
+<span class="sourceLineNo">1200</span>      request.setLoad(sl);<a name="line.1200"></a>
+<span class="sourceLineNo">1201</span>      rss.regionServerReport(null, request.build());<a name="line.1201"></a>
+<span class="sourceLineNo">1202</span>    } catch (ServiceException se) {<a name="line.1202"></a>
+<span class="sourceLineNo">1203</span>      IOException ioe = ProtobufUtil.getRemoteException(se);<a name="line.1203"></a>
+<span class="sourceLineNo">1204</span>      if (ioe instanceof YouAreDeadException) {<a name="line.1204"></a>
+<span class="sourceLineNo">1205</span>        // This will be caught and handled as a fatal error in run()<a name="line.1205"></a>
+<span class="sourceLineNo">1206</span>        throw ioe;<a name="line.1206"></a>
+<span class="sourceLineNo">1207</span>      }<a name="line.1207"></a>
+<span class="sourceLineNo">1208</span>      if (rssStub == rss) {<a name="line.1208"></a>
+<span class="sourceLineNo">1209</span>        rssStub = null;<a name="line.1209"></a>
+<span class="sourceLineNo">1210</span>      }<a name="line.1210"></a>
+<span class="sourceLineNo">1211</span>      // Couldn't connect to the master, get location from zk and reconnect<a name="line.1211"></a>
+<span class="sourceLineNo">1212</span>      // Method blocks until new master is found or we are stopped<a name="line.1212"></a>
+<span class="sourceLineNo">1213</span>      createRegionServerStatusStub(true);<a name="line.1213"></a>
+<span class="sourceLineNo">1214</span>    }<a name="line.1214"></a>
+<span class="sourceLineNo">1215</span>  }<a name="line.1215"></a>
+<span class="sourceLineNo">1216</span><a name="line.1216"></a>
+<span class="sourceLineNo">1217</span>  /**<a name="line.1217"></a>
+<span class="sourceLineNo">1218</span>   * Reports the given map of Regions and their size on the filesystem to the active Master.<a name="line.1218"></a>
+<span class="sourceLineNo">1219</span>   *<a name="line.1219"></a>
+<span class="sourceLineNo">1220</span>   * @param regionSizeStore The store containing region sizes<a name="line.1220"></a>
+<span class="sourceLineNo">1221</span>   * @return false if FileSystemUtilizationChore should pause reporting to master. true otherwise<a name="line.1221"></a>
+<span class="sourceLineNo">1222</span>   */<a name="line.1222"></a>
+<span class="sourceLineNo">1223</span>  public boolean reportRegionSizesForQuotas(RegionSizeStore regionSizeStore) {<a name="line.1223"></a>
+<span class="sourceLineNo">1224</span>    RegionServerStatusService.BlockingInterface rss = rssStub;<a name="line.1224"></a>
+<span class="sourceLineNo">1225</span>    if (rss == null) {<a name="line.1225"></a>
+<span class="sourceLineNo">1226</span>      // the current server could be stopping.<a name="line.1226"></a>
+<span class="sourceLineNo">1227</span>      LOG.trace("Skipping Region size report to HMaster as stub is null");<a name="line.1227"></a>
+<span class="sourceLineNo">1228</span>      return true;<a name="line.1228"></a>
+<span class="sourceLineNo">1229</span>    }<a name="line.1229"></a>
+<span class="sourceLineNo">1230</span>    try {<a name="line.1230"></a>
+<span class="sourceLineNo">1231</span>      buildReportAndSend(rss, regionSizeStore);<a name="line.1231"></a>
+<span class="sourceLineNo">1232</span>    } catch (ServiceException se) {<a name="line.1232"></a>
+<span class="s

<TRUNCATED>

[19/46] hbase-site git commit: Published site at 05d22ed960204183fbd9bd16f1dbca6410ccde76.

Posted by gi...@apache.org.
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/3649682c/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 c307d41..d82bfd8 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
@@ -1020,8 +1020,8 @@
 <span class="sourceLineNo">1012</span>  protected ClusterMetrics clusterStatus = null;<a name="line.1012"></a>
 <span class="sourceLineNo">1013</span>  protected ServerName masterServerName;<a name="line.1013"></a>
 <span class="sourceLineNo">1014</span>  protected MasterServices services;<a name="line.1014"></a>
-<span class="sourceLineNo">1015</span>  protected boolean tablesOnMaster;<a name="line.1015"></a>
-<span class="sourceLineNo">1016</span>  protected boolean onlySystemTablesOnMaster;<a name="line.1016"></a>
+<span class="sourceLineNo">1015</span>  protected boolean onlySystemTablesOnMaster;<a name="line.1015"></a>
+<span class="sourceLineNo">1016</span>  protected boolean maintenanceMode;<a name="line.1016"></a>
 <span class="sourceLineNo">1017</span><a name="line.1017"></a>
 <span class="sourceLineNo">1018</span>  @Override<a name="line.1018"></a>
 <span class="sourceLineNo">1019</span>  public void setConf(Configuration conf) {<a name="line.1019"></a>
@@ -1033,627 +1033,626 @@
 <span class="sourceLineNo">1025</span>    if (overallSlop &lt; 0) overallSlop = 0;<a name="line.1025"></a>
 <span class="sourceLineNo">1026</span>    else if (overallSlop &gt; 1) overallSlop = 1;<a name="line.1026"></a>
 <span class="sourceLineNo">1027</span><a name="line.1027"></a>
-<span class="sourceLineNo">1028</span>    this.tablesOnMaster = LoadBalancer.isTablesOnMaster(this.config);<a name="line.1028"></a>
-<span class="sourceLineNo">1029</span>    this.onlySystemTablesOnMaster = LoadBalancer.isSystemTablesOnlyOnMaster(this.config);<a name="line.1029"></a>
-<span class="sourceLineNo">1030</span>    // If system tables on master, implies tablesOnMaster = true.<a name="line.1030"></a>
-<span class="sourceLineNo">1031</span>    if (this.onlySystemTablesOnMaster &amp;&amp; !this.tablesOnMaster) {<a name="line.1031"></a>
-<span class="sourceLineNo">1032</span>      LOG.warn("Set " + TABLES_ON_MASTER + "=true because " + SYSTEM_TABLES_ON_MASTER + "=true");<a name="line.1032"></a>
-<span class="sourceLineNo">1033</span>      this.tablesOnMaster = true;<a name="line.1033"></a>
-<span class="sourceLineNo">1034</span>    }<a name="line.1034"></a>
-<span class="sourceLineNo">1035</span>    this.rackManager = new RackManager(getConf());<a name="line.1035"></a>
-<span class="sourceLineNo">1036</span>    if (useRegionFinder) {<a name="line.1036"></a>
-<span class="sourceLineNo">1037</span>      regionFinder.setConf(conf);<a name="line.1037"></a>
-<span class="sourceLineNo">1038</span>    }<a name="line.1038"></a>
-<span class="sourceLineNo">1039</span>    // Print out base configs. Don't print overallSlop since it for simple balancer exclusively.<a name="line.1039"></a>
-<span class="sourceLineNo">1040</span>    LOG.info("slop=" + this.slop + ", tablesOnMaster=" + this.tablesOnMaster +<a name="line.1040"></a>
-<span class="sourceLineNo">1041</span>      ", systemTablesOnMaster=" + this.onlySystemTablesOnMaster);<a name="line.1041"></a>
+<span class="sourceLineNo">1028</span>    this.onlySystemTablesOnMaster = LoadBalancer.isSystemTablesOnlyOnMaster(this.config);<a name="line.1028"></a>
+<span class="sourceLineNo">1029</span><a name="line.1029"></a>
+<span class="sourceLineNo">1030</span>    this.rackManager = new RackManager(getConf());<a name="line.1030"></a>
+<span class="sourceLineNo">1031</span>    if (useRegionFinder) {<a name="line.1031"></a>
+<span class="sourceLineNo">1032</span>      regionFinder.setConf(conf);<a name="line.1032"></a>
+<span class="sourceLineNo">1033</span>    }<a name="line.1033"></a>
+<span class="sourceLineNo">1034</span>    // Print out base configs. Don't print overallSlop since it for simple balancer exclusively.<a name="line.1034"></a>
+<span class="sourceLineNo">1035</span>    LOG.info("slop={}, systemTablesOnMaster={}",<a name="line.1035"></a>
+<span class="sourceLineNo">1036</span>        this.slop, this.onlySystemTablesOnMaster);<a name="line.1036"></a>
+<span class="sourceLineNo">1037</span>  }<a name="line.1037"></a>
+<span class="sourceLineNo">1038</span><a name="line.1038"></a>
+<span class="sourceLineNo">1039</span>  protected void setSlop(Configuration conf) {<a name="line.1039"></a>
+<span class="sourceLineNo">1040</span>    this.slop = conf.getFloat("hbase.regions.slop", (float) 0.2);<a name="line.1040"></a>
+<span class="sourceLineNo">1041</span>    this.overallSlop = conf.getFloat("hbase.regions.overallSlop", slop);<a name="line.1041"></a>
 <span class="sourceLineNo">1042</span>  }<a name="line.1042"></a>
 <span class="sourceLineNo">1043</span><a name="line.1043"></a>
-<span class="sourceLineNo">1044</span>  protected void setSlop(Configuration conf) {<a name="line.1044"></a>
-<span class="sourceLineNo">1045</span>    this.slop = conf.getFloat("hbase.regions.slop", (float) 0.2);<a name="line.1045"></a>
-<span class="sourceLineNo">1046</span>    this.overallSlop = conf.getFloat("hbase.regions.overallSlop", slop);<a name="line.1046"></a>
-<span class="sourceLineNo">1047</span>  }<a name="line.1047"></a>
-<span class="sourceLineNo">1048</span><a name="line.1048"></a>
-<span class="sourceLineNo">1049</span>  /**<a name="line.1049"></a>
-<span class="sourceLineNo">1050</span>   * Check if a region belongs to some system table.<a name="line.1050"></a>
-<span class="sourceLineNo">1051</span>   * If so, the primary replica may be expected to be put on the master regionserver.<a name="line.1051"></a>
-<span class="sourceLineNo">1052</span>   */<a name="line.1052"></a>
-<span class="sourceLineNo">1053</span>  public boolean shouldBeOnMaster(RegionInfo region) {<a name="line.1053"></a>
-<span class="sourceLineNo">1054</span>    return this.onlySystemTablesOnMaster &amp;&amp; region.getTable().isSystemTable();<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>   * Balance the regions that should be on master regionserver.<a name="line.1058"></a>
-<span class="sourceLineNo">1059</span>   */<a name="line.1059"></a>
-<span class="sourceLineNo">1060</span>  protected List&lt;RegionPlan&gt; balanceMasterRegions(Map&lt;ServerName, List&lt;RegionInfo&gt;&gt; clusterMap) {<a name="line.1060"></a>
-<span class="sourceLineNo">1061</span>    if (masterServerName == null || clusterMap == null || clusterMap.size() &lt;= 1) return null;<a name="line.1061"></a>
-<span class="sourceLineNo">1062</span>    List&lt;RegionPlan&gt; plans = null;<a name="line.1062"></a>
-<span class="sourceLineNo">1063</span>    List&lt;RegionInfo&gt; regions = clusterMap.get(masterServerName);<a name="line.1063"></a>
-<span class="sourceLineNo">1064</span>    if (regions != null) {<a name="line.1064"></a>
-<span class="sourceLineNo">1065</span>      Iterator&lt;ServerName&gt; keyIt = null;<a name="line.1065"></a>
-<span class="sourceLineNo">1066</span>      for (RegionInfo region: regions) {<a name="line.1066"></a>
-<span class="sourceLineNo">1067</span>        if (shouldBeOnMaster(region)) continue;<a name="line.1067"></a>
-<span class="sourceLineNo">1068</span><a name="line.1068"></a>
-<span class="sourceLineNo">1069</span>        // Find a non-master regionserver to host the region<a name="line.1069"></a>
-<span class="sourceLineNo">1070</span>        if (keyIt == null || !keyIt.hasNext()) {<a name="line.1070"></a>
-<span class="sourceLineNo">1071</span>          keyIt = clusterMap.keySet().iterator();<a name="line.1071"></a>
-<span class="sourceLineNo">1072</span>        }<a name="line.1072"></a>
-<span class="sourceLineNo">1073</span>        ServerName dest = keyIt.next();<a name="line.1073"></a>
-<span class="sourceLineNo">1074</span>        if (masterServerName.equals(dest)) {<a name="line.1074"></a>
-<span class="sourceLineNo">1075</span>          if (!keyIt.hasNext()) {<a name="line.1075"></a>
-<span class="sourceLineNo">1076</span>            keyIt = clusterMap.keySet().iterator();<a name="line.1076"></a>
-<span class="sourceLineNo">1077</span>          }<a name="line.1077"></a>
-<span class="sourceLineNo">1078</span>          dest = keyIt.next();<a name="line.1078"></a>
-<span class="sourceLineNo">1079</span>        }<a name="line.1079"></a>
-<span class="sourceLineNo">1080</span><a name="line.1080"></a>
-<span class="sourceLineNo">1081</span>        // Move this region away from the master regionserver<a name="line.1081"></a>
-<span class="sourceLineNo">1082</span>        RegionPlan plan = new RegionPlan(region, masterServerName, dest);<a name="line.1082"></a>
-<span class="sourceLineNo">1083</span>        if (plans == null) {<a name="line.1083"></a>
-<span class="sourceLineNo">1084</span>          plans = new ArrayList&lt;&gt;();<a name="line.1084"></a>
-<span class="sourceLineNo">1085</span>        }<a name="line.1085"></a>
-<span class="sourceLineNo">1086</span>        plans.add(plan);<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>    for (Map.Entry&lt;ServerName, List&lt;RegionInfo&gt;&gt; server: clusterMap.entrySet()) {<a name="line.1089"></a>
-<span class="sourceLineNo">1090</span>      if (masterServerName.equals(server.getKey())) continue;<a name="line.1090"></a>
-<span class="sourceLineNo">1091</span>      for (RegionInfo region: server.getValue()) {<a name="line.1091"></a>
-<span class="sourceLineNo">1092</span>        if (!shouldBeOnMaster(region)) continue;<a name="line.1092"></a>
-<span class="sourceLineNo">1093</span><a name="line.1093"></a>
-<span class="sourceLineNo">1094</span>        // Move this region to the master regionserver<a name="line.1094"></a>
-<span class="sourceLineNo">1095</span>        RegionPlan plan = new RegionPlan(region, server.getKey(), masterServerName);<a name="line.1095"></a>
-<span class="sourceLineNo">1096</span>        if (plans == null) {<a name="line.1096"></a>
-<span class="sourceLineNo">1097</span>          plans = new ArrayList&lt;&gt;();<a name="line.1097"></a>
-<span class="sourceLineNo">1098</span>        }<a name="line.1098"></a>
-<span class="sourceLineNo">1099</span>        plans.add(plan);<a name="line.1099"></a>
-<span class="sourceLineNo">1100</span>      }<a name="line.1100"></a>
-<span class="sourceLineNo">1101</span>    }<a name="line.1101"></a>
-<span class="sourceLineNo">1102</span>    return plans;<a name="line.1102"></a>
-<span class="sourceLineNo">1103</span>  }<a name="line.1103"></a>
-<span class="sourceLineNo">1104</span><a name="line.1104"></a>
-<span class="sourceLineNo">1105</span>  /**<a name="line.1105"></a>
-<span class="sourceLineNo">1106</span>   * If master is configured to carry system tables only, in here is<a name="line.1106"></a>
-<span class="sourceLineNo">1107</span>   * where we figure what to assign it.<a name="line.1107"></a>
-<span class="sourceLineNo">1108</span>   */<a name="line.1108"></a>
-<span class="sourceLineNo">1109</span>  protected Map&lt;ServerName, List&lt;RegionInfo&gt;&gt; assignMasterSystemRegions(<a name="line.1109"></a>
-<span class="sourceLineNo">1110</span>      Collection&lt;RegionInfo&gt; regions, List&lt;ServerName&gt; servers) {<a name="line.1110"></a>
-<span class="sourceLineNo">1111</span>    if (servers == null || regions == null || regions.isEmpty()) {<a name="line.1111"></a>
-<span class="sourceLineNo">1112</span>      return null;<a name="line.1112"></a>
-<span class="sourceLineNo">1113</span>    }<a name="line.1113"></a>
-<span class="sourceLineNo">1114</span>    Map&lt;ServerName, List&lt;RegionInfo&gt;&gt; assignments = new TreeMap&lt;&gt;();<a name="line.1114"></a>
-<span class="sourceLineNo">1115</span>    if (this.onlySystemTablesOnMaster) {<a name="line.1115"></a>
-<span class="sourceLineNo">1116</span>      if (masterServerName != null &amp;&amp; servers.contains(masterServerName)) {<a name="line.1116"></a>
-<span class="sourceLineNo">1117</span>        assignments.put(masterServerName, new ArrayList&lt;&gt;());<a name="line.1117"></a>
-<span class="sourceLineNo">1118</span>        for (RegionInfo region : regions) {<a name="line.1118"></a>
-<span class="sourceLineNo">1119</span>          if (shouldBeOnMaster(region)) {<a name="line.1119"></a>
-<span class="sourceLineNo">1120</span>            assignments.get(masterServerName).add(region);<a name="line.1120"></a>
-<span class="sourceLineNo">1121</span>          }<a name="line.1121"></a>
-<span class="sourceLineNo">1122</span>        }<a name="line.1122"></a>
-<span class="sourceLineNo">1123</span>      }<a name="line.1123"></a>
-<span class="sourceLineNo">1124</span>    }<a name="line.1124"></a>
-<span class="sourceLineNo">1125</span>    return assignments;<a name="line.1125"></a>
-<span class="sourceLineNo">1126</span>  }<a name="line.1126"></a>
-<span class="sourceLineNo">1127</span><a name="line.1127"></a>
-<span class="sourceLineNo">1128</span>  @Override<a name="line.1128"></a>
-<span class="sourceLineNo">1129</span>  public Configuration getConf() {<a name="line.1129"></a>
-<span class="sourceLineNo">1130</span>    return this.config;<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 synchronized void setClusterMetrics(ClusterMetrics st) {<a name="line.1134"></a>
-<span class="sourceLineNo">1135</span>    this.clusterStatus = st;<a name="line.1135"></a>
-<span class="sourceLineNo">1136</span>    if (useRegionFinder) {<a name="line.1136"></a>
-<span class="sourceLineNo">1137</span>      regionFinder.setClusterMetrics(st);<a name="line.1137"></a>
-<span class="sourceLineNo">1138</span>    }<a name="line.1138"></a>
-<span class="sourceLineNo">1139</span>  }<a name="line.1139"></a>
-<span class="sourceLineNo">1140</span><a name="line.1140"></a>
-<span class="sourceLineNo">1141</span>  @Override<a name="line.1141"></a>
-<span class="sourceLineNo">1142</span>  public void setClusterLoad(Map&lt;TableName, Map&lt;ServerName, List&lt;RegionInfo&gt;&gt;&gt; clusterLoad){<a name="line.1142"></a>
-<span class="sourceLineNo">1143</span><a name="line.1143"></a>
-<span class="sourceLineNo">1144</span>  }<a name="line.1144"></a>
-<span class="sourceLineNo">1145</span><a name="line.1145"></a>
-<span class="sourceLineNo">1146</span>  @Override<a name="line.1146"></a>
-<span class="sourceLineNo">1147</span>  public void setMasterServices(MasterServices masterServices) {<a name="line.1147"></a>
-<span class="sourceLineNo">1148</span>    masterServerName = masterServices.getServerName();<a name="line.1148"></a>
-<span class="sourceLineNo">1149</span>    this.services = masterServices;<a name="line.1149"></a>
-<span class="sourceLineNo">1150</span>    if (useRegionFinder) {<a name="line.1150"></a>
-<span class="sourceLineNo">1151</span>      this.regionFinder.setServices(masterServices);<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><a name="line.1154"></a>
-<span class="sourceLineNo">1155</span>  @Override<a name="line.1155"></a>
-<span class="sourceLineNo">1156</span>  public void postMasterStartupInitialize() {<a name="line.1156"></a>
-<span class="sourceLineNo">1157</span>    if (services != null &amp;&amp; regionFinder != null) {<a name="line.1157"></a>
-<span class="sourceLineNo">1158</span>      try {<a name="line.1158"></a>
-<span class="sourceLineNo">1159</span>        Set&lt;RegionInfo&gt; regions =<a name="line.1159"></a>
-<span class="sourceLineNo">1160</span>            services.getAssignmentManager().getRegionStates().getRegionAssignments().keySet();<a name="line.1160"></a>
-<span class="sourceLineNo">1161</span>        regionFinder.refreshAndWait(regions);<a name="line.1161"></a>
-<span class="sourceLineNo">1162</span>      } catch (Exception e) {<a name="line.1162"></a>
-<span class="sourceLineNo">1163</span>        LOG.warn("Refreshing region HDFS Block dist failed with exception, ignoring", e);<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><a name="line.1167"></a>
-<span class="sourceLineNo">1168</span>  public void setRackManager(RackManager rackManager) {<a name="line.1168"></a>
-<span class="sourceLineNo">1169</span>    this.rackManager = rackManager;<a name="line.1169"></a>
-<span class="sourceLineNo">1170</span>  }<a name="line.1170"></a>
-<span class="sourceLineNo">1171</span><a name="line.1171"></a>
-<span class="sourceLineNo">1172</span>  protected boolean needsBalance(Cluster c) {<a name="line.1172"></a>
-<span class="sourceLineNo">1173</span>    ClusterLoadState cs = new ClusterLoadState(c.clusterState);<a name="line.1173"></a>
-<span class="sourceLineNo">1174</span>    if (cs.getNumServers() &lt; MIN_SERVER_BALANCE) {<a name="line.1174"></a>
-<span class="sourceLineNo">1175</span>      if (LOG.isDebugEnabled()) {<a name="line.1175"></a>
-<span class="sourceLineNo">1176</span>        LOG.debug("Not running balancer because only " + cs.getNumServers()<a name="line.1176"></a>
-<span class="sourceLineNo">1177</span>            + " active regionserver(s)");<a name="line.1177"></a>
-<span class="sourceLineNo">1178</span>      }<a name="line.1178"></a>
-<span class="sourceLineNo">1179</span>      return false;<a name="line.1179"></a>
-<span class="sourceLineNo">1180</span>    }<a name="line.1180"></a>
-<span class="sourceLineNo">1181</span>    if(areSomeRegionReplicasColocated(c)) return true;<a name="line.1181"></a>
-<span class="sourceLineNo">1182</span>    // Check if we even need to do any load balancing<a name="line.1182"></a>
-<span class="sourceLineNo">1183</span>    // HBASE-3681 check sloppiness first<a name="line.1183"></a>
-<span class="sourceLineNo">1184</span>    float average = cs.getLoadAverage(); // for logging<a name="line.1184"></a>
-<span class="sourceLineNo">1185</span>    int floor = (int) Math.floor(average * (1 - slop));<a name="line.1185"></a>
-<span class="sourceLineNo">1186</span>    int ceiling = (int) Math.ceil(average * (1 + slop));<a name="line.1186"></a>
-<span class="sourceLineNo">1187</span>    if (!(cs.getMaxLoad() &gt; ceiling || cs.getMinLoad() &lt; floor)) {<a name="line.1187"></a>
-<span class="sourceLineNo">1188</span>      NavigableMap&lt;ServerAndLoad, List&lt;RegionInfo&gt;&gt; serversByLoad = cs.getServersByLoad();<a name="line.1188"></a>
-<span class="sourceLineNo">1189</span>      if (LOG.isTraceEnabled()) {<a name="line.1189"></a>
-<span class="sourceLineNo">1190</span>        // If nothing to balance, then don't say anything unless trace-level logging.<a name="line.1190"></a>
-<span class="sourceLineNo">1191</span>        LOG.trace("Skipping load balancing because balanced cluster; " +<a name="line.1191"></a>
-<span class="sourceLineNo">1192</span>          "servers=" + cs.getNumServers() +<a name="line.1192"></a>
-<span class="sourceLineNo">1193</span>          " regions=" + cs.getNumRegions() + " average=" + average +<a name="line.1193"></a>
-<span class="sourceLineNo">1194</span>          " mostloaded=" + serversByLoad.lastKey().getLoad() +<a name="line.1194"></a>
-<span class="sourceLineNo">1195</span>          " leastloaded=" + serversByLoad.firstKey().getLoad());<a name="line.1195"></a>
-<span class="sourceLineNo">1196</span>      }<a name="line.1196"></a>
-<span class="sourceLineNo">1197</span>      return false;<a name="line.1197"></a>
-<span class="sourceLineNo">1198</span>    }<a name="line.1198"></a>
-<span class="sourceLineNo">1199</span>    return true;<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>   * Subclasses should implement this to return true if the cluster has nodes that hosts<a name="line.1203"></a>
-<span class="sourceLineNo">1204</span>   * multiple replicas for the same region, or, if there are multiple racks and the same<a name="line.1204"></a>
-<span class="sourceLineNo">1205</span>   * rack hosts replicas of the same region<a name="line.1205"></a>
-<span class="sourceLineNo">1206</span>   * @param c Cluster information<a name="line.1206"></a>
-<span class="sourceLineNo">1207</span>   * @return whether region replicas are currently co-located<a name="line.1207"></a>
-<span class="sourceLineNo">1208</span>   */<a name="line.1208"></a>
-<span class="sourceLineNo">1209</span>  protected boolean areSomeRegionReplicasColocated(Cluster c) {<a name="line.1209"></a>
-<span class="sourceLineNo">1210</span>    return false;<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>   * Generates a bulk assignment plan to be used on cluster startup using a<a name="line.1214"></a>
-<span class="sourceLineNo">1215</span>   * simple round-robin assignment.<a name="line.1215"></a>
-<span class="sourceLineNo">1216</span>   * &lt;p&gt;<a name="line.1216"></a>
-<span class="sourceLineNo">1217</span>   * Takes a list of all the regions and all the servers in the cluster and<a name="line.1217"></a>
-<span class="sourceLineNo">1218</span>   * returns a map of each server to the regions that it should be assigned.<a name="line.1218"></a>
-<span class="sourceLineNo">1219</span>   * &lt;p&gt;<a name="line.1219"></a>
-<span class="sourceLineNo">1220</span>   * Currently implemented as a round-robin assignment. Same invariant as load<a name="line.1220"></a>
-<span class="sourceLineNo">1221</span>   * balancing, all servers holding floor(avg) or ceiling(avg).<a name="line.1221"></a>
-<span class="sourceLineNo">1222</span>   *<a name="line.1222"></a>
-<span class="sourceLineNo">1223</span>   * TODO: Use block locations from HDFS to place regions with their blocks<a name="line.1223"></a>
-<span class="sourceLineNo">1224</span>   *<a name="line.1224"></a>
-<span class="sourceLineNo">1225</span>   * @param regions all regions<a name="line.1225"></a>
-<span class="sourceLineNo">1226</span>   * @param servers all servers<a name="line.1226"></a>
-<span class="sourceLineNo">1227</span>   * @return map of server to the regions it should take, or null if no<a name="line.1227"></a>
-<span class="sourceLineNo">1228</span>   *         assignment is possible (ie. no regions or no servers)<a name="line.1228"></a>
-<span class="sourceLineNo">1229</span>   */<a name="line.1229"></a>
-<span class="sourceLineNo">1230</span>  @Override<a name="line.1230"></a>
-<span class="sourceLineNo">1231</span>  public Map&lt;ServerName, List&lt;RegionInfo&gt;&gt; roundRobinAssignment(List&lt;RegionInfo&gt; regions,<a name="line.1231"></a>
-<span class="sourceLineNo">1232</span>      List&lt;ServerName&gt; servers) throws HBaseIOException {<a name="line.1232"></a>
-<span class="sourceLineNo">1233</span>    metricsBalancer.incrMiscInvocations();<a name="line.1233"></a>
-<span class="sourceLineNo">1234</span>    Map&lt;ServerName, List&lt;RegionInfo&gt;&gt; assignments = assignMasterSystemRegions(regions, servers);<a name="line.1234"></a>
-<span class="sourceLineNo">1235</span>    if (assignments != null &amp;&amp; !assignments.isEmpty()) {<a name="line.1235"></a>
-<span class="sourceLineNo">1236</span>      servers = new ArrayList&lt;&gt;(servers);<a name="line.1236"></a>
-<span class="sourceLineNo">1237</span>      // Guarantee not to put other regions on master<a name="line.1237"></a>
-<span class="sourceLineNo">1238</span>      servers.remove(masterServerName);<a name="line.1238"></a>
-<span class="sourceLineNo">1239</span>      List&lt;RegionInfo&gt; masterRegions = assignments.get(masterServerName);<a name="line.1239"></a>
-<span class="sourceLineNo">1240</span>      if (!masterRegions.isEmpty()) {<a name="line.1240"></a>
-<span class="sourceLineNo">1241</span>        regions = new ArrayList&lt;&gt;(regions);<a name="line.1241"></a>
-<span class="sourceLineNo">1242</span>        regions.removeAll(masterRegions);<a name="line.1242"></a>
-<span class="sourceLineNo">1243</span>      }<a name="line.1243"></a>
-<span class="sourceLineNo">1244</span>    }<a name="line.1244"></a>
-<span class="sourceLineNo">1245</span>    if (regions == null || regions.isEmpty()) {<a name="line.1245"></a>
-<span class="sourceLineNo">1246</span>      return assignments;<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>    int numServers = servers == null ? 0 : servers.size();<a name="line.1249"></a>
-<span class="sourceLineNo">1250</span>    if (numServers == 0) {<a name="line.1250"></a>
-<span class="sourceLineNo">1251</span>      LOG.warn("Wanted to do round robin assignment but no servers to assign to");<a name="line.1251"></a>
-<span class="sourceLineNo">1252</span>      return null;<a name="line.1252"></a>
-<span class="sourceLineNo">1253</span>    }<a name="line.1253"></a>
-<span class="sourceLineNo">1254</span><a name="line.1254"></a>
-<span class="sourceLineNo">1255</span>    // TODO: instead of retainAssignment() and roundRobinAssignment(), we should just run the<a name="line.1255"></a>
-<span class="sourceLineNo">1256</span>    // normal LB.balancerCluster() with unassignedRegions. We only need to have a candidate<a name="line.1256"></a>
-<span class="sourceLineNo">1257</span>    // generator for AssignRegionAction. The LB will ensure the regions are mostly local<a name="line.1257"></a>
-<span class="sourceLineNo">1258</span>    // and balanced. This should also run fast with fewer number of iterations.<a name="line.1258"></a>
-<span class="sourceLineNo">1259</span><a name="line.1259"></a>
-<span class="sourceLineNo">1260</span>    if (numServers == 1) { // Only one server, nothing fancy we can do here<a name="line.1260"></a>
-<span class="sourceLineNo">1261</span>      ServerName server = servers.get(0);<a name="line.1261"></a>
-<span class="sourceLineNo">1262</span>      assignments.put(server, new ArrayList&lt;&gt;(regions));<a name="line.1262"></a>
-<span class="sourceLineNo">1263</span>      return assignments;<a name="line.1263"></a>
-<span class="sourceLineNo">1264</span>    }<a name="line.1264"></a>
-<span class="sourceLineNo">1265</span><a name="line.1265"></a>
-<span class="sourceLineNo">1266</span>    Cluster cluster = createCluster(servers, regions, false);<a name="line.1266"></a>
-<span class="sourceLineNo">1267</span>    List&lt;RegionInfo&gt; unassignedRegions = new ArrayList&lt;&gt;();<a name="line.1267"></a>
-<span class="sourceLineNo">1268</span><a name="line.1268"></a>
-<span class="sourceLineNo">1269</span>    roundRobinAssignment(cluster, regions, unassignedRegions,<a name="line.1269"></a>
-<span class="sourceLineNo">1270</span>      servers, assignments);<a name="line.1270"></a>
-<span class="sourceLineNo">1271</span><a name="line.1271"></a>
-<span class="sourceLineNo">1272</span>    List&lt;RegionInfo&gt; lastFewRegions = new ArrayList&lt;&gt;();<a name="line.1272"></a>
-<span class="sourceLineNo">1273</span>    // assign the remaining by going through the list and try to assign to servers one-by-one<a name="line.1273"></a>
-<span class="sourceLineNo">1274</span>    int serverIdx = RANDOM.nextInt(numServers);<a name="line.1274"></a>
-<span class="sourceLineNo">1275</span>    OUTER : for (RegionInfo region : unassignedRegions) {<a name="line.1275"></a>
-<span class="sourceLineNo">1276</span>      boolean assigned = false;<a name="line.1276"></a>
-<span class="sourceLineNo">1277</span>      INNER : for (int j = 0; j &lt; numServers; j++) { // try all servers one by one<a name="line.1277"></a>
-<span class="sourceLineNo">1278</span>        ServerName serverName = servers.get((j + serverIdx) % numServers);<a name="line.1278"></a>
-<span class="sourceLineNo">1279</span>        if (!cluster.wouldLowerAvailability(region, serverName)) {<a name="line.1279"></a>
-<span class="sourceLineNo">1280</span>          List&lt;RegionInfo&gt; serverRegions =<a name="line.1280"></a>
-<span class="sourceLineNo">1281</span>              assignments.computeIfAbsent(serverName, k -&gt; new ArrayList&lt;&gt;());<a name="line.1281"></a>
-<span class="sourceLineNo">1282</span>          if (!RegionReplicaUtil.isDefaultReplica(region.getReplicaId())) {<a name="line.1282"></a>
-<span class="sourceLineNo">1283</span>            // if the region is not a default replica<a name="line.1283"></a>
-<span class="sourceLineNo">1284</span>            // check if the assignments map has the other replica region on this server<a name="line.1284"></a>
-<span class="sourceLineNo">1285</span>            for (RegionInfo hri : serverRegions) {<a name="line.1285"></a>
-<span class="sourceLineNo">1286</span>              if (RegionReplicaUtil.isReplicasForSameRegion(region, hri)) {<a name="line.1286"></a>
-<span class="sourceLineNo">1287</span>                if (LOG.isTraceEnabled()) {<a name="line.1287"></a>
-<span class="sourceLineNo">1288</span>                  LOG.trace("Skipping the server, " + serverName<a name="line.1288"></a>
-<span class="sourceLineNo">1289</span>                      + " , got the same server for the region " + region);<a name="line.1289"></a>
-<span class="sourceLineNo">1290</span>                }<a name="line.1290"></a>
-<span class="sourceLineNo">1291</span>                // do not allow this case. The unassignedRegions we got because the<a name="line.1291"></a>
-<span class="sourceLineNo">1292</span>                // replica region in this list was not assigned because of lower availablity issue.<a name="line.1292"></a>
-<span class="sourceLineNo">1293</span>                // So when we assign here we should ensure that as far as possible the server being<a name="line.1293"></a>
-<span class="sourceLineNo">1294</span>                // selected does not have the server where the replica region was not assigned.<a name="line.1294"></a>
-<span class="sourceLineNo">1295</span>                continue INNER; // continue the inner loop, ie go to the next server<a name="line.1295"></a>
-<span class="sourceLineNo">1296</span>              }<a name="line.1296"></a>
-<span class="sourceLineNo">1297</span>            }<a name="line.1297"></a>
-<span class="sourceLineNo">1298</span>          }<a name="line.1298"></a>
-<span class="sourceLineNo">1299</span>          serverRegions.add(region);<a name="line.1299"></a>
-<span class="sourceLineNo">1300</span>          cluster.doAssignRegion(region, serverName);<a name="line.1300"></a>
-<span class="sourceLineNo">1301</span>          serverIdx = (j + serverIdx + 1) % numServers; //remain from next server<a name="line.1301"></a>
-<span class="sourceLineNo">1302</span>          assigned = true;<a name="line.1302"></a>
-<span class="sourceLineNo">1303</span>          break;<a name="line.1303"></a>
-<span class="sourceLineNo">1304</span>        }<a name="line.1304"></a>
-<span class="sourceLineNo">1305</span>      }<a name="line.1305"></a>
-<span class="sourceLineNo">1306</span>      if (!assigned) {<a name="line.1306"></a>
-<span class="sourceLineNo">1307</span>        lastFewRegions.add(region);<a name="line.1307"></a>
-<span class="sourceLineNo">1308</span>      }<a name="line.1308"></a>
-<span class="sourceLineNo">1309</span>    }<a name="line.1309"></a>
-<span class="sourceLineNo">1310</span>    // just sprinkle the rest of the regions on random regionservers. The balanceCluster will<a name="line.1310"></a>
-<span class="sourceLineNo">1311</span>    // make it optimal later. we can end up with this if numReplicas &gt; numServers.<a name="line.1311"></a>
-<span class="sourceLineNo">1312</span>    for (RegionInfo region : lastFewRegions) {<a name="line.1312"></a>
-<span class="sourceLineNo">1313</span>      int i = RANDOM.nextInt(numServers);<a name="line.1313"></a>
-<span class="sourceLineNo">1314</span>      ServerName server = servers.get(i);<a name="line.1314"></a>
-<span class="sourceLineNo">1315</span>      List&lt;RegionInfo&gt; serverRegions = assignments.computeIfAbsent(server, k -&gt; new ArrayList&lt;&gt;());<a name="line.1315"></a>
-<span class="sourceLineNo">1316</span>      serverRegions.add(region);<a name="line.1316"></a>
-<span class="sourceLineNo">1317</span>      cluster.doAssignRegion(region, server);<a name="line.1317"></a>
-<span class="sourceLineNo">1318</span>    }<a name="line.1318"></a>
-<span class="sourceLineNo">1319</span>    return assignments;<a name="line.1319"></a>
-<span class="sourceLineNo">1320</span>  }<a name="line.1320"></a>
-<span class="sourceLineNo">1321</span><a name="line.1321"></a>
-<span class="sourceLineNo">1322</span>  protected Cluster createCluster(List&lt;ServerName&gt; servers, Collection&lt;RegionInfo&gt; regions,<a name="line.1322"></a>
-<span class="sourceLineNo">1323</span>      boolean hasRegionReplica) {<a name="line.1323"></a>
-<span class="sourceLineNo">1324</span>    // Get the snapshot of the current assignments for the regions in question, and then create<a name="line.1324"></a>
-<span class="sourceLineNo">1325</span>    // a cluster out of it. Note that we might have replicas already assigned to some servers<a name="line.1325"></a>
-<span class="sourceLineNo">1326</span>    // earlier. So we want to get the snapshot to see those assignments, but this will only contain<a name="line.1326"></a>
-<span class="sourceLineNo">1327</span>    // replicas of the regions that are passed (for performance).<a name="line.1327"></a>
-<span class="sourceLineNo">1328</span>    Map&lt;ServerName, List&lt;RegionInfo&gt;&gt; clusterState = null;<a name="line.1328"></a>
-<span class="sourceLineNo">1329</span>    if (!hasRegionReplica) {<a name="line.1329"></a>
-<span class="sourceLineNo">1330</span>      clusterState = getRegionAssignmentsByServer(regions);<a name="line.1330"></a>
-<span class="sourceLineNo">1331</span>    } else {<a name="line.1331"></a>
-<span class="sourceLineNo">1332</span>      // for the case where we have region replica it is better we get the entire cluster's snapshot<a name="line.1332"></a>
-<span class="sourceLineNo">1333</span>      clusterState = getRegionAssignmentsByServer(null);<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>    for (ServerName server : servers) {<a name="line.1336"></a>
-<span class="sourceLineNo">1337</span>      if (!clusterState.containsKey(server)) {<a name="line.1337"></a>
-<span class="sourceLineNo">1338</span>        clusterState.put(server, EMPTY_REGION_LIST);<a name="line.1338"></a>
-<span class="sourceLineNo">1339</span>      }<a name="line.1339"></a>
-<span class="sourceLineNo">1340</span>    }<a name="line.1340"></a>
-<span class="sourceLineNo">1341</span>    return new Cluster(regions, clusterState, null, this.regionFinder,<a name="line.1341"></a>
-<span class="sourceLineNo">1342</span>        rackManager);<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>  private List&lt;ServerName&gt; findIdleServers(List&lt;ServerName&gt; servers) {<a name="line.1345"></a>
-<span class="sourceLineNo">1346</span>    return this.services.getServerManager()<a name="line.1346"></a>
-<span class="sourceLineNo">1347</span>            .getOnlineServersListWithPredicator(servers, IDLE_SERVER_PREDICATOR);<a name="line.1347"></a>
-<span class="sourceLineNo">1348</span>  }<a name="line.1348"></a>
-<span class="sourceLineNo">1349</span><a name="line.1349"></a>
-<span class="sourceLineNo">1350</span>  /**<a name="line.1350"></a>
-<span class="sourceLineNo">1351</span>   * Used to assign a single region to a random server.<a name="line.1351"></a>
-<span class="sourceLineNo">1352</span>   */<a name="line.1352"></a>
-<span class="sourceLineNo">1353</span>  @Override<a name="line.1353"></a>
-<span class="sourceLineNo">1354</span>  public ServerName randomAssignment(RegionInfo regionInfo, List&lt;ServerName&gt; servers)<a name="line.1354"></a>
-<span class="sourceLineNo">1355</span>      throws HBaseIOException {<a name="line.1355"></a>
-<span class="sourceLineNo">1356</span>    metricsBalancer.incrMiscInvocations();<a name="line.1356"></a>
-<span class="sourceLineNo">1357</span>    if (servers != null &amp;&amp; servers.contains(masterServerName)) {<a name="line.1357"></a>
-<span class="sourceLineNo">1358</span>      if (shouldBeOnMaster(regionInfo)) {<a name="line.1358"></a>
-<span class="sourceLineNo">1359</span>        return masterServerName;<a name="line.1359"></a>
-<span class="sourceLineNo">1360</span>      }<a name="line.1360"></a>
-<span class="sourceLineNo">1361</span>      if (!LoadBalancer.isTablesOnMaster(getConf())) {<a name="line.1361"></a>
-<span class="sourceLineNo">1362</span>        // Guarantee we do not put any regions on master<a name="line.1362"></a>
-<span class="sourceLineNo">1363</span>        servers = new ArrayList&lt;&gt;(servers);<a name="line.1363"></a>
-<span class="sourceLineNo">1364</span>        servers.remove(masterServerName);<a name="line.1364"></a>
-<span class="sourceLineNo">1365</span>      }<a name="line.1365"></a>
-<span class="sourceLineNo">1366</span>    }<a name="line.1366"></a>
-<span class="sourceLineNo">1367</span><a name="line.1367"></a>
-<span class="sourceLineNo">1368</span>    int numServers = servers == null ? 0 : servers.size();<a name="line.1368"></a>
-<span class="sourceLineNo">1369</span>    if (numServers == 0) {<a name="line.1369"></a>
-<span class="sourceLineNo">1370</span>      LOG.warn("Wanted to retain assignment but no servers to assign to");<a name="line.1370"></a>
-<span class="sourceLineNo">1371</span>      return null;<a name="line.1371"></a>
-<span class="sourceLineNo">1372</span>    }<a name="line.1372"></a>
-<span class="sourceLineNo">1373</span>    if (numServers == 1) { // Only one server, nothing fancy we can do here<a name="line.1373"></a>
-<span class="sourceLineNo">1374</span>      return servers.get(0);<a name="line.1374"></a>
-<span class="sourceLineNo">1375</span>    }<a name="line.1375"></a>
-<span class="sourceLineNo">1376</span>    List&lt;ServerName&gt; idleServers = findIdleServers(servers);<a name="line.1376"></a>
-<span class="sourceLineNo">1377</span>    if (idleServers.size() == 1) {<a name="line.1377"></a>
-<span class="sourceLineNo">1378</span>      return idleServers.get(0);<a name="line.1378"></a>
-<span class="sourceLineNo">1379</span>    }<a name="line.1379"></a>
-<span class="sourceLineNo">1380</span>    final List&lt;ServerName&gt; finalServers = idleServers.isEmpty() ?<a name="line.1380"></a>
-<span class="sourceLineNo">1381</span>            servers : idleServers;<a name="line.1381"></a>
-<span class="sourceLineNo">1382</span>    List&lt;RegionInfo&gt; regions = Lists.newArrayList(regionInfo);<a name="line.1382"></a>
-<span class="sourceLineNo">1383</span>    Cluster cluster = createCluster(finalServers, regions, false);<a name="line.1383"></a>
-<span class="sourceLineNo">1384</span>    return randomAssignment(cluster, regionInfo, finalServers);<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>  /**<a name="line.1387"></a>
-<span class="sourceLineNo">1388</span>   * Generates a bulk assignment startup plan, attempting to reuse the existing<a name="line.1388"></a>
-<span class="sourceLineNo">1389</span>   * assignment information from META, but adjusting for the specified list of<a name="line.1389"></a>
-<span class="sourceLineNo">1390</span>   * available/online servers available for assignment.<a name="line.1390"></a>
-<span class="sourceLineNo">1391</span>   * &lt;p&gt;<a name="line.1391"></a>
-<span class="sourceLineNo">1392</span>   * Takes a map of all regions to their existing assignment from META. Also<a name="line.1392"></a>
-<span class="sourceLineNo">1393</span>   * takes a list of online servers for regions to be assigned to. Attempts to<a name="line.1393"></a>
-<span class="sourceLineNo">1394</span>   * retain all assignment, so in some instances initial assignment will not be<a name="line.1394"></a>
-<span class="sourceLineNo">1395</span>   * completely balanced.<a name="line.1395"></a>
-<span class="sourceLineNo">1396</span>   * &lt;p&gt;<a name="line.1396"></a>
-<span class="sourceLineNo">1397</span>   * Any leftover regions without an existing server to be assigned to will be<a name="line.1397"></a>
-<span class="sourceLineNo">1398</span>   * assigned randomly to available servers.<a name="line.1398"></a>
-<span class="sourceLineNo">1399</span>   *<a name="line.1399"></a>
-<span class="sourceLineNo">1400</span>   * @param regions regions and existing assignment from meta<a name="line.1400"></a>
-<span class="sourceLineNo">1401</span>   * @param servers available servers<a name="line.1401"></a>
-<span class="sourceLineNo">1402</span>   * @return map of servers and regions to be assigned to them<a name="line.1402"></a>
-<span class="sourceLineNo">1403</span>   */<a name="line.1403"></a>
-<span class="sourceLineNo">1404</span>  @Override<a name="line.1404"></a>
-<span class="sourceLineNo">1405</span>  public Map&lt;ServerName, List&lt;RegionInfo&gt;&gt; retainAssignment(Map&lt;RegionInfo, ServerName&gt; regions,<a name="line.1405"></a>
-<span class="sourceLineNo">1406</span>      List&lt;ServerName&gt; servers) throws HBaseIOException {<a name="line.1406"></a>
-<span class="sourceLineNo">1407</span>    // Update metrics<a name="line.1407"></a>
-<span class="sourceLineNo">1408</span>    metricsBalancer.incrMiscInvocations();<a name="line.1408"></a>
-<span class="sourceLineNo">1409</span>    Map&lt;ServerName, List&lt;RegionInfo&gt;&gt; assignments = assignMasterSystemRegions(regions.keySet(), servers);<a name="line.1409"></a>
-<span class="sourceLineNo">1410</span>    if (assignments != null &amp;&amp; !assignments.isEmpty()) {<a name="line.1410"></a>
-<span class="sourceLineNo">1411</span>      servers = new ArrayList&lt;&gt;(servers);<a name="line.1411"></a>
-<span class="sourceLineNo">1412</span>      // Guarantee not to put other regions on master<a name="line.1412"></a>
-<span class="sourceLineNo">1413</span>      servers.remove(masterServerName);<a name="line.1413"></a>
-<span class="sourceLineNo">1414</span>      List&lt;RegionInfo&gt; masterRegions = assignments.get(masterServerName);<a name="line.1414"></a>
-<span class="sourceLineNo">1415</span>      regions = regions.entrySet().stream().filter(e -&gt; !masterRegions.contains(e.getKey()))<a name="line.1415"></a>
-<span class="sourceLineNo">1416</span>          .collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue));<a name="line.1416"></a>
-<span class="sourceLineNo">1417</span>    }<a name="line.1417"></a>
-<span class="sourceLineNo">1418</span>    if (regions.isEmpty()) {<a name="line.1418"></a>
-<span class="sourceLineNo">1419</span>      return assignments;<a name="line.1419"></a>
-<span class="sourceLineNo">1420</span>    }<a name="line.1420"></a>
-<span class="sourceLineNo">1421</span><a name="line.1421"></a>
-<span class="sourceLineNo">1422</span>    int numServers = servers == null ? 0 : servers.size();<a name="line.1422"></a>
-<span class="sourceLineNo">1423</span>    if (numServers == 0) {<a name="line.1423"></a>
-<span class="sourceLineNo">1424</span>      LOG.warn("Wanted to do retain assignment but no servers to assign to");<a name="line.1424"></a>
-<span class="sourceLineNo">1425</span>      return null;<a name="line.1425"></a>
-<span class="sourceLineNo">1426</span>    }<a name="line.1426"></a>
-<span class="sourceLineNo">1427</span>    if (numServers == 1) { // Only one server, nothing fancy we can do here<a name="line.1427"></a>
-<span class="sourceLineNo">1428</span>      ServerName server = servers.get(0);<a name="line.1428"></a>
-<span class="sourceLineNo">1429</span>      assignments.put(server, new ArrayList&lt;&gt;(regions.keySet()));<a name="line.1429"></a>
-<span class="sourceLineNo">1430</span>      return assignments;<a name="line.1430"></a>
-<span class="sourceLineNo">1431</span>    }<a name="line.1431"></a>
-<span class="sourceLineNo">1432</span><a name="line.1432"></a>
-<span class="sourceLineNo">1433</span>    // Group all of the old assignments by their hostname.<a name="line.1433"></a>
-<span class="sourceLineNo">1434</span>    // We can't group directly by ServerName since the servers all have<a name="line.1434"></a>
-<span class="sourceLineNo">1435</span>    // new start-codes.<a name="line.1435"></a>
-<span class="sourceLineNo">1436</span><a name="line.1436"></a>
-<span class="sourceLineNo">1437</span>    // Group the servers by their hostname. It's possible we have multiple<a name="line.1437"></a>
-<span class="sourceLineNo">1438</span>    // servers on the same host on different ports.<a name="line.1438"></a>
-<span class="sourceLineNo">1439</span>    ArrayListMultimap&lt;String, ServerName&gt; serversByHostname = ArrayListMultimap.create();<a name="line.1439"></a>
-<span class="sourceLineNo">1440</span>    for (ServerName server : servers) {<a name="line.1440"></a>
-<span class="sourceLineNo">1441</span>      assignments.put(server, new ArrayList&lt;&gt;());<a name="line.1441"></a>
-<span class="sourceLineNo">1442</span>      serversByHostname.put(server.getHostnameLowerCase(), server);<a name="line.1442"></a>
-<span class="sourceLineNo">1443</span>    }<a name="line.1443"></a>
-<span class="sourceLineNo">1444</span><a name="line.1444"></a>
-<span class="sourceLineNo">1445</span>    // Collection of the hostnames that used to have regions<a name="line.1445"></a>
-<span class="sourceLineNo">1446</span>    // assigned, but for which we no longer have any RS running<a name="line.1446"></a>
-<span class="sourceLineNo">1447</span>    // after the cluster restart.<a name="line.1447"></a>
-<span class="sourceLineNo">1448</span>    Set&lt;String&gt; oldHostsNoLongerPresent = Sets.newTreeSet();<a name="line.1448"></a>
-<span class="sourceLineNo">1449</span><a name="line.1449"></a>
-<span class="sourceLineNo">1450</span>    // If the old servers aren't present, lets assign those regions later.<a name="line.1450"></a>
-<span class="sourceLineNo">1451</span>    List&lt;RegionInfo&gt; randomAssignRegions = Lists.newArrayList();<a name="line.1451"></a>
-<span class="sourceLineNo">1452</span><a name="line.1452"></a>
-<span class="sourceLineNo">1453</span>    int numRandomAssignments = 0;<a name="line.1453"></a>
-<span class="sourceLineNo">1454</span>    int numRetainedAssigments = 0;<a name="line.1454"></a>
-<span class="sourceLineNo">1455</span>    boolean hasRegionReplica = false;<a name="line.1455"></a>
-<span class="sourceLineNo">1456</span>    for (Map.Entry&lt;RegionInfo, ServerName&gt; entry : regions.entrySet()) {<a name="line.1456"></a>
-<span class="sourceLineNo">1457</span>      RegionInfo region = entry.getKey();<a name="line.1457"></a>
-<span class="sourceLineNo">1458</span>      ServerName oldServerName = entry.getValue();<a name="line.1458"></a>
-<span class="sourceLineNo">1459</span>      // In the current set of regions even if one has region replica let us go with<a name="line.1459"></a>
-<span class="sourceLineNo">1460</span>      // getting the entire snapshot<a name="line.1460"></a>
-<span class="sourceLineNo">1461</span>      if (this.services != null) { // for tests<a name="line.1461"></a>
-<span class="sourceLineNo">1462</span>        AssignmentManager am = this.services.getAssignmentManager();<a name="line.1462"></a>
-<span class="sourceLineNo">1463</span>        if (am != null) {<a name="line.1463"></a>
-<span class="sourceLineNo">1464</span>          RegionStates states = am.getRegionStates();<a name="line.1464"></a>
-<span class="sourceLineNo">1465</span>          if (!hasRegionReplica &amp;&amp; states != null &amp;&amp; states.isReplicaAvailableForRegion(region)) {<a name="line.1465"></a>
-<span class="sourceLineNo">1466</span>            hasRegionReplica = true;<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>      List&lt;ServerName&gt; localServers = new ArrayList&lt;&gt;();<a name="line.1470"></a>
-<span class="sourceLineNo">1471</span>      if (oldServerName != null) {<a name="line.1471"></a>
-<span class="sourceLineNo">1472</span>        localServers = serversByHostname.get(oldServerName.getHostnameLowerCase());<a name="line.1472"></a>
-<span class="sourceLineNo">1473</span>      }<a name="line.1473"></a>
-<span class="sourceLineNo">1474</span>      if (localServers.isEmpty()) {<a name="line.1474"></a>
-<span class="sourceLineNo">1475</span>        // No servers on the new cluster match up with this hostname, assign randomly, later.<a name="line.1475"></a>
-<span class="sourceLineNo">1476</span>        randomAssignRegions.add(region);<a name="line.1476"></a>
-<span class="sourceLineNo">1477</span>        if (oldServerName != null) {<a name="line.1477"></a>
-<span class="sourceLineNo">1478</span>          oldHostsNoLongerPresent.add(oldServerName.getHostnameLowerCase());<a name="line.1478"></a>
-<span class="sourceLineNo">1479</span>        }<a name="line.1479"></a>
-<span class="sourceLineNo">1480</span>      } else if (localServers.size() == 1) {<a name="line.1480"></a>
-<span class="sourceLineNo">1481</span>        // the usual case - one new server on same host<a name="line.1481"></a>
-<span class="sourceLineNo">1482</span>        ServerName target = localServers.get(0);<a name="line.1482"></a>
-<span class="sourceLineNo">1483</span>        assignments.get(target).add(region);<a name="line.1483"></a>
-<span class="sourceLineNo">1484</span>        numRetainedAssigments++;<a name="line.1484"></a>
-<span class="sourceLineNo">1485</span>      } else {<a name="line.1485"></a>
-<span class="sourceLineNo">1486</span>        // multiple new servers in the cluster on this same host<a name="line.1486"></a>
-<span class="sourceLineNo">1487</span>        if (localServers.contains(oldServerName)) {<a name="line.1487"></a>
-<span class="sourceLineNo">1488</span>          assignments.get(oldServerName).add(region);<a name="line.1488"></a>
-<span class="sourceLineNo">1489</span>          numRetainedAssigments++;<a name="line.1489"></a>
-<span class="sourceLineNo">1490</span>        } else {<a name="line.1490"></a>
-<span class="sourceLineNo">1491</span>          ServerName target = null;<a name="line.1491"></a>
-<span class="sourceLineNo">1492</span>          for (ServerName tmp : localServers) {<a name="line.1492"></a>
-<span class="sourceLineNo">1493</span>            if (tmp.getPort() == oldServerName.getPort()) {<a name="line.1493"></a>
-<span class="sourceLineNo">1494</span>              target = tmp;<a name="line.1494"></a>
-<span class="sourceLineNo">1495</span>              assignments.get(tmp).add(region);<a name="line.1495"></a>
-<span class="sourceLineNo">1496</span>              numRetainedAssigments++;<a name="line.1496"></a>
-<span class="sourceLineNo">1497</span>              break;<a name="line.1497"></a>
-<span class="sourceLineNo">1498</span>            }<a name="line.1498"></a>
-<span class="sourceLineNo">1499</span>          }<a name="line.1499"></a>
-<span class="sourceLineNo">1500</span>          if (target == null) {<a name="line.1500"></a>
-<span class="sourceLineNo">1501</span>            randomAssignRegions.add(region);<a name="line.1501"></a>
-<span class="sourceLineNo">1502</span>          }<a name="line.1502"></a>
-<span class="sourceLineNo">1503</span>        }<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><a name="line.1506"></a>
-<span class="sourceLineNo">1507</span>    // If servers from prior assignment aren't present, then lets do randomAssignment on regions.<a name="line.1507"></a>
-<span class="sourceLineNo">1508</span>    if (randomAssignRegions.size() &gt; 0) {<a name="line.1508"></a>
-<span class="sourceLineNo">1509</span>      Cluster cluster = createCluster(servers, regions.keySet(), hasRegionReplica);<a name="line.1509"></a>
-<span class="sourceLineNo">1510</span>      for (Map.Entry&lt;ServerName, List&lt;RegionInfo&gt;&gt; entry : assignments.entrySet()) {<a name="line.1510"></a>
-<span class="sourceLineNo">1511</span>        ServerName sn = entry.getKey();<a name="line.1511"></a>
-<span class="sourceLineNo">1512</span>        for (RegionInfo region : entry.getValue()) {<a name="line.1512"></a>
-<span class="sourceLineNo">1513</span>          cluster.doAssignRegion(region, sn);<a name="line.1513"></a>
-<span class="sourceLineNo">1514</span>        }<a name="line.1514"></a>
-<span class="sourceLineNo">1515</span>      }<a name="line.1515"></a>
-<span class="sourceLineNo">1516</span>      for (RegionInfo region : randomAssignRegions) {<a name="line.1516"></a>
-<span class="sourceLineNo">1517</span>        ServerName target = randomAssignment(cluster, region, servers);<a name="line.1517"></a>
-<span class="sourceLineNo">1518</span>        assignments.get(target).add(region);<a name="line.1518"></a>
-<span class="sourceLineNo">1519</span>        numRandomAssignments++;<a name="line.1519"></a>
-<span class="sourceLineNo">1520</span>      }<a name="line.1520"></a>
-<span class="sourceLineNo">1521</span>    }<a name="line.1521"></a>
-<span class="sourceLineNo">1522</span><a name="line.1522"></a>
-<span class="sourceLineNo">1523</span>    String randomAssignMsg = "";<a name="line.1523"></a>
-<span class="sourceLineNo">1524</span>    if (numRandomAssignments &gt; 0) {<a name="line.1524"></a>
-<span class="sourceLineNo">1525</span>      randomAssignMsg =<a name="line.1525"></a>
-<span class="sourceLineNo">1526</span>          numRandomAssignments + " regions were assigned "<a name="line.1526"></a>
-<span class="sourceLineNo">1527</span>              + "to random hosts, since the old hosts for these regions are no "<a name="line.1527"></a>
-<span class="sourceLineNo">1528</span>              + "longer present in the cluster. These hosts were:\n  "<a name="line.1528"></a>
-<span class="sourceLineNo">1529</span>              + Joiner.on("\n  ").join(oldHostsNoLongerPresent);<a name="line.1529"></a>
-<span class="sourceLineNo">1530</span>    }<a name="line.1530"></a>
-<span class="sourceLineNo">1531</span><a name="line.1531"></a>
-<span class="sourceLineNo">1532</span>    LOG.info("Reassigned " + regions.size() + " regions. " + numRetainedAssigments<a name="line.1532"></a>
-<span class="sourceLineNo">1533</span>        + " retained the pre-restart assignment. " + randomAssignMsg);<a name="line.1533"></a>
-<span class="sourceLineNo">1534</span>    return assignments;<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>  @Override<a name="line.1537"></a>
-<span class="sourceLineNo">1538</span>  public void initialize() throws HBaseIOException{<a name="line.1538"></a>
-<span class="sourceLineNo">1539</span>  }<a name="line.1539"></a>
-<span class="sourceLineNo">1540</span><a name="line.1540"></a>
-<span class="sourceLineNo">1541</span>  @Override<a name="line.1541"></a>
-<span class="sourceLineNo">1542</span>  public void regionOnline(RegionInfo regionInfo, ServerName sn) {<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>  @Override<a name="line.1545"></a>
-<span class="sourceLineNo">1546</span>  public void regionOffline(RegionInfo regionInfo) {<a name="line.1546"></a>
-<span class="sourceLineNo">1547</span>  }<a name="line.1547"></a>
-<span class="sourceLineNo">1548</span><a name="line.1548"></a>
-<span class="sourceLineNo">1549</span>  @Override<a name="line.1549"></a>
-<span class="sourceLineNo">1550</span>  public boolean isStopped() {<a name="line.1550"></a>
-<span class="sourceLineNo">1551</span>    return stopped;<a name="line.1551"></a>
-<span class="sourceLineNo">1552</span>  }<a name="line.1552"></a>
-<span class="sourceLineNo">1553</span><a name="line.1553"></a>
-<span class="sourceLineNo">1554</span>  @Override<a name="line.1554"></a>
-<span class="sourceLineNo">1555</span>  public void stop(String why) {<a name="line.1555"></a>
-<span class="sourceLineNo">1556</span>    LOG.info("Load Balancer stop requested: "+why);<a name="line.1556"></a>
-<span class="sourceLineNo">1557</span>    stopped = true;<a name="line.1557"></a>
-<span class="sourceLineNo">1558</span>  }<a name="line.1558"></a>
-<span class="sourceLineNo">1559</span><a name="line.1559"></a>
-<span class="sourceLineNo">1560</span>  /**<a name="line.1560"></a>
-<span class="sourceLineNo">1561</span>  * Updates the balancer status tag reported to JMX<a name="line.1561"></a>
-<span class="sourceLineNo">1562</span>  */<a name="line.1562"></a>
-<span class="sourceLineNo">1563</span>  public void updateBalancerStatus(boolean status) {<a name="line.1563"></a>
-<span class="sourceLineNo">1564</span>    metricsBalancer.balancerStatus(status);<a name="line.1564"></a>
-<span class="sourceLineNo">1565</span>  }<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>   * Used to assign a single region to a random server.<a name="line.1568"></a>
-<span class="sourceLineNo">1569</span>   */<a name="line.1569"></a>
-<span class="sourceLineNo">1570</span>  private ServerName randomAssignment(Cluster cluster, RegionInfo regionInfo,<a name="line.1570"></a>
-<span class="sourceLineNo">1571</span>      List&lt;ServerName&gt; servers) {<a name="line.1571"></a>
-<span class="sourceLineNo">1572</span>    int numServers = servers.size(); // servers is not null, numServers &gt; 1<a name="line.1572"></a>
-<span class="sourceLineNo">1573</span>    ServerName sn = null;<a name="line.1573"></a>
-<span class="sourceLineNo">1574</span>    final int maxIterations = numServers * 4;<a name="line.1574"></a>
-<span class="sourceLineNo">1575</span>    int iterations = 0;<a name="line.1575"></a>
-<span class="sourceLineNo">1576</span>    List&lt;ServerName&gt; usedSNs = new ArrayList&lt;&gt;(servers.size());<a name="line.1576"></a>
-<span class="sourceLineNo">1577</span>    do {<a name="line.1577"></a>
-<span class="sourceLineNo">1578</span>      int i = RANDOM.nextInt(numServers);<a name="line.1578"></a>
-<span class="sourceLineNo">1579</span>      sn = servers.get(i);<a name="line.1579"></a>
-<span class="sourceLineNo">1580</span>      if (!usedSNs.contains(sn)) {<a name="line.1580"></a>
-<span class="sourceLineNo">1581</span>        usedSNs.add(sn);<a name="line.1581"></a>
-<span class="sourceLineNo">1582</span>      }<a name="line.1582"></a>
-<span class="sourceLineNo">1583</span>    } while (cluster.wouldLowerAvailability(regionInfo, sn)<a name="line.1583"></a>
-<span class="sourceLineNo">1584</span>        &amp;&amp; iterations++ &lt; maxIterations);<a name="line.1584"></a>
-<span class="sourceLineNo">1585</span>    if (iterations &gt;= maxIterations) {<a name="line.1585"></a>
-<span class="sourceLineNo">1586</span>      // We have reached the max. Means the servers that we collected is still lowering the<a name="line.1586"></a>
-<span class="sourceLineNo">1587</span>      // availability<a name="line.1587"></a>
-<span class="sourceLineNo">1588</span>      for (ServerName unusedServer : servers) {<a name="line.1588"></a>
-<span class="sourceLineNo">1589</span>        if (!usedSNs.contains(unusedServer)) {<a name="line.1589"></a>
-<span class="sourceLineNo">1590</span>          // check if any other unused server is there for us to use.<a name="line.1590"></a>
-<span class="sourceLineNo">1591</span>          // If so use it. Else we have not other go but to go with one of them<a name="line.1591"></a>
-<span class="sourceLineNo">1592</span>          if (!cluster.wouldLowerAvailability(regionInfo, unusedServer)) {<a name="line.1592"></a>
-<span class="sourceLineNo">1593</span>            sn = unusedServer;<a name="line.1593"></a>
-<span class="sourceLineNo">1594</span>            break;<a name="line.1594"></a>
-<span class="sourceLineNo">1595</span>          }<a name="line.1595"></a>
-<span class="sourceLineNo">1596</span>        }<a name="line.1596"></a>
-<span class="sourceLineNo">1597</span>      }<a name="line.1597"></a>
-<span class="sourceLineNo">1598</span>    }<a name="line.1598"></a>
-<span class="sourceLineNo">1599</span>    cluster.doAssignRegion(regionInfo, sn);<a name="line.1599"></a>
-<span class="sourceLineNo">1600</span>    return sn;<a name="line.1600"></a>
-<span class="sourceLineNo">1601</span>  }<a name="line.1601"></a>
-<span class="sourceLineNo">1602</span><a name="line.1602"></a>
-<span class="sourceLineNo">1603</span>  /**<a name="line.1603"></a>
-<span class="sourceLineNo">1604</span>   * Round robin a list of regions to a list of servers<a name="line.1604"></a>
-<span class="sourceLineNo">1605</span>   */<a name="line.1605"></a>
-<span class="sourceLineNo">1606</span>  private void roundRobinAssignment(Cluster cluster, List&lt;RegionInfo&gt; regions,<a name="line.1606"></a>
-<span class="sourceLineNo">1607</span>      List&lt;RegionInfo&gt; unassignedRegions, List&lt;ServerName&gt; servers,<a name="line.1607"></a>
-<span class="sourceLineNo">1608</span>      Map&lt;ServerName, List&lt;RegionInfo&gt;&gt; assignments) {<a name="line.1608"></a>
-<span class="sourceLineNo">1609</span><a name="line.1609"></a>
-<span class="sourceLineNo">1610</span>    int numServers = servers.size();<a name="line.1610"></a>
-<span class="sourceLineNo">1611</span>    int numRegions = regions.size();<a name="line.1611"></a>
-<span class="sourceLineNo">1612</span>    int max = (int) Math.ceil((float) numRegions / numServers);<a name="line.1612"></a>
-<span class="sourceLineNo">1613</span>    int serverIdx = 0;<a name="line.1613"></a>
-<span class="sourceLineNo">1614</span>    if (numServers &gt; 1) {<a name="line.1614"></a>
-<span class="sourceLineNo">1615</span>      serverIdx = RANDOM.nextInt(numServers);<a name="line.1615"></a>
-<span class="sourceLineNo">1616</span>    }<a name="line.1616"></a>
-<span class="sourceLineNo">1617</span>    int regionIdx = 0;<a name="line.1617"></a>
-<span class="sourceLineNo">1618</span><a name="line.1618"></a>
-<span class="sourceLineNo">1619</span>    for (int j = 0; j &lt; numServers; j++) {<a name="line.1619"></a>
-<span class="sourceLineNo">1620</span>      ServerName server = servers.get((j + serverIdx) % numServers);<a name="line.1620"></a>
-<span class="sourceLineNo">1621</span>      List&lt;RegionInfo&gt; serverRegions = new ArrayList&lt;&gt;(max);<a name="line.1621"></a>
-<span class="sourceLineNo">1622</span>      for (int i = regionIdx; i &lt; numRegions; i += numServers) {<a name="line.1622"></a>
-<span class="sourceLineNo">1623</span>        RegionInfo region = regions.get(i % numRegions);<a name="line.1623"></a>
-<span class="sourceLineNo">1624</span>        if (cluster.wouldLowerAvailability(region, server)) {<a name="line.1624"></a>
-<span class="sourceLineNo">1625</span>          unassignedRegions.add(region);<a name="line.1625"></a>
-<span class="sourceLineNo">1626</span>        } else {<a name="line.1626"></a>
-<span class="sourceLineNo">1627</span>          serverRegions.add(region);<a name="line.1627"></a>
-<span class="sourceLineNo">1628</span>          cluster.doAssignRegion(region, server);<a name="line.1628"></a>
-<span class="sourceLineNo">1629</span>        }<a name="line.1629"></a>
-<span class="sourceLineNo">1630</span>      }<a name="line.1630"></a>
-<span class="sourceLineNo">1631</span>      assignments.put(server, serverRegions);<a name="line.1631"></a>
-<span class="sourceLineNo">1632</span>      regionIdx++;<a name="line.1632"></a>
-<span class="sourceLineNo">1633</span>    }<a name="line.1633"></a>
-<span class="sourceLineNo">1634</span>  }<a name="line.1634"></a>
-<span class="sourceLineNo">1635</span><a name="line.1635"></a>
-<span class="sourceLineNo">1636</span>  protected Map&lt;ServerName, List&lt;RegionInfo&gt;&gt; getRegionAssignmentsByServer(<a name="line.1636"></a>
-<span class="sourceLineNo">1637</span>    Collection&lt;RegionInfo&gt; regions) {<a name="line.1637"></a>
-<span class="sourceLineNo">1638</span>    if (this.services != null &amp;&amp; this.services.getAssignmentManager() != null) {<a name="line.1638"></a>
-<span class="sourceLineNo">1639</span>      return this.services.getAssignmentManager().getSnapShotOfAssignment(regions);<a name="line.1639"></a>
-<span class="sourceLineNo">1640</span>    } else {<a name="line.1640"></a>
-<span class="sourceLineNo">1641</span>      return new HashMap&lt;&gt;();<a name="line.1641"></a>
-<span class="sourceLineNo">1642</span>    }<a name="line.1642"></a>
-<span class="sourceLineNo">1643</span>  }<a name="line.1643"></a>
-<span class="sourceLineNo">1644</span><a name="line.1644"></a>
-<span class="sourceLineNo">1645</span>  @Override<a name="line.1645"></a>
-<span class="sourceLineNo">1646</span>  public void onConfigurationChange(Configuration conf) {<a name="line.1646"></a>
-<span class="sourceLineNo">1647</span>  }<a name="line.1647"></a>
-<span class="sourceLineNo">1648</span>}<a name="line.1648"></a>
+<span class="sourceLineNo">1044</span>  /**<a name="line.1044"></a>
+<span class="sourceLineNo">1045</span>   * Check if a region belongs to some system table.<a name="line.1045"></a>
+<span class="sourceLineNo">1046</span>   * If so, the primary replica may be expected to be put on the master regionserver.<a name="line.1046"></a>
+<span class="sourceLineNo">1047</span>   */<a name="line.1047"></a>
+<span class="sourceLineNo">1048</span>  public boolean shouldBeOnMaster(RegionInfo region) {<a name="line.1048"></a>
+<span class="sourceLineNo">1049</span>    return (this.maintenanceMode || this.onlySystemTablesOnMaster)<a name="line.1049"></a>
+<span class="sourceLineNo">1050</span>        &amp;&amp; region.getTable().isSystemTable();<a name="line.1050"></a>
+<span class="sourceLineNo">1051</span>  }<a name="line.1051"></a>
+<span class="sourceLineNo">1052</span><a name="line.1052"></a>
+<span class="sourceLineNo">1053</span>  /**<a name="line.1053"></a>
+<span class="sourceLineNo">1054</span>   * Balance the regions that should be on master regionserver.<a name="line.1054"></a>
+<span class="sourceLineNo">1055</span>   */<a name="line.1055"></a>
+<span class="sourceLineNo">1056</span>  protected List&lt;RegionPlan&gt; balanceMasterRegions(Map&lt;ServerName, List&lt;RegionInfo&gt;&gt; clusterMap) {<a name="line.1056"></a>
+<span class="sourceLineNo">1057</span>    if (masterServerName == null || clusterMap == null || clusterMap.size() &lt;= 1) return null;<a name="line.1057"></a>
+<span class="sourceLineNo">1058</span>    List&lt;RegionPlan&gt; plans = null;<a name="line.1058"></a>
+<span class="sourceLineNo">1059</span>    List&lt;RegionInfo&gt; regions = clusterMap.get(masterServerName);<a name="line.1059"></a>
+<span class="sourceLineNo">1060</span>    if (regions != null) {<a name="line.1060"></a>
+<span class="sourceLineNo">1061</span>      Iterator&lt;ServerName&gt; keyIt = null;<a name="line.1061"></a>
+<span class="sourceLineNo">1062</span>      for (RegionInfo region: regions) {<a name="line.1062"></a>
+<span class="sourceLineNo">1063</span>        if (shouldBeOnMaster(region)) continue;<a name="line.1063"></a>
+<span class="sourceLineNo">1064</span><a name="line.1064"></a>
+<span class="sourceLineNo">1065</span>        // Find a non-master regionserver to host the region<a name="line.1065"></a>
+<span class="sourceLineNo">1066</span>        if (keyIt == null || !keyIt.hasNext()) {<a name="line.1066"></a>
+<span class="sourceLineNo">1067</span>          keyIt = clusterMap.keySet().iterator();<a name="line.1067"></a>
+<span class="sourceLineNo">1068</span>        }<a name="line.1068"></a>
+<span class="sourceLineNo">1069</span>        ServerName dest = keyIt.next();<a name="line.1069"></a>
+<span class="sourceLineNo">1070</span>        if (masterServerName.equals(dest)) {<a name="line.1070"></a>
+<span class="sourceLineNo">1071</span>          if (!keyIt.hasNext()) {<a name="line.1071"></a>
+<span class="sourceLineNo">1072</span>            keyIt = clusterMap.keySet().iterator();<a name="line.1072"></a>
+<span class="sourceLineNo">1073</span>          }<a name="line.1073"></a>
+<span class="sourceLineNo">1074</span>          dest = keyIt.next();<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>        // Move this region away from the master regionserver<a name="line.1077"></a>
+<span class="sourceLineNo">1078</span>        RegionPlan plan = new RegionPlan(region, masterServerName, dest);<a name="line.1078"></a>
+<span class="sourceLineNo">1079</span>        if (plans == null) {<a name="line.1079"></a>
+<span class="sourceLineNo">1080</span>          plans = new ArrayList&lt;&gt;();<a name="line.1080"></a>
+<span class="sourceLineNo">1081</span>        }<a name="line.1081"></a>
+<span class="sourceLineNo">1082</span>        plans.add(plan);<a name="line.1082"></a>
+<span class="sourceLineNo">1083</span>      }<a name="line.1083"></a>
+<span class="sourceLineNo">1084</span>    }<a name="line.1084"></a>
+<span class="sourceLineNo">1085</span>    for (Map.Entry&lt;ServerName, List&lt;RegionInfo&gt;&gt; server: clusterMap.entrySet()) {<a name="line.1085"></a>
+<span class="sourceLineNo">1086</span>      if (masterServerName.equals(server.getKey())) continue;<a name="line.1086"></a>
+<span class="sourceLineNo">1087</span>      for (RegionInfo region: server.getValue()) {<a name="line.1087"></a>
+<span class="sourceLineNo">1088</span>        if (!shouldBeOnMaster(region)) continue;<a name="line.1088"></a>
+<span class="sourceLineNo">1089</span><a name="line.1089"></a>
+<span class="sourceLineNo">1090</span>        // Move this region to the master regionserver<a name="line.1090"></a>
+<span class="sourceLineNo">1091</span>        RegionPlan plan = new RegionPlan(region, server.getKey(), masterServerName);<a name="line.1091"></a>
+<span class="sourceLineNo">1092</span>        if (plans == null) {<a name="line.1092"></a>
+<span class="sourceLineNo">1093</span>          plans = new ArrayList&lt;&gt;();<a name="line.1093"></a>
+<span class="sourceLineNo">1094</span>        }<a name="line.1094"></a>
+<span class="sourceLineNo">1095</span>        plans.add(plan);<a name="line.1095"></a>
+<span class="sourceLineNo">1096</span>      }<a name="line.1096"></a>
+<span class="sourceLineNo">1097</span>    }<a name="line.1097"></a>
+<span class="sourceLineNo">1098</span>    return plans;<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>  /**<a name="line.1101"></a>
+<span class="sourceLineNo">1102</span>   * If master is configured to carry system tables only, in here is<a name="line.1102"></a>
+<span class="sourceLineNo">1103</span>   * where we figure what to assign it.<a name="line.1103"></a>
+<span class="sourceLineNo">1104</span>   */<a name="line.1104"></a>
+<span class="sourceLineNo">1105</span>  protected Map&lt;ServerName, List&lt;RegionInfo&gt;&gt; assignMasterSystemRegions(<a name="line.1105"></a>
+<span class="sourceLineNo">1106</span>      Collection&lt;RegionInfo&gt; regions, List&lt;ServerName&gt; servers) {<a name="line.1106"></a>
+<span class="sourceLineNo">1107</span>    if (servers == null || regions == null || regions.isEmpty()) {<a name="line.1107"></a>
+<span class="sourceLineNo">1108</span>      return null;<a name="line.1108"></a>
+<span class="sourceLineNo">1109</span>    }<a name="line.1109"></a>
+<span class="sourceLineNo">1110</span>    Map&lt;ServerName, List&lt;RegionInfo&gt;&gt; assignments = new TreeMap&lt;&gt;();<a name="line.1110"></a>
+<span class="sourceLineNo">1111</span>    if (this.maintenanceMode || this.onlySystemTablesOnMaster) {<a name="line.1111"></a>
+<span class="sourceLineNo">1112</span>      if (masterServerName != null &amp;&amp; servers.contains(masterServerName)) {<a name="line.1112"></a>
+<span class="sourceLineNo">1113</span>        assignments.put(masterServerName, new ArrayList&lt;&gt;());<a name="line.1113"></a>
+<span class="sourceLineNo">1114</span>        for (RegionInfo region : regions) {<a name="line.1114"></a>
+<span class="sourceLineNo">1115</span>          if (shouldBeOnMaster(region)) {<a name="line.1115"></a>
+<span class="sourceLineNo">1116</span>            assignments.get(masterServerName).add(region);<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>      }<a name="line.1119"></a>
+<span class="sourceLineNo">1120</span>    }<a name="line.1120"></a>
+<span class="sourceLineNo">1121</span>    return assignments;<a name="line.1121"></a>
+<span class="sourceLineNo">1122</span>  }<a name="line.1122"></a>
+<span class="sourceLineNo">1123</span><a name="line.1123"></a>
+<span class="sourceLineNo">1124</span>  @Override<a name="line.1124"></a>
+<span class="sourceLineNo">1125</span>  public Configuration getConf() {<a name="line.1125"></a>
+<span class="sourceLineNo">1126</span>    return this.config;<a name="line.1126"></a>
+<span class="sourceLineNo">1127</span>  }<a name="line.1127"></a>
+<span class="sourceLineNo">1128</span><a name="line.1128"></a>
+<span class="sourceLineNo">1129</span>  @Override<a name="line.1129"></a>
+<span class="sourceLineNo">1130</span>  public synchronized void setClusterMetrics(ClusterMetrics st) {<a name="line.1130"></a>
+<span class="sourceLineNo">1131</span>    this.clusterStatus = st;<a name="line.1131"></a>
+<span class="sourceLineNo">1132</span>    if (useRegionFinder) {<a name="line.1132"></a>
+<span class="sourceLineNo">1133</span>      regionFinder.setClusterMetrics(st);<a name="line.1133"></a>
+<span class="sourceLineNo">1134</span>    }<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 void setClusterLoad(Map&lt;TableName, Map&lt;ServerName, List&lt;RegionInfo&gt;&gt;&gt; clusterLoad){<a name="line.1138"></a>
+<span class="sourceLineNo">1139</span><a name="line.1139"></a>
+<span class="sourceLineNo">1140</span>  }<a name="line.1140"></a>
+<span class="sourceLineNo">1141</span><a name="line.1141"></a>
+<span class="sourceLineNo">1142</span>  @Override<a name="line.1142"></a>
+<span class="sourceLineNo">1143</span>  public void setMasterServices(MasterServices masterServices) {<a name="line.1143"></a>
+<span class="sourceLineNo">1144</span>    masterServerName = masterServices.getServerName();<a name="line.1144"></a>
+<span class="sourceLineNo">1145</span>    this.services = masterServices;<a name="line.1145"></a>
+<span class="sourceLineNo">1146</span>    if (useRegionFinder) {<a name="line.1146"></a>
+<span class="sourceLineNo">1147</span>      this.regionFinder.setServices(masterServices);<a name="line.1147"></a>
+<span class="sourceLineNo">1148</span>    }<a name="line.1148"></a>
+<span class="sourceLineNo">1149</span>    if (this.services.isInMaintenanceMode()) {<a name="line.1149"></a>
+<span class="sourceLineNo">1150</span>      this.maintenanceMode = true;<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><a name="line.1153"></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 (this.maintenanceMode || 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>
+<sp

<TRUNCATED>

[13/46] hbase-site git commit: Published site at 05d22ed960204183fbd9bd16f1dbca6410ccde76.

Posted by gi...@apache.org.
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/3649682c/devapidocs/src-html/org/apache/hadoop/hbase/regionserver/HRegionServer.PeriodicMemStoreFlusher.html
----------------------------------------------------------------------
diff --git a/devapidocs/src-html/org/apache/hadoop/hbase/regionserver/HRegionServer.PeriodicMemStoreFlusher.html b/devapidocs/src-html/org/apache/hadoop/hbase/regionserver/HRegionServer.PeriodicMemStoreFlusher.html
index 90087b4..b2a9771 100644
--- a/devapidocs/src-html/org/apache/hadoop/hbase/regionserver/HRegionServer.PeriodicMemStoreFlusher.html
+++ b/devapidocs/src-html/org/apache/hadoop/hbase/regionserver/HRegionServer.PeriodicMemStoreFlusher.html
@@ -956,2857 +956,2858 @@
 <span class="sourceLineNo">948</span>      // Try and register with the Master; tell it we are here.  Break if server is stopped or the<a name="line.948"></a>
 <span class="sourceLineNo">949</span>      // clusterup flag is down or hdfs went wacky. Once registered successfully, go ahead and start<a name="line.949"></a>
 <span class="sourceLineNo">950</span>      // up all Services. Use RetryCounter to get backoff in case Master is struggling to come up.<a name="line.950"></a>
-<span class="sourceLineNo">951</span>      RetryCounterFactory rcf = new RetryCounterFactory(Integer.MAX_VALUE,<a name="line.951"></a>
-<span class="sourceLineNo">952</span>          this.sleeper.getPeriod(), 1000 * 60 * 5);<a name="line.952"></a>
-<span class="sourceLineNo">953</span>      RetryCounter rc = rcf.create();<a name="line.953"></a>
-<span class="sourceLineNo">954</span>      while (keepLooping()) {<a name="line.954"></a>
-<span class="sourceLineNo">955</span>        RegionServerStartupResponse w = reportForDuty();<a name="line.955"></a>
-<span class="sourceLineNo">956</span>        if (w == null) {<a name="line.956"></a>
-<span class="sourceLineNo">957</span>          long sleepTime = rc.getBackoffTimeAndIncrementAttempts();<a name="line.957"></a>
-<span class="sourceLineNo">958</span>          LOG.warn("reportForDuty failed; sleeping {} ms and then retrying.", sleepTime);<a name="line.958"></a>
-<span class="sourceLineNo">959</span>          this.sleeper.sleep(sleepTime);<a name="line.959"></a>
-<span class="sourceLineNo">960</span>        } else {<a name="line.960"></a>
-<span class="sourceLineNo">961</span>          handleReportForDutyResponse(w);<a name="line.961"></a>
-<span class="sourceLineNo">962</span>          break;<a name="line.962"></a>
-<span class="sourceLineNo">963</span>        }<a name="line.963"></a>
-<span class="sourceLineNo">964</span>      }<a name="line.964"></a>
-<span class="sourceLineNo">965</span><a name="line.965"></a>
-<span class="sourceLineNo">966</span>      if (!isStopped() &amp;&amp; isHealthy()) {<a name="line.966"></a>
-<span class="sourceLineNo">967</span>        // start the snapshot handler and other procedure handlers,<a name="line.967"></a>
-<span class="sourceLineNo">968</span>        // since the server is ready to run<a name="line.968"></a>
-<span class="sourceLineNo">969</span>        if (this.rspmHost != null) {<a name="line.969"></a>
-<span class="sourceLineNo">970</span>          this.rspmHost.start();<a name="line.970"></a>
-<span class="sourceLineNo">971</span>        }<a name="line.971"></a>
-<span class="sourceLineNo">972</span>        // Start the Quota Manager<a name="line.972"></a>
-<span class="sourceLineNo">973</span>        if (this.rsQuotaManager != null) {<a name="line.973"></a>
-<span class="sourceLineNo">974</span>          rsQuotaManager.start(getRpcServer().getScheduler());<a name="line.974"></a>
-<span class="sourceLineNo">975</span>        }<a name="line.975"></a>
-<span class="sourceLineNo">976</span>        if (this.rsSpaceQuotaManager != null) {<a name="line.976"></a>
-<span class="sourceLineNo">977</span>          this.rsSpaceQuotaManager.start();<a name="line.977"></a>
-<span class="sourceLineNo">978</span>        }<a name="line.978"></a>
-<span class="sourceLineNo">979</span>      }<a name="line.979"></a>
-<span class="sourceLineNo">980</span><a name="line.980"></a>
-<span class="sourceLineNo">981</span>      // We registered with the Master.  Go into run mode.<a name="line.981"></a>
-<span class="sourceLineNo">982</span>      long lastMsg = System.currentTimeMillis();<a name="line.982"></a>
-<span class="sourceLineNo">983</span>      long oldRequestCount = -1;<a name="line.983"></a>
-<span class="sourceLineNo">984</span>      // The main run loop.<a name="line.984"></a>
-<span class="sourceLineNo">985</span>      while (!isStopped() &amp;&amp; isHealthy()) {<a name="line.985"></a>
-<span class="sourceLineNo">986</span>        if (!isClusterUp()) {<a name="line.986"></a>
-<span class="sourceLineNo">987</span>          if (isOnlineRegionsEmpty()) {<a name="line.987"></a>
-<span class="sourceLineNo">988</span>            stop("Exiting; cluster shutdown set and not carrying any regions");<a name="line.988"></a>
-<span class="sourceLineNo">989</span>          } else if (!this.stopping) {<a name="line.989"></a>
-<span class="sourceLineNo">990</span>            this.stopping = true;<a name="line.990"></a>
-<span class="sourceLineNo">991</span>            LOG.info("Closing user regions");<a name="line.991"></a>
-<span class="sourceLineNo">992</span>            closeUserRegions(this.abortRequested);<a name="line.992"></a>
-<span class="sourceLineNo">993</span>          } else if (this.stopping) {<a name="line.993"></a>
-<span class="sourceLineNo">994</span>            boolean allUserRegionsOffline = areAllUserRegionsOffline();<a name="line.994"></a>
-<span class="sourceLineNo">995</span>            if (allUserRegionsOffline) {<a name="line.995"></a>
-<span class="sourceLineNo">996</span>              // Set stopped if no more write requests tp meta tables<a name="line.996"></a>
-<span class="sourceLineNo">997</span>              // since last time we went around the loop.  Any open<a name="line.997"></a>
-<span class="sourceLineNo">998</span>              // meta regions will be closed on our way out.<a name="line.998"></a>
-<span class="sourceLineNo">999</span>              if (oldRequestCount == getWriteRequestCount()) {<a name="line.999"></a>
-<span class="sourceLineNo">1000</span>                stop("Stopped; only catalog regions remaining online");<a name="line.1000"></a>
-<span class="sourceLineNo">1001</span>                break;<a name="line.1001"></a>
-<span class="sourceLineNo">1002</span>              }<a name="line.1002"></a>
-<span class="sourceLineNo">1003</span>              oldRequestCount = getWriteRequestCount();<a name="line.1003"></a>
-<span class="sourceLineNo">1004</span>            } else {<a name="line.1004"></a>
-<span class="sourceLineNo">1005</span>              // Make sure all regions have been closed -- some regions may<a name="line.1005"></a>
-<span class="sourceLineNo">1006</span>              // have not got it because we were splitting at the time of<a name="line.1006"></a>
-<span class="sourceLineNo">1007</span>              // the call to closeUserRegions.<a name="line.1007"></a>
-<span class="sourceLineNo">1008</span>              closeUserRegions(this.abortRequested);<a name="line.1008"></a>
-<span class="sourceLineNo">1009</span>            }<a name="line.1009"></a>
-<span class="sourceLineNo">1010</span>            LOG.debug("Waiting on " + getOnlineRegionsAsPrintableString());<a name="line.1010"></a>
-<span class="sourceLineNo">1011</span>          }<a name="line.1011"></a>
-<span class="sourceLineNo">1012</span>        }<a name="line.1012"></a>
-<span class="sourceLineNo">1013</span>        long now = System.currentTimeMillis();<a name="line.1013"></a>
-<span class="sourceLineNo">1014</span>        if ((now - lastMsg) &gt;= msgInterval) {<a name="line.1014"></a>
-<span class="sourceLineNo">1015</span>          tryRegionServerReport(lastMsg, now);<a name="line.1015"></a>
-<span class="sourceLineNo">1016</span>          lastMsg = System.currentTimeMillis();<a name="line.1016"></a>
-<span class="sourceLineNo">1017</span>        }<a name="line.1017"></a>
-<span class="sourceLineNo">1018</span>        if (!isStopped() &amp;&amp; !isAborted()) {<a name="line.1018"></a>
-<span class="sourceLineNo">1019</span>          this.sleeper.sleep();<a name="line.1019"></a>
-<span class="sourceLineNo">1020</span>        }<a name="line.1020"></a>
-<span class="sourceLineNo">1021</span>      } // for<a name="line.1021"></a>
-<span class="sourceLineNo">1022</span>    } catch (Throwable t) {<a name="line.1022"></a>
-<span class="sourceLineNo">1023</span>      if (!rpcServices.checkOOME(t)) {<a name="line.1023"></a>
-<span class="sourceLineNo">1024</span>        String prefix = t instanceof YouAreDeadException? "": "Unhandled: ";<a name="line.1024"></a>
-<span class="sourceLineNo">1025</span>        abort(prefix + t.getMessage(), t);<a name="line.1025"></a>
-<span class="sourceLineNo">1026</span>      }<a name="line.1026"></a>
-<span class="sourceLineNo">1027</span>    }<a name="line.1027"></a>
-<span class="sourceLineNo">1028</span>    if (this.leases != null) {<a name="line.1028"></a>
-<span class="sourceLineNo">1029</span>      this.leases.closeAfterLeasesExpire();<a name="line.1029"></a>
-<span class="sourceLineNo">1030</span>    }<a name="line.1030"></a>
-<span class="sourceLineNo">1031</span>    if (this.splitLogWorker != null) {<a name="line.1031"></a>
-<span class="sourceLineNo">1032</span>      splitLogWorker.stop();<a name="line.1032"></a>
-<span class="sourceLineNo">1033</span>    }<a name="line.1033"></a>
-<span class="sourceLineNo">1034</span>    if (this.infoServer != null) {<a name="line.1034"></a>
-<span class="sourceLineNo">1035</span>      LOG.info("Stopping infoServer");<a name="line.1035"></a>
-<span class="sourceLineNo">1036</span>      try {<a name="line.1036"></a>
-<span class="sourceLineNo">1037</span>        this.infoServer.stop();<a name="line.1037"></a>
-<span class="sourceLineNo">1038</span>      } catch (Exception e) {<a name="line.1038"></a>
-<span class="sourceLineNo">1039</span>        LOG.error("Failed to stop infoServer", e);<a name="line.1039"></a>
-<span class="sourceLineNo">1040</span>      }<a name="line.1040"></a>
-<span class="sourceLineNo">1041</span>    }<a name="line.1041"></a>
-<span class="sourceLineNo">1042</span>    // Send cache a shutdown.<a name="line.1042"></a>
-<span class="sourceLineNo">1043</span>    if (cacheConfig != null &amp;&amp; cacheConfig.isBlockCacheEnabled()) {<a name="line.1043"></a>
-<span class="sourceLineNo">1044</span>      cacheConfig.getBlockCache().shutdown();<a name="line.1044"></a>
-<span class="sourceLineNo">1045</span>    }<a name="line.1045"></a>
-<span class="sourceLineNo">1046</span>    mobCacheConfig.getMobFileCache().shutdown();<a name="line.1046"></a>
-<span class="sourceLineNo">1047</span><a name="line.1047"></a>
-<span class="sourceLineNo">1048</span>    if (movedRegionsCleaner != null) {<a name="line.1048"></a>
-<span class="sourceLineNo">1049</span>      movedRegionsCleaner.stop("Region Server stopping");<a name="line.1049"></a>
-<span class="sourceLineNo">1050</span>    }<a name="line.1050"></a>
-<span class="sourceLineNo">1051</span><a name="line.1051"></a>
-<span class="sourceLineNo">1052</span>    // Send interrupts to wake up threads if sleeping so they notice shutdown.<a name="line.1052"></a>
-<span class="sourceLineNo">1053</span>    // TODO: Should we check they are alive? If OOME could have exited already<a name="line.1053"></a>
-<span class="sourceLineNo">1054</span>    if (this.hMemManager != null) this.hMemManager.stop();<a name="line.1054"></a>
-<span class="sourceLineNo">1055</span>    if (this.cacheFlusher != null) this.cacheFlusher.interruptIfNecessary();<a name="line.1055"></a>
-<span class="sourceLineNo">1056</span>    if (this.compactSplitThread != null) this.compactSplitThread.interruptIfNecessary();<a name="line.1056"></a>
-<span class="sourceLineNo">1057</span>    sendShutdownInterrupt();<a name="line.1057"></a>
-<span class="sourceLineNo">1058</span><a name="line.1058"></a>
-<span class="sourceLineNo">1059</span>    // Stop the snapshot and other procedure handlers, forcefully killing all running tasks<a name="line.1059"></a>
-<span class="sourceLineNo">1060</span>    if (rspmHost != null) {<a name="line.1060"></a>
-<span class="sourceLineNo">1061</span>      rspmHost.stop(this.abortRequested || this.killed);<a name="line.1061"></a>
-<span class="sourceLineNo">1062</span>    }<a name="line.1062"></a>
-<span class="sourceLineNo">1063</span><a name="line.1063"></a>
-<span class="sourceLineNo">1064</span>    if (this.killed) {<a name="line.1064"></a>
-<span class="sourceLineNo">1065</span>      // Just skip out w/o closing regions.  Used when testing.<a name="line.1065"></a>
-<span class="sourceLineNo">1066</span>    } else if (abortRequested) {<a name="line.1066"></a>
-<span class="sourceLineNo">1067</span>      if (this.fsOk) {<a name="line.1067"></a>
-<span class="sourceLineNo">1068</span>        closeUserRegions(abortRequested); // Don't leave any open file handles<a name="line.1068"></a>
-<span class="sourceLineNo">1069</span>      }<a name="line.1069"></a>
-<span class="sourceLineNo">1070</span>      LOG.info("aborting server " + this.serverName);<a name="line.1070"></a>
-<span class="sourceLineNo">1071</span>    } else {<a name="line.1071"></a>
-<span class="sourceLineNo">1072</span>      closeUserRegions(abortRequested);<a name="line.1072"></a>
-<span class="sourceLineNo">1073</span>      LOG.info("stopping server " + this.serverName);<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>    // so callers waiting for meta without timeout can stop<a name="line.1076"></a>
-<span class="sourceLineNo">1077</span>    if (this.metaTableLocator != null) this.metaTableLocator.stop();<a name="line.1077"></a>
-<span class="sourceLineNo">1078</span>    if (this.clusterConnection != null &amp;&amp; !clusterConnection.isClosed()) {<a name="line.1078"></a>
-<span class="sourceLineNo">1079</span>      try {<a name="line.1079"></a>
-<span class="sourceLineNo">1080</span>        this.clusterConnection.close();<a name="line.1080"></a>
-<span class="sourceLineNo">1081</span>      } catch (IOException e) {<a name="line.1081"></a>
-<span class="sourceLineNo">1082</span>        // Although the {@link Closeable} interface throws an {@link<a name="line.1082"></a>
-<span class="sourceLineNo">1083</span>        // IOException}, in reality, the implementation would never do that.<a name="line.1083"></a>
-<span class="sourceLineNo">1084</span>        LOG.warn("Attempt to close server's short circuit ClusterConnection failed.", e);<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>    // Closing the compactSplit thread before closing meta regions<a name="line.1088"></a>
-<span class="sourceLineNo">1089</span>    if (!this.killed &amp;&amp; containsMetaTableRegions()) {<a name="line.1089"></a>
-<span class="sourceLineNo">1090</span>      if (!abortRequested || this.fsOk) {<a name="line.1090"></a>
-<span class="sourceLineNo">1091</span>        if (this.compactSplitThread != null) {<a name="line.1091"></a>
-<span class="sourceLineNo">1092</span>          this.compactSplitThread.join();<a name="line.1092"></a>
-<span class="sourceLineNo">1093</span>          this.compactSplitThread = null;<a name="line.1093"></a>
-<span class="sourceLineNo">1094</span>        }<a name="line.1094"></a>
-<span class="sourceLineNo">1095</span>        closeMetaTableRegions(abortRequested);<a name="line.1095"></a>
-<span class="sourceLineNo">1096</span>      }<a name="line.1096"></a>
-<span class="sourceLineNo">1097</span>    }<a name="line.1097"></a>
-<span class="sourceLineNo">1098</span><a name="line.1098"></a>
-<span class="sourceLineNo">1099</span>    if (!this.killed &amp;&amp; this.fsOk) {<a name="line.1099"></a>
-<span class="sourceLineNo">1100</span>      waitOnAllRegionsToClose(abortRequested);<a name="line.1100"></a>
-<span class="sourceLineNo">1101</span>      LOG.info("stopping server " + this.serverName + "; all regions closed.");<a name="line.1101"></a>
-<span class="sourceLineNo">1102</span>    }<a name="line.1102"></a>
-<span class="sourceLineNo">1103</span><a name="line.1103"></a>
-<span class="sourceLineNo">1104</span>    // Stop the quota manager<a name="line.1104"></a>
-<span class="sourceLineNo">1105</span>    if (rsQuotaManager != null) {<a name="line.1105"></a>
-<span class="sourceLineNo">1106</span>      rsQuotaManager.stop();<a name="line.1106"></a>
-<span class="sourceLineNo">1107</span>    }<a name="line.1107"></a>
-<span class="sourceLineNo">1108</span>    if (rsSpaceQuotaManager != null) {<a name="line.1108"></a>
-<span class="sourceLineNo">1109</span>      rsSpaceQuotaManager.stop();<a name="line.1109"></a>
-<span class="sourceLineNo">1110</span>      rsSpaceQuotaManager = null;<a name="line.1110"></a>
-<span class="sourceLineNo">1111</span>    }<a name="line.1111"></a>
-<span class="sourceLineNo">1112</span><a name="line.1112"></a>
-<span class="sourceLineNo">1113</span>    //fsOk flag may be changed when closing regions throws exception.<a name="line.1113"></a>
-<span class="sourceLineNo">1114</span>    if (this.fsOk) {<a name="line.1114"></a>
-<span class="sourceLineNo">1115</span>      shutdownWAL(!abortRequested);<a name="line.1115"></a>
-<span class="sourceLineNo">1116</span>    }<a name="line.1116"></a>
-<span class="sourceLineNo">1117</span><a name="line.1117"></a>
-<span class="sourceLineNo">1118</span>    // Make sure the proxy is down.<a name="line.1118"></a>
-<span class="sourceLineNo">1119</span>    if (this.rssStub != null) {<a name="line.1119"></a>
-<span class="sourceLineNo">1120</span>      this.rssStub = null;<a name="line.1120"></a>
-<span class="sourceLineNo">1121</span>    }<a name="line.1121"></a>
-<span class="sourceLineNo">1122</span>    if (this.lockStub != null) {<a name="line.1122"></a>
-<span class="sourceLineNo">1123</span>      this.lockStub = null;<a name="line.1123"></a>
-<span class="sourceLineNo">1124</span>    }<a name="line.1124"></a>
-<span class="sourceLineNo">1125</span>    if (this.rpcClient != null) {<a name="line.1125"></a>
-<span class="sourceLineNo">1126</span>      this.rpcClient.close();<a name="line.1126"></a>
-<span class="sourceLineNo">1127</span>    }<a name="line.1127"></a>
-<span class="sourceLineNo">1128</span>    if (this.leases != null) {<a name="line.1128"></a>
-<span class="sourceLineNo">1129</span>      this.leases.close();<a name="line.1129"></a>
-<span class="sourceLineNo">1130</span>    }<a name="line.1130"></a>
-<span class="sourceLineNo">1131</span>    if (this.pauseMonitor != null) {<a name="line.1131"></a>
-<span class="sourceLineNo">1132</span>      this.pauseMonitor.stop();<a name="line.1132"></a>
-<span class="sourceLineNo">1133</span>    }<a name="line.1133"></a>
-<span class="sourceLineNo">1134</span><a name="line.1134"></a>
-<span class="sourceLineNo">1135</span>    if (!killed) {<a name="line.1135"></a>
-<span class="sourceLineNo">1136</span>      stopServiceThreads();<a name="line.1136"></a>
-<span class="sourceLineNo">1137</span>    }<a name="line.1137"></a>
-<span class="sourceLineNo">1138</span><a name="line.1138"></a>
-<span class="sourceLineNo">1139</span>    if (this.rpcServices != null) {<a name="line.1139"></a>
-<span class="sourceLineNo">1140</span>      this.rpcServices.stop();<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>    try {<a name="line.1143"></a>
-<span class="sourceLineNo">1144</span>      deleteMyEphemeralNode();<a name="line.1144"></a>
-<span class="sourceLineNo">1145</span>    } catch (KeeperException.NoNodeException nn) {<a name="line.1145"></a>
-<span class="sourceLineNo">1146</span>    } catch (KeeperException e) {<a name="line.1146"></a>
-<span class="sourceLineNo">1147</span>      LOG.warn("Failed deleting my ephemeral node", e);<a name="line.1147"></a>
-<span class="sourceLineNo">1148</span>    }<a name="line.1148"></a>
-<span class="sourceLineNo">1149</span>    // We may have failed to delete the znode at the previous step, but<a name="line.1149"></a>
-<span class="sourceLineNo">1150</span>    //  we delete the file anyway: a second attempt to delete the znode is likely to fail again.<a name="line.1150"></a>
-<span class="sourceLineNo">1151</span>    ZNodeClearer.deleteMyEphemeralNodeOnDisk();<a name="line.1151"></a>
-<span class="sourceLineNo">1152</span><a name="line.1152"></a>
-<span class="sourceLineNo">1153</span>    if (this.zooKeeper != null) {<a name="line.1153"></a>
-<span class="sourceLineNo">1154</span>      this.zooKeeper.close();<a name="line.1154"></a>
-<span class="sourceLineNo">1155</span>    }<a name="line.1155"></a>
-<span class="sourceLineNo">1156</span>    this.shutDown = true;<a name="line.1156"></a>
-<span class="sourceLineNo">1157</span>    LOG.info("Exiting; stopping=" + this.serverName + "; zookeeper connection closed.");<a name="line.1157"></a>
-<span class="sourceLineNo">1158</span>  }<a name="line.1158"></a>
-<span class="sourceLineNo">1159</span><a name="line.1159"></a>
-<span class="sourceLineNo">1160</span>  private boolean containsMetaTableRegions() {<a name="line.1160"></a>
-<span class="sourceLineNo">1161</span>    return onlineRegions.containsKey(RegionInfoBuilder.FIRST_META_REGIONINFO.getEncodedName());<a name="line.1161"></a>
-<span class="sourceLineNo">1162</span>  }<a name="line.1162"></a>
-<span class="sourceLineNo">1163</span><a name="line.1163"></a>
-<span class="sourceLineNo">1164</span>  private boolean areAllUserRegionsOffline() {<a name="line.1164"></a>
-<span class="sourceLineNo">1165</span>    if (getNumberOfOnlineRegions() &gt; 2) return false;<a name="line.1165"></a>
-<span class="sourceLineNo">1166</span>    boolean allUserRegionsOffline = true;<a name="line.1166"></a>
-<span class="sourceLineNo">1167</span>    for (Map.Entry&lt;String, HRegion&gt; e: this.onlineRegions.entrySet()) {<a name="line.1167"></a>
-<span class="sourceLineNo">1168</span>      if (!e.getValue().getRegionInfo().isMetaRegion()) {<a name="line.1168"></a>
-<span class="sourceLineNo">1169</span>        allUserRegionsOffline = false;<a name="line.1169"></a>
-<span class="sourceLineNo">1170</span>        break;<a name="line.1170"></a>
-<span class="sourceLineNo">1171</span>      }<a name="line.1171"></a>
-<span class="sourceLineNo">1172</span>    }<a name="line.1172"></a>
-<span class="sourceLineNo">1173</span>    return allUserRegionsOffline;<a name="line.1173"></a>
-<span class="sourceLineNo">1174</span>  }<a name="line.1174"></a>
-<span class="sourceLineNo">1175</span><a name="line.1175"></a>
-<span class="sourceLineNo">1176</span>  /**<a name="line.1176"></a>
-<span class="sourceLineNo">1177</span>   * @return Current write count for all online regions.<a name="line.1177"></a>
-<span class="sourceLineNo">1178</span>   */<a name="line.1178"></a>
-<span class="sourceLineNo">1179</span>  private long getWriteRequestCount() {<a name="line.1179"></a>
-<span class="sourceLineNo">1180</span>    long writeCount = 0;<a name="line.1180"></a>
-<span class="sourceLineNo">1181</span>    for (Map.Entry&lt;String, HRegion&gt; e: this.onlineRegions.entrySet()) {<a name="line.1181"></a>
-<span class="sourceLineNo">1182</span>      writeCount += e.getValue().getWriteRequestsCount();<a name="line.1182"></a>
-<span class="sourceLineNo">1183</span>    }<a name="line.1183"></a>
-<span class="sourceLineNo">1184</span>    return writeCount;<a name="line.1184"></a>
-<span class="sourceLineNo">1185</span>  }<a name="line.1185"></a>
-<span class="sourceLineNo">1186</span><a name="line.1186"></a>
-<span class="sourceLineNo">1187</span>  @VisibleForTesting<a name="line.1187"></a>
-<span class="sourceLineNo">1188</span>  protected void tryRegionServerReport(long reportStartTime, long reportEndTime)<a name="line.1188"></a>
-<span class="sourceLineNo">1189</span>      throws IOException {<a name="line.1189"></a>
-<span class="sourceLineNo">1190</span>    RegionServerStatusService.BlockingInterface rss = rssStub;<a name="line.1190"></a>
-<span class="sourceLineNo">1191</span>    if (rss == null) {<a name="line.1191"></a>
-<span class="sourceLineNo">1192</span>      // the current server could be stopping.<a name="line.1192"></a>
-<span class="sourceLineNo">1193</span>      return;<a name="line.1193"></a>
-<span class="sourceLineNo">1194</span>    }<a name="line.1194"></a>
-<span class="sourceLineNo">1195</span>    ClusterStatusProtos.ServerLoad sl = buildServerLoad(reportStartTime, reportEndTime);<a name="line.1195"></a>
-<span class="sourceLineNo">1196</span>    try {<a name="line.1196"></a>
-<span class="sourceLineNo">1197</span>      RegionServerReportRequest.Builder request = RegionServerReportRequest.newBuilder();<a name="line.1197"></a>
-<span class="sourceLineNo">1198</span>      request.setServer(ProtobufUtil.toServerName(this.serverName));<a name="line.1198"></a>
-<span class="sourceLineNo">1199</span>      request.setLoad(sl);<a name="line.1199"></a>
-<span class="sourceLineNo">1200</span>      rss.regionServerReport(null, request.build());<a name="line.1200"></a>
-<span class="sourceLineNo">1201</span>    } catch (ServiceException se) {<a name="line.1201"></a>
-<span class="sourceLineNo">1202</span>      IOException ioe = ProtobufUtil.getRemoteException(se);<a name="line.1202"></a>
-<span class="sourceLineNo">1203</span>      if (ioe instanceof YouAreDeadException) {<a name="line.1203"></a>
-<span class="sourceLineNo">1204</span>        // This will be caught and handled as a fatal error in run()<a name="line.1204"></a>
-<span class="sourceLineNo">1205</span>        throw ioe;<a name="line.1205"></a>
-<span class="sourceLineNo">1206</span>      }<a name="line.1206"></a>
-<span class="sourceLineNo">1207</span>      if (rssStub == rss) {<a name="line.1207"></a>
-<span class="sourceLineNo">1208</span>        rssStub = null;<a name="line.1208"></a>
-<span class="sourceLineNo">1209</span>      }<a name="line.1209"></a>
-<span class="sourceLineNo">1210</span>      // Couldn't connect to the master, get location from zk and reconnect<a name="line.1210"></a>
-<span class="sourceLineNo">1211</span>      // Method blocks until new master is found or we are stopped<a name="line.1211"></a>
-<span class="sourceLineNo">1212</span>      createRegionServerStatusStub(true);<a name="line.1212"></a>
-<span class="sourceLineNo">1213</span>    }<a name="line.1213"></a>
-<span class="sourceLineNo">1214</span>  }<a name="line.1214"></a>
-<span class="sourceLineNo">1215</span><a name="line.1215"></a>
-<span class="sourceLineNo">1216</span>  /**<a name="line.1216"></a>
-<span class="sourceLineNo">1217</span>   * Reports the given map of Regions and their size on the filesystem to the active Master.<a name="line.1217"></a>
-<span class="sourceLineNo">1218</span>   *<a name="line.1218"></a>
-<span class="sourceLineNo">1219</span>   * @param regionSizeStore The store containing region sizes<a name="line.1219"></a>
-<span class="sourceLineNo">1220</span>   * @return false if FileSystemUtilizationChore should pause reporting to master. true otherwise<a name="line.1220"></a>
-<span class="sourceLineNo">1221</span>   */<a name="line.1221"></a>
-<span class="sourceLineNo">1222</span>  public boolean reportRegionSizesForQuotas(RegionSizeStore regionSizeStore) {<a name="line.1222"></a>
-<span class="sourceLineNo">1223</span>    RegionServerStatusService.BlockingInterface rss = rssStub;<a name="line.1223"></a>
-<span class="sourceLineNo">1224</span>    if (rss == null) {<a name="line.1224"></a>
-<span class="sourceLineNo">1225</span>      // the current server could be stopping.<a name="line.1225"></a>
-<span class="sourceLineNo">1226</span>      LOG.trace("Skipping Region size report to HMaster as stub is null");<a name="line.1226"></a>
-<span class="sourceLineNo">1227</span>      return true;<a name="line.1227"></a>
-<span class="sourceLineNo">1228</span>    }<a name="line.1228"></a>
-<span class="sourceLineNo">1229</span>    try {<a name="line.1229"></a>
-<span class="sourceLineNo">1230</span>      buildReportAndSend(rss, regionSizeStore);<a name="line.1230"></a>
-<span class="sourceLineNo">1231</span>    } catch (ServiceException se) {<a name="line.1231"></a>
-<span class="sourceLineNo">1232</span>      IOException ioe = ProtobufUtil.getRemoteException(se);<a name="line.1232"></a>
-<span class="sourceLineNo">1233</span>      if (ioe instanceof PleaseHoldException) {<a name="line.1233"></a>
-<span class="sourceLineNo">1234</span>        LOG.trace("Failed to report region sizes to Master because it is initializing."<a name="line.1234"></a>
-<span class="sourceLineNo">1235</span>            + " This will be retried.", ioe);<a name="line.1235"></a>
-<span class="sourceLineNo">1236</span>        // The Master is coming up. Will retry the report later. Avoid re-creating the stub.<a name="line.1236"></a>
-<span class="sourceLineNo">1237</span>        return true;<a name="line.1237"></a>
-<span class="sourceLineNo">1238</span>      }<a name="line.1238"></a>
-<span class="sourceLineNo">1239</span>      if (rssStub == rss) {<a name="line.1239"></a>
-<span class="sourceLineNo">1240</span>        rssStub = null;<a name="line.1240"></a>
-<span class="sourceLineNo">1241</span>      }<a name="line.1241"></a>
-<span class="sourceLineNo">1242</span>      createRegionServerStatusStub(true);<a name="line.1242"></a>
-<span class="sourceLineNo">1243</span>      if (ioe instanceof DoNotRetryIOException) {<a name="line.1243"></a>
-<span class="sourceLineNo">1244</span>        DoNotRetryIOException doNotRetryEx = (DoNotRetryIOException) ioe;<a name="line.1244"></a>
-<span class="sourceLineNo">1245</span>        if (doNotRetryEx.getCause() != null) {<a name="line.1245"></a>
-<span class="sourceLineNo">1246</span>          Throwable t = doNotRetryEx.getCause();<a name="line.1246"></a>
-<span class="sourceLineNo">1247</span>          if (t instanceof UnsupportedOperationException) {<a name="line.1247"></a>
-<span class="sourceLineNo">1248</span>            LOG.debug("master doesn't support ReportRegionSpaceUse, pause before retrying");<a name="line.1248"></a>
-<span class="sourceLineNo">1249</span>            return false;<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>      }<a name="line.1252"></a>
-<span class="sourceLineNo">1253</span>      LOG.debug("Failed to report region sizes to Master. This will be retried.", ioe);<a name="line.1253"></a>
-<span class="sourceLineNo">1254</span>    }<a name="line.1254"></a>
-<span class="sourceLineNo">1255</span>    return true;<a name="line.1255"></a>
-<span class="sourceLineNo">1256</span>  }<a name="line.1256"></a>
-<span class="sourceLineNo">1257</span><a name="line.1257"></a>
-<span class="sourceLineNo">1258</span>  /**<a name="line.1258"></a>
-<span class="sourceLineNo">1259</span>   * Builds the region size report and sends it to the master. Upon successful sending of the<a name="line.1259"></a>
-<span class="sourceLineNo">1260</span>   * report, the region sizes that were sent are marked as sent.<a name="line.1260"></a>
-<span class="sourceLineNo">1261</span>   *<a name="line.1261"></a>
-<span class="sourceLineNo">1262</span>   * @param rss The stub to send to the Master<a name="line.1262"></a>
-<span class="sourceLineNo">1263</span>   * @param regionSizeStore The store containing region sizes<a name="line.1263"></a>
-<span class="sourceLineNo">1264</span>   */<a name="line.1264"></a>
-<span class="sourceLineNo">1265</span>  void buildReportAndSend(RegionServerStatusService.BlockingInterface rss,<a name="line.1265"></a>
-<span class="sourceLineNo">1266</span>      RegionSizeStore regionSizeStore) throws ServiceException {<a name="line.1266"></a>
-<span class="sourceLineNo">1267</span>    RegionSpaceUseReportRequest request =<a name="line.1267"></a>
-<span class="sourceLineNo">1268</span>        buildRegionSpaceUseReportRequest(Objects.requireNonNull(regionSizeStore));<a name="line.1268"></a>
-<span class="sourceLineNo">1269</span>    rss.reportRegionSpaceUse(null, request);<a name="line.1269"></a>
-<span class="sourceLineNo">1270</span>    // Record the number of size reports sent<a name="line.1270"></a>
-<span class="sourceLineNo">1271</span>    if (metricsRegionServer != null) {<a name="line.1271"></a>
-<span class="sourceLineNo">1272</span>      metricsRegionServer.incrementNumRegionSizeReportsSent(regionSizeStore.size());<a name="line.1272"></a>
-<span class="sourceLineNo">1273</span>    }<a name="line.1273"></a>
-<span class="sourceLineNo">1274</span>  }<a name="line.1274"></a>
-<span class="sourceLineNo">1275</span><a name="line.1275"></a>
-<span class="sourceLineNo">1276</span>  /**<a name="line.1276"></a>
-<span class="sourceLineNo">1277</span>   * Builds a {@link RegionSpaceUseReportRequest} protobuf message from the region size map.<a name="line.1277"></a>
-<span class="sourceLineNo">1278</span>   *<a name="line.1278"></a>
-<span class="sourceLineNo">1279</span>   * @param regionSizes The size in bytes of regions<a name="line.1279"></a>
-<span class="sourceLineNo">1280</span>   * @return The corresponding protocol buffer message.<a name="line.1280"></a>
-<span class="sourceLineNo">1281</span>   */<a name="line.1281"></a>
-<span class="sourceLineNo">1282</span>  RegionSpaceUseReportRequest buildRegionSpaceUseReportRequest(RegionSizeStore regionSizes) {<a name="line.1282"></a>
-<span class="sourceLineNo">1283</span>    RegionSpaceUseReportRequest.Builder request = RegionSpaceUseReportRequest.newBuilder();<a name="line.1283"></a>
-<span class="sourceLineNo">1284</span>    for (Entry&lt;RegionInfo, RegionSize&gt; entry : regionSizes) {<a name="line.1284"></a>
-<span class="sourceLineNo">1285</span>      request.addSpaceUse(convertRegionSize(entry.getKey(), entry.getValue().getSize()));<a name="line.1285"></a>
-<span class="sourceLineNo">1286</span>    }<a name="line.1286"></a>
-<span class="sourceLineNo">1287</span>    return request.build();<a name="line.1287"></a>
-<span class="sourceLineNo">1288</span>  }<a name="line.1288"></a>
-<span class="sourceLineNo">1289</span><a name="line.1289"></a>
-<span class="sourceLineNo">1290</span>  /**<a name="line.1290"></a>
-<span class="sourceLineNo">1291</span>   * Converts a pair of {@link RegionInfo} and {@code long} into a {@link RegionSpaceUse}<a name="line.1291"></a>
-<span class="sourceLineNo">1292</span>   * protobuf message.<a name="line.1292"></a>
-<span class="sourceLineNo">1293</span>   *<a name="line.1293"></a>
-<span class="sourceLineNo">1294</span>   * @param regionInfo The RegionInfo<a name="line.1294"></a>
-<span class="sourceLineNo">1295</span>   * @param sizeInBytes The size in bytes of the Region<a name="line.1295"></a>
-<span class="sourceLineNo">1296</span>   * @return The protocol buffer<a name="line.1296"></a>
-<span class="sourceLineNo">1297</span>   */<a name="line.1297"></a>
-<span class="sourceLineNo">1298</span>  RegionSpaceUse convertRegionSize(RegionInfo regionInfo, Long sizeInBytes) {<a name="line.1298"></a>
-<span class="sourceLineNo">1299</span>    return RegionSpaceUse.newBuilder()<a name="line.1299"></a>
-<span class="sourceLineNo">1300</span>        .setRegionInfo(ProtobufUtil.toRegionInfo(Objects.requireNonNull(regionInfo)))<a name="line.1300"></a>
-<span class="sourceLineNo">1301</span>        .setRegionSize(Objects.requireNonNull(sizeInBytes))<a name="line.1301"></a>
-<span class="sourceLineNo">1302</span>        .build();<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>  ClusterStatusProtos.ServerLoad buildServerLoad(long reportStartTime, long reportEndTime)<a name="line.1305"></a>
-<span class="sourceLineNo">1306</span>      throws IOException {<a name="line.1306"></a>
-<span class="sourceLineNo">1307</span>    // We're getting the MetricsRegionServerWrapper here because the wrapper computes requests<a name="line.1307"></a>
-<span class="sourceLineNo">1308</span>    // per second, and other metrics  As long as metrics are part of ServerLoad it's best to use<a name="line.1308"></a>
-<span class="sourceLineNo">1309</span>    // the wrapper to compute those numbers in one place.<a name="line.1309"></a>
-<span class="sourceLineNo">1310</span>    // In the long term most of these should be moved off of ServerLoad and the heart beat.<a name="line.1310"></a>
-<span class="sourceLineNo">1311</span>    // Instead they should be stored in an HBase table so that external visibility into HBase is<a name="line.1311"></a>
-<span class="sourceLineNo">1312</span>    // improved; Additionally the load balancer will be able to take advantage of a more complete<a name="line.1312"></a>
-<span class="sourceLineNo">1313</span>    // history.<a name="line.1313"></a>
-<span class="sourceLineNo">1314</span>    MetricsRegionServerWrapper regionServerWrapper = metricsRegionServer.getRegionServerWrapper();<a name="line.1314"></a>
-<span class="sourceLineNo">1315</span>    Collection&lt;HRegion&gt; regions = getOnlineRegionsLocalContext();<a name="line.1315"></a>
-<span class="sourceLineNo">1316</span>    long usedMemory = -1L;<a name="line.1316"></a>
-<span class="sourceLineNo">1317</span>    long maxMemory = -1L;<a name="line.1317"></a>
-<span class="sourceLineNo">1318</span>    final MemoryUsage usage = MemorySizeUtil.safeGetHeapMemoryUsage();<a name="line.1318"></a>
-<span class="sourceLineNo">1319</span>    if (usage != null) {<a name="line.1319"></a>
-<span class="sourceLineNo">1320</span>      usedMemory = usage.getUsed();<a name="line.1320"></a>
-<span class="sourceLineNo">1321</span>      maxMemory = usage.getMax();<a name="line.1321"></a>
-<span class="sourceLineNo">1322</span>    }<a name="line.1322"></a>
-<span class="sourceLineNo">1323</span><a name="line.1323"></a>
-<span class="sourceLineNo">1324</span>    ClusterStatusProtos.ServerLoad.Builder serverLoad = ClusterStatusProtos.ServerLoad.newBuilder();<a name="line.1324"></a>
-<span class="sourceLineNo">1325</span>    serverLoad.setNumberOfRequests((int) regionServerWrapper.getRequestsPerSecond());<a name="line.1325"></a>
-<span class="sourceLineNo">1326</span>    serverLoad.setTotalNumberOfRequests(regionServerWrapper.getTotalRequestCount());<a name="line.1326"></a>
-<span class="sourceLineNo">1327</span>    serverLoad.setUsedHeapMB((int)(usedMemory / 1024 / 1024));<a name="line.1327"></a>
-<span class="sourceLineNo">1328</span>    serverLoad.setMaxHeapMB((int) (maxMemory / 1024 / 1024));<a name="line.1328"></a>
-<span class="sourceLineNo">1329</span>    Set&lt;String&gt; coprocessors = getWAL(null).getCoprocessorHost().getCoprocessors();<a name="line.1329"></a>
-<span class="sourceLineNo">1330</span>    Builder coprocessorBuilder = Coprocessor.newBuilder();<a name="line.1330"></a>
-<span class="sourceLineNo">1331</span>    for (String coprocessor : coprocessors) {<a name="line.1331"></a>
-<span class="sourceLineNo">1332</span>      serverLoad.addCoprocessors(coprocessorBuilder.setName(coprocessor).build());<a name="line.1332"></a>
-<span class="sourceLineNo">1333</span>    }<a name="line.1333"></a>
-<span class="sourceLineNo">1334</span>    RegionLoad.Builder regionLoadBldr = RegionLoad.newBuilder();<a name="line.1334"></a>
-<span class="sourceLineNo">1335</span>    RegionSpecifier.Builder regionSpecifier = RegionSpecifier.newBuilder();<a name="line.1335"></a>
-<span class="sourceLineNo">1336</span>    for (HRegion region : regions) {<a name="line.1336"></a>
-<span class="sourceLineNo">1337</span>      if (region.getCoprocessorHost() != null) {<a name="line.1337"></a>
-<span class="sourceLineNo">1338</span>        Set&lt;String&gt; regionCoprocessors = region.getCoprocessorHost().getCoprocessors();<a name="line.1338"></a>
-<span class="sourceLineNo">1339</span>        Iterator&lt;String&gt; iterator = regionCoprocessors.iterator();<a name="line.1339"></a>
-<span class="sourceLineNo">1340</span>        while (iterator.hasNext()) {<a name="line.1340"></a>
-<span class="sourceLineNo">1341</span>          serverLoad.addCoprocessors(coprocessorBuilder.setName(iterator.next()).build());<a name="line.1341"></a>
-<span class="sourceLineNo">1342</span>        }<a name="line.1342"></a>
-<span class="sourceLineNo">1343</span>      }<a name="line.1343"></a>
-<span class="sourceLineNo">1344</span>      serverLoad.addRegionLoads(createRegionLoad(region, regionLoadBldr, regionSpecifier));<a name="line.1344"></a>
-<span class="sourceLineNo">1345</span>      for (String coprocessor : getWAL(region.getRegionInfo()).getCoprocessorHost()<a name="line.1345"></a>
-<span class="sourceLineNo">1346</span>          .getCoprocessors()) {<a name="line.1346"></a>
-<span class="sourceLineNo">1347</span>        serverLoad.addCoprocessors(coprocessorBuilder.setName(coprocessor).build());<a name="line.1347"></a>
-<span class="sourceLineNo">1348</span>      }<a name="line.1348"></a>
-<span class="sourceLineNo">1349</span>    }<a name="line.1349"></a>
-<span class="sourceLineNo">1350</span>    serverLoad.setReportStartTime(reportStartTime);<a name="line.1350"></a>
-<span class="sourceLineNo">1351</span>    serverLoad.setReportEndTime(reportEndTime);<a name="line.1351"></a>
-<span class="sourceLineNo">1352</span>    if (this.infoServer != null) {<a name="line.1352"></a>
-<span class="sourceLineNo">1353</span>      serverLoad.setInfoServerPort(this.infoServer.getPort());<a name="line.1353"></a>
-<span class="sourceLineNo">1354</span>    } else {<a name="line.1354"></a>
-<span class="sourceLineNo">1355</span>      serverLoad.setInfoServerPort(-1);<a name="line.1355"></a>
-<span class="sourceLineNo">1356</span>    }<a name="line.1356"></a>
-<span class="sourceLineNo">1357</span><a name="line.1357"></a>
-<span class="sourceLineNo">1358</span>    // for the replicationLoad purpose. Only need to get from one executorService<a name="line.1358"></a>
-<span class="sourceLineNo">1359</span>    // either source or sink will get the same info<a name="line.1359"></a>
-<span class="sourceLineNo">1360</span>    ReplicationSourceService rsources = getReplicationSourceService();<a name="line.1360"></a>
-<span class="sourceLineNo">1361</span><a name="line.1361"></a>
-<span class="sourceLineNo">1362</span>    if (rsources != null) {<a name="line.1362"></a>
-<span class="sourceLineNo">1363</span>      // always refresh first to get the latest value<a name="line.1363"></a>
-<span class="sourceLineNo">1364</span>      ReplicationLoad rLoad = rsources.refreshAndGetReplicationLoad();<a name="line.1364"></a>
-<span class="sourceLineNo">1365</span>      if (rLoad != null) {<a name="line.1365"></a>
-<span class="sourceLineNo">1366</span>        serverLoad.setReplLoadSink(rLoad.getReplicationLoadSink());<a name="line.1366"></a>
-<span class="sourceLineNo">1367</span>        for (ClusterStatusProtos.ReplicationLoadSource rLS : rLoad.getReplicationLoadSourceList()) {<a name="line.1367"></a>
-<span class="sourceLineNo">1368</span>          serverLoad.addReplLoadSource(rLS);<a name="line.1368"></a>
-<span class="sourceLineNo">1369</span>        }<a name="line.1369"></a>
-<span class="sourceLineNo">1370</span>      }<a name="line.1370"></a>
-<span class="sourceLineNo">1371</span>    }<a name="line.1371"></a>
-<span class="sourceLineNo">1372</span><a name="line.1372"></a>
-<span class="sourceLineNo">1373</span>    return serverLoad.build();<a name="line.1373"></a>
-<span class="sourceLineNo">1374</span>  }<a name="line.1374"></a>
-<span class="sourceLineNo">1375</span><a name="line.1375"></a>
-<span class="sourceLineNo">1376</span>  String getOnlineRegionsAsPrintableString() {<a name="line.1376"></a>
-<span class="sourceLineNo">1377</span>    StringBuilder sb = new StringBuilder();<a name="line.1377"></a>
-<span class="sourceLineNo">1378</span>    for (Region r: this.onlineRegions.values()) {<a name="line.1378"></a>
-<span class="sourceLineNo">1379</span>      if (sb.length() &gt; 0) sb.append(", ");<a name="line.1379"></a>
-<span class="sourceLineNo">1380</span>      sb.append(r.getRegionInfo().getEncodedName());<a name="line.1380"></a>
-<span class="sourceLineNo">1381</span>    }<a name="line.1381"></a>
-<span class="sourceLineNo">1382</span>    return sb.toString();<a name="line.1382"></a>
-<span class="sourceLineNo">1383</span>  }<a name="line.1383"></a>
-<span class="sourceLineNo">1384</span><a name="line.1384"></a>
-<span class="sourceLineNo">1385</span>  /**<a name="line.1385"></a>
-<span class="sourceLineNo">1386</span>   * Wait on regions close.<a name="line.1386"></a>
-<span class="sourceLineNo">1387</span>   */<a name="line.1387"></a>
-<span class="sourceLineNo">1388</span>  private void waitOnAllRegionsToClose(final boolean abort) {<a name="line.1388"></a>
-<span class="sourceLineNo">1389</span>    // Wait till all regions are closed before going out.<a name="line.1389"></a>
-<span class="sourceLineNo">1390</span>    int lastCount = -1;<a name="line.1390"></a>
-<span class="sourceLineNo">1391</span>    long previousLogTime = 0;<a name="line.1391"></a>
-<span class="sourceLineNo">1392</span>    Set&lt;String&gt; closedRegions = new HashSet&lt;&gt;();<a name="line.1392"></a>
-<span class="sourceLineNo">1393</span>    boolean interrupted = false;<a name="line.1393"></a>
-<span class="sourceLineNo">1394</span>    try {<a name="line.1394"></a>
-<span class="sourceLineNo">1395</span>      while (!isOnlineRegionsEmpty()) {<a name="line.1395"></a>
-<span class="sourceLineNo">1396</span>        int count = getNumberOfOnlineRegions();<a name="line.1396"></a>
-<span class="sourceLineNo">1397</span>        // Only print a message if the count of regions has changed.<a name="line.1397"></a>
-<span class="sourceLineNo">1398</span>        if (count != lastCount) {<a name="line.1398"></a>
-<span class="sourceLineNo">1399</span>          // Log every second at most<a name="line.1399"></a>
-<span class="sourceLineNo">1400</span>          if (System.currentTimeMillis() &gt; (previousLogTime + 1000)) {<a name="line.1400"></a>
-<span class="sourceLineNo">1401</span>            previousLogTime = System.currentTimeMillis();<a name="line.1401"></a>
-<span class="sourceLineNo">1402</span>            lastCount = count;<a name="line.1402"></a>
-<span class="sourceLineNo">1403</span>            LOG.info("Waiting on " + count + " regions to close");<a name="line.1403"></a>
-<span class="sourceLineNo">1404</span>            // Only print out regions still closing if a small number else will<a name="line.1404"></a>
-<span class="sourceLineNo">1405</span>            // swamp the log.<a name="line.1405"></a>
-<span class="sourceLineNo">1406</span>            if (count &lt; 10 &amp;&amp; LOG.isDebugEnabled()) {<a name="line.1406"></a>
-<span class="sourceLineNo">1407</span>              LOG.debug("Online Regions=" + this.onlineRegions);<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>        }<a name="line.1410"></a>
-<span class="sourceLineNo">1411</span>        // Ensure all user regions have been sent a close. Use this to<a name="line.1411"></a>
-<span class="sourceLineNo">1412</span>        // protect against the case where an open comes in after we start the<a name="line.1412"></a>
-<span class="sourceLineNo">1413</span>        // iterator of onlineRegions to close all user regions.<a name="line.1413"></a>
-<span class="sourceLineNo">1414</span>        for (Map.Entry&lt;String, HRegion&gt; e : this.onlineRegions.entrySet()) {<a name="line.1414"></a>
-<span class="sourceLineNo">1415</span>          RegionInfo hri = e.getValue().getRegionInfo();<a name="line.1415"></a>
-<span class="sourceLineNo">1416</span>          if (!this.regionsInTransitionInRS.containsKey(hri.getEncodedNameAsBytes()) &amp;&amp;<a name="line.1416"></a>
-<span class="sourceLineNo">1417</span>              !closedRegions.contains(hri.getEncodedName())) {<a name="line.1417"></a>
-<span class="sourceLineNo">1418</span>            closedRegions.add(hri.getEncodedName());<a name="line.1418"></a>
-<span class="sourceLineNo">1419</span>            // Don't update zk with this close transition; pass false.<a name="line.1419"></a>
-<span class="sourceLineNo">1420</span>            closeRegionIgnoreErrors(hri, abort);<a name="line.1420"></a>
-<span class="sourceLineNo">1421</span>          }<a name="line.1421"></a>
-<span class="sourceLineNo">1422</span>        }<a name="line.1422"></a>
-<span class="sourceLineNo">1423</span>        // No regions in RIT, we could stop waiting now.<a name="line.1423"></a>
-<span class="sourceLineNo">1424</span>        if (this.regionsInTransitionInRS.isEmpty()) {<a name="line.1424"></a>
-<span class="sourceLineNo">1425</span>          if (!isOnlineRegionsEmpty()) {<a name="line.1425"></a>
-<span class="sourceLineNo">1426</span>            LOG.info("We were exiting though online regions are not empty," +<a name="line.1426"></a>
-<span class="sourceLineNo">1427</span>                " because some regions failed closing");<a name="line.1427"></a>
-<span class="sourceLineNo">1428</span>          }<a name="line.1428"></a>
-<span class="sourceLineNo">1429</span>          break;<a name="line.1429"></a>
-<span class="sourceLineNo">1430</span>        }<a name="line.1430"></a>
-<span class="sourceLineNo">1431</span>        if (sleep(200)) {<a name="line.1431"></a>
-<span class="sourceLineNo">1432</span>          interrupted = true;<a name="line.1432"></a>
-<span class="sourceLineNo">1433</span>        }<a name="line.1433"></a>
-<span class="sourceLineNo">1434</span>      }<a name="line.1434"></a>
-<span class="sourceLineNo">1435</span>    } finally {<a name="line.1435"></a>
-<span class="sourceLineNo">1436</span>      if (interrupted) {<a name="line.1436"></a>
-<span class="sourceLineNo">1437</span>        Thread.currentThread().interrupt();<a name="line.1437"></a>
-<span class="sourceLineNo">1438</span>      }<a name="line.1438"></a>
-<span class="sourceLineNo">1439</span>    }<a name="line.1439"></a>
-<span class="sourceLineNo">1440</span>  }<a name="line.1440"></a>
-<span class="sourceLineNo">1441</span><a name="line.1441"></a>
-<span class="sourceLineNo">1442</span>  private boolean sleep(long millis) {<a name="line.1442"></a>
-<span class="sourceLineNo">1443</span>    boolean interrupted = false;<a name="line.1443"></a>
-<span class="sourceLineNo">1444</span>    try {<a name="line.1444"></a>
-<span class="sourceLineNo">1445</span>      Thread.sleep(millis);<a name="line.1445"></a>
-<span class="sourceLineNo">1446</span>    } catch (InterruptedException e) {<a name="line.1446"></a>
-<span class="sourceLineNo">1447</span>      LOG.warn("Interrupted while sleeping");<a name="line.1447"></a>
-<span class="sourceLineNo">1448</span>      interrupted = true;<a name="line.1448"></a>
-<span class="sourceLineNo">1449</span>    }<a name="line.1449"></a>
-<span class="sourceLineNo">1450</span>    return interrupted;<a name="line.1450"></a>
-<span class="sourceLineNo">1451</span>  }<a name="line.1451"></a>
-<span class="sourceLineNo">1452</span><a name="line.1452"></a>
-<span class="sourceLineNo">1453</span>  private void shutdownWAL(final boolean close) {<a name="line.1453"></a>
-<span class="sourceLineNo">1454</span>    if (this.walFactory != null) {<a name="line.1454"></a>
-<span class="sourceLineNo">1455</span>      try {<a name="line.1455"></a>
-<span class="sourceLineNo">1456</span>        if (close) {<a name="line.1456"></a>
-<span class="sourceLineNo">1457</span>          walFactory.close();<a name="line.1457"></a>
-<span class="sourceLineNo">1458</span>        } else {<a name="line.1458"></a>
-<span class="sourceLineNo">1459</span>          walFactory.shutdown();<a name="line.1459"></a>
-<span class="sourceLineNo">1460</span>        }<a name="line.1460"></a>
-<span class="sourceLineNo">1461</span>      } catch (Throwable e) {<a name="line.1461"></a>
-<span class="sourceLineNo">1462</span>        e = e instanceof RemoteException ? ((RemoteException) e).unwrapRemoteException() : e;<a name="line.1462"></a>
-<span class="sourceLineNo">1463</span>        LOG.error("Shutdown / close of WAL failed: " + e);<a name="line.1463"></a>
-<span class="sourceLineNo">1464</span>        LOG.debug("Shutdown / close exception details:", e);<a name="line.1464"></a>
-<span class="sourceLineNo">1465</span>      }<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>   * Run init. Sets up wal and starts up all server threads.<a name="line.1470"></a>
-<span class="sourceLineNo">1471</span>   *<a name="line.1471"></a>
-<span class="sourceLineNo">1472</span>   * @param c Extra configuration.<a name="line.1472"></a>
-<span class="sourceLineNo">1473</span>   */<a name="line.1473"></a>
-<span class="sourceLineNo">1474</span>  protected void handleReportForDutyResponse(final RegionServerStartupResponse c)<a name="line.1474"></a>
-<span class="sourceLineNo">1475</span>  throws IOException {<a name="line.1475"></a>
-<span class="sourceLineNo">1476</span>    try {<a name="line.1476"></a>
-<span class="sourceLineNo">1477</span>      boolean updateRootDir = false;<a name="line.1477"></a>
-<span class="sourceLineNo">1478</span>      for (NameStringPair e : c.getMapEntriesList()) {<a name="line.1478"></a>
-<span class="sourceLineNo">1479</span>        String key = e.getName();<a name="line.1479"></a>
-<span class="sourceLineNo">1480</span>        // The hostname the master sees us as.<a name="line.1480"></a>
-<span class="sourceLineNo">1481</span>        if (key.equals(HConstants.KEY_FOR_HOSTNAME_SEEN_BY_MASTER)) {<a name="line.1481"></a>
-<span class="sourceLineNo">1482</span>          String hostnameFromMasterPOV = e.getValue();<a name="line.1482"></a>
-<span class="sourceLineNo">1483</span>          this.serverName = ServerName.valueOf(hostnameFromMasterPOV, rpcServices.isa.getPort(),<a name="line.1483"></a>
-<span class="sourceLineNo">1484</span>              this.startcode);<a name="line.1484"></a>
-<span class="sourceLineNo">1485</span>          if (!StringUtils.isBlank(useThisHostnameInstead) &amp;&amp;<a name="line.1485"></a>
-<span class="sourceLineNo">1486</span>              !hostnameFromMasterPOV.equals(useThisHostnameInstead)) {<a name="line.1486"></a>
-<span class="sourceLineNo">1487</span>            String msg = "Master passed us a different hostname to use; was=" +<a name="line.1487"></a>
-<span class="sourceLineNo">1488</span>                this.useThisHostnameInstead + ", but now=" + hostnameFromMasterPOV;<a name="line.1488"></a>
-<span class="sourceLineNo">1489</span>            LOG.error(msg);<a name="line.1489"></a>
-<span class="sourceLineNo">1490</span>            throw new IOException(msg);<a name="line.1490"></a>
-<span class="sourceLineNo">1491</span>          }<a name="line.1491"></a>
-<span class="sourceLineNo">1492</span>          if (StringUtils.isBlank(useThisHostnameInstead) &amp;&amp;<a name="line.1492"></a>
-<span class="sourceLineNo">1493</span>              !hostnameFromMasterPOV.equals(rpcServices.isa.getHostName())) {<a name="line.1493"></a>
-<span class="sourceLineNo">1494</span>            String msg = "Master passed us a different hostname to use; was=" +<a name="line.1494"></a>
-<span class="sourceLineNo">1495</span>                rpcServices.isa.getHostName() + ", but now=" + hostnameFromMasterPOV;<a name="line.1495"></a>
-<span class="sourceLineNo">1496</span>            LOG.error(msg);<a name="line.1496"></a>
-<span class="sourceLineNo">1497</span>          }<a name="line.1497"></a>
-<span class="sourceLineNo">1498</span>          continue;<a name="line.1498"></a>
-<span class="sourceLineNo">1499</span>        }<a name="line.1499"></a>
-<span class="sourceLineNo">1500</span><a name="line.1500"></a>
-<span class="sourceLineNo">1501</span>        String value = e.getValue();<a name="line.1501"></a>
-<span class="sourceLineNo">1502</span>        if (key.equals(HConstants.HBASE_DIR)) {<a name="line.1502"></a>
-<span class="sourceLineNo">1503</span>          if (value != null &amp;&amp; !value.equals(conf.get(HConstants.HBASE_DIR))) {<a name="line.1503"></a>
-<span class="sourceLineNo">1504</span>            updateRootDir = true;<a name="line.1504"></a>
-<span class="sourceLineNo">1505</span>          }<a name="line.1505"></a>
-<span class="sourceLineNo">1506</span>        }<a name="line.1506"></a>
-<span class="sourceLineNo">1507</span><a name="line.1507"></a>
-<span class="sourceLineNo">1508</span>        if (LOG.isDebugEnabled()) {<a name="line.1508"></a>
-<span class="sourceLineNo">1509</span>          LOG.debug("Config from master: " + key + "=" + value);<a name="line.1509"></a>
-<span class="sourceLineNo">1510</span>        }<a name="line.1510"></a>
-<span class="sourceLineNo">1511</span>        this.conf.set(key, value);<a name="line.1511"></a>
-<span class="sourceLineNo">1512</span>      }<a name="line.1512"></a>
-<span class="sourceLineNo">1513</span>      // Set our ephemeral znode up in zookeeper now we have a name.<a name="line.1513"></a>
-<span class="sourceLineNo">1514</span>      createMyEphemeralNode();<a name="line.1514"></a>
-<span class="sourceLineNo">1515</span><a name="line.1515"></a>
-<span class="sourceLineNo">1516</span>      if (updateRootDir) {<a name="line.1516"></a>
-<span class="sourceLineNo">1517</span>        // initialize file system by the config fs.defaultFS and hbase.rootdir from master<a name="line.1517"></a>
-<span class="sourceLineNo">1518</span>        initializeFileSystem();<a name="line.1518"></a>
-<span class="sourceLineNo">1519</span>      }<a name="line.1519"></a>
-<span class="sourceLineNo">1520</span><a name="line.1520"></a>
-<span class="sourceLineNo">1521</span>      // hack! Maps DFSClient =&gt; RegionServer for logs.  HDFS made this<a name="line.1521"></a>
-<span class="sourceLineNo">1522</span>      // config param for task trackers, but we can piggyback off of it.<a name="line.1522"></a>
-<span class="sourceLineNo">1523</span>      if (this.conf.get("mapreduce.task.attempt.id") == null) {<a name="line.1523"></a>
-<span class="sourceLineNo">1524</span>        this.conf.set("mapreduce.task.attempt.id", "hb_rs_" + this.serverName.toString());<a name="line.1524"></a>
-<span class="sourceLineNo">1525</span>      }<a name="line.1525"></a>
-<span class="sourceLineNo">1526</span><a name="line.1526"></a>
-<span class="sourceLineNo">1527</span>      // Save it in a file, this will allow to see if we crash<a name="line.1527"></a>
-<span class="sourceLineNo">1528</span>      ZNodeClearer.writeMyEphemeralNodeOnDisk(getMyEphemeralNodePath());<a name="line.1528"></a>
-<span class="sourceLineNo">1529</span><a name="line.1529"></a>
-<span class="sourceLineNo">1530</span>      // This call sets up an initialized replication and WAL. Later we start it up.<a name="line.1530"></a>
-<span class="sourceLineNo">1531</span>      setupWALAndReplication();<a name="line.1531"></a>
-<span class="sourceLineNo">1532</span>      // Init in here rather than in constructor after thread name has been set<a name="line.1532"></a>
-<span class="sourceLineNo">1533</span>      this.metricsTable = new MetricsTable(new MetricsTableWrapperAggregateImpl(this));<a name="line.1533"></a>
-<span class="sourceLineNo">1534</span>      this.metricsRegionServer = new MetricsRegionServer(<a name="line.1534"></a>
-<span class="sourceLineNo">1535</span>          new MetricsRegionServerWrapperImpl(this), conf, metricsTable);<a name="line.1535"></a>
-<span class="sourceLineNo">1536</span>      // Now that we have a metrics source, start the pause monitor<a name="line.1536"></a>
-<span class="sourceLineNo">1537</span>      this.pauseMonitor = new JvmPauseMonitor(conf, getMetrics().getMetricsSource());<a name="line.1537"></a>
-<span class="sourceLineNo">1538</span>      pauseMonitor.start();<a name="line.1538"></a>
-<span class="sourceLineNo">1539</span><a name="line.1539"></a>
-<span class="sourceLineNo">1540</span>      // There is a rare case where we do NOT want services to start. Check config.<a name="line.1540"></a>
-<span class="sourceLineNo">1541</span>      if (getConfiguration().getBoolean("hbase.regionserver.workers", true)) {<a name="line.1541"></a>
-<span class="sourceLineNo">1542</span>        startServices();<a name="line.1542"></a>
-<span class="sourceLineNo">1543</span>      }<a name="line.1543"></a>
-<span class="sourceLineNo">1544</span>      // In here we start up the replication Service. Above we initialized it. TODO. Reconcile.<a name="line.1544"></a>
-<span class="sourceLineNo">1545</span>      // or make sense of it.<a name="line.1545"></a>
-<span class="sourceLineNo">1546</span>      startReplicationService();<a name="line.1546"></a>
-<span class="sourceLineNo">1547</span><a name="line.1547"></a>
+<span class="sourceLineNo">951</span>      LOG.debug("About to register with Master.");<a name="line.951"></a>
+<span class="sourceLineNo">952</span>      RetryCounterFactory rcf = new RetryCounterFactory(Integer.MAX_VALUE,<a name="line.952"></a>
+<span class="sourceLineNo">953</span>          this.sleeper.getPeriod(), 1000 * 60 * 5);<a name="line.953"></a>
+<span class="sourceLineNo">954</span>      RetryCounter rc = rcf.create();<a name="line.954"></a>
+<span class="sourceLineNo">955</span>      while (keepLooping()) {<a name="line.955"></a>
+<span class="sourceLineNo">956</span>        RegionServerStartupResponse w = reportForDuty();<a name="line.956"></a>
+<span class="sourceLineNo">957</span>        if (w == null) {<a name="line.957"></a>
+<span class="sourceLineNo">958</span>          long sleepTime = rc.getBackoffTimeAndIncrementAttempts();<a name="line.958"></a>
+<span class="sourceLineNo">959</span>          LOG.warn("reportForDuty failed; sleeping {} ms and then retrying.", sleepTime);<a name="line.959"></a>
+<span class="sourceLineNo">960</span>          this.sleeper.sleep(sleepTime);<a name="line.960"></a>
+<span class="sourceLineNo">961</span>        } else {<a name="line.961"></a>
+<span class="sourceLineNo">962</span>          handleReportForDutyResponse(w);<a name="line.962"></a>
+<span class="sourceLineNo">963</span>          break;<a name="line.963"></a>
+<span class="sourceLineNo">964</span>        }<a name="line.964"></a>
+<span class="sourceLineNo">965</span>      }<a name="line.965"></a>
+<span class="sourceLineNo">966</span><a name="line.966"></a>
+<span class="sourceLineNo">967</span>      if (!isStopped() &amp;&amp; isHealthy()) {<a name="line.967"></a>
+<span class="sourceLineNo">968</span>        // start the snapshot handler and other procedure handlers,<a name="line.968"></a>
+<span class="sourceLineNo">969</span>        // since the server is ready to run<a name="line.969"></a>
+<span class="sourceLineNo">970</span>        if (this.rspmHost != null) {<a name="line.970"></a>
+<span class="sourceLineNo">971</span>          this.rspmHost.start();<a name="line.971"></a>
+<span class="sourceLineNo">972</span>        }<a name="line.972"></a>
+<span class="sourceLineNo">973</span>        // Start the Quota Manager<a name="line.973"></a>
+<span class="sourceLineNo">974</span>        if (this.rsQuotaManager != null) {<a name="line.974"></a>
+<span class="sourceLineNo">975</span>          rsQuotaManager.start(getRpcServer().getScheduler());<a name="line.975"></a>
+<span class="sourceLineNo">976</span>        }<a name="line.976"></a>
+<span class="sourceLineNo">977</span>        if (this.rsSpaceQuotaManager != null) {<a name="line.977"></a>
+<span class="sourceLineNo">978</span>          this.rsSpaceQuotaManager.start();<a name="line.978"></a>
+<span class="sourceLineNo">979</span>        }<a name="line.979"></a>
+<span class="sourceLineNo">980</span>      }<a name="line.980"></a>
+<span class="sourceLineNo">981</span><a name="line.981"></a>
+<span class="sourceLineNo">982</span>      // We registered with the Master.  Go into run mode.<a name="line.982"></a>
+<span class="sourceLineNo">983</span>      long lastMsg = System.currentTimeMillis();<a name="line.983"></a>
+<span class="sourceLineNo">984</span>      long oldRequestCount = -1;<a name="line.984"></a>
+<span class="sourceLineNo">985</span>      // The main run loop.<a name="line.985"></a>
+<span class="sourceLineNo">986</span>      while (!isStopped() &amp;&amp; isHealthy()) {<a name="line.986"></a>
+<span class="sourceLineNo">987</span>        if (!isClusterUp()) {<a name="line.987"></a>
+<span class="sourceLineNo">988</span>          if (isOnlineRegionsEmpty()) {<a name="line.988"></a>
+<span class="sourceLineNo">989</span>            stop("Exiting; cluster shutdown set and not carrying any regions");<a name="line.989"></a>
+<span class="sourceLineNo">990</span>          } else if (!this.stopping) {<a name="line.990"></a>
+<span class="sourceLineNo">991</span>            this.stopping = true;<a name="line.991"></a>
+<span class="sourceLineNo">992</span>            LOG.info("Closing user regions");<a name="line.992"></a>
+<span class="sourceLineNo">993</span>            closeUserRegions(this.abortRequested);<a name="line.993"></a>
+<span class="sourceLineNo">994</span>          } else if (this.stopping) {<a name="line.994"></a>
+<span class="sourceLineNo">995</span>            boolean allUserRegionsOffline = areAllUserRegionsOffline();<a name="line.995"></a>
+<span class="sourceLineNo">996</span>            if (allUserRegionsOffline) {<a name="line.996"></a>
+<span class="sourceLineNo">997</span>              // Set stopped if no more write requests tp meta tables<a name="line.997"></a>
+<span class="sourceLineNo">998</span>              // since last time we went around the loop.  Any open<a name="line.998"></a>
+<span class="sourceLineNo">999</span>              // meta regions will be closed on our way out.<a name="line.999"></a>
+<span class="sourceLineNo">1000</span>              if (oldRequestCount == getWriteRequestCount()) {<a name="line.1000"></a>
+<span class="sourceLineNo">1001</span>                stop("Stopped; only catalog regions remaining online");<a name="line.1001"></a>
+<span class="sourceLineNo">1002</span>                break;<a name="line.1002"></a>
+<span class="sourceLineNo">1003</span>              }<a name="line.1003"></a>
+<span class="sourceLineNo">1004</span>              oldRequestCount = getWriteRequestCount();<a name="line.1004"></a>
+<span class="sourceLineNo">1005</span>            } else {<a name="line.1005"></a>
+<span class="sourceLineNo">1006</span>              // Make sure all regions have been closed -- some regions may<a name="line.1006"></a>
+<span class="sourceLineNo">1007</span>              // have not got it because we were splitting at the time of<a name="line.1007"></a>
+<span class="sourceLineNo">1008</span>              // the call to closeUserRegions.<a name="line.1008"></a>
+<span class="sourceLineNo">1009</span>              closeUserRegions(this.abortRequested);<a name="line.1009"></a>
+<span class="sourceLineNo">1010</span>            }<a name="line.1010"></a>
+<span class="sourceLineNo">1011</span>            LOG.debug("Waiting on " + getOnlineRegionsAsPrintableString());<a name="line.1011"></a>
+<span class="sourceLineNo">1012</span>          }<a name="line.1012"></a>
+<span class="sourceLineNo">1013</span>        }<a name="line.1013"></a>
+<span class="sourceLineNo">1014</span>        long now = System.currentTimeMillis();<a name="line.1014"></a>
+<span class="sourceLineNo">1015</span>        if ((now - lastMsg) &gt;= msgInterval) {<a name="line.1015"></a>
+<span class="sourceLineNo">1016</span>          tryRegionServerReport(lastMsg, now);<a name="line.1016"></a>
+<span class="sourceLineNo">1017</span>          lastMsg = System.currentTimeMillis();<a name="line.1017"></a>
+<span class="sourceLineNo">1018</span>        }<a name="line.1018"></a>
+<span class="sourceLineNo">1019</span>        if (!isStopped() &amp;&amp; !isAborted()) {<a name="line.1019"></a>
+<span class="sourceLineNo">1020</span>          this.sleeper.sleep();<a name="line.1020"></a>
+<span class="sourceLineNo">1021</span>        }<a name="line.1021"></a>
+<span class="sourceLineNo">1022</span>      } // for<a name="line.1022"></a>
+<span class="sourceLineNo">1023</span>    } catch (Throwable t) {<a name="line.1023"></a>
+<span class="sourceLineNo">1024</span>      if (!rpcServices.checkOOME(t)) {<a name="line.1024"></a>
+<span class="sourceLineNo">1025</span>        String prefix = t instanceof YouAreDeadException? "": "Unhandled: ";<a name="line.1025"></a>
+<span class="sourceLineNo">1026</span>        abort(prefix + t.getMessage(), t);<a name="line.1026"></a>
+<span class="sourceLineNo">1027</span>      }<a name="line.1027"></a>
+<span class="sourceLineNo">1028</span>    }<a name="line.1028"></a>
+<span class="sourceLineNo">1029</span>    if (this.leases != null) {<a name="line.1029"></a>
+<span class="sourceLineNo">1030</span>      this.leases.closeAfterLeasesExpire();<a name="line.1030"></a>
+<span class="sourceLineNo">1031</span>    }<a name="line.1031"></a>
+<span class="sourceLineNo">1032</span>    if (this.splitLogWorker != null) {<a name="line.1032"></a>
+<span class="sourceLineNo">1033</span>      splitLogWorker.stop();<a name="line.1033"></a>
+<span class="sourceLineNo">1034</span>    }<a name="line.1034"></a>
+<span class="sourceLineNo">1035</span>    if (this.infoServer != null) {<a name="line.1035"></a>
+<span class="sourceLineNo">1036</span>      LOG.info("Stopping infoServer");<a name="line.1036"></a>
+<span class="sourceLineNo">1037</span>      try {<a name="line.1037"></a>
+<span class="sourceLineNo">1038</span>        this.infoServer.stop();<a name="line.1038"></a>
+<span class="sourceLineNo">1039</span>      } catch (Exception e) {<a name="line.1039"></a>
+<span class="sourceLineNo">1040</span>        LOG.error("Failed to stop infoServer", e);<a name="line.1040"></a>
+<span class="sourceLineNo">1041</span>      }<a name="line.1041"></a>
+<span class="sourceLineNo">1042</span>    }<a name="line.1042"></a>
+<span class="sourceLineNo">1043</span>    // Send cache a shutdown.<a name="line.1043"></a>
+<span class="sourceLineNo">1044</span>    if (cacheConfig != null &amp;&amp; cacheConfig.isBlockCacheEnabled()) {<a name="line.1044"></a>
+<span class="sourceLineNo">1045</span>      cacheConfig.getBlockCache().shutdown();<a name="line.1045"></a>
+<span class="sourceLineNo">1046</span>    }<a name="line.1046"></a>
+<span class="sourceLineNo">1047</span>    mobCacheConfig.getMobFileCache().shutdown();<a name="line.1047"></a>
+<span class="sourceLineNo">1048</span><a name="line.1048"></a>
+<span class="sourceLineNo">1049</span>    if (movedRegionsCleaner != null) {<a name="line.1049"></a>
+<span class="sourceLineNo">1050</span>      movedRegionsCleaner.stop("Region Server stopping");<a name="line.1050"></a>
+<span class="sourceLineNo">1051</span>    }<a name="line.1051"></a>
+<span class="sourceLineNo">1052</span><a name="line.1052"></a>
+<span class="sourceLineNo">1053</span>    // Send interrupts to wake up threads if sleeping so they notice shutdown.<a name="line.1053"></a>
+<span class="sourceLineNo">1054</span>    // TODO: Should we check they are alive? If OOME could have exited already<a name="line.1054"></a>
+<span class="sourceLineNo">1055</span>    if (this.hMemManager != null) this.hMemManager.stop();<a name="line.1055"></a>
+<span class="sourceLineNo">1056</span>    if (this.cacheFlusher != null) this.cacheFlusher.interruptIfNecessary();<a name="line.1056"></a>
+<span class="sourceLineNo">1057</span>    if (this.compactSplitThread != null) this.compactSplitThread.interruptIfNecessary();<a name="line.1057"></a>
+<span class="sourceLineNo">1058</span>    sendShutdownInterrupt();<a name="line.1058"></a>
+<span class="sourceLineNo">1059</span><a name="line.1059"></a>
+<span class="sourceLineNo">1060</span>    // Stop the snapshot and other procedure handlers, forcefully killing all running tasks<a name="line.1060"></a>
+<span class="sourceLineNo">1061</span>    if (rspmHost != null) {<a name="line.1061"></a>
+<span class="sourceLineNo">1062</span>      rspmHost.stop(this.abortRequested || this.killed);<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>    if (this.killed) {<a name="line.1065"></a>
+<span class="sourceLineNo">1066</span>      // Just skip out w/o closing regions.  Used when testing.<a name="line.1066"></a>
+<span class="sourceLineNo">1067</span>    } else if (abortRequested) {<a name="line.1067"></a>
+<span class="sourceLineNo">1068</span>      if (this.fsOk) {<a name="line.1068"></a>
+<span class="sourceLineNo">1069</span>        closeUserRegions(abortRequested); // Don't leave any open file handles<a name="line.1069"></a>
+<span class="sourceLineNo">1070</span>      }<a name="line.1070"></a>
+<span class="sourceLineNo">1071</span>      LOG.info("aborting server " + this.serverName);<a name="line.1071"></a>
+<span class="sourceLineNo">1072</span>    } else {<a name="line.1072"></a>
+<span class="sourceLineNo">1073</span>      closeUserRegions(abortRequested);<a name="line.1073"></a>
+<span class="sourceLineNo">1074</span>      LOG.info("stopping server " + this.serverName);<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>    // so callers waiting for meta without timeout can stop<a name="line.1077"></a>
+<span class="sourceLineNo">1078</span>    if (this.metaTableLocator != null) this.metaTableLocator.stop();<a name="line.1078"></a>
+<span class="sourceLineNo">1079</span>    if (this.clusterConnection != null &amp;&amp; !clusterConnection.isClosed()) {<a name="line.1079"></a>
+<span class="sourceLineNo">1080</span>      try {<a name="line.1080"></a>
+<span class="sourceLineNo">1081</span>        this.clusterConnection.close();<a name="line.1081"></a>
+<span class="sourceLineNo">1082</span>      } catch (IOException e) {<a name="line.1082"></a>
+<span class="sourceLineNo">1083</span>        // Although the {@link Closeable} interface throws an {@link<a name="line.1083"></a>
+<span class="sourceLineNo">1084</span>        // IOException}, in reality, the implementation would never do that.<a name="line.1084"></a>
+<span class="sourceLineNo">1085</span>        LOG.warn("Attempt to close server's short circuit ClusterConnection failed.", e);<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>    // Closing the compactSplit thread before closing meta regions<a name="line.1089"></a>
+<span class="sourceLineNo">1090</span>    if (!this.killed &amp;&amp; containsMetaTableRegions()) {<a name="line.1090"></a>
+<span class="sourceLineNo">1091</span>      if (!abortRequested || this.fsOk) {<a name="line.1091"></a>
+<span class="sourceLineNo">1092</span>        if (this.compactSplitThread != null) {<a name="line.1092"></a>
+<span class="sourceLineNo">1093</span>          this.compactSplitThread.join();<a name="line.1093"></a>
+<span class="sourceLineNo">1094</span>          this.compactSplitThread = null;<a name="line.1094"></a>
+<span class="sourceLineNo">1095</span>        }<a name="line.1095"></a>
+<span class="sourceLineNo">1096</span>        closeMetaTableRegions(abortRequested);<a name="line.1096"></a>
+<span class="sourceLineNo">1097</span>      }<a name="line.1097"></a>
+<span class="sourceLineNo">1098</span>    }<a name="line.1098"></a>
+<span class="sourceLineNo">1099</span><a name="line.1099"></a>
+<span class="sourceLineNo">1100</span>    if (!this.killed &amp;&amp; this.fsOk) {<a name="line.1100"></a>
+<span class="sourceLineNo">1101</span>      waitOnAllRegionsToClose(abortRequested);<a name="line.1101"></a>
+<span class="sourceLineNo">1102</span>      LOG.info("stopping server " + this.serverName + "; all regions closed.");<a name="line.1102"></a>
+<span class="sourceLineNo">1103</span>    }<a name="line.1103"></a>
+<span class="sourceLineNo">1104</span><a name="line.1104"></a>
+<span class="sourceLineNo">1105</span>    // Stop the quota manager<a name="line.1105"></a>
+<span class="sourceLineNo">1106</span>    if (rsQuotaManager != null) {<a name="line.1106"></a>
+<span class="sourceLineNo">1107</span>      rsQuotaManager.stop();<a name="line.1107"></a>
+<span class="sourceLineNo">1108</span>    }<a name="line.1108"></a>
+<span class="sourceLineNo">1109</span>    if (rsSpaceQuotaManager != null) {<a name="line.1109"></a>
+<span class="sourceLineNo">1110</span>      rsSpaceQuotaManager.stop();<a name="line.1110"></a>
+<span class="sourceLineNo">1111</span>      rsSpaceQuotaManager = null;<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>    //fsOk flag may be changed when closing regions throws exception.<a name="line.1114"></a>
+<span class="sourceLineNo">1115</span>    if (this.fsOk) {<a name="line.1115"></a>
+<span class="sourceLineNo">1116</span>      shutdownWAL(!abortRequested);<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>    // Make sure the proxy is down.<a name="line.1119"></a>
+<span class="sourceLineNo">1120</span>    if (this.rssStub != null) {<a name="line.1120"></a>
+<span class="sourceLineNo">1121</span>      this.rssStub = null;<a name="line.1121"></a>
+<span class="sourceLineNo">1122</span>    }<a name="line.1122"></a>
+<span class="sourceLineNo">1123</span>    if (this.lockStub != null) {<a name="line.1123"></a>
+<span class="sourceLineNo">1124</span>      this.lockStub = null;<a name="line.1124"></a>
+<span class="sourceLineNo">1125</span>    }<a name="line.1125"></a>
+<span class="sourceLineNo">1126</span>    if (this.rpcClient != null) {<a name="line.1126"></a>
+<span class="sourceLineNo">1127</span>      this.rpcClient.close();<a name="line.1127"></a>
+<span class="sourceLineNo">1128</span>    }<a name="line.1128"></a>
+<span class="sourceLineNo">1129</span>    if (this.leases != null) {<a name="line.1129"></a>
+<span class="sourceLineNo">1130</span>      this.leases.close();<a name="line.1130"></a>
+<span class="sourceLineNo">1131</span>    }<a name="line.1131"></a>
+<span class="sourceLineNo">1132</span>    if (this.pauseMonitor != null) {<a name="line.1132"></a>
+<span class="sourceLineNo">1133</span>      this.pauseMonitor.stop();<a name="line.1133"></a>
+<span class="sourceLineNo">1134</span>    }<a name="line.1134"></a>
+<span class="sourceLineNo">1135</span><a name="line.1135"></a>
+<span class="sourceLineNo">1136</span>    if (!killed) {<a name="line.1136"></a>
+<span class="sourceLineNo">1137</span>      stopServiceThreads();<a name="line.1137"></a>
+<span class="sourceLineNo">1138</span>    }<a name="line.1138"></a>
+<span class="sourceLineNo">1139</span><a name="line.1139"></a>
+<span class="sourceLineNo">1140</span>    if (this.rpcServices != null) {<a name="line.1140"></a>
+<span class="sourceLineNo">1141</span>      this.rpcServices.stop();<a name="line.1141"></a>
+<span class="sourceLineNo">1142</span>    }<a name="line.1142"></a>
+<span class="sourceLineNo">1143</span><a name="line.1143"></a>
+<span class="sourceLineNo">1144</span>    try {<a name="line.1144"></a>
+<span class="sourceLineNo">1145</span>      deleteMyEphemeralNode();<a name="line.1145"></a>
+<span class="sourceLineNo">1146</span>    } catch (KeeperException.NoNodeException nn) {<a name="line.1146"></a>
+<span class="sourceLineNo">1147</span>    } catch (KeeperException e) {<a name="line.1147"></a>
+<span class="sourceLineNo">1148</span>      LOG.warn("Failed deleting my ephemeral node", e);<a name="line.1148"></a>
+<span class="sourceLineNo">1149</span>    }<a name="line.1149"></a>
+<span class="sourceLineNo">1150</span>    // We may have failed to delete the znode at the previous step, but<a name="line.1150"></a>
+<span class="sourceLineNo">1151</span>    //  we delete the file anyway: a second attempt to delete the znode is likely to fail again.<a name="line.1151"></a>
+<span class="sourceLineNo">1152</span>    ZNodeClearer.deleteMyEphemeralNodeOnDisk();<a name="line.1152"></a>
+<span class="sourceLineNo">1153</span><a name="line.1153"></a>
+<span class="sourceLineNo">1154</span>    if (this.zooKeeper != null) {<a name="line.1154"></a>
+<span class="sourceLineNo">1155</span>      this.zooKeeper.close();<a name="line.1155"></a>
+<span class="sourceLineNo">1156</span>    }<a name="line.1156"></a>
+<span class="sourceLineNo">1157</span>    this.shutDown = true;<a name="line.1157"></a>
+<span class="sourceLineNo">1158</span>    LOG.info("Exiting; stopping=" + this.serverName + "; zookeeper connection closed.");<a name="line.1158"></a>
+<span class="sourceLineNo">1159</span>  }<a name="line.1159"></a>
+<span class="sourceLineNo">1160</span><a name="line.1160"></a>
+<span class="sourceLineNo">1161</span>  private boolean containsMetaTableRegions() {<a name="line.1161"></a>
+<span class="sourceLineNo">1162</span>    return onlineRegions.containsKey(RegionInfoBuilder.FIRST_META_REGIONINFO.getEncodedName());<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>  private boolean areAllUserRegionsOffline() {<a name="line.1165"></a>
+<span class="sourceLineNo">1166</span>    if (getNumberOfOnlineRegions() &gt; 2) return false;<a name="line.1166"></a>
+<span class="sourceLineNo">1167</span>    boolean allUserRegionsOffline = true;<a name="line.1167"></a>
+<span class="sourceLineNo">1168</span>    for (Map.Entry&lt;String, HRegion&gt; e: this.onlineRegions.entrySet()) {<a name="line.1168"></a>
+<span class="sourceLineNo">1169</span>      if (!e.getValue().getRegionInfo().isMetaRegion()) {<a name="line.1169"></a>
+<span class="sourceLineNo">1170</span>        allUserRegionsOffline = false;<a name="line.1170"></a>
+<span class="sourceLineNo">1171</span>        break;<a name="line.1171"></a>
+<span class="sourceLineNo">1172</span>      }<a name="line.1172"></a>
+<span class="sourceLineNo">1173</span>    }<a name="line.1173"></a>
+<span class="sourceLineNo">1174</span>    return allUserRegionsOffline;<a name="line.1174"></a>
+<span class="sourceLineNo">1175</span>  }<a name="line.1175"></a>
+<span class="sourceLineNo">1176</span><a name="line.1176"></a>
+<span class="sourceLineNo">1177</span>  /**<a name="line.1177"></a>
+<span class="sourceLineNo">1178</span>   * @return Current write count for all online regions.<a name="line.1178"></a>
+<span class="sourceLineNo">1179</span>   */<a name="line.1179"></a>
+<span class="sourceLineNo">1180</span>  private long getWriteRequestCount() {<a name="line.1180"></a>
+<span class="sourceLineNo">1181</span>    long writeCount = 0;<a name="line.1181"></a>
+<span class="sourceLineNo">1182</span>    for (Map.Entry&lt;String, HRegion&gt; e: this.onlineRegions.entrySet()) {<a name="line.1182"></a>
+<span class="sourceLineNo">1183</span>      writeCount += e.getValue().getWriteRequestsCount();<a name="line.1183"></a>
+<span class="sourceLineNo">1184</span>    }<a name="line.1184"></a>
+<span class="sourceLineNo">1185</span>    return writeCount;<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>  @VisibleForTesting<a name="line.1188"></a>
+<span class="sourceLineNo">1189</span>  protected void tryRegionServerReport(long reportStartTime, long reportEndTime)<a name="line.1189"></a>
+<span class="sourceLineNo">1190</span>      throws IOException {<a name="line.1190"></a>
+<span class="sourceLineNo">1191</span>    RegionServerStatusService.BlockingInterface rss = rssStub;<a name="line.1191"></a>
+<span class="sourceLineNo">1192</span>    if (rss == null) {<a name="line.1192"></a>
+<span class="sourceLineNo">1193</span>      // the current server could be stopping.<a name="line.1193"></a>
+<span class="sourceLineNo">1194</span>      return;<a name="line.1194"></a>
+<span class="sourceLineNo">1195</span>    }<a name="line.1195"></a>
+<span class="sourceLineNo">1196</span>    ClusterStatusProtos.ServerLoad sl = buildServerLoad(reportStartTime, reportEndTime);<a name="line.1196"></a>
+<span class="sourceLineNo">1197</span>    try {<a name="line.1197"></a>
+<span class="sourceLineNo">1198</span>      RegionServerReportRequest.Builder request = RegionServerReportRequest.newBuilder();<a name="line.1198"></a>
+<span class="sourceLineNo">1199</span>      request.setServer(ProtobufUtil.toServerName(this.serverName));<a name="line.1199"></a>
+<span class="sourceLineNo">1200</span>      request.setLoad(sl);<a name="line.1200"></a>
+<span class="sourceLineNo">1201</span>      rss.regionServerReport(null, request.build());<a name="line.1201"></a>
+<span class="sourceLineNo">1202</span>    } catch (ServiceException se) {<a name="line.1202"></a>
+<span class="sourceLineNo">1203</span>      IOException ioe = ProtobufUtil.getRemoteException(se);<a name="line.1203"></a>
+<span class="sourceLineNo">1204</span>      if (ioe instanceof YouAreDeadException) {<a name="line.1204"></a>
+<span class="sourceLineNo">1205</span>        // This will be caught and handled as a fatal error in run()<a name="line.1205"></a>
+<span class="sourceLineNo">1206</span>        throw ioe;<a name="line.1206"></a>
+<span class="sourceLineNo">1207</span>      }<a name="line.1207"></a>
+<span class="sourceLineNo">1208</span>      if (rssStub == rss) {<a name="line.1208"></a>
+<span class="sourceLineNo">1209</span>        rssStub = null;<a name="line.1209"></a>
+<span class="sourceLineNo">1210</span>      }<a name="line.1210"></a>
+<span class="sourceLineNo">1211</span>      // Couldn't connect to the master, get location from zk and reconnect<a name="line.1211"></a>
+<span class="sourceLineNo">1212</span>      // Method blocks until new master is found or we are stopped<a name="line.1212"></a>
+<span class="sourceLineNo">1213</span>      createRegionServerStatusStub(true);<a name="line.1213"></a>
+<span class="sourceLineNo">1214</span>    }<a name="line.1214"></a>
+<span class="sourceLineNo">1215</span>  }<a name="line.1215"></a>
+<span class="sourceLineNo">1216</span><a name="line.1216"></a>
+<span class="sourceLineNo">1217</span>  /**<a name="line.1217"></a>
+<span class="sourceLineNo">1218</span>   * Reports the given map of Regions and their size on the filesystem to the active Master.<a name="line.1218"></a>
+<span class="sourceLineNo">1219</span>   *<a name="line.1219"></a>
+<span class="sourceLineNo">1220</span>   * @param regionSizeStore The store containing region sizes<a name="line.1220"></a>
+<span class="sourceLineNo">1221</span>   * @return false if FileSystemUtilizationChore should pause reporting to master. true otherwise<a name="line.1221"></a>
+<span class="sourceLineNo">1222</span>   */<a name="line.1222"></a>
+<span class="sourceLineNo">1223</span>  public boolean reportRegionSizesForQuotas(RegionSizeStore regionSizeStore) {<a name="line.1223"></a>
+<span class="sourceLineNo">1224</span>    RegionServerStatusService.BlockingInterface rss = rssStub;<a name="line.1224"></a>
+<span class="sourceLineNo">1225</span>    if (rss == null) {<a name="line.1225"></a>
+<span class="sourceLineNo">1226</span>      // the current server could be stopping.<a name="line.1226"></a>
+<span class="sourceLineNo">1227</span>      LOG.trace("Skipping Region size report to HMaster as stub is null");<a name="line.1227"></a>
+<span class="sourceLineNo">1228</span>      return true;<a name="line.1228"></a>
+<span class="sourceLineNo">1229</span>    }<a name="line.1229"></a>
+<span class="sourceLineNo">1230</span>    try {<a name="line.1230"></a>
+<span class="sourceLineNo">1231</span>      buildReportAndSend(rss, regionSizeStore);<a name="line.1231"></a>
+<span class="sourceLineNo">1232</span>    } catch (ServiceException se) {

<TRUNCATED>

[11/46] hbase-site git commit: Published site at 05d22ed960204183fbd9bd16f1dbca6410ccde76.

Posted by gi...@apache.org.
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/3649682c/devapidocs/src-html/org/apache/hadoop/hbase/regionserver/RSRpcServices.LogDelegate.html
----------------------------------------------------------------------
diff --git a/devapidocs/src-html/org/apache/hadoop/hbase/regionserver/RSRpcServices.LogDelegate.html b/devapidocs/src-html/org/apache/hadoop/hbase/regionserver/RSRpcServices.LogDelegate.html
index 20e3eaa..b257d07 100644
--- a/devapidocs/src-html/org/apache/hadoop/hbase/regionserver/RSRpcServices.LogDelegate.html
+++ b/devapidocs/src-html/org/apache/hadoop/hbase/regionserver/RSRpcServices.LogDelegate.html
@@ -2493,1291 +2493,1293 @@
 <span class="sourceLineNo">2485</span>  }<a name="line.2485"></a>
 <span class="sourceLineNo">2486</span><a name="line.2486"></a>
 <span class="sourceLineNo">2487</span>  private boolean shouldRejectRequestsFromClient(HRegion region) {<a name="line.2487"></a>
-<span class="sourceLineNo">2488</span>    return regionServer.getReplicationSourceService().getSyncReplicationPeerInfoProvider()<a name="line.2488"></a>
-<span class="sourceLineNo">2489</span>      .checkState(region.getRegionInfo().getTable(), RejectRequestsFromClientStateChecker.get());<a name="line.2489"></a>
-<span class="sourceLineNo">2490</span>  }<a name="line.2490"></a>
-<span class="sourceLineNo">2491</span><a name="line.2491"></a>
-<span class="sourceLineNo">2492</span>  private void rejectIfInStandByState(HRegion region) throws DoNotRetryIOException {<a name="line.2492"></a>
-<span class="sourceLineNo">2493</span>    if (shouldRejectRequestsFromClient(region)) {<a name="line.2493"></a>
-<span class="sourceLineNo">2494</span>      throw new DoNotRetryIOException(<a name="line.2494"></a>
-<span class="sourceLineNo">2495</span>        region.getRegionInfo().getRegionNameAsString() + " is in STANDBY state.");<a name="line.2495"></a>
-<span class="sourceLineNo">2496</span>    }<a name="line.2496"></a>
-<span class="sourceLineNo">2497</span>  }<a name="line.2497"></a>
-<span class="sourceLineNo">2498</span><a name="line.2498"></a>
-<span class="sourceLineNo">2499</span>  /**<a name="line.2499"></a>
-<span class="sourceLineNo">2500</span>   * Get data from a table.<a name="line.2500"></a>
-<span class="sourceLineNo">2501</span>   *<a name="line.2501"></a>
-<span class="sourceLineNo">2502</span>   * @param controller the RPC controller<a name="line.2502"></a>
-<span class="sourceLineNo">2503</span>   * @param request the get request<a name="line.2503"></a>
-<span class="sourceLineNo">2504</span>   * @throws ServiceException<a name="line.2504"></a>
-<span class="sourceLineNo">2505</span>   */<a name="line.2505"></a>
-<span class="sourceLineNo">2506</span>  @Override<a name="line.2506"></a>
-<span class="sourceLineNo">2507</span>  public GetResponse get(final RpcController controller, final GetRequest request)<a name="line.2507"></a>
-<span class="sourceLineNo">2508</span>      throws ServiceException {<a name="line.2508"></a>
-<span class="sourceLineNo">2509</span>    long before = EnvironmentEdgeManager.currentTime();<a name="line.2509"></a>
-<span class="sourceLineNo">2510</span>    OperationQuota quota = null;<a name="line.2510"></a>
-<span class="sourceLineNo">2511</span>    HRegion region = null;<a name="line.2511"></a>
-<span class="sourceLineNo">2512</span>    try {<a name="line.2512"></a>
-<span class="sourceLineNo">2513</span>      checkOpen();<a name="line.2513"></a>
-<span class="sourceLineNo">2514</span>      requestCount.increment();<a name="line.2514"></a>
-<span class="sourceLineNo">2515</span>      rpcGetRequestCount.increment();<a name="line.2515"></a>
-<span class="sourceLineNo">2516</span>      region = getRegion(request.getRegion());<a name="line.2516"></a>
-<span class="sourceLineNo">2517</span>      rejectIfInStandByState(region);<a name="line.2517"></a>
-<span class="sourceLineNo">2518</span><a name="line.2518"></a>
-<span class="sourceLineNo">2519</span>      GetResponse.Builder builder = GetResponse.newBuilder();<a name="line.2519"></a>
-<span class="sourceLineNo">2520</span>      ClientProtos.Get get = request.getGet();<a name="line.2520"></a>
-<span class="sourceLineNo">2521</span>      // An asynchbase client, https://github.com/OpenTSDB/asynchbase, starts by trying to do<a name="line.2521"></a>
-<span class="sourceLineNo">2522</span>      // a get closest before. Throwing the UnknownProtocolException signals it that it needs<a name="line.2522"></a>
-<span class="sourceLineNo">2523</span>      // to switch and do hbase2 protocol (HBase servers do not tell clients what versions<a name="line.2523"></a>
-<span class="sourceLineNo">2524</span>      // they are; its a problem for non-native clients like asynchbase. HBASE-20225.<a name="line.2524"></a>
-<span class="sourceLineNo">2525</span>      if (get.hasClosestRowBefore() &amp;&amp; get.getClosestRowBefore()) {<a name="line.2525"></a>
-<span class="sourceLineNo">2526</span>        throw new UnknownProtocolException("Is this a pre-hbase-1.0.0 or asynchbase client? " +<a name="line.2526"></a>
-<span class="sourceLineNo">2527</span>            "Client is invoking getClosestRowBefore removed in hbase-2.0.0 replaced by " +<a name="line.2527"></a>
-<span class="sourceLineNo">2528</span>            "reverse Scan.");<a name="line.2528"></a>
-<span class="sourceLineNo">2529</span>      }<a name="line.2529"></a>
-<span class="sourceLineNo">2530</span>      Boolean existence = null;<a name="line.2530"></a>
-<span class="sourceLineNo">2531</span>      Result r = null;<a name="line.2531"></a>
-<span class="sourceLineNo">2532</span>      RpcCallContext context = RpcServer.getCurrentCall().orElse(null);<a name="line.2532"></a>
-<span class="sourceLineNo">2533</span>      quota = getRpcQuotaManager().checkQuota(region, OperationQuota.OperationType.GET);<a name="line.2533"></a>
-<span class="sourceLineNo">2534</span><a name="line.2534"></a>
-<span class="sourceLineNo">2535</span>      Get clientGet = ProtobufUtil.toGet(get);<a name="line.2535"></a>
-<span class="sourceLineNo">2536</span>      if (get.getExistenceOnly() &amp;&amp; region.getCoprocessorHost() != null) {<a name="line.2536"></a>
-<span class="sourceLineNo">2537</span>        existence = region.getCoprocessorHost().preExists(clientGet);<a name="line.2537"></a>
-<span class="sourceLineNo">2538</span>      }<a name="line.2538"></a>
-<span class="sourceLineNo">2539</span>      if (existence == null) {<a name="line.2539"></a>
-<span class="sourceLineNo">2540</span>        if (context != null) {<a name="line.2540"></a>
-<span class="sourceLineNo">2541</span>          r = get(clientGet, (region), null, context);<a name="line.2541"></a>
-<span class="sourceLineNo">2542</span>        } else {<a name="line.2542"></a>
-<span class="sourceLineNo">2543</span>          // for test purpose<a name="line.2543"></a>
-<span class="sourceLineNo">2544</span>          r = region.get(clientGet);<a name="line.2544"></a>
-<span class="sourceLineNo">2545</span>        }<a name="line.2545"></a>
-<span class="sourceLineNo">2546</span>        if (get.getExistenceOnly()) {<a name="line.2546"></a>
-<span class="sourceLineNo">2547</span>          boolean exists = r.getExists();<a name="line.2547"></a>
-<span class="sourceLineNo">2548</span>          if (region.getCoprocessorHost() != null) {<a name="line.2548"></a>
-<span class="sourceLineNo">2549</span>            exists = region.getCoprocessorHost().postExists(clientGet, exists);<a name="line.2549"></a>
-<span class="sourceLineNo">2550</span>          }<a name="line.2550"></a>
-<span class="sourceLineNo">2551</span>          existence = exists;<a name="line.2551"></a>
-<span class="sourceLineNo">2552</span>        }<a name="line.2552"></a>
-<span class="sourceLineNo">2553</span>      }<a name="line.2553"></a>
-<span class="sourceLineNo">2554</span>      if (existence != null) {<a name="line.2554"></a>
-<span class="sourceLineNo">2555</span>        ClientProtos.Result pbr =<a name="line.2555"></a>
-<span class="sourceLineNo">2556</span>            ProtobufUtil.toResult(existence, region.getRegionInfo().getReplicaId() != 0);<a name="line.2556"></a>
-<span class="sourceLineNo">2557</span>        builder.setResult(pbr);<a name="line.2557"></a>
-<span class="sourceLineNo">2558</span>      } else if (r != null) {<a name="line.2558"></a>
-<span class="sourceLineNo">2559</span>        ClientProtos.Result pbr;<a name="line.2559"></a>
-<span class="sourceLineNo">2560</span>        if (isClientCellBlockSupport(context) &amp;&amp; controller instanceof HBaseRpcController<a name="line.2560"></a>
-<span class="sourceLineNo">2561</span>            &amp;&amp; VersionInfoUtil.hasMinimumVersion(context.getClientVersionInfo(), 1, 3)) {<a name="line.2561"></a>
-<span class="sourceLineNo">2562</span>          pbr = ProtobufUtil.toResultNoData(r);<a name="line.2562"></a>
-<span class="sourceLineNo">2563</span>          ((HBaseRpcController) controller).setCellScanner(CellUtil.createCellScanner(r<a name="line.2563"></a>
-<span class="sourceLineNo">2564</span>              .rawCells()));<a name="line.2564"></a>
-<span class="sourceLineNo">2565</span>          addSize(context, r, null);<a name="line.2565"></a>
-<span class="sourceLineNo">2566</span>        } else {<a name="line.2566"></a>
-<span class="sourceLineNo">2567</span>          pbr = ProtobufUtil.toResult(r);<a name="line.2567"></a>
-<span class="sourceLineNo">2568</span>        }<a name="line.2568"></a>
-<span class="sourceLineNo">2569</span>        builder.setResult(pbr);<a name="line.2569"></a>
-<span class="sourceLineNo">2570</span>      }<a name="line.2570"></a>
-<span class="sourceLineNo">2571</span>      if (r != null) {<a name="line.2571"></a>
-<span class="sourceLineNo">2572</span>        quota.addGetResult(r);<a name="line.2572"></a>
-<span class="sourceLineNo">2573</span>      }<a name="line.2573"></a>
-<span class="sourceLineNo">2574</span>      return builder.build();<a name="line.2574"></a>
-<span class="sourceLineNo">2575</span>    } catch (IOException ie) {<a name="line.2575"></a>
-<span class="sourceLineNo">2576</span>      throw new ServiceException(ie);<a name="line.2576"></a>
-<span class="sourceLineNo">2577</span>    } finally {<a name="line.2577"></a>
-<span class="sourceLineNo">2578</span>      MetricsRegionServer mrs = regionServer.metricsRegionServer;<a name="line.2578"></a>
-<span class="sourceLineNo">2579</span>      if (mrs != null) {<a name="line.2579"></a>
-<span class="sourceLineNo">2580</span>        TableDescriptor td = region != null? region.getTableDescriptor(): null;<a name="line.2580"></a>
-<span class="sourceLineNo">2581</span>        if (td != null) {<a name="line.2581"></a>
-<span class="sourceLineNo">2582</span>          mrs.updateGet(td.getTableName(), EnvironmentEdgeManager.currentTime() - before);<a name="line.2582"></a>
-<span class="sourceLineNo">2583</span>        }<a name="line.2583"></a>
-<span class="sourceLineNo">2584</span>      }<a name="line.2584"></a>
-<span class="sourceLineNo">2585</span>      if (quota != null) {<a name="line.2585"></a>
-<span class="sourceLineNo">2586</span>        quota.close();<a name="line.2586"></a>
-<span class="sourceLineNo">2587</span>      }<a name="line.2587"></a>
-<span class="sourceLineNo">2588</span>    }<a name="line.2588"></a>
-<span class="sourceLineNo">2589</span>  }<a name="line.2589"></a>
-<span class="sourceLineNo">2590</span><a name="line.2590"></a>
-<span class="sourceLineNo">2591</span>  private Result get(Get get, HRegion region, RegionScannersCloseCallBack closeCallBack,<a name="line.2591"></a>
-<span class="sourceLineNo">2592</span>      RpcCallContext context) throws IOException {<a name="line.2592"></a>
-<span class="sourceLineNo">2593</span>    region.prepareGet(get);<a name="line.2593"></a>
-<span class="sourceLineNo">2594</span>    boolean stale = region.getRegionInfo().getReplicaId() != 0;<a name="line.2594"></a>
-<span class="sourceLineNo">2595</span><a name="line.2595"></a>
-<span class="sourceLineNo">2596</span>    // This method is almost the same as HRegion#get.<a name="line.2596"></a>
-<span class="sourceLineNo">2597</span>    List&lt;Cell&gt; results = new ArrayList&lt;&gt;();<a name="line.2597"></a>
-<span class="sourceLineNo">2598</span>    long before = EnvironmentEdgeManager.currentTime();<a name="line.2598"></a>
-<span class="sourceLineNo">2599</span>    // pre-get CP hook<a name="line.2599"></a>
-<span class="sourceLineNo">2600</span>    if (region.getCoprocessorHost() != null) {<a name="line.2600"></a>
-<span class="sourceLineNo">2601</span>      if (region.getCoprocessorHost().preGet(get, results)) {<a name="line.2601"></a>
-<span class="sourceLineNo">2602</span>        region.metricsUpdateForGet(results, before);<a name="line.2602"></a>
-<span class="sourceLineNo">2603</span>        return Result<a name="line.2603"></a>
-<span class="sourceLineNo">2604</span>            .create(results, get.isCheckExistenceOnly() ? !results.isEmpty() : null, stale);<a name="line.2604"></a>
-<span class="sourceLineNo">2605</span>      }<a name="line.2605"></a>
-<span class="sourceLineNo">2606</span>    }<a name="line.2606"></a>
-<span class="sourceLineNo">2607</span>    Scan scan = new Scan(get);<a name="line.2607"></a>
-<span class="sourceLineNo">2608</span>    if (scan.getLoadColumnFamiliesOnDemandValue() == null) {<a name="line.2608"></a>
-<span class="sourceLineNo">2609</span>      scan.setLoadColumnFamiliesOnDemand(region.isLoadingCfsOnDemandDefault());<a name="line.2609"></a>
-<span class="sourceLineNo">2610</span>    }<a name="line.2610"></a>
-<span class="sourceLineNo">2611</span>    RegionScannerImpl scanner = null;<a name="line.2611"></a>
-<span class="sourceLineNo">2612</span>    try {<a name="line.2612"></a>
-<span class="sourceLineNo">2613</span>      scanner = region.getScanner(scan);<a name="line.2613"></a>
-<span class="sourceLineNo">2614</span>      scanner.next(results);<a name="line.2614"></a>
-<span class="sourceLineNo">2615</span>    } finally {<a name="line.2615"></a>
-<span class="sourceLineNo">2616</span>      if (scanner != null) {<a name="line.2616"></a>
-<span class="sourceLineNo">2617</span>        if (closeCallBack == null) {<a name="line.2617"></a>
-<span class="sourceLineNo">2618</span>          // If there is a context then the scanner can be added to the current<a name="line.2618"></a>
-<span class="sourceLineNo">2619</span>          // RpcCallContext. The rpc callback will take care of closing the<a name="line.2619"></a>
-<span class="sourceLineNo">2620</span>          // scanner, for eg in case<a name="line.2620"></a>
-<span class="sourceLineNo">2621</span>          // of get()<a name="line.2621"></a>
-<span class="sourceLineNo">2622</span>          context.setCallBack(scanner);<a name="line.2622"></a>
-<span class="sourceLineNo">2623</span>        } else {<a name="line.2623"></a>
-<span class="sourceLineNo">2624</span>          // The call is from multi() where the results from the get() are<a name="line.2624"></a>
-<span class="sourceLineNo">2625</span>          // aggregated and then send out to the<a name="line.2625"></a>
-<span class="sourceLineNo">2626</span>          // rpc. The rpccall back will close all such scanners created as part<a name="line.2626"></a>
-<span class="sourceLineNo">2627</span>          // of multi().<a name="line.2627"></a>
-<span class="sourceLineNo">2628</span>          closeCallBack.addScanner(scanner);<a name="line.2628"></a>
-<span class="sourceLineNo">2629</span>        }<a name="line.2629"></a>
-<span class="sourceLineNo">2630</span>      }<a name="line.2630"></a>
-<span class="sourceLineNo">2631</span>    }<a name="line.2631"></a>
-<span class="sourceLineNo">2632</span><a name="line.2632"></a>
-<span class="sourceLineNo">2633</span>    // post-get CP hook<a name="line.2633"></a>
-<span class="sourceLineNo">2634</span>    if (region.getCoprocessorHost() != null) {<a name="line.2634"></a>
-<span class="sourceLineNo">2635</span>      region.getCoprocessorHost().postGet(get, results);<a name="line.2635"></a>
-<span class="sourceLineNo">2636</span>    }<a name="line.2636"></a>
-<span class="sourceLineNo">2637</span>    region.metricsUpdateForGet(results, before);<a name="line.2637"></a>
-<span class="sourceLineNo">2638</span><a name="line.2638"></a>
-<span class="sourceLineNo">2639</span>    return Result.create(results, get.isCheckExistenceOnly() ? !results.isEmpty() : null, stale);<a name="line.2639"></a>
-<span class="sourceLineNo">2640</span>  }<a name="line.2640"></a>
-<span class="sourceLineNo">2641</span><a name="line.2641"></a>
-<span class="sourceLineNo">2642</span>  private void checkBatchSizeAndLogLargeSize(MultiRequest request) {<a name="line.2642"></a>
-<span class="sourceLineNo">2643</span>    int sum = 0;<a name="line.2643"></a>
-<span class="sourceLineNo">2644</span>    String firstRegionName = null;<a name="line.2644"></a>
-<span class="sourceLineNo">2645</span>    for (RegionAction regionAction : request.getRegionActionList()) {<a name="line.2645"></a>
-<span class="sourceLineNo">2646</span>      if (sum == 0) {<a name="line.2646"></a>
-<span class="sourceLineNo">2647</span>        firstRegionName = Bytes.toStringBinary(regionAction.getRegion().getValue().toByteArray());<a name="line.2647"></a>
-<span class="sourceLineNo">2648</span>      }<a name="line.2648"></a>
-<span class="sourceLineNo">2649</span>      sum += regionAction.getActionCount();<a name="line.2649"></a>
-<span class="sourceLineNo">2650</span>    }<a name="line.2650"></a>
-<span class="sourceLineNo">2651</span>    if (sum &gt; rowSizeWarnThreshold) {<a name="line.2651"></a>
-<span class="sourceLineNo">2652</span>      ld.logBatchWarning(firstRegionName, sum, rowSizeWarnThreshold);<a name="line.2652"></a>
-<span class="sourceLineNo">2653</span>    }<a name="line.2653"></a>
-<span class="sourceLineNo">2654</span>  }<a name="line.2654"></a>
-<span class="sourceLineNo">2655</span><a name="line.2655"></a>
-<span class="sourceLineNo">2656</span>  private void failRegionAction(MultiResponse.Builder responseBuilder,<a name="line.2656"></a>
-<span class="sourceLineNo">2657</span>      RegionActionResult.Builder regionActionResultBuilder, RegionAction regionAction,<a name="line.2657"></a>
-<span class="sourceLineNo">2658</span>      CellScanner cellScanner, Throwable error) {<a name="line.2658"></a>
-<span class="sourceLineNo">2659</span>    rpcServer.getMetrics().exception(error);<a name="line.2659"></a>
-<span class="sourceLineNo">2660</span>    regionActionResultBuilder.setException(ResponseConverter.buildException(error));<a name="line.2660"></a>
-<span class="sourceLineNo">2661</span>    responseBuilder.addRegionActionResult(regionActionResultBuilder.build());<a name="line.2661"></a>
-<span class="sourceLineNo">2662</span>    // All Mutations in this RegionAction not executed as we can not see the Region online here<a name="line.2662"></a>
-<span class="sourceLineNo">2663</span>    // in this RS. Will be retried from Client. Skipping all the Cells in CellScanner<a name="line.2663"></a>
-<span class="sourceLineNo">2664</span>    // corresponding to these Mutations.<a name="line.2664"></a>
-<span class="sourceLineNo">2665</span>    if (cellScanner != null) {<a name="line.2665"></a>
-<span class="sourceLineNo">2666</span>      skipCellsForMutations(regionAction.getActionList(), cellScanner);<a name="line.2666"></a>
-<span class="sourceLineNo">2667</span>    }<a name="line.2667"></a>
-<span class="sourceLineNo">2668</span>  }<a name="line.2668"></a>
-<span class="sourceLineNo">2669</span><a name="line.2669"></a>
-<span class="sourceLineNo">2670</span>  private boolean isReplicationRequest(Action action) {<a name="line.2670"></a>
-<span class="sourceLineNo">2671</span>    // replication request can only be put or delete.<a name="line.2671"></a>
-<span class="sourceLineNo">2672</span>    if (!action.hasMutation()) {<a name="line.2672"></a>
-<span class="sourceLineNo">2673</span>      return false;<a name="line.2673"></a>
-<span class="sourceLineNo">2674</span>    }<a name="line.2674"></a>
-<span class="sourceLineNo">2675</span>    MutationProto mutation = action.getMutation();<a name="line.2675"></a>
-<span class="sourceLineNo">2676</span>    MutationType type = mutation.getMutateType();<a name="line.2676"></a>
-<span class="sourceLineNo">2677</span>    if (type != MutationType.PUT &amp;&amp; type != MutationType.DELETE) {<a name="line.2677"></a>
-<span class="sourceLineNo">2678</span>      return false;<a name="line.2678"></a>
-<span class="sourceLineNo">2679</span>    }<a name="line.2679"></a>
-<span class="sourceLineNo">2680</span>    // replication will set a special attribute so we can make use of it to decide whether a request<a name="line.2680"></a>
-<span class="sourceLineNo">2681</span>    // is for replication.<a name="line.2681"></a>
-<span class="sourceLineNo">2682</span>    return mutation.getAttributeList().stream().map(p -&gt; p.getName())<a name="line.2682"></a>
-<span class="sourceLineNo">2683</span>      .filter(n -&gt; n.equals(ReplicationUtils.REPLICATION_ATTR_NAME)).findAny().isPresent();<a name="line.2683"></a>
-<span class="sourceLineNo">2684</span>  }<a name="line.2684"></a>
-<span class="sourceLineNo">2685</span><a name="line.2685"></a>
-<span class="sourceLineNo">2686</span>  /**<a name="line.2686"></a>
-<span class="sourceLineNo">2687</span>   * Execute multiple actions on a table: get, mutate, and/or execCoprocessor<a name="line.2687"></a>
-<span class="sourceLineNo">2688</span>   * @param rpcc the RPC controller<a name="line.2688"></a>
-<span class="sourceLineNo">2689</span>   * @param request the multi request<a name="line.2689"></a>
-<span class="sourceLineNo">2690</span>   * @throws ServiceException<a name="line.2690"></a>
-<span class="sourceLineNo">2691</span>   */<a name="line.2691"></a>
-<span class="sourceLineNo">2692</span>  @Override<a name="line.2692"></a>
-<span class="sourceLineNo">2693</span>  public MultiResponse multi(final RpcController rpcc, final MultiRequest request)<a name="line.2693"></a>
-<span class="sourceLineNo">2694</span>      throws ServiceException {<a name="line.2694"></a>
-<span class="sourceLineNo">2695</span>    try {<a name="line.2695"></a>
-<span class="sourceLineNo">2696</span>      checkOpen();<a name="line.2696"></a>
-<span class="sourceLineNo">2697</span>    } catch (IOException ie) {<a name="line.2697"></a>
-<span class="sourceLineNo">2698</span>      throw new ServiceException(ie);<a name="line.2698"></a>
-<span class="sourceLineNo">2699</span>    }<a name="line.2699"></a>
-<span class="sourceLineNo">2700</span><a name="line.2700"></a>
-<span class="sourceLineNo">2701</span>    checkBatchSizeAndLogLargeSize(request);<a name="line.2701"></a>
+<span class="sourceLineNo">2488</span>    TableName table = region.getRegionInfo().getTable();<a name="line.2488"></a>
+<span class="sourceLineNo">2489</span>    ReplicationSourceService service = regionServer.getReplicationSourceService();<a name="line.2489"></a>
+<span class="sourceLineNo">2490</span>    return service != null &amp;&amp; service.getSyncReplicationPeerInfoProvider()<a name="line.2490"></a>
+<span class="sourceLineNo">2491</span>            .checkState(table, RejectRequestsFromClientStateChecker.get());<a name="line.2491"></a>
+<span class="sourceLineNo">2492</span>  }<a name="line.2492"></a>
+<span class="sourceLineNo">2493</span><a name="line.2493"></a>
+<span class="sourceLineNo">2494</span>  private void rejectIfInStandByState(HRegion region) throws DoNotRetryIOException {<a name="line.2494"></a>
+<span class="sourceLineNo">2495</span>    if (shouldRejectRequestsFromClient(region)) {<a name="line.2495"></a>
+<span class="sourceLineNo">2496</span>      throw new DoNotRetryIOException(<a name="line.2496"></a>
+<span class="sourceLineNo">2497</span>        region.getRegionInfo().getRegionNameAsString() + " is in STANDBY state.");<a name="line.2497"></a>
+<span class="sourceLineNo">2498</span>    }<a name="line.2498"></a>
+<span class="sourceLineNo">2499</span>  }<a name="line.2499"></a>
+<span class="sourceLineNo">2500</span><a name="line.2500"></a>
+<span class="sourceLineNo">2501</span>  /**<a name="line.2501"></a>
+<span class="sourceLineNo">2502</span>   * Get data from a table.<a name="line.2502"></a>
+<span class="sourceLineNo">2503</span>   *<a name="line.2503"></a>
+<span class="sourceLineNo">2504</span>   * @param controller the RPC controller<a name="line.2504"></a>
+<span class="sourceLineNo">2505</span>   * @param request the get request<a name="line.2505"></a>
+<span class="sourceLineNo">2506</span>   * @throws ServiceException<a name="line.2506"></a>
+<span class="sourceLineNo">2507</span>   */<a name="line.2507"></a>
+<span class="sourceLineNo">2508</span>  @Override<a name="line.2508"></a>
+<span class="sourceLineNo">2509</span>  public GetResponse get(final RpcController controller, final GetRequest request)<a name="line.2509"></a>
+<span class="sourceLineNo">2510</span>      throws ServiceException {<a name="line.2510"></a>
+<span class="sourceLineNo">2511</span>    long before = EnvironmentEdgeManager.currentTime();<a name="line.2511"></a>
+<span class="sourceLineNo">2512</span>    OperationQuota quota = null;<a name="line.2512"></a>
+<span class="sourceLineNo">2513</span>    HRegion region = null;<a name="line.2513"></a>
+<span class="sourceLineNo">2514</span>    try {<a name="line.2514"></a>
+<span class="sourceLineNo">2515</span>      checkOpen();<a name="line.2515"></a>
+<span class="sourceLineNo">2516</span>      requestCount.increment();<a name="line.2516"></a>
+<span class="sourceLineNo">2517</span>      rpcGetRequestCount.increment();<a name="line.2517"></a>
+<span class="sourceLineNo">2518</span>      region = getRegion(request.getRegion());<a name="line.2518"></a>
+<span class="sourceLineNo">2519</span>      rejectIfInStandByState(region);<a name="line.2519"></a>
+<span class="sourceLineNo">2520</span><a name="line.2520"></a>
+<span class="sourceLineNo">2521</span>      GetResponse.Builder builder = GetResponse.newBuilder();<a name="line.2521"></a>
+<span class="sourceLineNo">2522</span>      ClientProtos.Get get = request.getGet();<a name="line.2522"></a>
+<span class="sourceLineNo">2523</span>      // An asynchbase client, https://github.com/OpenTSDB/asynchbase, starts by trying to do<a name="line.2523"></a>
+<span class="sourceLineNo">2524</span>      // a get closest before. Throwing the UnknownProtocolException signals it that it needs<a name="line.2524"></a>
+<span class="sourceLineNo">2525</span>      // to switch and do hbase2 protocol (HBase servers do not tell clients what versions<a name="line.2525"></a>
+<span class="sourceLineNo">2526</span>      // they are; its a problem for non-native clients like asynchbase. HBASE-20225.<a name="line.2526"></a>
+<span class="sourceLineNo">2527</span>      if (get.hasClosestRowBefore() &amp;&amp; get.getClosestRowBefore()) {<a name="line.2527"></a>
+<span class="sourceLineNo">2528</span>        throw new UnknownProtocolException("Is this a pre-hbase-1.0.0 or asynchbase client? " +<a name="line.2528"></a>
+<span class="sourceLineNo">2529</span>            "Client is invoking getClosestRowBefore removed in hbase-2.0.0 replaced by " +<a name="line.2529"></a>
+<span class="sourceLineNo">2530</span>            "reverse Scan.");<a name="line.2530"></a>
+<span class="sourceLineNo">2531</span>      }<a name="line.2531"></a>
+<span class="sourceLineNo">2532</span>      Boolean existence = null;<a name="line.2532"></a>
+<span class="sourceLineNo">2533</span>      Result r = null;<a name="line.2533"></a>
+<span class="sourceLineNo">2534</span>      RpcCallContext context = RpcServer.getCurrentCall().orElse(null);<a name="line.2534"></a>
+<span class="sourceLineNo">2535</span>      quota = getRpcQuotaManager().checkQuota(region, OperationQuota.OperationType.GET);<a name="line.2535"></a>
+<span class="sourceLineNo">2536</span><a name="line.2536"></a>
+<span class="sourceLineNo">2537</span>      Get clientGet = ProtobufUtil.toGet(get);<a name="line.2537"></a>
+<span class="sourceLineNo">2538</span>      if (get.getExistenceOnly() &amp;&amp; region.getCoprocessorHost() != null) {<a name="line.2538"></a>
+<span class="sourceLineNo">2539</span>        existence = region.getCoprocessorHost().preExists(clientGet);<a name="line.2539"></a>
+<span class="sourceLineNo">2540</span>      }<a name="line.2540"></a>
+<span class="sourceLineNo">2541</span>      if (existence == null) {<a name="line.2541"></a>
+<span class="sourceLineNo">2542</span>        if (context != null) {<a name="line.2542"></a>
+<span class="sourceLineNo">2543</span>          r = get(clientGet, (region), null, context);<a name="line.2543"></a>
+<span class="sourceLineNo">2544</span>        } else {<a name="line.2544"></a>
+<span class="sourceLineNo">2545</span>          // for test purpose<a name="line.2545"></a>
+<span class="sourceLineNo">2546</span>          r = region.get(clientGet);<a name="line.2546"></a>
+<span class="sourceLineNo">2547</span>        }<a name="line.2547"></a>
+<span class="sourceLineNo">2548</span>        if (get.getExistenceOnly()) {<a name="line.2548"></a>
+<span class="sourceLineNo">2549</span>          boolean exists = r.getExists();<a name="line.2549"></a>
+<span class="sourceLineNo">2550</span>          if (region.getCoprocessorHost() != null) {<a name="line.2550"></a>
+<span class="sourceLineNo">2551</span>            exists = region.getCoprocessorHost().postExists(clientGet, exists);<a name="line.2551"></a>
+<span class="sourceLineNo">2552</span>          }<a name="line.2552"></a>
+<span class="sourceLineNo">2553</span>          existence = exists;<a name="line.2553"></a>
+<span class="sourceLineNo">2554</span>        }<a name="line.2554"></a>
+<span class="sourceLineNo">2555</span>      }<a name="line.2555"></a>
+<span class="sourceLineNo">2556</span>      if (existence != null) {<a name="line.2556"></a>
+<span class="sourceLineNo">2557</span>        ClientProtos.Result pbr =<a name="line.2557"></a>
+<span class="sourceLineNo">2558</span>            ProtobufUtil.toResult(existence, region.getRegionInfo().getReplicaId() != 0);<a name="line.2558"></a>
+<span class="sourceLineNo">2559</span>        builder.setResult(pbr);<a name="line.2559"></a>
+<span class="sourceLineNo">2560</span>      } else if (r != null) {<a name="line.2560"></a>
+<span class="sourceLineNo">2561</span>        ClientProtos.Result pbr;<a name="line.2561"></a>
+<span class="sourceLineNo">2562</span>        if (isClientCellBlockSupport(context) &amp;&amp; controller instanceof HBaseRpcController<a name="line.2562"></a>
+<span class="sourceLineNo">2563</span>            &amp;&amp; VersionInfoUtil.hasMinimumVersion(context.getClientVersionInfo(), 1, 3)) {<a name="line.2563"></a>
+<span class="sourceLineNo">2564</span>          pbr = ProtobufUtil.toResultNoData(r);<a name="line.2564"></a>
+<span class="sourceLineNo">2565</span>          ((HBaseRpcController) controller).setCellScanner(CellUtil.createCellScanner(r<a name="line.2565"></a>
+<span class="sourceLineNo">2566</span>              .rawCells()));<a name="line.2566"></a>
+<span class="sourceLineNo">2567</span>          addSize(context, r, null);<a name="line.2567"></a>
+<span class="sourceLineNo">2568</span>        } else {<a name="line.2568"></a>
+<span class="sourceLineNo">2569</span>          pbr = ProtobufUtil.toResult(r);<a name="line.2569"></a>
+<span class="sourceLineNo">2570</span>        }<a name="line.2570"></a>
+<span class="sourceLineNo">2571</span>        builder.setResult(pbr);<a name="line.2571"></a>
+<span class="sourceLineNo">2572</span>      }<a name="line.2572"></a>
+<span class="sourceLineNo">2573</span>      if (r != null) {<a name="line.2573"></a>
+<span class="sourceLineNo">2574</span>        quota.addGetResult(r);<a name="line.2574"></a>
+<span class="sourceLineNo">2575</span>      }<a name="line.2575"></a>
+<span class="sourceLineNo">2576</span>      return builder.build();<a name="line.2576"></a>
+<span class="sourceLineNo">2577</span>    } catch (IOException ie) {<a name="line.2577"></a>
+<span class="sourceLineNo">2578</span>      throw new ServiceException(ie);<a name="line.2578"></a>
+<span class="sourceLineNo">2579</span>    } finally {<a name="line.2579"></a>
+<span class="sourceLineNo">2580</span>      MetricsRegionServer mrs = regionServer.metricsRegionServer;<a name="line.2580"></a>
+<span class="sourceLineNo">2581</span>      if (mrs != null) {<a name="line.2581"></a>
+<span class="sourceLineNo">2582</span>        TableDescriptor td = region != null? region.getTableDescriptor(): null;<a name="line.2582"></a>
+<span class="sourceLineNo">2583</span>        if (td != null) {<a name="line.2583"></a>
+<span class="sourceLineNo">2584</span>          mrs.updateGet(td.getTableName(), EnvironmentEdgeManager.currentTime() - before);<a name="line.2584"></a>
+<span class="sourceLineNo">2585</span>        }<a name="line.2585"></a>
+<span class="sourceLineNo">2586</span>      }<a name="line.2586"></a>
+<span class="sourceLineNo">2587</span>      if (quota != null) {<a name="line.2587"></a>
+<span class="sourceLineNo">2588</span>        quota.close();<a name="line.2588"></a>
+<span class="sourceLineNo">2589</span>      }<a name="line.2589"></a>
+<span class="sourceLineNo">2590</span>    }<a name="line.2590"></a>
+<span class="sourceLineNo">2591</span>  }<a name="line.2591"></a>
+<span class="sourceLineNo">2592</span><a name="line.2592"></a>
+<span class="sourceLineNo">2593</span>  private Result get(Get get, HRegion region, RegionScannersCloseCallBack closeCallBack,<a name="line.2593"></a>
+<span class="sourceLineNo">2594</span>      RpcCallContext context) throws IOException {<a name="line.2594"></a>
+<span class="sourceLineNo">2595</span>    region.prepareGet(get);<a name="line.2595"></a>
+<span class="sourceLineNo">2596</span>    boolean stale = region.getRegionInfo().getReplicaId() != 0;<a name="line.2596"></a>
+<span class="sourceLineNo">2597</span><a name="line.2597"></a>
+<span class="sourceLineNo">2598</span>    // This method is almost the same as HRegion#get.<a name="line.2598"></a>
+<span class="sourceLineNo">2599</span>    List&lt;Cell&gt; results = new ArrayList&lt;&gt;();<a name="line.2599"></a>
+<span class="sourceLineNo">2600</span>    long before = EnvironmentEdgeManager.currentTime();<a name="line.2600"></a>
+<span class="sourceLineNo">2601</span>    // pre-get CP hook<a name="line.2601"></a>
+<span class="sourceLineNo">2602</span>    if (region.getCoprocessorHost() != null) {<a name="line.2602"></a>
+<span class="sourceLineNo">2603</span>      if (region.getCoprocessorHost().preGet(get, results)) {<a name="line.2603"></a>
+<span class="sourceLineNo">2604</span>        region.metricsUpdateForGet(results, before);<a name="line.2604"></a>
+<span class="sourceLineNo">2605</span>        return Result<a name="line.2605"></a>
+<span class="sourceLineNo">2606</span>            .create(results, get.isCheckExistenceOnly() ? !results.isEmpty() : null, stale);<a name="line.2606"></a>
+<span class="sourceLineNo">2607</span>      }<a name="line.2607"></a>
+<span class="sourceLineNo">2608</span>    }<a name="line.2608"></a>
+<span class="sourceLineNo">2609</span>    Scan scan = new Scan(get);<a name="line.2609"></a>
+<span class="sourceLineNo">2610</span>    if (scan.getLoadColumnFamiliesOnDemandValue() == null) {<a name="line.2610"></a>
+<span class="sourceLineNo">2611</span>      scan.setLoadColumnFamiliesOnDemand(region.isLoadingCfsOnDemandDefault());<a name="line.2611"></a>
+<span class="sourceLineNo">2612</span>    }<a name="line.2612"></a>
+<span class="sourceLineNo">2613</span>    RegionScannerImpl scanner = null;<a name="line.2613"></a>
+<span class="sourceLineNo">2614</span>    try {<a name="line.2614"></a>
+<span class="sourceLineNo">2615</span>      scanner = region.getScanner(scan);<a name="line.2615"></a>
+<span class="sourceLineNo">2616</span>      scanner.next(results);<a name="line.2616"></a>
+<span class="sourceLineNo">2617</span>    } finally {<a name="line.2617"></a>
+<span class="sourceLineNo">2618</span>      if (scanner != null) {<a name="line.2618"></a>
+<span class="sourceLineNo">2619</span>        if (closeCallBack == null) {<a name="line.2619"></a>
+<span class="sourceLineNo">2620</span>          // If there is a context then the scanner can be added to the current<a name="line.2620"></a>
+<span class="sourceLineNo">2621</span>          // RpcCallContext. The rpc callback will take care of closing the<a name="line.2621"></a>
+<span class="sourceLineNo">2622</span>          // scanner, for eg in case<a name="line.2622"></a>
+<span class="sourceLineNo">2623</span>          // of get()<a name="line.2623"></a>
+<span class="sourceLineNo">2624</span>          context.setCallBack(scanner);<a name="line.2624"></a>
+<span class="sourceLineNo">2625</span>        } else {<a name="line.2625"></a>
+<span class="sourceLineNo">2626</span>          // The call is from multi() where the results from the get() are<a name="line.2626"></a>
+<span class="sourceLineNo">2627</span>          // aggregated and then send out to the<a name="line.2627"></a>
+<span class="sourceLineNo">2628</span>          // rpc. The rpccall back will close all such scanners created as part<a name="line.2628"></a>
+<span class="sourceLineNo">2629</span>          // of multi().<a name="line.2629"></a>
+<span class="sourceLineNo">2630</span>          closeCallBack.addScanner(scanner);<a name="line.2630"></a>
+<span class="sourceLineNo">2631</span>        }<a name="line.2631"></a>
+<span class="sourceLineNo">2632</span>      }<a name="line.2632"></a>
+<span class="sourceLineNo">2633</span>    }<a name="line.2633"></a>
+<span class="sourceLineNo">2634</span><a name="line.2634"></a>
+<span class="sourceLineNo">2635</span>    // post-get CP hook<a name="line.2635"></a>
+<span class="sourceLineNo">2636</span>    if (region.getCoprocessorHost() != null) {<a name="line.2636"></a>
+<span class="sourceLineNo">2637</span>      region.getCoprocessorHost().postGet(get, results);<a name="line.2637"></a>
+<span class="sourceLineNo">2638</span>    }<a name="line.2638"></a>
+<span class="sourceLineNo">2639</span>    region.metricsUpdateForGet(results, before);<a name="line.2639"></a>
+<span class="sourceLineNo">2640</span><a name="line.2640"></a>
+<span class="sourceLineNo">2641</span>    return Result.create(results, get.isCheckExistenceOnly() ? !results.isEmpty() : null, stale);<a name="line.2641"></a>
+<span class="sourceLineNo">2642</span>  }<a name="line.2642"></a>
+<span class="sourceLineNo">2643</span><a name="line.2643"></a>
+<span class="sourceLineNo">2644</span>  private void checkBatchSizeAndLogLargeSize(MultiRequest request) {<a name="line.2644"></a>
+<span class="sourceLineNo">2645</span>    int sum = 0;<a name="line.2645"></a>
+<span class="sourceLineNo">2646</span>    String firstRegionName = null;<a name="line.2646"></a>
+<span class="sourceLineNo">2647</span>    for (RegionAction regionAction : request.getRegionActionList()) {<a name="line.2647"></a>
+<span class="sourceLineNo">2648</span>      if (sum == 0) {<a name="line.2648"></a>
+<span class="sourceLineNo">2649</span>        firstRegionName = Bytes.toStringBinary(regionAction.getRegion().getValue().toByteArray());<a name="line.2649"></a>
+<span class="sourceLineNo">2650</span>      }<a name="line.2650"></a>
+<span class="sourceLineNo">2651</span>      sum += regionAction.getActionCount();<a name="line.2651"></a>
+<span class="sourceLineNo">2652</span>    }<a name="line.2652"></a>
+<span class="sourceLineNo">2653</span>    if (sum &gt; rowSizeWarnThreshold) {<a name="line.2653"></a>
+<span class="sourceLineNo">2654</span>      ld.logBatchWarning(firstRegionName, sum, rowSizeWarnThreshold);<a name="line.2654"></a>
+<span class="sourceLineNo">2655</span>    }<a name="line.2655"></a>
+<span class="sourceLineNo">2656</span>  }<a name="line.2656"></a>
+<span class="sourceLineNo">2657</span><a name="line.2657"></a>
+<span class="sourceLineNo">2658</span>  private void failRegionAction(MultiResponse.Builder responseBuilder,<a name="line.2658"></a>
+<span class="sourceLineNo">2659</span>      RegionActionResult.Builder regionActionResultBuilder, RegionAction regionAction,<a name="line.2659"></a>
+<span class="sourceLineNo">2660</span>      CellScanner cellScanner, Throwable error) {<a name="line.2660"></a>
+<span class="sourceLineNo">2661</span>    rpcServer.getMetrics().exception(error);<a name="line.2661"></a>
+<span class="sourceLineNo">2662</span>    regionActionResultBuilder.setException(ResponseConverter.buildException(error));<a name="line.2662"></a>
+<span class="sourceLineNo">2663</span>    responseBuilder.addRegionActionResult(regionActionResultBuilder.build());<a name="line.2663"></a>
+<span class="sourceLineNo">2664</span>    // All Mutations in this RegionAction not executed as we can not see the Region online here<a name="line.2664"></a>
+<span class="sourceLineNo">2665</span>    // in this RS. Will be retried from Client. Skipping all the Cells in CellScanner<a name="line.2665"></a>
+<span class="sourceLineNo">2666</span>    // corresponding to these Mutations.<a name="line.2666"></a>
+<span class="sourceLineNo">2667</span>    if (cellScanner != null) {<a name="line.2667"></a>
+<span class="sourceLineNo">2668</span>      skipCellsForMutations(regionAction.getActionList(), cellScanner);<a name="line.2668"></a>
+<span class="sourceLineNo">2669</span>    }<a name="line.2669"></a>
+<span class="sourceLineNo">2670</span>  }<a name="line.2670"></a>
+<span class="sourceLineNo">2671</span><a name="line.2671"></a>
+<span class="sourceLineNo">2672</span>  private boolean isReplicationRequest(Action action) {<a name="line.2672"></a>
+<span class="sourceLineNo">2673</span>    // replication request can only be put or delete.<a name="line.2673"></a>
+<span class="sourceLineNo">2674</span>    if (!action.hasMutation()) {<a name="line.2674"></a>
+<span class="sourceLineNo">2675</span>      return false;<a name="line.2675"></a>
+<span class="sourceLineNo">2676</span>    }<a name="line.2676"></a>
+<span class="sourceLineNo">2677</span>    MutationProto mutation = action.getMutation();<a name="line.2677"></a>
+<span class="sourceLineNo">2678</span>    MutationType type = mutation.getMutateType();<a name="line.2678"></a>
+<span class="sourceLineNo">2679</span>    if (type != MutationType.PUT &amp;&amp; type != MutationType.DELETE) {<a name="line.2679"></a>
+<span class="sourceLineNo">2680</span>      return false;<a name="line.2680"></a>
+<span class="sourceLineNo">2681</span>    }<a name="line.2681"></a>
+<span class="sourceLineNo">2682</span>    // replication will set a special attribute so we can make use of it to decide whether a request<a name="line.2682"></a>
+<span class="sourceLineNo">2683</span>    // is for replication.<a name="line.2683"></a>
+<span class="sourceLineNo">2684</span>    return mutation.getAttributeList().stream().map(p -&gt; p.getName())<a name="line.2684"></a>
+<span class="sourceLineNo">2685</span>      .filter(n -&gt; n.equals(ReplicationUtils.REPLICATION_ATTR_NAME)).findAny().isPresent();<a name="line.2685"></a>
+<span class="sourceLineNo">2686</span>  }<a name="line.2686"></a>
+<span class="sourceLineNo">2687</span><a name="line.2687"></a>
+<span class="sourceLineNo">2688</span>  /**<a name="line.2688"></a>
+<span class="sourceLineNo">2689</span>   * Execute multiple actions on a table: get, mutate, and/or execCoprocessor<a name="line.2689"></a>
+<span class="sourceLineNo">2690</span>   * @param rpcc the RPC controller<a name="line.2690"></a>
+<span class="sourceLineNo">2691</span>   * @param request the multi request<a name="line.2691"></a>
+<span class="sourceLineNo">2692</span>   * @throws ServiceException<a name="line.2692"></a>
+<span class="sourceLineNo">2693</span>   */<a name="line.2693"></a>
+<span class="sourceLineNo">2694</span>  @Override<a name="line.2694"></a>
+<span class="sourceLineNo">2695</span>  public MultiResponse multi(final RpcController rpcc, final MultiRequest request)<a name="line.2695"></a>
+<span class="sourceLineNo">2696</span>      throws ServiceException {<a name="line.2696"></a>
+<span class="sourceLineNo">2697</span>    try {<a name="line.2697"></a>
+<span class="sourceLineNo">2698</span>      checkOpen();<a name="line.2698"></a>
+<span class="sourceLineNo">2699</span>    } catch (IOException ie) {<a name="line.2699"></a>
+<span class="sourceLineNo">2700</span>      throw new ServiceException(ie);<a name="line.2700"></a>
+<span class="sourceLineNo">2701</span>    }<a name="line.2701"></a>
 <span class="sourceLineNo">2702</span><a name="line.2702"></a>
-<span class="sourceLineNo">2703</span>    // rpc controller is how we bring in data via the back door;  it is unprotobuf'ed data.<a name="line.2703"></a>
-<span class="sourceLineNo">2704</span>    // It is also the conduit via which we pass back data.<a name="line.2704"></a>
-<span class="sourceLineNo">2705</span>    HBaseRpcController controller = (HBaseRpcController)rpcc;<a name="line.2705"></a>
-<span class="sourceLineNo">2706</span>    CellScanner cellScanner = controller != null ? controller.cellScanner(): null;<a name="line.2706"></a>
-<span class="sourceLineNo">2707</span>    if (controller != null) {<a name="line.2707"></a>
-<span class="sourceLineNo">2708</span>      controller.setCellScanner(null);<a name="line.2708"></a>
-<span class="sourceLineNo">2709</span>    }<a name="line.2709"></a>
-<span class="sourceLineNo">2710</span><a name="line.2710"></a>
-<span class="sourceLineNo">2711</span>    long nonceGroup = request.hasNonceGroup() ? request.getNonceGroup() : HConstants.NO_NONCE;<a name="line.2711"></a>
+<span class="sourceLineNo">2703</span>    checkBatchSizeAndLogLargeSize(request);<a name="line.2703"></a>
+<span class="sourceLineNo">2704</span><a name="line.2704"></a>
+<span class="sourceLineNo">2705</span>    // rpc controller is how we bring in data via the back door;  it is unprotobuf'ed data.<a name="line.2705"></a>
+<span class="sourceLineNo">2706</span>    // It is also the conduit via which we pass back data.<a name="line.2706"></a>
+<span class="sourceLineNo">2707</span>    HBaseRpcController controller = (HBaseRpcController)rpcc;<a name="line.2707"></a>
+<span class="sourceLineNo">2708</span>    CellScanner cellScanner = controller != null ? controller.cellScanner(): null;<a name="line.2708"></a>
+<span class="sourceLineNo">2709</span>    if (controller != null) {<a name="line.2709"></a>
+<span class="sourceLineNo">2710</span>      controller.setCellScanner(null);<a name="line.2710"></a>
+<span class="sourceLineNo">2711</span>    }<a name="line.2711"></a>
 <span class="sourceLineNo">2712</span><a name="line.2712"></a>
-<span class="sourceLineNo">2713</span>    // this will contain all the cells that we need to return. It's created later, if needed.<a name="line.2713"></a>
-<span class="sourceLineNo">2714</span>    List&lt;CellScannable&gt; cellsToReturn = null;<a name="line.2714"></a>
-<span class="sourceLineNo">2715</span>    MultiResponse.Builder responseBuilder = MultiResponse.newBuilder();<a name="line.2715"></a>
-<span class="sourceLineNo">2716</span>    RegionActionResult.Builder regionActionResultBuilder = RegionActionResult.newBuilder();<a name="line.2716"></a>
-<span class="sourceLineNo">2717</span>    Boolean processed = null;<a name="line.2717"></a>
-<span class="sourceLineNo">2718</span>    RegionScannersCloseCallBack closeCallBack = null;<a name="line.2718"></a>
-<span class="sourceLineNo">2719</span>    RpcCallContext context = RpcServer.getCurrentCall().orElse(null);<a name="line.2719"></a>
-<span class="sourceLineNo">2720</span>    this.rpcMultiRequestCount.increment();<a name="line.2720"></a>
-<span class="sourceLineNo">2721</span>    this.requestCount.increment();<a name="line.2721"></a>
-<span class="sourceLineNo">2722</span>    Map&lt;RegionSpecifier, ClientProtos.RegionLoadStats&gt; regionStats = new HashMap&lt;&gt;(request<a name="line.2722"></a>
-<span class="sourceLineNo">2723</span>      .getRegionActionCount());<a name="line.2723"></a>
-<span class="sourceLineNo">2724</span>    ActivePolicyEnforcement spaceQuotaEnforcement = getSpaceQuotaManager().getActiveEnforcements();<a name="line.2724"></a>
-<span class="sourceLineNo">2725</span>    for (RegionAction regionAction : request.getRegionActionList()) {<a name="line.2725"></a>
-<span class="sourceLineNo">2726</span>      OperationQuota quota;<a name="line.2726"></a>
-<span class="sourceLineNo">2727</span>      HRegion region;<a name="line.2727"></a>
-<span class="sourceLineNo">2728</span>      regionActionResultBuilder.clear();<a name="line.2728"></a>
-<span class="sourceLineNo">2729</span>      RegionSpecifier regionSpecifier = regionAction.getRegion();<a name="line.2729"></a>
-<span class="sourceLineNo">2730</span>      try {<a name="line.2730"></a>
-<span class="sourceLineNo">2731</span>        region = getRegion(regionSpecifier);<a name="line.2731"></a>
-<span class="sourceLineNo">2732</span>        quota = getRpcQuotaManager().checkQuota(region, regionAction.getActionList());<a name="line.2732"></a>
-<span class="sourceLineNo">2733</span>      } catch (IOException e) {<a name="line.2733"></a>
-<span class="sourceLineNo">2734</span>        failRegionAction(responseBuilder, regionActionResultBuilder, regionAction, cellScanner, e);<a name="line.2734"></a>
-<span class="sourceLineNo">2735</span>        continue;  // For this region it's a failure.<a name="line.2735"></a>
-<span class="sourceLineNo">2736</span>      }<a name="line.2736"></a>
-<span class="sourceLineNo">2737</span>      boolean rejectIfFromClient = shouldRejectRequestsFromClient(region);<a name="line.2737"></a>
-<span class="sourceLineNo">2738</span>      if (regionAction.hasAtomic() &amp;&amp; regionAction.getAtomic()) {<a name="line.2738"></a>
-<span class="sourceLineNo">2739</span>        // We only allow replication in standby state and it will not set the atomic flag.<a name="line.2739"></a>
-<span class="sourceLineNo">2740</span>        if (rejectIfFromClient) {<a name="line.2740"></a>
-<span class="sourceLineNo">2741</span>          failRegionAction(responseBuilder, regionActionResultBuilder, regionAction, cellScanner,<a name="line.2741"></a>
-<span class="sourceLineNo">2742</span>            new DoNotRetryIOException(<a name="line.2742"></a>
-<span class="sourceLineNo">2743</span>              region.getRegionInfo().getRegionNameAsString() + " is in STANDBY state"));<a name="line.2743"></a>
-<span class="sourceLineNo">2744</span>          quota.close();<a name="line.2744"></a>
-<span class="sourceLineNo">2745</span>          continue;<a name="line.2745"></a>
-<span class="sourceLineNo">2746</span>        }<a name="line.2746"></a>
-<span class="sourceLineNo">2747</span>        // How does this call happen?  It may need some work to play well w/ the surroundings.<a name="line.2747"></a>
-<span class="sourceLineNo">2748</span>        // Need to return an item per Action along w/ Action index.  TODO.<a name="line.2748"></a>
-<span class="sourceLineNo">2749</span>        try {<a name="line.2749"></a>
-<span class="sourceLineNo">2750</span>          if (request.hasCondition()) {<a name="line.2750"></a>
-<span class="sourceLineNo">2751</span>            Condition condition = request.getCondition();<a name="line.2751"></a>
-<span class="sourceLineNo">2752</span>            byte[] row = condition.getRow().toByteArray();<a name="line.2752"></a>
-<span class="sourceLineNo">2753</span>            byte[] family = condition.getFamily().toByteArray();<a name="line.2753"></a>
-<span class="sourceLineNo">2754</span>            byte[] qualifier = condition.getQualifier().toByteArray();<a name="line.2754"></a>
-<span class="sourceLineNo">2755</span>            CompareOperator op =<a name="line.2755"></a>
-<span class="sourceLineNo">2756</span>              CompareOperator.valueOf(condition.getCompareType().name());<a name="line.2756"></a>
-<span class="sourceLineNo">2757</span>            ByteArrayComparable comparator =<a name="line.2757"></a>
-<span class="sourceLineNo">2758</span>                ProtobufUtil.toComparator(condition.getComparator());<a name="line.2758"></a>
-<span class="sourceLineNo">2759</span>            TimeRange timeRange = condition.hasTimeRange() ?<a name="line.2759"></a>
-<span class="sourceLineNo">2760</span>              ProtobufUtil.toTimeRange(condition.getTimeRange()) :<a name="line.2760"></a>
-<span class="sourceLineNo">2761</span>              TimeRange.allTime();<a name="line.2761"></a>
-<span class="sourceLineNo">2762</span>            processed =<a name="line.2762"></a>
-<span class="sourceLineNo">2763</span>              checkAndRowMutate(region, regionAction.getActionList(), cellScanner, row, family,<a name="line.2763"></a>
-<span class="sourceLineNo">2764</span>                qualifier, op, comparator, timeRange, regionActionResultBuilder,<a name="line.2764"></a>
-<span class="sourceLineNo">2765</span>                spaceQuotaEnforcement);<a name="line.2765"></a>
-<span class="sourceLineNo">2766</span>          } else {<a name="line.2766"></a>
-<span class="sourceLineNo">2767</span>            doAtomicBatchOp(regionActionResultBuilder, region, quota, regionAction.getActionList(),<a name="line.2767"></a>
-<span class="sourceLineNo">2768</span>              cellScanner, spaceQuotaEnforcement);<a name="line.2768"></a>
-<span class="sourceLineNo">2769</span>            processed = Boolean.TRUE;<a name="line.2769"></a>
-<span class="sourceLineNo">2770</span>          }<a name="line.2770"></a>
-<span class="sourceLineNo">2771</span>        } catch (IOException e) {<a name="line.2771"></a>
-<span class="sourceLineNo">2772</span>          rpcServer.getMetrics().exception(e);<a name="line.2772"></a>
-<span class="sourceLineNo">2773</span>          // As it's atomic, we may expect it's a global failure.<a name="line.2773"></a>
-<span class="sourceLineNo">2774</span>          regionActionResultBuilder.setException(ResponseConverter.buildException(e));<a name="line.2774"></a>
-<span class="sourceLineNo">2775</span>        }<a name="line.2775"></a>
-<span class="sourceLineNo">2776</span>      } else {<a name="line.2776"></a>
-<span class="sourceLineNo">2777</span>        if (rejectIfFromClient &amp;&amp; regionAction.getActionCount() &gt; 0 &amp;&amp;<a name="line.2777"></a>
-<span class="sourceLineNo">2778</span>          !isReplicationRequest(regionAction.getAction(0))) {<a name="line.2778"></a>
-<span class="sourceLineNo">2779</span>          // fail if it is not a replication request<a name="line.2779"></a>
-<span class="sourceLineNo">2780</span>          failRegionAction(responseBuilder, regionActionResultBuilder, regionAction, cellScanner,<a name="line.2780"></a>
-<span class="sourceLineNo">2781</span>            new DoNotRetryIOException(<a name="line.2781"></a>
-<span class="sourceLineNo">2782</span>              region.getRegionInfo().getRegionNameAsString() + " is in STANDBY state"));<a name="line.2782"></a>
-<span class="sourceLineNo">2783</span>          quota.close();<a name="line.2783"></a>
-<span class="sourceLineNo">2784</span>          continue;<a name="line.2784"></a>
-<span class="sourceLineNo">2785</span>        }<a name="line.2785"></a>
-<span class="sourceLineNo">2786</span>        // doNonAtomicRegionMutation manages the exception internally<a name="line.2786"></a>
-<span class="sourceLineNo">2787</span>        if (context != null &amp;&amp; closeCallBack == null) {<a name="line.2787"></a>
-<span class="sourceLineNo">2788</span>          // An RpcCallBack that creates a list of scanners that needs to perform callBack<a name="line.2788"></a>
-<span class="sourceLineNo">2789</span>          // operation on completion of multiGets.<a name="line.2789"></a>
-<span class="sourceLineNo">2790</span>          // Set this only once<a name="line.2790"></a>
-<span class="sourceLineNo">2791</span>          closeCallBack = new RegionScannersCloseCallBack();<a name="line.2791"></a>
-<span class="sourceLineNo">2792</span>          context.setCallBack(closeCallBack);<a name="line.2792"></a>
-<span class="sourceLineNo">2793</span>        }<a name="line.2793"></a>
-<span class="sourceLineNo">2794</span>        cellsToReturn = doNonAtomicRegionMutation(region, quota, regionAction, cellScanner,<a name="line.2794"></a>
-<span class="sourceLineNo">2795</span>            regionActionResultBuilder, cellsToReturn, nonceGroup, closeCallBack, context,<a name="line.2795"></a>
-<span class="sourceLineNo">2796</span>            spaceQuotaEnforcement);<a name="line.2796"></a>
-<span class="sourceLineNo">2797</span>      }<a name="line.2797"></a>
-<span class="sourceLineNo">2798</span>      responseBuilder.addRegionActionResult(regionActionResultBuilder.build());<a name="line.2798"></a>
-<span class="sourceLineNo">2799</span>      quota.close();<a name="line.2799"></a>
-<span class="sourceLineNo">2800</span>      ClientProtos.RegionLoadStats regionLoadStats = region.getLoadStatistics();<a name="line.2800"></a>
-<span class="sourceLineNo">2801</span>      if (regionLoadStats != null) {<a name="line.2801"></a>
-<span class="sourceLineNo">2802</span>        regionStats.put(regionSpecifier, regionLoadStats);<a name="line.2802"></a>
-<span class="sourceLineNo">2803</span>      }<a name="line.2803"></a>
-<span class="sourceLineNo">2804</span>    }<a name="line.2804"></a>
-<span class="sourceLineNo">2805</span>    // Load the controller with the Cells to return.<a name="line.2805"></a>
-<span class="sourceLineNo">2806</span>    if (cellsToReturn != null &amp;&amp; !cellsToReturn.isEmpty() &amp;&amp; controller != null) {<a name="line.2806"></a>
-<span class="sourceLineNo">2807</span>      controller.setCellScanner(CellUtil.createCellScanner(cellsToReturn));<a name="line.2807"></a>
-<span class="sourceLineNo">2808</span>    }<a name="line.2808"></a>
-<span class="sourceLineNo">2809</span><a name="line.2809"></a>
-<span class="sourceLineNo">2810</span>    if (processed != null) {<a name="line.2810"></a>
-<span class="sourceLineNo">2811</span>      responseBuilder.setProcessed(processed);<a name="line.2811"></a>
-<span class="sourceLineNo">2812</span>    }<a name="line.2812"></a>
-<span class="sourceLineNo">2813</span><a name="line.2813"></a>
-<span class="sourceLineNo">2814</span>    MultiRegionLoadStats.Builder builder = MultiRegionLoadStats.newBuilder();<a name="line.2814"></a>
-<span class="sourceLineNo">2815</span>    for(Entry&lt;RegionSpecifier, ClientProtos.RegionLoadStats&gt; stat: regionStats.entrySet()){<a name="line.2815"></a>
-<span class="sourceLineNo">2816</span>      builder.addRegion(stat.getKey());<a name="line.2816"></a>
-<span class="sourceLineNo">2817</span>      builder.addStat(stat.getValue());<a name="line.2817"></a>
-<span class="sourceLineNo">2818</span>    }<a name="line.2818"></a>
-<span class="sourceLineNo">2819</span>    responseBuilder.setRegionStatistics(builder);<a name="line.2819"></a>
-<span class="sourceLineNo">2820</span>    return responseBuilder.build();<a name="line.2820"></a>
-<span class="sourceLineNo">2821</span>  }<a name="line.2821"></a>
-<span class="sourceLineNo">2822</span><a name="line.2822"></a>
-<span class="sourceLineNo">2823</span>  private void skipCellsForMutations(List&lt;Action&gt; actions, CellScanner cellScanner) {<a name="line.2823"></a>
-<span class="sourceLineNo">2824</span>    if (cellScanner == null) {<a name="line.2824"></a>
-<span class="sourceLineNo">2825</span>      return;<a name="line.2825"></a>
-<span class="sourceLineNo">2826</span>    }<a name="line.2826"></a>
-<span class="sourceLineNo">2827</span>    for (Action action : actions) {<a name="line.2827"></a>
-<span class="sourceLineNo">2828</span>      skipCellsForMutation(action, cellScanner);<a name="line.2828"></a>
-<span class="sourceLineNo">2829</span>    }<a name="line.2829"></a>
-<span class="sourceLineNo">2830</span>  }<a name="line.2830"></a>
-<span class="sourceLineNo">2831</span><a name="line.2831"></a>
-<span class="sourceLineNo">2832</span>  private void skipCellsForMutation(Action action, CellScanner cellScanner) {<a name="line.2832"></a>
-<span class="sourceLineNo">2833</span>    if (cellScanner == null) {<a name="line.2833"></a>
-<span class="sourceLineNo">2834</span>      return;<a name="line.2834"></a>
-<span class="sourceLineNo">2835</span>    }<a name="line.2835"></a>
-<span class="sourceLineNo">2836</span>    try {<a name="line.2836"></a>
-<span class="sourceLineNo">2837</span>      if (action.hasMutation()) {<a name="line.2837"></a>
-<span class="sourceLineNo">2838</span>        MutationProto m = action.getMutation();<a name="line.2838"></a>
-<span class="sourceLineNo">2839</span>        if (m.hasAssociatedCellCount()) {<a name="line.2839"></a>
-<span class="sourceLineNo">2840</span>          for (int i = 0; i &lt; m.getAssociatedCellCount(); i++) {<a name="line.2840"></a>
-<span class="sourceLineNo">2841</span>            cellScanner.advance();<a name="line.2841"></a>
-<span class="sourceLineNo">2842</span>          }<a name="line.2842"></a>
-<span class="sourceLineNo">2843</span>        }<a name="line.2843"></a>
-<span class="sourceLineNo">2844</span>      }<a name="line.2844"></a>
-<span class="sourceLineNo">2845</span>    } catch (IOException e) {<a name="line.2845"></a>
-<span class="sourceLineNo">2846</span>      // No need to handle these Individual Muatation level issue. Any way this entire RegionAction<a name="line.2846"></a>
-<span class="sourceLineNo">2847</span>      // marked as failed as we could not see the Region here. At client side the top level<a name="line.2847"></a>
-<span class="sourceLineNo">2848</span>      // RegionAction exception will be considered first.<a name="line.2848"></a>
-<span class="sourceLineNo">2849</span>      LOG.error("Error while skipping Cells in CellScanner for invalid Region Mutations", e);<a name="line.2849"></a>
-<span class="sourceLineNo">2850</span>    }<a name="line.2850"></a>
-<span class="sourceLineNo">2851</span>  }<a name="line.2851"></a>
-<span class="sourceLineNo">2852</span><a name="line.2852"></a>
-<span class="sourceLineNo">2853</span>  /**<a name="line.2853"></a>
-<span class="sourceLineNo">2854</span>   * Mutate data in a table.<a name="line.2854"></a>
-<span class="sourceLineNo">2855</span>   *<a name="line.2855"></a>
-<span class="sourceLineNo">2856</span>   * @param rpcc the RPC controller<a name="line.2856"></a>
-<span class="sourceLineNo">2857</span>   * @param request the mutate request<a name="line.2857"></a>
-<span class="sourceLineNo">2858</span>   */<a name="line.2858"></a>
-<span class="sourceLineNo">2859</span>  @Override<a name="line.2859"></a>
-<span class="sourceLineNo">2860</span>  public MutateResponse mutate(final RpcController rpcc, final MutateRequest request)<a name="line.2860"></a>
-<span class="sourceLineNo">2861</span>      throws ServiceException {<a name="line.2861"></a>
-<span class="sourceLineNo">2862</span>    // rpc controller is how we bring in data via the back door;  it is unprotobuf'ed data.<a name="line.2862"></a>
-<span class="sourceLineNo">2863</span>    // It is also the conduit via which we pass back data.<a name="line.2863"></a>
-<span class="sourceLineNo">2864</span>    HBaseRpcController controller = (HBaseRpcController)rpcc;<a name="line.2864"></a>
-<span class="sourceLineNo">2865</span>    CellScanner cellScanner = controller != null ? controller.cellScanner() : null;<a name="line.2865"></a>
-<span class="sourceLineNo">2866</span>    OperationQuota quota = null;<a name="line.2866"></a>
-<span class="sourceLineNo">2867</span>    RpcCallContext context = RpcServer.getCurrentCall().orElse(null);<a name="line.2867"></a>
-<span class="sourceLineNo">2868</span>    ActivePolicyEnforcement spaceQuotaEnforcement = null;<a name="line.2868"></a>
-<span class="sourceLineNo">2869</span>    MutationType type = null;<a name="line.2869"></a>
-<span class="sourceLineNo">2870</span>    HRegion region = null;<a name="line.2870"></a>
-<span class="sourceLineNo">2871</span>    long before = EnvironmentEdgeManager.currentTime();<a name="line.2871"></a>
-<span class="sourceLineNo">2872</span>    // Clear scanner so we are not holding on to reference across call.<a name="line.2872"></a>
-<span class="sourceLineNo">2873</span>    if (controller != null) {<a name="line.2873"></a>
-<span class="sourceLineNo">2874</span>      controller.setCellScanner(null);<a name="line.2874"></a>
-<span class="sourceLineNo">2875</span>    }<a name="line.2875"></a>
-<span class="sourceLineNo">2876</span>    try {<a name="line.2876"></a>
-<span class="sourceLineNo">2877</span>      checkOpen();<a name="line.2877"></a>
-<span class="sourceLineNo">2878</span>      requestCount.increment();<a name="line.2878"></a>
-<span class="sourceLineNo">2879</span>      rpcMutateRequestCount.increment();<a name="line.2879"></a>
-<span class="sourceLineNo">2880</span>      region = getRegion(request.getRegion());<a name="line.2880"></a>
-<span class="sourceLineNo">2881</span>      rejectIfInStandByState(region);<a name="line.2881"></a>
-<span class="sourceLineNo">2882</span>      MutateResponse.Builder builder = MutateResponse.newBuilder();<a name="line.2882"></a>
-<span class="sourceLineNo">2883</span>      MutationProto mutation = request.getMutation();<a name="line.2883"></a>
-<span class="sourceLineNo">2884</span>      if (!region.getRegionInfo().isMetaRegion()) {<a name="line.2884"></a>
-<span class="sourceLineNo">2885</span>        regionServer.cacheFlusher.reclaimMemStoreMemory();<a name="line.2885"></a>
-<span class="sourceLineNo">2886</span>      }<a name="line.2886"></a>
-<span class="sourceLineNo">2887</span>      long nonceGroup = request.hasNonceGroup() ? request.getNonceGroup() : HConstants.NO_NONCE;<a name="line.2887"></a>
-<span class="sourceLineNo">2888</span>      Result r = null;<a name="line.2888"></a>
-<span class="sourceLineNo">2889</span>      Boolean processed = null;<a name="line.2889"></a>
-<span class="sourceLineNo">2890</span>      type = mutation.getMutateType();<a name="line.2890"></a>
-<span class="sourceLineNo">2891</span><a name="line.2891"></a>
-<span class="sourceLineNo">2892</span>      quota = getRpcQuotaManager().checkQuota(region, OperationQuota.OperationType.MUTATE);<a name="line.2892"></a>
-<span class="sourceLineNo">2893</span>      spaceQuotaEnforcement = getSpaceQuotaManager().getActiveEnforcements();<a name="line.2893"></a>
-<span class="sourceLineNo">2894</span><a name="line.2894"></a>
-<span class="sourceLineNo">2895</span>      switch (type) {<a name="line.2895"></a>
-<span class="sourceLineNo">2896</span>        case APPEND:<a name="line.2896"></a>
-<span class="sourceLineNo">2897</span>          // TODO: this doesn't actually check anything.<a name="line.2897"></a>
-<span class="sourceLineNo">2898</span>          r = append(region, quota, mutation, cellScanner, nonceGroup, spaceQuotaEnforcement);<a name="line.2898"></a>
-<span class="sourceLineNo">2899</span>          break;<a name="line.2899"></a>
-<span class="sourceLineNo">2900</span>        case INCREMENT:<a name="line.2900"></a>
-<span class="sourceLineNo">2901</span>          // TODO: this doesn't actually check anything.<a name="line.2901"></a>
-<span class="sourceLineNo">2902</span>          r = increment(region, quota, mutation, cellScanner, nonceGroup, spaceQuotaEnforcement);<a name="line.2902"></a>
-<span class="sourceLineNo">2903</span>          break;<a name="line.2903"></a>
-<span class="sourceLineNo">2904</span>        case PUT:<a name="line.2904"></a>
-<span class="sourceLineNo">2905</span>          Put put = ProtobufUtil.toPut(mutation, cellScanner);<a name="line.2905"></a>
-<span class="sourceLineNo">2906</span>          checkCellSizeLimit(region, put);<a name="line.2906"></a>
-<span class="sourceLineNo">2907</span>          // Throws an exception when violated<a name="line.2907"></a>
-<span class="sourceLineNo">2908</span>          spaceQuotaEnforcement.getPolicyEnforcement(region).check(put);<a name="line.2908"></a>
-<span class="sourceLineNo">2909</span>          quota.addMutation(put);<a name="line.2909"></a>
-<span class="sourceLineNo">2910</span>          if (request.hasCondition()) {<a name="line.2910"></a>
-<span class="sourceLineNo">2911</span>            Condition condition = request.getCondition();<a name="line.2911"></a>
-<span class="sourceLineNo">2912</span>            byte[] row = condition.getRow().toByteArray();<a name="line.2912"></a>
-<span class="sourceLineNo">2913</span>            byte[] family = condition.getFamily().toByteArray();<a name="line.2913"></a>
-<span class="sourceLineNo">2914</span>            byte[] qualifier = condition.getQualifier().toByteArray();<a name="line.2914"></a>
-<span class="sourceLineNo">2915</span>            CompareOperator compareOp =<a name="line.2915"></a>
-<span class="sourceLineNo">2916</span>              CompareOperator.valueOf(condition.getCompareType().name());<a name="line.2916"></a>
-<span class="sourceLineNo">2917</span>            ByteArrayComparable comparator = ProtobufUtil.toComparator(condition.getComparator());<a name="line.2917"></a>
-<span class="sourceLineNo">2918</span>            TimeRange timeRange = condition.hasTimeRange() ?<a name="line.2918"></a>
-<span class="sourceLineNo">2919</span>              ProtobufUtil.toTimeRange(condition.getTimeRange()) :<a name="line.2919"></a>
-<span class="sourceLineNo">2920</span>              TimeRange.allTime();<a name="line.2920"></a>
-<span class="sourceLineNo">2921</span>            if (region.getCoprocessorHost() != null) {<a name="line.2921"></a>
-<span class="sourceLineNo">2922</span>              processed = region.getCoprocessorHost().preCheckAndPut(row, family, qualifier,<a name="line.2922"></a>
-<span class="sourceLineNo">2923</span>                  compareOp, comparator, put);<a name="line.2923"></a>
-<span class="sourceLineNo">2924</span>            }<a name="line.2924"></a>
-<span class="sourceLineNo">2925</span>            if (processed == null) {<a name="line.2925"></a>
-<span class="sourceLineNo">2926</span>              boolean result = region.checkAndMutate(row, family,<a name="line.2926"></a>
-<span class="sourceLineNo">2927</span>                qualifier, compareOp, comparator, timeRange, put);<a name="line.2927"></a>
-<span class="sourceLineNo">2928</span>              if (region.getCoprocessorHost() != null) {<a name="line.2928"></a>
-<span class="sourceLineNo">2929</span>                result = region.getCoprocessorHost().postCheckAndPut(row, family,<a name="line.2929"></a>
-<span class="sourceLineNo">2930</span>                  qualifier, compareOp, comparator, put, result);<a name="line.2930"></a>
-<span class="sourceLineNo">2931</span>              }<a name="line.2931"></a>
-<span class="sourceLineNo">2932</span>              processed = result;<a name="line.2932"></a>
-<span class="sourceLineNo">2933</span>            }<a name="line.2933"></a>
-<span class="sourceLineNo">2934</span>          } else {<a name="line.2934"></a>
-<span class="sourceLineNo">2935</span>            region.put(put);<a name="line.2935"></a>
-<span class="sourceLineNo">2936</span>            processed = Boolean.TRUE;<a name="line.2936"></a>
-<span class="sourceLineNo">2937</span>          }<a name="line.2937"></a>
-<span class="sourceLineNo">2938</span>          break;<a name="line.2938"></a>
-<span class="sourceLineNo">2939</span>        case DELETE:<a name="line.2939"></a>
-<span class="sourceLineNo">2940</span>          Delete delete = ProtobufUtil.toDelete(mutation, cellScanner);<a name="line.2940"></a>
-<span class="sourceLineNo">2941</span>          checkCellSizeLimit(region, delete);<a name="line.2941"></a>
-<span class="sourceLineNo">2942</span>          spaceQuotaEnforcement.getPolicyEnforcement(region).check(delete);<a name="line.2942"></a>
-<span class="sourceLineNo">2943</span>          quota.addMutation(delete);<a name="line.2943"></a>
-<span class="sourceLineNo">2944</span>          if (request.hasCondition()) {<a name="line.2944"></a>
-<span class="sourceLineNo">2945</span>            Condition condition = request.getCondition();<a name="line.2945"></a>
-<span class="sourceLineNo">2946</span>            byte[] row = condition.getRow().toByteArray();<a name="line.2946"></a>
-<span class="sourceLineNo">2947</span>            byte[] family = condition.getFamily().toByteArray();<a name="line.2947"></a>
-<span class="sourceLineNo">2948</span>            byte[] qualifier = condition.getQualifier().toByteArray();<a name="line.2948"></a>
-<span class="sourceLineNo">2949</span>            CompareOperator op = CompareOperator.valueOf(condition.getCompareType().name());<a name="line.2949"></a>
-<span class="sourceLineNo">2950</span>            ByteArrayComparable comparator = ProtobufUtil.toComparator(condition.getComparator());<a name="line.2950"></a>
-<span class="sourceLineNo">2951</span>            TimeRange timeRange = condition.hasTimeRange() ?<a name="line.2951"></a>
-<span class="sourceLineNo">2952</span>              ProtobufUtil.toTimeRange(condition.getTimeRange()) :<a name="line.2952"></a>
-<span class="sourceLineNo">2953</span>              TimeRange.allTime();<a name="line.2953"></a>
-<span class="sourceLineNo">2954</span>            if (region.getCoprocessorHost() != null) {<a name="line.2954"></a>
-<span class="sourceLineNo">2955</span>              processed = region.getCoprocessorHost().preCheckAndDelete(row, family, qualifier, op,<a name="line.2955"></a>
-<span class="sourceLineNo">2956</span>                  comparator, delete);<a name="line.2956"></a>
-<span class="sourceLineNo">2957</span>            }<a name="line.2957"></a>
-<span class="sourceLineNo">2958</span>            if (processed == null) {<a name="line.2958"></a>
-<span class="sourceLineNo">2959</span>              boolean result = region.checkAndMutate(row, family,<a name="line.2959"></a>
-<span class="sourceLineNo">2960</span>                qualifier, op, comparator, timeRange, delete);<a name="line.2960"></a>
-<span class="sourceLineNo">2961</span>              if (region.getCoprocessorHost() != null) {<a name="line.2961"></a>
-<span class="sourceLineNo">2962</span>                result = region.getCoprocessorHost().postCheckAndDelete(row, family,<a name="line.2962"></a>
-<span class="sourceLineNo">2963</span>                  qualifier, op, comparator, delete, result);<a name="line.2963"></a>
-<span class="sourceLineNo">2964</span>              }<a name="line.2964"></a>
-<span class="sourceLineNo">2965</span>              processed = result;<a name="line.2965"></a>
-<span class="sourceLineNo">2966</span>            }<a name="line.2966"></a>
-<span class="sourceLineNo">2967</span>          } else {<a name="line.2967"></a>
-<span class="sourceLineNo">2968</span>            region.delete(delete);<a name="line.2968"></a>
-<span class="sourceLineNo">2969</span>            processed = Boolean.TRUE;<a name="line.2969"></a>
-<span class="sourceLineNo">2970</span>          }<a name="line.2970"></a>
-<span class="sourceLineNo">2971</span>          break;<a name="line.2971"></a>
-<span class="sourceLineNo">2972</span>        default:<a name="line.2972"></a>
-<span class="sourceLineNo">2973</span>          throw new DoNotRetryIOException("Unsupported mutate type: " + type.name());<a name="line.2973"></a>
-<span class="sourceLineNo">2974</span>      }<a name="line.2974"></a>
-<span class="sourceLineNo">2975</span>      if (processed != null) {<a name="line.2975"></a>
-<span class="sourceLineNo">2976</span>        builder.setProcessed(processed.booleanValue());<a name="line.2976"></a>
-<span class="sourceLineNo">2977</span>      }<a name="line.2977"></a>
-<span class="sourceLineNo">2978</span>      boolean clientCellBlockSupported = isClientCellBlockSupport(context);<a name="line.2978"></a>
-<span class="sourceLineNo">2979</span>      addResult(builder, r, controller, clientCellBlockSupported);<a name="line.2979"></a>
-<span class="sourceLineNo">2980</span>      if (clientCellBlockSupported) {<a name="line.2980"></a>
-<span class="sourceLineNo">2981</span>        addSize(context, r, null);<a name="line.2981"></a>
-<span class="sourceLineNo">2982</span>      }<a name="line.2982"></a>
-<span class="sourceLineNo">2983</span>      return builder.build();<a name="line.2983"></a>
-<span class="sourceLineNo">2984</span>    } catch (IOException ie) {<a name="line.2984"></a>
-<span class="sourceLineNo">2985</span>      regionServer.checkFileSystem();<a name="line.2985"></a>
-<span class="sourceLineNo">2986</span>      throw new ServiceException(ie);<a name="line.2986"></a>
-<span class="sourceLineNo">2987</span>    } finally {<a name="line.2987"></a>
-<span class="sourceLineNo">2988</span>      if (quota != null) {<a name="line.2988"></a>
-<span class="sourceLineNo">2989</span>        quota.close();<a name="line.2989"></a>
-<span class="sourceLineNo">2990</span>      }<a name="line.2990"></a>
-<span class="sourceLineNo">2991</span>      // Update metrics<a name="line.2991"></a>
-<span class="sourceLineNo">2992</span>      if (regionServer.metricsRegionServer != null &amp;&amp; type != null) {<a name="line.2992"></a>
-<span class="sourceLineNo">2993</span>        long after = EnvironmentEdgeManager.currentTime();<a name="line.2993"></a>
-<span class="sourceLineNo">2994</span>        switch (type) {<a name="line.2994"></a>
-<span class="sourceLineNo">2995</span>        case DELETE:<a name="line.2995"></a>
-<span class="sourceLineNo">2996</span>          if (request.hasCondition()) {<a name="line.2996"></a>
-<span class="sourceLineNo">2997</span>            regionServer.metricsRegionServer.updateCheckAndDelete(after - before);<a name="line.2997"></a>
-<span class="sourceLineNo">2998</span>          } else {<a name="line.2998"></a>
-<span class="sourceLineNo">2999</span>            regionServer.metricsRegionServer.updateDelete(<a name="line.2999"></a>
-<span class="sourceLineNo">3000</span>                region == null ? null : region.getRegionInfo().getTable(), after - before);<a name="line.3000"></a>
-<span class="sourceLineNo">3001</span>          }<a name="line.3001"></a>
-<span class="sourceLineNo">3002</span>          break;<a name="line.3002"></a>
-<span class="sourceLineNo">3003</span>        case PUT:<a name="line.3003"></a>
-<span class="sourceLineNo">3004</span>          if (request.hasCondition()) {<a name="line.3004"></a>
-<span class="sourceLineNo">3005</span>            regionServer.metricsRegionServer.updateCheckAndPut(after - before);<a name="line.3005"></a>
-<span class="sourceLineNo">3006</span>          } else {<a name="line.3006"></a>
-<span class="sourceLineNo">3007</span>            regionServer.metricsRegionServer.updatePut(<a name="line.3007"></a>
-<span class="sourceLineNo">3008</span>                region == null ? null : region.getRegionInfo().getTable(),after - before);<a name="line.3008"></a>
-<span class="sourceLineNo">3009</span>          }<a name="line.3009"></a>
-<span class="sourceLineNo">3010</span>          break;<a name="line.3010"></a>
-<span class="sourceLineNo">3011</span>        default:<a name="line.3011"></a>
+<span class="sourceLineNo">2713</span>    long nonceGroup = request.hasNonceGroup() ? request.getNonceGroup() : HConstants.NO_NONCE;<a name="line.2713"></a>
+<span class="sourceLineNo">2714</span><a name="line.2714"></a>
+<span class="sourceLineNo">2715</span>    // this will contain all the cells that we need to return. It's created later, if needed.<a name="line.2715"></a>
+<span class="sourceLineNo">2716</span>    List&lt;CellScannable&gt; cellsToReturn = null;<a name="line.2716"></a>
+<span class="sourceLineNo">2717</span>    MultiResponse.Builder responseBuilder = MultiResponse.newBuilder();<a name="line.2717"></a>
+<span class="sourceLineNo">2718</span>    RegionActionResult.Builder regionActionResultBuilder = RegionActionResult.newBuilder();<a name="line.2718"></a>
+<span class="sourceLineNo">2719</span>    Boolean processed = null;<a name="line.2719"></a>
+<span class="sourceLineNo">2720</span>    RegionScannersCloseCallBack closeCallBack = null;<a name="line.2720"></a>
+<span class="sourceLineNo">2721</span>    RpcCallContext context = RpcServer.getCurrentCall().orElse(null);<a name="line.2721"></a>
+<span class="sourceLineNo">2722</span>    this.rpcMultiRequestCount.increment();<a name="line.2722"></a>
+<span class="sourceLineNo">2723</span>    this.requestCount.increment();<a name="line.2723"></a>
+<span class="sourceLineNo">2724</span>    Map&lt;RegionSpecifier, ClientProtos.RegionLoadStats&gt; regionStats = new HashMap&lt;&gt;(request<a name="line.2724"></a>
+<span class="sourceLineNo">2725</span>      .getRegionActionCount());<a name="line.2725"></a>
+<span class="sourceLineNo">2726</span>    ActivePolicyEnforcement spaceQuotaEnforcement = getSpaceQuotaManager().getActiveEnforcements();<a name="line.2726"></a>
+<span class="sourceLineNo">2727</span>    for (RegionAction regionAction : request.getRegionActionList()) {<a name="line.2727"></a>
+<span class="sourceLineNo">2728</span>      OperationQuota quota;<a name="line.2728"></a>
+<span class="sourceLineNo">2729</span>      HRegion region;<a name="line.2729"></a>
+<span class="sourceLineNo">2730</span>      regionActionResultBuilder.clear();<a name="line.2730"></a>
+<span class="sourceLineNo">2731</span>      RegionSpecifier regionSpecifier = regionAction.getRegion();<a name="line.2731"></a>
+<span class="sourceLineNo">2732</span>      try {<a name="line.2732"></a>
+<span class="sourceLineNo">2733</span>        region = getRegion(regionSpecifier);<a name="line.2733"></a>
+<span class="sourceLineNo">2734</span>        quota = getRpcQuotaManager().checkQuota(region, regionAction.getActionList());<a name="line.2734"></a>
+<span class="sourceLineNo">2735</span>      } catch (IOException e) {<a name="line.2735"></a>
+<span class="sourceLineNo">2736</span>        failRegionAction(responseBuilder, regionActionResultBuilder, regionAction, cellScanner, e);<a name="line.2736"></a>
+<span class="sourceLineNo">2737</span>        continue;  // For this region it's a failure.<a name="line.2737"></a>
+<span class="sourceLineNo">2738</span>      }<a name="line.2738"></a>
+<span class="sourceLineNo">2739</span>      boolean rejectIfFromClient = shouldRejectRequestsFromClient(region);<a name="line.2739"></a>
+<span class="sourceLineNo">2740</span>      if (regionAction.hasAtomic() &amp;&amp; regionAction.getAtomic()) {<a name="line.2740"></a>
+<span class="sourceLineNo">2741</span>        // We only allow replication in standby state and it will not set the atomic flag.<a name="line.2741"></a>
+<span class="sourceLineNo">2742</span>        if (rejectIfFromClient) {<a name="line.2742"></a>
+<span class="sourceLineNo">2743</span>          failRegionAction(responseBuilder, regionActionResultBuilder, regionAction, cellScanner,<a name="line.2743"></a>
+<span class="sourceLineNo">2744</span>            new DoNotRetryIOException(<a name="line.2744"></a>
+<span class="sourceLineNo">2745</span>              region.getRegionInfo().getRegionNameAsString() + " is in STANDBY state"));<a name="line.2745"></a>
+<span class="sourceLineNo">2746</span>          quota.close();<a name="line.2746"></a>
+<span class="sourceLineNo">2747</span>          continue;<a name="line.2747"></a>
+<span class="sourceLineNo">2748</span>        }<a name="line.2748"></a>
+<span class="sourceLineNo">2749</span>        // How does this call happen?  It may need some work to play well w/ the surroundings.<a name="line.2749"></a>
+<span class="sourceLineNo">2750</span>        // Need to return an item per Action along w/ Action index.  TODO.<a name="line.2750"></a>
+<span class="sourceLineNo">2751</span>        try {<a name="line.2751"></a>
+<span class="sourceLineNo">2752</span>          if (request.hasCondition()) {<a name="line.2752"></a>
+<span class="sourceLineNo">2753</span>            Condition condition = request.getCondition();<a name="line.2753"></a>
+<span class="sourceLineNo">2754</span>            byte[] row = condition.getRow().toByteArray();<a name="line.2754"></a>
+<span class="sourceLineNo">2755</span>            byte[] family = condition.getFamily().toByteArray();<a name="line.2755"></a>
+<span class="sourceLineNo">2756</span>            byte[] qualifier = condition.getQualifier().toByteArray();<a name="line.2756"></a>
+<span class="sourceLineNo">2757</span>            CompareOperator op =<a name="line.2757"></a>
+<span class="sourceLineNo">2758</span>              CompareOperator.valueOf(condition.getCompareType().name());<a name="line.2758"></a>
+<span class="sourceLineNo">2759</span>            ByteArrayComparable comparator =<a name="line.2759"></a>
+<span class="sourceLineNo">2760</span>                ProtobufUtil.toComparator(condition.getComparator());<a name="line.2760"></a>
+<span class="sourceLineNo">2761</span>            TimeRange timeRange = condition.hasTimeRange() ?<a name="line.2761"></a>
+<span class="sourceLineNo">2762</span>              ProtobufUtil.toTimeRange(condition.getTimeRange()) :<a name="line.2762"></a>
+<span class="sourceLineNo">2763</span>              TimeRange.allTime();<a name="line.2763"></a>
+<span class="sourceLineNo">2764</span>            processed =<a name="line.2764"></a>
+<span class="sourceLineNo">2765</span>              checkAndRowMutate(region, regionAction.getActionList(), cellScanner, row, family,<a name="line.2765"></a>
+<span class="sourceLineNo">2766</span>                qualifier, op, comparator, timeRange, regionActionResultBuilder,<a name="line.2766"></a>
+<span class="sourceLineNo">2767</span>                spaceQuotaEnforcement);<a name="line.2767"></a>
+<span class="sourceLineNo">2768</span>          } else {<a name="line.2768"></a>
+<span class="sourceLineNo">2769</span>            doAtomicBatchOp(regionActionResultBuilder, region, quota, regionAction.getActionList(),<a name="line.2769"></a>
+<span class="sourceLineNo">2770</span>              cellScanner, spaceQuotaEnforcement);<a name="line.2770"></a>
+<span class="sourceLineNo">2771</span>            processed = Boolean.TRUE;<a name="line.2771"></a>
+<span class="sourceLineNo">2772</span>          }<a name="line.2772"></a>
+<span class="sourceLineNo">2773</span>        } catch (IOException e) {<a name="line.2773"></a>
+<span class="sourceLineNo">2774</span>          rpcServer.getMetrics().exception(e);<a name="line.2774"></a>
+<span class="sourceLineNo">2775</span>          // As it's atomic, we may expect it's a global failure.<a name="line.2775"></a>
+<span class="sourceLineNo">2776</span>          regionActionResultBuilder.setException(ResponseConverter.buildException(e));<a name="line.2776"></a>
+<span class="sourceLineNo">2777</span>        }<a name="line.2777"></a>
+<span class="sourceLineNo">2778</span>      } else {<a name="line.2778"></a>
+<span class="sourceLineNo">2779</span>        if (rejectIfFromClient &amp;&amp; regionAction.getActionCount() &gt; 0 &amp;&amp;<a name="line.2779"></a>
+<span class="sourceLineNo">2780</span>          !isReplicationRequest(regionAction.getAction(0))) {<a name="line.2780"></a>
+<span class="sourceLineNo">2781</span>          // fail if it is not a replication request<a name="line.2781"></a>
+<span class="sourceLineNo">2782</span>          failRegionAction(responseBuilder, regionActionResultBuilder, regionAction, cellScanner,<a name="line.2782"></a>
+<span class="sourceLineNo">2783</span>            new DoNotRetryIOException(<a name="line.2783"></a>
+<span class="sourceLineNo">2784</span>              region.getRegionInfo().getRegionNameAsString() + " is in STANDBY state"));<a name="line.2784"></a>
+<span class="sourceLineNo">2785</span>          quota.close();<a name="line.2785"></a>
+<span class="sourceLineNo">2786</span>          continue;<a name="line.2786"></a>
+<span class="sourceLineNo">2787</span>        }<a name="line.2787"></a>
+<span class="sourceLineNo">2788</span>        // doNonAtomicRegionMutation manages the exception internally<a name="line.2788"></a>
+<span class="sourceLineNo">2789</span>        if (context != null &amp;&amp; closeCallBack == null) {<a name="line.2789"></a>
+<span class="sourceLineNo">2790</span>          // An RpcCallBack that creates a list of scanners that needs to perform callBack<a name="line.2790"></a>
+<span class="sourceLineNo">2791</span>          // operation on completion of multiGets.<a name="line.2791"></a>
+<span class="sourceLineNo">2792</span>          // Set this only once<a name="line.2792"></a>
+<span class="sourceLineNo">2793</span>          closeCallBack = new RegionScannersCloseCallBack();<a name="line.2793"></a>
+<span class="sourceLineNo">2794</span>          context.setCallBack(closeCallBack);<a name="line.2794"></a>
+<span class="sourceLineNo">2795</span>        }<a name="line.2795"></a>
+<span class="sourceLineNo">2796</span>        cellsToReturn = doNonAtomicRegionMutation(region, quota, regionAction, cellScanner,<a name="line.2796"></a>
+<span class="sourceLineNo">2797</span>            regionActionResultBuilder, cellsToReturn, nonceGroup, closeCallBack, context,<a name="line.2797"></a>
+<span class="sourceLineNo">2798</span>            spaceQuotaEnforcement);<a name="line.2798"></a>
+<span class="sourceLineNo">279

<TRUNCATED>

[38/46] hbase-site git commit: Published site at 05d22ed960204183fbd9bd16f1dbca6410ccde76.

Posted by gi...@apache.org.
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/3649682c/devapidocs/org/apache/hadoop/hbase/regionserver/HRegionServer.CompactionChecker.html
----------------------------------------------------------------------
diff --git a/devapidocs/org/apache/hadoop/hbase/regionserver/HRegionServer.CompactionChecker.html b/devapidocs/org/apache/hadoop/hbase/regionserver/HRegionServer.CompactionChecker.html
index 2ab8ea8..c1e278a 100644
--- a/devapidocs/org/apache/hadoop/hbase/regionserver/HRegionServer.CompactionChecker.html
+++ b/devapidocs/org/apache/hadoop/hbase/regionserver/HRegionServer.CompactionChecker.html
@@ -122,7 +122,7 @@ var activeTableTab = "activeTableTab";
 </dl>
 <hr>
 <br>
-<pre>private static class <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegionServer.html#line.1699">HRegionServer.CompactionChecker</a>
+<pre>private static class <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegionServer.html#line.1700">HRegionServer.CompactionChecker</a>
 extends <a href="../../../../../org/apache/hadoop/hbase/ScheduledChore.html" title="class in org.apache.hadoop.hbase">ScheduledChore</a></pre>
 </li>
 </ul>
@@ -233,7 +233,7 @@ extends <a href="../../../../../org/apache/hadoop/hbase/ScheduledChore.html" tit
 <ul class="blockList">
 <li class="blockList">
 <h4>instance</h4>
-<pre>private final&nbsp;<a href="../../../../../org/apache/hadoop/hbase/regionserver/HRegionServer.html" title="class in org.apache.hadoop.hbase.regionserver">HRegionServer</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegionServer.CompactionChecker.html#line.1700">instance</a></pre>
+<pre>private final&nbsp;<a href="../../../../../org/apache/hadoop/hbase/regionserver/HRegionServer.html" title="class in org.apache.hadoop.hbase.regionserver">HRegionServer</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegionServer.CompactionChecker.html#line.1701">instance</a></pre>
 </li>
 </ul>
 <a name="majorCompactPriority">
@@ -242,7 +242,7 @@ extends <a href="../../../../../org/apache/hadoop/hbase/ScheduledChore.html" tit
 <ul class="blockList">
 <li class="blockList">
 <h4>majorCompactPriority</h4>
-<pre>private final&nbsp;int <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegionServer.CompactionChecker.html#line.1701">majorCompactPriority</a></pre>
+<pre>private final&nbsp;int <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegionServer.CompactionChecker.html#line.1702">majorCompactPriority</a></pre>
 </li>
 </ul>
 <a name="DEFAULT_PRIORITY">
@@ -251,7 +251,7 @@ extends <a href="../../../../../org/apache/hadoop/hbase/ScheduledChore.html" tit
 <ul class="blockList">
 <li class="blockList">
 <h4>DEFAULT_PRIORITY</h4>
-<pre>private static final&nbsp;int <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegionServer.CompactionChecker.html#line.1702">DEFAULT_PRIORITY</a></pre>
+<pre>private static final&nbsp;int <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegionServer.CompactionChecker.html#line.1703">DEFAULT_PRIORITY</a></pre>
 <dl>
 <dt><span class="seeLabel">See Also:</span></dt>
 <dd><a href="../../../../../constant-values.html#org.apache.hadoop.hbase.regionserver.HRegionServer.CompactionChecker.DEFAULT_PRIORITY">Constant Field Values</a></dd>
@@ -264,7 +264,7 @@ extends <a href="../../../../../org/apache/hadoop/hbase/ScheduledChore.html" tit
 <ul class="blockListLast">
 <li class="blockList">
 <h4>iteration</h4>
-<pre>private&nbsp;long <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegionServer.CompactionChecker.html#line.1705">iteration</a></pre>
+<pre>private&nbsp;long <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegionServer.CompactionChecker.html#line.1706">iteration</a></pre>
 </li>
 </ul>
 </li>
@@ -281,7 +281,7 @@ extends <a href="../../../../../org/apache/hadoop/hbase/ScheduledChore.html" tit
 <ul class="blockListLast">
 <li class="blockList">
 <h4>CompactionChecker</h4>
-<pre><a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegionServer.CompactionChecker.html#line.1707">CompactionChecker</a>(<a href="../../../../../org/apache/hadoop/hbase/regionserver/HRegionServer.html" title="class in org.apache.hadoop.hbase.regionserver">HRegionServer</a>&nbsp;h,
+<pre><a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegionServer.CompactionChecker.html#line.1708">CompactionChecker</a>(<a href="../../../../../org/apache/hadoop/hbase/regionserver/HRegionServer.html" title="class in org.apache.hadoop.hbase.regionserver">HRegionServer</a>&nbsp;h,
                   int&nbsp;sleepTime,
                   <a href="../../../../../org/apache/hadoop/hbase/Stoppable.html" title="interface in org.apache.hadoop.hbase">Stoppable</a>&nbsp;stopper)</pre>
 </li>
@@ -300,7 +300,7 @@ extends <a href="../../../../../org/apache/hadoop/hbase/ScheduledChore.html" tit
 <ul class="blockListLast">
 <li class="blockList">
 <h4>chore</h4>
-<pre>protected&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegionServer.CompactionChecker.html#line.1721">chore</a>()</pre>
+<pre>protected&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegionServer.CompactionChecker.html#line.1722">chore</a>()</pre>
 <div class="block"><span class="descfrmTypeLabel">Description copied from class:&nbsp;<code><a href="../../../../../org/apache/hadoop/hbase/ScheduledChore.html#chore--">ScheduledChore</a></code></span></div>
 <div class="block">The task to execute on each scheduled execution of the Chore</div>
 <dl>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/3649682c/devapidocs/org/apache/hadoop/hbase/regionserver/HRegionServer.MovedRegionInfo.html
----------------------------------------------------------------------
diff --git a/devapidocs/org/apache/hadoop/hbase/regionserver/HRegionServer.MovedRegionInfo.html b/devapidocs/org/apache/hadoop/hbase/regionserver/HRegionServer.MovedRegionInfo.html
index 52d173c..1b331b6 100644
--- a/devapidocs/org/apache/hadoop/hbase/regionserver/HRegionServer.MovedRegionInfo.html
+++ b/devapidocs/org/apache/hadoop/hbase/regionserver/HRegionServer.MovedRegionInfo.html
@@ -113,7 +113,7 @@ var activeTableTab = "activeTableTab";
 </dl>
 <hr>
 <br>
-<pre>private static class <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegionServer.html#line.3414">HRegionServer.MovedRegionInfo</a>
+<pre>private static class <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegionServer.html#line.3415">HRegionServer.MovedRegionInfo</a>
 extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html?is-external=true" title="class or interface in java.lang">Object</a></pre>
 </li>
 </ul>
@@ -218,7 +218,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>serverName</h4>
-<pre>private final&nbsp;<a href="../../../../../org/apache/hadoop/hbase/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegionServer.MovedRegionInfo.html#line.3415">serverName</a></pre>
+<pre>private final&nbsp;<a href="../../../../../org/apache/hadoop/hbase/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegionServer.MovedRegionInfo.html#line.3416">serverName</a></pre>
 </li>
 </ul>
 <a name="seqNum">
@@ -227,7 +227,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>seqNum</h4>
-<pre>private final&nbsp;long <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegionServer.MovedRegionInfo.html#line.3416">seqNum</a></pre>
+<pre>private final&nbsp;long <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegionServer.MovedRegionInfo.html#line.3417">seqNum</a></pre>
 </li>
 </ul>
 <a name="ts">
@@ -236,7 +236,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockListLast">
 <li class="blockList">
 <h4>ts</h4>
-<pre>private final&nbsp;long <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegionServer.MovedRegionInfo.html#line.3417">ts</a></pre>
+<pre>private final&nbsp;long <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegionServer.MovedRegionInfo.html#line.3418">ts</a></pre>
 </li>
 </ul>
 </li>
@@ -253,7 +253,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockListLast">
 <li class="blockList">
 <h4>MovedRegionInfo</h4>
-<pre>public&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegionServer.MovedRegionInfo.html#line.3419">MovedRegionInfo</a>(<a href="../../../../../org/apache/hadoop/hbase/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a>&nbsp;serverName,
+<pre>public&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegionServer.MovedRegionInfo.html#line.3420">MovedRegionInfo</a>(<a href="../../../../../org/apache/hadoop/hbase/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a>&nbsp;serverName,
                        long&nbsp;closeSeqNum)</pre>
 </li>
 </ul>
@@ -271,7 +271,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <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/regionserver/HRegionServer.MovedRegionInfo.html#line.3425">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/regionserver/HRegionServer.MovedRegionInfo.html#line.3426">getServerName</a>()</pre>
 </li>
 </ul>
 <a name="getSeqNum--">
@@ -280,7 +280,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>getSeqNum</h4>
-<pre>public&nbsp;long&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegionServer.MovedRegionInfo.html#line.3429">getSeqNum</a>()</pre>
+<pre>public&nbsp;long&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegionServer.MovedRegionInfo.html#line.3430">getSeqNum</a>()</pre>
 </li>
 </ul>
 <a name="getMoveTime--">
@@ -289,7 +289,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockListLast">
 <li class="blockList">
 <h4>getMoveTime</h4>
-<pre>public&nbsp;long&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegionServer.MovedRegionInfo.html#line.3433">getMoveTime</a>()</pre>
+<pre>public&nbsp;long&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegionServer.MovedRegionInfo.html#line.3434">getMoveTime</a>()</pre>
 </li>
 </ul>
 </li>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/3649682c/devapidocs/org/apache/hadoop/hbase/regionserver/HRegionServer.MovedRegionsCleaner.html
----------------------------------------------------------------------
diff --git a/devapidocs/org/apache/hadoop/hbase/regionserver/HRegionServer.MovedRegionsCleaner.html b/devapidocs/org/apache/hadoop/hbase/regionserver/HRegionServer.MovedRegionsCleaner.html
index f6dd311..d07c034 100644
--- a/devapidocs/org/apache/hadoop/hbase/regionserver/HRegionServer.MovedRegionsCleaner.html
+++ b/devapidocs/org/apache/hadoop/hbase/regionserver/HRegionServer.MovedRegionsCleaner.html
@@ -122,7 +122,7 @@ var activeTableTab = "activeTableTab";
 </dl>
 <hr>
 <br>
-<pre>protected static final class <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegionServer.html#line.3501">HRegionServer.MovedRegionsCleaner</a>
+<pre>protected static final class <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegionServer.html#line.3502">HRegionServer.MovedRegionsCleaner</a>
 extends <a href="../../../../../org/apache/hadoop/hbase/ScheduledChore.html" title="class in org.apache.hadoop.hbase">ScheduledChore</a>
 implements <a href="../../../../../org/apache/hadoop/hbase/Stoppable.html" title="interface in org.apache.hadoop.hbase">Stoppable</a></pre>
 <div class="block">Creates a Chore thread to clean the moved region cache.</div>
@@ -242,7 +242,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/Stoppable.html" title
 <ul class="blockList">
 <li class="blockList">
 <h4>regionServer</h4>
-<pre>private&nbsp;<a href="../../../../../org/apache/hadoop/hbase/regionserver/HRegionServer.html" title="class in org.apache.hadoop.hbase.regionserver">HRegionServer</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegionServer.MovedRegionsCleaner.html#line.3502">regionServer</a></pre>
+<pre>private&nbsp;<a href="../../../../../org/apache/hadoop/hbase/regionserver/HRegionServer.html" title="class in org.apache.hadoop.hbase.regionserver">HRegionServer</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegionServer.MovedRegionsCleaner.html#line.3503">regionServer</a></pre>
 </li>
 </ul>
 <a name="stoppable">
@@ -251,7 +251,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/Stoppable.html" title
 <ul class="blockListLast">
 <li class="blockList">
 <h4>stoppable</h4>
-<pre><a href="../../../../../org/apache/hadoop/hbase/Stoppable.html" title="interface in org.apache.hadoop.hbase">Stoppable</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegionServer.MovedRegionsCleaner.html#line.3503">stoppable</a></pre>
+<pre><a href="../../../../../org/apache/hadoop/hbase/Stoppable.html" title="interface in org.apache.hadoop.hbase">Stoppable</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegionServer.MovedRegionsCleaner.html#line.3504">stoppable</a></pre>
 </li>
 </ul>
 </li>
@@ -268,7 +268,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/Stoppable.html" title
 <ul class="blockListLast">
 <li class="blockList">
 <h4>MovedRegionsCleaner</h4>
-<pre>private&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegionServer.MovedRegionsCleaner.html#line.3505">MovedRegionsCleaner</a>(<a href="../../../../../org/apache/hadoop/hbase/regionserver/HRegionServer.html" title="class in org.apache.hadoop.hbase.regionserver">HRegionServer</a>&nbsp;regionServer,
+<pre>private&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegionServer.MovedRegionsCleaner.html#line.3506">MovedRegionsCleaner</a>(<a href="../../../../../org/apache/hadoop/hbase/regionserver/HRegionServer.html" title="class in org.apache.hadoop.hbase.regionserver">HRegionServer</a>&nbsp;regionServer,
                             <a href="../../../../../org/apache/hadoop/hbase/Stoppable.html" title="interface in org.apache.hadoop.hbase">Stoppable</a>&nbsp;stoppable)</pre>
 </li>
 </ul>
@@ -286,7 +286,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/Stoppable.html" title
 <ul class="blockList">
 <li class="blockList">
 <h4>create</h4>
-<pre>static&nbsp;<a href="../../../../../org/apache/hadoop/hbase/regionserver/HRegionServer.MovedRegionsCleaner.html" title="class in org.apache.hadoop.hbase.regionserver">HRegionServer.MovedRegionsCleaner</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegionServer.MovedRegionsCleaner.html#line.3513">create</a>(<a href="../../../../../org/apache/hadoop/hbase/regionserver/HRegionServer.html" title="class in org.apache.hadoop.hbase.regionserver">HRegionServer</a>&nbsp;rs)</pre>
+<pre>static&nbsp;<a href="../../../../../org/apache/hadoop/hbase/regionserver/HRegionServer.MovedRegionsCleaner.html" title="class in org.apache.hadoop.hbase.regionserver">HRegionServer.MovedRegionsCleaner</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegionServer.MovedRegionsCleaner.html#line.3514">create</a>(<a href="../../../../../org/apache/hadoop/hbase/regionserver/HRegionServer.html" title="class in org.apache.hadoop.hbase.regionserver">HRegionServer</a>&nbsp;rs)</pre>
 </li>
 </ul>
 <a name="chore--">
@@ -295,7 +295,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/Stoppable.html" title
 <ul class="blockList">
 <li class="blockList">
 <h4>chore</h4>
-<pre>protected&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegionServer.MovedRegionsCleaner.html#line.3524">chore</a>()</pre>
+<pre>protected&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegionServer.MovedRegionsCleaner.html#line.3525">chore</a>()</pre>
 <div class="block"><span class="descfrmTypeLabel">Description copied from class:&nbsp;<code><a href="../../../../../org/apache/hadoop/hbase/ScheduledChore.html#chore--">ScheduledChore</a></code></span></div>
 <div class="block">The task to execute on each scheduled execution of the Chore</div>
 <dl>
@@ -310,7 +310,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/Stoppable.html" title
 <ul class="blockList">
 <li class="blockList">
 <h4>stop</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegionServer.MovedRegionsCleaner.html#line.3529">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/regionserver/HRegionServer.MovedRegionsCleaner.html#line.3530">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>
@@ -328,7 +328,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/Stoppable.html" title
 <ul class="blockListLast">
 <li class="blockList">
 <h4>isStopped</h4>
-<pre>public&nbsp;boolean&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegionServer.MovedRegionsCleaner.html#line.3534">isStopped</a>()</pre>
+<pre>public&nbsp;boolean&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegionServer.MovedRegionsCleaner.html#line.3535">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>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/3649682c/devapidocs/org/apache/hadoop/hbase/regionserver/HRegionServer.PeriodicMemStoreFlusher.html
----------------------------------------------------------------------
diff --git a/devapidocs/org/apache/hadoop/hbase/regionserver/HRegionServer.PeriodicMemStoreFlusher.html b/devapidocs/org/apache/hadoop/hbase/regionserver/HRegionServer.PeriodicMemStoreFlusher.html
index 56ce2e2..c4cd983 100644
--- a/devapidocs/org/apache/hadoop/hbase/regionserver/HRegionServer.PeriodicMemStoreFlusher.html
+++ b/devapidocs/org/apache/hadoop/hbase/regionserver/HRegionServer.PeriodicMemStoreFlusher.html
@@ -122,7 +122,7 @@ var activeTableTab = "activeTableTab";
 </dl>
 <hr>
 <br>
-<pre>static class <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegionServer.html#line.1761">HRegionServer.PeriodicMemStoreFlusher</a>
+<pre>static class <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegionServer.html#line.1762">HRegionServer.PeriodicMemStoreFlusher</a>
 extends <a href="../../../../../org/apache/hadoop/hbase/ScheduledChore.html" title="class in org.apache.hadoop.hbase">ScheduledChore</a></pre>
 </li>
 </ul>
@@ -232,7 +232,7 @@ extends <a href="../../../../../org/apache/hadoop/hbase/ScheduledChore.html" tit
 <ul class="blockList">
 <li class="blockList">
 <h4>server</h4>
-<pre>final&nbsp;<a href="../../../../../org/apache/hadoop/hbase/regionserver/HRegionServer.html" title="class in org.apache.hadoop.hbase.regionserver">HRegionServer</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegionServer.PeriodicMemStoreFlusher.html#line.1762">server</a></pre>
+<pre>final&nbsp;<a href="../../../../../org/apache/hadoop/hbase/regionserver/HRegionServer.html" title="class in org.apache.hadoop.hbase.regionserver">HRegionServer</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegionServer.PeriodicMemStoreFlusher.html#line.1763">server</a></pre>
 </li>
 </ul>
 <a name="RANGE_OF_DELAY">
@@ -241,7 +241,7 @@ extends <a href="../../../../../org/apache/hadoop/hbase/ScheduledChore.html" tit
 <ul class="blockList">
 <li class="blockList">
 <h4>RANGE_OF_DELAY</h4>
-<pre>static final&nbsp;int <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegionServer.PeriodicMemStoreFlusher.html#line.1763">RANGE_OF_DELAY</a></pre>
+<pre>static final&nbsp;int <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegionServer.PeriodicMemStoreFlusher.html#line.1764">RANGE_OF_DELAY</a></pre>
 <dl>
 <dt><span class="seeLabel">See Also:</span></dt>
 <dd><a href="../../../../../constant-values.html#org.apache.hadoop.hbase.regionserver.HRegionServer.PeriodicMemStoreFlusher.RANGE_OF_DELAY">Constant Field Values</a></dd>
@@ -254,7 +254,7 @@ extends <a href="../../../../../org/apache/hadoop/hbase/ScheduledChore.html" tit
 <ul class="blockList">
 <li class="blockList">
 <h4>MIN_DELAY_TIME</h4>
-<pre>static final&nbsp;int <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegionServer.PeriodicMemStoreFlusher.html#line.1764">MIN_DELAY_TIME</a></pre>
+<pre>static final&nbsp;int <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegionServer.PeriodicMemStoreFlusher.html#line.1765">MIN_DELAY_TIME</a></pre>
 <dl>
 <dt><span class="seeLabel">See Also:</span></dt>
 <dd><a href="../../../../../constant-values.html#org.apache.hadoop.hbase.regionserver.HRegionServer.PeriodicMemStoreFlusher.MIN_DELAY_TIME">Constant Field Values</a></dd>
@@ -267,7 +267,7 @@ extends <a href="../../../../../org/apache/hadoop/hbase/ScheduledChore.html" tit
 <ul class="blockListLast">
 <li class="blockList">
 <h4>rangeOfDelay</h4>
-<pre>final&nbsp;int <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegionServer.PeriodicMemStoreFlusher.html#line.1766">rangeOfDelay</a></pre>
+<pre>final&nbsp;int <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegionServer.PeriodicMemStoreFlusher.html#line.1767">rangeOfDelay</a></pre>
 </li>
 </ul>
 </li>
@@ -284,7 +284,7 @@ extends <a href="../../../../../org/apache/hadoop/hbase/ScheduledChore.html" tit
 <ul class="blockListLast">
 <li class="blockList">
 <h4>PeriodicMemStoreFlusher</h4>
-<pre>public&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegionServer.PeriodicMemStoreFlusher.html#line.1767">PeriodicMemStoreFlusher</a>(int&nbsp;cacheFlushInterval,
+<pre>public&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegionServer.PeriodicMemStoreFlusher.html#line.1768">PeriodicMemStoreFlusher</a>(int&nbsp;cacheFlushInterval,
                                <a href="../../../../../org/apache/hadoop/hbase/regionserver/HRegionServer.html" title="class in org.apache.hadoop.hbase.regionserver">HRegionServer</a>&nbsp;server)</pre>
 </li>
 </ul>
@@ -302,7 +302,7 @@ extends <a href="../../../../../org/apache/hadoop/hbase/ScheduledChore.html" tit
 <ul class="blockListLast">
 <li class="blockList">
 <h4>chore</h4>
-<pre>protected&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegionServer.PeriodicMemStoreFlusher.html#line.1776">chore</a>()</pre>
+<pre>protected&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegionServer.PeriodicMemStoreFlusher.html#line.1777">chore</a>()</pre>
 <div class="block"><span class="descfrmTypeLabel">Description copied from class:&nbsp;<code><a href="../../../../../org/apache/hadoop/hbase/ScheduledChore.html#chore--">ScheduledChore</a></code></span></div>
 <div class="block">The task to execute on each scheduled execution of the Chore</div>
 <dl>


[30/46] hbase-site git commit: Published site at 05d22ed960204183fbd9bd16f1dbca6410ccde76.

Posted by gi...@apache.org.
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/3649682c/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 f890a44..52ae930 100644
--- a/devapidocs/src-html/org/apache/hadoop/hbase/master/LoadBalancer.html
+++ b/devapidocs/src-html/org/apache/hadoop/hbase/master/LoadBalancer.html
@@ -61,131 +61,134 @@
 <span class="sourceLineNo">053</span>   * By default, it carries no tables.<a name="line.53"></a>
 <span class="sourceLineNo">054</span>   * TODO: Add any | system as flags to indicate what it can do.<a name="line.54"></a>
 <span class="sourceLineNo">055</span>   */<a name="line.55"></a>
-<span class="sourceLineNo">056</span>  public static final String TABLES_ON_MASTER = "hbase.balancer.tablesOnMaster";<a name="line.56"></a>
+<span class="sourceLineNo">056</span>  String TABLES_ON_MASTER = "hbase.balancer.tablesOnMaster";<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>   * Master carries system tables.<a name="line.59"></a>
 <span class="sourceLineNo">060</span>   */<a name="line.60"></a>
-<span class="sourceLineNo">061</span>  public static final String SYSTEM_TABLES_ON_MASTER =<a name="line.61"></a>
-<span class="sourceLineNo">062</span>    "hbase.balancer.tablesOnMaster.systemTablesOnly";<a name="line.62"></a>
-<span class="sourceLineNo">063</span><a name="line.63"></a>
-<span class="sourceLineNo">064</span>  // Used to signal to the caller that the region(s) cannot be assigned<a name="line.64"></a>
-<span class="sourceLineNo">065</span>  // We deliberately use 'localhost' so the operation will fail fast<a name="line.65"></a>
-<span class="sourceLineNo">066</span>  ServerName BOGUS_SERVER_NAME = ServerName.valueOf("localhost,1,1");<a name="line.66"></a>
-<span class="sourceLineNo">067</span><a name="line.67"></a>
-<span class="sourceLineNo">068</span>  /**<a name="line.68"></a>
-<span class="sourceLineNo">069</span>   * Set the current cluster status.  This allows a LoadBalancer to map host name to a server<a name="line.69"></a>
-<span class="sourceLineNo">070</span>   * @param st<a name="line.70"></a>
-<span class="sourceLineNo">071</span>   */<a name="line.71"></a>
-<span class="sourceLineNo">072</span>  void setClusterMetrics(ClusterMetrics st);<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>   * Pass RegionStates and allow balancer to set the current cluster load.<a name="line.75"></a>
-<span class="sourceLineNo">076</span>   * @param ClusterLoad<a name="line.76"></a>
-<span class="sourceLineNo">077</span>   */<a name="line.77"></a>
-<span class="sourceLineNo">078</span>  void setClusterLoad(Map&lt;TableName, Map&lt;ServerName, List&lt;RegionInfo&gt;&gt;&gt; ClusterLoad);<a name="line.78"></a>
-<span class="sourceLineNo">079</span><a name="line.79"></a>
-<span class="sourceLineNo">080</span>  /**<a name="line.80"></a>
-<span class="sourceLineNo">081</span>   * Set the master service.<a name="line.81"></a>
-<span class="sourceLineNo">082</span>   * @param masterServices<a name="line.82"></a>
-<span class="sourceLineNo">083</span>   */<a name="line.83"></a>
-<span class="sourceLineNo">084</span>  void setMasterServices(MasterServices masterServices);<a name="line.84"></a>
-<span class="sourceLineNo">085</span><a name="line.85"></a>
-<span class="sourceLineNo">086</span>  /**<a name="line.86"></a>
-<span class="sourceLineNo">087</span>   * Perform the major balance operation<a name="line.87"></a>
-<span class="sourceLineNo">088</span>   * @param tableName<a name="line.88"></a>
-<span class="sourceLineNo">089</span>   * @param clusterState<a name="line.89"></a>
-<span class="sourceLineNo">090</span>   * @return List of plans<a name="line.90"></a>
-<span class="sourceLineNo">091</span>   */<a name="line.91"></a>
-<span class="sourceLineNo">092</span>  List&lt;RegionPlan&gt; balanceCluster(TableName tableName, Map&lt;ServerName,<a name="line.92"></a>
-<span class="sourceLineNo">093</span>      List&lt;RegionInfo&gt;&gt; clusterState) throws HBaseIOException;<a name="line.93"></a>
-<span class="sourceLineNo">094</span><a name="line.94"></a>
-<span class="sourceLineNo">095</span>  /**<a name="line.95"></a>
-<span class="sourceLineNo">096</span>   * Perform the major balance operation<a name="line.96"></a>
-<span class="sourceLineNo">097</span>   * @param clusterState<a name="line.97"></a>
-<span class="sourceLineNo">098</span>   * @return List of plans<a name="line.98"></a>
-<span class="sourceLineNo">099</span>   */<a name="line.99"></a>
-<span class="sourceLineNo">100</span>  List&lt;RegionPlan&gt; balanceCluster(Map&lt;ServerName,<a name="line.100"></a>
-<span class="sourceLineNo">101</span>      List&lt;RegionInfo&gt;&gt; clusterState) throws HBaseIOException;<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>   * Perform a Round Robin assignment of regions.<a name="line.104"></a>
-<span class="sourceLineNo">105</span>   * @param regions<a name="line.105"></a>
-<span class="sourceLineNo">106</span>   * @param servers<a name="line.106"></a>
-<span class="sourceLineNo">107</span>   * @return Map of servername to regioninfos<a name="line.107"></a>
-<span class="sourceLineNo">108</span>   */<a name="line.108"></a>
-<span class="sourceLineNo">109</span>  Map&lt;ServerName, List&lt;RegionInfo&gt;&gt; roundRobinAssignment(<a name="line.109"></a>
-<span class="sourceLineNo">110</span>    List&lt;RegionInfo&gt; regions,<a name="line.110"></a>
-<span class="sourceLineNo">111</span>    List&lt;ServerName&gt; servers<a name="line.111"></a>
-<span class="sourceLineNo">112</span>  ) throws HBaseIOException;<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>   * Assign regions to the previously hosting region server<a name="line.115"></a>
-<span class="sourceLineNo">116</span>   * @param regions<a name="line.116"></a>
-<span class="sourceLineNo">117</span>   * @param servers<a name="line.117"></a>
-<span class="sourceLineNo">118</span>   * @return List of plans<a name="line.118"></a>
-<span class="sourceLineNo">119</span>   */<a name="line.119"></a>
-<span class="sourceLineNo">120</span>  @Nullable<a name="line.120"></a>
-<span class="sourceLineNo">121</span>  Map&lt;ServerName, List&lt;RegionInfo&gt;&gt; retainAssignment(<a name="line.121"></a>
-<span class="sourceLineNo">122</span>    Map&lt;RegionInfo, ServerName&gt; regions,<a name="line.122"></a>
-<span class="sourceLineNo">123</span>    List&lt;ServerName&gt; servers<a name="line.123"></a>
-<span class="sourceLineNo">124</span>  ) throws HBaseIOException;<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>   * Get a random region server from the list<a name="line.127"></a>
-<span class="sourceLineNo">128</span>   * @param regionInfo Region for which this selection is being done.<a name="line.128"></a>
-<span class="sourceLineNo">129</span>   * @param servers<a name="line.129"></a>
-<span class="sourceLineNo">130</span>   * @return Servername<a name="line.130"></a>
-<span class="sourceLineNo">131</span>   */<a name="line.131"></a>
-<span class="sourceLineNo">132</span>  ServerName randomAssignment(<a name="line.132"></a>
-<span class="sourceLineNo">133</span>    RegionInfo regionInfo, List&lt;ServerName&gt; servers<a name="line.133"></a>
-<span class="sourceLineNo">134</span>  ) throws HBaseIOException;<a name="line.134"></a>
-<span class="sourceLineNo">135</span><a name="line.135"></a>
-<span class="sourceLineNo">136</span>  /**<a name="line.136"></a>
-<span class="sourceLineNo">137</span>   * Initialize the load balancer. Must be called after setters.<a name="line.137"></a>
-<span class="sourceLineNo">138</span>   * @throws HBaseIOException<a name="line.138"></a>
-<span class="sourceLineNo">139</span>   */<a name="line.139"></a>
-<span class="sourceLineNo">140</span>  void initialize() throws HBaseIOException;<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>   * Marks the region as online at balancer.<a name="line.143"></a>
-<span class="sourceLineNo">144</span>   * @param regionInfo<a name="line.144"></a>
-<span class="sourceLineNo">145</span>   * @param sn<a name="line.145"></a>
-<span class="sourceLineNo">146</span>   */<a name="line.146"></a>
-<span class="sourceLineNo">147</span>  void regionOnline(RegionInfo regionInfo, ServerName sn);<a name="line.147"></a>
-<span class="sourceLineNo">148</span><a name="line.148"></a>
-<span class="sourceLineNo">149</span>  /**<a name="line.149"></a>
-<span class="sourceLineNo">150</span>   * Marks the region as offline at balancer.<a name="line.150"></a>
-<span class="sourceLineNo">151</span>   * @param regionInfo<a name="line.151"></a>
-<span class="sourceLineNo">152</span>   */<a name="line.152"></a>
-<span class="sourceLineNo">153</span>  void regionOffline(RegionInfo regionInfo);<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>   * Notification that config has changed<a name="line.156"></a>
-<span class="sourceLineNo">157</span>   * @param conf<a name="line.157"></a>
-<span class="sourceLineNo">158</span>   */<a name="line.158"></a>
-<span class="sourceLineNo">159</span>  @Override<a name="line.159"></a>
-<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>   * 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>  void postMasterStartupInitialize();<a name="line.165"></a>
-<span class="sourceLineNo">166</span><a name="line.166"></a>
-<span class="sourceLineNo">167</span>  /*Updates balancer status tag reported to JMX*/<a name="line.167"></a>
-<span class="sourceLineNo">168</span>  void updateBalancerStatus(boolean status);<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 true if Master carries regions<a name="line.171"></a>
-<span class="sourceLineNo">172</span>   */<a name="line.172"></a>
-<span class="sourceLineNo">173</span>  static boolean isTablesOnMaster(Configuration conf) {<a name="line.173"></a>
-<span class="sourceLineNo">174</span>    return conf.getBoolean(TABLES_ON_MASTER, false);<a name="line.174"></a>
-<span class="sourceLineNo">175</span>  }<a name="line.175"></a>
-<span class="sourceLineNo">176</span><a name="line.176"></a>
-<span class="sourceLineNo">177</span>  static boolean isSystemTablesOnlyOnMaster(Configuration conf) {<a name="line.177"></a>
-<span class="sourceLineNo">178</span>    return conf.getBoolean(SYSTEM_TABLES_ON_MASTER, false);<a name="line.178"></a>
-<span class="sourceLineNo">179</span>  }<a name="line.179"></a>
-<span class="sourceLineNo">180</span>}<a name="line.180"></a>
+<span class="sourceLineNo">061</span>  String SYSTEM_TABLES_ON_MASTER = "hbase.balancer.tablesOnMaster.systemTablesOnly";<a name="line.61"></a>
+<span class="sourceLineNo">062</span><a name="line.62"></a>
+<span class="sourceLineNo">063</span>  // Used to signal to the caller that the region(s) cannot be assigned<a name="line.63"></a>
+<span class="sourceLineNo">064</span>  // We deliberately use 'localhost' so the operation will fail fast<a name="line.64"></a>
+<span class="sourceLineNo">065</span>  ServerName BOGUS_SERVER_NAME = ServerName.valueOf("localhost,1,1");<a name="line.65"></a>
+<span class="sourceLineNo">066</span><a name="line.66"></a>
+<span class="sourceLineNo">067</span>  /**<a name="line.67"></a>
+<span class="sourceLineNo">068</span>   * Set the current cluster status.  This allows a LoadBalancer to map host name to a server<a name="line.68"></a>
+<span class="sourceLineNo">069</span>   * @param st<a name="line.69"></a>
+<span class="sourceLineNo">070</span>   */<a name="line.70"></a>
+<span class="sourceLineNo">071</span>  void setClusterMetrics(ClusterMetrics st);<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>   * Pass RegionStates and allow balancer to set the current cluster load.<a name="line.74"></a>
+<span class="sourceLineNo">075</span>   * @param ClusterLoad<a name="line.75"></a>
+<span class="sourceLineNo">076</span>   */<a name="line.76"></a>
+<span class="sourceLineNo">077</span>  void setClusterLoad(Map&lt;TableName, Map&lt;ServerName, List&lt;RegionInfo&gt;&gt;&gt; ClusterLoad);<a name="line.77"></a>
+<span class="sourceLineNo">078</span><a name="line.78"></a>
+<span class="sourceLineNo">079</span>  /**<a name="line.79"></a>
+<span class="sourceLineNo">080</span>   * Set the master service.<a name="line.80"></a>
+<span class="sourceLineNo">081</span>   * @param masterServices<a name="line.81"></a>
+<span class="sourceLineNo">082</span>   */<a name="line.82"></a>
+<span class="sourceLineNo">083</span>  void setMasterServices(MasterServices masterServices);<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>   * Perform the major balance operation<a name="line.86"></a>
+<span class="sourceLineNo">087</span>   * @param tableName<a name="line.87"></a>
+<span class="sourceLineNo">088</span>   * @param clusterState<a name="line.88"></a>
+<span class="sourceLineNo">089</span>   * @return List of plans<a name="line.89"></a>
+<span class="sourceLineNo">090</span>   */<a name="line.90"></a>
+<span class="sourceLineNo">091</span>  List&lt;RegionPlan&gt; balanceCluster(TableName tableName, Map&lt;ServerName,<a name="line.91"></a>
+<span class="sourceLineNo">092</span>      List&lt;RegionInfo&gt;&gt; clusterState) throws HBaseIOException;<a name="line.92"></a>
+<span class="sourceLineNo">093</span><a name="line.93"></a>
+<span class="sourceLineNo">094</span>  /**<a name="line.94"></a>
+<span class="sourceLineNo">095</span>   * Perform the major balance operation<a name="line.95"></a>
+<span class="sourceLineNo">096</span>   * @param clusterState<a name="line.96"></a>
+<span class="sourceLineNo">097</span>   * @return List of plans<a name="line.97"></a>
+<span class="sourceLineNo">098</span>   */<a name="line.98"></a>
+<span class="sourceLineNo">099</span>  List&lt;RegionPlan&gt; balanceCluster(Map&lt;ServerName,<a name="line.99"></a>
+<span class="sourceLineNo">100</span>      List&lt;RegionInfo&gt;&gt; clusterState) throws HBaseIOException;<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>   * Perform a Round Robin assignment of regions.<a name="line.103"></a>
+<span class="sourceLineNo">104</span>   * @param regions<a name="line.104"></a>
+<span class="sourceLineNo">105</span>   * @param servers<a name="line.105"></a>
+<span class="sourceLineNo">106</span>   * @return Map of servername to regioninfos<a name="line.106"></a>
+<span class="sourceLineNo">107</span>   */<a name="line.107"></a>
+<span class="sourceLineNo">108</span>  Map&lt;ServerName, List&lt;RegionInfo&gt;&gt; roundRobinAssignment(<a name="line.108"></a>
+<span class="sourceLineNo">109</span>    List&lt;RegionInfo&gt; regions,<a name="line.109"></a>
+<span class="sourceLineNo">110</span>    List&lt;ServerName&gt; servers<a name="line.110"></a>
+<span class="sourceLineNo">111</span>  ) throws HBaseIOException;<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>   * Assign regions to the previously hosting region server<a name="line.114"></a>
+<span class="sourceLineNo">115</span>   * @param regions<a name="line.115"></a>
+<span class="sourceLineNo">116</span>   * @param servers<a name="line.116"></a>
+<span class="sourceLineNo">117</span>   * @return List of plans<a name="line.117"></a>
+<span class="sourceLineNo">118</span>   */<a name="line.118"></a>
+<span class="sourceLineNo">119</span>  @Nullable<a name="line.119"></a>
+<span class="sourceLineNo">120</span>  Map&lt;ServerName, List&lt;RegionInfo&gt;&gt; retainAssignment(<a name="line.120"></a>
+<span class="sourceLineNo">121</span>    Map&lt;RegionInfo, ServerName&gt; regions,<a name="line.121"></a>
+<span class="sourceLineNo">122</span>    List&lt;ServerName&gt; servers<a name="line.122"></a>
+<span class="sourceLineNo">123</span>  ) throws HBaseIOException;<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>   * Get a random region server from the list<a name="line.126"></a>
+<span class="sourceLineNo">127</span>   * @param regionInfo Region for which this selection is being done.<a name="line.127"></a>
+<span class="sourceLineNo">128</span>   * @param servers<a name="line.128"></a>
+<span class="sourceLineNo">129</span>   * @return Servername<a name="line.129"></a>
+<span class="sourceLineNo">130</span>   */<a name="line.130"></a>
+<span class="sourceLineNo">131</span>  ServerName randomAssignment(<a name="line.131"></a>
+<span class="sourceLineNo">132</span>    RegionInfo regionInfo, List&lt;ServerName&gt; servers<a name="line.132"></a>
+<span class="sourceLineNo">133</span>  ) throws HBaseIOException;<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>   * Initialize the load balancer. Must be called after setters.<a name="line.136"></a>
+<span class="sourceLineNo">137</span>   * @throws HBaseIOException<a name="line.137"></a>
+<span class="sourceLineNo">138</span>   */<a name="line.138"></a>
+<span class="sourceLineNo">139</span>  void initialize() throws HBaseIOException;<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>   * Marks the region as online at balancer.<a name="line.142"></a>
+<span class="sourceLineNo">143</span>   * @param regionInfo<a name="line.143"></a>
+<span class="sourceLineNo">144</span>   * @param sn<a name="line.144"></a>
+<span class="sourceLineNo">145</span>   */<a name="line.145"></a>
+<span class="sourceLineNo">146</span>  void regionOnline(RegionInfo regionInfo, ServerName sn);<a name="line.146"></a>
+<span class="sourceLineNo">147</span><a name="line.147"></a>
+<span class="sourceLineNo">148</span>  /**<a name="line.148"></a>
+<span class="sourceLineNo">149</span>   * Marks the region as offline at balancer.<a name="line.149"></a>
+<span class="sourceLineNo">150</span>   * @param regionInfo<a name="line.150"></a>
+<span class="sourceLineNo">151</span>   */<a name="line.151"></a>
+<span class="sourceLineNo">152</span>  void regionOffline(RegionInfo regionInfo);<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>   * Notification that config has changed<a name="line.155"></a>
+<span class="sourceLineNo">156</span>   * @param conf<a name="line.156"></a>
+<span class="sourceLineNo">157</span>   */<a name="line.157"></a>
+<span class="sourceLineNo">158</span>  @Override<a name="line.158"></a>
+<span class="sourceLineNo">159</span>  void onConfigurationChange(Configuration conf);<a name="line.159"></a>
+<span class="sourceLineNo">160</span><a name="line.160"></a>
+<span class="sourceLineNo">161</span>  /**<a name="line.161"></a>
+<span class="sourceLineNo">162</span>   * If balancer needs to do initialization after Master has started up, lets do that here.<a name="line.162"></a>
+<span class="sourceLineNo">163</span>   */<a name="line.163"></a>
+<span class="sourceLineNo">164</span>  void postMasterStartupInitialize();<a name="line.164"></a>
+<span class="sourceLineNo">165</span><a name="line.165"></a>
+<span class="sourceLineNo">166</span>  /*Updates balancer status tag reported to JMX*/<a name="line.166"></a>
+<span class="sourceLineNo">167</span>  void updateBalancerStatus(boolean status);<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>   * @return true if Master carries regions<a name="line.170"></a>
+<span class="sourceLineNo">171</span>   */<a name="line.171"></a>
+<span class="sourceLineNo">172</span>  static boolean isTablesOnMaster(Configuration conf) {<a name="line.172"></a>
+<span class="sourceLineNo">173</span>    return conf.getBoolean(TABLES_ON_MASTER, false);<a name="line.173"></a>
+<span class="sourceLineNo">174</span>  }<a name="line.174"></a>
+<span class="sourceLineNo">175</span><a name="line.175"></a>
+<span class="sourceLineNo">176</span>  static boolean isSystemTablesOnlyOnMaster(Configuration conf) {<a name="line.176"></a>
+<span class="sourceLineNo">177</span>    return conf.getBoolean(SYSTEM_TABLES_ON_MASTER, 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>  static boolean isMasterCanHostUserRegions(Configuration conf) {<a name="line.180"></a>
+<span class="sourceLineNo">181</span>    return isTablesOnMaster(conf) &amp;&amp; !isSystemTablesOnlyOnMaster(conf);<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>
 
 
 


[28/46] hbase-site git commit: Published site at 05d22ed960204183fbd9bd16f1dbca6410ccde76.

Posted by gi...@apache.org.
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/3649682c/devapidocs/src-html/org/apache/hadoop/hbase/master/MasterRpcServices.html
----------------------------------------------------------------------
diff --git a/devapidocs/src-html/org/apache/hadoop/hbase/master/MasterRpcServices.html b/devapidocs/src-html/org/apache/hadoop/hbase/master/MasterRpcServices.html
index 684e709..4365cc5 100644
--- a/devapidocs/src-html/org/apache/hadoop/hbase/master/MasterRpcServices.html
+++ b/devapidocs/src-html/org/apache/hadoop/hbase/master/MasterRpcServices.html
@@ -361,7 +361,7 @@
 <span class="sourceLineNo">353</span>      throws IOException {<a name="line.353"></a>
 <span class="sourceLineNo">354</span>    // RpcServer at HM by default enable ByteBufferPool iff HM having user table region in it<a name="line.354"></a>
 <span class="sourceLineNo">355</span>    boolean reservoirEnabled = conf.getBoolean(RESERVOIR_ENABLED_KEY,<a name="line.355"></a>
-<span class="sourceLineNo">356</span>        (LoadBalancer.isTablesOnMaster(conf) &amp;&amp; !LoadBalancer.isSystemTablesOnlyOnMaster(conf)));<a name="line.356"></a>
+<span class="sourceLineNo">356</span>        LoadBalancer.isMasterCanHostUserRegions(conf));<a name="line.356"></a>
 <span class="sourceLineNo">357</span>    try {<a name="line.357"></a>
 <span class="sourceLineNo">358</span>      return RpcServerFactory.createRpcServer(server, name, getServices(),<a name="line.358"></a>
 <span class="sourceLineNo">359</span>          bindAddress, // use final bindAddress for this server.<a name="line.359"></a>
@@ -1532,934 +1532,930 @@
 <span class="sourceLineNo">1524</span>      final RpcController controller,<a name="line.1524"></a>
 <span class="sourceLineNo">1525</span>      final IsInMaintenanceModeRequest request) throws ServiceException {<a name="line.1525"></a>
 <span class="sourceLineNo">1526</span>    IsInMaintenanceModeResponse.Builder response = IsInMaintenanceModeResponse.newBuilder();<a name="line.1526"></a>
-<span class="sourceLineNo">1527</span>    try {<a name="line.1527"></a>
-<span class="sourceLineNo">1528</span>      response.setInMaintenanceMode(master.isInMaintenanceMode());<a name="line.1528"></a>
-<span class="sourceLineNo">1529</span>    } catch (IOException e) {<a name="line.1529"></a>
-<span class="sourceLineNo">1530</span>      throw new ServiceException(e);<a name="line.1530"></a>
-<span class="sourceLineNo">1531</span>    }<a name="line.1531"></a>
-<span class="sourceLineNo">1532</span>    return response.build();<a name="line.1532"></a>
-<span class="sourceLineNo">1533</span>  }<a name="line.1533"></a>
-<span class="sourceLineNo">1534</span><a name="line.1534"></a>
-<span class="sourceLineNo">1535</span>  @Override<a name="line.1535"></a>
-<span class="sourceLineNo">1536</span>  public UnassignRegionResponse unassignRegion(RpcController controller,<a name="line.1536"></a>
-<span class="sourceLineNo">1537</span>      UnassignRegionRequest req) throws ServiceException {<a name="line.1537"></a>
-<span class="sourceLineNo">1538</span>    try {<a name="line.1538"></a>
-<span class="sourceLineNo">1539</span>      final byte [] regionName = req.getRegion().getValue().toByteArray();<a name="line.1539"></a>
-<span class="sourceLineNo">1540</span>      RegionSpecifierType type = req.getRegion().getType();<a name="line.1540"></a>
-<span class="sourceLineNo">1541</span>      final boolean force = req.getForce();<a name="line.1541"></a>
-<span class="sourceLineNo">1542</span>      UnassignRegionResponse urr = UnassignRegionResponse.newBuilder().build();<a name="line.1542"></a>
-<span class="sourceLineNo">1543</span><a name="line.1543"></a>
-<span class="sourceLineNo">1544</span>      master.checkInitialized();<a name="line.1544"></a>
-<span class="sourceLineNo">1545</span>      if (type != RegionSpecifierType.REGION_NAME) {<a name="line.1545"></a>
-<span class="sourceLineNo">1546</span>        LOG.warn("unassignRegion specifier type: expected: " + RegionSpecifierType.REGION_NAME<a name="line.1546"></a>
-<span class="sourceLineNo">1547</span>          + " actual: " + type);<a name="line.1547"></a>
-<span class="sourceLineNo">1548</span>      }<a name="line.1548"></a>
-<span class="sourceLineNo">1549</span>      Pair&lt;RegionInfo, ServerName&gt; pair =<a name="line.1549"></a>
-<span class="sourceLineNo">1550</span>        MetaTableAccessor.getRegion(master.getConnection(), regionName);<a name="line.1550"></a>
-<span class="sourceLineNo">1551</span>      if (Bytes.equals(RegionInfoBuilder.FIRST_META_REGIONINFO.getRegionName(),regionName)) {<a name="line.1551"></a>
-<span class="sourceLineNo">1552</span>        pair = new Pair&lt;&gt;(RegionInfoBuilder.FIRST_META_REGIONINFO,<a name="line.1552"></a>
-<span class="sourceLineNo">1553</span>            master.getMetaTableLocator().getMetaRegionLocation(master.getZooKeeper()));<a name="line.1553"></a>
-<span class="sourceLineNo">1554</span>      }<a name="line.1554"></a>
-<span class="sourceLineNo">1555</span>      if (pair == null) {<a name="line.1555"></a>
-<span class="sourceLineNo">1556</span>        throw new UnknownRegionException(Bytes.toString(regionName));<a name="line.1556"></a>
-<span class="sourceLineNo">1557</span>      }<a name="line.1557"></a>
-<span class="sourceLineNo">1558</span><a name="line.1558"></a>
-<span class="sourceLineNo">1559</span>      RegionInfo hri = pair.getFirst();<a name="line.1559"></a>
-<span class="sourceLineNo">1560</span>      if (master.cpHost != null) {<a name="line.1560"></a>
-<span class="sourceLineNo">1561</span>        master.cpHost.preUnassign(hri, force);<a name="line.1561"></a>
-<span class="sourceLineNo">1562</span>      }<a name="line.1562"></a>
-<span class="sourceLineNo">1563</span>      LOG.debug(master.getClientIdAuditPrefix() + " unassign " + hri.getRegionNameAsString()<a name="line.1563"></a>
-<span class="sourceLineNo">1564</span>          + " in current location if it is online and reassign.force=" + force);<a name="line.1564"></a>
-<span class="sourceLineNo">1565</span>      master.getAssignmentManager().unassign(hri);<a name="line.1565"></a>
-<span class="sourceLineNo">1566</span>      if (master.cpHost != null) {<a name="line.1566"></a>
-<span class="sourceLineNo">1567</span>        master.cpHost.postUnassign(hri, force);<a name="line.1567"></a>
-<span class="sourceLineNo">1568</span>      }<a name="line.1568"></a>
-<span class="sourceLineNo">1569</span><a name="line.1569"></a>
-<span class="sourceLineNo">1570</span>      return urr;<a name="line.1570"></a>
-<span class="sourceLineNo">1571</span>    } catch (IOException ioe) {<a name="line.1571"></a>
-<span class="sourceLineNo">1572</span>      throw new ServiceException(ioe);<a name="line.1572"></a>
-<span class="sourceLineNo">1573</span>    }<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>  @Override<a name="line.1576"></a>
-<span class="sourceLineNo">1577</span>  public ReportRegionStateTransitionResponse reportRegionStateTransition(RpcController c,<a name="line.1577"></a>
-<span class="sourceLineNo">1578</span>      ReportRegionStateTransitionRequest req) throws ServiceException {<a name="line.1578"></a>
-<span class="sourceLineNo">1579</span>    try {<a name="line.1579"></a>
-<span class="sourceLineNo">1580</span>      master.checkServiceStarted();<a name="line.1580"></a>
-<span class="sourceLineNo">1581</span>      return master.getAssignmentManager().reportRegionStateTransition(req);<a name="line.1581"></a>
-<span class="sourceLineNo">1582</span>    } catch (IOException ioe) {<a name="line.1582"></a>
-<span class="sourceLineNo">1583</span>      throw new ServiceException(ioe);<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><a name="line.1586"></a>
-<span class="sourceLineNo">1587</span>  @Override<a name="line.1587"></a>
-<span class="sourceLineNo">1588</span>  public SetQuotaResponse setQuota(RpcController c, SetQuotaRequest req)<a name="line.1588"></a>
-<span class="sourceLineNo">1589</span>      throws ServiceException {<a name="line.1589"></a>
-<span class="sourceLineNo">1590</span>    try {<a name="line.1590"></a>
-<span class="sourceLineNo">1591</span>      master.checkInitialized();<a name="line.1591"></a>
-<span class="sourceLineNo">1592</span>      return master.getMasterQuotaManager().setQuota(req);<a name="line.1592"></a>
-<span class="sourceLineNo">1593</span>    } catch (Exception e) {<a name="line.1593"></a>
-<span class="sourceLineNo">1594</span>      throw new ServiceException(e);<a name="line.1594"></a>
-<span class="sourceLineNo">1595</span>    }<a name="line.1595"></a>
-<span class="sourceLineNo">1596</span>  }<a name="line.1596"></a>
-<span class="sourceLineNo">1597</span><a name="line.1597"></a>
-<span class="sourceLineNo">1598</span>  @Override<a name="line.1598"></a>
-<span class="sourceLineNo">1599</span>  public MajorCompactionTimestampResponse getLastMajorCompactionTimestamp(RpcController controller,<a name="line.1599"></a>
-<span class="sourceLineNo">1600</span>      MajorCompactionTimestampRequest request) throws ServiceException {<a name="line.1600"></a>
-<span class="sourceLineNo">1601</span>    MajorCompactionTimestampResponse.Builder response =<a name="line.1601"></a>
-<span class="sourceLineNo">1602</span>        MajorCompactionTimestampResponse.newBuilder();<a name="line.1602"></a>
-<span class="sourceLineNo">1603</span>    try {<a name="line.1603"></a>
-<span class="sourceLineNo">1604</span>      master.checkInitialized();<a name="line.1604"></a>
-<span class="sourceLineNo">1605</span>      response.setCompactionTimestamp(master.getLastMajorCompactionTimestamp(ProtobufUtil<a name="line.1605"></a>
-<span class="sourceLineNo">1606</span>          .toTableName(request.getTableName())));<a name="line.1606"></a>
-<span class="sourceLineNo">1607</span>    } catch (IOException e) {<a name="line.1607"></a>
-<span class="sourceLineNo">1608</span>      throw new ServiceException(e);<a name="line.1608"></a>
-<span class="sourceLineNo">1609</span>    }<a name="line.1609"></a>
-<span class="sourceLineNo">1610</span>    return response.build();<a name="line.1610"></a>
-<span class="sourceLineNo">1611</span>  }<a name="line.1611"></a>
-<span class="sourceLineNo">1612</span><a name="line.1612"></a>
-<span class="sourceLineNo">1613</span>  @Override<a name="line.1613"></a>
-<span class="sourceLineNo">1614</span>  public MajorCompactionTimestampResponse getLastMajorCompactionTimestampForRegion(<a name="line.1614"></a>
-<span class="sourceLineNo">1615</span>      RpcController controller, MajorCompactionTimestampForRegionRequest request)<a name="line.1615"></a>
-<span class="sourceLineNo">1616</span>      throws ServiceException {<a name="line.1616"></a>
-<span class="sourceLineNo">1617</span>    MajorCompactionTimestampResponse.Builder response =<a name="line.1617"></a>
-<span class="sourceLineNo">1618</span>        MajorCompactionTimestampResponse.newBuilder();<a name="line.1618"></a>
-<span class="sourceLineNo">1619</span>    try {<a name="line.1619"></a>
-<span class="sourceLineNo">1620</span>      master.checkInitialized();<a name="line.1620"></a>
-<span class="sourceLineNo">1621</span>      response.setCompactionTimestamp(master.getLastMajorCompactionTimestampForRegion(request<a name="line.1621"></a>
-<span class="sourceLineNo">1622</span>          .getRegion().getValue().toByteArray()));<a name="line.1622"></a>
-<span class="sourceLineNo">1623</span>    } catch (IOException e) {<a name="line.1623"></a>
-<span class="sourceLineNo">1624</span>      throw new ServiceException(e);<a name="line.1624"></a>
-<span class="sourceLineNo">1625</span>    }<a name="line.1625"></a>
-<span class="sourceLineNo">1626</span>    return response.build();<a name="line.1626"></a>
-<span class="sourceLineNo">1627</span>  }<a name="line.1627"></a>
-<span class="sourceLineNo">1628</span><a name="line.1628"></a>
-<span class="sourceLineNo">1629</span>  /**<a name="line.1629"></a>
-<span class="sourceLineNo">1630</span>   * Compact a region on the master.<a name="line.1630"></a>
-<span class="sourceLineNo">1631</span>   *<a name="line.1631"></a>
-<span class="sourceLineNo">1632</span>   * @param controller the RPC controller<a name="line.1632"></a>
-<span class="sourceLineNo">1633</span>   * @param request the request<a name="line.1633"></a>
-<span class="sourceLineNo">1634</span>   * @throws ServiceException<a name="line.1634"></a>
-<span class="sourceLineNo">1635</span>   */<a name="line.1635"></a>
-<span class="sourceLineNo">1636</span>  @Override<a name="line.1636"></a>
-<span class="sourceLineNo">1637</span>  @QosPriority(priority=HConstants.ADMIN_QOS)<a name="line.1637"></a>
-<span class="sourceLineNo">1638</span>  public CompactRegionResponse compactRegion(final RpcController controller,<a name="line.1638"></a>
-<span class="sourceLineNo">1639</span>    final CompactRegionRequest request) throws ServiceException {<a name="line.1639"></a>
-<span class="sourceLineNo">1640</span>    try {<a name="line.1640"></a>
-<span class="sourceLineNo">1641</span>      master.checkInitialized();<a name="line.1641"></a>
-<span class="sourceLineNo">1642</span>      byte[] regionName = request.getRegion().getValue().toByteArray();<a name="line.1642"></a>
-<span class="sourceLineNo">1643</span>      TableName tableName = RegionInfo.getTable(regionName);<a name="line.1643"></a>
-<span class="sourceLineNo">1644</span>      // if the region is a mob region, do the mob file compaction.<a name="line.1644"></a>
-<span class="sourceLineNo">1645</span>      if (MobUtils.isMobRegionName(tableName, regionName)) {<a name="line.1645"></a>
-<span class="sourceLineNo">1646</span>        checkHFileFormatVersionForMob();<a name="line.1646"></a>
-<span class="sourceLineNo">1647</span>        return compactMob(request, tableName);<a name="line.1647"></a>
-<span class="sourceLineNo">1648</span>      } else {<a name="line.1648"></a>
-<span class="sourceLineNo">1649</span>        return super.compactRegion(controller, request);<a name="line.1649"></a>
-<span class="sourceLineNo">1650</span>      }<a name="line.1650"></a>
-<span class="sourceLineNo">1651</span>    } catch (IOException ie) {<a name="line.1651"></a>
-<span class="sourceLineNo">1652</span>      throw new ServiceException(ie);<a name="line.1652"></a>
-<span class="sourceLineNo">1653</span>    }<a name="line.1653"></a>
-<span class="sourceLineNo">1654</span>  }<a name="line.1654"></a>
-<span class="sourceLineNo">1655</span><a name="line.1655"></a>
-<span class="sourceLineNo">1656</span>  /**<a name="line.1656"></a>
-<span class="sourceLineNo">1657</span>   * check configured hfile format version before to do compaction<a name="line.1657"></a>
-<span class="sourceLineNo">1658</span>   * @throws IOException throw IOException<a name="line.1658"></a>
-<span class="sourceLineNo">1659</span>   */<a name="line.1659"></a>
-<span class="sourceLineNo">1660</span>  private void checkHFileFormatVersionForMob() throws IOException {<a name="line.1660"></a>
-<span class="sourceLineNo">1661</span>    if (HFile.getFormatVersion(master.getConfiguration()) &lt; HFile.MIN_FORMAT_VERSION_WITH_TAGS) {<a name="line.1661"></a>
-<span class="sourceLineNo">1662</span>      LOG.error("A minimum HFile version of " + HFile.MIN_FORMAT_VERSION_WITH_TAGS<a name="line.1662"></a>
-<span class="sourceLineNo">1663</span>          + " is required for MOB compaction. Compaction will not run.");<a name="line.1663"></a>
-<span class="sourceLineNo">1664</span>      throw new IOException("A minimum HFile version of " + HFile.MIN_FORMAT_VERSION_WITH_TAGS<a name="line.1664"></a>
-<span class="sourceLineNo">1665</span>          + " is required for MOB feature. Consider setting " + HFile.FORMAT_VERSION_KEY<a name="line.1665"></a>
-<span class="sourceLineNo">1666</span>          + " accordingly.");<a name="line.1666"></a>
-<span class="sourceLineNo">1667</span>    }<a name="line.1667"></a>
-<span class="sourceLineNo">1668</span>  }<a name="line.1668"></a>
-<span class="sourceLineNo">1669</span><a name="line.1669"></a>
-<span class="sourceLineNo">1670</span>  @Override<a name="line.1670"></a>
-<span class="sourceLineNo">1671</span>  @QosPriority(priority=HConstants.ADMIN_QOS)<a name="line.1671"></a>
-<span class="sourceLineNo">1672</span>  public GetRegionInfoResponse getRegionInfo(final RpcController controller,<a name="line.1672"></a>
-<span class="sourceLineNo">1673</span>    final GetRegionInfoRequest request) throws ServiceException {<a name="line.1673"></a>
-<span class="sourceLineNo">1674</span>    byte[] regionName = request.getRegion().getValue().toByteArray();<a name="line.1674"></a>
-<span class="sourceLineNo">1675</span>    TableName tableName = RegionInfo.getTable(regionName);<a name="line.1675"></a>
-<span class="sourceLineNo">1676</span>    if (MobUtils.isMobRegionName(tableName, regionName)) {<a name="line.1676"></a>
-<span class="sourceLineNo">1677</span>      // a dummy region info contains the compaction state.<a name="line.1677"></a>
-<span class="sourceLineNo">1678</span>      RegionInfo mobRegionInfo = MobUtils.getMobRegionInfo(tableName);<a name="line.1678"></a>
-<span class="sourceLineNo">1679</span>      GetRegionInfoResponse.Builder builder = GetRegionInfoResponse.newBuilder();<a name="line.1679"></a>
-<span class="sourceLineNo">1680</span>      builder.setRegionInfo(ProtobufUtil.toRegionInfo(mobRegionInfo));<a name="line.1680"></a>
-<span class="sourceLineNo">1681</span>      if (request.hasCompactionState() &amp;&amp; request.getCompactionState()) {<a name="line.1681"></a>
-<span class="sourceLineNo">1682</span>        builder.setCompactionState(master.getMobCompactionState(tableName));<a name="line.1682"></a>
-<span class="sourceLineNo">1683</span>      }<a name="line.1683"></a>
-<span class="sourceLineNo">1684</span>      return builder.build();<a name="line.1684"></a>
-<span class="sourceLineNo">1685</span>    } else {<a name="line.1685"></a>
-<span class="sourceLineNo">1686</span>      return super.getRegionInfo(controller, request);<a name="line.1686"></a>
-<span class="sourceLineNo">1687</span>    }<a name="line.1687"></a>
-<span class="sourceLineNo">1688</span>  }<a name="line.1688"></a>
-<span class="sourceLineNo">1689</span><a name="line.1689"></a>
-<span class="sourceLineNo">1690</span>  /**<a name="line.1690"></a>
-<span class="sourceLineNo">1691</span>   * Compacts the mob files in the current table.<a name="line.1691"></a>
-<span class="sourceLineNo">1692</span>   * @param request the request.<a name="line.1692"></a>
-<span class="sourceLineNo">1693</span>   * @param tableName the current table name.<a name="line.1693"></a>
-<span class="sourceLineNo">1694</span>   * @return The response of the mob file compaction.<a name="line.1694"></a>
-<span class="sourceLineNo">1695</span>   * @throws IOException<a name="line.1695"></a>
-<span class="sourceLineNo">1696</span>   */<a name="line.1696"></a>
-<span class="sourceLineNo">1697</span>  private CompactRegionResponse compactMob(final CompactRegionRequest request,<a name="line.1697"></a>
-<span class="sourceLineNo">1698</span>    TableName tableName) throws IOException {<a name="line.1698"></a>
-<span class="sourceLineNo">1699</span>    if (!master.getTableStateManager().isTableState(tableName, TableState.State.ENABLED)) {<a name="line.1699"></a>
-<span class="sourceLineNo">1700</span>      throw new DoNotRetryIOException("Table " + tableName + " is not enabled");<a name="line.1700"></a>
-<span class="sourceLineNo">1701</span>    }<a name="line.1701"></a>
-<span class="sourceLineNo">1702</span>    boolean allFiles = false;<a name="line.1702"></a>
-<span class="sourceLineNo">1703</span>    List&lt;ColumnFamilyDescriptor&gt; compactedColumns = new ArrayList&lt;&gt;();<a name="line.1703"></a>
-<span class="sourceLineNo">1704</span>    ColumnFamilyDescriptor[] hcds = master.getTableDescriptors().get(tableName).getColumnFamilies();<a name="line.1704"></a>
-<span class="sourceLineNo">1705</span>    byte[] family = null;<a name="line.1705"></a>
-<span class="sourceLineNo">1706</span>    if (request.hasFamily()) {<a name="line.1706"></a>
-<span class="sourceLineNo">1707</span>      family = request.getFamily().toByteArray();<a name="line.1707"></a>
-<span class="sourceLineNo">1708</span>      for (ColumnFamilyDescriptor hcd : hcds) {<a name="line.1708"></a>
-<span class="sourceLineNo">1709</span>        if (Bytes.equals(family, hcd.getName())) {<a name="line.1709"></a>
-<span class="sourceLineNo">1710</span>          if (!hcd.isMobEnabled()) {<a name="line.1710"></a>
-<span class="sourceLineNo">1711</span>            LOG.error("Column family " + hcd.getNameAsString() + " is not a mob column family");<a name="line.1711"></a>
-<span class="sourceLineNo">1712</span>            throw new DoNotRetryIOException("Column family " + hcd.getNameAsString()<a name="line.1712"></a>
-<span class="sourceLineNo">1713</span>                    + " is not a mob column family");<a name="line.1713"></a>
-<span class="sourceLineNo">1714</span>          }<a name="line.1714"></a>
-<span class="sourceLineNo">1715</span>          compactedColumns.add(hcd);<a name="line.1715"></a>
-<span class="sourceLineNo">1716</span>        }<a name="line.1716"></a>
-<span class="sourceLineNo">1717</span>      }<a name="line.1717"></a>
-<span class="sourceLineNo">1718</span>    } else {<a name="line.1718"></a>
-<span class="sourceLineNo">1719</span>      for (ColumnFamilyDescriptor hcd : hcds) {<a name="line.1719"></a>
-<span class="sourceLineNo">1720</span>        if (hcd.isMobEnabled()) {<a name="line.1720"></a>
-<span class="sourceLineNo">1721</span>          compactedColumns.add(hcd);<a name="line.1721"></a>
-<span class="sourceLineNo">1722</span>        }<a name="line.1722"></a>
-<span class="sourceLineNo">1723</span>      }<a name="line.1723"></a>
-<span class="sourceLineNo">1724</span>    }<a name="line.1724"></a>
-<span class="sourceLineNo">1725</span>    if (compactedColumns.isEmpty()) {<a name="line.1725"></a>
-<span class="sourceLineNo">1726</span>      LOG.error("No mob column families are assigned in the mob compaction");<a name="line.1726"></a>
-<span class="sourceLineNo">1727</span>      throw new DoNotRetryIOException(<a name="line.1727"></a>
-<span class="sourceLineNo">1728</span>              "No mob column families are assigned in the mob compaction");<a name="line.1728"></a>
-<span class="sourceLineNo">1729</span>    }<a name="line.1729"></a>
-<span class="sourceLineNo">1730</span>    if (request.hasMajor() &amp;&amp; request.getMajor()) {<a name="line.1730"></a>
-<span class="sourceLineNo">1731</span>      allFiles = true;<a name="line.1731"></a>
-<span class="sourceLineNo">1732</span>    }<a name="line.1732"></a>
-<span class="sourceLineNo">1733</span>    String familyLogMsg = (family != null) ? Bytes.toString(family) : "";<a name="line.1733"></a>
-<span class="sourceLineNo">1734</span>    if (LOG.isTraceEnabled()) {<a name="line.1734"></a>
-<span class="sourceLineNo">1735</span>      LOG.trace("User-triggered mob compaction requested for table: "<a name="line.1735"></a>
-<span class="sourceLineNo">1736</span>              + tableName.getNameAsString() + " for column family: " + familyLogMsg);<a name="line.1736"></a>
-<span class="sourceLineNo">1737</span>    }<a name="line.1737"></a>
-<span class="sourceLineNo">1738</span>    master.requestMobCompaction(tableName, compactedColumns, allFiles);<a name="line.1738"></a>
-<span class="sourceLineNo">1739</span>    return CompactRegionResponse.newBuilder().build();<a name="line.1739"></a>
-<span class="sourceLineNo">1740</span>  }<a name="line.1740"></a>
-<span class="sourceLineNo">1741</span><a name="line.1741"></a>
-<span class="sourceLineNo">1742</span>  @Override<a name="line.1742"></a>
-<span class="sourceLineNo">1743</span>  public IsBalancerEnabledResponse isBalancerEnabled(RpcController controller,<a name="line.1743"></a>
-<span class="sourceLineNo">1744</span>      IsBalancerEnabledRequest request) throws ServiceException {<a name="line.1744"></a>
-<span class="sourceLineNo">1745</span>    IsBalancerEnabledResponse.Builder response = IsBalancerEnabledResponse.newBuilder();<a name="line.1745"></a>
-<span class="sourceLineNo">1746</span>    response.setEnabled(master.isBalancerOn());<a name="line.1746"></a>
-<span class="sourceLineNo">1747</span>    return response.build();<a name="line.1747"></a>
-<span class="sourceLineNo">1748</span>  }<a name="line.1748"></a>
-<span class="sourceLineNo">1749</span><a name="line.1749"></a>
-<span class="sourceLineNo">1750</span>  @Override<a name="line.1750"></a>
-<span class="sourceLineNo">1751</span>  public SetSplitOrMergeEnabledResponse setSplitOrMergeEnabled(RpcController controller,<a name="line.1751"></a>
-<span class="sourceLineNo">1752</span>    SetSplitOrMergeEnabledRequest request) throws ServiceException {<a name="line.1752"></a>
-<span class="sourceLineNo">1753</span>    SetSplitOrMergeEnabledResponse.Builder response = SetSplitOrMergeEnabledResponse.newBuilder();<a name="line.1753"></a>
-<span class="sourceLineNo">1754</span>    try {<a name="line.1754"></a>
-<span class="sourceLineNo">1755</span>      master.checkInitialized();<a name="line.1755"></a>
-<span class="sourceLineNo">1756</span>      boolean newValue = request.getEnabled();<a name="line.1756"></a>
-<span class="sourceLineNo">1757</span>      for (MasterProtos.MasterSwitchType masterSwitchType: request.getSwitchTypesList()) {<a name="line.1757"></a>
-<span class="sourceLineNo">1758</span>        MasterSwitchType switchType = convert(masterSwitchType);<a name="line.1758"></a>
-<span class="sourceLineNo">1759</span>        boolean oldValue = master.isSplitOrMergeEnabled(switchType);<a name="line.1759"></a>
-<span class="sourceLineNo">1760</span>        response.addPrevValue(oldValue);<a name="line.1760"></a>
+<span class="sourceLineNo">1527</span>    response.setInMaintenanceMode(master.isInMaintenanceMode());<a name="line.1527"></a>
+<span class="sourceLineNo">1528</span>    return response.build();<a name="line.1528"></a>
+<span class="sourceLineNo">1529</span>  }<a name="line.1529"></a>
+<span class="sourceLineNo">1530</span><a name="line.1530"></a>
+<span class="sourceLineNo">1531</span>  @Override<a name="line.1531"></a>
+<span class="sourceLineNo">1532</span>  public UnassignRegionResponse unassignRegion(RpcController controller,<a name="line.1532"></a>
+<span class="sourceLineNo">1533</span>      UnassignRegionRequest req) throws ServiceException {<a name="line.1533"></a>
+<span class="sourceLineNo">1534</span>    try {<a name="line.1534"></a>
+<span class="sourceLineNo">1535</span>      final byte [] regionName = req.getRegion().getValue().toByteArray();<a name="line.1535"></a>
+<span class="sourceLineNo">1536</span>      RegionSpecifierType type = req.getRegion().getType();<a name="line.1536"></a>
+<span class="sourceLineNo">1537</span>      final boolean force = req.getForce();<a name="line.1537"></a>
+<span class="sourceLineNo">1538</span>      UnassignRegionResponse urr = UnassignRegionResponse.newBuilder().build();<a name="line.1538"></a>
+<span class="sourceLineNo">1539</span><a name="line.1539"></a>
+<span class="sourceLineNo">1540</span>      master.checkInitialized();<a name="line.1540"></a>
+<span class="sourceLineNo">1541</span>      if (type != RegionSpecifierType.REGION_NAME) {<a name="line.1541"></a>
+<span class="sourceLineNo">1542</span>        LOG.warn("unassignRegion specifier type: expected: " + RegionSpecifierType.REGION_NAME<a name="line.1542"></a>
+<span class="sourceLineNo">1543</span>          + " actual: " + type);<a name="line.1543"></a>
+<span class="sourceLineNo">1544</span>      }<a name="line.1544"></a>
+<span class="sourceLineNo">1545</span>      Pair&lt;RegionInfo, ServerName&gt; pair =<a name="line.1545"></a>
+<span class="sourceLineNo">1546</span>        MetaTableAccessor.getRegion(master.getConnection(), regionName);<a name="line.1546"></a>
+<span class="sourceLineNo">1547</span>      if (Bytes.equals(RegionInfoBuilder.FIRST_META_REGIONINFO.getRegionName(),regionName)) {<a name="line.1547"></a>
+<span class="sourceLineNo">1548</span>        pair = new Pair&lt;&gt;(RegionInfoBuilder.FIRST_META_REGIONINFO,<a name="line.1548"></a>
+<span class="sourceLineNo">1549</span>            master.getMetaTableLocator().getMetaRegionLocation(master.getZooKeeper()));<a name="line.1549"></a>
+<span class="sourceLineNo">1550</span>      }<a name="line.1550"></a>
+<span class="sourceLineNo">1551</span>      if (pair == null) {<a name="line.1551"></a>
+<span class="sourceLineNo">1552</span>        throw new UnknownRegionException(Bytes.toString(regionName));<a name="line.1552"></a>
+<span class="sourceLineNo">1553</span>      }<a name="line.1553"></a>
+<span class="sourceLineNo">1554</span><a name="line.1554"></a>
+<span class="sourceLineNo">1555</span>      RegionInfo hri = pair.getFirst();<a name="line.1555"></a>
+<span class="sourceLineNo">1556</span>      if (master.cpHost != null) {<a name="line.1556"></a>
+<span class="sourceLineNo">1557</span>        master.cpHost.preUnassign(hri, force);<a name="line.1557"></a>
+<span class="sourceLineNo">1558</span>      }<a name="line.1558"></a>
+<span class="sourceLineNo">1559</span>      LOG.debug(master.getClientIdAuditPrefix() + " unassign " + hri.getRegionNameAsString()<a name="line.1559"></a>
+<span class="sourceLineNo">1560</span>          + " in current location if it is online and reassign.force=" + force);<a name="line.1560"></a>
+<span class="sourceLineNo">1561</span>      master.getAssignmentManager().unassign(hri);<a name="line.1561"></a>
+<span class="sourceLineNo">1562</span>      if (master.cpHost != null) {<a name="line.1562"></a>
+<span class="sourceLineNo">1563</span>        master.cpHost.postUnassign(hri, force);<a name="line.1563"></a>
+<span class="sourceLineNo">1564</span>      }<a name="line.1564"></a>
+<span class="sourceLineNo">1565</span><a name="line.1565"></a>
+<span class="sourceLineNo">1566</span>      return urr;<a name="line.1566"></a>
+<span class="sourceLineNo">1567</span>    } catch (IOException ioe) {<a name="line.1567"></a>
+<span class="sourceLineNo">1568</span>      throw new ServiceException(ioe);<a name="line.1568"></a>
+<span class="sourceLineNo">1569</span>    }<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>  @Override<a name="line.1572"></a>
+<span class="sourceLineNo">1573</span>  public ReportRegionStateTransitionResponse reportRegionStateTransition(RpcController c,<a name="line.1573"></a>
+<span class="sourceLineNo">1574</span>      ReportRegionStateTransitionRequest req) throws ServiceException {<a name="line.1574"></a>
+<span class="sourceLineNo">1575</span>    try {<a name="line.1575"></a>
+<span class="sourceLineNo">1576</span>      master.checkServiceStarted();<a name="line.1576"></a>
+<span class="sourceLineNo">1577</span>      return master.getAssignmentManager().reportRegionStateTransition(req);<a name="line.1577"></a>
+<span class="sourceLineNo">1578</span>    } catch (IOException ioe) {<a name="line.1578"></a>
+<span class="sourceLineNo">1579</span>      throw new ServiceException(ioe);<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">1582</span><a name="line.1582"></a>
+<span class="sourceLineNo">1583</span>  @Override<a name="line.1583"></a>
+<span class="sourceLineNo">1584</span>  public SetQuotaResponse setQuota(RpcController c, SetQuotaRequest req)<a name="line.1584"></a>
+<span class="sourceLineNo">1585</span>      throws ServiceException {<a name="line.1585"></a>
+<span class="sourceLineNo">1586</span>    try {<a name="line.1586"></a>
+<span class="sourceLineNo">1587</span>      master.checkInitialized();<a name="line.1587"></a>
+<span class="sourceLineNo">1588</span>      return master.getMasterQuotaManager().setQuota(req);<a name="line.1588"></a>
+<span class="sourceLineNo">1589</span>    } catch (Exception e) {<a name="line.1589"></a>
+<span class="sourceLineNo">1590</span>      throw new ServiceException(e);<a name="line.1590"></a>
+<span class="sourceLineNo">1591</span>    }<a name="line.1591"></a>
+<span class="sourceLineNo">1592</span>  }<a name="line.1592"></a>
+<span class="sourceLineNo">1593</span><a name="line.1593"></a>
+<span class="sourceLineNo">1594</span>  @Override<a name="line.1594"></a>
+<span class="sourceLineNo">1595</span>  public MajorCompactionTimestampResponse getLastMajorCompactionTimestamp(RpcController controller,<a name="line.1595"></a>
+<span class="sourceLineNo">1596</span>      MajorCompactionTimestampRequest request) throws ServiceException {<a name="line.1596"></a>
+<span class="sourceLineNo">1597</span>    MajorCompactionTimestampResponse.Builder response =<a name="line.1597"></a>
+<span class="sourceLineNo">1598</span>        MajorCompactionTimestampResponse.newBuilder();<a name="line.1598"></a>
+<span class="sourceLineNo">1599</span>    try {<a name="line.1599"></a>
+<span class="sourceLineNo">1600</span>      master.checkInitialized();<a name="line.1600"></a>
+<span class="sourceLineNo">1601</span>      response.setCompactionTimestamp(master.getLastMajorCompactionTimestamp(ProtobufUtil<a name="line.1601"></a>
+<span class="sourceLineNo">1602</span>          .toTableName(request.getTableName())));<a name="line.1602"></a>
+<span class="sourceLineNo">1603</span>    } catch (IOException e) {<a name="line.1603"></a>
+<span class="sourceLineNo">1604</span>      throw new ServiceException(e);<a name="line.1604"></a>
+<span class="sourceLineNo">1605</span>    }<a name="line.1605"></a>
+<span class="sourceLineNo">1606</span>    return response.build();<a name="line.1606"></a>
+<span class="sourceLineNo">1607</span>  }<a name="line.1607"></a>
+<span class="sourceLineNo">1608</span><a name="line.1608"></a>
+<span class="sourceLineNo">1609</span>  @Override<a name="line.1609"></a>
+<span class="sourceLineNo">1610</span>  public MajorCompactionTimestampResponse getLastMajorCompactionTimestampForRegion(<a name="line.1610"></a>
+<span class="sourceLineNo">1611</span>      RpcController controller, MajorCompactionTimestampForRegionRequest request)<a name="line.1611"></a>
+<span class="sourceLineNo">1612</span>      throws ServiceException {<a name="line.1612"></a>
+<span class="sourceLineNo">1613</span>    MajorCompactionTimestampResponse.Builder response =<a name="line.1613"></a>
+<span class="sourceLineNo">1614</span>        MajorCompactionTimestampResponse.newBuilder();<a name="line.1614"></a>
+<span class="sourceLineNo">1615</span>    try {<a name="line.1615"></a>
+<span class="sourceLineNo">1616</span>      master.checkInitialized();<a name="line.1616"></a>
+<span class="sourceLineNo">1617</span>      response.setCompactionTimestamp(master.getLastMajorCompactionTimestampForRegion(request<a name="line.1617"></a>
+<span class="sourceLineNo">1618</span>          .getRegion().getValue().toByteArray()));<a name="line.1618"></a>
+<span class="sourceLineNo">1619</span>    } catch (IOException e) {<a name="line.1619"></a>
+<span class="sourceLineNo">1620</span>      throw new ServiceException(e);<a name="line.1620"></a>
+<span class="sourceLineNo">1621</span>    }<a name="line.1621"></a>
+<span class="sourceLineNo">1622</span>    return response.build();<a name="line.1622"></a>
+<span class="sourceLineNo">1623</span>  }<a name="line.1623"></a>
+<span class="sourceLineNo">1624</span><a name="line.1624"></a>
+<span class="sourceLineNo">1625</span>  /**<a name="line.1625"></a>
+<span class="sourceLineNo">1626</span>   * Compact a region on the master.<a name="line.1626"></a>
+<span class="sourceLineNo">1627</span>   *<a name="line.1627"></a>
+<span class="sourceLineNo">1628</span>   * @param controller the RPC controller<a name="line.1628"></a>
+<span class="sourceLineNo">1629</span>   * @param request the request<a name="line.1629"></a>
+<span class="sourceLineNo">1630</span>   * @throws ServiceException<a name="line.1630"></a>
+<span class="sourceLineNo">1631</span>   */<a name="line.1631"></a>
+<span class="sourceLineNo">1632</span>  @Override<a name="line.1632"></a>
+<span class="sourceLineNo">1633</span>  @QosPriority(priority=HConstants.ADMIN_QOS)<a name="line.1633"></a>
+<span class="sourceLineNo">1634</span>  public CompactRegionResponse compactRegion(final RpcController controller,<a name="line.1634"></a>
+<span class="sourceLineNo">1635</span>    final CompactRegionRequest request) throws ServiceException {<a name="line.1635"></a>
+<span class="sourceLineNo">1636</span>    try {<a name="line.1636"></a>
+<span class="sourceLineNo">1637</span>      master.checkInitialized();<a name="line.1637"></a>
+<span class="sourceLineNo">1638</span>      byte[] regionName = request.getRegion().getValue().toByteArray();<a name="line.1638"></a>
+<span class="sourceLineNo">1639</span>      TableName tableName = RegionInfo.getTable(regionName);<a name="line.1639"></a>
+<span class="sourceLineNo">1640</span>      // if the region is a mob region, do the mob file compaction.<a name="line.1640"></a>
+<span class="sourceLineNo">1641</span>      if (MobUtils.isMobRegionName(tableName, regionName)) {<a name="line.1641"></a>
+<span class="sourceLineNo">1642</span>        checkHFileFormatVersionForMob();<a name="line.1642"></a>
+<span class="sourceLineNo">1643</span>        return compactMob(request, tableName);<a name="line.1643"></a>
+<span class="sourceLineNo">1644</span>      } else {<a name="line.1644"></a>
+<span class="sourceLineNo">1645</span>        return super.compactRegion(controller, request);<a name="line.1645"></a>
+<span class="sourceLineNo">1646</span>      }<a name="line.1646"></a>
+<span class="sourceLineNo">1647</span>    } catch (IOException ie) {<a name="line.1647"></a>
+<span class="sourceLineNo">1648</span>      throw new ServiceException(ie);<a name="line.1648"></a>
+<span class="sourceLineNo">1649</span>    }<a name="line.1649"></a>
+<span class="sourceLineNo">1650</span>  }<a name="line.1650"></a>
+<span class="sourceLineNo">1651</span><a name="line.1651"></a>
+<span class="sourceLineNo">1652</span>  /**<a name="line.1652"></a>
+<span class="sourceLineNo">1653</span>   * check configured hfile format version before to do compaction<a name="line.1653"></a>
+<span class="sourceLineNo">1654</span>   * @throws IOException throw IOException<a name="line.1654"></a>
+<span class="sourceLineNo">1655</span>   */<a name="line.1655"></a>
+<span class="sourceLineNo">1656</span>  private void checkHFileFormatVersionForMob() throws IOException {<a name="line.1656"></a>
+<span class="sourceLineNo">1657</span>    if (HFile.getFormatVersion(master.getConfiguration()) &lt; HFile.MIN_FORMAT_VERSION_WITH_TAGS) {<a name="line.1657"></a>
+<span class="sourceLineNo">1658</span>      LOG.error("A minimum HFile version of " + HFile.MIN_FORMAT_VERSION_WITH_TAGS<a name="line.1658"></a>
+<span class="sourceLineNo">1659</span>          + " is required for MOB compaction. Compaction will not run.");<a name="line.1659"></a>
+<span class="sourceLineNo">1660</span>      throw new IOException("A minimum HFile version of " + HFile.MIN_FORMAT_VERSION_WITH_TAGS<a name="line.1660"></a>
+<span class="sourceLineNo">1661</span>          + " is required for MOB feature. Consider setting " + HFile.FORMAT_VERSION_KEY<a name="line.1661"></a>
+<span class="sourceLineNo">1662</span>          + " accordingly.");<a name="line.1662"></a>
+<span class="sourceLineNo">1663</span>    }<a name="line.1663"></a>
+<span class="sourceLineNo">1664</span>  }<a name="line.1664"></a>
+<span class="sourceLineNo">1665</span><a name="line.1665"></a>
+<span class="sourceLineNo">1666</span>  @Override<a name="line.1666"></a>
+<span class="sourceLineNo">1667</span>  @QosPriority(priority=HConstants.ADMIN_QOS)<a name="line.1667"></a>
+<span class="sourceLineNo">1668</span>  public GetRegionInfoResponse getRegionInfo(final RpcController controller,<a name="line.1668"></a>
+<span class="sourceLineNo">1669</span>    final GetRegionInfoRequest request) throws ServiceException {<a name="line.1669"></a>
+<span class="sourceLineNo">1670</span>    byte[] regionName = request.getRegion().getValue().toByteArray();<a name="line.1670"></a>
+<span class="sourceLineNo">1671</span>    TableName tableName = RegionInfo.getTable(regionName);<a name="line.1671"></a>
+<span class="sourceLineNo">1672</span>    if (MobUtils.isMobRegionName(tableName, regionName)) {<a name="line.1672"></a>
+<span class="sourceLineNo">1673</span>      // a dummy region info contains the compaction state.<a name="line.1673"></a>
+<span class="sourceLineNo">1674</span>      RegionInfo mobRegionInfo = MobUtils.getMobRegionInfo(tableName);<a name="line.1674"></a>
+<span class="sourceLineNo">1675</span>      GetRegionInfoResponse.Builder builder = GetRegionInfoResponse.newBuilder();<a name="line.1675"></a>
+<span class="sourceLineNo">1676</span>      builder.setRegionInfo(ProtobufUtil.toRegionInfo(mobRegionInfo));<a name="line.1676"></a>
+<span class="sourceLineNo">1677</span>      if (request.hasCompactionState() &amp;&amp; request.getCompactionState()) {<a name="line.1677"></a>
+<span class="sourceLineNo">1678</span>        builder.setCompactionState(master.getMobCompactionState(tableName));<a name="line.1678"></a>
+<span class="sourceLineNo">1679</span>      }<a name="line.1679"></a>
+<span class="sourceLineNo">1680</span>      return builder.build();<a name="line.1680"></a>
+<span class="sourceLineNo">1681</span>    } else {<a name="line.1681"></a>
+<span class="sourceLineNo">1682</span>      return super.getRegionInfo(controller, request);<a name="line.1682"></a>
+<span class="sourceLineNo">1683</span>    }<a name="line.1683"></a>
+<span class="sourceLineNo">1684</span>  }<a name="line.1684"></a>
+<span class="sourceLineNo">1685</span><a name="line.1685"></a>
+<span class="sourceLineNo">1686</span>  /**<a name="line.1686"></a>
+<span class="sourceLineNo">1687</span>   * Compacts the mob files in the current table.<a name="line.1687"></a>
+<span class="sourceLineNo">1688</span>   * @param request the request.<a name="line.1688"></a>
+<span class="sourceLineNo">1689</span>   * @param tableName the current table name.<a name="line.1689"></a>
+<span class="sourceLineNo">1690</span>   * @return The response of the mob file compaction.<a name="line.1690"></a>
+<span class="sourceLineNo">1691</span>   * @throws IOException<a name="line.1691"></a>
+<span class="sourceLineNo">1692</span>   */<a name="line.1692"></a>
+<span class="sourceLineNo">1693</span>  private CompactRegionResponse compactMob(final CompactRegionRequest request,<a name="line.1693"></a>
+<span class="sourceLineNo">1694</span>    TableName tableName) throws IOException {<a name="line.1694"></a>
+<span class="sourceLineNo">1695</span>    if (!master.getTableStateManager().isTableState(tableName, TableState.State.ENABLED)) {<a name="line.1695"></a>
+<span class="sourceLineNo">1696</span>      throw new DoNotRetryIOException("Table " + tableName + " is not enabled");<a name="line.1696"></a>
+<span class="sourceLineNo">1697</span>    }<a name="line.1697"></a>
+<span class="sourceLineNo">1698</span>    boolean allFiles = false;<a name="line.1698"></a>
+<span class="sourceLineNo">1699</span>    List&lt;ColumnFamilyDescriptor&gt; compactedColumns = new ArrayList&lt;&gt;();<a name="line.1699"></a>
+<span class="sourceLineNo">1700</span>    ColumnFamilyDescriptor[] hcds = master.getTableDescriptors().get(tableName).getColumnFamilies();<a name="line.1700"></a>
+<span class="sourceLineNo">1701</span>    byte[] family = null;<a name="line.1701"></a>
+<span class="sourceLineNo">1702</span>    if (request.hasFamily()) {<a name="line.1702"></a>
+<span class="sourceLineNo">1703</span>      family = request.getFamily().toByteArray();<a name="line.1703"></a>
+<span class="sourceLineNo">1704</span>      for (ColumnFamilyDescriptor hcd : hcds) {<a name="line.1704"></a>
+<span class="sourceLineNo">1705</span>        if (Bytes.equals(family, hcd.getName())) {<a name="line.1705"></a>
+<span class="sourceLineNo">1706</span>          if (!hcd.isMobEnabled()) {<a name="line.1706"></a>
+<span class="sourceLineNo">1707</span>            LOG.error("Column family " + hcd.getNameAsString() + " is not a mob column family");<a name="line.1707"></a>
+<span class="sourceLineNo">1708</span>            throw new DoNotRetryIOException("Column family " + hcd.getNameAsString()<a name="line.1708"></a>
+<span class="sourceLineNo">1709</span>                    + " is not a mob column family");<a name="line.1709"></a>
+<span class="sourceLineNo">1710</span>          }<a name="line.1710"></a>
+<span class="sourceLineNo">1711</span>          compactedColumns.add(hcd);<a name="line.1711"></a>
+<span class="sourceLineNo">1712</span>        }<a name="line.1712"></a>
+<span class="sourceLineNo">1713</span>      }<a name="line.1713"></a>
+<span class="sourceLineNo">1714</span>    } else {<a name="line.1714"></a>
+<span class="sourceLineNo">1715</span>      for (ColumnFamilyDescriptor hcd : hcds) {<a name="line.1715"></a>
+<span class="sourceLineNo">1716</span>        if (hcd.isMobEnabled()) {<a name="line.1716"></a>
+<span class="sourceLineNo">1717</span>          compactedColumns.add(hcd);<a name="line.1717"></a>
+<span class="sourceLineNo">1718</span>        }<a name="line.1718"></a>
+<span class="sourceLineNo">1719</span>      }<a name="line.1719"></a>
+<span class="sourceLineNo">1720</span>    }<a name="line.1720"></a>
+<span class="sourceLineNo">1721</span>    if (compactedColumns.isEmpty()) {<a name="line.1721"></a>
+<span class="sourceLineNo">1722</span>      LOG.error("No mob column families are assigned in the mob compaction");<a name="line.1722"></a>
+<span class="sourceLineNo">1723</span>      throw new DoNotRetryIOException(<a name="line.1723"></a>
+<span class="sourceLineNo">1724</span>              "No mob column families are assigned in the mob compaction");<a name="line.1724"></a>
+<span class="sourceLineNo">1725</span>    }<a name="line.1725"></a>
+<span class="sourceLineNo">1726</span>    if (request.hasMajor() &amp;&amp; request.getMajor()) {<a name="line.1726"></a>
+<span class="sourceLineNo">1727</span>      allFiles = true;<a name="line.1727"></a>
+<span class="sourceLineNo">1728</span>    }<a name="line.1728"></a>
+<span class="sourceLineNo">1729</span>    String familyLogMsg = (family != null) ? Bytes.toString(family) : "";<a name="line.1729"></a>
+<span class="sourceLineNo">1730</span>    if (LOG.isTraceEnabled()) {<a name="line.1730"></a>
+<span class="sourceLineNo">1731</span>      LOG.trace("User-triggered mob compaction requested for table: "<a name="line.1731"></a>
+<span class="sourceLineNo">1732</span>              + tableName.getNameAsString() + " for column family: " + familyLogMsg);<a name="line.1732"></a>
+<span class="sourceLineNo">1733</span>    }<a name="line.1733"></a>
+<span class="sourceLineNo">1734</span>    master.requestMobCompaction(tableName, compactedColumns, allFiles);<a name="line.1734"></a>
+<span class="sourceLineNo">1735</span>    return CompactRegionResponse.newBuilder().build();<a name="line.1735"></a>
+<span class="sourceLineNo">1736</span>  }<a name="line.1736"></a>
+<span class="sourceLineNo">1737</span><a name="line.1737"></a>
+<span class="sourceLineNo">1738</span>  @Override<a name="line.1738"></a>
+<span class="sourceLineNo">1739</span>  public IsBalancerEnabledResponse isBalancerEnabled(RpcController controller,<a name="line.1739"></a>
+<span class="sourceLineNo">1740</span>      IsBalancerEnabledRequest request) throws ServiceException {<a name="line.1740"></a>
+<span class="sourceLineNo">1741</span>    IsBalancerEnabledResponse.Builder response = IsBalancerEnabledResponse.newBuilder();<a name="line.1741"></a>
+<span class="sourceLineNo">1742</span>    response.setEnabled(master.isBalancerOn());<a name="line.1742"></a>
+<span class="sourceLineNo">1743</span>    return response.build();<a name="line.1743"></a>
+<span class="sourceLineNo">1744</span>  }<a name="line.1744"></a>
+<span class="sourceLineNo">1745</span><a name="line.1745"></a>
+<span class="sourceLineNo">1746</span>  @Override<a name="line.1746"></a>
+<span class="sourceLineNo">1747</span>  public SetSplitOrMergeEnabledResponse setSplitOrMergeEnabled(RpcController controller,<a name="line.1747"></a>
+<span class="sourceLineNo">1748</span>    SetSplitOrMergeEnabledRequest request) throws ServiceException {<a name="line.1748"></a>
+<span class="sourceLineNo">1749</span>    SetSplitOrMergeEnabledResponse.Builder response = SetSplitOrMergeEnabledResponse.newBuilder();<a name="line.1749"></a>
+<span class="sourceLineNo">1750</span>    try {<a name="line.1750"></a>
+<span class="sourceLineNo">1751</span>      master.checkInitialized();<a name="line.1751"></a>
+<span class="sourceLineNo">1752</span>      boolean newValue = request.getEnabled();<a name="line.1752"></a>
+<span class="sourceLineNo">1753</span>      for (MasterProtos.MasterSwitchType masterSwitchType: request.getSwitchTypesList()) {<a name="line.1753"></a>
+<span class="sourceLineNo">1754</span>        MasterSwitchType switchType = convert(masterSwitchType);<a name="line.1754"></a>
+<span class="sourceLineNo">1755</span>        boolean oldValue = master.isSplitOrMergeEnabled(switchType);<a name="line.1755"></a>
+<span class="sourceLineNo">1756</span>        response.addPrevValue(oldValue);<a name="line.1756"></a>
+<span class="sourceLineNo">1757</span>        if (master.cpHost != null) {<a name="line.1757"></a>
+<span class="sourceLineNo">1758</span>          master.cpHost.preSetSplitOrMergeEnabled(newValue, switchType);<a name="line.1758"></a>
+<span class="sourceLineNo">1759</span>        }<a name="line.1759"></a>
+<span class="sourceLineNo">1760</span>        master.getSplitOrMergeTracker().setSplitOrMergeEnabled(newValue, switchType);<a name="line.1760"></a>
 <span class="sourceLineNo">1761</span>        if (master.cpHost != null) {<a name="line.1761"></a>
-<span class="sourceLineNo">1762</span>          master.cpHost.preSetSplitOrMergeEnabled(newValue, switchType);<a name="line.1762"></a>
+<span class="sourceLineNo">1762</span>          master.cpHost.postSetSplitOrMergeEnabled(newValue, switchType);<a name="line.1762"></a>
 <span class="sourceLineNo">1763</span>        }<a name="line.1763"></a>
-<span class="sourceLineNo">1764</span>        master.getSplitOrMergeTracker().setSplitOrMergeEnabled(newValue, switchType);<a name="line.1764"></a>
-<span class="sourceLineNo">1765</span>        if (master.cpHost != null) {<a name="line.1765"></a>
-<span class="sourceLineNo">1766</span>          master.cpHost.postSetSplitOrMergeEnabled(newValue, switchType);<a name="line.1766"></a>
-<span class="sourceLineNo">1767</span>        }<a name="line.1767"></a>
-<span class="sourceLineNo">1768</span>      }<a name="line.1768"></a>
-<span class="sourceLineNo">1769</span>    } catch (IOException e) {<a name="line.1769"></a>
-<span class="sourceLineNo">1770</span>      throw new ServiceException(e);<a name="line.1770"></a>
-<span class="sourceLineNo">1771</span>    } catch (KeeperException e) {<a name="line.1771"></a>
-<span class="sourceLineNo">1772</span>      throw new ServiceException(e);<a name="line.1772"></a>
-<span class="sourceLineNo">1773</span>    }<a name="line.1773"></a>
-<span class="sourceLineNo">1774</span>    return response.build();<a name="line.1774"></a>
-<span class="sourceLineNo">1775</span>  }<a name="line.1775"></a>
-<span class="sourceLineNo">1776</span><a name="line.1776"></a>
-<span class="sourceLineNo">1777</span>  @Override<a name="line.1777"></a>
-<span class="sourceLineNo">1778</span>  public IsSplitOrMergeEnabledResponse isSplitOrMergeEnabled(RpcController controller,<a name="line.1778"></a>
-<span class="sourceLineNo">1779</span>    IsSplitOrMergeEnabledRequest request) throws ServiceException {<a name="line.1779"></a>
-<span class="sourceLineNo">1780</span>    IsSplitOrMergeEnabledResponse.Builder response = IsSplitOrMergeEnabledResponse.newBuilder();<a name="line.1780"></a>
-<span class="sourceLineNo">1781</span>    response.setEnabled(master.isSplitOrMergeEnabled(convert(request.getSwitchType())));<a name="line.1781"></a>
-<span class="sourceLineNo">1782</span>    return response.build();<a name="line.1782"></a>
-<span class="sourceLineNo">1783</span>  }<a name="line.1783"></a>
-<span class="sourceLineNo">1784</span><a name="line.1784"></a>
-<span class="sourceLineNo">1785</span>  @Override<a name="line.1785"></a>
-<span class="sourceLineNo">1786</span>  public NormalizeResponse normalize(RpcController controller,<a name="line.1786"></a>
-<span class="sourceLineNo">1787</span>      NormalizeRequest request) throws ServiceException {<a name="line.1787"></a>
-<span class="sourceLineNo">1788</span>    rpcPreCheck("normalize");<a name="line.1788"></a>
-<span class="sourceLineNo">1789</span>    try {<a name="line.1789"></a>
-<span class="sourceLineNo">1790</span>      return NormalizeResponse.newBuilder().setNormalizerRan(master.normalizeRegions()).build();<a name="line.1790"></a>
-<span class="sourceLineNo">1791</span>    } catch (IOException ex) {<a name="line.1791"></a>
-<span class="sourceLineNo">1792</span>      throw new ServiceException(ex);<a name="line.1792"></a>
-<span class="sourceLineNo">1793</span>    }<a name="line.1793"></a>
-<span class="sourceLineNo">1794</span>  }<a name="line.1794"></a>
-<span class="sourceLineNo">1795</span><a name="line.1795"></a>
-<span class="sourceLineNo">1796</span>  @Override<a name="line.1796"></a>
-<span class="sourceLineNo">1797</span>  public SetNormalizerRunningResponse setNormalizerRunning(RpcController controller,<a name="line.1797"></a>
-<span class="sourceLineNo">1798</span>      SetNormalizerRunningRequest request) throws ServiceException {<a name="line.1798"></a>
-<span class="sourceLineNo">1799</span>    rpcPreCheck("setNormalizerRunning");<a name="line.1799"></a>
-<span class="sourceLineNo">1800</span><a name="line.1800"></a>
-<span class="sourceLineNo">1801</span>    // Sets normalizer on/off flag in ZK.<a name="line.1801"></a>
-<span class="sourceLineNo">1802</span>    boolean prevValue = master.getRegionNormalizerTracker().isNormalizerOn();<a name="line.1802"></a>
-<span class="sourceLineNo">1803</span>    boolean newValue = request.getOn();<a name="line.1803"></a>
-<span class="sourceLineNo">1804</span>    try {<a name="line.1804"></a>
-<span class="sourceLineNo">1805</span>      master.getRegionNormalizerTracker().setNormalizerOn(newValue);<a name="line.1805"></a>
-<span class="sourceLineNo">1806</span>    } catch (KeeperException ke) {<a name="line.1806"></a>
-<span class="sourceLineNo">1807</span>      LOG.warn("Error flipping normalizer switch", ke);<a name="line.1807"></a>
-<span class="sourceLineNo">1808</span>    }<a name="line.1808"></a>
-<span class="sourceLineNo">1809</span>    LOG.info("{} set normalizerSwitch={}", master.getClientIdAuditPrefix(), newValue);<a name="line.1809"></a>
-<span class="sourceLineNo">1810</span>    return SetNormalizerRunningResponse.newBuilder().setPrevNormalizerValue(prevValue).build();<a name="line.1810"></a>
-<span class="sourceLineNo">1811</span>  }<a name="line.1811"></a>
-<span class="sourceLineNo">1812</span><a name="line.1812"></a>
-<span class="sourceLineNo">1813</span>  @Override<a name="line.1813"></a>
-<span class="sourceLineNo">1814</span>  public IsNormalizerEnabledResponse isNormalizerEnabled(RpcController controller,<a name="line.1814"></a>
-<span class="sourceLineNo">1815</span>      IsNormalizerEnabledRequest request) throws ServiceException {<a name="line.1815"></a>
-<span class="sourceLineNo">1816</span>    IsNormalizerEnabledResponse.Builder response = IsNormalizerEnabledResponse.newBuilder();<a name="line.1816"></a>
-<span class="sourceLineNo">1817</span>    response.setEnabled(master.isNormalizerOn());<a name="line.1817"></a>
-<span class="sourceLineNo">1818</span>    return response.build();<a name="line.1818"></a>
-<span class="sourceLineNo">1819</span>  }<a name="line.1819"></a>
-<span class="sourceLineNo">1820</span><a name="line.1820"></a>
-<span class="sourceLineNo">1821</span>  /**<a name="line.1821"></a>
-<span class="sourceLineNo">1822</span>   * Returns the security capabilities in effect on the cluster<a name="line.1822"></a>
-<span class="sourceLineNo">1823</span>   */<a name="line.1823"></a>
-<span class="sourceLineNo">1824</span>  @Override<a name="line.1824"></a>
-<span class="sourceLineNo">1825</span>  public SecurityCapabilitiesResponse getSecurityCapabilities(RpcController controller,<a name="line.1825"></a>
-<span class="sourceLineNo">1826</span>      SecurityCapabilitiesRequest request) throws ServiceException {<a name="line.1826"></a>
-<span class="sourceLineNo">1827</span>    SecurityCapabilitiesResponse.Builder response = SecurityCapabilitiesResponse.newBuilder();<a name="line.1827"></a>
-<span class="sourceLineNo">1828</span>    try {<a name="line.1828"></a>
-<span class="sourceLineNo">1829</span>      master.checkInitialized();<a name="line.1829"></a>
-<span class="sourceLineNo">1830</span>      Set&lt;SecurityCapabilitiesResponse.Capability&gt; capabilities = new HashSet&lt;&gt;();<a name="line.1830"></a>
-<span class="sourceLineNo">1831</span>      // Authentication<a name="line.1831"></a>
-<span class="sourceLineNo">1832</span>      if (User.isHBaseSecurityEnabled(master.getConfiguration())) {<a name="line.1832"></a>
-<span class="sourceLineNo">1833</span>        capabilities.add(SecurityCapabilitiesResponse.Capability.SECURE_AUTHENTICATION);<a name="line.1833"></a>
-<span class="sourceLineNo">1834</span>      } else {<a name="line.1834"></a>
-<span class="sourceLineNo">1835</span>        capabilities.add(SecurityCapabilitiesResponse.Capability.SIMPLE_AUTHENTICATION);<a name="line.1835"></a>
-<span class="sourceLineNo">1836</span>      }<a name="line.1836"></a>
-<span class="sourceLineNo">1837</span>      // A coprocessor that implements AccessControlService can provide AUTHORIZATION and<a name="line.1837"></a>
-<span class="sourceLineNo">1838</span>      // CELL_AUTHORIZATION<a name="line.1838"></a>
-<span class="sourceLineNo">1839</span>      if (master.cpHost != null &amp;&amp; hasAccessControlServiceCoprocessor(master.cpHost)) {<a name="line.1839"></a>
-<span class="sourceLineNo">1840</span>        if (AccessChecker.isAuthorizationSupported(master.getConfiguration())) {<a name="line.1840"></a>
-<span class="sourceLineNo">1841</span>          capabilities.add(SecurityCapabilitiesResponse.Capability.AUTHORIZATION);<a name="line.1841"></a>
-<span class="sourceLineNo">1842</span>        }<a name="line.1842"></a>
-<span class="sourceLineNo">1843</span>        if (AccessController.isCellAuthorizationSupported(master.getConfiguration())) {<a name="line.1843"></a>
-<span class="sourceLineNo">1844</span>          capabilities.add(SecurityCapabilitiesResponse.Capability.CELL_AUTHORIZATION);<a name="line.1844"></a>
-<span class="sourceLineNo">1845</span>        }<a name="line.1845"></a>
-<span class="sourceLineNo">1846</span>      }<a name="line.1846"></a>
-<span class="sourceLineNo">1847</span>      // A coprocessor that implements VisibilityLabelsService can provide CELL_VISIBILITY.<a name="line.1847"></a>
-<span class="sourceLineNo">1848</span>      if (master.cpHost != null &amp;&amp; hasVisibilityLabelsServiceCoprocessor(master.cpHost)) {<a name="line.1848"></a>
-<span class="sourceLineNo">1849</span>        if (VisibilityController.isCellAuthorizationSupported(master.getConfiguration())) {<a name="line.1849"></a>
-<span class="sourceLineNo">1850</span>          capabilities.add(SecurityCapabilitiesResponse.Capability.CELL_VISIBILITY);<a name="line.1850"></a>
-<span class="sourceLineNo">1851</span>        }<a name="line.1851"></a>
-<span class="sourceLineNo">1852</span>      }<a name="line.1852"></a>
-<span class="sourceLineNo">1853</span>      response.addAllCapabilities(capabilities);<a name="line.1853"></a>
-<span class="sourceLineNo">1854</span>    } catch (IOException e) {<a name="line.1854"></a>
-<span class="sourceLineNo">1855</span>      throw new ServiceException(e);<a name="line.1855"></a>
-<span class="sourceLineNo">1856</span>    }<a name="line.1856"></a>
-<span class="sourceLineNo">1857</span>    return response.build();<a name="line.1857"></a>
-<span class="sourceLineNo">1858</span>  }<a name="line.1858"></a>
-<span class="sourceLineNo">1859</span><a name="line.1859"></a>
-<span class="sourceLineNo">1860</span>  /**<a name="line.1860"></a>
-<span class="sourceLineNo">1861</span>   * Determines if there is a MasterCoprocessor deployed which implements<a name="line.1861"></a>
-<span class="sourceLineNo">1862</span>   * {@link org.apache.hadoop.hbase.protobuf.generated.AccessControlProtos.AccessControlService.Interface}.<a name="line.1862"></a>
-<span class="sourceLineNo">1863</span>   */<a name="line.1863"></a>
-<span class="sourceLineNo">1864</span>  boolean hasAccessControlServiceCoprocessor(MasterCoprocessorHost cpHost) {<a name="line.1864"></a>
-<span class="sourceLineNo">1865</span>    return checkCoprocessorWithService(<a name="line.1865"></a>
-<span class="sourceLineNo">1866</span>        cpHost.findCoprocessors(MasterCoprocessor.class), AccessControlService.Interface.class);<a name="line.1866"></a>
-<span class="sourceLineNo">1867</span>  }<a name="line.1867"></a>
-<span class="sourceLineNo">1868</span><a name="line.1868"></a>
-<span class="sourceLineNo">1869</span>  /**<a name="line.1869"></a>
-<span class="sourceLineNo">1870</span>   * Determines if there is a MasterCoprocessor deployed which implements<a name="line.1870"></a>
-<span class="sourceLineNo">1871</span>   * {@link org.apache.hadoop.hbase.protobuf.generated.VisibilityLabelsProtos.VisibilityLabelsService.Interface}.<a name="line.1871"></a>
-<span class="sourceLineNo">1872</span>   */<a name="line.1872"></a>
-<span class="sourceLineNo">1873</span>  boolean hasVisibilityLabelsServiceCoprocessor(MasterCoprocessorHost cpHost) {<a name="line.1873"></a>
-<span class="sourceLineNo">1874</span>    return checkCoprocessorWithService(<a name="line.1874"></a>
-<span class="sourceLineNo">1875</span>        cpHost.findCoprocessors(MasterCoprocessor.class),<a name="line.1875"></a>
-<span class="sourceLineNo">1876</span>        VisibilityLabelsService.Interface.class);<a name="line.1876"></a>
-<span class="sourceLineNo">1877</span>  }<a name="line.1877"></a>
-<span class="sourceLineNo">1878</span><a name="line.1878"></a>
-<span class="sourceLineNo">1879</span>  /**<a name="line.1879"></a>
-<span class="sourceLineNo">1880</span>   * Determines if there is a coprocessor implementation in the provided argument which extends<a name="line.1880"></a>
-<span class="sourceLineNo">1881</span>   * or implements the provided {@code service}.<a name="line.1881"></a>
-<span class="sourceLineNo">1882</span>   */<a name="line.1882"></a>
-<span class="sourceLineNo">1883</span>  boolean checkCoprocessorWithService(<a name="line.1883"></a>
-<span class="sourceLineNo">1884</span>      List&lt;MasterCoprocessor&gt; coprocessorsToCheck, Class&lt;?&gt; service) {<a name="line.1884"></a>
-<span class="sourceLineNo">1885</span>    if (coprocessorsToCheck == null || coprocessorsToCheck.isEmpty()) {<a name="line.1885"></a>
-<span class="sourceLineNo">1886</span>      return false;<a name="line.1886"></a>
-<span class="sourceLineNo">1887</span>    }<a name="line.1887"></a>
-<span class="sourceLineNo">1888</span>    for (MasterCoprocessor cp : coprocessorsToCheck) {<a name="line.1888"></a>
-<span class="sourceLineNo">1889</span>      if (service.isAssignableFrom(cp.getClass())) {<a name="line.1889"></a>
-<span class="sourceLineNo">1890</span>        return true;<a name="line.1890"></a>
-<span class="sourceLineNo">1891</span>      }<a name="line.1891"></a>
-<span class="sourceLineNo">1892</span>    }<a name="line.1892"></a>
-<span class="sourceLineNo">1893</span>    return false;<a name="line.1893"></a>
-<span class="sourceLineNo">1894</span>  }<a name="line.1894"></a>
-<span class="sourceLineNo">1895</span><a name="line.1895"></a>
-<span class="sourceLineNo">1896</span>  private MasterSwitchType convert(MasterProtos.MasterSwitchType switchType) {<a name="line.1896"></a>
-<span class="sourceLineNo">1897</span>    switch (switchType) {<a name="line.1897"></a>
-<span class="sourceLineNo">1898</span>      case SPLIT:<a name="line.1898"></a>
-<span class="sourceLineNo">1899</span>        return MasterSwitchType.SPLIT;<a name="line.1899"></a>
-<span class="sourceLineNo">1900</span>      case MERGE:<a name="line.1900"></a>
-<span class="sourceLineNo">1901</span>        return MasterSwitchType.MERGE;<a name="line.1901"></a>
-<span class="sourceLineNo">1902</span>      default:<a name="line.1902"></a>
-<span class="sourceLineNo">1903</span>        break;<a name="line.1903"></a>
-<span class="sourceLineNo">1904</span>    }<a name="line.1904"></a>
-<span class="sourceLineNo">1905</span>    return null;<a name="line.1905"></a>
-<span class="sourceLineNo">1906</span>  }<a name="line.1906"></a>
-<span class="sourceLineNo">1907</span><a name="line.1907"></a>
-<span class="sourceLineNo">1908</span>  @Override<a name="line.1908"></a>
-<span class="sourceLineNo">1909</span>  public AddReplicationPeerResponse addReplicationPeer(RpcController controller,<a name="line.1909"></a>
-<span class="sourceLineNo">1910</span>      AddReplicationPeerRequest request) throws ServiceException {<a name="line.1910"></a>
-<span class="sourceLineNo">1911</span>    try {<a name="line.1911"></a>
-<span class="sourceLineNo">1912</span>      long procId = master.addReplicationPeer(request.getPeerId(),<a name="line.1912"></a>
-<span class="sourceLineNo">1913</span>        ReplicationPeerConfigUtil.convert(request.getPeerConfig()),<a name="line.1913"></a>
-<span class="sourceLineNo">1914</span>        request.getPeerState().getState().equals(ReplicationState.State.ENABLED));<a name="line.1914"></a>
-<span class="sourceLineNo">1915</span>      return AddReplicationPeerResponse.newBuilder().setProcId(procId).build();<a name="line.1915"></a>
-<span class="sourceLineNo">1916</span>    } catch (ReplicationException | IOException e) {<a name="line.1916"></a>
-<span class="sourceLineNo">1917</span>      throw new ServiceException(e);<a name="line.1917"></a>
-<span class="sourceLineNo">1918</span>    }<a name="line.1918"></a>
-<span class="sourceLineNo">1919</span>  }<a name="line.1919"></a>
-<span class="sourceLineNo">1920</span><a name="line.1920"></a>
-<span class="sourceLineNo">1921</span>  @Override<a name="line.1921"></a>
-<span class="sourceLineNo">1922</span>  public RemoveReplicationPeerResponse removeReplicationPeer(RpcController controller,<a name="line.1922"></a>
-<span class="sourceLineNo">1923</span>      RemoveReplicationPeerRequest request) throws ServiceException {<a name="line.1923"></a>
-<span class="sourceLineNo">1924</span>    try {<a name="line.1924"></a>
-<span class="sourceLineNo">1925</span>      long procId = master.removeReplicationPeer(request.getPeerId());<a name="line.1925"></a>
-<span class="sourceLineNo">1926</span>      return RemoveReplicationPeerResponse.newBuilder().setProcId(procId).build();<a name="line.1926"></a>
-<span class="sourceLineNo">1927</span>    } catch (ReplicationException | IOException e) {<a name="line.1927"></a>
-<span class="sourceLineNo">1928</span>      throw new ServiceException(e);<a name="line.1928"></a>
-<span class="sourceLineNo">1929</span>    }<a name="line.1929"></a>
-<span class="sourceLineNo">1930</span>  }<a name="line.1930"></a>
-<span class="sourceLineNo">1931</span><a name="line.1931"></a>
-<span class="sourceLineNo">1932</span>  @Override<a name="line.1932"></a>
-<span class="sourceLineNo">1933</span>  public EnableReplicationPeerResponse enableReplicationPeer(RpcController controller,<a name="line.1933"></a>
-<span class="sourceLineNo">1934</span>      EnableReplicationPeerRequest request) throws ServiceException {<a name="line.1934"></a>
-<span class="sourceLineNo">1935</span>    try {<a name="line.1935"></a>
-<span class="sourceLineNo">1936</span>      long procId = master.enableReplicationPeer(request.getPeerId());<a name="line.1936"></a>
-<span class="sourceLineNo">1937</span>      return EnableReplicationPeerResponse.newBuilder().setProcId(procId).build();<a name="line.1937"></a>
-<span class="sourceLineNo">1938</span>    } catch (ReplicationException | IOException e) {<a name="line.1938"></a>
-<span class="sourceLineNo">1939</span>      throw new ServiceException(e);<a name="line.1939"></a>
-<span class="sourceLineNo">1940</span>    }<a name="line.1940"></a>
-<span class="sourceLineNo">1941</span>  }<a name="line.1941"></a>
-<span class="sourceLineNo">1942</span><a name="line.1942"></a>
-<span class="sourceLineNo">1943</span>  @Override<a name="line.1943"></a>
-<span class="sourceLineNo">1944</span>  public DisableReplicationPeerResponse disableReplicationPeer(RpcController controller,<a name="line.1944"></a>
-<span class="sourceLineNo">1945</span>      DisableReplicationPeerRequest request) throws ServiceException {<a name="line.1945"></a>
-<span class="sourceLineNo">1946</span>    try {<a name="line.1946"></a>
-<span class="sourceLineNo">1947</span>      long procId = master.disableReplicationPeer(request.getPeerId());<a name="line.1947"></a>
-<span class="sourceLineNo">1948</span>      return DisableReplicationPeerResponse.newBuilder().setProcId(procId).build();<a name="line.1948"></a>
-<span class="sourceLineNo">1949</span>    } catch (ReplicationException | IOException e) {<a name="line.1949"></a>
-<span class="sourceLineNo">1950</span>      throw new ServiceException(e);<a name="line.1950"></a>
-<span class="sourceLineNo">1951</span>    }<a name="line.1951"></a>
-<span class="sourceLineNo">1952</span>  }<a name="line.1952"></a>
-<span class="sourceLineNo">1953</span><a name="line.1953"></a>
-<span class="sourceLineNo">1954</span>  @Override<a name="line.1954"></a>
-<span class="sourceLineNo">1955</span>  public GetReplicationPeerConfigResponse getReplicationPeerConfig(RpcController controller,<a name="line.1955"></a>
-<span class="sourceLineNo">1956</span>      GetReplicationPeerConfigRequest request) throws ServiceException {<a name="line.1956"></a>
-<span class="sourceLineNo">1957</span>    GetReplicationPeerConfigResponse.Builder response = GetReplicationPeerConfigResponse<a name="line.1957"></a>
-<span class="sourceLineNo">1958</span>        .newBuilder();<a name="line.1958"></a>
-<span class="sourceLineNo">1959</span>    try {<a name="line.1959"></a>
-<span class="sourceLineNo">1960</span>      String peerId = request.getPeerId();<a name="line.1960"></a>
-<span class="sourceLineNo">1961</span>      ReplicationPeerConfig peerConfig = master.getReplicationPeerConfig(peerId);<a name="line.1961"></a>
-<span class="sourceLineNo">1962</span>      response.setPeerId(peerId);<a name="line.1962"></a>
-<span class="sourceLineNo">1963</span>      response.setPeerConfig(ReplicationPeerConfigUtil.convert(peerConfig));<a name="line.1963"></a>
-<span class="sourceLineNo">1964</span>    } catch (ReplicationException | IOException e) {<a name="line.1964"></a>
-<span class="sourceLineNo">1965</span>      throw new ServiceException(e);<a name="line.1965"></a>
-<span class="sourceLineNo">1966</span>    }<a name="line.1966"></a>
-<span class="sourceLineNo">1967</span>    return response.build();<a name="line.1967"></a>
-<span class="sourceLineNo">1968</span>  }<a name="line.1968"></a>
-<span class="sourceLineNo">1969</span><a name="line.1969"></a>
-<span class="sourceLineNo">1970</span>  @Override<a name="line.1970"></a>
-<span class="sourceLineNo">1971</span>  public UpdateReplicationPeerConfigResponse updateReplicationPeerConfig(RpcController controller,<a name="line.1971"></a>
-<span class="sourceLineNo">1972</span>      UpdateReplicationPeerConfigRequest request) throws ServiceException {<a name="line.1972"></a>
-<span class="sourceLineNo">1973</span>    try {<a name="line.1973"></a>
-<span class="sourceLineNo">1974</span>      long procId = master.updateReplicationPeerConfig(request.getPeerId(),<a name="line.1974"></a>
-<span class="sourceLineNo">1975</span>        ReplicationPeerConfigUtil.convert(request.getPeerConfig()));<a name="line.1975"></a>
-<span class="sourceLineNo">1976</span>      return UpdateReplicationPeerConfigResponse.newBuilder().setProcId(procId).build();<a name="line.1976"></a>
-<span class="sourceLineNo">1977</span>    } catch (ReplicationException | IOException e) {<a name="line.1977"></a>
-<span class="sourceLineNo">1978</span>      throw new ServiceException(e);<a name="line.1978"></a>
-<span class="sourceLineNo">1979</span>    }<a name="line.1979"></a>
-<span class="sourceLineNo">1980</span>  }<a name="line.1980"></a>
-<span class="sourceLineNo">1981</span><a name="line.1981"></a>
-<span class="sourceLineNo">1982</span>  @Override<a name="line.1982"></a>
-<span class="sourceLineNo">1983</span>  public TransitReplicationPeerSyncReplicationStateResponse<a name="line.1983"></a>
-<span class="sourceLineNo">1984</span>      transitReplicationPeerSyncReplicationState(RpcController controller,<a name="line.1984"></a>
-<span class="sourceLineNo">1985</span>          TransitReplicationPeerSyncReplicationStateRequest request) throws ServiceException {<a name="line.1985"></a>
-<span class="sourceLineNo">1986</span>    try {<a name="line.1986"></a>
-<span class="sourceLineNo">1987</span>      long procId = master.transitReplicationPeerSyncReplicationState(request.getPeerId(),<a name="line.1987"></a>
-<span class="sourceLineNo">1988</span>        ReplicationPeerConfigUtil.toSyncReplicationState(request.getSyncReplicationState()));<a name="line.1988"></a>
-<span class="sourceLineNo">1989</span>      return TransitReplicationPeerSyncReplicationStateResponse.newBuilder().setProcId(procId)<a name="line.1989"></a>
-<span class="sourceLineNo">1990</span>          .build();<a name="line.1990"></a>
-<span class="sourceLineNo">1991</span>    } catch (ReplicationException | IOException e) {<a name="line.1991"></a>
-<span class="sourceLineNo">1992</span>      throw new ServiceException(e);<a name="line.1992"></a>
-<span class="sourceLineNo">1993</span>    }<a name="line.1993"></a>
-<span class="sourceLineNo">1994</span>  }<a name="line.1994"></a>
-<span class="sourceLineNo">1995</span><a name="line.1995"></a>
-<span class="sourceLineNo">1996</span>  @Override<a name="line.1996"></a>
-<span class="sourceLineNo">1997</span>  public ListReplicationPeersResponse listReplicationPeers(RpcController controller,<a name="line.1997"></a>
-<span class="sourceLineNo">1998</span>      ListReplicationPeersRequest request) throws ServiceException {<a name="line.1998"></a>
-<span class="sourceLineNo">1999</span>    ListReplicationPeersResponse.Builder response = ListReplicationPeersResponse.newBuilder();<a name="line.1999"></a>
-<span class="sourceLineNo">2000</span>    try {<a name="line.2000"></a>
-<span class="sourceLineNo">2001</span>      List&lt;ReplicationPeerDescription&gt; peers = master<a name="line.2001"></a>
-<span class="sourceLineNo">2002</span>          .listReplicationPeers(request.hasRegex() ? request.getRegex() : null);<a name="line.2002"></a>
-<span class="sourceLineNo">2003</span>      for (ReplicationPeerDescription peer : peers) {<a name="line.2003"></a>
-<span class="sourceLineNo">2004</span>        response.addPeerDesc(ReplicationPeerConfigUtil.toProtoReplicationPeerDescription(peer));<a name="line.2004"></a>
-<span class="sourceLineNo">2005</span>      }<a name="line.2005"></a>
-<span class="sourceLineNo">2006</span>    } catch (ReplicationException | IOException e) {<a name="line.2006"></a>
-<span class="sourceLineNo">2007</span>      throw new ServiceException(e);<a name="line.2007"></a>
-<span class="sourceLineNo">2008</span>    }<a name="line.2008"></a>
-<span class="sourceLineNo">2009</span>    return response.build();<a name="line.2009"></a>
-<span class="sourceLineNo">2010</span>  }<a name="line.2010"></a>
-<span class="sourceLineNo">2011</span><a name="line.2011"></a>
-<span class="sourceLineNo">2012</span>  @Override<a name="line.2012"></a>
-<span class="sourceLineNo">2013</span>  public ListDecommissionedRegionServersResponse listDecommissionedRegionServers(<a name="line.2013"></a>
-<span class="sourceLineNo">2014</span>      RpcController controller, ListDecommissionedRegionServersRequest request)<a name="line.2014"></a>
-<span class="sourceLineNo">2015</span>      throws ServiceException {<a name="line.2015"></a>
-<span class="sourceLineNo">2016</span>    ListDecommissionedRegionServersResponse.Builder response =<a name="line.2016"></a>
-<span class="sourceLineNo">2017</span>        ListDecommissionedRegionServersResponse.newBuilder();<a name="line.2017"></a>
-<span class="sourceLineNo">2018</span>    try {<a name="line.2018"></a>
-<span class="sourceLineNo">2019</span>      master.checkInitialized();<a name="line.2019"></a>
-<span class="sourceLineNo">2020</span>      if (master.cpHost != null) {<a name="line.2020"></a>
-<span class="sourceLineNo">2021</span>        master.cpHost.preListDecommissionedRegionServers();<a name="line.2021"></a>
-<span class="sourceLineNo">2022</span>      }<a name="line.2022"></a>
-<span class="sourceLineNo">2023</span>      List&lt;ServerName&gt; servers = master.listDecommissionedRegionServers();<a name="line.2023"></a>
-<span class="sourceLineNo">2024</span>      response.addAllServerName((servers.stream().map(server -&gt; ProtobufUtil.toServerName(server)))<a name="line.2024"></a>
-<span class="sourceLineNo">2025</span>          .collect(Collectors.toList()));<a name="line.2025"></a>
-<span class="sourceLineNo">2026</span>      if (master.cpHost != null) {<a name="line.2026"></a>
-<span class="sourceLineNo">2027</span>        master.cpHost.postListDecommissionedRegionServers();<a name="line.2027"></a>
-<span class="sourceLineNo">2028</span>      }<a name="line.2028"></a>
-<span class="sourceLineNo">2029</span>    } catch (IOException io) {<a name="line.2029"></a>
-<span class="sourceLineNo">2030</span>      throw new ServiceException(io);<a name="line.2030"></a>
-<span class="sourceLineNo">2031</span>    }<a name="line.2031"></a>
-<span class="sourceLineNo">2032</span><a name="line.2032"></a>
-<span class="sourceLineNo">2033</span>    return response.build();<a name="line.2033"></a>
-<span class="sourceLineNo">2034</span>  }<a name="line.2034"></a>
-<span class="sourceLineNo">2035</span><a name="line.2035"></a>
-<span class="sourceLineNo">2036</span>  @Override<a name="line.2036"></a>
-<span class="sourceLineNo">2037</span>  public DecommissionRegionServersResponse decommissionRegionServers(RpcController controller,<a name="line.2037"></a>
-<span class="sourceLineNo">2038</span>      DecommissionRegionServersRequest request) throws ServiceException {<a name="line.2038"></a>
-<span class="sourceLineNo">2039</span>    try {<a name="line.2039"></a>
-<span class="sourceLineNo">2040</span>      master.checkInitialized();<a name="line.2040"></a>
-<span class="sourceLineNo">2041</span>      List&lt;ServerName&gt; servers = request.getServerNameList().stream()<a name="line.2041"></a>
-<span class="sourceLineNo">2042</span>          .map(pbServer -&gt; ProtobufUtil.toServerName(pbServer)).collect(Collectors.toList());<a name="line.2042"></a>
-<span class="sourceLineNo">2043</span>      boolean offload = request.getOffload();<a name="line.2043"></a>
+<span class="sourceLineNo">1764</span>      }<a name="line.1764"></a>
+<span class="sourceLineNo">1765</span>    } catch (IOException e) {<a name="line.1765"></a>
+<span class="sourceLineNo">1766</span>      throw new ServiceException(e);<a name="line.1766"></a>
+<span class="sourceLineNo">1767</span>    } catch (KeeperException e) {<a name="line.1767"></a>
+<span class="sourceLineNo">1768</span>      throw new ServiceException(e);<a name="line.1768"></a>
+<span class="sourceLineNo">1769</span>    }<a name="line.1769"></a>
+<span class="sourceLineNo">1770</span>    return response.build();<a name="line.1770"></a>
+<span class="sourceLineNo">1771</span>  }<a name="line.1771"></a>
+<span class="sourceLineNo">1772</span><a name="line.1772"></a>
+<span class="sourceLineNo">1773</span>  @Override<a name="line.1773"></a>
+<span class="sourceLineNo">1774</span>  public IsSplitOrMergeEnabledResponse isSplitOrMergeEnabled(RpcController controller,<a name="line.1774"></a>
+<span class="sourceLineNo">1775</span>    IsSplitOrMergeEnabledRequest request) throws ServiceException {<a name="line.1775"></a>
+<span class="sourceLineNo">1776</span>    IsSplitOrMergeEnabledResponse.Builder response = IsSplitOrMergeEnabledResponse.newBuilder();<a name="line.1776"></a>
+<span class="sourceLineNo">1777</span>    response.setEnabled(master.isSplitOrMergeEnabled(convert(request.getSwitchType())));<a name="line.1777"></a>
+<span class="sourceLineNo">1778</span>    return response.build();<a name="line.1778"></a>
+<span class="sourceLineNo">1779</span>  }<a name="line.1779"></a>
+<span class="sourceLineNo">1780</span><a name="line.1780"></a>
+<span class="sourceLineNo">1781</span>  @Override<a name="line.1781"></a>
+<span class="sourceLineNo">1782</span>  public NormalizeResponse normalize(RpcController controller,<a name="line.1782"></a>
+<span class="sourceLineNo">1783</span>      NormalizeRequest request) throws ServiceException {<a name="line.1783"></a>
+<span class="sourceLineNo">1784</span>    rpcPreCheck("normalize");<a name="line.1784"></a>
+<span class="sourceLineNo">1785</span>    try {<a name="line.1785"></a>
+<span class="sourceLineNo">1786</span>      return NormalizeResponse.newBuilder().setNormalizerRan(master.normalizeRegions()).build();<a name="line.1786"></a>
+<span class="sourceLineNo">1787</span>    } catch (IOException ex) {<a name="line.1787"></a>
+<span class="sourceLineNo">1788</span>      throw new ServiceException(ex);<a name="line.1788"></a>
+<span class="sourceLineNo">1789</span>    }<a name="line.1789"></a>
+<span class="sourceLineNo">1790</span>  }<a name="line.1790"></a>
+<span class="sourceLineNo">1791</span><a name="line.1791"></a>
+<span class="sourceLineNo">1792</span>  @Override<a name="line.1792"></a>
+<span class="sourceLineNo">1793</span>  public SetNormalizerRunningResponse setNormalizerRunning(RpcController controller,<a name="line.1793"></a>
+<span class="sourceLineNo">1794</span>      SetNormalizerRunningRequest request) throws ServiceException {<a name="line.1794"></a>
+<span class="sourceLineNo">1795</span>    rpcPreCheck("setNormalizerRunning");<a name="line.1795"></a>
+<span class="sourceLineNo">1796</span><a name="line.1796"></a>
+<span class="sourceLineNo">1797</span>    // Sets normalizer on/off flag in ZK.<a name="line.1797"></a>
+<span class="sourceLineNo">1798</span>    boolean prevValue = master.getRegionNormalizerTracker().isNormalizerOn();<a name="line.1798"></a>
+<span class="sourceLineNo">1799</span>    boolean newValue = request.getOn();<a name="line.1799"></a>
+<span class="sourceLineNo">1800</span>    try {<a name="line.1800"></a>
+<span class="sourceLineNo">1801</span>      master.getRegionNormalizerTracker().setNormalizerOn(newValue);<a name="line.1801"></a>
+<span class="sourceLineNo">1802</span>    } catch (KeeperException ke) {<a name="line.1802"></a>
+<span class="sourceLineNo">1803</span>      LOG.warn("Error flipping normalizer switch", ke);<a name="line.1803"></a>
+<span class="sourceLineNo">1804</span>    }<a name="line.1804"></a>
+<span class="sourceLineNo">1805</span>    LOG.info("{} set normalizerSwitch={}", master.getClientIdAuditPrefix(), newValue);<a name="line.1805"></a>
+<span class="sourceLineNo">1806</span>    return SetNormalizerRunningResponse.newBuilder().setPrevNormalizerValue(prevValue).build();<a name="line.1806"></a>
+<span class="sourceLineNo">1807</span>  }<a name="line.1807"></a>
+<span class="sourceLineNo">1808</span><a name="line.1808"></a>
+<span class="sourceLineNo">1809</span>  @Override<a name="line.1809"></a>
+<span class="sourceLineNo">1810</span>  public IsNormalizerEnabledResponse isNormalizerEnabled(RpcController controller,<a name="line.1810"></a>
+<span class="sourceLineNo">1811</span>      IsNormalizerEnabledRequest request) throws ServiceException {<a name="line.1811"></a>
+<span class="sourceLineNo">1812</span>    IsNormalizerEnabledResponse.Builder response = IsNormalizerEnabledResponse.newBuilder();<a name="line.1812"></a>
+<span class="sourceLineNo">1813</span>    response.setEnabled(master.isNormalizerOn());<a name="line.1813"></a>
+<span class="sourceLineNo">1814</span>    return response.build();<a name="line.1814"></a>
+<span class="sourceLineNo">1815</span>  }<a name="line.1815"></a>
+<span class="sourceLineNo">1816</span><a name="line.1816"></a>
+<span class="sourceLineNo">1817</span>  /**<a name="line.1817"></a>
+<span class="sourceLineNo">1818</span>   * Returns the security capabilities in effect on the cluster<a name="line.1818"></a>
+<span class="sourceLineNo">1819</span>   */<a name="line.1819"></a>
+<span class="sourceLineNo">1820</span>  @Override<a name="line.1820"></a>
+<span class="sourceLineNo">1821</span>  public SecurityCapabilitiesResponse getSecurityCapabilities(RpcController controller,<a name="line.1821"></a>
+<span class="sourceLineNo">1822</span>      SecurityCapabilitiesRequest request) throws ServiceException {<a name="line.1822"></a>
+<span class="sourceLineNo">1823</span>    SecurityCapabilitiesResponse.Builder response = SecurityCapabilitiesResponse.newBuilder();<a name="line.1823"></a>
+<span class="sourceLineNo">1824</span>    try {<a name="line.1824"></a>
+<span class="sourceLineNo">1825</span>      master.checkInitialized();<a name="line.1825"></a>
+<span class="sourceLineNo">1826</span>      Set&lt;SecurityCapabilitiesResponse.Capability&gt; capabilities = new HashSet&lt;&gt;();<a name="line.1826"></a>
+<span class="sourceLineNo">1827</span>      // Authentication<a name="line.1827"></a>
+<span class="sourceLineNo">1828</span>      if (User.isHBaseSecurityEnabled(master.getConfiguration())) {<a name="line.1828"></a>
+<span class="sourceLineNo">1829</span>        capabilities.add(SecurityCapabilitiesResponse.Capability.SECURE_AUTHENTICATION);<a name="line.1829"></a>
+<span class="sourceLineNo">1830</span>      } else {<a name="line.1830"></a>
+<span class="sourceLineNo">1831</span>        capabilities.add(SecurityCapabilitiesResponse.Capability.SIMPLE_AUTHENTICATION);<a name="line.1831"></a>
+<span class="sourceLineNo">1832</span>      }<a name="line.1832"></a>
+<span class="sourceLineNo">1833</span>      // A coprocessor that implements AccessControlService can provide AUTHORIZATION and<a name="line.1833"></a>
+<span class="sourceLineNo">1834</span>      // CELL_AUTHORIZATION<a name="line.1834"></a>
+<span class="sourceLineNo">1835</span>      if (master.cpHost != null &amp;&amp; hasAccessControlServiceCoprocessor(master.cpHost)) {<a name="line.1835"></a>
+<span class="sourceLineNo">1836</span>        if (AccessChecker.isAuthorizationSupported(master.getConfiguration())) {<a name="line.1836"></a>
+<span class="sourceLineNo">1837</span>          capabilities.add(SecurityCapabilitiesResponse.Capability.AUTHORIZATION);<a name="line.1837"></a>
+<span class="sourceLineNo">1838</span>        }<a name="line.1838"></a>
+<span class="sourceLineNo">1839</span>        if (AccessController.isCellAuthorizationSupported(master.getConfiguration())) {<a name="line.1839"></a>
+<span class="sourceLineNo">1840</span>          capabilities.add(SecurityCapabilitiesResponse.Capability.CELL_AUTHORIZATION);<a name="line.1840"></a>
+<span class="sourceLineNo">1841</span>        }<a name="line.1841"></a>
+<span class="sourceLineNo">1842</span>      }<a name="line.1842"></a>
+<span class="sourceLineNo">1843</span>      // A coprocessor that implements VisibilityLabelsService can provide CELL_VISIBILITY.<a name="line.1843"></a>
+<span class="sourceLineNo">1844</span>      if (master.cpHost != null &amp;&amp; hasVisibilityLabelsServiceCoprocessor(master.cpHost)) {<a name="line.1844"></a>
+<span class="sourceLineNo">1845</span>        if (VisibilityController.isCellAuthorizationSupported(master.getConfiguration())) {<a name="line.1845"></a>
+<span class="sourceLineNo">1846</span>          capabilities.add(SecurityCapabilitiesResponse.Capability.CELL_VISIBILITY);<a name="line.1846"></a>
+<span class="sourceLineNo">1847</span>        }<a name="line.1847"></a>
+<span class="sourceLineNo">1848</span>      }<a name="line.1848"></a>
+<span class="sourceLineNo">1849</span>      response.addAllCapabilities(capabilities);<a name="line.1849"></a>
+<span class="sourceLineNo">1850</span>    } catch (IOException e) {<a name="line.1850"></a>
+<span class="sourceLineNo">1851</span>      throw new ServiceException(e);<a name="line.1851"></a>
+<span class="sourceLineNo">1852</span>    }<a name="line.1852"></a>
+<span class="source

<TRUNCATED>

[16/46] hbase-site git commit: Published site at 05d22ed960204183fbd9bd16f1dbca6410ccde76.

Posted by gi...@apache.org.
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/3649682c/devapidocs/src-html/org/apache/hadoop/hbase/regionserver/HRegionServer.CompactionChecker.html
----------------------------------------------------------------------
diff --git a/devapidocs/src-html/org/apache/hadoop/hbase/regionserver/HRegionServer.CompactionChecker.html b/devapidocs/src-html/org/apache/hadoop/hbase/regionserver/HRegionServer.CompactionChecker.html
index 90087b4..b2a9771 100644
--- a/devapidocs/src-html/org/apache/hadoop/hbase/regionserver/HRegionServer.CompactionChecker.html
+++ b/devapidocs/src-html/org/apache/hadoop/hbase/regionserver/HRegionServer.CompactionChecker.html
@@ -956,2857 +956,2858 @@
 <span class="sourceLineNo">948</span>      // Try and register with the Master; tell it we are here.  Break if server is stopped or the<a name="line.948"></a>
 <span class="sourceLineNo">949</span>      // clusterup flag is down or hdfs went wacky. Once registered successfully, go ahead and start<a name="line.949"></a>
 <span class="sourceLineNo">950</span>      // up all Services. Use RetryCounter to get backoff in case Master is struggling to come up.<a name="line.950"></a>
-<span class="sourceLineNo">951</span>      RetryCounterFactory rcf = new RetryCounterFactory(Integer.MAX_VALUE,<a name="line.951"></a>
-<span class="sourceLineNo">952</span>          this.sleeper.getPeriod(), 1000 * 60 * 5);<a name="line.952"></a>
-<span class="sourceLineNo">953</span>      RetryCounter rc = rcf.create();<a name="line.953"></a>
-<span class="sourceLineNo">954</span>      while (keepLooping()) {<a name="line.954"></a>
-<span class="sourceLineNo">955</span>        RegionServerStartupResponse w = reportForDuty();<a name="line.955"></a>
-<span class="sourceLineNo">956</span>        if (w == null) {<a name="line.956"></a>
-<span class="sourceLineNo">957</span>          long sleepTime = rc.getBackoffTimeAndIncrementAttempts();<a name="line.957"></a>
-<span class="sourceLineNo">958</span>          LOG.warn("reportForDuty failed; sleeping {} ms and then retrying.", sleepTime);<a name="line.958"></a>
-<span class="sourceLineNo">959</span>          this.sleeper.sleep(sleepTime);<a name="line.959"></a>
-<span class="sourceLineNo">960</span>        } else {<a name="line.960"></a>
-<span class="sourceLineNo">961</span>          handleReportForDutyResponse(w);<a name="line.961"></a>
-<span class="sourceLineNo">962</span>          break;<a name="line.962"></a>
-<span class="sourceLineNo">963</span>        }<a name="line.963"></a>
-<span class="sourceLineNo">964</span>      }<a name="line.964"></a>
-<span class="sourceLineNo">965</span><a name="line.965"></a>
-<span class="sourceLineNo">966</span>      if (!isStopped() &amp;&amp; isHealthy()) {<a name="line.966"></a>
-<span class="sourceLineNo">967</span>        // start the snapshot handler and other procedure handlers,<a name="line.967"></a>
-<span class="sourceLineNo">968</span>        // since the server is ready to run<a name="line.968"></a>
-<span class="sourceLineNo">969</span>        if (this.rspmHost != null) {<a name="line.969"></a>
-<span class="sourceLineNo">970</span>          this.rspmHost.start();<a name="line.970"></a>
-<span class="sourceLineNo">971</span>        }<a name="line.971"></a>
-<span class="sourceLineNo">972</span>        // Start the Quota Manager<a name="line.972"></a>
-<span class="sourceLineNo">973</span>        if (this.rsQuotaManager != null) {<a name="line.973"></a>
-<span class="sourceLineNo">974</span>          rsQuotaManager.start(getRpcServer().getScheduler());<a name="line.974"></a>
-<span class="sourceLineNo">975</span>        }<a name="line.975"></a>
-<span class="sourceLineNo">976</span>        if (this.rsSpaceQuotaManager != null) {<a name="line.976"></a>
-<span class="sourceLineNo">977</span>          this.rsSpaceQuotaManager.start();<a name="line.977"></a>
-<span class="sourceLineNo">978</span>        }<a name="line.978"></a>
-<span class="sourceLineNo">979</span>      }<a name="line.979"></a>
-<span class="sourceLineNo">980</span><a name="line.980"></a>
-<span class="sourceLineNo">981</span>      // We registered with the Master.  Go into run mode.<a name="line.981"></a>
-<span class="sourceLineNo">982</span>      long lastMsg = System.currentTimeMillis();<a name="line.982"></a>
-<span class="sourceLineNo">983</span>      long oldRequestCount = -1;<a name="line.983"></a>
-<span class="sourceLineNo">984</span>      // The main run loop.<a name="line.984"></a>
-<span class="sourceLineNo">985</span>      while (!isStopped() &amp;&amp; isHealthy()) {<a name="line.985"></a>
-<span class="sourceLineNo">986</span>        if (!isClusterUp()) {<a name="line.986"></a>
-<span class="sourceLineNo">987</span>          if (isOnlineRegionsEmpty()) {<a name="line.987"></a>
-<span class="sourceLineNo">988</span>            stop("Exiting; cluster shutdown set and not carrying any regions");<a name="line.988"></a>
-<span class="sourceLineNo">989</span>          } else if (!this.stopping) {<a name="line.989"></a>
-<span class="sourceLineNo">990</span>            this.stopping = true;<a name="line.990"></a>
-<span class="sourceLineNo">991</span>            LOG.info("Closing user regions");<a name="line.991"></a>
-<span class="sourceLineNo">992</span>            closeUserRegions(this.abortRequested);<a name="line.992"></a>
-<span class="sourceLineNo">993</span>          } else if (this.stopping) {<a name="line.993"></a>
-<span class="sourceLineNo">994</span>            boolean allUserRegionsOffline = areAllUserRegionsOffline();<a name="line.994"></a>
-<span class="sourceLineNo">995</span>            if (allUserRegionsOffline) {<a name="line.995"></a>
-<span class="sourceLineNo">996</span>              // Set stopped if no more write requests tp meta tables<a name="line.996"></a>
-<span class="sourceLineNo">997</span>              // since last time we went around the loop.  Any open<a name="line.997"></a>
-<span class="sourceLineNo">998</span>              // meta regions will be closed on our way out.<a name="line.998"></a>
-<span class="sourceLineNo">999</span>              if (oldRequestCount == getWriteRequestCount()) {<a name="line.999"></a>
-<span class="sourceLineNo">1000</span>                stop("Stopped; only catalog regions remaining online");<a name="line.1000"></a>
-<span class="sourceLineNo">1001</span>                break;<a name="line.1001"></a>
-<span class="sourceLineNo">1002</span>              }<a name="line.1002"></a>
-<span class="sourceLineNo">1003</span>              oldRequestCount = getWriteRequestCount();<a name="line.1003"></a>
-<span class="sourceLineNo">1004</span>            } else {<a name="line.1004"></a>
-<span class="sourceLineNo">1005</span>              // Make sure all regions have been closed -- some regions may<a name="line.1005"></a>
-<span class="sourceLineNo">1006</span>              // have not got it because we were splitting at the time of<a name="line.1006"></a>
-<span class="sourceLineNo">1007</span>              // the call to closeUserRegions.<a name="line.1007"></a>
-<span class="sourceLineNo">1008</span>              closeUserRegions(this.abortRequested);<a name="line.1008"></a>
-<span class="sourceLineNo">1009</span>            }<a name="line.1009"></a>
-<span class="sourceLineNo">1010</span>            LOG.debug("Waiting on " + getOnlineRegionsAsPrintableString());<a name="line.1010"></a>
-<span class="sourceLineNo">1011</span>          }<a name="line.1011"></a>
-<span class="sourceLineNo">1012</span>        }<a name="line.1012"></a>
-<span class="sourceLineNo">1013</span>        long now = System.currentTimeMillis();<a name="line.1013"></a>
-<span class="sourceLineNo">1014</span>        if ((now - lastMsg) &gt;= msgInterval) {<a name="line.1014"></a>
-<span class="sourceLineNo">1015</span>          tryRegionServerReport(lastMsg, now);<a name="line.1015"></a>
-<span class="sourceLineNo">1016</span>          lastMsg = System.currentTimeMillis();<a name="line.1016"></a>
-<span class="sourceLineNo">1017</span>        }<a name="line.1017"></a>
-<span class="sourceLineNo">1018</span>        if (!isStopped() &amp;&amp; !isAborted()) {<a name="line.1018"></a>
-<span class="sourceLineNo">1019</span>          this.sleeper.sleep();<a name="line.1019"></a>
-<span class="sourceLineNo">1020</span>        }<a name="line.1020"></a>
-<span class="sourceLineNo">1021</span>      } // for<a name="line.1021"></a>
-<span class="sourceLineNo">1022</span>    } catch (Throwable t) {<a name="line.1022"></a>
-<span class="sourceLineNo">1023</span>      if (!rpcServices.checkOOME(t)) {<a name="line.1023"></a>
-<span class="sourceLineNo">1024</span>        String prefix = t instanceof YouAreDeadException? "": "Unhandled: ";<a name="line.1024"></a>
-<span class="sourceLineNo">1025</span>        abort(prefix + t.getMessage(), t);<a name="line.1025"></a>
-<span class="sourceLineNo">1026</span>      }<a name="line.1026"></a>
-<span class="sourceLineNo">1027</span>    }<a name="line.1027"></a>
-<span class="sourceLineNo">1028</span>    if (this.leases != null) {<a name="line.1028"></a>
-<span class="sourceLineNo">1029</span>      this.leases.closeAfterLeasesExpire();<a name="line.1029"></a>
-<span class="sourceLineNo">1030</span>    }<a name="line.1030"></a>
-<span class="sourceLineNo">1031</span>    if (this.splitLogWorker != null) {<a name="line.1031"></a>
-<span class="sourceLineNo">1032</span>      splitLogWorker.stop();<a name="line.1032"></a>
-<span class="sourceLineNo">1033</span>    }<a name="line.1033"></a>
-<span class="sourceLineNo">1034</span>    if (this.infoServer != null) {<a name="line.1034"></a>
-<span class="sourceLineNo">1035</span>      LOG.info("Stopping infoServer");<a name="line.1035"></a>
-<span class="sourceLineNo">1036</span>      try {<a name="line.1036"></a>
-<span class="sourceLineNo">1037</span>        this.infoServer.stop();<a name="line.1037"></a>
-<span class="sourceLineNo">1038</span>      } catch (Exception e) {<a name="line.1038"></a>
-<span class="sourceLineNo">1039</span>        LOG.error("Failed to stop infoServer", e);<a name="line.1039"></a>
-<span class="sourceLineNo">1040</span>      }<a name="line.1040"></a>
-<span class="sourceLineNo">1041</span>    }<a name="line.1041"></a>
-<span class="sourceLineNo">1042</span>    // Send cache a shutdown.<a name="line.1042"></a>
-<span class="sourceLineNo">1043</span>    if (cacheConfig != null &amp;&amp; cacheConfig.isBlockCacheEnabled()) {<a name="line.1043"></a>
-<span class="sourceLineNo">1044</span>      cacheConfig.getBlockCache().shutdown();<a name="line.1044"></a>
-<span class="sourceLineNo">1045</span>    }<a name="line.1045"></a>
-<span class="sourceLineNo">1046</span>    mobCacheConfig.getMobFileCache().shutdown();<a name="line.1046"></a>
-<span class="sourceLineNo">1047</span><a name="line.1047"></a>
-<span class="sourceLineNo">1048</span>    if (movedRegionsCleaner != null) {<a name="line.1048"></a>
-<span class="sourceLineNo">1049</span>      movedRegionsCleaner.stop("Region Server stopping");<a name="line.1049"></a>
-<span class="sourceLineNo">1050</span>    }<a name="line.1050"></a>
-<span class="sourceLineNo">1051</span><a name="line.1051"></a>
-<span class="sourceLineNo">1052</span>    // Send interrupts to wake up threads if sleeping so they notice shutdown.<a name="line.1052"></a>
-<span class="sourceLineNo">1053</span>    // TODO: Should we check they are alive? If OOME could have exited already<a name="line.1053"></a>
-<span class="sourceLineNo">1054</span>    if (this.hMemManager != null) this.hMemManager.stop();<a name="line.1054"></a>
-<span class="sourceLineNo">1055</span>    if (this.cacheFlusher != null) this.cacheFlusher.interruptIfNecessary();<a name="line.1055"></a>
-<span class="sourceLineNo">1056</span>    if (this.compactSplitThread != null) this.compactSplitThread.interruptIfNecessary();<a name="line.1056"></a>
-<span class="sourceLineNo">1057</span>    sendShutdownInterrupt();<a name="line.1057"></a>
-<span class="sourceLineNo">1058</span><a name="line.1058"></a>
-<span class="sourceLineNo">1059</span>    // Stop the snapshot and other procedure handlers, forcefully killing all running tasks<a name="line.1059"></a>
-<span class="sourceLineNo">1060</span>    if (rspmHost != null) {<a name="line.1060"></a>
-<span class="sourceLineNo">1061</span>      rspmHost.stop(this.abortRequested || this.killed);<a name="line.1061"></a>
-<span class="sourceLineNo">1062</span>    }<a name="line.1062"></a>
-<span class="sourceLineNo">1063</span><a name="line.1063"></a>
-<span class="sourceLineNo">1064</span>    if (this.killed) {<a name="line.1064"></a>
-<span class="sourceLineNo">1065</span>      // Just skip out w/o closing regions.  Used when testing.<a name="line.1065"></a>
-<span class="sourceLineNo">1066</span>    } else if (abortRequested) {<a name="line.1066"></a>
-<span class="sourceLineNo">1067</span>      if (this.fsOk) {<a name="line.1067"></a>
-<span class="sourceLineNo">1068</span>        closeUserRegions(abortRequested); // Don't leave any open file handles<a name="line.1068"></a>
-<span class="sourceLineNo">1069</span>      }<a name="line.1069"></a>
-<span class="sourceLineNo">1070</span>      LOG.info("aborting server " + this.serverName);<a name="line.1070"></a>
-<span class="sourceLineNo">1071</span>    } else {<a name="line.1071"></a>
-<span class="sourceLineNo">1072</span>      closeUserRegions(abortRequested);<a name="line.1072"></a>
-<span class="sourceLineNo">1073</span>      LOG.info("stopping server " + this.serverName);<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>    // so callers waiting for meta without timeout can stop<a name="line.1076"></a>
-<span class="sourceLineNo">1077</span>    if (this.metaTableLocator != null) this.metaTableLocator.stop();<a name="line.1077"></a>
-<span class="sourceLineNo">1078</span>    if (this.clusterConnection != null &amp;&amp; !clusterConnection.isClosed()) {<a name="line.1078"></a>
-<span class="sourceLineNo">1079</span>      try {<a name="line.1079"></a>
-<span class="sourceLineNo">1080</span>        this.clusterConnection.close();<a name="line.1080"></a>
-<span class="sourceLineNo">1081</span>      } catch (IOException e) {<a name="line.1081"></a>
-<span class="sourceLineNo">1082</span>        // Although the {@link Closeable} interface throws an {@link<a name="line.1082"></a>
-<span class="sourceLineNo">1083</span>        // IOException}, in reality, the implementation would never do that.<a name="line.1083"></a>
-<span class="sourceLineNo">1084</span>        LOG.warn("Attempt to close server's short circuit ClusterConnection failed.", e);<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>    // Closing the compactSplit thread before closing meta regions<a name="line.1088"></a>
-<span class="sourceLineNo">1089</span>    if (!this.killed &amp;&amp; containsMetaTableRegions()) {<a name="line.1089"></a>
-<span class="sourceLineNo">1090</span>      if (!abortRequested || this.fsOk) {<a name="line.1090"></a>
-<span class="sourceLineNo">1091</span>        if (this.compactSplitThread != null) {<a name="line.1091"></a>
-<span class="sourceLineNo">1092</span>          this.compactSplitThread.join();<a name="line.1092"></a>
-<span class="sourceLineNo">1093</span>          this.compactSplitThread = null;<a name="line.1093"></a>
-<span class="sourceLineNo">1094</span>        }<a name="line.1094"></a>
-<span class="sourceLineNo">1095</span>        closeMetaTableRegions(abortRequested);<a name="line.1095"></a>
-<span class="sourceLineNo">1096</span>      }<a name="line.1096"></a>
-<span class="sourceLineNo">1097</span>    }<a name="line.1097"></a>
-<span class="sourceLineNo">1098</span><a name="line.1098"></a>
-<span class="sourceLineNo">1099</span>    if (!this.killed &amp;&amp; this.fsOk) {<a name="line.1099"></a>
-<span class="sourceLineNo">1100</span>      waitOnAllRegionsToClose(abortRequested);<a name="line.1100"></a>
-<span class="sourceLineNo">1101</span>      LOG.info("stopping server " + this.serverName + "; all regions closed.");<a name="line.1101"></a>
-<span class="sourceLineNo">1102</span>    }<a name="line.1102"></a>
-<span class="sourceLineNo">1103</span><a name="line.1103"></a>
-<span class="sourceLineNo">1104</span>    // Stop the quota manager<a name="line.1104"></a>
-<span class="sourceLineNo">1105</span>    if (rsQuotaManager != null) {<a name="line.1105"></a>
-<span class="sourceLineNo">1106</span>      rsQuotaManager.stop();<a name="line.1106"></a>
-<span class="sourceLineNo">1107</span>    }<a name="line.1107"></a>
-<span class="sourceLineNo">1108</span>    if (rsSpaceQuotaManager != null) {<a name="line.1108"></a>
-<span class="sourceLineNo">1109</span>      rsSpaceQuotaManager.stop();<a name="line.1109"></a>
-<span class="sourceLineNo">1110</span>      rsSpaceQuotaManager = null;<a name="line.1110"></a>
-<span class="sourceLineNo">1111</span>    }<a name="line.1111"></a>
-<span class="sourceLineNo">1112</span><a name="line.1112"></a>
-<span class="sourceLineNo">1113</span>    //fsOk flag may be changed when closing regions throws exception.<a name="line.1113"></a>
-<span class="sourceLineNo">1114</span>    if (this.fsOk) {<a name="line.1114"></a>
-<span class="sourceLineNo">1115</span>      shutdownWAL(!abortRequested);<a name="line.1115"></a>
-<span class="sourceLineNo">1116</span>    }<a name="line.1116"></a>
-<span class="sourceLineNo">1117</span><a name="line.1117"></a>
-<span class="sourceLineNo">1118</span>    // Make sure the proxy is down.<a name="line.1118"></a>
-<span class="sourceLineNo">1119</span>    if (this.rssStub != null) {<a name="line.1119"></a>
-<span class="sourceLineNo">1120</span>      this.rssStub = null;<a name="line.1120"></a>
-<span class="sourceLineNo">1121</span>    }<a name="line.1121"></a>
-<span class="sourceLineNo">1122</span>    if (this.lockStub != null) {<a name="line.1122"></a>
-<span class="sourceLineNo">1123</span>      this.lockStub = null;<a name="line.1123"></a>
-<span class="sourceLineNo">1124</span>    }<a name="line.1124"></a>
-<span class="sourceLineNo">1125</span>    if (this.rpcClient != null) {<a name="line.1125"></a>
-<span class="sourceLineNo">1126</span>      this.rpcClient.close();<a name="line.1126"></a>
-<span class="sourceLineNo">1127</span>    }<a name="line.1127"></a>
-<span class="sourceLineNo">1128</span>    if (this.leases != null) {<a name="line.1128"></a>
-<span class="sourceLineNo">1129</span>      this.leases.close();<a name="line.1129"></a>
-<span class="sourceLineNo">1130</span>    }<a name="line.1130"></a>
-<span class="sourceLineNo">1131</span>    if (this.pauseMonitor != null) {<a name="line.1131"></a>
-<span class="sourceLineNo">1132</span>      this.pauseMonitor.stop();<a name="line.1132"></a>
-<span class="sourceLineNo">1133</span>    }<a name="line.1133"></a>
-<span class="sourceLineNo">1134</span><a name="line.1134"></a>
-<span class="sourceLineNo">1135</span>    if (!killed) {<a name="line.1135"></a>
-<span class="sourceLineNo">1136</span>      stopServiceThreads();<a name="line.1136"></a>
-<span class="sourceLineNo">1137</span>    }<a name="line.1137"></a>
-<span class="sourceLineNo">1138</span><a name="line.1138"></a>
-<span class="sourceLineNo">1139</span>    if (this.rpcServices != null) {<a name="line.1139"></a>
-<span class="sourceLineNo">1140</span>      this.rpcServices.stop();<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>    try {<a name="line.1143"></a>
-<span class="sourceLineNo">1144</span>      deleteMyEphemeralNode();<a name="line.1144"></a>
-<span class="sourceLineNo">1145</span>    } catch (KeeperException.NoNodeException nn) {<a name="line.1145"></a>
-<span class="sourceLineNo">1146</span>    } catch (KeeperException e) {<a name="line.1146"></a>
-<span class="sourceLineNo">1147</span>      LOG.warn("Failed deleting my ephemeral node", e);<a name="line.1147"></a>
-<span class="sourceLineNo">1148</span>    }<a name="line.1148"></a>
-<span class="sourceLineNo">1149</span>    // We may have failed to delete the znode at the previous step, but<a name="line.1149"></a>
-<span class="sourceLineNo">1150</span>    //  we delete the file anyway: a second attempt to delete the znode is likely to fail again.<a name="line.1150"></a>
-<span class="sourceLineNo">1151</span>    ZNodeClearer.deleteMyEphemeralNodeOnDisk();<a name="line.1151"></a>
-<span class="sourceLineNo">1152</span><a name="line.1152"></a>
-<span class="sourceLineNo">1153</span>    if (this.zooKeeper != null) {<a name="line.1153"></a>
-<span class="sourceLineNo">1154</span>      this.zooKeeper.close();<a name="line.1154"></a>
-<span class="sourceLineNo">1155</span>    }<a name="line.1155"></a>
-<span class="sourceLineNo">1156</span>    this.shutDown = true;<a name="line.1156"></a>
-<span class="sourceLineNo">1157</span>    LOG.info("Exiting; stopping=" + this.serverName + "; zookeeper connection closed.");<a name="line.1157"></a>
-<span class="sourceLineNo">1158</span>  }<a name="line.1158"></a>
-<span class="sourceLineNo">1159</span><a name="line.1159"></a>
-<span class="sourceLineNo">1160</span>  private boolean containsMetaTableRegions() {<a name="line.1160"></a>
-<span class="sourceLineNo">1161</span>    return onlineRegions.containsKey(RegionInfoBuilder.FIRST_META_REGIONINFO.getEncodedName());<a name="line.1161"></a>
-<span class="sourceLineNo">1162</span>  }<a name="line.1162"></a>
-<span class="sourceLineNo">1163</span><a name="line.1163"></a>
-<span class="sourceLineNo">1164</span>  private boolean areAllUserRegionsOffline() {<a name="line.1164"></a>
-<span class="sourceLineNo">1165</span>    if (getNumberOfOnlineRegions() &gt; 2) return false;<a name="line.1165"></a>
-<span class="sourceLineNo">1166</span>    boolean allUserRegionsOffline = true;<a name="line.1166"></a>
-<span class="sourceLineNo">1167</span>    for (Map.Entry&lt;String, HRegion&gt; e: this.onlineRegions.entrySet()) {<a name="line.1167"></a>
-<span class="sourceLineNo">1168</span>      if (!e.getValue().getRegionInfo().isMetaRegion()) {<a name="line.1168"></a>
-<span class="sourceLineNo">1169</span>        allUserRegionsOffline = false;<a name="line.1169"></a>
-<span class="sourceLineNo">1170</span>        break;<a name="line.1170"></a>
-<span class="sourceLineNo">1171</span>      }<a name="line.1171"></a>
-<span class="sourceLineNo">1172</span>    }<a name="line.1172"></a>
-<span class="sourceLineNo">1173</span>    return allUserRegionsOffline;<a name="line.1173"></a>
-<span class="sourceLineNo">1174</span>  }<a name="line.1174"></a>
-<span class="sourceLineNo">1175</span><a name="line.1175"></a>
-<span class="sourceLineNo">1176</span>  /**<a name="line.1176"></a>
-<span class="sourceLineNo">1177</span>   * @return Current write count for all online regions.<a name="line.1177"></a>
-<span class="sourceLineNo">1178</span>   */<a name="line.1178"></a>
-<span class="sourceLineNo">1179</span>  private long getWriteRequestCount() {<a name="line.1179"></a>
-<span class="sourceLineNo">1180</span>    long writeCount = 0;<a name="line.1180"></a>
-<span class="sourceLineNo">1181</span>    for (Map.Entry&lt;String, HRegion&gt; e: this.onlineRegions.entrySet()) {<a name="line.1181"></a>
-<span class="sourceLineNo">1182</span>      writeCount += e.getValue().getWriteRequestsCount();<a name="line.1182"></a>
-<span class="sourceLineNo">1183</span>    }<a name="line.1183"></a>
-<span class="sourceLineNo">1184</span>    return writeCount;<a name="line.1184"></a>
-<span class="sourceLineNo">1185</span>  }<a name="line.1185"></a>
-<span class="sourceLineNo">1186</span><a name="line.1186"></a>
-<span class="sourceLineNo">1187</span>  @VisibleForTesting<a name="line.1187"></a>
-<span class="sourceLineNo">1188</span>  protected void tryRegionServerReport(long reportStartTime, long reportEndTime)<a name="line.1188"></a>
-<span class="sourceLineNo">1189</span>      throws IOException {<a name="line.1189"></a>
-<span class="sourceLineNo">1190</span>    RegionServerStatusService.BlockingInterface rss = rssStub;<a name="line.1190"></a>
-<span class="sourceLineNo">1191</span>    if (rss == null) {<a name="line.1191"></a>
-<span class="sourceLineNo">1192</span>      // the current server could be stopping.<a name="line.1192"></a>
-<span class="sourceLineNo">1193</span>      return;<a name="line.1193"></a>
-<span class="sourceLineNo">1194</span>    }<a name="line.1194"></a>
-<span class="sourceLineNo">1195</span>    ClusterStatusProtos.ServerLoad sl = buildServerLoad(reportStartTime, reportEndTime);<a name="line.1195"></a>
-<span class="sourceLineNo">1196</span>    try {<a name="line.1196"></a>
-<span class="sourceLineNo">1197</span>      RegionServerReportRequest.Builder request = RegionServerReportRequest.newBuilder();<a name="line.1197"></a>
-<span class="sourceLineNo">1198</span>      request.setServer(ProtobufUtil.toServerName(this.serverName));<a name="line.1198"></a>
-<span class="sourceLineNo">1199</span>      request.setLoad(sl);<a name="line.1199"></a>
-<span class="sourceLineNo">1200</span>      rss.regionServerReport(null, request.build());<a name="line.1200"></a>
-<span class="sourceLineNo">1201</span>    } catch (ServiceException se) {<a name="line.1201"></a>
-<span class="sourceLineNo">1202</span>      IOException ioe = ProtobufUtil.getRemoteException(se);<a name="line.1202"></a>
-<span class="sourceLineNo">1203</span>      if (ioe instanceof YouAreDeadException) {<a name="line.1203"></a>
-<span class="sourceLineNo">1204</span>        // This will be caught and handled as a fatal error in run()<a name="line.1204"></a>
-<span class="sourceLineNo">1205</span>        throw ioe;<a name="line.1205"></a>
-<span class="sourceLineNo">1206</span>      }<a name="line.1206"></a>
-<span class="sourceLineNo">1207</span>      if (rssStub == rss) {<a name="line.1207"></a>
-<span class="sourceLineNo">1208</span>        rssStub = null;<a name="line.1208"></a>
-<span class="sourceLineNo">1209</span>      }<a name="line.1209"></a>
-<span class="sourceLineNo">1210</span>      // Couldn't connect to the master, get location from zk and reconnect<a name="line.1210"></a>
-<span class="sourceLineNo">1211</span>      // Method blocks until new master is found or we are stopped<a name="line.1211"></a>
-<span class="sourceLineNo">1212</span>      createRegionServerStatusStub(true);<a name="line.1212"></a>
-<span class="sourceLineNo">1213</span>    }<a name="line.1213"></a>
-<span class="sourceLineNo">1214</span>  }<a name="line.1214"></a>
-<span class="sourceLineNo">1215</span><a name="line.1215"></a>
-<span class="sourceLineNo">1216</span>  /**<a name="line.1216"></a>
-<span class="sourceLineNo">1217</span>   * Reports the given map of Regions and their size on the filesystem to the active Master.<a name="line.1217"></a>
-<span class="sourceLineNo">1218</span>   *<a name="line.1218"></a>
-<span class="sourceLineNo">1219</span>   * @param regionSizeStore The store containing region sizes<a name="line.1219"></a>
-<span class="sourceLineNo">1220</span>   * @return false if FileSystemUtilizationChore should pause reporting to master. true otherwise<a name="line.1220"></a>
-<span class="sourceLineNo">1221</span>   */<a name="line.1221"></a>
-<span class="sourceLineNo">1222</span>  public boolean reportRegionSizesForQuotas(RegionSizeStore regionSizeStore) {<a name="line.1222"></a>
-<span class="sourceLineNo">1223</span>    RegionServerStatusService.BlockingInterface rss = rssStub;<a name="line.1223"></a>
-<span class="sourceLineNo">1224</span>    if (rss == null) {<a name="line.1224"></a>
-<span class="sourceLineNo">1225</span>      // the current server could be stopping.<a name="line.1225"></a>
-<span class="sourceLineNo">1226</span>      LOG.trace("Skipping Region size report to HMaster as stub is null");<a name="line.1226"></a>
-<span class="sourceLineNo">1227</span>      return true;<a name="line.1227"></a>
-<span class="sourceLineNo">1228</span>    }<a name="line.1228"></a>
-<span class="sourceLineNo">1229</span>    try {<a name="line.1229"></a>
-<span class="sourceLineNo">1230</span>      buildReportAndSend(rss, regionSizeStore);<a name="line.1230"></a>
-<span class="sourceLineNo">1231</span>    } catch (ServiceException se) {<a name="line.1231"></a>
-<span class="sourceLineNo">1232</span>      IOException ioe = ProtobufUtil.getRemoteException(se);<a name="line.1232"></a>
-<span class="sourceLineNo">1233</span>      if (ioe instanceof PleaseHoldException) {<a name="line.1233"></a>
-<span class="sourceLineNo">1234</span>        LOG.trace("Failed to report region sizes to Master because it is initializing."<a name="line.1234"></a>
-<span class="sourceLineNo">1235</span>            + " This will be retried.", ioe);<a name="line.1235"></a>
-<span class="sourceLineNo">1236</span>        // The Master is coming up. Will retry the report later. Avoid re-creating the stub.<a name="line.1236"></a>
-<span class="sourceLineNo">1237</span>        return true;<a name="line.1237"></a>
-<span class="sourceLineNo">1238</span>      }<a name="line.1238"></a>
-<span class="sourceLineNo">1239</span>      if (rssStub == rss) {<a name="line.1239"></a>
-<span class="sourceLineNo">1240</span>        rssStub = null;<a name="line.1240"></a>
-<span class="sourceLineNo">1241</span>      }<a name="line.1241"></a>
-<span class="sourceLineNo">1242</span>      createRegionServerStatusStub(true);<a name="line.1242"></a>
-<span class="sourceLineNo">1243</span>      if (ioe instanceof DoNotRetryIOException) {<a name="line.1243"></a>
-<span class="sourceLineNo">1244</span>        DoNotRetryIOException doNotRetryEx = (DoNotRetryIOException) ioe;<a name="line.1244"></a>
-<span class="sourceLineNo">1245</span>        if (doNotRetryEx.getCause() != null) {<a name="line.1245"></a>
-<span class="sourceLineNo">1246</span>          Throwable t = doNotRetryEx.getCause();<a name="line.1246"></a>
-<span class="sourceLineNo">1247</span>          if (t instanceof UnsupportedOperationException) {<a name="line.1247"></a>
-<span class="sourceLineNo">1248</span>            LOG.debug("master doesn't support ReportRegionSpaceUse, pause before retrying");<a name="line.1248"></a>
-<span class="sourceLineNo">1249</span>            return false;<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>      }<a name="line.1252"></a>
-<span class="sourceLineNo">1253</span>      LOG.debug("Failed to report region sizes to Master. This will be retried.", ioe);<a name="line.1253"></a>
-<span class="sourceLineNo">1254</span>    }<a name="line.1254"></a>
-<span class="sourceLineNo">1255</span>    return true;<a name="line.1255"></a>
-<span class="sourceLineNo">1256</span>  }<a name="line.1256"></a>
-<span class="sourceLineNo">1257</span><a name="line.1257"></a>
-<span class="sourceLineNo">1258</span>  /**<a name="line.1258"></a>
-<span class="sourceLineNo">1259</span>   * Builds the region size report and sends it to the master. Upon successful sending of the<a name="line.1259"></a>
-<span class="sourceLineNo">1260</span>   * report, the region sizes that were sent are marked as sent.<a name="line.1260"></a>
-<span class="sourceLineNo">1261</span>   *<a name="line.1261"></a>
-<span class="sourceLineNo">1262</span>   * @param rss The stub to send to the Master<a name="line.1262"></a>
-<span class="sourceLineNo">1263</span>   * @param regionSizeStore The store containing region sizes<a name="line.1263"></a>
-<span class="sourceLineNo">1264</span>   */<a name="line.1264"></a>
-<span class="sourceLineNo">1265</span>  void buildReportAndSend(RegionServerStatusService.BlockingInterface rss,<a name="line.1265"></a>
-<span class="sourceLineNo">1266</span>      RegionSizeStore regionSizeStore) throws ServiceException {<a name="line.1266"></a>
-<span class="sourceLineNo">1267</span>    RegionSpaceUseReportRequest request =<a name="line.1267"></a>
-<span class="sourceLineNo">1268</span>        buildRegionSpaceUseReportRequest(Objects.requireNonNull(regionSizeStore));<a name="line.1268"></a>
-<span class="sourceLineNo">1269</span>    rss.reportRegionSpaceUse(null, request);<a name="line.1269"></a>
-<span class="sourceLineNo">1270</span>    // Record the number of size reports sent<a name="line.1270"></a>
-<span class="sourceLineNo">1271</span>    if (metricsRegionServer != null) {<a name="line.1271"></a>
-<span class="sourceLineNo">1272</span>      metricsRegionServer.incrementNumRegionSizeReportsSent(regionSizeStore.size());<a name="line.1272"></a>
-<span class="sourceLineNo">1273</span>    }<a name="line.1273"></a>
-<span class="sourceLineNo">1274</span>  }<a name="line.1274"></a>
-<span class="sourceLineNo">1275</span><a name="line.1275"></a>
-<span class="sourceLineNo">1276</span>  /**<a name="line.1276"></a>
-<span class="sourceLineNo">1277</span>   * Builds a {@link RegionSpaceUseReportRequest} protobuf message from the region size map.<a name="line.1277"></a>
-<span class="sourceLineNo">1278</span>   *<a name="line.1278"></a>
-<span class="sourceLineNo">1279</span>   * @param regionSizes The size in bytes of regions<a name="line.1279"></a>
-<span class="sourceLineNo">1280</span>   * @return The corresponding protocol buffer message.<a name="line.1280"></a>
-<span class="sourceLineNo">1281</span>   */<a name="line.1281"></a>
-<span class="sourceLineNo">1282</span>  RegionSpaceUseReportRequest buildRegionSpaceUseReportRequest(RegionSizeStore regionSizes) {<a name="line.1282"></a>
-<span class="sourceLineNo">1283</span>    RegionSpaceUseReportRequest.Builder request = RegionSpaceUseReportRequest.newBuilder();<a name="line.1283"></a>
-<span class="sourceLineNo">1284</span>    for (Entry&lt;RegionInfo, RegionSize&gt; entry : regionSizes) {<a name="line.1284"></a>
-<span class="sourceLineNo">1285</span>      request.addSpaceUse(convertRegionSize(entry.getKey(), entry.getValue().getSize()));<a name="line.1285"></a>
-<span class="sourceLineNo">1286</span>    }<a name="line.1286"></a>
-<span class="sourceLineNo">1287</span>    return request.build();<a name="line.1287"></a>
-<span class="sourceLineNo">1288</span>  }<a name="line.1288"></a>
-<span class="sourceLineNo">1289</span><a name="line.1289"></a>
-<span class="sourceLineNo">1290</span>  /**<a name="line.1290"></a>
-<span class="sourceLineNo">1291</span>   * Converts a pair of {@link RegionInfo} and {@code long} into a {@link RegionSpaceUse}<a name="line.1291"></a>
-<span class="sourceLineNo">1292</span>   * protobuf message.<a name="line.1292"></a>
-<span class="sourceLineNo">1293</span>   *<a name="line.1293"></a>
-<span class="sourceLineNo">1294</span>   * @param regionInfo The RegionInfo<a name="line.1294"></a>
-<span class="sourceLineNo">1295</span>   * @param sizeInBytes The size in bytes of the Region<a name="line.1295"></a>
-<span class="sourceLineNo">1296</span>   * @return The protocol buffer<a name="line.1296"></a>
-<span class="sourceLineNo">1297</span>   */<a name="line.1297"></a>
-<span class="sourceLineNo">1298</span>  RegionSpaceUse convertRegionSize(RegionInfo regionInfo, Long sizeInBytes) {<a name="line.1298"></a>
-<span class="sourceLineNo">1299</span>    return RegionSpaceUse.newBuilder()<a name="line.1299"></a>
-<span class="sourceLineNo">1300</span>        .setRegionInfo(ProtobufUtil.toRegionInfo(Objects.requireNonNull(regionInfo)))<a name="line.1300"></a>
-<span class="sourceLineNo">1301</span>        .setRegionSize(Objects.requireNonNull(sizeInBytes))<a name="line.1301"></a>
-<span class="sourceLineNo">1302</span>        .build();<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>  ClusterStatusProtos.ServerLoad buildServerLoad(long reportStartTime, long reportEndTime)<a name="line.1305"></a>
-<span class="sourceLineNo">1306</span>      throws IOException {<a name="line.1306"></a>
-<span class="sourceLineNo">1307</span>    // We're getting the MetricsRegionServerWrapper here because the wrapper computes requests<a name="line.1307"></a>
-<span class="sourceLineNo">1308</span>    // per second, and other metrics  As long as metrics are part of ServerLoad it's best to use<a name="line.1308"></a>
-<span class="sourceLineNo">1309</span>    // the wrapper to compute those numbers in one place.<a name="line.1309"></a>
-<span class="sourceLineNo">1310</span>    // In the long term most of these should be moved off of ServerLoad and the heart beat.<a name="line.1310"></a>
-<span class="sourceLineNo">1311</span>    // Instead they should be stored in an HBase table so that external visibility into HBase is<a name="line.1311"></a>
-<span class="sourceLineNo">1312</span>    // improved; Additionally the load balancer will be able to take advantage of a more complete<a name="line.1312"></a>
-<span class="sourceLineNo">1313</span>    // history.<a name="line.1313"></a>
-<span class="sourceLineNo">1314</span>    MetricsRegionServerWrapper regionServerWrapper = metricsRegionServer.getRegionServerWrapper();<a name="line.1314"></a>
-<span class="sourceLineNo">1315</span>    Collection&lt;HRegion&gt; regions = getOnlineRegionsLocalContext();<a name="line.1315"></a>
-<span class="sourceLineNo">1316</span>    long usedMemory = -1L;<a name="line.1316"></a>
-<span class="sourceLineNo">1317</span>    long maxMemory = -1L;<a name="line.1317"></a>
-<span class="sourceLineNo">1318</span>    final MemoryUsage usage = MemorySizeUtil.safeGetHeapMemoryUsage();<a name="line.1318"></a>
-<span class="sourceLineNo">1319</span>    if (usage != null) {<a name="line.1319"></a>
-<span class="sourceLineNo">1320</span>      usedMemory = usage.getUsed();<a name="line.1320"></a>
-<span class="sourceLineNo">1321</span>      maxMemory = usage.getMax();<a name="line.1321"></a>
-<span class="sourceLineNo">1322</span>    }<a name="line.1322"></a>
-<span class="sourceLineNo">1323</span><a name="line.1323"></a>
-<span class="sourceLineNo">1324</span>    ClusterStatusProtos.ServerLoad.Builder serverLoad = ClusterStatusProtos.ServerLoad.newBuilder();<a name="line.1324"></a>
-<span class="sourceLineNo">1325</span>    serverLoad.setNumberOfRequests((int) regionServerWrapper.getRequestsPerSecond());<a name="line.1325"></a>
-<span class="sourceLineNo">1326</span>    serverLoad.setTotalNumberOfRequests(regionServerWrapper.getTotalRequestCount());<a name="line.1326"></a>
-<span class="sourceLineNo">1327</span>    serverLoad.setUsedHeapMB((int)(usedMemory / 1024 / 1024));<a name="line.1327"></a>
-<span class="sourceLineNo">1328</span>    serverLoad.setMaxHeapMB((int) (maxMemory / 1024 / 1024));<a name="line.1328"></a>
-<span class="sourceLineNo">1329</span>    Set&lt;String&gt; coprocessors = getWAL(null).getCoprocessorHost().getCoprocessors();<a name="line.1329"></a>
-<span class="sourceLineNo">1330</span>    Builder coprocessorBuilder = Coprocessor.newBuilder();<a name="line.1330"></a>
-<span class="sourceLineNo">1331</span>    for (String coprocessor : coprocessors) {<a name="line.1331"></a>
-<span class="sourceLineNo">1332</span>      serverLoad.addCoprocessors(coprocessorBuilder.setName(coprocessor).build());<a name="line.1332"></a>
-<span class="sourceLineNo">1333</span>    }<a name="line.1333"></a>
-<span class="sourceLineNo">1334</span>    RegionLoad.Builder regionLoadBldr = RegionLoad.newBuilder();<a name="line.1334"></a>
-<span class="sourceLineNo">1335</span>    RegionSpecifier.Builder regionSpecifier = RegionSpecifier.newBuilder();<a name="line.1335"></a>
-<span class="sourceLineNo">1336</span>    for (HRegion region : regions) {<a name="line.1336"></a>
-<span class="sourceLineNo">1337</span>      if (region.getCoprocessorHost() != null) {<a name="line.1337"></a>
-<span class="sourceLineNo">1338</span>        Set&lt;String&gt; regionCoprocessors = region.getCoprocessorHost().getCoprocessors();<a name="line.1338"></a>
-<span class="sourceLineNo">1339</span>        Iterator&lt;String&gt; iterator = regionCoprocessors.iterator();<a name="line.1339"></a>
-<span class="sourceLineNo">1340</span>        while (iterator.hasNext()) {<a name="line.1340"></a>
-<span class="sourceLineNo">1341</span>          serverLoad.addCoprocessors(coprocessorBuilder.setName(iterator.next()).build());<a name="line.1341"></a>
-<span class="sourceLineNo">1342</span>        }<a name="line.1342"></a>
-<span class="sourceLineNo">1343</span>      }<a name="line.1343"></a>
-<span class="sourceLineNo">1344</span>      serverLoad.addRegionLoads(createRegionLoad(region, regionLoadBldr, regionSpecifier));<a name="line.1344"></a>
-<span class="sourceLineNo">1345</span>      for (String coprocessor : getWAL(region.getRegionInfo()).getCoprocessorHost()<a name="line.1345"></a>
-<span class="sourceLineNo">1346</span>          .getCoprocessors()) {<a name="line.1346"></a>
-<span class="sourceLineNo">1347</span>        serverLoad.addCoprocessors(coprocessorBuilder.setName(coprocessor).build());<a name="line.1347"></a>
-<span class="sourceLineNo">1348</span>      }<a name="line.1348"></a>
-<span class="sourceLineNo">1349</span>    }<a name="line.1349"></a>
-<span class="sourceLineNo">1350</span>    serverLoad.setReportStartTime(reportStartTime);<a name="line.1350"></a>
-<span class="sourceLineNo">1351</span>    serverLoad.setReportEndTime(reportEndTime);<a name="line.1351"></a>
-<span class="sourceLineNo">1352</span>    if (this.infoServer != null) {<a name="line.1352"></a>
-<span class="sourceLineNo">1353</span>      serverLoad.setInfoServerPort(this.infoServer.getPort());<a name="line.1353"></a>
-<span class="sourceLineNo">1354</span>    } else {<a name="line.1354"></a>
-<span class="sourceLineNo">1355</span>      serverLoad.setInfoServerPort(-1);<a name="line.1355"></a>
-<span class="sourceLineNo">1356</span>    }<a name="line.1356"></a>
-<span class="sourceLineNo">1357</span><a name="line.1357"></a>
-<span class="sourceLineNo">1358</span>    // for the replicationLoad purpose. Only need to get from one executorService<a name="line.1358"></a>
-<span class="sourceLineNo">1359</span>    // either source or sink will get the same info<a name="line.1359"></a>
-<span class="sourceLineNo">1360</span>    ReplicationSourceService rsources = getReplicationSourceService();<a name="line.1360"></a>
-<span class="sourceLineNo">1361</span><a name="line.1361"></a>
-<span class="sourceLineNo">1362</span>    if (rsources != null) {<a name="line.1362"></a>
-<span class="sourceLineNo">1363</span>      // always refresh first to get the latest value<a name="line.1363"></a>
-<span class="sourceLineNo">1364</span>      ReplicationLoad rLoad = rsources.refreshAndGetReplicationLoad();<a name="line.1364"></a>
-<span class="sourceLineNo">1365</span>      if (rLoad != null) {<a name="line.1365"></a>
-<span class="sourceLineNo">1366</span>        serverLoad.setReplLoadSink(rLoad.getReplicationLoadSink());<a name="line.1366"></a>
-<span class="sourceLineNo">1367</span>        for (ClusterStatusProtos.ReplicationLoadSource rLS : rLoad.getReplicationLoadSourceList()) {<a name="line.1367"></a>
-<span class="sourceLineNo">1368</span>          serverLoad.addReplLoadSource(rLS);<a name="line.1368"></a>
-<span class="sourceLineNo">1369</span>        }<a name="line.1369"></a>
-<span class="sourceLineNo">1370</span>      }<a name="line.1370"></a>
-<span class="sourceLineNo">1371</span>    }<a name="line.1371"></a>
-<span class="sourceLineNo">1372</span><a name="line.1372"></a>
-<span class="sourceLineNo">1373</span>    return serverLoad.build();<a name="line.1373"></a>
-<span class="sourceLineNo">1374</span>  }<a name="line.1374"></a>
-<span class="sourceLineNo">1375</span><a name="line.1375"></a>
-<span class="sourceLineNo">1376</span>  String getOnlineRegionsAsPrintableString() {<a name="line.1376"></a>
-<span class="sourceLineNo">1377</span>    StringBuilder sb = new StringBuilder();<a name="line.1377"></a>
-<span class="sourceLineNo">1378</span>    for (Region r: this.onlineRegions.values()) {<a name="line.1378"></a>
-<span class="sourceLineNo">1379</span>      if (sb.length() &gt; 0) sb.append(", ");<a name="line.1379"></a>
-<span class="sourceLineNo">1380</span>      sb.append(r.getRegionInfo().getEncodedName());<a name="line.1380"></a>
-<span class="sourceLineNo">1381</span>    }<a name="line.1381"></a>
-<span class="sourceLineNo">1382</span>    return sb.toString();<a name="line.1382"></a>
-<span class="sourceLineNo">1383</span>  }<a name="line.1383"></a>
-<span class="sourceLineNo">1384</span><a name="line.1384"></a>
-<span class="sourceLineNo">1385</span>  /**<a name="line.1385"></a>
-<span class="sourceLineNo">1386</span>   * Wait on regions close.<a name="line.1386"></a>
-<span class="sourceLineNo">1387</span>   */<a name="line.1387"></a>
-<span class="sourceLineNo">1388</span>  private void waitOnAllRegionsToClose(final boolean abort) {<a name="line.1388"></a>
-<span class="sourceLineNo">1389</span>    // Wait till all regions are closed before going out.<a name="line.1389"></a>
-<span class="sourceLineNo">1390</span>    int lastCount = -1;<a name="line.1390"></a>
-<span class="sourceLineNo">1391</span>    long previousLogTime = 0;<a name="line.1391"></a>
-<span class="sourceLineNo">1392</span>    Set&lt;String&gt; closedRegions = new HashSet&lt;&gt;();<a name="line.1392"></a>
-<span class="sourceLineNo">1393</span>    boolean interrupted = false;<a name="line.1393"></a>
-<span class="sourceLineNo">1394</span>    try {<a name="line.1394"></a>
-<span class="sourceLineNo">1395</span>      while (!isOnlineRegionsEmpty()) {<a name="line.1395"></a>
-<span class="sourceLineNo">1396</span>        int count = getNumberOfOnlineRegions();<a name="line.1396"></a>
-<span class="sourceLineNo">1397</span>        // Only print a message if the count of regions has changed.<a name="line.1397"></a>
-<span class="sourceLineNo">1398</span>        if (count != lastCount) {<a name="line.1398"></a>
-<span class="sourceLineNo">1399</span>          // Log every second at most<a name="line.1399"></a>
-<span class="sourceLineNo">1400</span>          if (System.currentTimeMillis() &gt; (previousLogTime + 1000)) {<a name="line.1400"></a>
-<span class="sourceLineNo">1401</span>            previousLogTime = System.currentTimeMillis();<a name="line.1401"></a>
-<span class="sourceLineNo">1402</span>            lastCount = count;<a name="line.1402"></a>
-<span class="sourceLineNo">1403</span>            LOG.info("Waiting on " + count + " regions to close");<a name="line.1403"></a>
-<span class="sourceLineNo">1404</span>            // Only print out regions still closing if a small number else will<a name="line.1404"></a>
-<span class="sourceLineNo">1405</span>            // swamp the log.<a name="line.1405"></a>
-<span class="sourceLineNo">1406</span>            if (count &lt; 10 &amp;&amp; LOG.isDebugEnabled()) {<a name="line.1406"></a>
-<span class="sourceLineNo">1407</span>              LOG.debug("Online Regions=" + this.onlineRegions);<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>        }<a name="line.1410"></a>
-<span class="sourceLineNo">1411</span>        // Ensure all user regions have been sent a close. Use this to<a name="line.1411"></a>
-<span class="sourceLineNo">1412</span>        // protect against the case where an open comes in after we start the<a name="line.1412"></a>
-<span class="sourceLineNo">1413</span>        // iterator of onlineRegions to close all user regions.<a name="line.1413"></a>
-<span class="sourceLineNo">1414</span>        for (Map.Entry&lt;String, HRegion&gt; e : this.onlineRegions.entrySet()) {<a name="line.1414"></a>
-<span class="sourceLineNo">1415</span>          RegionInfo hri = e.getValue().getRegionInfo();<a name="line.1415"></a>
-<span class="sourceLineNo">1416</span>          if (!this.regionsInTransitionInRS.containsKey(hri.getEncodedNameAsBytes()) &amp;&amp;<a name="line.1416"></a>
-<span class="sourceLineNo">1417</span>              !closedRegions.contains(hri.getEncodedName())) {<a name="line.1417"></a>
-<span class="sourceLineNo">1418</span>            closedRegions.add(hri.getEncodedName());<a name="line.1418"></a>
-<span class="sourceLineNo">1419</span>            // Don't update zk with this close transition; pass false.<a name="line.1419"></a>
-<span class="sourceLineNo">1420</span>            closeRegionIgnoreErrors(hri, abort);<a name="line.1420"></a>
-<span class="sourceLineNo">1421</span>          }<a name="line.1421"></a>
-<span class="sourceLineNo">1422</span>        }<a name="line.1422"></a>
-<span class="sourceLineNo">1423</span>        // No regions in RIT, we could stop waiting now.<a name="line.1423"></a>
-<span class="sourceLineNo">1424</span>        if (this.regionsInTransitionInRS.isEmpty()) {<a name="line.1424"></a>
-<span class="sourceLineNo">1425</span>          if (!isOnlineRegionsEmpty()) {<a name="line.1425"></a>
-<span class="sourceLineNo">1426</span>            LOG.info("We were exiting though online regions are not empty," +<a name="line.1426"></a>
-<span class="sourceLineNo">1427</span>                " because some regions failed closing");<a name="line.1427"></a>
-<span class="sourceLineNo">1428</span>          }<a name="line.1428"></a>
-<span class="sourceLineNo">1429</span>          break;<a name="line.1429"></a>
-<span class="sourceLineNo">1430</span>        }<a name="line.1430"></a>
-<span class="sourceLineNo">1431</span>        if (sleep(200)) {<a name="line.1431"></a>
-<span class="sourceLineNo">1432</span>          interrupted = true;<a name="line.1432"></a>
-<span class="sourceLineNo">1433</span>        }<a name="line.1433"></a>
-<span class="sourceLineNo">1434</span>      }<a name="line.1434"></a>
-<span class="sourceLineNo">1435</span>    } finally {<a name="line.1435"></a>
-<span class="sourceLineNo">1436</span>      if (interrupted) {<a name="line.1436"></a>
-<span class="sourceLineNo">1437</span>        Thread.currentThread().interrupt();<a name="line.1437"></a>
-<span class="sourceLineNo">1438</span>      }<a name="line.1438"></a>
-<span class="sourceLineNo">1439</span>    }<a name="line.1439"></a>
-<span class="sourceLineNo">1440</span>  }<a name="line.1440"></a>
-<span class="sourceLineNo">1441</span><a name="line.1441"></a>
-<span class="sourceLineNo">1442</span>  private boolean sleep(long millis) {<a name="line.1442"></a>
-<span class="sourceLineNo">1443</span>    boolean interrupted = false;<a name="line.1443"></a>
-<span class="sourceLineNo">1444</span>    try {<a name="line.1444"></a>
-<span class="sourceLineNo">1445</span>      Thread.sleep(millis);<a name="line.1445"></a>
-<span class="sourceLineNo">1446</span>    } catch (InterruptedException e) {<a name="line.1446"></a>
-<span class="sourceLineNo">1447</span>      LOG.warn("Interrupted while sleeping");<a name="line.1447"></a>
-<span class="sourceLineNo">1448</span>      interrupted = true;<a name="line.1448"></a>
-<span class="sourceLineNo">1449</span>    }<a name="line.1449"></a>
-<span class="sourceLineNo">1450</span>    return interrupted;<a name="line.1450"></a>
-<span class="sourceLineNo">1451</span>  }<a name="line.1451"></a>
-<span class="sourceLineNo">1452</span><a name="line.1452"></a>
-<span class="sourceLineNo">1453</span>  private void shutdownWAL(final boolean close) {<a name="line.1453"></a>
-<span class="sourceLineNo">1454</span>    if (this.walFactory != null) {<a name="line.1454"></a>
-<span class="sourceLineNo">1455</span>      try {<a name="line.1455"></a>
-<span class="sourceLineNo">1456</span>        if (close) {<a name="line.1456"></a>
-<span class="sourceLineNo">1457</span>          walFactory.close();<a name="line.1457"></a>
-<span class="sourceLineNo">1458</span>        } else {<a name="line.1458"></a>
-<span class="sourceLineNo">1459</span>          walFactory.shutdown();<a name="line.1459"></a>
-<span class="sourceLineNo">1460</span>        }<a name="line.1460"></a>
-<span class="sourceLineNo">1461</span>      } catch (Throwable e) {<a name="line.1461"></a>
-<span class="sourceLineNo">1462</span>        e = e instanceof RemoteException ? ((RemoteException) e).unwrapRemoteException() : e;<a name="line.1462"></a>
-<span class="sourceLineNo">1463</span>        LOG.error("Shutdown / close of WAL failed: " + e);<a name="line.1463"></a>
-<span class="sourceLineNo">1464</span>        LOG.debug("Shutdown / close exception details:", e);<a name="line.1464"></a>
-<span class="sourceLineNo">1465</span>      }<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>   * Run init. Sets up wal and starts up all server threads.<a name="line.1470"></a>
-<span class="sourceLineNo">1471</span>   *<a name="line.1471"></a>
-<span class="sourceLineNo">1472</span>   * @param c Extra configuration.<a name="line.1472"></a>
-<span class="sourceLineNo">1473</span>   */<a name="line.1473"></a>
-<span class="sourceLineNo">1474</span>  protected void handleReportForDutyResponse(final RegionServerStartupResponse c)<a name="line.1474"></a>
-<span class="sourceLineNo">1475</span>  throws IOException {<a name="line.1475"></a>
-<span class="sourceLineNo">1476</span>    try {<a name="line.1476"></a>
-<span class="sourceLineNo">1477</span>      boolean updateRootDir = false;<a name="line.1477"></a>
-<span class="sourceLineNo">1478</span>      for (NameStringPair e : c.getMapEntriesList()) {<a name="line.1478"></a>
-<span class="sourceLineNo">1479</span>        String key = e.getName();<a name="line.1479"></a>
-<span class="sourceLineNo">1480</span>        // The hostname the master sees us as.<a name="line.1480"></a>
-<span class="sourceLineNo">1481</span>        if (key.equals(HConstants.KEY_FOR_HOSTNAME_SEEN_BY_MASTER)) {<a name="line.1481"></a>
-<span class="sourceLineNo">1482</span>          String hostnameFromMasterPOV = e.getValue();<a name="line.1482"></a>
-<span class="sourceLineNo">1483</span>          this.serverName = ServerName.valueOf(hostnameFromMasterPOV, rpcServices.isa.getPort(),<a name="line.1483"></a>
-<span class="sourceLineNo">1484</span>              this.startcode);<a name="line.1484"></a>
-<span class="sourceLineNo">1485</span>          if (!StringUtils.isBlank(useThisHostnameInstead) &amp;&amp;<a name="line.1485"></a>
-<span class="sourceLineNo">1486</span>              !hostnameFromMasterPOV.equals(useThisHostnameInstead)) {<a name="line.1486"></a>
-<span class="sourceLineNo">1487</span>            String msg = "Master passed us a different hostname to use; was=" +<a name="line.1487"></a>
-<span class="sourceLineNo">1488</span>                this.useThisHostnameInstead + ", but now=" + hostnameFromMasterPOV;<a name="line.1488"></a>
-<span class="sourceLineNo">1489</span>            LOG.error(msg);<a name="line.1489"></a>
-<span class="sourceLineNo">1490</span>            throw new IOException(msg);<a name="line.1490"></a>
-<span class="sourceLineNo">1491</span>          }<a name="line.1491"></a>
-<span class="sourceLineNo">1492</span>          if (StringUtils.isBlank(useThisHostnameInstead) &amp;&amp;<a name="line.1492"></a>
-<span class="sourceLineNo">1493</span>              !hostnameFromMasterPOV.equals(rpcServices.isa.getHostName())) {<a name="line.1493"></a>
-<span class="sourceLineNo">1494</span>            String msg = "Master passed us a different hostname to use; was=" +<a name="line.1494"></a>
-<span class="sourceLineNo">1495</span>                rpcServices.isa.getHostName() + ", but now=" + hostnameFromMasterPOV;<a name="line.1495"></a>
-<span class="sourceLineNo">1496</span>            LOG.error(msg);<a name="line.1496"></a>
-<span class="sourceLineNo">1497</span>          }<a name="line.1497"></a>
-<span class="sourceLineNo">1498</span>          continue;<a name="line.1498"></a>
-<span class="sourceLineNo">1499</span>        }<a name="line.1499"></a>
-<span class="sourceLineNo">1500</span><a name="line.1500"></a>
-<span class="sourceLineNo">1501</span>        String value = e.getValue();<a name="line.1501"></a>
-<span class="sourceLineNo">1502</span>        if (key.equals(HConstants.HBASE_DIR)) {<a name="line.1502"></a>
-<span class="sourceLineNo">1503</span>          if (value != null &amp;&amp; !value.equals(conf.get(HConstants.HBASE_DIR))) {<a name="line.1503"></a>
-<span class="sourceLineNo">1504</span>            updateRootDir = true;<a name="line.1504"></a>
-<span class="sourceLineNo">1505</span>          }<a name="line.1505"></a>
-<span class="sourceLineNo">1506</span>        }<a name="line.1506"></a>
-<span class="sourceLineNo">1507</span><a name="line.1507"></a>
-<span class="sourceLineNo">1508</span>        if (LOG.isDebugEnabled()) {<a name="line.1508"></a>
-<span class="sourceLineNo">1509</span>          LOG.debug("Config from master: " + key + "=" + value);<a name="line.1509"></a>
-<span class="sourceLineNo">1510</span>        }<a name="line.1510"></a>
-<span class="sourceLineNo">1511</span>        this.conf.set(key, value);<a name="line.1511"></a>
-<span class="sourceLineNo">1512</span>      }<a name="line.1512"></a>
-<span class="sourceLineNo">1513</span>      // Set our ephemeral znode up in zookeeper now we have a name.<a name="line.1513"></a>
-<span class="sourceLineNo">1514</span>      createMyEphemeralNode();<a name="line.1514"></a>
-<span class="sourceLineNo">1515</span><a name="line.1515"></a>
-<span class="sourceLineNo">1516</span>      if (updateRootDir) {<a name="line.1516"></a>
-<span class="sourceLineNo">1517</span>        // initialize file system by the config fs.defaultFS and hbase.rootdir from master<a name="line.1517"></a>
-<span class="sourceLineNo">1518</span>        initializeFileSystem();<a name="line.1518"></a>
-<span class="sourceLineNo">1519</span>      }<a name="line.1519"></a>
-<span class="sourceLineNo">1520</span><a name="line.1520"></a>
-<span class="sourceLineNo">1521</span>      // hack! Maps DFSClient =&gt; RegionServer for logs.  HDFS made this<a name="line.1521"></a>
-<span class="sourceLineNo">1522</span>      // config param for task trackers, but we can piggyback off of it.<a name="line.1522"></a>
-<span class="sourceLineNo">1523</span>      if (this.conf.get("mapreduce.task.attempt.id") == null) {<a name="line.1523"></a>
-<span class="sourceLineNo">1524</span>        this.conf.set("mapreduce.task.attempt.id", "hb_rs_" + this.serverName.toString());<a name="line.1524"></a>
-<span class="sourceLineNo">1525</span>      }<a name="line.1525"></a>
-<span class="sourceLineNo">1526</span><a name="line.1526"></a>
-<span class="sourceLineNo">1527</span>      // Save it in a file, this will allow to see if we crash<a name="line.1527"></a>
-<span class="sourceLineNo">1528</span>      ZNodeClearer.writeMyEphemeralNodeOnDisk(getMyEphemeralNodePath());<a name="line.1528"></a>
-<span class="sourceLineNo">1529</span><a name="line.1529"></a>
-<span class="sourceLineNo">1530</span>      // This call sets up an initialized replication and WAL. Later we start it up.<a name="line.1530"></a>
-<span class="sourceLineNo">1531</span>      setupWALAndReplication();<a name="line.1531"></a>
-<span class="sourceLineNo">1532</span>      // Init in here rather than in constructor after thread name has been set<a name="line.1532"></a>
-<span class="sourceLineNo">1533</span>      this.metricsTable = new MetricsTable(new MetricsTableWrapperAggregateImpl(this));<a name="line.1533"></a>
-<span class="sourceLineNo">1534</span>      this.metricsRegionServer = new MetricsRegionServer(<a name="line.1534"></a>
-<span class="sourceLineNo">1535</span>          new MetricsRegionServerWrapperImpl(this), conf, metricsTable);<a name="line.1535"></a>
-<span class="sourceLineNo">1536</span>      // Now that we have a metrics source, start the pause monitor<a name="line.1536"></a>
-<span class="sourceLineNo">1537</span>      this.pauseMonitor = new JvmPauseMonitor(conf, getMetrics().getMetricsSource());<a name="line.1537"></a>
-<span class="sourceLineNo">1538</span>      pauseMonitor.start();<a name="line.1538"></a>
-<span class="sourceLineNo">1539</span><a name="line.1539"></a>
-<span class="sourceLineNo">1540</span>      // There is a rare case where we do NOT want services to start. Check config.<a name="line.1540"></a>
-<span class="sourceLineNo">1541</span>      if (getConfiguration().getBoolean("hbase.regionserver.workers", true)) {<a name="line.1541"></a>
-<span class="sourceLineNo">1542</span>        startServices();<a name="line.1542"></a>
-<span class="sourceLineNo">1543</span>      }<a name="line.1543"></a>
-<span class="sourceLineNo">1544</span>      // In here we start up the replication Service. Above we initialized it. TODO. Reconcile.<a name="line.1544"></a>
-<span class="sourceLineNo">1545</span>      // or make sense of it.<a name="line.1545"></a>
-<span class="sourceLineNo">1546</span>      startReplicationService();<a name="line.1546"></a>
-<span class="sourceLineNo">1547</span><a name="line.1547"></a>
+<span class="sourceLineNo">951</span>      LOG.debug("About to register with Master.");<a name="line.951"></a>
+<span class="sourceLineNo">952</span>      RetryCounterFactory rcf = new RetryCounterFactory(Integer.MAX_VALUE,<a name="line.952"></a>
+<span class="sourceLineNo">953</span>          this.sleeper.getPeriod(), 1000 * 60 * 5);<a name="line.953"></a>
+<span class="sourceLineNo">954</span>      RetryCounter rc = rcf.create();<a name="line.954"></a>
+<span class="sourceLineNo">955</span>      while (keepLooping()) {<a name="line.955"></a>
+<span class="sourceLineNo">956</span>        RegionServerStartupResponse w = reportForDuty();<a name="line.956"></a>
+<span class="sourceLineNo">957</span>        if (w == null) {<a name="line.957"></a>
+<span class="sourceLineNo">958</span>          long sleepTime = rc.getBackoffTimeAndIncrementAttempts();<a name="line.958"></a>
+<span class="sourceLineNo">959</span>          LOG.warn("reportForDuty failed; sleeping {} ms and then retrying.", sleepTime);<a name="line.959"></a>
+<span class="sourceLineNo">960</span>          this.sleeper.sleep(sleepTime);<a name="line.960"></a>
+<span class="sourceLineNo">961</span>        } else {<a name="line.961"></a>
+<span class="sourceLineNo">962</span>          handleReportForDutyResponse(w);<a name="line.962"></a>
+<span class="sourceLineNo">963</span>          break;<a name="line.963"></a>
+<span class="sourceLineNo">964</span>        }<a name="line.964"></a>
+<span class="sourceLineNo">965</span>      }<a name="line.965"></a>
+<span class="sourceLineNo">966</span><a name="line.966"></a>
+<span class="sourceLineNo">967</span>      if (!isStopped() &amp;&amp; isHealthy()) {<a name="line.967"></a>
+<span class="sourceLineNo">968</span>        // start the snapshot handler and other procedure handlers,<a name="line.968"></a>
+<span class="sourceLineNo">969</span>        // since the server is ready to run<a name="line.969"></a>
+<span class="sourceLineNo">970</span>        if (this.rspmHost != null) {<a name="line.970"></a>
+<span class="sourceLineNo">971</span>          this.rspmHost.start();<a name="line.971"></a>
+<span class="sourceLineNo">972</span>        }<a name="line.972"></a>
+<span class="sourceLineNo">973</span>        // Start the Quota Manager<a name="line.973"></a>
+<span class="sourceLineNo">974</span>        if (this.rsQuotaManager != null) {<a name="line.974"></a>
+<span class="sourceLineNo">975</span>          rsQuotaManager.start(getRpcServer().getScheduler());<a name="line.975"></a>
+<span class="sourceLineNo">976</span>        }<a name="line.976"></a>
+<span class="sourceLineNo">977</span>        if (this.rsSpaceQuotaManager != null) {<a name="line.977"></a>
+<span class="sourceLineNo">978</span>          this.rsSpaceQuotaManager.start();<a name="line.978"></a>
+<span class="sourceLineNo">979</span>        }<a name="line.979"></a>
+<span class="sourceLineNo">980</span>      }<a name="line.980"></a>
+<span class="sourceLineNo">981</span><a name="line.981"></a>
+<span class="sourceLineNo">982</span>      // We registered with the Master.  Go into run mode.<a name="line.982"></a>
+<span class="sourceLineNo">983</span>      long lastMsg = System.currentTimeMillis();<a name="line.983"></a>
+<span class="sourceLineNo">984</span>      long oldRequestCount = -1;<a name="line.984"></a>
+<span class="sourceLineNo">985</span>      // The main run loop.<a name="line.985"></a>
+<span class="sourceLineNo">986</span>      while (!isStopped() &amp;&amp; isHealthy()) {<a name="line.986"></a>
+<span class="sourceLineNo">987</span>        if (!isClusterUp()) {<a name="line.987"></a>
+<span class="sourceLineNo">988</span>          if (isOnlineRegionsEmpty()) {<a name="line.988"></a>
+<span class="sourceLineNo">989</span>            stop("Exiting; cluster shutdown set and not carrying any regions");<a name="line.989"></a>
+<span class="sourceLineNo">990</span>          } else if (!this.stopping) {<a name="line.990"></a>
+<span class="sourceLineNo">991</span>            this.stopping = true;<a name="line.991"></a>
+<span class="sourceLineNo">992</span>            LOG.info("Closing user regions");<a name="line.992"></a>
+<span class="sourceLineNo">993</span>            closeUserRegions(this.abortRequested);<a name="line.993"></a>
+<span class="sourceLineNo">994</span>          } else if (this.stopping) {<a name="line.994"></a>
+<span class="sourceLineNo">995</span>            boolean allUserRegionsOffline = areAllUserRegionsOffline();<a name="line.995"></a>
+<span class="sourceLineNo">996</span>            if (allUserRegionsOffline) {<a name="line.996"></a>
+<span class="sourceLineNo">997</span>              // Set stopped if no more write requests tp meta tables<a name="line.997"></a>
+<span class="sourceLineNo">998</span>              // since last time we went around the loop.  Any open<a name="line.998"></a>
+<span class="sourceLineNo">999</span>              // meta regions will be closed on our way out.<a name="line.999"></a>
+<span class="sourceLineNo">1000</span>              if (oldRequestCount == getWriteRequestCount()) {<a name="line.1000"></a>
+<span class="sourceLineNo">1001</span>                stop("Stopped; only catalog regions remaining online");<a name="line.1001"></a>
+<span class="sourceLineNo">1002</span>                break;<a name="line.1002"></a>
+<span class="sourceLineNo">1003</span>              }<a name="line.1003"></a>
+<span class="sourceLineNo">1004</span>              oldRequestCount = getWriteRequestCount();<a name="line.1004"></a>
+<span class="sourceLineNo">1005</span>            } else {<a name="line.1005"></a>
+<span class="sourceLineNo">1006</span>              // Make sure all regions have been closed -- some regions may<a name="line.1006"></a>
+<span class="sourceLineNo">1007</span>              // have not got it because we were splitting at the time of<a name="line.1007"></a>
+<span class="sourceLineNo">1008</span>              // the call to closeUserRegions.<a name="line.1008"></a>
+<span class="sourceLineNo">1009</span>              closeUserRegions(this.abortRequested);<a name="line.1009"></a>
+<span class="sourceLineNo">1010</span>            }<a name="line.1010"></a>
+<span class="sourceLineNo">1011</span>            LOG.debug("Waiting on " + getOnlineRegionsAsPrintableString());<a name="line.1011"></a>
+<span class="sourceLineNo">1012</span>          }<a name="line.1012"></a>
+<span class="sourceLineNo">1013</span>        }<a name="line.1013"></a>
+<span class="sourceLineNo">1014</span>        long now = System.currentTimeMillis();<a name="line.1014"></a>
+<span class="sourceLineNo">1015</span>        if ((now - lastMsg) &gt;= msgInterval) {<a name="line.1015"></a>
+<span class="sourceLineNo">1016</span>          tryRegionServerReport(lastMsg, now);<a name="line.1016"></a>
+<span class="sourceLineNo">1017</span>          lastMsg = System.currentTimeMillis();<a name="line.1017"></a>
+<span class="sourceLineNo">1018</span>        }<a name="line.1018"></a>
+<span class="sourceLineNo">1019</span>        if (!isStopped() &amp;&amp; !isAborted()) {<a name="line.1019"></a>
+<span class="sourceLineNo">1020</span>          this.sleeper.sleep();<a name="line.1020"></a>
+<span class="sourceLineNo">1021</span>        }<a name="line.1021"></a>
+<span class="sourceLineNo">1022</span>      } // for<a name="line.1022"></a>
+<span class="sourceLineNo">1023</span>    } catch (Throwable t) {<a name="line.1023"></a>
+<span class="sourceLineNo">1024</span>      if (!rpcServices.checkOOME(t)) {<a name="line.1024"></a>
+<span class="sourceLineNo">1025</span>        String prefix = t instanceof YouAreDeadException? "": "Unhandled: ";<a name="line.1025"></a>
+<span class="sourceLineNo">1026</span>        abort(prefix + t.getMessage(), t);<a name="line.1026"></a>
+<span class="sourceLineNo">1027</span>      }<a name="line.1027"></a>
+<span class="sourceLineNo">1028</span>    }<a name="line.1028"></a>
+<span class="sourceLineNo">1029</span>    if (this.leases != null) {<a name="line.1029"></a>
+<span class="sourceLineNo">1030</span>      this.leases.closeAfterLeasesExpire();<a name="line.1030"></a>
+<span class="sourceLineNo">1031</span>    }<a name="line.1031"></a>
+<span class="sourceLineNo">1032</span>    if (this.splitLogWorker != null) {<a name="line.1032"></a>
+<span class="sourceLineNo">1033</span>      splitLogWorker.stop();<a name="line.1033"></a>
+<span class="sourceLineNo">1034</span>    }<a name="line.1034"></a>
+<span class="sourceLineNo">1035</span>    if (this.infoServer != null) {<a name="line.1035"></a>
+<span class="sourceLineNo">1036</span>      LOG.info("Stopping infoServer");<a name="line.1036"></a>
+<span class="sourceLineNo">1037</span>      try {<a name="line.1037"></a>
+<span class="sourceLineNo">1038</span>        this.infoServer.stop();<a name="line.1038"></a>
+<span class="sourceLineNo">1039</span>      } catch (Exception e) {<a name="line.1039"></a>
+<span class="sourceLineNo">1040</span>        LOG.error("Failed to stop infoServer", e);<a name="line.1040"></a>
+<span class="sourceLineNo">1041</span>      }<a name="line.1041"></a>
+<span class="sourceLineNo">1042</span>    }<a name="line.1042"></a>
+<span class="sourceLineNo">1043</span>    // Send cache a shutdown.<a name="line.1043"></a>
+<span class="sourceLineNo">1044</span>    if (cacheConfig != null &amp;&amp; cacheConfig.isBlockCacheEnabled()) {<a name="line.1044"></a>
+<span class="sourceLineNo">1045</span>      cacheConfig.getBlockCache().shutdown();<a name="line.1045"></a>
+<span class="sourceLineNo">1046</span>    }<a name="line.1046"></a>
+<span class="sourceLineNo">1047</span>    mobCacheConfig.getMobFileCache().shutdown();<a name="line.1047"></a>
+<span class="sourceLineNo">1048</span><a name="line.1048"></a>
+<span class="sourceLineNo">1049</span>    if (movedRegionsCleaner != null) {<a name="line.1049"></a>
+<span class="sourceLineNo">1050</span>      movedRegionsCleaner.stop("Region Server stopping");<a name="line.1050"></a>
+<span class="sourceLineNo">1051</span>    }<a name="line.1051"></a>
+<span class="sourceLineNo">1052</span><a name="line.1052"></a>
+<span class="sourceLineNo">1053</span>    // Send interrupts to wake up threads if sleeping so they notice shutdown.<a name="line.1053"></a>
+<span class="sourceLineNo">1054</span>    // TODO: Should we check they are alive? If OOME could have exited already<a name="line.1054"></a>
+<span class="sourceLineNo">1055</span>    if (this.hMemManager != null) this.hMemManager.stop();<a name="line.1055"></a>
+<span class="sourceLineNo">1056</span>    if (this.cacheFlusher != null) this.cacheFlusher.interruptIfNecessary();<a name="line.1056"></a>
+<span class="sourceLineNo">1057</span>    if (this.compactSplitThread != null) this.compactSplitThread.interruptIfNecessary();<a name="line.1057"></a>
+<span class="sourceLineNo">1058</span>    sendShutdownInterrupt();<a name="line.1058"></a>
+<span class="sourceLineNo">1059</span><a name="line.1059"></a>
+<span class="sourceLineNo">1060</span>    // Stop the snapshot and other procedure handlers, forcefully killing all running tasks<a name="line.1060"></a>
+<span class="sourceLineNo">1061</span>    if (rspmHost != null) {<a name="line.1061"></a>
+<span class="sourceLineNo">1062</span>      rspmHost.stop(this.abortRequested || this.killed);<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>    if (this.killed) {<a name="line.1065"></a>
+<span class="sourceLineNo">1066</span>      // Just skip out w/o closing regions.  Used when testing.<a name="line.1066"></a>
+<span class="sourceLineNo">1067</span>    } else if (abortRequested) {<a name="line.1067"></a>
+<span class="sourceLineNo">1068</span>      if (this.fsOk) {<a name="line.1068"></a>
+<span class="sourceLineNo">1069</span>        closeUserRegions(abortRequested); // Don't leave any open file handles<a name="line.1069"></a>
+<span class="sourceLineNo">1070</span>      }<a name="line.1070"></a>
+<span class="sourceLineNo">1071</span>      LOG.info("aborting server " + this.serverName);<a name="line.1071"></a>
+<span class="sourceLineNo">1072</span>    } else {<a name="line.1072"></a>
+<span class="sourceLineNo">1073</span>      closeUserRegions(abortRequested);<a name="line.1073"></a>
+<span class="sourceLineNo">1074</span>      LOG.info("stopping server " + this.serverName);<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>    // so callers waiting for meta without timeout can stop<a name="line.1077"></a>
+<span class="sourceLineNo">1078</span>    if (this.metaTableLocator != null) this.metaTableLocator.stop();<a name="line.1078"></a>
+<span class="sourceLineNo">1079</span>    if (this.clusterConnection != null &amp;&amp; !clusterConnection.isClosed()) {<a name="line.1079"></a>
+<span class="sourceLineNo">1080</span>      try {<a name="line.1080"></a>
+<span class="sourceLineNo">1081</span>        this.clusterConnection.close();<a name="line.1081"></a>
+<span class="sourceLineNo">1082</span>      } catch (IOException e) {<a name="line.1082"></a>
+<span class="sourceLineNo">1083</span>        // Although the {@link Closeable} interface throws an {@link<a name="line.1083"></a>
+<span class="sourceLineNo">1084</span>        // IOException}, in reality, the implementation would never do that.<a name="line.1084"></a>
+<span class="sourceLineNo">1085</span>        LOG.warn("Attempt to close server's short circuit ClusterConnection failed.", e);<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>    // Closing the compactSplit thread before closing meta regions<a name="line.1089"></a>
+<span class="sourceLineNo">1090</span>    if (!this.killed &amp;&amp; containsMetaTableRegions()) {<a name="line.1090"></a>
+<span class="sourceLineNo">1091</span>      if (!abortRequested || this.fsOk) {<a name="line.1091"></a>
+<span class="sourceLineNo">1092</span>        if (this.compactSplitThread != null) {<a name="line.1092"></a>
+<span class="sourceLineNo">1093</span>          this.compactSplitThread.join();<a name="line.1093"></a>
+<span class="sourceLineNo">1094</span>          this.compactSplitThread = null;<a name="line.1094"></a>
+<span class="sourceLineNo">1095</span>        }<a name="line.1095"></a>
+<span class="sourceLineNo">1096</span>        closeMetaTableRegions(abortRequested);<a name="line.1096"></a>
+<span class="sourceLineNo">1097</span>      }<a name="line.1097"></a>
+<span class="sourceLineNo">1098</span>    }<a name="line.1098"></a>
+<span class="sourceLineNo">1099</span><a name="line.1099"></a>
+<span class="sourceLineNo">1100</span>    if (!this.killed &amp;&amp; this.fsOk) {<a name="line.1100"></a>
+<span class="sourceLineNo">1101</span>      waitOnAllRegionsToClose(abortRequested);<a name="line.1101"></a>
+<span class="sourceLineNo">1102</span>      LOG.info("stopping server " + this.serverName + "; all regions closed.");<a name="line.1102"></a>
+<span class="sourceLineNo">1103</span>    }<a name="line.1103"></a>
+<span class="sourceLineNo">1104</span><a name="line.1104"></a>
+<span class="sourceLineNo">1105</span>    // Stop the quota manager<a name="line.1105"></a>
+<span class="sourceLineNo">1106</span>    if (rsQuotaManager != null) {<a name="line.1106"></a>
+<span class="sourceLineNo">1107</span>      rsQuotaManager.stop();<a name="line.1107"></a>
+<span class="sourceLineNo">1108</span>    }<a name="line.1108"></a>
+<span class="sourceLineNo">1109</span>    if (rsSpaceQuotaManager != null) {<a name="line.1109"></a>
+<span class="sourceLineNo">1110</span>      rsSpaceQuotaManager.stop();<a name="line.1110"></a>
+<span class="sourceLineNo">1111</span>      rsSpaceQuotaManager = null;<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>    //fsOk flag may be changed when closing regions throws exception.<a name="line.1114"></a>
+<span class="sourceLineNo">1115</span>    if (this.fsOk) {<a name="line.1115"></a>
+<span class="sourceLineNo">1116</span>      shutdownWAL(!abortRequested);<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>    // Make sure the proxy is down.<a name="line.1119"></a>
+<span class="sourceLineNo">1120</span>    if (this.rssStub != null) {<a name="line.1120"></a>
+<span class="sourceLineNo">1121</span>      this.rssStub = null;<a name="line.1121"></a>
+<span class="sourceLineNo">1122</span>    }<a name="line.1122"></a>
+<span class="sourceLineNo">1123</span>    if (this.lockStub != null) {<a name="line.1123"></a>
+<span class="sourceLineNo">1124</span>      this.lockStub = null;<a name="line.1124"></a>
+<span class="sourceLineNo">1125</span>    }<a name="line.1125"></a>
+<span class="sourceLineNo">1126</span>    if (this.rpcClient != null) {<a name="line.1126"></a>
+<span class="sourceLineNo">1127</span>      this.rpcClient.close();<a name="line.1127"></a>
+<span class="sourceLineNo">1128</span>    }<a name="line.1128"></a>
+<span class="sourceLineNo">1129</span>    if (this.leases != null) {<a name="line.1129"></a>
+<span class="sourceLineNo">1130</span>      this.leases.close();<a name="line.1130"></a>
+<span class="sourceLineNo">1131</span>    }<a name="line.1131"></a>
+<span class="sourceLineNo">1132</span>    if (this.pauseMonitor != null) {<a name="line.1132"></a>
+<span class="sourceLineNo">1133</span>      this.pauseMonitor.stop();<a name="line.1133"></a>
+<span class="sourceLineNo">1134</span>    }<a name="line.1134"></a>
+<span class="sourceLineNo">1135</span><a name="line.1135"></a>
+<span class="sourceLineNo">1136</span>    if (!killed) {<a name="line.1136"></a>
+<span class="sourceLineNo">1137</span>      stopServiceThreads();<a name="line.1137"></a>
+<span class="sourceLineNo">1138</span>    }<a name="line.1138"></a>
+<span class="sourceLineNo">1139</span><a name="line.1139"></a>
+<span class="sourceLineNo">1140</span>    if (this.rpcServices != null) {<a name="line.1140"></a>
+<span class="sourceLineNo">1141</span>      this.rpcServices.stop();<a name="line.1141"></a>
+<span class="sourceLineNo">1142</span>    }<a name="line.1142"></a>
+<span class="sourceLineNo">1143</span><a name="line.1143"></a>
+<span class="sourceLineNo">1144</span>    try {<a name="line.1144"></a>
+<span class="sourceLineNo">1145</span>      deleteMyEphemeralNode();<a name="line.1145"></a>
+<span class="sourceLineNo">1146</span>    } catch (KeeperException.NoNodeException nn) {<a name="line.1146"></a>
+<span class="sourceLineNo">1147</span>    } catch (KeeperException e) {<a name="line.1147"></a>
+<span class="sourceLineNo">1148</span>      LOG.warn("Failed deleting my ephemeral node", e);<a name="line.1148"></a>
+<span class="sourceLineNo">1149</span>    }<a name="line.1149"></a>
+<span class="sourceLineNo">1150</span>    // We may have failed to delete the znode at the previous step, but<a name="line.1150"></a>
+<span class="sourceLineNo">1151</span>    //  we delete the file anyway: a second attempt to delete the znode is likely to fail again.<a name="line.1151"></a>
+<span class="sourceLineNo">1152</span>    ZNodeClearer.deleteMyEphemeralNodeOnDisk();<a name="line.1152"></a>
+<span class="sourceLineNo">1153</span><a name="line.1153"></a>
+<span class="sourceLineNo">1154</span>    if (this.zooKeeper != null) {<a name="line.1154"></a>
+<span class="sourceLineNo">1155</span>      this.zooKeeper.close();<a name="line.1155"></a>
+<span class="sourceLineNo">1156</span>    }<a name="line.1156"></a>
+<span class="sourceLineNo">1157</span>    this.shutDown = true;<a name="line.1157"></a>
+<span class="sourceLineNo">1158</span>    LOG.info("Exiting; stopping=" + this.serverName + "; zookeeper connection closed.");<a name="line.1158"></a>
+<span class="sourceLineNo">1159</span>  }<a name="line.1159"></a>
+<span class="sourceLineNo">1160</span><a name="line.1160"></a>
+<span class="sourceLineNo">1161</span>  private boolean containsMetaTableRegions() {<a name="line.1161"></a>
+<span class="sourceLineNo">1162</span>    return onlineRegions.containsKey(RegionInfoBuilder.FIRST_META_REGIONINFO.getEncodedName());<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>  private boolean areAllUserRegionsOffline() {<a name="line.1165"></a>
+<span class="sourceLineNo">1166</span>    if (getNumberOfOnlineRegions() &gt; 2) return false;<a name="line.1166"></a>
+<span class="sourceLineNo">1167</span>    boolean allUserRegionsOffline = true;<a name="line.1167"></a>
+<span class="sourceLineNo">1168</span>    for (Map.Entry&lt;String, HRegion&gt; e: this.onlineRegions.entrySet()) {<a name="line.1168"></a>
+<span class="sourceLineNo">1169</span>      if (!e.getValue().getRegionInfo().isMetaRegion()) {<a name="line.1169"></a>
+<span class="sourceLineNo">1170</span>        allUserRegionsOffline = false;<a name="line.1170"></a>
+<span class="sourceLineNo">1171</span>        break;<a name="line.1171"></a>
+<span class="sourceLineNo">1172</span>      }<a name="line.1172"></a>
+<span class="sourceLineNo">1173</span>    }<a name="line.1173"></a>
+<span class="sourceLineNo">1174</span>    return allUserRegionsOffline;<a name="line.1174"></a>
+<span class="sourceLineNo">1175</span>  }<a name="line.1175"></a>
+<span class="sourceLineNo">1176</span><a name="line.1176"></a>
+<span class="sourceLineNo">1177</span>  /**<a name="line.1177"></a>
+<span class="sourceLineNo">1178</span>   * @return Current write count for all online regions.<a name="line.1178"></a>
+<span class="sourceLineNo">1179</span>   */<a name="line.1179"></a>
+<span class="sourceLineNo">1180</span>  private long getWriteRequestCount() {<a name="line.1180"></a>
+<span class="sourceLineNo">1181</span>    long writeCount = 0;<a name="line.1181"></a>
+<span class="sourceLineNo">1182</span>    for (Map.Entry&lt;String, HRegion&gt; e: this.onlineRegions.entrySet()) {<a name="line.1182"></a>
+<span class="sourceLineNo">1183</span>      writeCount += e.getValue().getWriteRequestsCount();<a name="line.1183"></a>
+<span class="sourceLineNo">1184</span>    }<a name="line.1184"></a>
+<span class="sourceLineNo">1185</span>    return writeCount;<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>  @VisibleForTesting<a name="line.1188"></a>
+<span class="sourceLineNo">1189</span>  protected void tryRegionServerReport(long reportStartTime, long reportEndTime)<a name="line.1189"></a>
+<span class="sourceLineNo">1190</span>      throws IOException {<a name="line.1190"></a>
+<span class="sourceLineNo">1191</span>    RegionServerStatusService.BlockingInterface rss = rssStub;<a name="line.1191"></a>
+<span class="sourceLineNo">1192</span>    if (rss == null) {<a name="line.1192"></a>
+<span class="sourceLineNo">1193</span>      // the current server could be stopping.<a name="line.1193"></a>
+<span class="sourceLineNo">1194</span>      return;<a name="line.1194"></a>
+<span class="sourceLineNo">1195</span>    }<a name="line.1195"></a>
+<span class="sourceLineNo">1196</span>    ClusterStatusProtos.ServerLoad sl = buildServerLoad(reportStartTime, reportEndTime);<a name="line.1196"></a>
+<span class="sourceLineNo">1197</span>    try {<a name="line.1197"></a>
+<span class="sourceLineNo">1198</span>      RegionServerReportRequest.Builder request = RegionServerReportRequest.newBuilder();<a name="line.1198"></a>
+<span class="sourceLineNo">1199</span>      request.setServer(ProtobufUtil.toServerName(this.serverName));<a name="line.1199"></a>
+<span class="sourceLineNo">1200</span>      request.setLoad(sl);<a name="line.1200"></a>
+<span class="sourceLineNo">1201</span>      rss.regionServerReport(null, request.build());<a name="line.1201"></a>
+<span class="sourceLineNo">1202</span>    } catch (ServiceException se) {<a name="line.1202"></a>
+<span class="sourceLineNo">1203</span>      IOException ioe = ProtobufUtil.getRemoteException(se);<a name="line.1203"></a>
+<span class="sourceLineNo">1204</span>      if (ioe instanceof YouAreDeadException) {<a name="line.1204"></a>
+<span class="sourceLineNo">1205</span>        // This will be caught and handled as a fatal error in run()<a name="line.1205"></a>
+<span class="sourceLineNo">1206</span>        throw ioe;<a name="line.1206"></a>
+<span class="sourceLineNo">1207</span>      }<a name="line.1207"></a>
+<span class="sourceLineNo">1208</span>      if (rssStub == rss) {<a name="line.1208"></a>
+<span class="sourceLineNo">1209</span>        rssStub = null;<a name="line.1209"></a>
+<span class="sourceLineNo">1210</span>      }<a name="line.1210"></a>
+<span class="sourceLineNo">1211</span>      // Couldn't connect to the master, get location from zk and reconnect<a name="line.1211"></a>
+<span class="sourceLineNo">1212</span>      // Method blocks until new master is found or we are stopped<a name="line.1212"></a>
+<span class="sourceLineNo">1213</span>      createRegionServerStatusStub(true);<a name="line.1213"></a>
+<span class="sourceLineNo">1214</span>    }<a name="line.1214"></a>
+<span class="sourceLineNo">1215</span>  }<a name="line.1215"></a>
+<span class="sourceLineNo">1216</span><a name="line.1216"></a>
+<span class="sourceLineNo">1217</span>  /**<a name="line.1217"></a>
+<span class="sourceLineNo">1218</span>   * Reports the given map of Regions and their size on the filesystem to the active Master.<a name="line.1218"></a>
+<span class="sourceLineNo">1219</span>   *<a name="line.1219"></a>
+<span class="sourceLineNo">1220</span>   * @param regionSizeStore The store containing region sizes<a name="line.1220"></a>
+<span class="sourceLineNo">1221</span>   * @return false if FileSystemUtilizationChore should pause reporting to master. true otherwise<a name="line.1221"></a>
+<span class="sourceLineNo">1222</span>   */<a name="line.1222"></a>
+<span class="sourceLineNo">1223</span>  public boolean reportRegionSizesForQuotas(RegionSizeStore regionSizeStore) {<a name="line.1223"></a>
+<span class="sourceLineNo">1224</span>    RegionServerStatusService.BlockingInterface rss = rssStub;<a name="line.1224"></a>
+<span class="sourceLineNo">1225</span>    if (rss == null) {<a name="line.1225"></a>
+<span class="sourceLineNo">1226</span>      // the current server could be stopping.<a name="line.1226"></a>
+<span class="sourceLineNo">1227</span>      LOG.trace("Skipping Region size report to HMaster as stub is null");<a name="line.1227"></a>
+<span class="sourceLineNo">1228</span>      return true;<a name="line.1228"></a>
+<span class="sourceLineNo">1229</span>    }<a name="line.1229"></a>
+<span class="sourceLineNo">1230</span>    try {<a name="line.1230"></a>
+<span class="sourceLineNo">1231</span>      buildReportAndSend(rss, regionSizeStore);<a name="line.1231"></a>
+<span class="sourceLineNo">1232</span>    } catch (ServiceException se) {<a name="line.1232"></a>
+<spa

<TRUNCATED>

[39/46] hbase-site git commit: Published site at 05d22ed960204183fbd9bd16f1dbca6410ccde76.

Posted by gi...@apache.org.
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/3649682c/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 a3e902f..4466185 100644
--- a/devapidocs/org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.html
+++ b/devapidocs/org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.html
@@ -190,53 +190,53 @@ implements <a href="../../../../../../org/apache/hadoop/hbase/master/LoadBalance
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.html#LOG">LOG</a></span></code>&nbsp;</td>
 </tr>
 <tr class="rowColor">
+<td class="colFirst"><code>protected boolean</code></td>
+<td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.html#maintenanceMode">maintenanceMode</a></span></code>&nbsp;</td>
+</tr>
+<tr class="altColor">
 <td class="colFirst"><code>protected <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#masterServerName">masterServerName</a></span></code>&nbsp;</td>
 </tr>
-<tr class="altColor">
+<tr class="rowColor">
 <td class="colFirst"><code>protected <a href="../../../../../../org/apache/hadoop/hbase/master/balancer/MetricsBalancer.html" title="class in org.apache.hadoop.hbase.master.balancer">MetricsBalancer</a></code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.html#metricsBalancer">metricsBalancer</a></span></code>&nbsp;</td>
 </tr>
-<tr class="rowColor">
+<tr class="altColor">
 <td class="colFirst"><code>protected static int</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.html#MIN_SERVER_BALANCE">MIN_SERVER_BALANCE</a></span></code>&nbsp;</td>
 </tr>
-<tr class="altColor">
+<tr class="rowColor">
 <td class="colFirst"><code>protected boolean</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.html#onlySystemTablesOnMaster">onlySystemTablesOnMaster</a></span></code>&nbsp;</td>
 </tr>
-<tr class="rowColor">
+<tr class="altColor">
 <td class="colFirst"><code>protected float</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.html#overallSlop">overallSlop</a></span></code>&nbsp;</td>
 </tr>
-<tr class="altColor">
+<tr class="rowColor">
 <td class="colFirst"><code>protected <a href="../../../../../../org/apache/hadoop/hbase/master/RackManager.html" title="class in org.apache.hadoop.hbase.master">RackManager</a></code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.html#rackManager">rackManager</a></span></code>&nbsp;</td>
 </tr>
-<tr class="rowColor">
+<tr class="altColor">
 <td class="colFirst"><code>private static <a href="https://docs.oracle.com/javase/8/docs/api/java/util/Random.html?is-external=true" title="class or interface in java.util">Random</a></code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.html#RANDOM">RANDOM</a></span></code>&nbsp;</td>
 </tr>
-<tr class="altColor">
+<tr class="rowColor">
 <td class="colFirst"><code>protected <a href="../../../../../../org/apache/hadoop/hbase/master/balancer/RegionLocationFinder.html" title="class in org.apache.hadoop.hbase.master.balancer">RegionLocationFinder</a></code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.html#regionFinder">regionFinder</a></span></code>&nbsp;</td>
 </tr>
-<tr class="rowColor">
+<tr class="altColor">
 <td class="colFirst"><code>protected <a href="../../../../../../org/apache/hadoop/hbase/master/MasterServices.html" title="interface in org.apache.hadoop.hbase.master">MasterServices</a></code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.html#services">services</a></span></code>&nbsp;</td>
 </tr>
-<tr class="altColor">
+<tr class="rowColor">
 <td class="colFirst"><code>protected float</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.html#slop">slop</a></span></code>&nbsp;</td>
 </tr>
-<tr class="rowColor">
+<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/balancer/BaseLoadBalancer.html#stopped">stopped</a></span></code>&nbsp;</td>
 </tr>
-<tr class="altColor">
-<td class="colFirst"><code>protected boolean</code></td>
-<td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.html#tablesOnMaster">tablesOnMaster</a></span></code>&nbsp;</td>
-</tr>
 <tr class="rowColor">
 <td class="colFirst"><code>protected boolean</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.html#useRegionFinder">useRegionFinder</a></span></code>&nbsp;</td>
@@ -478,7 +478,7 @@ implements <a href="../../../../../../org/apache/hadoop/hbase/master/LoadBalance
 <!--   -->
 </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#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></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#isMasterCanHostUserRegions-org.apache.hadoop.conf.Configuration-">isMasterCanHostUserRegions</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></code></li>
 </ul>
 </li>
 </ul>
@@ -642,22 +642,22 @@ implements <a href="../../../../../../org/apache/hadoop/hbase/master/LoadBalance
 <pre>protected&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/master/MasterServices.html" title="interface in org.apache.hadoop.hbase.master">MasterServices</a> <a href="../../../../../../src-html/org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.html#line.1014">services</a></pre>
 </li>
 </ul>
-<a name="tablesOnMaster">
+<a name="onlySystemTablesOnMaster">
 <!--   -->
 </a>
 <ul class="blockList">
 <li class="blockList">
-<h4>tablesOnMaster</h4>
-<pre>protected&nbsp;boolean <a href="../../../../../../src-html/org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.html#line.1015">tablesOnMaster</a></pre>
+<h4>onlySystemTablesOnMaster</h4>
+<pre>protected&nbsp;boolean <a href="../../../../../../src-html/org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.html#line.1015">onlySystemTablesOnMaster</a></pre>
 </li>
 </ul>
-<a name="onlySystemTablesOnMaster">
+<a name="maintenanceMode">
 <!--   -->
 </a>
 <ul class="blockListLast">
 <li class="blockList">
-<h4>onlySystemTablesOnMaster</h4>
-<pre>protected&nbsp;boolean <a href="../../../../../../src-html/org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.html#line.1016">onlySystemTablesOnMaster</a></pre>
+<h4>maintenanceMode</h4>
+<pre>protected&nbsp;boolean <a href="../../../../../../src-html/org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.html#line.1016">maintenanceMode</a></pre>
 </li>
 </ul>
 </li>
@@ -725,7 +725,7 @@ implements <a href="../../../../../../org/apache/hadoop/hbase/master/LoadBalance
 <ul class="blockList">
 <li class="blockList">
 <h4>setSlop</h4>
-<pre>protected&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.html#line.1044">setSlop</a>(org.apache.hadoop.conf.Configuration&nbsp;conf)</pre>
+<pre>protected&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.html#line.1039">setSlop</a>(org.apache.hadoop.conf.Configuration&nbsp;conf)</pre>
 </li>
 </ul>
 <a name="shouldBeOnMaster-org.apache.hadoop.hbase.client.RegionInfo-">
@@ -734,7 +734,7 @@ implements <a href="../../../../../../org/apache/hadoop/hbase/master/LoadBalance
 <ul class="blockList">
 <li class="blockList">
 <h4>shouldBeOnMaster</h4>
-<pre>public&nbsp;boolean&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.html#line.1053">shouldBeOnMaster</a>(<a href="../../../../../../org/apache/hadoop/hbase/client/RegionInfo.html" title="interface in org.apache.hadoop.hbase.client">RegionInfo</a>&nbsp;region)</pre>
+<pre>public&nbsp;boolean&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.html#line.1048">shouldBeOnMaster</a>(<a href="../../../../../../org/apache/hadoop/hbase/client/RegionInfo.html" title="interface in org.apache.hadoop.hbase.client">RegionInfo</a>&nbsp;region)</pre>
 <div class="block">Check if a region belongs to some system table.
  If so, the primary replica may be expected to be put on the master regionserver.</div>
 </li>
@@ -745,7 +745,7 @@ implements <a href="../../../../../../org/apache/hadoop/hbase/master/LoadBalance
 <ul class="blockList">
 <li class="blockList">
 <h4>balanceMasterRegions</h4>
-<pre>protected&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/util/List.html?is-external=true" title="class or interface in java.util">List</a>&lt;<a href="../../../../../../org/apache/hadoop/hbase/master/RegionPlan.html" title="class in org.apache.hadoop.hbase.master">RegionPlan</a>&gt;&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.html#line.1060">balanceMasterRegions</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;&n
 bsp;clusterMap)</pre>
+<pre>protected&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/util/List.html?is-external=true" title="class or interface in java.util">List</a>&lt;<a href="../../../../../../org/apache/hadoop/hbase/master/RegionPlan.html" title="class in org.apache.hadoop.hbase.master">RegionPlan</a>&gt;&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.html#line.1056">balanceMasterRegions</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;&n
 bsp;clusterMap)</pre>
 <div class="block">Balance the regions that should be on master regionserver.</div>
 </li>
 </ul>
@@ -755,7 +755,7 @@ implements <a href="../../../../../../org/apache/hadoop/hbase/master/LoadBalance
 <ul class="blockList">
 <li class="blockList">
 <h4>assignMasterSystemRegions</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.1109">assignMasterSystemRegions</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.client"
 >RegionInfo</a>&gt;&nbsp;regions,
+<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.1105">assignMasterSystemRegions</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.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)</pre>
 <div class="block">If master is configured to carry system tables only, in here is
  where we figure what to assign it.</div>
@@ -767,7 +767,7 @@ implements <a href="../../../../../../org/apache/hadoop/hbase/master/LoadBalance
 <ul class="blockList">
 <li class="blockList">
 <h4>getConf</h4>
-<pre>public&nbsp;org.apache.hadoop.conf.Configuration&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.html#line.1129">getConf</a>()</pre>
+<pre>public&nbsp;org.apache.hadoop.conf.Configuration&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.html#line.1125">getConf</a>()</pre>
 <dl>
 <dt><span class="overrideSpecifyLabel">Specified by:</span></dt>
 <dd><code>getConf</code>&nbsp;in interface&nbsp;<code>org.apache.hadoop.conf.Configurable</code></dd>
@@ -780,7 +780,7 @@ implements <a href="../../../../../../org/apache/hadoop/hbase/master/LoadBalance
 <ul class="blockList">
 <li class="blockList">
 <h4>setClusterMetrics</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.html#line.1134">setClusterMetrics</a>(<a href="../../../../../../org/apache/hadoop/hbase/ClusterMetrics.html" title="interface in org.apache.hadoop.hbase">ClusterMetrics</a>&nbsp;st)</pre>
+<pre>public&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.html#line.1130">setClusterMetrics</a>(<a href="../../../../../../org/apache/hadoop/hbase/ClusterMetrics.html" title="interface in org.apache.hadoop.hbase">ClusterMetrics</a>&nbsp;st)</pre>
 <div class="block"><span class="descfrmTypeLabel">Description copied from interface:&nbsp;<code><a href="../../../../../../org/apache/hadoop/hbase/master/LoadBalancer.html#setClusterMetrics-org.apache.hadoop.hbase.ClusterMetrics-">LoadBalancer</a></code></span></div>
 <div class="block">Set the current cluster status.  This allows a LoadBalancer to map host name to a server</div>
 <dl>
@@ -795,7 +795,7 @@ implements <a href="../../../../../../org/apache/hadoop/hbase/master/LoadBalance
 <ul class="blockList">
 <li class="blockList">
 <h4>setClusterLoad</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.html#line.1142">setClusterLoad</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/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;&nbsp;clusterLoad)</pre>
+<pre>public&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.html#line.1138">setClusterLoad</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/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;&nbsp;clusterLoad)</pre>
 <div class="block"><span class="descfrmTypeLabel">Description copied from interface:&nbsp;<code><a href="../../../../../../org/apache/hadoop/hbase/master/LoadBalancer.html#setClusterLoad-java.util.Map-">LoadBalancer</a></code></span></div>
 <div class="block">Pass RegionStates and allow balancer to set the current cluster load.</div>
 <dl>
@@ -810,7 +810,7 @@ implements <a href="../../../../../../org/apache/hadoop/hbase/master/LoadBalance
 <ul class="blockList">
 <li class="blockList">
 <h4>setMasterServices</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.html#line.1147">setMasterServices</a>(<a href="../../../../../../org/apache/hadoop/hbase/master/MasterServices.html" title="interface in org.apache.hadoop.hbase.master">MasterServices</a>&nbsp;masterServices)</pre>
+<pre>public&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.html#line.1143">setMasterServices</a>(<a href="../../../../../../org/apache/hadoop/hbase/master/MasterServices.html" title="interface in org.apache.hadoop.hbase.master">MasterServices</a>&nbsp;masterServices)</pre>
 <div class="block"><span class="descfrmTypeLabel">Description copied from interface:&nbsp;<code><a href="../../../../../../org/apache/hadoop/hbase/master/LoadBalancer.html#setMasterServices-org.apache.hadoop.hbase.master.MasterServices-">LoadBalancer</a></code></span></div>
 <div class="block">Set the master service.</div>
 <dl>
@@ -825,7 +825,7 @@ implements <a href="../../../../../../org/apache/hadoop/hbase/master/LoadBalance
 <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.1156">postMasterStartupInitialize</a>()</pre>
+<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>
@@ -840,7 +840,7 @@ implements <a href="../../../../../../org/apache/hadoop/hbase/master/LoadBalance
 <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.1168">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-">
@@ -849,7 +849,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.1172">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-">
@@ -858,7 +858,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.1209">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>
@@ -876,7 +876,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.1231">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
@@ -909,7 +909,7 @@ implements <a href="../../../../../../org/apache/hadoop/hbase/master/LoadBalance
 <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.1322">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,
+<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.1321">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;hasRegionReplica)</pre>
 </li>
@@ -920,7 +920,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.1345">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.1344">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-">
@@ -929,7 +929,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.1354">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.1353">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>
@@ -951,7 +951,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.1405">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.1404">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
@@ -984,7 +984,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.1538">initialize</a>()
+<pre>public&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.html#line.1537">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>
@@ -1002,7 +1002,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.1542">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.1541">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>
@@ -1018,7 +1018,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.1546">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.1545">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>
@@ -1033,7 +1033,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.1550">isStopped</a>()</pre>
+<pre>public&nbsp;boolean&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.html#line.1549">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>
@@ -1048,7 +1048,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.1555">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.1554">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>
@@ -1066,7 +1066,7 @@ implements <a href="../../../../../../org/apache/hadoop/hbase/master/LoadBalance
 <ul class="blockList">
 <li class="blockList">
 <h4>updateBalancerStatus</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.html#line.1563">updateBalancerStatus</a>(boolean&nbsp;status)</pre>
+<pre>public&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.html#line.1562">updateBalancerStatus</a>(boolean&nbsp;status)</pre>
 <div class="block">Updates the balancer status tag reported to JMX</div>
 <dl>
 <dt><span class="overrideSpecifyLabel">Specified by:</span></dt>
@@ -1080,7 +1080,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.1570">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.1569">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>
@@ -1092,7 +1092,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.1606">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.1605">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,
@@ -1106,7 +1106,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.1636">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.1635">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-">
@@ -1115,7 +1115,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.1646">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.1645">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/3649682c/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 2f25629..637cdce 100644
--- a/devapidocs/org/apache/hadoop/hbase/master/balancer/FavoredStochasticBalancer.html
+++ b/devapidocs/org/apache/hadoop/hbase/master/balancer/FavoredStochasticBalancer.html
@@ -215,7 +215,7 @@ implements <a href="../../../../../../org/apache/hadoop/hbase/favored/FavoredNod
 <!--   -->
 </a>
 <h3>Fields 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#clusterStatus">clusterStatus</a>, <a href="../../../../../../org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.html#config">config</a>, <a href="../../../../../../org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.html#IDLE_SERVER_PREDICATOR">IDLE_SERVER_PREDICATOR</a>, <a href="../../../../../../org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.html#masterServerName">masterServerName</a>, <a href="../../../../../../org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.html#metricsBalancer">metricsBalancer</a>, <a href="../../../../../../org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.html#MIN_SERVER_BALANCE">MIN_SERVER_BALANCE</a>, <a href="../../../../../../org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.html#onlySystemTablesOnMaster">onlySystemTablesOnMaster</a>, <a href="../../../../../../org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.
 html#overallSlop">overallSlop</a>, <a href="../../../../../../org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.html#rackManager">rackManager</a>, <a href="../../../../../../org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.html#regionFinder">regionFinder</a>, <a href="../../../../../../org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.html#services">services</a>, <a href="../../../../../../org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.html#slop">slop</a>, <a href="../../../../../../org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.html#tablesOnMaster">tablesOnMaster</a>, <a href="../../../../../../org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.html#useRegionFinder">useRegionFinder</a></code></li>
+<code><a href="../../../../../../org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.html#clusterStatus">clusterStatus</a>, <a href="../../../../../../org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.html#config">config</a>, <a href="../../../../../../org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.html#IDLE_SERVER_PREDICATOR">IDLE_SERVER_PREDICATOR</a>, <a href="../../../../../../org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.html#maintenanceMode">maintenanceMode</a>, <a href="../../../../../../org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.html#masterServerName">masterServerName</a>, <a href="../../../../../../org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.html#metricsBalancer">metricsBalancer</a>, <a href="../../../../../../org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.html#MIN_SERVER_BALANCE">MIN_SERVER_BALANCE</a>, <a href="../../../../../../org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.html#onlySystemTab
 lesOnMaster">onlySystemTablesOnMaster</a>, <a href="../../../../../../org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.html#overallSlop">overallSlop</a>, <a href="../../../../../../org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.html#rackManager">rackManager</a>, <a href="../../../../../../org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.html#regionFinder">regionFinder</a>, <a href="../../../../../../org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.html#services">services</a>, <a href="../../../../../../org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.html#slop">slop</a>, <a href="../../../../../../org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.html#useRegionFinder">useRegionFinder</a></code></li>
 </ul>
 <ul class="blockList">
 <li class="blockList"><a name="fields.inherited.from.class.org.apache.hadoop.hbase.favored.FavoredNodesPromoter">
@@ -403,7 +403,7 @@ implements <a href="../../../../../../org/apache/hadoop/hbase/favored/FavoredNod
 <!--   -->
 </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#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></code></li>
+<code><a href="../../../../../../org/apache/hadoop/hbase/master/LoadBalancer.html#isMasterCanHostUserRegions-org.apache.hadoop.conf.Configuration-">isMasterCanHostUserRegions</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></code></li>
 </ul>
 </li>
 </ul>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/3649682c/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 b89e864..7829710 100644
--- a/devapidocs/org/apache/hadoop/hbase/master/balancer/SimpleLoadBalancer.html
+++ b/devapidocs/org/apache/hadoop/hbase/master/balancer/SimpleLoadBalancer.html
@@ -209,7 +209,7 @@ extends <a href="../../../../../../org/apache/hadoop/hbase/master/balancer/BaseL
 <!--   -->
 </a>
 <h3>Fields 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#clusterStatus">clusterStatus</a>, <a href="../../../../../../org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.html#config">config</a>, <a href="../../../../../../org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.html#IDLE_SERVER_PREDICATOR">IDLE_SERVER_PREDICATOR</a>, <a href="../../../../../../org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.html#masterServerName">masterServerName</a>, <a href="../../../../../../org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.html#metricsBalancer">metricsBalancer</a>, <a href="../../../../../../org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.html#MIN_SERVER_BALANCE">MIN_SERVER_BALANCE</a>, <a href="../../../../../../org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.html#onlySystemTablesOnMaster">onlySystemTablesOnMaster</a>, <a href="../../../../../../org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.
 html#overallSlop">overallSlop</a>, <a href="../../../../../../org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.html#rackManager">rackManager</a>, <a href="../../../../../../org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.html#regionFinder">regionFinder</a>, <a href="../../../../../../org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.html#services">services</a>, <a href="../../../../../../org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.html#slop">slop</a>, <a href="../../../../../../org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.html#tablesOnMaster">tablesOnMaster</a>, <a href="../../../../../../org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.html#useRegionFinder">useRegionFinder</a></code></li>
+<code><a href="../../../../../../org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.html#clusterStatus">clusterStatus</a>, <a href="../../../../../../org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.html#config">config</a>, <a href="../../../../../../org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.html#IDLE_SERVER_PREDICATOR">IDLE_SERVER_PREDICATOR</a>, <a href="../../../../../../org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.html#maintenanceMode">maintenanceMode</a>, <a href="../../../../../../org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.html#masterServerName">masterServerName</a>, <a href="../../../../../../org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.html#metricsBalancer">metricsBalancer</a>, <a href="../../../../../../org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.html#MIN_SERVER_BALANCE">MIN_SERVER_BALANCE</a>, <a href="../../../../../../org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.html#onlySystemTab
 lesOnMaster">onlySystemTablesOnMaster</a>, <a href="../../../../../../org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.html#overallSlop">overallSlop</a>, <a href="../../../../../../org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.html#rackManager">rackManager</a>, <a href="../../../../../../org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.html#regionFinder">regionFinder</a>, <a href="../../../../../../org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.html#services">services</a>, <a href="../../../../../../org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.html#slop">slop</a>, <a href="../../../../../../org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.html#useRegionFinder">useRegionFinder</a></code></li>
 </ul>
 <ul class="blockList">
 <li class="blockList"><a name="fields.inherited.from.class.org.apache.hadoop.hbase.master.LoadBalancer">
@@ -329,7 +329,7 @@ extends <a href="../../../../../../org/apache/hadoop/hbase/master/balancer/BaseL
 <!--   -->
 </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#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></code></li>
+<code><a href="../../../../../../org/apache/hadoop/hbase/master/LoadBalancer.html#isMasterCanHostUserRegions-org.apache.hadoop.conf.Configuration-">isMasterCanHostUserRegions</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></code></li>
 </ul>
 </li>
 </ul>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/3649682c/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 6ac2a45..c6f653e 100644
--- a/devapidocs/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.html
+++ b/devapidocs/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.html
@@ -466,7 +466,7 @@ extends <a href="../../../../../../org/apache/hadoop/hbase/master/balancer/BaseL
 <!--   -->
 </a>
 <h3>Fields 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#clusterStatus">clusterStatus</a>, <a href="../../../../../../org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.html#config">config</a>, <a href="../../../../../../org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.html#IDLE_SERVER_PREDICATOR">IDLE_SERVER_PREDICATOR</a>, <a href="../../../../../../org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.html#masterServerName">masterServerName</a>, <a href="../../../../../../org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.html#metricsBalancer">metricsBalancer</a>, <a href="../../../../../../org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.html#MIN_SERVER_BALANCE">MIN_SERVER_BALANCE</a>, <a href="../../../../../../org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.html#onlySystemTablesOnMaster">onlySystemTablesOnMaster</a>, <a href="../../../../../../org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.
 html#overallSlop">overallSlop</a>, <a href="../../../../../../org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.html#rackManager">rackManager</a>, <a href="../../../../../../org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.html#regionFinder">regionFinder</a>, <a href="../../../../../../org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.html#services">services</a>, <a href="../../../../../../org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.html#slop">slop</a>, <a href="../../../../../../org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.html#tablesOnMaster">tablesOnMaster</a>, <a href="../../../../../../org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.html#useRegionFinder">useRegionFinder</a></code></li>
+<code><a href="../../../../../../org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.html#clusterStatus">clusterStatus</a>, <a href="../../../../../../org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.html#config">config</a>, <a href="../../../../../../org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.html#IDLE_SERVER_PREDICATOR">IDLE_SERVER_PREDICATOR</a>, <a href="../../../../../../org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.html#maintenanceMode">maintenanceMode</a>, <a href="../../../../../../org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.html#masterServerName">masterServerName</a>, <a href="../../../../../../org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.html#metricsBalancer">metricsBalancer</a>, <a href="../../../../../../org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.html#MIN_SERVER_BALANCE">MIN_SERVER_BALANCE</a>, <a href="../../../../../../org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.html#onlySystemTab
 lesOnMaster">onlySystemTablesOnMaster</a>, <a href="../../../../../../org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.html#overallSlop">overallSlop</a>, <a href="../../../../../../org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.html#rackManager">rackManager</a>, <a href="../../../../../../org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.html#regionFinder">regionFinder</a>, <a href="../../../../../../org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.html#services">services</a>, <a href="../../../../../../org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.html#slop">slop</a>, <a href="../../../../../../org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.html#useRegionFinder">useRegionFinder</a></code></li>
 </ul>
 <ul class="blockList">
 <li class="blockList"><a name="fields.inherited.from.class.org.apache.hadoop.hbase.master.LoadBalancer">
@@ -649,7 +649,7 @@ extends <a href="../../../../../../org/apache/hadoop/hbase/master/balancer/BaseL
 <!--   -->
 </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#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></code></li>
+<code><a href="../../../../../../org/apache/hadoop/hbase/master/LoadBalancer.html#isMasterCanHostUserRegions-org.apache.hadoop.conf.Configuration-">isMasterCanHostUserRegions</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></code></li>
 </ul>
 </li>
 </ul>

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

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

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

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/3649682c/devapidocs/org/apache/hadoop/hbase/procedure2/class-use/Procedure.html
----------------------------------------------------------------------
diff --git a/devapidocs/org/apache/hadoop/hbase/procedure2/class-use/Procedure.html b/devapidocs/org/apache/hadoop/hbase/procedure2/class-use/Procedure.html
index dfd7844..f78ea8b 100644
--- a/devapidocs/org/apache/hadoop/hbase/procedure2/class-use/Procedure.html
+++ b/devapidocs/org/apache/hadoop/hbase/procedure2/class-use/Procedure.html
@@ -123,6 +123,19 @@
 <!--   -->
 </a>
 <h3>Uses of <a href="../../../../../../org/apache/hadoop/hbase/procedure2/Procedure.html" title="class in org.apache.hadoop.hbase.procedure2">Procedure</a> in <a href="../../../../../../org/apache/hadoop/hbase/master/package-summary.html">org.apache.hadoop.hbase.master</a></h3>
+<table class="useSummary" border="0" cellpadding="3" cellspacing="0" summary="Use table, listing fields, and an explanation">
+<caption><span>Fields in <a href="../../../../../../org/apache/hadoop/hbase/master/package-summary.html">org.apache.hadoop.hbase.master</a> with type parameters of type <a href="../../../../../../org/apache/hadoop/hbase/procedure2/Procedure.html" title="class in org.apache.hadoop.hbase.procedure2">Procedure</a></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>
+<tbody>
+<tr class="altColor">
+<td class="colFirst"><code>private static org.apache.hbase.thirdparty.com.google.common.collect.ImmutableSet&lt;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Class.html?is-external=true" title="class or interface in java.lang">Class</a>&lt;? extends <a href="../../../../../../org/apache/hadoop/hbase/procedure2/Procedure.html" title="class in org.apache.hadoop.hbase.procedure2">Procedure</a>&gt;&gt;</code></td>
+<td class="colLast"><span class="typeNameLabel">HMaster.</span><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/master/HMaster.html#UNSUPPORTED_PROCEDURES">UNSUPPORTED_PROCEDURES</a></span></code>&nbsp;</td>
+</tr>
+</tbody>
+</table>
 <table class="useSummary" border="0" cellpadding="3" cellspacing="0" summary="Use table, listing methods, and an explanation">
 <caption><span>Methods in <a href="../../../../../../org/apache/hadoop/hbase/master/package-summary.html">org.apache.hadoop.hbase.master</a> that return types with arguments of type <a href="../../../../../../org/apache/hadoop/hbase/procedure2/Procedure.html" title="class in org.apache.hadoop.hbase.procedure2">Procedure</a></span><span class="tabEnd">&nbsp;</span></caption>
 <tr>

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

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/3649682c/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 5ab8387..9e9e5c0 100644
--- a/devapidocs/org/apache/hadoop/hbase/quotas/package-tree.html
+++ b/devapidocs/org/apache/hadoop/hbase/quotas/package-tree.html
@@ -229,11 +229,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.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/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/QuotaScope.html" title="enum in org.apache.hadoop.hbase.quotas"><span class="typeNameLink">QuotaScope</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.quotas.<a href="../../../../../org/apache/hadoop/hbase/quotas/ThrottleType.html" title="enum in org.apache.hadoop.hbase.quotas"><span class="typeNameLink">ThrottleType</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.quotas.<a href="../../../../../org/apache/hadoop/hbase/quotas/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/QuotaType.html" title="enum in org.apache.hadoop.hbase.quotas"><span class="typeNameLink">QuotaType</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.quotas.<a href="../../../../../org/apache/hadoop/hbase/quotas/SpaceViolationPolicy.html" title="enum in org.apache.hadoop.hbase.quotas"><span class="typeNameLink">SpaceViolationPolicy</span></a></li>
 </ul>


[25/46] hbase-site git commit: Published site at 05d22ed960204183fbd9bd16f1dbca6410ccde76.

Posted by gi...@apache.org.
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/3649682c/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 c307d41..d82bfd8 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
@@ -1020,8 +1020,8 @@
 <span class="sourceLineNo">1012</span>  protected ClusterMetrics clusterStatus = null;<a name="line.1012"></a>
 <span class="sourceLineNo">1013</span>  protected ServerName masterServerName;<a name="line.1013"></a>
 <span class="sourceLineNo">1014</span>  protected MasterServices services;<a name="line.1014"></a>
-<span class="sourceLineNo">1015</span>  protected boolean tablesOnMaster;<a name="line.1015"></a>
-<span class="sourceLineNo">1016</span>  protected boolean onlySystemTablesOnMaster;<a name="line.1016"></a>
+<span class="sourceLineNo">1015</span>  protected boolean onlySystemTablesOnMaster;<a name="line.1015"></a>
+<span class="sourceLineNo">1016</span>  protected boolean maintenanceMode;<a name="line.1016"></a>
 <span class="sourceLineNo">1017</span><a name="line.1017"></a>
 <span class="sourceLineNo">1018</span>  @Override<a name="line.1018"></a>
 <span class="sourceLineNo">1019</span>  public void setConf(Configuration conf) {<a name="line.1019"></a>
@@ -1033,627 +1033,626 @@
 <span class="sourceLineNo">1025</span>    if (overallSlop &lt; 0) overallSlop = 0;<a name="line.1025"></a>
 <span class="sourceLineNo">1026</span>    else if (overallSlop &gt; 1) overallSlop = 1;<a name="line.1026"></a>
 <span class="sourceLineNo">1027</span><a name="line.1027"></a>
-<span class="sourceLineNo">1028</span>    this.tablesOnMaster = LoadBalancer.isTablesOnMaster(this.config);<a name="line.1028"></a>
-<span class="sourceLineNo">1029</span>    this.onlySystemTablesOnMaster = LoadBalancer.isSystemTablesOnlyOnMaster(this.config);<a name="line.1029"></a>
-<span class="sourceLineNo">1030</span>    // If system tables on master, implies tablesOnMaster = true.<a name="line.1030"></a>
-<span class="sourceLineNo">1031</span>    if (this.onlySystemTablesOnMaster &amp;&amp; !this.tablesOnMaster) {<a name="line.1031"></a>
-<span class="sourceLineNo">1032</span>      LOG.warn("Set " + TABLES_ON_MASTER + "=true because " + SYSTEM_TABLES_ON_MASTER + "=true");<a name="line.1032"></a>
-<span class="sourceLineNo">1033</span>      this.tablesOnMaster = true;<a name="line.1033"></a>
-<span class="sourceLineNo">1034</span>    }<a name="line.1034"></a>
-<span class="sourceLineNo">1035</span>    this.rackManager = new RackManager(getConf());<a name="line.1035"></a>
-<span class="sourceLineNo">1036</span>    if (useRegionFinder) {<a name="line.1036"></a>
-<span class="sourceLineNo">1037</span>      regionFinder.setConf(conf);<a name="line.1037"></a>
-<span class="sourceLineNo">1038</span>    }<a name="line.1038"></a>
-<span class="sourceLineNo">1039</span>    // Print out base configs. Don't print overallSlop since it for simple balancer exclusively.<a name="line.1039"></a>
-<span class="sourceLineNo">1040</span>    LOG.info("slop=" + this.slop + ", tablesOnMaster=" + this.tablesOnMaster +<a name="line.1040"></a>
-<span class="sourceLineNo">1041</span>      ", systemTablesOnMaster=" + this.onlySystemTablesOnMaster);<a name="line.1041"></a>
+<span class="sourceLineNo">1028</span>    this.onlySystemTablesOnMaster = LoadBalancer.isSystemTablesOnlyOnMaster(this.config);<a name="line.1028"></a>
+<span class="sourceLineNo">1029</span><a name="line.1029"></a>
+<span class="sourceLineNo">1030</span>    this.rackManager = new RackManager(getConf());<a name="line.1030"></a>
+<span class="sourceLineNo">1031</span>    if (useRegionFinder) {<a name="line.1031"></a>
+<span class="sourceLineNo">1032</span>      regionFinder.setConf(conf);<a name="line.1032"></a>
+<span class="sourceLineNo">1033</span>    }<a name="line.1033"></a>
+<span class="sourceLineNo">1034</span>    // Print out base configs. Don't print overallSlop since it for simple balancer exclusively.<a name="line.1034"></a>
+<span class="sourceLineNo">1035</span>    LOG.info("slop={}, systemTablesOnMaster={}",<a name="line.1035"></a>
+<span class="sourceLineNo">1036</span>        this.slop, this.onlySystemTablesOnMaster);<a name="line.1036"></a>
+<span class="sourceLineNo">1037</span>  }<a name="line.1037"></a>
+<span class="sourceLineNo">1038</span><a name="line.1038"></a>
+<span class="sourceLineNo">1039</span>  protected void setSlop(Configuration conf) {<a name="line.1039"></a>
+<span class="sourceLineNo">1040</span>    this.slop = conf.getFloat("hbase.regions.slop", (float) 0.2);<a name="line.1040"></a>
+<span class="sourceLineNo">1041</span>    this.overallSlop = conf.getFloat("hbase.regions.overallSlop", slop);<a name="line.1041"></a>
 <span class="sourceLineNo">1042</span>  }<a name="line.1042"></a>
 <span class="sourceLineNo">1043</span><a name="line.1043"></a>
-<span class="sourceLineNo">1044</span>  protected void setSlop(Configuration conf) {<a name="line.1044"></a>
-<span class="sourceLineNo">1045</span>    this.slop = conf.getFloat("hbase.regions.slop", (float) 0.2);<a name="line.1045"></a>
-<span class="sourceLineNo">1046</span>    this.overallSlop = conf.getFloat("hbase.regions.overallSlop", slop);<a name="line.1046"></a>
-<span class="sourceLineNo">1047</span>  }<a name="line.1047"></a>
-<span class="sourceLineNo">1048</span><a name="line.1048"></a>
-<span class="sourceLineNo">1049</span>  /**<a name="line.1049"></a>
-<span class="sourceLineNo">1050</span>   * Check if a region belongs to some system table.<a name="line.1050"></a>
-<span class="sourceLineNo">1051</span>   * If so, the primary replica may be expected to be put on the master regionserver.<a name="line.1051"></a>
-<span class="sourceLineNo">1052</span>   */<a name="line.1052"></a>
-<span class="sourceLineNo">1053</span>  public boolean shouldBeOnMaster(RegionInfo region) {<a name="line.1053"></a>
-<span class="sourceLineNo">1054</span>    return this.onlySystemTablesOnMaster &amp;&amp; region.getTable().isSystemTable();<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>   * Balance the regions that should be on master regionserver.<a name="line.1058"></a>
-<span class="sourceLineNo">1059</span>   */<a name="line.1059"></a>
-<span class="sourceLineNo">1060</span>  protected List&lt;RegionPlan&gt; balanceMasterRegions(Map&lt;ServerName, List&lt;RegionInfo&gt;&gt; clusterMap) {<a name="line.1060"></a>
-<span class="sourceLineNo">1061</span>    if (masterServerName == null || clusterMap == null || clusterMap.size() &lt;= 1) return null;<a name="line.1061"></a>
-<span class="sourceLineNo">1062</span>    List&lt;RegionPlan&gt; plans = null;<a name="line.1062"></a>
-<span class="sourceLineNo">1063</span>    List&lt;RegionInfo&gt; regions = clusterMap.get(masterServerName);<a name="line.1063"></a>
-<span class="sourceLineNo">1064</span>    if (regions != null) {<a name="line.1064"></a>
-<span class="sourceLineNo">1065</span>      Iterator&lt;ServerName&gt; keyIt = null;<a name="line.1065"></a>
-<span class="sourceLineNo">1066</span>      for (RegionInfo region: regions) {<a name="line.1066"></a>
-<span class="sourceLineNo">1067</span>        if (shouldBeOnMaster(region)) continue;<a name="line.1067"></a>
-<span class="sourceLineNo">1068</span><a name="line.1068"></a>
-<span class="sourceLineNo">1069</span>        // Find a non-master regionserver to host the region<a name="line.1069"></a>
-<span class="sourceLineNo">1070</span>        if (keyIt == null || !keyIt.hasNext()) {<a name="line.1070"></a>
-<span class="sourceLineNo">1071</span>          keyIt = clusterMap.keySet().iterator();<a name="line.1071"></a>
-<span class="sourceLineNo">1072</span>        }<a name="line.1072"></a>
-<span class="sourceLineNo">1073</span>        ServerName dest = keyIt.next();<a name="line.1073"></a>
-<span class="sourceLineNo">1074</span>        if (masterServerName.equals(dest)) {<a name="line.1074"></a>
-<span class="sourceLineNo">1075</span>          if (!keyIt.hasNext()) {<a name="line.1075"></a>
-<span class="sourceLineNo">1076</span>            keyIt = clusterMap.keySet().iterator();<a name="line.1076"></a>
-<span class="sourceLineNo">1077</span>          }<a name="line.1077"></a>
-<span class="sourceLineNo">1078</span>          dest = keyIt.next();<a name="line.1078"></a>
-<span class="sourceLineNo">1079</span>        }<a name="line.1079"></a>
-<span class="sourceLineNo">1080</span><a name="line.1080"></a>
-<span class="sourceLineNo">1081</span>        // Move this region away from the master regionserver<a name="line.1081"></a>
-<span class="sourceLineNo">1082</span>        RegionPlan plan = new RegionPlan(region, masterServerName, dest);<a name="line.1082"></a>
-<span class="sourceLineNo">1083</span>        if (plans == null) {<a name="line.1083"></a>
-<span class="sourceLineNo">1084</span>          plans = new ArrayList&lt;&gt;();<a name="line.1084"></a>
-<span class="sourceLineNo">1085</span>        }<a name="line.1085"></a>
-<span class="sourceLineNo">1086</span>        plans.add(plan);<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>    for (Map.Entry&lt;ServerName, List&lt;RegionInfo&gt;&gt; server: clusterMap.entrySet()) {<a name="line.1089"></a>
-<span class="sourceLineNo">1090</span>      if (masterServerName.equals(server.getKey())) continue;<a name="line.1090"></a>
-<span class="sourceLineNo">1091</span>      for (RegionInfo region: server.getValue()) {<a name="line.1091"></a>
-<span class="sourceLineNo">1092</span>        if (!shouldBeOnMaster(region)) continue;<a name="line.1092"></a>
-<span class="sourceLineNo">1093</span><a name="line.1093"></a>
-<span class="sourceLineNo">1094</span>        // Move this region to the master regionserver<a name="line.1094"></a>
-<span class="sourceLineNo">1095</span>        RegionPlan plan = new RegionPlan(region, server.getKey(), masterServerName);<a name="line.1095"></a>
-<span class="sourceLineNo">1096</span>        if (plans == null) {<a name="line.1096"></a>
-<span class="sourceLineNo">1097</span>          plans = new ArrayList&lt;&gt;();<a name="line.1097"></a>
-<span class="sourceLineNo">1098</span>        }<a name="line.1098"></a>
-<span class="sourceLineNo">1099</span>        plans.add(plan);<a name="line.1099"></a>
-<span class="sourceLineNo">1100</span>      }<a name="line.1100"></a>
-<span class="sourceLineNo">1101</span>    }<a name="line.1101"></a>
-<span class="sourceLineNo">1102</span>    return plans;<a name="line.1102"></a>
-<span class="sourceLineNo">1103</span>  }<a name="line.1103"></a>
-<span class="sourceLineNo">1104</span><a name="line.1104"></a>
-<span class="sourceLineNo">1105</span>  /**<a name="line.1105"></a>
-<span class="sourceLineNo">1106</span>   * If master is configured to carry system tables only, in here is<a name="line.1106"></a>
-<span class="sourceLineNo">1107</span>   * where we figure what to assign it.<a name="line.1107"></a>
-<span class="sourceLineNo">1108</span>   */<a name="line.1108"></a>
-<span class="sourceLineNo">1109</span>  protected Map&lt;ServerName, List&lt;RegionInfo&gt;&gt; assignMasterSystemRegions(<a name="line.1109"></a>
-<span class="sourceLineNo">1110</span>      Collection&lt;RegionInfo&gt; regions, List&lt;ServerName&gt; servers) {<a name="line.1110"></a>
-<span class="sourceLineNo">1111</span>    if (servers == null || regions == null || regions.isEmpty()) {<a name="line.1111"></a>
-<span class="sourceLineNo">1112</span>      return null;<a name="line.1112"></a>
-<span class="sourceLineNo">1113</span>    }<a name="line.1113"></a>
-<span class="sourceLineNo">1114</span>    Map&lt;ServerName, List&lt;RegionInfo&gt;&gt; assignments = new TreeMap&lt;&gt;();<a name="line.1114"></a>
-<span class="sourceLineNo">1115</span>    if (this.onlySystemTablesOnMaster) {<a name="line.1115"></a>
-<span class="sourceLineNo">1116</span>      if (masterServerName != null &amp;&amp; servers.contains(masterServerName)) {<a name="line.1116"></a>
-<span class="sourceLineNo">1117</span>        assignments.put(masterServerName, new ArrayList&lt;&gt;());<a name="line.1117"></a>
-<span class="sourceLineNo">1118</span>        for (RegionInfo region : regions) {<a name="line.1118"></a>
-<span class="sourceLineNo">1119</span>          if (shouldBeOnMaster(region)) {<a name="line.1119"></a>
-<span class="sourceLineNo">1120</span>            assignments.get(masterServerName).add(region);<a name="line.1120"></a>
-<span class="sourceLineNo">1121</span>          }<a name="line.1121"></a>
-<span class="sourceLineNo">1122</span>        }<a name="line.1122"></a>
-<span class="sourceLineNo">1123</span>      }<a name="line.1123"></a>
-<span class="sourceLineNo">1124</span>    }<a name="line.1124"></a>
-<span class="sourceLineNo">1125</span>    return assignments;<a name="line.1125"></a>
-<span class="sourceLineNo">1126</span>  }<a name="line.1126"></a>
-<span class="sourceLineNo">1127</span><a name="line.1127"></a>
-<span class="sourceLineNo">1128</span>  @Override<a name="line.1128"></a>
-<span class="sourceLineNo">1129</span>  public Configuration getConf() {<a name="line.1129"></a>
-<span class="sourceLineNo">1130</span>    return this.config;<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 synchronized void setClusterMetrics(ClusterMetrics st) {<a name="line.1134"></a>
-<span class="sourceLineNo">1135</span>    this.clusterStatus = st;<a name="line.1135"></a>
-<span class="sourceLineNo">1136</span>    if (useRegionFinder) {<a name="line.1136"></a>
-<span class="sourceLineNo">1137</span>      regionFinder.setClusterMetrics(st);<a name="line.1137"></a>
-<span class="sourceLineNo">1138</span>    }<a name="line.1138"></a>
-<span class="sourceLineNo">1139</span>  }<a name="line.1139"></a>
-<span class="sourceLineNo">1140</span><a name="line.1140"></a>
-<span class="sourceLineNo">1141</span>  @Override<a name="line.1141"></a>
-<span class="sourceLineNo">1142</span>  public void setClusterLoad(Map&lt;TableName, Map&lt;ServerName, List&lt;RegionInfo&gt;&gt;&gt; clusterLoad){<a name="line.1142"></a>
-<span class="sourceLineNo">1143</span><a name="line.1143"></a>
-<span class="sourceLineNo">1144</span>  }<a name="line.1144"></a>
-<span class="sourceLineNo">1145</span><a name="line.1145"></a>
-<span class="sourceLineNo">1146</span>  @Override<a name="line.1146"></a>
-<span class="sourceLineNo">1147</span>  public void setMasterServices(MasterServices masterServices) {<a name="line.1147"></a>
-<span class="sourceLineNo">1148</span>    masterServerName = masterServices.getServerName();<a name="line.1148"></a>
-<span class="sourceLineNo">1149</span>    this.services = masterServices;<a name="line.1149"></a>
-<span class="sourceLineNo">1150</span>    if (useRegionFinder) {<a name="line.1150"></a>
-<span class="sourceLineNo">1151</span>      this.regionFinder.setServices(masterServices);<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><a name="line.1154"></a>
-<span class="sourceLineNo">1155</span>  @Override<a name="line.1155"></a>
-<span class="sourceLineNo">1156</span>  public void postMasterStartupInitialize() {<a name="line.1156"></a>
-<span class="sourceLineNo">1157</span>    if (services != null &amp;&amp; regionFinder != null) {<a name="line.1157"></a>
-<span class="sourceLineNo">1158</span>      try {<a name="line.1158"></a>
-<span class="sourceLineNo">1159</span>        Set&lt;RegionInfo&gt; regions =<a name="line.1159"></a>
-<span class="sourceLineNo">1160</span>            services.getAssignmentManager().getRegionStates().getRegionAssignments().keySet();<a name="line.1160"></a>
-<span class="sourceLineNo">1161</span>        regionFinder.refreshAndWait(regions);<a name="line.1161"></a>
-<span class="sourceLineNo">1162</span>      } catch (Exception e) {<a name="line.1162"></a>
-<span class="sourceLineNo">1163</span>        LOG.warn("Refreshing region HDFS Block dist failed with exception, ignoring", e);<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><a name="line.1167"></a>
-<span class="sourceLineNo">1168</span>  public void setRackManager(RackManager rackManager) {<a name="line.1168"></a>
-<span class="sourceLineNo">1169</span>    this.rackManager = rackManager;<a name="line.1169"></a>
-<span class="sourceLineNo">1170</span>  }<a name="line.1170"></a>
-<span class="sourceLineNo">1171</span><a name="line.1171"></a>
-<span class="sourceLineNo">1172</span>  protected boolean needsBalance(Cluster c) {<a name="line.1172"></a>
-<span class="sourceLineNo">1173</span>    ClusterLoadState cs = new ClusterLoadState(c.clusterState);<a name="line.1173"></a>
-<span class="sourceLineNo">1174</span>    if (cs.getNumServers() &lt; MIN_SERVER_BALANCE) {<a name="line.1174"></a>
-<span class="sourceLineNo">1175</span>      if (LOG.isDebugEnabled()) {<a name="line.1175"></a>
-<span class="sourceLineNo">1176</span>        LOG.debug("Not running balancer because only " + cs.getNumServers()<a name="line.1176"></a>
-<span class="sourceLineNo">1177</span>            + " active regionserver(s)");<a name="line.1177"></a>
-<span class="sourceLineNo">1178</span>      }<a name="line.1178"></a>
-<span class="sourceLineNo">1179</span>      return false;<a name="line.1179"></a>
-<span class="sourceLineNo">1180</span>    }<a name="line.1180"></a>
-<span class="sourceLineNo">1181</span>    if(areSomeRegionReplicasColocated(c)) return true;<a name="line.1181"></a>
-<span class="sourceLineNo">1182</span>    // Check if we even need to do any load balancing<a name="line.1182"></a>
-<span class="sourceLineNo">1183</span>    // HBASE-3681 check sloppiness first<a name="line.1183"></a>
-<span class="sourceLineNo">1184</span>    float average = cs.getLoadAverage(); // for logging<a name="line.1184"></a>
-<span class="sourceLineNo">1185</span>    int floor = (int) Math.floor(average * (1 - slop));<a name="line.1185"></a>
-<span class="sourceLineNo">1186</span>    int ceiling = (int) Math.ceil(average * (1 + slop));<a name="line.1186"></a>
-<span class="sourceLineNo">1187</span>    if (!(cs.getMaxLoad() &gt; ceiling || cs.getMinLoad() &lt; floor)) {<a name="line.1187"></a>
-<span class="sourceLineNo">1188</span>      NavigableMap&lt;ServerAndLoad, List&lt;RegionInfo&gt;&gt; serversByLoad = cs.getServersByLoad();<a name="line.1188"></a>
-<span class="sourceLineNo">1189</span>      if (LOG.isTraceEnabled()) {<a name="line.1189"></a>
-<span class="sourceLineNo">1190</span>        // If nothing to balance, then don't say anything unless trace-level logging.<a name="line.1190"></a>
-<span class="sourceLineNo">1191</span>        LOG.trace("Skipping load balancing because balanced cluster; " +<a name="line.1191"></a>
-<span class="sourceLineNo">1192</span>          "servers=" + cs.getNumServers() +<a name="line.1192"></a>
-<span class="sourceLineNo">1193</span>          " regions=" + cs.getNumRegions() + " average=" + average +<a name="line.1193"></a>
-<span class="sourceLineNo">1194</span>          " mostloaded=" + serversByLoad.lastKey().getLoad() +<a name="line.1194"></a>
-<span class="sourceLineNo">1195</span>          " leastloaded=" + serversByLoad.firstKey().getLoad());<a name="line.1195"></a>
-<span class="sourceLineNo">1196</span>      }<a name="line.1196"></a>
-<span class="sourceLineNo">1197</span>      return false;<a name="line.1197"></a>
-<span class="sourceLineNo">1198</span>    }<a name="line.1198"></a>
-<span class="sourceLineNo">1199</span>    return true;<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>   * Subclasses should implement this to return true if the cluster has nodes that hosts<a name="line.1203"></a>
-<span class="sourceLineNo">1204</span>   * multiple replicas for the same region, or, if there are multiple racks and the same<a name="line.1204"></a>
-<span class="sourceLineNo">1205</span>   * rack hosts replicas of the same region<a name="line.1205"></a>
-<span class="sourceLineNo">1206</span>   * @param c Cluster information<a name="line.1206"></a>
-<span class="sourceLineNo">1207</span>   * @return whether region replicas are currently co-located<a name="line.1207"></a>
-<span class="sourceLineNo">1208</span>   */<a name="line.1208"></a>
-<span class="sourceLineNo">1209</span>  protected boolean areSomeRegionReplicasColocated(Cluster c) {<a name="line.1209"></a>
-<span class="sourceLineNo">1210</span>    return false;<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>   * Generates a bulk assignment plan to be used on cluster startup using a<a name="line.1214"></a>
-<span class="sourceLineNo">1215</span>   * simple round-robin assignment.<a name="line.1215"></a>
-<span class="sourceLineNo">1216</span>   * &lt;p&gt;<a name="line.1216"></a>
-<span class="sourceLineNo">1217</span>   * Takes a list of all the regions and all the servers in the cluster and<a name="line.1217"></a>
-<span class="sourceLineNo">1218</span>   * returns a map of each server to the regions that it should be assigned.<a name="line.1218"></a>
-<span class="sourceLineNo">1219</span>   * &lt;p&gt;<a name="line.1219"></a>
-<span class="sourceLineNo">1220</span>   * Currently implemented as a round-robin assignment. Same invariant as load<a name="line.1220"></a>
-<span class="sourceLineNo">1221</span>   * balancing, all servers holding floor(avg) or ceiling(avg).<a name="line.1221"></a>
-<span class="sourceLineNo">1222</span>   *<a name="line.1222"></a>
-<span class="sourceLineNo">1223</span>   * TODO: Use block locations from HDFS to place regions with their blocks<a name="line.1223"></a>
-<span class="sourceLineNo">1224</span>   *<a name="line.1224"></a>
-<span class="sourceLineNo">1225</span>   * @param regions all regions<a name="line.1225"></a>
-<span class="sourceLineNo">1226</span>   * @param servers all servers<a name="line.1226"></a>
-<span class="sourceLineNo">1227</span>   * @return map of server to the regions it should take, or null if no<a name="line.1227"></a>
-<span class="sourceLineNo">1228</span>   *         assignment is possible (ie. no regions or no servers)<a name="line.1228"></a>
-<span class="sourceLineNo">1229</span>   */<a name="line.1229"></a>
-<span class="sourceLineNo">1230</span>  @Override<a name="line.1230"></a>
-<span class="sourceLineNo">1231</span>  public Map&lt;ServerName, List&lt;RegionInfo&gt;&gt; roundRobinAssignment(List&lt;RegionInfo&gt; regions,<a name="line.1231"></a>
-<span class="sourceLineNo">1232</span>      List&lt;ServerName&gt; servers) throws HBaseIOException {<a name="line.1232"></a>
-<span class="sourceLineNo">1233</span>    metricsBalancer.incrMiscInvocations();<a name="line.1233"></a>
-<span class="sourceLineNo">1234</span>    Map&lt;ServerName, List&lt;RegionInfo&gt;&gt; assignments = assignMasterSystemRegions(regions, servers);<a name="line.1234"></a>
-<span class="sourceLineNo">1235</span>    if (assignments != null &amp;&amp; !assignments.isEmpty()) {<a name="line.1235"></a>
-<span class="sourceLineNo">1236</span>      servers = new ArrayList&lt;&gt;(servers);<a name="line.1236"></a>
-<span class="sourceLineNo">1237</span>      // Guarantee not to put other regions on master<a name="line.1237"></a>
-<span class="sourceLineNo">1238</span>      servers.remove(masterServerName);<a name="line.1238"></a>
-<span class="sourceLineNo">1239</span>      List&lt;RegionInfo&gt; masterRegions = assignments.get(masterServerName);<a name="line.1239"></a>
-<span class="sourceLineNo">1240</span>      if (!masterRegions.isEmpty()) {<a name="line.1240"></a>
-<span class="sourceLineNo">1241</span>        regions = new ArrayList&lt;&gt;(regions);<a name="line.1241"></a>
-<span class="sourceLineNo">1242</span>        regions.removeAll(masterRegions);<a name="line.1242"></a>
-<span class="sourceLineNo">1243</span>      }<a name="line.1243"></a>
-<span class="sourceLineNo">1244</span>    }<a name="line.1244"></a>
-<span class="sourceLineNo">1245</span>    if (regions == null || regions.isEmpty()) {<a name="line.1245"></a>
-<span class="sourceLineNo">1246</span>      return assignments;<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>    int numServers = servers == null ? 0 : servers.size();<a name="line.1249"></a>
-<span class="sourceLineNo">1250</span>    if (numServers == 0) {<a name="line.1250"></a>
-<span class="sourceLineNo">1251</span>      LOG.warn("Wanted to do round robin assignment but no servers to assign to");<a name="line.1251"></a>
-<span class="sourceLineNo">1252</span>      return null;<a name="line.1252"></a>
-<span class="sourceLineNo">1253</span>    }<a name="line.1253"></a>
-<span class="sourceLineNo">1254</span><a name="line.1254"></a>
-<span class="sourceLineNo">1255</span>    // TODO: instead of retainAssignment() and roundRobinAssignment(), we should just run the<a name="line.1255"></a>
-<span class="sourceLineNo">1256</span>    // normal LB.balancerCluster() with unassignedRegions. We only need to have a candidate<a name="line.1256"></a>
-<span class="sourceLineNo">1257</span>    // generator for AssignRegionAction. The LB will ensure the regions are mostly local<a name="line.1257"></a>
-<span class="sourceLineNo">1258</span>    // and balanced. This should also run fast with fewer number of iterations.<a name="line.1258"></a>
-<span class="sourceLineNo">1259</span><a name="line.1259"></a>
-<span class="sourceLineNo">1260</span>    if (numServers == 1) { // Only one server, nothing fancy we can do here<a name="line.1260"></a>
-<span class="sourceLineNo">1261</span>      ServerName server = servers.get(0);<a name="line.1261"></a>
-<span class="sourceLineNo">1262</span>      assignments.put(server, new ArrayList&lt;&gt;(regions));<a name="line.1262"></a>
-<span class="sourceLineNo">1263</span>      return assignments;<a name="line.1263"></a>
-<span class="sourceLineNo">1264</span>    }<a name="line.1264"></a>
-<span class="sourceLineNo">1265</span><a name="line.1265"></a>
-<span class="sourceLineNo">1266</span>    Cluster cluster = createCluster(servers, regions, false);<a name="line.1266"></a>
-<span class="sourceLineNo">1267</span>    List&lt;RegionInfo&gt; unassignedRegions = new ArrayList&lt;&gt;();<a name="line.1267"></a>
-<span class="sourceLineNo">1268</span><a name="line.1268"></a>
-<span class="sourceLineNo">1269</span>    roundRobinAssignment(cluster, regions, unassignedRegions,<a name="line.1269"></a>
-<span class="sourceLineNo">1270</span>      servers, assignments);<a name="line.1270"></a>
-<span class="sourceLineNo">1271</span><a name="line.1271"></a>
-<span class="sourceLineNo">1272</span>    List&lt;RegionInfo&gt; lastFewRegions = new ArrayList&lt;&gt;();<a name="line.1272"></a>
-<span class="sourceLineNo">1273</span>    // assign the remaining by going through the list and try to assign to servers one-by-one<a name="line.1273"></a>
-<span class="sourceLineNo">1274</span>    int serverIdx = RANDOM.nextInt(numServers);<a name="line.1274"></a>
-<span class="sourceLineNo">1275</span>    OUTER : for (RegionInfo region : unassignedRegions) {<a name="line.1275"></a>
-<span class="sourceLineNo">1276</span>      boolean assigned = false;<a name="line.1276"></a>
-<span class="sourceLineNo">1277</span>      INNER : for (int j = 0; j &lt; numServers; j++) { // try all servers one by one<a name="line.1277"></a>
-<span class="sourceLineNo">1278</span>        ServerName serverName = servers.get((j + serverIdx) % numServers);<a name="line.1278"></a>
-<span class="sourceLineNo">1279</span>        if (!cluster.wouldLowerAvailability(region, serverName)) {<a name="line.1279"></a>
-<span class="sourceLineNo">1280</span>          List&lt;RegionInfo&gt; serverRegions =<a name="line.1280"></a>
-<span class="sourceLineNo">1281</span>              assignments.computeIfAbsent(serverName, k -&gt; new ArrayList&lt;&gt;());<a name="line.1281"></a>
-<span class="sourceLineNo">1282</span>          if (!RegionReplicaUtil.isDefaultReplica(region.getReplicaId())) {<a name="line.1282"></a>
-<span class="sourceLineNo">1283</span>            // if the region is not a default replica<a name="line.1283"></a>
-<span class="sourceLineNo">1284</span>            // check if the assignments map has the other replica region on this server<a name="line.1284"></a>
-<span class="sourceLineNo">1285</span>            for (RegionInfo hri : serverRegions) {<a name="line.1285"></a>
-<span class="sourceLineNo">1286</span>              if (RegionReplicaUtil.isReplicasForSameRegion(region, hri)) {<a name="line.1286"></a>
-<span class="sourceLineNo">1287</span>                if (LOG.isTraceEnabled()) {<a name="line.1287"></a>
-<span class="sourceLineNo">1288</span>                  LOG.trace("Skipping the server, " + serverName<a name="line.1288"></a>
-<span class="sourceLineNo">1289</span>                      + " , got the same server for the region " + region);<a name="line.1289"></a>
-<span class="sourceLineNo">1290</span>                }<a name="line.1290"></a>
-<span class="sourceLineNo">1291</span>                // do not allow this case. The unassignedRegions we got because the<a name="line.1291"></a>
-<span class="sourceLineNo">1292</span>                // replica region in this list was not assigned because of lower availablity issue.<a name="line.1292"></a>
-<span class="sourceLineNo">1293</span>                // So when we assign here we should ensure that as far as possible the server being<a name="line.1293"></a>
-<span class="sourceLineNo">1294</span>                // selected does not have the server where the replica region was not assigned.<a name="line.1294"></a>
-<span class="sourceLineNo">1295</span>                continue INNER; // continue the inner loop, ie go to the next server<a name="line.1295"></a>
-<span class="sourceLineNo">1296</span>              }<a name="line.1296"></a>
-<span class="sourceLineNo">1297</span>            }<a name="line.1297"></a>
-<span class="sourceLineNo">1298</span>          }<a name="line.1298"></a>
-<span class="sourceLineNo">1299</span>          serverRegions.add(region);<a name="line.1299"></a>
-<span class="sourceLineNo">1300</span>          cluster.doAssignRegion(region, serverName);<a name="line.1300"></a>
-<span class="sourceLineNo">1301</span>          serverIdx = (j + serverIdx + 1) % numServers; //remain from next server<a name="line.1301"></a>
-<span class="sourceLineNo">1302</span>          assigned = true;<a name="line.1302"></a>
-<span class="sourceLineNo">1303</span>          break;<a name="line.1303"></a>
-<span class="sourceLineNo">1304</span>        }<a name="line.1304"></a>
-<span class="sourceLineNo">1305</span>      }<a name="line.1305"></a>
-<span class="sourceLineNo">1306</span>      if (!assigned) {<a name="line.1306"></a>
-<span class="sourceLineNo">1307</span>        lastFewRegions.add(region);<a name="line.1307"></a>
-<span class="sourceLineNo">1308</span>      }<a name="line.1308"></a>
-<span class="sourceLineNo">1309</span>    }<a name="line.1309"></a>
-<span class="sourceLineNo">1310</span>    // just sprinkle the rest of the regions on random regionservers. The balanceCluster will<a name="line.1310"></a>
-<span class="sourceLineNo">1311</span>    // make it optimal later. we can end up with this if numReplicas &gt; numServers.<a name="line.1311"></a>
-<span class="sourceLineNo">1312</span>    for (RegionInfo region : lastFewRegions) {<a name="line.1312"></a>
-<span class="sourceLineNo">1313</span>      int i = RANDOM.nextInt(numServers);<a name="line.1313"></a>
-<span class="sourceLineNo">1314</span>      ServerName server = servers.get(i);<a name="line.1314"></a>
-<span class="sourceLineNo">1315</span>      List&lt;RegionInfo&gt; serverRegions = assignments.computeIfAbsent(server, k -&gt; new ArrayList&lt;&gt;());<a name="line.1315"></a>
-<span class="sourceLineNo">1316</span>      serverRegions.add(region);<a name="line.1316"></a>
-<span class="sourceLineNo">1317</span>      cluster.doAssignRegion(region, server);<a name="line.1317"></a>
-<span class="sourceLineNo">1318</span>    }<a name="line.1318"></a>
-<span class="sourceLineNo">1319</span>    return assignments;<a name="line.1319"></a>
-<span class="sourceLineNo">1320</span>  }<a name="line.1320"></a>
-<span class="sourceLineNo">1321</span><a name="line.1321"></a>
-<span class="sourceLineNo">1322</span>  protected Cluster createCluster(List&lt;ServerName&gt; servers, Collection&lt;RegionInfo&gt; regions,<a name="line.1322"></a>
-<span class="sourceLineNo">1323</span>      boolean hasRegionReplica) {<a name="line.1323"></a>
-<span class="sourceLineNo">1324</span>    // Get the snapshot of the current assignments for the regions in question, and then create<a name="line.1324"></a>
-<span class="sourceLineNo">1325</span>    // a cluster out of it. Note that we might have replicas already assigned to some servers<a name="line.1325"></a>
-<span class="sourceLineNo">1326</span>    // earlier. So we want to get the snapshot to see those assignments, but this will only contain<a name="line.1326"></a>
-<span class="sourceLineNo">1327</span>    // replicas of the regions that are passed (for performance).<a name="line.1327"></a>
-<span class="sourceLineNo">1328</span>    Map&lt;ServerName, List&lt;RegionInfo&gt;&gt; clusterState = null;<a name="line.1328"></a>
-<span class="sourceLineNo">1329</span>    if (!hasRegionReplica) {<a name="line.1329"></a>
-<span class="sourceLineNo">1330</span>      clusterState = getRegionAssignmentsByServer(regions);<a name="line.1330"></a>
-<span class="sourceLineNo">1331</span>    } else {<a name="line.1331"></a>
-<span class="sourceLineNo">1332</span>      // for the case where we have region replica it is better we get the entire cluster's snapshot<a name="line.1332"></a>
-<span class="sourceLineNo">1333</span>      clusterState = getRegionAssignmentsByServer(null);<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>    for (ServerName server : servers) {<a name="line.1336"></a>
-<span class="sourceLineNo">1337</span>      if (!clusterState.containsKey(server)) {<a name="line.1337"></a>
-<span class="sourceLineNo">1338</span>        clusterState.put(server, EMPTY_REGION_LIST);<a name="line.1338"></a>
-<span class="sourceLineNo">1339</span>      }<a name="line.1339"></a>
-<span class="sourceLineNo">1340</span>    }<a name="line.1340"></a>
-<span class="sourceLineNo">1341</span>    return new Cluster(regions, clusterState, null, this.regionFinder,<a name="line.1341"></a>
-<span class="sourceLineNo">1342</span>        rackManager);<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>  private List&lt;ServerName&gt; findIdleServers(List&lt;ServerName&gt; servers) {<a name="line.1345"></a>
-<span class="sourceLineNo">1346</span>    return this.services.getServerManager()<a name="line.1346"></a>
-<span class="sourceLineNo">1347</span>            .getOnlineServersListWithPredicator(servers, IDLE_SERVER_PREDICATOR);<a name="line.1347"></a>
-<span class="sourceLineNo">1348</span>  }<a name="line.1348"></a>
-<span class="sourceLineNo">1349</span><a name="line.1349"></a>
-<span class="sourceLineNo">1350</span>  /**<a name="line.1350"></a>
-<span class="sourceLineNo">1351</span>   * Used to assign a single region to a random server.<a name="line.1351"></a>
-<span class="sourceLineNo">1352</span>   */<a name="line.1352"></a>
-<span class="sourceLineNo">1353</span>  @Override<a name="line.1353"></a>
-<span class="sourceLineNo">1354</span>  public ServerName randomAssignment(RegionInfo regionInfo, List&lt;ServerName&gt; servers)<a name="line.1354"></a>
-<span class="sourceLineNo">1355</span>      throws HBaseIOException {<a name="line.1355"></a>
-<span class="sourceLineNo">1356</span>    metricsBalancer.incrMiscInvocations();<a name="line.1356"></a>
-<span class="sourceLineNo">1357</span>    if (servers != null &amp;&amp; servers.contains(masterServerName)) {<a name="line.1357"></a>
-<span class="sourceLineNo">1358</span>      if (shouldBeOnMaster(regionInfo)) {<a name="line.1358"></a>
-<span class="sourceLineNo">1359</span>        return masterServerName;<a name="line.1359"></a>
-<span class="sourceLineNo">1360</span>      }<a name="line.1360"></a>
-<span class="sourceLineNo">1361</span>      if (!LoadBalancer.isTablesOnMaster(getConf())) {<a name="line.1361"></a>
-<span class="sourceLineNo">1362</span>        // Guarantee we do not put any regions on master<a name="line.1362"></a>
-<span class="sourceLineNo">1363</span>        servers = new ArrayList&lt;&gt;(servers);<a name="line.1363"></a>
-<span class="sourceLineNo">1364</span>        servers.remove(masterServerName);<a name="line.1364"></a>
-<span class="sourceLineNo">1365</span>      }<a name="line.1365"></a>
-<span class="sourceLineNo">1366</span>    }<a name="line.1366"></a>
-<span class="sourceLineNo">1367</span><a name="line.1367"></a>
-<span class="sourceLineNo">1368</span>    int numServers = servers == null ? 0 : servers.size();<a name="line.1368"></a>
-<span class="sourceLineNo">1369</span>    if (numServers == 0) {<a name="line.1369"></a>
-<span class="sourceLineNo">1370</span>      LOG.warn("Wanted to retain assignment but no servers to assign to");<a name="line.1370"></a>
-<span class="sourceLineNo">1371</span>      return null;<a name="line.1371"></a>
-<span class="sourceLineNo">1372</span>    }<a name="line.1372"></a>
-<span class="sourceLineNo">1373</span>    if (numServers == 1) { // Only one server, nothing fancy we can do here<a name="line.1373"></a>
-<span class="sourceLineNo">1374</span>      return servers.get(0);<a name="line.1374"></a>
-<span class="sourceLineNo">1375</span>    }<a name="line.1375"></a>
-<span class="sourceLineNo">1376</span>    List&lt;ServerName&gt; idleServers = findIdleServers(servers);<a name="line.1376"></a>
-<span class="sourceLineNo">1377</span>    if (idleServers.size() == 1) {<a name="line.1377"></a>
-<span class="sourceLineNo">1378</span>      return idleServers.get(0);<a name="line.1378"></a>
-<span class="sourceLineNo">1379</span>    }<a name="line.1379"></a>
-<span class="sourceLineNo">1380</span>    final List&lt;ServerName&gt; finalServers = idleServers.isEmpty() ?<a name="line.1380"></a>
-<span class="sourceLineNo">1381</span>            servers : idleServers;<a name="line.1381"></a>
-<span class="sourceLineNo">1382</span>    List&lt;RegionInfo&gt; regions = Lists.newArrayList(regionInfo);<a name="line.1382"></a>
-<span class="sourceLineNo">1383</span>    Cluster cluster = createCluster(finalServers, regions, false);<a name="line.1383"></a>
-<span class="sourceLineNo">1384</span>    return randomAssignment(cluster, regionInfo, finalServers);<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>  /**<a name="line.1387"></a>
-<span class="sourceLineNo">1388</span>   * Generates a bulk assignment startup plan, attempting to reuse the existing<a name="line.1388"></a>
-<span class="sourceLineNo">1389</span>   * assignment information from META, but adjusting for the specified list of<a name="line.1389"></a>
-<span class="sourceLineNo">1390</span>   * available/online servers available for assignment.<a name="line.1390"></a>
-<span class="sourceLineNo">1391</span>   * &lt;p&gt;<a name="line.1391"></a>
-<span class="sourceLineNo">1392</span>   * Takes a map of all regions to their existing assignment from META. Also<a name="line.1392"></a>
-<span class="sourceLineNo">1393</span>   * takes a list of online servers for regions to be assigned to. Attempts to<a name="line.1393"></a>
-<span class="sourceLineNo">1394</span>   * retain all assignment, so in some instances initial assignment will not be<a name="line.1394"></a>
-<span class="sourceLineNo">1395</span>   * completely balanced.<a name="line.1395"></a>
-<span class="sourceLineNo">1396</span>   * &lt;p&gt;<a name="line.1396"></a>
-<span class="sourceLineNo">1397</span>   * Any leftover regions without an existing server to be assigned to will be<a name="line.1397"></a>
-<span class="sourceLineNo">1398</span>   * assigned randomly to available servers.<a name="line.1398"></a>
-<span class="sourceLineNo">1399</span>   *<a name="line.1399"></a>
-<span class="sourceLineNo">1400</span>   * @param regions regions and existing assignment from meta<a name="line.1400"></a>
-<span class="sourceLineNo">1401</span>   * @param servers available servers<a name="line.1401"></a>
-<span class="sourceLineNo">1402</span>   * @return map of servers and regions to be assigned to them<a name="line.1402"></a>
-<span class="sourceLineNo">1403</span>   */<a name="line.1403"></a>
-<span class="sourceLineNo">1404</span>  @Override<a name="line.1404"></a>
-<span class="sourceLineNo">1405</span>  public Map&lt;ServerName, List&lt;RegionInfo&gt;&gt; retainAssignment(Map&lt;RegionInfo, ServerName&gt; regions,<a name="line.1405"></a>
-<span class="sourceLineNo">1406</span>      List&lt;ServerName&gt; servers) throws HBaseIOException {<a name="line.1406"></a>
-<span class="sourceLineNo">1407</span>    // Update metrics<a name="line.1407"></a>
-<span class="sourceLineNo">1408</span>    metricsBalancer.incrMiscInvocations();<a name="line.1408"></a>
-<span class="sourceLineNo">1409</span>    Map&lt;ServerName, List&lt;RegionInfo&gt;&gt; assignments = assignMasterSystemRegions(regions.keySet(), servers);<a name="line.1409"></a>
-<span class="sourceLineNo">1410</span>    if (assignments != null &amp;&amp; !assignments.isEmpty()) {<a name="line.1410"></a>
-<span class="sourceLineNo">1411</span>      servers = new ArrayList&lt;&gt;(servers);<a name="line.1411"></a>
-<span class="sourceLineNo">1412</span>      // Guarantee not to put other regions on master<a name="line.1412"></a>
-<span class="sourceLineNo">1413</span>      servers.remove(masterServerName);<a name="line.1413"></a>
-<span class="sourceLineNo">1414</span>      List&lt;RegionInfo&gt; masterRegions = assignments.get(masterServerName);<a name="line.1414"></a>
-<span class="sourceLineNo">1415</span>      regions = regions.entrySet().stream().filter(e -&gt; !masterRegions.contains(e.getKey()))<a name="line.1415"></a>
-<span class="sourceLineNo">1416</span>          .collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue));<a name="line.1416"></a>
-<span class="sourceLineNo">1417</span>    }<a name="line.1417"></a>
-<span class="sourceLineNo">1418</span>    if (regions.isEmpty()) {<a name="line.1418"></a>
-<span class="sourceLineNo">1419</span>      return assignments;<a name="line.1419"></a>
-<span class="sourceLineNo">1420</span>    }<a name="line.1420"></a>
-<span class="sourceLineNo">1421</span><a name="line.1421"></a>
-<span class="sourceLineNo">1422</span>    int numServers = servers == null ? 0 : servers.size();<a name="line.1422"></a>
-<span class="sourceLineNo">1423</span>    if (numServers == 0) {<a name="line.1423"></a>
-<span class="sourceLineNo">1424</span>      LOG.warn("Wanted to do retain assignment but no servers to assign to");<a name="line.1424"></a>
-<span class="sourceLineNo">1425</span>      return null;<a name="line.1425"></a>
-<span class="sourceLineNo">1426</span>    }<a name="line.1426"></a>
-<span class="sourceLineNo">1427</span>    if (numServers == 1) { // Only one server, nothing fancy we can do here<a name="line.1427"></a>
-<span class="sourceLineNo">1428</span>      ServerName server = servers.get(0);<a name="line.1428"></a>
-<span class="sourceLineNo">1429</span>      assignments.put(server, new ArrayList&lt;&gt;(regions.keySet()));<a name="line.1429"></a>
-<span class="sourceLineNo">1430</span>      return assignments;<a name="line.1430"></a>
-<span class="sourceLineNo">1431</span>    }<a name="line.1431"></a>
-<span class="sourceLineNo">1432</span><a name="line.1432"></a>
-<span class="sourceLineNo">1433</span>    // Group all of the old assignments by their hostname.<a name="line.1433"></a>
-<span class="sourceLineNo">1434</span>    // We can't group directly by ServerName since the servers all have<a name="line.1434"></a>
-<span class="sourceLineNo">1435</span>    // new start-codes.<a name="line.1435"></a>
-<span class="sourceLineNo">1436</span><a name="line.1436"></a>
-<span class="sourceLineNo">1437</span>    // Group the servers by their hostname. It's possible we have multiple<a name="line.1437"></a>
-<span class="sourceLineNo">1438</span>    // servers on the same host on different ports.<a name="line.1438"></a>
-<span class="sourceLineNo">1439</span>    ArrayListMultimap&lt;String, ServerName&gt; serversByHostname = ArrayListMultimap.create();<a name="line.1439"></a>
-<span class="sourceLineNo">1440</span>    for (ServerName server : servers) {<a name="line.1440"></a>
-<span class="sourceLineNo">1441</span>      assignments.put(server, new ArrayList&lt;&gt;());<a name="line.1441"></a>
-<span class="sourceLineNo">1442</span>      serversByHostname.put(server.getHostnameLowerCase(), server);<a name="line.1442"></a>
-<span class="sourceLineNo">1443</span>    }<a name="line.1443"></a>
-<span class="sourceLineNo">1444</span><a name="line.1444"></a>
-<span class="sourceLineNo">1445</span>    // Collection of the hostnames that used to have regions<a name="line.1445"></a>
-<span class="sourceLineNo">1446</span>    // assigned, but for which we no longer have any RS running<a name="line.1446"></a>
-<span class="sourceLineNo">1447</span>    // after the cluster restart.<a name="line.1447"></a>
-<span class="sourceLineNo">1448</span>    Set&lt;String&gt; oldHostsNoLongerPresent = Sets.newTreeSet();<a name="line.1448"></a>
-<span class="sourceLineNo">1449</span><a name="line.1449"></a>
-<span class="sourceLineNo">1450</span>    // If the old servers aren't present, lets assign those regions later.<a name="line.1450"></a>
-<span class="sourceLineNo">1451</span>    List&lt;RegionInfo&gt; randomAssignRegions = Lists.newArrayList();<a name="line.1451"></a>
-<span class="sourceLineNo">1452</span><a name="line.1452"></a>
-<span class="sourceLineNo">1453</span>    int numRandomAssignments = 0;<a name="line.1453"></a>
-<span class="sourceLineNo">1454</span>    int numRetainedAssigments = 0;<a name="line.1454"></a>
-<span class="sourceLineNo">1455</span>    boolean hasRegionReplica = false;<a name="line.1455"></a>
-<span class="sourceLineNo">1456</span>    for (Map.Entry&lt;RegionInfo, ServerName&gt; entry : regions.entrySet()) {<a name="line.1456"></a>
-<span class="sourceLineNo">1457</span>      RegionInfo region = entry.getKey();<a name="line.1457"></a>
-<span class="sourceLineNo">1458</span>      ServerName oldServerName = entry.getValue();<a name="line.1458"></a>
-<span class="sourceLineNo">1459</span>      // In the current set of regions even if one has region replica let us go with<a name="line.1459"></a>
-<span class="sourceLineNo">1460</span>      // getting the entire snapshot<a name="line.1460"></a>
-<span class="sourceLineNo">1461</span>      if (this.services != null) { // for tests<a name="line.1461"></a>
-<span class="sourceLineNo">1462</span>        AssignmentManager am = this.services.getAssignmentManager();<a name="line.1462"></a>
-<span class="sourceLineNo">1463</span>        if (am != null) {<a name="line.1463"></a>
-<span class="sourceLineNo">1464</span>          RegionStates states = am.getRegionStates();<a name="line.1464"></a>
-<span class="sourceLineNo">1465</span>          if (!hasRegionReplica &amp;&amp; states != null &amp;&amp; states.isReplicaAvailableForRegion(region)) {<a name="line.1465"></a>
-<span class="sourceLineNo">1466</span>            hasRegionReplica = true;<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>      List&lt;ServerName&gt; localServers = new ArrayList&lt;&gt;();<a name="line.1470"></a>
-<span class="sourceLineNo">1471</span>      if (oldServerName != null) {<a name="line.1471"></a>
-<span class="sourceLineNo">1472</span>        localServers = serversByHostname.get(oldServerName.getHostnameLowerCase());<a name="line.1472"></a>
-<span class="sourceLineNo">1473</span>      }<a name="line.1473"></a>
-<span class="sourceLineNo">1474</span>      if (localServers.isEmpty()) {<a name="line.1474"></a>
-<span class="sourceLineNo">1475</span>        // No servers on the new cluster match up with this hostname, assign randomly, later.<a name="line.1475"></a>
-<span class="sourceLineNo">1476</span>        randomAssignRegions.add(region);<a name="line.1476"></a>
-<span class="sourceLineNo">1477</span>        if (oldServerName != null) {<a name="line.1477"></a>
-<span class="sourceLineNo">1478</span>          oldHostsNoLongerPresent.add(oldServerName.getHostnameLowerCase());<a name="line.1478"></a>
-<span class="sourceLineNo">1479</span>        }<a name="line.1479"></a>
-<span class="sourceLineNo">1480</span>      } else if (localServers.size() == 1) {<a name="line.1480"></a>
-<span class="sourceLineNo">1481</span>        // the usual case - one new server on same host<a name="line.1481"></a>
-<span class="sourceLineNo">1482</span>        ServerName target = localServers.get(0);<a name="line.1482"></a>
-<span class="sourceLineNo">1483</span>        assignments.get(target).add(region);<a name="line.1483"></a>
-<span class="sourceLineNo">1484</span>        numRetainedAssigments++;<a name="line.1484"></a>
-<span class="sourceLineNo">1485</span>      } else {<a name="line.1485"></a>
-<span class="sourceLineNo">1486</span>        // multiple new servers in the cluster on this same host<a name="line.1486"></a>
-<span class="sourceLineNo">1487</span>        if (localServers.contains(oldServerName)) {<a name="line.1487"></a>
-<span class="sourceLineNo">1488</span>          assignments.get(oldServerName).add(region);<a name="line.1488"></a>
-<span class="sourceLineNo">1489</span>          numRetainedAssigments++;<a name="line.1489"></a>
-<span class="sourceLineNo">1490</span>        } else {<a name="line.1490"></a>
-<span class="sourceLineNo">1491</span>          ServerName target = null;<a name="line.1491"></a>
-<span class="sourceLineNo">1492</span>          for (ServerName tmp : localServers) {<a name="line.1492"></a>
-<span class="sourceLineNo">1493</span>            if (tmp.getPort() == oldServerName.getPort()) {<a name="line.1493"></a>
-<span class="sourceLineNo">1494</span>              target = tmp;<a name="line.1494"></a>
-<span class="sourceLineNo">1495</span>              assignments.get(tmp).add(region);<a name="line.1495"></a>
-<span class="sourceLineNo">1496</span>              numRetainedAssigments++;<a name="line.1496"></a>
-<span class="sourceLineNo">1497</span>              break;<a name="line.1497"></a>
-<span class="sourceLineNo">1498</span>            }<a name="line.1498"></a>
-<span class="sourceLineNo">1499</span>          }<a name="line.1499"></a>
-<span class="sourceLineNo">1500</span>          if (target == null) {<a name="line.1500"></a>
-<span class="sourceLineNo">1501</span>            randomAssignRegions.add(region);<a name="line.1501"></a>
-<span class="sourceLineNo">1502</span>          }<a name="line.1502"></a>
-<span class="sourceLineNo">1503</span>        }<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><a name="line.1506"></a>
-<span class="sourceLineNo">1507</span>    // If servers from prior assignment aren't present, then lets do randomAssignment on regions.<a name="line.1507"></a>
-<span class="sourceLineNo">1508</span>    if (randomAssignRegions.size() &gt; 0) {<a name="line.1508"></a>
-<span class="sourceLineNo">1509</span>      Cluster cluster = createCluster(servers, regions.keySet(), hasRegionReplica);<a name="line.1509"></a>
-<span class="sourceLineNo">1510</span>      for (Map.Entry&lt;ServerName, List&lt;RegionInfo&gt;&gt; entry : assignments.entrySet()) {<a name="line.1510"></a>
-<span class="sourceLineNo">1511</span>        ServerName sn = entry.getKey();<a name="line.1511"></a>
-<span class="sourceLineNo">1512</span>        for (RegionInfo region : entry.getValue()) {<a name="line.1512"></a>
-<span class="sourceLineNo">1513</span>          cluster.doAssignRegion(region, sn);<a name="line.1513"></a>
-<span class="sourceLineNo">1514</span>        }<a name="line.1514"></a>
-<span class="sourceLineNo">1515</span>      }<a name="line.1515"></a>
-<span class="sourceLineNo">1516</span>      for (RegionInfo region : randomAssignRegions) {<a name="line.1516"></a>
-<span class="sourceLineNo">1517</span>        ServerName target = randomAssignment(cluster, region, servers);<a name="line.1517"></a>
-<span class="sourceLineNo">1518</span>        assignments.get(target).add(region);<a name="line.1518"></a>
-<span class="sourceLineNo">1519</span>        numRandomAssignments++;<a name="line.1519"></a>
-<span class="sourceLineNo">1520</span>      }<a name="line.1520"></a>
-<span class="sourceLineNo">1521</span>    }<a name="line.1521"></a>
-<span class="sourceLineNo">1522</span><a name="line.1522"></a>
-<span class="sourceLineNo">1523</span>    String randomAssignMsg = "";<a name="line.1523"></a>
-<span class="sourceLineNo">1524</span>    if (numRandomAssignments &gt; 0) {<a name="line.1524"></a>
-<span class="sourceLineNo">1525</span>      randomAssignMsg =<a name="line.1525"></a>
-<span class="sourceLineNo">1526</span>          numRandomAssignments + " regions were assigned "<a name="line.1526"></a>
-<span class="sourceLineNo">1527</span>              + "to random hosts, since the old hosts for these regions are no "<a name="line.1527"></a>
-<span class="sourceLineNo">1528</span>              + "longer present in the cluster. These hosts were:\n  "<a name="line.1528"></a>
-<span class="sourceLineNo">1529</span>              + Joiner.on("\n  ").join(oldHostsNoLongerPresent);<a name="line.1529"></a>
-<span class="sourceLineNo">1530</span>    }<a name="line.1530"></a>
-<span class="sourceLineNo">1531</span><a name="line.1531"></a>
-<span class="sourceLineNo">1532</span>    LOG.info("Reassigned " + regions.size() + " regions. " + numRetainedAssigments<a name="line.1532"></a>
-<span class="sourceLineNo">1533</span>        + " retained the pre-restart assignment. " + randomAssignMsg);<a name="line.1533"></a>
-<span class="sourceLineNo">1534</span>    return assignments;<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>  @Override<a name="line.1537"></a>
-<span class="sourceLineNo">1538</span>  public void initialize() throws HBaseIOException{<a name="line.1538"></a>
-<span class="sourceLineNo">1539</span>  }<a name="line.1539"></a>
-<span class="sourceLineNo">1540</span><a name="line.1540"></a>
-<span class="sourceLineNo">1541</span>  @Override<a name="line.1541"></a>
-<span class="sourceLineNo">1542</span>  public void regionOnline(RegionInfo regionInfo, ServerName sn) {<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>  @Override<a name="line.1545"></a>
-<span class="sourceLineNo">1546</span>  public void regionOffline(RegionInfo regionInfo) {<a name="line.1546"></a>
-<span class="sourceLineNo">1547</span>  }<a name="line.1547"></a>
-<span class="sourceLineNo">1548</span><a name="line.1548"></a>
-<span class="sourceLineNo">1549</span>  @Override<a name="line.1549"></a>
-<span class="sourceLineNo">1550</span>  public boolean isStopped() {<a name="line.1550"></a>
-<span class="sourceLineNo">1551</span>    return stopped;<a name="line.1551"></a>
-<span class="sourceLineNo">1552</span>  }<a name="line.1552"></a>
-<span class="sourceLineNo">1553</span><a name="line.1553"></a>
-<span class="sourceLineNo">1554</span>  @Override<a name="line.1554"></a>
-<span class="sourceLineNo">1555</span>  public void stop(String why) {<a name="line.1555"></a>
-<span class="sourceLineNo">1556</span>    LOG.info("Load Balancer stop requested: "+why);<a name="line.1556"></a>
-<span class="sourceLineNo">1557</span>    stopped = true;<a name="line.1557"></a>
-<span class="sourceLineNo">1558</span>  }<a name="line.1558"></a>
-<span class="sourceLineNo">1559</span><a name="line.1559"></a>
-<span class="sourceLineNo">1560</span>  /**<a name="line.1560"></a>
-<span class="sourceLineNo">1561</span>  * Updates the balancer status tag reported to JMX<a name="line.1561"></a>
-<span class="sourceLineNo">1562</span>  */<a name="line.1562"></a>
-<span class="sourceLineNo">1563</span>  public void updateBalancerStatus(boolean status) {<a name="line.1563"></a>
-<span class="sourceLineNo">1564</span>    metricsBalancer.balancerStatus(status);<a name="line.1564"></a>
-<span class="sourceLineNo">1565</span>  }<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>   * Used to assign a single region to a random server.<a name="line.1568"></a>
-<span class="sourceLineNo">1569</span>   */<a name="line.1569"></a>
-<span class="sourceLineNo">1570</span>  private ServerName randomAssignment(Cluster cluster, RegionInfo regionInfo,<a name="line.1570"></a>
-<span class="sourceLineNo">1571</span>      List&lt;ServerName&gt; servers) {<a name="line.1571"></a>
-<span class="sourceLineNo">1572</span>    int numServers = servers.size(); // servers is not null, numServers &gt; 1<a name="line.1572"></a>
-<span class="sourceLineNo">1573</span>    ServerName sn = null;<a name="line.1573"></a>
-<span class="sourceLineNo">1574</span>    final int maxIterations = numServers * 4;<a name="line.1574"></a>
-<span class="sourceLineNo">1575</span>    int iterations = 0;<a name="line.1575"></a>
-<span class="sourceLineNo">1576</span>    List&lt;ServerName&gt; usedSNs = new ArrayList&lt;&gt;(servers.size());<a name="line.1576"></a>
-<span class="sourceLineNo">1577</span>    do {<a name="line.1577"></a>
-<span class="sourceLineNo">1578</span>      int i = RANDOM.nextInt(numServers);<a name="line.1578"></a>
-<span class="sourceLineNo">1579</span>      sn = servers.get(i);<a name="line.1579"></a>
-<span class="sourceLineNo">1580</span>      if (!usedSNs.contains(sn)) {<a name="line.1580"></a>
-<span class="sourceLineNo">1581</span>        usedSNs.add(sn);<a name="line.1581"></a>
-<span class="sourceLineNo">1582</span>      }<a name="line.1582"></a>
-<span class="sourceLineNo">1583</span>    } while (cluster.wouldLowerAvailability(regionInfo, sn)<a name="line.1583"></a>
-<span class="sourceLineNo">1584</span>        &amp;&amp; iterations++ &lt; maxIterations);<a name="line.1584"></a>
-<span class="sourceLineNo">1585</span>    if (iterations &gt;= maxIterations) {<a name="line.1585"></a>
-<span class="sourceLineNo">1586</span>      // We have reached the max. Means the servers that we collected is still lowering the<a name="line.1586"></a>
-<span class="sourceLineNo">1587</span>      // availability<a name="line.1587"></a>
-<span class="sourceLineNo">1588</span>      for (ServerName unusedServer : servers) {<a name="line.1588"></a>
-<span class="sourceLineNo">1589</span>        if (!usedSNs.contains(unusedServer)) {<a name="line.1589"></a>
-<span class="sourceLineNo">1590</span>          // check if any other unused server is there for us to use.<a name="line.1590"></a>
-<span class="sourceLineNo">1591</span>          // If so use it. Else we have not other go but to go with one of them<a name="line.1591"></a>
-<span class="sourceLineNo">1592</span>          if (!cluster.wouldLowerAvailability(regionInfo, unusedServer)) {<a name="line.1592"></a>
-<span class="sourceLineNo">1593</span>            sn = unusedServer;<a name="line.1593"></a>
-<span class="sourceLineNo">1594</span>            break;<a name="line.1594"></a>
-<span class="sourceLineNo">1595</span>          }<a name="line.1595"></a>
-<span class="sourceLineNo">1596</span>        }<a name="line.1596"></a>
-<span class="sourceLineNo">1597</span>      }<a name="line.1597"></a>
-<span class="sourceLineNo">1598</span>    }<a name="line.1598"></a>
-<span class="sourceLineNo">1599</span>    cluster.doAssignRegion(regionInfo, sn);<a name="line.1599"></a>
-<span class="sourceLineNo">1600</span>    return sn;<a name="line.1600"></a>
-<span class="sourceLineNo">1601</span>  }<a name="line.1601"></a>
-<span class="sourceLineNo">1602</span><a name="line.1602"></a>
-<span class="sourceLineNo">1603</span>  /**<a name="line.1603"></a>
-<span class="sourceLineNo">1604</span>   * Round robin a list of regions to a list of servers<a name="line.1604"></a>
-<span class="sourceLineNo">1605</span>   */<a name="line.1605"></a>
-<span class="sourceLineNo">1606</span>  private void roundRobinAssignment(Cluster cluster, List&lt;RegionInfo&gt; regions,<a name="line.1606"></a>
-<span class="sourceLineNo">1607</span>      List&lt;RegionInfo&gt; unassignedRegions, List&lt;ServerName&gt; servers,<a name="line.1607"></a>
-<span class="sourceLineNo">1608</span>      Map&lt;ServerName, List&lt;RegionInfo&gt;&gt; assignments) {<a name="line.1608"></a>
-<span class="sourceLineNo">1609</span><a name="line.1609"></a>
-<span class="sourceLineNo">1610</span>    int numServers = servers.size();<a name="line.1610"></a>
-<span class="sourceLineNo">1611</span>    int numRegions = regions.size();<a name="line.1611"></a>
-<span class="sourceLineNo">1612</span>    int max = (int) Math.ceil((float) numRegions / numServers);<a name="line.1612"></a>
-<span class="sourceLineNo">1613</span>    int serverIdx = 0;<a name="line.1613"></a>
-<span class="sourceLineNo">1614</span>    if (numServers &gt; 1) {<a name="line.1614"></a>
-<span class="sourceLineNo">1615</span>      serverIdx = RANDOM.nextInt(numServers);<a name="line.1615"></a>
-<span class="sourceLineNo">1616</span>    }<a name="line.1616"></a>
-<span class="sourceLineNo">1617</span>    int regionIdx = 0;<a name="line.1617"></a>
-<span class="sourceLineNo">1618</span><a name="line.1618"></a>
-<span class="sourceLineNo">1619</span>    for (int j = 0; j &lt; numServers; j++) {<a name="line.1619"></a>
-<span class="sourceLineNo">1620</span>      ServerName server = servers.get((j + serverIdx) % numServers);<a name="line.1620"></a>
-<span class="sourceLineNo">1621</span>      List&lt;RegionInfo&gt; serverRegions = new ArrayList&lt;&gt;(max);<a name="line.1621"></a>
-<span class="sourceLineNo">1622</span>      for (int i = regionIdx; i &lt; numRegions; i += numServers) {<a name="line.1622"></a>
-<span class="sourceLineNo">1623</span>        RegionInfo region = regions.get(i % numRegions);<a name="line.1623"></a>
-<span class="sourceLineNo">1624</span>        if (cluster.wouldLowerAvailability(region, server)) {<a name="line.1624"></a>
-<span class="sourceLineNo">1625</span>          unassignedRegions.add(region);<a name="line.1625"></a>
-<span class="sourceLineNo">1626</span>        } else {<a name="line.1626"></a>
-<span class="sourceLineNo">1627</span>          serverRegions.add(region);<a name="line.1627"></a>
-<span class="sourceLineNo">1628</span>          cluster.doAssignRegion(region, server);<a name="line.1628"></a>
-<span class="sourceLineNo">1629</span>        }<a name="line.1629"></a>
-<span class="sourceLineNo">1630</span>      }<a name="line.1630"></a>
-<span class="sourceLineNo">1631</span>      assignments.put(server, serverRegions);<a name="line.1631"></a>
-<span class="sourceLineNo">1632</span>      regionIdx++;<a name="line.1632"></a>
-<span class="sourceLineNo">1633</span>    }<a name="line.1633"></a>
-<span class="sourceLineNo">1634</span>  }<a name="line.1634"></a>
-<span class="sourceLineNo">1635</span><a name="line.1635"></a>
-<span class="sourceLineNo">1636</span>  protected Map&lt;ServerName, List&lt;RegionInfo&gt;&gt; getRegionAssignmentsByServer(<a name="line.1636"></a>
-<span class="sourceLineNo">1637</span>    Collection&lt;RegionInfo&gt; regions) {<a name="line.1637"></a>
-<span class="sourceLineNo">1638</span>    if (this.services != null &amp;&amp; this.services.getAssignmentManager() != null) {<a name="line.1638"></a>
-<span class="sourceLineNo">1639</span>      return this.services.getAssignmentManager().getSnapShotOfAssignment(regions);<a name="line.1639"></a>
-<span class="sourceLineNo">1640</span>    } else {<a name="line.1640"></a>
-<span class="sourceLineNo">1641</span>      return new HashMap&lt;&gt;();<a name="line.1641"></a>
-<span class="sourceLineNo">1642</span>    }<a name="line.1642"></a>
-<span class="sourceLineNo">1643</span>  }<a name="line.1643"></a>
-<span class="sourceLineNo">1644</span><a name="line.1644"></a>
-<span class="sourceLineNo">1645</span>  @Override<a name="line.1645"></a>
-<span class="sourceLineNo">1646</span>  public void onConfigurationChange(Configuration conf) {<a name="line.1646"></a>
-<span class="sourceLineNo">1647</span>  }<a name="line.1647"></a>
-<span class="sourceLineNo">1648</span>}<a name="line.1648"></a>
+<span class="sourceLineNo">1044</span>  /**<a name="line.1044"></a>
+<span class="sourceLineNo">1045</span>   * Check if a region belongs to some system table.<a name="line.1045"></a>
+<span class="sourceLineNo">1046</span>   * If so, the primary replica may be expected to be put on the master regionserver.<a name="line.1046"></a>
+<span class="sourceLineNo">1047</span>   */<a name="line.1047"></a>
+<span class="sourceLineNo">1048</span>  public boolean shouldBeOnMaster(RegionInfo region) {<a name="line.1048"></a>
+<span class="sourceLineNo">1049</span>    return (this.maintenanceMode || this.onlySystemTablesOnMaster)<a name="line.1049"></a>
+<span class="sourceLineNo">1050</span>        &amp;&amp; region.getTable().isSystemTable();<a name="line.1050"></a>
+<span class="sourceLineNo">1051</span>  }<a name="line.1051"></a>
+<span class="sourceLineNo">1052</span><a name="line.1052"></a>
+<span class="sourceLineNo">1053</span>  /**<a name="line.1053"></a>
+<span class="sourceLineNo">1054</span>   * Balance the regions that should be on master regionserver.<a name="line.1054"></a>
+<span class="sourceLineNo">1055</span>   */<a name="line.1055"></a>
+<span class="sourceLineNo">1056</span>  protected List&lt;RegionPlan&gt; balanceMasterRegions(Map&lt;ServerName, List&lt;RegionInfo&gt;&gt; clusterMap) {<a name="line.1056"></a>
+<span class="sourceLineNo">1057</span>    if (masterServerName == null || clusterMap == null || clusterMap.size() &lt;= 1) return null;<a name="line.1057"></a>
+<span class="sourceLineNo">1058</span>    List&lt;RegionPlan&gt; plans = null;<a name="line.1058"></a>
+<span class="sourceLineNo">1059</span>    List&lt;RegionInfo&gt; regions = clusterMap.get(masterServerName);<a name="line.1059"></a>
+<span class="sourceLineNo">1060</span>    if (regions != null) {<a name="line.1060"></a>
+<span class="sourceLineNo">1061</span>      Iterator&lt;ServerName&gt; keyIt = null;<a name="line.1061"></a>
+<span class="sourceLineNo">1062</span>      for (RegionInfo region: regions) {<a name="line.1062"></a>
+<span class="sourceLineNo">1063</span>        if (shouldBeOnMaster(region)) continue;<a name="line.1063"></a>
+<span class="sourceLineNo">1064</span><a name="line.1064"></a>
+<span class="sourceLineNo">1065</span>        // Find a non-master regionserver to host the region<a name="line.1065"></a>
+<span class="sourceLineNo">1066</span>        if (keyIt == null || !keyIt.hasNext()) {<a name="line.1066"></a>
+<span class="sourceLineNo">1067</span>          keyIt = clusterMap.keySet().iterator();<a name="line.1067"></a>
+<span class="sourceLineNo">1068</span>        }<a name="line.1068"></a>
+<span class="sourceLineNo">1069</span>        ServerName dest = keyIt.next();<a name="line.1069"></a>
+<span class="sourceLineNo">1070</span>        if (masterServerName.equals(dest)) {<a name="line.1070"></a>
+<span class="sourceLineNo">1071</span>          if (!keyIt.hasNext()) {<a name="line.1071"></a>
+<span class="sourceLineNo">1072</span>            keyIt = clusterMap.keySet().iterator();<a name="line.1072"></a>
+<span class="sourceLineNo">1073</span>          }<a name="line.1073"></a>
+<span class="sourceLineNo">1074</span>          dest = keyIt.next();<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>        // Move this region away from the master regionserver<a name="line.1077"></a>
+<span class="sourceLineNo">1078</span>        RegionPlan plan = new RegionPlan(region, masterServerName, dest);<a name="line.1078"></a>
+<span class="sourceLineNo">1079</span>        if (plans == null) {<a name="line.1079"></a>
+<span class="sourceLineNo">1080</span>          plans = new ArrayList&lt;&gt;();<a name="line.1080"></a>
+<span class="sourceLineNo">1081</span>        }<a name="line.1081"></a>
+<span class="sourceLineNo">1082</span>        plans.add(plan);<a name="line.1082"></a>
+<span class="sourceLineNo">1083</span>      }<a name="line.1083"></a>
+<span class="sourceLineNo">1084</span>    }<a name="line.1084"></a>
+<span class="sourceLineNo">1085</span>    for (Map.Entry&lt;ServerName, List&lt;RegionInfo&gt;&gt; server: clusterMap.entrySet()) {<a name="line.1085"></a>
+<span class="sourceLineNo">1086</span>      if (masterServerName.equals(server.getKey())) continue;<a name="line.1086"></a>
+<span class="sourceLineNo">1087</span>      for (RegionInfo region: server.getValue()) {<a name="line.1087"></a>
+<span class="sourceLineNo">1088</span>        if (!shouldBeOnMaster(region)) continue;<a name="line.1088"></a>
+<span class="sourceLineNo">1089</span><a name="line.1089"></a>
+<span class="sourceLineNo">1090</span>        // Move this region to the master regionserver<a name="line.1090"></a>
+<span class="sourceLineNo">1091</span>        RegionPlan plan = new RegionPlan(region, server.getKey(), masterServerName);<a name="line.1091"></a>
+<span class="sourceLineNo">1092</span>        if (plans == null) {<a name="line.1092"></a>
+<span class="sourceLineNo">1093</span>          plans = new ArrayList&lt;&gt;();<a name="line.1093"></a>
+<span class="sourceLineNo">1094</span>        }<a name="line.1094"></a>
+<span class="sourceLineNo">1095</span>        plans.add(plan);<a name="line.1095"></a>
+<span class="sourceLineNo">1096</span>      }<a name="line.1096"></a>
+<span class="sourceLineNo">1097</span>    }<a name="line.1097"></a>
+<span class="sourceLineNo">1098</span>    return plans;<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>  /**<a name="line.1101"></a>
+<span class="sourceLineNo">1102</span>   * If master is configured to carry system tables only, in here is<a name="line.1102"></a>
+<span class="sourceLineNo">1103</span>   * where we figure what to assign it.<a name="line.1103"></a>
+<span class="sourceLineNo">1104</span>   */<a name="line.1104"></a>
+<span class="sourceLineNo">1105</span>  protected Map&lt;ServerName, List&lt;RegionInfo&gt;&gt; assignMasterSystemRegions(<a name="line.1105"></a>
+<span class="sourceLineNo">1106</span>      Collection&lt;RegionInfo&gt; regions, List&lt;ServerName&gt; servers) {<a name="line.1106"></a>
+<span class="sourceLineNo">1107</span>    if (servers == null || regions == null || regions.isEmpty()) {<a name="line.1107"></a>
+<span class="sourceLineNo">1108</span>      return null;<a name="line.1108"></a>
+<span class="sourceLineNo">1109</span>    }<a name="line.1109"></a>
+<span class="sourceLineNo">1110</span>    Map&lt;ServerName, List&lt;RegionInfo&gt;&gt; assignments = new TreeMap&lt;&gt;();<a name="line.1110"></a>
+<span class="sourceLineNo">1111</span>    if (this.maintenanceMode || this.onlySystemTablesOnMaster) {<a name="line.1111"></a>
+<span class="sourceLineNo">1112</span>      if (masterServerName != null &amp;&amp; servers.contains(masterServerName)) {<a name="line.1112"></a>
+<span class="sourceLineNo">1113</span>        assignments.put(masterServerName, new ArrayList&lt;&gt;());<a name="line.1113"></a>
+<span class="sourceLineNo">1114</span>        for (RegionInfo region : regions) {<a name="line.1114"></a>
+<span class="sourceLineNo">1115</span>          if (shouldBeOnMaster(region)) {<a name="line.1115"></a>
+<span class="sourceLineNo">1116</span>            assignments.get(masterServerName).add(region);<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>      }<a name="line.1119"></a>
+<span class="sourceLineNo">1120</span>    }<a name="line.1120"></a>
+<span class="sourceLineNo">1121</span>    return assignments;<a name="line.1121"></a>
+<span class="sourceLineNo">1122</span>  }<a name="line.1122"></a>
+<span class="sourceLineNo">1123</span><a name="line.1123"></a>
+<span class="sourceLineNo">1124</span>  @Override<a name="line.1124"></a>
+<span class="sourceLineNo">1125</span>  public Configuration getConf() {<a name="line.1125"></a>
+<span class="sourceLineNo">1126</span>    return this.config;<a name="line.1126"></a>
+<span class="sourceLineNo">1127</span>  }<a name="line.1127"></a>
+<span class="sourceLineNo">1128</span><a name="line.1128"></a>
+<span class="sourceLineNo">1129</span>  @Override<a name="line.1129"></a>
+<span class="sourceLineNo">1130</span>  public synchronized void setClusterMetrics(ClusterMetrics st) {<a name="line.1130"></a>
+<span class="sourceLineNo">1131</span>    this.clusterStatus = st;<a name="line.1131"></a>
+<span class="sourceLineNo">1132</span>    if (useRegionFinder) {<a name="line.1132"></a>
+<span class="sourceLineNo">1133</span>      regionFinder.setClusterMetrics(st);<a name="line.1133"></a>
+<span class="sourceLineNo">1134</span>    }<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 void setClusterLoad(Map&lt;TableName, Map&lt;ServerName, List&lt;RegionInfo&gt;&gt;&gt; clusterLoad){<a name="line.1138"></a>
+<span class="sourceLineNo">1139</span><a name="line.1139"></a>
+<span class="sourceLineNo">1140</span>  }<a name="line.1140"></a>
+<span class="sourceLineNo">1141</span><a name="line.1141"></a>
+<span class="sourceLineNo">1142</span>  @Override<a name="line.1142"></a>
+<span class="sourceLineNo">1143</span>  public void setMasterServices(MasterServices masterServices) {<a name="line.1143"></a>
+<span class="sourceLineNo">1144</span>    masterServerName = masterServices.getServerName();<a name="line.1144"></a>
+<span class="sourceLineNo">1145</span>    this.services = masterServices;<a name="line.1145"></a>
+<span class="sourceLineNo">1146</span>    if (useRegionFinder) {<a name="line.1146"></a>
+<span class="sourceLineNo">1147</span>      this.regionFinder.setServices(masterServices);<a name="line.1147"></a>
+<span class="sourceLineNo">1148</span>    }<a name="line.1148"></a>
+<span class="sourceLineNo">1149</span>    if (this.services.isInMaintenanceMode()) {<a name="line.1149"></a>
+<span class="sourceLineNo">1150</span>      this.maintenanceMode = true;<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><a name="line.1153"></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 (this.maintenanceMode || 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=

<TRUNCATED>

[14/46] hbase-site git commit: Published site at 05d22ed960204183fbd9bd16f1dbca6410ccde76.

Posted by gi...@apache.org.
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/3649682c/devapidocs/src-html/org/apache/hadoop/hbase/regionserver/HRegionServer.MovedRegionsCleaner.html
----------------------------------------------------------------------
diff --git a/devapidocs/src-html/org/apache/hadoop/hbase/regionserver/HRegionServer.MovedRegionsCleaner.html b/devapidocs/src-html/org/apache/hadoop/hbase/regionserver/HRegionServer.MovedRegionsCleaner.html
index 90087b4..b2a9771 100644
--- a/devapidocs/src-html/org/apache/hadoop/hbase/regionserver/HRegionServer.MovedRegionsCleaner.html
+++ b/devapidocs/src-html/org/apache/hadoop/hbase/regionserver/HRegionServer.MovedRegionsCleaner.html
@@ -956,2857 +956,2858 @@
 <span class="sourceLineNo">948</span>      // Try and register with the Master; tell it we are here.  Break if server is stopped or the<a name="line.948"></a>
 <span class="sourceLineNo">949</span>      // clusterup flag is down or hdfs went wacky. Once registered successfully, go ahead and start<a name="line.949"></a>
 <span class="sourceLineNo">950</span>      // up all Services. Use RetryCounter to get backoff in case Master is struggling to come up.<a name="line.950"></a>
-<span class="sourceLineNo">951</span>      RetryCounterFactory rcf = new RetryCounterFactory(Integer.MAX_VALUE,<a name="line.951"></a>
-<span class="sourceLineNo">952</span>          this.sleeper.getPeriod(), 1000 * 60 * 5);<a name="line.952"></a>
-<span class="sourceLineNo">953</span>      RetryCounter rc = rcf.create();<a name="line.953"></a>
-<span class="sourceLineNo">954</span>      while (keepLooping()) {<a name="line.954"></a>
-<span class="sourceLineNo">955</span>        RegionServerStartupResponse w = reportForDuty();<a name="line.955"></a>
-<span class="sourceLineNo">956</span>        if (w == null) {<a name="line.956"></a>
-<span class="sourceLineNo">957</span>          long sleepTime = rc.getBackoffTimeAndIncrementAttempts();<a name="line.957"></a>
-<span class="sourceLineNo">958</span>          LOG.warn("reportForDuty failed; sleeping {} ms and then retrying.", sleepTime);<a name="line.958"></a>
-<span class="sourceLineNo">959</span>          this.sleeper.sleep(sleepTime);<a name="line.959"></a>
-<span class="sourceLineNo">960</span>        } else {<a name="line.960"></a>
-<span class="sourceLineNo">961</span>          handleReportForDutyResponse(w);<a name="line.961"></a>
-<span class="sourceLineNo">962</span>          break;<a name="line.962"></a>
-<span class="sourceLineNo">963</span>        }<a name="line.963"></a>
-<span class="sourceLineNo">964</span>      }<a name="line.964"></a>
-<span class="sourceLineNo">965</span><a name="line.965"></a>
-<span class="sourceLineNo">966</span>      if (!isStopped() &amp;&amp; isHealthy()) {<a name="line.966"></a>
-<span class="sourceLineNo">967</span>        // start the snapshot handler and other procedure handlers,<a name="line.967"></a>
-<span class="sourceLineNo">968</span>        // since the server is ready to run<a name="line.968"></a>
-<span class="sourceLineNo">969</span>        if (this.rspmHost != null) {<a name="line.969"></a>
-<span class="sourceLineNo">970</span>          this.rspmHost.start();<a name="line.970"></a>
-<span class="sourceLineNo">971</span>        }<a name="line.971"></a>
-<span class="sourceLineNo">972</span>        // Start the Quota Manager<a name="line.972"></a>
-<span class="sourceLineNo">973</span>        if (this.rsQuotaManager != null) {<a name="line.973"></a>
-<span class="sourceLineNo">974</span>          rsQuotaManager.start(getRpcServer().getScheduler());<a name="line.974"></a>
-<span class="sourceLineNo">975</span>        }<a name="line.975"></a>
-<span class="sourceLineNo">976</span>        if (this.rsSpaceQuotaManager != null) {<a name="line.976"></a>
-<span class="sourceLineNo">977</span>          this.rsSpaceQuotaManager.start();<a name="line.977"></a>
-<span class="sourceLineNo">978</span>        }<a name="line.978"></a>
-<span class="sourceLineNo">979</span>      }<a name="line.979"></a>
-<span class="sourceLineNo">980</span><a name="line.980"></a>
-<span class="sourceLineNo">981</span>      // We registered with the Master.  Go into run mode.<a name="line.981"></a>
-<span class="sourceLineNo">982</span>      long lastMsg = System.currentTimeMillis();<a name="line.982"></a>
-<span class="sourceLineNo">983</span>      long oldRequestCount = -1;<a name="line.983"></a>
-<span class="sourceLineNo">984</span>      // The main run loop.<a name="line.984"></a>
-<span class="sourceLineNo">985</span>      while (!isStopped() &amp;&amp; isHealthy()) {<a name="line.985"></a>
-<span class="sourceLineNo">986</span>        if (!isClusterUp()) {<a name="line.986"></a>
-<span class="sourceLineNo">987</span>          if (isOnlineRegionsEmpty()) {<a name="line.987"></a>
-<span class="sourceLineNo">988</span>            stop("Exiting; cluster shutdown set and not carrying any regions");<a name="line.988"></a>
-<span class="sourceLineNo">989</span>          } else if (!this.stopping) {<a name="line.989"></a>
-<span class="sourceLineNo">990</span>            this.stopping = true;<a name="line.990"></a>
-<span class="sourceLineNo">991</span>            LOG.info("Closing user regions");<a name="line.991"></a>
-<span class="sourceLineNo">992</span>            closeUserRegions(this.abortRequested);<a name="line.992"></a>
-<span class="sourceLineNo">993</span>          } else if (this.stopping) {<a name="line.993"></a>
-<span class="sourceLineNo">994</span>            boolean allUserRegionsOffline = areAllUserRegionsOffline();<a name="line.994"></a>
-<span class="sourceLineNo">995</span>            if (allUserRegionsOffline) {<a name="line.995"></a>
-<span class="sourceLineNo">996</span>              // Set stopped if no more write requests tp meta tables<a name="line.996"></a>
-<span class="sourceLineNo">997</span>              // since last time we went around the loop.  Any open<a name="line.997"></a>
-<span class="sourceLineNo">998</span>              // meta regions will be closed on our way out.<a name="line.998"></a>
-<span class="sourceLineNo">999</span>              if (oldRequestCount == getWriteRequestCount()) {<a name="line.999"></a>
-<span class="sourceLineNo">1000</span>                stop("Stopped; only catalog regions remaining online");<a name="line.1000"></a>
-<span class="sourceLineNo">1001</span>                break;<a name="line.1001"></a>
-<span class="sourceLineNo">1002</span>              }<a name="line.1002"></a>
-<span class="sourceLineNo">1003</span>              oldRequestCount = getWriteRequestCount();<a name="line.1003"></a>
-<span class="sourceLineNo">1004</span>            } else {<a name="line.1004"></a>
-<span class="sourceLineNo">1005</span>              // Make sure all regions have been closed -- some regions may<a name="line.1005"></a>
-<span class="sourceLineNo">1006</span>              // have not got it because we were splitting at the time of<a name="line.1006"></a>
-<span class="sourceLineNo">1007</span>              // the call to closeUserRegions.<a name="line.1007"></a>
-<span class="sourceLineNo">1008</span>              closeUserRegions(this.abortRequested);<a name="line.1008"></a>
-<span class="sourceLineNo">1009</span>            }<a name="line.1009"></a>
-<span class="sourceLineNo">1010</span>            LOG.debug("Waiting on " + getOnlineRegionsAsPrintableString());<a name="line.1010"></a>
-<span class="sourceLineNo">1011</span>          }<a name="line.1011"></a>
-<span class="sourceLineNo">1012</span>        }<a name="line.1012"></a>
-<span class="sourceLineNo">1013</span>        long now = System.currentTimeMillis();<a name="line.1013"></a>
-<span class="sourceLineNo">1014</span>        if ((now - lastMsg) &gt;= msgInterval) {<a name="line.1014"></a>
-<span class="sourceLineNo">1015</span>          tryRegionServerReport(lastMsg, now);<a name="line.1015"></a>
-<span class="sourceLineNo">1016</span>          lastMsg = System.currentTimeMillis();<a name="line.1016"></a>
-<span class="sourceLineNo">1017</span>        }<a name="line.1017"></a>
-<span class="sourceLineNo">1018</span>        if (!isStopped() &amp;&amp; !isAborted()) {<a name="line.1018"></a>
-<span class="sourceLineNo">1019</span>          this.sleeper.sleep();<a name="line.1019"></a>
-<span class="sourceLineNo">1020</span>        }<a name="line.1020"></a>
-<span class="sourceLineNo">1021</span>      } // for<a name="line.1021"></a>
-<span class="sourceLineNo">1022</span>    } catch (Throwable t) {<a name="line.1022"></a>
-<span class="sourceLineNo">1023</span>      if (!rpcServices.checkOOME(t)) {<a name="line.1023"></a>
-<span class="sourceLineNo">1024</span>        String prefix = t instanceof YouAreDeadException? "": "Unhandled: ";<a name="line.1024"></a>
-<span class="sourceLineNo">1025</span>        abort(prefix + t.getMessage(), t);<a name="line.1025"></a>
-<span class="sourceLineNo">1026</span>      }<a name="line.1026"></a>
-<span class="sourceLineNo">1027</span>    }<a name="line.1027"></a>
-<span class="sourceLineNo">1028</span>    if (this.leases != null) {<a name="line.1028"></a>
-<span class="sourceLineNo">1029</span>      this.leases.closeAfterLeasesExpire();<a name="line.1029"></a>
-<span class="sourceLineNo">1030</span>    }<a name="line.1030"></a>
-<span class="sourceLineNo">1031</span>    if (this.splitLogWorker != null) {<a name="line.1031"></a>
-<span class="sourceLineNo">1032</span>      splitLogWorker.stop();<a name="line.1032"></a>
-<span class="sourceLineNo">1033</span>    }<a name="line.1033"></a>
-<span class="sourceLineNo">1034</span>    if (this.infoServer != null) {<a name="line.1034"></a>
-<span class="sourceLineNo">1035</span>      LOG.info("Stopping infoServer");<a name="line.1035"></a>
-<span class="sourceLineNo">1036</span>      try {<a name="line.1036"></a>
-<span class="sourceLineNo">1037</span>        this.infoServer.stop();<a name="line.1037"></a>
-<span class="sourceLineNo">1038</span>      } catch (Exception e) {<a name="line.1038"></a>
-<span class="sourceLineNo">1039</span>        LOG.error("Failed to stop infoServer", e);<a name="line.1039"></a>
-<span class="sourceLineNo">1040</span>      }<a name="line.1040"></a>
-<span class="sourceLineNo">1041</span>    }<a name="line.1041"></a>
-<span class="sourceLineNo">1042</span>    // Send cache a shutdown.<a name="line.1042"></a>
-<span class="sourceLineNo">1043</span>    if (cacheConfig != null &amp;&amp; cacheConfig.isBlockCacheEnabled()) {<a name="line.1043"></a>
-<span class="sourceLineNo">1044</span>      cacheConfig.getBlockCache().shutdown();<a name="line.1044"></a>
-<span class="sourceLineNo">1045</span>    }<a name="line.1045"></a>
-<span class="sourceLineNo">1046</span>    mobCacheConfig.getMobFileCache().shutdown();<a name="line.1046"></a>
-<span class="sourceLineNo">1047</span><a name="line.1047"></a>
-<span class="sourceLineNo">1048</span>    if (movedRegionsCleaner != null) {<a name="line.1048"></a>
-<span class="sourceLineNo">1049</span>      movedRegionsCleaner.stop("Region Server stopping");<a name="line.1049"></a>
-<span class="sourceLineNo">1050</span>    }<a name="line.1050"></a>
-<span class="sourceLineNo">1051</span><a name="line.1051"></a>
-<span class="sourceLineNo">1052</span>    // Send interrupts to wake up threads if sleeping so they notice shutdown.<a name="line.1052"></a>
-<span class="sourceLineNo">1053</span>    // TODO: Should we check they are alive? If OOME could have exited already<a name="line.1053"></a>
-<span class="sourceLineNo">1054</span>    if (this.hMemManager != null) this.hMemManager.stop();<a name="line.1054"></a>
-<span class="sourceLineNo">1055</span>    if (this.cacheFlusher != null) this.cacheFlusher.interruptIfNecessary();<a name="line.1055"></a>
-<span class="sourceLineNo">1056</span>    if (this.compactSplitThread != null) this.compactSplitThread.interruptIfNecessary();<a name="line.1056"></a>
-<span class="sourceLineNo">1057</span>    sendShutdownInterrupt();<a name="line.1057"></a>
-<span class="sourceLineNo">1058</span><a name="line.1058"></a>
-<span class="sourceLineNo">1059</span>    // Stop the snapshot and other procedure handlers, forcefully killing all running tasks<a name="line.1059"></a>
-<span class="sourceLineNo">1060</span>    if (rspmHost != null) {<a name="line.1060"></a>
-<span class="sourceLineNo">1061</span>      rspmHost.stop(this.abortRequested || this.killed);<a name="line.1061"></a>
-<span class="sourceLineNo">1062</span>    }<a name="line.1062"></a>
-<span class="sourceLineNo">1063</span><a name="line.1063"></a>
-<span class="sourceLineNo">1064</span>    if (this.killed) {<a name="line.1064"></a>
-<span class="sourceLineNo">1065</span>      // Just skip out w/o closing regions.  Used when testing.<a name="line.1065"></a>
-<span class="sourceLineNo">1066</span>    } else if (abortRequested) {<a name="line.1066"></a>
-<span class="sourceLineNo">1067</span>      if (this.fsOk) {<a name="line.1067"></a>
-<span class="sourceLineNo">1068</span>        closeUserRegions(abortRequested); // Don't leave any open file handles<a name="line.1068"></a>
-<span class="sourceLineNo">1069</span>      }<a name="line.1069"></a>
-<span class="sourceLineNo">1070</span>      LOG.info("aborting server " + this.serverName);<a name="line.1070"></a>
-<span class="sourceLineNo">1071</span>    } else {<a name="line.1071"></a>
-<span class="sourceLineNo">1072</span>      closeUserRegions(abortRequested);<a name="line.1072"></a>
-<span class="sourceLineNo">1073</span>      LOG.info("stopping server " + this.serverName);<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>    // so callers waiting for meta without timeout can stop<a name="line.1076"></a>
-<span class="sourceLineNo">1077</span>    if (this.metaTableLocator != null) this.metaTableLocator.stop();<a name="line.1077"></a>
-<span class="sourceLineNo">1078</span>    if (this.clusterConnection != null &amp;&amp; !clusterConnection.isClosed()) {<a name="line.1078"></a>
-<span class="sourceLineNo">1079</span>      try {<a name="line.1079"></a>
-<span class="sourceLineNo">1080</span>        this.clusterConnection.close();<a name="line.1080"></a>
-<span class="sourceLineNo">1081</span>      } catch (IOException e) {<a name="line.1081"></a>
-<span class="sourceLineNo">1082</span>        // Although the {@link Closeable} interface throws an {@link<a name="line.1082"></a>
-<span class="sourceLineNo">1083</span>        // IOException}, in reality, the implementation would never do that.<a name="line.1083"></a>
-<span class="sourceLineNo">1084</span>        LOG.warn("Attempt to close server's short circuit ClusterConnection failed.", e);<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>    // Closing the compactSplit thread before closing meta regions<a name="line.1088"></a>
-<span class="sourceLineNo">1089</span>    if (!this.killed &amp;&amp; containsMetaTableRegions()) {<a name="line.1089"></a>
-<span class="sourceLineNo">1090</span>      if (!abortRequested || this.fsOk) {<a name="line.1090"></a>
-<span class="sourceLineNo">1091</span>        if (this.compactSplitThread != null) {<a name="line.1091"></a>
-<span class="sourceLineNo">1092</span>          this.compactSplitThread.join();<a name="line.1092"></a>
-<span class="sourceLineNo">1093</span>          this.compactSplitThread = null;<a name="line.1093"></a>
-<span class="sourceLineNo">1094</span>        }<a name="line.1094"></a>
-<span class="sourceLineNo">1095</span>        closeMetaTableRegions(abortRequested);<a name="line.1095"></a>
-<span class="sourceLineNo">1096</span>      }<a name="line.1096"></a>
-<span class="sourceLineNo">1097</span>    }<a name="line.1097"></a>
-<span class="sourceLineNo">1098</span><a name="line.1098"></a>
-<span class="sourceLineNo">1099</span>    if (!this.killed &amp;&amp; this.fsOk) {<a name="line.1099"></a>
-<span class="sourceLineNo">1100</span>      waitOnAllRegionsToClose(abortRequested);<a name="line.1100"></a>
-<span class="sourceLineNo">1101</span>      LOG.info("stopping server " + this.serverName + "; all regions closed.");<a name="line.1101"></a>
-<span class="sourceLineNo">1102</span>    }<a name="line.1102"></a>
-<span class="sourceLineNo">1103</span><a name="line.1103"></a>
-<span class="sourceLineNo">1104</span>    // Stop the quota manager<a name="line.1104"></a>
-<span class="sourceLineNo">1105</span>    if (rsQuotaManager != null) {<a name="line.1105"></a>
-<span class="sourceLineNo">1106</span>      rsQuotaManager.stop();<a name="line.1106"></a>
-<span class="sourceLineNo">1107</span>    }<a name="line.1107"></a>
-<span class="sourceLineNo">1108</span>    if (rsSpaceQuotaManager != null) {<a name="line.1108"></a>
-<span class="sourceLineNo">1109</span>      rsSpaceQuotaManager.stop();<a name="line.1109"></a>
-<span class="sourceLineNo">1110</span>      rsSpaceQuotaManager = null;<a name="line.1110"></a>
-<span class="sourceLineNo">1111</span>    }<a name="line.1111"></a>
-<span class="sourceLineNo">1112</span><a name="line.1112"></a>
-<span class="sourceLineNo">1113</span>    //fsOk flag may be changed when closing regions throws exception.<a name="line.1113"></a>
-<span class="sourceLineNo">1114</span>    if (this.fsOk) {<a name="line.1114"></a>
-<span class="sourceLineNo">1115</span>      shutdownWAL(!abortRequested);<a name="line.1115"></a>
-<span class="sourceLineNo">1116</span>    }<a name="line.1116"></a>
-<span class="sourceLineNo">1117</span><a name="line.1117"></a>
-<span class="sourceLineNo">1118</span>    // Make sure the proxy is down.<a name="line.1118"></a>
-<span class="sourceLineNo">1119</span>    if (this.rssStub != null) {<a name="line.1119"></a>
-<span class="sourceLineNo">1120</span>      this.rssStub = null;<a name="line.1120"></a>
-<span class="sourceLineNo">1121</span>    }<a name="line.1121"></a>
-<span class="sourceLineNo">1122</span>    if (this.lockStub != null) {<a name="line.1122"></a>
-<span class="sourceLineNo">1123</span>      this.lockStub = null;<a name="line.1123"></a>
-<span class="sourceLineNo">1124</span>    }<a name="line.1124"></a>
-<span class="sourceLineNo">1125</span>    if (this.rpcClient != null) {<a name="line.1125"></a>
-<span class="sourceLineNo">1126</span>      this.rpcClient.close();<a name="line.1126"></a>
-<span class="sourceLineNo">1127</span>    }<a name="line.1127"></a>
-<span class="sourceLineNo">1128</span>    if (this.leases != null) {<a name="line.1128"></a>
-<span class="sourceLineNo">1129</span>      this.leases.close();<a name="line.1129"></a>
-<span class="sourceLineNo">1130</span>    }<a name="line.1130"></a>
-<span class="sourceLineNo">1131</span>    if (this.pauseMonitor != null) {<a name="line.1131"></a>
-<span class="sourceLineNo">1132</span>      this.pauseMonitor.stop();<a name="line.1132"></a>
-<span class="sourceLineNo">1133</span>    }<a name="line.1133"></a>
-<span class="sourceLineNo">1134</span><a name="line.1134"></a>
-<span class="sourceLineNo">1135</span>    if (!killed) {<a name="line.1135"></a>
-<span class="sourceLineNo">1136</span>      stopServiceThreads();<a name="line.1136"></a>
-<span class="sourceLineNo">1137</span>    }<a name="line.1137"></a>
-<span class="sourceLineNo">1138</span><a name="line.1138"></a>
-<span class="sourceLineNo">1139</span>    if (this.rpcServices != null) {<a name="line.1139"></a>
-<span class="sourceLineNo">1140</span>      this.rpcServices.stop();<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>    try {<a name="line.1143"></a>
-<span class="sourceLineNo">1144</span>      deleteMyEphemeralNode();<a name="line.1144"></a>
-<span class="sourceLineNo">1145</span>    } catch (KeeperException.NoNodeException nn) {<a name="line.1145"></a>
-<span class="sourceLineNo">1146</span>    } catch (KeeperException e) {<a name="line.1146"></a>
-<span class="sourceLineNo">1147</span>      LOG.warn("Failed deleting my ephemeral node", e);<a name="line.1147"></a>
-<span class="sourceLineNo">1148</span>    }<a name="line.1148"></a>
-<span class="sourceLineNo">1149</span>    // We may have failed to delete the znode at the previous step, but<a name="line.1149"></a>
-<span class="sourceLineNo">1150</span>    //  we delete the file anyway: a second attempt to delete the znode is likely to fail again.<a name="line.1150"></a>
-<span class="sourceLineNo">1151</span>    ZNodeClearer.deleteMyEphemeralNodeOnDisk();<a name="line.1151"></a>
-<span class="sourceLineNo">1152</span><a name="line.1152"></a>
-<span class="sourceLineNo">1153</span>    if (this.zooKeeper != null) {<a name="line.1153"></a>
-<span class="sourceLineNo">1154</span>      this.zooKeeper.close();<a name="line.1154"></a>
-<span class="sourceLineNo">1155</span>    }<a name="line.1155"></a>
-<span class="sourceLineNo">1156</span>    this.shutDown = true;<a name="line.1156"></a>
-<span class="sourceLineNo">1157</span>    LOG.info("Exiting; stopping=" + this.serverName + "; zookeeper connection closed.");<a name="line.1157"></a>
-<span class="sourceLineNo">1158</span>  }<a name="line.1158"></a>
-<span class="sourceLineNo">1159</span><a name="line.1159"></a>
-<span class="sourceLineNo">1160</span>  private boolean containsMetaTableRegions() {<a name="line.1160"></a>
-<span class="sourceLineNo">1161</span>    return onlineRegions.containsKey(RegionInfoBuilder.FIRST_META_REGIONINFO.getEncodedName());<a name="line.1161"></a>
-<span class="sourceLineNo">1162</span>  }<a name="line.1162"></a>
-<span class="sourceLineNo">1163</span><a name="line.1163"></a>
-<span class="sourceLineNo">1164</span>  private boolean areAllUserRegionsOffline() {<a name="line.1164"></a>
-<span class="sourceLineNo">1165</span>    if (getNumberOfOnlineRegions() &gt; 2) return false;<a name="line.1165"></a>
-<span class="sourceLineNo">1166</span>    boolean allUserRegionsOffline = true;<a name="line.1166"></a>
-<span class="sourceLineNo">1167</span>    for (Map.Entry&lt;String, HRegion&gt; e: this.onlineRegions.entrySet()) {<a name="line.1167"></a>
-<span class="sourceLineNo">1168</span>      if (!e.getValue().getRegionInfo().isMetaRegion()) {<a name="line.1168"></a>
-<span class="sourceLineNo">1169</span>        allUserRegionsOffline = false;<a name="line.1169"></a>
-<span class="sourceLineNo">1170</span>        break;<a name="line.1170"></a>
-<span class="sourceLineNo">1171</span>      }<a name="line.1171"></a>
-<span class="sourceLineNo">1172</span>    }<a name="line.1172"></a>
-<span class="sourceLineNo">1173</span>    return allUserRegionsOffline;<a name="line.1173"></a>
-<span class="sourceLineNo">1174</span>  }<a name="line.1174"></a>
-<span class="sourceLineNo">1175</span><a name="line.1175"></a>
-<span class="sourceLineNo">1176</span>  /**<a name="line.1176"></a>
-<span class="sourceLineNo">1177</span>   * @return Current write count for all online regions.<a name="line.1177"></a>
-<span class="sourceLineNo">1178</span>   */<a name="line.1178"></a>
-<span class="sourceLineNo">1179</span>  private long getWriteRequestCount() {<a name="line.1179"></a>
-<span class="sourceLineNo">1180</span>    long writeCount = 0;<a name="line.1180"></a>
-<span class="sourceLineNo">1181</span>    for (Map.Entry&lt;String, HRegion&gt; e: this.onlineRegions.entrySet()) {<a name="line.1181"></a>
-<span class="sourceLineNo">1182</span>      writeCount += e.getValue().getWriteRequestsCount();<a name="line.1182"></a>
-<span class="sourceLineNo">1183</span>    }<a name="line.1183"></a>
-<span class="sourceLineNo">1184</span>    return writeCount;<a name="line.1184"></a>
-<span class="sourceLineNo">1185</span>  }<a name="line.1185"></a>
-<span class="sourceLineNo">1186</span><a name="line.1186"></a>
-<span class="sourceLineNo">1187</span>  @VisibleForTesting<a name="line.1187"></a>
-<span class="sourceLineNo">1188</span>  protected void tryRegionServerReport(long reportStartTime, long reportEndTime)<a name="line.1188"></a>
-<span class="sourceLineNo">1189</span>      throws IOException {<a name="line.1189"></a>
-<span class="sourceLineNo">1190</span>    RegionServerStatusService.BlockingInterface rss = rssStub;<a name="line.1190"></a>
-<span class="sourceLineNo">1191</span>    if (rss == null) {<a name="line.1191"></a>
-<span class="sourceLineNo">1192</span>      // the current server could be stopping.<a name="line.1192"></a>
-<span class="sourceLineNo">1193</span>      return;<a name="line.1193"></a>
-<span class="sourceLineNo">1194</span>    }<a name="line.1194"></a>
-<span class="sourceLineNo">1195</span>    ClusterStatusProtos.ServerLoad sl = buildServerLoad(reportStartTime, reportEndTime);<a name="line.1195"></a>
-<span class="sourceLineNo">1196</span>    try {<a name="line.1196"></a>
-<span class="sourceLineNo">1197</span>      RegionServerReportRequest.Builder request = RegionServerReportRequest.newBuilder();<a name="line.1197"></a>
-<span class="sourceLineNo">1198</span>      request.setServer(ProtobufUtil.toServerName(this.serverName));<a name="line.1198"></a>
-<span class="sourceLineNo">1199</span>      request.setLoad(sl);<a name="line.1199"></a>
-<span class="sourceLineNo">1200</span>      rss.regionServerReport(null, request.build());<a name="line.1200"></a>
-<span class="sourceLineNo">1201</span>    } catch (ServiceException se) {<a name="line.1201"></a>
-<span class="sourceLineNo">1202</span>      IOException ioe = ProtobufUtil.getRemoteException(se);<a name="line.1202"></a>
-<span class="sourceLineNo">1203</span>      if (ioe instanceof YouAreDeadException) {<a name="line.1203"></a>
-<span class="sourceLineNo">1204</span>        // This will be caught and handled as a fatal error in run()<a name="line.1204"></a>
-<span class="sourceLineNo">1205</span>        throw ioe;<a name="line.1205"></a>
-<span class="sourceLineNo">1206</span>      }<a name="line.1206"></a>
-<span class="sourceLineNo">1207</span>      if (rssStub == rss) {<a name="line.1207"></a>
-<span class="sourceLineNo">1208</span>        rssStub = null;<a name="line.1208"></a>
-<span class="sourceLineNo">1209</span>      }<a name="line.1209"></a>
-<span class="sourceLineNo">1210</span>      // Couldn't connect to the master, get location from zk and reconnect<a name="line.1210"></a>
-<span class="sourceLineNo">1211</span>      // Method blocks until new master is found or we are stopped<a name="line.1211"></a>
-<span class="sourceLineNo">1212</span>      createRegionServerStatusStub(true);<a name="line.1212"></a>
-<span class="sourceLineNo">1213</span>    }<a name="line.1213"></a>
-<span class="sourceLineNo">1214</span>  }<a name="line.1214"></a>
-<span class="sourceLineNo">1215</span><a name="line.1215"></a>
-<span class="sourceLineNo">1216</span>  /**<a name="line.1216"></a>
-<span class="sourceLineNo">1217</span>   * Reports the given map of Regions and their size on the filesystem to the active Master.<a name="line.1217"></a>
-<span class="sourceLineNo">1218</span>   *<a name="line.1218"></a>
-<span class="sourceLineNo">1219</span>   * @param regionSizeStore The store containing region sizes<a name="line.1219"></a>
-<span class="sourceLineNo">1220</span>   * @return false if FileSystemUtilizationChore should pause reporting to master. true otherwise<a name="line.1220"></a>
-<span class="sourceLineNo">1221</span>   */<a name="line.1221"></a>
-<span class="sourceLineNo">1222</span>  public boolean reportRegionSizesForQuotas(RegionSizeStore regionSizeStore) {<a name="line.1222"></a>
-<span class="sourceLineNo">1223</span>    RegionServerStatusService.BlockingInterface rss = rssStub;<a name="line.1223"></a>
-<span class="sourceLineNo">1224</span>    if (rss == null) {<a name="line.1224"></a>
-<span class="sourceLineNo">1225</span>      // the current server could be stopping.<a name="line.1225"></a>
-<span class="sourceLineNo">1226</span>      LOG.trace("Skipping Region size report to HMaster as stub is null");<a name="line.1226"></a>
-<span class="sourceLineNo">1227</span>      return true;<a name="line.1227"></a>
-<span class="sourceLineNo">1228</span>    }<a name="line.1228"></a>
-<span class="sourceLineNo">1229</span>    try {<a name="line.1229"></a>
-<span class="sourceLineNo">1230</span>      buildReportAndSend(rss, regionSizeStore);<a name="line.1230"></a>
-<span class="sourceLineNo">1231</span>    } catch (ServiceException se) {<a name="line.1231"></a>
-<span class="sourceLineNo">1232</span>      IOException ioe = ProtobufUtil.getRemoteException(se);<a name="line.1232"></a>
-<span class="sourceLineNo">1233</span>      if (ioe instanceof PleaseHoldException) {<a name="line.1233"></a>
-<span class="sourceLineNo">1234</span>        LOG.trace("Failed to report region sizes to Master because it is initializing."<a name="line.1234"></a>
-<span class="sourceLineNo">1235</span>            + " This will be retried.", ioe);<a name="line.1235"></a>
-<span class="sourceLineNo">1236</span>        // The Master is coming up. Will retry the report later. Avoid re-creating the stub.<a name="line.1236"></a>
-<span class="sourceLineNo">1237</span>        return true;<a name="line.1237"></a>
-<span class="sourceLineNo">1238</span>      }<a name="line.1238"></a>
-<span class="sourceLineNo">1239</span>      if (rssStub == rss) {<a name="line.1239"></a>
-<span class="sourceLineNo">1240</span>        rssStub = null;<a name="line.1240"></a>
-<span class="sourceLineNo">1241</span>      }<a name="line.1241"></a>
-<span class="sourceLineNo">1242</span>      createRegionServerStatusStub(true);<a name="line.1242"></a>
-<span class="sourceLineNo">1243</span>      if (ioe instanceof DoNotRetryIOException) {<a name="line.1243"></a>
-<span class="sourceLineNo">1244</span>        DoNotRetryIOException doNotRetryEx = (DoNotRetryIOException) ioe;<a name="line.1244"></a>
-<span class="sourceLineNo">1245</span>        if (doNotRetryEx.getCause() != null) {<a name="line.1245"></a>
-<span class="sourceLineNo">1246</span>          Throwable t = doNotRetryEx.getCause();<a name="line.1246"></a>
-<span class="sourceLineNo">1247</span>          if (t instanceof UnsupportedOperationException) {<a name="line.1247"></a>
-<span class="sourceLineNo">1248</span>            LOG.debug("master doesn't support ReportRegionSpaceUse, pause before retrying");<a name="line.1248"></a>
-<span class="sourceLineNo">1249</span>            return false;<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>      }<a name="line.1252"></a>
-<span class="sourceLineNo">1253</span>      LOG.debug("Failed to report region sizes to Master. This will be retried.", ioe);<a name="line.1253"></a>
-<span class="sourceLineNo">1254</span>    }<a name="line.1254"></a>
-<span class="sourceLineNo">1255</span>    return true;<a name="line.1255"></a>
-<span class="sourceLineNo">1256</span>  }<a name="line.1256"></a>
-<span class="sourceLineNo">1257</span><a name="line.1257"></a>
-<span class="sourceLineNo">1258</span>  /**<a name="line.1258"></a>
-<span class="sourceLineNo">1259</span>   * Builds the region size report and sends it to the master. Upon successful sending of the<a name="line.1259"></a>
-<span class="sourceLineNo">1260</span>   * report, the region sizes that were sent are marked as sent.<a name="line.1260"></a>
-<span class="sourceLineNo">1261</span>   *<a name="line.1261"></a>
-<span class="sourceLineNo">1262</span>   * @param rss The stub to send to the Master<a name="line.1262"></a>
-<span class="sourceLineNo">1263</span>   * @param regionSizeStore The store containing region sizes<a name="line.1263"></a>
-<span class="sourceLineNo">1264</span>   */<a name="line.1264"></a>
-<span class="sourceLineNo">1265</span>  void buildReportAndSend(RegionServerStatusService.BlockingInterface rss,<a name="line.1265"></a>
-<span class="sourceLineNo">1266</span>      RegionSizeStore regionSizeStore) throws ServiceException {<a name="line.1266"></a>
-<span class="sourceLineNo">1267</span>    RegionSpaceUseReportRequest request =<a name="line.1267"></a>
-<span class="sourceLineNo">1268</span>        buildRegionSpaceUseReportRequest(Objects.requireNonNull(regionSizeStore));<a name="line.1268"></a>
-<span class="sourceLineNo">1269</span>    rss.reportRegionSpaceUse(null, request);<a name="line.1269"></a>
-<span class="sourceLineNo">1270</span>    // Record the number of size reports sent<a name="line.1270"></a>
-<span class="sourceLineNo">1271</span>    if (metricsRegionServer != null) {<a name="line.1271"></a>
-<span class="sourceLineNo">1272</span>      metricsRegionServer.incrementNumRegionSizeReportsSent(regionSizeStore.size());<a name="line.1272"></a>
-<span class="sourceLineNo">1273</span>    }<a name="line.1273"></a>
-<span class="sourceLineNo">1274</span>  }<a name="line.1274"></a>
-<span class="sourceLineNo">1275</span><a name="line.1275"></a>
-<span class="sourceLineNo">1276</span>  /**<a name="line.1276"></a>
-<span class="sourceLineNo">1277</span>   * Builds a {@link RegionSpaceUseReportRequest} protobuf message from the region size map.<a name="line.1277"></a>
-<span class="sourceLineNo">1278</span>   *<a name="line.1278"></a>
-<span class="sourceLineNo">1279</span>   * @param regionSizes The size in bytes of regions<a name="line.1279"></a>
-<span class="sourceLineNo">1280</span>   * @return The corresponding protocol buffer message.<a name="line.1280"></a>
-<span class="sourceLineNo">1281</span>   */<a name="line.1281"></a>
-<span class="sourceLineNo">1282</span>  RegionSpaceUseReportRequest buildRegionSpaceUseReportRequest(RegionSizeStore regionSizes) {<a name="line.1282"></a>
-<span class="sourceLineNo">1283</span>    RegionSpaceUseReportRequest.Builder request = RegionSpaceUseReportRequest.newBuilder();<a name="line.1283"></a>
-<span class="sourceLineNo">1284</span>    for (Entry&lt;RegionInfo, RegionSize&gt; entry : regionSizes) {<a name="line.1284"></a>
-<span class="sourceLineNo">1285</span>      request.addSpaceUse(convertRegionSize(entry.getKey(), entry.getValue().getSize()));<a name="line.1285"></a>
-<span class="sourceLineNo">1286</span>    }<a name="line.1286"></a>
-<span class="sourceLineNo">1287</span>    return request.build();<a name="line.1287"></a>
-<span class="sourceLineNo">1288</span>  }<a name="line.1288"></a>
-<span class="sourceLineNo">1289</span><a name="line.1289"></a>
-<span class="sourceLineNo">1290</span>  /**<a name="line.1290"></a>
-<span class="sourceLineNo">1291</span>   * Converts a pair of {@link RegionInfo} and {@code long} into a {@link RegionSpaceUse}<a name="line.1291"></a>
-<span class="sourceLineNo">1292</span>   * protobuf message.<a name="line.1292"></a>
-<span class="sourceLineNo">1293</span>   *<a name="line.1293"></a>
-<span class="sourceLineNo">1294</span>   * @param regionInfo The RegionInfo<a name="line.1294"></a>
-<span class="sourceLineNo">1295</span>   * @param sizeInBytes The size in bytes of the Region<a name="line.1295"></a>
-<span class="sourceLineNo">1296</span>   * @return The protocol buffer<a name="line.1296"></a>
-<span class="sourceLineNo">1297</span>   */<a name="line.1297"></a>
-<span class="sourceLineNo">1298</span>  RegionSpaceUse convertRegionSize(RegionInfo regionInfo, Long sizeInBytes) {<a name="line.1298"></a>
-<span class="sourceLineNo">1299</span>    return RegionSpaceUse.newBuilder()<a name="line.1299"></a>
-<span class="sourceLineNo">1300</span>        .setRegionInfo(ProtobufUtil.toRegionInfo(Objects.requireNonNull(regionInfo)))<a name="line.1300"></a>
-<span class="sourceLineNo">1301</span>        .setRegionSize(Objects.requireNonNull(sizeInBytes))<a name="line.1301"></a>
-<span class="sourceLineNo">1302</span>        .build();<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>  ClusterStatusProtos.ServerLoad buildServerLoad(long reportStartTime, long reportEndTime)<a name="line.1305"></a>
-<span class="sourceLineNo">1306</span>      throws IOException {<a name="line.1306"></a>
-<span class="sourceLineNo">1307</span>    // We're getting the MetricsRegionServerWrapper here because the wrapper computes requests<a name="line.1307"></a>
-<span class="sourceLineNo">1308</span>    // per second, and other metrics  As long as metrics are part of ServerLoad it's best to use<a name="line.1308"></a>
-<span class="sourceLineNo">1309</span>    // the wrapper to compute those numbers in one place.<a name="line.1309"></a>
-<span class="sourceLineNo">1310</span>    // In the long term most of these should be moved off of ServerLoad and the heart beat.<a name="line.1310"></a>
-<span class="sourceLineNo">1311</span>    // Instead they should be stored in an HBase table so that external visibility into HBase is<a name="line.1311"></a>
-<span class="sourceLineNo">1312</span>    // improved; Additionally the load balancer will be able to take advantage of a more complete<a name="line.1312"></a>
-<span class="sourceLineNo">1313</span>    // history.<a name="line.1313"></a>
-<span class="sourceLineNo">1314</span>    MetricsRegionServerWrapper regionServerWrapper = metricsRegionServer.getRegionServerWrapper();<a name="line.1314"></a>
-<span class="sourceLineNo">1315</span>    Collection&lt;HRegion&gt; regions = getOnlineRegionsLocalContext();<a name="line.1315"></a>
-<span class="sourceLineNo">1316</span>    long usedMemory = -1L;<a name="line.1316"></a>
-<span class="sourceLineNo">1317</span>    long maxMemory = -1L;<a name="line.1317"></a>
-<span class="sourceLineNo">1318</span>    final MemoryUsage usage = MemorySizeUtil.safeGetHeapMemoryUsage();<a name="line.1318"></a>
-<span class="sourceLineNo">1319</span>    if (usage != null) {<a name="line.1319"></a>
-<span class="sourceLineNo">1320</span>      usedMemory = usage.getUsed();<a name="line.1320"></a>
-<span class="sourceLineNo">1321</span>      maxMemory = usage.getMax();<a name="line.1321"></a>
-<span class="sourceLineNo">1322</span>    }<a name="line.1322"></a>
-<span class="sourceLineNo">1323</span><a name="line.1323"></a>
-<span class="sourceLineNo">1324</span>    ClusterStatusProtos.ServerLoad.Builder serverLoad = ClusterStatusProtos.ServerLoad.newBuilder();<a name="line.1324"></a>
-<span class="sourceLineNo">1325</span>    serverLoad.setNumberOfRequests((int) regionServerWrapper.getRequestsPerSecond());<a name="line.1325"></a>
-<span class="sourceLineNo">1326</span>    serverLoad.setTotalNumberOfRequests(regionServerWrapper.getTotalRequestCount());<a name="line.1326"></a>
-<span class="sourceLineNo">1327</span>    serverLoad.setUsedHeapMB((int)(usedMemory / 1024 / 1024));<a name="line.1327"></a>
-<span class="sourceLineNo">1328</span>    serverLoad.setMaxHeapMB((int) (maxMemory / 1024 / 1024));<a name="line.1328"></a>
-<span class="sourceLineNo">1329</span>    Set&lt;String&gt; coprocessors = getWAL(null).getCoprocessorHost().getCoprocessors();<a name="line.1329"></a>
-<span class="sourceLineNo">1330</span>    Builder coprocessorBuilder = Coprocessor.newBuilder();<a name="line.1330"></a>
-<span class="sourceLineNo">1331</span>    for (String coprocessor : coprocessors) {<a name="line.1331"></a>
-<span class="sourceLineNo">1332</span>      serverLoad.addCoprocessors(coprocessorBuilder.setName(coprocessor).build());<a name="line.1332"></a>
-<span class="sourceLineNo">1333</span>    }<a name="line.1333"></a>
-<span class="sourceLineNo">1334</span>    RegionLoad.Builder regionLoadBldr = RegionLoad.newBuilder();<a name="line.1334"></a>
-<span class="sourceLineNo">1335</span>    RegionSpecifier.Builder regionSpecifier = RegionSpecifier.newBuilder();<a name="line.1335"></a>
-<span class="sourceLineNo">1336</span>    for (HRegion region : regions) {<a name="line.1336"></a>
-<span class="sourceLineNo">1337</span>      if (region.getCoprocessorHost() != null) {<a name="line.1337"></a>
-<span class="sourceLineNo">1338</span>        Set&lt;String&gt; regionCoprocessors = region.getCoprocessorHost().getCoprocessors();<a name="line.1338"></a>
-<span class="sourceLineNo">1339</span>        Iterator&lt;String&gt; iterator = regionCoprocessors.iterator();<a name="line.1339"></a>
-<span class="sourceLineNo">1340</span>        while (iterator.hasNext()) {<a name="line.1340"></a>
-<span class="sourceLineNo">1341</span>          serverLoad.addCoprocessors(coprocessorBuilder.setName(iterator.next()).build());<a name="line.1341"></a>
-<span class="sourceLineNo">1342</span>        }<a name="line.1342"></a>
-<span class="sourceLineNo">1343</span>      }<a name="line.1343"></a>
-<span class="sourceLineNo">1344</span>      serverLoad.addRegionLoads(createRegionLoad(region, regionLoadBldr, regionSpecifier));<a name="line.1344"></a>
-<span class="sourceLineNo">1345</span>      for (String coprocessor : getWAL(region.getRegionInfo()).getCoprocessorHost()<a name="line.1345"></a>
-<span class="sourceLineNo">1346</span>          .getCoprocessors()) {<a name="line.1346"></a>
-<span class="sourceLineNo">1347</span>        serverLoad.addCoprocessors(coprocessorBuilder.setName(coprocessor).build());<a name="line.1347"></a>
-<span class="sourceLineNo">1348</span>      }<a name="line.1348"></a>
-<span class="sourceLineNo">1349</span>    }<a name="line.1349"></a>
-<span class="sourceLineNo">1350</span>    serverLoad.setReportStartTime(reportStartTime);<a name="line.1350"></a>
-<span class="sourceLineNo">1351</span>    serverLoad.setReportEndTime(reportEndTime);<a name="line.1351"></a>
-<span class="sourceLineNo">1352</span>    if (this.infoServer != null) {<a name="line.1352"></a>
-<span class="sourceLineNo">1353</span>      serverLoad.setInfoServerPort(this.infoServer.getPort());<a name="line.1353"></a>
-<span class="sourceLineNo">1354</span>    } else {<a name="line.1354"></a>
-<span class="sourceLineNo">1355</span>      serverLoad.setInfoServerPort(-1);<a name="line.1355"></a>
-<span class="sourceLineNo">1356</span>    }<a name="line.1356"></a>
-<span class="sourceLineNo">1357</span><a name="line.1357"></a>
-<span class="sourceLineNo">1358</span>    // for the replicationLoad purpose. Only need to get from one executorService<a name="line.1358"></a>
-<span class="sourceLineNo">1359</span>    // either source or sink will get the same info<a name="line.1359"></a>
-<span class="sourceLineNo">1360</span>    ReplicationSourceService rsources = getReplicationSourceService();<a name="line.1360"></a>
-<span class="sourceLineNo">1361</span><a name="line.1361"></a>
-<span class="sourceLineNo">1362</span>    if (rsources != null) {<a name="line.1362"></a>
-<span class="sourceLineNo">1363</span>      // always refresh first to get the latest value<a name="line.1363"></a>
-<span class="sourceLineNo">1364</span>      ReplicationLoad rLoad = rsources.refreshAndGetReplicationLoad();<a name="line.1364"></a>
-<span class="sourceLineNo">1365</span>      if (rLoad != null) {<a name="line.1365"></a>
-<span class="sourceLineNo">1366</span>        serverLoad.setReplLoadSink(rLoad.getReplicationLoadSink());<a name="line.1366"></a>
-<span class="sourceLineNo">1367</span>        for (ClusterStatusProtos.ReplicationLoadSource rLS : rLoad.getReplicationLoadSourceList()) {<a name="line.1367"></a>
-<span class="sourceLineNo">1368</span>          serverLoad.addReplLoadSource(rLS);<a name="line.1368"></a>
-<span class="sourceLineNo">1369</span>        }<a name="line.1369"></a>
-<span class="sourceLineNo">1370</span>      }<a name="line.1370"></a>
-<span class="sourceLineNo">1371</span>    }<a name="line.1371"></a>
-<span class="sourceLineNo">1372</span><a name="line.1372"></a>
-<span class="sourceLineNo">1373</span>    return serverLoad.build();<a name="line.1373"></a>
-<span class="sourceLineNo">1374</span>  }<a name="line.1374"></a>
-<span class="sourceLineNo">1375</span><a name="line.1375"></a>
-<span class="sourceLineNo">1376</span>  String getOnlineRegionsAsPrintableString() {<a name="line.1376"></a>
-<span class="sourceLineNo">1377</span>    StringBuilder sb = new StringBuilder();<a name="line.1377"></a>
-<span class="sourceLineNo">1378</span>    for (Region r: this.onlineRegions.values()) {<a name="line.1378"></a>
-<span class="sourceLineNo">1379</span>      if (sb.length() &gt; 0) sb.append(", ");<a name="line.1379"></a>
-<span class="sourceLineNo">1380</span>      sb.append(r.getRegionInfo().getEncodedName());<a name="line.1380"></a>
-<span class="sourceLineNo">1381</span>    }<a name="line.1381"></a>
-<span class="sourceLineNo">1382</span>    return sb.toString();<a name="line.1382"></a>
-<span class="sourceLineNo">1383</span>  }<a name="line.1383"></a>
-<span class="sourceLineNo">1384</span><a name="line.1384"></a>
-<span class="sourceLineNo">1385</span>  /**<a name="line.1385"></a>
-<span class="sourceLineNo">1386</span>   * Wait on regions close.<a name="line.1386"></a>
-<span class="sourceLineNo">1387</span>   */<a name="line.1387"></a>
-<span class="sourceLineNo">1388</span>  private void waitOnAllRegionsToClose(final boolean abort) {<a name="line.1388"></a>
-<span class="sourceLineNo">1389</span>    // Wait till all regions are closed before going out.<a name="line.1389"></a>
-<span class="sourceLineNo">1390</span>    int lastCount = -1;<a name="line.1390"></a>
-<span class="sourceLineNo">1391</span>    long previousLogTime = 0;<a name="line.1391"></a>
-<span class="sourceLineNo">1392</span>    Set&lt;String&gt; closedRegions = new HashSet&lt;&gt;();<a name="line.1392"></a>
-<span class="sourceLineNo">1393</span>    boolean interrupted = false;<a name="line.1393"></a>
-<span class="sourceLineNo">1394</span>    try {<a name="line.1394"></a>
-<span class="sourceLineNo">1395</span>      while (!isOnlineRegionsEmpty()) {<a name="line.1395"></a>
-<span class="sourceLineNo">1396</span>        int count = getNumberOfOnlineRegions();<a name="line.1396"></a>
-<span class="sourceLineNo">1397</span>        // Only print a message if the count of regions has changed.<a name="line.1397"></a>
-<span class="sourceLineNo">1398</span>        if (count != lastCount) {<a name="line.1398"></a>
-<span class="sourceLineNo">1399</span>          // Log every second at most<a name="line.1399"></a>
-<span class="sourceLineNo">1400</span>          if (System.currentTimeMillis() &gt; (previousLogTime + 1000)) {<a name="line.1400"></a>
-<span class="sourceLineNo">1401</span>            previousLogTime = System.currentTimeMillis();<a name="line.1401"></a>
-<span class="sourceLineNo">1402</span>            lastCount = count;<a name="line.1402"></a>
-<span class="sourceLineNo">1403</span>            LOG.info("Waiting on " + count + " regions to close");<a name="line.1403"></a>
-<span class="sourceLineNo">1404</span>            // Only print out regions still closing if a small number else will<a name="line.1404"></a>
-<span class="sourceLineNo">1405</span>            // swamp the log.<a name="line.1405"></a>
-<span class="sourceLineNo">1406</span>            if (count &lt; 10 &amp;&amp; LOG.isDebugEnabled()) {<a name="line.1406"></a>
-<span class="sourceLineNo">1407</span>              LOG.debug("Online Regions=" + this.onlineRegions);<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>        }<a name="line.1410"></a>
-<span class="sourceLineNo">1411</span>        // Ensure all user regions have been sent a close. Use this to<a name="line.1411"></a>
-<span class="sourceLineNo">1412</span>        // protect against the case where an open comes in after we start the<a name="line.1412"></a>
-<span class="sourceLineNo">1413</span>        // iterator of onlineRegions to close all user regions.<a name="line.1413"></a>
-<span class="sourceLineNo">1414</span>        for (Map.Entry&lt;String, HRegion&gt; e : this.onlineRegions.entrySet()) {<a name="line.1414"></a>
-<span class="sourceLineNo">1415</span>          RegionInfo hri = e.getValue().getRegionInfo();<a name="line.1415"></a>
-<span class="sourceLineNo">1416</span>          if (!this.regionsInTransitionInRS.containsKey(hri.getEncodedNameAsBytes()) &amp;&amp;<a name="line.1416"></a>
-<span class="sourceLineNo">1417</span>              !closedRegions.contains(hri.getEncodedName())) {<a name="line.1417"></a>
-<span class="sourceLineNo">1418</span>            closedRegions.add(hri.getEncodedName());<a name="line.1418"></a>
-<span class="sourceLineNo">1419</span>            // Don't update zk with this close transition; pass false.<a name="line.1419"></a>
-<span class="sourceLineNo">1420</span>            closeRegionIgnoreErrors(hri, abort);<a name="line.1420"></a>
-<span class="sourceLineNo">1421</span>          }<a name="line.1421"></a>
-<span class="sourceLineNo">1422</span>        }<a name="line.1422"></a>
-<span class="sourceLineNo">1423</span>        // No regions in RIT, we could stop waiting now.<a name="line.1423"></a>
-<span class="sourceLineNo">1424</span>        if (this.regionsInTransitionInRS.isEmpty()) {<a name="line.1424"></a>
-<span class="sourceLineNo">1425</span>          if (!isOnlineRegionsEmpty()) {<a name="line.1425"></a>
-<span class="sourceLineNo">1426</span>            LOG.info("We were exiting though online regions are not empty," +<a name="line.1426"></a>
-<span class="sourceLineNo">1427</span>                " because some regions failed closing");<a name="line.1427"></a>
-<span class="sourceLineNo">1428</span>          }<a name="line.1428"></a>
-<span class="sourceLineNo">1429</span>          break;<a name="line.1429"></a>
-<span class="sourceLineNo">1430</span>        }<a name="line.1430"></a>
-<span class="sourceLineNo">1431</span>        if (sleep(200)) {<a name="line.1431"></a>
-<span class="sourceLineNo">1432</span>          interrupted = true;<a name="line.1432"></a>
-<span class="sourceLineNo">1433</span>        }<a name="line.1433"></a>
-<span class="sourceLineNo">1434</span>      }<a name="line.1434"></a>
-<span class="sourceLineNo">1435</span>    } finally {<a name="line.1435"></a>
-<span class="sourceLineNo">1436</span>      if (interrupted) {<a name="line.1436"></a>
-<span class="sourceLineNo">1437</span>        Thread.currentThread().interrupt();<a name="line.1437"></a>
-<span class="sourceLineNo">1438</span>      }<a name="line.1438"></a>
-<span class="sourceLineNo">1439</span>    }<a name="line.1439"></a>
-<span class="sourceLineNo">1440</span>  }<a name="line.1440"></a>
-<span class="sourceLineNo">1441</span><a name="line.1441"></a>
-<span class="sourceLineNo">1442</span>  private boolean sleep(long millis) {<a name="line.1442"></a>
-<span class="sourceLineNo">1443</span>    boolean interrupted = false;<a name="line.1443"></a>
-<span class="sourceLineNo">1444</span>    try {<a name="line.1444"></a>
-<span class="sourceLineNo">1445</span>      Thread.sleep(millis);<a name="line.1445"></a>
-<span class="sourceLineNo">1446</span>    } catch (InterruptedException e) {<a name="line.1446"></a>
-<span class="sourceLineNo">1447</span>      LOG.warn("Interrupted while sleeping");<a name="line.1447"></a>
-<span class="sourceLineNo">1448</span>      interrupted = true;<a name="line.1448"></a>
-<span class="sourceLineNo">1449</span>    }<a name="line.1449"></a>
-<span class="sourceLineNo">1450</span>    return interrupted;<a name="line.1450"></a>
-<span class="sourceLineNo">1451</span>  }<a name="line.1451"></a>
-<span class="sourceLineNo">1452</span><a name="line.1452"></a>
-<span class="sourceLineNo">1453</span>  private void shutdownWAL(final boolean close) {<a name="line.1453"></a>
-<span class="sourceLineNo">1454</span>    if (this.walFactory != null) {<a name="line.1454"></a>
-<span class="sourceLineNo">1455</span>      try {<a name="line.1455"></a>
-<span class="sourceLineNo">1456</span>        if (close) {<a name="line.1456"></a>
-<span class="sourceLineNo">1457</span>          walFactory.close();<a name="line.1457"></a>
-<span class="sourceLineNo">1458</span>        } else {<a name="line.1458"></a>
-<span class="sourceLineNo">1459</span>          walFactory.shutdown();<a name="line.1459"></a>
-<span class="sourceLineNo">1460</span>        }<a name="line.1460"></a>
-<span class="sourceLineNo">1461</span>      } catch (Throwable e) {<a name="line.1461"></a>
-<span class="sourceLineNo">1462</span>        e = e instanceof RemoteException ? ((RemoteException) e).unwrapRemoteException() : e;<a name="line.1462"></a>
-<span class="sourceLineNo">1463</span>        LOG.error("Shutdown / close of WAL failed: " + e);<a name="line.1463"></a>
-<span class="sourceLineNo">1464</span>        LOG.debug("Shutdown / close exception details:", e);<a name="line.1464"></a>
-<span class="sourceLineNo">1465</span>      }<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>   * Run init. Sets up wal and starts up all server threads.<a name="line.1470"></a>
-<span class="sourceLineNo">1471</span>   *<a name="line.1471"></a>
-<span class="sourceLineNo">1472</span>   * @param c Extra configuration.<a name="line.1472"></a>
-<span class="sourceLineNo">1473</span>   */<a name="line.1473"></a>
-<span class="sourceLineNo">1474</span>  protected void handleReportForDutyResponse(final RegionServerStartupResponse c)<a name="line.1474"></a>
-<span class="sourceLineNo">1475</span>  throws IOException {<a name="line.1475"></a>
-<span class="sourceLineNo">1476</span>    try {<a name="line.1476"></a>
-<span class="sourceLineNo">1477</span>      boolean updateRootDir = false;<a name="line.1477"></a>
-<span class="sourceLineNo">1478</span>      for (NameStringPair e : c.getMapEntriesList()) {<a name="line.1478"></a>
-<span class="sourceLineNo">1479</span>        String key = e.getName();<a name="line.1479"></a>
-<span class="sourceLineNo">1480</span>        // The hostname the master sees us as.<a name="line.1480"></a>
-<span class="sourceLineNo">1481</span>        if (key.equals(HConstants.KEY_FOR_HOSTNAME_SEEN_BY_MASTER)) {<a name="line.1481"></a>
-<span class="sourceLineNo">1482</span>          String hostnameFromMasterPOV = e.getValue();<a name="line.1482"></a>
-<span class="sourceLineNo">1483</span>          this.serverName = ServerName.valueOf(hostnameFromMasterPOV, rpcServices.isa.getPort(),<a name="line.1483"></a>
-<span class="sourceLineNo">1484</span>              this.startcode);<a name="line.1484"></a>
-<span class="sourceLineNo">1485</span>          if (!StringUtils.isBlank(useThisHostnameInstead) &amp;&amp;<a name="line.1485"></a>
-<span class="sourceLineNo">1486</span>              !hostnameFromMasterPOV.equals(useThisHostnameInstead)) {<a name="line.1486"></a>
-<span class="sourceLineNo">1487</span>            String msg = "Master passed us a different hostname to use; was=" +<a name="line.1487"></a>
-<span class="sourceLineNo">1488</span>                this.useThisHostnameInstead + ", but now=" + hostnameFromMasterPOV;<a name="line.1488"></a>
-<span class="sourceLineNo">1489</span>            LOG.error(msg);<a name="line.1489"></a>
-<span class="sourceLineNo">1490</span>            throw new IOException(msg);<a name="line.1490"></a>
-<span class="sourceLineNo">1491</span>          }<a name="line.1491"></a>
-<span class="sourceLineNo">1492</span>          if (StringUtils.isBlank(useThisHostnameInstead) &amp;&amp;<a name="line.1492"></a>
-<span class="sourceLineNo">1493</span>              !hostnameFromMasterPOV.equals(rpcServices.isa.getHostName())) {<a name="line.1493"></a>
-<span class="sourceLineNo">1494</span>            String msg = "Master passed us a different hostname to use; was=" +<a name="line.1494"></a>
-<span class="sourceLineNo">1495</span>                rpcServices.isa.getHostName() + ", but now=" + hostnameFromMasterPOV;<a name="line.1495"></a>
-<span class="sourceLineNo">1496</span>            LOG.error(msg);<a name="line.1496"></a>
-<span class="sourceLineNo">1497</span>          }<a name="line.1497"></a>
-<span class="sourceLineNo">1498</span>          continue;<a name="line.1498"></a>
-<span class="sourceLineNo">1499</span>        }<a name="line.1499"></a>
-<span class="sourceLineNo">1500</span><a name="line.1500"></a>
-<span class="sourceLineNo">1501</span>        String value = e.getValue();<a name="line.1501"></a>
-<span class="sourceLineNo">1502</span>        if (key.equals(HConstants.HBASE_DIR)) {<a name="line.1502"></a>
-<span class="sourceLineNo">1503</span>          if (value != null &amp;&amp; !value.equals(conf.get(HConstants.HBASE_DIR))) {<a name="line.1503"></a>
-<span class="sourceLineNo">1504</span>            updateRootDir = true;<a name="line.1504"></a>
-<span class="sourceLineNo">1505</span>          }<a name="line.1505"></a>
-<span class="sourceLineNo">1506</span>        }<a name="line.1506"></a>
-<span class="sourceLineNo">1507</span><a name="line.1507"></a>
-<span class="sourceLineNo">1508</span>        if (LOG.isDebugEnabled()) {<a name="line.1508"></a>
-<span class="sourceLineNo">1509</span>          LOG.debug("Config from master: " + key + "=" + value);<a name="line.1509"></a>
-<span class="sourceLineNo">1510</span>        }<a name="line.1510"></a>
-<span class="sourceLineNo">1511</span>        this.conf.set(key, value);<a name="line.1511"></a>
-<span class="sourceLineNo">1512</span>      }<a name="line.1512"></a>
-<span class="sourceLineNo">1513</span>      // Set our ephemeral znode up in zookeeper now we have a name.<a name="line.1513"></a>
-<span class="sourceLineNo">1514</span>      createMyEphemeralNode();<a name="line.1514"></a>
-<span class="sourceLineNo">1515</span><a name="line.1515"></a>
-<span class="sourceLineNo">1516</span>      if (updateRootDir) {<a name="line.1516"></a>
-<span class="sourceLineNo">1517</span>        // initialize file system by the config fs.defaultFS and hbase.rootdir from master<a name="line.1517"></a>
-<span class="sourceLineNo">1518</span>        initializeFileSystem();<a name="line.1518"></a>
-<span class="sourceLineNo">1519</span>      }<a name="line.1519"></a>
-<span class="sourceLineNo">1520</span><a name="line.1520"></a>
-<span class="sourceLineNo">1521</span>      // hack! Maps DFSClient =&gt; RegionServer for logs.  HDFS made this<a name="line.1521"></a>
-<span class="sourceLineNo">1522</span>      // config param for task trackers, but we can piggyback off of it.<a name="line.1522"></a>
-<span class="sourceLineNo">1523</span>      if (this.conf.get("mapreduce.task.attempt.id") == null) {<a name="line.1523"></a>
-<span class="sourceLineNo">1524</span>        this.conf.set("mapreduce.task.attempt.id", "hb_rs_" + this.serverName.toString());<a name="line.1524"></a>
-<span class="sourceLineNo">1525</span>      }<a name="line.1525"></a>
-<span class="sourceLineNo">1526</span><a name="line.1526"></a>
-<span class="sourceLineNo">1527</span>      // Save it in a file, this will allow to see if we crash<a name="line.1527"></a>
-<span class="sourceLineNo">1528</span>      ZNodeClearer.writeMyEphemeralNodeOnDisk(getMyEphemeralNodePath());<a name="line.1528"></a>
-<span class="sourceLineNo">1529</span><a name="line.1529"></a>
-<span class="sourceLineNo">1530</span>      // This call sets up an initialized replication and WAL. Later we start it up.<a name="line.1530"></a>
-<span class="sourceLineNo">1531</span>      setupWALAndReplication();<a name="line.1531"></a>
-<span class="sourceLineNo">1532</span>      // Init in here rather than in constructor after thread name has been set<a name="line.1532"></a>
-<span class="sourceLineNo">1533</span>      this.metricsTable = new MetricsTable(new MetricsTableWrapperAggregateImpl(this));<a name="line.1533"></a>
-<span class="sourceLineNo">1534</span>      this.metricsRegionServer = new MetricsRegionServer(<a name="line.1534"></a>
-<span class="sourceLineNo">1535</span>          new MetricsRegionServerWrapperImpl(this), conf, metricsTable);<a name="line.1535"></a>
-<span class="sourceLineNo">1536</span>      // Now that we have a metrics source, start the pause monitor<a name="line.1536"></a>
-<span class="sourceLineNo">1537</span>      this.pauseMonitor = new JvmPauseMonitor(conf, getMetrics().getMetricsSource());<a name="line.1537"></a>
-<span class="sourceLineNo">1538</span>      pauseMonitor.start();<a name="line.1538"></a>
-<span class="sourceLineNo">1539</span><a name="line.1539"></a>
-<span class="sourceLineNo">1540</span>      // There is a rare case where we do NOT want services to start. Check config.<a name="line.1540"></a>
-<span class="sourceLineNo">1541</span>      if (getConfiguration().getBoolean("hbase.regionserver.workers", true)) {<a name="line.1541"></a>
-<span class="sourceLineNo">1542</span>        startServices();<a name="line.1542"></a>
-<span class="sourceLineNo">1543</span>      }<a name="line.1543"></a>
-<span class="sourceLineNo">1544</span>      // In here we start up the replication Service. Above we initialized it. TODO. Reconcile.<a name="line.1544"></a>
-<span class="sourceLineNo">1545</span>      // or make sense of it.<a name="line.1545"></a>
-<span class="sourceLineNo">1546</span>      startReplicationService();<a name="line.1546"></a>
-<span class="sourceLineNo">1547</span><a name="line.1547"></a>
+<span class="sourceLineNo">951</span>      LOG.debug("About to register with Master.");<a name="line.951"></a>
+<span class="sourceLineNo">952</span>      RetryCounterFactory rcf = new RetryCounterFactory(Integer.MAX_VALUE,<a name="line.952"></a>
+<span class="sourceLineNo">953</span>          this.sleeper.getPeriod(), 1000 * 60 * 5);<a name="line.953"></a>
+<span class="sourceLineNo">954</span>      RetryCounter rc = rcf.create();<a name="line.954"></a>
+<span class="sourceLineNo">955</span>      while (keepLooping()) {<a name="line.955"></a>
+<span class="sourceLineNo">956</span>        RegionServerStartupResponse w = reportForDuty();<a name="line.956"></a>
+<span class="sourceLineNo">957</span>        if (w == null) {<a name="line.957"></a>
+<span class="sourceLineNo">958</span>          long sleepTime = rc.getBackoffTimeAndIncrementAttempts();<a name="line.958"></a>
+<span class="sourceLineNo">959</span>          LOG.warn("reportForDuty failed; sleeping {} ms and then retrying.", sleepTime);<a name="line.959"></a>
+<span class="sourceLineNo">960</span>          this.sleeper.sleep(sleepTime);<a name="line.960"></a>
+<span class="sourceLineNo">961</span>        } else {<a name="line.961"></a>
+<span class="sourceLineNo">962</span>          handleReportForDutyResponse(w);<a name="line.962"></a>
+<span class="sourceLineNo">963</span>          break;<a name="line.963"></a>
+<span class="sourceLineNo">964</span>        }<a name="line.964"></a>
+<span class="sourceLineNo">965</span>      }<a name="line.965"></a>
+<span class="sourceLineNo">966</span><a name="line.966"></a>
+<span class="sourceLineNo">967</span>      if (!isStopped() &amp;&amp; isHealthy()) {<a name="line.967"></a>
+<span class="sourceLineNo">968</span>        // start the snapshot handler and other procedure handlers,<a name="line.968"></a>
+<span class="sourceLineNo">969</span>        // since the server is ready to run<a name="line.969"></a>
+<span class="sourceLineNo">970</span>        if (this.rspmHost != null) {<a name="line.970"></a>
+<span class="sourceLineNo">971</span>          this.rspmHost.start();<a name="line.971"></a>
+<span class="sourceLineNo">972</span>        }<a name="line.972"></a>
+<span class="sourceLineNo">973</span>        // Start the Quota Manager<a name="line.973"></a>
+<span class="sourceLineNo">974</span>        if (this.rsQuotaManager != null) {<a name="line.974"></a>
+<span class="sourceLineNo">975</span>          rsQuotaManager.start(getRpcServer().getScheduler());<a name="line.975"></a>
+<span class="sourceLineNo">976</span>        }<a name="line.976"></a>
+<span class="sourceLineNo">977</span>        if (this.rsSpaceQuotaManager != null) {<a name="line.977"></a>
+<span class="sourceLineNo">978</span>          this.rsSpaceQuotaManager.start();<a name="line.978"></a>
+<span class="sourceLineNo">979</span>        }<a name="line.979"></a>
+<span class="sourceLineNo">980</span>      }<a name="line.980"></a>
+<span class="sourceLineNo">981</span><a name="line.981"></a>
+<span class="sourceLineNo">982</span>      // We registered with the Master.  Go into run mode.<a name="line.982"></a>
+<span class="sourceLineNo">983</span>      long lastMsg = System.currentTimeMillis();<a name="line.983"></a>
+<span class="sourceLineNo">984</span>      long oldRequestCount = -1;<a name="line.984"></a>
+<span class="sourceLineNo">985</span>      // The main run loop.<a name="line.985"></a>
+<span class="sourceLineNo">986</span>      while (!isStopped() &amp;&amp; isHealthy()) {<a name="line.986"></a>
+<span class="sourceLineNo">987</span>        if (!isClusterUp()) {<a name="line.987"></a>
+<span class="sourceLineNo">988</span>          if (isOnlineRegionsEmpty()) {<a name="line.988"></a>
+<span class="sourceLineNo">989</span>            stop("Exiting; cluster shutdown set and not carrying any regions");<a name="line.989"></a>
+<span class="sourceLineNo">990</span>          } else if (!this.stopping) {<a name="line.990"></a>
+<span class="sourceLineNo">991</span>            this.stopping = true;<a name="line.991"></a>
+<span class="sourceLineNo">992</span>            LOG.info("Closing user regions");<a name="line.992"></a>
+<span class="sourceLineNo">993</span>            closeUserRegions(this.abortRequested);<a name="line.993"></a>
+<span class="sourceLineNo">994</span>          } else if (this.stopping) {<a name="line.994"></a>
+<span class="sourceLineNo">995</span>            boolean allUserRegionsOffline = areAllUserRegionsOffline();<a name="line.995"></a>
+<span class="sourceLineNo">996</span>            if (allUserRegionsOffline) {<a name="line.996"></a>
+<span class="sourceLineNo">997</span>              // Set stopped if no more write requests tp meta tables<a name="line.997"></a>
+<span class="sourceLineNo">998</span>              // since last time we went around the loop.  Any open<a name="line.998"></a>
+<span class="sourceLineNo">999</span>              // meta regions will be closed on our way out.<a name="line.999"></a>
+<span class="sourceLineNo">1000</span>              if (oldRequestCount == getWriteRequestCount()) {<a name="line.1000"></a>
+<span class="sourceLineNo">1001</span>                stop("Stopped; only catalog regions remaining online");<a name="line.1001"></a>
+<span class="sourceLineNo">1002</span>                break;<a name="line.1002"></a>
+<span class="sourceLineNo">1003</span>              }<a name="line.1003"></a>
+<span class="sourceLineNo">1004</span>              oldRequestCount = getWriteRequestCount();<a name="line.1004"></a>
+<span class="sourceLineNo">1005</span>            } else {<a name="line.1005"></a>
+<span class="sourceLineNo">1006</span>              // Make sure all regions have been closed -- some regions may<a name="line.1006"></a>
+<span class="sourceLineNo">1007</span>              // have not got it because we were splitting at the time of<a name="line.1007"></a>
+<span class="sourceLineNo">1008</span>              // the call to closeUserRegions.<a name="line.1008"></a>
+<span class="sourceLineNo">1009</span>              closeUserRegions(this.abortRequested);<a name="line.1009"></a>
+<span class="sourceLineNo">1010</span>            }<a name="line.1010"></a>
+<span class="sourceLineNo">1011</span>            LOG.debug("Waiting on " + getOnlineRegionsAsPrintableString());<a name="line.1011"></a>
+<span class="sourceLineNo">1012</span>          }<a name="line.1012"></a>
+<span class="sourceLineNo">1013</span>        }<a name="line.1013"></a>
+<span class="sourceLineNo">1014</span>        long now = System.currentTimeMillis();<a name="line.1014"></a>
+<span class="sourceLineNo">1015</span>        if ((now - lastMsg) &gt;= msgInterval) {<a name="line.1015"></a>
+<span class="sourceLineNo">1016</span>          tryRegionServerReport(lastMsg, now);<a name="line.1016"></a>
+<span class="sourceLineNo">1017</span>          lastMsg = System.currentTimeMillis();<a name="line.1017"></a>
+<span class="sourceLineNo">1018</span>        }<a name="line.1018"></a>
+<span class="sourceLineNo">1019</span>        if (!isStopped() &amp;&amp; !isAborted()) {<a name="line.1019"></a>
+<span class="sourceLineNo">1020</span>          this.sleeper.sleep();<a name="line.1020"></a>
+<span class="sourceLineNo">1021</span>        }<a name="line.1021"></a>
+<span class="sourceLineNo">1022</span>      } // for<a name="line.1022"></a>
+<span class="sourceLineNo">1023</span>    } catch (Throwable t) {<a name="line.1023"></a>
+<span class="sourceLineNo">1024</span>      if (!rpcServices.checkOOME(t)) {<a name="line.1024"></a>
+<span class="sourceLineNo">1025</span>        String prefix = t instanceof YouAreDeadException? "": "Unhandled: ";<a name="line.1025"></a>
+<span class="sourceLineNo">1026</span>        abort(prefix + t.getMessage(), t);<a name="line.1026"></a>
+<span class="sourceLineNo">1027</span>      }<a name="line.1027"></a>
+<span class="sourceLineNo">1028</span>    }<a name="line.1028"></a>
+<span class="sourceLineNo">1029</span>    if (this.leases != null) {<a name="line.1029"></a>
+<span class="sourceLineNo">1030</span>      this.leases.closeAfterLeasesExpire();<a name="line.1030"></a>
+<span class="sourceLineNo">1031</span>    }<a name="line.1031"></a>
+<span class="sourceLineNo">1032</span>    if (this.splitLogWorker != null) {<a name="line.1032"></a>
+<span class="sourceLineNo">1033</span>      splitLogWorker.stop();<a name="line.1033"></a>
+<span class="sourceLineNo">1034</span>    }<a name="line.1034"></a>
+<span class="sourceLineNo">1035</span>    if (this.infoServer != null) {<a name="line.1035"></a>
+<span class="sourceLineNo">1036</span>      LOG.info("Stopping infoServer");<a name="line.1036"></a>
+<span class="sourceLineNo">1037</span>      try {<a name="line.1037"></a>
+<span class="sourceLineNo">1038</span>        this.infoServer.stop();<a name="line.1038"></a>
+<span class="sourceLineNo">1039</span>      } catch (Exception e) {<a name="line.1039"></a>
+<span class="sourceLineNo">1040</span>        LOG.error("Failed to stop infoServer", e);<a name="line.1040"></a>
+<span class="sourceLineNo">1041</span>      }<a name="line.1041"></a>
+<span class="sourceLineNo">1042</span>    }<a name="line.1042"></a>
+<span class="sourceLineNo">1043</span>    // Send cache a shutdown.<a name="line.1043"></a>
+<span class="sourceLineNo">1044</span>    if (cacheConfig != null &amp;&amp; cacheConfig.isBlockCacheEnabled()) {<a name="line.1044"></a>
+<span class="sourceLineNo">1045</span>      cacheConfig.getBlockCache().shutdown();<a name="line.1045"></a>
+<span class="sourceLineNo">1046</span>    }<a name="line.1046"></a>
+<span class="sourceLineNo">1047</span>    mobCacheConfig.getMobFileCache().shutdown();<a name="line.1047"></a>
+<span class="sourceLineNo">1048</span><a name="line.1048"></a>
+<span class="sourceLineNo">1049</span>    if (movedRegionsCleaner != null) {<a name="line.1049"></a>
+<span class="sourceLineNo">1050</span>      movedRegionsCleaner.stop("Region Server stopping");<a name="line.1050"></a>
+<span class="sourceLineNo">1051</span>    }<a name="line.1051"></a>
+<span class="sourceLineNo">1052</span><a name="line.1052"></a>
+<span class="sourceLineNo">1053</span>    // Send interrupts to wake up threads if sleeping so they notice shutdown.<a name="line.1053"></a>
+<span class="sourceLineNo">1054</span>    // TODO: Should we check they are alive? If OOME could have exited already<a name="line.1054"></a>
+<span class="sourceLineNo">1055</span>    if (this.hMemManager != null) this.hMemManager.stop();<a name="line.1055"></a>
+<span class="sourceLineNo">1056</span>    if (this.cacheFlusher != null) this.cacheFlusher.interruptIfNecessary();<a name="line.1056"></a>
+<span class="sourceLineNo">1057</span>    if (this.compactSplitThread != null) this.compactSplitThread.interruptIfNecessary();<a name="line.1057"></a>
+<span class="sourceLineNo">1058</span>    sendShutdownInterrupt();<a name="line.1058"></a>
+<span class="sourceLineNo">1059</span><a name="line.1059"></a>
+<span class="sourceLineNo">1060</span>    // Stop the snapshot and other procedure handlers, forcefully killing all running tasks<a name="line.1060"></a>
+<span class="sourceLineNo">1061</span>    if (rspmHost != null) {<a name="line.1061"></a>
+<span class="sourceLineNo">1062</span>      rspmHost.stop(this.abortRequested || this.killed);<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>    if (this.killed) {<a name="line.1065"></a>
+<span class="sourceLineNo">1066</span>      // Just skip out w/o closing regions.  Used when testing.<a name="line.1066"></a>
+<span class="sourceLineNo">1067</span>    } else if (abortRequested) {<a name="line.1067"></a>
+<span class="sourceLineNo">1068</span>      if (this.fsOk) {<a name="line.1068"></a>
+<span class="sourceLineNo">1069</span>        closeUserRegions(abortRequested); // Don't leave any open file handles<a name="line.1069"></a>
+<span class="sourceLineNo">1070</span>      }<a name="line.1070"></a>
+<span class="sourceLineNo">1071</span>      LOG.info("aborting server " + this.serverName);<a name="line.1071"></a>
+<span class="sourceLineNo">1072</span>    } else {<a name="line.1072"></a>
+<span class="sourceLineNo">1073</span>      closeUserRegions(abortRequested);<a name="line.1073"></a>
+<span class="sourceLineNo">1074</span>      LOG.info("stopping server " + this.serverName);<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>    // so callers waiting for meta without timeout can stop<a name="line.1077"></a>
+<span class="sourceLineNo">1078</span>    if (this.metaTableLocator != null) this.metaTableLocator.stop();<a name="line.1078"></a>
+<span class="sourceLineNo">1079</span>    if (this.clusterConnection != null &amp;&amp; !clusterConnection.isClosed()) {<a name="line.1079"></a>
+<span class="sourceLineNo">1080</span>      try {<a name="line.1080"></a>
+<span class="sourceLineNo">1081</span>        this.clusterConnection.close();<a name="line.1081"></a>
+<span class="sourceLineNo">1082</span>      } catch (IOException e) {<a name="line.1082"></a>
+<span class="sourceLineNo">1083</span>        // Although the {@link Closeable} interface throws an {@link<a name="line.1083"></a>
+<span class="sourceLineNo">1084</span>        // IOException}, in reality, the implementation would never do that.<a name="line.1084"></a>
+<span class="sourceLineNo">1085</span>        LOG.warn("Attempt to close server's short circuit ClusterConnection failed.", e);<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>    // Closing the compactSplit thread before closing meta regions<a name="line.1089"></a>
+<span class="sourceLineNo">1090</span>    if (!this.killed &amp;&amp; containsMetaTableRegions()) {<a name="line.1090"></a>
+<span class="sourceLineNo">1091</span>      if (!abortRequested || this.fsOk) {<a name="line.1091"></a>
+<span class="sourceLineNo">1092</span>        if (this.compactSplitThread != null) {<a name="line.1092"></a>
+<span class="sourceLineNo">1093</span>          this.compactSplitThread.join();<a name="line.1093"></a>
+<span class="sourceLineNo">1094</span>          this.compactSplitThread = null;<a name="line.1094"></a>
+<span class="sourceLineNo">1095</span>        }<a name="line.1095"></a>
+<span class="sourceLineNo">1096</span>        closeMetaTableRegions(abortRequested);<a name="line.1096"></a>
+<span class="sourceLineNo">1097</span>      }<a name="line.1097"></a>
+<span class="sourceLineNo">1098</span>    }<a name="line.1098"></a>
+<span class="sourceLineNo">1099</span><a name="line.1099"></a>
+<span class="sourceLineNo">1100</span>    if (!this.killed &amp;&amp; this.fsOk) {<a name="line.1100"></a>
+<span class="sourceLineNo">1101</span>      waitOnAllRegionsToClose(abortRequested);<a name="line.1101"></a>
+<span class="sourceLineNo">1102</span>      LOG.info("stopping server " + this.serverName + "; all regions closed.");<a name="line.1102"></a>
+<span class="sourceLineNo">1103</span>    }<a name="line.1103"></a>
+<span class="sourceLineNo">1104</span><a name="line.1104"></a>
+<span class="sourceLineNo">1105</span>    // Stop the quota manager<a name="line.1105"></a>
+<span class="sourceLineNo">1106</span>    if (rsQuotaManager != null) {<a name="line.1106"></a>
+<span class="sourceLineNo">1107</span>      rsQuotaManager.stop();<a name="line.1107"></a>
+<span class="sourceLineNo">1108</span>    }<a name="line.1108"></a>
+<span class="sourceLineNo">1109</span>    if (rsSpaceQuotaManager != null) {<a name="line.1109"></a>
+<span class="sourceLineNo">1110</span>      rsSpaceQuotaManager.stop();<a name="line.1110"></a>
+<span class="sourceLineNo">1111</span>      rsSpaceQuotaManager = null;<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>    //fsOk flag may be changed when closing regions throws exception.<a name="line.1114"></a>
+<span class="sourceLineNo">1115</span>    if (this.fsOk) {<a name="line.1115"></a>
+<span class="sourceLineNo">1116</span>      shutdownWAL(!abortRequested);<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>    // Make sure the proxy is down.<a name="line.1119"></a>
+<span class="sourceLineNo">1120</span>    if (this.rssStub != null) {<a name="line.1120"></a>
+<span class="sourceLineNo">1121</span>      this.rssStub = null;<a name="line.1121"></a>
+<span class="sourceLineNo">1122</span>    }<a name="line.1122"></a>
+<span class="sourceLineNo">1123</span>    if (this.lockStub != null) {<a name="line.1123"></a>
+<span class="sourceLineNo">1124</span>      this.lockStub = null;<a name="line.1124"></a>
+<span class="sourceLineNo">1125</span>    }<a name="line.1125"></a>
+<span class="sourceLineNo">1126</span>    if (this.rpcClient != null) {<a name="line.1126"></a>
+<span class="sourceLineNo">1127</span>      this.rpcClient.close();<a name="line.1127"></a>
+<span class="sourceLineNo">1128</span>    }<a name="line.1128"></a>
+<span class="sourceLineNo">1129</span>    if (this.leases != null) {<a name="line.1129"></a>
+<span class="sourceLineNo">1130</span>      this.leases.close();<a name="line.1130"></a>
+<span class="sourceLineNo">1131</span>    }<a name="line.1131"></a>
+<span class="sourceLineNo">1132</span>    if (this.pauseMonitor != null) {<a name="line.1132"></a>
+<span class="sourceLineNo">1133</span>      this.pauseMonitor.stop();<a name="line.1133"></a>
+<span class="sourceLineNo">1134</span>    }<a name="line.1134"></a>
+<span class="sourceLineNo">1135</span><a name="line.1135"></a>
+<span class="sourceLineNo">1136</span>    if (!killed) {<a name="line.1136"></a>
+<span class="sourceLineNo">1137</span>      stopServiceThreads();<a name="line.1137"></a>
+<span class="sourceLineNo">1138</span>    }<a name="line.1138"></a>
+<span class="sourceLineNo">1139</span><a name="line.1139"></a>
+<span class="sourceLineNo">1140</span>    if (this.rpcServices != null) {<a name="line.1140"></a>
+<span class="sourceLineNo">1141</span>      this.rpcServices.stop();<a name="line.1141"></a>
+<span class="sourceLineNo">1142</span>    }<a name="line.1142"></a>
+<span class="sourceLineNo">1143</span><a name="line.1143"></a>
+<span class="sourceLineNo">1144</span>    try {<a name="line.1144"></a>
+<span class="sourceLineNo">1145</span>      deleteMyEphemeralNode();<a name="line.1145"></a>
+<span class="sourceLineNo">1146</span>    } catch (KeeperException.NoNodeException nn) {<a name="line.1146"></a>
+<span class="sourceLineNo">1147</span>    } catch (KeeperException e) {<a name="line.1147"></a>
+<span class="sourceLineNo">1148</span>      LOG.warn("Failed deleting my ephemeral node", e);<a name="line.1148"></a>
+<span class="sourceLineNo">1149</span>    }<a name="line.1149"></a>
+<span class="sourceLineNo">1150</span>    // We may have failed to delete the znode at the previous step, but<a name="line.1150"></a>
+<span class="sourceLineNo">1151</span>    //  we delete the file anyway: a second attempt to delete the znode is likely to fail again.<a name="line.1151"></a>
+<span class="sourceLineNo">1152</span>    ZNodeClearer.deleteMyEphemeralNodeOnDisk();<a name="line.1152"></a>
+<span class="sourceLineNo">1153</span><a name="line.1153"></a>
+<span class="sourceLineNo">1154</span>    if (this.zooKeeper != null) {<a name="line.1154"></a>
+<span class="sourceLineNo">1155</span>      this.zooKeeper.close();<a name="line.1155"></a>
+<span class="sourceLineNo">1156</span>    }<a name="line.1156"></a>
+<span class="sourceLineNo">1157</span>    this.shutDown = true;<a name="line.1157"></a>
+<span class="sourceLineNo">1158</span>    LOG.info("Exiting; stopping=" + this.serverName + "; zookeeper connection closed.");<a name="line.1158"></a>
+<span class="sourceLineNo">1159</span>  }<a name="line.1159"></a>
+<span class="sourceLineNo">1160</span><a name="line.1160"></a>
+<span class="sourceLineNo">1161</span>  private boolean containsMetaTableRegions() {<a name="line.1161"></a>
+<span class="sourceLineNo">1162</span>    return onlineRegions.containsKey(RegionInfoBuilder.FIRST_META_REGIONINFO.getEncodedName());<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>  private boolean areAllUserRegionsOffline() {<a name="line.1165"></a>
+<span class="sourceLineNo">1166</span>    if (getNumberOfOnlineRegions() &gt; 2) return false;<a name="line.1166"></a>
+<span class="sourceLineNo">1167</span>    boolean allUserRegionsOffline = true;<a name="line.1167"></a>
+<span class="sourceLineNo">1168</span>    for (Map.Entry&lt;String, HRegion&gt; e: this.onlineRegions.entrySet()) {<a name="line.1168"></a>
+<span class="sourceLineNo">1169</span>      if (!e.getValue().getRegionInfo().isMetaRegion()) {<a name="line.1169"></a>
+<span class="sourceLineNo">1170</span>        allUserRegionsOffline = false;<a name="line.1170"></a>
+<span class="sourceLineNo">1171</span>        break;<a name="line.1171"></a>
+<span class="sourceLineNo">1172</span>      }<a name="line.1172"></a>
+<span class="sourceLineNo">1173</span>    }<a name="line.1173"></a>
+<span class="sourceLineNo">1174</span>    return allUserRegionsOffline;<a name="line.1174"></a>
+<span class="sourceLineNo">1175</span>  }<a name="line.1175"></a>
+<span class="sourceLineNo">1176</span><a name="line.1176"></a>
+<span class="sourceLineNo">1177</span>  /**<a name="line.1177"></a>
+<span class="sourceLineNo">1178</span>   * @return Current write count for all online regions.<a name="line.1178"></a>
+<span class="sourceLineNo">1179</span>   */<a name="line.1179"></a>
+<span class="sourceLineNo">1180</span>  private long getWriteRequestCount() {<a name="line.1180"></a>
+<span class="sourceLineNo">1181</span>    long writeCount = 0;<a name="line.1181"></a>
+<span class="sourceLineNo">1182</span>    for (Map.Entry&lt;String, HRegion&gt; e: this.onlineRegions.entrySet()) {<a name="line.1182"></a>
+<span class="sourceLineNo">1183</span>      writeCount += e.getValue().getWriteRequestsCount();<a name="line.1183"></a>
+<span class="sourceLineNo">1184</span>    }<a name="line.1184"></a>
+<span class="sourceLineNo">1185</span>    return writeCount;<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>  @VisibleForTesting<a name="line.1188"></a>
+<span class="sourceLineNo">1189</span>  protected void tryRegionServerReport(long reportStartTime, long reportEndTime)<a name="line.1189"></a>
+<span class="sourceLineNo">1190</span>      throws IOException {<a name="line.1190"></a>
+<span class="sourceLineNo">1191</span>    RegionServerStatusService.BlockingInterface rss = rssStub;<a name="line.1191"></a>
+<span class="sourceLineNo">1192</span>    if (rss == null) {<a name="line.1192"></a>
+<span class="sourceLineNo">1193</span>      // the current server could be stopping.<a name="line.1193"></a>
+<span class="sourceLineNo">1194</span>      return;<a name="line.1194"></a>
+<span class="sourceLineNo">1195</span>    }<a name="line.1195"></a>
+<span class="sourceLineNo">1196</span>    ClusterStatusProtos.ServerLoad sl = buildServerLoad(reportStartTime, reportEndTime);<a name="line.1196"></a>
+<span class="sourceLineNo">1197</span>    try {<a name="line.1197"></a>
+<span class="sourceLineNo">1198</span>      RegionServerReportRequest.Builder request = RegionServerReportRequest.newBuilder();<a name="line.1198"></a>
+<span class="sourceLineNo">1199</span>      request.setServer(ProtobufUtil.toServerName(this.serverName));<a name="line.1199"></a>
+<span class="sourceLineNo">1200</span>      request.setLoad(sl);<a name="line.1200"></a>
+<span class="sourceLineNo">1201</span>      rss.regionServerReport(null, request.build());<a name="line.1201"></a>
+<span class="sourceLineNo">1202</span>    } catch (ServiceException se) {<a name="line.1202"></a>
+<span class="sourceLineNo">1203</span>      IOException ioe = ProtobufUtil.getRemoteException(se);<a name="line.1203"></a>
+<span class="sourceLineNo">1204</span>      if (ioe instanceof YouAreDeadException) {<a name="line.1204"></a>
+<span class="sourceLineNo">1205</span>        // This will be caught and handled as a fatal error in run()<a name="line.1205"></a>
+<span class="sourceLineNo">1206</span>        throw ioe;<a name="line.1206"></a>
+<span class="sourceLineNo">1207</span>      }<a name="line.1207"></a>
+<span class="sourceLineNo">1208</span>      if (rssStub == rss) {<a name="line.1208"></a>
+<span class="sourceLineNo">1209</span>        rssStub = null;<a name="line.1209"></a>
+<span class="sourceLineNo">1210</span>      }<a name="line.1210"></a>
+<span class="sourceLineNo">1211</span>      // Couldn't connect to the master, get location from zk and reconnect<a name="line.1211"></a>
+<span class="sourceLineNo">1212</span>      // Method blocks until new master is found or we are stopped<a name="line.1212"></a>
+<span class="sourceLineNo">1213</span>      createRegionServerStatusStub(true);<a name="line.1213"></a>
+<span class="sourceLineNo">1214</span>    }<a name="line.1214"></a>
+<span class="sourceLineNo">1215</span>  }<a name="line.1215"></a>
+<span class="sourceLineNo">1216</span><a name="line.1216"></a>
+<span class="sourceLineNo">1217</span>  /**<a name="line.1217"></a>
+<span class="sourceLineNo">1218</span>   * Reports the given map of Regions and their size on the filesystem to the active Master.<a name="line.1218"></a>
+<span class="sourceLineNo">1219</span>   *<a name="line.1219"></a>
+<span class="sourceLineNo">1220</span>   * @param regionSizeStore The store containing region sizes<a name="line.1220"></a>
+<span class="sourceLineNo">1221</span>   * @return false if FileSystemUtilizationChore should pause reporting to master. true otherwise<a name="line.1221"></a>
+<span class="sourceLineNo">1222</span>   */<a name="line.1222"></a>
+<span class="sourceLineNo">1223</span>  public boolean reportRegionSizesForQuotas(RegionSizeStore regionSizeStore) {<a name="line.1223"></a>
+<span class="sourceLineNo">1224</span>    RegionServerStatusService.BlockingInterface rss = rssStub;<a name="line.1224"></a>
+<span class="sourceLineNo">1225</span>    if (rss == null) {<a name="line.1225"></a>
+<span class="sourceLineNo">1226</span>      // the current server could be stopping.<a name="line.1226"></a>
+<span class="sourceLineNo">1227</span>      LOG.trace("Skipping Region size report to HMaster as stub is null");<a name="line.1227"></a>
+<span class="sourceLineNo">1228</span>      return true;<a name="line.1228"></a>
+<span class="sourceLineNo">1229</span>    }<a name="line.1229"></a>
+<span class="sourceLineNo">1230</span>    try {<a name="line.1230"></a>
+<span class="sourceLineNo">1231</span>      buildReportAndSend(rss, regionSizeStore);<a name="line.1231"></a>
+<span class="sourceLineNo">1232</span>    } catch (ServiceException se) {<a name="line.1232">

<TRUNCATED>

[35/46] hbase-site git commit: Published site at 05d22ed960204183fbd9bd16f1dbca6410ccde76.

Posted by gi...@apache.org.
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/3649682c/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 9fbe400..b7a2a38 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
@@ -215,3746 +215,3748 @@
 <span class="sourceLineNo">207</span>import org.apache.hadoop.hbase.util.VersionInfo;<a name="line.207"></a>
 <span class="sourceLineNo">208</span>import org.apache.hadoop.hbase.zookeeper.LoadBalancerTracker;<a name="line.208"></a>
 <span class="sourceLineNo">209</span>import org.apache.hadoop.hbase.zookeeper.MasterAddressTracker;<a name="line.209"></a>
-<span class="sourceLineNo">210</span>import org.apache.hadoop.hbase.zookeeper.MasterMaintenanceModeTracker;<a name="line.210"></a>
-<span class="sourceLineNo">211</span>import org.apache.hadoop.hbase.zookeeper.RegionNormalizerTracker;<a name="line.211"></a>
-<span class="sourceLineNo">212</span>import org.apache.hadoop.hbase.zookeeper.ZKClusterId;<a name="line.212"></a>
-<span class="sourceLineNo">213</span>import org.apache.hadoop.hbase.zookeeper.ZKUtil;<a name="line.213"></a>
-<span class="sourceLineNo">214</span>import org.apache.hadoop.hbase.zookeeper.ZKWatcher;<a name="line.214"></a>
-<span class="sourceLineNo">215</span>import org.apache.hadoop.hbase.zookeeper.ZNodePaths;<a name="line.215"></a>
-<span class="sourceLineNo">216</span>import org.apache.yetus.audience.InterfaceAudience;<a name="line.216"></a>
-<span class="sourceLineNo">217</span>import org.apache.zookeeper.KeeperException;<a name="line.217"></a>
-<span class="sourceLineNo">218</span>import org.eclipse.jetty.server.Server;<a name="line.218"></a>
-<span class="sourceLineNo">219</span>import org.eclipse.jetty.server.ServerConnector;<a name="line.219"></a>
-<span class="sourceLineNo">220</span>import org.eclipse.jetty.servlet.ServletHolder;<a name="line.220"></a>
-<span class="sourceLineNo">221</span>import org.eclipse.jetty.webapp.WebAppContext;<a name="line.221"></a>
-<span class="sourceLineNo">222</span>import org.slf4j.Logger;<a name="line.222"></a>
-<span class="sourceLineNo">223</span>import org.slf4j.LoggerFactory;<a name="line.223"></a>
-<span class="sourceLineNo">224</span><a name="line.224"></a>
-<span class="sourceLineNo">225</span>import org.apache.hbase.thirdparty.com.google.common.annotations.VisibleForTesting;<a name="line.225"></a>
-<span class="sourceLineNo">226</span>import org.apache.hbase.thirdparty.com.google.common.collect.ImmutableSet;<a name="line.226"></a>
-<span class="sourceLineNo">227</span>import org.apache.hbase.thirdparty.com.google.common.collect.Lists;<a name="line.227"></a>
-<span class="sourceLineNo">228</span>import org.apache.hbase.thirdparty.com.google.common.collect.Maps;<a name="line.228"></a>
-<span class="sourceLineNo">229</span><a name="line.229"></a>
-<span class="sourceLineNo">230</span>import org.apache.hadoop.hbase.shaded.protobuf.ProtobufUtil;<a name="line.230"></a>
-<span class="sourceLineNo">231</span>import org.apache.hadoop.hbase.shaded.protobuf.generated.AdminProtos.GetRegionInfoResponse.CompactionState;<a name="line.231"></a>
-<span class="sourceLineNo">232</span>import org.apache.hadoop.hbase.shaded.protobuf.generated.QuotaProtos.Quotas;<a name="line.232"></a>
-<span class="sourceLineNo">233</span>import org.apache.hadoop.hbase.shaded.protobuf.generated.QuotaProtos.SpaceViolationPolicy;<a name="line.233"></a>
-<span class="sourceLineNo">234</span>import org.apache.hadoop.hbase.shaded.protobuf.generated.SnapshotProtos.SnapshotDescription;<a name="line.234"></a>
-<span class="sourceLineNo">235</span>import org.apache.hadoop.hbase.shaded.protobuf.generated.WALProtos;<a name="line.235"></a>
-<span class="sourceLineNo">236</span><a name="line.236"></a>
-<span class="sourceLineNo">237</span>/**<a name="line.237"></a>
-<span class="sourceLineNo">238</span> * HMaster is the "master server" for HBase. An HBase cluster has one active<a name="line.238"></a>
-<span class="sourceLineNo">239</span> * master.  If many masters are started, all compete.  Whichever wins goes on to<a name="line.239"></a>
-<span class="sourceLineNo">240</span> * run the cluster.  All others park themselves in their constructor until<a name="line.240"></a>
-<span class="sourceLineNo">241</span> * master or cluster shutdown or until the active master loses its lease in<a name="line.241"></a>
-<span class="sourceLineNo">242</span> * zookeeper.  Thereafter, all running master jostle to take over master role.<a name="line.242"></a>
-<span class="sourceLineNo">243</span> *<a name="line.243"></a>
-<span class="sourceLineNo">244</span> * &lt;p&gt;The Master can be asked shutdown the cluster. See {@link #shutdown()}.  In<a name="line.244"></a>
-<span class="sourceLineNo">245</span> * this case it will tell all regionservers to go down and then wait on them<a name="line.245"></a>
-<span class="sourceLineNo">246</span> * all reporting in that they are down.  This master will then shut itself down.<a name="line.246"></a>
-<span class="sourceLineNo">247</span> *<a name="line.247"></a>
-<span class="sourceLineNo">248</span> * &lt;p&gt;You can also shutdown just this master.  Call {@link #stopMaster()}.<a name="line.248"></a>
-<span class="sourceLineNo">249</span> *<a name="line.249"></a>
-<span class="sourceLineNo">250</span> * @see org.apache.zookeeper.Watcher<a name="line.250"></a>
-<span class="sourceLineNo">251</span> */<a name="line.251"></a>
-<span class="sourceLineNo">252</span>@InterfaceAudience.LimitedPrivate(HBaseInterfaceAudience.TOOLS)<a name="line.252"></a>
-<span class="sourceLineNo">253</span>@SuppressWarnings("deprecation")<a name="line.253"></a>
-<span class="sourceLineNo">254</span>public class HMaster extends HRegionServer implements MasterServices {<a name="line.254"></a>
-<span class="sourceLineNo">255</span>  private static Logger LOG = LoggerFactory.getLogger(HMaster.class);<a name="line.255"></a>
-<span class="sourceLineNo">256</span><a name="line.256"></a>
-<span class="sourceLineNo">257</span>  /**<a name="line.257"></a>
-<span class="sourceLineNo">258</span>   * Protection against zombie master. Started once Master accepts active responsibility and<a name="line.258"></a>
-<span class="sourceLineNo">259</span>   * starts taking over responsibilities. Allows a finite time window before giving up ownership.<a name="line.259"></a>
-<span class="sourceLineNo">260</span>   */<a name="line.260"></a>
-<span class="sourceLineNo">261</span>  private static class InitializationMonitor extends HasThread {<a name="line.261"></a>
-<span class="sourceLineNo">262</span>    /** The amount of time in milliseconds to sleep before checking initialization status. */<a name="line.262"></a>
-<span class="sourceLineNo">263</span>    public static final String TIMEOUT_KEY = "hbase.master.initializationmonitor.timeout";<a name="line.263"></a>
-<span class="sourceLineNo">264</span>    public static final long TIMEOUT_DEFAULT = TimeUnit.MILLISECONDS.convert(15, TimeUnit.MINUTES);<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>     * When timeout expired and initialization has not complete, call {@link System#exit(int)} when<a name="line.267"></a>
-<span class="sourceLineNo">268</span>     * true, do nothing otherwise.<a name="line.268"></a>
-<span class="sourceLineNo">269</span>     */<a name="line.269"></a>
-<span class="sourceLineNo">270</span>    public static final String HALT_KEY = "hbase.master.initializationmonitor.haltontimeout";<a name="line.270"></a>
-<span class="sourceLineNo">271</span>    public static final boolean HALT_DEFAULT = false;<a name="line.271"></a>
-<span class="sourceLineNo">272</span><a name="line.272"></a>
-<span class="sourceLineNo">273</span>    private final HMaster master;<a name="line.273"></a>
-<span class="sourceLineNo">274</span>    private final long timeout;<a name="line.274"></a>
-<span class="sourceLineNo">275</span>    private final boolean haltOnTimeout;<a name="line.275"></a>
-<span class="sourceLineNo">276</span><a name="line.276"></a>
-<span class="sourceLineNo">277</span>    /** Creates a Thread that monitors the {@link #isInitialized()} state. */<a name="line.277"></a>
-<span class="sourceLineNo">278</span>    InitializationMonitor(HMaster master) {<a name="line.278"></a>
-<span class="sourceLineNo">279</span>      super("MasterInitializationMonitor");<a name="line.279"></a>
-<span class="sourceLineNo">280</span>      this.master = master;<a name="line.280"></a>
-<span class="sourceLineNo">281</span>      this.timeout = master.getConfiguration().getLong(TIMEOUT_KEY, TIMEOUT_DEFAULT);<a name="line.281"></a>
-<span class="sourceLineNo">282</span>      this.haltOnTimeout = master.getConfiguration().getBoolean(HALT_KEY, HALT_DEFAULT);<a name="line.282"></a>
-<span class="sourceLineNo">283</span>      this.setDaemon(true);<a name="line.283"></a>
-<span class="sourceLineNo">284</span>    }<a name="line.284"></a>
-<span class="sourceLineNo">285</span><a name="line.285"></a>
-<span class="sourceLineNo">286</span>    @Override<a name="line.286"></a>
-<span class="sourceLineNo">287</span>    public void run() {<a name="line.287"></a>
-<span class="sourceLineNo">288</span>      try {<a name="line.288"></a>
-<span class="sourceLineNo">289</span>        while (!master.isStopped() &amp;&amp; master.isActiveMaster()) {<a name="line.289"></a>
-<span class="sourceLineNo">290</span>          Thread.sleep(timeout);<a name="line.290"></a>
-<span class="sourceLineNo">291</span>          if (master.isInitialized()) {<a name="line.291"></a>
-<span class="sourceLineNo">292</span>            LOG.debug("Initialization completed within allotted tolerance. Monitor exiting.");<a name="line.292"></a>
-<span class="sourceLineNo">293</span>          } else {<a name="line.293"></a>
-<span class="sourceLineNo">294</span>            LOG.error("Master failed to complete initialization after " + timeout + "ms. Please"<a name="line.294"></a>
-<span class="sourceLineNo">295</span>                + " consider submitting a bug report including a thread dump of this process.");<a name="line.295"></a>
-<span class="sourceLineNo">296</span>            if (haltOnTimeout) {<a name="line.296"></a>
-<span class="sourceLineNo">297</span>              LOG.error("Zombie Master exiting. Thread dump to stdout");<a name="line.297"></a>
-<span class="sourceLineNo">298</span>              Threads.printThreadInfo(System.out, "Zombie HMaster");<a name="line.298"></a>
-<span class="sourceLineNo">299</span>              System.exit(-1);<a name="line.299"></a>
-<span class="sourceLineNo">300</span>            }<a name="line.300"></a>
-<span class="sourceLineNo">301</span>          }<a name="line.301"></a>
-<span class="sourceLineNo">302</span>        }<a name="line.302"></a>
-<span class="sourceLineNo">303</span>      } catch (InterruptedException ie) {<a name="line.303"></a>
-<span class="sourceLineNo">304</span>        LOG.trace("InitMonitor thread interrupted. Existing.");<a name="line.304"></a>
-<span class="sourceLineNo">305</span>      }<a name="line.305"></a>
-<span class="sourceLineNo">306</span>    }<a name="line.306"></a>
-<span class="sourceLineNo">307</span>  }<a name="line.307"></a>
-<span class="sourceLineNo">308</span><a name="line.308"></a>
-<span class="sourceLineNo">309</span>  // MASTER is name of the webapp and the attribute name used stuffing this<a name="line.309"></a>
-<span class="sourceLineNo">310</span>  //instance into web context.<a name="line.310"></a>
-<span class="sourceLineNo">311</span>  public static final String MASTER = "master";<a name="line.311"></a>
-<span class="sourceLineNo">312</span><a name="line.312"></a>
-<span class="sourceLineNo">313</span>  // Manager and zk listener for master election<a name="line.313"></a>
-<span class="sourceLineNo">314</span>  private final ActiveMasterManager activeMasterManager;<a name="line.314"></a>
-<span class="sourceLineNo">315</span>  // Region server tracker<a name="line.315"></a>
-<span class="sourceLineNo">316</span>  private RegionServerTracker regionServerTracker;<a name="line.316"></a>
-<span class="sourceLineNo">317</span>  // Draining region server tracker<a name="line.317"></a>
-<span class="sourceLineNo">318</span>  private DrainingServerTracker drainingServerTracker;<a name="line.318"></a>
-<span class="sourceLineNo">319</span>  // Tracker for load balancer state<a name="line.319"></a>
-<span class="sourceLineNo">320</span>  LoadBalancerTracker loadBalancerTracker;<a name="line.320"></a>
-<span class="sourceLineNo">321</span>  // Tracker for meta location, if any client ZK quorum specified<a name="line.321"></a>
-<span class="sourceLineNo">322</span>  MetaLocationSyncer metaLocationSyncer;<a name="line.322"></a>
-<span class="sourceLineNo">323</span>  // Tracker for active master location, if any client ZK quorum specified<a name="line.323"></a>
-<span class="sourceLineNo">324</span>  MasterAddressSyncer masterAddressSyncer;<a name="line.324"></a>
-<span class="sourceLineNo">325</span><a name="line.325"></a>
-<span class="sourceLineNo">326</span>  // Tracker for split and merge state<a name="line.326"></a>
-<span class="sourceLineNo">327</span>  private SplitOrMergeTracker splitOrMergeTracker;<a name="line.327"></a>
-<span class="sourceLineNo">328</span><a name="line.328"></a>
-<span class="sourceLineNo">329</span>  // Tracker for region normalizer state<a name="line.329"></a>
-<span class="sourceLineNo">330</span>  private RegionNormalizerTracker regionNormalizerTracker;<a name="line.330"></a>
-<span class="sourceLineNo">331</span><a name="line.331"></a>
-<span class="sourceLineNo">332</span>  //Tracker for master maintenance mode setting<a name="line.332"></a>
-<span class="sourceLineNo">333</span>  private MasterMaintenanceModeTracker maintenanceModeTracker;<a name="line.333"></a>
-<span class="sourceLineNo">334</span><a name="line.334"></a>
-<span class="sourceLineNo">335</span>  private ClusterSchemaService clusterSchemaService;<a name="line.335"></a>
+<span class="sourceLineNo">210</span>import org.apache.hadoop.hbase.zookeeper.RegionNormalizerTracker;<a name="line.210"></a>
+<span class="sourceLineNo">211</span>import org.apache.hadoop.hbase.zookeeper.ZKClusterId;<a name="line.211"></a>
+<span class="sourceLineNo">212</span>import org.apache.hadoop.hbase.zookeeper.ZKUtil;<a name="line.212"></a>
+<span class="sourceLineNo">213</span>import org.apache.hadoop.hbase.zookeeper.ZKWatcher;<a name="line.213"></a>
+<span class="sourceLineNo">214</span>import org.apache.hadoop.hbase.zookeeper.ZNodePaths;<a name="line.214"></a>
+<span class="sourceLineNo">215</span>import org.apache.yetus.audience.InterfaceAudience;<a name="line.215"></a>
+<span class="sourceLineNo">216</span>import org.apache.zookeeper.KeeperException;<a name="line.216"></a>
+<span class="sourceLineNo">217</span>import org.eclipse.jetty.server.Server;<a name="line.217"></a>
+<span class="sourceLineNo">218</span>import org.eclipse.jetty.server.ServerConnector;<a name="line.218"></a>
+<span class="sourceLineNo">219</span>import org.eclipse.jetty.servlet.ServletHolder;<a name="line.219"></a>
+<span class="sourceLineNo">220</span>import org.eclipse.jetty.webapp.WebAppContext;<a name="line.220"></a>
+<span class="sourceLineNo">221</span>import org.slf4j.Logger;<a name="line.221"></a>
+<span class="sourceLineNo">222</span>import org.slf4j.LoggerFactory;<a name="line.222"></a>
+<span class="sourceLineNo">223</span><a name="line.223"></a>
+<span class="sourceLineNo">224</span>import org.apache.hbase.thirdparty.com.google.common.annotations.VisibleForTesting;<a name="line.224"></a>
+<span class="sourceLineNo">225</span>import org.apache.hbase.thirdparty.com.google.common.collect.ImmutableSet;<a name="line.225"></a>
+<span class="sourceLineNo">226</span>import org.apache.hbase.thirdparty.com.google.common.collect.Lists;<a name="line.226"></a>
+<span class="sourceLineNo">227</span>import org.apache.hbase.thirdparty.com.google.common.collect.Maps;<a name="line.227"></a>
+<span class="sourceLineNo">228</span><a name="line.228"></a>
+<span class="sourceLineNo">229</span>import org.apache.hadoop.hbase.shaded.protobuf.ProtobufUtil;<a name="line.229"></a>
+<span class="sourceLineNo">230</span>import org.apache.hadoop.hbase.shaded.protobuf.generated.AdminProtos.GetRegionInfoResponse.CompactionState;<a name="line.230"></a>
+<span class="sourceLineNo">231</span>import org.apache.hadoop.hbase.shaded.protobuf.generated.QuotaProtos.Quotas;<a name="line.231"></a>
+<span class="sourceLineNo">232</span>import org.apache.hadoop.hbase.shaded.protobuf.generated.QuotaProtos.SpaceViolationPolicy;<a name="line.232"></a>
+<span class="sourceLineNo">233</span>import org.apache.hadoop.hbase.shaded.protobuf.generated.SnapshotProtos.SnapshotDescription;<a name="line.233"></a>
+<span class="sourceLineNo">234</span>import org.apache.hadoop.hbase.shaded.protobuf.generated.WALProtos;<a name="line.234"></a>
+<span class="sourceLineNo">235</span><a name="line.235"></a>
+<span class="sourceLineNo">236</span>/**<a name="line.236"></a>
+<span class="sourceLineNo">237</span> * HMaster is the "master server" for HBase. An HBase cluster has one active<a name="line.237"></a>
+<span class="sourceLineNo">238</span> * master.  If many masters are started, all compete.  Whichever wins goes on to<a name="line.238"></a>
+<span class="sourceLineNo">239</span> * run the cluster.  All others park themselves in their constructor until<a name="line.239"></a>
+<span class="sourceLineNo">240</span> * master or cluster shutdown or until the active master loses its lease in<a name="line.240"></a>
+<span class="sourceLineNo">241</span> * zookeeper.  Thereafter, all running master jostle to take over master role.<a name="line.241"></a>
+<span class="sourceLineNo">242</span> *<a name="line.242"></a>
+<span class="sourceLineNo">243</span> * &lt;p&gt;The Master can be asked shutdown the cluster. See {@link #shutdown()}.  In<a name="line.243"></a>
+<span class="sourceLineNo">244</span> * this case it will tell all regionservers to go down and then wait on them<a name="line.244"></a>
+<span class="sourceLineNo">245</span> * all reporting in that they are down.  This master will then shut itself down.<a name="line.245"></a>
+<span class="sourceLineNo">246</span> *<a name="line.246"></a>
+<span class="sourceLineNo">247</span> * &lt;p&gt;You can also shutdown just this master.  Call {@link #stopMaster()}.<a name="line.247"></a>
+<span class="sourceLineNo">248</span> *<a name="line.248"></a>
+<span class="sourceLineNo">249</span> * @see org.apache.zookeeper.Watcher<a name="line.249"></a>
+<span class="sourceLineNo">250</span> */<a name="line.250"></a>
+<span class="sourceLineNo">251</span>@InterfaceAudience.LimitedPrivate(HBaseInterfaceAudience.TOOLS)<a name="line.251"></a>
+<span class="sourceLineNo">252</span>@SuppressWarnings("deprecation")<a name="line.252"></a>
+<span class="sourceLineNo">253</span>public class HMaster extends HRegionServer implements MasterServices {<a name="line.253"></a>
+<span class="sourceLineNo">254</span>  private static Logger LOG = LoggerFactory.getLogger(HMaster.class);<a name="line.254"></a>
+<span class="sourceLineNo">255</span><a name="line.255"></a>
+<span class="sourceLineNo">256</span>  /**<a name="line.256"></a>
+<span class="sourceLineNo">257</span>   * Protection against zombie master. Started once Master accepts active responsibility and<a name="line.257"></a>
+<span class="sourceLineNo">258</span>   * starts taking over responsibilities. Allows a finite time window before giving up ownership.<a name="line.258"></a>
+<span class="sourceLineNo">259</span>   */<a name="line.259"></a>
+<span class="sourceLineNo">260</span>  private static class InitializationMonitor extends HasThread {<a name="line.260"></a>
+<span class="sourceLineNo">261</span>    /** The amount of time in milliseconds to sleep before checking initialization status. */<a name="line.261"></a>
+<span class="sourceLineNo">262</span>    public static final String TIMEOUT_KEY = "hbase.master.initializationmonitor.timeout";<a name="line.262"></a>
+<span class="sourceLineNo">263</span>    public static final long TIMEOUT_DEFAULT = TimeUnit.MILLISECONDS.convert(15, TimeUnit.MINUTES);<a name="line.263"></a>
+<span class="sourceLineNo">264</span><a name="line.264"></a>
+<span class="sourceLineNo">265</span>    /**<a name="line.265"></a>
+<span class="sourceLineNo">266</span>     * When timeout expired and initialization has not complete, call {@link System#exit(int)} when<a name="line.266"></a>
+<span class="sourceLineNo">267</span>     * true, do nothing otherwise.<a name="line.267"></a>
+<span class="sourceLineNo">268</span>     */<a name="line.268"></a>
+<span class="sourceLineNo">269</span>    public static final String HALT_KEY = "hbase.master.initializationmonitor.haltontimeout";<a name="line.269"></a>
+<span class="sourceLineNo">270</span>    public static final boolean HALT_DEFAULT = false;<a name="line.270"></a>
+<span class="sourceLineNo">271</span><a name="line.271"></a>
+<span class="sourceLineNo">272</span>    private final HMaster master;<a name="line.272"></a>
+<span class="sourceLineNo">273</span>    private final long timeout;<a name="line.273"></a>
+<span class="sourceLineNo">274</span>    private final boolean haltOnTimeout;<a name="line.274"></a>
+<span class="sourceLineNo">275</span><a name="line.275"></a>
+<span class="sourceLineNo">276</span>    /** Creates a Thread that monitors the {@link #isInitialized()} state. */<a name="line.276"></a>
+<span class="sourceLineNo">277</span>    InitializationMonitor(HMaster master) {<a name="line.277"></a>
+<span class="sourceLineNo">278</span>      super("MasterInitializationMonitor");<a name="line.278"></a>
+<span class="sourceLineNo">279</span>      this.master = master;<a name="line.279"></a>
+<span class="sourceLineNo">280</span>      this.timeout = master.getConfiguration().getLong(TIMEOUT_KEY, TIMEOUT_DEFAULT);<a name="line.280"></a>
+<span class="sourceLineNo">281</span>      this.haltOnTimeout = master.getConfiguration().getBoolean(HALT_KEY, HALT_DEFAULT);<a name="line.281"></a>
+<span class="sourceLineNo">282</span>      this.setDaemon(true);<a name="line.282"></a>
+<span class="sourceLineNo">283</span>    }<a name="line.283"></a>
+<span class="sourceLineNo">284</span><a name="line.284"></a>
+<span class="sourceLineNo">285</span>    @Override<a name="line.285"></a>
+<span class="sourceLineNo">286</span>    public void run() {<a name="line.286"></a>
+<span class="sourceLineNo">287</span>      try {<a name="line.287"></a>
+<span class="sourceLineNo">288</span>        while (!master.isStopped() &amp;&amp; master.isActiveMaster()) {<a name="line.288"></a>
+<span class="sourceLineNo">289</span>          Thread.sleep(timeout);<a name="line.289"></a>
+<span class="sourceLineNo">290</span>          if (master.isInitialized()) {<a name="line.290"></a>
+<span class="sourceLineNo">291</span>            LOG.debug("Initialization completed within allotted tolerance. Monitor exiting.");<a name="line.291"></a>
+<span class="sourceLineNo">292</span>          } else {<a name="line.292"></a>
+<span class="sourceLineNo">293</span>            LOG.error("Master failed to complete initialization after " + timeout + "ms. Please"<a name="line.293"></a>
+<span class="sourceLineNo">294</span>                + " consider submitting a bug report including a thread dump of this process.");<a name="line.294"></a>
+<span class="sourceLineNo">295</span>            if (haltOnTimeout) {<a name="line.295"></a>
+<span class="sourceLineNo">296</span>              LOG.error("Zombie Master exiting. Thread dump to stdout");<a name="line.296"></a>
+<span class="sourceLineNo">297</span>              Threads.printThreadInfo(System.out, "Zombie HMaster");<a name="line.297"></a>
+<span class="sourceLineNo">298</span>              System.exit(-1);<a name="line.298"></a>
+<span class="sourceLineNo">299</span>            }<a name="line.299"></a>
+<span class="sourceLineNo">300</span>          }<a name="line.300"></a>
+<span class="sourceLineNo">301</span>        }<a name="line.301"></a>
+<span class="sourceLineNo">302</span>      } catch (InterruptedException ie) {<a name="line.302"></a>
+<span class="sourceLineNo">303</span>        LOG.trace("InitMonitor thread interrupted. Existing.");<a name="line.303"></a>
+<span class="sourceLineNo">304</span>      }<a name="line.304"></a>
+<span class="sourceLineNo">305</span>    }<a name="line.305"></a>
+<span class="sourceLineNo">306</span>  }<a name="line.306"></a>
+<span class="sourceLineNo">307</span><a name="line.307"></a>
+<span class="sourceLineNo">308</span>  // MASTER is name of the webapp and the attribute name used stuffing this<a name="line.308"></a>
+<span class="sourceLineNo">309</span>  //instance into web context.<a name="line.309"></a>
+<span class="sourceLineNo">310</span>  public static final String MASTER = "master";<a name="line.310"></a>
+<span class="sourceLineNo">311</span><a name="line.311"></a>
+<span class="sourceLineNo">312</span>  // Manager and zk listener for master election<a name="line.312"></a>
+<span class="sourceLineNo">313</span>  private final ActiveMasterManager activeMasterManager;<a name="line.313"></a>
+<span class="sourceLineNo">314</span>  // Region server tracker<a name="line.314"></a>
+<span class="sourceLineNo">315</span>  private RegionServerTracker regionServerTracker;<a name="line.315"></a>
+<span class="sourceLineNo">316</span>  // Draining region server tracker<a name="line.316"></a>
+<span class="sourceLineNo">317</span>  private DrainingServerTracker drainingServerTracker;<a name="line.317"></a>
+<span class="sourceLineNo">318</span>  // Tracker for load balancer state<a name="line.318"></a>
+<span class="sourceLineNo">319</span>  LoadBalancerTracker loadBalancerTracker;<a name="line.319"></a>
+<span class="sourceLineNo">320</span>  // Tracker for meta location, if any client ZK quorum specified<a name="line.320"></a>
+<span class="sourceLineNo">321</span>  MetaLocationSyncer metaLocationSyncer;<a name="line.321"></a>
+<span class="sourceLineNo">322</span>  // Tracker for active master location, if any client ZK quorum specified<a name="line.322"></a>
+<span class="sourceLineNo">323</span>  MasterAddressSyncer masterAddressSyncer;<a name="line.323"></a>
+<span class="sourceLineNo">324</span><a name="line.324"></a>
+<span class="sourceLineNo">325</span>  // Tracker for split and merge state<a name="line.325"></a>
+<span class="sourceLineNo">326</span>  private SplitOrMergeTracker splitOrMergeTracker;<a name="line.326"></a>
+<span class="sourceLineNo">327</span><a name="line.327"></a>
+<span class="sourceLineNo">328</span>  // Tracker for region normalizer state<a name="line.328"></a>
+<span class="sourceLineNo">329</span>  private RegionNormalizerTracker regionNormalizerTracker;<a name="line.329"></a>
+<span class="sourceLineNo">330</span><a name="line.330"></a>
+<span class="sourceLineNo">331</span>  private ClusterSchemaService clusterSchemaService;<a name="line.331"></a>
+<span class="sourceLineNo">332</span><a name="line.332"></a>
+<span class="sourceLineNo">333</span>  public static final String HBASE_MASTER_WAIT_ON_SERVICE_IN_SECONDS =<a name="line.333"></a>
+<span class="sourceLineNo">334</span>    "hbase.master.wait.on.service.seconds";<a name="line.334"></a>
+<span class="sourceLineNo">335</span>  public static final int DEFAULT_HBASE_MASTER_WAIT_ON_SERVICE_IN_SECONDS = 5 * 60;<a name="line.335"></a>
 <span class="sourceLineNo">336</span><a name="line.336"></a>
-<span class="sourceLineNo">337</span>  public static final String HBASE_MASTER_WAIT_ON_SERVICE_IN_SECONDS =<a name="line.337"></a>
-<span class="sourceLineNo">338</span>    "hbase.master.wait.on.service.seconds";<a name="line.338"></a>
-<span class="sourceLineNo">339</span>  public static final int DEFAULT_HBASE_MASTER_WAIT_ON_SERVICE_IN_SECONDS = 5 * 60;<a name="line.339"></a>
-<span class="sourceLineNo">340</span><a name="line.340"></a>
-<span class="sourceLineNo">341</span>  // Metrics for the HMaster<a name="line.341"></a>
-<span class="sourceLineNo">342</span>  final MetricsMaster metricsMaster;<a name="line.342"></a>
-<span class="sourceLineNo">343</span>  // file system manager for the master FS operations<a name="line.343"></a>
-<span class="sourceLineNo">344</span>  private MasterFileSystem fileSystemManager;<a name="line.344"></a>
-<span class="sourceLineNo">345</span>  private MasterWalManager walManager;<a name="line.345"></a>
-<span class="sourceLineNo">346</span><a name="line.346"></a>
-<span class="sourceLineNo">347</span>  // server manager to deal with region server info<a name="line.347"></a>
-<span class="sourceLineNo">348</span>  private volatile ServerManager serverManager;<a name="line.348"></a>
-<span class="sourceLineNo">349</span><a name="line.349"></a>
-<span class="sourceLineNo">350</span>  // manager of assignment nodes in zookeeper<a name="line.350"></a>
-<span class="sourceLineNo">351</span>  private AssignmentManager assignmentManager;<a name="line.351"></a>
-<span class="sourceLineNo">352</span><a name="line.352"></a>
-<span class="sourceLineNo">353</span>  // manager of replication<a name="line.353"></a>
-<span class="sourceLineNo">354</span>  private ReplicationPeerManager replicationPeerManager;<a name="line.354"></a>
-<span class="sourceLineNo">355</span><a name="line.355"></a>
-<span class="sourceLineNo">356</span>  private SyncReplicationReplayWALManager syncReplicationReplayWALManager;<a name="line.356"></a>
-<span class="sourceLineNo">357</span><a name="line.357"></a>
-<span class="sourceLineNo">358</span>  // buffer for "fatal error" notices from region servers<a name="line.358"></a>
-<span class="sourceLineNo">359</span>  // in the cluster. This is only used for assisting<a name="line.359"></a>
-<span class="sourceLineNo">360</span>  // operations/debugging.<a name="line.360"></a>
-<span class="sourceLineNo">361</span>  MemoryBoundedLogMessageBuffer rsFatals;<a name="line.361"></a>
-<span class="sourceLineNo">362</span><a name="line.362"></a>
-<span class="sourceLineNo">363</span>  // flag set after we become the active master (used for testing)<a name="line.363"></a>
-<span class="sourceLineNo">364</span>  private volatile boolean activeMaster = false;<a name="line.364"></a>
-<span class="sourceLineNo">365</span><a name="line.365"></a>
-<span class="sourceLineNo">366</span>  // flag set after we complete initialization once active<a name="line.366"></a>
-<span class="sourceLineNo">367</span>  private final ProcedureEvent&lt;?&gt; initialized = new ProcedureEvent&lt;&gt;("master initialized");<a name="line.367"></a>
+<span class="sourceLineNo">337</span>  // Metrics for the HMaster<a name="line.337"></a>
+<span class="sourceLineNo">338</span>  final MetricsMaster metricsMaster;<a name="line.338"></a>
+<span class="sourceLineNo">339</span>  // file system manager for the master FS operations<a name="line.339"></a>
+<span class="sourceLineNo">340</span>  private MasterFileSystem fileSystemManager;<a name="line.340"></a>
+<span class="sourceLineNo">341</span>  private MasterWalManager walManager;<a name="line.341"></a>
+<span class="sourceLineNo">342</span><a name="line.342"></a>
+<span class="sourceLineNo">343</span>  // server manager to deal with region server info<a name="line.343"></a>
+<span class="sourceLineNo">344</span>  private volatile ServerManager serverManager;<a name="line.344"></a>
+<span class="sourceLineNo">345</span><a name="line.345"></a>
+<span class="sourceLineNo">346</span>  // manager of assignment nodes in zookeeper<a name="line.346"></a>
+<span class="sourceLineNo">347</span>  private AssignmentManager assignmentManager;<a name="line.347"></a>
+<span class="sourceLineNo">348</span><a name="line.348"></a>
+<span class="sourceLineNo">349</span>  // manager of replication<a name="line.349"></a>
+<span class="sourceLineNo">350</span>  private ReplicationPeerManager replicationPeerManager;<a name="line.350"></a>
+<span class="sourceLineNo">351</span><a name="line.351"></a>
+<span class="sourceLineNo">352</span>  private SyncReplicationReplayWALManager syncReplicationReplayWALManager;<a name="line.352"></a>
+<span class="sourceLineNo">353</span><a name="line.353"></a>
+<span class="sourceLineNo">354</span>  // buffer for "fatal error" notices from region servers<a name="line.354"></a>
+<span class="sourceLineNo">355</span>  // in the cluster. This is only used for assisting<a name="line.355"></a>
+<span class="sourceLineNo">356</span>  // operations/debugging.<a name="line.356"></a>
+<span class="sourceLineNo">357</span>  MemoryBoundedLogMessageBuffer rsFatals;<a name="line.357"></a>
+<span class="sourceLineNo">358</span><a name="line.358"></a>
+<span class="sourceLineNo">359</span>  // flag set after we become the active master (used for testing)<a name="line.359"></a>
+<span class="sourceLineNo">360</span>  private volatile boolean activeMaster = false;<a name="line.360"></a>
+<span class="sourceLineNo">361</span><a name="line.361"></a>
+<span class="sourceLineNo">362</span>  // flag set after we complete initialization once active<a name="line.362"></a>
+<span class="sourceLineNo">363</span>  private final ProcedureEvent&lt;?&gt; initialized = new ProcedureEvent&lt;&gt;("master initialized");<a name="line.363"></a>
+<span class="sourceLineNo">364</span><a name="line.364"></a>
+<span class="sourceLineNo">365</span>  // flag set after master services are started,<a name="line.365"></a>
+<span class="sourceLineNo">366</span>  // initialization may have not completed yet.<a name="line.366"></a>
+<span class="sourceLineNo">367</span>  volatile boolean serviceStarted = false;<a name="line.367"></a>
 <span class="sourceLineNo">368</span><a name="line.368"></a>
-<span class="sourceLineNo">369</span>  // flag set after master services are started,<a name="line.369"></a>
-<span class="sourceLineNo">370</span>  // initialization may have not completed yet.<a name="line.370"></a>
-<span class="sourceLineNo">371</span>  volatile boolean serviceStarted = false;<a name="line.371"></a>
-<span class="sourceLineNo">372</span><a name="line.372"></a>
-<span class="sourceLineNo">373</span>  // Maximum time we should run balancer for<a name="line.373"></a>
-<span class="sourceLineNo">374</span>  private final int maxBlancingTime;<a name="line.374"></a>
-<span class="sourceLineNo">375</span>  // Maximum percent of regions in transition when balancing<a name="line.375"></a>
-<span class="sourceLineNo">376</span>  private final double maxRitPercent;<a name="line.376"></a>
-<span class="sourceLineNo">377</span><a name="line.377"></a>
-<span class="sourceLineNo">378</span>  private final LockManager lockManager = new LockManager(this);<a name="line.378"></a>
-<span class="sourceLineNo">379</span><a name="line.379"></a>
-<span class="sourceLineNo">380</span>  private LoadBalancer balancer;<a name="line.380"></a>
-<span class="sourceLineNo">381</span>  private RegionNormalizer normalizer;<a name="line.381"></a>
-<span class="sourceLineNo">382</span>  private BalancerChore balancerChore;<a name="line.382"></a>
-<span class="sourceLineNo">383</span>  private RegionNormalizerChore normalizerChore;<a name="line.383"></a>
-<span class="sourceLineNo">384</span>  private ClusterStatusChore clusterStatusChore;<a name="line.384"></a>
-<span class="sourceLineNo">385</span>  private ClusterStatusPublisher clusterStatusPublisherChore = null;<a name="line.385"></a>
-<span class="sourceLineNo">386</span><a name="line.386"></a>
-<span class="sourceLineNo">387</span>  CatalogJanitor catalogJanitorChore;<a name="line.387"></a>
-<span class="sourceLineNo">388</span>  private LogCleaner logCleaner;<a name="line.388"></a>
-<span class="sourceLineNo">389</span>  private HFileCleaner hfileCleaner;<a name="line.389"></a>
-<span class="sourceLineNo">390</span>  private ReplicationBarrierCleaner replicationBarrierCleaner;<a name="line.390"></a>
-<span class="sourceLineNo">391</span>  private ExpiredMobFileCleanerChore expiredMobFileCleanerChore;<a name="line.391"></a>
-<span class="sourceLineNo">392</span>  private MobCompactionChore mobCompactChore;<a name="line.392"></a>
-<span class="sourceLineNo">393</span>  private MasterMobCompactionThread mobCompactThread;<a name="line.393"></a>
-<span class="sourceLineNo">394</span>  // used to synchronize the mobCompactionStates<a name="line.394"></a>
-<span class="sourceLineNo">395</span>  private final IdLock mobCompactionLock = new IdLock();<a name="line.395"></a>
-<span class="sourceLineNo">396</span>  // save the information of mob compactions in tables.<a name="line.396"></a>
-<span class="sourceLineNo">397</span>  // the key is table name, the value is the number of compactions in that table.<a name="line.397"></a>
-<span class="sourceLineNo">398</span>  private Map&lt;TableName, AtomicInteger&gt; mobCompactionStates = Maps.newConcurrentMap();<a name="line.398"></a>
+<span class="sourceLineNo">369</span>  // Maximum time we should run balancer for<a name="line.369"></a>
+<span class="sourceLineNo">370</span>  private final int maxBlancingTime;<a name="line.370"></a>
+<span class="sourceLineNo">371</span>  // Maximum percent of regions in transition when balancing<a name="line.371"></a>
+<span class="sourceLineNo">372</span>  private final double maxRitPercent;<a name="line.372"></a>
+<span class="sourceLineNo">373</span><a name="line.373"></a>
+<span class="sourceLineNo">374</span>  private final LockManager lockManager = new LockManager(this);<a name="line.374"></a>
+<span class="sourceLineNo">375</span><a name="line.375"></a>
+<span class="sourceLineNo">376</span>  private LoadBalancer balancer;<a name="line.376"></a>
+<span class="sourceLineNo">377</span>  private RegionNormalizer normalizer;<a name="line.377"></a>
+<span class="sourceLineNo">378</span>  private BalancerChore balancerChore;<a name="line.378"></a>
+<span class="sourceLineNo">379</span>  private RegionNormalizerChore normalizerChore;<a name="line.379"></a>
+<span class="sourceLineNo">380</span>  private ClusterStatusChore clusterStatusChore;<a name="line.380"></a>
+<span class="sourceLineNo">381</span>  private ClusterStatusPublisher clusterStatusPublisherChore = null;<a name="line.381"></a>
+<span class="sourceLineNo">382</span><a name="line.382"></a>
+<span class="sourceLineNo">383</span>  CatalogJanitor catalogJanitorChore;<a name="line.383"></a>
+<span class="sourceLineNo">384</span>  private LogCleaner logCleaner;<a name="line.384"></a>
+<span class="sourceLineNo">385</span>  private HFileCleaner hfileCleaner;<a name="line.385"></a>
+<span class="sourceLineNo">386</span>  private ReplicationBarrierCleaner replicationBarrierCleaner;<a name="line.386"></a>
+<span class="sourceLineNo">387</span>  private ExpiredMobFileCleanerChore expiredMobFileCleanerChore;<a name="line.387"></a>
+<span class="sourceLineNo">388</span>  private MobCompactionChore mobCompactChore;<a name="line.388"></a>
+<span class="sourceLineNo">389</span>  private MasterMobCompactionThread mobCompactThread;<a name="line.389"></a>
+<span class="sourceLineNo">390</span>  // used to synchronize the mobCompactionStates<a name="line.390"></a>
+<span class="sourceLineNo">391</span>  private final IdLock mobCompactionLock = new IdLock();<a name="line.391"></a>
+<span class="sourceLineNo">392</span>  // save the information of mob compactions in tables.<a name="line.392"></a>
+<span class="sourceLineNo">393</span>  // the key is table name, the value is the number of compactions in that table.<a name="line.393"></a>
+<span class="sourceLineNo">394</span>  private Map&lt;TableName, AtomicInteger&gt; mobCompactionStates = Maps.newConcurrentMap();<a name="line.394"></a>
+<span class="sourceLineNo">395</span><a name="line.395"></a>
+<span class="sourceLineNo">396</span>  MasterCoprocessorHost cpHost;<a name="line.396"></a>
+<span class="sourceLineNo">397</span><a name="line.397"></a>
+<span class="sourceLineNo">398</span>  private final boolean preLoadTableDescriptors;<a name="line.398"></a>
 <span class="sourceLineNo">399</span><a name="line.399"></a>
-<span class="sourceLineNo">400</span>  MasterCoprocessorHost cpHost;<a name="line.400"></a>
-<span class="sourceLineNo">401</span><a name="line.401"></a>
-<span class="sourceLineNo">402</span>  private final boolean preLoadTableDescriptors;<a name="line.402"></a>
-<span class="sourceLineNo">403</span><a name="line.403"></a>
-<span class="sourceLineNo">404</span>  // Time stamps for when a hmaster became active<a name="line.404"></a>
-<span class="sourceLineNo">405</span>  private long masterActiveTime;<a name="line.405"></a>
-<span class="sourceLineNo">406</span><a name="line.406"></a>
-<span class="sourceLineNo">407</span>  // Time stamp for when HMaster finishes becoming Active Master<a name="line.407"></a>
-<span class="sourceLineNo">408</span>  private long masterFinishedInitializationTime;<a name="line.408"></a>
-<span class="sourceLineNo">409</span><a name="line.409"></a>
-<span class="sourceLineNo">410</span>  //should we check the compression codec type at master side, default true, HBASE-6370<a name="line.410"></a>
-<span class="sourceLineNo">411</span>  private final boolean masterCheckCompression;<a name="line.411"></a>
-<span class="sourceLineNo">412</span><a name="line.412"></a>
-<span class="sourceLineNo">413</span>  //should we check encryption settings at master side, default true<a name="line.413"></a>
-<span class="sourceLineNo">414</span>  private final boolean masterCheckEncryption;<a name="line.414"></a>
-<span class="sourceLineNo">415</span><a name="line.415"></a>
-<span class="sourceLineNo">416</span>  Map&lt;String, Service&gt; coprocessorServiceHandlers = Maps.newHashMap();<a name="line.416"></a>
-<span class="sourceLineNo">417</span><a name="line.417"></a>
-<span class="sourceLineNo">418</span>  // monitor for snapshot of hbase tables<a name="line.418"></a>
-<span class="sourceLineNo">419</span>  SnapshotManager snapshotManager;<a name="line.419"></a>
-<span class="sourceLineNo">420</span>  // monitor for distributed procedures<a name="line.420"></a>
-<span class="sourceLineNo">421</span>  private MasterProcedureManagerHost mpmHost;<a name="line.421"></a>
-<span class="sourceLineNo">422</span><a name="line.422"></a>
-<span class="sourceLineNo">423</span>  // it is assigned after 'initialized' guard set to true, so should be volatile<a name="line.423"></a>
-<span class="sourceLineNo">424</span>  private volatile MasterQuotaManager quotaManager;<a name="line.424"></a>
-<span class="sourceLineNo">425</span>  private SpaceQuotaSnapshotNotifier spaceQuotaSnapshotNotifier;<a name="line.425"></a>
-<span class="sourceLineNo">426</span>  private QuotaObserverChore quotaObserverChore;<a name="line.426"></a>
-<span class="sourceLineNo">427</span>  private SnapshotQuotaObserverChore snapshotQuotaChore;<a name="line.427"></a>
-<span class="sourceLineNo">428</span><a name="line.428"></a>
-<span class="sourceLineNo">429</span>  private ProcedureExecutor&lt;MasterProcedureEnv&gt; procedureExecutor;<a name="line.429"></a>
-<span class="sourceLineNo">430</span>  private WALProcedureStore procedureStore;<a name="line.430"></a>
-<span class="sourceLineNo">431</span><a name="line.431"></a>
-<span class="sourceLineNo">432</span>  // handle table states<a name="line.432"></a>
-<span class="sourceLineNo">433</span>  private TableStateManager tableStateManager;<a name="line.433"></a>
-<span class="sourceLineNo">434</span><a name="line.434"></a>
-<span class="sourceLineNo">435</span>  private long splitPlanCount;<a name="line.435"></a>
-<span class="sourceLineNo">436</span>  private long mergePlanCount;<a name="line.436"></a>
-<span class="sourceLineNo">437</span><a name="line.437"></a>
-<span class="sourceLineNo">438</span>  /* Handle favored nodes information */<a name="line.438"></a>
-<span class="sourceLineNo">439</span>  private FavoredNodesManager favoredNodesManager;<a name="line.439"></a>
-<span class="sourceLineNo">440</span><a name="line.440"></a>
-<span class="sourceLineNo">441</span>  /** jetty server for master to redirect requests to regionserver infoServer */<a name="line.441"></a>
-<span class="sourceLineNo">442</span>  private Server masterJettyServer;<a name="line.442"></a>
-<span class="sourceLineNo">443</span><a name="line.443"></a>
-<span class="sourceLineNo">444</span>  public static class RedirectServlet extends HttpServlet {<a name="line.444"></a>
-<span class="sourceLineNo">445</span>    private static final long serialVersionUID = 2894774810058302473L;<a name="line.445"></a>
-<span class="sourceLineNo">446</span>    private final int regionServerInfoPort;<a name="line.446"></a>
-<span class="sourceLineNo">447</span>    private final String regionServerHostname;<a name="line.447"></a>
-<span class="sourceLineNo">448</span><a name="line.448"></a>
-<span class="sourceLineNo">449</span>    /**<a name="line.449"></a>
-<span class="sourceLineNo">450</span>     * @param infoServer that we're trying to send all requests to<a name="line.450"></a>
-<span class="sourceLineNo">451</span>     * @param hostname may be null. if given, will be used for redirects instead of host from client.<a name="line.451"></a>
-<span class="sourceLineNo">452</span>     */<a name="line.452"></a>
-<span class="sourceLineNo">453</span>    public RedirectServlet(InfoServer infoServer, String hostname) {<a name="line.453"></a>
-<span class="sourceLineNo">454</span>       regionServerInfoPort = infoServer.getPort();<a name="line.454"></a>
-<span class="sourceLineNo">455</span>       regionServerHostname = hostname;<a name="line.455"></a>
-<span class="sourceLineNo">456</span>    }<a name="line.456"></a>
-<span class="sourceLineNo">457</span><a name="line.457"></a>
-<span class="sourceLineNo">458</span>    @Override<a name="line.458"></a>
-<span class="sourceLineNo">459</span>    public void doGet(HttpServletRequest request,<a name="line.459"></a>
-<span class="sourceLineNo">460</span>        HttpServletResponse response) throws ServletException, IOException {<a name="line.460"></a>
-<span class="sourceLineNo">461</span>      String redirectHost = regionServerHostname;<a name="line.461"></a>
-<span class="sourceLineNo">462</span>      if(redirectHost == null) {<a name="line.462"></a>
-<span class="sourceLineNo">463</span>        redirectHost = request.getServerName();<a name="line.463"></a>
-<span class="sourceLineNo">464</span>        if(!Addressing.isLocalAddress(InetAddress.getByName(redirectHost))) {<a name="line.464"></a>
-<span class="sourceLineNo">465</span>          LOG.warn("Couldn't resolve '" + redirectHost + "' as an address local to this node and '" +<a name="line.465"></a>
-<span class="sourceLineNo">466</span>              MASTER_HOSTNAME_KEY + "' is not set; client will get a HTTP 400 response. If " +<a name="line.466"></a>
-<span class="sourceLineNo">467</span>              "your HBase deployment relies on client accessible names that the region server process " +<a name="line.467"></a>
-<span class="sourceLineNo">468</span>              "can't resolve locally, then you should set the previously mentioned configuration variable " +<a name="line.468"></a>
-<span class="sourceLineNo">469</span>              "to an appropriate hostname.");<a name="line.469"></a>
-<span class="sourceLineNo">470</span>          // no sending client provided input back to the client, so the goal host is just in the logs.<a name="line.470"></a>
-<span class="sourceLineNo">471</span>          response.sendError(400, "Request was to a host that I can't resolve for any of the network interfaces on " +<a name="line.471"></a>
-<span class="sourceLineNo">472</span>              "this node. If this is due to an intermediary such as an HTTP load balancer or other proxy, your HBase " +<a name="line.472"></a>
-<span class="sourceLineNo">473</span>              "administrator can set '" + MASTER_HOSTNAME_KEY + "' to point to the correct hostname.");<a name="line.473"></a>
-<span class="sourceLineNo">474</span>          return;<a name="line.474"></a>
-<span class="sourceLineNo">475</span>        }<a name="line.475"></a>
-<span class="sourceLineNo">476</span>      }<a name="line.476"></a>
-<span class="sourceLineNo">477</span>      // TODO this scheme should come from looking at the scheme registered in the infoserver's http server for the<a name="line.477"></a>
-<span class="sourceLineNo">478</span>      // host and port we're using, but it's buried way too deep to do that ATM.<a name="line.478"></a>
-<span class="sourceLineNo">479</span>      String redirectUrl = request.getScheme() + "://"<a name="line.479"></a>
-<span class="sourceLineNo">480</span>        + redirectHost + ":" + regionServerInfoPort<a name="line.480"></a>
-<span class="sourceLineNo">481</span>        + request.getRequestURI();<a name="line.481"></a>
-<span class="sourceLineNo">482</span>      response.sendRedirect(redirectUrl);<a name="line.482"></a>
-<span class="sourceLineNo">483</span>    }<a name="line.483"></a>
-<span class="sourceLineNo">484</span>  }<a name="line.484"></a>
-<span class="sourceLineNo">485</span><a name="line.485"></a>
-<span class="sourceLineNo">486</span>  /**<a name="line.486"></a>
-<span class="sourceLineNo">487</span>   * Initializes the HMaster. The steps are as follows:<a name="line.487"></a>
-<span class="sourceLineNo">488</span>   * &lt;p&gt;<a name="line.488"></a>
-<span class="sourceLineNo">489</span>   * &lt;ol&gt;<a name="line.489"></a>
-<span class="sourceLineNo">490</span>   * &lt;li&gt;Initialize the local HRegionServer<a name="line.490"></a>
-<span class="sourceLineNo">491</span>   * &lt;li&gt;Start the ActiveMasterManager.<a name="line.491"></a>
-<span class="sourceLineNo">492</span>   * &lt;/ol&gt;<a name="line.492"></a>
-<span class="sourceLineNo">493</span>   * &lt;p&gt;<a name="line.493"></a>
-<span class="sourceLineNo">494</span>   * Remaining steps of initialization occur in<a name="line.494"></a>
-<span class="sourceLineNo">495</span>   * #finishActiveMasterInitialization(MonitoredTask) after<a name="line.495"></a>
-<span class="sourceLineNo">496</span>   * the master becomes the active one.<a name="line.496"></a>
-<span class="sourceLineNo">497</span>   */<a name="line.497"></a>
-<span class="sourceLineNo">498</span>  public HMaster(final Configuration conf)<a name="line.498"></a>
-<span class="sourceLineNo">499</span>      throws IOException, KeeperException {<a name="line.499"></a>
-<span class="sourceLineNo">500</span>    super(conf);<a name="line.500"></a>
-<span class="sourceLineNo">501</span>    TraceUtil.initTracer(conf);<a name="line.501"></a>
-<span class="sourceLineNo">502</span>    try {<a name="line.502"></a>
-<span class="sourceLineNo">503</span>      this.rsFatals = new MemoryBoundedLogMessageBuffer(<a name="line.503"></a>
-<span class="sourceLineNo">504</span>          conf.getLong("hbase.master.buffer.for.rs.fatals", 1 * 1024 * 1024));<a name="line.504"></a>
-<span class="sourceLineNo">505</span>      LOG.info("hbase.rootdir=" + getRootDir() +<a name="line.505"></a>
-<span class="sourceLineNo">506</span>          ", hbase.cluster.distributed=" + this.conf.getBoolean(HConstants.CLUSTER_DISTRIBUTED, false));<a name="line.506"></a>
-<span class="sourceLineNo">507</span><a name="line.507"></a>
-<span class="sourceLineNo">508</span>      // Disable usage of meta replicas in the master<a name="line.508"></a>
-<span class="sourceLineNo">509</span>      this.conf.setBoolean(HConstants.USE_META_REPLICAS, false);<a name="line.509"></a>
-<span class="sourceLineNo">510</span><a name="line.510"></a>
-<span class="sourceLineNo">511</span>      decorateMasterConfiguration(this.conf);<a name="line.511"></a>
-<span class="sourceLineNo">512</span><a name="line.512"></a>
-<span class="sourceLineNo">513</span>      // Hack! Maps DFSClient =&gt; Master for logs.  HDFS made this<a name="line.513"></a>
-<span class="sourceLineNo">514</span>      // config param for task trackers, but we can piggyback off of it.<a name="line.514"></a>
-<span class="sourceLineNo">515</span>      if (this.conf.get("mapreduce.task.attempt.id") == null) {<a name="line.515"></a>
-<span class="sourceLineNo">516</span>        this.conf.set("mapreduce.task.attempt.id", "hb_m_" + this.serverName.toString());<a name="line.516"></a>
-<span class="sourceLineNo">517</span>      }<a name="line.517"></a>
+<span class="sourceLineNo">400</span>  // Time stamps for when a hmaster became active<a name="line.400"></a>
+<span class="sourceLineNo">401</span>  private long masterActiveTime;<a name="line.401"></a>
+<span class="sourceLineNo">402</span><a name="line.402"></a>
+<span class="sourceLineNo">403</span>  // Time stamp for when HMaster finishes becoming Active Master<a name="line.403"></a>
+<span class="sourceLineNo">404</span>  private long masterFinishedInitializationTime;<a name="line.404"></a>
+<span class="sourceLineNo">405</span><a name="line.405"></a>
+<span class="sourceLineNo">406</span>  //should we check the compression codec type at master side, default true, HBASE-6370<a name="line.406"></a>
+<span class="sourceLineNo">407</span>  private final boolean masterCheckCompression;<a name="line.407"></a>
+<span class="sourceLineNo">408</span><a name="line.408"></a>
+<span class="sourceLineNo">409</span>  //should we check encryption settings at master side, default true<a name="line.409"></a>
+<span class="sourceLineNo">410</span>  private final boolean masterCheckEncryption;<a name="line.410"></a>
+<span class="sourceLineNo">411</span><a name="line.411"></a>
+<span class="sourceLineNo">412</span>  Map&lt;String, Service&gt; coprocessorServiceHandlers = Maps.newHashMap();<a name="line.412"></a>
+<span class="sourceLineNo">413</span><a name="line.413"></a>
+<span class="sourceLineNo">414</span>  // monitor for snapshot of hbase tables<a name="line.414"></a>
+<span class="sourceLineNo">415</span>  SnapshotManager snapshotManager;<a name="line.415"></a>
+<span class="sourceLineNo">416</span>  // monitor for distributed procedures<a name="line.416"></a>
+<span class="sourceLineNo">417</span>  private MasterProcedureManagerHost mpmHost;<a name="line.417"></a>
+<span class="sourceLineNo">418</span><a name="line.418"></a>
+<span class="sourceLineNo">419</span>  // it is assigned after 'initialized' guard set to true, so should be volatile<a name="line.419"></a>
+<span class="sourceLineNo">420</span>  private volatile MasterQuotaManager quotaManager;<a name="line.420"></a>
+<span class="sourceLineNo">421</span>  private SpaceQuotaSnapshotNotifier spaceQuotaSnapshotNotifier;<a name="line.421"></a>
+<span class="sourceLineNo">422</span>  private QuotaObserverChore quotaObserverChore;<a name="line.422"></a>
+<span class="sourceLineNo">423</span>  private SnapshotQuotaObserverChore snapshotQuotaChore;<a name="line.423"></a>
+<span class="sourceLineNo">424</span><a name="line.424"></a>
+<span class="sourceLineNo">425</span>  private ProcedureExecutor&lt;MasterProcedureEnv&gt; procedureExecutor;<a name="line.425"></a>
+<span class="sourceLineNo">426</span>  private WALProcedureStore procedureStore;<a name="line.426"></a>
+<span class="sourceLineNo">427</span><a name="line.427"></a>
+<span class="sourceLineNo">428</span>  // handle table states<a name="line.428"></a>
+<span class="sourceLineNo">429</span>  private TableStateManager tableStateManager;<a name="line.429"></a>
+<span class="sourceLineNo">430</span><a name="line.430"></a>
+<span class="sourceLineNo">431</span>  private long splitPlanCount;<a name="line.431"></a>
+<span class="sourceLineNo">432</span>  private long mergePlanCount;<a name="line.432"></a>
+<span class="sourceLineNo">433</span><a name="line.433"></a>
+<span class="sourceLineNo">434</span>  /* Handle favored nodes information */<a name="line.434"></a>
+<span class="sourceLineNo">435</span>  private FavoredNodesManager favoredNodesManager;<a name="line.435"></a>
+<span class="sourceLineNo">436</span><a name="line.436"></a>
+<span class="sourceLineNo">437</span>  /** jetty server for master to redirect requests to regionserver infoServer */<a name="line.437"></a>
+<span class="sourceLineNo">438</span>  private Server masterJettyServer;<a name="line.438"></a>
+<span class="sourceLineNo">439</span><a name="line.439"></a>
+<span class="sourceLineNo">440</span>  // Determine if we should do normal startup or minimal "single-user" mode with no region<a name="line.440"></a>
+<span class="sourceLineNo">441</span>  // servers and no user tables. Useful for repair and recovery of hbase:meta<a name="line.441"></a>
+<span class="sourceLineNo">442</span>  private final boolean maintenanceMode;<a name="line.442"></a>
+<span class="sourceLineNo">443</span>  static final String MAINTENANCE_MODE = "hbase.master.maintenance_mode";<a name="line.443"></a>
+<span class="sourceLineNo">444</span><a name="line.444"></a>
+<span class="sourceLineNo">445</span>  public static class RedirectServlet extends HttpServlet {<a name="line.445"></a>
+<span class="sourceLineNo">446</span>    private static final long serialVersionUID = 2894774810058302473L;<a name="line.446"></a>
+<span class="sourceLineNo">447</span>    private final int regionServerInfoPort;<a name="line.447"></a>
+<span class="sourceLineNo">448</span>    private final String regionServerHostname;<a name="line.448"></a>
+<span class="sourceLineNo">449</span><a name="line.449"></a>
+<span class="sourceLineNo">450</span>    /**<a name="line.450"></a>
+<span class="sourceLineNo">451</span>     * @param infoServer that we're trying to send all requests to<a name="line.451"></a>
+<span class="sourceLineNo">452</span>     * @param hostname may be null. if given, will be used for redirects instead of host from client.<a name="line.452"></a>
+<span class="sourceLineNo">453</span>     */<a name="line.453"></a>
+<span class="sourceLineNo">454</span>    public RedirectServlet(InfoServer infoServer, String hostname) {<a name="line.454"></a>
+<span class="sourceLineNo">455</span>       regionServerInfoPort = infoServer.getPort();<a name="line.455"></a>
+<span class="sourceLineNo">456</span>       regionServerHostname = hostname;<a name="line.456"></a>
+<span class="sourceLineNo">457</span>    }<a name="line.457"></a>
+<span class="sourceLineNo">458</span><a name="line.458"></a>
+<span class="sourceLineNo">459</span>    @Override<a name="line.459"></a>
+<span class="sourceLineNo">460</span>    public void doGet(HttpServletRequest request,<a name="line.460"></a>
+<span class="sourceLineNo">461</span>        HttpServletResponse response) throws ServletException, IOException {<a name="line.461"></a>
+<span class="sourceLineNo">462</span>      String redirectHost = regionServerHostname;<a name="line.462"></a>
+<span class="sourceLineNo">463</span>      if(redirectHost == null) {<a name="line.463"></a>
+<span class="sourceLineNo">464</span>        redirectHost = request.getServerName();<a name="line.464"></a>
+<span class="sourceLineNo">465</span>        if(!Addressing.isLocalAddress(InetAddress.getByName(redirectHost))) {<a name="line.465"></a>
+<span class="sourceLineNo">466</span>          LOG.warn("Couldn't resolve '" + redirectHost + "' as an address local to this node and '" +<a name="line.466"></a>
+<span class="sourceLineNo">467</span>              MASTER_HOSTNAME_KEY + "' is not set; client will get a HTTP 400 response. If " +<a name="line.467"></a>
+<span class="sourceLineNo">468</span>              "your HBase deployment relies on client accessible names that the region server process " +<a name="line.468"></a>
+<span class="sourceLineNo">469</span>              "can't resolve locally, then you should set the previously mentioned configuration variable " +<a name="line.469"></a>
+<span class="sourceLineNo">470</span>              "to an appropriate hostname.");<a name="line.470"></a>
+<span class="sourceLineNo">471</span>          // no sending client provided input back to the client, so the goal host is just in the logs.<a name="line.471"></a>
+<span class="sourceLineNo">472</span>          response.sendError(400, "Request was to a host that I can't resolve for any of the network interfaces on " +<a name="line.472"></a>
+<span class="sourceLineNo">473</span>              "this node. If this is due to an intermediary such as an HTTP load balancer or other proxy, your HBase " +<a name="line.473"></a>
+<span class="sourceLineNo">474</span>              "administrator can set '" + MASTER_HOSTNAME_KEY + "' to point to the correct hostname.");<a name="line.474"></a>
+<span class="sourceLineNo">475</span>          return;<a name="line.475"></a>
+<span class="sourceLineNo">476</span>        }<a name="line.476"></a>
+<span class="sourceLineNo">477</span>      }<a name="line.477"></a>
+<span class="sourceLineNo">478</span>      // TODO this scheme should come from looking at the scheme registered in the infoserver's http server for the<a name="line.478"></a>
+<span class="sourceLineNo">479</span>      // host and port we're using, but it's buried way too deep to do that ATM.<a name="line.479"></a>
+<span class="sourceLineNo">480</span>      String redirectUrl = request.getScheme() + "://"<a name="line.480"></a>
+<span class="sourceLineNo">481</span>        + redirectHost + ":" + regionServerInfoPort<a name="line.481"></a>
+<span class="sourceLineNo">482</span>        + request.getRequestURI();<a name="line.482"></a>
+<span class="sourceLineNo">483</span>      response.sendRedirect(redirectUrl);<a name="line.483"></a>
+<span class="sourceLineNo">484</span>    }<a name="line.484"></a>
+<span class="sourceLineNo">485</span>  }<a name="line.485"></a>
+<span class="sourceLineNo">486</span><a name="line.486"></a>
+<span class="sourceLineNo">487</span>  /**<a name="line.487"></a>
+<span class="sourceLineNo">488</span>   * Initializes the HMaster. The steps are as follows:<a name="line.488"></a>
+<span class="sourceLineNo">489</span>   * &lt;p&gt;<a name="line.489"></a>
+<span class="sourceLineNo">490</span>   * &lt;ol&gt;<a name="line.490"></a>
+<span class="sourceLineNo">491</span>   * &lt;li&gt;Initialize the local HRegionServer<a name="line.491"></a>
+<span class="sourceLineNo">492</span>   * &lt;li&gt;Start the ActiveMasterManager.<a name="line.492"></a>
+<span class="sourceLineNo">493</span>   * &lt;/ol&gt;<a name="line.493"></a>
+<span class="sourceLineNo">494</span>   * &lt;p&gt;<a name="line.494"></a>
+<span class="sourceLineNo">495</span>   * Remaining steps of initialization occur in<a name="line.495"></a>
+<span class="sourceLineNo">496</span>   * #finishActiveMasterInitialization(MonitoredTask) after<a name="line.496"></a>
+<span class="sourceLineNo">497</span>   * the master becomes the active one.<a name="line.497"></a>
+<span class="sourceLineNo">498</span>   */<a name="line.498"></a>
+<span class="sourceLineNo">499</span>  public HMaster(final Configuration conf)<a name="line.499"></a>
+<span class="sourceLineNo">500</span>      throws IOException, KeeperException {<a name="line.500"></a>
+<span class="sourceLineNo">501</span>    super(conf);<a name="line.501"></a>
+<span class="sourceLineNo">502</span>    TraceUtil.initTracer(conf);<a name="line.502"></a>
+<span class="sourceLineNo">503</span>    try {<a name="line.503"></a>
+<span class="sourceLineNo">504</span>      if (conf.getBoolean(MAINTENANCE_MODE, false)) {<a name="line.504"></a>
+<span class="sourceLineNo">505</span>        LOG.info("Detected {}=true via configuration.", MAINTENANCE_MODE);<a name="line.505"></a>
+<span class="sourceLineNo">506</span>        maintenanceMode = true;<a name="line.506"></a>
+<span class="sourceLineNo">507</span>      } else if (Boolean.getBoolean(MAINTENANCE_MODE)) {<a name="line.507"></a>
+<span class="sourceLineNo">508</span>        LOG.info("Detected {}=true via environment variables.", MAINTENANCE_MODE);<a name="line.508"></a>
+<span class="sourceLineNo">509</span>        maintenanceMode = true;<a name="line.509"></a>
+<span class="sourceLineNo">510</span>      } else {<a name="line.510"></a>
+<span class="sourceLineNo">511</span>        maintenanceMode = false;<a name="line.511"></a>
+<span class="sourceLineNo">512</span>      }<a name="line.512"></a>
+<span class="sourceLineNo">513</span><a name="line.513"></a>
+<span class="sourceLineNo">514</span>      this.rsFatals = new MemoryBoundedLogMessageBuffer(<a name="line.514"></a>
+<span class="sourceLineNo">515</span>          conf.getLong("hbase.master.buffer.for.rs.fatals", 1 * 1024 * 1024));<a name="line.515"></a>
+<span class="sourceLineNo">516</span>      LOG.info("hbase.rootdir=" + getRootDir() +<a name="line.516"></a>
+<span class="sourceLineNo">517</span>          ", hbase.cluster.distributed=" + this.conf.getBoolean(HConstants.CLUSTER_DISTRIBUTED, false));<a name="line.517"></a>
 <span class="sourceLineNo">518</span><a name="line.518"></a>
-<span class="sourceLineNo">519</span>      // should we check the compression codec type at master side, default true, HBASE-6370<a name="line.519"></a>
-<span class="sourceLineNo">520</span>      this.masterCheckCompression = conf.getBoolean("hbase.master.check.compression", true);<a name="line.520"></a>
+<span class="sourceLineNo">519</span>      // Disable usage of meta replicas in the master<a name="line.519"></a>
+<span class="sourceLineNo">520</span>      this.conf.setBoolean(HConstants.USE_META_REPLICAS, false);<a name="line.520"></a>
 <span class="sourceLineNo">521</span><a name="line.521"></a>
-<span class="sourceLineNo">522</span>      // should we check encryption settings at master side, default true<a name="line.522"></a>
-<span class="sourceLineNo">523</span>      this.masterCheckEncryption = conf.getBoolean("hbase.master.check.encryption", true);<a name="line.523"></a>
-<span class="sourceLineNo">524</span><a name="line.524"></a>
-<span class="sourceLineNo">525</span>      this.metricsMaster = new MetricsMaster(new MetricsMasterWrapperImpl(this));<a name="line.525"></a>
-<span class="sourceLineNo">526</span><a name="line.526"></a>
-<span class="sourceLineNo">527</span>      // preload table descriptor at startup<a name="line.527"></a>
-<span class="sourceLineNo">528</span>      this.preLoadTableDescriptors = conf.getBoolean("hbase.master.preload.tabledescriptors", true);<a name="line.528"></a>
+<span class="sourceLineNo">522</span>      decorateMasterConfiguration(this.conf);<a name="line.522"></a>
+<span class="sourceLineNo">523</span><a name="line.523"></a>
+<span class="sourceLineNo">524</span>      // Hack! Maps DFSClient =&gt; Master for logs.  HDFS made this<a name="line.524"></a>
+<span class="sourceLineNo">525</span>      // config param for task trackers, but we can piggyback off of it.<a name="line.525"></a>
+<span class="sourceLineNo">526</span>      if (this.conf.get("mapreduce.task.attempt.id") == null) {<a name="line.526"></a>
+<span class="sourceLineNo">527</span>        this.conf.set("mapreduce.task.attempt.id", "hb_m_" + this.serverName.toString());<a name="line.527"></a>
+<span class="sourceLineNo">528</span>      }<a name="line.528"></a>
 <span class="sourceLineNo">529</span><a name="line.529"></a>
-<span class="sourceLineNo">530</span>      this.maxBlancingTime = getMaxBalancingTime();<a name="line.530"></a>
-<span class="sourceLineNo">531</span>      this.maxRitPercent = conf.getDouble(HConstants.HBASE_MASTER_BALANCER_MAX_RIT_PERCENT,<a name="line.531"></a>
-<span class="sourceLineNo">532</span>          HConstants.DEFAULT_HBASE_MASTER_BALANCER_MAX_RIT_PERCENT);<a name="line.532"></a>
-<span class="sourceLineNo">533</span><a name="line.533"></a>
-<span class="sourceLineNo">534</span>      // Do we publish the status?<a name="line.534"></a>
+<span class="sourceLineNo">530</span>      // should we check the compression codec type at master side, default true, HBASE-6370<a name="line.530"></a>
+<span class="sourceLineNo">531</span>      this.masterCheckCompression = conf.getBoolean("hbase.master.check.compression", true);<a name="line.531"></a>
+<span class="sourceLineNo">532</span><a name="line.532"></a>
+<span class="sourceLineNo">533</span>      // should we check encryption settings at master side, default true<a name="line.533"></a>
+<span class="sourceLineNo">534</span>      this.masterCheckEncryption = conf.getBoolean("hbase.master.check.encryption", true);<a name="line.534"></a>
 <span class="sourceLineNo">535</span><a name="line.535"></a>
-<span class="sourceLineNo">536</span>      boolean shouldPublish = conf.getBoolean(HConstants.STATUS_PUBLISHED,<a name="line.536"></a>
-<span class="sourceLineNo">537</span>          HConstants.STATUS_PUBLISHED_DEFAULT);<a name="line.537"></a>
-<span class="sourceLineNo">538</span>      Class&lt;? extends ClusterStatusPublisher.Publisher&gt; publisherClass =<a name="line.538"></a>
-<span class="sourceLineNo">539</span>          conf.getClass(ClusterStatusPublisher.STATUS_PUBLISHER_CLASS,<a name="line.539"></a>
-<span class="sourceLineNo">540</span>              ClusterStatusPublisher.DEFAULT_STATUS_PUBLISHER_CLASS,<a name="line.540"></a>
-<span class="sourceLineNo">541</span>              ClusterStatusPublisher.Publisher.class);<a name="line.541"></a>
-<span class="sourceLineNo">542</span><a name="line.542"></a>
-<span class="sourceLineNo">543</span>      if (shouldPublish) {<a name="line.543"></a>
-<span class="sourceLineNo">544</span>        if (publisherClass == null) {<a name="line.544"></a>
-<span class="sourceLineNo">545</span>          LOG.warn(HConstants.STATUS_PUBLISHED + " is true, but " +<a name="line.545"></a>
-<span class="sourceLineNo">546</span>              ClusterStatusPublisher.DEFAULT_STATUS_PUBLISHER_CLASS +<a name="line.546"></a>
-<span class="sourceLineNo">547</span>              " is not set - not publishing status");<a name="line.547"></a>
-<span class="sourceLineNo">548</span>        } else {<a name="line.548"></a>
-<span class="sourceLineNo">549</span>          clusterStatusPublisherChore = new ClusterStatusPublisher(this, conf, publisherClass);<a name="line.549"></a>
-<span class="sourceLineNo">550</span>          getChoreService().scheduleChore(clusterStatusPublisherChore);<a name="line.550"></a>
-<span class="sourceLineNo">551</span>        }<a name="line.551"></a>
-<span class="sourceLineNo">552</span>      }<a name="line.552"></a>
+<span class="sourceLineNo">536</span>      this.metricsMaster = new MetricsMaster(new MetricsMasterWrapperImpl(this));<a name="line.536"></a>
+<span class="sourceLineNo">537</span><a name="line.537"></a>
+<span class="sourceLineNo">538</span>      // preload table descriptor at startup<a name="line.538"></a>
+<span class="sourceLineNo">539</span>      this.preLoadTableDescriptors = conf.getBoolean("hbase.master.preload.tabledescriptors", true);<a name="line.539"></a>
+<span class="sourceLineNo">540</span><a name="line.540"></a>
+<span class="sourceLineNo">541</span>      this.maxBlancingTime = getMaxBalancingTime();<a name="line.541"></a>
+<span class="sourceLineNo">542</span>      this.maxRitPercent = conf.getDouble(HConstants.HBASE_MASTER_BALANCER_MAX_RIT_PERCENT,<a name="line.542"></a>
+<span class="sourceLineNo">543</span>          HConstants.DEFAULT_HBASE_MASTER_BALANCER_MAX_RIT_PERCENT);<a name="line.543"></a>
+<span class="sourceLineNo">544</span><a name="line.544"></a>
+<span class="sourceLineNo">545</span>      // Do we publish the status?<a name="line.545"></a>
+<span class="sourceLineNo">546</span><a name="line.546"></a>
+<span class="sourceLineNo">547</span>      boolean shouldPublish = conf.getBoolean(HConstants.STATUS_PUBLISHED,<a name="line.547"></a>
+<span class="sourceLineNo">548</span>          HConstants.STATUS_PUBLISHED_DEFAULT);<a name="line.548"></a>
+<span class="sourceLineNo">549</span>      Class&lt;? extends ClusterStatusPublisher.Publisher&gt; publisherClass =<a name="line.549"></a>
+<span class="sourceLineNo">550</span>          conf.getClass(ClusterStatusPublisher.STATUS_PUBLISHER_CLASS,<a name="line.550"></a>
+<span class="sourceLineNo">551</span>              ClusterStatusPublisher.DEFAULT_STATUS_PUBLISHER_CLASS,<a name="line.551"></a>
+<span class="sourceLineNo">552</span>              ClusterStatusPublisher.Publisher.class);<a name="line.552"></a>
 <span class="sourceLineNo">553</span><a name="line.553"></a>
-<span class="sourceLineNo">554</span>      // Some unit tests don't need a cluster, so no zookeeper at all<a name="line.554"></a>
-<span class="sourceLineNo">555</span>      if (!conf.getBoolean("hbase.testing.nocluster", false)) {<a name="line.555"></a>
-<span class="sourceLineNo">556</span>        this.activeMasterManager = new ActiveMasterManager(zooKeeper, this.serverName, this);<a name="line.556"></a>
-<span class="sourceLineNo">557</span>      } else {<a name="line.557"></a>
-<span class="sourceLineNo">558</span>        this.activeMasterManager = null;<a name="line.558"></a>
-<span class="sourceLineNo">559</span>      }<a name="line.559"></a>
-<span class="sourceLineNo">560</span>    } catch (Throwable t) {<a name="line.560"></a>
-<span class="sourceLineNo">561</span>      // Make sure we log the exception. HMaster is often started via reflection and the<a name="line.561"></a>
-<span class="sourceLineNo">562</span>      // cause of failed startup is lost.<a name="line.562"></a>
-<span class="sourceLineNo">563</span>      LOG.error("Failed construction of Master", t);<a name="line.563"></a>
-<span class="sourceLineNo">564</span>      throw t;<a name="line.564"></a>
-<span class="sourceLineNo">565</span>    }<a name="line.565"></a>
-<span class="sourceLineNo">566</span>  }<a name="line.566"></a>
-<span class="sourceLineNo">567</span><a name="line.567"></a>
-<span class="sourceLineNo">568</span>  @Override<a name="line.568"></a>
-<span class="sourceLineNo">569</span>  protected String getUseThisHostnameInstead(Configuration conf) {<a name="line.569"></a>
-<span class="sourceLineNo">570</span>    return conf.get(MASTER_HOSTNAME_KEY);<a name="line.570"></a>
-<span class="sourceLineNo">571</span>  }<a name="line.571"></a>
-<span class="sourceLineNo">572</span><a name="line.572"></a>
-<span class="sourceLineNo">573</span>  // Main run loop. Calls through to the regionserver run loop AFTER becoming active Master; will<a name="line.573"></a>
-<span class="sourceLineNo">574</span>  // block in here until then.<a name="line.574"></a>
-<span class="sourceLineNo">575</span>  @Override<a name="line.575"></a>
-<span class="sourceLineNo">576</span>  public void run() {<a name="line.576"></a>
-<span class="sourceLineNo">577</span>    try {<a name="line.577"></a>
-<span class="sourceLineNo">578</span>      if (!conf.getBoolean("hbase.testing.nocluster", false)) {<a name="line.578"></a>
-<span class="sourceLineNo">579</span>        Threads.setDaemonThreadRunning(new Thread(() -&gt; {<a name="line.579"></a>
-<span class="sourceLineNo">580</span>          try {<a name="line.580"></a>
-<span class="sourceLineNo">581</span>            int infoPort = putUpJettyServer();<a name="line.581"></a>
-<span class="sourceLineNo">582</span>            startActiveMasterManager(infoPort);<a name="line.582"></a>
-<span class="sourceLineNo">583</span>          } catch (Throwable t) {<a name="line.583"></a>
-<span class="sourceLineNo">584</span>            // Make sure we log the exception.<a name="line.584"></a>
-<span class="sourceLineNo">585</span>            String error = "Failed to become Active Master";<a name="line.585"></a>
-<span class="sourceLineNo">586</span>            LOG.error(error, t);<a name="line.586"></a>
-<span class="sourceLineNo">587</span>            // Abort should have been called already.<a name="line.587"></a>
-<span class="sourceLineNo">588</span>            if (!isAborted()) {<a name="line.588"></a>
-<span class="sourceLineNo">589</span>              abort(error, t);<a name="line.589"></a>
-<span class="sourceLineNo">590</span>            }<a name="line.590"></a>
-<span class="sourceLineNo">591</span>          }<a name="line.591"></a>
-<span class="sourceLineNo">592</span>        }), getName() + ":becomeActiveMaster");<a name="line.592"></a>
-<span class="sourceLineNo">593</span>      }<a name="line.593"></a>
-<span class="sourceLineNo">594</span>      // Fall in here even if we have been aborted. Need to run the shutdown services and<a name="line.594"></a>
-<span class="sourceLineNo">595</span>      // the super run call will do this for us.<a name="line.595"></a>
-<span class="sourceLineNo">596</span>      super.run();<a name="line.596"></a>
-<span class="sourceLineNo">597</span>    } finally {<a name="line.597"></a>
-<span class="sourceLineNo">598</span>      if (this.clusterSchemaService != null) {<a name="line.598"></a>
-<span class="sourceLineNo">599</span>        // If on way out, then we are no longer active master.<a name="line.599"></a>
-<span class="sourceLineNo">600</span>        this.clusterSchemaService.stopAsync();<a name="line.600"></a>
-<span class="sourceLineNo">601</span>        try {<a name="line.601"></a>
-<span class="sourceLineNo">602</span>          this.clusterSchemaService.awaitTerminated(<a name="line.602"></a>
-<span class="sourceLineNo">603</span>              getConfiguration().getInt(HBASE_MASTER_WAIT_ON_SERVICE_IN_SECONDS,<a name="line.603"></a>
-<span class="sourceLineNo">604</span>              DEFAULT_HBASE_MASTER_WAIT_ON_SERVICE_IN_SECONDS), TimeUnit.SECONDS);<a name="line.604"></a>
-<span class="sourceLineNo">605</span>        } catch (TimeoutException te) {<a name="line.605"></a>
-<span class="sourceLineNo">606</span>          LOG.warn("Failed shutdown of clusterSchemaService", te);<a name="line.606"></a>
-<span class="sourceLineNo">607</span>        }<a name="line.607"></a>
-<span class="sourceLineNo">608</span>      }<a name="line.608"></a>
-<span class="sourceLineNo">609</span>      this.activeMaster = false;<a name="line.609"></a>
-<span class="sourceLineNo">610</span>    }<a name="line.610"></a>
-<span class="sourceLineNo">611</span>  }<a name="line.611"></a>
-<span class="sourceLineNo">612</span><a name="line.612"></a>
-<span class="sourceLineNo">613</span>  // return the actual infoPort, -1 means disable info server.<a name="line.613"></a>
-<span class="sourceLineNo">614</span>  private int putUpJettyServer() throws IOException {<a name="line.614"></a>
-<span class="sourceLineNo">615</span>    if (!conf.getBoolean("hbase.master.infoserver.redirect", true)) {<a name="line.615"></a>
-<span class="sourceLineNo">616</span>      return -1;<a name="line.616"></a>
-<span class="sourceLineNo">617</span>    }<a name="line.617"></a>
-<span class="sourceLineNo">618</span>    final int infoPort = conf.getInt("hbase.master.info.port.orig",<a name="line.618"></a>
-<span class="sourceLineNo">619</span>      HConstants.DEFAULT_MASTER_INFOPORT);<a name="line.619"></a>
-<span class="sourceLineNo">620</span>    // -1 is for disabling info server, so no redirecting<a name="line.620"></a>
-<span class="sourceLineNo">621</span>    if (infoPort &lt; 0 || infoServer == null) {<a name="line.621"></a>
-<span class="sourceLineNo">622</span>      return -1;<a name="line.622"></a>
-<span class="sourceLineNo">623</span>    }<a name="line.623"></a>
-<span class="sourceLineNo">624</span>    if(infoPort == infoServer.getPort()) {<a name="line.624"></a>
-<span class="sourceLineNo">625</span>      return infoPort;<a name="line.625"></a>
-<span class="sourceLineNo">626</span>    }<a name="line.626"></a>
-<span class="sourceLineNo">627</span>    final String addr = conf.get("hbase.master.info.bindAddress", "0.0.0.0");<a name="line.627"></a>
-<span class="sourceLineNo">628</span>    if (!Addressing.isLocalAddress(InetAddress.getByName(addr))) {<a name="line.628"></a>
-<span class="sourceLineNo">629</span>      String msg =<a name="line.629"></a>
-<span class="sourceLineNo">630</span>          "Failed to start redirecting jetty server. Address " + addr<a name="line.630"></a>
-<span class="sourceLineNo">631</span>              + " does not belong to this host. Correct configuration parameter: "<a name="line.631"></a>
-<span class="sourceLineNo">632</span>              + "hbase.master.info.bindAddress";<a name="line.632"></a>
-<span class="sourceLineNo">633</span>      LOG.error(msg);<a name="line.633"></a>
-<span class="sourceLineNo">634</span>      throw new IOException(msg);<a name="line.634"></a>
-<span class="sourceLineNo">635</span>    }<a name="line.635"></a>
-<span class="sourceLineNo">636</span><a name="line.636"></a>
-<span class="sourceLineNo">637</span>    // TODO I'm pretty sure we could just add another binding to the InfoServer run by<a name="line.637"></a>
-<span class="sourceLineNo">638</span>    // the RegionServer and have it run the RedirectServlet instead of standing up<a name="line.638"></a>
-<span class="sourceLineNo">639</span>    // a second entire stack here.<a name="line.639"></a>
-<span class="sourceLineNo">640</span>    masterJettyServer = new Server();<a name="line.640"></a>
-<span class="sourceLineNo">641</span>    final ServerConnector connector = new ServerConnector(masterJettyServer);<a name="line.641"></a>
-<span class="sourceLineNo">642</span>    connector.setHost(addr);<a name="line.642"></a>
-<span class="sourceLineNo">643</span>    connector.setPort(infoPort);<a name="line.643"></a>
-<span class="sourceLineNo">644</span>    masterJettyServer.addConnector(connector);<a name="line.644"></a>
-<span class="sourceLineNo">645</span>    masterJettyServer.setStopAtShutdown(true);<a name="line.645"></a>
-<span class="sourceLineNo">646</span><a name="line.646"></a>
-<span class="sourceLineNo">647</span>    final String redirectHostname =<a name="line.647"></a>
-<span class="sourceLineNo">648</span>        StringUtils.isBlank(useThisHostnameInstead) ? null : useThisHostnameInstead;<a name="line.648"></a>
-<span class="sourceLineNo">649</span><a name="line.649"></a>
-<span class="sourceLineNo">650</span>    final RedirectServlet redirect = new RedirectServlet(infoServer, redirectHostname);<a name="line.650"></a>
-<span class="sourceLineNo">651</span>    final WebAppContext context = new WebAppContext(null, "/", null, null, null, null, WebAppContext.NO_SESSIONS);<a name="line.651"></a>
-<span class="sourceLineNo">652</span>    context.addServlet(new ServletHolder(redirect), "/*");<a name="line.652"></a>
-<span class="sourceLineNo">653</span>    context.setServer(masterJettyServer);<a name="line.653"></a>
-<span class="sourceLineNo">654</span><a name="line.654"></a>
-<span class="sourceLineNo">655</span>    try {<a name="line.655"></a>
-<span class="sourceLineNo">656</span>      masterJettyServer.start();<a name="line.656"></a>
-<span class="sourceLineNo">657</span>    } catch (Exception e) {<a name="line.657"></a>
-<span class="sourceLineNo">658</span>      throw new IOException("Failed to start redirecting jetty server", e);<a name="line.658"></a>
-<span class="sourceLineNo">659</span>    }<a name="line.659"></a>
-<span class="sourceLineNo">660</span>    return connector.getLocalPort();<a name="line.660"></a>
-<span class="sourceLineNo">661</span>  }<a name="line.661"></a>
-<span class="sourceLineNo">662</span><a name="line.662"></a>
-<span class="sourceLineNo">663</span>  @Override<a name="line.663"></a>
-<span class="sourceLineNo">664</span>  protected Function&lt;TableDescriptorBuilder, TableDescriptorBuilder&gt; getMetaTableObserver() {<a name="line.664"></a>
-<span class="sourceLineNo">665</span>    return builder -&gt; builder.setRegionReplication(conf.getInt(HConstants.META_REPLICAS_NUM, HConstants.DEFAULT_META_REPLICA_NUM));<a name="line.665"></a>
-<span class="sourceLineNo">666</span>  }<a name="line.666"></a>
-<span class="sourceLineNo">667</span>  /**<a name="line.667"></a>
-<span class="sourceLineNo">668</span>   * For compatibility, if failed with regionserver credentials, try the master one<a name="line.668"></a>
-<span class="sourceLineNo">669</span>   */<a name="line.669"></a>
-<span class="sourceLineNo">670</span>  @Override<a name="line.670"></a>
-<span class="sourceLineNo">671</span>  protected void login(UserProvider user, String host) throws IOException {<a name="line.671"></a>
-<span class="sourceLineNo">672</span>    try {<a name="line.672"></a>
-<span class="sourceLineNo">673</span>      super.login(user, host);<a name="line.673"></a>
-<span class="sourceLineNo">674</span>    } catch (IOException ie) {<a name="line.674"></a>
-<span class="sourceLineNo">675</span>      user.login("hbase.master.keytab.file",<a name="line.675"></a>
-<span class="sourceLineNo">676</span>        "hbase.master.kerberos.principal", host);<a name="line.676"></a>
-<span class="sourceLineNo">677</span>    }<a name="line.677"></a>
-<span class="sourceLineNo">678</span>  }<a name="line.678"></a>
-<span class="sourceLineNo">679</span><a name="line.679"></a>
-<span class="sourceLineNo">680</span>  /**<a name="line.680"></a>
-<span class="sourceLineNo">681</span>   * If configured to put regions on active master,<a name="line.681"></a>
-<span class="sourceLineNo">682</span>   * wait till a backup master becomes active.<a name="line.682"></a>
-<span class="sourceLineNo">683</span>   * Otherwise, loop till the server is stopped or aborted.<a name="line.683"></a>
-<span class="sourceLineNo">684</span>   */<a name="line.684"></a>
-<span class="sourceLineNo">685</span>  @Override<a name="line.685"></a>
-<span class="sourceLineNo">686</span>  protected void waitForMasterActive(){<a name="line.686"></a>
-<span class="sourceLineNo">687</span>    boolean tablesOnMaster = LoadBalancer.isTablesOnMaster(conf);<a name="line.687"></a>
-<span class="sourceLineNo">688</span>    while (!(tablesOnMaster &amp;&amp; activeMaster) &amp;&amp; !isStopped() &amp;&amp; !isAborted()) {<a name="line.688"></a>
-<span class="sourceLineNo">689</span>      sleeper.sleep();<a name="line.689"></a>
-<span class="sourceLineNo">690</span>    }<a name="line.690"></a>
-<span class="sourceLineNo">691</span>  }<a name="line.691"></a>
-<span class="sourceLineNo">692</span><a name="line.692"></a>
-<span class="sourceLineNo">693</span>  @VisibleForTesting<a name="line.693"></a>
-<span class="sourceLineNo">694</span>  public MasterRpcServices getMasterRpcServices() {<a name="line.694"></a>
-<span class="sourceLineNo">695</span>    return (MasterRpcServices)rpcServices;<a name="line.695"></a>
-<span class="sourceLineNo">696</span>  }<a name="line.696"></a>
-<span class="sourceLineNo">697</span><a name="line.697"></a>
-<span class="sourceLineNo">698</span>  public boolean balanceSwitch(final boolean b) throws IOException {<a name="line.698"></a>
-<span class="sourceLineNo">699</span>    return getMasterRpcServices().switchBalancer(b, BalanceSwitchMode.ASYNC);<a name="line.699"></a>
-<span class="sourceLineNo">700</span>  }<a name="line.700"></a>
-<span class="sourceLineNo">701</span><a name="line.701"></a>
-<span class="sourceLineNo">702</span>  @Override<a name="line.702"></a>
-<span class="sourceLineNo">703</span>  protected String getProcessName() {<a name="line.703"></a>
-<span class="sourceLineNo">704</span>    return MASTER;<a name="line.704"></a>
+<span class="sourceLineNo">554</span>      if (shouldPublish) {<a name="line.554"></a>
+<span class="sourceLineNo">555</span>        if (publisherClass == null) {<a name="line.555"></a>
+<span class="sourceLineNo">556</span>          LOG.warn(HConstants.STATUS_PUBLISHED + " is true, but " +<a name="line.556"></a>
+<span class="sourceLineNo">557</span>              ClusterStatusPublisher.DEFAULT_STATUS_PUBLISHER_CLASS +<a name="line.557"></a>
+<span class="sourceLineNo">558</span>              " is not set - not publishing status");<a name="line.558"></a>
+<span class="sourceLineNo">559</span>        } else {<a name="line.559"></a>
+<span class="sourceLineNo">560</span>          clusterStatusPublisherChore = new ClusterStatusPublisher(this, conf, publisherClass);<a name="line.560"></a>
+<span class="sourceLineNo">561</span>          getChoreService().scheduleChore(clusterStatusPublisherChore);<a name="line.561"></a>
+<span class="sourceLineNo">562</span>        }<a name="line.562"></a>
+<span class="sourceLineNo">563</span>      }<a name="line.563"></a>
+<span class="sourceLineNo">564</span><a name="line.564"></a>
+<span class="sourceLineNo">565</span>      // Some unit tests don't need a cluster, so no zookeeper at all<a name="line.565"></a>
+<span class="sourceLineNo">566</span>      if (!conf.getBoolean("hbase.testing.nocluster", false)) {<a name="line.566"></a>
+<span class="sourceLineNo">567</span>        this.activeMasterManager = new ActiveMasterManager(zooKeeper, this.serverName, this);<a name="line.567"></a>
+<span class="sourceLineNo">568</span>      } else {<a name="line.568"></a>
+<span class="sourceLineNo">569</span>        this.activeMasterManager = null;<a name="line.569"></a>
+<span class="sourceLineNo">570</span>      }<a name="line.570"></a>
+<span class="sourceLineNo">571</span

<TRUNCATED>

[23/46] hbase-site git commit: Published site at 05d22ed960204183fbd9bd16f1dbca6410ccde76.

Posted by gi...@apache.org.
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/3649682c/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 c307d41..d82bfd8 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
@@ -1020,8 +1020,8 @@
 <span class="sourceLineNo">1012</span>  protected ClusterMetrics clusterStatus = null;<a name="line.1012"></a>
 <span class="sourceLineNo">1013</span>  protected ServerName masterServerName;<a name="line.1013"></a>
 <span class="sourceLineNo">1014</span>  protected MasterServices services;<a name="line.1014"></a>
-<span class="sourceLineNo">1015</span>  protected boolean tablesOnMaster;<a name="line.1015"></a>
-<span class="sourceLineNo">1016</span>  protected boolean onlySystemTablesOnMaster;<a name="line.1016"></a>
+<span class="sourceLineNo">1015</span>  protected boolean onlySystemTablesOnMaster;<a name="line.1015"></a>
+<span class="sourceLineNo">1016</span>  protected boolean maintenanceMode;<a name="line.1016"></a>
 <span class="sourceLineNo">1017</span><a name="line.1017"></a>
 <span class="sourceLineNo">1018</span>  @Override<a name="line.1018"></a>
 <span class="sourceLineNo">1019</span>  public void setConf(Configuration conf) {<a name="line.1019"></a>
@@ -1033,627 +1033,626 @@
 <span class="sourceLineNo">1025</span>    if (overallSlop &lt; 0) overallSlop = 0;<a name="line.1025"></a>
 <span class="sourceLineNo">1026</span>    else if (overallSlop &gt; 1) overallSlop = 1;<a name="line.1026"></a>
 <span class="sourceLineNo">1027</span><a name="line.1027"></a>
-<span class="sourceLineNo">1028</span>    this.tablesOnMaster = LoadBalancer.isTablesOnMaster(this.config);<a name="line.1028"></a>
-<span class="sourceLineNo">1029</span>    this.onlySystemTablesOnMaster = LoadBalancer.isSystemTablesOnlyOnMaster(this.config);<a name="line.1029"></a>
-<span class="sourceLineNo">1030</span>    // If system tables on master, implies tablesOnMaster = true.<a name="line.1030"></a>
-<span class="sourceLineNo">1031</span>    if (this.onlySystemTablesOnMaster &amp;&amp; !this.tablesOnMaster) {<a name="line.1031"></a>
-<span class="sourceLineNo">1032</span>      LOG.warn("Set " + TABLES_ON_MASTER + "=true because " + SYSTEM_TABLES_ON_MASTER + "=true");<a name="line.1032"></a>
-<span class="sourceLineNo">1033</span>      this.tablesOnMaster = true;<a name="line.1033"></a>
-<span class="sourceLineNo">1034</span>    }<a name="line.1034"></a>
-<span class="sourceLineNo">1035</span>    this.rackManager = new RackManager(getConf());<a name="line.1035"></a>
-<span class="sourceLineNo">1036</span>    if (useRegionFinder) {<a name="line.1036"></a>
-<span class="sourceLineNo">1037</span>      regionFinder.setConf(conf);<a name="line.1037"></a>
-<span class="sourceLineNo">1038</span>    }<a name="line.1038"></a>
-<span class="sourceLineNo">1039</span>    // Print out base configs. Don't print overallSlop since it for simple balancer exclusively.<a name="line.1039"></a>
-<span class="sourceLineNo">1040</span>    LOG.info("slop=" + this.slop + ", tablesOnMaster=" + this.tablesOnMaster +<a name="line.1040"></a>
-<span class="sourceLineNo">1041</span>      ", systemTablesOnMaster=" + this.onlySystemTablesOnMaster);<a name="line.1041"></a>
+<span class="sourceLineNo">1028</span>    this.onlySystemTablesOnMaster = LoadBalancer.isSystemTablesOnlyOnMaster(this.config);<a name="line.1028"></a>
+<span class="sourceLineNo">1029</span><a name="line.1029"></a>
+<span class="sourceLineNo">1030</span>    this.rackManager = new RackManager(getConf());<a name="line.1030"></a>
+<span class="sourceLineNo">1031</span>    if (useRegionFinder) {<a name="line.1031"></a>
+<span class="sourceLineNo">1032</span>      regionFinder.setConf(conf);<a name="line.1032"></a>
+<span class="sourceLineNo">1033</span>    }<a name="line.1033"></a>
+<span class="sourceLineNo">1034</span>    // Print out base configs. Don't print overallSlop since it for simple balancer exclusively.<a name="line.1034"></a>
+<span class="sourceLineNo">1035</span>    LOG.info("slop={}, systemTablesOnMaster={}",<a name="line.1035"></a>
+<span class="sourceLineNo">1036</span>        this.slop, this.onlySystemTablesOnMaster);<a name="line.1036"></a>
+<span class="sourceLineNo">1037</span>  }<a name="line.1037"></a>
+<span class="sourceLineNo">1038</span><a name="line.1038"></a>
+<span class="sourceLineNo">1039</span>  protected void setSlop(Configuration conf) {<a name="line.1039"></a>
+<span class="sourceLineNo">1040</span>    this.slop = conf.getFloat("hbase.regions.slop", (float) 0.2);<a name="line.1040"></a>
+<span class="sourceLineNo">1041</span>    this.overallSlop = conf.getFloat("hbase.regions.overallSlop", slop);<a name="line.1041"></a>
 <span class="sourceLineNo">1042</span>  }<a name="line.1042"></a>
 <span class="sourceLineNo">1043</span><a name="line.1043"></a>
-<span class="sourceLineNo">1044</span>  protected void setSlop(Configuration conf) {<a name="line.1044"></a>
-<span class="sourceLineNo">1045</span>    this.slop = conf.getFloat("hbase.regions.slop", (float) 0.2);<a name="line.1045"></a>
-<span class="sourceLineNo">1046</span>    this.overallSlop = conf.getFloat("hbase.regions.overallSlop", slop);<a name="line.1046"></a>
-<span class="sourceLineNo">1047</span>  }<a name="line.1047"></a>
-<span class="sourceLineNo">1048</span><a name="line.1048"></a>
-<span class="sourceLineNo">1049</span>  /**<a name="line.1049"></a>
-<span class="sourceLineNo">1050</span>   * Check if a region belongs to some system table.<a name="line.1050"></a>
-<span class="sourceLineNo">1051</span>   * If so, the primary replica may be expected to be put on the master regionserver.<a name="line.1051"></a>
-<span class="sourceLineNo">1052</span>   */<a name="line.1052"></a>
-<span class="sourceLineNo">1053</span>  public boolean shouldBeOnMaster(RegionInfo region) {<a name="line.1053"></a>
-<span class="sourceLineNo">1054</span>    return this.onlySystemTablesOnMaster &amp;&amp; region.getTable().isSystemTable();<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>   * Balance the regions that should be on master regionserver.<a name="line.1058"></a>
-<span class="sourceLineNo">1059</span>   */<a name="line.1059"></a>
-<span class="sourceLineNo">1060</span>  protected List&lt;RegionPlan&gt; balanceMasterRegions(Map&lt;ServerName, List&lt;RegionInfo&gt;&gt; clusterMap) {<a name="line.1060"></a>
-<span class="sourceLineNo">1061</span>    if (masterServerName == null || clusterMap == null || clusterMap.size() &lt;= 1) return null;<a name="line.1061"></a>
-<span class="sourceLineNo">1062</span>    List&lt;RegionPlan&gt; plans = null;<a name="line.1062"></a>
-<span class="sourceLineNo">1063</span>    List&lt;RegionInfo&gt; regions = clusterMap.get(masterServerName);<a name="line.1063"></a>
-<span class="sourceLineNo">1064</span>    if (regions != null) {<a name="line.1064"></a>
-<span class="sourceLineNo">1065</span>      Iterator&lt;ServerName&gt; keyIt = null;<a name="line.1065"></a>
-<span class="sourceLineNo">1066</span>      for (RegionInfo region: regions) {<a name="line.1066"></a>
-<span class="sourceLineNo">1067</span>        if (shouldBeOnMaster(region)) continue;<a name="line.1067"></a>
-<span class="sourceLineNo">1068</span><a name="line.1068"></a>
-<span class="sourceLineNo">1069</span>        // Find a non-master regionserver to host the region<a name="line.1069"></a>
-<span class="sourceLineNo">1070</span>        if (keyIt == null || !keyIt.hasNext()) {<a name="line.1070"></a>
-<span class="sourceLineNo">1071</span>          keyIt = clusterMap.keySet().iterator();<a name="line.1071"></a>
-<span class="sourceLineNo">1072</span>        }<a name="line.1072"></a>
-<span class="sourceLineNo">1073</span>        ServerName dest = keyIt.next();<a name="line.1073"></a>
-<span class="sourceLineNo">1074</span>        if (masterServerName.equals(dest)) {<a name="line.1074"></a>
-<span class="sourceLineNo">1075</span>          if (!keyIt.hasNext()) {<a name="line.1075"></a>
-<span class="sourceLineNo">1076</span>            keyIt = clusterMap.keySet().iterator();<a name="line.1076"></a>
-<span class="sourceLineNo">1077</span>          }<a name="line.1077"></a>
-<span class="sourceLineNo">1078</span>          dest = keyIt.next();<a name="line.1078"></a>
-<span class="sourceLineNo">1079</span>        }<a name="line.1079"></a>
-<span class="sourceLineNo">1080</span><a name="line.1080"></a>
-<span class="sourceLineNo">1081</span>        // Move this region away from the master regionserver<a name="line.1081"></a>
-<span class="sourceLineNo">1082</span>        RegionPlan plan = new RegionPlan(region, masterServerName, dest);<a name="line.1082"></a>
-<span class="sourceLineNo">1083</span>        if (plans == null) {<a name="line.1083"></a>
-<span class="sourceLineNo">1084</span>          plans = new ArrayList&lt;&gt;();<a name="line.1084"></a>
-<span class="sourceLineNo">1085</span>        }<a name="line.1085"></a>
-<span class="sourceLineNo">1086</span>        plans.add(plan);<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>    for (Map.Entry&lt;ServerName, List&lt;RegionInfo&gt;&gt; server: clusterMap.entrySet()) {<a name="line.1089"></a>
-<span class="sourceLineNo">1090</span>      if (masterServerName.equals(server.getKey())) continue;<a name="line.1090"></a>
-<span class="sourceLineNo">1091</span>      for (RegionInfo region: server.getValue()) {<a name="line.1091"></a>
-<span class="sourceLineNo">1092</span>        if (!shouldBeOnMaster(region)) continue;<a name="line.1092"></a>
-<span class="sourceLineNo">1093</span><a name="line.1093"></a>
-<span class="sourceLineNo">1094</span>        // Move this region to the master regionserver<a name="line.1094"></a>
-<span class="sourceLineNo">1095</span>        RegionPlan plan = new RegionPlan(region, server.getKey(), masterServerName);<a name="line.1095"></a>
-<span class="sourceLineNo">1096</span>        if (plans == null) {<a name="line.1096"></a>
-<span class="sourceLineNo">1097</span>          plans = new ArrayList&lt;&gt;();<a name="line.1097"></a>
-<span class="sourceLineNo">1098</span>        }<a name="line.1098"></a>
-<span class="sourceLineNo">1099</span>        plans.add(plan);<a name="line.1099"></a>
-<span class="sourceLineNo">1100</span>      }<a name="line.1100"></a>
-<span class="sourceLineNo">1101</span>    }<a name="line.1101"></a>
-<span class="sourceLineNo">1102</span>    return plans;<a name="line.1102"></a>
-<span class="sourceLineNo">1103</span>  }<a name="line.1103"></a>
-<span class="sourceLineNo">1104</span><a name="line.1104"></a>
-<span class="sourceLineNo">1105</span>  /**<a name="line.1105"></a>
-<span class="sourceLineNo">1106</span>   * If master is configured to carry system tables only, in here is<a name="line.1106"></a>
-<span class="sourceLineNo">1107</span>   * where we figure what to assign it.<a name="line.1107"></a>
-<span class="sourceLineNo">1108</span>   */<a name="line.1108"></a>
-<span class="sourceLineNo">1109</span>  protected Map&lt;ServerName, List&lt;RegionInfo&gt;&gt; assignMasterSystemRegions(<a name="line.1109"></a>
-<span class="sourceLineNo">1110</span>      Collection&lt;RegionInfo&gt; regions, List&lt;ServerName&gt; servers) {<a name="line.1110"></a>
-<span class="sourceLineNo">1111</span>    if (servers == null || regions == null || regions.isEmpty()) {<a name="line.1111"></a>
-<span class="sourceLineNo">1112</span>      return null;<a name="line.1112"></a>
-<span class="sourceLineNo">1113</span>    }<a name="line.1113"></a>
-<span class="sourceLineNo">1114</span>    Map&lt;ServerName, List&lt;RegionInfo&gt;&gt; assignments = new TreeMap&lt;&gt;();<a name="line.1114"></a>
-<span class="sourceLineNo">1115</span>    if (this.onlySystemTablesOnMaster) {<a name="line.1115"></a>
-<span class="sourceLineNo">1116</span>      if (masterServerName != null &amp;&amp; servers.contains(masterServerName)) {<a name="line.1116"></a>
-<span class="sourceLineNo">1117</span>        assignments.put(masterServerName, new ArrayList&lt;&gt;());<a name="line.1117"></a>
-<span class="sourceLineNo">1118</span>        for (RegionInfo region : regions) {<a name="line.1118"></a>
-<span class="sourceLineNo">1119</span>          if (shouldBeOnMaster(region)) {<a name="line.1119"></a>
-<span class="sourceLineNo">1120</span>            assignments.get(masterServerName).add(region);<a name="line.1120"></a>
-<span class="sourceLineNo">1121</span>          }<a name="line.1121"></a>
-<span class="sourceLineNo">1122</span>        }<a name="line.1122"></a>
-<span class="sourceLineNo">1123</span>      }<a name="line.1123"></a>
-<span class="sourceLineNo">1124</span>    }<a name="line.1124"></a>
-<span class="sourceLineNo">1125</span>    return assignments;<a name="line.1125"></a>
-<span class="sourceLineNo">1126</span>  }<a name="line.1126"></a>
-<span class="sourceLineNo">1127</span><a name="line.1127"></a>
-<span class="sourceLineNo">1128</span>  @Override<a name="line.1128"></a>
-<span class="sourceLineNo">1129</span>  public Configuration getConf() {<a name="line.1129"></a>
-<span class="sourceLineNo">1130</span>    return this.config;<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 synchronized void setClusterMetrics(ClusterMetrics st) {<a name="line.1134"></a>
-<span class="sourceLineNo">1135</span>    this.clusterStatus = st;<a name="line.1135"></a>
-<span class="sourceLineNo">1136</span>    if (useRegionFinder) {<a name="line.1136"></a>
-<span class="sourceLineNo">1137</span>      regionFinder.setClusterMetrics(st);<a name="line.1137"></a>
-<span class="sourceLineNo">1138</span>    }<a name="line.1138"></a>
-<span class="sourceLineNo">1139</span>  }<a name="line.1139"></a>
-<span class="sourceLineNo">1140</span><a name="line.1140"></a>
-<span class="sourceLineNo">1141</span>  @Override<a name="line.1141"></a>
-<span class="sourceLineNo">1142</span>  public void setClusterLoad(Map&lt;TableName, Map&lt;ServerName, List&lt;RegionInfo&gt;&gt;&gt; clusterLoad){<a name="line.1142"></a>
-<span class="sourceLineNo">1143</span><a name="line.1143"></a>
-<span class="sourceLineNo">1144</span>  }<a name="line.1144"></a>
-<span class="sourceLineNo">1145</span><a name="line.1145"></a>
-<span class="sourceLineNo">1146</span>  @Override<a name="line.1146"></a>
-<span class="sourceLineNo">1147</span>  public void setMasterServices(MasterServices masterServices) {<a name="line.1147"></a>
-<span class="sourceLineNo">1148</span>    masterServerName = masterServices.getServerName();<a name="line.1148"></a>
-<span class="sourceLineNo">1149</span>    this.services = masterServices;<a name="line.1149"></a>
-<span class="sourceLineNo">1150</span>    if (useRegionFinder) {<a name="line.1150"></a>
-<span class="sourceLineNo">1151</span>      this.regionFinder.setServices(masterServices);<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><a name="line.1154"></a>
-<span class="sourceLineNo">1155</span>  @Override<a name="line.1155"></a>
-<span class="sourceLineNo">1156</span>  public void postMasterStartupInitialize() {<a name="line.1156"></a>
-<span class="sourceLineNo">1157</span>    if (services != null &amp;&amp; regionFinder != null) {<a name="line.1157"></a>
-<span class="sourceLineNo">1158</span>      try {<a name="line.1158"></a>
-<span class="sourceLineNo">1159</span>        Set&lt;RegionInfo&gt; regions =<a name="line.1159"></a>
-<span class="sourceLineNo">1160</span>            services.getAssignmentManager().getRegionStates().getRegionAssignments().keySet();<a name="line.1160"></a>
-<span class="sourceLineNo">1161</span>        regionFinder.refreshAndWait(regions);<a name="line.1161"></a>
-<span class="sourceLineNo">1162</span>      } catch (Exception e) {<a name="line.1162"></a>
-<span class="sourceLineNo">1163</span>        LOG.warn("Refreshing region HDFS Block dist failed with exception, ignoring", e);<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><a name="line.1167"></a>
-<span class="sourceLineNo">1168</span>  public void setRackManager(RackManager rackManager) {<a name="line.1168"></a>
-<span class="sourceLineNo">1169</span>    this.rackManager = rackManager;<a name="line.1169"></a>
-<span class="sourceLineNo">1170</span>  }<a name="line.1170"></a>
-<span class="sourceLineNo">1171</span><a name="line.1171"></a>
-<span class="sourceLineNo">1172</span>  protected boolean needsBalance(Cluster c) {<a name="line.1172"></a>
-<span class="sourceLineNo">1173</span>    ClusterLoadState cs = new ClusterLoadState(c.clusterState);<a name="line.1173"></a>
-<span class="sourceLineNo">1174</span>    if (cs.getNumServers() &lt; MIN_SERVER_BALANCE) {<a name="line.1174"></a>
-<span class="sourceLineNo">1175</span>      if (LOG.isDebugEnabled()) {<a name="line.1175"></a>
-<span class="sourceLineNo">1176</span>        LOG.debug("Not running balancer because only " + cs.getNumServers()<a name="line.1176"></a>
-<span class="sourceLineNo">1177</span>            + " active regionserver(s)");<a name="line.1177"></a>
-<span class="sourceLineNo">1178</span>      }<a name="line.1178"></a>
-<span class="sourceLineNo">1179</span>      return false;<a name="line.1179"></a>
-<span class="sourceLineNo">1180</span>    }<a name="line.1180"></a>
-<span class="sourceLineNo">1181</span>    if(areSomeRegionReplicasColocated(c)) return true;<a name="line.1181"></a>
-<span class="sourceLineNo">1182</span>    // Check if we even need to do any load balancing<a name="line.1182"></a>
-<span class="sourceLineNo">1183</span>    // HBASE-3681 check sloppiness first<a name="line.1183"></a>
-<span class="sourceLineNo">1184</span>    float average = cs.getLoadAverage(); // for logging<a name="line.1184"></a>
-<span class="sourceLineNo">1185</span>    int floor = (int) Math.floor(average * (1 - slop));<a name="line.1185"></a>
-<span class="sourceLineNo">1186</span>    int ceiling = (int) Math.ceil(average * (1 + slop));<a name="line.1186"></a>
-<span class="sourceLineNo">1187</span>    if (!(cs.getMaxLoad() &gt; ceiling || cs.getMinLoad() &lt; floor)) {<a name="line.1187"></a>
-<span class="sourceLineNo">1188</span>      NavigableMap&lt;ServerAndLoad, List&lt;RegionInfo&gt;&gt; serversByLoad = cs.getServersByLoad();<a name="line.1188"></a>
-<span class="sourceLineNo">1189</span>      if (LOG.isTraceEnabled()) {<a name="line.1189"></a>
-<span class="sourceLineNo">1190</span>        // If nothing to balance, then don't say anything unless trace-level logging.<a name="line.1190"></a>
-<span class="sourceLineNo">1191</span>        LOG.trace("Skipping load balancing because balanced cluster; " +<a name="line.1191"></a>
-<span class="sourceLineNo">1192</span>          "servers=" + cs.getNumServers() +<a name="line.1192"></a>
-<span class="sourceLineNo">1193</span>          " regions=" + cs.getNumRegions() + " average=" + average +<a name="line.1193"></a>
-<span class="sourceLineNo">1194</span>          " mostloaded=" + serversByLoad.lastKey().getLoad() +<a name="line.1194"></a>
-<span class="sourceLineNo">1195</span>          " leastloaded=" + serversByLoad.firstKey().getLoad());<a name="line.1195"></a>
-<span class="sourceLineNo">1196</span>      }<a name="line.1196"></a>
-<span class="sourceLineNo">1197</span>      return false;<a name="line.1197"></a>
-<span class="sourceLineNo">1198</span>    }<a name="line.1198"></a>
-<span class="sourceLineNo">1199</span>    return true;<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>   * Subclasses should implement this to return true if the cluster has nodes that hosts<a name="line.1203"></a>
-<span class="sourceLineNo">1204</span>   * multiple replicas for the same region, or, if there are multiple racks and the same<a name="line.1204"></a>
-<span class="sourceLineNo">1205</span>   * rack hosts replicas of the same region<a name="line.1205"></a>
-<span class="sourceLineNo">1206</span>   * @param c Cluster information<a name="line.1206"></a>
-<span class="sourceLineNo">1207</span>   * @return whether region replicas are currently co-located<a name="line.1207"></a>
-<span class="sourceLineNo">1208</span>   */<a name="line.1208"></a>
-<span class="sourceLineNo">1209</span>  protected boolean areSomeRegionReplicasColocated(Cluster c) {<a name="line.1209"></a>
-<span class="sourceLineNo">1210</span>    return false;<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>   * Generates a bulk assignment plan to be used on cluster startup using a<a name="line.1214"></a>
-<span class="sourceLineNo">1215</span>   * simple round-robin assignment.<a name="line.1215"></a>
-<span class="sourceLineNo">1216</span>   * &lt;p&gt;<a name="line.1216"></a>
-<span class="sourceLineNo">1217</span>   * Takes a list of all the regions and all the servers in the cluster and<a name="line.1217"></a>
-<span class="sourceLineNo">1218</span>   * returns a map of each server to the regions that it should be assigned.<a name="line.1218"></a>
-<span class="sourceLineNo">1219</span>   * &lt;p&gt;<a name="line.1219"></a>
-<span class="sourceLineNo">1220</span>   * Currently implemented as a round-robin assignment. Same invariant as load<a name="line.1220"></a>
-<span class="sourceLineNo">1221</span>   * balancing, all servers holding floor(avg) or ceiling(avg).<a name="line.1221"></a>
-<span class="sourceLineNo">1222</span>   *<a name="line.1222"></a>
-<span class="sourceLineNo">1223</span>   * TODO: Use block locations from HDFS to place regions with their blocks<a name="line.1223"></a>
-<span class="sourceLineNo">1224</span>   *<a name="line.1224"></a>
-<span class="sourceLineNo">1225</span>   * @param regions all regions<a name="line.1225"></a>
-<span class="sourceLineNo">1226</span>   * @param servers all servers<a name="line.1226"></a>
-<span class="sourceLineNo">1227</span>   * @return map of server to the regions it should take, or null if no<a name="line.1227"></a>
-<span class="sourceLineNo">1228</span>   *         assignment is possible (ie. no regions or no servers)<a name="line.1228"></a>
-<span class="sourceLineNo">1229</span>   */<a name="line.1229"></a>
-<span class="sourceLineNo">1230</span>  @Override<a name="line.1230"></a>
-<span class="sourceLineNo">1231</span>  public Map&lt;ServerName, List&lt;RegionInfo&gt;&gt; roundRobinAssignment(List&lt;RegionInfo&gt; regions,<a name="line.1231"></a>
-<span class="sourceLineNo">1232</span>      List&lt;ServerName&gt; servers) throws HBaseIOException {<a name="line.1232"></a>
-<span class="sourceLineNo">1233</span>    metricsBalancer.incrMiscInvocations();<a name="line.1233"></a>
-<span class="sourceLineNo">1234</span>    Map&lt;ServerName, List&lt;RegionInfo&gt;&gt; assignments = assignMasterSystemRegions(regions, servers);<a name="line.1234"></a>
-<span class="sourceLineNo">1235</span>    if (assignments != null &amp;&amp; !assignments.isEmpty()) {<a name="line.1235"></a>
-<span class="sourceLineNo">1236</span>      servers = new ArrayList&lt;&gt;(servers);<a name="line.1236"></a>
-<span class="sourceLineNo">1237</span>      // Guarantee not to put other regions on master<a name="line.1237"></a>
-<span class="sourceLineNo">1238</span>      servers.remove(masterServerName);<a name="line.1238"></a>
-<span class="sourceLineNo">1239</span>      List&lt;RegionInfo&gt; masterRegions = assignments.get(masterServerName);<a name="line.1239"></a>
-<span class="sourceLineNo">1240</span>      if (!masterRegions.isEmpty()) {<a name="line.1240"></a>
-<span class="sourceLineNo">1241</span>        regions = new ArrayList&lt;&gt;(regions);<a name="line.1241"></a>
-<span class="sourceLineNo">1242</span>        regions.removeAll(masterRegions);<a name="line.1242"></a>
-<span class="sourceLineNo">1243</span>      }<a name="line.1243"></a>
-<span class="sourceLineNo">1244</span>    }<a name="line.1244"></a>
-<span class="sourceLineNo">1245</span>    if (regions == null || regions.isEmpty()) {<a name="line.1245"></a>
-<span class="sourceLineNo">1246</span>      return assignments;<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>    int numServers = servers == null ? 0 : servers.size();<a name="line.1249"></a>
-<span class="sourceLineNo">1250</span>    if (numServers == 0) {<a name="line.1250"></a>
-<span class="sourceLineNo">1251</span>      LOG.warn("Wanted to do round robin assignment but no servers to assign to");<a name="line.1251"></a>
-<span class="sourceLineNo">1252</span>      return null;<a name="line.1252"></a>
-<span class="sourceLineNo">1253</span>    }<a name="line.1253"></a>
-<span class="sourceLineNo">1254</span><a name="line.1254"></a>
-<span class="sourceLineNo">1255</span>    // TODO: instead of retainAssignment() and roundRobinAssignment(), we should just run the<a name="line.1255"></a>
-<span class="sourceLineNo">1256</span>    // normal LB.balancerCluster() with unassignedRegions. We only need to have a candidate<a name="line.1256"></a>
-<span class="sourceLineNo">1257</span>    // generator for AssignRegionAction. The LB will ensure the regions are mostly local<a name="line.1257"></a>
-<span class="sourceLineNo">1258</span>    // and balanced. This should also run fast with fewer number of iterations.<a name="line.1258"></a>
-<span class="sourceLineNo">1259</span><a name="line.1259"></a>
-<span class="sourceLineNo">1260</span>    if (numServers == 1) { // Only one server, nothing fancy we can do here<a name="line.1260"></a>
-<span class="sourceLineNo">1261</span>      ServerName server = servers.get(0);<a name="line.1261"></a>
-<span class="sourceLineNo">1262</span>      assignments.put(server, new ArrayList&lt;&gt;(regions));<a name="line.1262"></a>
-<span class="sourceLineNo">1263</span>      return assignments;<a name="line.1263"></a>
-<span class="sourceLineNo">1264</span>    }<a name="line.1264"></a>
-<span class="sourceLineNo">1265</span><a name="line.1265"></a>
-<span class="sourceLineNo">1266</span>    Cluster cluster = createCluster(servers, regions, false);<a name="line.1266"></a>
-<span class="sourceLineNo">1267</span>    List&lt;RegionInfo&gt; unassignedRegions = new ArrayList&lt;&gt;();<a name="line.1267"></a>
-<span class="sourceLineNo">1268</span><a name="line.1268"></a>
-<span class="sourceLineNo">1269</span>    roundRobinAssignment(cluster, regions, unassignedRegions,<a name="line.1269"></a>
-<span class="sourceLineNo">1270</span>      servers, assignments);<a name="line.1270"></a>
-<span class="sourceLineNo">1271</span><a name="line.1271"></a>
-<span class="sourceLineNo">1272</span>    List&lt;RegionInfo&gt; lastFewRegions = new ArrayList&lt;&gt;();<a name="line.1272"></a>
-<span class="sourceLineNo">1273</span>    // assign the remaining by going through the list and try to assign to servers one-by-one<a name="line.1273"></a>
-<span class="sourceLineNo">1274</span>    int serverIdx = RANDOM.nextInt(numServers);<a name="line.1274"></a>
-<span class="sourceLineNo">1275</span>    OUTER : for (RegionInfo region : unassignedRegions) {<a name="line.1275"></a>
-<span class="sourceLineNo">1276</span>      boolean assigned = false;<a name="line.1276"></a>
-<span class="sourceLineNo">1277</span>      INNER : for (int j = 0; j &lt; numServers; j++) { // try all servers one by one<a name="line.1277"></a>
-<span class="sourceLineNo">1278</span>        ServerName serverName = servers.get((j + serverIdx) % numServers);<a name="line.1278"></a>
-<span class="sourceLineNo">1279</span>        if (!cluster.wouldLowerAvailability(region, serverName)) {<a name="line.1279"></a>
-<span class="sourceLineNo">1280</span>          List&lt;RegionInfo&gt; serverRegions =<a name="line.1280"></a>
-<span class="sourceLineNo">1281</span>              assignments.computeIfAbsent(serverName, k -&gt; new ArrayList&lt;&gt;());<a name="line.1281"></a>
-<span class="sourceLineNo">1282</span>          if (!RegionReplicaUtil.isDefaultReplica(region.getReplicaId())) {<a name="line.1282"></a>
-<span class="sourceLineNo">1283</span>            // if the region is not a default replica<a name="line.1283"></a>
-<span class="sourceLineNo">1284</span>            // check if the assignments map has the other replica region on this server<a name="line.1284"></a>
-<span class="sourceLineNo">1285</span>            for (RegionInfo hri : serverRegions) {<a name="line.1285"></a>
-<span class="sourceLineNo">1286</span>              if (RegionReplicaUtil.isReplicasForSameRegion(region, hri)) {<a name="line.1286"></a>
-<span class="sourceLineNo">1287</span>                if (LOG.isTraceEnabled()) {<a name="line.1287"></a>
-<span class="sourceLineNo">1288</span>                  LOG.trace("Skipping the server, " + serverName<a name="line.1288"></a>
-<span class="sourceLineNo">1289</span>                      + " , got the same server for the region " + region);<a name="line.1289"></a>
-<span class="sourceLineNo">1290</span>                }<a name="line.1290"></a>
-<span class="sourceLineNo">1291</span>                // do not allow this case. The unassignedRegions we got because the<a name="line.1291"></a>
-<span class="sourceLineNo">1292</span>                // replica region in this list was not assigned because of lower availablity issue.<a name="line.1292"></a>
-<span class="sourceLineNo">1293</span>                // So when we assign here we should ensure that as far as possible the server being<a name="line.1293"></a>
-<span class="sourceLineNo">1294</span>                // selected does not have the server where the replica region was not assigned.<a name="line.1294"></a>
-<span class="sourceLineNo">1295</span>                continue INNER; // continue the inner loop, ie go to the next server<a name="line.1295"></a>
-<span class="sourceLineNo">1296</span>              }<a name="line.1296"></a>
-<span class="sourceLineNo">1297</span>            }<a name="line.1297"></a>
-<span class="sourceLineNo">1298</span>          }<a name="line.1298"></a>
-<span class="sourceLineNo">1299</span>          serverRegions.add(region);<a name="line.1299"></a>
-<span class="sourceLineNo">1300</span>          cluster.doAssignRegion(region, serverName);<a name="line.1300"></a>
-<span class="sourceLineNo">1301</span>          serverIdx = (j + serverIdx + 1) % numServers; //remain from next server<a name="line.1301"></a>
-<span class="sourceLineNo">1302</span>          assigned = true;<a name="line.1302"></a>
-<span class="sourceLineNo">1303</span>          break;<a name="line.1303"></a>
-<span class="sourceLineNo">1304</span>        }<a name="line.1304"></a>
-<span class="sourceLineNo">1305</span>      }<a name="line.1305"></a>
-<span class="sourceLineNo">1306</span>      if (!assigned) {<a name="line.1306"></a>
-<span class="sourceLineNo">1307</span>        lastFewRegions.add(region);<a name="line.1307"></a>
-<span class="sourceLineNo">1308</span>      }<a name="line.1308"></a>
-<span class="sourceLineNo">1309</span>    }<a name="line.1309"></a>
-<span class="sourceLineNo">1310</span>    // just sprinkle the rest of the regions on random regionservers. The balanceCluster will<a name="line.1310"></a>
-<span class="sourceLineNo">1311</span>    // make it optimal later. we can end up with this if numReplicas &gt; numServers.<a name="line.1311"></a>
-<span class="sourceLineNo">1312</span>    for (RegionInfo region : lastFewRegions) {<a name="line.1312"></a>
-<span class="sourceLineNo">1313</span>      int i = RANDOM.nextInt(numServers);<a name="line.1313"></a>
-<span class="sourceLineNo">1314</span>      ServerName server = servers.get(i);<a name="line.1314"></a>
-<span class="sourceLineNo">1315</span>      List&lt;RegionInfo&gt; serverRegions = assignments.computeIfAbsent(server, k -&gt; new ArrayList&lt;&gt;());<a name="line.1315"></a>
-<span class="sourceLineNo">1316</span>      serverRegions.add(region);<a name="line.1316"></a>
-<span class="sourceLineNo">1317</span>      cluster.doAssignRegion(region, server);<a name="line.1317"></a>
-<span class="sourceLineNo">1318</span>    }<a name="line.1318"></a>
-<span class="sourceLineNo">1319</span>    return assignments;<a name="line.1319"></a>
-<span class="sourceLineNo">1320</span>  }<a name="line.1320"></a>
-<span class="sourceLineNo">1321</span><a name="line.1321"></a>
-<span class="sourceLineNo">1322</span>  protected Cluster createCluster(List&lt;ServerName&gt; servers, Collection&lt;RegionInfo&gt; regions,<a name="line.1322"></a>
-<span class="sourceLineNo">1323</span>      boolean hasRegionReplica) {<a name="line.1323"></a>
-<span class="sourceLineNo">1324</span>    // Get the snapshot of the current assignments for the regions in question, and then create<a name="line.1324"></a>
-<span class="sourceLineNo">1325</span>    // a cluster out of it. Note that we might have replicas already assigned to some servers<a name="line.1325"></a>
-<span class="sourceLineNo">1326</span>    // earlier. So we want to get the snapshot to see those assignments, but this will only contain<a name="line.1326"></a>
-<span class="sourceLineNo">1327</span>    // replicas of the regions that are passed (for performance).<a name="line.1327"></a>
-<span class="sourceLineNo">1328</span>    Map&lt;ServerName, List&lt;RegionInfo&gt;&gt; clusterState = null;<a name="line.1328"></a>
-<span class="sourceLineNo">1329</span>    if (!hasRegionReplica) {<a name="line.1329"></a>
-<span class="sourceLineNo">1330</span>      clusterState = getRegionAssignmentsByServer(regions);<a name="line.1330"></a>
-<span class="sourceLineNo">1331</span>    } else {<a name="line.1331"></a>
-<span class="sourceLineNo">1332</span>      // for the case where we have region replica it is better we get the entire cluster's snapshot<a name="line.1332"></a>
-<span class="sourceLineNo">1333</span>      clusterState = getRegionAssignmentsByServer(null);<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>    for (ServerName server : servers) {<a name="line.1336"></a>
-<span class="sourceLineNo">1337</span>      if (!clusterState.containsKey(server)) {<a name="line.1337"></a>
-<span class="sourceLineNo">1338</span>        clusterState.put(server, EMPTY_REGION_LIST);<a name="line.1338"></a>
-<span class="sourceLineNo">1339</span>      }<a name="line.1339"></a>
-<span class="sourceLineNo">1340</span>    }<a name="line.1340"></a>
-<span class="sourceLineNo">1341</span>    return new Cluster(regions, clusterState, null, this.regionFinder,<a name="line.1341"></a>
-<span class="sourceLineNo">1342</span>        rackManager);<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>  private List&lt;ServerName&gt; findIdleServers(List&lt;ServerName&gt; servers) {<a name="line.1345"></a>
-<span class="sourceLineNo">1346</span>    return this.services.getServerManager()<a name="line.1346"></a>
-<span class="sourceLineNo">1347</span>            .getOnlineServersListWithPredicator(servers, IDLE_SERVER_PREDICATOR);<a name="line.1347"></a>
-<span class="sourceLineNo">1348</span>  }<a name="line.1348"></a>
-<span class="sourceLineNo">1349</span><a name="line.1349"></a>
-<span class="sourceLineNo">1350</span>  /**<a name="line.1350"></a>
-<span class="sourceLineNo">1351</span>   * Used to assign a single region to a random server.<a name="line.1351"></a>
-<span class="sourceLineNo">1352</span>   */<a name="line.1352"></a>
-<span class="sourceLineNo">1353</span>  @Override<a name="line.1353"></a>
-<span class="sourceLineNo">1354</span>  public ServerName randomAssignment(RegionInfo regionInfo, List&lt;ServerName&gt; servers)<a name="line.1354"></a>
-<span class="sourceLineNo">1355</span>      throws HBaseIOException {<a name="line.1355"></a>
-<span class="sourceLineNo">1356</span>    metricsBalancer.incrMiscInvocations();<a name="line.1356"></a>
-<span class="sourceLineNo">1357</span>    if (servers != null &amp;&amp; servers.contains(masterServerName)) {<a name="line.1357"></a>
-<span class="sourceLineNo">1358</span>      if (shouldBeOnMaster(regionInfo)) {<a name="line.1358"></a>
-<span class="sourceLineNo">1359</span>        return masterServerName;<a name="line.1359"></a>
-<span class="sourceLineNo">1360</span>      }<a name="line.1360"></a>
-<span class="sourceLineNo">1361</span>      if (!LoadBalancer.isTablesOnMaster(getConf())) {<a name="line.1361"></a>
-<span class="sourceLineNo">1362</span>        // Guarantee we do not put any regions on master<a name="line.1362"></a>
-<span class="sourceLineNo">1363</span>        servers = new ArrayList&lt;&gt;(servers);<a name="line.1363"></a>
-<span class="sourceLineNo">1364</span>        servers.remove(masterServerName);<a name="line.1364"></a>
-<span class="sourceLineNo">1365</span>      }<a name="line.1365"></a>
-<span class="sourceLineNo">1366</span>    }<a name="line.1366"></a>
-<span class="sourceLineNo">1367</span><a name="line.1367"></a>
-<span class="sourceLineNo">1368</span>    int numServers = servers == null ? 0 : servers.size();<a name="line.1368"></a>
-<span class="sourceLineNo">1369</span>    if (numServers == 0) {<a name="line.1369"></a>
-<span class="sourceLineNo">1370</span>      LOG.warn("Wanted to retain assignment but no servers to assign to");<a name="line.1370"></a>
-<span class="sourceLineNo">1371</span>      return null;<a name="line.1371"></a>
-<span class="sourceLineNo">1372</span>    }<a name="line.1372"></a>
-<span class="sourceLineNo">1373</span>    if (numServers == 1) { // Only one server, nothing fancy we can do here<a name="line.1373"></a>
-<span class="sourceLineNo">1374</span>      return servers.get(0);<a name="line.1374"></a>
-<span class="sourceLineNo">1375</span>    }<a name="line.1375"></a>
-<span class="sourceLineNo">1376</span>    List&lt;ServerName&gt; idleServers = findIdleServers(servers);<a name="line.1376"></a>
-<span class="sourceLineNo">1377</span>    if (idleServers.size() == 1) {<a name="line.1377"></a>
-<span class="sourceLineNo">1378</span>      return idleServers.get(0);<a name="line.1378"></a>
-<span class="sourceLineNo">1379</span>    }<a name="line.1379"></a>
-<span class="sourceLineNo">1380</span>    final List&lt;ServerName&gt; finalServers = idleServers.isEmpty() ?<a name="line.1380"></a>
-<span class="sourceLineNo">1381</span>            servers : idleServers;<a name="line.1381"></a>
-<span class="sourceLineNo">1382</span>    List&lt;RegionInfo&gt; regions = Lists.newArrayList(regionInfo);<a name="line.1382"></a>
-<span class="sourceLineNo">1383</span>    Cluster cluster = createCluster(finalServers, regions, false);<a name="line.1383"></a>
-<span class="sourceLineNo">1384</span>    return randomAssignment(cluster, regionInfo, finalServers);<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>  /**<a name="line.1387"></a>
-<span class="sourceLineNo">1388</span>   * Generates a bulk assignment startup plan, attempting to reuse the existing<a name="line.1388"></a>
-<span class="sourceLineNo">1389</span>   * assignment information from META, but adjusting for the specified list of<a name="line.1389"></a>
-<span class="sourceLineNo">1390</span>   * available/online servers available for assignment.<a name="line.1390"></a>
-<span class="sourceLineNo">1391</span>   * &lt;p&gt;<a name="line.1391"></a>
-<span class="sourceLineNo">1392</span>   * Takes a map of all regions to their existing assignment from META. Also<a name="line.1392"></a>
-<span class="sourceLineNo">1393</span>   * takes a list of online servers for regions to be assigned to. Attempts to<a name="line.1393"></a>
-<span class="sourceLineNo">1394</span>   * retain all assignment, so in some instances initial assignment will not be<a name="line.1394"></a>
-<span class="sourceLineNo">1395</span>   * completely balanced.<a name="line.1395"></a>
-<span class="sourceLineNo">1396</span>   * &lt;p&gt;<a name="line.1396"></a>
-<span class="sourceLineNo">1397</span>   * Any leftover regions without an existing server to be assigned to will be<a name="line.1397"></a>
-<span class="sourceLineNo">1398</span>   * assigned randomly to available servers.<a name="line.1398"></a>
-<span class="sourceLineNo">1399</span>   *<a name="line.1399"></a>
-<span class="sourceLineNo">1400</span>   * @param regions regions and existing assignment from meta<a name="line.1400"></a>
-<span class="sourceLineNo">1401</span>   * @param servers available servers<a name="line.1401"></a>
-<span class="sourceLineNo">1402</span>   * @return map of servers and regions to be assigned to them<a name="line.1402"></a>
-<span class="sourceLineNo">1403</span>   */<a name="line.1403"></a>
-<span class="sourceLineNo">1404</span>  @Override<a name="line.1404"></a>
-<span class="sourceLineNo">1405</span>  public Map&lt;ServerName, List&lt;RegionInfo&gt;&gt; retainAssignment(Map&lt;RegionInfo, ServerName&gt; regions,<a name="line.1405"></a>
-<span class="sourceLineNo">1406</span>      List&lt;ServerName&gt; servers) throws HBaseIOException {<a name="line.1406"></a>
-<span class="sourceLineNo">1407</span>    // Update metrics<a name="line.1407"></a>
-<span class="sourceLineNo">1408</span>    metricsBalancer.incrMiscInvocations();<a name="line.1408"></a>
-<span class="sourceLineNo">1409</span>    Map&lt;ServerName, List&lt;RegionInfo&gt;&gt; assignments = assignMasterSystemRegions(regions.keySet(), servers);<a name="line.1409"></a>
-<span class="sourceLineNo">1410</span>    if (assignments != null &amp;&amp; !assignments.isEmpty()) {<a name="line.1410"></a>
-<span class="sourceLineNo">1411</span>      servers = new ArrayList&lt;&gt;(servers);<a name="line.1411"></a>
-<span class="sourceLineNo">1412</span>      // Guarantee not to put other regions on master<a name="line.1412"></a>
-<span class="sourceLineNo">1413</span>      servers.remove(masterServerName);<a name="line.1413"></a>
-<span class="sourceLineNo">1414</span>      List&lt;RegionInfo&gt; masterRegions = assignments.get(masterServerName);<a name="line.1414"></a>
-<span class="sourceLineNo">1415</span>      regions = regions.entrySet().stream().filter(e -&gt; !masterRegions.contains(e.getKey()))<a name="line.1415"></a>
-<span class="sourceLineNo">1416</span>          .collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue));<a name="line.1416"></a>
-<span class="sourceLineNo">1417</span>    }<a name="line.1417"></a>
-<span class="sourceLineNo">1418</span>    if (regions.isEmpty()) {<a name="line.1418"></a>
-<span class="sourceLineNo">1419</span>      return assignments;<a name="line.1419"></a>
-<span class="sourceLineNo">1420</span>    }<a name="line.1420"></a>
-<span class="sourceLineNo">1421</span><a name="line.1421"></a>
-<span class="sourceLineNo">1422</span>    int numServers = servers == null ? 0 : servers.size();<a name="line.1422"></a>
-<span class="sourceLineNo">1423</span>    if (numServers == 0) {<a name="line.1423"></a>
-<span class="sourceLineNo">1424</span>      LOG.warn("Wanted to do retain assignment but no servers to assign to");<a name="line.1424"></a>
-<span class="sourceLineNo">1425</span>      return null;<a name="line.1425"></a>
-<span class="sourceLineNo">1426</span>    }<a name="line.1426"></a>
-<span class="sourceLineNo">1427</span>    if (numServers == 1) { // Only one server, nothing fancy we can do here<a name="line.1427"></a>
-<span class="sourceLineNo">1428</span>      ServerName server = servers.get(0);<a name="line.1428"></a>
-<span class="sourceLineNo">1429</span>      assignments.put(server, new ArrayList&lt;&gt;(regions.keySet()));<a name="line.1429"></a>
-<span class="sourceLineNo">1430</span>      return assignments;<a name="line.1430"></a>
-<span class="sourceLineNo">1431</span>    }<a name="line.1431"></a>
-<span class="sourceLineNo">1432</span><a name="line.1432"></a>
-<span class="sourceLineNo">1433</span>    // Group all of the old assignments by their hostname.<a name="line.1433"></a>
-<span class="sourceLineNo">1434</span>    // We can't group directly by ServerName since the servers all have<a name="line.1434"></a>
-<span class="sourceLineNo">1435</span>    // new start-codes.<a name="line.1435"></a>
-<span class="sourceLineNo">1436</span><a name="line.1436"></a>
-<span class="sourceLineNo">1437</span>    // Group the servers by their hostname. It's possible we have multiple<a name="line.1437"></a>
-<span class="sourceLineNo">1438</span>    // servers on the same host on different ports.<a name="line.1438"></a>
-<span class="sourceLineNo">1439</span>    ArrayListMultimap&lt;String, ServerName&gt; serversByHostname = ArrayListMultimap.create();<a name="line.1439"></a>
-<span class="sourceLineNo">1440</span>    for (ServerName server : servers) {<a name="line.1440"></a>
-<span class="sourceLineNo">1441</span>      assignments.put(server, new ArrayList&lt;&gt;());<a name="line.1441"></a>
-<span class="sourceLineNo">1442</span>      serversByHostname.put(server.getHostnameLowerCase(), server);<a name="line.1442"></a>
-<span class="sourceLineNo">1443</span>    }<a name="line.1443"></a>
-<span class="sourceLineNo">1444</span><a name="line.1444"></a>
-<span class="sourceLineNo">1445</span>    // Collection of the hostnames that used to have regions<a name="line.1445"></a>
-<span class="sourceLineNo">1446</span>    // assigned, but for which we no longer have any RS running<a name="line.1446"></a>
-<span class="sourceLineNo">1447</span>    // after the cluster restart.<a name="line.1447"></a>
-<span class="sourceLineNo">1448</span>    Set&lt;String&gt; oldHostsNoLongerPresent = Sets.newTreeSet();<a name="line.1448"></a>
-<span class="sourceLineNo">1449</span><a name="line.1449"></a>
-<span class="sourceLineNo">1450</span>    // If the old servers aren't present, lets assign those regions later.<a name="line.1450"></a>
-<span class="sourceLineNo">1451</span>    List&lt;RegionInfo&gt; randomAssignRegions = Lists.newArrayList();<a name="line.1451"></a>
-<span class="sourceLineNo">1452</span><a name="line.1452"></a>
-<span class="sourceLineNo">1453</span>    int numRandomAssignments = 0;<a name="line.1453"></a>
-<span class="sourceLineNo">1454</span>    int numRetainedAssigments = 0;<a name="line.1454"></a>
-<span class="sourceLineNo">1455</span>    boolean hasRegionReplica = false;<a name="line.1455"></a>
-<span class="sourceLineNo">1456</span>    for (Map.Entry&lt;RegionInfo, ServerName&gt; entry : regions.entrySet()) {<a name="line.1456"></a>
-<span class="sourceLineNo">1457</span>      RegionInfo region = entry.getKey();<a name="line.1457"></a>
-<span class="sourceLineNo">1458</span>      ServerName oldServerName = entry.getValue();<a name="line.1458"></a>
-<span class="sourceLineNo">1459</span>      // In the current set of regions even if one has region replica let us go with<a name="line.1459"></a>
-<span class="sourceLineNo">1460</span>      // getting the entire snapshot<a name="line.1460"></a>
-<span class="sourceLineNo">1461</span>      if (this.services != null) { // for tests<a name="line.1461"></a>
-<span class="sourceLineNo">1462</span>        AssignmentManager am = this.services.getAssignmentManager();<a name="line.1462"></a>
-<span class="sourceLineNo">1463</span>        if (am != null) {<a name="line.1463"></a>
-<span class="sourceLineNo">1464</span>          RegionStates states = am.getRegionStates();<a name="line.1464"></a>
-<span class="sourceLineNo">1465</span>          if (!hasRegionReplica &amp;&amp; states != null &amp;&amp; states.isReplicaAvailableForRegion(region)) {<a name="line.1465"></a>
-<span class="sourceLineNo">1466</span>            hasRegionReplica = true;<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>      List&lt;ServerName&gt; localServers = new ArrayList&lt;&gt;();<a name="line.1470"></a>
-<span class="sourceLineNo">1471</span>      if (oldServerName != null) {<a name="line.1471"></a>
-<span class="sourceLineNo">1472</span>        localServers = serversByHostname.get(oldServerName.getHostnameLowerCase());<a name="line.1472"></a>
-<span class="sourceLineNo">1473</span>      }<a name="line.1473"></a>
-<span class="sourceLineNo">1474</span>      if (localServers.isEmpty()) {<a name="line.1474"></a>
-<span class="sourceLineNo">1475</span>        // No servers on the new cluster match up with this hostname, assign randomly, later.<a name="line.1475"></a>
-<span class="sourceLineNo">1476</span>        randomAssignRegions.add(region);<a name="line.1476"></a>
-<span class="sourceLineNo">1477</span>        if (oldServerName != null) {<a name="line.1477"></a>
-<span class="sourceLineNo">1478</span>          oldHostsNoLongerPresent.add(oldServerName.getHostnameLowerCase());<a name="line.1478"></a>
-<span class="sourceLineNo">1479</span>        }<a name="line.1479"></a>
-<span class="sourceLineNo">1480</span>      } else if (localServers.size() == 1) {<a name="line.1480"></a>
-<span class="sourceLineNo">1481</span>        // the usual case - one new server on same host<a name="line.1481"></a>
-<span class="sourceLineNo">1482</span>        ServerName target = localServers.get(0);<a name="line.1482"></a>
-<span class="sourceLineNo">1483</span>        assignments.get(target).add(region);<a name="line.1483"></a>
-<span class="sourceLineNo">1484</span>        numRetainedAssigments++;<a name="line.1484"></a>
-<span class="sourceLineNo">1485</span>      } else {<a name="line.1485"></a>
-<span class="sourceLineNo">1486</span>        // multiple new servers in the cluster on this same host<a name="line.1486"></a>
-<span class="sourceLineNo">1487</span>        if (localServers.contains(oldServerName)) {<a name="line.1487"></a>
-<span class="sourceLineNo">1488</span>          assignments.get(oldServerName).add(region);<a name="line.1488"></a>
-<span class="sourceLineNo">1489</span>          numRetainedAssigments++;<a name="line.1489"></a>
-<span class="sourceLineNo">1490</span>        } else {<a name="line.1490"></a>
-<span class="sourceLineNo">1491</span>          ServerName target = null;<a name="line.1491"></a>
-<span class="sourceLineNo">1492</span>          for (ServerName tmp : localServers) {<a name="line.1492"></a>
-<span class="sourceLineNo">1493</span>            if (tmp.getPort() == oldServerName.getPort()) {<a name="line.1493"></a>
-<span class="sourceLineNo">1494</span>              target = tmp;<a name="line.1494"></a>
-<span class="sourceLineNo">1495</span>              assignments.get(tmp).add(region);<a name="line.1495"></a>
-<span class="sourceLineNo">1496</span>              numRetainedAssigments++;<a name="line.1496"></a>
-<span class="sourceLineNo">1497</span>              break;<a name="line.1497"></a>
-<span class="sourceLineNo">1498</span>            }<a name="line.1498"></a>
-<span class="sourceLineNo">1499</span>          }<a name="line.1499"></a>
-<span class="sourceLineNo">1500</span>          if (target == null) {<a name="line.1500"></a>
-<span class="sourceLineNo">1501</span>            randomAssignRegions.add(region);<a name="line.1501"></a>
-<span class="sourceLineNo">1502</span>          }<a name="line.1502"></a>
-<span class="sourceLineNo">1503</span>        }<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><a name="line.1506"></a>
-<span class="sourceLineNo">1507</span>    // If servers from prior assignment aren't present, then lets do randomAssignment on regions.<a name="line.1507"></a>
-<span class="sourceLineNo">1508</span>    if (randomAssignRegions.size() &gt; 0) {<a name="line.1508"></a>
-<span class="sourceLineNo">1509</span>      Cluster cluster = createCluster(servers, regions.keySet(), hasRegionReplica);<a name="line.1509"></a>
-<span class="sourceLineNo">1510</span>      for (Map.Entry&lt;ServerName, List&lt;RegionInfo&gt;&gt; entry : assignments.entrySet()) {<a name="line.1510"></a>
-<span class="sourceLineNo">1511</span>        ServerName sn = entry.getKey();<a name="line.1511"></a>
-<span class="sourceLineNo">1512</span>        for (RegionInfo region : entry.getValue()) {<a name="line.1512"></a>
-<span class="sourceLineNo">1513</span>          cluster.doAssignRegion(region, sn);<a name="line.1513"></a>
-<span class="sourceLineNo">1514</span>        }<a name="line.1514"></a>
-<span class="sourceLineNo">1515</span>      }<a name="line.1515"></a>
-<span class="sourceLineNo">1516</span>      for (RegionInfo region : randomAssignRegions) {<a name="line.1516"></a>
-<span class="sourceLineNo">1517</span>        ServerName target = randomAssignment(cluster, region, servers);<a name="line.1517"></a>
-<span class="sourceLineNo">1518</span>        assignments.get(target).add(region);<a name="line.1518"></a>
-<span class="sourceLineNo">1519</span>        numRandomAssignments++;<a name="line.1519"></a>
-<span class="sourceLineNo">1520</span>      }<a name="line.1520"></a>
-<span class="sourceLineNo">1521</span>    }<a name="line.1521"></a>
-<span class="sourceLineNo">1522</span><a name="line.1522"></a>
-<span class="sourceLineNo">1523</span>    String randomAssignMsg = "";<a name="line.1523"></a>
-<span class="sourceLineNo">1524</span>    if (numRandomAssignments &gt; 0) {<a name="line.1524"></a>
-<span class="sourceLineNo">1525</span>      randomAssignMsg =<a name="line.1525"></a>
-<span class="sourceLineNo">1526</span>          numRandomAssignments + " regions were assigned "<a name="line.1526"></a>
-<span class="sourceLineNo">1527</span>              + "to random hosts, since the old hosts for these regions are no "<a name="line.1527"></a>
-<span class="sourceLineNo">1528</span>              + "longer present in the cluster. These hosts were:\n  "<a name="line.1528"></a>
-<span class="sourceLineNo">1529</span>              + Joiner.on("\n  ").join(oldHostsNoLongerPresent);<a name="line.1529"></a>
-<span class="sourceLineNo">1530</span>    }<a name="line.1530"></a>
-<span class="sourceLineNo">1531</span><a name="line.1531"></a>
-<span class="sourceLineNo">1532</span>    LOG.info("Reassigned " + regions.size() + " regions. " + numRetainedAssigments<a name="line.1532"></a>
-<span class="sourceLineNo">1533</span>        + " retained the pre-restart assignment. " + randomAssignMsg);<a name="line.1533"></a>
-<span class="sourceLineNo">1534</span>    return assignments;<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>  @Override<a name="line.1537"></a>
-<span class="sourceLineNo">1538</span>  public void initialize() throws HBaseIOException{<a name="line.1538"></a>
-<span class="sourceLineNo">1539</span>  }<a name="line.1539"></a>
-<span class="sourceLineNo">1540</span><a name="line.1540"></a>
-<span class="sourceLineNo">1541</span>  @Override<a name="line.1541"></a>
-<span class="sourceLineNo">1542</span>  public void regionOnline(RegionInfo regionInfo, ServerName sn) {<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>  @Override<a name="line.1545"></a>
-<span class="sourceLineNo">1546</span>  public void regionOffline(RegionInfo regionInfo) {<a name="line.1546"></a>
-<span class="sourceLineNo">1547</span>  }<a name="line.1547"></a>
-<span class="sourceLineNo">1548</span><a name="line.1548"></a>
-<span class="sourceLineNo">1549</span>  @Override<a name="line.1549"></a>
-<span class="sourceLineNo">1550</span>  public boolean isStopped() {<a name="line.1550"></a>
-<span class="sourceLineNo">1551</span>    return stopped;<a name="line.1551"></a>
-<span class="sourceLineNo">1552</span>  }<a name="line.1552"></a>
-<span class="sourceLineNo">1553</span><a name="line.1553"></a>
-<span class="sourceLineNo">1554</span>  @Override<a name="line.1554"></a>
-<span class="sourceLineNo">1555</span>  public void stop(String why) {<a name="line.1555"></a>
-<span class="sourceLineNo">1556</span>    LOG.info("Load Balancer stop requested: "+why);<a name="line.1556"></a>
-<span class="sourceLineNo">1557</span>    stopped = true;<a name="line.1557"></a>
-<span class="sourceLineNo">1558</span>  }<a name="line.1558"></a>
-<span class="sourceLineNo">1559</span><a name="line.1559"></a>
-<span class="sourceLineNo">1560</span>  /**<a name="line.1560"></a>
-<span class="sourceLineNo">1561</span>  * Updates the balancer status tag reported to JMX<a name="line.1561"></a>
-<span class="sourceLineNo">1562</span>  */<a name="line.1562"></a>
-<span class="sourceLineNo">1563</span>  public void updateBalancerStatus(boolean status) {<a name="line.1563"></a>
-<span class="sourceLineNo">1564</span>    metricsBalancer.balancerStatus(status);<a name="line.1564"></a>
-<span class="sourceLineNo">1565</span>  }<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>   * Used to assign a single region to a random server.<a name="line.1568"></a>
-<span class="sourceLineNo">1569</span>   */<a name="line.1569"></a>
-<span class="sourceLineNo">1570</span>  private ServerName randomAssignment(Cluster cluster, RegionInfo regionInfo,<a name="line.1570"></a>
-<span class="sourceLineNo">1571</span>      List&lt;ServerName&gt; servers) {<a name="line.1571"></a>
-<span class="sourceLineNo">1572</span>    int numServers = servers.size(); // servers is not null, numServers &gt; 1<a name="line.1572"></a>
-<span class="sourceLineNo">1573</span>    ServerName sn = null;<a name="line.1573"></a>
-<span class="sourceLineNo">1574</span>    final int maxIterations = numServers * 4;<a name="line.1574"></a>
-<span class="sourceLineNo">1575</span>    int iterations = 0;<a name="line.1575"></a>
-<span class="sourceLineNo">1576</span>    List&lt;ServerName&gt; usedSNs = new ArrayList&lt;&gt;(servers.size());<a name="line.1576"></a>
-<span class="sourceLineNo">1577</span>    do {<a name="line.1577"></a>
-<span class="sourceLineNo">1578</span>      int i = RANDOM.nextInt(numServers);<a name="line.1578"></a>
-<span class="sourceLineNo">1579</span>      sn = servers.get(i);<a name="line.1579"></a>
-<span class="sourceLineNo">1580</span>      if (!usedSNs.contains(sn)) {<a name="line.1580"></a>
-<span class="sourceLineNo">1581</span>        usedSNs.add(sn);<a name="line.1581"></a>
-<span class="sourceLineNo">1582</span>      }<a name="line.1582"></a>
-<span class="sourceLineNo">1583</span>    } while (cluster.wouldLowerAvailability(regionInfo, sn)<a name="line.1583"></a>
-<span class="sourceLineNo">1584</span>        &amp;&amp; iterations++ &lt; maxIterations);<a name="line.1584"></a>
-<span class="sourceLineNo">1585</span>    if (iterations &gt;= maxIterations) {<a name="line.1585"></a>
-<span class="sourceLineNo">1586</span>      // We have reached the max. Means the servers that we collected is still lowering the<a name="line.1586"></a>
-<span class="sourceLineNo">1587</span>      // availability<a name="line.1587"></a>
-<span class="sourceLineNo">1588</span>      for (ServerName unusedServer : servers) {<a name="line.1588"></a>
-<span class="sourceLineNo">1589</span>        if (!usedSNs.contains(unusedServer)) {<a name="line.1589"></a>
-<span class="sourceLineNo">1590</span>          // check if any other unused server is there for us to use.<a name="line.1590"></a>
-<span class="sourceLineNo">1591</span>          // If so use it. Else we have not other go but to go with one of them<a name="line.1591"></a>
-<span class="sourceLineNo">1592</span>          if (!cluster.wouldLowerAvailability(regionInfo, unusedServer)) {<a name="line.1592"></a>
-<span class="sourceLineNo">1593</span>            sn = unusedServer;<a name="line.1593"></a>
-<span class="sourceLineNo">1594</span>            break;<a name="line.1594"></a>
-<span class="sourceLineNo">1595</span>          }<a name="line.1595"></a>
-<span class="sourceLineNo">1596</span>        }<a name="line.1596"></a>
-<span class="sourceLineNo">1597</span>      }<a name="line.1597"></a>
-<span class="sourceLineNo">1598</span>    }<a name="line.1598"></a>
-<span class="sourceLineNo">1599</span>    cluster.doAssignRegion(regionInfo, sn);<a name="line.1599"></a>
-<span class="sourceLineNo">1600</span>    return sn;<a name="line.1600"></a>
-<span class="sourceLineNo">1601</span>  }<a name="line.1601"></a>
-<span class="sourceLineNo">1602</span><a name="line.1602"></a>
-<span class="sourceLineNo">1603</span>  /**<a name="line.1603"></a>
-<span class="sourceLineNo">1604</span>   * Round robin a list of regions to a list of servers<a name="line.1604"></a>
-<span class="sourceLineNo">1605</span>   */<a name="line.1605"></a>
-<span class="sourceLineNo">1606</span>  private void roundRobinAssignment(Cluster cluster, List&lt;RegionInfo&gt; regions,<a name="line.1606"></a>
-<span class="sourceLineNo">1607</span>      List&lt;RegionInfo&gt; unassignedRegions, List&lt;ServerName&gt; servers,<a name="line.1607"></a>
-<span class="sourceLineNo">1608</span>      Map&lt;ServerName, List&lt;RegionInfo&gt;&gt; assignments) {<a name="line.1608"></a>
-<span class="sourceLineNo">1609</span><a name="line.1609"></a>
-<span class="sourceLineNo">1610</span>    int numServers = servers.size();<a name="line.1610"></a>
-<span class="sourceLineNo">1611</span>    int numRegions = regions.size();<a name="line.1611"></a>
-<span class="sourceLineNo">1612</span>    int max = (int) Math.ceil((float) numRegions / numServers);<a name="line.1612"></a>
-<span class="sourceLineNo">1613</span>    int serverIdx = 0;<a name="line.1613"></a>
-<span class="sourceLineNo">1614</span>    if (numServers &gt; 1) {<a name="line.1614"></a>
-<span class="sourceLineNo">1615</span>      serverIdx = RANDOM.nextInt(numServers);<a name="line.1615"></a>
-<span class="sourceLineNo">1616</span>    }<a name="line.1616"></a>
-<span class="sourceLineNo">1617</span>    int regionIdx = 0;<a name="line.1617"></a>
-<span class="sourceLineNo">1618</span><a name="line.1618"></a>
-<span class="sourceLineNo">1619</span>    for (int j = 0; j &lt; numServers; j++) {<a name="line.1619"></a>
-<span class="sourceLineNo">1620</span>      ServerName server = servers.get((j + serverIdx) % numServers);<a name="line.1620"></a>
-<span class="sourceLineNo">1621</span>      List&lt;RegionInfo&gt; serverRegions = new ArrayList&lt;&gt;(max);<a name="line.1621"></a>
-<span class="sourceLineNo">1622</span>      for (int i = regionIdx; i &lt; numRegions; i += numServers) {<a name="line.1622"></a>
-<span class="sourceLineNo">1623</span>        RegionInfo region = regions.get(i % numRegions);<a name="line.1623"></a>
-<span class="sourceLineNo">1624</span>        if (cluster.wouldLowerAvailability(region, server)) {<a name="line.1624"></a>
-<span class="sourceLineNo">1625</span>          unassignedRegions.add(region);<a name="line.1625"></a>
-<span class="sourceLineNo">1626</span>        } else {<a name="line.1626"></a>
-<span class="sourceLineNo">1627</span>          serverRegions.add(region);<a name="line.1627"></a>
-<span class="sourceLineNo">1628</span>          cluster.doAssignRegion(region, server);<a name="line.1628"></a>
-<span class="sourceLineNo">1629</span>        }<a name="line.1629"></a>
-<span class="sourceLineNo">1630</span>      }<a name="line.1630"></a>
-<span class="sourceLineNo">1631</span>      assignments.put(server, serverRegions);<a name="line.1631"></a>
-<span class="sourceLineNo">1632</span>      regionIdx++;<a name="line.1632"></a>
-<span class="sourceLineNo">1633</span>    }<a name="line.1633"></a>
-<span class="sourceLineNo">1634</span>  }<a name="line.1634"></a>
-<span class="sourceLineNo">1635</span><a name="line.1635"></a>
-<span class="sourceLineNo">1636</span>  protected Map&lt;ServerName, List&lt;RegionInfo&gt;&gt; getRegionAssignmentsByServer(<a name="line.1636"></a>
-<span class="sourceLineNo">1637</span>    Collection&lt;RegionInfo&gt; regions) {<a name="line.1637"></a>
-<span class="sourceLineNo">1638</span>    if (this.services != null &amp;&amp; this.services.getAssignmentManager() != null) {<a name="line.1638"></a>
-<span class="sourceLineNo">1639</span>      return this.services.getAssignmentManager().getSnapShotOfAssignment(regions);<a name="line.1639"></a>
-<span class="sourceLineNo">1640</span>    } else {<a name="line.1640"></a>
-<span class="sourceLineNo">1641</span>      return new HashMap&lt;&gt;();<a name="line.1641"></a>
-<span class="sourceLineNo">1642</span>    }<a name="line.1642"></a>
-<span class="sourceLineNo">1643</span>  }<a name="line.1643"></a>
-<span class="sourceLineNo">1644</span><a name="line.1644"></a>
-<span class="sourceLineNo">1645</span>  @Override<a name="line.1645"></a>
-<span class="sourceLineNo">1646</span>  public void onConfigurationChange(Configuration conf) {<a name="line.1646"></a>
-<span class="sourceLineNo">1647</span>  }<a name="line.1647"></a>
-<span class="sourceLineNo">1648</span>}<a name="line.1648"></a>
+<span class="sourceLineNo">1044</span>  /**<a name="line.1044"></a>
+<span class="sourceLineNo">1045</span>   * Check if a region belongs to some system table.<a name="line.1045"></a>
+<span class="sourceLineNo">1046</span>   * If so, the primary replica may be expected to be put on the master regionserver.<a name="line.1046"></a>
+<span class="sourceLineNo">1047</span>   */<a name="line.1047"></a>
+<span class="sourceLineNo">1048</span>  public boolean shouldBeOnMaster(RegionInfo region) {<a name="line.1048"></a>
+<span class="sourceLineNo">1049</span>    return (this.maintenanceMode || this.onlySystemTablesOnMaster)<a name="line.1049"></a>
+<span class="sourceLineNo">1050</span>        &amp;&amp; region.getTable().isSystemTable();<a name="line.1050"></a>
+<span class="sourceLineNo">1051</span>  }<a name="line.1051"></a>
+<span class="sourceLineNo">1052</span><a name="line.1052"></a>
+<span class="sourceLineNo">1053</span>  /**<a name="line.1053"></a>
+<span class="sourceLineNo">1054</span>   * Balance the regions that should be on master regionserver.<a name="line.1054"></a>
+<span class="sourceLineNo">1055</span>   */<a name="line.1055"></a>
+<span class="sourceLineNo">1056</span>  protected List&lt;RegionPlan&gt; balanceMasterRegions(Map&lt;ServerName, List&lt;RegionInfo&gt;&gt; clusterMap) {<a name="line.1056"></a>
+<span class="sourceLineNo">1057</span>    if (masterServerName == null || clusterMap == null || clusterMap.size() &lt;= 1) return null;<a name="line.1057"></a>
+<span class="sourceLineNo">1058</span>    List&lt;RegionPlan&gt; plans = null;<a name="line.1058"></a>
+<span class="sourceLineNo">1059</span>    List&lt;RegionInfo&gt; regions = clusterMap.get(masterServerName);<a name="line.1059"></a>
+<span class="sourceLineNo">1060</span>    if (regions != null) {<a name="line.1060"></a>
+<span class="sourceLineNo">1061</span>      Iterator&lt;ServerName&gt; keyIt = null;<a name="line.1061"></a>
+<span class="sourceLineNo">1062</span>      for (RegionInfo region: regions) {<a name="line.1062"></a>
+<span class="sourceLineNo">1063</span>        if (shouldBeOnMaster(region)) continue;<a name="line.1063"></a>
+<span class="sourceLineNo">1064</span><a name="line.1064"></a>
+<span class="sourceLineNo">1065</span>        // Find a non-master regionserver to host the region<a name="line.1065"></a>
+<span class="sourceLineNo">1066</span>        if (keyIt == null || !keyIt.hasNext()) {<a name="line.1066"></a>
+<span class="sourceLineNo">1067</span>          keyIt = clusterMap.keySet().iterator();<a name="line.1067"></a>
+<span class="sourceLineNo">1068</span>        }<a name="line.1068"></a>
+<span class="sourceLineNo">1069</span>        ServerName dest = keyIt.next();<a name="line.1069"></a>
+<span class="sourceLineNo">1070</span>        if (masterServerName.equals(dest)) {<a name="line.1070"></a>
+<span class="sourceLineNo">1071</span>          if (!keyIt.hasNext()) {<a name="line.1071"></a>
+<span class="sourceLineNo">1072</span>            keyIt = clusterMap.keySet().iterator();<a name="line.1072"></a>
+<span class="sourceLineNo">1073</span>          }<a name="line.1073"></a>
+<span class="sourceLineNo">1074</span>          dest = keyIt.next();<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>        // Move this region away from the master regionserver<a name="line.1077"></a>
+<span class="sourceLineNo">1078</span>        RegionPlan plan = new RegionPlan(region, masterServerName, dest);<a name="line.1078"></a>
+<span class="sourceLineNo">1079</span>        if (plans == null) {<a name="line.1079"></a>
+<span class="sourceLineNo">1080</span>          plans = new ArrayList&lt;&gt;();<a name="line.1080"></a>
+<span class="sourceLineNo">1081</span>        }<a name="line.1081"></a>
+<span class="sourceLineNo">1082</span>        plans.add(plan);<a name="line.1082"></a>
+<span class="sourceLineNo">1083</span>      }<a name="line.1083"></a>
+<span class="sourceLineNo">1084</span>    }<a name="line.1084"></a>
+<span class="sourceLineNo">1085</span>    for (Map.Entry&lt;ServerName, List&lt;RegionInfo&gt;&gt; server: clusterMap.entrySet()) {<a name="line.1085"></a>
+<span class="sourceLineNo">1086</span>      if (masterServerName.equals(server.getKey())) continue;<a name="line.1086"></a>
+<span class="sourceLineNo">1087</span>      for (RegionInfo region: server.getValue()) {<a name="line.1087"></a>
+<span class="sourceLineNo">1088</span>        if (!shouldBeOnMaster(region)) continue;<a name="line.1088"></a>
+<span class="sourceLineNo">1089</span><a name="line.1089"></a>
+<span class="sourceLineNo">1090</span>        // Move this region to the master regionserver<a name="line.1090"></a>
+<span class="sourceLineNo">1091</span>        RegionPlan plan = new RegionPlan(region, server.getKey(), masterServerName);<a name="line.1091"></a>
+<span class="sourceLineNo">1092</span>        if (plans == null) {<a name="line.1092"></a>
+<span class="sourceLineNo">1093</span>          plans = new ArrayList&lt;&gt;();<a name="line.1093"></a>
+<span class="sourceLineNo">1094</span>        }<a name="line.1094"></a>
+<span class="sourceLineNo">1095</span>        plans.add(plan);<a name="line.1095"></a>
+<span class="sourceLineNo">1096</span>      }<a name="line.1096"></a>
+<span class="sourceLineNo">1097</span>    }<a name="line.1097"></a>
+<span class="sourceLineNo">1098</span>    return plans;<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>  /**<a name="line.1101"></a>
+<span class="sourceLineNo">1102</span>   * If master is configured to carry system tables only, in here is<a name="line.1102"></a>
+<span class="sourceLineNo">1103</span>   * where we figure what to assign it.<a name="line.1103"></a>
+<span class="sourceLineNo">1104</span>   */<a name="line.1104"></a>
+<span class="sourceLineNo">1105</span>  protected Map&lt;ServerName, List&lt;RegionInfo&gt;&gt; assignMasterSystemRegions(<a name="line.1105"></a>
+<span class="sourceLineNo">1106</span>      Collection&lt;RegionInfo&gt; regions, List&lt;ServerName&gt; servers) {<a name="line.1106"></a>
+<span class="sourceLineNo">1107</span>    if (servers == null || regions == null || regions.isEmpty()) {<a name="line.1107"></a>
+<span class="sourceLineNo">1108</span>      return null;<a name="line.1108"></a>
+<span class="sourceLineNo">1109</span>    }<a name="line.1109"></a>
+<span class="sourceLineNo">1110</span>    Map&lt;ServerName, List&lt;RegionInfo&gt;&gt; assignments = new TreeMap&lt;&gt;();<a name="line.1110"></a>
+<span class="sourceLineNo">1111</span>    if (this.maintenanceMode || this.onlySystemTablesOnMaster) {<a name="line.1111"></a>
+<span class="sourceLineNo">1112</span>      if (masterServerName != null &amp;&amp; servers.contains(masterServerName)) {<a name="line.1112"></a>
+<span class="sourceLineNo">1113</span>        assignments.put(masterServerName, new ArrayList&lt;&gt;());<a name="line.1113"></a>
+<span class="sourceLineNo">1114</span>        for (RegionInfo region : regions) {<a name="line.1114"></a>
+<span class="sourceLineNo">1115</span>          if (shouldBeOnMaster(region)) {<a name="line.1115"></a>
+<span class="sourceLineNo">1116</span>            assignments.get(masterServerName).add(region);<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>      }<a name="line.1119"></a>
+<span class="sourceLineNo">1120</span>    }<a name="line.1120"></a>
+<span class="sourceLineNo">1121</span>    return assignments;<a name="line.1121"></a>
+<span class="sourceLineNo">1122</span>  }<a name="line.1122"></a>
+<span class="sourceLineNo">1123</span><a name="line.1123"></a>
+<span class="sourceLineNo">1124</span>  @Override<a name="line.1124"></a>
+<span class="sourceLineNo">1125</span>  public Configuration getConf() {<a name="line.1125"></a>
+<span class="sourceLineNo">1126</span>    return this.config;<a name="line.1126"></a>
+<span class="sourceLineNo">1127</span>  }<a name="line.1127"></a>
+<span class="sourceLineNo">1128</span><a name="line.1128"></a>
+<span class="sourceLineNo">1129</span>  @Override<a name="line.1129"></a>
+<span class="sourceLineNo">1130</span>  public synchronized void setClusterMetrics(ClusterMetrics st) {<a name="line.1130"></a>
+<span class="sourceLineNo">1131</span>    this.clusterStatus = st;<a name="line.1131"></a>
+<span class="sourceLineNo">1132</span>    if (useRegionFinder) {<a name="line.1132"></a>
+<span class="sourceLineNo">1133</span>      regionFinder.setClusterMetrics(st);<a name="line.1133"></a>
+<span class="sourceLineNo">1134</span>    }<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 void setClusterLoad(Map&lt;TableName, Map&lt;ServerName, List&lt;RegionInfo&gt;&gt;&gt; clusterLoad){<a name="line.1138"></a>
+<span class="sourceLineNo">1139</span><a name="line.1139"></a>
+<span class="sourceLineNo">1140</span>  }<a name="line.1140"></a>
+<span class="sourceLineNo">1141</span><a name="line.1141"></a>
+<span class="sourceLineNo">1142</span>  @Override<a name="line.1142"></a>
+<span class="sourceLineNo">1143</span>  public void setMasterServices(MasterServices masterServices) {<a name="line.1143"></a>
+<span class="sourceLineNo">1144</span>    masterServerName = masterServices.getServerName();<a name="line.1144"></a>
+<span class="sourceLineNo">1145</span>    this.services = masterServices;<a name="line.1145"></a>
+<span class="sourceLineNo">1146</span>    if (useRegionFinder) {<a name="line.1146"></a>
+<span class="sourceLineNo">1147</span>      this.regionFinder.setServices(masterServices);<a name="line.1147"></a>
+<span class="sourceLineNo">1148</span>    }<a name="line.1148"></a>
+<span class="sourceLineNo">1149</span>    if (this.services.isInMaintenanceMode()) {<a name="line.1149"></a>
+<span class="sourceLineNo">1150</span>      this.maintenanceMode = true;<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><a name="line.1153"></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 (this.maintenanceMode || 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 

<TRUNCATED>

[43/46] hbase-site git commit: Published site at 05d22ed960204183fbd9bd16f1dbca6410ccde76.

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

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/3649682c/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 5efd861..3b31a41 100644
--- a/devapidocs/org/apache/hadoop/hbase/client/package-tree.html
+++ b/devapidocs/org/apache/hadoop/hbase/client/package-tree.html
@@ -555,24 +555,24 @@
 <ul>
 <li type="circle">java.lang.<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Enum.html?is-external=true" title="class or interface in java.lang"><span class="typeNameLink">Enum</span></a>&lt;E&gt; (implements java.lang.<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Comparable.html?is-external=true" title="class or interface in java.lang">Comparable</a>&lt;T&gt;, java.io.<a href="https://docs.oracle.com/javase/8/docs/api/java/io/Serializable.html?is-external=true" title="class or interface in java.io">Serializable</a>)
 <ul>
-<li type="circle">org.apache.hadoop.hbase.client.<a href="../../../../../org/apache/hadoop/hbase/client/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/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/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/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/TableState.State.html" title="enum in org.apache.hadoop.hbase.client"><span class="typeNameLink">TableState.State</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.client.<a href="../../../../../org/apache/hadoop/hbase/client/AsyncScanSingleRegionRpcRetryingCaller.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/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/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/AbstractResponse.ResponseType.html" title="enum in org.apache.hadoop.hbase.client"><span class="typeNameLink">AbstractResponse.ResponseType</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.client.<a href="../../../../../org/apache/hadoop/hbase/client/Consistency.html" title="enum in org.apache.hadoop.hbase.client"><span class="typeNameLink">Consistency</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.client.<a href="../../../../../org/apache/hadoop/hbase/client/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/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/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/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/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/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/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/Durability.html" title="enum in org.apache.hadoop.hbase.client"><span class="typeNameLink">Durability</span></a></li>
-<li type="circle">org.apache.hadoop.hbase.client.<a href="../../../../../org/apache/hadoop/hbase/client/CompactType.html" title="enum in org.apache.hadoop.hbase.client"><span class="typeNameLink">CompactType</span></a></li>
-<li type="circle">org.apache.hadoop.hbase.client.<a href="../../../../../org/apache/hadoop/hbase/client/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/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/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/RequestController.ReturnCode.html" title="enum in org.apache.hadoop.hbase.client"><span class="typeNameLink">RequestController.ReturnCode</span></a></li>
 </ul>
 </li>
 </ul>

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

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/3649682c/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 58e2632..950319e 100644
--- a/devapidocs/org/apache/hadoop/hbase/favored/FavoredNodeLoadBalancer.html
+++ b/devapidocs/org/apache/hadoop/hbase/favored/FavoredNodeLoadBalancer.html
@@ -188,7 +188,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/favored/FavoredNodesP
 <!--   -->
 </a>
 <h3>Fields 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#clusterStatus">clusterStatus</a>, <a href="../../../../../org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.html#config">config</a>, <a href="../../../../../org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.html#masterServerName">masterServerName</a>, <a href="../../../../../org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.html#metricsBalancer">metricsBalancer</a>, <a href="../../../../../org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.html#MIN_SERVER_BALANCE">MIN_SERVER_BALANCE</a>, <a href="../../../../../org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.html#onlySystemTablesOnMaster">onlySystemTablesOnMaster</a>, <a href="../../../../../org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.html#overallSlop">overallSlop</a>, <a href="../../../../../org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.html#regionFinder">regionFinder</a>, <a href="
 ../../../../../org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.html#services">services</a>, <a href="../../../../../org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.html#slop">slop</a>, <a href="../../../../../org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.html#tablesOnMaster">tablesOnMaster</a>, <a href="../../../../../org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.html#useRegionFinder">useRegionFinder</a></code></li>
+<code><a href="../../../../../org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.html#clusterStatus">clusterStatus</a>, <a href="../../../../../org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.html#config">config</a>, <a href="../../../../../org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.html#maintenanceMode">maintenanceMode</a>, <a href="../../../../../org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.html#masterServerName">masterServerName</a>, <a href="../../../../../org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.html#metricsBalancer">metricsBalancer</a>, <a href="../../../../../org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.html#MIN_SERVER_BALANCE">MIN_SERVER_BALANCE</a>, <a href="../../../../../org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.html#onlySystemTablesOnMaster">onlySystemTablesOnMaster</a>, <a href="../../../../../org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.html#overallSlop">overallSlop</a>, <a 
 href="../../../../../org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.html#regionFinder">regionFinder</a>, <a href="../../../../../org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.html#services">services</a>, <a href="../../../../../org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.html#slop">slop</a>, <a href="../../../../../org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.html#useRegionFinder">useRegionFinder</a></code></li>
 </ul>
 <ul class="blockList">
 <li class="blockList"><a name="fields.inherited.from.class.org.apache.hadoop.hbase.favored.FavoredNodesPromoter">
@@ -354,7 +354,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/favored/FavoredNodesP
 <!--   -->
 </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#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></code></li>
+<code><a href="../../../../../org/apache/hadoop/hbase/master/LoadBalancer.html#isMasterCanHostUserRegions-org.apache.hadoop.conf.Configuration-">isMasterCanHostUserRegions</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></code></li>
 </ul>
 </li>
 </ul>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/3649682c/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 21fb8a6..56b6b26 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/FuzzyRowFilter.SatisfiesCode.html" title="enum in org.apache.hadoop.hbase.filter"><span class="typeNameLink">FuzzyRowFilter.SatisfiesCode</span></a></li>
-<li type="circle">org.apache.hadoop.hbase.filter.<a href="../../../../../org/apache/hadoop/hbase/filter/Filter.ReturnCode.html" title="enum in org.apache.hadoop.hbase.filter"><span class="typeNameLink">Filter.ReturnCode</span></a></li>
-<li type="circle">org.apache.hadoop.hbase.filter.<a href="../../../../../org/apache/hadoop/hbase/filter/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/FilterWrapper.FilterRowRetCode.html" title="enum in org.apache.hadoop.hbase.filter"><span class="typeNameLink">FilterWrapper.FilterRowRetCode</span></a></li>
-<li type="circle">org.apache.hadoop.hbase.filter.<a href="../../../../../org/apache/hadoop/hbase/filter/FuzzyRowFilter.Order.html" title="enum in org.apache.hadoop.hbase.filter"><span class="typeNameLink">FuzzyRowFilter.Order</span></a></li>
-<li type="circle">org.apache.hadoop.hbase.filter.<a href="../../../../../org/apache/hadoop/hbase/filter/CompareFilter.CompareOp.html" title="enum in org.apache.hadoop.hbase.filter"><span class="typeNameLink">CompareFilter.CompareOp</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.filter.<a href="../../../../../org/apache/hadoop/hbase/filter/RegexStringComparator.EngineType.html" title="enum in org.apache.hadoop.hbase.filter"><span class="typeNameLink">RegexStringComparator.EngineType</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.filter.<a href="../../../../../org/apache/hadoop/hbase/filter/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/Filter.ReturnCode.html" title="enum in org.apache.hadoop.hbase.filter"><span class="typeNameLink">Filter.ReturnCode</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.filter.<a href="../../../../../org/apache/hadoop/hbase/filter/FuzzyRowFilter.Order.html" title="enum in org.apache.hadoop.hbase.filter"><span class="typeNameLink">FuzzyRowFilter.Order</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.filter.<a href="../../../../../org/apache/hadoop/hbase/filter/FuzzyRowFilter.SatisfiesCode.html" title="enum in org.apache.hadoop.hbase.filter"><span class="typeNameLink">FuzzyRowFilter.SatisfiesCode</span></a></li>
 </ul>
 </li>
 </ul>

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

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/3649682c/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 427b9f5..df0adf0 100644
--- a/devapidocs/org/apache/hadoop/hbase/ipc/package-tree.html
+++ b/devapidocs/org/apache/hadoop/hbase/ipc/package-tree.html
@@ -353,9 +353,9 @@
 <ul>
 <li type="circle">java.lang.<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Enum.html?is-external=true" title="class or interface in java.lang"><span class="typeNameLink">Enum</span></a>&lt;E&gt; (implements java.lang.<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Comparable.html?is-external=true" title="class or interface in java.lang">Comparable</a>&lt;T&gt;, java.io.<a href="https://docs.oracle.com/javase/8/docs/api/java/io/Serializable.html?is-external=true" title="class or interface in java.io">Serializable</a>)
 <ul>
-<li type="circle">org.apache.hadoop.hbase.ipc.<a href="../../../../../org/apache/hadoop/hbase/ipc/CallEvent.Type.html" title="enum in org.apache.hadoop.hbase.ipc"><span class="typeNameLink">CallEvent.Type</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.ipc.<a href="../../../../../org/apache/hadoop/hbase/ipc/MetricsHBaseServerSourceFactoryImpl.SourceStorage.html" title="enum in org.apache.hadoop.hbase.ipc"><span class="typeNameLink">MetricsHBaseServerSourceFactoryImpl.SourceStorage</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.ipc.<a href="../../../../../org/apache/hadoop/hbase/ipc/BufferCallBeforeInitHandler.BufferCallAction.html" title="enum in org.apache.hadoop.hbase.ipc"><span class="typeNameLink">BufferCallBeforeInitHandler.BufferCallAction</span></a></li>
+<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/3649682c/devapidocs/org/apache/hadoop/hbase/mapreduce/package-tree.html
----------------------------------------------------------------------
diff --git a/devapidocs/org/apache/hadoop/hbase/mapreduce/package-tree.html b/devapidocs/org/apache/hadoop/hbase/mapreduce/package-tree.html
index a77bff8..f930505 100644
--- a/devapidocs/org/apache/hadoop/hbase/mapreduce/package-tree.html
+++ b/devapidocs/org/apache/hadoop/hbase/mapreduce/package-tree.html
@@ -293,10 +293,10 @@
 <ul>
 <li type="circle">java.lang.<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Enum.html?is-external=true" title="class or interface in java.lang"><span class="typeNameLink">Enum</span></a>&lt;E&gt; (implements java.lang.<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Comparable.html?is-external=true" title="class or interface in java.lang">Comparable</a>&lt;T&gt;, java.io.<a href="https://docs.oracle.com/javase/8/docs/api/java/io/Serializable.html?is-external=true" title="class or interface in java.io">Serializable</a>)
 <ul>
-<li type="circle">org.apache.hadoop.hbase.mapreduce.<a href="../../../../../org/apache/hadoop/hbase/mapreduce/TableSplit.Version.html" title="enum in org.apache.hadoop.hbase.mapreduce"><span class="typeNameLink">TableSplit.Version</span></a></li>
-<li type="circle">org.apache.hadoop.hbase.mapreduce.<a href="../../../../../org/apache/hadoop/hbase/mapreduce/RowCounter.RowCounterMapper.Counters.html" title="enum in org.apache.hadoop.hbase.mapreduce"><span class="typeNameLink">RowCounter.RowCounterMapper.Counters</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.mapreduce.<a href="../../../../../org/apache/hadoop/hbase/mapreduce/SyncTable.SyncMapper.Counter.html" title="enum in org.apache.hadoop.hbase.mapreduce"><span class="typeNameLink">SyncTable.SyncMapper.Counter</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.mapreduce.<a href="../../../../../org/apache/hadoop/hbase/mapreduce/CellCounter.CellCounterMapper.Counters.html" title="enum in org.apache.hadoop.hbase.mapreduce"><span class="typeNameLink">CellCounter.CellCounterMapper.Counters</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.mapreduce.<a href="../../../../../org/apache/hadoop/hbase/mapreduce/RowCounter.RowCounterMapper.Counters.html" title="enum in org.apache.hadoop.hbase.mapreduce"><span class="typeNameLink">RowCounter.RowCounterMapper.Counters</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.mapreduce.<a href="../../../../../org/apache/hadoop/hbase/mapreduce/TableSplit.Version.html" title="enum in org.apache.hadoop.hbase.mapreduce"><span class="typeNameLink">TableSplit.Version</span></a></li>
 </ul>
 </li>
 </ul>

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

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/3649682c/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 0dc8005..d81b9be 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.3036">HMaster.MasterStoppedException</a>
+<pre>public static class <a href="../../../../../src-html/org/apache/hadoop/hbase/master/HMaster.html#line.3054">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.3037">MasterStoppedException</a>()</pre>
+<pre><a href="../../../../../src-html/org/apache/hadoop/hbase/master/HMaster.MasterStoppedException.html#line.3055">MasterStoppedException</a>()</pre>
 </li>
 </ul>
 </li>

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

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


[36/46] hbase-site git commit: Published site at 05d22ed960204183fbd9bd16f1dbca6410ccde76.

Posted by gi...@apache.org.
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/3649682c/devapidocs/org/apache/hadoop/hbase/regionserver/RSRpcServices.html
----------------------------------------------------------------------
diff --git a/devapidocs/org/apache/hadoop/hbase/regionserver/RSRpcServices.html b/devapidocs/org/apache/hadoop/hbase/regionserver/RSRpcServices.html
index 23b1976..9207d2b 100644
--- a/devapidocs/org/apache/hadoop/hbase/regionserver/RSRpcServices.html
+++ b/devapidocs/org/apache/hadoop/hbase/regionserver/RSRpcServices.html
@@ -1347,7 +1347,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/ipc/HBaseRPCErrorHand
 <li class="blockList">
 <h4>SCANNER_ALREADY_CLOSED</h4>
 <pre><a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Deprecated.html?is-external=true" title="class or interface in java.lang">@Deprecated</a>
-private static final&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/RSRpcServices.html#line.3023">SCANNER_ALREADY_CLOSED</a></pre>
+private static final&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/RSRpcServices.html#line.3025">SCANNER_ALREADY_CLOSED</a></pre>
 <div class="block"><span class="deprecatedLabel">Deprecated.</span>&nbsp;</div>
 </li>
 </ul>
@@ -2565,7 +2565,7 @@ private static final&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/jav
 <ul class="blockList">
 <li class="blockList">
 <h4>rejectIfInStandByState</h4>
-<pre>private&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/RSRpcServices.html#line.2492">rejectIfInStandByState</a>(<a href="../../../../../org/apache/hadoop/hbase/regionserver/HRegion.html" title="class in org.apache.hadoop.hbase.regionserver">HRegion</a>&nbsp;region)
+<pre>private&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/RSRpcServices.html#line.2494">rejectIfInStandByState</a>(<a href="../../../../../org/apache/hadoop/hbase/regionserver/HRegion.html" title="class in org.apache.hadoop.hbase.regionserver">HRegion</a>&nbsp;region)
                              throws <a href="../../../../../org/apache/hadoop/hbase/DoNotRetryIOException.html" title="class in org.apache.hadoop.hbase">DoNotRetryIOException</a></pre>
 <dl>
 <dt><span class="throwsLabel">Throws:</span></dt>
@@ -2579,7 +2579,7 @@ private static final&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/jav
 <ul class="blockList">
 <li class="blockList">
 <h4>get</h4>
-<pre>public&nbsp;org.apache.hadoop.hbase.shaded.protobuf.generated.ClientProtos.GetResponse&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/RSRpcServices.html#line.2507">get</a>(org.apache.hbase.thirdparty.com.google.protobuf.RpcController&nbsp;controller,
+<pre>public&nbsp;org.apache.hadoop.hbase.shaded.protobuf.generated.ClientProtos.GetResponse&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/RSRpcServices.html#line.2509">get</a>(org.apache.hbase.thirdparty.com.google.protobuf.RpcController&nbsp;controller,
                                                                                       org.apache.hadoop.hbase.shaded.protobuf.generated.ClientProtos.GetRequest&nbsp;request)
                                                                                throws org.apache.hbase.thirdparty.com.google.protobuf.ServiceException</pre>
 <div class="block">Get data from a table.</div>
@@ -2600,7 +2600,7 @@ private static final&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/jav
 <ul class="blockList">
 <li class="blockList">
 <h4>get</h4>
-<pre>private&nbsp;<a href="../../../../../org/apache/hadoop/hbase/client/Result.html" title="class in org.apache.hadoop.hbase.client">Result</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/RSRpcServices.html#line.2591">get</a>(<a href="../../../../../org/apache/hadoop/hbase/client/Get.html" title="class in org.apache.hadoop.hbase.client">Get</a>&nbsp;get,
+<pre>private&nbsp;<a href="../../../../../org/apache/hadoop/hbase/client/Result.html" title="class in org.apache.hadoop.hbase.client">Result</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/RSRpcServices.html#line.2593">get</a>(<a href="../../../../../org/apache/hadoop/hbase/client/Get.html" title="class in org.apache.hadoop.hbase.client">Get</a>&nbsp;get,
                    <a href="../../../../../org/apache/hadoop/hbase/regionserver/HRegion.html" title="class in org.apache.hadoop.hbase.regionserver">HRegion</a>&nbsp;region,
                    <a href="../../../../../org/apache/hadoop/hbase/regionserver/RSRpcServices.RegionScannersCloseCallBack.html" title="class in org.apache.hadoop.hbase.regionserver">RSRpcServices.RegionScannersCloseCallBack</a>&nbsp;closeCallBack,
                    <a href="../../../../../org/apache/hadoop/hbase/ipc/RpcCallContext.html" title="interface in org.apache.hadoop.hbase.ipc">RpcCallContext</a>&nbsp;context)
@@ -2617,7 +2617,7 @@ private static final&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/jav
 <ul class="blockList">
 <li class="blockList">
 <h4>checkBatchSizeAndLogLargeSize</h4>
-<pre>private&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/RSRpcServices.html#line.2642">checkBatchSizeAndLogLargeSize</a>(org.apache.hadoop.hbase.shaded.protobuf.generated.ClientProtos.MultiRequest&nbsp;request)</pre>
+<pre>private&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/RSRpcServices.html#line.2644">checkBatchSizeAndLogLargeSize</a>(org.apache.hadoop.hbase.shaded.protobuf.generated.ClientProtos.MultiRequest&nbsp;request)</pre>
 </li>
 </ul>
 <a name="failRegionAction-org.apache.hadoop.hbase.shaded.protobuf.generated.ClientProtos.MultiResponse.Builder-org.apache.hadoop.hbase.shaded.protobuf.generated.ClientProtos.RegionActionResult.Builder-org.apache.hadoop.hbase.shaded.protobuf.generated.ClientProtos.RegionAction-org.apache.hadoop.hbase.CellScanner-java.lang.Throwable-">
@@ -2626,7 +2626,7 @@ private static final&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/jav
 <ul class="blockList">
 <li class="blockList">
 <h4>failRegionAction</h4>
-<pre>private&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/RSRpcServices.html#line.2656">failRegionAction</a>(org.apache.hadoop.hbase.shaded.protobuf.generated.ClientProtos.MultiResponse.Builder&nbsp;responseBuilder,
+<pre>private&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/RSRpcServices.html#line.2658">failRegionAction</a>(org.apache.hadoop.hbase.shaded.protobuf.generated.ClientProtos.MultiResponse.Builder&nbsp;responseBuilder,
                               org.apache.hadoop.hbase.shaded.protobuf.generated.ClientProtos.RegionActionResult.Builder&nbsp;regionActionResultBuilder,
                               org.apache.hadoop.hbase.shaded.protobuf.generated.ClientProtos.RegionAction&nbsp;regionAction,
                               <a href="../../../../../org/apache/hadoop/hbase/CellScanner.html" title="interface in org.apache.hadoop.hbase">CellScanner</a>&nbsp;cellScanner,
@@ -2639,7 +2639,7 @@ private static final&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/jav
 <ul class="blockList">
 <li class="blockList">
 <h4>isReplicationRequest</h4>
-<pre>private&nbsp;boolean&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/RSRpcServices.html#line.2670">isReplicationRequest</a>(org.apache.hadoop.hbase.shaded.protobuf.generated.ClientProtos.Action&nbsp;action)</pre>
+<pre>private&nbsp;boolean&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/RSRpcServices.html#line.2672">isReplicationRequest</a>(org.apache.hadoop.hbase.shaded.protobuf.generated.ClientProtos.Action&nbsp;action)</pre>
 </li>
 </ul>
 <a name="multi-org.apache.hbase.thirdparty.com.google.protobuf.RpcController-org.apache.hadoop.hbase.shaded.protobuf.generated.ClientProtos.MultiRequest-">
@@ -2648,7 +2648,7 @@ private static final&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/jav
 <ul class="blockList">
 <li class="blockList">
 <h4>multi</h4>
-<pre>public&nbsp;org.apache.hadoop.hbase.shaded.protobuf.generated.ClientProtos.MultiResponse&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/RSRpcServices.html#line.2693">multi</a>(org.apache.hbase.thirdparty.com.google.protobuf.RpcController&nbsp;rpcc,
+<pre>public&nbsp;org.apache.hadoop.hbase.shaded.protobuf.generated.ClientProtos.MultiResponse&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/RSRpcServices.html#line.2695">multi</a>(org.apache.hbase.thirdparty.com.google.protobuf.RpcController&nbsp;rpcc,
                                                                                           org.apache.hadoop.hbase.shaded.protobuf.generated.ClientProtos.MultiRequest&nbsp;request)
                                                                                    throws org.apache.hbase.thirdparty.com.google.protobuf.ServiceException</pre>
 <div class="block">Execute multiple actions on a table: get, mutate, and/or execCoprocessor</div>
@@ -2669,7 +2669,7 @@ private static final&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/jav
 <ul class="blockList">
 <li class="blockList">
 <h4>skipCellsForMutations</h4>
-<pre>private&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/RSRpcServices.html#line.2823">skipCellsForMutations</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;org.apache.hadoop.hbase.shaded.protobuf.generated.ClientProtos.Action&gt;&nbsp;actions,
+<pre>private&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/RSRpcServices.html#line.2825">skipCellsForMutations</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;org.apache.hadoop.hbase.shaded.protobuf.generated.ClientProtos.Action&gt;&nbsp;actions,
                                    <a href="../../../../../org/apache/hadoop/hbase/CellScanner.html" title="interface in org.apache.hadoop.hbase">CellScanner</a>&nbsp;cellScanner)</pre>
 </li>
 </ul>
@@ -2679,7 +2679,7 @@ private static final&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/jav
 <ul class="blockList">
 <li class="blockList">
 <h4>skipCellsForMutation</h4>
-<pre>private&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/RSRpcServices.html#line.2832">skipCellsForMutation</a>(org.apache.hadoop.hbase.shaded.protobuf.generated.ClientProtos.Action&nbsp;action,
+<pre>private&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/RSRpcServices.html#line.2834">skipCellsForMutation</a>(org.apache.hadoop.hbase.shaded.protobuf.generated.ClientProtos.Action&nbsp;action,
                                   <a href="../../../../../org/apache/hadoop/hbase/CellScanner.html" title="interface in org.apache.hadoop.hbase">CellScanner</a>&nbsp;cellScanner)</pre>
 </li>
 </ul>
@@ -2689,7 +2689,7 @@ private static final&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/jav
 <ul class="blockList">
 <li class="blockList">
 <h4>mutate</h4>
-<pre>public&nbsp;org.apache.hadoop.hbase.shaded.protobuf.generated.ClientProtos.MutateResponse&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/RSRpcServices.html#line.2860">mutate</a>(org.apache.hbase.thirdparty.com.google.protobuf.RpcController&nbsp;rpcc,
+<pre>public&nbsp;org.apache.hadoop.hbase.shaded.protobuf.generated.ClientProtos.MutateResponse&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/RSRpcServices.html#line.2862">mutate</a>(org.apache.hbase.thirdparty.com.google.protobuf.RpcController&nbsp;rpcc,
                                                                                             org.apache.hadoop.hbase.shaded.protobuf.generated.ClientProtos.MutateRequest&nbsp;request)
                                                                                      throws org.apache.hbase.thirdparty.com.google.protobuf.ServiceException</pre>
 <div class="block">Mutate data in a table.</div>
@@ -2710,7 +2710,7 @@ private static final&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/jav
 <ul class="blockList">
 <li class="blockList">
 <h4>getRegionScanner</h4>
-<pre>private&nbsp;<a href="../../../../../org/apache/hadoop/hbase/regionserver/RSRpcServices.RegionScannerHolder.html" title="class in org.apache.hadoop.hbase.regionserver">RSRpcServices.RegionScannerHolder</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/RSRpcServices.html#line.3033">getRegionScanner</a>(org.apache.hadoop.hbase.shaded.protobuf.generated.ClientProtos.ScanRequest&nbsp;request)
+<pre>private&nbsp;<a href="../../../../../org/apache/hadoop/hbase/regionserver/RSRpcServices.RegionScannerHolder.html" title="class in org.apache.hadoop.hbase.regionserver">RSRpcServices.RegionScannerHolder</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/RSRpcServices.html#line.3035">getRegionScanner</a>(org.apache.hadoop.hbase.shaded.protobuf.generated.ClientProtos.ScanRequest&nbsp;request)
                                                     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>
@@ -2724,7 +2724,7 @@ private static final&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/jav
 <ul class="blockList">
 <li class="blockList">
 <h4>newRegionScanner</h4>
-<pre>private&nbsp;<a href="../../../../../org/apache/hadoop/hbase/regionserver/RSRpcServices.RegionScannerHolder.html" title="class in org.apache.hadoop.hbase.regionserver">RSRpcServices.RegionScannerHolder</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/RSRpcServices.html#line.3075">newRegionScanner</a>(org.apache.hadoop.hbase.shaded.protobuf.generated.ClientProtos.ScanRequest&nbsp;request,
+<pre>private&nbsp;<a href="../../../../../org/apache/hadoop/hbase/regionserver/RSRpcServices.RegionScannerHolder.html" title="class in org.apache.hadoop.hbase.regionserver">RSRpcServices.RegionScannerHolder</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/RSRpcServices.html#line.3077">newRegionScanner</a>(org.apache.hadoop.hbase.shaded.protobuf.generated.ClientProtos.ScanRequest&nbsp;request,
                                                            org.apache.hadoop.hbase.shaded.protobuf.generated.ClientProtos.ScanResponse.Builder&nbsp;builder)
                                                     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>
@@ -2739,7 +2739,7 @@ private static final&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/jav
 <ul class="blockList">
 <li class="blockList">
 <h4>checkScanNextCallSeq</h4>
-<pre>private&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/RSRpcServices.html#line.3112">checkScanNextCallSeq</a>(org.apache.hadoop.hbase.shaded.protobuf.generated.ClientProtos.ScanRequest&nbsp;request,
+<pre>private&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/RSRpcServices.html#line.3114">checkScanNextCallSeq</a>(org.apache.hadoop.hbase.shaded.protobuf.generated.ClientProtos.ScanRequest&nbsp;request,
                                   <a href="../../../../../org/apache/hadoop/hbase/regionserver/RSRpcServices.RegionScannerHolder.html" title="class in org.apache.hadoop.hbase.regionserver">RSRpcServices.RegionScannerHolder</a>&nbsp;rsh)
                            throws <a href="../../../../../org/apache/hadoop/hbase/exceptions/OutOfOrderScannerNextException.html" title="class in org.apache.hadoop.hbase.exceptions">OutOfOrderScannerNextException</a></pre>
 <dl>
@@ -2754,7 +2754,7 @@ private static final&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/jav
 <ul class="blockList">
 <li class="blockList">
 <h4>addScannerLeaseBack</h4>
-<pre>private&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/RSRpcServices.html#line.3127">addScannerLeaseBack</a>(<a href="../../../../../org/apache/hadoop/hbase/regionserver/Leases.Lease.html" title="class in org.apache.hadoop.hbase.regionserver">Leases.Lease</a>&nbsp;lease)</pre>
+<pre>private&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/RSRpcServices.html#line.3129">addScannerLeaseBack</a>(<a href="../../../../../org/apache/hadoop/hbase/regionserver/Leases.Lease.html" title="class in org.apache.hadoop.hbase.regionserver">Leases.Lease</a>&nbsp;lease)</pre>
 </li>
 </ul>
 <a name="getTimeLimit-org.apache.hadoop.hbase.ipc.HBaseRpcController-boolean-">
@@ -2763,7 +2763,7 @@ private static final&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/jav
 <ul class="blockList">
 <li class="blockList">
 <h4>getTimeLimit</h4>
-<pre>private&nbsp;long&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/RSRpcServices.html#line.3136">getTimeLimit</a>(<a href="../../../../../org/apache/hadoop/hbase/ipc/HBaseRpcController.html" title="interface in org.apache.hadoop.hbase.ipc">HBaseRpcController</a>&nbsp;controller,
+<pre>private&nbsp;long&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/RSRpcServices.html#line.3138">getTimeLimit</a>(<a href="../../../../../org/apache/hadoop/hbase/ipc/HBaseRpcController.html" title="interface in org.apache.hadoop.hbase.ipc">HBaseRpcController</a>&nbsp;controller,
                           boolean&nbsp;allowHeartbeatMessages)</pre>
 </li>
 </ul>
@@ -2773,7 +2773,7 @@ private static final&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/jav
 <ul class="blockList">
 <li class="blockList">
 <h4>checkLimitOfRows</h4>
-<pre>private&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/RSRpcServices.html#line.3163">checkLimitOfRows</a>(int&nbsp;numOfCompleteRows,
+<pre>private&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/RSRpcServices.html#line.3165">checkLimitOfRows</a>(int&nbsp;numOfCompleteRows,
                               int&nbsp;limitOfRows,
                               boolean&nbsp;moreRows,
                               <a href="../../../../../org/apache/hadoop/hbase/regionserver/ScannerContext.html" title="class in org.apache.hadoop.hbase.regionserver">ScannerContext</a>&nbsp;scannerContext,
@@ -2786,7 +2786,7 @@ private static final&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/jav
 <ul class="blockList">
 <li class="blockList">
 <h4>scan</h4>
-<pre>private&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/RSRpcServices.html#line.3175">scan</a>(<a href="../../../../../org/apache/hadoop/hbase/ipc/HBaseRpcController.html" title="interface in org.apache.hadoop.hbase.ipc">HBaseRpcController</a>&nbsp;controller,
+<pre>private&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/RSRpcServices.html#line.3177">scan</a>(<a href="../../../../../org/apache/hadoop/hbase/ipc/HBaseRpcController.html" title="interface in org.apache.hadoop.hbase.ipc">HBaseRpcController</a>&nbsp;controller,
                   org.apache.hadoop.hbase.shaded.protobuf.generated.ClientProtos.ScanRequest&nbsp;request,
                   <a href="../../../../../org/apache/hadoop/hbase/regionserver/RSRpcServices.RegionScannerHolder.html" title="class in org.apache.hadoop.hbase.regionserver">RSRpcServices.RegionScannerHolder</a>&nbsp;rsh,
                   long&nbsp;maxQuotaResultSize,
@@ -2809,7 +2809,7 @@ private static final&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/jav
 <ul class="blockList">
 <li class="blockList">
 <h4>scan</h4>
-<pre>public&nbsp;org.apache.hadoop.hbase.shaded.protobuf.generated.ClientProtos.ScanResponse&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/RSRpcServices.html#line.3372">scan</a>(org.apache.hbase.thirdparty.com.google.protobuf.RpcController&nbsp;controller,
+<pre>public&nbsp;org.apache.hadoop.hbase.shaded.protobuf.generated.ClientProtos.ScanResponse&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/RSRpcServices.html#line.3374">scan</a>(org.apache.hbase.thirdparty.com.google.protobuf.RpcController&nbsp;controller,
                                                                                         org.apache.hadoop.hbase.shaded.protobuf.generated.ClientProtos.ScanRequest&nbsp;request)
                                                                                  throws org.apache.hbase.thirdparty.com.google.protobuf.ServiceException</pre>
 <div class="block">Scan data in a table.</div>
@@ -2830,7 +2830,7 @@ private static final&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/jav
 <ul class="blockList">
 <li class="blockList">
 <h4>closeScanner</h4>
-<pre>private&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/RSRpcServices.html#line.3606">closeScanner</a>(<a href="../../../../../org/apache/hadoop/hbase/regionserver/HRegion.html" title="class in org.apache.hadoop.hbase.regionserver">HRegion</a>&nbsp;region,
+<pre>private&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/RSRpcServices.html#line.3608">closeScanner</a>(<a href="../../../../../org/apache/hadoop/hbase/regionserver/HRegion.html" title="class in org.apache.hadoop.hbase.regionserver">HRegion</a>&nbsp;region,
                           <a href="../../../../../org/apache/hadoop/hbase/regionserver/RegionScanner.html" title="interface in org.apache.hadoop.hbase.regionserver">RegionScanner</a>&nbsp;scanner,
                           <a href="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;scannerName,
                           <a href="../../../../../org/apache/hadoop/hbase/ipc/RpcCallContext.html" title="interface in org.apache.hadoop.hbase.ipc">RpcCallContext</a>&nbsp;context)
@@ -2847,7 +2847,7 @@ private static final&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/jav
 <ul class="blockList">
 <li class="blockList">
 <h4>execRegionServerService</h4>
-<pre>public&nbsp;org.apache.hadoop.hbase.shaded.protobuf.generated.ClientProtos.CoprocessorServiceResponse&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/RSRpcServices.html#line.3629">execRegionServerService</a>(org.apache.hbase.thirdparty.com.google.protobuf.RpcController&nbsp;controller,
+<pre>public&nbsp;org.apache.hadoop.hbase.shaded.protobuf.generated.ClientProtos.CoprocessorServiceResponse&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/RSRpcServices.html#line.3631">execRegionServerService</a>(org.apache.hbase.thirdparty.com.google.protobuf.RpcController&nbsp;controller,
                                                                                                                          org.apache.hadoop.hbase.shaded.protobuf.generated.ClientProtos.CoprocessorServiceRequest&nbsp;request)
                                                                                                                   throws org.apache.hbase.thirdparty.com.google.protobuf.ServiceException</pre>
 <dl>
@@ -2864,7 +2864,7 @@ private static final&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/jav
 <ul class="blockList">
 <li class="blockList">
 <h4>updateConfiguration</h4>
-<pre>public&nbsp;org.apache.hadoop.hbase.shaded.protobuf.generated.AdminProtos.UpdateConfigurationResponse&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/RSRpcServices.html#line.3636">updateConfiguration</a>(org.apache.hbase.thirdparty.com.google.protobuf.RpcController&nbsp;controller,
+<pre>public&nbsp;org.apache.hadoop.hbase.shaded.protobuf.generated.AdminProtos.UpdateConfigurationResponse&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/RSRpcServices.html#line.3638">updateConfiguration</a>(org.apache.hbase.thirdparty.com.google.protobuf.RpcController&nbsp;controller,
                                                                                                                      org.apache.hadoop.hbase.shaded.protobuf.generated.AdminProtos.UpdateConfigurationRequest&nbsp;request)
                                                                                                               throws org.apache.hbase.thirdparty.com.google.protobuf.ServiceException</pre>
 <dl>
@@ -2881,7 +2881,7 @@ private static final&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/jav
 <ul class="blockList">
 <li class="blockList">
 <h4>getSpaceQuotaSnapshots</h4>
-<pre>public&nbsp;org.apache.hadoop.hbase.shaded.protobuf.generated.QuotaProtos.GetSpaceQuotaSnapshotsResponse&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/RSRpcServices.html#line.3648">getSpaceQuotaSnapshots</a>(org.apache.hbase.thirdparty.com.google.protobuf.RpcController&nbsp;controller,
+<pre>public&nbsp;org.apache.hadoop.hbase.shaded.protobuf.generated.QuotaProtos.GetSpaceQuotaSnapshotsResponse&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/RSRpcServices.html#line.3650">getSpaceQuotaSnapshots</a>(org.apache.hbase.thirdparty.com.google.protobuf.RpcController&nbsp;controller,
                                                                                                                            org.apache.hadoop.hbase.shaded.protobuf.generated.QuotaProtos.GetSpaceQuotaSnapshotsRequest&nbsp;request)
                                                                                                                     throws org.apache.hbase.thirdparty.com.google.protobuf.ServiceException</pre>
 <dl>
@@ -2898,7 +2898,7 @@ private static final&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/jav
 <ul class="blockList">
 <li class="blockList">
 <h4>clearRegionBlockCache</h4>
-<pre>public&nbsp;org.apache.hadoop.hbase.shaded.protobuf.generated.AdminProtos.ClearRegionBlockCacheResponse&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/RSRpcServices.html#line.3671">clearRegionBlockCache</a>(org.apache.hbase.thirdparty.com.google.protobuf.RpcController&nbsp;controller,
+<pre>public&nbsp;org.apache.hadoop.hbase.shaded.protobuf.generated.AdminProtos.ClearRegionBlockCacheResponse&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/RSRpcServices.html#line.3673">clearRegionBlockCache</a>(org.apache.hbase.thirdparty.com.google.protobuf.RpcController&nbsp;controller,
                                                                                                                          org.apache.hadoop.hbase.shaded.protobuf.generated.AdminProtos.ClearRegionBlockCacheRequest&nbsp;request)</pre>
 <dl>
 <dt><span class="overrideSpecifyLabel">Specified by:</span></dt>
@@ -2912,7 +2912,7 @@ private static final&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/jav
 <ul class="blockList">
 <li class="blockList">
 <h4>executeOpenRegionProcedures</h4>
-<pre>private&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/RSRpcServices.html#line.3688">executeOpenRegionProcedures</a>(org.apache.hadoop.hbase.shaded.protobuf.generated.AdminProtos.OpenRegionRequest&nbsp;request,
+<pre>private&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/RSRpcServices.html#line.3690">executeOpenRegionProcedures</a>(org.apache.hadoop.hbase.shaded.protobuf.generated.AdminProtos.OpenRegionRequest&nbsp;request,
                                          <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/client/TableDescriptor.html" title="interface in org.apache.hadoop.hbase.client">TableDescriptor</a>&gt;&nbsp;tdCache)</pre>
 </li>
 </ul>
@@ -2922,7 +2922,7 @@ private static final&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/jav
 <ul class="blockList">
 <li class="blockList">
 <h4>executeCloseRegionProcedures</h4>
-<pre>private&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/RSRpcServices.html#line.3715">executeCloseRegionProcedures</a>(org.apache.hadoop.hbase.shaded.protobuf.generated.AdminProtos.CloseRegionRequest&nbsp;request)</pre>
+<pre>private&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/RSRpcServices.html#line.3717">executeCloseRegionProcedures</a>(org.apache.hadoop.hbase.shaded.protobuf.generated.AdminProtos.CloseRegionRequest&nbsp;request)</pre>
 </li>
 </ul>
 <a name="executeProcedures-org.apache.hadoop.hbase.shaded.protobuf.generated.AdminProtos.RemoteProcedureRequest-">
@@ -2931,7 +2931,7 @@ private static final&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/jav
 <ul class="blockList">
 <li class="blockList">
 <h4>executeProcedures</h4>
-<pre>private&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/RSRpcServices.html#line.3729">executeProcedures</a>(org.apache.hadoop.hbase.shaded.protobuf.generated.AdminProtos.RemoteProcedureRequest&nbsp;request)</pre>
+<pre>private&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/RSRpcServices.html#line.3731">executeProcedures</a>(org.apache.hadoop.hbase.shaded.protobuf.generated.AdminProtos.RemoteProcedureRequest&nbsp;request)</pre>
 </li>
 </ul>
 <a name="executeProcedures-org.apache.hbase.thirdparty.com.google.protobuf.RpcController-org.apache.hadoop.hbase.shaded.protobuf.generated.AdminProtos.ExecuteProceduresRequest-">
@@ -2940,7 +2940,7 @@ private static final&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/jav
 <ul class="blockList">
 <li class="blockList">
 <h4>executeProcedures</h4>
-<pre>public&nbsp;org.apache.hadoop.hbase.shaded.protobuf.generated.AdminProtos.ExecuteProceduresResponse&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/RSRpcServices.html#line.3744">executeProcedures</a>(org.apache.hbase.thirdparty.com.google.protobuf.RpcController&nbsp;controller,
+<pre>public&nbsp;org.apache.hadoop.hbase.shaded.protobuf.generated.AdminProtos.ExecuteProceduresResponse&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/RSRpcServices.html#line.3746">executeProcedures</a>(org.apache.hbase.thirdparty.com.google.protobuf.RpcController&nbsp;controller,
                                                                                                                  org.apache.hadoop.hbase.shaded.protobuf.generated.AdminProtos.ExecuteProceduresRequest&nbsp;request)
                                                                                                           throws org.apache.hbase.thirdparty.com.google.protobuf.ServiceException</pre>
 <dl>
@@ -2957,7 +2957,7 @@ private static final&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/jav
 <ul class="blockListLast">
 <li class="blockList">
 <h4>getRpcScheduler</h4>
-<pre>public&nbsp;<a href="../../../../../org/apache/hadoop/hbase/ipc/RpcScheduler.html" title="class in org.apache.hadoop.hbase.ipc">RpcScheduler</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/RSRpcServices.html#line.3769">getRpcScheduler</a>()</pre>
+<pre>public&nbsp;<a href="../../../../../org/apache/hadoop/hbase/ipc/RpcScheduler.html" title="class in org.apache.hadoop.hbase.ipc">RpcScheduler</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/RSRpcServices.html#line.3771">getRpcScheduler</a>()</pre>
 </li>
 </ul>
 </li>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/3649682c/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 ea9e804..c9e36aa 100644
--- a/devapidocs/org/apache/hadoop/hbase/regionserver/package-tree.html
+++ b/devapidocs/org/apache/hadoop/hbase/regionserver/package-tree.html
@@ -710,20 +710,20 @@
 <ul>
 <li type="circle">java.lang.<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Enum.html?is-external=true" title="class or interface in java.lang"><span class="typeNameLink">Enum</span></a>&lt;E&gt; (implements java.lang.<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Comparable.html?is-external=true" title="class or interface in java.lang">Comparable</a>&lt;T&gt;, java.io.<a href="https://docs.oracle.com/javase/8/docs/api/java/io/Serializable.html?is-external=true" title="class or interface in java.io">Serializable</a>)
 <ul>
-<li type="circle">org.apache.hadoop.hbase.regionserver.<a href="../../../../../org/apache/hadoop/hbase/regionserver/ScannerContext.NextState.html" title="enum in org.apache.hadoop.hbase.regionserver"><span class="typeNameLink">ScannerContext.NextState</span></a></li>
-<li type="circle">org.apache.hadoop.hbase.regionserver.<a href="../../../../../org/apache/hadoop/hbase/regionserver/DefaultHeapMemoryTuner.StepDirection.html" title="enum in org.apache.hadoop.hbase.regionserver"><span class="typeNameLink">DefaultHeapMemoryTuner.StepDirection</span></a></li>
-<li type="circle">org.apache.hadoop.hbase.regionserver.<a href="../../../../../org/apache/hadoop/hbase/regionserver/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/CompactingMemStore.IndexType.html" title="enum in org.apache.hadoop.hbase.regionserver"><span class="typeNameLink">CompactingMemStore.IndexType</span></a></li>
-<li type="circle">org.apache.hadoop.hbase.regionserver.<a href="../../../../../org/apache/hadoop/hbase/regionserver/MetricsRegionServerSourceFactoryImpl.FactoryStorage.html" title="enum in org.apache.hadoop.hbase.regionserver"><span class="typeNameLink">MetricsRegionServerSourceFactoryImpl.FactoryStorage</span></a></li>
-<li type="circle">org.apache.hadoop.hbase.regionserver.<a href="../../../../../org/apache/hadoop/hbase/regionserver/TimeRangeTracker.Type.html" title="enum in org.apache.hadoop.hbase.regionserver"><span class="typeNameLink">TimeRangeTracker.Type</span></a></li>
-<li type="circle">org.apache.hadoop.hbase.regionserver.<a href="../../../../../org/apache/hadoop/hbase/regionserver/ChunkCreator.ChunkType.html" title="enum in org.apache.hadoop.hbase.regionserver"><span class="typeNameLink">ChunkCreator.ChunkType</span></a></li>
-<li type="circle">org.apache.hadoop.hbase.regionserver.<a href="../../../../../org/apache/hadoop/hbase/regionserver/ScanType.html" title="enum in org.apache.hadoop.hbase.regionserver"><span class="typeNameLink">ScanType</span></a></li>
-<li type="circle">org.apache.hadoop.hbase.regionserver.<a href="../../../../../org/apache/hadoop/hbase/regionserver/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/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/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/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/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/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/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.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/ChunkCreator.ChunkType.html" title="enum in org.apache.hadoop.hbase.regionserver"><span class="typeNameLink">ChunkCreator.ChunkType</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.regionserver.<a href="../../../../../org/apache/hadoop/hbase/regionserver/FlushType.html" title="enum in org.apache.hadoop.hbase.regionserver"><span class="typeNameLink">FlushType</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.regionserver.<a href="../../../../../org/apache/hadoop/hbase/regionserver/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/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/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/TimeRangeTracker.Type.html" title="enum in org.apache.hadoop.hbase.regionserver"><span class="typeNameLink">TimeRangeTracker.Type</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.regionserver.<a href="../../../../../org/apache/hadoop/hbase/regionserver/DefaultHeapMemoryTuner.StepDirection.html" title="enum in org.apache.hadoop.hbase.regionserver"><span class="typeNameLink">DefaultHeapMemoryTuner.StepDirection</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.regionserver.<a href="../../../../../org/apache/hadoop/hbase/regionserver/MemStoreCompactionStrategy.Action.html" title="enum in org.apache.hadoop.hbase.regionserver"><span class="typeNameLink">MemStoreCompactionStrategy.Action</span></a></li>
 </ul>
 </li>
 </ul>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/3649682c/devapidocs/org/apache/hadoop/hbase/regionserver/querymatcher/package-tree.html
----------------------------------------------------------------------
diff --git a/devapidocs/org/apache/hadoop/hbase/regionserver/querymatcher/package-tree.html b/devapidocs/org/apache/hadoop/hbase/regionserver/querymatcher/package-tree.html
index 6851ee1..2731576 100644
--- a/devapidocs/org/apache/hadoop/hbase/regionserver/querymatcher/package-tree.html
+++ b/devapidocs/org/apache/hadoop/hbase/regionserver/querymatcher/package-tree.html
@@ -130,8 +130,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.regionserver.querymatcher.<a href="../../../../../../org/apache/hadoop/hbase/regionserver/querymatcher/DeleteTracker.DeleteResult.html" title="enum in org.apache.hadoop.hbase.regionserver.querymatcher"><span class="typeNameLink">DeleteTracker.DeleteResult</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.regionserver.querymatcher.<a href="../../../../../../org/apache/hadoop/hbase/regionserver/querymatcher/ScanQueryMatcher.MatchCode.html" title="enum in org.apache.hadoop.hbase.regionserver.querymatcher"><span class="typeNameLink">ScanQueryMatcher.MatchCode</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.regionserver.querymatcher.<a href="../../../../../../org/apache/hadoop/hbase/regionserver/querymatcher/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>
 </ul>
 </li>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/3649682c/devapidocs/org/apache/hadoop/hbase/regionserver/wal/package-tree.html
----------------------------------------------------------------------
diff --git a/devapidocs/org/apache/hadoop/hbase/regionserver/wal/package-tree.html b/devapidocs/org/apache/hadoop/hbase/regionserver/wal/package-tree.html
index e8df157..f0c55c8 100644
--- a/devapidocs/org/apache/hadoop/hbase/regionserver/wal/package-tree.html
+++ b/devapidocs/org/apache/hadoop/hbase/regionserver/wal/package-tree.html
@@ -247,8 +247,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.regionserver.wal.<a href="../../../../../../org/apache/hadoop/hbase/regionserver/wal/CompressionContext.DictionaryIndex.html" title="enum in org.apache.hadoop.hbase.regionserver.wal"><span class="typeNameLink">CompressionContext.DictionaryIndex</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.regionserver.wal.<a href="../../../../../../org/apache/hadoop/hbase/regionserver/wal/RingBufferTruck.Type.html" title="enum in org.apache.hadoop.hbase.regionserver.wal"><span class="typeNameLink">RingBufferTruck.Type</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.regionserver.wal.<a href="../../../../../../org/apache/hadoop/hbase/regionserver/wal/CompressionContext.DictionaryIndex.html" title="enum in org.apache.hadoop.hbase.regionserver.wal"><span class="typeNameLink">CompressionContext.DictionaryIndex</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.regionserver.wal.<a href="../../../../../../org/apache/hadoop/hbase/regionserver/wal/ProtobufLogReader.WALHdrResult.html" title="enum in org.apache.hadoop.hbase.regionserver.wal"><span class="typeNameLink">ProtobufLogReader.WALHdrResult</span></a></li>
 </ul>
 </li>

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

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

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/3649682c/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 5059fa9..3cf0d08 100644
--- a/devapidocs/org/apache/hadoop/hbase/rsgroup/RSGroupBasedLoadBalancer.html
+++ b/devapidocs/org/apache/hadoop/hbase/rsgroup/RSGroupBasedLoadBalancer.html
@@ -372,7 +372,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/rsgroup/RSGroupableBa
 <!--   -->
 </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#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></code></li>
+<code><a href="../../../../../org/apache/hadoop/hbase/master/LoadBalancer.html#isMasterCanHostUserRegions-org.apache.hadoop.conf.Configuration-">isMasterCanHostUserRegions</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></code></li>
 </ul>
 </li>
 </ul>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/3649682c/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 661b41f..fb808bb 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#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>, <a href="../../../../../org/apache/hadoop/hbase/master/LoadBalancer.html#updateBalancerStatus-boolean-">updateBalancerStatus</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#isMasterCanHostUserRegions-org.apache.hadoop.conf.Configuration-">isMasterCanHostUserRegions</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--">postMasterStartupInitialize</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/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>, <a href="../../../../../org/apache/hadoop/hbase/master/LoadBalancer.html#updateBalancerStatus-boolean-">updateBalancerStatus</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/3649682c/devapidocs/org/apache/hadoop/hbase/security/access/package-tree.html
----------------------------------------------------------------------
diff --git a/devapidocs/org/apache/hadoop/hbase/security/access/package-tree.html b/devapidocs/org/apache/hadoop/hbase/security/access/package-tree.html
index 69f2dc6..f594c43 100644
--- a/devapidocs/org/apache/hadoop/hbase/security/access/package-tree.html
+++ b/devapidocs/org/apache/hadoop/hbase/security/access/package-tree.html
@@ -143,8 +143,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.security.access.<a href="../../../../../../org/apache/hadoop/hbase/security/access/Permission.Action.html" title="enum in org.apache.hadoop.hbase.security.access"><span class="typeNameLink">Permission.Action</span></a></li>
-<li type="circle">org.apache.hadoop.hbase.security.access.<a href="../../../../../../org/apache/hadoop/hbase/security/access/AccessController.OpType.html" title="enum in org.apache.hadoop.hbase.security.access"><span class="typeNameLink">AccessController.OpType</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.security.access.<a href="../../../../../../org/apache/hadoop/hbase/security/access/AccessControlFilter.Strategy.html" title="enum in org.apache.hadoop.hbase.security.access"><span class="typeNameLink">AccessControlFilter.Strategy</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.security.access.<a href="../../../../../../org/apache/hadoop/hbase/security/access/AccessController.OpType.html" title="enum in org.apache.hadoop.hbase.security.access"><span class="typeNameLink">AccessController.OpType</span></a></li>
 </ul>
 </li>
 </ul>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/3649682c/devapidocs/org/apache/hadoop/hbase/thrift/package-tree.html
----------------------------------------------------------------------
diff --git a/devapidocs/org/apache/hadoop/hbase/thrift/package-tree.html b/devapidocs/org/apache/hadoop/hbase/thrift/package-tree.html
index 81a90a9..03e1383 100644
--- a/devapidocs/org/apache/hadoop/hbase/thrift/package-tree.html
+++ b/devapidocs/org/apache/hadoop/hbase/thrift/package-tree.html
@@ -200,8 +200,8 @@
 <li type="circle">java.lang.<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Enum.html?is-external=true" title="class or interface in java.lang"><span class="typeNameLink">Enum</span></a>&lt;E&gt; (implements java.lang.<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Comparable.html?is-external=true" title="class or interface in java.lang">Comparable</a>&lt;T&gt;, java.io.<a href="https://docs.oracle.com/javase/8/docs/api/java/io/Serializable.html?is-external=true" title="class or interface in java.io">Serializable</a>)
 <ul>
 <li type="circle">org.apache.hadoop.hbase.thrift.<a href="../../../../../org/apache/hadoop/hbase/thrift/MetricsThriftServerSourceFactoryImpl.FactoryStorage.html" title="enum in org.apache.hadoop.hbase.thrift"><span class="typeNameLink">MetricsThriftServerSourceFactoryImpl.FactoryStorage</span></a></li>
-<li type="circle">org.apache.hadoop.hbase.thrift.<a href="../../../../../org/apache/hadoop/hbase/thrift/ThriftServerRunner.ImplType.html" title="enum in org.apache.hadoop.hbase.thrift"><span class="typeNameLink">ThriftServerRunner.ImplType</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.thrift.<a href="../../../../../org/apache/hadoop/hbase/thrift/ThriftMetrics.ThriftServerType.html" title="enum in org.apache.hadoop.hbase.thrift"><span class="typeNameLink">ThriftMetrics.ThriftServerType</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.thrift.<a href="../../../../../org/apache/hadoop/hbase/thrift/ThriftServerRunner.ImplType.html" title="enum in org.apache.hadoop.hbase.thrift"><span class="typeNameLink">ThriftServerRunner.ImplType</span></a></li>
 </ul>
 </li>
 </ul>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/3649682c/devapidocs/org/apache/hadoop/hbase/util/IdLock.html
----------------------------------------------------------------------
diff --git a/devapidocs/org/apache/hadoop/hbase/util/IdLock.html b/devapidocs/org/apache/hadoop/hbase/util/IdLock.html
index ebae49c..d6163a2 100644
--- a/devapidocs/org/apache/hadoop/hbase/util/IdLock.html
+++ b/devapidocs/org/apache/hadoop/hbase/util/IdLock.html
@@ -311,7 +311,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>tryLockEntry</h4>
-<pre>public&nbsp;<a href="../../../../../org/apache/hadoop/hbase/util/IdLock.Entry.html" title="class in org.apache.hadoop.hbase.util">IdLock.Entry</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/util/IdLock.html#line.110">tryLockEntry</a>(long&nbsp;id,
+<pre>public&nbsp;<a href="../../../../../org/apache/hadoop/hbase/util/IdLock.Entry.html" title="class in org.apache.hadoop.hbase.util">IdLock.Entry</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/util/IdLock.html#line.121">tryLockEntry</a>(long&nbsp;id,
                                  long&nbsp;time)
                           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">Blocks until the lock corresponding to the given id is acquired.</div>
@@ -333,7 +333,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>releaseLockEntry</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/util/IdLock.html#line.161">releaseLockEntry</a>(<a href="../../../../../org/apache/hadoop/hbase/util/IdLock.Entry.html" title="class in org.apache.hadoop.hbase.util">IdLock.Entry</a>&nbsp;entry)</pre>
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/util/IdLock.html#line.178">releaseLockEntry</a>(<a href="../../../../../org/apache/hadoop/hbase/util/IdLock.Entry.html" title="class in org.apache.hadoop.hbase.util">IdLock.Entry</a>&nbsp;entry)</pre>
 <div class="block">Must be called in a finally block to decrease the internal counter and
  remove the monitor object for the given id if the caller is the last
  client.</div>
@@ -349,7 +349,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>assertMapEmpty</h4>
-<pre>void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/util/IdLock.html#line.173">assertMapEmpty</a>()</pre>
+<pre>void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/util/IdLock.html#line.190">assertMapEmpty</a>()</pre>
 <div class="block">For testing</div>
 </li>
 </ul>
@@ -359,7 +359,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockListLast">
 <li class="blockList">
 <h4>waitForWaiters</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/util/IdLock.html#line.178">waitForWaiters</a>(long&nbsp;id,
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/util/IdLock.html#line.195">waitForWaiters</a>(long&nbsp;id,
                            int&nbsp;numWaiters)
                     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>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/3649682c/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 89dc634..5af3b1a 100644
--- a/devapidocs/org/apache/hadoop/hbase/util/package-tree.html
+++ b/devapidocs/org/apache/hadoop/hbase/util/package-tree.html
@@ -541,13 +541,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/Bytes.LexicographicalComparerHolder.UnsafeComparer.html" title="enum in org.apache.hadoop.hbase.util"><span class="typeNameLink">Bytes.LexicographicalComparerHolder.UnsafeComparer</span></a> (implements org.apache.hadoop.hbase.util.<a href="../../../../../org/apache/hadoop/hbase/util/Bytes.Comparer.html" title="interface in org.apache.hadoop.hbase.util">Bytes.Comparer</a>&lt;T&gt;)</li>
-<li type="circle">org.apache.hadoop.hbase.util.<a href="../../../../../org/apache/hadoop/hbase/util/IdReadWriteLock.ReferenceType.html" title="enum in org.apache.hadoop.hbase.util"><span class="typeNameLink">IdReadWriteLock.ReferenceType</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.util.<a href="../../../../../org/apache/hadoop/hbase/util/PrettyPrinter.Unit.html" title="enum in org.apache.hadoop.hbase.util"><span class="typeNameLink">PrettyPrinter.Unit</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.util.<a href="../../../../../org/apache/hadoop/hbase/util/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/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/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/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/PoolMap.PoolType.html" title="enum in org.apache.hadoop.hbase.util"><span class="typeNameLink">PoolMap.PoolType</span></a></li>
-<li type="circle">org.apache.hadoop.hbase.util.<a href="../../../../../org/apache/hadoop/hbase/util/PrettyPrinter.Unit.html" title="enum in org.apache.hadoop.hbase.util"><span class="typeNameLink">PrettyPrinter.Unit</span></a></li>
-<li type="circle">org.apache.hadoop.hbase.util.<a href="../../../../../org/apache/hadoop/hbase/util/ChecksumType.html" title="enum in org.apache.hadoop.hbase.util"><span class="typeNameLink">ChecksumType</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.util.<a href="../../../../../org/apache/hadoop/hbase/util/IdReadWriteLock.ReferenceType.html" title="enum in org.apache.hadoop.hbase.util"><span class="typeNameLink">IdReadWriteLock.ReferenceType</span></a></li>
 </ul>
 </li>
 </ul>

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

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/3649682c/devapidocs/org/apache/hadoop/hbase/zookeeper/MasterMaintenanceModeTracker.html
----------------------------------------------------------------------
diff --git a/devapidocs/org/apache/hadoop/hbase/zookeeper/MasterMaintenanceModeTracker.html b/devapidocs/org/apache/hadoop/hbase/zookeeper/MasterMaintenanceModeTracker.html
index 9d30629..f64b6ff 100644
--- a/devapidocs/org/apache/hadoop/hbase/zookeeper/MasterMaintenanceModeTracker.html
+++ b/devapidocs/org/apache/hadoop/hbase/zookeeper/MasterMaintenanceModeTracker.html
@@ -115,9 +115,13 @@ var activeTableTab = "activeTableTab";
 <hr>
 <br>
 <pre>@InterfaceAudience.Private
-public class <a href="../../../../../src-html/org/apache/hadoop/hbase/zookeeper/MasterMaintenanceModeTracker.html#line.30">MasterMaintenanceModeTracker</a>
+public class <a href="../../../../../src-html/org/apache/hadoop/hbase/zookeeper/MasterMaintenanceModeTracker.html#line.34">MasterMaintenanceModeTracker</a>
 extends <a href="../../../../../org/apache/hadoop/hbase/zookeeper/ZKListener.html" title="class in org.apache.hadoop.hbase.zookeeper">ZKListener</a></pre>
-<div class="block">Tracks the master Maintenance Mode via ZK.</div>
+<div class="block">Tracks the master Maintenance Mode via ZK.
+
+ Unused. Used to be set by hbck to prevent concurrent splits/merges, but those use PV2 now and
+ HBCK2 uses it's own service, so no longer an issue. Left in, in case we need to use this for
+ the incomplete parts of HBCK2...</div>
 </li>
 </ul>
 </div>
@@ -250,7 +254,7 @@ extends <a href="../../../../../org/apache/hadoop/hbase/zookeeper/ZKListener.htm
 <ul class="blockListLast">
 <li class="blockList">
 <h4>hasChildren</h4>
-<pre>private&nbsp;boolean <a href="../../../../../src-html/org/apache/hadoop/hbase/zookeeper/MasterMaintenanceModeTracker.html#line.31">hasChildren</a></pre>
+<pre>private&nbsp;boolean <a href="../../../../../src-html/org/apache/hadoop/hbase/zookeeper/MasterMaintenanceModeTracker.html#line.35">hasChildren</a></pre>
 </li>
 </ul>
 </li>
@@ -267,7 +271,7 @@ extends <a href="../../../../../org/apache/hadoop/hbase/zookeeper/ZKListener.htm
 <ul class="blockListLast">
 <li class="blockList">
 <h4>MasterMaintenanceModeTracker</h4>
-<pre>public&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/zookeeper/MasterMaintenanceModeTracker.html#line.33">MasterMaintenanceModeTracker</a>(<a href="../../../../../org/apache/hadoop/hbase/zookeeper/ZKWatcher.html" title="class in org.apache.hadoop.hbase.zookeeper">ZKWatcher</a>&nbsp;watcher)</pre>
+<pre>public&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/zookeeper/MasterMaintenanceModeTracker.html#line.37">MasterMaintenanceModeTracker</a>(<a href="../../../../../org/apache/hadoop/hbase/zookeeper/ZKWatcher.html" title="class in org.apache.hadoop.hbase.zookeeper">ZKWatcher</a>&nbsp;watcher)</pre>
 </li>
 </ul>
 </li>
@@ -284,7 +288,7 @@ extends <a href="../../../../../org/apache/hadoop/hbase/zookeeper/ZKListener.htm
 <ul class="blockList">
 <li class="blockList">
 <h4>isInMaintenanceMode</h4>
-<pre>public&nbsp;boolean&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/zookeeper/MasterMaintenanceModeTracker.html#line.38">isInMaintenanceMode</a>()</pre>
+<pre>public&nbsp;boolean&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/zookeeper/MasterMaintenanceModeTracker.html#line.42">isInMaintenanceMode</a>()</pre>
 </li>
 </ul>
 <a name="update-java.lang.String-">
@@ -293,7 +297,7 @@ extends <a href="../../../../../org/apache/hadoop/hbase/zookeeper/ZKListener.htm
 <ul class="blockList">
 <li class="blockList">
 <h4>update</h4>
-<pre>private&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/zookeeper/MasterMaintenanceModeTracker.html#line.42">update</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;path)</pre>
+<pre>private&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/zookeeper/MasterMaintenanceModeTracker.html#line.46">update</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;path)</pre>
 </li>
 </ul>
 <a name="update--">
@@ -302,7 +306,7 @@ extends <a href="../../../../../org/apache/hadoop/hbase/zookeeper/ZKListener.htm
 <ul class="blockList">
 <li class="blockList">
 <h4>update</h4>
-<pre>private&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/zookeeper/MasterMaintenanceModeTracker.html#line.48">update</a>()</pre>
+<pre>private&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/zookeeper/MasterMaintenanceModeTracker.html#line.52">update</a>()</pre>
 </li>
 </ul>
 <a name="start--">
@@ -311,7 +315,7 @@ extends <a href="../../../../../org/apache/hadoop/hbase/zookeeper/ZKListener.htm
 <ul class="blockList">
 <li class="blockList">
 <h4>start</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/zookeeper/MasterMaintenanceModeTracker.html#line.63">start</a>()</pre>
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/zookeeper/MasterMaintenanceModeTracker.html#line.67">start</a>()</pre>
 <div class="block">Starts the tracking of whether master is in Maintenance Mode.</div>
 </li>
 </ul>
@@ -321,7 +325,7 @@ extends <a href="../../../../../org/apache/hadoop/hbase/zookeeper/ZKListener.htm
 <ul class="blockList">
 <li class="blockList">
 <h4>nodeCreated</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/zookeeper/MasterMaintenanceModeTracker.html#line.69">nodeCreated</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;path)</pre>
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/zookeeper/MasterMaintenanceModeTracker.html#line.73">nodeCreated</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;path)</pre>
 <div class="block"><span class="descfrmTypeLabel">Description copied from class:&nbsp;<code><a href="../../../../../org/apache/hadoop/hbase/zookeeper/ZKListener.html#nodeCreated-java.lang.String-">ZKListener</a></code></span></div>
 <div class="block">Called when a new node has been created.</div>
 <dl>
@@ -338,7 +342,7 @@ extends <a href="../../../../../org/apache/hadoop/hbase/zookeeper/ZKListener.htm
 <ul class="blockList">
 <li class="blockList">
 <h4>nodeDeleted</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/zookeeper/MasterMaintenanceModeTracker.html#line.74">nodeDeleted</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;path)</pre>
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/zookeeper/MasterMaintenanceModeTracker.html#line.78">nodeDeleted</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;path)</pre>
 <div class="block"><span class="descfrmTypeLabel">Description copied from class:&nbsp;<code><a href="../../../../../org/apache/hadoop/hbase/zookeeper/ZKListener.html#nodeDeleted-java.lang.String-">ZKListener</a></code></span></div>
 <div class="block">Called when a node has been deleted</div>
 <dl>
@@ -355,7 +359,7 @@ extends <a href="../../../../../org/apache/hadoop/hbase/zookeeper/ZKListener.htm
 <ul class="blockListLast">
 <li class="blockList">
 <h4>nodeChildrenChanged</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/zookeeper/MasterMaintenanceModeTracker.html#line.79">nodeChildrenChanged</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;path)</pre>
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/zookeeper/MasterMaintenanceModeTracker.html#line.83">nodeChildrenChanged</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;path)</pre>
 <div class="block"><span class="descfrmTypeLabel">Description copied from class:&nbsp;<code><a href="../../../../../org/apache/hadoop/hbase/zookeeper/ZKListener.html#nodeChildrenChanged-java.lang.String-">ZKListener</a></code></span></div>
 <div class="block">Called when an existing node has a child node added or removed.</div>
 <dl>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/3649682c/devapidocs/org/apache/hadoop/hbase/zookeeper/class-use/MasterMaintenanceModeTracker.html
----------------------------------------------------------------------
diff --git a/devapidocs/org/apache/hadoop/hbase/zookeeper/class-use/MasterMaintenanceModeTracker.html b/devapidocs/org/apache/hadoop/hbase/zookeeper/class-use/MasterMaintenanceModeTracker.html
index 7a11dc9..5056df6 100644
--- a/devapidocs/org/apache/hadoop/hbase/zookeeper/class-use/MasterMaintenanceModeTracker.html
+++ b/devapidocs/org/apache/hadoop/hbase/zookeeper/class-use/MasterMaintenanceModeTracker.html
@@ -72,47 +72,7 @@
 <div class="header">
 <h2 title="Uses of Class org.apache.hadoop.hbase.zookeeper.MasterMaintenanceModeTracker" class="title">Uses of Class<br>org.apache.hadoop.hbase.zookeeper.MasterMaintenanceModeTracker</h2>
 </div>
-<div class="classUseContainer">
-<ul class="blockList">
-<li class="blockList">
-<table class="useSummary" border="0" cellpadding="3" cellspacing="0" summary="Use table, listing packages, and an explanation">
-<caption><span>Packages that use <a href="../../../../../../org/apache/hadoop/hbase/zookeeper/MasterMaintenanceModeTracker.html" title="class in org.apache.hadoop.hbase.zookeeper">MasterMaintenanceModeTracker</a></span><span class="tabEnd">&nbsp;</span></caption>
-<tr>
-<th class="colFirst" scope="col">Package</th>
-<th class="colLast" scope="col">Description</th>
-</tr>
-<tbody>
-<tr class="altColor">
-<td class="colFirst"><a href="#org.apache.hadoop.hbase.master">org.apache.hadoop.hbase.master</a></td>
-<td class="colLast">&nbsp;</td>
-</tr>
-</tbody>
-</table>
-</li>
-<li class="blockList">
-<ul class="blockList">
-<li class="blockList"><a name="org.apache.hadoop.hbase.master">
-<!--   -->
-</a>
-<h3>Uses of <a href="../../../../../../org/apache/hadoop/hbase/zookeeper/MasterMaintenanceModeTracker.html" title="class in org.apache.hadoop.hbase.zookeeper">MasterMaintenanceModeTracker</a> in <a href="../../../../../../org/apache/hadoop/hbase/master/package-summary.html">org.apache.hadoop.hbase.master</a></h3>
-<table class="useSummary" border="0" cellpadding="3" cellspacing="0" summary="Use table, listing fields, and an explanation">
-<caption><span>Fields in <a href="../../../../../../org/apache/hadoop/hbase/master/package-summary.html">org.apache.hadoop.hbase.master</a> declared as <a href="../../../../../../org/apache/hadoop/hbase/zookeeper/MasterMaintenanceModeTracker.html" title="class in org.apache.hadoop.hbase.zookeeper">MasterMaintenanceModeTracker</a></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>
-<tbody>
-<tr class="altColor">
-<td class="colFirst"><code>private <a href="../../../../../../org/apache/hadoop/hbase/zookeeper/MasterMaintenanceModeTracker.html" title="class in org.apache.hadoop.hbase.zookeeper">MasterMaintenanceModeTracker</a></code></td>
-<td class="colLast"><span class="typeNameLabel">HMaster.</span><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/master/HMaster.html#maintenanceModeTracker">maintenanceModeTracker</a></span></code>&nbsp;</td>
-</tr>
-</tbody>
-</table>
-</li>
-</ul>
-</li>
-</ul>
-</div>
+<div class="classUseContainer">No usage of org.apache.hadoop.hbase.zookeeper.MasterMaintenanceModeTracker</div>
 <!-- ======= START OF BOTTOM NAVBAR ====== -->
 <div class="bottomNav"><a name="navbar.bottom">
 <!--   -->

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/3649682c/devapidocs/org/apache/hadoop/hbase/zookeeper/package-use.html
----------------------------------------------------------------------
diff --git a/devapidocs/org/apache/hadoop/hbase/zookeeper/package-use.html b/devapidocs/org/apache/hadoop/hbase/zookeeper/package-use.html
index 89accc8..1ff3981 100644
--- a/devapidocs/org/apache/hadoop/hbase/zookeeper/package-use.html
+++ b/devapidocs/org/apache/hadoop/hbase/zookeeper/package-use.html
@@ -281,31 +281,26 @@
 </td>
 </tr>
 <tr class="rowColor">
-<td class="colOne"><a href="../../../../../org/apache/hadoop/hbase/zookeeper/class-use/MasterMaintenanceModeTracker.html#org.apache.hadoop.hbase.master">MasterMaintenanceModeTracker</a>
-<div class="block">Tracks the master Maintenance Mode via ZK.</div>
-</td>
-</tr>
-<tr class="altColor">
 <td class="colOne"><a href="../../../../../org/apache/hadoop/hbase/zookeeper/class-use/MiniZooKeeperCluster.html#org.apache.hadoop.hbase.master">MiniZooKeeperCluster</a>
 <div class="block">TODO: Most of the code in this class is ripped from ZooKeeper tests.</div>
 </td>
 </tr>
-<tr class="rowColor">
+<tr class="altColor">
 <td class="colOne"><a href="../../../../../org/apache/hadoop/hbase/zookeeper/class-use/RegionNormalizerTracker.html#org.apache.hadoop.hbase.master">RegionNormalizerTracker</a>
 <div class="block">Tracks region normalizer state up in ZK</div>
 </td>
 </tr>
-<tr class="altColor">
+<tr class="rowColor">
 <td class="colOne"><a href="../../../../../org/apache/hadoop/hbase/zookeeper/class-use/ZKListener.html#org.apache.hadoop.hbase.master">ZKListener</a>
 <div class="block">Base class for internal listeners of ZooKeeper events.</div>
 </td>
 </tr>
-<tr class="rowColor">
+<tr class="altColor">
 <td class="colOne"><a href="../../../../../org/apache/hadoop/hbase/zookeeper/class-use/ZKNodeTracker.html#org.apache.hadoop.hbase.master">ZKNodeTracker</a>
 <div class="block">Tracks the availability and value of a single ZooKeeper node.</div>
 </td>
 </tr>
-<tr class="altColor">
+<tr class="rowColor">
 <td class="colOne"><a href="../../../../../org/apache/hadoop/hbase/zookeeper/class-use/ZKWatcher.html#org.apache.hadoop.hbase.master">ZKWatcher</a>
 <div class="block">Acts as the single ZooKeeper Watcher.</div>
 </td>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/3649682c/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 edddfa3..044374d 100644
--- a/devapidocs/src-html/org/apache/hadoop/hbase/Version.html
+++ b/devapidocs/src-html/org/apache/hadoop/hbase/Version.html
@@ -18,9 +18,9 @@
 <span class="sourceLineNo">010</span>  public static final String version = "3.0.0-SNAPSHOT";<a name="line.10"></a>
 <span class="sourceLineNo">011</span>  public static final String revision = "";<a name="line.11"></a>
 <span class="sourceLineNo">012</span>  public static final String user = "jenkins";<a name="line.12"></a>
-<span class="sourceLineNo">013</span>  public static final String date = "Thu Oct 18 14:45:14 UTC 2018";<a name="line.13"></a>
+<span class="sourceLineNo">013</span>  public static final String date = "Fri Oct 19 14:44:21 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 = "30708e3bbe5d7ba352acafec60c82407";<a name="line.15"></a>
+<span class="sourceLineNo">015</span>  public static final String srcChecksum = "c51cc8d717ab9de60f9aa01fa53257c3";<a name="line.15"></a>
 <span class="sourceLineNo">016</span>}<a name="line.16"></a>
 
 


[22/46] hbase-site git commit: Published site at 05d22ed960204183fbd9bd16f1dbca6410ccde76.

Posted by gi...@apache.org.
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/3649682c/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 c307d41..d82bfd8 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
@@ -1020,8 +1020,8 @@
 <span class="sourceLineNo">1012</span>  protected ClusterMetrics clusterStatus = null;<a name="line.1012"></a>
 <span class="sourceLineNo">1013</span>  protected ServerName masterServerName;<a name="line.1013"></a>
 <span class="sourceLineNo">1014</span>  protected MasterServices services;<a name="line.1014"></a>
-<span class="sourceLineNo">1015</span>  protected boolean tablesOnMaster;<a name="line.1015"></a>
-<span class="sourceLineNo">1016</span>  protected boolean onlySystemTablesOnMaster;<a name="line.1016"></a>
+<span class="sourceLineNo">1015</span>  protected boolean onlySystemTablesOnMaster;<a name="line.1015"></a>
+<span class="sourceLineNo">1016</span>  protected boolean maintenanceMode;<a name="line.1016"></a>
 <span class="sourceLineNo">1017</span><a name="line.1017"></a>
 <span class="sourceLineNo">1018</span>  @Override<a name="line.1018"></a>
 <span class="sourceLineNo">1019</span>  public void setConf(Configuration conf) {<a name="line.1019"></a>
@@ -1033,627 +1033,626 @@
 <span class="sourceLineNo">1025</span>    if (overallSlop &lt; 0) overallSlop = 0;<a name="line.1025"></a>
 <span class="sourceLineNo">1026</span>    else if (overallSlop &gt; 1) overallSlop = 1;<a name="line.1026"></a>
 <span class="sourceLineNo">1027</span><a name="line.1027"></a>
-<span class="sourceLineNo">1028</span>    this.tablesOnMaster = LoadBalancer.isTablesOnMaster(this.config);<a name="line.1028"></a>
-<span class="sourceLineNo">1029</span>    this.onlySystemTablesOnMaster = LoadBalancer.isSystemTablesOnlyOnMaster(this.config);<a name="line.1029"></a>
-<span class="sourceLineNo">1030</span>    // If system tables on master, implies tablesOnMaster = true.<a name="line.1030"></a>
-<span class="sourceLineNo">1031</span>    if (this.onlySystemTablesOnMaster &amp;&amp; !this.tablesOnMaster) {<a name="line.1031"></a>
-<span class="sourceLineNo">1032</span>      LOG.warn("Set " + TABLES_ON_MASTER + "=true because " + SYSTEM_TABLES_ON_MASTER + "=true");<a name="line.1032"></a>
-<span class="sourceLineNo">1033</span>      this.tablesOnMaster = true;<a name="line.1033"></a>
-<span class="sourceLineNo">1034</span>    }<a name="line.1034"></a>
-<span class="sourceLineNo">1035</span>    this.rackManager = new RackManager(getConf());<a name="line.1035"></a>
-<span class="sourceLineNo">1036</span>    if (useRegionFinder) {<a name="line.1036"></a>
-<span class="sourceLineNo">1037</span>      regionFinder.setConf(conf);<a name="line.1037"></a>
-<span class="sourceLineNo">1038</span>    }<a name="line.1038"></a>
-<span class="sourceLineNo">1039</span>    // Print out base configs. Don't print overallSlop since it for simple balancer exclusively.<a name="line.1039"></a>
-<span class="sourceLineNo">1040</span>    LOG.info("slop=" + this.slop + ", tablesOnMaster=" + this.tablesOnMaster +<a name="line.1040"></a>
-<span class="sourceLineNo">1041</span>      ", systemTablesOnMaster=" + this.onlySystemTablesOnMaster);<a name="line.1041"></a>
+<span class="sourceLineNo">1028</span>    this.onlySystemTablesOnMaster = LoadBalancer.isSystemTablesOnlyOnMaster(this.config);<a name="line.1028"></a>
+<span class="sourceLineNo">1029</span><a name="line.1029"></a>
+<span class="sourceLineNo">1030</span>    this.rackManager = new RackManager(getConf());<a name="line.1030"></a>
+<span class="sourceLineNo">1031</span>    if (useRegionFinder) {<a name="line.1031"></a>
+<span class="sourceLineNo">1032</span>      regionFinder.setConf(conf);<a name="line.1032"></a>
+<span class="sourceLineNo">1033</span>    }<a name="line.1033"></a>
+<span class="sourceLineNo">1034</span>    // Print out base configs. Don't print overallSlop since it for simple balancer exclusively.<a name="line.1034"></a>
+<span class="sourceLineNo">1035</span>    LOG.info("slop={}, systemTablesOnMaster={}",<a name="line.1035"></a>
+<span class="sourceLineNo">1036</span>        this.slop, this.onlySystemTablesOnMaster);<a name="line.1036"></a>
+<span class="sourceLineNo">1037</span>  }<a name="line.1037"></a>
+<span class="sourceLineNo">1038</span><a name="line.1038"></a>
+<span class="sourceLineNo">1039</span>  protected void setSlop(Configuration conf) {<a name="line.1039"></a>
+<span class="sourceLineNo">1040</span>    this.slop = conf.getFloat("hbase.regions.slop", (float) 0.2);<a name="line.1040"></a>
+<span class="sourceLineNo">1041</span>    this.overallSlop = conf.getFloat("hbase.regions.overallSlop", slop);<a name="line.1041"></a>
 <span class="sourceLineNo">1042</span>  }<a name="line.1042"></a>
 <span class="sourceLineNo">1043</span><a name="line.1043"></a>
-<span class="sourceLineNo">1044</span>  protected void setSlop(Configuration conf) {<a name="line.1044"></a>
-<span class="sourceLineNo">1045</span>    this.slop = conf.getFloat("hbase.regions.slop", (float) 0.2);<a name="line.1045"></a>
-<span class="sourceLineNo">1046</span>    this.overallSlop = conf.getFloat("hbase.regions.overallSlop", slop);<a name="line.1046"></a>
-<span class="sourceLineNo">1047</span>  }<a name="line.1047"></a>
-<span class="sourceLineNo">1048</span><a name="line.1048"></a>
-<span class="sourceLineNo">1049</span>  /**<a name="line.1049"></a>
-<span class="sourceLineNo">1050</span>   * Check if a region belongs to some system table.<a name="line.1050"></a>
-<span class="sourceLineNo">1051</span>   * If so, the primary replica may be expected to be put on the master regionserver.<a name="line.1051"></a>
-<span class="sourceLineNo">1052</span>   */<a name="line.1052"></a>
-<span class="sourceLineNo">1053</span>  public boolean shouldBeOnMaster(RegionInfo region) {<a name="line.1053"></a>
-<span class="sourceLineNo">1054</span>    return this.onlySystemTablesOnMaster &amp;&amp; region.getTable().isSystemTable();<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>   * Balance the regions that should be on master regionserver.<a name="line.1058"></a>
-<span class="sourceLineNo">1059</span>   */<a name="line.1059"></a>
-<span class="sourceLineNo">1060</span>  protected List&lt;RegionPlan&gt; balanceMasterRegions(Map&lt;ServerName, List&lt;RegionInfo&gt;&gt; clusterMap) {<a name="line.1060"></a>
-<span class="sourceLineNo">1061</span>    if (masterServerName == null || clusterMap == null || clusterMap.size() &lt;= 1) return null;<a name="line.1061"></a>
-<span class="sourceLineNo">1062</span>    List&lt;RegionPlan&gt; plans = null;<a name="line.1062"></a>
-<span class="sourceLineNo">1063</span>    List&lt;RegionInfo&gt; regions = clusterMap.get(masterServerName);<a name="line.1063"></a>
-<span class="sourceLineNo">1064</span>    if (regions != null) {<a name="line.1064"></a>
-<span class="sourceLineNo">1065</span>      Iterator&lt;ServerName&gt; keyIt = null;<a name="line.1065"></a>
-<span class="sourceLineNo">1066</span>      for (RegionInfo region: regions) {<a name="line.1066"></a>
-<span class="sourceLineNo">1067</span>        if (shouldBeOnMaster(region)) continue;<a name="line.1067"></a>
-<span class="sourceLineNo">1068</span><a name="line.1068"></a>
-<span class="sourceLineNo">1069</span>        // Find a non-master regionserver to host the region<a name="line.1069"></a>
-<span class="sourceLineNo">1070</span>        if (keyIt == null || !keyIt.hasNext()) {<a name="line.1070"></a>
-<span class="sourceLineNo">1071</span>          keyIt = clusterMap.keySet().iterator();<a name="line.1071"></a>
-<span class="sourceLineNo">1072</span>        }<a name="line.1072"></a>
-<span class="sourceLineNo">1073</span>        ServerName dest = keyIt.next();<a name="line.1073"></a>
-<span class="sourceLineNo">1074</span>        if (masterServerName.equals(dest)) {<a name="line.1074"></a>
-<span class="sourceLineNo">1075</span>          if (!keyIt.hasNext()) {<a name="line.1075"></a>
-<span class="sourceLineNo">1076</span>            keyIt = clusterMap.keySet().iterator();<a name="line.1076"></a>
-<span class="sourceLineNo">1077</span>          }<a name="line.1077"></a>
-<span class="sourceLineNo">1078</span>          dest = keyIt.next();<a name="line.1078"></a>
-<span class="sourceLineNo">1079</span>        }<a name="line.1079"></a>
-<span class="sourceLineNo">1080</span><a name="line.1080"></a>
-<span class="sourceLineNo">1081</span>        // Move this region away from the master regionserver<a name="line.1081"></a>
-<span class="sourceLineNo">1082</span>        RegionPlan plan = new RegionPlan(region, masterServerName, dest);<a name="line.1082"></a>
-<span class="sourceLineNo">1083</span>        if (plans == null) {<a name="line.1083"></a>
-<span class="sourceLineNo">1084</span>          plans = new ArrayList&lt;&gt;();<a name="line.1084"></a>
-<span class="sourceLineNo">1085</span>        }<a name="line.1085"></a>
-<span class="sourceLineNo">1086</span>        plans.add(plan);<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>    for (Map.Entry&lt;ServerName, List&lt;RegionInfo&gt;&gt; server: clusterMap.entrySet()) {<a name="line.1089"></a>
-<span class="sourceLineNo">1090</span>      if (masterServerName.equals(server.getKey())) continue;<a name="line.1090"></a>
-<span class="sourceLineNo">1091</span>      for (RegionInfo region: server.getValue()) {<a name="line.1091"></a>
-<span class="sourceLineNo">1092</span>        if (!shouldBeOnMaster(region)) continue;<a name="line.1092"></a>
-<span class="sourceLineNo">1093</span><a name="line.1093"></a>
-<span class="sourceLineNo">1094</span>        // Move this region to the master regionserver<a name="line.1094"></a>
-<span class="sourceLineNo">1095</span>        RegionPlan plan = new RegionPlan(region, server.getKey(), masterServerName);<a name="line.1095"></a>
-<span class="sourceLineNo">1096</span>        if (plans == null) {<a name="line.1096"></a>
-<span class="sourceLineNo">1097</span>          plans = new ArrayList&lt;&gt;();<a name="line.1097"></a>
-<span class="sourceLineNo">1098</span>        }<a name="line.1098"></a>
-<span class="sourceLineNo">1099</span>        plans.add(plan);<a name="line.1099"></a>
-<span class="sourceLineNo">1100</span>      }<a name="line.1100"></a>
-<span class="sourceLineNo">1101</span>    }<a name="line.1101"></a>
-<span class="sourceLineNo">1102</span>    return plans;<a name="line.1102"></a>
-<span class="sourceLineNo">1103</span>  }<a name="line.1103"></a>
-<span class="sourceLineNo">1104</span><a name="line.1104"></a>
-<span class="sourceLineNo">1105</span>  /**<a name="line.1105"></a>
-<span class="sourceLineNo">1106</span>   * If master is configured to carry system tables only, in here is<a name="line.1106"></a>
-<span class="sourceLineNo">1107</span>   * where we figure what to assign it.<a name="line.1107"></a>
-<span class="sourceLineNo">1108</span>   */<a name="line.1108"></a>
-<span class="sourceLineNo">1109</span>  protected Map&lt;ServerName, List&lt;RegionInfo&gt;&gt; assignMasterSystemRegions(<a name="line.1109"></a>
-<span class="sourceLineNo">1110</span>      Collection&lt;RegionInfo&gt; regions, List&lt;ServerName&gt; servers) {<a name="line.1110"></a>
-<span class="sourceLineNo">1111</span>    if (servers == null || regions == null || regions.isEmpty()) {<a name="line.1111"></a>
-<span class="sourceLineNo">1112</span>      return null;<a name="line.1112"></a>
-<span class="sourceLineNo">1113</span>    }<a name="line.1113"></a>
-<span class="sourceLineNo">1114</span>    Map&lt;ServerName, List&lt;RegionInfo&gt;&gt; assignments = new TreeMap&lt;&gt;();<a name="line.1114"></a>
-<span class="sourceLineNo">1115</span>    if (this.onlySystemTablesOnMaster) {<a name="line.1115"></a>
-<span class="sourceLineNo">1116</span>      if (masterServerName != null &amp;&amp; servers.contains(masterServerName)) {<a name="line.1116"></a>
-<span class="sourceLineNo">1117</span>        assignments.put(masterServerName, new ArrayList&lt;&gt;());<a name="line.1117"></a>
-<span class="sourceLineNo">1118</span>        for (RegionInfo region : regions) {<a name="line.1118"></a>
-<span class="sourceLineNo">1119</span>          if (shouldBeOnMaster(region)) {<a name="line.1119"></a>
-<span class="sourceLineNo">1120</span>            assignments.get(masterServerName).add(region);<a name="line.1120"></a>
-<span class="sourceLineNo">1121</span>          }<a name="line.1121"></a>
-<span class="sourceLineNo">1122</span>        }<a name="line.1122"></a>
-<span class="sourceLineNo">1123</span>      }<a name="line.1123"></a>
-<span class="sourceLineNo">1124</span>    }<a name="line.1124"></a>
-<span class="sourceLineNo">1125</span>    return assignments;<a name="line.1125"></a>
-<span class="sourceLineNo">1126</span>  }<a name="line.1126"></a>
-<span class="sourceLineNo">1127</span><a name="line.1127"></a>
-<span class="sourceLineNo">1128</span>  @Override<a name="line.1128"></a>
-<span class="sourceLineNo">1129</span>  public Configuration getConf() {<a name="line.1129"></a>
-<span class="sourceLineNo">1130</span>    return this.config;<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 synchronized void setClusterMetrics(ClusterMetrics st) {<a name="line.1134"></a>
-<span class="sourceLineNo">1135</span>    this.clusterStatus = st;<a name="line.1135"></a>
-<span class="sourceLineNo">1136</span>    if (useRegionFinder) {<a name="line.1136"></a>
-<span class="sourceLineNo">1137</span>      regionFinder.setClusterMetrics(st);<a name="line.1137"></a>
-<span class="sourceLineNo">1138</span>    }<a name="line.1138"></a>
-<span class="sourceLineNo">1139</span>  }<a name="line.1139"></a>
-<span class="sourceLineNo">1140</span><a name="line.1140"></a>
-<span class="sourceLineNo">1141</span>  @Override<a name="line.1141"></a>
-<span class="sourceLineNo">1142</span>  public void setClusterLoad(Map&lt;TableName, Map&lt;ServerName, List&lt;RegionInfo&gt;&gt;&gt; clusterLoad){<a name="line.1142"></a>
-<span class="sourceLineNo">1143</span><a name="line.1143"></a>
-<span class="sourceLineNo">1144</span>  }<a name="line.1144"></a>
-<span class="sourceLineNo">1145</span><a name="line.1145"></a>
-<span class="sourceLineNo">1146</span>  @Override<a name="line.1146"></a>
-<span class="sourceLineNo">1147</span>  public void setMasterServices(MasterServices masterServices) {<a name="line.1147"></a>
-<span class="sourceLineNo">1148</span>    masterServerName = masterServices.getServerName();<a name="line.1148"></a>
-<span class="sourceLineNo">1149</span>    this.services = masterServices;<a name="line.1149"></a>
-<span class="sourceLineNo">1150</span>    if (useRegionFinder) {<a name="line.1150"></a>
-<span class="sourceLineNo">1151</span>      this.regionFinder.setServices(masterServices);<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><a name="line.1154"></a>
-<span class="sourceLineNo">1155</span>  @Override<a name="line.1155"></a>
-<span class="sourceLineNo">1156</span>  public void postMasterStartupInitialize() {<a name="line.1156"></a>
-<span class="sourceLineNo">1157</span>    if (services != null &amp;&amp; regionFinder != null) {<a name="line.1157"></a>
-<span class="sourceLineNo">1158</span>      try {<a name="line.1158"></a>
-<span class="sourceLineNo">1159</span>        Set&lt;RegionInfo&gt; regions =<a name="line.1159"></a>
-<span class="sourceLineNo">1160</span>            services.getAssignmentManager().getRegionStates().getRegionAssignments().keySet();<a name="line.1160"></a>
-<span class="sourceLineNo">1161</span>        regionFinder.refreshAndWait(regions);<a name="line.1161"></a>
-<span class="sourceLineNo">1162</span>      } catch (Exception e) {<a name="line.1162"></a>
-<span class="sourceLineNo">1163</span>        LOG.warn("Refreshing region HDFS Block dist failed with exception, ignoring", e);<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><a name="line.1167"></a>
-<span class="sourceLineNo">1168</span>  public void setRackManager(RackManager rackManager) {<a name="line.1168"></a>
-<span class="sourceLineNo">1169</span>    this.rackManager = rackManager;<a name="line.1169"></a>
-<span class="sourceLineNo">1170</span>  }<a name="line.1170"></a>
-<span class="sourceLineNo">1171</span><a name="line.1171"></a>
-<span class="sourceLineNo">1172</span>  protected boolean needsBalance(Cluster c) {<a name="line.1172"></a>
-<span class="sourceLineNo">1173</span>    ClusterLoadState cs = new ClusterLoadState(c.clusterState);<a name="line.1173"></a>
-<span class="sourceLineNo">1174</span>    if (cs.getNumServers() &lt; MIN_SERVER_BALANCE) {<a name="line.1174"></a>
-<span class="sourceLineNo">1175</span>      if (LOG.isDebugEnabled()) {<a name="line.1175"></a>
-<span class="sourceLineNo">1176</span>        LOG.debug("Not running balancer because only " + cs.getNumServers()<a name="line.1176"></a>
-<span class="sourceLineNo">1177</span>            + " active regionserver(s)");<a name="line.1177"></a>
-<span class="sourceLineNo">1178</span>      }<a name="line.1178"></a>
-<span class="sourceLineNo">1179</span>      return false;<a name="line.1179"></a>
-<span class="sourceLineNo">1180</span>    }<a name="line.1180"></a>
-<span class="sourceLineNo">1181</span>    if(areSomeRegionReplicasColocated(c)) return true;<a name="line.1181"></a>
-<span class="sourceLineNo">1182</span>    // Check if we even need to do any load balancing<a name="line.1182"></a>
-<span class="sourceLineNo">1183</span>    // HBASE-3681 check sloppiness first<a name="line.1183"></a>
-<span class="sourceLineNo">1184</span>    float average = cs.getLoadAverage(); // for logging<a name="line.1184"></a>
-<span class="sourceLineNo">1185</span>    int floor = (int) Math.floor(average * (1 - slop));<a name="line.1185"></a>
-<span class="sourceLineNo">1186</span>    int ceiling = (int) Math.ceil(average * (1 + slop));<a name="line.1186"></a>
-<span class="sourceLineNo">1187</span>    if (!(cs.getMaxLoad() &gt; ceiling || cs.getMinLoad() &lt; floor)) {<a name="line.1187"></a>
-<span class="sourceLineNo">1188</span>      NavigableMap&lt;ServerAndLoad, List&lt;RegionInfo&gt;&gt; serversByLoad = cs.getServersByLoad();<a name="line.1188"></a>
-<span class="sourceLineNo">1189</span>      if (LOG.isTraceEnabled()) {<a name="line.1189"></a>
-<span class="sourceLineNo">1190</span>        // If nothing to balance, then don't say anything unless trace-level logging.<a name="line.1190"></a>
-<span class="sourceLineNo">1191</span>        LOG.trace("Skipping load balancing because balanced cluster; " +<a name="line.1191"></a>
-<span class="sourceLineNo">1192</span>          "servers=" + cs.getNumServers() +<a name="line.1192"></a>
-<span class="sourceLineNo">1193</span>          " regions=" + cs.getNumRegions() + " average=" + average +<a name="line.1193"></a>
-<span class="sourceLineNo">1194</span>          " mostloaded=" + serversByLoad.lastKey().getLoad() +<a name="line.1194"></a>
-<span class="sourceLineNo">1195</span>          " leastloaded=" + serversByLoad.firstKey().getLoad());<a name="line.1195"></a>
-<span class="sourceLineNo">1196</span>      }<a name="line.1196"></a>
-<span class="sourceLineNo">1197</span>      return false;<a name="line.1197"></a>
-<span class="sourceLineNo">1198</span>    }<a name="line.1198"></a>
-<span class="sourceLineNo">1199</span>    return true;<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>   * Subclasses should implement this to return true if the cluster has nodes that hosts<a name="line.1203"></a>
-<span class="sourceLineNo">1204</span>   * multiple replicas for the same region, or, if there are multiple racks and the same<a name="line.1204"></a>
-<span class="sourceLineNo">1205</span>   * rack hosts replicas of the same region<a name="line.1205"></a>
-<span class="sourceLineNo">1206</span>   * @param c Cluster information<a name="line.1206"></a>
-<span class="sourceLineNo">1207</span>   * @return whether region replicas are currently co-located<a name="line.1207"></a>
-<span class="sourceLineNo">1208</span>   */<a name="line.1208"></a>
-<span class="sourceLineNo">1209</span>  protected boolean areSomeRegionReplicasColocated(Cluster c) {<a name="line.1209"></a>
-<span class="sourceLineNo">1210</span>    return false;<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>   * Generates a bulk assignment plan to be used on cluster startup using a<a name="line.1214"></a>
-<span class="sourceLineNo">1215</span>   * simple round-robin assignment.<a name="line.1215"></a>
-<span class="sourceLineNo">1216</span>   * &lt;p&gt;<a name="line.1216"></a>
-<span class="sourceLineNo">1217</span>   * Takes a list of all the regions and all the servers in the cluster and<a name="line.1217"></a>
-<span class="sourceLineNo">1218</span>   * returns a map of each server to the regions that it should be assigned.<a name="line.1218"></a>
-<span class="sourceLineNo">1219</span>   * &lt;p&gt;<a name="line.1219"></a>
-<span class="sourceLineNo">1220</span>   * Currently implemented as a round-robin assignment. Same invariant as load<a name="line.1220"></a>
-<span class="sourceLineNo">1221</span>   * balancing, all servers holding floor(avg) or ceiling(avg).<a name="line.1221"></a>
-<span class="sourceLineNo">1222</span>   *<a name="line.1222"></a>
-<span class="sourceLineNo">1223</span>   * TODO: Use block locations from HDFS to place regions with their blocks<a name="line.1223"></a>
-<span class="sourceLineNo">1224</span>   *<a name="line.1224"></a>
-<span class="sourceLineNo">1225</span>   * @param regions all regions<a name="line.1225"></a>
-<span class="sourceLineNo">1226</span>   * @param servers all servers<a name="line.1226"></a>
-<span class="sourceLineNo">1227</span>   * @return map of server to the regions it should take, or null if no<a name="line.1227"></a>
-<span class="sourceLineNo">1228</span>   *         assignment is possible (ie. no regions or no servers)<a name="line.1228"></a>
-<span class="sourceLineNo">1229</span>   */<a name="line.1229"></a>
-<span class="sourceLineNo">1230</span>  @Override<a name="line.1230"></a>
-<span class="sourceLineNo">1231</span>  public Map&lt;ServerName, List&lt;RegionInfo&gt;&gt; roundRobinAssignment(List&lt;RegionInfo&gt; regions,<a name="line.1231"></a>
-<span class="sourceLineNo">1232</span>      List&lt;ServerName&gt; servers) throws HBaseIOException {<a name="line.1232"></a>
-<span class="sourceLineNo">1233</span>    metricsBalancer.incrMiscInvocations();<a name="line.1233"></a>
-<span class="sourceLineNo">1234</span>    Map&lt;ServerName, List&lt;RegionInfo&gt;&gt; assignments = assignMasterSystemRegions(regions, servers);<a name="line.1234"></a>
-<span class="sourceLineNo">1235</span>    if (assignments != null &amp;&amp; !assignments.isEmpty()) {<a name="line.1235"></a>
-<span class="sourceLineNo">1236</span>      servers = new ArrayList&lt;&gt;(servers);<a name="line.1236"></a>
-<span class="sourceLineNo">1237</span>      // Guarantee not to put other regions on master<a name="line.1237"></a>
-<span class="sourceLineNo">1238</span>      servers.remove(masterServerName);<a name="line.1238"></a>
-<span class="sourceLineNo">1239</span>      List&lt;RegionInfo&gt; masterRegions = assignments.get(masterServerName);<a name="line.1239"></a>
-<span class="sourceLineNo">1240</span>      if (!masterRegions.isEmpty()) {<a name="line.1240"></a>
-<span class="sourceLineNo">1241</span>        regions = new ArrayList&lt;&gt;(regions);<a name="line.1241"></a>
-<span class="sourceLineNo">1242</span>        regions.removeAll(masterRegions);<a name="line.1242"></a>
-<span class="sourceLineNo">1243</span>      }<a name="line.1243"></a>
-<span class="sourceLineNo">1244</span>    }<a name="line.1244"></a>
-<span class="sourceLineNo">1245</span>    if (regions == null || regions.isEmpty()) {<a name="line.1245"></a>
-<span class="sourceLineNo">1246</span>      return assignments;<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>    int numServers = servers == null ? 0 : servers.size();<a name="line.1249"></a>
-<span class="sourceLineNo">1250</span>    if (numServers == 0) {<a name="line.1250"></a>
-<span class="sourceLineNo">1251</span>      LOG.warn("Wanted to do round robin assignment but no servers to assign to");<a name="line.1251"></a>
-<span class="sourceLineNo">1252</span>      return null;<a name="line.1252"></a>
-<span class="sourceLineNo">1253</span>    }<a name="line.1253"></a>
-<span class="sourceLineNo">1254</span><a name="line.1254"></a>
-<span class="sourceLineNo">1255</span>    // TODO: instead of retainAssignment() and roundRobinAssignment(), we should just run the<a name="line.1255"></a>
-<span class="sourceLineNo">1256</span>    // normal LB.balancerCluster() with unassignedRegions. We only need to have a candidate<a name="line.1256"></a>
-<span class="sourceLineNo">1257</span>    // generator for AssignRegionAction. The LB will ensure the regions are mostly local<a name="line.1257"></a>
-<span class="sourceLineNo">1258</span>    // and balanced. This should also run fast with fewer number of iterations.<a name="line.1258"></a>
-<span class="sourceLineNo">1259</span><a name="line.1259"></a>
-<span class="sourceLineNo">1260</span>    if (numServers == 1) { // Only one server, nothing fancy we can do here<a name="line.1260"></a>
-<span class="sourceLineNo">1261</span>      ServerName server = servers.get(0);<a name="line.1261"></a>
-<span class="sourceLineNo">1262</span>      assignments.put(server, new ArrayList&lt;&gt;(regions));<a name="line.1262"></a>
-<span class="sourceLineNo">1263</span>      return assignments;<a name="line.1263"></a>
-<span class="sourceLineNo">1264</span>    }<a name="line.1264"></a>
-<span class="sourceLineNo">1265</span><a name="line.1265"></a>
-<span class="sourceLineNo">1266</span>    Cluster cluster = createCluster(servers, regions, false);<a name="line.1266"></a>
-<span class="sourceLineNo">1267</span>    List&lt;RegionInfo&gt; unassignedRegions = new ArrayList&lt;&gt;();<a name="line.1267"></a>
-<span class="sourceLineNo">1268</span><a name="line.1268"></a>
-<span class="sourceLineNo">1269</span>    roundRobinAssignment(cluster, regions, unassignedRegions,<a name="line.1269"></a>
-<span class="sourceLineNo">1270</span>      servers, assignments);<a name="line.1270"></a>
-<span class="sourceLineNo">1271</span><a name="line.1271"></a>
-<span class="sourceLineNo">1272</span>    List&lt;RegionInfo&gt; lastFewRegions = new ArrayList&lt;&gt;();<a name="line.1272"></a>
-<span class="sourceLineNo">1273</span>    // assign the remaining by going through the list and try to assign to servers one-by-one<a name="line.1273"></a>
-<span class="sourceLineNo">1274</span>    int serverIdx = RANDOM.nextInt(numServers);<a name="line.1274"></a>
-<span class="sourceLineNo">1275</span>    OUTER : for (RegionInfo region : unassignedRegions) {<a name="line.1275"></a>
-<span class="sourceLineNo">1276</span>      boolean assigned = false;<a name="line.1276"></a>
-<span class="sourceLineNo">1277</span>      INNER : for (int j = 0; j &lt; numServers; j++) { // try all servers one by one<a name="line.1277"></a>
-<span class="sourceLineNo">1278</span>        ServerName serverName = servers.get((j + serverIdx) % numServers);<a name="line.1278"></a>
-<span class="sourceLineNo">1279</span>        if (!cluster.wouldLowerAvailability(region, serverName)) {<a name="line.1279"></a>
-<span class="sourceLineNo">1280</span>          List&lt;RegionInfo&gt; serverRegions =<a name="line.1280"></a>
-<span class="sourceLineNo">1281</span>              assignments.computeIfAbsent(serverName, k -&gt; new ArrayList&lt;&gt;());<a name="line.1281"></a>
-<span class="sourceLineNo">1282</span>          if (!RegionReplicaUtil.isDefaultReplica(region.getReplicaId())) {<a name="line.1282"></a>
-<span class="sourceLineNo">1283</span>            // if the region is not a default replica<a name="line.1283"></a>
-<span class="sourceLineNo">1284</span>            // check if the assignments map has the other replica region on this server<a name="line.1284"></a>
-<span class="sourceLineNo">1285</span>            for (RegionInfo hri : serverRegions) {<a name="line.1285"></a>
-<span class="sourceLineNo">1286</span>              if (RegionReplicaUtil.isReplicasForSameRegion(region, hri)) {<a name="line.1286"></a>
-<span class="sourceLineNo">1287</span>                if (LOG.isTraceEnabled()) {<a name="line.1287"></a>
-<span class="sourceLineNo">1288</span>                  LOG.trace("Skipping the server, " + serverName<a name="line.1288"></a>
-<span class="sourceLineNo">1289</span>                      + " , got the same server for the region " + region);<a name="line.1289"></a>
-<span class="sourceLineNo">1290</span>                }<a name="line.1290"></a>
-<span class="sourceLineNo">1291</span>                // do not allow this case. The unassignedRegions we got because the<a name="line.1291"></a>
-<span class="sourceLineNo">1292</span>                // replica region in this list was not assigned because of lower availablity issue.<a name="line.1292"></a>
-<span class="sourceLineNo">1293</span>                // So when we assign here we should ensure that as far as possible the server being<a name="line.1293"></a>
-<span class="sourceLineNo">1294</span>                // selected does not have the server where the replica region was not assigned.<a name="line.1294"></a>
-<span class="sourceLineNo">1295</span>                continue INNER; // continue the inner loop, ie go to the next server<a name="line.1295"></a>
-<span class="sourceLineNo">1296</span>              }<a name="line.1296"></a>
-<span class="sourceLineNo">1297</span>            }<a name="line.1297"></a>
-<span class="sourceLineNo">1298</span>          }<a name="line.1298"></a>
-<span class="sourceLineNo">1299</span>          serverRegions.add(region);<a name="line.1299"></a>
-<span class="sourceLineNo">1300</span>          cluster.doAssignRegion(region, serverName);<a name="line.1300"></a>
-<span class="sourceLineNo">1301</span>          serverIdx = (j + serverIdx + 1) % numServers; //remain from next server<a name="line.1301"></a>
-<span class="sourceLineNo">1302</span>          assigned = true;<a name="line.1302"></a>
-<span class="sourceLineNo">1303</span>          break;<a name="line.1303"></a>
-<span class="sourceLineNo">1304</span>        }<a name="line.1304"></a>
-<span class="sourceLineNo">1305</span>      }<a name="line.1305"></a>
-<span class="sourceLineNo">1306</span>      if (!assigned) {<a name="line.1306"></a>
-<span class="sourceLineNo">1307</span>        lastFewRegions.add(region);<a name="line.1307"></a>
-<span class="sourceLineNo">1308</span>      }<a name="line.1308"></a>
-<span class="sourceLineNo">1309</span>    }<a name="line.1309"></a>
-<span class="sourceLineNo">1310</span>    // just sprinkle the rest of the regions on random regionservers. The balanceCluster will<a name="line.1310"></a>
-<span class="sourceLineNo">1311</span>    // make it optimal later. we can end up with this if numReplicas &gt; numServers.<a name="line.1311"></a>
-<span class="sourceLineNo">1312</span>    for (RegionInfo region : lastFewRegions) {<a name="line.1312"></a>
-<span class="sourceLineNo">1313</span>      int i = RANDOM.nextInt(numServers);<a name="line.1313"></a>
-<span class="sourceLineNo">1314</span>      ServerName server = servers.get(i);<a name="line.1314"></a>
-<span class="sourceLineNo">1315</span>      List&lt;RegionInfo&gt; serverRegions = assignments.computeIfAbsent(server, k -&gt; new ArrayList&lt;&gt;());<a name="line.1315"></a>
-<span class="sourceLineNo">1316</span>      serverRegions.add(region);<a name="line.1316"></a>
-<span class="sourceLineNo">1317</span>      cluster.doAssignRegion(region, server);<a name="line.1317"></a>
-<span class="sourceLineNo">1318</span>    }<a name="line.1318"></a>
-<span class="sourceLineNo">1319</span>    return assignments;<a name="line.1319"></a>
-<span class="sourceLineNo">1320</span>  }<a name="line.1320"></a>
-<span class="sourceLineNo">1321</span><a name="line.1321"></a>
-<span class="sourceLineNo">1322</span>  protected Cluster createCluster(List&lt;ServerName&gt; servers, Collection&lt;RegionInfo&gt; regions,<a name="line.1322"></a>
-<span class="sourceLineNo">1323</span>      boolean hasRegionReplica) {<a name="line.1323"></a>
-<span class="sourceLineNo">1324</span>    // Get the snapshot of the current assignments for the regions in question, and then create<a name="line.1324"></a>
-<span class="sourceLineNo">1325</span>    // a cluster out of it. Note that we might have replicas already assigned to some servers<a name="line.1325"></a>
-<span class="sourceLineNo">1326</span>    // earlier. So we want to get the snapshot to see those assignments, but this will only contain<a name="line.1326"></a>
-<span class="sourceLineNo">1327</span>    // replicas of the regions that are passed (for performance).<a name="line.1327"></a>
-<span class="sourceLineNo">1328</span>    Map&lt;ServerName, List&lt;RegionInfo&gt;&gt; clusterState = null;<a name="line.1328"></a>
-<span class="sourceLineNo">1329</span>    if (!hasRegionReplica) {<a name="line.1329"></a>
-<span class="sourceLineNo">1330</span>      clusterState = getRegionAssignmentsByServer(regions);<a name="line.1330"></a>
-<span class="sourceLineNo">1331</span>    } else {<a name="line.1331"></a>
-<span class="sourceLineNo">1332</span>      // for the case where we have region replica it is better we get the entire cluster's snapshot<a name="line.1332"></a>
-<span class="sourceLineNo">1333</span>      clusterState = getRegionAssignmentsByServer(null);<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>    for (ServerName server : servers) {<a name="line.1336"></a>
-<span class="sourceLineNo">1337</span>      if (!clusterState.containsKey(server)) {<a name="line.1337"></a>
-<span class="sourceLineNo">1338</span>        clusterState.put(server, EMPTY_REGION_LIST);<a name="line.1338"></a>
-<span class="sourceLineNo">1339</span>      }<a name="line.1339"></a>
-<span class="sourceLineNo">1340</span>    }<a name="line.1340"></a>
-<span class="sourceLineNo">1341</span>    return new Cluster(regions, clusterState, null, this.regionFinder,<a name="line.1341"></a>
-<span class="sourceLineNo">1342</span>        rackManager);<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>  private List&lt;ServerName&gt; findIdleServers(List&lt;ServerName&gt; servers) {<a name="line.1345"></a>
-<span class="sourceLineNo">1346</span>    return this.services.getServerManager()<a name="line.1346"></a>
-<span class="sourceLineNo">1347</span>            .getOnlineServersListWithPredicator(servers, IDLE_SERVER_PREDICATOR);<a name="line.1347"></a>
-<span class="sourceLineNo">1348</span>  }<a name="line.1348"></a>
-<span class="sourceLineNo">1349</span><a name="line.1349"></a>
-<span class="sourceLineNo">1350</span>  /**<a name="line.1350"></a>
-<span class="sourceLineNo">1351</span>   * Used to assign a single region to a random server.<a name="line.1351"></a>
-<span class="sourceLineNo">1352</span>   */<a name="line.1352"></a>
-<span class="sourceLineNo">1353</span>  @Override<a name="line.1353"></a>
-<span class="sourceLineNo">1354</span>  public ServerName randomAssignment(RegionInfo regionInfo, List&lt;ServerName&gt; servers)<a name="line.1354"></a>
-<span class="sourceLineNo">1355</span>      throws HBaseIOException {<a name="line.1355"></a>
-<span class="sourceLineNo">1356</span>    metricsBalancer.incrMiscInvocations();<a name="line.1356"></a>
-<span class="sourceLineNo">1357</span>    if (servers != null &amp;&amp; servers.contains(masterServerName)) {<a name="line.1357"></a>
-<span class="sourceLineNo">1358</span>      if (shouldBeOnMaster(regionInfo)) {<a name="line.1358"></a>
-<span class="sourceLineNo">1359</span>        return masterServerName;<a name="line.1359"></a>
-<span class="sourceLineNo">1360</span>      }<a name="line.1360"></a>
-<span class="sourceLineNo">1361</span>      if (!LoadBalancer.isTablesOnMaster(getConf())) {<a name="line.1361"></a>
-<span class="sourceLineNo">1362</span>        // Guarantee we do not put any regions on master<a name="line.1362"></a>
-<span class="sourceLineNo">1363</span>        servers = new ArrayList&lt;&gt;(servers);<a name="line.1363"></a>
-<span class="sourceLineNo">1364</span>        servers.remove(masterServerName);<a name="line.1364"></a>
-<span class="sourceLineNo">1365</span>      }<a name="line.1365"></a>
-<span class="sourceLineNo">1366</span>    }<a name="line.1366"></a>
-<span class="sourceLineNo">1367</span><a name="line.1367"></a>
-<span class="sourceLineNo">1368</span>    int numServers = servers == null ? 0 : servers.size();<a name="line.1368"></a>
-<span class="sourceLineNo">1369</span>    if (numServers == 0) {<a name="line.1369"></a>
-<span class="sourceLineNo">1370</span>      LOG.warn("Wanted to retain assignment but no servers to assign to");<a name="line.1370"></a>
-<span class="sourceLineNo">1371</span>      return null;<a name="line.1371"></a>
-<span class="sourceLineNo">1372</span>    }<a name="line.1372"></a>
-<span class="sourceLineNo">1373</span>    if (numServers == 1) { // Only one server, nothing fancy we can do here<a name="line.1373"></a>
-<span class="sourceLineNo">1374</span>      return servers.get(0);<a name="line.1374"></a>
-<span class="sourceLineNo">1375</span>    }<a name="line.1375"></a>
-<span class="sourceLineNo">1376</span>    List&lt;ServerName&gt; idleServers = findIdleServers(servers);<a name="line.1376"></a>
-<span class="sourceLineNo">1377</span>    if (idleServers.size() == 1) {<a name="line.1377"></a>
-<span class="sourceLineNo">1378</span>      return idleServers.get(0);<a name="line.1378"></a>
-<span class="sourceLineNo">1379</span>    }<a name="line.1379"></a>
-<span class="sourceLineNo">1380</span>    final List&lt;ServerName&gt; finalServers = idleServers.isEmpty() ?<a name="line.1380"></a>
-<span class="sourceLineNo">1381</span>            servers : idleServers;<a name="line.1381"></a>
-<span class="sourceLineNo">1382</span>    List&lt;RegionInfo&gt; regions = Lists.newArrayList(regionInfo);<a name="line.1382"></a>
-<span class="sourceLineNo">1383</span>    Cluster cluster = createCluster(finalServers, regions, false);<a name="line.1383"></a>
-<span class="sourceLineNo">1384</span>    return randomAssignment(cluster, regionInfo, finalServers);<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>  /**<a name="line.1387"></a>
-<span class="sourceLineNo">1388</span>   * Generates a bulk assignment startup plan, attempting to reuse the existing<a name="line.1388"></a>
-<span class="sourceLineNo">1389</span>   * assignment information from META, but adjusting for the specified list of<a name="line.1389"></a>
-<span class="sourceLineNo">1390</span>   * available/online servers available for assignment.<a name="line.1390"></a>
-<span class="sourceLineNo">1391</span>   * &lt;p&gt;<a name="line.1391"></a>
-<span class="sourceLineNo">1392</span>   * Takes a map of all regions to their existing assignment from META. Also<a name="line.1392"></a>
-<span class="sourceLineNo">1393</span>   * takes a list of online servers for regions to be assigned to. Attempts to<a name="line.1393"></a>
-<span class="sourceLineNo">1394</span>   * retain all assignment, so in some instances initial assignment will not be<a name="line.1394"></a>
-<span class="sourceLineNo">1395</span>   * completely balanced.<a name="line.1395"></a>
-<span class="sourceLineNo">1396</span>   * &lt;p&gt;<a name="line.1396"></a>
-<span class="sourceLineNo">1397</span>   * Any leftover regions without an existing server to be assigned to will be<a name="line.1397"></a>
-<span class="sourceLineNo">1398</span>   * assigned randomly to available servers.<a name="line.1398"></a>
-<span class="sourceLineNo">1399</span>   *<a name="line.1399"></a>
-<span class="sourceLineNo">1400</span>   * @param regions regions and existing assignment from meta<a name="line.1400"></a>
-<span class="sourceLineNo">1401</span>   * @param servers available servers<a name="line.1401"></a>
-<span class="sourceLineNo">1402</span>   * @return map of servers and regions to be assigned to them<a name="line.1402"></a>
-<span class="sourceLineNo">1403</span>   */<a name="line.1403"></a>
-<span class="sourceLineNo">1404</span>  @Override<a name="line.1404"></a>
-<span class="sourceLineNo">1405</span>  public Map&lt;ServerName, List&lt;RegionInfo&gt;&gt; retainAssignment(Map&lt;RegionInfo, ServerName&gt; regions,<a name="line.1405"></a>
-<span class="sourceLineNo">1406</span>      List&lt;ServerName&gt; servers) throws HBaseIOException {<a name="line.1406"></a>
-<span class="sourceLineNo">1407</span>    // Update metrics<a name="line.1407"></a>
-<span class="sourceLineNo">1408</span>    metricsBalancer.incrMiscInvocations();<a name="line.1408"></a>
-<span class="sourceLineNo">1409</span>    Map&lt;ServerName, List&lt;RegionInfo&gt;&gt; assignments = assignMasterSystemRegions(regions.keySet(), servers);<a name="line.1409"></a>
-<span class="sourceLineNo">1410</span>    if (assignments != null &amp;&amp; !assignments.isEmpty()) {<a name="line.1410"></a>
-<span class="sourceLineNo">1411</span>      servers = new ArrayList&lt;&gt;(servers);<a name="line.1411"></a>
-<span class="sourceLineNo">1412</span>      // Guarantee not to put other regions on master<a name="line.1412"></a>
-<span class="sourceLineNo">1413</span>      servers.remove(masterServerName);<a name="line.1413"></a>
-<span class="sourceLineNo">1414</span>      List&lt;RegionInfo&gt; masterRegions = assignments.get(masterServerName);<a name="line.1414"></a>
-<span class="sourceLineNo">1415</span>      regions = regions.entrySet().stream().filter(e -&gt; !masterRegions.contains(e.getKey()))<a name="line.1415"></a>
-<span class="sourceLineNo">1416</span>          .collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue));<a name="line.1416"></a>
-<span class="sourceLineNo">1417</span>    }<a name="line.1417"></a>
-<span class="sourceLineNo">1418</span>    if (regions.isEmpty()) {<a name="line.1418"></a>
-<span class="sourceLineNo">1419</span>      return assignments;<a name="line.1419"></a>
-<span class="sourceLineNo">1420</span>    }<a name="line.1420"></a>
-<span class="sourceLineNo">1421</span><a name="line.1421"></a>
-<span class="sourceLineNo">1422</span>    int numServers = servers == null ? 0 : servers.size();<a name="line.1422"></a>
-<span class="sourceLineNo">1423</span>    if (numServers == 0) {<a name="line.1423"></a>
-<span class="sourceLineNo">1424</span>      LOG.warn("Wanted to do retain assignment but no servers to assign to");<a name="line.1424"></a>
-<span class="sourceLineNo">1425</span>      return null;<a name="line.1425"></a>
-<span class="sourceLineNo">1426</span>    }<a name="line.1426"></a>
-<span class="sourceLineNo">1427</span>    if (numServers == 1) { // Only one server, nothing fancy we can do here<a name="line.1427"></a>
-<span class="sourceLineNo">1428</span>      ServerName server = servers.get(0);<a name="line.1428"></a>
-<span class="sourceLineNo">1429</span>      assignments.put(server, new ArrayList&lt;&gt;(regions.keySet()));<a name="line.1429"></a>
-<span class="sourceLineNo">1430</span>      return assignments;<a name="line.1430"></a>
-<span class="sourceLineNo">1431</span>    }<a name="line.1431"></a>
-<span class="sourceLineNo">1432</span><a name="line.1432"></a>
-<span class="sourceLineNo">1433</span>    // Group all of the old assignments by their hostname.<a name="line.1433"></a>
-<span class="sourceLineNo">1434</span>    // We can't group directly by ServerName since the servers all have<a name="line.1434"></a>
-<span class="sourceLineNo">1435</span>    // new start-codes.<a name="line.1435"></a>
-<span class="sourceLineNo">1436</span><a name="line.1436"></a>
-<span class="sourceLineNo">1437</span>    // Group the servers by their hostname. It's possible we have multiple<a name="line.1437"></a>
-<span class="sourceLineNo">1438</span>    // servers on the same host on different ports.<a name="line.1438"></a>
-<span class="sourceLineNo">1439</span>    ArrayListMultimap&lt;String, ServerName&gt; serversByHostname = ArrayListMultimap.create();<a name="line.1439"></a>
-<span class="sourceLineNo">1440</span>    for (ServerName server : servers) {<a name="line.1440"></a>
-<span class="sourceLineNo">1441</span>      assignments.put(server, new ArrayList&lt;&gt;());<a name="line.1441"></a>
-<span class="sourceLineNo">1442</span>      serversByHostname.put(server.getHostnameLowerCase(), server);<a name="line.1442"></a>
-<span class="sourceLineNo">1443</span>    }<a name="line.1443"></a>
-<span class="sourceLineNo">1444</span><a name="line.1444"></a>
-<span class="sourceLineNo">1445</span>    // Collection of the hostnames that used to have regions<a name="line.1445"></a>
-<span class="sourceLineNo">1446</span>    // assigned, but for which we no longer have any RS running<a name="line.1446"></a>
-<span class="sourceLineNo">1447</span>    // after the cluster restart.<a name="line.1447"></a>
-<span class="sourceLineNo">1448</span>    Set&lt;String&gt; oldHostsNoLongerPresent = Sets.newTreeSet();<a name="line.1448"></a>
-<span class="sourceLineNo">1449</span><a name="line.1449"></a>
-<span class="sourceLineNo">1450</span>    // If the old servers aren't present, lets assign those regions later.<a name="line.1450"></a>
-<span class="sourceLineNo">1451</span>    List&lt;RegionInfo&gt; randomAssignRegions = Lists.newArrayList();<a name="line.1451"></a>
-<span class="sourceLineNo">1452</span><a name="line.1452"></a>
-<span class="sourceLineNo">1453</span>    int numRandomAssignments = 0;<a name="line.1453"></a>
-<span class="sourceLineNo">1454</span>    int numRetainedAssigments = 0;<a name="line.1454"></a>
-<span class="sourceLineNo">1455</span>    boolean hasRegionReplica = false;<a name="line.1455"></a>
-<span class="sourceLineNo">1456</span>    for (Map.Entry&lt;RegionInfo, ServerName&gt; entry : regions.entrySet()) {<a name="line.1456"></a>
-<span class="sourceLineNo">1457</span>      RegionInfo region = entry.getKey();<a name="line.1457"></a>
-<span class="sourceLineNo">1458</span>      ServerName oldServerName = entry.getValue();<a name="line.1458"></a>
-<span class="sourceLineNo">1459</span>      // In the current set of regions even if one has region replica let us go with<a name="line.1459"></a>
-<span class="sourceLineNo">1460</span>      // getting the entire snapshot<a name="line.1460"></a>
-<span class="sourceLineNo">1461</span>      if (this.services != null) { // for tests<a name="line.1461"></a>
-<span class="sourceLineNo">1462</span>        AssignmentManager am = this.services.getAssignmentManager();<a name="line.1462"></a>
-<span class="sourceLineNo">1463</span>        if (am != null) {<a name="line.1463"></a>
-<span class="sourceLineNo">1464</span>          RegionStates states = am.getRegionStates();<a name="line.1464"></a>
-<span class="sourceLineNo">1465</span>          if (!hasRegionReplica &amp;&amp; states != null &amp;&amp; states.isReplicaAvailableForRegion(region)) {<a name="line.1465"></a>
-<span class="sourceLineNo">1466</span>            hasRegionReplica = true;<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>      List&lt;ServerName&gt; localServers = new ArrayList&lt;&gt;();<a name="line.1470"></a>
-<span class="sourceLineNo">1471</span>      if (oldServerName != null) {<a name="line.1471"></a>
-<span class="sourceLineNo">1472</span>        localServers = serversByHostname.get(oldServerName.getHostnameLowerCase());<a name="line.1472"></a>
-<span class="sourceLineNo">1473</span>      }<a name="line.1473"></a>
-<span class="sourceLineNo">1474</span>      if (localServers.isEmpty()) {<a name="line.1474"></a>
-<span class="sourceLineNo">1475</span>        // No servers on the new cluster match up with this hostname, assign randomly, later.<a name="line.1475"></a>
-<span class="sourceLineNo">1476</span>        randomAssignRegions.add(region);<a name="line.1476"></a>
-<span class="sourceLineNo">1477</span>        if (oldServerName != null) {<a name="line.1477"></a>
-<span class="sourceLineNo">1478</span>          oldHostsNoLongerPresent.add(oldServerName.getHostnameLowerCase());<a name="line.1478"></a>
-<span class="sourceLineNo">1479</span>        }<a name="line.1479"></a>
-<span class="sourceLineNo">1480</span>      } else if (localServers.size() == 1) {<a name="line.1480"></a>
-<span class="sourceLineNo">1481</span>        // the usual case - one new server on same host<a name="line.1481"></a>
-<span class="sourceLineNo">1482</span>        ServerName target = localServers.get(0);<a name="line.1482"></a>
-<span class="sourceLineNo">1483</span>        assignments.get(target).add(region);<a name="line.1483"></a>
-<span class="sourceLineNo">1484</span>        numRetainedAssigments++;<a name="line.1484"></a>
-<span class="sourceLineNo">1485</span>      } else {<a name="line.1485"></a>
-<span class="sourceLineNo">1486</span>        // multiple new servers in the cluster on this same host<a name="line.1486"></a>
-<span class="sourceLineNo">1487</span>        if (localServers.contains(oldServerName)) {<a name="line.1487"></a>
-<span class="sourceLineNo">1488</span>          assignments.get(oldServerName).add(region);<a name="line.1488"></a>
-<span class="sourceLineNo">1489</span>          numRetainedAssigments++;<a name="line.1489"></a>
-<span class="sourceLineNo">1490</span>        } else {<a name="line.1490"></a>
-<span class="sourceLineNo">1491</span>          ServerName target = null;<a name="line.1491"></a>
-<span class="sourceLineNo">1492</span>          for (ServerName tmp : localServers) {<a name="line.1492"></a>
-<span class="sourceLineNo">1493</span>            if (tmp.getPort() == oldServerName.getPort()) {<a name="line.1493"></a>
-<span class="sourceLineNo">1494</span>              target = tmp;<a name="line.1494"></a>
-<span class="sourceLineNo">1495</span>              assignments.get(tmp).add(region);<a name="line.1495"></a>
-<span class="sourceLineNo">1496</span>              numRetainedAssigments++;<a name="line.1496"></a>
-<span class="sourceLineNo">1497</span>              break;<a name="line.1497"></a>
-<span class="sourceLineNo">1498</span>            }<a name="line.1498"></a>
-<span class="sourceLineNo">1499</span>          }<a name="line.1499"></a>
-<span class="sourceLineNo">1500</span>          if (target == null) {<a name="line.1500"></a>
-<span class="sourceLineNo">1501</span>            randomAssignRegions.add(region);<a name="line.1501"></a>
-<span class="sourceLineNo">1502</span>          }<a name="line.1502"></a>
-<span class="sourceLineNo">1503</span>        }<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><a name="line.1506"></a>
-<span class="sourceLineNo">1507</span>    // If servers from prior assignment aren't present, then lets do randomAssignment on regions.<a name="line.1507"></a>
-<span class="sourceLineNo">1508</span>    if (randomAssignRegions.size() &gt; 0) {<a name="line.1508"></a>
-<span class="sourceLineNo">1509</span>      Cluster cluster = createCluster(servers, regions.keySet(), hasRegionReplica);<a name="line.1509"></a>
-<span class="sourceLineNo">1510</span>      for (Map.Entry&lt;ServerName, List&lt;RegionInfo&gt;&gt; entry : assignments.entrySet()) {<a name="line.1510"></a>
-<span class="sourceLineNo">1511</span>        ServerName sn = entry.getKey();<a name="line.1511"></a>
-<span class="sourceLineNo">1512</span>        for (RegionInfo region : entry.getValue()) {<a name="line.1512"></a>
-<span class="sourceLineNo">1513</span>          cluster.doAssignRegion(region, sn);<a name="line.1513"></a>
-<span class="sourceLineNo">1514</span>        }<a name="line.1514"></a>
-<span class="sourceLineNo">1515</span>      }<a name="line.1515"></a>
-<span class="sourceLineNo">1516</span>      for (RegionInfo region : randomAssignRegions) {<a name="line.1516"></a>
-<span class="sourceLineNo">1517</span>        ServerName target = randomAssignment(cluster, region, servers);<a name="line.1517"></a>
-<span class="sourceLineNo">1518</span>        assignments.get(target).add(region);<a name="line.1518"></a>
-<span class="sourceLineNo">1519</span>        numRandomAssignments++;<a name="line.1519"></a>
-<span class="sourceLineNo">1520</span>      }<a name="line.1520"></a>
-<span class="sourceLineNo">1521</span>    }<a name="line.1521"></a>
-<span class="sourceLineNo">1522</span><a name="line.1522"></a>
-<span class="sourceLineNo">1523</span>    String randomAssignMsg = "";<a name="line.1523"></a>
-<span class="sourceLineNo">1524</span>    if (numRandomAssignments &gt; 0) {<a name="line.1524"></a>
-<span class="sourceLineNo">1525</span>      randomAssignMsg =<a name="line.1525"></a>
-<span class="sourceLineNo">1526</span>          numRandomAssignments + " regions were assigned "<a name="line.1526"></a>
-<span class="sourceLineNo">1527</span>              + "to random hosts, since the old hosts for these regions are no "<a name="line.1527"></a>
-<span class="sourceLineNo">1528</span>              + "longer present in the cluster. These hosts were:\n  "<a name="line.1528"></a>
-<span class="sourceLineNo">1529</span>              + Joiner.on("\n  ").join(oldHostsNoLongerPresent);<a name="line.1529"></a>
-<span class="sourceLineNo">1530</span>    }<a name="line.1530"></a>
-<span class="sourceLineNo">1531</span><a name="line.1531"></a>
-<span class="sourceLineNo">1532</span>    LOG.info("Reassigned " + regions.size() + " regions. " + numRetainedAssigments<a name="line.1532"></a>
-<span class="sourceLineNo">1533</span>        + " retained the pre-restart assignment. " + randomAssignMsg);<a name="line.1533"></a>
-<span class="sourceLineNo">1534</span>    return assignments;<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>  @Override<a name="line.1537"></a>
-<span class="sourceLineNo">1538</span>  public void initialize() throws HBaseIOException{<a name="line.1538"></a>
-<span class="sourceLineNo">1539</span>  }<a name="line.1539"></a>
-<span class="sourceLineNo">1540</span><a name="line.1540"></a>
-<span class="sourceLineNo">1541</span>  @Override<a name="line.1541"></a>
-<span class="sourceLineNo">1542</span>  public void regionOnline(RegionInfo regionInfo, ServerName sn) {<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>  @Override<a name="line.1545"></a>
-<span class="sourceLineNo">1546</span>  public void regionOffline(RegionInfo regionInfo) {<a name="line.1546"></a>
-<span class="sourceLineNo">1547</span>  }<a name="line.1547"></a>
-<span class="sourceLineNo">1548</span><a name="line.1548"></a>
-<span class="sourceLineNo">1549</span>  @Override<a name="line.1549"></a>
-<span class="sourceLineNo">1550</span>  public boolean isStopped() {<a name="line.1550"></a>
-<span class="sourceLineNo">1551</span>    return stopped;<a name="line.1551"></a>
-<span class="sourceLineNo">1552</span>  }<a name="line.1552"></a>
-<span class="sourceLineNo">1553</span><a name="line.1553"></a>
-<span class="sourceLineNo">1554</span>  @Override<a name="line.1554"></a>
-<span class="sourceLineNo">1555</span>  public void stop(String why) {<a name="line.1555"></a>
-<span class="sourceLineNo">1556</span>    LOG.info("Load Balancer stop requested: "+why);<a name="line.1556"></a>
-<span class="sourceLineNo">1557</span>    stopped = true;<a name="line.1557"></a>
-<span class="sourceLineNo">1558</span>  }<a name="line.1558"></a>
-<span class="sourceLineNo">1559</span><a name="line.1559"></a>
-<span class="sourceLineNo">1560</span>  /**<a name="line.1560"></a>
-<span class="sourceLineNo">1561</span>  * Updates the balancer status tag reported to JMX<a name="line.1561"></a>
-<span class="sourceLineNo">1562</span>  */<a name="line.1562"></a>
-<span class="sourceLineNo">1563</span>  public void updateBalancerStatus(boolean status) {<a name="line.1563"></a>
-<span class="sourceLineNo">1564</span>    metricsBalancer.balancerStatus(status);<a name="line.1564"></a>
-<span class="sourceLineNo">1565</span>  }<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>   * Used to assign a single region to a random server.<a name="line.1568"></a>
-<span class="sourceLineNo">1569</span>   */<a name="line.1569"></a>
-<span class="sourceLineNo">1570</span>  private ServerName randomAssignment(Cluster cluster, RegionInfo regionInfo,<a name="line.1570"></a>
-<span class="sourceLineNo">1571</span>      List&lt;ServerName&gt; servers) {<a name="line.1571"></a>
-<span class="sourceLineNo">1572</span>    int numServers = servers.size(); // servers is not null, numServers &gt; 1<a name="line.1572"></a>
-<span class="sourceLineNo">1573</span>    ServerName sn = null;<a name="line.1573"></a>
-<span class="sourceLineNo">1574</span>    final int maxIterations = numServers * 4;<a name="line.1574"></a>
-<span class="sourceLineNo">1575</span>    int iterations = 0;<a name="line.1575"></a>
-<span class="sourceLineNo">1576</span>    List&lt;ServerName&gt; usedSNs = new ArrayList&lt;&gt;(servers.size());<a name="line.1576"></a>
-<span class="sourceLineNo">1577</span>    do {<a name="line.1577"></a>
-<span class="sourceLineNo">1578</span>      int i = RANDOM.nextInt(numServers);<a name="line.1578"></a>
-<span class="sourceLineNo">1579</span>      sn = servers.get(i);<a name="line.1579"></a>
-<span class="sourceLineNo">1580</span>      if (!usedSNs.contains(sn)) {<a name="line.1580"></a>
-<span class="sourceLineNo">1581</span>        usedSNs.add(sn);<a name="line.1581"></a>
-<span class="sourceLineNo">1582</span>      }<a name="line.1582"></a>
-<span class="sourceLineNo">1583</span>    } while (cluster.wouldLowerAvailability(regionInfo, sn)<a name="line.1583"></a>
-<span class="sourceLineNo">1584</span>        &amp;&amp; iterations++ &lt; maxIterations);<a name="line.1584"></a>
-<span class="sourceLineNo">1585</span>    if (iterations &gt;= maxIterations) {<a name="line.1585"></a>
-<span class="sourceLineNo">1586</span>      // We have reached the max. Means the servers that we collected is still lowering the<a name="line.1586"></a>
-<span class="sourceLineNo">1587</span>      // availability<a name="line.1587"></a>
-<span class="sourceLineNo">1588</span>      for (ServerName unusedServer : servers) {<a name="line.1588"></a>
-<span class="sourceLineNo">1589</span>        if (!usedSNs.contains(unusedServer)) {<a name="line.1589"></a>
-<span class="sourceLineNo">1590</span>          // check if any other unused server is there for us to use.<a name="line.1590"></a>
-<span class="sourceLineNo">1591</span>          // If so use it. Else we have not other go but to go with one of them<a name="line.1591"></a>
-<span class="sourceLineNo">1592</span>          if (!cluster.wouldLowerAvailability(regionInfo, unusedServer)) {<a name="line.1592"></a>
-<span class="sourceLineNo">1593</span>            sn = unusedServer;<a name="line.1593"></a>
-<span class="sourceLineNo">1594</span>            break;<a name="line.1594"></a>
-<span class="sourceLineNo">1595</span>          }<a name="line.1595"></a>
-<span class="sourceLineNo">1596</span>        }<a name="line.1596"></a>
-<span class="sourceLineNo">1597</span>      }<a name="line.1597"></a>
-<span class="sourceLineNo">1598</span>    }<a name="line.1598"></a>
-<span class="sourceLineNo">1599</span>    cluster.doAssignRegion(regionInfo, sn);<a name="line.1599"></a>
-<span class="sourceLineNo">1600</span>    return sn;<a name="line.1600"></a>
-<span class="sourceLineNo">1601</span>  }<a name="line.1601"></a>
-<span class="sourceLineNo">1602</span><a name="line.1602"></a>
-<span class="sourceLineNo">1603</span>  /**<a name="line.1603"></a>
-<span class="sourceLineNo">1604</span>   * Round robin a list of regions to a list of servers<a name="line.1604"></a>
-<span class="sourceLineNo">1605</span>   */<a name="line.1605"></a>
-<span class="sourceLineNo">1606</span>  private void roundRobinAssignment(Cluster cluster, List&lt;RegionInfo&gt; regions,<a name="line.1606"></a>
-<span class="sourceLineNo">1607</span>      List&lt;RegionInfo&gt; unassignedRegions, List&lt;ServerName&gt; servers,<a name="line.1607"></a>
-<span class="sourceLineNo">1608</span>      Map&lt;ServerName, List&lt;RegionInfo&gt;&gt; assignments) {<a name="line.1608"></a>
-<span class="sourceLineNo">1609</span><a name="line.1609"></a>
-<span class="sourceLineNo">1610</span>    int numServers = servers.size();<a name="line.1610"></a>
-<span class="sourceLineNo">1611</span>    int numRegions = regions.size();<a name="line.1611"></a>
-<span class="sourceLineNo">1612</span>    int max = (int) Math.ceil((float) numRegions / numServers);<a name="line.1612"></a>
-<span class="sourceLineNo">1613</span>    int serverIdx = 0;<a name="line.1613"></a>
-<span class="sourceLineNo">1614</span>    if (numServers &gt; 1) {<a name="line.1614"></a>
-<span class="sourceLineNo">1615</span>      serverIdx = RANDOM.nextInt(numServers);<a name="line.1615"></a>
-<span class="sourceLineNo">1616</span>    }<a name="line.1616"></a>
-<span class="sourceLineNo">1617</span>    int regionIdx = 0;<a name="line.1617"></a>
-<span class="sourceLineNo">1618</span><a name="line.1618"></a>
-<span class="sourceLineNo">1619</span>    for (int j = 0; j &lt; numServers; j++) {<a name="line.1619"></a>
-<span class="sourceLineNo">1620</span>      ServerName server = servers.get((j + serverIdx) % numServers);<a name="line.1620"></a>
-<span class="sourceLineNo">1621</span>      List&lt;RegionInfo&gt; serverRegions = new ArrayList&lt;&gt;(max);<a name="line.1621"></a>
-<span class="sourceLineNo">1622</span>      for (int i = regionIdx; i &lt; numRegions; i += numServers) {<a name="line.1622"></a>
-<span class="sourceLineNo">1623</span>        RegionInfo region = regions.get(i % numRegions);<a name="line.1623"></a>
-<span class="sourceLineNo">1624</span>        if (cluster.wouldLowerAvailability(region, server)) {<a name="line.1624"></a>
-<span class="sourceLineNo">1625</span>          unassignedRegions.add(region);<a name="line.1625"></a>
-<span class="sourceLineNo">1626</span>        } else {<a name="line.1626"></a>
-<span class="sourceLineNo">1627</span>          serverRegions.add(region);<a name="line.1627"></a>
-<span class="sourceLineNo">1628</span>          cluster.doAssignRegion(region, server);<a name="line.1628"></a>
-<span class="sourceLineNo">1629</span>        }<a name="line.1629"></a>
-<span class="sourceLineNo">1630</span>      }<a name="line.1630"></a>
-<span class="sourceLineNo">1631</span>      assignments.put(server, serverRegions);<a name="line.1631"></a>
-<span class="sourceLineNo">1632</span>      regionIdx++;<a name="line.1632"></a>
-<span class="sourceLineNo">1633</span>    }<a name="line.1633"></a>
-<span class="sourceLineNo">1634</span>  }<a name="line.1634"></a>
-<span class="sourceLineNo">1635</span><a name="line.1635"></a>
-<span class="sourceLineNo">1636</span>  protected Map&lt;ServerName, List&lt;RegionInfo&gt;&gt; getRegionAssignmentsByServer(<a name="line.1636"></a>
-<span class="sourceLineNo">1637</span>    Collection&lt;RegionInfo&gt; regions) {<a name="line.1637"></a>
-<span class="sourceLineNo">1638</span>    if (this.services != null &amp;&amp; this.services.getAssignmentManager() != null) {<a name="line.1638"></a>
-<span class="sourceLineNo">1639</span>      return this.services.getAssignmentManager().getSnapShotOfAssignment(regions);<a name="line.1639"></a>
-<span class="sourceLineNo">1640</span>    } else {<a name="line.1640"></a>
-<span class="sourceLineNo">1641</span>      return new HashMap&lt;&gt;();<a name="line.1641"></a>
-<span class="sourceLineNo">1642</span>    }<a name="line.1642"></a>
-<span class="sourceLineNo">1643</span>  }<a name="line.1643"></a>
-<span class="sourceLineNo">1644</span><a name="line.1644"></a>
-<span class="sourceLineNo">1645</span>  @Override<a name="line.1645"></a>
-<span class="sourceLineNo">1646</span>  public void onConfigurationChange(Configuration conf) {<a name="line.1646"></a>
-<span class="sourceLineNo">1647</span>  }<a name="line.1647"></a>
-<span class="sourceLineNo">1648</span>}<a name="line.1648"></a>
+<span class="sourceLineNo">1044</span>  /**<a name="line.1044"></a>
+<span class="sourceLineNo">1045</span>   * Check if a region belongs to some system table.<a name="line.1045"></a>
+<span class="sourceLineNo">1046</span>   * If so, the primary replica may be expected to be put on the master regionserver.<a name="line.1046"></a>
+<span class="sourceLineNo">1047</span>   */<a name="line.1047"></a>
+<span class="sourceLineNo">1048</span>  public boolean shouldBeOnMaster(RegionInfo region) {<a name="line.1048"></a>
+<span class="sourceLineNo">1049</span>    return (this.maintenanceMode || this.onlySystemTablesOnMaster)<a name="line.1049"></a>
+<span class="sourceLineNo">1050</span>        &amp;&amp; region.getTable().isSystemTable();<a name="line.1050"></a>
+<span class="sourceLineNo">1051</span>  }<a name="line.1051"></a>
+<span class="sourceLineNo">1052</span><a name="line.1052"></a>
+<span class="sourceLineNo">1053</span>  /**<a name="line.1053"></a>
+<span class="sourceLineNo">1054</span>   * Balance the regions that should be on master regionserver.<a name="line.1054"></a>
+<span class="sourceLineNo">1055</span>   */<a name="line.1055"></a>
+<span class="sourceLineNo">1056</span>  protected List&lt;RegionPlan&gt; balanceMasterRegions(Map&lt;ServerName, List&lt;RegionInfo&gt;&gt; clusterMap) {<a name="line.1056"></a>
+<span class="sourceLineNo">1057</span>    if (masterServerName == null || clusterMap == null || clusterMap.size() &lt;= 1) return null;<a name="line.1057"></a>
+<span class="sourceLineNo">1058</span>    List&lt;RegionPlan&gt; plans = null;<a name="line.1058"></a>
+<span class="sourceLineNo">1059</span>    List&lt;RegionInfo&gt; regions = clusterMap.get(masterServerName);<a name="line.1059"></a>
+<span class="sourceLineNo">1060</span>    if (regions != null) {<a name="line.1060"></a>
+<span class="sourceLineNo">1061</span>      Iterator&lt;ServerName&gt; keyIt = null;<a name="line.1061"></a>
+<span class="sourceLineNo">1062</span>      for (RegionInfo region: regions) {<a name="line.1062"></a>
+<span class="sourceLineNo">1063</span>        if (shouldBeOnMaster(region)) continue;<a name="line.1063"></a>
+<span class="sourceLineNo">1064</span><a name="line.1064"></a>
+<span class="sourceLineNo">1065</span>        // Find a non-master regionserver to host the region<a name="line.1065"></a>
+<span class="sourceLineNo">1066</span>        if (keyIt == null || !keyIt.hasNext()) {<a name="line.1066"></a>
+<span class="sourceLineNo">1067</span>          keyIt = clusterMap.keySet().iterator();<a name="line.1067"></a>
+<span class="sourceLineNo">1068</span>        }<a name="line.1068"></a>
+<span class="sourceLineNo">1069</span>        ServerName dest = keyIt.next();<a name="line.1069"></a>
+<span class="sourceLineNo">1070</span>        if (masterServerName.equals(dest)) {<a name="line.1070"></a>
+<span class="sourceLineNo">1071</span>          if (!keyIt.hasNext()) {<a name="line.1071"></a>
+<span class="sourceLineNo">1072</span>            keyIt = clusterMap.keySet().iterator();<a name="line.1072"></a>
+<span class="sourceLineNo">1073</span>          }<a name="line.1073"></a>
+<span class="sourceLineNo">1074</span>          dest = keyIt.next();<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>        // Move this region away from the master regionserver<a name="line.1077"></a>
+<span class="sourceLineNo">1078</span>        RegionPlan plan = new RegionPlan(region, masterServerName, dest);<a name="line.1078"></a>
+<span class="sourceLineNo">1079</span>        if (plans == null) {<a name="line.1079"></a>
+<span class="sourceLineNo">1080</span>          plans = new ArrayList&lt;&gt;();<a name="line.1080"></a>
+<span class="sourceLineNo">1081</span>        }<a name="line.1081"></a>
+<span class="sourceLineNo">1082</span>        plans.add(plan);<a name="line.1082"></a>
+<span class="sourceLineNo">1083</span>      }<a name="line.1083"></a>
+<span class="sourceLineNo">1084</span>    }<a name="line.1084"></a>
+<span class="sourceLineNo">1085</span>    for (Map.Entry&lt;ServerName, List&lt;RegionInfo&gt;&gt; server: clusterMap.entrySet()) {<a name="line.1085"></a>
+<span class="sourceLineNo">1086</span>      if (masterServerName.equals(server.getKey())) continue;<a name="line.1086"></a>
+<span class="sourceLineNo">1087</span>      for (RegionInfo region: server.getValue()) {<a name="line.1087"></a>
+<span class="sourceLineNo">1088</span>        if (!shouldBeOnMaster(region)) continue;<a name="line.1088"></a>
+<span class="sourceLineNo">1089</span><a name="line.1089"></a>
+<span class="sourceLineNo">1090</span>        // Move this region to the master regionserver<a name="line.1090"></a>
+<span class="sourceLineNo">1091</span>        RegionPlan plan = new RegionPlan(region, server.getKey(), masterServerName);<a name="line.1091"></a>
+<span class="sourceLineNo">1092</span>        if (plans == null) {<a name="line.1092"></a>
+<span class="sourceLineNo">1093</span>          plans = new ArrayList&lt;&gt;();<a name="line.1093"></a>
+<span class="sourceLineNo">1094</span>        }<a name="line.1094"></a>
+<span class="sourceLineNo">1095</span>        plans.add(plan);<a name="line.1095"></a>
+<span class="sourceLineNo">1096</span>      }<a name="line.1096"></a>
+<span class="sourceLineNo">1097</span>    }<a name="line.1097"></a>
+<span class="sourceLineNo">1098</span>    return plans;<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>  /**<a name="line.1101"></a>
+<span class="sourceLineNo">1102</span>   * If master is configured to carry system tables only, in here is<a name="line.1102"></a>
+<span class="sourceLineNo">1103</span>   * where we figure what to assign it.<a name="line.1103"></a>
+<span class="sourceLineNo">1104</span>   */<a name="line.1104"></a>
+<span class="sourceLineNo">1105</span>  protected Map&lt;ServerName, List&lt;RegionInfo&gt;&gt; assignMasterSystemRegions(<a name="line.1105"></a>
+<span class="sourceLineNo">1106</span>      Collection&lt;RegionInfo&gt; regions, List&lt;ServerName&gt; servers) {<a name="line.1106"></a>
+<span class="sourceLineNo">1107</span>    if (servers == null || regions == null || regions.isEmpty()) {<a name="line.1107"></a>
+<span class="sourceLineNo">1108</span>      return null;<a name="line.1108"></a>
+<span class="sourceLineNo">1109</span>    }<a name="line.1109"></a>
+<span class="sourceLineNo">1110</span>    Map&lt;ServerName, List&lt;RegionInfo&gt;&gt; assignments = new TreeMap&lt;&gt;();<a name="line.1110"></a>
+<span class="sourceLineNo">1111</span>    if (this.maintenanceMode || this.onlySystemTablesOnMaster) {<a name="line.1111"></a>
+<span class="sourceLineNo">1112</span>      if (masterServerName != null &amp;&amp; servers.contains(masterServerName)) {<a name="line.1112"></a>
+<span class="sourceLineNo">1113</span>        assignments.put(masterServerName, new ArrayList&lt;&gt;());<a name="line.1113"></a>
+<span class="sourceLineNo">1114</span>        for (RegionInfo region : regions) {<a name="line.1114"></a>
+<span class="sourceLineNo">1115</span>          if (shouldBeOnMaster(region)) {<a name="line.1115"></a>
+<span class="sourceLineNo">1116</span>            assignments.get(masterServerName).add(region);<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>      }<a name="line.1119"></a>
+<span class="sourceLineNo">1120</span>    }<a name="line.1120"></a>
+<span class="sourceLineNo">1121</span>    return assignments;<a name="line.1121"></a>
+<span class="sourceLineNo">1122</span>  }<a name="line.1122"></a>
+<span class="sourceLineNo">1123</span><a name="line.1123"></a>
+<span class="sourceLineNo">1124</span>  @Override<a name="line.1124"></a>
+<span class="sourceLineNo">1125</span>  public Configuration getConf() {<a name="line.1125"></a>
+<span class="sourceLineNo">1126</span>    return this.config;<a name="line.1126"></a>
+<span class="sourceLineNo">1127</span>  }<a name="line.1127"></a>
+<span class="sourceLineNo">1128</span><a name="line.1128"></a>
+<span class="sourceLineNo">1129</span>  @Override<a name="line.1129"></a>
+<span class="sourceLineNo">1130</span>  public synchronized void setClusterMetrics(ClusterMetrics st) {<a name="line.1130"></a>
+<span class="sourceLineNo">1131</span>    this.clusterStatus = st;<a name="line.1131"></a>
+<span class="sourceLineNo">1132</span>    if (useRegionFinder) {<a name="line.1132"></a>
+<span class="sourceLineNo">1133</span>      regionFinder.setClusterMetrics(st);<a name="line.1133"></a>
+<span class="sourceLineNo">1134</span>    }<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 void setClusterLoad(Map&lt;TableName, Map&lt;ServerName, List&lt;RegionInfo&gt;&gt;&gt; clusterLoad){<a name="line.1138"></a>
+<span class="sourceLineNo">1139</span><a name="line.1139"></a>
+<span class="sourceLineNo">1140</span>  }<a name="line.1140"></a>
+<span class="sourceLineNo">1141</span><a name="line.1141"></a>
+<span class="sourceLineNo">1142</span>  @Override<a name="line.1142"></a>
+<span class="sourceLineNo">1143</span>  public void setMasterServices(MasterServices masterServices) {<a name="line.1143"></a>
+<span class="sourceLineNo">1144</span>    masterServerName = masterServices.getServerName();<a name="line.1144"></a>
+<span class="sourceLineNo">1145</span>    this.services = masterServices;<a name="line.1145"></a>
+<span class="sourceLineNo">1146</span>    if (useRegionFinder) {<a name="line.1146"></a>
+<span class="sourceLineNo">1147</span>      this.regionFinder.setServices(masterServices);<a name="line.1147"></a>
+<span class="sourceLineNo">1148</span>    }<a name="line.1148"></a>
+<span class="sourceLineNo">1149</span>    if (this.services.isInMaintenanceMode()) {<a name="line.1149"></a>
+<span class="sourceLineNo">1150</span>      this.maintenanceMode = true;<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><a name="line.1153"></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 (this.maintenanceMode || 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 c

<TRUNCATED>

[34/46] hbase-site git commit: Published site at 05d22ed960204183fbd9bd16f1dbca6410ccde76.

Posted by gi...@apache.org.
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/3649682c/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 9fbe400..b7a2a38 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
@@ -215,3746 +215,3748 @@
 <span class="sourceLineNo">207</span>import org.apache.hadoop.hbase.util.VersionInfo;<a name="line.207"></a>
 <span class="sourceLineNo">208</span>import org.apache.hadoop.hbase.zookeeper.LoadBalancerTracker;<a name="line.208"></a>
 <span class="sourceLineNo">209</span>import org.apache.hadoop.hbase.zookeeper.MasterAddressTracker;<a name="line.209"></a>
-<span class="sourceLineNo">210</span>import org.apache.hadoop.hbase.zookeeper.MasterMaintenanceModeTracker;<a name="line.210"></a>
-<span class="sourceLineNo">211</span>import org.apache.hadoop.hbase.zookeeper.RegionNormalizerTracker;<a name="line.211"></a>
-<span class="sourceLineNo">212</span>import org.apache.hadoop.hbase.zookeeper.ZKClusterId;<a name="line.212"></a>
-<span class="sourceLineNo">213</span>import org.apache.hadoop.hbase.zookeeper.ZKUtil;<a name="line.213"></a>
-<span class="sourceLineNo">214</span>import org.apache.hadoop.hbase.zookeeper.ZKWatcher;<a name="line.214"></a>
-<span class="sourceLineNo">215</span>import org.apache.hadoop.hbase.zookeeper.ZNodePaths;<a name="line.215"></a>
-<span class="sourceLineNo">216</span>import org.apache.yetus.audience.InterfaceAudience;<a name="line.216"></a>
-<span class="sourceLineNo">217</span>import org.apache.zookeeper.KeeperException;<a name="line.217"></a>
-<span class="sourceLineNo">218</span>import org.eclipse.jetty.server.Server;<a name="line.218"></a>
-<span class="sourceLineNo">219</span>import org.eclipse.jetty.server.ServerConnector;<a name="line.219"></a>
-<span class="sourceLineNo">220</span>import org.eclipse.jetty.servlet.ServletHolder;<a name="line.220"></a>
-<span class="sourceLineNo">221</span>import org.eclipse.jetty.webapp.WebAppContext;<a name="line.221"></a>
-<span class="sourceLineNo">222</span>import org.slf4j.Logger;<a name="line.222"></a>
-<span class="sourceLineNo">223</span>import org.slf4j.LoggerFactory;<a name="line.223"></a>
-<span class="sourceLineNo">224</span><a name="line.224"></a>
-<span class="sourceLineNo">225</span>import org.apache.hbase.thirdparty.com.google.common.annotations.VisibleForTesting;<a name="line.225"></a>
-<span class="sourceLineNo">226</span>import org.apache.hbase.thirdparty.com.google.common.collect.ImmutableSet;<a name="line.226"></a>
-<span class="sourceLineNo">227</span>import org.apache.hbase.thirdparty.com.google.common.collect.Lists;<a name="line.227"></a>
-<span class="sourceLineNo">228</span>import org.apache.hbase.thirdparty.com.google.common.collect.Maps;<a name="line.228"></a>
-<span class="sourceLineNo">229</span><a name="line.229"></a>
-<span class="sourceLineNo">230</span>import org.apache.hadoop.hbase.shaded.protobuf.ProtobufUtil;<a name="line.230"></a>
-<span class="sourceLineNo">231</span>import org.apache.hadoop.hbase.shaded.protobuf.generated.AdminProtos.GetRegionInfoResponse.CompactionState;<a name="line.231"></a>
-<span class="sourceLineNo">232</span>import org.apache.hadoop.hbase.shaded.protobuf.generated.QuotaProtos.Quotas;<a name="line.232"></a>
-<span class="sourceLineNo">233</span>import org.apache.hadoop.hbase.shaded.protobuf.generated.QuotaProtos.SpaceViolationPolicy;<a name="line.233"></a>
-<span class="sourceLineNo">234</span>import org.apache.hadoop.hbase.shaded.protobuf.generated.SnapshotProtos.SnapshotDescription;<a name="line.234"></a>
-<span class="sourceLineNo">235</span>import org.apache.hadoop.hbase.shaded.protobuf.generated.WALProtos;<a name="line.235"></a>
-<span class="sourceLineNo">236</span><a name="line.236"></a>
-<span class="sourceLineNo">237</span>/**<a name="line.237"></a>
-<span class="sourceLineNo">238</span> * HMaster is the "master server" for HBase. An HBase cluster has one active<a name="line.238"></a>
-<span class="sourceLineNo">239</span> * master.  If many masters are started, all compete.  Whichever wins goes on to<a name="line.239"></a>
-<span class="sourceLineNo">240</span> * run the cluster.  All others park themselves in their constructor until<a name="line.240"></a>
-<span class="sourceLineNo">241</span> * master or cluster shutdown or until the active master loses its lease in<a name="line.241"></a>
-<span class="sourceLineNo">242</span> * zookeeper.  Thereafter, all running master jostle to take over master role.<a name="line.242"></a>
-<span class="sourceLineNo">243</span> *<a name="line.243"></a>
-<span class="sourceLineNo">244</span> * &lt;p&gt;The Master can be asked shutdown the cluster. See {@link #shutdown()}.  In<a name="line.244"></a>
-<span class="sourceLineNo">245</span> * this case it will tell all regionservers to go down and then wait on them<a name="line.245"></a>
-<span class="sourceLineNo">246</span> * all reporting in that they are down.  This master will then shut itself down.<a name="line.246"></a>
-<span class="sourceLineNo">247</span> *<a name="line.247"></a>
-<span class="sourceLineNo">248</span> * &lt;p&gt;You can also shutdown just this master.  Call {@link #stopMaster()}.<a name="line.248"></a>
-<span class="sourceLineNo">249</span> *<a name="line.249"></a>
-<span class="sourceLineNo">250</span> * @see org.apache.zookeeper.Watcher<a name="line.250"></a>
-<span class="sourceLineNo">251</span> */<a name="line.251"></a>
-<span class="sourceLineNo">252</span>@InterfaceAudience.LimitedPrivate(HBaseInterfaceAudience.TOOLS)<a name="line.252"></a>
-<span class="sourceLineNo">253</span>@SuppressWarnings("deprecation")<a name="line.253"></a>
-<span class="sourceLineNo">254</span>public class HMaster extends HRegionServer implements MasterServices {<a name="line.254"></a>
-<span class="sourceLineNo">255</span>  private static Logger LOG = LoggerFactory.getLogger(HMaster.class);<a name="line.255"></a>
-<span class="sourceLineNo">256</span><a name="line.256"></a>
-<span class="sourceLineNo">257</span>  /**<a name="line.257"></a>
-<span class="sourceLineNo">258</span>   * Protection against zombie master. Started once Master accepts active responsibility and<a name="line.258"></a>
-<span class="sourceLineNo">259</span>   * starts taking over responsibilities. Allows a finite time window before giving up ownership.<a name="line.259"></a>
-<span class="sourceLineNo">260</span>   */<a name="line.260"></a>
-<span class="sourceLineNo">261</span>  private static class InitializationMonitor extends HasThread {<a name="line.261"></a>
-<span class="sourceLineNo">262</span>    /** The amount of time in milliseconds to sleep before checking initialization status. */<a name="line.262"></a>
-<span class="sourceLineNo">263</span>    public static final String TIMEOUT_KEY = "hbase.master.initializationmonitor.timeout";<a name="line.263"></a>
-<span class="sourceLineNo">264</span>    public static final long TIMEOUT_DEFAULT = TimeUnit.MILLISECONDS.convert(15, TimeUnit.MINUTES);<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>     * When timeout expired and initialization has not complete, call {@link System#exit(int)} when<a name="line.267"></a>
-<span class="sourceLineNo">268</span>     * true, do nothing otherwise.<a name="line.268"></a>
-<span class="sourceLineNo">269</span>     */<a name="line.269"></a>
-<span class="sourceLineNo">270</span>    public static final String HALT_KEY = "hbase.master.initializationmonitor.haltontimeout";<a name="line.270"></a>
-<span class="sourceLineNo">271</span>    public static final boolean HALT_DEFAULT = false;<a name="line.271"></a>
-<span class="sourceLineNo">272</span><a name="line.272"></a>
-<span class="sourceLineNo">273</span>    private final HMaster master;<a name="line.273"></a>
-<span class="sourceLineNo">274</span>    private final long timeout;<a name="line.274"></a>
-<span class="sourceLineNo">275</span>    private final boolean haltOnTimeout;<a name="line.275"></a>
-<span class="sourceLineNo">276</span><a name="line.276"></a>
-<span class="sourceLineNo">277</span>    /** Creates a Thread that monitors the {@link #isInitialized()} state. */<a name="line.277"></a>
-<span class="sourceLineNo">278</span>    InitializationMonitor(HMaster master) {<a name="line.278"></a>
-<span class="sourceLineNo">279</span>      super("MasterInitializationMonitor");<a name="line.279"></a>
-<span class="sourceLineNo">280</span>      this.master = master;<a name="line.280"></a>
-<span class="sourceLineNo">281</span>      this.timeout = master.getConfiguration().getLong(TIMEOUT_KEY, TIMEOUT_DEFAULT);<a name="line.281"></a>
-<span class="sourceLineNo">282</span>      this.haltOnTimeout = master.getConfiguration().getBoolean(HALT_KEY, HALT_DEFAULT);<a name="line.282"></a>
-<span class="sourceLineNo">283</span>      this.setDaemon(true);<a name="line.283"></a>
-<span class="sourceLineNo">284</span>    }<a name="line.284"></a>
-<span class="sourceLineNo">285</span><a name="line.285"></a>
-<span class="sourceLineNo">286</span>    @Override<a name="line.286"></a>
-<span class="sourceLineNo">287</span>    public void run() {<a name="line.287"></a>
-<span class="sourceLineNo">288</span>      try {<a name="line.288"></a>
-<span class="sourceLineNo">289</span>        while (!master.isStopped() &amp;&amp; master.isActiveMaster()) {<a name="line.289"></a>
-<span class="sourceLineNo">290</span>          Thread.sleep(timeout);<a name="line.290"></a>
-<span class="sourceLineNo">291</span>          if (master.isInitialized()) {<a name="line.291"></a>
-<span class="sourceLineNo">292</span>            LOG.debug("Initialization completed within allotted tolerance. Monitor exiting.");<a name="line.292"></a>
-<span class="sourceLineNo">293</span>          } else {<a name="line.293"></a>
-<span class="sourceLineNo">294</span>            LOG.error("Master failed to complete initialization after " + timeout + "ms. Please"<a name="line.294"></a>
-<span class="sourceLineNo">295</span>                + " consider submitting a bug report including a thread dump of this process.");<a name="line.295"></a>
-<span class="sourceLineNo">296</span>            if (haltOnTimeout) {<a name="line.296"></a>
-<span class="sourceLineNo">297</span>              LOG.error("Zombie Master exiting. Thread dump to stdout");<a name="line.297"></a>
-<span class="sourceLineNo">298</span>              Threads.printThreadInfo(System.out, "Zombie HMaster");<a name="line.298"></a>
-<span class="sourceLineNo">299</span>              System.exit(-1);<a name="line.299"></a>
-<span class="sourceLineNo">300</span>            }<a name="line.300"></a>
-<span class="sourceLineNo">301</span>          }<a name="line.301"></a>
-<span class="sourceLineNo">302</span>        }<a name="line.302"></a>
-<span class="sourceLineNo">303</span>      } catch (InterruptedException ie) {<a name="line.303"></a>
-<span class="sourceLineNo">304</span>        LOG.trace("InitMonitor thread interrupted. Existing.");<a name="line.304"></a>
-<span class="sourceLineNo">305</span>      }<a name="line.305"></a>
-<span class="sourceLineNo">306</span>    }<a name="line.306"></a>
-<span class="sourceLineNo">307</span>  }<a name="line.307"></a>
-<span class="sourceLineNo">308</span><a name="line.308"></a>
-<span class="sourceLineNo">309</span>  // MASTER is name of the webapp and the attribute name used stuffing this<a name="line.309"></a>
-<span class="sourceLineNo">310</span>  //instance into web context.<a name="line.310"></a>
-<span class="sourceLineNo">311</span>  public static final String MASTER = "master";<a name="line.311"></a>
-<span class="sourceLineNo">312</span><a name="line.312"></a>
-<span class="sourceLineNo">313</span>  // Manager and zk listener for master election<a name="line.313"></a>
-<span class="sourceLineNo">314</span>  private final ActiveMasterManager activeMasterManager;<a name="line.314"></a>
-<span class="sourceLineNo">315</span>  // Region server tracker<a name="line.315"></a>
-<span class="sourceLineNo">316</span>  private RegionServerTracker regionServerTracker;<a name="line.316"></a>
-<span class="sourceLineNo">317</span>  // Draining region server tracker<a name="line.317"></a>
-<span class="sourceLineNo">318</span>  private DrainingServerTracker drainingServerTracker;<a name="line.318"></a>
-<span class="sourceLineNo">319</span>  // Tracker for load balancer state<a name="line.319"></a>
-<span class="sourceLineNo">320</span>  LoadBalancerTracker loadBalancerTracker;<a name="line.320"></a>
-<span class="sourceLineNo">321</span>  // Tracker for meta location, if any client ZK quorum specified<a name="line.321"></a>
-<span class="sourceLineNo">322</span>  MetaLocationSyncer metaLocationSyncer;<a name="line.322"></a>
-<span class="sourceLineNo">323</span>  // Tracker for active master location, if any client ZK quorum specified<a name="line.323"></a>
-<span class="sourceLineNo">324</span>  MasterAddressSyncer masterAddressSyncer;<a name="line.324"></a>
-<span class="sourceLineNo">325</span><a name="line.325"></a>
-<span class="sourceLineNo">326</span>  // Tracker for split and merge state<a name="line.326"></a>
-<span class="sourceLineNo">327</span>  private SplitOrMergeTracker splitOrMergeTracker;<a name="line.327"></a>
-<span class="sourceLineNo">328</span><a name="line.328"></a>
-<span class="sourceLineNo">329</span>  // Tracker for region normalizer state<a name="line.329"></a>
-<span class="sourceLineNo">330</span>  private RegionNormalizerTracker regionNormalizerTracker;<a name="line.330"></a>
-<span class="sourceLineNo">331</span><a name="line.331"></a>
-<span class="sourceLineNo">332</span>  //Tracker for master maintenance mode setting<a name="line.332"></a>
-<span class="sourceLineNo">333</span>  private MasterMaintenanceModeTracker maintenanceModeTracker;<a name="line.333"></a>
-<span class="sourceLineNo">334</span><a name="line.334"></a>
-<span class="sourceLineNo">335</span>  private ClusterSchemaService clusterSchemaService;<a name="line.335"></a>
+<span class="sourceLineNo">210</span>import org.apache.hadoop.hbase.zookeeper.RegionNormalizerTracker;<a name="line.210"></a>
+<span class="sourceLineNo">211</span>import org.apache.hadoop.hbase.zookeeper.ZKClusterId;<a name="line.211"></a>
+<span class="sourceLineNo">212</span>import org.apache.hadoop.hbase.zookeeper.ZKUtil;<a name="line.212"></a>
+<span class="sourceLineNo">213</span>import org.apache.hadoop.hbase.zookeeper.ZKWatcher;<a name="line.213"></a>
+<span class="sourceLineNo">214</span>import org.apache.hadoop.hbase.zookeeper.ZNodePaths;<a name="line.214"></a>
+<span class="sourceLineNo">215</span>import org.apache.yetus.audience.InterfaceAudience;<a name="line.215"></a>
+<span class="sourceLineNo">216</span>import org.apache.zookeeper.KeeperException;<a name="line.216"></a>
+<span class="sourceLineNo">217</span>import org.eclipse.jetty.server.Server;<a name="line.217"></a>
+<span class="sourceLineNo">218</span>import org.eclipse.jetty.server.ServerConnector;<a name="line.218"></a>
+<span class="sourceLineNo">219</span>import org.eclipse.jetty.servlet.ServletHolder;<a name="line.219"></a>
+<span class="sourceLineNo">220</span>import org.eclipse.jetty.webapp.WebAppContext;<a name="line.220"></a>
+<span class="sourceLineNo">221</span>import org.slf4j.Logger;<a name="line.221"></a>
+<span class="sourceLineNo">222</span>import org.slf4j.LoggerFactory;<a name="line.222"></a>
+<span class="sourceLineNo">223</span><a name="line.223"></a>
+<span class="sourceLineNo">224</span>import org.apache.hbase.thirdparty.com.google.common.annotations.VisibleForTesting;<a name="line.224"></a>
+<span class="sourceLineNo">225</span>import org.apache.hbase.thirdparty.com.google.common.collect.ImmutableSet;<a name="line.225"></a>
+<span class="sourceLineNo">226</span>import org.apache.hbase.thirdparty.com.google.common.collect.Lists;<a name="line.226"></a>
+<span class="sourceLineNo">227</span>import org.apache.hbase.thirdparty.com.google.common.collect.Maps;<a name="line.227"></a>
+<span class="sourceLineNo">228</span><a name="line.228"></a>
+<span class="sourceLineNo">229</span>import org.apache.hadoop.hbase.shaded.protobuf.ProtobufUtil;<a name="line.229"></a>
+<span class="sourceLineNo">230</span>import org.apache.hadoop.hbase.shaded.protobuf.generated.AdminProtos.GetRegionInfoResponse.CompactionState;<a name="line.230"></a>
+<span class="sourceLineNo">231</span>import org.apache.hadoop.hbase.shaded.protobuf.generated.QuotaProtos.Quotas;<a name="line.231"></a>
+<span class="sourceLineNo">232</span>import org.apache.hadoop.hbase.shaded.protobuf.generated.QuotaProtos.SpaceViolationPolicy;<a name="line.232"></a>
+<span class="sourceLineNo">233</span>import org.apache.hadoop.hbase.shaded.protobuf.generated.SnapshotProtos.SnapshotDescription;<a name="line.233"></a>
+<span class="sourceLineNo">234</span>import org.apache.hadoop.hbase.shaded.protobuf.generated.WALProtos;<a name="line.234"></a>
+<span class="sourceLineNo">235</span><a name="line.235"></a>
+<span class="sourceLineNo">236</span>/**<a name="line.236"></a>
+<span class="sourceLineNo">237</span> * HMaster is the "master server" for HBase. An HBase cluster has one active<a name="line.237"></a>
+<span class="sourceLineNo">238</span> * master.  If many masters are started, all compete.  Whichever wins goes on to<a name="line.238"></a>
+<span class="sourceLineNo">239</span> * run the cluster.  All others park themselves in their constructor until<a name="line.239"></a>
+<span class="sourceLineNo">240</span> * master or cluster shutdown or until the active master loses its lease in<a name="line.240"></a>
+<span class="sourceLineNo">241</span> * zookeeper.  Thereafter, all running master jostle to take over master role.<a name="line.241"></a>
+<span class="sourceLineNo">242</span> *<a name="line.242"></a>
+<span class="sourceLineNo">243</span> * &lt;p&gt;The Master can be asked shutdown the cluster. See {@link #shutdown()}.  In<a name="line.243"></a>
+<span class="sourceLineNo">244</span> * this case it will tell all regionservers to go down and then wait on them<a name="line.244"></a>
+<span class="sourceLineNo">245</span> * all reporting in that they are down.  This master will then shut itself down.<a name="line.245"></a>
+<span class="sourceLineNo">246</span> *<a name="line.246"></a>
+<span class="sourceLineNo">247</span> * &lt;p&gt;You can also shutdown just this master.  Call {@link #stopMaster()}.<a name="line.247"></a>
+<span class="sourceLineNo">248</span> *<a name="line.248"></a>
+<span class="sourceLineNo">249</span> * @see org.apache.zookeeper.Watcher<a name="line.249"></a>
+<span class="sourceLineNo">250</span> */<a name="line.250"></a>
+<span class="sourceLineNo">251</span>@InterfaceAudience.LimitedPrivate(HBaseInterfaceAudience.TOOLS)<a name="line.251"></a>
+<span class="sourceLineNo">252</span>@SuppressWarnings("deprecation")<a name="line.252"></a>
+<span class="sourceLineNo">253</span>public class HMaster extends HRegionServer implements MasterServices {<a name="line.253"></a>
+<span class="sourceLineNo">254</span>  private static Logger LOG = LoggerFactory.getLogger(HMaster.class);<a name="line.254"></a>
+<span class="sourceLineNo">255</span><a name="line.255"></a>
+<span class="sourceLineNo">256</span>  /**<a name="line.256"></a>
+<span class="sourceLineNo">257</span>   * Protection against zombie master. Started once Master accepts active responsibility and<a name="line.257"></a>
+<span class="sourceLineNo">258</span>   * starts taking over responsibilities. Allows a finite time window before giving up ownership.<a name="line.258"></a>
+<span class="sourceLineNo">259</span>   */<a name="line.259"></a>
+<span class="sourceLineNo">260</span>  private static class InitializationMonitor extends HasThread {<a name="line.260"></a>
+<span class="sourceLineNo">261</span>    /** The amount of time in milliseconds to sleep before checking initialization status. */<a name="line.261"></a>
+<span class="sourceLineNo">262</span>    public static final String TIMEOUT_KEY = "hbase.master.initializationmonitor.timeout";<a name="line.262"></a>
+<span class="sourceLineNo">263</span>    public static final long TIMEOUT_DEFAULT = TimeUnit.MILLISECONDS.convert(15, TimeUnit.MINUTES);<a name="line.263"></a>
+<span class="sourceLineNo">264</span><a name="line.264"></a>
+<span class="sourceLineNo">265</span>    /**<a name="line.265"></a>
+<span class="sourceLineNo">266</span>     * When timeout expired and initialization has not complete, call {@link System#exit(int)} when<a name="line.266"></a>
+<span class="sourceLineNo">267</span>     * true, do nothing otherwise.<a name="line.267"></a>
+<span class="sourceLineNo">268</span>     */<a name="line.268"></a>
+<span class="sourceLineNo">269</span>    public static final String HALT_KEY = "hbase.master.initializationmonitor.haltontimeout";<a name="line.269"></a>
+<span class="sourceLineNo">270</span>    public static final boolean HALT_DEFAULT = false;<a name="line.270"></a>
+<span class="sourceLineNo">271</span><a name="line.271"></a>
+<span class="sourceLineNo">272</span>    private final HMaster master;<a name="line.272"></a>
+<span class="sourceLineNo">273</span>    private final long timeout;<a name="line.273"></a>
+<span class="sourceLineNo">274</span>    private final boolean haltOnTimeout;<a name="line.274"></a>
+<span class="sourceLineNo">275</span><a name="line.275"></a>
+<span class="sourceLineNo">276</span>    /** Creates a Thread that monitors the {@link #isInitialized()} state. */<a name="line.276"></a>
+<span class="sourceLineNo">277</span>    InitializationMonitor(HMaster master) {<a name="line.277"></a>
+<span class="sourceLineNo">278</span>      super("MasterInitializationMonitor");<a name="line.278"></a>
+<span class="sourceLineNo">279</span>      this.master = master;<a name="line.279"></a>
+<span class="sourceLineNo">280</span>      this.timeout = master.getConfiguration().getLong(TIMEOUT_KEY, TIMEOUT_DEFAULT);<a name="line.280"></a>
+<span class="sourceLineNo">281</span>      this.haltOnTimeout = master.getConfiguration().getBoolean(HALT_KEY, HALT_DEFAULT);<a name="line.281"></a>
+<span class="sourceLineNo">282</span>      this.setDaemon(true);<a name="line.282"></a>
+<span class="sourceLineNo">283</span>    }<a name="line.283"></a>
+<span class="sourceLineNo">284</span><a name="line.284"></a>
+<span class="sourceLineNo">285</span>    @Override<a name="line.285"></a>
+<span class="sourceLineNo">286</span>    public void run() {<a name="line.286"></a>
+<span class="sourceLineNo">287</span>      try {<a name="line.287"></a>
+<span class="sourceLineNo">288</span>        while (!master.isStopped() &amp;&amp; master.isActiveMaster()) {<a name="line.288"></a>
+<span class="sourceLineNo">289</span>          Thread.sleep(timeout);<a name="line.289"></a>
+<span class="sourceLineNo">290</span>          if (master.isInitialized()) {<a name="line.290"></a>
+<span class="sourceLineNo">291</span>            LOG.debug("Initialization completed within allotted tolerance. Monitor exiting.");<a name="line.291"></a>
+<span class="sourceLineNo">292</span>          } else {<a name="line.292"></a>
+<span class="sourceLineNo">293</span>            LOG.error("Master failed to complete initialization after " + timeout + "ms. Please"<a name="line.293"></a>
+<span class="sourceLineNo">294</span>                + " consider submitting a bug report including a thread dump of this process.");<a name="line.294"></a>
+<span class="sourceLineNo">295</span>            if (haltOnTimeout) {<a name="line.295"></a>
+<span class="sourceLineNo">296</span>              LOG.error("Zombie Master exiting. Thread dump to stdout");<a name="line.296"></a>
+<span class="sourceLineNo">297</span>              Threads.printThreadInfo(System.out, "Zombie HMaster");<a name="line.297"></a>
+<span class="sourceLineNo">298</span>              System.exit(-1);<a name="line.298"></a>
+<span class="sourceLineNo">299</span>            }<a name="line.299"></a>
+<span class="sourceLineNo">300</span>          }<a name="line.300"></a>
+<span class="sourceLineNo">301</span>        }<a name="line.301"></a>
+<span class="sourceLineNo">302</span>      } catch (InterruptedException ie) {<a name="line.302"></a>
+<span class="sourceLineNo">303</span>        LOG.trace("InitMonitor thread interrupted. Existing.");<a name="line.303"></a>
+<span class="sourceLineNo">304</span>      }<a name="line.304"></a>
+<span class="sourceLineNo">305</span>    }<a name="line.305"></a>
+<span class="sourceLineNo">306</span>  }<a name="line.306"></a>
+<span class="sourceLineNo">307</span><a name="line.307"></a>
+<span class="sourceLineNo">308</span>  // MASTER is name of the webapp and the attribute name used stuffing this<a name="line.308"></a>
+<span class="sourceLineNo">309</span>  //instance into web context.<a name="line.309"></a>
+<span class="sourceLineNo">310</span>  public static final String MASTER = "master";<a name="line.310"></a>
+<span class="sourceLineNo">311</span><a name="line.311"></a>
+<span class="sourceLineNo">312</span>  // Manager and zk listener for master election<a name="line.312"></a>
+<span class="sourceLineNo">313</span>  private final ActiveMasterManager activeMasterManager;<a name="line.313"></a>
+<span class="sourceLineNo">314</span>  // Region server tracker<a name="line.314"></a>
+<span class="sourceLineNo">315</span>  private RegionServerTracker regionServerTracker;<a name="line.315"></a>
+<span class="sourceLineNo">316</span>  // Draining region server tracker<a name="line.316"></a>
+<span class="sourceLineNo">317</span>  private DrainingServerTracker drainingServerTracker;<a name="line.317"></a>
+<span class="sourceLineNo">318</span>  // Tracker for load balancer state<a name="line.318"></a>
+<span class="sourceLineNo">319</span>  LoadBalancerTracker loadBalancerTracker;<a name="line.319"></a>
+<span class="sourceLineNo">320</span>  // Tracker for meta location, if any client ZK quorum specified<a name="line.320"></a>
+<span class="sourceLineNo">321</span>  MetaLocationSyncer metaLocationSyncer;<a name="line.321"></a>
+<span class="sourceLineNo">322</span>  // Tracker for active master location, if any client ZK quorum specified<a name="line.322"></a>
+<span class="sourceLineNo">323</span>  MasterAddressSyncer masterAddressSyncer;<a name="line.323"></a>
+<span class="sourceLineNo">324</span><a name="line.324"></a>
+<span class="sourceLineNo">325</span>  // Tracker for split and merge state<a name="line.325"></a>
+<span class="sourceLineNo">326</span>  private SplitOrMergeTracker splitOrMergeTracker;<a name="line.326"></a>
+<span class="sourceLineNo">327</span><a name="line.327"></a>
+<span class="sourceLineNo">328</span>  // Tracker for region normalizer state<a name="line.328"></a>
+<span class="sourceLineNo">329</span>  private RegionNormalizerTracker regionNormalizerTracker;<a name="line.329"></a>
+<span class="sourceLineNo">330</span><a name="line.330"></a>
+<span class="sourceLineNo">331</span>  private ClusterSchemaService clusterSchemaService;<a name="line.331"></a>
+<span class="sourceLineNo">332</span><a name="line.332"></a>
+<span class="sourceLineNo">333</span>  public static final String HBASE_MASTER_WAIT_ON_SERVICE_IN_SECONDS =<a name="line.333"></a>
+<span class="sourceLineNo">334</span>    "hbase.master.wait.on.service.seconds";<a name="line.334"></a>
+<span class="sourceLineNo">335</span>  public static final int DEFAULT_HBASE_MASTER_WAIT_ON_SERVICE_IN_SECONDS = 5 * 60;<a name="line.335"></a>
 <span class="sourceLineNo">336</span><a name="line.336"></a>
-<span class="sourceLineNo">337</span>  public static final String HBASE_MASTER_WAIT_ON_SERVICE_IN_SECONDS =<a name="line.337"></a>
-<span class="sourceLineNo">338</span>    "hbase.master.wait.on.service.seconds";<a name="line.338"></a>
-<span class="sourceLineNo">339</span>  public static final int DEFAULT_HBASE_MASTER_WAIT_ON_SERVICE_IN_SECONDS = 5 * 60;<a name="line.339"></a>
-<span class="sourceLineNo">340</span><a name="line.340"></a>
-<span class="sourceLineNo">341</span>  // Metrics for the HMaster<a name="line.341"></a>
-<span class="sourceLineNo">342</span>  final MetricsMaster metricsMaster;<a name="line.342"></a>
-<span class="sourceLineNo">343</span>  // file system manager for the master FS operations<a name="line.343"></a>
-<span class="sourceLineNo">344</span>  private MasterFileSystem fileSystemManager;<a name="line.344"></a>
-<span class="sourceLineNo">345</span>  private MasterWalManager walManager;<a name="line.345"></a>
-<span class="sourceLineNo">346</span><a name="line.346"></a>
-<span class="sourceLineNo">347</span>  // server manager to deal with region server info<a name="line.347"></a>
-<span class="sourceLineNo">348</span>  private volatile ServerManager serverManager;<a name="line.348"></a>
-<span class="sourceLineNo">349</span><a name="line.349"></a>
-<span class="sourceLineNo">350</span>  // manager of assignment nodes in zookeeper<a name="line.350"></a>
-<span class="sourceLineNo">351</span>  private AssignmentManager assignmentManager;<a name="line.351"></a>
-<span class="sourceLineNo">352</span><a name="line.352"></a>
-<span class="sourceLineNo">353</span>  // manager of replication<a name="line.353"></a>
-<span class="sourceLineNo">354</span>  private ReplicationPeerManager replicationPeerManager;<a name="line.354"></a>
-<span class="sourceLineNo">355</span><a name="line.355"></a>
-<span class="sourceLineNo">356</span>  private SyncReplicationReplayWALManager syncReplicationReplayWALManager;<a name="line.356"></a>
-<span class="sourceLineNo">357</span><a name="line.357"></a>
-<span class="sourceLineNo">358</span>  // buffer for "fatal error" notices from region servers<a name="line.358"></a>
-<span class="sourceLineNo">359</span>  // in the cluster. This is only used for assisting<a name="line.359"></a>
-<span class="sourceLineNo">360</span>  // operations/debugging.<a name="line.360"></a>
-<span class="sourceLineNo">361</span>  MemoryBoundedLogMessageBuffer rsFatals;<a name="line.361"></a>
-<span class="sourceLineNo">362</span><a name="line.362"></a>
-<span class="sourceLineNo">363</span>  // flag set after we become the active master (used for testing)<a name="line.363"></a>
-<span class="sourceLineNo">364</span>  private volatile boolean activeMaster = false;<a name="line.364"></a>
-<span class="sourceLineNo">365</span><a name="line.365"></a>
-<span class="sourceLineNo">366</span>  // flag set after we complete initialization once active<a name="line.366"></a>
-<span class="sourceLineNo">367</span>  private final ProcedureEvent&lt;?&gt; initialized = new ProcedureEvent&lt;&gt;("master initialized");<a name="line.367"></a>
+<span class="sourceLineNo">337</span>  // Metrics for the HMaster<a name="line.337"></a>
+<span class="sourceLineNo">338</span>  final MetricsMaster metricsMaster;<a name="line.338"></a>
+<span class="sourceLineNo">339</span>  // file system manager for the master FS operations<a name="line.339"></a>
+<span class="sourceLineNo">340</span>  private MasterFileSystem fileSystemManager;<a name="line.340"></a>
+<span class="sourceLineNo">341</span>  private MasterWalManager walManager;<a name="line.341"></a>
+<span class="sourceLineNo">342</span><a name="line.342"></a>
+<span class="sourceLineNo">343</span>  // server manager to deal with region server info<a name="line.343"></a>
+<span class="sourceLineNo">344</span>  private volatile ServerManager serverManager;<a name="line.344"></a>
+<span class="sourceLineNo">345</span><a name="line.345"></a>
+<span class="sourceLineNo">346</span>  // manager of assignment nodes in zookeeper<a name="line.346"></a>
+<span class="sourceLineNo">347</span>  private AssignmentManager assignmentManager;<a name="line.347"></a>
+<span class="sourceLineNo">348</span><a name="line.348"></a>
+<span class="sourceLineNo">349</span>  // manager of replication<a name="line.349"></a>
+<span class="sourceLineNo">350</span>  private ReplicationPeerManager replicationPeerManager;<a name="line.350"></a>
+<span class="sourceLineNo">351</span><a name="line.351"></a>
+<span class="sourceLineNo">352</span>  private SyncReplicationReplayWALManager syncReplicationReplayWALManager;<a name="line.352"></a>
+<span class="sourceLineNo">353</span><a name="line.353"></a>
+<span class="sourceLineNo">354</span>  // buffer for "fatal error" notices from region servers<a name="line.354"></a>
+<span class="sourceLineNo">355</span>  // in the cluster. This is only used for assisting<a name="line.355"></a>
+<span class="sourceLineNo">356</span>  // operations/debugging.<a name="line.356"></a>
+<span class="sourceLineNo">357</span>  MemoryBoundedLogMessageBuffer rsFatals;<a name="line.357"></a>
+<span class="sourceLineNo">358</span><a name="line.358"></a>
+<span class="sourceLineNo">359</span>  // flag set after we become the active master (used for testing)<a name="line.359"></a>
+<span class="sourceLineNo">360</span>  private volatile boolean activeMaster = false;<a name="line.360"></a>
+<span class="sourceLineNo">361</span><a name="line.361"></a>
+<span class="sourceLineNo">362</span>  // flag set after we complete initialization once active<a name="line.362"></a>
+<span class="sourceLineNo">363</span>  private final ProcedureEvent&lt;?&gt; initialized = new ProcedureEvent&lt;&gt;("master initialized");<a name="line.363"></a>
+<span class="sourceLineNo">364</span><a name="line.364"></a>
+<span class="sourceLineNo">365</span>  // flag set after master services are started,<a name="line.365"></a>
+<span class="sourceLineNo">366</span>  // initialization may have not completed yet.<a name="line.366"></a>
+<span class="sourceLineNo">367</span>  volatile boolean serviceStarted = false;<a name="line.367"></a>
 <span class="sourceLineNo">368</span><a name="line.368"></a>
-<span class="sourceLineNo">369</span>  // flag set after master services are started,<a name="line.369"></a>
-<span class="sourceLineNo">370</span>  // initialization may have not completed yet.<a name="line.370"></a>
-<span class="sourceLineNo">371</span>  volatile boolean serviceStarted = false;<a name="line.371"></a>
-<span class="sourceLineNo">372</span><a name="line.372"></a>
-<span class="sourceLineNo">373</span>  // Maximum time we should run balancer for<a name="line.373"></a>
-<span class="sourceLineNo">374</span>  private final int maxBlancingTime;<a name="line.374"></a>
-<span class="sourceLineNo">375</span>  // Maximum percent of regions in transition when balancing<a name="line.375"></a>
-<span class="sourceLineNo">376</span>  private final double maxRitPercent;<a name="line.376"></a>
-<span class="sourceLineNo">377</span><a name="line.377"></a>
-<span class="sourceLineNo">378</span>  private final LockManager lockManager = new LockManager(this);<a name="line.378"></a>
-<span class="sourceLineNo">379</span><a name="line.379"></a>
-<span class="sourceLineNo">380</span>  private LoadBalancer balancer;<a name="line.380"></a>
-<span class="sourceLineNo">381</span>  private RegionNormalizer normalizer;<a name="line.381"></a>
-<span class="sourceLineNo">382</span>  private BalancerChore balancerChore;<a name="line.382"></a>
-<span class="sourceLineNo">383</span>  private RegionNormalizerChore normalizerChore;<a name="line.383"></a>
-<span class="sourceLineNo">384</span>  private ClusterStatusChore clusterStatusChore;<a name="line.384"></a>
-<span class="sourceLineNo">385</span>  private ClusterStatusPublisher clusterStatusPublisherChore = null;<a name="line.385"></a>
-<span class="sourceLineNo">386</span><a name="line.386"></a>
-<span class="sourceLineNo">387</span>  CatalogJanitor catalogJanitorChore;<a name="line.387"></a>
-<span class="sourceLineNo">388</span>  private LogCleaner logCleaner;<a name="line.388"></a>
-<span class="sourceLineNo">389</span>  private HFileCleaner hfileCleaner;<a name="line.389"></a>
-<span class="sourceLineNo">390</span>  private ReplicationBarrierCleaner replicationBarrierCleaner;<a name="line.390"></a>
-<span class="sourceLineNo">391</span>  private ExpiredMobFileCleanerChore expiredMobFileCleanerChore;<a name="line.391"></a>
-<span class="sourceLineNo">392</span>  private MobCompactionChore mobCompactChore;<a name="line.392"></a>
-<span class="sourceLineNo">393</span>  private MasterMobCompactionThread mobCompactThread;<a name="line.393"></a>
-<span class="sourceLineNo">394</span>  // used to synchronize the mobCompactionStates<a name="line.394"></a>
-<span class="sourceLineNo">395</span>  private final IdLock mobCompactionLock = new IdLock();<a name="line.395"></a>
-<span class="sourceLineNo">396</span>  // save the information of mob compactions in tables.<a name="line.396"></a>
-<span class="sourceLineNo">397</span>  // the key is table name, the value is the number of compactions in that table.<a name="line.397"></a>
-<span class="sourceLineNo">398</span>  private Map&lt;TableName, AtomicInteger&gt; mobCompactionStates = Maps.newConcurrentMap();<a name="line.398"></a>
+<span class="sourceLineNo">369</span>  // Maximum time we should run balancer for<a name="line.369"></a>
+<span class="sourceLineNo">370</span>  private final int maxBlancingTime;<a name="line.370"></a>
+<span class="sourceLineNo">371</span>  // Maximum percent of regions in transition when balancing<a name="line.371"></a>
+<span class="sourceLineNo">372</span>  private final double maxRitPercent;<a name="line.372"></a>
+<span class="sourceLineNo">373</span><a name="line.373"></a>
+<span class="sourceLineNo">374</span>  private final LockManager lockManager = new LockManager(this);<a name="line.374"></a>
+<span class="sourceLineNo">375</span><a name="line.375"></a>
+<span class="sourceLineNo">376</span>  private LoadBalancer balancer;<a name="line.376"></a>
+<span class="sourceLineNo">377</span>  private RegionNormalizer normalizer;<a name="line.377"></a>
+<span class="sourceLineNo">378</span>  private BalancerChore balancerChore;<a name="line.378"></a>
+<span class="sourceLineNo">379</span>  private RegionNormalizerChore normalizerChore;<a name="line.379"></a>
+<span class="sourceLineNo">380</span>  private ClusterStatusChore clusterStatusChore;<a name="line.380"></a>
+<span class="sourceLineNo">381</span>  private ClusterStatusPublisher clusterStatusPublisherChore = null;<a name="line.381"></a>
+<span class="sourceLineNo">382</span><a name="line.382"></a>
+<span class="sourceLineNo">383</span>  CatalogJanitor catalogJanitorChore;<a name="line.383"></a>
+<span class="sourceLineNo">384</span>  private LogCleaner logCleaner;<a name="line.384"></a>
+<span class="sourceLineNo">385</span>  private HFileCleaner hfileCleaner;<a name="line.385"></a>
+<span class="sourceLineNo">386</span>  private ReplicationBarrierCleaner replicationBarrierCleaner;<a name="line.386"></a>
+<span class="sourceLineNo">387</span>  private ExpiredMobFileCleanerChore expiredMobFileCleanerChore;<a name="line.387"></a>
+<span class="sourceLineNo">388</span>  private MobCompactionChore mobCompactChore;<a name="line.388"></a>
+<span class="sourceLineNo">389</span>  private MasterMobCompactionThread mobCompactThread;<a name="line.389"></a>
+<span class="sourceLineNo">390</span>  // used to synchronize the mobCompactionStates<a name="line.390"></a>
+<span class="sourceLineNo">391</span>  private final IdLock mobCompactionLock = new IdLock();<a name="line.391"></a>
+<span class="sourceLineNo">392</span>  // save the information of mob compactions in tables.<a name="line.392"></a>
+<span class="sourceLineNo">393</span>  // the key is table name, the value is the number of compactions in that table.<a name="line.393"></a>
+<span class="sourceLineNo">394</span>  private Map&lt;TableName, AtomicInteger&gt; mobCompactionStates = Maps.newConcurrentMap();<a name="line.394"></a>
+<span class="sourceLineNo">395</span><a name="line.395"></a>
+<span class="sourceLineNo">396</span>  MasterCoprocessorHost cpHost;<a name="line.396"></a>
+<span class="sourceLineNo">397</span><a name="line.397"></a>
+<span class="sourceLineNo">398</span>  private final boolean preLoadTableDescriptors;<a name="line.398"></a>
 <span class="sourceLineNo">399</span><a name="line.399"></a>
-<span class="sourceLineNo">400</span>  MasterCoprocessorHost cpHost;<a name="line.400"></a>
-<span class="sourceLineNo">401</span><a name="line.401"></a>
-<span class="sourceLineNo">402</span>  private final boolean preLoadTableDescriptors;<a name="line.402"></a>
-<span class="sourceLineNo">403</span><a name="line.403"></a>
-<span class="sourceLineNo">404</span>  // Time stamps for when a hmaster became active<a name="line.404"></a>
-<span class="sourceLineNo">405</span>  private long masterActiveTime;<a name="line.405"></a>
-<span class="sourceLineNo">406</span><a name="line.406"></a>
-<span class="sourceLineNo">407</span>  // Time stamp for when HMaster finishes becoming Active Master<a name="line.407"></a>
-<span class="sourceLineNo">408</span>  private long masterFinishedInitializationTime;<a name="line.408"></a>
-<span class="sourceLineNo">409</span><a name="line.409"></a>
-<span class="sourceLineNo">410</span>  //should we check the compression codec type at master side, default true, HBASE-6370<a name="line.410"></a>
-<span class="sourceLineNo">411</span>  private final boolean masterCheckCompression;<a name="line.411"></a>
-<span class="sourceLineNo">412</span><a name="line.412"></a>
-<span class="sourceLineNo">413</span>  //should we check encryption settings at master side, default true<a name="line.413"></a>
-<span class="sourceLineNo">414</span>  private final boolean masterCheckEncryption;<a name="line.414"></a>
-<span class="sourceLineNo">415</span><a name="line.415"></a>
-<span class="sourceLineNo">416</span>  Map&lt;String, Service&gt; coprocessorServiceHandlers = Maps.newHashMap();<a name="line.416"></a>
-<span class="sourceLineNo">417</span><a name="line.417"></a>
-<span class="sourceLineNo">418</span>  // monitor for snapshot of hbase tables<a name="line.418"></a>
-<span class="sourceLineNo">419</span>  SnapshotManager snapshotManager;<a name="line.419"></a>
-<span class="sourceLineNo">420</span>  // monitor for distributed procedures<a name="line.420"></a>
-<span class="sourceLineNo">421</span>  private MasterProcedureManagerHost mpmHost;<a name="line.421"></a>
-<span class="sourceLineNo">422</span><a name="line.422"></a>
-<span class="sourceLineNo">423</span>  // it is assigned after 'initialized' guard set to true, so should be volatile<a name="line.423"></a>
-<span class="sourceLineNo">424</span>  private volatile MasterQuotaManager quotaManager;<a name="line.424"></a>
-<span class="sourceLineNo">425</span>  private SpaceQuotaSnapshotNotifier spaceQuotaSnapshotNotifier;<a name="line.425"></a>
-<span class="sourceLineNo">426</span>  private QuotaObserverChore quotaObserverChore;<a name="line.426"></a>
-<span class="sourceLineNo">427</span>  private SnapshotQuotaObserverChore snapshotQuotaChore;<a name="line.427"></a>
-<span class="sourceLineNo">428</span><a name="line.428"></a>
-<span class="sourceLineNo">429</span>  private ProcedureExecutor&lt;MasterProcedureEnv&gt; procedureExecutor;<a name="line.429"></a>
-<span class="sourceLineNo">430</span>  private WALProcedureStore procedureStore;<a name="line.430"></a>
-<span class="sourceLineNo">431</span><a name="line.431"></a>
-<span class="sourceLineNo">432</span>  // handle table states<a name="line.432"></a>
-<span class="sourceLineNo">433</span>  private TableStateManager tableStateManager;<a name="line.433"></a>
-<span class="sourceLineNo">434</span><a name="line.434"></a>
-<span class="sourceLineNo">435</span>  private long splitPlanCount;<a name="line.435"></a>
-<span class="sourceLineNo">436</span>  private long mergePlanCount;<a name="line.436"></a>
-<span class="sourceLineNo">437</span><a name="line.437"></a>
-<span class="sourceLineNo">438</span>  /* Handle favored nodes information */<a name="line.438"></a>
-<span class="sourceLineNo">439</span>  private FavoredNodesManager favoredNodesManager;<a name="line.439"></a>
-<span class="sourceLineNo">440</span><a name="line.440"></a>
-<span class="sourceLineNo">441</span>  /** jetty server for master to redirect requests to regionserver infoServer */<a name="line.441"></a>
-<span class="sourceLineNo">442</span>  private Server masterJettyServer;<a name="line.442"></a>
-<span class="sourceLineNo">443</span><a name="line.443"></a>
-<span class="sourceLineNo">444</span>  public static class RedirectServlet extends HttpServlet {<a name="line.444"></a>
-<span class="sourceLineNo">445</span>    private static final long serialVersionUID = 2894774810058302473L;<a name="line.445"></a>
-<span class="sourceLineNo">446</span>    private final int regionServerInfoPort;<a name="line.446"></a>
-<span class="sourceLineNo">447</span>    private final String regionServerHostname;<a name="line.447"></a>
-<span class="sourceLineNo">448</span><a name="line.448"></a>
-<span class="sourceLineNo">449</span>    /**<a name="line.449"></a>
-<span class="sourceLineNo">450</span>     * @param infoServer that we're trying to send all requests to<a name="line.450"></a>
-<span class="sourceLineNo">451</span>     * @param hostname may be null. if given, will be used for redirects instead of host from client.<a name="line.451"></a>
-<span class="sourceLineNo">452</span>     */<a name="line.452"></a>
-<span class="sourceLineNo">453</span>    public RedirectServlet(InfoServer infoServer, String hostname) {<a name="line.453"></a>
-<span class="sourceLineNo">454</span>       regionServerInfoPort = infoServer.getPort();<a name="line.454"></a>
-<span class="sourceLineNo">455</span>       regionServerHostname = hostname;<a name="line.455"></a>
-<span class="sourceLineNo">456</span>    }<a name="line.456"></a>
-<span class="sourceLineNo">457</span><a name="line.457"></a>
-<span class="sourceLineNo">458</span>    @Override<a name="line.458"></a>
-<span class="sourceLineNo">459</span>    public void doGet(HttpServletRequest request,<a name="line.459"></a>
-<span class="sourceLineNo">460</span>        HttpServletResponse response) throws ServletException, IOException {<a name="line.460"></a>
-<span class="sourceLineNo">461</span>      String redirectHost = regionServerHostname;<a name="line.461"></a>
-<span class="sourceLineNo">462</span>      if(redirectHost == null) {<a name="line.462"></a>
-<span class="sourceLineNo">463</span>        redirectHost = request.getServerName();<a name="line.463"></a>
-<span class="sourceLineNo">464</span>        if(!Addressing.isLocalAddress(InetAddress.getByName(redirectHost))) {<a name="line.464"></a>
-<span class="sourceLineNo">465</span>          LOG.warn("Couldn't resolve '" + redirectHost + "' as an address local to this node and '" +<a name="line.465"></a>
-<span class="sourceLineNo">466</span>              MASTER_HOSTNAME_KEY + "' is not set; client will get a HTTP 400 response. If " +<a name="line.466"></a>
-<span class="sourceLineNo">467</span>              "your HBase deployment relies on client accessible names that the region server process " +<a name="line.467"></a>
-<span class="sourceLineNo">468</span>              "can't resolve locally, then you should set the previously mentioned configuration variable " +<a name="line.468"></a>
-<span class="sourceLineNo">469</span>              "to an appropriate hostname.");<a name="line.469"></a>
-<span class="sourceLineNo">470</span>          // no sending client provided input back to the client, so the goal host is just in the logs.<a name="line.470"></a>
-<span class="sourceLineNo">471</span>          response.sendError(400, "Request was to a host that I can't resolve for any of the network interfaces on " +<a name="line.471"></a>
-<span class="sourceLineNo">472</span>              "this node. If this is due to an intermediary such as an HTTP load balancer or other proxy, your HBase " +<a name="line.472"></a>
-<span class="sourceLineNo">473</span>              "administrator can set '" + MASTER_HOSTNAME_KEY + "' to point to the correct hostname.");<a name="line.473"></a>
-<span class="sourceLineNo">474</span>          return;<a name="line.474"></a>
-<span class="sourceLineNo">475</span>        }<a name="line.475"></a>
-<span class="sourceLineNo">476</span>      }<a name="line.476"></a>
-<span class="sourceLineNo">477</span>      // TODO this scheme should come from looking at the scheme registered in the infoserver's http server for the<a name="line.477"></a>
-<span class="sourceLineNo">478</span>      // host and port we're using, but it's buried way too deep to do that ATM.<a name="line.478"></a>
-<span class="sourceLineNo">479</span>      String redirectUrl = request.getScheme() + "://"<a name="line.479"></a>
-<span class="sourceLineNo">480</span>        + redirectHost + ":" + regionServerInfoPort<a name="line.480"></a>
-<span class="sourceLineNo">481</span>        + request.getRequestURI();<a name="line.481"></a>
-<span class="sourceLineNo">482</span>      response.sendRedirect(redirectUrl);<a name="line.482"></a>
-<span class="sourceLineNo">483</span>    }<a name="line.483"></a>
-<span class="sourceLineNo">484</span>  }<a name="line.484"></a>
-<span class="sourceLineNo">485</span><a name="line.485"></a>
-<span class="sourceLineNo">486</span>  /**<a name="line.486"></a>
-<span class="sourceLineNo">487</span>   * Initializes the HMaster. The steps are as follows:<a name="line.487"></a>
-<span class="sourceLineNo">488</span>   * &lt;p&gt;<a name="line.488"></a>
-<span class="sourceLineNo">489</span>   * &lt;ol&gt;<a name="line.489"></a>
-<span class="sourceLineNo">490</span>   * &lt;li&gt;Initialize the local HRegionServer<a name="line.490"></a>
-<span class="sourceLineNo">491</span>   * &lt;li&gt;Start the ActiveMasterManager.<a name="line.491"></a>
-<span class="sourceLineNo">492</span>   * &lt;/ol&gt;<a name="line.492"></a>
-<span class="sourceLineNo">493</span>   * &lt;p&gt;<a name="line.493"></a>
-<span class="sourceLineNo">494</span>   * Remaining steps of initialization occur in<a name="line.494"></a>
-<span class="sourceLineNo">495</span>   * #finishActiveMasterInitialization(MonitoredTask) after<a name="line.495"></a>
-<span class="sourceLineNo">496</span>   * the master becomes the active one.<a name="line.496"></a>
-<span class="sourceLineNo">497</span>   */<a name="line.497"></a>
-<span class="sourceLineNo">498</span>  public HMaster(final Configuration conf)<a name="line.498"></a>
-<span class="sourceLineNo">499</span>      throws IOException, KeeperException {<a name="line.499"></a>
-<span class="sourceLineNo">500</span>    super(conf);<a name="line.500"></a>
-<span class="sourceLineNo">501</span>    TraceUtil.initTracer(conf);<a name="line.501"></a>
-<span class="sourceLineNo">502</span>    try {<a name="line.502"></a>
-<span class="sourceLineNo">503</span>      this.rsFatals = new MemoryBoundedLogMessageBuffer(<a name="line.503"></a>
-<span class="sourceLineNo">504</span>          conf.getLong("hbase.master.buffer.for.rs.fatals", 1 * 1024 * 1024));<a name="line.504"></a>
-<span class="sourceLineNo">505</span>      LOG.info("hbase.rootdir=" + getRootDir() +<a name="line.505"></a>
-<span class="sourceLineNo">506</span>          ", hbase.cluster.distributed=" + this.conf.getBoolean(HConstants.CLUSTER_DISTRIBUTED, false));<a name="line.506"></a>
-<span class="sourceLineNo">507</span><a name="line.507"></a>
-<span class="sourceLineNo">508</span>      // Disable usage of meta replicas in the master<a name="line.508"></a>
-<span class="sourceLineNo">509</span>      this.conf.setBoolean(HConstants.USE_META_REPLICAS, false);<a name="line.509"></a>
-<span class="sourceLineNo">510</span><a name="line.510"></a>
-<span class="sourceLineNo">511</span>      decorateMasterConfiguration(this.conf);<a name="line.511"></a>
-<span class="sourceLineNo">512</span><a name="line.512"></a>
-<span class="sourceLineNo">513</span>      // Hack! Maps DFSClient =&gt; Master for logs.  HDFS made this<a name="line.513"></a>
-<span class="sourceLineNo">514</span>      // config param for task trackers, but we can piggyback off of it.<a name="line.514"></a>
-<span class="sourceLineNo">515</span>      if (this.conf.get("mapreduce.task.attempt.id") == null) {<a name="line.515"></a>
-<span class="sourceLineNo">516</span>        this.conf.set("mapreduce.task.attempt.id", "hb_m_" + this.serverName.toString());<a name="line.516"></a>
-<span class="sourceLineNo">517</span>      }<a name="line.517"></a>
+<span class="sourceLineNo">400</span>  // Time stamps for when a hmaster became active<a name="line.400"></a>
+<span class="sourceLineNo">401</span>  private long masterActiveTime;<a name="line.401"></a>
+<span class="sourceLineNo">402</span><a name="line.402"></a>
+<span class="sourceLineNo">403</span>  // Time stamp for when HMaster finishes becoming Active Master<a name="line.403"></a>
+<span class="sourceLineNo">404</span>  private long masterFinishedInitializationTime;<a name="line.404"></a>
+<span class="sourceLineNo">405</span><a name="line.405"></a>
+<span class="sourceLineNo">406</span>  //should we check the compression codec type at master side, default true, HBASE-6370<a name="line.406"></a>
+<span class="sourceLineNo">407</span>  private final boolean masterCheckCompression;<a name="line.407"></a>
+<span class="sourceLineNo">408</span><a name="line.408"></a>
+<span class="sourceLineNo">409</span>  //should we check encryption settings at master side, default true<a name="line.409"></a>
+<span class="sourceLineNo">410</span>  private final boolean masterCheckEncryption;<a name="line.410"></a>
+<span class="sourceLineNo">411</span><a name="line.411"></a>
+<span class="sourceLineNo">412</span>  Map&lt;String, Service&gt; coprocessorServiceHandlers = Maps.newHashMap();<a name="line.412"></a>
+<span class="sourceLineNo">413</span><a name="line.413"></a>
+<span class="sourceLineNo">414</span>  // monitor for snapshot of hbase tables<a name="line.414"></a>
+<span class="sourceLineNo">415</span>  SnapshotManager snapshotManager;<a name="line.415"></a>
+<span class="sourceLineNo">416</span>  // monitor for distributed procedures<a name="line.416"></a>
+<span class="sourceLineNo">417</span>  private MasterProcedureManagerHost mpmHost;<a name="line.417"></a>
+<span class="sourceLineNo">418</span><a name="line.418"></a>
+<span class="sourceLineNo">419</span>  // it is assigned after 'initialized' guard set to true, so should be volatile<a name="line.419"></a>
+<span class="sourceLineNo">420</span>  private volatile MasterQuotaManager quotaManager;<a name="line.420"></a>
+<span class="sourceLineNo">421</span>  private SpaceQuotaSnapshotNotifier spaceQuotaSnapshotNotifier;<a name="line.421"></a>
+<span class="sourceLineNo">422</span>  private QuotaObserverChore quotaObserverChore;<a name="line.422"></a>
+<span class="sourceLineNo">423</span>  private SnapshotQuotaObserverChore snapshotQuotaChore;<a name="line.423"></a>
+<span class="sourceLineNo">424</span><a name="line.424"></a>
+<span class="sourceLineNo">425</span>  private ProcedureExecutor&lt;MasterProcedureEnv&gt; procedureExecutor;<a name="line.425"></a>
+<span class="sourceLineNo">426</span>  private WALProcedureStore procedureStore;<a name="line.426"></a>
+<span class="sourceLineNo">427</span><a name="line.427"></a>
+<span class="sourceLineNo">428</span>  // handle table states<a name="line.428"></a>
+<span class="sourceLineNo">429</span>  private TableStateManager tableStateManager;<a name="line.429"></a>
+<span class="sourceLineNo">430</span><a name="line.430"></a>
+<span class="sourceLineNo">431</span>  private long splitPlanCount;<a name="line.431"></a>
+<span class="sourceLineNo">432</span>  private long mergePlanCount;<a name="line.432"></a>
+<span class="sourceLineNo">433</span><a name="line.433"></a>
+<span class="sourceLineNo">434</span>  /* Handle favored nodes information */<a name="line.434"></a>
+<span class="sourceLineNo">435</span>  private FavoredNodesManager favoredNodesManager;<a name="line.435"></a>
+<span class="sourceLineNo">436</span><a name="line.436"></a>
+<span class="sourceLineNo">437</span>  /** jetty server for master to redirect requests to regionserver infoServer */<a name="line.437"></a>
+<span class="sourceLineNo">438</span>  private Server masterJettyServer;<a name="line.438"></a>
+<span class="sourceLineNo">439</span><a name="line.439"></a>
+<span class="sourceLineNo">440</span>  // Determine if we should do normal startup or minimal "single-user" mode with no region<a name="line.440"></a>
+<span class="sourceLineNo">441</span>  // servers and no user tables. Useful for repair and recovery of hbase:meta<a name="line.441"></a>
+<span class="sourceLineNo">442</span>  private final boolean maintenanceMode;<a name="line.442"></a>
+<span class="sourceLineNo">443</span>  static final String MAINTENANCE_MODE = "hbase.master.maintenance_mode";<a name="line.443"></a>
+<span class="sourceLineNo">444</span><a name="line.444"></a>
+<span class="sourceLineNo">445</span>  public static class RedirectServlet extends HttpServlet {<a name="line.445"></a>
+<span class="sourceLineNo">446</span>    private static final long serialVersionUID = 2894774810058302473L;<a name="line.446"></a>
+<span class="sourceLineNo">447</span>    private final int regionServerInfoPort;<a name="line.447"></a>
+<span class="sourceLineNo">448</span>    private final String regionServerHostname;<a name="line.448"></a>
+<span class="sourceLineNo">449</span><a name="line.449"></a>
+<span class="sourceLineNo">450</span>    /**<a name="line.450"></a>
+<span class="sourceLineNo">451</span>     * @param infoServer that we're trying to send all requests to<a name="line.451"></a>
+<span class="sourceLineNo">452</span>     * @param hostname may be null. if given, will be used for redirects instead of host from client.<a name="line.452"></a>
+<span class="sourceLineNo">453</span>     */<a name="line.453"></a>
+<span class="sourceLineNo">454</span>    public RedirectServlet(InfoServer infoServer, String hostname) {<a name="line.454"></a>
+<span class="sourceLineNo">455</span>       regionServerInfoPort = infoServer.getPort();<a name="line.455"></a>
+<span class="sourceLineNo">456</span>       regionServerHostname = hostname;<a name="line.456"></a>
+<span class="sourceLineNo">457</span>    }<a name="line.457"></a>
+<span class="sourceLineNo">458</span><a name="line.458"></a>
+<span class="sourceLineNo">459</span>    @Override<a name="line.459"></a>
+<span class="sourceLineNo">460</span>    public void doGet(HttpServletRequest request,<a name="line.460"></a>
+<span class="sourceLineNo">461</span>        HttpServletResponse response) throws ServletException, IOException {<a name="line.461"></a>
+<span class="sourceLineNo">462</span>      String redirectHost = regionServerHostname;<a name="line.462"></a>
+<span class="sourceLineNo">463</span>      if(redirectHost == null) {<a name="line.463"></a>
+<span class="sourceLineNo">464</span>        redirectHost = request.getServerName();<a name="line.464"></a>
+<span class="sourceLineNo">465</span>        if(!Addressing.isLocalAddress(InetAddress.getByName(redirectHost))) {<a name="line.465"></a>
+<span class="sourceLineNo">466</span>          LOG.warn("Couldn't resolve '" + redirectHost + "' as an address local to this node and '" +<a name="line.466"></a>
+<span class="sourceLineNo">467</span>              MASTER_HOSTNAME_KEY + "' is not set; client will get a HTTP 400 response. If " +<a name="line.467"></a>
+<span class="sourceLineNo">468</span>              "your HBase deployment relies on client accessible names that the region server process " +<a name="line.468"></a>
+<span class="sourceLineNo">469</span>              "can't resolve locally, then you should set the previously mentioned configuration variable " +<a name="line.469"></a>
+<span class="sourceLineNo">470</span>              "to an appropriate hostname.");<a name="line.470"></a>
+<span class="sourceLineNo">471</span>          // no sending client provided input back to the client, so the goal host is just in the logs.<a name="line.471"></a>
+<span class="sourceLineNo">472</span>          response.sendError(400, "Request was to a host that I can't resolve for any of the network interfaces on " +<a name="line.472"></a>
+<span class="sourceLineNo">473</span>              "this node. If this is due to an intermediary such as an HTTP load balancer or other proxy, your HBase " +<a name="line.473"></a>
+<span class="sourceLineNo">474</span>              "administrator can set '" + MASTER_HOSTNAME_KEY + "' to point to the correct hostname.");<a name="line.474"></a>
+<span class="sourceLineNo">475</span>          return;<a name="line.475"></a>
+<span class="sourceLineNo">476</span>        }<a name="line.476"></a>
+<span class="sourceLineNo">477</span>      }<a name="line.477"></a>
+<span class="sourceLineNo">478</span>      // TODO this scheme should come from looking at the scheme registered in the infoserver's http server for the<a name="line.478"></a>
+<span class="sourceLineNo">479</span>      // host and port we're using, but it's buried way too deep to do that ATM.<a name="line.479"></a>
+<span class="sourceLineNo">480</span>      String redirectUrl = request.getScheme() + "://"<a name="line.480"></a>
+<span class="sourceLineNo">481</span>        + redirectHost + ":" + regionServerInfoPort<a name="line.481"></a>
+<span class="sourceLineNo">482</span>        + request.getRequestURI();<a name="line.482"></a>
+<span class="sourceLineNo">483</span>      response.sendRedirect(redirectUrl);<a name="line.483"></a>
+<span class="sourceLineNo">484</span>    }<a name="line.484"></a>
+<span class="sourceLineNo">485</span>  }<a name="line.485"></a>
+<span class="sourceLineNo">486</span><a name="line.486"></a>
+<span class="sourceLineNo">487</span>  /**<a name="line.487"></a>
+<span class="sourceLineNo">488</span>   * Initializes the HMaster. The steps are as follows:<a name="line.488"></a>
+<span class="sourceLineNo">489</span>   * &lt;p&gt;<a name="line.489"></a>
+<span class="sourceLineNo">490</span>   * &lt;ol&gt;<a name="line.490"></a>
+<span class="sourceLineNo">491</span>   * &lt;li&gt;Initialize the local HRegionServer<a name="line.491"></a>
+<span class="sourceLineNo">492</span>   * &lt;li&gt;Start the ActiveMasterManager.<a name="line.492"></a>
+<span class="sourceLineNo">493</span>   * &lt;/ol&gt;<a name="line.493"></a>
+<span class="sourceLineNo">494</span>   * &lt;p&gt;<a name="line.494"></a>
+<span class="sourceLineNo">495</span>   * Remaining steps of initialization occur in<a name="line.495"></a>
+<span class="sourceLineNo">496</span>   * #finishActiveMasterInitialization(MonitoredTask) after<a name="line.496"></a>
+<span class="sourceLineNo">497</span>   * the master becomes the active one.<a name="line.497"></a>
+<span class="sourceLineNo">498</span>   */<a name="line.498"></a>
+<span class="sourceLineNo">499</span>  public HMaster(final Configuration conf)<a name="line.499"></a>
+<span class="sourceLineNo">500</span>      throws IOException, KeeperException {<a name="line.500"></a>
+<span class="sourceLineNo">501</span>    super(conf);<a name="line.501"></a>
+<span class="sourceLineNo">502</span>    TraceUtil.initTracer(conf);<a name="line.502"></a>
+<span class="sourceLineNo">503</span>    try {<a name="line.503"></a>
+<span class="sourceLineNo">504</span>      if (conf.getBoolean(MAINTENANCE_MODE, false)) {<a name="line.504"></a>
+<span class="sourceLineNo">505</span>        LOG.info("Detected {}=true via configuration.", MAINTENANCE_MODE);<a name="line.505"></a>
+<span class="sourceLineNo">506</span>        maintenanceMode = true;<a name="line.506"></a>
+<span class="sourceLineNo">507</span>      } else if (Boolean.getBoolean(MAINTENANCE_MODE)) {<a name="line.507"></a>
+<span class="sourceLineNo">508</span>        LOG.info("Detected {}=true via environment variables.", MAINTENANCE_MODE);<a name="line.508"></a>
+<span class="sourceLineNo">509</span>        maintenanceMode = true;<a name="line.509"></a>
+<span class="sourceLineNo">510</span>      } else {<a name="line.510"></a>
+<span class="sourceLineNo">511</span>        maintenanceMode = false;<a name="line.511"></a>
+<span class="sourceLineNo">512</span>      }<a name="line.512"></a>
+<span class="sourceLineNo">513</span><a name="line.513"></a>
+<span class="sourceLineNo">514</span>      this.rsFatals = new MemoryBoundedLogMessageBuffer(<a name="line.514"></a>
+<span class="sourceLineNo">515</span>          conf.getLong("hbase.master.buffer.for.rs.fatals", 1 * 1024 * 1024));<a name="line.515"></a>
+<span class="sourceLineNo">516</span>      LOG.info("hbase.rootdir=" + getRootDir() +<a name="line.516"></a>
+<span class="sourceLineNo">517</span>          ", hbase.cluster.distributed=" + this.conf.getBoolean(HConstants.CLUSTER_DISTRIBUTED, false));<a name="line.517"></a>
 <span class="sourceLineNo">518</span><a name="line.518"></a>
-<span class="sourceLineNo">519</span>      // should we check the compression codec type at master side, default true, HBASE-6370<a name="line.519"></a>
-<span class="sourceLineNo">520</span>      this.masterCheckCompression = conf.getBoolean("hbase.master.check.compression", true);<a name="line.520"></a>
+<span class="sourceLineNo">519</span>      // Disable usage of meta replicas in the master<a name="line.519"></a>
+<span class="sourceLineNo">520</span>      this.conf.setBoolean(HConstants.USE_META_REPLICAS, false);<a name="line.520"></a>
 <span class="sourceLineNo">521</span><a name="line.521"></a>
-<span class="sourceLineNo">522</span>      // should we check encryption settings at master side, default true<a name="line.522"></a>
-<span class="sourceLineNo">523</span>      this.masterCheckEncryption = conf.getBoolean("hbase.master.check.encryption", true);<a name="line.523"></a>
-<span class="sourceLineNo">524</span><a name="line.524"></a>
-<span class="sourceLineNo">525</span>      this.metricsMaster = new MetricsMaster(new MetricsMasterWrapperImpl(this));<a name="line.525"></a>
-<span class="sourceLineNo">526</span><a name="line.526"></a>
-<span class="sourceLineNo">527</span>      // preload table descriptor at startup<a name="line.527"></a>
-<span class="sourceLineNo">528</span>      this.preLoadTableDescriptors = conf.getBoolean("hbase.master.preload.tabledescriptors", true);<a name="line.528"></a>
+<span class="sourceLineNo">522</span>      decorateMasterConfiguration(this.conf);<a name="line.522"></a>
+<span class="sourceLineNo">523</span><a name="line.523"></a>
+<span class="sourceLineNo">524</span>      // Hack! Maps DFSClient =&gt; Master for logs.  HDFS made this<a name="line.524"></a>
+<span class="sourceLineNo">525</span>      // config param for task trackers, but we can piggyback off of it.<a name="line.525"></a>
+<span class="sourceLineNo">526</span>      if (this.conf.get("mapreduce.task.attempt.id") == null) {<a name="line.526"></a>
+<span class="sourceLineNo">527</span>        this.conf.set("mapreduce.task.attempt.id", "hb_m_" + this.serverName.toString());<a name="line.527"></a>
+<span class="sourceLineNo">528</span>      }<a name="line.528"></a>
 <span class="sourceLineNo">529</span><a name="line.529"></a>
-<span class="sourceLineNo">530</span>      this.maxBlancingTime = getMaxBalancingTime();<a name="line.530"></a>
-<span class="sourceLineNo">531</span>      this.maxRitPercent = conf.getDouble(HConstants.HBASE_MASTER_BALANCER_MAX_RIT_PERCENT,<a name="line.531"></a>
-<span class="sourceLineNo">532</span>          HConstants.DEFAULT_HBASE_MASTER_BALANCER_MAX_RIT_PERCENT);<a name="line.532"></a>
-<span class="sourceLineNo">533</span><a name="line.533"></a>
-<span class="sourceLineNo">534</span>      // Do we publish the status?<a name="line.534"></a>
+<span class="sourceLineNo">530</span>      // should we check the compression codec type at master side, default true, HBASE-6370<a name="line.530"></a>
+<span class="sourceLineNo">531</span>      this.masterCheckCompression = conf.getBoolean("hbase.master.check.compression", true);<a name="line.531"></a>
+<span class="sourceLineNo">532</span><a name="line.532"></a>
+<span class="sourceLineNo">533</span>      // should we check encryption settings at master side, default true<a name="line.533"></a>
+<span class="sourceLineNo">534</span>      this.masterCheckEncryption = conf.getBoolean("hbase.master.check.encryption", true);<a name="line.534"></a>
 <span class="sourceLineNo">535</span><a name="line.535"></a>
-<span class="sourceLineNo">536</span>      boolean shouldPublish = conf.getBoolean(HConstants.STATUS_PUBLISHED,<a name="line.536"></a>
-<span class="sourceLineNo">537</span>          HConstants.STATUS_PUBLISHED_DEFAULT);<a name="line.537"></a>
-<span class="sourceLineNo">538</span>      Class&lt;? extends ClusterStatusPublisher.Publisher&gt; publisherClass =<a name="line.538"></a>
-<span class="sourceLineNo">539</span>          conf.getClass(ClusterStatusPublisher.STATUS_PUBLISHER_CLASS,<a name="line.539"></a>
-<span class="sourceLineNo">540</span>              ClusterStatusPublisher.DEFAULT_STATUS_PUBLISHER_CLASS,<a name="line.540"></a>
-<span class="sourceLineNo">541</span>              ClusterStatusPublisher.Publisher.class);<a name="line.541"></a>
-<span class="sourceLineNo">542</span><a name="line.542"></a>
-<span class="sourceLineNo">543</span>      if (shouldPublish) {<a name="line.543"></a>
-<span class="sourceLineNo">544</span>        if (publisherClass == null) {<a name="line.544"></a>
-<span class="sourceLineNo">545</span>          LOG.warn(HConstants.STATUS_PUBLISHED + " is true, but " +<a name="line.545"></a>
-<span class="sourceLineNo">546</span>              ClusterStatusPublisher.DEFAULT_STATUS_PUBLISHER_CLASS +<a name="line.546"></a>
-<span class="sourceLineNo">547</span>              " is not set - not publishing status");<a name="line.547"></a>
-<span class="sourceLineNo">548</span>        } else {<a name="line.548"></a>
-<span class="sourceLineNo">549</span>          clusterStatusPublisherChore = new ClusterStatusPublisher(this, conf, publisherClass);<a name="line.549"></a>
-<span class="sourceLineNo">550</span>          getChoreService().scheduleChore(clusterStatusPublisherChore);<a name="line.550"></a>
-<span class="sourceLineNo">551</span>        }<a name="line.551"></a>
-<span class="sourceLineNo">552</span>      }<a name="line.552"></a>
+<span class="sourceLineNo">536</span>      this.metricsMaster = new MetricsMaster(new MetricsMasterWrapperImpl(this));<a name="line.536"></a>
+<span class="sourceLineNo">537</span><a name="line.537"></a>
+<span class="sourceLineNo">538</span>      // preload table descriptor at startup<a name="line.538"></a>
+<span class="sourceLineNo">539</span>      this.preLoadTableDescriptors = conf.getBoolean("hbase.master.preload.tabledescriptors", true);<a name="line.539"></a>
+<span class="sourceLineNo">540</span><a name="line.540"></a>
+<span class="sourceLineNo">541</span>      this.maxBlancingTime = getMaxBalancingTime();<a name="line.541"></a>
+<span class="sourceLineNo">542</span>      this.maxRitPercent = conf.getDouble(HConstants.HBASE_MASTER_BALANCER_MAX_RIT_PERCENT,<a name="line.542"></a>
+<span class="sourceLineNo">543</span>          HConstants.DEFAULT_HBASE_MASTER_BALANCER_MAX_RIT_PERCENT);<a name="line.543"></a>
+<span class="sourceLineNo">544</span><a name="line.544"></a>
+<span class="sourceLineNo">545</span>      // Do we publish the status?<a name="line.545"></a>
+<span class="sourceLineNo">546</span><a name="line.546"></a>
+<span class="sourceLineNo">547</span>      boolean shouldPublish = conf.getBoolean(HConstants.STATUS_PUBLISHED,<a name="line.547"></a>
+<span class="sourceLineNo">548</span>          HConstants.STATUS_PUBLISHED_DEFAULT);<a name="line.548"></a>
+<span class="sourceLineNo">549</span>      Class&lt;? extends ClusterStatusPublisher.Publisher&gt; publisherClass =<a name="line.549"></a>
+<span class="sourceLineNo">550</span>          conf.getClass(ClusterStatusPublisher.STATUS_PUBLISHER_CLASS,<a name="line.550"></a>
+<span class="sourceLineNo">551</span>              ClusterStatusPublisher.DEFAULT_STATUS_PUBLISHER_CLASS,<a name="line.551"></a>
+<span class="sourceLineNo">552</span>              ClusterStatusPublisher.Publisher.class);<a name="line.552"></a>
 <span class="sourceLineNo">553</span><a name="line.553"></a>
-<span class="sourceLineNo">554</span>      // Some unit tests don't need a cluster, so no zookeeper at all<a name="line.554"></a>
-<span class="sourceLineNo">555</span>      if (!conf.getBoolean("hbase.testing.nocluster", false)) {<a name="line.555"></a>
-<span class="sourceLineNo">556</span>        this.activeMasterManager = new ActiveMasterManager(zooKeeper, this.serverName, this);<a name="line.556"></a>
-<span class="sourceLineNo">557</span>      } else {<a name="line.557"></a>
-<span class="sourceLineNo">558</span>        this.activeMasterManager = null;<a name="line.558"></a>
-<span class="sourceLineNo">559</span>      }<a name="line.559"></a>
-<span class="sourceLineNo">560</span>    } catch (Throwable t) {<a name="line.560"></a>
-<span class="sourceLineNo">561</span>      // Make sure we log the exception. HMaster is often started via reflection and the<a name="line.561"></a>
-<span class="sourceLineNo">562</span>      // cause of failed startup is lost.<a name="line.562"></a>
-<span class="sourceLineNo">563</span>      LOG.error("Failed construction of Master", t);<a name="line.563"></a>
-<span class="sourceLineNo">564</span>      throw t;<a name="line.564"></a>
-<span class="sourceLineNo">565</span>    }<a name="line.565"></a>
-<span class="sourceLineNo">566</span>  }<a name="line.566"></a>
-<span class="sourceLineNo">567</span><a name="line.567"></a>
-<span class="sourceLineNo">568</span>  @Override<a name="line.568"></a>
-<span class="sourceLineNo">569</span>  protected String getUseThisHostnameInstead(Configuration conf) {<a name="line.569"></a>
-<span class="sourceLineNo">570</span>    return conf.get(MASTER_HOSTNAME_KEY);<a name="line.570"></a>
-<span class="sourceLineNo">571</span>  }<a name="line.571"></a>
-<span class="sourceLineNo">572</span><a name="line.572"></a>
-<span class="sourceLineNo">573</span>  // Main run loop. Calls through to the regionserver run loop AFTER becoming active Master; will<a name="line.573"></a>
-<span class="sourceLineNo">574</span>  // block in here until then.<a name="line.574"></a>
-<span class="sourceLineNo">575</span>  @Override<a name="line.575"></a>
-<span class="sourceLineNo">576</span>  public void run() {<a name="line.576"></a>
-<span class="sourceLineNo">577</span>    try {<a name="line.577"></a>
-<span class="sourceLineNo">578</span>      if (!conf.getBoolean("hbase.testing.nocluster", false)) {<a name="line.578"></a>
-<span class="sourceLineNo">579</span>        Threads.setDaemonThreadRunning(new Thread(() -&gt; {<a name="line.579"></a>
-<span class="sourceLineNo">580</span>          try {<a name="line.580"></a>
-<span class="sourceLineNo">581</span>            int infoPort = putUpJettyServer();<a name="line.581"></a>
-<span class="sourceLineNo">582</span>            startActiveMasterManager(infoPort);<a name="line.582"></a>
-<span class="sourceLineNo">583</span>          } catch (Throwable t) {<a name="line.583"></a>
-<span class="sourceLineNo">584</span>            // Make sure we log the exception.<a name="line.584"></a>
-<span class="sourceLineNo">585</span>            String error = "Failed to become Active Master";<a name="line.585"></a>
-<span class="sourceLineNo">586</span>            LOG.error(error, t);<a name="line.586"></a>
-<span class="sourceLineNo">587</span>            // Abort should have been called already.<a name="line.587"></a>
-<span class="sourceLineNo">588</span>            if (!isAborted()) {<a name="line.588"></a>
-<span class="sourceLineNo">589</span>              abort(error, t);<a name="line.589"></a>
-<span class="sourceLineNo">590</span>            }<a name="line.590"></a>
-<span class="sourceLineNo">591</span>          }<a name="line.591"></a>
-<span class="sourceLineNo">592</span>        }), getName() + ":becomeActiveMaster");<a name="line.592"></a>
-<span class="sourceLineNo">593</span>      }<a name="line.593"></a>
-<span class="sourceLineNo">594</span>      // Fall in here even if we have been aborted. Need to run the shutdown services and<a name="line.594"></a>
-<span class="sourceLineNo">595</span>      // the super run call will do this for us.<a name="line.595"></a>
-<span class="sourceLineNo">596</span>      super.run();<a name="line.596"></a>
-<span class="sourceLineNo">597</span>    } finally {<a name="line.597"></a>
-<span class="sourceLineNo">598</span>      if (this.clusterSchemaService != null) {<a name="line.598"></a>
-<span class="sourceLineNo">599</span>        // If on way out, then we are no longer active master.<a name="line.599"></a>
-<span class="sourceLineNo">600</span>        this.clusterSchemaService.stopAsync();<a name="line.600"></a>
-<span class="sourceLineNo">601</span>        try {<a name="line.601"></a>
-<span class="sourceLineNo">602</span>          this.clusterSchemaService.awaitTerminated(<a name="line.602"></a>
-<span class="sourceLineNo">603</span>              getConfiguration().getInt(HBASE_MASTER_WAIT_ON_SERVICE_IN_SECONDS,<a name="line.603"></a>
-<span class="sourceLineNo">604</span>              DEFAULT_HBASE_MASTER_WAIT_ON_SERVICE_IN_SECONDS), TimeUnit.SECONDS);<a name="line.604"></a>
-<span class="sourceLineNo">605</span>        } catch (TimeoutException te) {<a name="line.605"></a>
-<span class="sourceLineNo">606</span>          LOG.warn("Failed shutdown of clusterSchemaService", te);<a name="line.606"></a>
-<span class="sourceLineNo">607</span>        }<a name="line.607"></a>
-<span class="sourceLineNo">608</span>      }<a name="line.608"></a>
-<span class="sourceLineNo">609</span>      this.activeMaster = false;<a name="line.609"></a>
-<span class="sourceLineNo">610</span>    }<a name="line.610"></a>
-<span class="sourceLineNo">611</span>  }<a name="line.611"></a>
-<span class="sourceLineNo">612</span><a name="line.612"></a>
-<span class="sourceLineNo">613</span>  // return the actual infoPort, -1 means disable info server.<a name="line.613"></a>
-<span class="sourceLineNo">614</span>  private int putUpJettyServer() throws IOException {<a name="line.614"></a>
-<span class="sourceLineNo">615</span>    if (!conf.getBoolean("hbase.master.infoserver.redirect", true)) {<a name="line.615"></a>
-<span class="sourceLineNo">616</span>      return -1;<a name="line.616"></a>
-<span class="sourceLineNo">617</span>    }<a name="line.617"></a>
-<span class="sourceLineNo">618</span>    final int infoPort = conf.getInt("hbase.master.info.port.orig",<a name="line.618"></a>
-<span class="sourceLineNo">619</span>      HConstants.DEFAULT_MASTER_INFOPORT);<a name="line.619"></a>
-<span class="sourceLineNo">620</span>    // -1 is for disabling info server, so no redirecting<a name="line.620"></a>
-<span class="sourceLineNo">621</span>    if (infoPort &lt; 0 || infoServer == null) {<a name="line.621"></a>
-<span class="sourceLineNo">622</span>      return -1;<a name="line.622"></a>
-<span class="sourceLineNo">623</span>    }<a name="line.623"></a>
-<span class="sourceLineNo">624</span>    if(infoPort == infoServer.getPort()) {<a name="line.624"></a>
-<span class="sourceLineNo">625</span>      return infoPort;<a name="line.625"></a>
-<span class="sourceLineNo">626</span>    }<a name="line.626"></a>
-<span class="sourceLineNo">627</span>    final String addr = conf.get("hbase.master.info.bindAddress", "0.0.0.0");<a name="line.627"></a>
-<span class="sourceLineNo">628</span>    if (!Addressing.isLocalAddress(InetAddress.getByName(addr))) {<a name="line.628"></a>
-<span class="sourceLineNo">629</span>      String msg =<a name="line.629"></a>
-<span class="sourceLineNo">630</span>          "Failed to start redirecting jetty server. Address " + addr<a name="line.630"></a>
-<span class="sourceLineNo">631</span>              + " does not belong to this host. Correct configuration parameter: "<a name="line.631"></a>
-<span class="sourceLineNo">632</span>              + "hbase.master.info.bindAddress";<a name="line.632"></a>
-<span class="sourceLineNo">633</span>      LOG.error(msg);<a name="line.633"></a>
-<span class="sourceLineNo">634</span>      throw new IOException(msg);<a name="line.634"></a>
-<span class="sourceLineNo">635</span>    }<a name="line.635"></a>
-<span class="sourceLineNo">636</span><a name="line.636"></a>
-<span class="sourceLineNo">637</span>    // TODO I'm pretty sure we could just add another binding to the InfoServer run by<a name="line.637"></a>
-<span class="sourceLineNo">638</span>    // the RegionServer and have it run the RedirectServlet instead of standing up<a name="line.638"></a>
-<span class="sourceLineNo">639</span>    // a second entire stack here.<a name="line.639"></a>
-<span class="sourceLineNo">640</span>    masterJettyServer = new Server();<a name="line.640"></a>
-<span class="sourceLineNo">641</span>    final ServerConnector connector = new ServerConnector(masterJettyServer);<a name="line.641"></a>
-<span class="sourceLineNo">642</span>    connector.setHost(addr);<a name="line.642"></a>
-<span class="sourceLineNo">643</span>    connector.setPort(infoPort);<a name="line.643"></a>
-<span class="sourceLineNo">644</span>    masterJettyServer.addConnector(connector);<a name="line.644"></a>
-<span class="sourceLineNo">645</span>    masterJettyServer.setStopAtShutdown(true);<a name="line.645"></a>
-<span class="sourceLineNo">646</span><a name="line.646"></a>
-<span class="sourceLineNo">647</span>    final String redirectHostname =<a name="line.647"></a>
-<span class="sourceLineNo">648</span>        StringUtils.isBlank(useThisHostnameInstead) ? null : useThisHostnameInstead;<a name="line.648"></a>
-<span class="sourceLineNo">649</span><a name="line.649"></a>
-<span class="sourceLineNo">650</span>    final RedirectServlet redirect = new RedirectServlet(infoServer, redirectHostname);<a name="line.650"></a>
-<span class="sourceLineNo">651</span>    final WebAppContext context = new WebAppContext(null, "/", null, null, null, null, WebAppContext.NO_SESSIONS);<a name="line.651"></a>
-<span class="sourceLineNo">652</span>    context.addServlet(new ServletHolder(redirect), "/*");<a name="line.652"></a>
-<span class="sourceLineNo">653</span>    context.setServer(masterJettyServer);<a name="line.653"></a>
-<span class="sourceLineNo">654</span><a name="line.654"></a>
-<span class="sourceLineNo">655</span>    try {<a name="line.655"></a>
-<span class="sourceLineNo">656</span>      masterJettyServer.start();<a name="line.656"></a>
-<span class="sourceLineNo">657</span>    } catch (Exception e) {<a name="line.657"></a>
-<span class="sourceLineNo">658</span>      throw new IOException("Failed to start redirecting jetty server", e);<a name="line.658"></a>
-<span class="sourceLineNo">659</span>    }<a name="line.659"></a>
-<span class="sourceLineNo">660</span>    return connector.getLocalPort();<a name="line.660"></a>
-<span class="sourceLineNo">661</span>  }<a name="line.661"></a>
-<span class="sourceLineNo">662</span><a name="line.662"></a>
-<span class="sourceLineNo">663</span>  @Override<a name="line.663"></a>
-<span class="sourceLineNo">664</span>  protected Function&lt;TableDescriptorBuilder, TableDescriptorBuilder&gt; getMetaTableObserver() {<a name="line.664"></a>
-<span class="sourceLineNo">665</span>    return builder -&gt; builder.setRegionReplication(conf.getInt(HConstants.META_REPLICAS_NUM, HConstants.DEFAULT_META_REPLICA_NUM));<a name="line.665"></a>
-<span class="sourceLineNo">666</span>  }<a name="line.666"></a>
-<span class="sourceLineNo">667</span>  /**<a name="line.667"></a>
-<span class="sourceLineNo">668</span>   * For compatibility, if failed with regionserver credentials, try the master one<a name="line.668"></a>
-<span class="sourceLineNo">669</span>   */<a name="line.669"></a>
-<span class="sourceLineNo">670</span>  @Override<a name="line.670"></a>
-<span class="sourceLineNo">671</span>  protected void login(UserProvider user, String host) throws IOException {<a name="line.671"></a>
-<span class="sourceLineNo">672</span>    try {<a name="line.672"></a>
-<span class="sourceLineNo">673</span>      super.login(user, host);<a name="line.673"></a>
-<span class="sourceLineNo">674</span>    } catch (IOException ie) {<a name="line.674"></a>
-<span class="sourceLineNo">675</span>      user.login("hbase.master.keytab.file",<a name="line.675"></a>
-<span class="sourceLineNo">676</span>        "hbase.master.kerberos.principal", host);<a name="line.676"></a>
-<span class="sourceLineNo">677</span>    }<a name="line.677"></a>
-<span class="sourceLineNo">678</span>  }<a name="line.678"></a>
-<span class="sourceLineNo">679</span><a name="line.679"></a>
-<span class="sourceLineNo">680</span>  /**<a name="line.680"></a>
-<span class="sourceLineNo">681</span>   * If configured to put regions on active master,<a name="line.681"></a>
-<span class="sourceLineNo">682</span>   * wait till a backup master becomes active.<a name="line.682"></a>
-<span class="sourceLineNo">683</span>   * Otherwise, loop till the server is stopped or aborted.<a name="line.683"></a>
-<span class="sourceLineNo">684</span>   */<a name="line.684"></a>
-<span class="sourceLineNo">685</span>  @Override<a name="line.685"></a>
-<span class="sourceLineNo">686</span>  protected void waitForMasterActive(){<a name="line.686"></a>
-<span class="sourceLineNo">687</span>    boolean tablesOnMaster = LoadBalancer.isTablesOnMaster(conf);<a name="line.687"></a>
-<span class="sourceLineNo">688</span>    while (!(tablesOnMaster &amp;&amp; activeMaster) &amp;&amp; !isStopped() &amp;&amp; !isAborted()) {<a name="line.688"></a>
-<span class="sourceLineNo">689</span>      sleeper.sleep();<a name="line.689"></a>
-<span class="sourceLineNo">690</span>    }<a name="line.690"></a>
-<span class="sourceLineNo">691</span>  }<a name="line.691"></a>
-<span class="sourceLineNo">692</span><a name="line.692"></a>
-<span class="sourceLineNo">693</span>  @VisibleForTesting<a name="line.693"></a>
-<span class="sourceLineNo">694</span>  public MasterRpcServices getMasterRpcServices() {<a name="line.694"></a>
-<span class="sourceLineNo">695</span>    return (MasterRpcServices)rpcServices;<a name="line.695"></a>
-<span class="sourceLineNo">696</span>  }<a name="line.696"></a>
-<span class="sourceLineNo">697</span><a name="line.697"></a>
-<span class="sourceLineNo">698</span>  public boolean balanceSwitch(final boolean b) throws IOException {<a name="line.698"></a>
-<span class="sourceLineNo">699</span>    return getMasterRpcServices().switchBalancer(b, BalanceSwitchMode.ASYNC);<a name="line.699"></a>
-<span class="sourceLineNo">700</span>  }<a name="line.700"></a>
-<span class="sourceLineNo">701</span><a name="line.701"></a>
-<span class="sourceLineNo">702</span>  @Override<a name="line.702"></a>
-<span class="sourceLineNo">703</span>  protected String getProcessName() {<a name="line.703"></a>
-<span class="sourceLineNo">704</span>    return MASTER;<a name="line.704"></a>
+<span class="sourceLineNo">554</span>      if (shouldPublish) {<a name="line.554"></a>
+<span class="sourceLineNo">555</span>        if (publisherClass == null) {<a name="line.555"></a>
+<span class="sourceLineNo">556</span>          LOG.warn(HConstants.STATUS_PUBLISHED + " is true, but " +<a name="line.556"></a>
+<span class="sourceLineNo">557</span>              ClusterStatusPublisher.DEFAULT_STATUS_PUBLISHER_CLASS +<a name="line.557"></a>
+<span class="sourceLineNo">558</span>              " is not set - not publishing status");<a name="line.558"></a>
+<span class="sourceLineNo">559</span>        } else {<a name="line.559"></a>
+<span class="sourceLineNo">560</span>          clusterStatusPublisherChore = new ClusterStatusPublisher(this, conf, publisherClass);<a name="line.560"></a>
+<span class="sourceLineNo">561</span>          getChoreService().scheduleChore(clusterStatusPublisherChore);<a name="line.561"></a>
+<span class="sourceLineNo">562</span>        }<a name="line.562"></a>
+<span class="sourceLineNo">563</span>      }<a name="line.563"></a>
+<span class="sourceLineNo">564</span><a name="line.564"></a>
+<span class="sourceLineNo">565</span>      // Some unit tests don't need a cluster, so no zookeeper at all<a name="line.565"></a>
+<span class="sourceLineNo">566</span>      if (!conf.getBoolean("hbase.testing.nocluster", false)) {<a name="line.566"></a>
+<span class="sourceLineNo">567</span>        this.activeMasterManager = new ActiveMasterManager(zooKeeper, this.serverName, this);<a name="line.567"></a>
+<span class="sourceLineNo">568</span>      } else {<a name="line.568"></a>
+<span class="sourceLineNo">569</span>        this.activeMasterManager = null;<a name="line.569"></a>
+<span class="sourceLineNo">570</span>      }<a name="line.570"></a>
+<span class="sourceLineNo">571<

<TRUNCATED>

[09/46] hbase-site git commit: Published site at 05d22ed960204183fbd9bd16f1dbca6410ccde76.

Posted by gi...@apache.org.
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/3649682c/devapidocs/src-html/org/apache/hadoop/hbase/regionserver/RSRpcServices.RegionScannerHolder.html
----------------------------------------------------------------------
diff --git a/devapidocs/src-html/org/apache/hadoop/hbase/regionserver/RSRpcServices.RegionScannerHolder.html b/devapidocs/src-html/org/apache/hadoop/hbase/regionserver/RSRpcServices.RegionScannerHolder.html
index 20e3eaa..b257d07 100644
--- a/devapidocs/src-html/org/apache/hadoop/hbase/regionserver/RSRpcServices.RegionScannerHolder.html
+++ b/devapidocs/src-html/org/apache/hadoop/hbase/regionserver/RSRpcServices.RegionScannerHolder.html
@@ -2493,1291 +2493,1293 @@
 <span class="sourceLineNo">2485</span>  }<a name="line.2485"></a>
 <span class="sourceLineNo">2486</span><a name="line.2486"></a>
 <span class="sourceLineNo">2487</span>  private boolean shouldRejectRequestsFromClient(HRegion region) {<a name="line.2487"></a>
-<span class="sourceLineNo">2488</span>    return regionServer.getReplicationSourceService().getSyncReplicationPeerInfoProvider()<a name="line.2488"></a>
-<span class="sourceLineNo">2489</span>      .checkState(region.getRegionInfo().getTable(), RejectRequestsFromClientStateChecker.get());<a name="line.2489"></a>
-<span class="sourceLineNo">2490</span>  }<a name="line.2490"></a>
-<span class="sourceLineNo">2491</span><a name="line.2491"></a>
-<span class="sourceLineNo">2492</span>  private void rejectIfInStandByState(HRegion region) throws DoNotRetryIOException {<a name="line.2492"></a>
-<span class="sourceLineNo">2493</span>    if (shouldRejectRequestsFromClient(region)) {<a name="line.2493"></a>
-<span class="sourceLineNo">2494</span>      throw new DoNotRetryIOException(<a name="line.2494"></a>
-<span class="sourceLineNo">2495</span>        region.getRegionInfo().getRegionNameAsString() + " is in STANDBY state.");<a name="line.2495"></a>
-<span class="sourceLineNo">2496</span>    }<a name="line.2496"></a>
-<span class="sourceLineNo">2497</span>  }<a name="line.2497"></a>
-<span class="sourceLineNo">2498</span><a name="line.2498"></a>
-<span class="sourceLineNo">2499</span>  /**<a name="line.2499"></a>
-<span class="sourceLineNo">2500</span>   * Get data from a table.<a name="line.2500"></a>
-<span class="sourceLineNo">2501</span>   *<a name="line.2501"></a>
-<span class="sourceLineNo">2502</span>   * @param controller the RPC controller<a name="line.2502"></a>
-<span class="sourceLineNo">2503</span>   * @param request the get request<a name="line.2503"></a>
-<span class="sourceLineNo">2504</span>   * @throws ServiceException<a name="line.2504"></a>
-<span class="sourceLineNo">2505</span>   */<a name="line.2505"></a>
-<span class="sourceLineNo">2506</span>  @Override<a name="line.2506"></a>
-<span class="sourceLineNo">2507</span>  public GetResponse get(final RpcController controller, final GetRequest request)<a name="line.2507"></a>
-<span class="sourceLineNo">2508</span>      throws ServiceException {<a name="line.2508"></a>
-<span class="sourceLineNo">2509</span>    long before = EnvironmentEdgeManager.currentTime();<a name="line.2509"></a>
-<span class="sourceLineNo">2510</span>    OperationQuota quota = null;<a name="line.2510"></a>
-<span class="sourceLineNo">2511</span>    HRegion region = null;<a name="line.2511"></a>
-<span class="sourceLineNo">2512</span>    try {<a name="line.2512"></a>
-<span class="sourceLineNo">2513</span>      checkOpen();<a name="line.2513"></a>
-<span class="sourceLineNo">2514</span>      requestCount.increment();<a name="line.2514"></a>
-<span class="sourceLineNo">2515</span>      rpcGetRequestCount.increment();<a name="line.2515"></a>
-<span class="sourceLineNo">2516</span>      region = getRegion(request.getRegion());<a name="line.2516"></a>
-<span class="sourceLineNo">2517</span>      rejectIfInStandByState(region);<a name="line.2517"></a>
-<span class="sourceLineNo">2518</span><a name="line.2518"></a>
-<span class="sourceLineNo">2519</span>      GetResponse.Builder builder = GetResponse.newBuilder();<a name="line.2519"></a>
-<span class="sourceLineNo">2520</span>      ClientProtos.Get get = request.getGet();<a name="line.2520"></a>
-<span class="sourceLineNo">2521</span>      // An asynchbase client, https://github.com/OpenTSDB/asynchbase, starts by trying to do<a name="line.2521"></a>
-<span class="sourceLineNo">2522</span>      // a get closest before. Throwing the UnknownProtocolException signals it that it needs<a name="line.2522"></a>
-<span class="sourceLineNo">2523</span>      // to switch and do hbase2 protocol (HBase servers do not tell clients what versions<a name="line.2523"></a>
-<span class="sourceLineNo">2524</span>      // they are; its a problem for non-native clients like asynchbase. HBASE-20225.<a name="line.2524"></a>
-<span class="sourceLineNo">2525</span>      if (get.hasClosestRowBefore() &amp;&amp; get.getClosestRowBefore()) {<a name="line.2525"></a>
-<span class="sourceLineNo">2526</span>        throw new UnknownProtocolException("Is this a pre-hbase-1.0.0 or asynchbase client? " +<a name="line.2526"></a>
-<span class="sourceLineNo">2527</span>            "Client is invoking getClosestRowBefore removed in hbase-2.0.0 replaced by " +<a name="line.2527"></a>
-<span class="sourceLineNo">2528</span>            "reverse Scan.");<a name="line.2528"></a>
-<span class="sourceLineNo">2529</span>      }<a name="line.2529"></a>
-<span class="sourceLineNo">2530</span>      Boolean existence = null;<a name="line.2530"></a>
-<span class="sourceLineNo">2531</span>      Result r = null;<a name="line.2531"></a>
-<span class="sourceLineNo">2532</span>      RpcCallContext context = RpcServer.getCurrentCall().orElse(null);<a name="line.2532"></a>
-<span class="sourceLineNo">2533</span>      quota = getRpcQuotaManager().checkQuota(region, OperationQuota.OperationType.GET);<a name="line.2533"></a>
-<span class="sourceLineNo">2534</span><a name="line.2534"></a>
-<span class="sourceLineNo">2535</span>      Get clientGet = ProtobufUtil.toGet(get);<a name="line.2535"></a>
-<span class="sourceLineNo">2536</span>      if (get.getExistenceOnly() &amp;&amp; region.getCoprocessorHost() != null) {<a name="line.2536"></a>
-<span class="sourceLineNo">2537</span>        existence = region.getCoprocessorHost().preExists(clientGet);<a name="line.2537"></a>
-<span class="sourceLineNo">2538</span>      }<a name="line.2538"></a>
-<span class="sourceLineNo">2539</span>      if (existence == null) {<a name="line.2539"></a>
-<span class="sourceLineNo">2540</span>        if (context != null) {<a name="line.2540"></a>
-<span class="sourceLineNo">2541</span>          r = get(clientGet, (region), null, context);<a name="line.2541"></a>
-<span class="sourceLineNo">2542</span>        } else {<a name="line.2542"></a>
-<span class="sourceLineNo">2543</span>          // for test purpose<a name="line.2543"></a>
-<span class="sourceLineNo">2544</span>          r = region.get(clientGet);<a name="line.2544"></a>
-<span class="sourceLineNo">2545</span>        }<a name="line.2545"></a>
-<span class="sourceLineNo">2546</span>        if (get.getExistenceOnly()) {<a name="line.2546"></a>
-<span class="sourceLineNo">2547</span>          boolean exists = r.getExists();<a name="line.2547"></a>
-<span class="sourceLineNo">2548</span>          if (region.getCoprocessorHost() != null) {<a name="line.2548"></a>
-<span class="sourceLineNo">2549</span>            exists = region.getCoprocessorHost().postExists(clientGet, exists);<a name="line.2549"></a>
-<span class="sourceLineNo">2550</span>          }<a name="line.2550"></a>
-<span class="sourceLineNo">2551</span>          existence = exists;<a name="line.2551"></a>
-<span class="sourceLineNo">2552</span>        }<a name="line.2552"></a>
-<span class="sourceLineNo">2553</span>      }<a name="line.2553"></a>
-<span class="sourceLineNo">2554</span>      if (existence != null) {<a name="line.2554"></a>
-<span class="sourceLineNo">2555</span>        ClientProtos.Result pbr =<a name="line.2555"></a>
-<span class="sourceLineNo">2556</span>            ProtobufUtil.toResult(existence, region.getRegionInfo().getReplicaId() != 0);<a name="line.2556"></a>
-<span class="sourceLineNo">2557</span>        builder.setResult(pbr);<a name="line.2557"></a>
-<span class="sourceLineNo">2558</span>      } else if (r != null) {<a name="line.2558"></a>
-<span class="sourceLineNo">2559</span>        ClientProtos.Result pbr;<a name="line.2559"></a>
-<span class="sourceLineNo">2560</span>        if (isClientCellBlockSupport(context) &amp;&amp; controller instanceof HBaseRpcController<a name="line.2560"></a>
-<span class="sourceLineNo">2561</span>            &amp;&amp; VersionInfoUtil.hasMinimumVersion(context.getClientVersionInfo(), 1, 3)) {<a name="line.2561"></a>
-<span class="sourceLineNo">2562</span>          pbr = ProtobufUtil.toResultNoData(r);<a name="line.2562"></a>
-<span class="sourceLineNo">2563</span>          ((HBaseRpcController) controller).setCellScanner(CellUtil.createCellScanner(r<a name="line.2563"></a>
-<span class="sourceLineNo">2564</span>              .rawCells()));<a name="line.2564"></a>
-<span class="sourceLineNo">2565</span>          addSize(context, r, null);<a name="line.2565"></a>
-<span class="sourceLineNo">2566</span>        } else {<a name="line.2566"></a>
-<span class="sourceLineNo">2567</span>          pbr = ProtobufUtil.toResult(r);<a name="line.2567"></a>
-<span class="sourceLineNo">2568</span>        }<a name="line.2568"></a>
-<span class="sourceLineNo">2569</span>        builder.setResult(pbr);<a name="line.2569"></a>
-<span class="sourceLineNo">2570</span>      }<a name="line.2570"></a>
-<span class="sourceLineNo">2571</span>      if (r != null) {<a name="line.2571"></a>
-<span class="sourceLineNo">2572</span>        quota.addGetResult(r);<a name="line.2572"></a>
-<span class="sourceLineNo">2573</span>      }<a name="line.2573"></a>
-<span class="sourceLineNo">2574</span>      return builder.build();<a name="line.2574"></a>
-<span class="sourceLineNo">2575</span>    } catch (IOException ie) {<a name="line.2575"></a>
-<span class="sourceLineNo">2576</span>      throw new ServiceException(ie);<a name="line.2576"></a>
-<span class="sourceLineNo">2577</span>    } finally {<a name="line.2577"></a>
-<span class="sourceLineNo">2578</span>      MetricsRegionServer mrs = regionServer.metricsRegionServer;<a name="line.2578"></a>
-<span class="sourceLineNo">2579</span>      if (mrs != null) {<a name="line.2579"></a>
-<span class="sourceLineNo">2580</span>        TableDescriptor td = region != null? region.getTableDescriptor(): null;<a name="line.2580"></a>
-<span class="sourceLineNo">2581</span>        if (td != null) {<a name="line.2581"></a>
-<span class="sourceLineNo">2582</span>          mrs.updateGet(td.getTableName(), EnvironmentEdgeManager.currentTime() - before);<a name="line.2582"></a>
-<span class="sourceLineNo">2583</span>        }<a name="line.2583"></a>
-<span class="sourceLineNo">2584</span>      }<a name="line.2584"></a>
-<span class="sourceLineNo">2585</span>      if (quota != null) {<a name="line.2585"></a>
-<span class="sourceLineNo">2586</span>        quota.close();<a name="line.2586"></a>
-<span class="sourceLineNo">2587</span>      }<a name="line.2587"></a>
-<span class="sourceLineNo">2588</span>    }<a name="line.2588"></a>
-<span class="sourceLineNo">2589</span>  }<a name="line.2589"></a>
-<span class="sourceLineNo">2590</span><a name="line.2590"></a>
-<span class="sourceLineNo">2591</span>  private Result get(Get get, HRegion region, RegionScannersCloseCallBack closeCallBack,<a name="line.2591"></a>
-<span class="sourceLineNo">2592</span>      RpcCallContext context) throws IOException {<a name="line.2592"></a>
-<span class="sourceLineNo">2593</span>    region.prepareGet(get);<a name="line.2593"></a>
-<span class="sourceLineNo">2594</span>    boolean stale = region.getRegionInfo().getReplicaId() != 0;<a name="line.2594"></a>
-<span class="sourceLineNo">2595</span><a name="line.2595"></a>
-<span class="sourceLineNo">2596</span>    // This method is almost the same as HRegion#get.<a name="line.2596"></a>
-<span class="sourceLineNo">2597</span>    List&lt;Cell&gt; results = new ArrayList&lt;&gt;();<a name="line.2597"></a>
-<span class="sourceLineNo">2598</span>    long before = EnvironmentEdgeManager.currentTime();<a name="line.2598"></a>
-<span class="sourceLineNo">2599</span>    // pre-get CP hook<a name="line.2599"></a>
-<span class="sourceLineNo">2600</span>    if (region.getCoprocessorHost() != null) {<a name="line.2600"></a>
-<span class="sourceLineNo">2601</span>      if (region.getCoprocessorHost().preGet(get, results)) {<a name="line.2601"></a>
-<span class="sourceLineNo">2602</span>        region.metricsUpdateForGet(results, before);<a name="line.2602"></a>
-<span class="sourceLineNo">2603</span>        return Result<a name="line.2603"></a>
-<span class="sourceLineNo">2604</span>            .create(results, get.isCheckExistenceOnly() ? !results.isEmpty() : null, stale);<a name="line.2604"></a>
-<span class="sourceLineNo">2605</span>      }<a name="line.2605"></a>
-<span class="sourceLineNo">2606</span>    }<a name="line.2606"></a>
-<span class="sourceLineNo">2607</span>    Scan scan = new Scan(get);<a name="line.2607"></a>
-<span class="sourceLineNo">2608</span>    if (scan.getLoadColumnFamiliesOnDemandValue() == null) {<a name="line.2608"></a>
-<span class="sourceLineNo">2609</span>      scan.setLoadColumnFamiliesOnDemand(region.isLoadingCfsOnDemandDefault());<a name="line.2609"></a>
-<span class="sourceLineNo">2610</span>    }<a name="line.2610"></a>
-<span class="sourceLineNo">2611</span>    RegionScannerImpl scanner = null;<a name="line.2611"></a>
-<span class="sourceLineNo">2612</span>    try {<a name="line.2612"></a>
-<span class="sourceLineNo">2613</span>      scanner = region.getScanner(scan);<a name="line.2613"></a>
-<span class="sourceLineNo">2614</span>      scanner.next(results);<a name="line.2614"></a>
-<span class="sourceLineNo">2615</span>    } finally {<a name="line.2615"></a>
-<span class="sourceLineNo">2616</span>      if (scanner != null) {<a name="line.2616"></a>
-<span class="sourceLineNo">2617</span>        if (closeCallBack == null) {<a name="line.2617"></a>
-<span class="sourceLineNo">2618</span>          // If there is a context then the scanner can be added to the current<a name="line.2618"></a>
-<span class="sourceLineNo">2619</span>          // RpcCallContext. The rpc callback will take care of closing the<a name="line.2619"></a>
-<span class="sourceLineNo">2620</span>          // scanner, for eg in case<a name="line.2620"></a>
-<span class="sourceLineNo">2621</span>          // of get()<a name="line.2621"></a>
-<span class="sourceLineNo">2622</span>          context.setCallBack(scanner);<a name="line.2622"></a>
-<span class="sourceLineNo">2623</span>        } else {<a name="line.2623"></a>
-<span class="sourceLineNo">2624</span>          // The call is from multi() where the results from the get() are<a name="line.2624"></a>
-<span class="sourceLineNo">2625</span>          // aggregated and then send out to the<a name="line.2625"></a>
-<span class="sourceLineNo">2626</span>          // rpc. The rpccall back will close all such scanners created as part<a name="line.2626"></a>
-<span class="sourceLineNo">2627</span>          // of multi().<a name="line.2627"></a>
-<span class="sourceLineNo">2628</span>          closeCallBack.addScanner(scanner);<a name="line.2628"></a>
-<span class="sourceLineNo">2629</span>        }<a name="line.2629"></a>
-<span class="sourceLineNo">2630</span>      }<a name="line.2630"></a>
-<span class="sourceLineNo">2631</span>    }<a name="line.2631"></a>
-<span class="sourceLineNo">2632</span><a name="line.2632"></a>
-<span class="sourceLineNo">2633</span>    // post-get CP hook<a name="line.2633"></a>
-<span class="sourceLineNo">2634</span>    if (region.getCoprocessorHost() != null) {<a name="line.2634"></a>
-<span class="sourceLineNo">2635</span>      region.getCoprocessorHost().postGet(get, results);<a name="line.2635"></a>
-<span class="sourceLineNo">2636</span>    }<a name="line.2636"></a>
-<span class="sourceLineNo">2637</span>    region.metricsUpdateForGet(results, before);<a name="line.2637"></a>
-<span class="sourceLineNo">2638</span><a name="line.2638"></a>
-<span class="sourceLineNo">2639</span>    return Result.create(results, get.isCheckExistenceOnly() ? !results.isEmpty() : null, stale);<a name="line.2639"></a>
-<span class="sourceLineNo">2640</span>  }<a name="line.2640"></a>
-<span class="sourceLineNo">2641</span><a name="line.2641"></a>
-<span class="sourceLineNo">2642</span>  private void checkBatchSizeAndLogLargeSize(MultiRequest request) {<a name="line.2642"></a>
-<span class="sourceLineNo">2643</span>    int sum = 0;<a name="line.2643"></a>
-<span class="sourceLineNo">2644</span>    String firstRegionName = null;<a name="line.2644"></a>
-<span class="sourceLineNo">2645</span>    for (RegionAction regionAction : request.getRegionActionList()) {<a name="line.2645"></a>
-<span class="sourceLineNo">2646</span>      if (sum == 0) {<a name="line.2646"></a>
-<span class="sourceLineNo">2647</span>        firstRegionName = Bytes.toStringBinary(regionAction.getRegion().getValue().toByteArray());<a name="line.2647"></a>
-<span class="sourceLineNo">2648</span>      }<a name="line.2648"></a>
-<span class="sourceLineNo">2649</span>      sum += regionAction.getActionCount();<a name="line.2649"></a>
-<span class="sourceLineNo">2650</span>    }<a name="line.2650"></a>
-<span class="sourceLineNo">2651</span>    if (sum &gt; rowSizeWarnThreshold) {<a name="line.2651"></a>
-<span class="sourceLineNo">2652</span>      ld.logBatchWarning(firstRegionName, sum, rowSizeWarnThreshold);<a name="line.2652"></a>
-<span class="sourceLineNo">2653</span>    }<a name="line.2653"></a>
-<span class="sourceLineNo">2654</span>  }<a name="line.2654"></a>
-<span class="sourceLineNo">2655</span><a name="line.2655"></a>
-<span class="sourceLineNo">2656</span>  private void failRegionAction(MultiResponse.Builder responseBuilder,<a name="line.2656"></a>
-<span class="sourceLineNo">2657</span>      RegionActionResult.Builder regionActionResultBuilder, RegionAction regionAction,<a name="line.2657"></a>
-<span class="sourceLineNo">2658</span>      CellScanner cellScanner, Throwable error) {<a name="line.2658"></a>
-<span class="sourceLineNo">2659</span>    rpcServer.getMetrics().exception(error);<a name="line.2659"></a>
-<span class="sourceLineNo">2660</span>    regionActionResultBuilder.setException(ResponseConverter.buildException(error));<a name="line.2660"></a>
-<span class="sourceLineNo">2661</span>    responseBuilder.addRegionActionResult(regionActionResultBuilder.build());<a name="line.2661"></a>
-<span class="sourceLineNo">2662</span>    // All Mutations in this RegionAction not executed as we can not see the Region online here<a name="line.2662"></a>
-<span class="sourceLineNo">2663</span>    // in this RS. Will be retried from Client. Skipping all the Cells in CellScanner<a name="line.2663"></a>
-<span class="sourceLineNo">2664</span>    // corresponding to these Mutations.<a name="line.2664"></a>
-<span class="sourceLineNo">2665</span>    if (cellScanner != null) {<a name="line.2665"></a>
-<span class="sourceLineNo">2666</span>      skipCellsForMutations(regionAction.getActionList(), cellScanner);<a name="line.2666"></a>
-<span class="sourceLineNo">2667</span>    }<a name="line.2667"></a>
-<span class="sourceLineNo">2668</span>  }<a name="line.2668"></a>
-<span class="sourceLineNo">2669</span><a name="line.2669"></a>
-<span class="sourceLineNo">2670</span>  private boolean isReplicationRequest(Action action) {<a name="line.2670"></a>
-<span class="sourceLineNo">2671</span>    // replication request can only be put or delete.<a name="line.2671"></a>
-<span class="sourceLineNo">2672</span>    if (!action.hasMutation()) {<a name="line.2672"></a>
-<span class="sourceLineNo">2673</span>      return false;<a name="line.2673"></a>
-<span class="sourceLineNo">2674</span>    }<a name="line.2674"></a>
-<span class="sourceLineNo">2675</span>    MutationProto mutation = action.getMutation();<a name="line.2675"></a>
-<span class="sourceLineNo">2676</span>    MutationType type = mutation.getMutateType();<a name="line.2676"></a>
-<span class="sourceLineNo">2677</span>    if (type != MutationType.PUT &amp;&amp; type != MutationType.DELETE) {<a name="line.2677"></a>
-<span class="sourceLineNo">2678</span>      return false;<a name="line.2678"></a>
-<span class="sourceLineNo">2679</span>    }<a name="line.2679"></a>
-<span class="sourceLineNo">2680</span>    // replication will set a special attribute so we can make use of it to decide whether a request<a name="line.2680"></a>
-<span class="sourceLineNo">2681</span>    // is for replication.<a name="line.2681"></a>
-<span class="sourceLineNo">2682</span>    return mutation.getAttributeList().stream().map(p -&gt; p.getName())<a name="line.2682"></a>
-<span class="sourceLineNo">2683</span>      .filter(n -&gt; n.equals(ReplicationUtils.REPLICATION_ATTR_NAME)).findAny().isPresent();<a name="line.2683"></a>
-<span class="sourceLineNo">2684</span>  }<a name="line.2684"></a>
-<span class="sourceLineNo">2685</span><a name="line.2685"></a>
-<span class="sourceLineNo">2686</span>  /**<a name="line.2686"></a>
-<span class="sourceLineNo">2687</span>   * Execute multiple actions on a table: get, mutate, and/or execCoprocessor<a name="line.2687"></a>
-<span class="sourceLineNo">2688</span>   * @param rpcc the RPC controller<a name="line.2688"></a>
-<span class="sourceLineNo">2689</span>   * @param request the multi request<a name="line.2689"></a>
-<span class="sourceLineNo">2690</span>   * @throws ServiceException<a name="line.2690"></a>
-<span class="sourceLineNo">2691</span>   */<a name="line.2691"></a>
-<span class="sourceLineNo">2692</span>  @Override<a name="line.2692"></a>
-<span class="sourceLineNo">2693</span>  public MultiResponse multi(final RpcController rpcc, final MultiRequest request)<a name="line.2693"></a>
-<span class="sourceLineNo">2694</span>      throws ServiceException {<a name="line.2694"></a>
-<span class="sourceLineNo">2695</span>    try {<a name="line.2695"></a>
-<span class="sourceLineNo">2696</span>      checkOpen();<a name="line.2696"></a>
-<span class="sourceLineNo">2697</span>    } catch (IOException ie) {<a name="line.2697"></a>
-<span class="sourceLineNo">2698</span>      throw new ServiceException(ie);<a name="line.2698"></a>
-<span class="sourceLineNo">2699</span>    }<a name="line.2699"></a>
-<span class="sourceLineNo">2700</span><a name="line.2700"></a>
-<span class="sourceLineNo">2701</span>    checkBatchSizeAndLogLargeSize(request);<a name="line.2701"></a>
+<span class="sourceLineNo">2488</span>    TableName table = region.getRegionInfo().getTable();<a name="line.2488"></a>
+<span class="sourceLineNo">2489</span>    ReplicationSourceService service = regionServer.getReplicationSourceService();<a name="line.2489"></a>
+<span class="sourceLineNo">2490</span>    return service != null &amp;&amp; service.getSyncReplicationPeerInfoProvider()<a name="line.2490"></a>
+<span class="sourceLineNo">2491</span>            .checkState(table, RejectRequestsFromClientStateChecker.get());<a name="line.2491"></a>
+<span class="sourceLineNo">2492</span>  }<a name="line.2492"></a>
+<span class="sourceLineNo">2493</span><a name="line.2493"></a>
+<span class="sourceLineNo">2494</span>  private void rejectIfInStandByState(HRegion region) throws DoNotRetryIOException {<a name="line.2494"></a>
+<span class="sourceLineNo">2495</span>    if (shouldRejectRequestsFromClient(region)) {<a name="line.2495"></a>
+<span class="sourceLineNo">2496</span>      throw new DoNotRetryIOException(<a name="line.2496"></a>
+<span class="sourceLineNo">2497</span>        region.getRegionInfo().getRegionNameAsString() + " is in STANDBY state.");<a name="line.2497"></a>
+<span class="sourceLineNo">2498</span>    }<a name="line.2498"></a>
+<span class="sourceLineNo">2499</span>  }<a name="line.2499"></a>
+<span class="sourceLineNo">2500</span><a name="line.2500"></a>
+<span class="sourceLineNo">2501</span>  /**<a name="line.2501"></a>
+<span class="sourceLineNo">2502</span>   * Get data from a table.<a name="line.2502"></a>
+<span class="sourceLineNo">2503</span>   *<a name="line.2503"></a>
+<span class="sourceLineNo">2504</span>   * @param controller the RPC controller<a name="line.2504"></a>
+<span class="sourceLineNo">2505</span>   * @param request the get request<a name="line.2505"></a>
+<span class="sourceLineNo">2506</span>   * @throws ServiceException<a name="line.2506"></a>
+<span class="sourceLineNo">2507</span>   */<a name="line.2507"></a>
+<span class="sourceLineNo">2508</span>  @Override<a name="line.2508"></a>
+<span class="sourceLineNo">2509</span>  public GetResponse get(final RpcController controller, final GetRequest request)<a name="line.2509"></a>
+<span class="sourceLineNo">2510</span>      throws ServiceException {<a name="line.2510"></a>
+<span class="sourceLineNo">2511</span>    long before = EnvironmentEdgeManager.currentTime();<a name="line.2511"></a>
+<span class="sourceLineNo">2512</span>    OperationQuota quota = null;<a name="line.2512"></a>
+<span class="sourceLineNo">2513</span>    HRegion region = null;<a name="line.2513"></a>
+<span class="sourceLineNo">2514</span>    try {<a name="line.2514"></a>
+<span class="sourceLineNo">2515</span>      checkOpen();<a name="line.2515"></a>
+<span class="sourceLineNo">2516</span>      requestCount.increment();<a name="line.2516"></a>
+<span class="sourceLineNo">2517</span>      rpcGetRequestCount.increment();<a name="line.2517"></a>
+<span class="sourceLineNo">2518</span>      region = getRegion(request.getRegion());<a name="line.2518"></a>
+<span class="sourceLineNo">2519</span>      rejectIfInStandByState(region);<a name="line.2519"></a>
+<span class="sourceLineNo">2520</span><a name="line.2520"></a>
+<span class="sourceLineNo">2521</span>      GetResponse.Builder builder = GetResponse.newBuilder();<a name="line.2521"></a>
+<span class="sourceLineNo">2522</span>      ClientProtos.Get get = request.getGet();<a name="line.2522"></a>
+<span class="sourceLineNo">2523</span>      // An asynchbase client, https://github.com/OpenTSDB/asynchbase, starts by trying to do<a name="line.2523"></a>
+<span class="sourceLineNo">2524</span>      // a get closest before. Throwing the UnknownProtocolException signals it that it needs<a name="line.2524"></a>
+<span class="sourceLineNo">2525</span>      // to switch and do hbase2 protocol (HBase servers do not tell clients what versions<a name="line.2525"></a>
+<span class="sourceLineNo">2526</span>      // they are; its a problem for non-native clients like asynchbase. HBASE-20225.<a name="line.2526"></a>
+<span class="sourceLineNo">2527</span>      if (get.hasClosestRowBefore() &amp;&amp; get.getClosestRowBefore()) {<a name="line.2527"></a>
+<span class="sourceLineNo">2528</span>        throw new UnknownProtocolException("Is this a pre-hbase-1.0.0 or asynchbase client? " +<a name="line.2528"></a>
+<span class="sourceLineNo">2529</span>            "Client is invoking getClosestRowBefore removed in hbase-2.0.0 replaced by " +<a name="line.2529"></a>
+<span class="sourceLineNo">2530</span>            "reverse Scan.");<a name="line.2530"></a>
+<span class="sourceLineNo">2531</span>      }<a name="line.2531"></a>
+<span class="sourceLineNo">2532</span>      Boolean existence = null;<a name="line.2532"></a>
+<span class="sourceLineNo">2533</span>      Result r = null;<a name="line.2533"></a>
+<span class="sourceLineNo">2534</span>      RpcCallContext context = RpcServer.getCurrentCall().orElse(null);<a name="line.2534"></a>
+<span class="sourceLineNo">2535</span>      quota = getRpcQuotaManager().checkQuota(region, OperationQuota.OperationType.GET);<a name="line.2535"></a>
+<span class="sourceLineNo">2536</span><a name="line.2536"></a>
+<span class="sourceLineNo">2537</span>      Get clientGet = ProtobufUtil.toGet(get);<a name="line.2537"></a>
+<span class="sourceLineNo">2538</span>      if (get.getExistenceOnly() &amp;&amp; region.getCoprocessorHost() != null) {<a name="line.2538"></a>
+<span class="sourceLineNo">2539</span>        existence = region.getCoprocessorHost().preExists(clientGet);<a name="line.2539"></a>
+<span class="sourceLineNo">2540</span>      }<a name="line.2540"></a>
+<span class="sourceLineNo">2541</span>      if (existence == null) {<a name="line.2541"></a>
+<span class="sourceLineNo">2542</span>        if (context != null) {<a name="line.2542"></a>
+<span class="sourceLineNo">2543</span>          r = get(clientGet, (region), null, context);<a name="line.2543"></a>
+<span class="sourceLineNo">2544</span>        } else {<a name="line.2544"></a>
+<span class="sourceLineNo">2545</span>          // for test purpose<a name="line.2545"></a>
+<span class="sourceLineNo">2546</span>          r = region.get(clientGet);<a name="line.2546"></a>
+<span class="sourceLineNo">2547</span>        }<a name="line.2547"></a>
+<span class="sourceLineNo">2548</span>        if (get.getExistenceOnly()) {<a name="line.2548"></a>
+<span class="sourceLineNo">2549</span>          boolean exists = r.getExists();<a name="line.2549"></a>
+<span class="sourceLineNo">2550</span>          if (region.getCoprocessorHost() != null) {<a name="line.2550"></a>
+<span class="sourceLineNo">2551</span>            exists = region.getCoprocessorHost().postExists(clientGet, exists);<a name="line.2551"></a>
+<span class="sourceLineNo">2552</span>          }<a name="line.2552"></a>
+<span class="sourceLineNo">2553</span>          existence = exists;<a name="line.2553"></a>
+<span class="sourceLineNo">2554</span>        }<a name="line.2554"></a>
+<span class="sourceLineNo">2555</span>      }<a name="line.2555"></a>
+<span class="sourceLineNo">2556</span>      if (existence != null) {<a name="line.2556"></a>
+<span class="sourceLineNo">2557</span>        ClientProtos.Result pbr =<a name="line.2557"></a>
+<span class="sourceLineNo">2558</span>            ProtobufUtil.toResult(existence, region.getRegionInfo().getReplicaId() != 0);<a name="line.2558"></a>
+<span class="sourceLineNo">2559</span>        builder.setResult(pbr);<a name="line.2559"></a>
+<span class="sourceLineNo">2560</span>      } else if (r != null) {<a name="line.2560"></a>
+<span class="sourceLineNo">2561</span>        ClientProtos.Result pbr;<a name="line.2561"></a>
+<span class="sourceLineNo">2562</span>        if (isClientCellBlockSupport(context) &amp;&amp; controller instanceof HBaseRpcController<a name="line.2562"></a>
+<span class="sourceLineNo">2563</span>            &amp;&amp; VersionInfoUtil.hasMinimumVersion(context.getClientVersionInfo(), 1, 3)) {<a name="line.2563"></a>
+<span class="sourceLineNo">2564</span>          pbr = ProtobufUtil.toResultNoData(r);<a name="line.2564"></a>
+<span class="sourceLineNo">2565</span>          ((HBaseRpcController) controller).setCellScanner(CellUtil.createCellScanner(r<a name="line.2565"></a>
+<span class="sourceLineNo">2566</span>              .rawCells()));<a name="line.2566"></a>
+<span class="sourceLineNo">2567</span>          addSize(context, r, null);<a name="line.2567"></a>
+<span class="sourceLineNo">2568</span>        } else {<a name="line.2568"></a>
+<span class="sourceLineNo">2569</span>          pbr = ProtobufUtil.toResult(r);<a name="line.2569"></a>
+<span class="sourceLineNo">2570</span>        }<a name="line.2570"></a>
+<span class="sourceLineNo">2571</span>        builder.setResult(pbr);<a name="line.2571"></a>
+<span class="sourceLineNo">2572</span>      }<a name="line.2572"></a>
+<span class="sourceLineNo">2573</span>      if (r != null) {<a name="line.2573"></a>
+<span class="sourceLineNo">2574</span>        quota.addGetResult(r);<a name="line.2574"></a>
+<span class="sourceLineNo">2575</span>      }<a name="line.2575"></a>
+<span class="sourceLineNo">2576</span>      return builder.build();<a name="line.2576"></a>
+<span class="sourceLineNo">2577</span>    } catch (IOException ie) {<a name="line.2577"></a>
+<span class="sourceLineNo">2578</span>      throw new ServiceException(ie);<a name="line.2578"></a>
+<span class="sourceLineNo">2579</span>    } finally {<a name="line.2579"></a>
+<span class="sourceLineNo">2580</span>      MetricsRegionServer mrs = regionServer.metricsRegionServer;<a name="line.2580"></a>
+<span class="sourceLineNo">2581</span>      if (mrs != null) {<a name="line.2581"></a>
+<span class="sourceLineNo">2582</span>        TableDescriptor td = region != null? region.getTableDescriptor(): null;<a name="line.2582"></a>
+<span class="sourceLineNo">2583</span>        if (td != null) {<a name="line.2583"></a>
+<span class="sourceLineNo">2584</span>          mrs.updateGet(td.getTableName(), EnvironmentEdgeManager.currentTime() - before);<a name="line.2584"></a>
+<span class="sourceLineNo">2585</span>        }<a name="line.2585"></a>
+<span class="sourceLineNo">2586</span>      }<a name="line.2586"></a>
+<span class="sourceLineNo">2587</span>      if (quota != null) {<a name="line.2587"></a>
+<span class="sourceLineNo">2588</span>        quota.close();<a name="line.2588"></a>
+<span class="sourceLineNo">2589</span>      }<a name="line.2589"></a>
+<span class="sourceLineNo">2590</span>    }<a name="line.2590"></a>
+<span class="sourceLineNo">2591</span>  }<a name="line.2591"></a>
+<span class="sourceLineNo">2592</span><a name="line.2592"></a>
+<span class="sourceLineNo">2593</span>  private Result get(Get get, HRegion region, RegionScannersCloseCallBack closeCallBack,<a name="line.2593"></a>
+<span class="sourceLineNo">2594</span>      RpcCallContext context) throws IOException {<a name="line.2594"></a>
+<span class="sourceLineNo">2595</span>    region.prepareGet(get);<a name="line.2595"></a>
+<span class="sourceLineNo">2596</span>    boolean stale = region.getRegionInfo().getReplicaId() != 0;<a name="line.2596"></a>
+<span class="sourceLineNo">2597</span><a name="line.2597"></a>
+<span class="sourceLineNo">2598</span>    // This method is almost the same as HRegion#get.<a name="line.2598"></a>
+<span class="sourceLineNo">2599</span>    List&lt;Cell&gt; results = new ArrayList&lt;&gt;();<a name="line.2599"></a>
+<span class="sourceLineNo">2600</span>    long before = EnvironmentEdgeManager.currentTime();<a name="line.2600"></a>
+<span class="sourceLineNo">2601</span>    // pre-get CP hook<a name="line.2601"></a>
+<span class="sourceLineNo">2602</span>    if (region.getCoprocessorHost() != null) {<a name="line.2602"></a>
+<span class="sourceLineNo">2603</span>      if (region.getCoprocessorHost().preGet(get, results)) {<a name="line.2603"></a>
+<span class="sourceLineNo">2604</span>        region.metricsUpdateForGet(results, before);<a name="line.2604"></a>
+<span class="sourceLineNo">2605</span>        return Result<a name="line.2605"></a>
+<span class="sourceLineNo">2606</span>            .create(results, get.isCheckExistenceOnly() ? !results.isEmpty() : null, stale);<a name="line.2606"></a>
+<span class="sourceLineNo">2607</span>      }<a name="line.2607"></a>
+<span class="sourceLineNo">2608</span>    }<a name="line.2608"></a>
+<span class="sourceLineNo">2609</span>    Scan scan = new Scan(get);<a name="line.2609"></a>
+<span class="sourceLineNo">2610</span>    if (scan.getLoadColumnFamiliesOnDemandValue() == null) {<a name="line.2610"></a>
+<span class="sourceLineNo">2611</span>      scan.setLoadColumnFamiliesOnDemand(region.isLoadingCfsOnDemandDefault());<a name="line.2611"></a>
+<span class="sourceLineNo">2612</span>    }<a name="line.2612"></a>
+<span class="sourceLineNo">2613</span>    RegionScannerImpl scanner = null;<a name="line.2613"></a>
+<span class="sourceLineNo">2614</span>    try {<a name="line.2614"></a>
+<span class="sourceLineNo">2615</span>      scanner = region.getScanner(scan);<a name="line.2615"></a>
+<span class="sourceLineNo">2616</span>      scanner.next(results);<a name="line.2616"></a>
+<span class="sourceLineNo">2617</span>    } finally {<a name="line.2617"></a>
+<span class="sourceLineNo">2618</span>      if (scanner != null) {<a name="line.2618"></a>
+<span class="sourceLineNo">2619</span>        if (closeCallBack == null) {<a name="line.2619"></a>
+<span class="sourceLineNo">2620</span>          // If there is a context then the scanner can be added to the current<a name="line.2620"></a>
+<span class="sourceLineNo">2621</span>          // RpcCallContext. The rpc callback will take care of closing the<a name="line.2621"></a>
+<span class="sourceLineNo">2622</span>          // scanner, for eg in case<a name="line.2622"></a>
+<span class="sourceLineNo">2623</span>          // of get()<a name="line.2623"></a>
+<span class="sourceLineNo">2624</span>          context.setCallBack(scanner);<a name="line.2624"></a>
+<span class="sourceLineNo">2625</span>        } else {<a name="line.2625"></a>
+<span class="sourceLineNo">2626</span>          // The call is from multi() where the results from the get() are<a name="line.2626"></a>
+<span class="sourceLineNo">2627</span>          // aggregated and then send out to the<a name="line.2627"></a>
+<span class="sourceLineNo">2628</span>          // rpc. The rpccall back will close all such scanners created as part<a name="line.2628"></a>
+<span class="sourceLineNo">2629</span>          // of multi().<a name="line.2629"></a>
+<span class="sourceLineNo">2630</span>          closeCallBack.addScanner(scanner);<a name="line.2630"></a>
+<span class="sourceLineNo">2631</span>        }<a name="line.2631"></a>
+<span class="sourceLineNo">2632</span>      }<a name="line.2632"></a>
+<span class="sourceLineNo">2633</span>    }<a name="line.2633"></a>
+<span class="sourceLineNo">2634</span><a name="line.2634"></a>
+<span class="sourceLineNo">2635</span>    // post-get CP hook<a name="line.2635"></a>
+<span class="sourceLineNo">2636</span>    if (region.getCoprocessorHost() != null) {<a name="line.2636"></a>
+<span class="sourceLineNo">2637</span>      region.getCoprocessorHost().postGet(get, results);<a name="line.2637"></a>
+<span class="sourceLineNo">2638</span>    }<a name="line.2638"></a>
+<span class="sourceLineNo">2639</span>    region.metricsUpdateForGet(results, before);<a name="line.2639"></a>
+<span class="sourceLineNo">2640</span><a name="line.2640"></a>
+<span class="sourceLineNo">2641</span>    return Result.create(results, get.isCheckExistenceOnly() ? !results.isEmpty() : null, stale);<a name="line.2641"></a>
+<span class="sourceLineNo">2642</span>  }<a name="line.2642"></a>
+<span class="sourceLineNo">2643</span><a name="line.2643"></a>
+<span class="sourceLineNo">2644</span>  private void checkBatchSizeAndLogLargeSize(MultiRequest request) {<a name="line.2644"></a>
+<span class="sourceLineNo">2645</span>    int sum = 0;<a name="line.2645"></a>
+<span class="sourceLineNo">2646</span>    String firstRegionName = null;<a name="line.2646"></a>
+<span class="sourceLineNo">2647</span>    for (RegionAction regionAction : request.getRegionActionList()) {<a name="line.2647"></a>
+<span class="sourceLineNo">2648</span>      if (sum == 0) {<a name="line.2648"></a>
+<span class="sourceLineNo">2649</span>        firstRegionName = Bytes.toStringBinary(regionAction.getRegion().getValue().toByteArray());<a name="line.2649"></a>
+<span class="sourceLineNo">2650</span>      }<a name="line.2650"></a>
+<span class="sourceLineNo">2651</span>      sum += regionAction.getActionCount();<a name="line.2651"></a>
+<span class="sourceLineNo">2652</span>    }<a name="line.2652"></a>
+<span class="sourceLineNo">2653</span>    if (sum &gt; rowSizeWarnThreshold) {<a name="line.2653"></a>
+<span class="sourceLineNo">2654</span>      ld.logBatchWarning(firstRegionName, sum, rowSizeWarnThreshold);<a name="line.2654"></a>
+<span class="sourceLineNo">2655</span>    }<a name="line.2655"></a>
+<span class="sourceLineNo">2656</span>  }<a name="line.2656"></a>
+<span class="sourceLineNo">2657</span><a name="line.2657"></a>
+<span class="sourceLineNo">2658</span>  private void failRegionAction(MultiResponse.Builder responseBuilder,<a name="line.2658"></a>
+<span class="sourceLineNo">2659</span>      RegionActionResult.Builder regionActionResultBuilder, RegionAction regionAction,<a name="line.2659"></a>
+<span class="sourceLineNo">2660</span>      CellScanner cellScanner, Throwable error) {<a name="line.2660"></a>
+<span class="sourceLineNo">2661</span>    rpcServer.getMetrics().exception(error);<a name="line.2661"></a>
+<span class="sourceLineNo">2662</span>    regionActionResultBuilder.setException(ResponseConverter.buildException(error));<a name="line.2662"></a>
+<span class="sourceLineNo">2663</span>    responseBuilder.addRegionActionResult(regionActionResultBuilder.build());<a name="line.2663"></a>
+<span class="sourceLineNo">2664</span>    // All Mutations in this RegionAction not executed as we can not see the Region online here<a name="line.2664"></a>
+<span class="sourceLineNo">2665</span>    // in this RS. Will be retried from Client. Skipping all the Cells in CellScanner<a name="line.2665"></a>
+<span class="sourceLineNo">2666</span>    // corresponding to these Mutations.<a name="line.2666"></a>
+<span class="sourceLineNo">2667</span>    if (cellScanner != null) {<a name="line.2667"></a>
+<span class="sourceLineNo">2668</span>      skipCellsForMutations(regionAction.getActionList(), cellScanner);<a name="line.2668"></a>
+<span class="sourceLineNo">2669</span>    }<a name="line.2669"></a>
+<span class="sourceLineNo">2670</span>  }<a name="line.2670"></a>
+<span class="sourceLineNo">2671</span><a name="line.2671"></a>
+<span class="sourceLineNo">2672</span>  private boolean isReplicationRequest(Action action) {<a name="line.2672"></a>
+<span class="sourceLineNo">2673</span>    // replication request can only be put or delete.<a name="line.2673"></a>
+<span class="sourceLineNo">2674</span>    if (!action.hasMutation()) {<a name="line.2674"></a>
+<span class="sourceLineNo">2675</span>      return false;<a name="line.2675"></a>
+<span class="sourceLineNo">2676</span>    }<a name="line.2676"></a>
+<span class="sourceLineNo">2677</span>    MutationProto mutation = action.getMutation();<a name="line.2677"></a>
+<span class="sourceLineNo">2678</span>    MutationType type = mutation.getMutateType();<a name="line.2678"></a>
+<span class="sourceLineNo">2679</span>    if (type != MutationType.PUT &amp;&amp; type != MutationType.DELETE) {<a name="line.2679"></a>
+<span class="sourceLineNo">2680</span>      return false;<a name="line.2680"></a>
+<span class="sourceLineNo">2681</span>    }<a name="line.2681"></a>
+<span class="sourceLineNo">2682</span>    // replication will set a special attribute so we can make use of it to decide whether a request<a name="line.2682"></a>
+<span class="sourceLineNo">2683</span>    // is for replication.<a name="line.2683"></a>
+<span class="sourceLineNo">2684</span>    return mutation.getAttributeList().stream().map(p -&gt; p.getName())<a name="line.2684"></a>
+<span class="sourceLineNo">2685</span>      .filter(n -&gt; n.equals(ReplicationUtils.REPLICATION_ATTR_NAME)).findAny().isPresent();<a name="line.2685"></a>
+<span class="sourceLineNo">2686</span>  }<a name="line.2686"></a>
+<span class="sourceLineNo">2687</span><a name="line.2687"></a>
+<span class="sourceLineNo">2688</span>  /**<a name="line.2688"></a>
+<span class="sourceLineNo">2689</span>   * Execute multiple actions on a table: get, mutate, and/or execCoprocessor<a name="line.2689"></a>
+<span class="sourceLineNo">2690</span>   * @param rpcc the RPC controller<a name="line.2690"></a>
+<span class="sourceLineNo">2691</span>   * @param request the multi request<a name="line.2691"></a>
+<span class="sourceLineNo">2692</span>   * @throws ServiceException<a name="line.2692"></a>
+<span class="sourceLineNo">2693</span>   */<a name="line.2693"></a>
+<span class="sourceLineNo">2694</span>  @Override<a name="line.2694"></a>
+<span class="sourceLineNo">2695</span>  public MultiResponse multi(final RpcController rpcc, final MultiRequest request)<a name="line.2695"></a>
+<span class="sourceLineNo">2696</span>      throws ServiceException {<a name="line.2696"></a>
+<span class="sourceLineNo">2697</span>    try {<a name="line.2697"></a>
+<span class="sourceLineNo">2698</span>      checkOpen();<a name="line.2698"></a>
+<span class="sourceLineNo">2699</span>    } catch (IOException ie) {<a name="line.2699"></a>
+<span class="sourceLineNo">2700</span>      throw new ServiceException(ie);<a name="line.2700"></a>
+<span class="sourceLineNo">2701</span>    }<a name="line.2701"></a>
 <span class="sourceLineNo">2702</span><a name="line.2702"></a>
-<span class="sourceLineNo">2703</span>    // rpc controller is how we bring in data via the back door;  it is unprotobuf'ed data.<a name="line.2703"></a>
-<span class="sourceLineNo">2704</span>    // It is also the conduit via which we pass back data.<a name="line.2704"></a>
-<span class="sourceLineNo">2705</span>    HBaseRpcController controller = (HBaseRpcController)rpcc;<a name="line.2705"></a>
-<span class="sourceLineNo">2706</span>    CellScanner cellScanner = controller != null ? controller.cellScanner(): null;<a name="line.2706"></a>
-<span class="sourceLineNo">2707</span>    if (controller != null) {<a name="line.2707"></a>
-<span class="sourceLineNo">2708</span>      controller.setCellScanner(null);<a name="line.2708"></a>
-<span class="sourceLineNo">2709</span>    }<a name="line.2709"></a>
-<span class="sourceLineNo">2710</span><a name="line.2710"></a>
-<span class="sourceLineNo">2711</span>    long nonceGroup = request.hasNonceGroup() ? request.getNonceGroup() : HConstants.NO_NONCE;<a name="line.2711"></a>
+<span class="sourceLineNo">2703</span>    checkBatchSizeAndLogLargeSize(request);<a name="line.2703"></a>
+<span class="sourceLineNo">2704</span><a name="line.2704"></a>
+<span class="sourceLineNo">2705</span>    // rpc controller is how we bring in data via the back door;  it is unprotobuf'ed data.<a name="line.2705"></a>
+<span class="sourceLineNo">2706</span>    // It is also the conduit via which we pass back data.<a name="line.2706"></a>
+<span class="sourceLineNo">2707</span>    HBaseRpcController controller = (HBaseRpcController)rpcc;<a name="line.2707"></a>
+<span class="sourceLineNo">2708</span>    CellScanner cellScanner = controller != null ? controller.cellScanner(): null;<a name="line.2708"></a>
+<span class="sourceLineNo">2709</span>    if (controller != null) {<a name="line.2709"></a>
+<span class="sourceLineNo">2710</span>      controller.setCellScanner(null);<a name="line.2710"></a>
+<span class="sourceLineNo">2711</span>    }<a name="line.2711"></a>
 <span class="sourceLineNo">2712</span><a name="line.2712"></a>
-<span class="sourceLineNo">2713</span>    // this will contain all the cells that we need to return. It's created later, if needed.<a name="line.2713"></a>
-<span class="sourceLineNo">2714</span>    List&lt;CellScannable&gt; cellsToReturn = null;<a name="line.2714"></a>
-<span class="sourceLineNo">2715</span>    MultiResponse.Builder responseBuilder = MultiResponse.newBuilder();<a name="line.2715"></a>
-<span class="sourceLineNo">2716</span>    RegionActionResult.Builder regionActionResultBuilder = RegionActionResult.newBuilder();<a name="line.2716"></a>
-<span class="sourceLineNo">2717</span>    Boolean processed = null;<a name="line.2717"></a>
-<span class="sourceLineNo">2718</span>    RegionScannersCloseCallBack closeCallBack = null;<a name="line.2718"></a>
-<span class="sourceLineNo">2719</span>    RpcCallContext context = RpcServer.getCurrentCall().orElse(null);<a name="line.2719"></a>
-<span class="sourceLineNo">2720</span>    this.rpcMultiRequestCount.increment();<a name="line.2720"></a>
-<span class="sourceLineNo">2721</span>    this.requestCount.increment();<a name="line.2721"></a>
-<span class="sourceLineNo">2722</span>    Map&lt;RegionSpecifier, ClientProtos.RegionLoadStats&gt; regionStats = new HashMap&lt;&gt;(request<a name="line.2722"></a>
-<span class="sourceLineNo">2723</span>      .getRegionActionCount());<a name="line.2723"></a>
-<span class="sourceLineNo">2724</span>    ActivePolicyEnforcement spaceQuotaEnforcement = getSpaceQuotaManager().getActiveEnforcements();<a name="line.2724"></a>
-<span class="sourceLineNo">2725</span>    for (RegionAction regionAction : request.getRegionActionList()) {<a name="line.2725"></a>
-<span class="sourceLineNo">2726</span>      OperationQuota quota;<a name="line.2726"></a>
-<span class="sourceLineNo">2727</span>      HRegion region;<a name="line.2727"></a>
-<span class="sourceLineNo">2728</span>      regionActionResultBuilder.clear();<a name="line.2728"></a>
-<span class="sourceLineNo">2729</span>      RegionSpecifier regionSpecifier = regionAction.getRegion();<a name="line.2729"></a>
-<span class="sourceLineNo">2730</span>      try {<a name="line.2730"></a>
-<span class="sourceLineNo">2731</span>        region = getRegion(regionSpecifier);<a name="line.2731"></a>
-<span class="sourceLineNo">2732</span>        quota = getRpcQuotaManager().checkQuota(region, regionAction.getActionList());<a name="line.2732"></a>
-<span class="sourceLineNo">2733</span>      } catch (IOException e) {<a name="line.2733"></a>
-<span class="sourceLineNo">2734</span>        failRegionAction(responseBuilder, regionActionResultBuilder, regionAction, cellScanner, e);<a name="line.2734"></a>
-<span class="sourceLineNo">2735</span>        continue;  // For this region it's a failure.<a name="line.2735"></a>
-<span class="sourceLineNo">2736</span>      }<a name="line.2736"></a>
-<span class="sourceLineNo">2737</span>      boolean rejectIfFromClient = shouldRejectRequestsFromClient(region);<a name="line.2737"></a>
-<span class="sourceLineNo">2738</span>      if (regionAction.hasAtomic() &amp;&amp; regionAction.getAtomic()) {<a name="line.2738"></a>
-<span class="sourceLineNo">2739</span>        // We only allow replication in standby state and it will not set the atomic flag.<a name="line.2739"></a>
-<span class="sourceLineNo">2740</span>        if (rejectIfFromClient) {<a name="line.2740"></a>
-<span class="sourceLineNo">2741</span>          failRegionAction(responseBuilder, regionActionResultBuilder, regionAction, cellScanner,<a name="line.2741"></a>
-<span class="sourceLineNo">2742</span>            new DoNotRetryIOException(<a name="line.2742"></a>
-<span class="sourceLineNo">2743</span>              region.getRegionInfo().getRegionNameAsString() + " is in STANDBY state"));<a name="line.2743"></a>
-<span class="sourceLineNo">2744</span>          quota.close();<a name="line.2744"></a>
-<span class="sourceLineNo">2745</span>          continue;<a name="line.2745"></a>
-<span class="sourceLineNo">2746</span>        }<a name="line.2746"></a>
-<span class="sourceLineNo">2747</span>        // How does this call happen?  It may need some work to play well w/ the surroundings.<a name="line.2747"></a>
-<span class="sourceLineNo">2748</span>        // Need to return an item per Action along w/ Action index.  TODO.<a name="line.2748"></a>
-<span class="sourceLineNo">2749</span>        try {<a name="line.2749"></a>
-<span class="sourceLineNo">2750</span>          if (request.hasCondition()) {<a name="line.2750"></a>
-<span class="sourceLineNo">2751</span>            Condition condition = request.getCondition();<a name="line.2751"></a>
-<span class="sourceLineNo">2752</span>            byte[] row = condition.getRow().toByteArray();<a name="line.2752"></a>
-<span class="sourceLineNo">2753</span>            byte[] family = condition.getFamily().toByteArray();<a name="line.2753"></a>
-<span class="sourceLineNo">2754</span>            byte[] qualifier = condition.getQualifier().toByteArray();<a name="line.2754"></a>
-<span class="sourceLineNo">2755</span>            CompareOperator op =<a name="line.2755"></a>
-<span class="sourceLineNo">2756</span>              CompareOperator.valueOf(condition.getCompareType().name());<a name="line.2756"></a>
-<span class="sourceLineNo">2757</span>            ByteArrayComparable comparator =<a name="line.2757"></a>
-<span class="sourceLineNo">2758</span>                ProtobufUtil.toComparator(condition.getComparator());<a name="line.2758"></a>
-<span class="sourceLineNo">2759</span>            TimeRange timeRange = condition.hasTimeRange() ?<a name="line.2759"></a>
-<span class="sourceLineNo">2760</span>              ProtobufUtil.toTimeRange(condition.getTimeRange()) :<a name="line.2760"></a>
-<span class="sourceLineNo">2761</span>              TimeRange.allTime();<a name="line.2761"></a>
-<span class="sourceLineNo">2762</span>            processed =<a name="line.2762"></a>
-<span class="sourceLineNo">2763</span>              checkAndRowMutate(region, regionAction.getActionList(), cellScanner, row, family,<a name="line.2763"></a>
-<span class="sourceLineNo">2764</span>                qualifier, op, comparator, timeRange, regionActionResultBuilder,<a name="line.2764"></a>
-<span class="sourceLineNo">2765</span>                spaceQuotaEnforcement);<a name="line.2765"></a>
-<span class="sourceLineNo">2766</span>          } else {<a name="line.2766"></a>
-<span class="sourceLineNo">2767</span>            doAtomicBatchOp(regionActionResultBuilder, region, quota, regionAction.getActionList(),<a name="line.2767"></a>
-<span class="sourceLineNo">2768</span>              cellScanner, spaceQuotaEnforcement);<a name="line.2768"></a>
-<span class="sourceLineNo">2769</span>            processed = Boolean.TRUE;<a name="line.2769"></a>
-<span class="sourceLineNo">2770</span>          }<a name="line.2770"></a>
-<span class="sourceLineNo">2771</span>        } catch (IOException e) {<a name="line.2771"></a>
-<span class="sourceLineNo">2772</span>          rpcServer.getMetrics().exception(e);<a name="line.2772"></a>
-<span class="sourceLineNo">2773</span>          // As it's atomic, we may expect it's a global failure.<a name="line.2773"></a>
-<span class="sourceLineNo">2774</span>          regionActionResultBuilder.setException(ResponseConverter.buildException(e));<a name="line.2774"></a>
-<span class="sourceLineNo">2775</span>        }<a name="line.2775"></a>
-<span class="sourceLineNo">2776</span>      } else {<a name="line.2776"></a>
-<span class="sourceLineNo">2777</span>        if (rejectIfFromClient &amp;&amp; regionAction.getActionCount() &gt; 0 &amp;&amp;<a name="line.2777"></a>
-<span class="sourceLineNo">2778</span>          !isReplicationRequest(regionAction.getAction(0))) {<a name="line.2778"></a>
-<span class="sourceLineNo">2779</span>          // fail if it is not a replication request<a name="line.2779"></a>
-<span class="sourceLineNo">2780</span>          failRegionAction(responseBuilder, regionActionResultBuilder, regionAction, cellScanner,<a name="line.2780"></a>
-<span class="sourceLineNo">2781</span>            new DoNotRetryIOException(<a name="line.2781"></a>
-<span class="sourceLineNo">2782</span>              region.getRegionInfo().getRegionNameAsString() + " is in STANDBY state"));<a name="line.2782"></a>
-<span class="sourceLineNo">2783</span>          quota.close();<a name="line.2783"></a>
-<span class="sourceLineNo">2784</span>          continue;<a name="line.2784"></a>
-<span class="sourceLineNo">2785</span>        }<a name="line.2785"></a>
-<span class="sourceLineNo">2786</span>        // doNonAtomicRegionMutation manages the exception internally<a name="line.2786"></a>
-<span class="sourceLineNo">2787</span>        if (context != null &amp;&amp; closeCallBack == null) {<a name="line.2787"></a>
-<span class="sourceLineNo">2788</span>          // An RpcCallBack that creates a list of scanners that needs to perform callBack<a name="line.2788"></a>
-<span class="sourceLineNo">2789</span>          // operation on completion of multiGets.<a name="line.2789"></a>
-<span class="sourceLineNo">2790</span>          // Set this only once<a name="line.2790"></a>
-<span class="sourceLineNo">2791</span>          closeCallBack = new RegionScannersCloseCallBack();<a name="line.2791"></a>
-<span class="sourceLineNo">2792</span>          context.setCallBack(closeCallBack);<a name="line.2792"></a>
-<span class="sourceLineNo">2793</span>        }<a name="line.2793"></a>
-<span class="sourceLineNo">2794</span>        cellsToReturn = doNonAtomicRegionMutation(region, quota, regionAction, cellScanner,<a name="line.2794"></a>
-<span class="sourceLineNo">2795</span>            regionActionResultBuilder, cellsToReturn, nonceGroup, closeCallBack, context,<a name="line.2795"></a>
-<span class="sourceLineNo">2796</span>            spaceQuotaEnforcement);<a name="line.2796"></a>
-<span class="sourceLineNo">2797</span>      }<a name="line.2797"></a>
-<span class="sourceLineNo">2798</span>      responseBuilder.addRegionActionResult(regionActionResultBuilder.build());<a name="line.2798"></a>
-<span class="sourceLineNo">2799</span>      quota.close();<a name="line.2799"></a>
-<span class="sourceLineNo">2800</span>      ClientProtos.RegionLoadStats regionLoadStats = region.getLoadStatistics();<a name="line.2800"></a>
-<span class="sourceLineNo">2801</span>      if (regionLoadStats != null) {<a name="line.2801"></a>
-<span class="sourceLineNo">2802</span>        regionStats.put(regionSpecifier, regionLoadStats);<a name="line.2802"></a>
-<span class="sourceLineNo">2803</span>      }<a name="line.2803"></a>
-<span class="sourceLineNo">2804</span>    }<a name="line.2804"></a>
-<span class="sourceLineNo">2805</span>    // Load the controller with the Cells to return.<a name="line.2805"></a>
-<span class="sourceLineNo">2806</span>    if (cellsToReturn != null &amp;&amp; !cellsToReturn.isEmpty() &amp;&amp; controller != null) {<a name="line.2806"></a>
-<span class="sourceLineNo">2807</span>      controller.setCellScanner(CellUtil.createCellScanner(cellsToReturn));<a name="line.2807"></a>
-<span class="sourceLineNo">2808</span>    }<a name="line.2808"></a>
-<span class="sourceLineNo">2809</span><a name="line.2809"></a>
-<span class="sourceLineNo">2810</span>    if (processed != null) {<a name="line.2810"></a>
-<span class="sourceLineNo">2811</span>      responseBuilder.setProcessed(processed);<a name="line.2811"></a>
-<span class="sourceLineNo">2812</span>    }<a name="line.2812"></a>
-<span class="sourceLineNo">2813</span><a name="line.2813"></a>
-<span class="sourceLineNo">2814</span>    MultiRegionLoadStats.Builder builder = MultiRegionLoadStats.newBuilder();<a name="line.2814"></a>
-<span class="sourceLineNo">2815</span>    for(Entry&lt;RegionSpecifier, ClientProtos.RegionLoadStats&gt; stat: regionStats.entrySet()){<a name="line.2815"></a>
-<span class="sourceLineNo">2816</span>      builder.addRegion(stat.getKey());<a name="line.2816"></a>
-<span class="sourceLineNo">2817</span>      builder.addStat(stat.getValue());<a name="line.2817"></a>
-<span class="sourceLineNo">2818</span>    }<a name="line.2818"></a>
-<span class="sourceLineNo">2819</span>    responseBuilder.setRegionStatistics(builder);<a name="line.2819"></a>
-<span class="sourceLineNo">2820</span>    return responseBuilder.build();<a name="line.2820"></a>
-<span class="sourceLineNo">2821</span>  }<a name="line.2821"></a>
-<span class="sourceLineNo">2822</span><a name="line.2822"></a>
-<span class="sourceLineNo">2823</span>  private void skipCellsForMutations(List&lt;Action&gt; actions, CellScanner cellScanner) {<a name="line.2823"></a>
-<span class="sourceLineNo">2824</span>    if (cellScanner == null) {<a name="line.2824"></a>
-<span class="sourceLineNo">2825</span>      return;<a name="line.2825"></a>
-<span class="sourceLineNo">2826</span>    }<a name="line.2826"></a>
-<span class="sourceLineNo">2827</span>    for (Action action : actions) {<a name="line.2827"></a>
-<span class="sourceLineNo">2828</span>      skipCellsForMutation(action, cellScanner);<a name="line.2828"></a>
-<span class="sourceLineNo">2829</span>    }<a name="line.2829"></a>
-<span class="sourceLineNo">2830</span>  }<a name="line.2830"></a>
-<span class="sourceLineNo">2831</span><a name="line.2831"></a>
-<span class="sourceLineNo">2832</span>  private void skipCellsForMutation(Action action, CellScanner cellScanner) {<a name="line.2832"></a>
-<span class="sourceLineNo">2833</span>    if (cellScanner == null) {<a name="line.2833"></a>
-<span class="sourceLineNo">2834</span>      return;<a name="line.2834"></a>
-<span class="sourceLineNo">2835</span>    }<a name="line.2835"></a>
-<span class="sourceLineNo">2836</span>    try {<a name="line.2836"></a>
-<span class="sourceLineNo">2837</span>      if (action.hasMutation()) {<a name="line.2837"></a>
-<span class="sourceLineNo">2838</span>        MutationProto m = action.getMutation();<a name="line.2838"></a>
-<span class="sourceLineNo">2839</span>        if (m.hasAssociatedCellCount()) {<a name="line.2839"></a>
-<span class="sourceLineNo">2840</span>          for (int i = 0; i &lt; m.getAssociatedCellCount(); i++) {<a name="line.2840"></a>
-<span class="sourceLineNo">2841</span>            cellScanner.advance();<a name="line.2841"></a>
-<span class="sourceLineNo">2842</span>          }<a name="line.2842"></a>
-<span class="sourceLineNo">2843</span>        }<a name="line.2843"></a>
-<span class="sourceLineNo">2844</span>      }<a name="line.2844"></a>
-<span class="sourceLineNo">2845</span>    } catch (IOException e) {<a name="line.2845"></a>
-<span class="sourceLineNo">2846</span>      // No need to handle these Individual Muatation level issue. Any way this entire RegionAction<a name="line.2846"></a>
-<span class="sourceLineNo">2847</span>      // marked as failed as we could not see the Region here. At client side the top level<a name="line.2847"></a>
-<span class="sourceLineNo">2848</span>      // RegionAction exception will be considered first.<a name="line.2848"></a>
-<span class="sourceLineNo">2849</span>      LOG.error("Error while skipping Cells in CellScanner for invalid Region Mutations", e);<a name="line.2849"></a>
-<span class="sourceLineNo">2850</span>    }<a name="line.2850"></a>
-<span class="sourceLineNo">2851</span>  }<a name="line.2851"></a>
-<span class="sourceLineNo">2852</span><a name="line.2852"></a>
-<span class="sourceLineNo">2853</span>  /**<a name="line.2853"></a>
-<span class="sourceLineNo">2854</span>   * Mutate data in a table.<a name="line.2854"></a>
-<span class="sourceLineNo">2855</span>   *<a name="line.2855"></a>
-<span class="sourceLineNo">2856</span>   * @param rpcc the RPC controller<a name="line.2856"></a>
-<span class="sourceLineNo">2857</span>   * @param request the mutate request<a name="line.2857"></a>
-<span class="sourceLineNo">2858</span>   */<a name="line.2858"></a>
-<span class="sourceLineNo">2859</span>  @Override<a name="line.2859"></a>
-<span class="sourceLineNo">2860</span>  public MutateResponse mutate(final RpcController rpcc, final MutateRequest request)<a name="line.2860"></a>
-<span class="sourceLineNo">2861</span>      throws ServiceException {<a name="line.2861"></a>
-<span class="sourceLineNo">2862</span>    // rpc controller is how we bring in data via the back door;  it is unprotobuf'ed data.<a name="line.2862"></a>
-<span class="sourceLineNo">2863</span>    // It is also the conduit via which we pass back data.<a name="line.2863"></a>
-<span class="sourceLineNo">2864</span>    HBaseRpcController controller = (HBaseRpcController)rpcc;<a name="line.2864"></a>
-<span class="sourceLineNo">2865</span>    CellScanner cellScanner = controller != null ? controller.cellScanner() : null;<a name="line.2865"></a>
-<span class="sourceLineNo">2866</span>    OperationQuota quota = null;<a name="line.2866"></a>
-<span class="sourceLineNo">2867</span>    RpcCallContext context = RpcServer.getCurrentCall().orElse(null);<a name="line.2867"></a>
-<span class="sourceLineNo">2868</span>    ActivePolicyEnforcement spaceQuotaEnforcement = null;<a name="line.2868"></a>
-<span class="sourceLineNo">2869</span>    MutationType type = null;<a name="line.2869"></a>
-<span class="sourceLineNo">2870</span>    HRegion region = null;<a name="line.2870"></a>
-<span class="sourceLineNo">2871</span>    long before = EnvironmentEdgeManager.currentTime();<a name="line.2871"></a>
-<span class="sourceLineNo">2872</span>    // Clear scanner so we are not holding on to reference across call.<a name="line.2872"></a>
-<span class="sourceLineNo">2873</span>    if (controller != null) {<a name="line.2873"></a>
-<span class="sourceLineNo">2874</span>      controller.setCellScanner(null);<a name="line.2874"></a>
-<span class="sourceLineNo">2875</span>    }<a name="line.2875"></a>
-<span class="sourceLineNo">2876</span>    try {<a name="line.2876"></a>
-<span class="sourceLineNo">2877</span>      checkOpen();<a name="line.2877"></a>
-<span class="sourceLineNo">2878</span>      requestCount.increment();<a name="line.2878"></a>
-<span class="sourceLineNo">2879</span>      rpcMutateRequestCount.increment();<a name="line.2879"></a>
-<span class="sourceLineNo">2880</span>      region = getRegion(request.getRegion());<a name="line.2880"></a>
-<span class="sourceLineNo">2881</span>      rejectIfInStandByState(region);<a name="line.2881"></a>
-<span class="sourceLineNo">2882</span>      MutateResponse.Builder builder = MutateResponse.newBuilder();<a name="line.2882"></a>
-<span class="sourceLineNo">2883</span>      MutationProto mutation = request.getMutation();<a name="line.2883"></a>
-<span class="sourceLineNo">2884</span>      if (!region.getRegionInfo().isMetaRegion()) {<a name="line.2884"></a>
-<span class="sourceLineNo">2885</span>        regionServer.cacheFlusher.reclaimMemStoreMemory();<a name="line.2885"></a>
-<span class="sourceLineNo">2886</span>      }<a name="line.2886"></a>
-<span class="sourceLineNo">2887</span>      long nonceGroup = request.hasNonceGroup() ? request.getNonceGroup() : HConstants.NO_NONCE;<a name="line.2887"></a>
-<span class="sourceLineNo">2888</span>      Result r = null;<a name="line.2888"></a>
-<span class="sourceLineNo">2889</span>      Boolean processed = null;<a name="line.2889"></a>
-<span class="sourceLineNo">2890</span>      type = mutation.getMutateType();<a name="line.2890"></a>
-<span class="sourceLineNo">2891</span><a name="line.2891"></a>
-<span class="sourceLineNo">2892</span>      quota = getRpcQuotaManager().checkQuota(region, OperationQuota.OperationType.MUTATE);<a name="line.2892"></a>
-<span class="sourceLineNo">2893</span>      spaceQuotaEnforcement = getSpaceQuotaManager().getActiveEnforcements();<a name="line.2893"></a>
-<span class="sourceLineNo">2894</span><a name="line.2894"></a>
-<span class="sourceLineNo">2895</span>      switch (type) {<a name="line.2895"></a>
-<span class="sourceLineNo">2896</span>        case APPEND:<a name="line.2896"></a>
-<span class="sourceLineNo">2897</span>          // TODO: this doesn't actually check anything.<a name="line.2897"></a>
-<span class="sourceLineNo">2898</span>          r = append(region, quota, mutation, cellScanner, nonceGroup, spaceQuotaEnforcement);<a name="line.2898"></a>
-<span class="sourceLineNo">2899</span>          break;<a name="line.2899"></a>
-<span class="sourceLineNo">2900</span>        case INCREMENT:<a name="line.2900"></a>
-<span class="sourceLineNo">2901</span>          // TODO: this doesn't actually check anything.<a name="line.2901"></a>
-<span class="sourceLineNo">2902</span>          r = increment(region, quota, mutation, cellScanner, nonceGroup, spaceQuotaEnforcement);<a name="line.2902"></a>
-<span class="sourceLineNo">2903</span>          break;<a name="line.2903"></a>
-<span class="sourceLineNo">2904</span>        case PUT:<a name="line.2904"></a>
-<span class="sourceLineNo">2905</span>          Put put = ProtobufUtil.toPut(mutation, cellScanner);<a name="line.2905"></a>
-<span class="sourceLineNo">2906</span>          checkCellSizeLimit(region, put);<a name="line.2906"></a>
-<span class="sourceLineNo">2907</span>          // Throws an exception when violated<a name="line.2907"></a>
-<span class="sourceLineNo">2908</span>          spaceQuotaEnforcement.getPolicyEnforcement(region).check(put);<a name="line.2908"></a>
-<span class="sourceLineNo">2909</span>          quota.addMutation(put);<a name="line.2909"></a>
-<span class="sourceLineNo">2910</span>          if (request.hasCondition()) {<a name="line.2910"></a>
-<span class="sourceLineNo">2911</span>            Condition condition = request.getCondition();<a name="line.2911"></a>
-<span class="sourceLineNo">2912</span>            byte[] row = condition.getRow().toByteArray();<a name="line.2912"></a>
-<span class="sourceLineNo">2913</span>            byte[] family = condition.getFamily().toByteArray();<a name="line.2913"></a>
-<span class="sourceLineNo">2914</span>            byte[] qualifier = condition.getQualifier().toByteArray();<a name="line.2914"></a>
-<span class="sourceLineNo">2915</span>            CompareOperator compareOp =<a name="line.2915"></a>
-<span class="sourceLineNo">2916</span>              CompareOperator.valueOf(condition.getCompareType().name());<a name="line.2916"></a>
-<span class="sourceLineNo">2917</span>            ByteArrayComparable comparator = ProtobufUtil.toComparator(condition.getComparator());<a name="line.2917"></a>
-<span class="sourceLineNo">2918</span>            TimeRange timeRange = condition.hasTimeRange() ?<a name="line.2918"></a>
-<span class="sourceLineNo">2919</span>              ProtobufUtil.toTimeRange(condition.getTimeRange()) :<a name="line.2919"></a>
-<span class="sourceLineNo">2920</span>              TimeRange.allTime();<a name="line.2920"></a>
-<span class="sourceLineNo">2921</span>            if (region.getCoprocessorHost() != null) {<a name="line.2921"></a>
-<span class="sourceLineNo">2922</span>              processed = region.getCoprocessorHost().preCheckAndPut(row, family, qualifier,<a name="line.2922"></a>
-<span class="sourceLineNo">2923</span>                  compareOp, comparator, put);<a name="line.2923"></a>
-<span class="sourceLineNo">2924</span>            }<a name="line.2924"></a>
-<span class="sourceLineNo">2925</span>            if (processed == null) {<a name="line.2925"></a>
-<span class="sourceLineNo">2926</span>              boolean result = region.checkAndMutate(row, family,<a name="line.2926"></a>
-<span class="sourceLineNo">2927</span>                qualifier, compareOp, comparator, timeRange, put);<a name="line.2927"></a>
-<span class="sourceLineNo">2928</span>              if (region.getCoprocessorHost() != null) {<a name="line.2928"></a>
-<span class="sourceLineNo">2929</span>                result = region.getCoprocessorHost().postCheckAndPut(row, family,<a name="line.2929"></a>
-<span class="sourceLineNo">2930</span>                  qualifier, compareOp, comparator, put, result);<a name="line.2930"></a>
-<span class="sourceLineNo">2931</span>              }<a name="line.2931"></a>
-<span class="sourceLineNo">2932</span>              processed = result;<a name="line.2932"></a>
-<span class="sourceLineNo">2933</span>            }<a name="line.2933"></a>
-<span class="sourceLineNo">2934</span>          } else {<a name="line.2934"></a>
-<span class="sourceLineNo">2935</span>            region.put(put);<a name="line.2935"></a>
-<span class="sourceLineNo">2936</span>            processed = Boolean.TRUE;<a name="line.2936"></a>
-<span class="sourceLineNo">2937</span>          }<a name="line.2937"></a>
-<span class="sourceLineNo">2938</span>          break;<a name="line.2938"></a>
-<span class="sourceLineNo">2939</span>        case DELETE:<a name="line.2939"></a>
-<span class="sourceLineNo">2940</span>          Delete delete = ProtobufUtil.toDelete(mutation, cellScanner);<a name="line.2940"></a>
-<span class="sourceLineNo">2941</span>          checkCellSizeLimit(region, delete);<a name="line.2941"></a>
-<span class="sourceLineNo">2942</span>          spaceQuotaEnforcement.getPolicyEnforcement(region).check(delete);<a name="line.2942"></a>
-<span class="sourceLineNo">2943</span>          quota.addMutation(delete);<a name="line.2943"></a>
-<span class="sourceLineNo">2944</span>          if (request.hasCondition()) {<a name="line.2944"></a>
-<span class="sourceLineNo">2945</span>            Condition condition = request.getCondition();<a name="line.2945"></a>
-<span class="sourceLineNo">2946</span>            byte[] row = condition.getRow().toByteArray();<a name="line.2946"></a>
-<span class="sourceLineNo">2947</span>            byte[] family = condition.getFamily().toByteArray();<a name="line.2947"></a>
-<span class="sourceLineNo">2948</span>            byte[] qualifier = condition.getQualifier().toByteArray();<a name="line.2948"></a>
-<span class="sourceLineNo">2949</span>            CompareOperator op = CompareOperator.valueOf(condition.getCompareType().name());<a name="line.2949"></a>
-<span class="sourceLineNo">2950</span>            ByteArrayComparable comparator = ProtobufUtil.toComparator(condition.getComparator());<a name="line.2950"></a>
-<span class="sourceLineNo">2951</span>            TimeRange timeRange = condition.hasTimeRange() ?<a name="line.2951"></a>
-<span class="sourceLineNo">2952</span>              ProtobufUtil.toTimeRange(condition.getTimeRange()) :<a name="line.2952"></a>
-<span class="sourceLineNo">2953</span>              TimeRange.allTime();<a name="line.2953"></a>
-<span class="sourceLineNo">2954</span>            if (region.getCoprocessorHost() != null) {<a name="line.2954"></a>
-<span class="sourceLineNo">2955</span>              processed = region.getCoprocessorHost().preCheckAndDelete(row, family, qualifier, op,<a name="line.2955"></a>
-<span class="sourceLineNo">2956</span>                  comparator, delete);<a name="line.2956"></a>
-<span class="sourceLineNo">2957</span>            }<a name="line.2957"></a>
-<span class="sourceLineNo">2958</span>            if (processed == null) {<a name="line.2958"></a>
-<span class="sourceLineNo">2959</span>              boolean result = region.checkAndMutate(row, family,<a name="line.2959"></a>
-<span class="sourceLineNo">2960</span>                qualifier, op, comparator, timeRange, delete);<a name="line.2960"></a>
-<span class="sourceLineNo">2961</span>              if (region.getCoprocessorHost() != null) {<a name="line.2961"></a>
-<span class="sourceLineNo">2962</span>                result = region.getCoprocessorHost().postCheckAndDelete(row, family,<a name="line.2962"></a>
-<span class="sourceLineNo">2963</span>                  qualifier, op, comparator, delete, result);<a name="line.2963"></a>
-<span class="sourceLineNo">2964</span>              }<a name="line.2964"></a>
-<span class="sourceLineNo">2965</span>              processed = result;<a name="line.2965"></a>
-<span class="sourceLineNo">2966</span>            }<a name="line.2966"></a>
-<span class="sourceLineNo">2967</span>          } else {<a name="line.2967"></a>
-<span class="sourceLineNo">2968</span>            region.delete(delete);<a name="line.2968"></a>
-<span class="sourceLineNo">2969</span>            processed = Boolean.TRUE;<a name="line.2969"></a>
-<span class="sourceLineNo">2970</span>          }<a name="line.2970"></a>
-<span class="sourceLineNo">2971</span>          break;<a name="line.2971"></a>
-<span class="sourceLineNo">2972</span>        default:<a name="line.2972"></a>
-<span class="sourceLineNo">2973</span>          throw new DoNotRetryIOException("Unsupported mutate type: " + type.name());<a name="line.2973"></a>
-<span class="sourceLineNo">2974</span>      }<a name="line.2974"></a>
-<span class="sourceLineNo">2975</span>      if (processed != null) {<a name="line.2975"></a>
-<span class="sourceLineNo">2976</span>        builder.setProcessed(processed.booleanValue());<a name="line.2976"></a>
-<span class="sourceLineNo">2977</span>      }<a name="line.2977"></a>
-<span class="sourceLineNo">2978</span>      boolean clientCellBlockSupported = isClientCellBlockSupport(context);<a name="line.2978"></a>
-<span class="sourceLineNo">2979</span>      addResult(builder, r, controller, clientCellBlockSupported);<a name="line.2979"></a>
-<span class="sourceLineNo">2980</span>      if (clientCellBlockSupported) {<a name="line.2980"></a>
-<span class="sourceLineNo">2981</span>        addSize(context, r, null);<a name="line.2981"></a>
-<span class="sourceLineNo">2982</span>      }<a name="line.2982"></a>
-<span class="sourceLineNo">2983</span>      return builder.build();<a name="line.2983"></a>
-<span class="sourceLineNo">2984</span>    } catch (IOException ie) {<a name="line.2984"></a>
-<span class="sourceLineNo">2985</span>      regionServer.checkFileSystem();<a name="line.2985"></a>
-<span class="sourceLineNo">2986</span>      throw new ServiceException(ie);<a name="line.2986"></a>
-<span class="sourceLineNo">2987</span>    } finally {<a name="line.2987"></a>
-<span class="sourceLineNo">2988</span>      if (quota != null) {<a name="line.2988"></a>
-<span class="sourceLineNo">2989</span>        quota.close();<a name="line.2989"></a>
-<span class="sourceLineNo">2990</span>      }<a name="line.2990"></a>
-<span class="sourceLineNo">2991</span>      // Update metrics<a name="line.2991"></a>
-<span class="sourceLineNo">2992</span>      if (regionServer.metricsRegionServer != null &amp;&amp; type != null) {<a name="line.2992"></a>
-<span class="sourceLineNo">2993</span>        long after = EnvironmentEdgeManager.currentTime();<a name="line.2993"></a>
-<span class="sourceLineNo">2994</span>        switch (type) {<a name="line.2994"></a>
-<span class="sourceLineNo">2995</span>        case DELETE:<a name="line.2995"></a>
-<span class="sourceLineNo">2996</span>          if (request.hasCondition()) {<a name="line.2996"></a>
-<span class="sourceLineNo">2997</span>            regionServer.metricsRegionServer.updateCheckAndDelete(after - before);<a name="line.2997"></a>
-<span class="sourceLineNo">2998</span>          } else {<a name="line.2998"></a>
-<span class="sourceLineNo">2999</span>            regionServer.metricsRegionServer.updateDelete(<a name="line.2999"></a>
-<span class="sourceLineNo">3000</span>                region == null ? null : region.getRegionInfo().getTable(), after - before);<a name="line.3000"></a>
-<span class="sourceLineNo">3001</span>          }<a name="line.3001"></a>
-<span class="sourceLineNo">3002</span>          break;<a name="line.3002"></a>
-<span class="sourceLineNo">3003</span>        case PUT:<a name="line.3003"></a>
-<span class="sourceLineNo">3004</span>          if (request.hasCondition()) {<a name="line.3004"></a>
-<span class="sourceLineNo">3005</span>            regionServer.metricsRegionServer.updateCheckAndPut(after - before);<a name="line.3005"></a>
-<span class="sourceLineNo">3006</span>          } else {<a name="line.3006"></a>
-<span class="sourceLineNo">3007</span>            regionServer.metricsRegionServer.updatePut(<a name="line.3007"></a>
-<span class="sourceLineNo">3008</span>                region == null ? null : region.getRegionInfo().getTable(),after - before);<a name="line.3008"></a>
-<span class="sourceLineNo">3009</span>          }<a name="line.3009"></a>
-<span class="sourceLineNo">3010</span>          break;<a name="line.3010"></a>
-<span class="sourceLineNo">3011</span>        default:<a name="line.3011"></a>
+<span class="sourceLineNo">2713</span>    long nonceGroup = request.hasNonceGroup() ? request.getNonceGroup() : HConstants.NO_NONCE;<a name="line.2713"></a>
+<span class="sourceLineNo">2714</span><a name="line.2714"></a>
+<span class="sourceLineNo">2715</span>    // this will contain all the cells that we need to return. It's created later, if needed.<a name="line.2715"></a>
+<span class="sourceLineNo">2716</span>    List&lt;CellScannable&gt; cellsToReturn = null;<a name="line.2716"></a>
+<span class="sourceLineNo">2717</span>    MultiResponse.Builder responseBuilder = MultiResponse.newBuilder();<a name="line.2717"></a>
+<span class="sourceLineNo">2718</span>    RegionActionResult.Builder regionActionResultBuilder = RegionActionResult.newBuilder();<a name="line.2718"></a>
+<span class="sourceLineNo">2719</span>    Boolean processed = null;<a name="line.2719"></a>
+<span class="sourceLineNo">2720</span>    RegionScannersCloseCallBack closeCallBack = null;<a name="line.2720"></a>
+<span class="sourceLineNo">2721</span>    RpcCallContext context = RpcServer.getCurrentCall().orElse(null);<a name="line.2721"></a>
+<span class="sourceLineNo">2722</span>    this.rpcMultiRequestCount.increment();<a name="line.2722"></a>
+<span class="sourceLineNo">2723</span>    this.requestCount.increment();<a name="line.2723"></a>
+<span class="sourceLineNo">2724</span>    Map&lt;RegionSpecifier, ClientProtos.RegionLoadStats&gt; regionStats = new HashMap&lt;&gt;(request<a name="line.2724"></a>
+<span class="sourceLineNo">2725</span>      .getRegionActionCount());<a name="line.2725"></a>
+<span class="sourceLineNo">2726</span>    ActivePolicyEnforcement spaceQuotaEnforcement = getSpaceQuotaManager().getActiveEnforcements();<a name="line.2726"></a>
+<span class="sourceLineNo">2727</span>    for (RegionAction regionAction : request.getRegionActionList()) {<a name="line.2727"></a>
+<span class="sourceLineNo">2728</span>      OperationQuota quota;<a name="line.2728"></a>
+<span class="sourceLineNo">2729</span>      HRegion region;<a name="line.2729"></a>
+<span class="sourceLineNo">2730</span>      regionActionResultBuilder.clear();<a name="line.2730"></a>
+<span class="sourceLineNo">2731</span>      RegionSpecifier regionSpecifier = regionAction.getRegion();<a name="line.2731"></a>
+<span class="sourceLineNo">2732</span>      try {<a name="line.2732"></a>
+<span class="sourceLineNo">2733</span>        region = getRegion(regionSpecifier);<a name="line.2733"></a>
+<span class="sourceLineNo">2734</span>        quota = getRpcQuotaManager().checkQuota(region, regionAction.getActionList());<a name="line.2734"></a>
+<span class="sourceLineNo">2735</span>      } catch (IOException e) {<a name="line.2735"></a>
+<span class="sourceLineNo">2736</span>        failRegionAction(responseBuilder, regionActionResultBuilder, regionAction, cellScanner, e);<a name="line.2736"></a>
+<span class="sourceLineNo">2737</span>        continue;  // For this region it's a failure.<a name="line.2737"></a>
+<span class="sourceLineNo">2738</span>      }<a name="line.2738"></a>
+<span class="sourceLineNo">2739</span>      boolean rejectIfFromClient = shouldRejectRequestsFromClient(region);<a name="line.2739"></a>
+<span class="sourceLineNo">2740</span>      if (regionAction.hasAtomic() &amp;&amp; regionAction.getAtomic()) {<a name="line.2740"></a>
+<span class="sourceLineNo">2741</span>        // We only allow replication in standby state and it will not set the atomic flag.<a name="line.2741"></a>
+<span class="sourceLineNo">2742</span>        if (rejectIfFromClient) {<a name="line.2742"></a>
+<span class="sourceLineNo">2743</span>          failRegionAction(responseBuilder, regionActionResultBuilder, regionAction, cellScanner,<a name="line.2743"></a>
+<span class="sourceLineNo">2744</span>            new DoNotRetryIOException(<a name="line.2744"></a>
+<span class="sourceLineNo">2745</span>              region.getRegionInfo().getRegionNameAsString() + " is in STANDBY state"));<a name="line.2745"></a>
+<span class="sourceLineNo">2746</span>          quota.close();<a name="line.2746"></a>
+<span class="sourceLineNo">2747</span>          continue;<a name="line.2747"></a>
+<span class="sourceLineNo">2748</span>        }<a name="line.2748"></a>
+<span class="sourceLineNo">2749</span>        // How does this call happen?  It may need some work to play well w/ the surroundings.<a name="line.2749"></a>
+<span class="sourceLineNo">2750</span>        // Need to return an item per Action along w/ Action index.  TODO.<a name="line.2750"></a>
+<span class="sourceLineNo">2751</span>        try {<a name="line.2751"></a>
+<span class="sourceLineNo">2752</span>          if (request.hasCondition()) {<a name="line.2752"></a>
+<span class="sourceLineNo">2753</span>            Condition condition = request.getCondition();<a name="line.2753"></a>
+<span class="sourceLineNo">2754</span>            byte[] row = condition.getRow().toByteArray();<a name="line.2754"></a>
+<span class="sourceLineNo">2755</span>            byte[] family = condition.getFamily().toByteArray();<a name="line.2755"></a>
+<span class="sourceLineNo">2756</span>            byte[] qualifier = condition.getQualifier().toByteArray();<a name="line.2756"></a>
+<span class="sourceLineNo">2757</span>            CompareOperator op =<a name="line.2757"></a>
+<span class="sourceLineNo">2758</span>              CompareOperator.valueOf(condition.getCompareType().name());<a name="line.2758"></a>
+<span class="sourceLineNo">2759</span>            ByteArrayComparable comparator =<a name="line.2759"></a>
+<span class="sourceLineNo">2760</span>                ProtobufUtil.toComparator(condition.getComparator());<a name="line.2760"></a>
+<span class="sourceLineNo">2761</span>            TimeRange timeRange = condition.hasTimeRange() ?<a name="line.2761"></a>
+<span class="sourceLineNo">2762</span>              ProtobufUtil.toTimeRange(condition.getTimeRange()) :<a name="line.2762"></a>
+<span class="sourceLineNo">2763</span>              TimeRange.allTime();<a name="line.2763"></a>
+<span class="sourceLineNo">2764</span>            processed =<a name="line.2764"></a>
+<span class="sourceLineNo">2765</span>              checkAndRowMutate(region, regionAction.getActionList(), cellScanner, row, family,<a name="line.2765"></a>
+<span class="sourceLineNo">2766</span>                qualifier, op, comparator, timeRange, regionActionResultBuilder,<a name="line.2766"></a>
+<span class="sourceLineNo">2767</span>                spaceQuotaEnforcement);<a name="line.2767"></a>
+<span class="sourceLineNo">2768</span>          } else {<a name="line.2768"></a>
+<span class="sourceLineNo">2769</span>            doAtomicBatchOp(regionActionResultBuilder, region, quota, regionAction.getActionList(),<a name="line.2769"></a>
+<span class="sourceLineNo">2770</span>              cellScanner, spaceQuotaEnforcement);<a name="line.2770"></a>
+<span class="sourceLineNo">2771</span>            processed = Boolean.TRUE;<a name="line.2771"></a>
+<span class="sourceLineNo">2772</span>          }<a name="line.2772"></a>
+<span class="sourceLineNo">2773</span>        } catch (IOException e) {<a name="line.2773"></a>
+<span class="sourceLineNo">2774</span>          rpcServer.getMetrics().exception(e);<a name="line.2774"></a>
+<span class="sourceLineNo">2775</span>          // As it's atomic, we may expect it's a global failure.<a name="line.2775"></a>
+<span class="sourceLineNo">2776</span>          regionActionResultBuilder.setException(ResponseConverter.buildException(e));<a name="line.2776"></a>
+<span class="sourceLineNo">2777</span>        }<a name="line.2777"></a>
+<span class="sourceLineNo">2778</span>      } else {<a name="line.2778"></a>
+<span class="sourceLineNo">2779</span>        if (rejectIfFromClient &amp;&amp; regionAction.getActionCount() &gt; 0 &amp;&amp;<a name="line.2779"></a>
+<span class="sourceLineNo">2780</span>          !isReplicationRequest(regionAction.getAction(0))) {<a name="line.2780"></a>
+<span class="sourceLineNo">2781</span>          // fail if it is not a replication request<a name="line.2781"></a>
+<span class="sourceLineNo">2782</span>          failRegionAction(responseBuilder, regionActionResultBuilder, regionAction, cellScanner,<a name="line.2782"></a>
+<span class="sourceLineNo">2783</span>            new DoNotRetryIOException(<a name="line.2783"></a>
+<span class="sourceLineNo">2784</span>              region.getRegionInfo().getRegionNameAsString() + " is in STANDBY state"));<a name="line.2784"></a>
+<span class="sourceLineNo">2785</span>          quota.close();<a name="line.2785"></a>
+<span class="sourceLineNo">2786</span>          continue;<a name="line.2786"></a>
+<span class="sourceLineNo">2787</span>        }<a name="line.2787"></a>
+<span class="sourceLineNo">2788</span>        // doNonAtomicRegionMutation manages the exception internally<a name="line.2788"></a>
+<span class="sourceLineNo">2789</span>        if (context != null &amp;&amp; closeCallBack == null) {<a name="line.2789"></a>
+<span class="sourceLineNo">2790</span>          // An RpcCallBack that creates a list of scanners that needs to perform callBack<a name="line.2790"></a>
+<span class="sourceLineNo">2791</span>          // operation on completion of multiGets.<a name="line.2791"></a>
+<span class="sourceLineNo">2792</span>          // Set this only once<a name="line.2792"></a>
+<span class="sourceLineNo">2793</span>          closeCallBack = new RegionScannersCloseCallBack();<a name="line.2793"></a>
+<span class="sourceLineNo">2794</span>          context.setCallBack(closeCallBack);<a name="line.2794"></a>
+<span class="sourceLineNo">2795</span>        }<a name="line.2795"></a>
+<span class="sourceLineNo">2796</span>        cellsToReturn = doNonAtomicRegionMutation(region, quota, regionAction, cellScanner,<a name="line.2796"></a>
+<span class="sourceLineNo">2797</span>            regionActionResultBuilder, cellsToReturn, nonceGroup, closeCallBack, context,<a name="line.2797"></a>
+<span class="sourceLineNo">2798</span>            spaceQuotaEnforcement);<a name="line.27

<TRUNCATED>

[33/46] hbase-site git commit: Published site at 05d22ed960204183fbd9bd16f1dbca6410ccde76.

Posted by gi...@apache.org.
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/3649682c/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 9fbe400..b7a2a38 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
@@ -215,3746 +215,3748 @@
 <span class="sourceLineNo">207</span>import org.apache.hadoop.hbase.util.VersionInfo;<a name="line.207"></a>
 <span class="sourceLineNo">208</span>import org.apache.hadoop.hbase.zookeeper.LoadBalancerTracker;<a name="line.208"></a>
 <span class="sourceLineNo">209</span>import org.apache.hadoop.hbase.zookeeper.MasterAddressTracker;<a name="line.209"></a>
-<span class="sourceLineNo">210</span>import org.apache.hadoop.hbase.zookeeper.MasterMaintenanceModeTracker;<a name="line.210"></a>
-<span class="sourceLineNo">211</span>import org.apache.hadoop.hbase.zookeeper.RegionNormalizerTracker;<a name="line.211"></a>
-<span class="sourceLineNo">212</span>import org.apache.hadoop.hbase.zookeeper.ZKClusterId;<a name="line.212"></a>
-<span class="sourceLineNo">213</span>import org.apache.hadoop.hbase.zookeeper.ZKUtil;<a name="line.213"></a>
-<span class="sourceLineNo">214</span>import org.apache.hadoop.hbase.zookeeper.ZKWatcher;<a name="line.214"></a>
-<span class="sourceLineNo">215</span>import org.apache.hadoop.hbase.zookeeper.ZNodePaths;<a name="line.215"></a>
-<span class="sourceLineNo">216</span>import org.apache.yetus.audience.InterfaceAudience;<a name="line.216"></a>
-<span class="sourceLineNo">217</span>import org.apache.zookeeper.KeeperException;<a name="line.217"></a>
-<span class="sourceLineNo">218</span>import org.eclipse.jetty.server.Server;<a name="line.218"></a>
-<span class="sourceLineNo">219</span>import org.eclipse.jetty.server.ServerConnector;<a name="line.219"></a>
-<span class="sourceLineNo">220</span>import org.eclipse.jetty.servlet.ServletHolder;<a name="line.220"></a>
-<span class="sourceLineNo">221</span>import org.eclipse.jetty.webapp.WebAppContext;<a name="line.221"></a>
-<span class="sourceLineNo">222</span>import org.slf4j.Logger;<a name="line.222"></a>
-<span class="sourceLineNo">223</span>import org.slf4j.LoggerFactory;<a name="line.223"></a>
-<span class="sourceLineNo">224</span><a name="line.224"></a>
-<span class="sourceLineNo">225</span>import org.apache.hbase.thirdparty.com.google.common.annotations.VisibleForTesting;<a name="line.225"></a>
-<span class="sourceLineNo">226</span>import org.apache.hbase.thirdparty.com.google.common.collect.ImmutableSet;<a name="line.226"></a>
-<span class="sourceLineNo">227</span>import org.apache.hbase.thirdparty.com.google.common.collect.Lists;<a name="line.227"></a>
-<span class="sourceLineNo">228</span>import org.apache.hbase.thirdparty.com.google.common.collect.Maps;<a name="line.228"></a>
-<span class="sourceLineNo">229</span><a name="line.229"></a>
-<span class="sourceLineNo">230</span>import org.apache.hadoop.hbase.shaded.protobuf.ProtobufUtil;<a name="line.230"></a>
-<span class="sourceLineNo">231</span>import org.apache.hadoop.hbase.shaded.protobuf.generated.AdminProtos.GetRegionInfoResponse.CompactionState;<a name="line.231"></a>
-<span class="sourceLineNo">232</span>import org.apache.hadoop.hbase.shaded.protobuf.generated.QuotaProtos.Quotas;<a name="line.232"></a>
-<span class="sourceLineNo">233</span>import org.apache.hadoop.hbase.shaded.protobuf.generated.QuotaProtos.SpaceViolationPolicy;<a name="line.233"></a>
-<span class="sourceLineNo">234</span>import org.apache.hadoop.hbase.shaded.protobuf.generated.SnapshotProtos.SnapshotDescription;<a name="line.234"></a>
-<span class="sourceLineNo">235</span>import org.apache.hadoop.hbase.shaded.protobuf.generated.WALProtos;<a name="line.235"></a>
-<span class="sourceLineNo">236</span><a name="line.236"></a>
-<span class="sourceLineNo">237</span>/**<a name="line.237"></a>
-<span class="sourceLineNo">238</span> * HMaster is the "master server" for HBase. An HBase cluster has one active<a name="line.238"></a>
-<span class="sourceLineNo">239</span> * master.  If many masters are started, all compete.  Whichever wins goes on to<a name="line.239"></a>
-<span class="sourceLineNo">240</span> * run the cluster.  All others park themselves in their constructor until<a name="line.240"></a>
-<span class="sourceLineNo">241</span> * master or cluster shutdown or until the active master loses its lease in<a name="line.241"></a>
-<span class="sourceLineNo">242</span> * zookeeper.  Thereafter, all running master jostle to take over master role.<a name="line.242"></a>
-<span class="sourceLineNo">243</span> *<a name="line.243"></a>
-<span class="sourceLineNo">244</span> * &lt;p&gt;The Master can be asked shutdown the cluster. See {@link #shutdown()}.  In<a name="line.244"></a>
-<span class="sourceLineNo">245</span> * this case it will tell all regionservers to go down and then wait on them<a name="line.245"></a>
-<span class="sourceLineNo">246</span> * all reporting in that they are down.  This master will then shut itself down.<a name="line.246"></a>
-<span class="sourceLineNo">247</span> *<a name="line.247"></a>
-<span class="sourceLineNo">248</span> * &lt;p&gt;You can also shutdown just this master.  Call {@link #stopMaster()}.<a name="line.248"></a>
-<span class="sourceLineNo">249</span> *<a name="line.249"></a>
-<span class="sourceLineNo">250</span> * @see org.apache.zookeeper.Watcher<a name="line.250"></a>
-<span class="sourceLineNo">251</span> */<a name="line.251"></a>
-<span class="sourceLineNo">252</span>@InterfaceAudience.LimitedPrivate(HBaseInterfaceAudience.TOOLS)<a name="line.252"></a>
-<span class="sourceLineNo">253</span>@SuppressWarnings("deprecation")<a name="line.253"></a>
-<span class="sourceLineNo">254</span>public class HMaster extends HRegionServer implements MasterServices {<a name="line.254"></a>
-<span class="sourceLineNo">255</span>  private static Logger LOG = LoggerFactory.getLogger(HMaster.class);<a name="line.255"></a>
-<span class="sourceLineNo">256</span><a name="line.256"></a>
-<span class="sourceLineNo">257</span>  /**<a name="line.257"></a>
-<span class="sourceLineNo">258</span>   * Protection against zombie master. Started once Master accepts active responsibility and<a name="line.258"></a>
-<span class="sourceLineNo">259</span>   * starts taking over responsibilities. Allows a finite time window before giving up ownership.<a name="line.259"></a>
-<span class="sourceLineNo">260</span>   */<a name="line.260"></a>
-<span class="sourceLineNo">261</span>  private static class InitializationMonitor extends HasThread {<a name="line.261"></a>
-<span class="sourceLineNo">262</span>    /** The amount of time in milliseconds to sleep before checking initialization status. */<a name="line.262"></a>
-<span class="sourceLineNo">263</span>    public static final String TIMEOUT_KEY = "hbase.master.initializationmonitor.timeout";<a name="line.263"></a>
-<span class="sourceLineNo">264</span>    public static final long TIMEOUT_DEFAULT = TimeUnit.MILLISECONDS.convert(15, TimeUnit.MINUTES);<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>     * When timeout expired and initialization has not complete, call {@link System#exit(int)} when<a name="line.267"></a>
-<span class="sourceLineNo">268</span>     * true, do nothing otherwise.<a name="line.268"></a>
-<span class="sourceLineNo">269</span>     */<a name="line.269"></a>
-<span class="sourceLineNo">270</span>    public static final String HALT_KEY = "hbase.master.initializationmonitor.haltontimeout";<a name="line.270"></a>
-<span class="sourceLineNo">271</span>    public static final boolean HALT_DEFAULT = false;<a name="line.271"></a>
-<span class="sourceLineNo">272</span><a name="line.272"></a>
-<span class="sourceLineNo">273</span>    private final HMaster master;<a name="line.273"></a>
-<span class="sourceLineNo">274</span>    private final long timeout;<a name="line.274"></a>
-<span class="sourceLineNo">275</span>    private final boolean haltOnTimeout;<a name="line.275"></a>
-<span class="sourceLineNo">276</span><a name="line.276"></a>
-<span class="sourceLineNo">277</span>    /** Creates a Thread that monitors the {@link #isInitialized()} state. */<a name="line.277"></a>
-<span class="sourceLineNo">278</span>    InitializationMonitor(HMaster master) {<a name="line.278"></a>
-<span class="sourceLineNo">279</span>      super("MasterInitializationMonitor");<a name="line.279"></a>
-<span class="sourceLineNo">280</span>      this.master = master;<a name="line.280"></a>
-<span class="sourceLineNo">281</span>      this.timeout = master.getConfiguration().getLong(TIMEOUT_KEY, TIMEOUT_DEFAULT);<a name="line.281"></a>
-<span class="sourceLineNo">282</span>      this.haltOnTimeout = master.getConfiguration().getBoolean(HALT_KEY, HALT_DEFAULT);<a name="line.282"></a>
-<span class="sourceLineNo">283</span>      this.setDaemon(true);<a name="line.283"></a>
-<span class="sourceLineNo">284</span>    }<a name="line.284"></a>
-<span class="sourceLineNo">285</span><a name="line.285"></a>
-<span class="sourceLineNo">286</span>    @Override<a name="line.286"></a>
-<span class="sourceLineNo">287</span>    public void run() {<a name="line.287"></a>
-<span class="sourceLineNo">288</span>      try {<a name="line.288"></a>
-<span class="sourceLineNo">289</span>        while (!master.isStopped() &amp;&amp; master.isActiveMaster()) {<a name="line.289"></a>
-<span class="sourceLineNo">290</span>          Thread.sleep(timeout);<a name="line.290"></a>
-<span class="sourceLineNo">291</span>          if (master.isInitialized()) {<a name="line.291"></a>
-<span class="sourceLineNo">292</span>            LOG.debug("Initialization completed within allotted tolerance. Monitor exiting.");<a name="line.292"></a>
-<span class="sourceLineNo">293</span>          } else {<a name="line.293"></a>
-<span class="sourceLineNo">294</span>            LOG.error("Master failed to complete initialization after " + timeout + "ms. Please"<a name="line.294"></a>
-<span class="sourceLineNo">295</span>                + " consider submitting a bug report including a thread dump of this process.");<a name="line.295"></a>
-<span class="sourceLineNo">296</span>            if (haltOnTimeout) {<a name="line.296"></a>
-<span class="sourceLineNo">297</span>              LOG.error("Zombie Master exiting. Thread dump to stdout");<a name="line.297"></a>
-<span class="sourceLineNo">298</span>              Threads.printThreadInfo(System.out, "Zombie HMaster");<a name="line.298"></a>
-<span class="sourceLineNo">299</span>              System.exit(-1);<a name="line.299"></a>
-<span class="sourceLineNo">300</span>            }<a name="line.300"></a>
-<span class="sourceLineNo">301</span>          }<a name="line.301"></a>
-<span class="sourceLineNo">302</span>        }<a name="line.302"></a>
-<span class="sourceLineNo">303</span>      } catch (InterruptedException ie) {<a name="line.303"></a>
-<span class="sourceLineNo">304</span>        LOG.trace("InitMonitor thread interrupted. Existing.");<a name="line.304"></a>
-<span class="sourceLineNo">305</span>      }<a name="line.305"></a>
-<span class="sourceLineNo">306</span>    }<a name="line.306"></a>
-<span class="sourceLineNo">307</span>  }<a name="line.307"></a>
-<span class="sourceLineNo">308</span><a name="line.308"></a>
-<span class="sourceLineNo">309</span>  // MASTER is name of the webapp and the attribute name used stuffing this<a name="line.309"></a>
-<span class="sourceLineNo">310</span>  //instance into web context.<a name="line.310"></a>
-<span class="sourceLineNo">311</span>  public static final String MASTER = "master";<a name="line.311"></a>
-<span class="sourceLineNo">312</span><a name="line.312"></a>
-<span class="sourceLineNo">313</span>  // Manager and zk listener for master election<a name="line.313"></a>
-<span class="sourceLineNo">314</span>  private final ActiveMasterManager activeMasterManager;<a name="line.314"></a>
-<span class="sourceLineNo">315</span>  // Region server tracker<a name="line.315"></a>
-<span class="sourceLineNo">316</span>  private RegionServerTracker regionServerTracker;<a name="line.316"></a>
-<span class="sourceLineNo">317</span>  // Draining region server tracker<a name="line.317"></a>
-<span class="sourceLineNo">318</span>  private DrainingServerTracker drainingServerTracker;<a name="line.318"></a>
-<span class="sourceLineNo">319</span>  // Tracker for load balancer state<a name="line.319"></a>
-<span class="sourceLineNo">320</span>  LoadBalancerTracker loadBalancerTracker;<a name="line.320"></a>
-<span class="sourceLineNo">321</span>  // Tracker for meta location, if any client ZK quorum specified<a name="line.321"></a>
-<span class="sourceLineNo">322</span>  MetaLocationSyncer metaLocationSyncer;<a name="line.322"></a>
-<span class="sourceLineNo">323</span>  // Tracker for active master location, if any client ZK quorum specified<a name="line.323"></a>
-<span class="sourceLineNo">324</span>  MasterAddressSyncer masterAddressSyncer;<a name="line.324"></a>
-<span class="sourceLineNo">325</span><a name="line.325"></a>
-<span class="sourceLineNo">326</span>  // Tracker for split and merge state<a name="line.326"></a>
-<span class="sourceLineNo">327</span>  private SplitOrMergeTracker splitOrMergeTracker;<a name="line.327"></a>
-<span class="sourceLineNo">328</span><a name="line.328"></a>
-<span class="sourceLineNo">329</span>  // Tracker for region normalizer state<a name="line.329"></a>
-<span class="sourceLineNo">330</span>  private RegionNormalizerTracker regionNormalizerTracker;<a name="line.330"></a>
-<span class="sourceLineNo">331</span><a name="line.331"></a>
-<span class="sourceLineNo">332</span>  //Tracker for master maintenance mode setting<a name="line.332"></a>
-<span class="sourceLineNo">333</span>  private MasterMaintenanceModeTracker maintenanceModeTracker;<a name="line.333"></a>
-<span class="sourceLineNo">334</span><a name="line.334"></a>
-<span class="sourceLineNo">335</span>  private ClusterSchemaService clusterSchemaService;<a name="line.335"></a>
+<span class="sourceLineNo">210</span>import org.apache.hadoop.hbase.zookeeper.RegionNormalizerTracker;<a name="line.210"></a>
+<span class="sourceLineNo">211</span>import org.apache.hadoop.hbase.zookeeper.ZKClusterId;<a name="line.211"></a>
+<span class="sourceLineNo">212</span>import org.apache.hadoop.hbase.zookeeper.ZKUtil;<a name="line.212"></a>
+<span class="sourceLineNo">213</span>import org.apache.hadoop.hbase.zookeeper.ZKWatcher;<a name="line.213"></a>
+<span class="sourceLineNo">214</span>import org.apache.hadoop.hbase.zookeeper.ZNodePaths;<a name="line.214"></a>
+<span class="sourceLineNo">215</span>import org.apache.yetus.audience.InterfaceAudience;<a name="line.215"></a>
+<span class="sourceLineNo">216</span>import org.apache.zookeeper.KeeperException;<a name="line.216"></a>
+<span class="sourceLineNo">217</span>import org.eclipse.jetty.server.Server;<a name="line.217"></a>
+<span class="sourceLineNo">218</span>import org.eclipse.jetty.server.ServerConnector;<a name="line.218"></a>
+<span class="sourceLineNo">219</span>import org.eclipse.jetty.servlet.ServletHolder;<a name="line.219"></a>
+<span class="sourceLineNo">220</span>import org.eclipse.jetty.webapp.WebAppContext;<a name="line.220"></a>
+<span class="sourceLineNo">221</span>import org.slf4j.Logger;<a name="line.221"></a>
+<span class="sourceLineNo">222</span>import org.slf4j.LoggerFactory;<a name="line.222"></a>
+<span class="sourceLineNo">223</span><a name="line.223"></a>
+<span class="sourceLineNo">224</span>import org.apache.hbase.thirdparty.com.google.common.annotations.VisibleForTesting;<a name="line.224"></a>
+<span class="sourceLineNo">225</span>import org.apache.hbase.thirdparty.com.google.common.collect.ImmutableSet;<a name="line.225"></a>
+<span class="sourceLineNo">226</span>import org.apache.hbase.thirdparty.com.google.common.collect.Lists;<a name="line.226"></a>
+<span class="sourceLineNo">227</span>import org.apache.hbase.thirdparty.com.google.common.collect.Maps;<a name="line.227"></a>
+<span class="sourceLineNo">228</span><a name="line.228"></a>
+<span class="sourceLineNo">229</span>import org.apache.hadoop.hbase.shaded.protobuf.ProtobufUtil;<a name="line.229"></a>
+<span class="sourceLineNo">230</span>import org.apache.hadoop.hbase.shaded.protobuf.generated.AdminProtos.GetRegionInfoResponse.CompactionState;<a name="line.230"></a>
+<span class="sourceLineNo">231</span>import org.apache.hadoop.hbase.shaded.protobuf.generated.QuotaProtos.Quotas;<a name="line.231"></a>
+<span class="sourceLineNo">232</span>import org.apache.hadoop.hbase.shaded.protobuf.generated.QuotaProtos.SpaceViolationPolicy;<a name="line.232"></a>
+<span class="sourceLineNo">233</span>import org.apache.hadoop.hbase.shaded.protobuf.generated.SnapshotProtos.SnapshotDescription;<a name="line.233"></a>
+<span class="sourceLineNo">234</span>import org.apache.hadoop.hbase.shaded.protobuf.generated.WALProtos;<a name="line.234"></a>
+<span class="sourceLineNo">235</span><a name="line.235"></a>
+<span class="sourceLineNo">236</span>/**<a name="line.236"></a>
+<span class="sourceLineNo">237</span> * HMaster is the "master server" for HBase. An HBase cluster has one active<a name="line.237"></a>
+<span class="sourceLineNo">238</span> * master.  If many masters are started, all compete.  Whichever wins goes on to<a name="line.238"></a>
+<span class="sourceLineNo">239</span> * run the cluster.  All others park themselves in their constructor until<a name="line.239"></a>
+<span class="sourceLineNo">240</span> * master or cluster shutdown or until the active master loses its lease in<a name="line.240"></a>
+<span class="sourceLineNo">241</span> * zookeeper.  Thereafter, all running master jostle to take over master role.<a name="line.241"></a>
+<span class="sourceLineNo">242</span> *<a name="line.242"></a>
+<span class="sourceLineNo">243</span> * &lt;p&gt;The Master can be asked shutdown the cluster. See {@link #shutdown()}.  In<a name="line.243"></a>
+<span class="sourceLineNo">244</span> * this case it will tell all regionservers to go down and then wait on them<a name="line.244"></a>
+<span class="sourceLineNo">245</span> * all reporting in that they are down.  This master will then shut itself down.<a name="line.245"></a>
+<span class="sourceLineNo">246</span> *<a name="line.246"></a>
+<span class="sourceLineNo">247</span> * &lt;p&gt;You can also shutdown just this master.  Call {@link #stopMaster()}.<a name="line.247"></a>
+<span class="sourceLineNo">248</span> *<a name="line.248"></a>
+<span class="sourceLineNo">249</span> * @see org.apache.zookeeper.Watcher<a name="line.249"></a>
+<span class="sourceLineNo">250</span> */<a name="line.250"></a>
+<span class="sourceLineNo">251</span>@InterfaceAudience.LimitedPrivate(HBaseInterfaceAudience.TOOLS)<a name="line.251"></a>
+<span class="sourceLineNo">252</span>@SuppressWarnings("deprecation")<a name="line.252"></a>
+<span class="sourceLineNo">253</span>public class HMaster extends HRegionServer implements MasterServices {<a name="line.253"></a>
+<span class="sourceLineNo">254</span>  private static Logger LOG = LoggerFactory.getLogger(HMaster.class);<a name="line.254"></a>
+<span class="sourceLineNo">255</span><a name="line.255"></a>
+<span class="sourceLineNo">256</span>  /**<a name="line.256"></a>
+<span class="sourceLineNo">257</span>   * Protection against zombie master. Started once Master accepts active responsibility and<a name="line.257"></a>
+<span class="sourceLineNo">258</span>   * starts taking over responsibilities. Allows a finite time window before giving up ownership.<a name="line.258"></a>
+<span class="sourceLineNo">259</span>   */<a name="line.259"></a>
+<span class="sourceLineNo">260</span>  private static class InitializationMonitor extends HasThread {<a name="line.260"></a>
+<span class="sourceLineNo">261</span>    /** The amount of time in milliseconds to sleep before checking initialization status. */<a name="line.261"></a>
+<span class="sourceLineNo">262</span>    public static final String TIMEOUT_KEY = "hbase.master.initializationmonitor.timeout";<a name="line.262"></a>
+<span class="sourceLineNo">263</span>    public static final long TIMEOUT_DEFAULT = TimeUnit.MILLISECONDS.convert(15, TimeUnit.MINUTES);<a name="line.263"></a>
+<span class="sourceLineNo">264</span><a name="line.264"></a>
+<span class="sourceLineNo">265</span>    /**<a name="line.265"></a>
+<span class="sourceLineNo">266</span>     * When timeout expired and initialization has not complete, call {@link System#exit(int)} when<a name="line.266"></a>
+<span class="sourceLineNo">267</span>     * true, do nothing otherwise.<a name="line.267"></a>
+<span class="sourceLineNo">268</span>     */<a name="line.268"></a>
+<span class="sourceLineNo">269</span>    public static final String HALT_KEY = "hbase.master.initializationmonitor.haltontimeout";<a name="line.269"></a>
+<span class="sourceLineNo">270</span>    public static final boolean HALT_DEFAULT = false;<a name="line.270"></a>
+<span class="sourceLineNo">271</span><a name="line.271"></a>
+<span class="sourceLineNo">272</span>    private final HMaster master;<a name="line.272"></a>
+<span class="sourceLineNo">273</span>    private final long timeout;<a name="line.273"></a>
+<span class="sourceLineNo">274</span>    private final boolean haltOnTimeout;<a name="line.274"></a>
+<span class="sourceLineNo">275</span><a name="line.275"></a>
+<span class="sourceLineNo">276</span>    /** Creates a Thread that monitors the {@link #isInitialized()} state. */<a name="line.276"></a>
+<span class="sourceLineNo">277</span>    InitializationMonitor(HMaster master) {<a name="line.277"></a>
+<span class="sourceLineNo">278</span>      super("MasterInitializationMonitor");<a name="line.278"></a>
+<span class="sourceLineNo">279</span>      this.master = master;<a name="line.279"></a>
+<span class="sourceLineNo">280</span>      this.timeout = master.getConfiguration().getLong(TIMEOUT_KEY, TIMEOUT_DEFAULT);<a name="line.280"></a>
+<span class="sourceLineNo">281</span>      this.haltOnTimeout = master.getConfiguration().getBoolean(HALT_KEY, HALT_DEFAULT);<a name="line.281"></a>
+<span class="sourceLineNo">282</span>      this.setDaemon(true);<a name="line.282"></a>
+<span class="sourceLineNo">283</span>    }<a name="line.283"></a>
+<span class="sourceLineNo">284</span><a name="line.284"></a>
+<span class="sourceLineNo">285</span>    @Override<a name="line.285"></a>
+<span class="sourceLineNo">286</span>    public void run() {<a name="line.286"></a>
+<span class="sourceLineNo">287</span>      try {<a name="line.287"></a>
+<span class="sourceLineNo">288</span>        while (!master.isStopped() &amp;&amp; master.isActiveMaster()) {<a name="line.288"></a>
+<span class="sourceLineNo">289</span>          Thread.sleep(timeout);<a name="line.289"></a>
+<span class="sourceLineNo">290</span>          if (master.isInitialized()) {<a name="line.290"></a>
+<span class="sourceLineNo">291</span>            LOG.debug("Initialization completed within allotted tolerance. Monitor exiting.");<a name="line.291"></a>
+<span class="sourceLineNo">292</span>          } else {<a name="line.292"></a>
+<span class="sourceLineNo">293</span>            LOG.error("Master failed to complete initialization after " + timeout + "ms. Please"<a name="line.293"></a>
+<span class="sourceLineNo">294</span>                + " consider submitting a bug report including a thread dump of this process.");<a name="line.294"></a>
+<span class="sourceLineNo">295</span>            if (haltOnTimeout) {<a name="line.295"></a>
+<span class="sourceLineNo">296</span>              LOG.error("Zombie Master exiting. Thread dump to stdout");<a name="line.296"></a>
+<span class="sourceLineNo">297</span>              Threads.printThreadInfo(System.out, "Zombie HMaster");<a name="line.297"></a>
+<span class="sourceLineNo">298</span>              System.exit(-1);<a name="line.298"></a>
+<span class="sourceLineNo">299</span>            }<a name="line.299"></a>
+<span class="sourceLineNo">300</span>          }<a name="line.300"></a>
+<span class="sourceLineNo">301</span>        }<a name="line.301"></a>
+<span class="sourceLineNo">302</span>      } catch (InterruptedException ie) {<a name="line.302"></a>
+<span class="sourceLineNo">303</span>        LOG.trace("InitMonitor thread interrupted. Existing.");<a name="line.303"></a>
+<span class="sourceLineNo">304</span>      }<a name="line.304"></a>
+<span class="sourceLineNo">305</span>    }<a name="line.305"></a>
+<span class="sourceLineNo">306</span>  }<a name="line.306"></a>
+<span class="sourceLineNo">307</span><a name="line.307"></a>
+<span class="sourceLineNo">308</span>  // MASTER is name of the webapp and the attribute name used stuffing this<a name="line.308"></a>
+<span class="sourceLineNo">309</span>  //instance into web context.<a name="line.309"></a>
+<span class="sourceLineNo">310</span>  public static final String MASTER = "master";<a name="line.310"></a>
+<span class="sourceLineNo">311</span><a name="line.311"></a>
+<span class="sourceLineNo">312</span>  // Manager and zk listener for master election<a name="line.312"></a>
+<span class="sourceLineNo">313</span>  private final ActiveMasterManager activeMasterManager;<a name="line.313"></a>
+<span class="sourceLineNo">314</span>  // Region server tracker<a name="line.314"></a>
+<span class="sourceLineNo">315</span>  private RegionServerTracker regionServerTracker;<a name="line.315"></a>
+<span class="sourceLineNo">316</span>  // Draining region server tracker<a name="line.316"></a>
+<span class="sourceLineNo">317</span>  private DrainingServerTracker drainingServerTracker;<a name="line.317"></a>
+<span class="sourceLineNo">318</span>  // Tracker for load balancer state<a name="line.318"></a>
+<span class="sourceLineNo">319</span>  LoadBalancerTracker loadBalancerTracker;<a name="line.319"></a>
+<span class="sourceLineNo">320</span>  // Tracker for meta location, if any client ZK quorum specified<a name="line.320"></a>
+<span class="sourceLineNo">321</span>  MetaLocationSyncer metaLocationSyncer;<a name="line.321"></a>
+<span class="sourceLineNo">322</span>  // Tracker for active master location, if any client ZK quorum specified<a name="line.322"></a>
+<span class="sourceLineNo">323</span>  MasterAddressSyncer masterAddressSyncer;<a name="line.323"></a>
+<span class="sourceLineNo">324</span><a name="line.324"></a>
+<span class="sourceLineNo">325</span>  // Tracker for split and merge state<a name="line.325"></a>
+<span class="sourceLineNo">326</span>  private SplitOrMergeTracker splitOrMergeTracker;<a name="line.326"></a>
+<span class="sourceLineNo">327</span><a name="line.327"></a>
+<span class="sourceLineNo">328</span>  // Tracker for region normalizer state<a name="line.328"></a>
+<span class="sourceLineNo">329</span>  private RegionNormalizerTracker regionNormalizerTracker;<a name="line.329"></a>
+<span class="sourceLineNo">330</span><a name="line.330"></a>
+<span class="sourceLineNo">331</span>  private ClusterSchemaService clusterSchemaService;<a name="line.331"></a>
+<span class="sourceLineNo">332</span><a name="line.332"></a>
+<span class="sourceLineNo">333</span>  public static final String HBASE_MASTER_WAIT_ON_SERVICE_IN_SECONDS =<a name="line.333"></a>
+<span class="sourceLineNo">334</span>    "hbase.master.wait.on.service.seconds";<a name="line.334"></a>
+<span class="sourceLineNo">335</span>  public static final int DEFAULT_HBASE_MASTER_WAIT_ON_SERVICE_IN_SECONDS = 5 * 60;<a name="line.335"></a>
 <span class="sourceLineNo">336</span><a name="line.336"></a>
-<span class="sourceLineNo">337</span>  public static final String HBASE_MASTER_WAIT_ON_SERVICE_IN_SECONDS =<a name="line.337"></a>
-<span class="sourceLineNo">338</span>    "hbase.master.wait.on.service.seconds";<a name="line.338"></a>
-<span class="sourceLineNo">339</span>  public static final int DEFAULT_HBASE_MASTER_WAIT_ON_SERVICE_IN_SECONDS = 5 * 60;<a name="line.339"></a>
-<span class="sourceLineNo">340</span><a name="line.340"></a>
-<span class="sourceLineNo">341</span>  // Metrics for the HMaster<a name="line.341"></a>
-<span class="sourceLineNo">342</span>  final MetricsMaster metricsMaster;<a name="line.342"></a>
-<span class="sourceLineNo">343</span>  // file system manager for the master FS operations<a name="line.343"></a>
-<span class="sourceLineNo">344</span>  private MasterFileSystem fileSystemManager;<a name="line.344"></a>
-<span class="sourceLineNo">345</span>  private MasterWalManager walManager;<a name="line.345"></a>
-<span class="sourceLineNo">346</span><a name="line.346"></a>
-<span class="sourceLineNo">347</span>  // server manager to deal with region server info<a name="line.347"></a>
-<span class="sourceLineNo">348</span>  private volatile ServerManager serverManager;<a name="line.348"></a>
-<span class="sourceLineNo">349</span><a name="line.349"></a>
-<span class="sourceLineNo">350</span>  // manager of assignment nodes in zookeeper<a name="line.350"></a>
-<span class="sourceLineNo">351</span>  private AssignmentManager assignmentManager;<a name="line.351"></a>
-<span class="sourceLineNo">352</span><a name="line.352"></a>
-<span class="sourceLineNo">353</span>  // manager of replication<a name="line.353"></a>
-<span class="sourceLineNo">354</span>  private ReplicationPeerManager replicationPeerManager;<a name="line.354"></a>
-<span class="sourceLineNo">355</span><a name="line.355"></a>
-<span class="sourceLineNo">356</span>  private SyncReplicationReplayWALManager syncReplicationReplayWALManager;<a name="line.356"></a>
-<span class="sourceLineNo">357</span><a name="line.357"></a>
-<span class="sourceLineNo">358</span>  // buffer for "fatal error" notices from region servers<a name="line.358"></a>
-<span class="sourceLineNo">359</span>  // in the cluster. This is only used for assisting<a name="line.359"></a>
-<span class="sourceLineNo">360</span>  // operations/debugging.<a name="line.360"></a>
-<span class="sourceLineNo">361</span>  MemoryBoundedLogMessageBuffer rsFatals;<a name="line.361"></a>
-<span class="sourceLineNo">362</span><a name="line.362"></a>
-<span class="sourceLineNo">363</span>  // flag set after we become the active master (used for testing)<a name="line.363"></a>
-<span class="sourceLineNo">364</span>  private volatile boolean activeMaster = false;<a name="line.364"></a>
-<span class="sourceLineNo">365</span><a name="line.365"></a>
-<span class="sourceLineNo">366</span>  // flag set after we complete initialization once active<a name="line.366"></a>
-<span class="sourceLineNo">367</span>  private final ProcedureEvent&lt;?&gt; initialized = new ProcedureEvent&lt;&gt;("master initialized");<a name="line.367"></a>
+<span class="sourceLineNo">337</span>  // Metrics for the HMaster<a name="line.337"></a>
+<span class="sourceLineNo">338</span>  final MetricsMaster metricsMaster;<a name="line.338"></a>
+<span class="sourceLineNo">339</span>  // file system manager for the master FS operations<a name="line.339"></a>
+<span class="sourceLineNo">340</span>  private MasterFileSystem fileSystemManager;<a name="line.340"></a>
+<span class="sourceLineNo">341</span>  private MasterWalManager walManager;<a name="line.341"></a>
+<span class="sourceLineNo">342</span><a name="line.342"></a>
+<span class="sourceLineNo">343</span>  // server manager to deal with region server info<a name="line.343"></a>
+<span class="sourceLineNo">344</span>  private volatile ServerManager serverManager;<a name="line.344"></a>
+<span class="sourceLineNo">345</span><a name="line.345"></a>
+<span class="sourceLineNo">346</span>  // manager of assignment nodes in zookeeper<a name="line.346"></a>
+<span class="sourceLineNo">347</span>  private AssignmentManager assignmentManager;<a name="line.347"></a>
+<span class="sourceLineNo">348</span><a name="line.348"></a>
+<span class="sourceLineNo">349</span>  // manager of replication<a name="line.349"></a>
+<span class="sourceLineNo">350</span>  private ReplicationPeerManager replicationPeerManager;<a name="line.350"></a>
+<span class="sourceLineNo">351</span><a name="line.351"></a>
+<span class="sourceLineNo">352</span>  private SyncReplicationReplayWALManager syncReplicationReplayWALManager;<a name="line.352"></a>
+<span class="sourceLineNo">353</span><a name="line.353"></a>
+<span class="sourceLineNo">354</span>  // buffer for "fatal error" notices from region servers<a name="line.354"></a>
+<span class="sourceLineNo">355</span>  // in the cluster. This is only used for assisting<a name="line.355"></a>
+<span class="sourceLineNo">356</span>  // operations/debugging.<a name="line.356"></a>
+<span class="sourceLineNo">357</span>  MemoryBoundedLogMessageBuffer rsFatals;<a name="line.357"></a>
+<span class="sourceLineNo">358</span><a name="line.358"></a>
+<span class="sourceLineNo">359</span>  // flag set after we become the active master (used for testing)<a name="line.359"></a>
+<span class="sourceLineNo">360</span>  private volatile boolean activeMaster = false;<a name="line.360"></a>
+<span class="sourceLineNo">361</span><a name="line.361"></a>
+<span class="sourceLineNo">362</span>  // flag set after we complete initialization once active<a name="line.362"></a>
+<span class="sourceLineNo">363</span>  private final ProcedureEvent&lt;?&gt; initialized = new ProcedureEvent&lt;&gt;("master initialized");<a name="line.363"></a>
+<span class="sourceLineNo">364</span><a name="line.364"></a>
+<span class="sourceLineNo">365</span>  // flag set after master services are started,<a name="line.365"></a>
+<span class="sourceLineNo">366</span>  // initialization may have not completed yet.<a name="line.366"></a>
+<span class="sourceLineNo">367</span>  volatile boolean serviceStarted = false;<a name="line.367"></a>
 <span class="sourceLineNo">368</span><a name="line.368"></a>
-<span class="sourceLineNo">369</span>  // flag set after master services are started,<a name="line.369"></a>
-<span class="sourceLineNo">370</span>  // initialization may have not completed yet.<a name="line.370"></a>
-<span class="sourceLineNo">371</span>  volatile boolean serviceStarted = false;<a name="line.371"></a>
-<span class="sourceLineNo">372</span><a name="line.372"></a>
-<span class="sourceLineNo">373</span>  // Maximum time we should run balancer for<a name="line.373"></a>
-<span class="sourceLineNo">374</span>  private final int maxBlancingTime;<a name="line.374"></a>
-<span class="sourceLineNo">375</span>  // Maximum percent of regions in transition when balancing<a name="line.375"></a>
-<span class="sourceLineNo">376</span>  private final double maxRitPercent;<a name="line.376"></a>
-<span class="sourceLineNo">377</span><a name="line.377"></a>
-<span class="sourceLineNo">378</span>  private final LockManager lockManager = new LockManager(this);<a name="line.378"></a>
-<span class="sourceLineNo">379</span><a name="line.379"></a>
-<span class="sourceLineNo">380</span>  private LoadBalancer balancer;<a name="line.380"></a>
-<span class="sourceLineNo">381</span>  private RegionNormalizer normalizer;<a name="line.381"></a>
-<span class="sourceLineNo">382</span>  private BalancerChore balancerChore;<a name="line.382"></a>
-<span class="sourceLineNo">383</span>  private RegionNormalizerChore normalizerChore;<a name="line.383"></a>
-<span class="sourceLineNo">384</span>  private ClusterStatusChore clusterStatusChore;<a name="line.384"></a>
-<span class="sourceLineNo">385</span>  private ClusterStatusPublisher clusterStatusPublisherChore = null;<a name="line.385"></a>
-<span class="sourceLineNo">386</span><a name="line.386"></a>
-<span class="sourceLineNo">387</span>  CatalogJanitor catalogJanitorChore;<a name="line.387"></a>
-<span class="sourceLineNo">388</span>  private LogCleaner logCleaner;<a name="line.388"></a>
-<span class="sourceLineNo">389</span>  private HFileCleaner hfileCleaner;<a name="line.389"></a>
-<span class="sourceLineNo">390</span>  private ReplicationBarrierCleaner replicationBarrierCleaner;<a name="line.390"></a>
-<span class="sourceLineNo">391</span>  private ExpiredMobFileCleanerChore expiredMobFileCleanerChore;<a name="line.391"></a>
-<span class="sourceLineNo">392</span>  private MobCompactionChore mobCompactChore;<a name="line.392"></a>
-<span class="sourceLineNo">393</span>  private MasterMobCompactionThread mobCompactThread;<a name="line.393"></a>
-<span class="sourceLineNo">394</span>  // used to synchronize the mobCompactionStates<a name="line.394"></a>
-<span class="sourceLineNo">395</span>  private final IdLock mobCompactionLock = new IdLock();<a name="line.395"></a>
-<span class="sourceLineNo">396</span>  // save the information of mob compactions in tables.<a name="line.396"></a>
-<span class="sourceLineNo">397</span>  // the key is table name, the value is the number of compactions in that table.<a name="line.397"></a>
-<span class="sourceLineNo">398</span>  private Map&lt;TableName, AtomicInteger&gt; mobCompactionStates = Maps.newConcurrentMap();<a name="line.398"></a>
+<span class="sourceLineNo">369</span>  // Maximum time we should run balancer for<a name="line.369"></a>
+<span class="sourceLineNo">370</span>  private final int maxBlancingTime;<a name="line.370"></a>
+<span class="sourceLineNo">371</span>  // Maximum percent of regions in transition when balancing<a name="line.371"></a>
+<span class="sourceLineNo">372</span>  private final double maxRitPercent;<a name="line.372"></a>
+<span class="sourceLineNo">373</span><a name="line.373"></a>
+<span class="sourceLineNo">374</span>  private final LockManager lockManager = new LockManager(this);<a name="line.374"></a>
+<span class="sourceLineNo">375</span><a name="line.375"></a>
+<span class="sourceLineNo">376</span>  private LoadBalancer balancer;<a name="line.376"></a>
+<span class="sourceLineNo">377</span>  private RegionNormalizer normalizer;<a name="line.377"></a>
+<span class="sourceLineNo">378</span>  private BalancerChore balancerChore;<a name="line.378"></a>
+<span class="sourceLineNo">379</span>  private RegionNormalizerChore normalizerChore;<a name="line.379"></a>
+<span class="sourceLineNo">380</span>  private ClusterStatusChore clusterStatusChore;<a name="line.380"></a>
+<span class="sourceLineNo">381</span>  private ClusterStatusPublisher clusterStatusPublisherChore = null;<a name="line.381"></a>
+<span class="sourceLineNo">382</span><a name="line.382"></a>
+<span class="sourceLineNo">383</span>  CatalogJanitor catalogJanitorChore;<a name="line.383"></a>
+<span class="sourceLineNo">384</span>  private LogCleaner logCleaner;<a name="line.384"></a>
+<span class="sourceLineNo">385</span>  private HFileCleaner hfileCleaner;<a name="line.385"></a>
+<span class="sourceLineNo">386</span>  private ReplicationBarrierCleaner replicationBarrierCleaner;<a name="line.386"></a>
+<span class="sourceLineNo">387</span>  private ExpiredMobFileCleanerChore expiredMobFileCleanerChore;<a name="line.387"></a>
+<span class="sourceLineNo">388</span>  private MobCompactionChore mobCompactChore;<a name="line.388"></a>
+<span class="sourceLineNo">389</span>  private MasterMobCompactionThread mobCompactThread;<a name="line.389"></a>
+<span class="sourceLineNo">390</span>  // used to synchronize the mobCompactionStates<a name="line.390"></a>
+<span class="sourceLineNo">391</span>  private final IdLock mobCompactionLock = new IdLock();<a name="line.391"></a>
+<span class="sourceLineNo">392</span>  // save the information of mob compactions in tables.<a name="line.392"></a>
+<span class="sourceLineNo">393</span>  // the key is table name, the value is the number of compactions in that table.<a name="line.393"></a>
+<span class="sourceLineNo">394</span>  private Map&lt;TableName, AtomicInteger&gt; mobCompactionStates = Maps.newConcurrentMap();<a name="line.394"></a>
+<span class="sourceLineNo">395</span><a name="line.395"></a>
+<span class="sourceLineNo">396</span>  MasterCoprocessorHost cpHost;<a name="line.396"></a>
+<span class="sourceLineNo">397</span><a name="line.397"></a>
+<span class="sourceLineNo">398</span>  private final boolean preLoadTableDescriptors;<a name="line.398"></a>
 <span class="sourceLineNo">399</span><a name="line.399"></a>
-<span class="sourceLineNo">400</span>  MasterCoprocessorHost cpHost;<a name="line.400"></a>
-<span class="sourceLineNo">401</span><a name="line.401"></a>
-<span class="sourceLineNo">402</span>  private final boolean preLoadTableDescriptors;<a name="line.402"></a>
-<span class="sourceLineNo">403</span><a name="line.403"></a>
-<span class="sourceLineNo">404</span>  // Time stamps for when a hmaster became active<a name="line.404"></a>
-<span class="sourceLineNo">405</span>  private long masterActiveTime;<a name="line.405"></a>
-<span class="sourceLineNo">406</span><a name="line.406"></a>
-<span class="sourceLineNo">407</span>  // Time stamp for when HMaster finishes becoming Active Master<a name="line.407"></a>
-<span class="sourceLineNo">408</span>  private long masterFinishedInitializationTime;<a name="line.408"></a>
-<span class="sourceLineNo">409</span><a name="line.409"></a>
-<span class="sourceLineNo">410</span>  //should we check the compression codec type at master side, default true, HBASE-6370<a name="line.410"></a>
-<span class="sourceLineNo">411</span>  private final boolean masterCheckCompression;<a name="line.411"></a>
-<span class="sourceLineNo">412</span><a name="line.412"></a>
-<span class="sourceLineNo">413</span>  //should we check encryption settings at master side, default true<a name="line.413"></a>
-<span class="sourceLineNo">414</span>  private final boolean masterCheckEncryption;<a name="line.414"></a>
-<span class="sourceLineNo">415</span><a name="line.415"></a>
-<span class="sourceLineNo">416</span>  Map&lt;String, Service&gt; coprocessorServiceHandlers = Maps.newHashMap();<a name="line.416"></a>
-<span class="sourceLineNo">417</span><a name="line.417"></a>
-<span class="sourceLineNo">418</span>  // monitor for snapshot of hbase tables<a name="line.418"></a>
-<span class="sourceLineNo">419</span>  SnapshotManager snapshotManager;<a name="line.419"></a>
-<span class="sourceLineNo">420</span>  // monitor for distributed procedures<a name="line.420"></a>
-<span class="sourceLineNo">421</span>  private MasterProcedureManagerHost mpmHost;<a name="line.421"></a>
-<span class="sourceLineNo">422</span><a name="line.422"></a>
-<span class="sourceLineNo">423</span>  // it is assigned after 'initialized' guard set to true, so should be volatile<a name="line.423"></a>
-<span class="sourceLineNo">424</span>  private volatile MasterQuotaManager quotaManager;<a name="line.424"></a>
-<span class="sourceLineNo">425</span>  private SpaceQuotaSnapshotNotifier spaceQuotaSnapshotNotifier;<a name="line.425"></a>
-<span class="sourceLineNo">426</span>  private QuotaObserverChore quotaObserverChore;<a name="line.426"></a>
-<span class="sourceLineNo">427</span>  private SnapshotQuotaObserverChore snapshotQuotaChore;<a name="line.427"></a>
-<span class="sourceLineNo">428</span><a name="line.428"></a>
-<span class="sourceLineNo">429</span>  private ProcedureExecutor&lt;MasterProcedureEnv&gt; procedureExecutor;<a name="line.429"></a>
-<span class="sourceLineNo">430</span>  private WALProcedureStore procedureStore;<a name="line.430"></a>
-<span class="sourceLineNo">431</span><a name="line.431"></a>
-<span class="sourceLineNo">432</span>  // handle table states<a name="line.432"></a>
-<span class="sourceLineNo">433</span>  private TableStateManager tableStateManager;<a name="line.433"></a>
-<span class="sourceLineNo">434</span><a name="line.434"></a>
-<span class="sourceLineNo">435</span>  private long splitPlanCount;<a name="line.435"></a>
-<span class="sourceLineNo">436</span>  private long mergePlanCount;<a name="line.436"></a>
-<span class="sourceLineNo">437</span><a name="line.437"></a>
-<span class="sourceLineNo">438</span>  /* Handle favored nodes information */<a name="line.438"></a>
-<span class="sourceLineNo">439</span>  private FavoredNodesManager favoredNodesManager;<a name="line.439"></a>
-<span class="sourceLineNo">440</span><a name="line.440"></a>
-<span class="sourceLineNo">441</span>  /** jetty server for master to redirect requests to regionserver infoServer */<a name="line.441"></a>
-<span class="sourceLineNo">442</span>  private Server masterJettyServer;<a name="line.442"></a>
-<span class="sourceLineNo">443</span><a name="line.443"></a>
-<span class="sourceLineNo">444</span>  public static class RedirectServlet extends HttpServlet {<a name="line.444"></a>
-<span class="sourceLineNo">445</span>    private static final long serialVersionUID = 2894774810058302473L;<a name="line.445"></a>
-<span class="sourceLineNo">446</span>    private final int regionServerInfoPort;<a name="line.446"></a>
-<span class="sourceLineNo">447</span>    private final String regionServerHostname;<a name="line.447"></a>
-<span class="sourceLineNo">448</span><a name="line.448"></a>
-<span class="sourceLineNo">449</span>    /**<a name="line.449"></a>
-<span class="sourceLineNo">450</span>     * @param infoServer that we're trying to send all requests to<a name="line.450"></a>
-<span class="sourceLineNo">451</span>     * @param hostname may be null. if given, will be used for redirects instead of host from client.<a name="line.451"></a>
-<span class="sourceLineNo">452</span>     */<a name="line.452"></a>
-<span class="sourceLineNo">453</span>    public RedirectServlet(InfoServer infoServer, String hostname) {<a name="line.453"></a>
-<span class="sourceLineNo">454</span>       regionServerInfoPort = infoServer.getPort();<a name="line.454"></a>
-<span class="sourceLineNo">455</span>       regionServerHostname = hostname;<a name="line.455"></a>
-<span class="sourceLineNo">456</span>    }<a name="line.456"></a>
-<span class="sourceLineNo">457</span><a name="line.457"></a>
-<span class="sourceLineNo">458</span>    @Override<a name="line.458"></a>
-<span class="sourceLineNo">459</span>    public void doGet(HttpServletRequest request,<a name="line.459"></a>
-<span class="sourceLineNo">460</span>        HttpServletResponse response) throws ServletException, IOException {<a name="line.460"></a>
-<span class="sourceLineNo">461</span>      String redirectHost = regionServerHostname;<a name="line.461"></a>
-<span class="sourceLineNo">462</span>      if(redirectHost == null) {<a name="line.462"></a>
-<span class="sourceLineNo">463</span>        redirectHost = request.getServerName();<a name="line.463"></a>
-<span class="sourceLineNo">464</span>        if(!Addressing.isLocalAddress(InetAddress.getByName(redirectHost))) {<a name="line.464"></a>
-<span class="sourceLineNo">465</span>          LOG.warn("Couldn't resolve '" + redirectHost + "' as an address local to this node and '" +<a name="line.465"></a>
-<span class="sourceLineNo">466</span>              MASTER_HOSTNAME_KEY + "' is not set; client will get a HTTP 400 response. If " +<a name="line.466"></a>
-<span class="sourceLineNo">467</span>              "your HBase deployment relies on client accessible names that the region server process " +<a name="line.467"></a>
-<span class="sourceLineNo">468</span>              "can't resolve locally, then you should set the previously mentioned configuration variable " +<a name="line.468"></a>
-<span class="sourceLineNo">469</span>              "to an appropriate hostname.");<a name="line.469"></a>
-<span class="sourceLineNo">470</span>          // no sending client provided input back to the client, so the goal host is just in the logs.<a name="line.470"></a>
-<span class="sourceLineNo">471</span>          response.sendError(400, "Request was to a host that I can't resolve for any of the network interfaces on " +<a name="line.471"></a>
-<span class="sourceLineNo">472</span>              "this node. If this is due to an intermediary such as an HTTP load balancer or other proxy, your HBase " +<a name="line.472"></a>
-<span class="sourceLineNo">473</span>              "administrator can set '" + MASTER_HOSTNAME_KEY + "' to point to the correct hostname.");<a name="line.473"></a>
-<span class="sourceLineNo">474</span>          return;<a name="line.474"></a>
-<span class="sourceLineNo">475</span>        }<a name="line.475"></a>
-<span class="sourceLineNo">476</span>      }<a name="line.476"></a>
-<span class="sourceLineNo">477</span>      // TODO this scheme should come from looking at the scheme registered in the infoserver's http server for the<a name="line.477"></a>
-<span class="sourceLineNo">478</span>      // host and port we're using, but it's buried way too deep to do that ATM.<a name="line.478"></a>
-<span class="sourceLineNo">479</span>      String redirectUrl = request.getScheme() + "://"<a name="line.479"></a>
-<span class="sourceLineNo">480</span>        + redirectHost + ":" + regionServerInfoPort<a name="line.480"></a>
-<span class="sourceLineNo">481</span>        + request.getRequestURI();<a name="line.481"></a>
-<span class="sourceLineNo">482</span>      response.sendRedirect(redirectUrl);<a name="line.482"></a>
-<span class="sourceLineNo">483</span>    }<a name="line.483"></a>
-<span class="sourceLineNo">484</span>  }<a name="line.484"></a>
-<span class="sourceLineNo">485</span><a name="line.485"></a>
-<span class="sourceLineNo">486</span>  /**<a name="line.486"></a>
-<span class="sourceLineNo">487</span>   * Initializes the HMaster. The steps are as follows:<a name="line.487"></a>
-<span class="sourceLineNo">488</span>   * &lt;p&gt;<a name="line.488"></a>
-<span class="sourceLineNo">489</span>   * &lt;ol&gt;<a name="line.489"></a>
-<span class="sourceLineNo">490</span>   * &lt;li&gt;Initialize the local HRegionServer<a name="line.490"></a>
-<span class="sourceLineNo">491</span>   * &lt;li&gt;Start the ActiveMasterManager.<a name="line.491"></a>
-<span class="sourceLineNo">492</span>   * &lt;/ol&gt;<a name="line.492"></a>
-<span class="sourceLineNo">493</span>   * &lt;p&gt;<a name="line.493"></a>
-<span class="sourceLineNo">494</span>   * Remaining steps of initialization occur in<a name="line.494"></a>
-<span class="sourceLineNo">495</span>   * #finishActiveMasterInitialization(MonitoredTask) after<a name="line.495"></a>
-<span class="sourceLineNo">496</span>   * the master becomes the active one.<a name="line.496"></a>
-<span class="sourceLineNo">497</span>   */<a name="line.497"></a>
-<span class="sourceLineNo">498</span>  public HMaster(final Configuration conf)<a name="line.498"></a>
-<span class="sourceLineNo">499</span>      throws IOException, KeeperException {<a name="line.499"></a>
-<span class="sourceLineNo">500</span>    super(conf);<a name="line.500"></a>
-<span class="sourceLineNo">501</span>    TraceUtil.initTracer(conf);<a name="line.501"></a>
-<span class="sourceLineNo">502</span>    try {<a name="line.502"></a>
-<span class="sourceLineNo">503</span>      this.rsFatals = new MemoryBoundedLogMessageBuffer(<a name="line.503"></a>
-<span class="sourceLineNo">504</span>          conf.getLong("hbase.master.buffer.for.rs.fatals", 1 * 1024 * 1024));<a name="line.504"></a>
-<span class="sourceLineNo">505</span>      LOG.info("hbase.rootdir=" + getRootDir() +<a name="line.505"></a>
-<span class="sourceLineNo">506</span>          ", hbase.cluster.distributed=" + this.conf.getBoolean(HConstants.CLUSTER_DISTRIBUTED, false));<a name="line.506"></a>
-<span class="sourceLineNo">507</span><a name="line.507"></a>
-<span class="sourceLineNo">508</span>      // Disable usage of meta replicas in the master<a name="line.508"></a>
-<span class="sourceLineNo">509</span>      this.conf.setBoolean(HConstants.USE_META_REPLICAS, false);<a name="line.509"></a>
-<span class="sourceLineNo">510</span><a name="line.510"></a>
-<span class="sourceLineNo">511</span>      decorateMasterConfiguration(this.conf);<a name="line.511"></a>
-<span class="sourceLineNo">512</span><a name="line.512"></a>
-<span class="sourceLineNo">513</span>      // Hack! Maps DFSClient =&gt; Master for logs.  HDFS made this<a name="line.513"></a>
-<span class="sourceLineNo">514</span>      // config param for task trackers, but we can piggyback off of it.<a name="line.514"></a>
-<span class="sourceLineNo">515</span>      if (this.conf.get("mapreduce.task.attempt.id") == null) {<a name="line.515"></a>
-<span class="sourceLineNo">516</span>        this.conf.set("mapreduce.task.attempt.id", "hb_m_" + this.serverName.toString());<a name="line.516"></a>
-<span class="sourceLineNo">517</span>      }<a name="line.517"></a>
+<span class="sourceLineNo">400</span>  // Time stamps for when a hmaster became active<a name="line.400"></a>
+<span class="sourceLineNo">401</span>  private long masterActiveTime;<a name="line.401"></a>
+<span class="sourceLineNo">402</span><a name="line.402"></a>
+<span class="sourceLineNo">403</span>  // Time stamp for when HMaster finishes becoming Active Master<a name="line.403"></a>
+<span class="sourceLineNo">404</span>  private long masterFinishedInitializationTime;<a name="line.404"></a>
+<span class="sourceLineNo">405</span><a name="line.405"></a>
+<span class="sourceLineNo">406</span>  //should we check the compression codec type at master side, default true, HBASE-6370<a name="line.406"></a>
+<span class="sourceLineNo">407</span>  private final boolean masterCheckCompression;<a name="line.407"></a>
+<span class="sourceLineNo">408</span><a name="line.408"></a>
+<span class="sourceLineNo">409</span>  //should we check encryption settings at master side, default true<a name="line.409"></a>
+<span class="sourceLineNo">410</span>  private final boolean masterCheckEncryption;<a name="line.410"></a>
+<span class="sourceLineNo">411</span><a name="line.411"></a>
+<span class="sourceLineNo">412</span>  Map&lt;String, Service&gt; coprocessorServiceHandlers = Maps.newHashMap();<a name="line.412"></a>
+<span class="sourceLineNo">413</span><a name="line.413"></a>
+<span class="sourceLineNo">414</span>  // monitor for snapshot of hbase tables<a name="line.414"></a>
+<span class="sourceLineNo">415</span>  SnapshotManager snapshotManager;<a name="line.415"></a>
+<span class="sourceLineNo">416</span>  // monitor for distributed procedures<a name="line.416"></a>
+<span class="sourceLineNo">417</span>  private MasterProcedureManagerHost mpmHost;<a name="line.417"></a>
+<span class="sourceLineNo">418</span><a name="line.418"></a>
+<span class="sourceLineNo">419</span>  // it is assigned after 'initialized' guard set to true, so should be volatile<a name="line.419"></a>
+<span class="sourceLineNo">420</span>  private volatile MasterQuotaManager quotaManager;<a name="line.420"></a>
+<span class="sourceLineNo">421</span>  private SpaceQuotaSnapshotNotifier spaceQuotaSnapshotNotifier;<a name="line.421"></a>
+<span class="sourceLineNo">422</span>  private QuotaObserverChore quotaObserverChore;<a name="line.422"></a>
+<span class="sourceLineNo">423</span>  private SnapshotQuotaObserverChore snapshotQuotaChore;<a name="line.423"></a>
+<span class="sourceLineNo">424</span><a name="line.424"></a>
+<span class="sourceLineNo">425</span>  private ProcedureExecutor&lt;MasterProcedureEnv&gt; procedureExecutor;<a name="line.425"></a>
+<span class="sourceLineNo">426</span>  private WALProcedureStore procedureStore;<a name="line.426"></a>
+<span class="sourceLineNo">427</span><a name="line.427"></a>
+<span class="sourceLineNo">428</span>  // handle table states<a name="line.428"></a>
+<span class="sourceLineNo">429</span>  private TableStateManager tableStateManager;<a name="line.429"></a>
+<span class="sourceLineNo">430</span><a name="line.430"></a>
+<span class="sourceLineNo">431</span>  private long splitPlanCount;<a name="line.431"></a>
+<span class="sourceLineNo">432</span>  private long mergePlanCount;<a name="line.432"></a>
+<span class="sourceLineNo">433</span><a name="line.433"></a>
+<span class="sourceLineNo">434</span>  /* Handle favored nodes information */<a name="line.434"></a>
+<span class="sourceLineNo">435</span>  private FavoredNodesManager favoredNodesManager;<a name="line.435"></a>
+<span class="sourceLineNo">436</span><a name="line.436"></a>
+<span class="sourceLineNo">437</span>  /** jetty server for master to redirect requests to regionserver infoServer */<a name="line.437"></a>
+<span class="sourceLineNo">438</span>  private Server masterJettyServer;<a name="line.438"></a>
+<span class="sourceLineNo">439</span><a name="line.439"></a>
+<span class="sourceLineNo">440</span>  // Determine if we should do normal startup or minimal "single-user" mode with no region<a name="line.440"></a>
+<span class="sourceLineNo">441</span>  // servers and no user tables. Useful for repair and recovery of hbase:meta<a name="line.441"></a>
+<span class="sourceLineNo">442</span>  private final boolean maintenanceMode;<a name="line.442"></a>
+<span class="sourceLineNo">443</span>  static final String MAINTENANCE_MODE = "hbase.master.maintenance_mode";<a name="line.443"></a>
+<span class="sourceLineNo">444</span><a name="line.444"></a>
+<span class="sourceLineNo">445</span>  public static class RedirectServlet extends HttpServlet {<a name="line.445"></a>
+<span class="sourceLineNo">446</span>    private static final long serialVersionUID = 2894774810058302473L;<a name="line.446"></a>
+<span class="sourceLineNo">447</span>    private final int regionServerInfoPort;<a name="line.447"></a>
+<span class="sourceLineNo">448</span>    private final String regionServerHostname;<a name="line.448"></a>
+<span class="sourceLineNo">449</span><a name="line.449"></a>
+<span class="sourceLineNo">450</span>    /**<a name="line.450"></a>
+<span class="sourceLineNo">451</span>     * @param infoServer that we're trying to send all requests to<a name="line.451"></a>
+<span class="sourceLineNo">452</span>     * @param hostname may be null. if given, will be used for redirects instead of host from client.<a name="line.452"></a>
+<span class="sourceLineNo">453</span>     */<a name="line.453"></a>
+<span class="sourceLineNo">454</span>    public RedirectServlet(InfoServer infoServer, String hostname) {<a name="line.454"></a>
+<span class="sourceLineNo">455</span>       regionServerInfoPort = infoServer.getPort();<a name="line.455"></a>
+<span class="sourceLineNo">456</span>       regionServerHostname = hostname;<a name="line.456"></a>
+<span class="sourceLineNo">457</span>    }<a name="line.457"></a>
+<span class="sourceLineNo">458</span><a name="line.458"></a>
+<span class="sourceLineNo">459</span>    @Override<a name="line.459"></a>
+<span class="sourceLineNo">460</span>    public void doGet(HttpServletRequest request,<a name="line.460"></a>
+<span class="sourceLineNo">461</span>        HttpServletResponse response) throws ServletException, IOException {<a name="line.461"></a>
+<span class="sourceLineNo">462</span>      String redirectHost = regionServerHostname;<a name="line.462"></a>
+<span class="sourceLineNo">463</span>      if(redirectHost == null) {<a name="line.463"></a>
+<span class="sourceLineNo">464</span>        redirectHost = request.getServerName();<a name="line.464"></a>
+<span class="sourceLineNo">465</span>        if(!Addressing.isLocalAddress(InetAddress.getByName(redirectHost))) {<a name="line.465"></a>
+<span class="sourceLineNo">466</span>          LOG.warn("Couldn't resolve '" + redirectHost + "' as an address local to this node and '" +<a name="line.466"></a>
+<span class="sourceLineNo">467</span>              MASTER_HOSTNAME_KEY + "' is not set; client will get a HTTP 400 response. If " +<a name="line.467"></a>
+<span class="sourceLineNo">468</span>              "your HBase deployment relies on client accessible names that the region server process " +<a name="line.468"></a>
+<span class="sourceLineNo">469</span>              "can't resolve locally, then you should set the previously mentioned configuration variable " +<a name="line.469"></a>
+<span class="sourceLineNo">470</span>              "to an appropriate hostname.");<a name="line.470"></a>
+<span class="sourceLineNo">471</span>          // no sending client provided input back to the client, so the goal host is just in the logs.<a name="line.471"></a>
+<span class="sourceLineNo">472</span>          response.sendError(400, "Request was to a host that I can't resolve for any of the network interfaces on " +<a name="line.472"></a>
+<span class="sourceLineNo">473</span>              "this node. If this is due to an intermediary such as an HTTP load balancer or other proxy, your HBase " +<a name="line.473"></a>
+<span class="sourceLineNo">474</span>              "administrator can set '" + MASTER_HOSTNAME_KEY + "' to point to the correct hostname.");<a name="line.474"></a>
+<span class="sourceLineNo">475</span>          return;<a name="line.475"></a>
+<span class="sourceLineNo">476</span>        }<a name="line.476"></a>
+<span class="sourceLineNo">477</span>      }<a name="line.477"></a>
+<span class="sourceLineNo">478</span>      // TODO this scheme should come from looking at the scheme registered in the infoserver's http server for the<a name="line.478"></a>
+<span class="sourceLineNo">479</span>      // host and port we're using, but it's buried way too deep to do that ATM.<a name="line.479"></a>
+<span class="sourceLineNo">480</span>      String redirectUrl = request.getScheme() + "://"<a name="line.480"></a>
+<span class="sourceLineNo">481</span>        + redirectHost + ":" + regionServerInfoPort<a name="line.481"></a>
+<span class="sourceLineNo">482</span>        + request.getRequestURI();<a name="line.482"></a>
+<span class="sourceLineNo">483</span>      response.sendRedirect(redirectUrl);<a name="line.483"></a>
+<span class="sourceLineNo">484</span>    }<a name="line.484"></a>
+<span class="sourceLineNo">485</span>  }<a name="line.485"></a>
+<span class="sourceLineNo">486</span><a name="line.486"></a>
+<span class="sourceLineNo">487</span>  /**<a name="line.487"></a>
+<span class="sourceLineNo">488</span>   * Initializes the HMaster. The steps are as follows:<a name="line.488"></a>
+<span class="sourceLineNo">489</span>   * &lt;p&gt;<a name="line.489"></a>
+<span class="sourceLineNo">490</span>   * &lt;ol&gt;<a name="line.490"></a>
+<span class="sourceLineNo">491</span>   * &lt;li&gt;Initialize the local HRegionServer<a name="line.491"></a>
+<span class="sourceLineNo">492</span>   * &lt;li&gt;Start the ActiveMasterManager.<a name="line.492"></a>
+<span class="sourceLineNo">493</span>   * &lt;/ol&gt;<a name="line.493"></a>
+<span class="sourceLineNo">494</span>   * &lt;p&gt;<a name="line.494"></a>
+<span class="sourceLineNo">495</span>   * Remaining steps of initialization occur in<a name="line.495"></a>
+<span class="sourceLineNo">496</span>   * #finishActiveMasterInitialization(MonitoredTask) after<a name="line.496"></a>
+<span class="sourceLineNo">497</span>   * the master becomes the active one.<a name="line.497"></a>
+<span class="sourceLineNo">498</span>   */<a name="line.498"></a>
+<span class="sourceLineNo">499</span>  public HMaster(final Configuration conf)<a name="line.499"></a>
+<span class="sourceLineNo">500</span>      throws IOException, KeeperException {<a name="line.500"></a>
+<span class="sourceLineNo">501</span>    super(conf);<a name="line.501"></a>
+<span class="sourceLineNo">502</span>    TraceUtil.initTracer(conf);<a name="line.502"></a>
+<span class="sourceLineNo">503</span>    try {<a name="line.503"></a>
+<span class="sourceLineNo">504</span>      if (conf.getBoolean(MAINTENANCE_MODE, false)) {<a name="line.504"></a>
+<span class="sourceLineNo">505</span>        LOG.info("Detected {}=true via configuration.", MAINTENANCE_MODE);<a name="line.505"></a>
+<span class="sourceLineNo">506</span>        maintenanceMode = true;<a name="line.506"></a>
+<span class="sourceLineNo">507</span>      } else if (Boolean.getBoolean(MAINTENANCE_MODE)) {<a name="line.507"></a>
+<span class="sourceLineNo">508</span>        LOG.info("Detected {}=true via environment variables.", MAINTENANCE_MODE);<a name="line.508"></a>
+<span class="sourceLineNo">509</span>        maintenanceMode = true;<a name="line.509"></a>
+<span class="sourceLineNo">510</span>      } else {<a name="line.510"></a>
+<span class="sourceLineNo">511</span>        maintenanceMode = false;<a name="line.511"></a>
+<span class="sourceLineNo">512</span>      }<a name="line.512"></a>
+<span class="sourceLineNo">513</span><a name="line.513"></a>
+<span class="sourceLineNo">514</span>      this.rsFatals = new MemoryBoundedLogMessageBuffer(<a name="line.514"></a>
+<span class="sourceLineNo">515</span>          conf.getLong("hbase.master.buffer.for.rs.fatals", 1 * 1024 * 1024));<a name="line.515"></a>
+<span class="sourceLineNo">516</span>      LOG.info("hbase.rootdir=" + getRootDir() +<a name="line.516"></a>
+<span class="sourceLineNo">517</span>          ", hbase.cluster.distributed=" + this.conf.getBoolean(HConstants.CLUSTER_DISTRIBUTED, false));<a name="line.517"></a>
 <span class="sourceLineNo">518</span><a name="line.518"></a>
-<span class="sourceLineNo">519</span>      // should we check the compression codec type at master side, default true, HBASE-6370<a name="line.519"></a>
-<span class="sourceLineNo">520</span>      this.masterCheckCompression = conf.getBoolean("hbase.master.check.compression", true);<a name="line.520"></a>
+<span class="sourceLineNo">519</span>      // Disable usage of meta replicas in the master<a name="line.519"></a>
+<span class="sourceLineNo">520</span>      this.conf.setBoolean(HConstants.USE_META_REPLICAS, false);<a name="line.520"></a>
 <span class="sourceLineNo">521</span><a name="line.521"></a>
-<span class="sourceLineNo">522</span>      // should we check encryption settings at master side, default true<a name="line.522"></a>
-<span class="sourceLineNo">523</span>      this.masterCheckEncryption = conf.getBoolean("hbase.master.check.encryption", true);<a name="line.523"></a>
-<span class="sourceLineNo">524</span><a name="line.524"></a>
-<span class="sourceLineNo">525</span>      this.metricsMaster = new MetricsMaster(new MetricsMasterWrapperImpl(this));<a name="line.525"></a>
-<span class="sourceLineNo">526</span><a name="line.526"></a>
-<span class="sourceLineNo">527</span>      // preload table descriptor at startup<a name="line.527"></a>
-<span class="sourceLineNo">528</span>      this.preLoadTableDescriptors = conf.getBoolean("hbase.master.preload.tabledescriptors", true);<a name="line.528"></a>
+<span class="sourceLineNo">522</span>      decorateMasterConfiguration(this.conf);<a name="line.522"></a>
+<span class="sourceLineNo">523</span><a name="line.523"></a>
+<span class="sourceLineNo">524</span>      // Hack! Maps DFSClient =&gt; Master for logs.  HDFS made this<a name="line.524"></a>
+<span class="sourceLineNo">525</span>      // config param for task trackers, but we can piggyback off of it.<a name="line.525"></a>
+<span class="sourceLineNo">526</span>      if (this.conf.get("mapreduce.task.attempt.id") == null) {<a name="line.526"></a>
+<span class="sourceLineNo">527</span>        this.conf.set("mapreduce.task.attempt.id", "hb_m_" + this.serverName.toString());<a name="line.527"></a>
+<span class="sourceLineNo">528</span>      }<a name="line.528"></a>
 <span class="sourceLineNo">529</span><a name="line.529"></a>
-<span class="sourceLineNo">530</span>      this.maxBlancingTime = getMaxBalancingTime();<a name="line.530"></a>
-<span class="sourceLineNo">531</span>      this.maxRitPercent = conf.getDouble(HConstants.HBASE_MASTER_BALANCER_MAX_RIT_PERCENT,<a name="line.531"></a>
-<span class="sourceLineNo">532</span>          HConstants.DEFAULT_HBASE_MASTER_BALANCER_MAX_RIT_PERCENT);<a name="line.532"></a>
-<span class="sourceLineNo">533</span><a name="line.533"></a>
-<span class="sourceLineNo">534</span>      // Do we publish the status?<a name="line.534"></a>
+<span class="sourceLineNo">530</span>      // should we check the compression codec type at master side, default true, HBASE-6370<a name="line.530"></a>
+<span class="sourceLineNo">531</span>      this.masterCheckCompression = conf.getBoolean("hbase.master.check.compression", true);<a name="line.531"></a>
+<span class="sourceLineNo">532</span><a name="line.532"></a>
+<span class="sourceLineNo">533</span>      // should we check encryption settings at master side, default true<a name="line.533"></a>
+<span class="sourceLineNo">534</span>      this.masterCheckEncryption = conf.getBoolean("hbase.master.check.encryption", true);<a name="line.534"></a>
 <span class="sourceLineNo">535</span><a name="line.535"></a>
-<span class="sourceLineNo">536</span>      boolean shouldPublish = conf.getBoolean(HConstants.STATUS_PUBLISHED,<a name="line.536"></a>
-<span class="sourceLineNo">537</span>          HConstants.STATUS_PUBLISHED_DEFAULT);<a name="line.537"></a>
-<span class="sourceLineNo">538</span>      Class&lt;? extends ClusterStatusPublisher.Publisher&gt; publisherClass =<a name="line.538"></a>
-<span class="sourceLineNo">539</span>          conf.getClass(ClusterStatusPublisher.STATUS_PUBLISHER_CLASS,<a name="line.539"></a>
-<span class="sourceLineNo">540</span>              ClusterStatusPublisher.DEFAULT_STATUS_PUBLISHER_CLASS,<a name="line.540"></a>
-<span class="sourceLineNo">541</span>              ClusterStatusPublisher.Publisher.class);<a name="line.541"></a>
-<span class="sourceLineNo">542</span><a name="line.542"></a>
-<span class="sourceLineNo">543</span>      if (shouldPublish) {<a name="line.543"></a>
-<span class="sourceLineNo">544</span>        if (publisherClass == null) {<a name="line.544"></a>
-<span class="sourceLineNo">545</span>          LOG.warn(HConstants.STATUS_PUBLISHED + " is true, but " +<a name="line.545"></a>
-<span class="sourceLineNo">546</span>              ClusterStatusPublisher.DEFAULT_STATUS_PUBLISHER_CLASS +<a name="line.546"></a>
-<span class="sourceLineNo">547</span>              " is not set - not publishing status");<a name="line.547"></a>
-<span class="sourceLineNo">548</span>        } else {<a name="line.548"></a>
-<span class="sourceLineNo">549</span>          clusterStatusPublisherChore = new ClusterStatusPublisher(this, conf, publisherClass);<a name="line.549"></a>
-<span class="sourceLineNo">550</span>          getChoreService().scheduleChore(clusterStatusPublisherChore);<a name="line.550"></a>
-<span class="sourceLineNo">551</span>        }<a name="line.551"></a>
-<span class="sourceLineNo">552</span>      }<a name="line.552"></a>
+<span class="sourceLineNo">536</span>      this.metricsMaster = new MetricsMaster(new MetricsMasterWrapperImpl(this));<a name="line.536"></a>
+<span class="sourceLineNo">537</span><a name="line.537"></a>
+<span class="sourceLineNo">538</span>      // preload table descriptor at startup<a name="line.538"></a>
+<span class="sourceLineNo">539</span>      this.preLoadTableDescriptors = conf.getBoolean("hbase.master.preload.tabledescriptors", true);<a name="line.539"></a>
+<span class="sourceLineNo">540</span><a name="line.540"></a>
+<span class="sourceLineNo">541</span>      this.maxBlancingTime = getMaxBalancingTime();<a name="line.541"></a>
+<span class="sourceLineNo">542</span>      this.maxRitPercent = conf.getDouble(HConstants.HBASE_MASTER_BALANCER_MAX_RIT_PERCENT,<a name="line.542"></a>
+<span class="sourceLineNo">543</span>          HConstants.DEFAULT_HBASE_MASTER_BALANCER_MAX_RIT_PERCENT);<a name="line.543"></a>
+<span class="sourceLineNo">544</span><a name="line.544"></a>
+<span class="sourceLineNo">545</span>      // Do we publish the status?<a name="line.545"></a>
+<span class="sourceLineNo">546</span><a name="line.546"></a>
+<span class="sourceLineNo">547</span>      boolean shouldPublish = conf.getBoolean(HConstants.STATUS_PUBLISHED,<a name="line.547"></a>
+<span class="sourceLineNo">548</span>          HConstants.STATUS_PUBLISHED_DEFAULT);<a name="line.548"></a>
+<span class="sourceLineNo">549</span>      Class&lt;? extends ClusterStatusPublisher.Publisher&gt; publisherClass =<a name="line.549"></a>
+<span class="sourceLineNo">550</span>          conf.getClass(ClusterStatusPublisher.STATUS_PUBLISHER_CLASS,<a name="line.550"></a>
+<span class="sourceLineNo">551</span>              ClusterStatusPublisher.DEFAULT_STATUS_PUBLISHER_CLASS,<a name="line.551"></a>
+<span class="sourceLineNo">552</span>              ClusterStatusPublisher.Publisher.class);<a name="line.552"></a>
 <span class="sourceLineNo">553</span><a name="line.553"></a>
-<span class="sourceLineNo">554</span>      // Some unit tests don't need a cluster, so no zookeeper at all<a name="line.554"></a>
-<span class="sourceLineNo">555</span>      if (!conf.getBoolean("hbase.testing.nocluster", false)) {<a name="line.555"></a>
-<span class="sourceLineNo">556</span>        this.activeMasterManager = new ActiveMasterManager(zooKeeper, this.serverName, this);<a name="line.556"></a>
-<span class="sourceLineNo">557</span>      } else {<a name="line.557"></a>
-<span class="sourceLineNo">558</span>        this.activeMasterManager = null;<a name="line.558"></a>
-<span class="sourceLineNo">559</span>      }<a name="line.559"></a>
-<span class="sourceLineNo">560</span>    } catch (Throwable t) {<a name="line.560"></a>
-<span class="sourceLineNo">561</span>      // Make sure we log the exception. HMaster is often started via reflection and the<a name="line.561"></a>
-<span class="sourceLineNo">562</span>      // cause of failed startup is lost.<a name="line.562"></a>
-<span class="sourceLineNo">563</span>      LOG.error("Failed construction of Master", t);<a name="line.563"></a>
-<span class="sourceLineNo">564</span>      throw t;<a name="line.564"></a>
-<span class="sourceLineNo">565</span>    }<a name="line.565"></a>
-<span class="sourceLineNo">566</span>  }<a name="line.566"></a>
-<span class="sourceLineNo">567</span><a name="line.567"></a>
-<span class="sourceLineNo">568</span>  @Override<a name="line.568"></a>
-<span class="sourceLineNo">569</span>  protected String getUseThisHostnameInstead(Configuration conf) {<a name="line.569"></a>
-<span class="sourceLineNo">570</span>    return conf.get(MASTER_HOSTNAME_KEY);<a name="line.570"></a>
-<span class="sourceLineNo">571</span>  }<a name="line.571"></a>
-<span class="sourceLineNo">572</span><a name="line.572"></a>
-<span class="sourceLineNo">573</span>  // Main run loop. Calls through to the regionserver run loop AFTER becoming active Master; will<a name="line.573"></a>
-<span class="sourceLineNo">574</span>  // block in here until then.<a name="line.574"></a>
-<span class="sourceLineNo">575</span>  @Override<a name="line.575"></a>
-<span class="sourceLineNo">576</span>  public void run() {<a name="line.576"></a>
-<span class="sourceLineNo">577</span>    try {<a name="line.577"></a>
-<span class="sourceLineNo">578</span>      if (!conf.getBoolean("hbase.testing.nocluster", false)) {<a name="line.578"></a>
-<span class="sourceLineNo">579</span>        Threads.setDaemonThreadRunning(new Thread(() -&gt; {<a name="line.579"></a>
-<span class="sourceLineNo">580</span>          try {<a name="line.580"></a>
-<span class="sourceLineNo">581</span>            int infoPort = putUpJettyServer();<a name="line.581"></a>
-<span class="sourceLineNo">582</span>            startActiveMasterManager(infoPort);<a name="line.582"></a>
-<span class="sourceLineNo">583</span>          } catch (Throwable t) {<a name="line.583"></a>
-<span class="sourceLineNo">584</span>            // Make sure we log the exception.<a name="line.584"></a>
-<span class="sourceLineNo">585</span>            String error = "Failed to become Active Master";<a name="line.585"></a>
-<span class="sourceLineNo">586</span>            LOG.error(error, t);<a name="line.586"></a>
-<span class="sourceLineNo">587</span>            // Abort should have been called already.<a name="line.587"></a>
-<span class="sourceLineNo">588</span>            if (!isAborted()) {<a name="line.588"></a>
-<span class="sourceLineNo">589</span>              abort(error, t);<a name="line.589"></a>
-<span class="sourceLineNo">590</span>            }<a name="line.590"></a>
-<span class="sourceLineNo">591</span>          }<a name="line.591"></a>
-<span class="sourceLineNo">592</span>        }), getName() + ":becomeActiveMaster");<a name="line.592"></a>
-<span class="sourceLineNo">593</span>      }<a name="line.593"></a>
-<span class="sourceLineNo">594</span>      // Fall in here even if we have been aborted. Need to run the shutdown services and<a name="line.594"></a>
-<span class="sourceLineNo">595</span>      // the super run call will do this for us.<a name="line.595"></a>
-<span class="sourceLineNo">596</span>      super.run();<a name="line.596"></a>
-<span class="sourceLineNo">597</span>    } finally {<a name="line.597"></a>
-<span class="sourceLineNo">598</span>      if (this.clusterSchemaService != null) {<a name="line.598"></a>
-<span class="sourceLineNo">599</span>        // If on way out, then we are no longer active master.<a name="line.599"></a>
-<span class="sourceLineNo">600</span>        this.clusterSchemaService.stopAsync();<a name="line.600"></a>
-<span class="sourceLineNo">601</span>        try {<a name="line.601"></a>
-<span class="sourceLineNo">602</span>          this.clusterSchemaService.awaitTerminated(<a name="line.602"></a>
-<span class="sourceLineNo">603</span>              getConfiguration().getInt(HBASE_MASTER_WAIT_ON_SERVICE_IN_SECONDS,<a name="line.603"></a>
-<span class="sourceLineNo">604</span>              DEFAULT_HBASE_MASTER_WAIT_ON_SERVICE_IN_SECONDS), TimeUnit.SECONDS);<a name="line.604"></a>
-<span class="sourceLineNo">605</span>        } catch (TimeoutException te) {<a name="line.605"></a>
-<span class="sourceLineNo">606</span>          LOG.warn("Failed shutdown of clusterSchemaService", te);<a name="line.606"></a>
-<span class="sourceLineNo">607</span>        }<a name="line.607"></a>
-<span class="sourceLineNo">608</span>      }<a name="line.608"></a>
-<span class="sourceLineNo">609</span>      this.activeMaster = false;<a name="line.609"></a>
-<span class="sourceLineNo">610</span>    }<a name="line.610"></a>
-<span class="sourceLineNo">611</span>  }<a name="line.611"></a>
-<span class="sourceLineNo">612</span><a name="line.612"></a>
-<span class="sourceLineNo">613</span>  // return the actual infoPort, -1 means disable info server.<a name="line.613"></a>
-<span class="sourceLineNo">614</span>  private int putUpJettyServer() throws IOException {<a name="line.614"></a>
-<span class="sourceLineNo">615</span>    if (!conf.getBoolean("hbase.master.infoserver.redirect", true)) {<a name="line.615"></a>
-<span class="sourceLineNo">616</span>      return -1;<a name="line.616"></a>
-<span class="sourceLineNo">617</span>    }<a name="line.617"></a>
-<span class="sourceLineNo">618</span>    final int infoPort = conf.getInt("hbase.master.info.port.orig",<a name="line.618"></a>
-<span class="sourceLineNo">619</span>      HConstants.DEFAULT_MASTER_INFOPORT);<a name="line.619"></a>
-<span class="sourceLineNo">620</span>    // -1 is for disabling info server, so no redirecting<a name="line.620"></a>
-<span class="sourceLineNo">621</span>    if (infoPort &lt; 0 || infoServer == null) {<a name="line.621"></a>
-<span class="sourceLineNo">622</span>      return -1;<a name="line.622"></a>
-<span class="sourceLineNo">623</span>    }<a name="line.623"></a>
-<span class="sourceLineNo">624</span>    if(infoPort == infoServer.getPort()) {<a name="line.624"></a>
-<span class="sourceLineNo">625</span>      return infoPort;<a name="line.625"></a>
-<span class="sourceLineNo">626</span>    }<a name="line.626"></a>
-<span class="sourceLineNo">627</span>    final String addr = conf.get("hbase.master.info.bindAddress", "0.0.0.0");<a name="line.627"></a>
-<span class="sourceLineNo">628</span>    if (!Addressing.isLocalAddress(InetAddress.getByName(addr))) {<a name="line.628"></a>
-<span class="sourceLineNo">629</span>      String msg =<a name="line.629"></a>
-<span class="sourceLineNo">630</span>          "Failed to start redirecting jetty server. Address " + addr<a name="line.630"></a>
-<span class="sourceLineNo">631</span>              + " does not belong to this host. Correct configuration parameter: "<a name="line.631"></a>
-<span class="sourceLineNo">632</span>              + "hbase.master.info.bindAddress";<a name="line.632"></a>
-<span class="sourceLineNo">633</span>      LOG.error(msg);<a name="line.633"></a>
-<span class="sourceLineNo">634</span>      throw new IOException(msg);<a name="line.634"></a>
-<span class="sourceLineNo">635</span>    }<a name="line.635"></a>
-<span class="sourceLineNo">636</span><a name="line.636"></a>
-<span class="sourceLineNo">637</span>    // TODO I'm pretty sure we could just add another binding to the InfoServer run by<a name="line.637"></a>
-<span class="sourceLineNo">638</span>    // the RegionServer and have it run the RedirectServlet instead of standing up<a name="line.638"></a>
-<span class="sourceLineNo">639</span>    // a second entire stack here.<a name="line.639"></a>
-<span class="sourceLineNo">640</span>    masterJettyServer = new Server();<a name="line.640"></a>
-<span class="sourceLineNo">641</span>    final ServerConnector connector = new ServerConnector(masterJettyServer);<a name="line.641"></a>
-<span class="sourceLineNo">642</span>    connector.setHost(addr);<a name="line.642"></a>
-<span class="sourceLineNo">643</span>    connector.setPort(infoPort);<a name="line.643"></a>
-<span class="sourceLineNo">644</span>    masterJettyServer.addConnector(connector);<a name="line.644"></a>
-<span class="sourceLineNo">645</span>    masterJettyServer.setStopAtShutdown(true);<a name="line.645"></a>
-<span class="sourceLineNo">646</span><a name="line.646"></a>
-<span class="sourceLineNo">647</span>    final String redirectHostname =<a name="line.647"></a>
-<span class="sourceLineNo">648</span>        StringUtils.isBlank(useThisHostnameInstead) ? null : useThisHostnameInstead;<a name="line.648"></a>
-<span class="sourceLineNo">649</span><a name="line.649"></a>
-<span class="sourceLineNo">650</span>    final RedirectServlet redirect = new RedirectServlet(infoServer, redirectHostname);<a name="line.650"></a>
-<span class="sourceLineNo">651</span>    final WebAppContext context = new WebAppContext(null, "/", null, null, null, null, WebAppContext.NO_SESSIONS);<a name="line.651"></a>
-<span class="sourceLineNo">652</span>    context.addServlet(new ServletHolder(redirect), "/*");<a name="line.652"></a>
-<span class="sourceLineNo">653</span>    context.setServer(masterJettyServer);<a name="line.653"></a>
-<span class="sourceLineNo">654</span><a name="line.654"></a>
-<span class="sourceLineNo">655</span>    try {<a name="line.655"></a>
-<span class="sourceLineNo">656</span>      masterJettyServer.start();<a name="line.656"></a>
-<span class="sourceLineNo">657</span>    } catch (Exception e) {<a name="line.657"></a>
-<span class="sourceLineNo">658</span>      throw new IOException("Failed to start redirecting jetty server", e);<a name="line.658"></a>
-<span class="sourceLineNo">659</span>    }<a name="line.659"></a>
-<span class="sourceLineNo">660</span>    return connector.getLocalPort();<a name="line.660"></a>
-<span class="sourceLineNo">661</span>  }<a name="line.661"></a>
-<span class="sourceLineNo">662</span><a name="line.662"></a>
-<span class="sourceLineNo">663</span>  @Override<a name="line.663"></a>
-<span class="sourceLineNo">664</span>  protected Function&lt;TableDescriptorBuilder, TableDescriptorBuilder&gt; getMetaTableObserver() {<a name="line.664"></a>
-<span class="sourceLineNo">665</span>    return builder -&gt; builder.setRegionReplication(conf.getInt(HConstants.META_REPLICAS_NUM, HConstants.DEFAULT_META_REPLICA_NUM));<a name="line.665"></a>
-<span class="sourceLineNo">666</span>  }<a name="line.666"></a>
-<span class="sourceLineNo">667</span>  /**<a name="line.667"></a>
-<span class="sourceLineNo">668</span>   * For compatibility, if failed with regionserver credentials, try the master one<a name="line.668"></a>
-<span class="sourceLineNo">669</span>   */<a name="line.669"></a>
-<span class="sourceLineNo">670</span>  @Override<a name="line.670"></a>
-<span class="sourceLineNo">671</span>  protected void login(UserProvider user, String host) throws IOException {<a name="line.671"></a>
-<span class="sourceLineNo">672</span>    try {<a name="line.672"></a>
-<span class="sourceLineNo">673</span>      super.login(user, host);<a name="line.673"></a>
-<span class="sourceLineNo">674</span>    } catch (IOException ie) {<a name="line.674"></a>
-<span class="sourceLineNo">675</span>      user.login("hbase.master.keytab.file",<a name="line.675"></a>
-<span class="sourceLineNo">676</span>        "hbase.master.kerberos.principal", host);<a name="line.676"></a>
-<span class="sourceLineNo">677</span>    }<a name="line.677"></a>
-<span class="sourceLineNo">678</span>  }<a name="line.678"></a>
-<span class="sourceLineNo">679</span><a name="line.679"></a>
-<span class="sourceLineNo">680</span>  /**<a name="line.680"></a>
-<span class="sourceLineNo">681</span>   * If configured to put regions on active master,<a name="line.681"></a>
-<span class="sourceLineNo">682</span>   * wait till a backup master becomes active.<a name="line.682"></a>
-<span class="sourceLineNo">683</span>   * Otherwise, loop till the server is stopped or aborted.<a name="line.683"></a>
-<span class="sourceLineNo">684</span>   */<a name="line.684"></a>
-<span class="sourceLineNo">685</span>  @Override<a name="line.685"></a>
-<span class="sourceLineNo">686</span>  protected void waitForMasterActive(){<a name="line.686"></a>
-<span class="sourceLineNo">687</span>    boolean tablesOnMaster = LoadBalancer.isTablesOnMaster(conf);<a name="line.687"></a>
-<span class="sourceLineNo">688</span>    while (!(tablesOnMaster &amp;&amp; activeMaster) &amp;&amp; !isStopped() &amp;&amp; !isAborted()) {<a name="line.688"></a>
-<span class="sourceLineNo">689</span>      sleeper.sleep();<a name="line.689"></a>
-<span class="sourceLineNo">690</span>    }<a name="line.690"></a>
-<span class="sourceLineNo">691</span>  }<a name="line.691"></a>
-<span class="sourceLineNo">692</span><a name="line.692"></a>
-<span class="sourceLineNo">693</span>  @VisibleForTesting<a name="line.693"></a>
-<span class="sourceLineNo">694</span>  public MasterRpcServices getMasterRpcServices() {<a name="line.694"></a>
-<span class="sourceLineNo">695</span>    return (MasterRpcServices)rpcServices;<a name="line.695"></a>
-<span class="sourceLineNo">696</span>  }<a name="line.696"></a>
-<span class="sourceLineNo">697</span><a name="line.697"></a>
-<span class="sourceLineNo">698</span>  public boolean balanceSwitch(final boolean b) throws IOException {<a name="line.698"></a>
-<span class="sourceLineNo">699</span>    return getMasterRpcServices().switchBalancer(b, BalanceSwitchMode.ASYNC);<a name="line.699"></a>
-<span class="sourceLineNo">700</span>  }<a name="line.700"></a>
-<span class="sourceLineNo">701</span><a name="line.701"></a>
-<span class="sourceLineNo">702</span>  @Override<a name="line.702"></a>
-<span class="sourceLineNo">703</span>  protected String getProcessName() {<a name="line.703"></a>
-<span class="sourceLineNo">704</span>    return MASTER;<a name="line.704"></a>
+<span class="sourceLineNo">554</span>      if (shouldPublish) {<a name="line.554"></a>
+<span class="sourceLineNo">555</span>        if (publisherClass == null) {<a name="line.555"></a>
+<span class="sourceLineNo">556</span>          LOG.warn(HConstants.STATUS_PUBLISHED + " is true, but " +<a name="line.556"></a>
+<span class="sourceLineNo">557</span>              ClusterStatusPublisher.DEFAULT_STATUS_PUBLISHER_CLASS +<a name="line.557"></a>
+<span class="sourceLineNo">558</span>              " is not set - not publishing status");<a name="line.558"></a>
+<span class="sourceLineNo">559</span>        } else {<a name="line.559"></a>
+<span class="sourceLineNo">560</span>          clusterStatusPublisherChore = new ClusterStatusPublisher(this, conf, publisherClass);<a name="line.560"></a>
+<span class="sourceLineNo">561</span>          getChoreService().scheduleChore(clusterStatusPublisherChore);<a name="line.561"></a>
+<span class="sourceLineNo">562</span>        }<a name="line.562"></a>
+<span class="sourceLineNo">563</span>      }<a name="line.563"></a>
+<span class="sourceLineNo">564</span><a name="line.564"></a>
+<span class="sourceLineNo">565</span>      // Some unit tests don't need a cluster, so no zookeeper at all<a name="line.565"></a>
+<span class="sourceLineNo">566</span>      if (!conf.getBoolean("hbase.testing.nocluster", false)) {<a name="line.566"></a>
+<span class="sourceLineNo">567</span>        this.activeMasterManager = new ActiveMasterManager(zooKeeper, this.serverName, this);<a name="line.567"></a>
+<span class="sourceLineNo">568</span>      } else {<a name="line.568"></a>
+<span class="sourceLineNo">569</span>        this.activeMasterManager = null;<a name="line.569"></a>
+<span class="sourceLineNo">570</span>      }<a name="line.570"></a>
+<span class="sourceLineNo">571</span>    } catch (Throwable t) {<a

<TRUNCATED>

[10/46] hbase-site git commit: Published site at 05d22ed960204183fbd9bd16f1dbca6410ccde76.

Posted by gi...@apache.org.
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/3649682c/devapidocs/src-html/org/apache/hadoop/hbase/regionserver/RSRpcServices.RegionScannerCloseCallBack.html
----------------------------------------------------------------------
diff --git a/devapidocs/src-html/org/apache/hadoop/hbase/regionserver/RSRpcServices.RegionScannerCloseCallBack.html b/devapidocs/src-html/org/apache/hadoop/hbase/regionserver/RSRpcServices.RegionScannerCloseCallBack.html
index 20e3eaa..b257d07 100644
--- a/devapidocs/src-html/org/apache/hadoop/hbase/regionserver/RSRpcServices.RegionScannerCloseCallBack.html
+++ b/devapidocs/src-html/org/apache/hadoop/hbase/regionserver/RSRpcServices.RegionScannerCloseCallBack.html
@@ -2493,1291 +2493,1293 @@
 <span class="sourceLineNo">2485</span>  }<a name="line.2485"></a>
 <span class="sourceLineNo">2486</span><a name="line.2486"></a>
 <span class="sourceLineNo">2487</span>  private boolean shouldRejectRequestsFromClient(HRegion region) {<a name="line.2487"></a>
-<span class="sourceLineNo">2488</span>    return regionServer.getReplicationSourceService().getSyncReplicationPeerInfoProvider()<a name="line.2488"></a>
-<span class="sourceLineNo">2489</span>      .checkState(region.getRegionInfo().getTable(), RejectRequestsFromClientStateChecker.get());<a name="line.2489"></a>
-<span class="sourceLineNo">2490</span>  }<a name="line.2490"></a>
-<span class="sourceLineNo">2491</span><a name="line.2491"></a>
-<span class="sourceLineNo">2492</span>  private void rejectIfInStandByState(HRegion region) throws DoNotRetryIOException {<a name="line.2492"></a>
-<span class="sourceLineNo">2493</span>    if (shouldRejectRequestsFromClient(region)) {<a name="line.2493"></a>
-<span class="sourceLineNo">2494</span>      throw new DoNotRetryIOException(<a name="line.2494"></a>
-<span class="sourceLineNo">2495</span>        region.getRegionInfo().getRegionNameAsString() + " is in STANDBY state.");<a name="line.2495"></a>
-<span class="sourceLineNo">2496</span>    }<a name="line.2496"></a>
-<span class="sourceLineNo">2497</span>  }<a name="line.2497"></a>
-<span class="sourceLineNo">2498</span><a name="line.2498"></a>
-<span class="sourceLineNo">2499</span>  /**<a name="line.2499"></a>
-<span class="sourceLineNo">2500</span>   * Get data from a table.<a name="line.2500"></a>
-<span class="sourceLineNo">2501</span>   *<a name="line.2501"></a>
-<span class="sourceLineNo">2502</span>   * @param controller the RPC controller<a name="line.2502"></a>
-<span class="sourceLineNo">2503</span>   * @param request the get request<a name="line.2503"></a>
-<span class="sourceLineNo">2504</span>   * @throws ServiceException<a name="line.2504"></a>
-<span class="sourceLineNo">2505</span>   */<a name="line.2505"></a>
-<span class="sourceLineNo">2506</span>  @Override<a name="line.2506"></a>
-<span class="sourceLineNo">2507</span>  public GetResponse get(final RpcController controller, final GetRequest request)<a name="line.2507"></a>
-<span class="sourceLineNo">2508</span>      throws ServiceException {<a name="line.2508"></a>
-<span class="sourceLineNo">2509</span>    long before = EnvironmentEdgeManager.currentTime();<a name="line.2509"></a>
-<span class="sourceLineNo">2510</span>    OperationQuota quota = null;<a name="line.2510"></a>
-<span class="sourceLineNo">2511</span>    HRegion region = null;<a name="line.2511"></a>
-<span class="sourceLineNo">2512</span>    try {<a name="line.2512"></a>
-<span class="sourceLineNo">2513</span>      checkOpen();<a name="line.2513"></a>
-<span class="sourceLineNo">2514</span>      requestCount.increment();<a name="line.2514"></a>
-<span class="sourceLineNo">2515</span>      rpcGetRequestCount.increment();<a name="line.2515"></a>
-<span class="sourceLineNo">2516</span>      region = getRegion(request.getRegion());<a name="line.2516"></a>
-<span class="sourceLineNo">2517</span>      rejectIfInStandByState(region);<a name="line.2517"></a>
-<span class="sourceLineNo">2518</span><a name="line.2518"></a>
-<span class="sourceLineNo">2519</span>      GetResponse.Builder builder = GetResponse.newBuilder();<a name="line.2519"></a>
-<span class="sourceLineNo">2520</span>      ClientProtos.Get get = request.getGet();<a name="line.2520"></a>
-<span class="sourceLineNo">2521</span>      // An asynchbase client, https://github.com/OpenTSDB/asynchbase, starts by trying to do<a name="line.2521"></a>
-<span class="sourceLineNo">2522</span>      // a get closest before. Throwing the UnknownProtocolException signals it that it needs<a name="line.2522"></a>
-<span class="sourceLineNo">2523</span>      // to switch and do hbase2 protocol (HBase servers do not tell clients what versions<a name="line.2523"></a>
-<span class="sourceLineNo">2524</span>      // they are; its a problem for non-native clients like asynchbase. HBASE-20225.<a name="line.2524"></a>
-<span class="sourceLineNo">2525</span>      if (get.hasClosestRowBefore() &amp;&amp; get.getClosestRowBefore()) {<a name="line.2525"></a>
-<span class="sourceLineNo">2526</span>        throw new UnknownProtocolException("Is this a pre-hbase-1.0.0 or asynchbase client? " +<a name="line.2526"></a>
-<span class="sourceLineNo">2527</span>            "Client is invoking getClosestRowBefore removed in hbase-2.0.0 replaced by " +<a name="line.2527"></a>
-<span class="sourceLineNo">2528</span>            "reverse Scan.");<a name="line.2528"></a>
-<span class="sourceLineNo">2529</span>      }<a name="line.2529"></a>
-<span class="sourceLineNo">2530</span>      Boolean existence = null;<a name="line.2530"></a>
-<span class="sourceLineNo">2531</span>      Result r = null;<a name="line.2531"></a>
-<span class="sourceLineNo">2532</span>      RpcCallContext context = RpcServer.getCurrentCall().orElse(null);<a name="line.2532"></a>
-<span class="sourceLineNo">2533</span>      quota = getRpcQuotaManager().checkQuota(region, OperationQuota.OperationType.GET);<a name="line.2533"></a>
-<span class="sourceLineNo">2534</span><a name="line.2534"></a>
-<span class="sourceLineNo">2535</span>      Get clientGet = ProtobufUtil.toGet(get);<a name="line.2535"></a>
-<span class="sourceLineNo">2536</span>      if (get.getExistenceOnly() &amp;&amp; region.getCoprocessorHost() != null) {<a name="line.2536"></a>
-<span class="sourceLineNo">2537</span>        existence = region.getCoprocessorHost().preExists(clientGet);<a name="line.2537"></a>
-<span class="sourceLineNo">2538</span>      }<a name="line.2538"></a>
-<span class="sourceLineNo">2539</span>      if (existence == null) {<a name="line.2539"></a>
-<span class="sourceLineNo">2540</span>        if (context != null) {<a name="line.2540"></a>
-<span class="sourceLineNo">2541</span>          r = get(clientGet, (region), null, context);<a name="line.2541"></a>
-<span class="sourceLineNo">2542</span>        } else {<a name="line.2542"></a>
-<span class="sourceLineNo">2543</span>          // for test purpose<a name="line.2543"></a>
-<span class="sourceLineNo">2544</span>          r = region.get(clientGet);<a name="line.2544"></a>
-<span class="sourceLineNo">2545</span>        }<a name="line.2545"></a>
-<span class="sourceLineNo">2546</span>        if (get.getExistenceOnly()) {<a name="line.2546"></a>
-<span class="sourceLineNo">2547</span>          boolean exists = r.getExists();<a name="line.2547"></a>
-<span class="sourceLineNo">2548</span>          if (region.getCoprocessorHost() != null) {<a name="line.2548"></a>
-<span class="sourceLineNo">2549</span>            exists = region.getCoprocessorHost().postExists(clientGet, exists);<a name="line.2549"></a>
-<span class="sourceLineNo">2550</span>          }<a name="line.2550"></a>
-<span class="sourceLineNo">2551</span>          existence = exists;<a name="line.2551"></a>
-<span class="sourceLineNo">2552</span>        }<a name="line.2552"></a>
-<span class="sourceLineNo">2553</span>      }<a name="line.2553"></a>
-<span class="sourceLineNo">2554</span>      if (existence != null) {<a name="line.2554"></a>
-<span class="sourceLineNo">2555</span>        ClientProtos.Result pbr =<a name="line.2555"></a>
-<span class="sourceLineNo">2556</span>            ProtobufUtil.toResult(existence, region.getRegionInfo().getReplicaId() != 0);<a name="line.2556"></a>
-<span class="sourceLineNo">2557</span>        builder.setResult(pbr);<a name="line.2557"></a>
-<span class="sourceLineNo">2558</span>      } else if (r != null) {<a name="line.2558"></a>
-<span class="sourceLineNo">2559</span>        ClientProtos.Result pbr;<a name="line.2559"></a>
-<span class="sourceLineNo">2560</span>        if (isClientCellBlockSupport(context) &amp;&amp; controller instanceof HBaseRpcController<a name="line.2560"></a>
-<span class="sourceLineNo">2561</span>            &amp;&amp; VersionInfoUtil.hasMinimumVersion(context.getClientVersionInfo(), 1, 3)) {<a name="line.2561"></a>
-<span class="sourceLineNo">2562</span>          pbr = ProtobufUtil.toResultNoData(r);<a name="line.2562"></a>
-<span class="sourceLineNo">2563</span>          ((HBaseRpcController) controller).setCellScanner(CellUtil.createCellScanner(r<a name="line.2563"></a>
-<span class="sourceLineNo">2564</span>              .rawCells()));<a name="line.2564"></a>
-<span class="sourceLineNo">2565</span>          addSize(context, r, null);<a name="line.2565"></a>
-<span class="sourceLineNo">2566</span>        } else {<a name="line.2566"></a>
-<span class="sourceLineNo">2567</span>          pbr = ProtobufUtil.toResult(r);<a name="line.2567"></a>
-<span class="sourceLineNo">2568</span>        }<a name="line.2568"></a>
-<span class="sourceLineNo">2569</span>        builder.setResult(pbr);<a name="line.2569"></a>
-<span class="sourceLineNo">2570</span>      }<a name="line.2570"></a>
-<span class="sourceLineNo">2571</span>      if (r != null) {<a name="line.2571"></a>
-<span class="sourceLineNo">2572</span>        quota.addGetResult(r);<a name="line.2572"></a>
-<span class="sourceLineNo">2573</span>      }<a name="line.2573"></a>
-<span class="sourceLineNo">2574</span>      return builder.build();<a name="line.2574"></a>
-<span class="sourceLineNo">2575</span>    } catch (IOException ie) {<a name="line.2575"></a>
-<span class="sourceLineNo">2576</span>      throw new ServiceException(ie);<a name="line.2576"></a>
-<span class="sourceLineNo">2577</span>    } finally {<a name="line.2577"></a>
-<span class="sourceLineNo">2578</span>      MetricsRegionServer mrs = regionServer.metricsRegionServer;<a name="line.2578"></a>
-<span class="sourceLineNo">2579</span>      if (mrs != null) {<a name="line.2579"></a>
-<span class="sourceLineNo">2580</span>        TableDescriptor td = region != null? region.getTableDescriptor(): null;<a name="line.2580"></a>
-<span class="sourceLineNo">2581</span>        if (td != null) {<a name="line.2581"></a>
-<span class="sourceLineNo">2582</span>          mrs.updateGet(td.getTableName(), EnvironmentEdgeManager.currentTime() - before);<a name="line.2582"></a>
-<span class="sourceLineNo">2583</span>        }<a name="line.2583"></a>
-<span class="sourceLineNo">2584</span>      }<a name="line.2584"></a>
-<span class="sourceLineNo">2585</span>      if (quota != null) {<a name="line.2585"></a>
-<span class="sourceLineNo">2586</span>        quota.close();<a name="line.2586"></a>
-<span class="sourceLineNo">2587</span>      }<a name="line.2587"></a>
-<span class="sourceLineNo">2588</span>    }<a name="line.2588"></a>
-<span class="sourceLineNo">2589</span>  }<a name="line.2589"></a>
-<span class="sourceLineNo">2590</span><a name="line.2590"></a>
-<span class="sourceLineNo">2591</span>  private Result get(Get get, HRegion region, RegionScannersCloseCallBack closeCallBack,<a name="line.2591"></a>
-<span class="sourceLineNo">2592</span>      RpcCallContext context) throws IOException {<a name="line.2592"></a>
-<span class="sourceLineNo">2593</span>    region.prepareGet(get);<a name="line.2593"></a>
-<span class="sourceLineNo">2594</span>    boolean stale = region.getRegionInfo().getReplicaId() != 0;<a name="line.2594"></a>
-<span class="sourceLineNo">2595</span><a name="line.2595"></a>
-<span class="sourceLineNo">2596</span>    // This method is almost the same as HRegion#get.<a name="line.2596"></a>
-<span class="sourceLineNo">2597</span>    List&lt;Cell&gt; results = new ArrayList&lt;&gt;();<a name="line.2597"></a>
-<span class="sourceLineNo">2598</span>    long before = EnvironmentEdgeManager.currentTime();<a name="line.2598"></a>
-<span class="sourceLineNo">2599</span>    // pre-get CP hook<a name="line.2599"></a>
-<span class="sourceLineNo">2600</span>    if (region.getCoprocessorHost() != null) {<a name="line.2600"></a>
-<span class="sourceLineNo">2601</span>      if (region.getCoprocessorHost().preGet(get, results)) {<a name="line.2601"></a>
-<span class="sourceLineNo">2602</span>        region.metricsUpdateForGet(results, before);<a name="line.2602"></a>
-<span class="sourceLineNo">2603</span>        return Result<a name="line.2603"></a>
-<span class="sourceLineNo">2604</span>            .create(results, get.isCheckExistenceOnly() ? !results.isEmpty() : null, stale);<a name="line.2604"></a>
-<span class="sourceLineNo">2605</span>      }<a name="line.2605"></a>
-<span class="sourceLineNo">2606</span>    }<a name="line.2606"></a>
-<span class="sourceLineNo">2607</span>    Scan scan = new Scan(get);<a name="line.2607"></a>
-<span class="sourceLineNo">2608</span>    if (scan.getLoadColumnFamiliesOnDemandValue() == null) {<a name="line.2608"></a>
-<span class="sourceLineNo">2609</span>      scan.setLoadColumnFamiliesOnDemand(region.isLoadingCfsOnDemandDefault());<a name="line.2609"></a>
-<span class="sourceLineNo">2610</span>    }<a name="line.2610"></a>
-<span class="sourceLineNo">2611</span>    RegionScannerImpl scanner = null;<a name="line.2611"></a>
-<span class="sourceLineNo">2612</span>    try {<a name="line.2612"></a>
-<span class="sourceLineNo">2613</span>      scanner = region.getScanner(scan);<a name="line.2613"></a>
-<span class="sourceLineNo">2614</span>      scanner.next(results);<a name="line.2614"></a>
-<span class="sourceLineNo">2615</span>    } finally {<a name="line.2615"></a>
-<span class="sourceLineNo">2616</span>      if (scanner != null) {<a name="line.2616"></a>
-<span class="sourceLineNo">2617</span>        if (closeCallBack == null) {<a name="line.2617"></a>
-<span class="sourceLineNo">2618</span>          // If there is a context then the scanner can be added to the current<a name="line.2618"></a>
-<span class="sourceLineNo">2619</span>          // RpcCallContext. The rpc callback will take care of closing the<a name="line.2619"></a>
-<span class="sourceLineNo">2620</span>          // scanner, for eg in case<a name="line.2620"></a>
-<span class="sourceLineNo">2621</span>          // of get()<a name="line.2621"></a>
-<span class="sourceLineNo">2622</span>          context.setCallBack(scanner);<a name="line.2622"></a>
-<span class="sourceLineNo">2623</span>        } else {<a name="line.2623"></a>
-<span class="sourceLineNo">2624</span>          // The call is from multi() where the results from the get() are<a name="line.2624"></a>
-<span class="sourceLineNo">2625</span>          // aggregated and then send out to the<a name="line.2625"></a>
-<span class="sourceLineNo">2626</span>          // rpc. The rpccall back will close all such scanners created as part<a name="line.2626"></a>
-<span class="sourceLineNo">2627</span>          // of multi().<a name="line.2627"></a>
-<span class="sourceLineNo">2628</span>          closeCallBack.addScanner(scanner);<a name="line.2628"></a>
-<span class="sourceLineNo">2629</span>        }<a name="line.2629"></a>
-<span class="sourceLineNo">2630</span>      }<a name="line.2630"></a>
-<span class="sourceLineNo">2631</span>    }<a name="line.2631"></a>
-<span class="sourceLineNo">2632</span><a name="line.2632"></a>
-<span class="sourceLineNo">2633</span>    // post-get CP hook<a name="line.2633"></a>
-<span class="sourceLineNo">2634</span>    if (region.getCoprocessorHost() != null) {<a name="line.2634"></a>
-<span class="sourceLineNo">2635</span>      region.getCoprocessorHost().postGet(get, results);<a name="line.2635"></a>
-<span class="sourceLineNo">2636</span>    }<a name="line.2636"></a>
-<span class="sourceLineNo">2637</span>    region.metricsUpdateForGet(results, before);<a name="line.2637"></a>
-<span class="sourceLineNo">2638</span><a name="line.2638"></a>
-<span class="sourceLineNo">2639</span>    return Result.create(results, get.isCheckExistenceOnly() ? !results.isEmpty() : null, stale);<a name="line.2639"></a>
-<span class="sourceLineNo">2640</span>  }<a name="line.2640"></a>
-<span class="sourceLineNo">2641</span><a name="line.2641"></a>
-<span class="sourceLineNo">2642</span>  private void checkBatchSizeAndLogLargeSize(MultiRequest request) {<a name="line.2642"></a>
-<span class="sourceLineNo">2643</span>    int sum = 0;<a name="line.2643"></a>
-<span class="sourceLineNo">2644</span>    String firstRegionName = null;<a name="line.2644"></a>
-<span class="sourceLineNo">2645</span>    for (RegionAction regionAction : request.getRegionActionList()) {<a name="line.2645"></a>
-<span class="sourceLineNo">2646</span>      if (sum == 0) {<a name="line.2646"></a>
-<span class="sourceLineNo">2647</span>        firstRegionName = Bytes.toStringBinary(regionAction.getRegion().getValue().toByteArray());<a name="line.2647"></a>
-<span class="sourceLineNo">2648</span>      }<a name="line.2648"></a>
-<span class="sourceLineNo">2649</span>      sum += regionAction.getActionCount();<a name="line.2649"></a>
-<span class="sourceLineNo">2650</span>    }<a name="line.2650"></a>
-<span class="sourceLineNo">2651</span>    if (sum &gt; rowSizeWarnThreshold) {<a name="line.2651"></a>
-<span class="sourceLineNo">2652</span>      ld.logBatchWarning(firstRegionName, sum, rowSizeWarnThreshold);<a name="line.2652"></a>
-<span class="sourceLineNo">2653</span>    }<a name="line.2653"></a>
-<span class="sourceLineNo">2654</span>  }<a name="line.2654"></a>
-<span class="sourceLineNo">2655</span><a name="line.2655"></a>
-<span class="sourceLineNo">2656</span>  private void failRegionAction(MultiResponse.Builder responseBuilder,<a name="line.2656"></a>
-<span class="sourceLineNo">2657</span>      RegionActionResult.Builder regionActionResultBuilder, RegionAction regionAction,<a name="line.2657"></a>
-<span class="sourceLineNo">2658</span>      CellScanner cellScanner, Throwable error) {<a name="line.2658"></a>
-<span class="sourceLineNo">2659</span>    rpcServer.getMetrics().exception(error);<a name="line.2659"></a>
-<span class="sourceLineNo">2660</span>    regionActionResultBuilder.setException(ResponseConverter.buildException(error));<a name="line.2660"></a>
-<span class="sourceLineNo">2661</span>    responseBuilder.addRegionActionResult(regionActionResultBuilder.build());<a name="line.2661"></a>
-<span class="sourceLineNo">2662</span>    // All Mutations in this RegionAction not executed as we can not see the Region online here<a name="line.2662"></a>
-<span class="sourceLineNo">2663</span>    // in this RS. Will be retried from Client. Skipping all the Cells in CellScanner<a name="line.2663"></a>
-<span class="sourceLineNo">2664</span>    // corresponding to these Mutations.<a name="line.2664"></a>
-<span class="sourceLineNo">2665</span>    if (cellScanner != null) {<a name="line.2665"></a>
-<span class="sourceLineNo">2666</span>      skipCellsForMutations(regionAction.getActionList(), cellScanner);<a name="line.2666"></a>
-<span class="sourceLineNo">2667</span>    }<a name="line.2667"></a>
-<span class="sourceLineNo">2668</span>  }<a name="line.2668"></a>
-<span class="sourceLineNo">2669</span><a name="line.2669"></a>
-<span class="sourceLineNo">2670</span>  private boolean isReplicationRequest(Action action) {<a name="line.2670"></a>
-<span class="sourceLineNo">2671</span>    // replication request can only be put or delete.<a name="line.2671"></a>
-<span class="sourceLineNo">2672</span>    if (!action.hasMutation()) {<a name="line.2672"></a>
-<span class="sourceLineNo">2673</span>      return false;<a name="line.2673"></a>
-<span class="sourceLineNo">2674</span>    }<a name="line.2674"></a>
-<span class="sourceLineNo">2675</span>    MutationProto mutation = action.getMutation();<a name="line.2675"></a>
-<span class="sourceLineNo">2676</span>    MutationType type = mutation.getMutateType();<a name="line.2676"></a>
-<span class="sourceLineNo">2677</span>    if (type != MutationType.PUT &amp;&amp; type != MutationType.DELETE) {<a name="line.2677"></a>
-<span class="sourceLineNo">2678</span>      return false;<a name="line.2678"></a>
-<span class="sourceLineNo">2679</span>    }<a name="line.2679"></a>
-<span class="sourceLineNo">2680</span>    // replication will set a special attribute so we can make use of it to decide whether a request<a name="line.2680"></a>
-<span class="sourceLineNo">2681</span>    // is for replication.<a name="line.2681"></a>
-<span class="sourceLineNo">2682</span>    return mutation.getAttributeList().stream().map(p -&gt; p.getName())<a name="line.2682"></a>
-<span class="sourceLineNo">2683</span>      .filter(n -&gt; n.equals(ReplicationUtils.REPLICATION_ATTR_NAME)).findAny().isPresent();<a name="line.2683"></a>
-<span class="sourceLineNo">2684</span>  }<a name="line.2684"></a>
-<span class="sourceLineNo">2685</span><a name="line.2685"></a>
-<span class="sourceLineNo">2686</span>  /**<a name="line.2686"></a>
-<span class="sourceLineNo">2687</span>   * Execute multiple actions on a table: get, mutate, and/or execCoprocessor<a name="line.2687"></a>
-<span class="sourceLineNo">2688</span>   * @param rpcc the RPC controller<a name="line.2688"></a>
-<span class="sourceLineNo">2689</span>   * @param request the multi request<a name="line.2689"></a>
-<span class="sourceLineNo">2690</span>   * @throws ServiceException<a name="line.2690"></a>
-<span class="sourceLineNo">2691</span>   */<a name="line.2691"></a>
-<span class="sourceLineNo">2692</span>  @Override<a name="line.2692"></a>
-<span class="sourceLineNo">2693</span>  public MultiResponse multi(final RpcController rpcc, final MultiRequest request)<a name="line.2693"></a>
-<span class="sourceLineNo">2694</span>      throws ServiceException {<a name="line.2694"></a>
-<span class="sourceLineNo">2695</span>    try {<a name="line.2695"></a>
-<span class="sourceLineNo">2696</span>      checkOpen();<a name="line.2696"></a>
-<span class="sourceLineNo">2697</span>    } catch (IOException ie) {<a name="line.2697"></a>
-<span class="sourceLineNo">2698</span>      throw new ServiceException(ie);<a name="line.2698"></a>
-<span class="sourceLineNo">2699</span>    }<a name="line.2699"></a>
-<span class="sourceLineNo">2700</span><a name="line.2700"></a>
-<span class="sourceLineNo">2701</span>    checkBatchSizeAndLogLargeSize(request);<a name="line.2701"></a>
+<span class="sourceLineNo">2488</span>    TableName table = region.getRegionInfo().getTable();<a name="line.2488"></a>
+<span class="sourceLineNo">2489</span>    ReplicationSourceService service = regionServer.getReplicationSourceService();<a name="line.2489"></a>
+<span class="sourceLineNo">2490</span>    return service != null &amp;&amp; service.getSyncReplicationPeerInfoProvider()<a name="line.2490"></a>
+<span class="sourceLineNo">2491</span>            .checkState(table, RejectRequestsFromClientStateChecker.get());<a name="line.2491"></a>
+<span class="sourceLineNo">2492</span>  }<a name="line.2492"></a>
+<span class="sourceLineNo">2493</span><a name="line.2493"></a>
+<span class="sourceLineNo">2494</span>  private void rejectIfInStandByState(HRegion region) throws DoNotRetryIOException {<a name="line.2494"></a>
+<span class="sourceLineNo">2495</span>    if (shouldRejectRequestsFromClient(region)) {<a name="line.2495"></a>
+<span class="sourceLineNo">2496</span>      throw new DoNotRetryIOException(<a name="line.2496"></a>
+<span class="sourceLineNo">2497</span>        region.getRegionInfo().getRegionNameAsString() + " is in STANDBY state.");<a name="line.2497"></a>
+<span class="sourceLineNo">2498</span>    }<a name="line.2498"></a>
+<span class="sourceLineNo">2499</span>  }<a name="line.2499"></a>
+<span class="sourceLineNo">2500</span><a name="line.2500"></a>
+<span class="sourceLineNo">2501</span>  /**<a name="line.2501"></a>
+<span class="sourceLineNo">2502</span>   * Get data from a table.<a name="line.2502"></a>
+<span class="sourceLineNo">2503</span>   *<a name="line.2503"></a>
+<span class="sourceLineNo">2504</span>   * @param controller the RPC controller<a name="line.2504"></a>
+<span class="sourceLineNo">2505</span>   * @param request the get request<a name="line.2505"></a>
+<span class="sourceLineNo">2506</span>   * @throws ServiceException<a name="line.2506"></a>
+<span class="sourceLineNo">2507</span>   */<a name="line.2507"></a>
+<span class="sourceLineNo">2508</span>  @Override<a name="line.2508"></a>
+<span class="sourceLineNo">2509</span>  public GetResponse get(final RpcController controller, final GetRequest request)<a name="line.2509"></a>
+<span class="sourceLineNo">2510</span>      throws ServiceException {<a name="line.2510"></a>
+<span class="sourceLineNo">2511</span>    long before = EnvironmentEdgeManager.currentTime();<a name="line.2511"></a>
+<span class="sourceLineNo">2512</span>    OperationQuota quota = null;<a name="line.2512"></a>
+<span class="sourceLineNo">2513</span>    HRegion region = null;<a name="line.2513"></a>
+<span class="sourceLineNo">2514</span>    try {<a name="line.2514"></a>
+<span class="sourceLineNo">2515</span>      checkOpen();<a name="line.2515"></a>
+<span class="sourceLineNo">2516</span>      requestCount.increment();<a name="line.2516"></a>
+<span class="sourceLineNo">2517</span>      rpcGetRequestCount.increment();<a name="line.2517"></a>
+<span class="sourceLineNo">2518</span>      region = getRegion(request.getRegion());<a name="line.2518"></a>
+<span class="sourceLineNo">2519</span>      rejectIfInStandByState(region);<a name="line.2519"></a>
+<span class="sourceLineNo">2520</span><a name="line.2520"></a>
+<span class="sourceLineNo">2521</span>      GetResponse.Builder builder = GetResponse.newBuilder();<a name="line.2521"></a>
+<span class="sourceLineNo">2522</span>      ClientProtos.Get get = request.getGet();<a name="line.2522"></a>
+<span class="sourceLineNo">2523</span>      // An asynchbase client, https://github.com/OpenTSDB/asynchbase, starts by trying to do<a name="line.2523"></a>
+<span class="sourceLineNo">2524</span>      // a get closest before. Throwing the UnknownProtocolException signals it that it needs<a name="line.2524"></a>
+<span class="sourceLineNo">2525</span>      // to switch and do hbase2 protocol (HBase servers do not tell clients what versions<a name="line.2525"></a>
+<span class="sourceLineNo">2526</span>      // they are; its a problem for non-native clients like asynchbase. HBASE-20225.<a name="line.2526"></a>
+<span class="sourceLineNo">2527</span>      if (get.hasClosestRowBefore() &amp;&amp; get.getClosestRowBefore()) {<a name="line.2527"></a>
+<span class="sourceLineNo">2528</span>        throw new UnknownProtocolException("Is this a pre-hbase-1.0.0 or asynchbase client? " +<a name="line.2528"></a>
+<span class="sourceLineNo">2529</span>            "Client is invoking getClosestRowBefore removed in hbase-2.0.0 replaced by " +<a name="line.2529"></a>
+<span class="sourceLineNo">2530</span>            "reverse Scan.");<a name="line.2530"></a>
+<span class="sourceLineNo">2531</span>      }<a name="line.2531"></a>
+<span class="sourceLineNo">2532</span>      Boolean existence = null;<a name="line.2532"></a>
+<span class="sourceLineNo">2533</span>      Result r = null;<a name="line.2533"></a>
+<span class="sourceLineNo">2534</span>      RpcCallContext context = RpcServer.getCurrentCall().orElse(null);<a name="line.2534"></a>
+<span class="sourceLineNo">2535</span>      quota = getRpcQuotaManager().checkQuota(region, OperationQuota.OperationType.GET);<a name="line.2535"></a>
+<span class="sourceLineNo">2536</span><a name="line.2536"></a>
+<span class="sourceLineNo">2537</span>      Get clientGet = ProtobufUtil.toGet(get);<a name="line.2537"></a>
+<span class="sourceLineNo">2538</span>      if (get.getExistenceOnly() &amp;&amp; region.getCoprocessorHost() != null) {<a name="line.2538"></a>
+<span class="sourceLineNo">2539</span>        existence = region.getCoprocessorHost().preExists(clientGet);<a name="line.2539"></a>
+<span class="sourceLineNo">2540</span>      }<a name="line.2540"></a>
+<span class="sourceLineNo">2541</span>      if (existence == null) {<a name="line.2541"></a>
+<span class="sourceLineNo">2542</span>        if (context != null) {<a name="line.2542"></a>
+<span class="sourceLineNo">2543</span>          r = get(clientGet, (region), null, context);<a name="line.2543"></a>
+<span class="sourceLineNo">2544</span>        } else {<a name="line.2544"></a>
+<span class="sourceLineNo">2545</span>          // for test purpose<a name="line.2545"></a>
+<span class="sourceLineNo">2546</span>          r = region.get(clientGet);<a name="line.2546"></a>
+<span class="sourceLineNo">2547</span>        }<a name="line.2547"></a>
+<span class="sourceLineNo">2548</span>        if (get.getExistenceOnly()) {<a name="line.2548"></a>
+<span class="sourceLineNo">2549</span>          boolean exists = r.getExists();<a name="line.2549"></a>
+<span class="sourceLineNo">2550</span>          if (region.getCoprocessorHost() != null) {<a name="line.2550"></a>
+<span class="sourceLineNo">2551</span>            exists = region.getCoprocessorHost().postExists(clientGet, exists);<a name="line.2551"></a>
+<span class="sourceLineNo">2552</span>          }<a name="line.2552"></a>
+<span class="sourceLineNo">2553</span>          existence = exists;<a name="line.2553"></a>
+<span class="sourceLineNo">2554</span>        }<a name="line.2554"></a>
+<span class="sourceLineNo">2555</span>      }<a name="line.2555"></a>
+<span class="sourceLineNo">2556</span>      if (existence != null) {<a name="line.2556"></a>
+<span class="sourceLineNo">2557</span>        ClientProtos.Result pbr =<a name="line.2557"></a>
+<span class="sourceLineNo">2558</span>            ProtobufUtil.toResult(existence, region.getRegionInfo().getReplicaId() != 0);<a name="line.2558"></a>
+<span class="sourceLineNo">2559</span>        builder.setResult(pbr);<a name="line.2559"></a>
+<span class="sourceLineNo">2560</span>      } else if (r != null) {<a name="line.2560"></a>
+<span class="sourceLineNo">2561</span>        ClientProtos.Result pbr;<a name="line.2561"></a>
+<span class="sourceLineNo">2562</span>        if (isClientCellBlockSupport(context) &amp;&amp; controller instanceof HBaseRpcController<a name="line.2562"></a>
+<span class="sourceLineNo">2563</span>            &amp;&amp; VersionInfoUtil.hasMinimumVersion(context.getClientVersionInfo(), 1, 3)) {<a name="line.2563"></a>
+<span class="sourceLineNo">2564</span>          pbr = ProtobufUtil.toResultNoData(r);<a name="line.2564"></a>
+<span class="sourceLineNo">2565</span>          ((HBaseRpcController) controller).setCellScanner(CellUtil.createCellScanner(r<a name="line.2565"></a>
+<span class="sourceLineNo">2566</span>              .rawCells()));<a name="line.2566"></a>
+<span class="sourceLineNo">2567</span>          addSize(context, r, null);<a name="line.2567"></a>
+<span class="sourceLineNo">2568</span>        } else {<a name="line.2568"></a>
+<span class="sourceLineNo">2569</span>          pbr = ProtobufUtil.toResult(r);<a name="line.2569"></a>
+<span class="sourceLineNo">2570</span>        }<a name="line.2570"></a>
+<span class="sourceLineNo">2571</span>        builder.setResult(pbr);<a name="line.2571"></a>
+<span class="sourceLineNo">2572</span>      }<a name="line.2572"></a>
+<span class="sourceLineNo">2573</span>      if (r != null) {<a name="line.2573"></a>
+<span class="sourceLineNo">2574</span>        quota.addGetResult(r);<a name="line.2574"></a>
+<span class="sourceLineNo">2575</span>      }<a name="line.2575"></a>
+<span class="sourceLineNo">2576</span>      return builder.build();<a name="line.2576"></a>
+<span class="sourceLineNo">2577</span>    } catch (IOException ie) {<a name="line.2577"></a>
+<span class="sourceLineNo">2578</span>      throw new ServiceException(ie);<a name="line.2578"></a>
+<span class="sourceLineNo">2579</span>    } finally {<a name="line.2579"></a>
+<span class="sourceLineNo">2580</span>      MetricsRegionServer mrs = regionServer.metricsRegionServer;<a name="line.2580"></a>
+<span class="sourceLineNo">2581</span>      if (mrs != null) {<a name="line.2581"></a>
+<span class="sourceLineNo">2582</span>        TableDescriptor td = region != null? region.getTableDescriptor(): null;<a name="line.2582"></a>
+<span class="sourceLineNo">2583</span>        if (td != null) {<a name="line.2583"></a>
+<span class="sourceLineNo">2584</span>          mrs.updateGet(td.getTableName(), EnvironmentEdgeManager.currentTime() - before);<a name="line.2584"></a>
+<span class="sourceLineNo">2585</span>        }<a name="line.2585"></a>
+<span class="sourceLineNo">2586</span>      }<a name="line.2586"></a>
+<span class="sourceLineNo">2587</span>      if (quota != null) {<a name="line.2587"></a>
+<span class="sourceLineNo">2588</span>        quota.close();<a name="line.2588"></a>
+<span class="sourceLineNo">2589</span>      }<a name="line.2589"></a>
+<span class="sourceLineNo">2590</span>    }<a name="line.2590"></a>
+<span class="sourceLineNo">2591</span>  }<a name="line.2591"></a>
+<span class="sourceLineNo">2592</span><a name="line.2592"></a>
+<span class="sourceLineNo">2593</span>  private Result get(Get get, HRegion region, RegionScannersCloseCallBack closeCallBack,<a name="line.2593"></a>
+<span class="sourceLineNo">2594</span>      RpcCallContext context) throws IOException {<a name="line.2594"></a>
+<span class="sourceLineNo">2595</span>    region.prepareGet(get);<a name="line.2595"></a>
+<span class="sourceLineNo">2596</span>    boolean stale = region.getRegionInfo().getReplicaId() != 0;<a name="line.2596"></a>
+<span class="sourceLineNo">2597</span><a name="line.2597"></a>
+<span class="sourceLineNo">2598</span>    // This method is almost the same as HRegion#get.<a name="line.2598"></a>
+<span class="sourceLineNo">2599</span>    List&lt;Cell&gt; results = new ArrayList&lt;&gt;();<a name="line.2599"></a>
+<span class="sourceLineNo">2600</span>    long before = EnvironmentEdgeManager.currentTime();<a name="line.2600"></a>
+<span class="sourceLineNo">2601</span>    // pre-get CP hook<a name="line.2601"></a>
+<span class="sourceLineNo">2602</span>    if (region.getCoprocessorHost() != null) {<a name="line.2602"></a>
+<span class="sourceLineNo">2603</span>      if (region.getCoprocessorHost().preGet(get, results)) {<a name="line.2603"></a>
+<span class="sourceLineNo">2604</span>        region.metricsUpdateForGet(results, before);<a name="line.2604"></a>
+<span class="sourceLineNo">2605</span>        return Result<a name="line.2605"></a>
+<span class="sourceLineNo">2606</span>            .create(results, get.isCheckExistenceOnly() ? !results.isEmpty() : null, stale);<a name="line.2606"></a>
+<span class="sourceLineNo">2607</span>      }<a name="line.2607"></a>
+<span class="sourceLineNo">2608</span>    }<a name="line.2608"></a>
+<span class="sourceLineNo">2609</span>    Scan scan = new Scan(get);<a name="line.2609"></a>
+<span class="sourceLineNo">2610</span>    if (scan.getLoadColumnFamiliesOnDemandValue() == null) {<a name="line.2610"></a>
+<span class="sourceLineNo">2611</span>      scan.setLoadColumnFamiliesOnDemand(region.isLoadingCfsOnDemandDefault());<a name="line.2611"></a>
+<span class="sourceLineNo">2612</span>    }<a name="line.2612"></a>
+<span class="sourceLineNo">2613</span>    RegionScannerImpl scanner = null;<a name="line.2613"></a>
+<span class="sourceLineNo">2614</span>    try {<a name="line.2614"></a>
+<span class="sourceLineNo">2615</span>      scanner = region.getScanner(scan);<a name="line.2615"></a>
+<span class="sourceLineNo">2616</span>      scanner.next(results);<a name="line.2616"></a>
+<span class="sourceLineNo">2617</span>    } finally {<a name="line.2617"></a>
+<span class="sourceLineNo">2618</span>      if (scanner != null) {<a name="line.2618"></a>
+<span class="sourceLineNo">2619</span>        if (closeCallBack == null) {<a name="line.2619"></a>
+<span class="sourceLineNo">2620</span>          // If there is a context then the scanner can be added to the current<a name="line.2620"></a>
+<span class="sourceLineNo">2621</span>          // RpcCallContext. The rpc callback will take care of closing the<a name="line.2621"></a>
+<span class="sourceLineNo">2622</span>          // scanner, for eg in case<a name="line.2622"></a>
+<span class="sourceLineNo">2623</span>          // of get()<a name="line.2623"></a>
+<span class="sourceLineNo">2624</span>          context.setCallBack(scanner);<a name="line.2624"></a>
+<span class="sourceLineNo">2625</span>        } else {<a name="line.2625"></a>
+<span class="sourceLineNo">2626</span>          // The call is from multi() where the results from the get() are<a name="line.2626"></a>
+<span class="sourceLineNo">2627</span>          // aggregated and then send out to the<a name="line.2627"></a>
+<span class="sourceLineNo">2628</span>          // rpc. The rpccall back will close all such scanners created as part<a name="line.2628"></a>
+<span class="sourceLineNo">2629</span>          // of multi().<a name="line.2629"></a>
+<span class="sourceLineNo">2630</span>          closeCallBack.addScanner(scanner);<a name="line.2630"></a>
+<span class="sourceLineNo">2631</span>        }<a name="line.2631"></a>
+<span class="sourceLineNo">2632</span>      }<a name="line.2632"></a>
+<span class="sourceLineNo">2633</span>    }<a name="line.2633"></a>
+<span class="sourceLineNo">2634</span><a name="line.2634"></a>
+<span class="sourceLineNo">2635</span>    // post-get CP hook<a name="line.2635"></a>
+<span class="sourceLineNo">2636</span>    if (region.getCoprocessorHost() != null) {<a name="line.2636"></a>
+<span class="sourceLineNo">2637</span>      region.getCoprocessorHost().postGet(get, results);<a name="line.2637"></a>
+<span class="sourceLineNo">2638</span>    }<a name="line.2638"></a>
+<span class="sourceLineNo">2639</span>    region.metricsUpdateForGet(results, before);<a name="line.2639"></a>
+<span class="sourceLineNo">2640</span><a name="line.2640"></a>
+<span class="sourceLineNo">2641</span>    return Result.create(results, get.isCheckExistenceOnly() ? !results.isEmpty() : null, stale);<a name="line.2641"></a>
+<span class="sourceLineNo">2642</span>  }<a name="line.2642"></a>
+<span class="sourceLineNo">2643</span><a name="line.2643"></a>
+<span class="sourceLineNo">2644</span>  private void checkBatchSizeAndLogLargeSize(MultiRequest request) {<a name="line.2644"></a>
+<span class="sourceLineNo">2645</span>    int sum = 0;<a name="line.2645"></a>
+<span class="sourceLineNo">2646</span>    String firstRegionName = null;<a name="line.2646"></a>
+<span class="sourceLineNo">2647</span>    for (RegionAction regionAction : request.getRegionActionList()) {<a name="line.2647"></a>
+<span class="sourceLineNo">2648</span>      if (sum == 0) {<a name="line.2648"></a>
+<span class="sourceLineNo">2649</span>        firstRegionName = Bytes.toStringBinary(regionAction.getRegion().getValue().toByteArray());<a name="line.2649"></a>
+<span class="sourceLineNo">2650</span>      }<a name="line.2650"></a>
+<span class="sourceLineNo">2651</span>      sum += regionAction.getActionCount();<a name="line.2651"></a>
+<span class="sourceLineNo">2652</span>    }<a name="line.2652"></a>
+<span class="sourceLineNo">2653</span>    if (sum &gt; rowSizeWarnThreshold) {<a name="line.2653"></a>
+<span class="sourceLineNo">2654</span>      ld.logBatchWarning(firstRegionName, sum, rowSizeWarnThreshold);<a name="line.2654"></a>
+<span class="sourceLineNo">2655</span>    }<a name="line.2655"></a>
+<span class="sourceLineNo">2656</span>  }<a name="line.2656"></a>
+<span class="sourceLineNo">2657</span><a name="line.2657"></a>
+<span class="sourceLineNo">2658</span>  private void failRegionAction(MultiResponse.Builder responseBuilder,<a name="line.2658"></a>
+<span class="sourceLineNo">2659</span>      RegionActionResult.Builder regionActionResultBuilder, RegionAction regionAction,<a name="line.2659"></a>
+<span class="sourceLineNo">2660</span>      CellScanner cellScanner, Throwable error) {<a name="line.2660"></a>
+<span class="sourceLineNo">2661</span>    rpcServer.getMetrics().exception(error);<a name="line.2661"></a>
+<span class="sourceLineNo">2662</span>    regionActionResultBuilder.setException(ResponseConverter.buildException(error));<a name="line.2662"></a>
+<span class="sourceLineNo">2663</span>    responseBuilder.addRegionActionResult(regionActionResultBuilder.build());<a name="line.2663"></a>
+<span class="sourceLineNo">2664</span>    // All Mutations in this RegionAction not executed as we can not see the Region online here<a name="line.2664"></a>
+<span class="sourceLineNo">2665</span>    // in this RS. Will be retried from Client. Skipping all the Cells in CellScanner<a name="line.2665"></a>
+<span class="sourceLineNo">2666</span>    // corresponding to these Mutations.<a name="line.2666"></a>
+<span class="sourceLineNo">2667</span>    if (cellScanner != null) {<a name="line.2667"></a>
+<span class="sourceLineNo">2668</span>      skipCellsForMutations(regionAction.getActionList(), cellScanner);<a name="line.2668"></a>
+<span class="sourceLineNo">2669</span>    }<a name="line.2669"></a>
+<span class="sourceLineNo">2670</span>  }<a name="line.2670"></a>
+<span class="sourceLineNo">2671</span><a name="line.2671"></a>
+<span class="sourceLineNo">2672</span>  private boolean isReplicationRequest(Action action) {<a name="line.2672"></a>
+<span class="sourceLineNo">2673</span>    // replication request can only be put or delete.<a name="line.2673"></a>
+<span class="sourceLineNo">2674</span>    if (!action.hasMutation()) {<a name="line.2674"></a>
+<span class="sourceLineNo">2675</span>      return false;<a name="line.2675"></a>
+<span class="sourceLineNo">2676</span>    }<a name="line.2676"></a>
+<span class="sourceLineNo">2677</span>    MutationProto mutation = action.getMutation();<a name="line.2677"></a>
+<span class="sourceLineNo">2678</span>    MutationType type = mutation.getMutateType();<a name="line.2678"></a>
+<span class="sourceLineNo">2679</span>    if (type != MutationType.PUT &amp;&amp; type != MutationType.DELETE) {<a name="line.2679"></a>
+<span class="sourceLineNo">2680</span>      return false;<a name="line.2680"></a>
+<span class="sourceLineNo">2681</span>    }<a name="line.2681"></a>
+<span class="sourceLineNo">2682</span>    // replication will set a special attribute so we can make use of it to decide whether a request<a name="line.2682"></a>
+<span class="sourceLineNo">2683</span>    // is for replication.<a name="line.2683"></a>
+<span class="sourceLineNo">2684</span>    return mutation.getAttributeList().stream().map(p -&gt; p.getName())<a name="line.2684"></a>
+<span class="sourceLineNo">2685</span>      .filter(n -&gt; n.equals(ReplicationUtils.REPLICATION_ATTR_NAME)).findAny().isPresent();<a name="line.2685"></a>
+<span class="sourceLineNo">2686</span>  }<a name="line.2686"></a>
+<span class="sourceLineNo">2687</span><a name="line.2687"></a>
+<span class="sourceLineNo">2688</span>  /**<a name="line.2688"></a>
+<span class="sourceLineNo">2689</span>   * Execute multiple actions on a table: get, mutate, and/or execCoprocessor<a name="line.2689"></a>
+<span class="sourceLineNo">2690</span>   * @param rpcc the RPC controller<a name="line.2690"></a>
+<span class="sourceLineNo">2691</span>   * @param request the multi request<a name="line.2691"></a>
+<span class="sourceLineNo">2692</span>   * @throws ServiceException<a name="line.2692"></a>
+<span class="sourceLineNo">2693</span>   */<a name="line.2693"></a>
+<span class="sourceLineNo">2694</span>  @Override<a name="line.2694"></a>
+<span class="sourceLineNo">2695</span>  public MultiResponse multi(final RpcController rpcc, final MultiRequest request)<a name="line.2695"></a>
+<span class="sourceLineNo">2696</span>      throws ServiceException {<a name="line.2696"></a>
+<span class="sourceLineNo">2697</span>    try {<a name="line.2697"></a>
+<span class="sourceLineNo">2698</span>      checkOpen();<a name="line.2698"></a>
+<span class="sourceLineNo">2699</span>    } catch (IOException ie) {<a name="line.2699"></a>
+<span class="sourceLineNo">2700</span>      throw new ServiceException(ie);<a name="line.2700"></a>
+<span class="sourceLineNo">2701</span>    }<a name="line.2701"></a>
 <span class="sourceLineNo">2702</span><a name="line.2702"></a>
-<span class="sourceLineNo">2703</span>    // rpc controller is how we bring in data via the back door;  it is unprotobuf'ed data.<a name="line.2703"></a>
-<span class="sourceLineNo">2704</span>    // It is also the conduit via which we pass back data.<a name="line.2704"></a>
-<span class="sourceLineNo">2705</span>    HBaseRpcController controller = (HBaseRpcController)rpcc;<a name="line.2705"></a>
-<span class="sourceLineNo">2706</span>    CellScanner cellScanner = controller != null ? controller.cellScanner(): null;<a name="line.2706"></a>
-<span class="sourceLineNo">2707</span>    if (controller != null) {<a name="line.2707"></a>
-<span class="sourceLineNo">2708</span>      controller.setCellScanner(null);<a name="line.2708"></a>
-<span class="sourceLineNo">2709</span>    }<a name="line.2709"></a>
-<span class="sourceLineNo">2710</span><a name="line.2710"></a>
-<span class="sourceLineNo">2711</span>    long nonceGroup = request.hasNonceGroup() ? request.getNonceGroup() : HConstants.NO_NONCE;<a name="line.2711"></a>
+<span class="sourceLineNo">2703</span>    checkBatchSizeAndLogLargeSize(request);<a name="line.2703"></a>
+<span class="sourceLineNo">2704</span><a name="line.2704"></a>
+<span class="sourceLineNo">2705</span>    // rpc controller is how we bring in data via the back door;  it is unprotobuf'ed data.<a name="line.2705"></a>
+<span class="sourceLineNo">2706</span>    // It is also the conduit via which we pass back data.<a name="line.2706"></a>
+<span class="sourceLineNo">2707</span>    HBaseRpcController controller = (HBaseRpcController)rpcc;<a name="line.2707"></a>
+<span class="sourceLineNo">2708</span>    CellScanner cellScanner = controller != null ? controller.cellScanner(): null;<a name="line.2708"></a>
+<span class="sourceLineNo">2709</span>    if (controller != null) {<a name="line.2709"></a>
+<span class="sourceLineNo">2710</span>      controller.setCellScanner(null);<a name="line.2710"></a>
+<span class="sourceLineNo">2711</span>    }<a name="line.2711"></a>
 <span class="sourceLineNo">2712</span><a name="line.2712"></a>
-<span class="sourceLineNo">2713</span>    // this will contain all the cells that we need to return. It's created later, if needed.<a name="line.2713"></a>
-<span class="sourceLineNo">2714</span>    List&lt;CellScannable&gt; cellsToReturn = null;<a name="line.2714"></a>
-<span class="sourceLineNo">2715</span>    MultiResponse.Builder responseBuilder = MultiResponse.newBuilder();<a name="line.2715"></a>
-<span class="sourceLineNo">2716</span>    RegionActionResult.Builder regionActionResultBuilder = RegionActionResult.newBuilder();<a name="line.2716"></a>
-<span class="sourceLineNo">2717</span>    Boolean processed = null;<a name="line.2717"></a>
-<span class="sourceLineNo">2718</span>    RegionScannersCloseCallBack closeCallBack = null;<a name="line.2718"></a>
-<span class="sourceLineNo">2719</span>    RpcCallContext context = RpcServer.getCurrentCall().orElse(null);<a name="line.2719"></a>
-<span class="sourceLineNo">2720</span>    this.rpcMultiRequestCount.increment();<a name="line.2720"></a>
-<span class="sourceLineNo">2721</span>    this.requestCount.increment();<a name="line.2721"></a>
-<span class="sourceLineNo">2722</span>    Map&lt;RegionSpecifier, ClientProtos.RegionLoadStats&gt; regionStats = new HashMap&lt;&gt;(request<a name="line.2722"></a>
-<span class="sourceLineNo">2723</span>      .getRegionActionCount());<a name="line.2723"></a>
-<span class="sourceLineNo">2724</span>    ActivePolicyEnforcement spaceQuotaEnforcement = getSpaceQuotaManager().getActiveEnforcements();<a name="line.2724"></a>
-<span class="sourceLineNo">2725</span>    for (RegionAction regionAction : request.getRegionActionList()) {<a name="line.2725"></a>
-<span class="sourceLineNo">2726</span>      OperationQuota quota;<a name="line.2726"></a>
-<span class="sourceLineNo">2727</span>      HRegion region;<a name="line.2727"></a>
-<span class="sourceLineNo">2728</span>      regionActionResultBuilder.clear();<a name="line.2728"></a>
-<span class="sourceLineNo">2729</span>      RegionSpecifier regionSpecifier = regionAction.getRegion();<a name="line.2729"></a>
-<span class="sourceLineNo">2730</span>      try {<a name="line.2730"></a>
-<span class="sourceLineNo">2731</span>        region = getRegion(regionSpecifier);<a name="line.2731"></a>
-<span class="sourceLineNo">2732</span>        quota = getRpcQuotaManager().checkQuota(region, regionAction.getActionList());<a name="line.2732"></a>
-<span class="sourceLineNo">2733</span>      } catch (IOException e) {<a name="line.2733"></a>
-<span class="sourceLineNo">2734</span>        failRegionAction(responseBuilder, regionActionResultBuilder, regionAction, cellScanner, e);<a name="line.2734"></a>
-<span class="sourceLineNo">2735</span>        continue;  // For this region it's a failure.<a name="line.2735"></a>
-<span class="sourceLineNo">2736</span>      }<a name="line.2736"></a>
-<span class="sourceLineNo">2737</span>      boolean rejectIfFromClient = shouldRejectRequestsFromClient(region);<a name="line.2737"></a>
-<span class="sourceLineNo">2738</span>      if (regionAction.hasAtomic() &amp;&amp; regionAction.getAtomic()) {<a name="line.2738"></a>
-<span class="sourceLineNo">2739</span>        // We only allow replication in standby state and it will not set the atomic flag.<a name="line.2739"></a>
-<span class="sourceLineNo">2740</span>        if (rejectIfFromClient) {<a name="line.2740"></a>
-<span class="sourceLineNo">2741</span>          failRegionAction(responseBuilder, regionActionResultBuilder, regionAction, cellScanner,<a name="line.2741"></a>
-<span class="sourceLineNo">2742</span>            new DoNotRetryIOException(<a name="line.2742"></a>
-<span class="sourceLineNo">2743</span>              region.getRegionInfo().getRegionNameAsString() + " is in STANDBY state"));<a name="line.2743"></a>
-<span class="sourceLineNo">2744</span>          quota.close();<a name="line.2744"></a>
-<span class="sourceLineNo">2745</span>          continue;<a name="line.2745"></a>
-<span class="sourceLineNo">2746</span>        }<a name="line.2746"></a>
-<span class="sourceLineNo">2747</span>        // How does this call happen?  It may need some work to play well w/ the surroundings.<a name="line.2747"></a>
-<span class="sourceLineNo">2748</span>        // Need to return an item per Action along w/ Action index.  TODO.<a name="line.2748"></a>
-<span class="sourceLineNo">2749</span>        try {<a name="line.2749"></a>
-<span class="sourceLineNo">2750</span>          if (request.hasCondition()) {<a name="line.2750"></a>
-<span class="sourceLineNo">2751</span>            Condition condition = request.getCondition();<a name="line.2751"></a>
-<span class="sourceLineNo">2752</span>            byte[] row = condition.getRow().toByteArray();<a name="line.2752"></a>
-<span class="sourceLineNo">2753</span>            byte[] family = condition.getFamily().toByteArray();<a name="line.2753"></a>
-<span class="sourceLineNo">2754</span>            byte[] qualifier = condition.getQualifier().toByteArray();<a name="line.2754"></a>
-<span class="sourceLineNo">2755</span>            CompareOperator op =<a name="line.2755"></a>
-<span class="sourceLineNo">2756</span>              CompareOperator.valueOf(condition.getCompareType().name());<a name="line.2756"></a>
-<span class="sourceLineNo">2757</span>            ByteArrayComparable comparator =<a name="line.2757"></a>
-<span class="sourceLineNo">2758</span>                ProtobufUtil.toComparator(condition.getComparator());<a name="line.2758"></a>
-<span class="sourceLineNo">2759</span>            TimeRange timeRange = condition.hasTimeRange() ?<a name="line.2759"></a>
-<span class="sourceLineNo">2760</span>              ProtobufUtil.toTimeRange(condition.getTimeRange()) :<a name="line.2760"></a>
-<span class="sourceLineNo">2761</span>              TimeRange.allTime();<a name="line.2761"></a>
-<span class="sourceLineNo">2762</span>            processed =<a name="line.2762"></a>
-<span class="sourceLineNo">2763</span>              checkAndRowMutate(region, regionAction.getActionList(), cellScanner, row, family,<a name="line.2763"></a>
-<span class="sourceLineNo">2764</span>                qualifier, op, comparator, timeRange, regionActionResultBuilder,<a name="line.2764"></a>
-<span class="sourceLineNo">2765</span>                spaceQuotaEnforcement);<a name="line.2765"></a>
-<span class="sourceLineNo">2766</span>          } else {<a name="line.2766"></a>
-<span class="sourceLineNo">2767</span>            doAtomicBatchOp(regionActionResultBuilder, region, quota, regionAction.getActionList(),<a name="line.2767"></a>
-<span class="sourceLineNo">2768</span>              cellScanner, spaceQuotaEnforcement);<a name="line.2768"></a>
-<span class="sourceLineNo">2769</span>            processed = Boolean.TRUE;<a name="line.2769"></a>
-<span class="sourceLineNo">2770</span>          }<a name="line.2770"></a>
-<span class="sourceLineNo">2771</span>        } catch (IOException e) {<a name="line.2771"></a>
-<span class="sourceLineNo">2772</span>          rpcServer.getMetrics().exception(e);<a name="line.2772"></a>
-<span class="sourceLineNo">2773</span>          // As it's atomic, we may expect it's a global failure.<a name="line.2773"></a>
-<span class="sourceLineNo">2774</span>          regionActionResultBuilder.setException(ResponseConverter.buildException(e));<a name="line.2774"></a>
-<span class="sourceLineNo">2775</span>        }<a name="line.2775"></a>
-<span class="sourceLineNo">2776</span>      } else {<a name="line.2776"></a>
-<span class="sourceLineNo">2777</span>        if (rejectIfFromClient &amp;&amp; regionAction.getActionCount() &gt; 0 &amp;&amp;<a name="line.2777"></a>
-<span class="sourceLineNo">2778</span>          !isReplicationRequest(regionAction.getAction(0))) {<a name="line.2778"></a>
-<span class="sourceLineNo">2779</span>          // fail if it is not a replication request<a name="line.2779"></a>
-<span class="sourceLineNo">2780</span>          failRegionAction(responseBuilder, regionActionResultBuilder, regionAction, cellScanner,<a name="line.2780"></a>
-<span class="sourceLineNo">2781</span>            new DoNotRetryIOException(<a name="line.2781"></a>
-<span class="sourceLineNo">2782</span>              region.getRegionInfo().getRegionNameAsString() + " is in STANDBY state"));<a name="line.2782"></a>
-<span class="sourceLineNo">2783</span>          quota.close();<a name="line.2783"></a>
-<span class="sourceLineNo">2784</span>          continue;<a name="line.2784"></a>
-<span class="sourceLineNo">2785</span>        }<a name="line.2785"></a>
-<span class="sourceLineNo">2786</span>        // doNonAtomicRegionMutation manages the exception internally<a name="line.2786"></a>
-<span class="sourceLineNo">2787</span>        if (context != null &amp;&amp; closeCallBack == null) {<a name="line.2787"></a>
-<span class="sourceLineNo">2788</span>          // An RpcCallBack that creates a list of scanners that needs to perform callBack<a name="line.2788"></a>
-<span class="sourceLineNo">2789</span>          // operation on completion of multiGets.<a name="line.2789"></a>
-<span class="sourceLineNo">2790</span>          // Set this only once<a name="line.2790"></a>
-<span class="sourceLineNo">2791</span>          closeCallBack = new RegionScannersCloseCallBack();<a name="line.2791"></a>
-<span class="sourceLineNo">2792</span>          context.setCallBack(closeCallBack);<a name="line.2792"></a>
-<span class="sourceLineNo">2793</span>        }<a name="line.2793"></a>
-<span class="sourceLineNo">2794</span>        cellsToReturn = doNonAtomicRegionMutation(region, quota, regionAction, cellScanner,<a name="line.2794"></a>
-<span class="sourceLineNo">2795</span>            regionActionResultBuilder, cellsToReturn, nonceGroup, closeCallBack, context,<a name="line.2795"></a>
-<span class="sourceLineNo">2796</span>            spaceQuotaEnforcement);<a name="line.2796"></a>
-<span class="sourceLineNo">2797</span>      }<a name="line.2797"></a>
-<span class="sourceLineNo">2798</span>      responseBuilder.addRegionActionResult(regionActionResultBuilder.build());<a name="line.2798"></a>
-<span class="sourceLineNo">2799</span>      quota.close();<a name="line.2799"></a>
-<span class="sourceLineNo">2800</span>      ClientProtos.RegionLoadStats regionLoadStats = region.getLoadStatistics();<a name="line.2800"></a>
-<span class="sourceLineNo">2801</span>      if (regionLoadStats != null) {<a name="line.2801"></a>
-<span class="sourceLineNo">2802</span>        regionStats.put(regionSpecifier, regionLoadStats);<a name="line.2802"></a>
-<span class="sourceLineNo">2803</span>      }<a name="line.2803"></a>
-<span class="sourceLineNo">2804</span>    }<a name="line.2804"></a>
-<span class="sourceLineNo">2805</span>    // Load the controller with the Cells to return.<a name="line.2805"></a>
-<span class="sourceLineNo">2806</span>    if (cellsToReturn != null &amp;&amp; !cellsToReturn.isEmpty() &amp;&amp; controller != null) {<a name="line.2806"></a>
-<span class="sourceLineNo">2807</span>      controller.setCellScanner(CellUtil.createCellScanner(cellsToReturn));<a name="line.2807"></a>
-<span class="sourceLineNo">2808</span>    }<a name="line.2808"></a>
-<span class="sourceLineNo">2809</span><a name="line.2809"></a>
-<span class="sourceLineNo">2810</span>    if (processed != null) {<a name="line.2810"></a>
-<span class="sourceLineNo">2811</span>      responseBuilder.setProcessed(processed);<a name="line.2811"></a>
-<span class="sourceLineNo">2812</span>    }<a name="line.2812"></a>
-<span class="sourceLineNo">2813</span><a name="line.2813"></a>
-<span class="sourceLineNo">2814</span>    MultiRegionLoadStats.Builder builder = MultiRegionLoadStats.newBuilder();<a name="line.2814"></a>
-<span class="sourceLineNo">2815</span>    for(Entry&lt;RegionSpecifier, ClientProtos.RegionLoadStats&gt; stat: regionStats.entrySet()){<a name="line.2815"></a>
-<span class="sourceLineNo">2816</span>      builder.addRegion(stat.getKey());<a name="line.2816"></a>
-<span class="sourceLineNo">2817</span>      builder.addStat(stat.getValue());<a name="line.2817"></a>
-<span class="sourceLineNo">2818</span>    }<a name="line.2818"></a>
-<span class="sourceLineNo">2819</span>    responseBuilder.setRegionStatistics(builder);<a name="line.2819"></a>
-<span class="sourceLineNo">2820</span>    return responseBuilder.build();<a name="line.2820"></a>
-<span class="sourceLineNo">2821</span>  }<a name="line.2821"></a>
-<span class="sourceLineNo">2822</span><a name="line.2822"></a>
-<span class="sourceLineNo">2823</span>  private void skipCellsForMutations(List&lt;Action&gt; actions, CellScanner cellScanner) {<a name="line.2823"></a>
-<span class="sourceLineNo">2824</span>    if (cellScanner == null) {<a name="line.2824"></a>
-<span class="sourceLineNo">2825</span>      return;<a name="line.2825"></a>
-<span class="sourceLineNo">2826</span>    }<a name="line.2826"></a>
-<span class="sourceLineNo">2827</span>    for (Action action : actions) {<a name="line.2827"></a>
-<span class="sourceLineNo">2828</span>      skipCellsForMutation(action, cellScanner);<a name="line.2828"></a>
-<span class="sourceLineNo">2829</span>    }<a name="line.2829"></a>
-<span class="sourceLineNo">2830</span>  }<a name="line.2830"></a>
-<span class="sourceLineNo">2831</span><a name="line.2831"></a>
-<span class="sourceLineNo">2832</span>  private void skipCellsForMutation(Action action, CellScanner cellScanner) {<a name="line.2832"></a>
-<span class="sourceLineNo">2833</span>    if (cellScanner == null) {<a name="line.2833"></a>
-<span class="sourceLineNo">2834</span>      return;<a name="line.2834"></a>
-<span class="sourceLineNo">2835</span>    }<a name="line.2835"></a>
-<span class="sourceLineNo">2836</span>    try {<a name="line.2836"></a>
-<span class="sourceLineNo">2837</span>      if (action.hasMutation()) {<a name="line.2837"></a>
-<span class="sourceLineNo">2838</span>        MutationProto m = action.getMutation();<a name="line.2838"></a>
-<span class="sourceLineNo">2839</span>        if (m.hasAssociatedCellCount()) {<a name="line.2839"></a>
-<span class="sourceLineNo">2840</span>          for (int i = 0; i &lt; m.getAssociatedCellCount(); i++) {<a name="line.2840"></a>
-<span class="sourceLineNo">2841</span>            cellScanner.advance();<a name="line.2841"></a>
-<span class="sourceLineNo">2842</span>          }<a name="line.2842"></a>
-<span class="sourceLineNo">2843</span>        }<a name="line.2843"></a>
-<span class="sourceLineNo">2844</span>      }<a name="line.2844"></a>
-<span class="sourceLineNo">2845</span>    } catch (IOException e) {<a name="line.2845"></a>
-<span class="sourceLineNo">2846</span>      // No need to handle these Individual Muatation level issue. Any way this entire RegionAction<a name="line.2846"></a>
-<span class="sourceLineNo">2847</span>      // marked as failed as we could not see the Region here. At client side the top level<a name="line.2847"></a>
-<span class="sourceLineNo">2848</span>      // RegionAction exception will be considered first.<a name="line.2848"></a>
-<span class="sourceLineNo">2849</span>      LOG.error("Error while skipping Cells in CellScanner for invalid Region Mutations", e);<a name="line.2849"></a>
-<span class="sourceLineNo">2850</span>    }<a name="line.2850"></a>
-<span class="sourceLineNo">2851</span>  }<a name="line.2851"></a>
-<span class="sourceLineNo">2852</span><a name="line.2852"></a>
-<span class="sourceLineNo">2853</span>  /**<a name="line.2853"></a>
-<span class="sourceLineNo">2854</span>   * Mutate data in a table.<a name="line.2854"></a>
-<span class="sourceLineNo">2855</span>   *<a name="line.2855"></a>
-<span class="sourceLineNo">2856</span>   * @param rpcc the RPC controller<a name="line.2856"></a>
-<span class="sourceLineNo">2857</span>   * @param request the mutate request<a name="line.2857"></a>
-<span class="sourceLineNo">2858</span>   */<a name="line.2858"></a>
-<span class="sourceLineNo">2859</span>  @Override<a name="line.2859"></a>
-<span class="sourceLineNo">2860</span>  public MutateResponse mutate(final RpcController rpcc, final MutateRequest request)<a name="line.2860"></a>
-<span class="sourceLineNo">2861</span>      throws ServiceException {<a name="line.2861"></a>
-<span class="sourceLineNo">2862</span>    // rpc controller is how we bring in data via the back door;  it is unprotobuf'ed data.<a name="line.2862"></a>
-<span class="sourceLineNo">2863</span>    // It is also the conduit via which we pass back data.<a name="line.2863"></a>
-<span class="sourceLineNo">2864</span>    HBaseRpcController controller = (HBaseRpcController)rpcc;<a name="line.2864"></a>
-<span class="sourceLineNo">2865</span>    CellScanner cellScanner = controller != null ? controller.cellScanner() : null;<a name="line.2865"></a>
-<span class="sourceLineNo">2866</span>    OperationQuota quota = null;<a name="line.2866"></a>
-<span class="sourceLineNo">2867</span>    RpcCallContext context = RpcServer.getCurrentCall().orElse(null);<a name="line.2867"></a>
-<span class="sourceLineNo">2868</span>    ActivePolicyEnforcement spaceQuotaEnforcement = null;<a name="line.2868"></a>
-<span class="sourceLineNo">2869</span>    MutationType type = null;<a name="line.2869"></a>
-<span class="sourceLineNo">2870</span>    HRegion region = null;<a name="line.2870"></a>
-<span class="sourceLineNo">2871</span>    long before = EnvironmentEdgeManager.currentTime();<a name="line.2871"></a>
-<span class="sourceLineNo">2872</span>    // Clear scanner so we are not holding on to reference across call.<a name="line.2872"></a>
-<span class="sourceLineNo">2873</span>    if (controller != null) {<a name="line.2873"></a>
-<span class="sourceLineNo">2874</span>      controller.setCellScanner(null);<a name="line.2874"></a>
-<span class="sourceLineNo">2875</span>    }<a name="line.2875"></a>
-<span class="sourceLineNo">2876</span>    try {<a name="line.2876"></a>
-<span class="sourceLineNo">2877</span>      checkOpen();<a name="line.2877"></a>
-<span class="sourceLineNo">2878</span>      requestCount.increment();<a name="line.2878"></a>
-<span class="sourceLineNo">2879</span>      rpcMutateRequestCount.increment();<a name="line.2879"></a>
-<span class="sourceLineNo">2880</span>      region = getRegion(request.getRegion());<a name="line.2880"></a>
-<span class="sourceLineNo">2881</span>      rejectIfInStandByState(region);<a name="line.2881"></a>
-<span class="sourceLineNo">2882</span>      MutateResponse.Builder builder = MutateResponse.newBuilder();<a name="line.2882"></a>
-<span class="sourceLineNo">2883</span>      MutationProto mutation = request.getMutation();<a name="line.2883"></a>
-<span class="sourceLineNo">2884</span>      if (!region.getRegionInfo().isMetaRegion()) {<a name="line.2884"></a>
-<span class="sourceLineNo">2885</span>        regionServer.cacheFlusher.reclaimMemStoreMemory();<a name="line.2885"></a>
-<span class="sourceLineNo">2886</span>      }<a name="line.2886"></a>
-<span class="sourceLineNo">2887</span>      long nonceGroup = request.hasNonceGroup() ? request.getNonceGroup() : HConstants.NO_NONCE;<a name="line.2887"></a>
-<span class="sourceLineNo">2888</span>      Result r = null;<a name="line.2888"></a>
-<span class="sourceLineNo">2889</span>      Boolean processed = null;<a name="line.2889"></a>
-<span class="sourceLineNo">2890</span>      type = mutation.getMutateType();<a name="line.2890"></a>
-<span class="sourceLineNo">2891</span><a name="line.2891"></a>
-<span class="sourceLineNo">2892</span>      quota = getRpcQuotaManager().checkQuota(region, OperationQuota.OperationType.MUTATE);<a name="line.2892"></a>
-<span class="sourceLineNo">2893</span>      spaceQuotaEnforcement = getSpaceQuotaManager().getActiveEnforcements();<a name="line.2893"></a>
-<span class="sourceLineNo">2894</span><a name="line.2894"></a>
-<span class="sourceLineNo">2895</span>      switch (type) {<a name="line.2895"></a>
-<span class="sourceLineNo">2896</span>        case APPEND:<a name="line.2896"></a>
-<span class="sourceLineNo">2897</span>          // TODO: this doesn't actually check anything.<a name="line.2897"></a>
-<span class="sourceLineNo">2898</span>          r = append(region, quota, mutation, cellScanner, nonceGroup, spaceQuotaEnforcement);<a name="line.2898"></a>
-<span class="sourceLineNo">2899</span>          break;<a name="line.2899"></a>
-<span class="sourceLineNo">2900</span>        case INCREMENT:<a name="line.2900"></a>
-<span class="sourceLineNo">2901</span>          // TODO: this doesn't actually check anything.<a name="line.2901"></a>
-<span class="sourceLineNo">2902</span>          r = increment(region, quota, mutation, cellScanner, nonceGroup, spaceQuotaEnforcement);<a name="line.2902"></a>
-<span class="sourceLineNo">2903</span>          break;<a name="line.2903"></a>
-<span class="sourceLineNo">2904</span>        case PUT:<a name="line.2904"></a>
-<span class="sourceLineNo">2905</span>          Put put = ProtobufUtil.toPut(mutation, cellScanner);<a name="line.2905"></a>
-<span class="sourceLineNo">2906</span>          checkCellSizeLimit(region, put);<a name="line.2906"></a>
-<span class="sourceLineNo">2907</span>          // Throws an exception when violated<a name="line.2907"></a>
-<span class="sourceLineNo">2908</span>          spaceQuotaEnforcement.getPolicyEnforcement(region).check(put);<a name="line.2908"></a>
-<span class="sourceLineNo">2909</span>          quota.addMutation(put);<a name="line.2909"></a>
-<span class="sourceLineNo">2910</span>          if (request.hasCondition()) {<a name="line.2910"></a>
-<span class="sourceLineNo">2911</span>            Condition condition = request.getCondition();<a name="line.2911"></a>
-<span class="sourceLineNo">2912</span>            byte[] row = condition.getRow().toByteArray();<a name="line.2912"></a>
-<span class="sourceLineNo">2913</span>            byte[] family = condition.getFamily().toByteArray();<a name="line.2913"></a>
-<span class="sourceLineNo">2914</span>            byte[] qualifier = condition.getQualifier().toByteArray();<a name="line.2914"></a>
-<span class="sourceLineNo">2915</span>            CompareOperator compareOp =<a name="line.2915"></a>
-<span class="sourceLineNo">2916</span>              CompareOperator.valueOf(condition.getCompareType().name());<a name="line.2916"></a>
-<span class="sourceLineNo">2917</span>            ByteArrayComparable comparator = ProtobufUtil.toComparator(condition.getComparator());<a name="line.2917"></a>
-<span class="sourceLineNo">2918</span>            TimeRange timeRange = condition.hasTimeRange() ?<a name="line.2918"></a>
-<span class="sourceLineNo">2919</span>              ProtobufUtil.toTimeRange(condition.getTimeRange()) :<a name="line.2919"></a>
-<span class="sourceLineNo">2920</span>              TimeRange.allTime();<a name="line.2920"></a>
-<span class="sourceLineNo">2921</span>            if (region.getCoprocessorHost() != null) {<a name="line.2921"></a>
-<span class="sourceLineNo">2922</span>              processed = region.getCoprocessorHost().preCheckAndPut(row, family, qualifier,<a name="line.2922"></a>
-<span class="sourceLineNo">2923</span>                  compareOp, comparator, put);<a name="line.2923"></a>
-<span class="sourceLineNo">2924</span>            }<a name="line.2924"></a>
-<span class="sourceLineNo">2925</span>            if (processed == null) {<a name="line.2925"></a>
-<span class="sourceLineNo">2926</span>              boolean result = region.checkAndMutate(row, family,<a name="line.2926"></a>
-<span class="sourceLineNo">2927</span>                qualifier, compareOp, comparator, timeRange, put);<a name="line.2927"></a>
-<span class="sourceLineNo">2928</span>              if (region.getCoprocessorHost() != null) {<a name="line.2928"></a>
-<span class="sourceLineNo">2929</span>                result = region.getCoprocessorHost().postCheckAndPut(row, family,<a name="line.2929"></a>
-<span class="sourceLineNo">2930</span>                  qualifier, compareOp, comparator, put, result);<a name="line.2930"></a>
-<span class="sourceLineNo">2931</span>              }<a name="line.2931"></a>
-<span class="sourceLineNo">2932</span>              processed = result;<a name="line.2932"></a>
-<span class="sourceLineNo">2933</span>            }<a name="line.2933"></a>
-<span class="sourceLineNo">2934</span>          } else {<a name="line.2934"></a>
-<span class="sourceLineNo">2935</span>            region.put(put);<a name="line.2935"></a>
-<span class="sourceLineNo">2936</span>            processed = Boolean.TRUE;<a name="line.2936"></a>
-<span class="sourceLineNo">2937</span>          }<a name="line.2937"></a>
-<span class="sourceLineNo">2938</span>          break;<a name="line.2938"></a>
-<span class="sourceLineNo">2939</span>        case DELETE:<a name="line.2939"></a>
-<span class="sourceLineNo">2940</span>          Delete delete = ProtobufUtil.toDelete(mutation, cellScanner);<a name="line.2940"></a>
-<span class="sourceLineNo">2941</span>          checkCellSizeLimit(region, delete);<a name="line.2941"></a>
-<span class="sourceLineNo">2942</span>          spaceQuotaEnforcement.getPolicyEnforcement(region).check(delete);<a name="line.2942"></a>
-<span class="sourceLineNo">2943</span>          quota.addMutation(delete);<a name="line.2943"></a>
-<span class="sourceLineNo">2944</span>          if (request.hasCondition()) {<a name="line.2944"></a>
-<span class="sourceLineNo">2945</span>            Condition condition = request.getCondition();<a name="line.2945"></a>
-<span class="sourceLineNo">2946</span>            byte[] row = condition.getRow().toByteArray();<a name="line.2946"></a>
-<span class="sourceLineNo">2947</span>            byte[] family = condition.getFamily().toByteArray();<a name="line.2947"></a>
-<span class="sourceLineNo">2948</span>            byte[] qualifier = condition.getQualifier().toByteArray();<a name="line.2948"></a>
-<span class="sourceLineNo">2949</span>            CompareOperator op = CompareOperator.valueOf(condition.getCompareType().name());<a name="line.2949"></a>
-<span class="sourceLineNo">2950</span>            ByteArrayComparable comparator = ProtobufUtil.toComparator(condition.getComparator());<a name="line.2950"></a>
-<span class="sourceLineNo">2951</span>            TimeRange timeRange = condition.hasTimeRange() ?<a name="line.2951"></a>
-<span class="sourceLineNo">2952</span>              ProtobufUtil.toTimeRange(condition.getTimeRange()) :<a name="line.2952"></a>
-<span class="sourceLineNo">2953</span>              TimeRange.allTime();<a name="line.2953"></a>
-<span class="sourceLineNo">2954</span>            if (region.getCoprocessorHost() != null) {<a name="line.2954"></a>
-<span class="sourceLineNo">2955</span>              processed = region.getCoprocessorHost().preCheckAndDelete(row, family, qualifier, op,<a name="line.2955"></a>
-<span class="sourceLineNo">2956</span>                  comparator, delete);<a name="line.2956"></a>
-<span class="sourceLineNo">2957</span>            }<a name="line.2957"></a>
-<span class="sourceLineNo">2958</span>            if (processed == null) {<a name="line.2958"></a>
-<span class="sourceLineNo">2959</span>              boolean result = region.checkAndMutate(row, family,<a name="line.2959"></a>
-<span class="sourceLineNo">2960</span>                qualifier, op, comparator, timeRange, delete);<a name="line.2960"></a>
-<span class="sourceLineNo">2961</span>              if (region.getCoprocessorHost() != null) {<a name="line.2961"></a>
-<span class="sourceLineNo">2962</span>                result = region.getCoprocessorHost().postCheckAndDelete(row, family,<a name="line.2962"></a>
-<span class="sourceLineNo">2963</span>                  qualifier, op, comparator, delete, result);<a name="line.2963"></a>
-<span class="sourceLineNo">2964</span>              }<a name="line.2964"></a>
-<span class="sourceLineNo">2965</span>              processed = result;<a name="line.2965"></a>
-<span class="sourceLineNo">2966</span>            }<a name="line.2966"></a>
-<span class="sourceLineNo">2967</span>          } else {<a name="line.2967"></a>
-<span class="sourceLineNo">2968</span>            region.delete(delete);<a name="line.2968"></a>
-<span class="sourceLineNo">2969</span>            processed = Boolean.TRUE;<a name="line.2969"></a>
-<span class="sourceLineNo">2970</span>          }<a name="line.2970"></a>
-<span class="sourceLineNo">2971</span>          break;<a name="line.2971"></a>
-<span class="sourceLineNo">2972</span>        default:<a name="line.2972"></a>
-<span class="sourceLineNo">2973</span>          throw new DoNotRetryIOException("Unsupported mutate type: " + type.name());<a name="line.2973"></a>
-<span class="sourceLineNo">2974</span>      }<a name="line.2974"></a>
-<span class="sourceLineNo">2975</span>      if (processed != null) {<a name="line.2975"></a>
-<span class="sourceLineNo">2976</span>        builder.setProcessed(processed.booleanValue());<a name="line.2976"></a>
-<span class="sourceLineNo">2977</span>      }<a name="line.2977"></a>
-<span class="sourceLineNo">2978</span>      boolean clientCellBlockSupported = isClientCellBlockSupport(context);<a name="line.2978"></a>
-<span class="sourceLineNo">2979</span>      addResult(builder, r, controller, clientCellBlockSupported);<a name="line.2979"></a>
-<span class="sourceLineNo">2980</span>      if (clientCellBlockSupported) {<a name="line.2980"></a>
-<span class="sourceLineNo">2981</span>        addSize(context, r, null);<a name="line.2981"></a>
-<span class="sourceLineNo">2982</span>      }<a name="line.2982"></a>
-<span class="sourceLineNo">2983</span>      return builder.build();<a name="line.2983"></a>
-<span class="sourceLineNo">2984</span>    } catch (IOException ie) {<a name="line.2984"></a>
-<span class="sourceLineNo">2985</span>      regionServer.checkFileSystem();<a name="line.2985"></a>
-<span class="sourceLineNo">2986</span>      throw new ServiceException(ie);<a name="line.2986"></a>
-<span class="sourceLineNo">2987</span>    } finally {<a name="line.2987"></a>
-<span class="sourceLineNo">2988</span>      if (quota != null) {<a name="line.2988"></a>
-<span class="sourceLineNo">2989</span>        quota.close();<a name="line.2989"></a>
-<span class="sourceLineNo">2990</span>      }<a name="line.2990"></a>
-<span class="sourceLineNo">2991</span>      // Update metrics<a name="line.2991"></a>
-<span class="sourceLineNo">2992</span>      if (regionServer.metricsRegionServer != null &amp;&amp; type != null) {<a name="line.2992"></a>
-<span class="sourceLineNo">2993</span>        long after = EnvironmentEdgeManager.currentTime();<a name="line.2993"></a>
-<span class="sourceLineNo">2994</span>        switch (type) {<a name="line.2994"></a>
-<span class="sourceLineNo">2995</span>        case DELETE:<a name="line.2995"></a>
-<span class="sourceLineNo">2996</span>          if (request.hasCondition()) {<a name="line.2996"></a>
-<span class="sourceLineNo">2997</span>            regionServer.metricsRegionServer.updateCheckAndDelete(after - before);<a name="line.2997"></a>
-<span class="sourceLineNo">2998</span>          } else {<a name="line.2998"></a>
-<span class="sourceLineNo">2999</span>            regionServer.metricsRegionServer.updateDelete(<a name="line.2999"></a>
-<span class="sourceLineNo">3000</span>                region == null ? null : region.getRegionInfo().getTable(), after - before);<a name="line.3000"></a>
-<span class="sourceLineNo">3001</span>          }<a name="line.3001"></a>
-<span class="sourceLineNo">3002</span>          break;<a name="line.3002"></a>
-<span class="sourceLineNo">3003</span>        case PUT:<a name="line.3003"></a>
-<span class="sourceLineNo">3004</span>          if (request.hasCondition()) {<a name="line.3004"></a>
-<span class="sourceLineNo">3005</span>            regionServer.metricsRegionServer.updateCheckAndPut(after - before);<a name="line.3005"></a>
-<span class="sourceLineNo">3006</span>          } else {<a name="line.3006"></a>
-<span class="sourceLineNo">3007</span>            regionServer.metricsRegionServer.updatePut(<a name="line.3007"></a>
-<span class="sourceLineNo">3008</span>                region == null ? null : region.getRegionInfo().getTable(),after - before);<a name="line.3008"></a>
-<span class="sourceLineNo">3009</span>          }<a name="line.3009"></a>
-<span class="sourceLineNo">3010</span>          break;<a name="line.3010"></a>
-<span class="sourceLineNo">3011</span>        default:<a name="line.3011"></a>
+<span class="sourceLineNo">2713</span>    long nonceGroup = request.hasNonceGroup() ? request.getNonceGroup() : HConstants.NO_NONCE;<a name="line.2713"></a>
+<span class="sourceLineNo">2714</span><a name="line.2714"></a>
+<span class="sourceLineNo">2715</span>    // this will contain all the cells that we need to return. It's created later, if needed.<a name="line.2715"></a>
+<span class="sourceLineNo">2716</span>    List&lt;CellScannable&gt; cellsToReturn = null;<a name="line.2716"></a>
+<span class="sourceLineNo">2717</span>    MultiResponse.Builder responseBuilder = MultiResponse.newBuilder();<a name="line.2717"></a>
+<span class="sourceLineNo">2718</span>    RegionActionResult.Builder regionActionResultBuilder = RegionActionResult.newBuilder();<a name="line.2718"></a>
+<span class="sourceLineNo">2719</span>    Boolean processed = null;<a name="line.2719"></a>
+<span class="sourceLineNo">2720</span>    RegionScannersCloseCallBack closeCallBack = null;<a name="line.2720"></a>
+<span class="sourceLineNo">2721</span>    RpcCallContext context = RpcServer.getCurrentCall().orElse(null);<a name="line.2721"></a>
+<span class="sourceLineNo">2722</span>    this.rpcMultiRequestCount.increment();<a name="line.2722"></a>
+<span class="sourceLineNo">2723</span>    this.requestCount.increment();<a name="line.2723"></a>
+<span class="sourceLineNo">2724</span>    Map&lt;RegionSpecifier, ClientProtos.RegionLoadStats&gt; regionStats = new HashMap&lt;&gt;(request<a name="line.2724"></a>
+<span class="sourceLineNo">2725</span>      .getRegionActionCount());<a name="line.2725"></a>
+<span class="sourceLineNo">2726</span>    ActivePolicyEnforcement spaceQuotaEnforcement = getSpaceQuotaManager().getActiveEnforcements();<a name="line.2726"></a>
+<span class="sourceLineNo">2727</span>    for (RegionAction regionAction : request.getRegionActionList()) {<a name="line.2727"></a>
+<span class="sourceLineNo">2728</span>      OperationQuota quota;<a name="line.2728"></a>
+<span class="sourceLineNo">2729</span>      HRegion region;<a name="line.2729"></a>
+<span class="sourceLineNo">2730</span>      regionActionResultBuilder.clear();<a name="line.2730"></a>
+<span class="sourceLineNo">2731</span>      RegionSpecifier regionSpecifier = regionAction.getRegion();<a name="line.2731"></a>
+<span class="sourceLineNo">2732</span>      try {<a name="line.2732"></a>
+<span class="sourceLineNo">2733</span>        region = getRegion(regionSpecifier);<a name="line.2733"></a>
+<span class="sourceLineNo">2734</span>        quota = getRpcQuotaManager().checkQuota(region, regionAction.getActionList());<a name="line.2734"></a>
+<span class="sourceLineNo">2735</span>      } catch (IOException e) {<a name="line.2735"></a>
+<span class="sourceLineNo">2736</span>        failRegionAction(responseBuilder, regionActionResultBuilder, regionAction, cellScanner, e);<a name="line.2736"></a>
+<span class="sourceLineNo">2737</span>        continue;  // For this region it's a failure.<a name="line.2737"></a>
+<span class="sourceLineNo">2738</span>      }<a name="line.2738"></a>
+<span class="sourceLineNo">2739</span>      boolean rejectIfFromClient = shouldRejectRequestsFromClient(region);<a name="line.2739"></a>
+<span class="sourceLineNo">2740</span>      if (regionAction.hasAtomic() &amp;&amp; regionAction.getAtomic()) {<a name="line.2740"></a>
+<span class="sourceLineNo">2741</span>        // We only allow replication in standby state and it will not set the atomic flag.<a name="line.2741"></a>
+<span class="sourceLineNo">2742</span>        if (rejectIfFromClient) {<a name="line.2742"></a>
+<span class="sourceLineNo">2743</span>          failRegionAction(responseBuilder, regionActionResultBuilder, regionAction, cellScanner,<a name="line.2743"></a>
+<span class="sourceLineNo">2744</span>            new DoNotRetryIOException(<a name="line.2744"></a>
+<span class="sourceLineNo">2745</span>              region.getRegionInfo().getRegionNameAsString() + " is in STANDBY state"));<a name="line.2745"></a>
+<span class="sourceLineNo">2746</span>          quota.close();<a name="line.2746"></a>
+<span class="sourceLineNo">2747</span>          continue;<a name="line.2747"></a>
+<span class="sourceLineNo">2748</span>        }<a name="line.2748"></a>
+<span class="sourceLineNo">2749</span>        // How does this call happen?  It may need some work to play well w/ the surroundings.<a name="line.2749"></a>
+<span class="sourceLineNo">2750</span>        // Need to return an item per Action along w/ Action index.  TODO.<a name="line.2750"></a>
+<span class="sourceLineNo">2751</span>        try {<a name="line.2751"></a>
+<span class="sourceLineNo">2752</span>          if (request.hasCondition()) {<a name="line.2752"></a>
+<span class="sourceLineNo">2753</span>            Condition condition = request.getCondition();<a name="line.2753"></a>
+<span class="sourceLineNo">2754</span>            byte[] row = condition.getRow().toByteArray();<a name="line.2754"></a>
+<span class="sourceLineNo">2755</span>            byte[] family = condition.getFamily().toByteArray();<a name="line.2755"></a>
+<span class="sourceLineNo">2756</span>            byte[] qualifier = condition.getQualifier().toByteArray();<a name="line.2756"></a>
+<span class="sourceLineNo">2757</span>            CompareOperator op =<a name="line.2757"></a>
+<span class="sourceLineNo">2758</span>              CompareOperator.valueOf(condition.getCompareType().name());<a name="line.2758"></a>
+<span class="sourceLineNo">2759</span>            ByteArrayComparable comparator =<a name="line.2759"></a>
+<span class="sourceLineNo">2760</span>                ProtobufUtil.toComparator(condition.getComparator());<a name="line.2760"></a>
+<span class="sourceLineNo">2761</span>            TimeRange timeRange = condition.hasTimeRange() ?<a name="line.2761"></a>
+<span class="sourceLineNo">2762</span>              ProtobufUtil.toTimeRange(condition.getTimeRange()) :<a name="line.2762"></a>
+<span class="sourceLineNo">2763</span>              TimeRange.allTime();<a name="line.2763"></a>
+<span class="sourceLineNo">2764</span>            processed =<a name="line.2764"></a>
+<span class="sourceLineNo">2765</span>              checkAndRowMutate(region, regionAction.getActionList(), cellScanner, row, family,<a name="line.2765"></a>
+<span class="sourceLineNo">2766</span>                qualifier, op, comparator, timeRange, regionActionResultBuilder,<a name="line.2766"></a>
+<span class="sourceLineNo">2767</span>                spaceQuotaEnforcement);<a name="line.2767"></a>
+<span class="sourceLineNo">2768</span>          } else {<a name="line.2768"></a>
+<span class="sourceLineNo">2769</span>            doAtomicBatchOp(regionActionResultBuilder, region, quota, regionAction.getActionList(),<a name="line.2769"></a>
+<span class="sourceLineNo">2770</span>              cellScanner, spaceQuotaEnforcement);<a name="line.2770"></a>
+<span class="sourceLineNo">2771</span>            processed = Boolean.TRUE;<a name="line.2771"></a>
+<span class="sourceLineNo">2772</span>          }<a name="line.2772"></a>
+<span class="sourceLineNo">2773</span>        } catch (IOException e) {<a name="line.2773"></a>
+<span class="sourceLineNo">2774</span>          rpcServer.getMetrics().exception(e);<a name="line.2774"></a>
+<span class="sourceLineNo">2775</span>          // As it's atomic, we may expect it's a global failure.<a name="line.2775"></a>
+<span class="sourceLineNo">2776</span>          regionActionResultBuilder.setException(ResponseConverter.buildException(e));<a name="line.2776"></a>
+<span class="sourceLineNo">2777</span>        }<a name="line.2777"></a>
+<span class="sourceLineNo">2778</span>      } else {<a name="line.2778"></a>
+<span class="sourceLineNo">2779</span>        if (rejectIfFromClient &amp;&amp; regionAction.getActionCount() &gt; 0 &amp;&amp;<a name="line.2779"></a>
+<span class="sourceLineNo">2780</span>          !isReplicationRequest(regionAction.getAction(0))) {<a name="line.2780"></a>
+<span class="sourceLineNo">2781</span>          // fail if it is not a replication request<a name="line.2781"></a>
+<span class="sourceLineNo">2782</span>          failRegionAction(responseBuilder, regionActionResultBuilder, regionAction, cellScanner,<a name="line.2782"></a>
+<span class="sourceLineNo">2783</span>            new DoNotRetryIOException(<a name="line.2783"></a>
+<span class="sourceLineNo">2784</span>              region.getRegionInfo().getRegionNameAsString() + " is in STANDBY state"));<a name="line.2784"></a>
+<span class="sourceLineNo">2785</span>          quota.close();<a name="line.2785"></a>
+<span class="sourceLineNo">2786</span>          continue;<a name="line.2786"></a>
+<span class="sourceLineNo">2787</span>        }<a name="line.2787"></a>
+<span class="sourceLineNo">2788</span>        // doNonAtomicRegionMutation manages the exception internally<a name="line.2788"></a>
+<span class="sourceLineNo">2789</span>        if (context != null &amp;&amp; closeCallBack == null) {<a name="line.2789"></a>
+<span class="sourceLineNo">2790</span>          // An RpcCallBack that creates a list of scanners that needs to perform callBack<a name="line.2790"></a>
+<span class="sourceLineNo">2791</span>          // operation on completion of multiGets.<a name="line.2791"></a>
+<span class="sourceLineNo">2792</span>          // Set this only once<a name="line.2792"></a>
+<span class="sourceLineNo">2793</span>          closeCallBack = new RegionScannersCloseCallBack();<a name="line.2793"></a>
+<span class="sourceLineNo">2794</span>          context.setCallBack(closeCallBack);<a name="line.2794"></a>
+<span class="sourceLineNo">2795</span>        }<a name="line.2795"></a>
+<span class="sourceLineNo">2796</span>        cellsToReturn = doNonAtomicRegionMutation(region, quota, regionAction, cellScanner,<a name="line.2796"></a>
+<span class="sourceLineNo">2797</span>            regionActionResultBuilder, cellsToReturn, nonceGroup, closeCallBack, context,<a name="line.2797"></a>
+<span class="sourceLineNo">2798</span>            spac

<TRUNCATED>

[05/46] hbase-site git commit: Published site at 05d22ed960204183fbd9bd16f1dbca6410ccde76.

Posted by gi...@apache.org.
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/3649682c/devapidocs/src-html/org/apache/hadoop/hbase/regionserver/RSRpcServices.html
----------------------------------------------------------------------
diff --git a/devapidocs/src-html/org/apache/hadoop/hbase/regionserver/RSRpcServices.html b/devapidocs/src-html/org/apache/hadoop/hbase/regionserver/RSRpcServices.html
index 20e3eaa..b257d07 100644
--- a/devapidocs/src-html/org/apache/hadoop/hbase/regionserver/RSRpcServices.html
+++ b/devapidocs/src-html/org/apache/hadoop/hbase/regionserver/RSRpcServices.html
@@ -2493,1291 +2493,1293 @@
 <span class="sourceLineNo">2485</span>  }<a name="line.2485"></a>
 <span class="sourceLineNo">2486</span><a name="line.2486"></a>
 <span class="sourceLineNo">2487</span>  private boolean shouldRejectRequestsFromClient(HRegion region) {<a name="line.2487"></a>
-<span class="sourceLineNo">2488</span>    return regionServer.getReplicationSourceService().getSyncReplicationPeerInfoProvider()<a name="line.2488"></a>
-<span class="sourceLineNo">2489</span>      .checkState(region.getRegionInfo().getTable(), RejectRequestsFromClientStateChecker.get());<a name="line.2489"></a>
-<span class="sourceLineNo">2490</span>  }<a name="line.2490"></a>
-<span class="sourceLineNo">2491</span><a name="line.2491"></a>
-<span class="sourceLineNo">2492</span>  private void rejectIfInStandByState(HRegion region) throws DoNotRetryIOException {<a name="line.2492"></a>
-<span class="sourceLineNo">2493</span>    if (shouldRejectRequestsFromClient(region)) {<a name="line.2493"></a>
-<span class="sourceLineNo">2494</span>      throw new DoNotRetryIOException(<a name="line.2494"></a>
-<span class="sourceLineNo">2495</span>        region.getRegionInfo().getRegionNameAsString() + " is in STANDBY state.");<a name="line.2495"></a>
-<span class="sourceLineNo">2496</span>    }<a name="line.2496"></a>
-<span class="sourceLineNo">2497</span>  }<a name="line.2497"></a>
-<span class="sourceLineNo">2498</span><a name="line.2498"></a>
-<span class="sourceLineNo">2499</span>  /**<a name="line.2499"></a>
-<span class="sourceLineNo">2500</span>   * Get data from a table.<a name="line.2500"></a>
-<span class="sourceLineNo">2501</span>   *<a name="line.2501"></a>
-<span class="sourceLineNo">2502</span>   * @param controller the RPC controller<a name="line.2502"></a>
-<span class="sourceLineNo">2503</span>   * @param request the get request<a name="line.2503"></a>
-<span class="sourceLineNo">2504</span>   * @throws ServiceException<a name="line.2504"></a>
-<span class="sourceLineNo">2505</span>   */<a name="line.2505"></a>
-<span class="sourceLineNo">2506</span>  @Override<a name="line.2506"></a>
-<span class="sourceLineNo">2507</span>  public GetResponse get(final RpcController controller, final GetRequest request)<a name="line.2507"></a>
-<span class="sourceLineNo">2508</span>      throws ServiceException {<a name="line.2508"></a>
-<span class="sourceLineNo">2509</span>    long before = EnvironmentEdgeManager.currentTime();<a name="line.2509"></a>
-<span class="sourceLineNo">2510</span>    OperationQuota quota = null;<a name="line.2510"></a>
-<span class="sourceLineNo">2511</span>    HRegion region = null;<a name="line.2511"></a>
-<span class="sourceLineNo">2512</span>    try {<a name="line.2512"></a>
-<span class="sourceLineNo">2513</span>      checkOpen();<a name="line.2513"></a>
-<span class="sourceLineNo">2514</span>      requestCount.increment();<a name="line.2514"></a>
-<span class="sourceLineNo">2515</span>      rpcGetRequestCount.increment();<a name="line.2515"></a>
-<span class="sourceLineNo">2516</span>      region = getRegion(request.getRegion());<a name="line.2516"></a>
-<span class="sourceLineNo">2517</span>      rejectIfInStandByState(region);<a name="line.2517"></a>
-<span class="sourceLineNo">2518</span><a name="line.2518"></a>
-<span class="sourceLineNo">2519</span>      GetResponse.Builder builder = GetResponse.newBuilder();<a name="line.2519"></a>
-<span class="sourceLineNo">2520</span>      ClientProtos.Get get = request.getGet();<a name="line.2520"></a>
-<span class="sourceLineNo">2521</span>      // An asynchbase client, https://github.com/OpenTSDB/asynchbase, starts by trying to do<a name="line.2521"></a>
-<span class="sourceLineNo">2522</span>      // a get closest before. Throwing the UnknownProtocolException signals it that it needs<a name="line.2522"></a>
-<span class="sourceLineNo">2523</span>      // to switch and do hbase2 protocol (HBase servers do not tell clients what versions<a name="line.2523"></a>
-<span class="sourceLineNo">2524</span>      // they are; its a problem for non-native clients like asynchbase. HBASE-20225.<a name="line.2524"></a>
-<span class="sourceLineNo">2525</span>      if (get.hasClosestRowBefore() &amp;&amp; get.getClosestRowBefore()) {<a name="line.2525"></a>
-<span class="sourceLineNo">2526</span>        throw new UnknownProtocolException("Is this a pre-hbase-1.0.0 or asynchbase client? " +<a name="line.2526"></a>
-<span class="sourceLineNo">2527</span>            "Client is invoking getClosestRowBefore removed in hbase-2.0.0 replaced by " +<a name="line.2527"></a>
-<span class="sourceLineNo">2528</span>            "reverse Scan.");<a name="line.2528"></a>
-<span class="sourceLineNo">2529</span>      }<a name="line.2529"></a>
-<span class="sourceLineNo">2530</span>      Boolean existence = null;<a name="line.2530"></a>
-<span class="sourceLineNo">2531</span>      Result r = null;<a name="line.2531"></a>
-<span class="sourceLineNo">2532</span>      RpcCallContext context = RpcServer.getCurrentCall().orElse(null);<a name="line.2532"></a>
-<span class="sourceLineNo">2533</span>      quota = getRpcQuotaManager().checkQuota(region, OperationQuota.OperationType.GET);<a name="line.2533"></a>
-<span class="sourceLineNo">2534</span><a name="line.2534"></a>
-<span class="sourceLineNo">2535</span>      Get clientGet = ProtobufUtil.toGet(get);<a name="line.2535"></a>
-<span class="sourceLineNo">2536</span>      if (get.getExistenceOnly() &amp;&amp; region.getCoprocessorHost() != null) {<a name="line.2536"></a>
-<span class="sourceLineNo">2537</span>        existence = region.getCoprocessorHost().preExists(clientGet);<a name="line.2537"></a>
-<span class="sourceLineNo">2538</span>      }<a name="line.2538"></a>
-<span class="sourceLineNo">2539</span>      if (existence == null) {<a name="line.2539"></a>
-<span class="sourceLineNo">2540</span>        if (context != null) {<a name="line.2540"></a>
-<span class="sourceLineNo">2541</span>          r = get(clientGet, (region), null, context);<a name="line.2541"></a>
-<span class="sourceLineNo">2542</span>        } else {<a name="line.2542"></a>
-<span class="sourceLineNo">2543</span>          // for test purpose<a name="line.2543"></a>
-<span class="sourceLineNo">2544</span>          r = region.get(clientGet);<a name="line.2544"></a>
-<span class="sourceLineNo">2545</span>        }<a name="line.2545"></a>
-<span class="sourceLineNo">2546</span>        if (get.getExistenceOnly()) {<a name="line.2546"></a>
-<span class="sourceLineNo">2547</span>          boolean exists = r.getExists();<a name="line.2547"></a>
-<span class="sourceLineNo">2548</span>          if (region.getCoprocessorHost() != null) {<a name="line.2548"></a>
-<span class="sourceLineNo">2549</span>            exists = region.getCoprocessorHost().postExists(clientGet, exists);<a name="line.2549"></a>
-<span class="sourceLineNo">2550</span>          }<a name="line.2550"></a>
-<span class="sourceLineNo">2551</span>          existence = exists;<a name="line.2551"></a>
-<span class="sourceLineNo">2552</span>        }<a name="line.2552"></a>
-<span class="sourceLineNo">2553</span>      }<a name="line.2553"></a>
-<span class="sourceLineNo">2554</span>      if (existence != null) {<a name="line.2554"></a>
-<span class="sourceLineNo">2555</span>        ClientProtos.Result pbr =<a name="line.2555"></a>
-<span class="sourceLineNo">2556</span>            ProtobufUtil.toResult(existence, region.getRegionInfo().getReplicaId() != 0);<a name="line.2556"></a>
-<span class="sourceLineNo">2557</span>        builder.setResult(pbr);<a name="line.2557"></a>
-<span class="sourceLineNo">2558</span>      } else if (r != null) {<a name="line.2558"></a>
-<span class="sourceLineNo">2559</span>        ClientProtos.Result pbr;<a name="line.2559"></a>
-<span class="sourceLineNo">2560</span>        if (isClientCellBlockSupport(context) &amp;&amp; controller instanceof HBaseRpcController<a name="line.2560"></a>
-<span class="sourceLineNo">2561</span>            &amp;&amp; VersionInfoUtil.hasMinimumVersion(context.getClientVersionInfo(), 1, 3)) {<a name="line.2561"></a>
-<span class="sourceLineNo">2562</span>          pbr = ProtobufUtil.toResultNoData(r);<a name="line.2562"></a>
-<span class="sourceLineNo">2563</span>          ((HBaseRpcController) controller).setCellScanner(CellUtil.createCellScanner(r<a name="line.2563"></a>
-<span class="sourceLineNo">2564</span>              .rawCells()));<a name="line.2564"></a>
-<span class="sourceLineNo">2565</span>          addSize(context, r, null);<a name="line.2565"></a>
-<span class="sourceLineNo">2566</span>        } else {<a name="line.2566"></a>
-<span class="sourceLineNo">2567</span>          pbr = ProtobufUtil.toResult(r);<a name="line.2567"></a>
-<span class="sourceLineNo">2568</span>        }<a name="line.2568"></a>
-<span class="sourceLineNo">2569</span>        builder.setResult(pbr);<a name="line.2569"></a>
-<span class="sourceLineNo">2570</span>      }<a name="line.2570"></a>
-<span class="sourceLineNo">2571</span>      if (r != null) {<a name="line.2571"></a>
-<span class="sourceLineNo">2572</span>        quota.addGetResult(r);<a name="line.2572"></a>
-<span class="sourceLineNo">2573</span>      }<a name="line.2573"></a>
-<span class="sourceLineNo">2574</span>      return builder.build();<a name="line.2574"></a>
-<span class="sourceLineNo">2575</span>    } catch (IOException ie) {<a name="line.2575"></a>
-<span class="sourceLineNo">2576</span>      throw new ServiceException(ie);<a name="line.2576"></a>
-<span class="sourceLineNo">2577</span>    } finally {<a name="line.2577"></a>
-<span class="sourceLineNo">2578</span>      MetricsRegionServer mrs = regionServer.metricsRegionServer;<a name="line.2578"></a>
-<span class="sourceLineNo">2579</span>      if (mrs != null) {<a name="line.2579"></a>
-<span class="sourceLineNo">2580</span>        TableDescriptor td = region != null? region.getTableDescriptor(): null;<a name="line.2580"></a>
-<span class="sourceLineNo">2581</span>        if (td != null) {<a name="line.2581"></a>
-<span class="sourceLineNo">2582</span>          mrs.updateGet(td.getTableName(), EnvironmentEdgeManager.currentTime() - before);<a name="line.2582"></a>
-<span class="sourceLineNo">2583</span>        }<a name="line.2583"></a>
-<span class="sourceLineNo">2584</span>      }<a name="line.2584"></a>
-<span class="sourceLineNo">2585</span>      if (quota != null) {<a name="line.2585"></a>
-<span class="sourceLineNo">2586</span>        quota.close();<a name="line.2586"></a>
-<span class="sourceLineNo">2587</span>      }<a name="line.2587"></a>
-<span class="sourceLineNo">2588</span>    }<a name="line.2588"></a>
-<span class="sourceLineNo">2589</span>  }<a name="line.2589"></a>
-<span class="sourceLineNo">2590</span><a name="line.2590"></a>
-<span class="sourceLineNo">2591</span>  private Result get(Get get, HRegion region, RegionScannersCloseCallBack closeCallBack,<a name="line.2591"></a>
-<span class="sourceLineNo">2592</span>      RpcCallContext context) throws IOException {<a name="line.2592"></a>
-<span class="sourceLineNo">2593</span>    region.prepareGet(get);<a name="line.2593"></a>
-<span class="sourceLineNo">2594</span>    boolean stale = region.getRegionInfo().getReplicaId() != 0;<a name="line.2594"></a>
-<span class="sourceLineNo">2595</span><a name="line.2595"></a>
-<span class="sourceLineNo">2596</span>    // This method is almost the same as HRegion#get.<a name="line.2596"></a>
-<span class="sourceLineNo">2597</span>    List&lt;Cell&gt; results = new ArrayList&lt;&gt;();<a name="line.2597"></a>
-<span class="sourceLineNo">2598</span>    long before = EnvironmentEdgeManager.currentTime();<a name="line.2598"></a>
-<span class="sourceLineNo">2599</span>    // pre-get CP hook<a name="line.2599"></a>
-<span class="sourceLineNo">2600</span>    if (region.getCoprocessorHost() != null) {<a name="line.2600"></a>
-<span class="sourceLineNo">2601</span>      if (region.getCoprocessorHost().preGet(get, results)) {<a name="line.2601"></a>
-<span class="sourceLineNo">2602</span>        region.metricsUpdateForGet(results, before);<a name="line.2602"></a>
-<span class="sourceLineNo">2603</span>        return Result<a name="line.2603"></a>
-<span class="sourceLineNo">2604</span>            .create(results, get.isCheckExistenceOnly() ? !results.isEmpty() : null, stale);<a name="line.2604"></a>
-<span class="sourceLineNo">2605</span>      }<a name="line.2605"></a>
-<span class="sourceLineNo">2606</span>    }<a name="line.2606"></a>
-<span class="sourceLineNo">2607</span>    Scan scan = new Scan(get);<a name="line.2607"></a>
-<span class="sourceLineNo">2608</span>    if (scan.getLoadColumnFamiliesOnDemandValue() == null) {<a name="line.2608"></a>
-<span class="sourceLineNo">2609</span>      scan.setLoadColumnFamiliesOnDemand(region.isLoadingCfsOnDemandDefault());<a name="line.2609"></a>
-<span class="sourceLineNo">2610</span>    }<a name="line.2610"></a>
-<span class="sourceLineNo">2611</span>    RegionScannerImpl scanner = null;<a name="line.2611"></a>
-<span class="sourceLineNo">2612</span>    try {<a name="line.2612"></a>
-<span class="sourceLineNo">2613</span>      scanner = region.getScanner(scan);<a name="line.2613"></a>
-<span class="sourceLineNo">2614</span>      scanner.next(results);<a name="line.2614"></a>
-<span class="sourceLineNo">2615</span>    } finally {<a name="line.2615"></a>
-<span class="sourceLineNo">2616</span>      if (scanner != null) {<a name="line.2616"></a>
-<span class="sourceLineNo">2617</span>        if (closeCallBack == null) {<a name="line.2617"></a>
-<span class="sourceLineNo">2618</span>          // If there is a context then the scanner can be added to the current<a name="line.2618"></a>
-<span class="sourceLineNo">2619</span>          // RpcCallContext. The rpc callback will take care of closing the<a name="line.2619"></a>
-<span class="sourceLineNo">2620</span>          // scanner, for eg in case<a name="line.2620"></a>
-<span class="sourceLineNo">2621</span>          // of get()<a name="line.2621"></a>
-<span class="sourceLineNo">2622</span>          context.setCallBack(scanner);<a name="line.2622"></a>
-<span class="sourceLineNo">2623</span>        } else {<a name="line.2623"></a>
-<span class="sourceLineNo">2624</span>          // The call is from multi() where the results from the get() are<a name="line.2624"></a>
-<span class="sourceLineNo">2625</span>          // aggregated and then send out to the<a name="line.2625"></a>
-<span class="sourceLineNo">2626</span>          // rpc. The rpccall back will close all such scanners created as part<a name="line.2626"></a>
-<span class="sourceLineNo">2627</span>          // of multi().<a name="line.2627"></a>
-<span class="sourceLineNo">2628</span>          closeCallBack.addScanner(scanner);<a name="line.2628"></a>
-<span class="sourceLineNo">2629</span>        }<a name="line.2629"></a>
-<span class="sourceLineNo">2630</span>      }<a name="line.2630"></a>
-<span class="sourceLineNo">2631</span>    }<a name="line.2631"></a>
-<span class="sourceLineNo">2632</span><a name="line.2632"></a>
-<span class="sourceLineNo">2633</span>    // post-get CP hook<a name="line.2633"></a>
-<span class="sourceLineNo">2634</span>    if (region.getCoprocessorHost() != null) {<a name="line.2634"></a>
-<span class="sourceLineNo">2635</span>      region.getCoprocessorHost().postGet(get, results);<a name="line.2635"></a>
-<span class="sourceLineNo">2636</span>    }<a name="line.2636"></a>
-<span class="sourceLineNo">2637</span>    region.metricsUpdateForGet(results, before);<a name="line.2637"></a>
-<span class="sourceLineNo">2638</span><a name="line.2638"></a>
-<span class="sourceLineNo">2639</span>    return Result.create(results, get.isCheckExistenceOnly() ? !results.isEmpty() : null, stale);<a name="line.2639"></a>
-<span class="sourceLineNo">2640</span>  }<a name="line.2640"></a>
-<span class="sourceLineNo">2641</span><a name="line.2641"></a>
-<span class="sourceLineNo">2642</span>  private void checkBatchSizeAndLogLargeSize(MultiRequest request) {<a name="line.2642"></a>
-<span class="sourceLineNo">2643</span>    int sum = 0;<a name="line.2643"></a>
-<span class="sourceLineNo">2644</span>    String firstRegionName = null;<a name="line.2644"></a>
-<span class="sourceLineNo">2645</span>    for (RegionAction regionAction : request.getRegionActionList()) {<a name="line.2645"></a>
-<span class="sourceLineNo">2646</span>      if (sum == 0) {<a name="line.2646"></a>
-<span class="sourceLineNo">2647</span>        firstRegionName = Bytes.toStringBinary(regionAction.getRegion().getValue().toByteArray());<a name="line.2647"></a>
-<span class="sourceLineNo">2648</span>      }<a name="line.2648"></a>
-<span class="sourceLineNo">2649</span>      sum += regionAction.getActionCount();<a name="line.2649"></a>
-<span class="sourceLineNo">2650</span>    }<a name="line.2650"></a>
-<span class="sourceLineNo">2651</span>    if (sum &gt; rowSizeWarnThreshold) {<a name="line.2651"></a>
-<span class="sourceLineNo">2652</span>      ld.logBatchWarning(firstRegionName, sum, rowSizeWarnThreshold);<a name="line.2652"></a>
-<span class="sourceLineNo">2653</span>    }<a name="line.2653"></a>
-<span class="sourceLineNo">2654</span>  }<a name="line.2654"></a>
-<span class="sourceLineNo">2655</span><a name="line.2655"></a>
-<span class="sourceLineNo">2656</span>  private void failRegionAction(MultiResponse.Builder responseBuilder,<a name="line.2656"></a>
-<span class="sourceLineNo">2657</span>      RegionActionResult.Builder regionActionResultBuilder, RegionAction regionAction,<a name="line.2657"></a>
-<span class="sourceLineNo">2658</span>      CellScanner cellScanner, Throwable error) {<a name="line.2658"></a>
-<span class="sourceLineNo">2659</span>    rpcServer.getMetrics().exception(error);<a name="line.2659"></a>
-<span class="sourceLineNo">2660</span>    regionActionResultBuilder.setException(ResponseConverter.buildException(error));<a name="line.2660"></a>
-<span class="sourceLineNo">2661</span>    responseBuilder.addRegionActionResult(regionActionResultBuilder.build());<a name="line.2661"></a>
-<span class="sourceLineNo">2662</span>    // All Mutations in this RegionAction not executed as we can not see the Region online here<a name="line.2662"></a>
-<span class="sourceLineNo">2663</span>    // in this RS. Will be retried from Client. Skipping all the Cells in CellScanner<a name="line.2663"></a>
-<span class="sourceLineNo">2664</span>    // corresponding to these Mutations.<a name="line.2664"></a>
-<span class="sourceLineNo">2665</span>    if (cellScanner != null) {<a name="line.2665"></a>
-<span class="sourceLineNo">2666</span>      skipCellsForMutations(regionAction.getActionList(), cellScanner);<a name="line.2666"></a>
-<span class="sourceLineNo">2667</span>    }<a name="line.2667"></a>
-<span class="sourceLineNo">2668</span>  }<a name="line.2668"></a>
-<span class="sourceLineNo">2669</span><a name="line.2669"></a>
-<span class="sourceLineNo">2670</span>  private boolean isReplicationRequest(Action action) {<a name="line.2670"></a>
-<span class="sourceLineNo">2671</span>    // replication request can only be put or delete.<a name="line.2671"></a>
-<span class="sourceLineNo">2672</span>    if (!action.hasMutation()) {<a name="line.2672"></a>
-<span class="sourceLineNo">2673</span>      return false;<a name="line.2673"></a>
-<span class="sourceLineNo">2674</span>    }<a name="line.2674"></a>
-<span class="sourceLineNo">2675</span>    MutationProto mutation = action.getMutation();<a name="line.2675"></a>
-<span class="sourceLineNo">2676</span>    MutationType type = mutation.getMutateType();<a name="line.2676"></a>
-<span class="sourceLineNo">2677</span>    if (type != MutationType.PUT &amp;&amp; type != MutationType.DELETE) {<a name="line.2677"></a>
-<span class="sourceLineNo">2678</span>      return false;<a name="line.2678"></a>
-<span class="sourceLineNo">2679</span>    }<a name="line.2679"></a>
-<span class="sourceLineNo">2680</span>    // replication will set a special attribute so we can make use of it to decide whether a request<a name="line.2680"></a>
-<span class="sourceLineNo">2681</span>    // is for replication.<a name="line.2681"></a>
-<span class="sourceLineNo">2682</span>    return mutation.getAttributeList().stream().map(p -&gt; p.getName())<a name="line.2682"></a>
-<span class="sourceLineNo">2683</span>      .filter(n -&gt; n.equals(ReplicationUtils.REPLICATION_ATTR_NAME)).findAny().isPresent();<a name="line.2683"></a>
-<span class="sourceLineNo">2684</span>  }<a name="line.2684"></a>
-<span class="sourceLineNo">2685</span><a name="line.2685"></a>
-<span class="sourceLineNo">2686</span>  /**<a name="line.2686"></a>
-<span class="sourceLineNo">2687</span>   * Execute multiple actions on a table: get, mutate, and/or execCoprocessor<a name="line.2687"></a>
-<span class="sourceLineNo">2688</span>   * @param rpcc the RPC controller<a name="line.2688"></a>
-<span class="sourceLineNo">2689</span>   * @param request the multi request<a name="line.2689"></a>
-<span class="sourceLineNo">2690</span>   * @throws ServiceException<a name="line.2690"></a>
-<span class="sourceLineNo">2691</span>   */<a name="line.2691"></a>
-<span class="sourceLineNo">2692</span>  @Override<a name="line.2692"></a>
-<span class="sourceLineNo">2693</span>  public MultiResponse multi(final RpcController rpcc, final MultiRequest request)<a name="line.2693"></a>
-<span class="sourceLineNo">2694</span>      throws ServiceException {<a name="line.2694"></a>
-<span class="sourceLineNo">2695</span>    try {<a name="line.2695"></a>
-<span class="sourceLineNo">2696</span>      checkOpen();<a name="line.2696"></a>
-<span class="sourceLineNo">2697</span>    } catch (IOException ie) {<a name="line.2697"></a>
-<span class="sourceLineNo">2698</span>      throw new ServiceException(ie);<a name="line.2698"></a>
-<span class="sourceLineNo">2699</span>    }<a name="line.2699"></a>
-<span class="sourceLineNo">2700</span><a name="line.2700"></a>
-<span class="sourceLineNo">2701</span>    checkBatchSizeAndLogLargeSize(request);<a name="line.2701"></a>
+<span class="sourceLineNo">2488</span>    TableName table = region.getRegionInfo().getTable();<a name="line.2488"></a>
+<span class="sourceLineNo">2489</span>    ReplicationSourceService service = regionServer.getReplicationSourceService();<a name="line.2489"></a>
+<span class="sourceLineNo">2490</span>    return service != null &amp;&amp; service.getSyncReplicationPeerInfoProvider()<a name="line.2490"></a>
+<span class="sourceLineNo">2491</span>            .checkState(table, RejectRequestsFromClientStateChecker.get());<a name="line.2491"></a>
+<span class="sourceLineNo">2492</span>  }<a name="line.2492"></a>
+<span class="sourceLineNo">2493</span><a name="line.2493"></a>
+<span class="sourceLineNo">2494</span>  private void rejectIfInStandByState(HRegion region) throws DoNotRetryIOException {<a name="line.2494"></a>
+<span class="sourceLineNo">2495</span>    if (shouldRejectRequestsFromClient(region)) {<a name="line.2495"></a>
+<span class="sourceLineNo">2496</span>      throw new DoNotRetryIOException(<a name="line.2496"></a>
+<span class="sourceLineNo">2497</span>        region.getRegionInfo().getRegionNameAsString() + " is in STANDBY state.");<a name="line.2497"></a>
+<span class="sourceLineNo">2498</span>    }<a name="line.2498"></a>
+<span class="sourceLineNo">2499</span>  }<a name="line.2499"></a>
+<span class="sourceLineNo">2500</span><a name="line.2500"></a>
+<span class="sourceLineNo">2501</span>  /**<a name="line.2501"></a>
+<span class="sourceLineNo">2502</span>   * Get data from a table.<a name="line.2502"></a>
+<span class="sourceLineNo">2503</span>   *<a name="line.2503"></a>
+<span class="sourceLineNo">2504</span>   * @param controller the RPC controller<a name="line.2504"></a>
+<span class="sourceLineNo">2505</span>   * @param request the get request<a name="line.2505"></a>
+<span class="sourceLineNo">2506</span>   * @throws ServiceException<a name="line.2506"></a>
+<span class="sourceLineNo">2507</span>   */<a name="line.2507"></a>
+<span class="sourceLineNo">2508</span>  @Override<a name="line.2508"></a>
+<span class="sourceLineNo">2509</span>  public GetResponse get(final RpcController controller, final GetRequest request)<a name="line.2509"></a>
+<span class="sourceLineNo">2510</span>      throws ServiceException {<a name="line.2510"></a>
+<span class="sourceLineNo">2511</span>    long before = EnvironmentEdgeManager.currentTime();<a name="line.2511"></a>
+<span class="sourceLineNo">2512</span>    OperationQuota quota = null;<a name="line.2512"></a>
+<span class="sourceLineNo">2513</span>    HRegion region = null;<a name="line.2513"></a>
+<span class="sourceLineNo">2514</span>    try {<a name="line.2514"></a>
+<span class="sourceLineNo">2515</span>      checkOpen();<a name="line.2515"></a>
+<span class="sourceLineNo">2516</span>      requestCount.increment();<a name="line.2516"></a>
+<span class="sourceLineNo">2517</span>      rpcGetRequestCount.increment();<a name="line.2517"></a>
+<span class="sourceLineNo">2518</span>      region = getRegion(request.getRegion());<a name="line.2518"></a>
+<span class="sourceLineNo">2519</span>      rejectIfInStandByState(region);<a name="line.2519"></a>
+<span class="sourceLineNo">2520</span><a name="line.2520"></a>
+<span class="sourceLineNo">2521</span>      GetResponse.Builder builder = GetResponse.newBuilder();<a name="line.2521"></a>
+<span class="sourceLineNo">2522</span>      ClientProtos.Get get = request.getGet();<a name="line.2522"></a>
+<span class="sourceLineNo">2523</span>      // An asynchbase client, https://github.com/OpenTSDB/asynchbase, starts by trying to do<a name="line.2523"></a>
+<span class="sourceLineNo">2524</span>      // a get closest before. Throwing the UnknownProtocolException signals it that it needs<a name="line.2524"></a>
+<span class="sourceLineNo">2525</span>      // to switch and do hbase2 protocol (HBase servers do not tell clients what versions<a name="line.2525"></a>
+<span class="sourceLineNo">2526</span>      // they are; its a problem for non-native clients like asynchbase. HBASE-20225.<a name="line.2526"></a>
+<span class="sourceLineNo">2527</span>      if (get.hasClosestRowBefore() &amp;&amp; get.getClosestRowBefore()) {<a name="line.2527"></a>
+<span class="sourceLineNo">2528</span>        throw new UnknownProtocolException("Is this a pre-hbase-1.0.0 or asynchbase client? " +<a name="line.2528"></a>
+<span class="sourceLineNo">2529</span>            "Client is invoking getClosestRowBefore removed in hbase-2.0.0 replaced by " +<a name="line.2529"></a>
+<span class="sourceLineNo">2530</span>            "reverse Scan.");<a name="line.2530"></a>
+<span class="sourceLineNo">2531</span>      }<a name="line.2531"></a>
+<span class="sourceLineNo">2532</span>      Boolean existence = null;<a name="line.2532"></a>
+<span class="sourceLineNo">2533</span>      Result r = null;<a name="line.2533"></a>
+<span class="sourceLineNo">2534</span>      RpcCallContext context = RpcServer.getCurrentCall().orElse(null);<a name="line.2534"></a>
+<span class="sourceLineNo">2535</span>      quota = getRpcQuotaManager().checkQuota(region, OperationQuota.OperationType.GET);<a name="line.2535"></a>
+<span class="sourceLineNo">2536</span><a name="line.2536"></a>
+<span class="sourceLineNo">2537</span>      Get clientGet = ProtobufUtil.toGet(get);<a name="line.2537"></a>
+<span class="sourceLineNo">2538</span>      if (get.getExistenceOnly() &amp;&amp; region.getCoprocessorHost() != null) {<a name="line.2538"></a>
+<span class="sourceLineNo">2539</span>        existence = region.getCoprocessorHost().preExists(clientGet);<a name="line.2539"></a>
+<span class="sourceLineNo">2540</span>      }<a name="line.2540"></a>
+<span class="sourceLineNo">2541</span>      if (existence == null) {<a name="line.2541"></a>
+<span class="sourceLineNo">2542</span>        if (context != null) {<a name="line.2542"></a>
+<span class="sourceLineNo">2543</span>          r = get(clientGet, (region), null, context);<a name="line.2543"></a>
+<span class="sourceLineNo">2544</span>        } else {<a name="line.2544"></a>
+<span class="sourceLineNo">2545</span>          // for test purpose<a name="line.2545"></a>
+<span class="sourceLineNo">2546</span>          r = region.get(clientGet);<a name="line.2546"></a>
+<span class="sourceLineNo">2547</span>        }<a name="line.2547"></a>
+<span class="sourceLineNo">2548</span>        if (get.getExistenceOnly()) {<a name="line.2548"></a>
+<span class="sourceLineNo">2549</span>          boolean exists = r.getExists();<a name="line.2549"></a>
+<span class="sourceLineNo">2550</span>          if (region.getCoprocessorHost() != null) {<a name="line.2550"></a>
+<span class="sourceLineNo">2551</span>            exists = region.getCoprocessorHost().postExists(clientGet, exists);<a name="line.2551"></a>
+<span class="sourceLineNo">2552</span>          }<a name="line.2552"></a>
+<span class="sourceLineNo">2553</span>          existence = exists;<a name="line.2553"></a>
+<span class="sourceLineNo">2554</span>        }<a name="line.2554"></a>
+<span class="sourceLineNo">2555</span>      }<a name="line.2555"></a>
+<span class="sourceLineNo">2556</span>      if (existence != null) {<a name="line.2556"></a>
+<span class="sourceLineNo">2557</span>        ClientProtos.Result pbr =<a name="line.2557"></a>
+<span class="sourceLineNo">2558</span>            ProtobufUtil.toResult(existence, region.getRegionInfo().getReplicaId() != 0);<a name="line.2558"></a>
+<span class="sourceLineNo">2559</span>        builder.setResult(pbr);<a name="line.2559"></a>
+<span class="sourceLineNo">2560</span>      } else if (r != null) {<a name="line.2560"></a>
+<span class="sourceLineNo">2561</span>        ClientProtos.Result pbr;<a name="line.2561"></a>
+<span class="sourceLineNo">2562</span>        if (isClientCellBlockSupport(context) &amp;&amp; controller instanceof HBaseRpcController<a name="line.2562"></a>
+<span class="sourceLineNo">2563</span>            &amp;&amp; VersionInfoUtil.hasMinimumVersion(context.getClientVersionInfo(), 1, 3)) {<a name="line.2563"></a>
+<span class="sourceLineNo">2564</span>          pbr = ProtobufUtil.toResultNoData(r);<a name="line.2564"></a>
+<span class="sourceLineNo">2565</span>          ((HBaseRpcController) controller).setCellScanner(CellUtil.createCellScanner(r<a name="line.2565"></a>
+<span class="sourceLineNo">2566</span>              .rawCells()));<a name="line.2566"></a>
+<span class="sourceLineNo">2567</span>          addSize(context, r, null);<a name="line.2567"></a>
+<span class="sourceLineNo">2568</span>        } else {<a name="line.2568"></a>
+<span class="sourceLineNo">2569</span>          pbr = ProtobufUtil.toResult(r);<a name="line.2569"></a>
+<span class="sourceLineNo">2570</span>        }<a name="line.2570"></a>
+<span class="sourceLineNo">2571</span>        builder.setResult(pbr);<a name="line.2571"></a>
+<span class="sourceLineNo">2572</span>      }<a name="line.2572"></a>
+<span class="sourceLineNo">2573</span>      if (r != null) {<a name="line.2573"></a>
+<span class="sourceLineNo">2574</span>        quota.addGetResult(r);<a name="line.2574"></a>
+<span class="sourceLineNo">2575</span>      }<a name="line.2575"></a>
+<span class="sourceLineNo">2576</span>      return builder.build();<a name="line.2576"></a>
+<span class="sourceLineNo">2577</span>    } catch (IOException ie) {<a name="line.2577"></a>
+<span class="sourceLineNo">2578</span>      throw new ServiceException(ie);<a name="line.2578"></a>
+<span class="sourceLineNo">2579</span>    } finally {<a name="line.2579"></a>
+<span class="sourceLineNo">2580</span>      MetricsRegionServer mrs = regionServer.metricsRegionServer;<a name="line.2580"></a>
+<span class="sourceLineNo">2581</span>      if (mrs != null) {<a name="line.2581"></a>
+<span class="sourceLineNo">2582</span>        TableDescriptor td = region != null? region.getTableDescriptor(): null;<a name="line.2582"></a>
+<span class="sourceLineNo">2583</span>        if (td != null) {<a name="line.2583"></a>
+<span class="sourceLineNo">2584</span>          mrs.updateGet(td.getTableName(), EnvironmentEdgeManager.currentTime() - before);<a name="line.2584"></a>
+<span class="sourceLineNo">2585</span>        }<a name="line.2585"></a>
+<span class="sourceLineNo">2586</span>      }<a name="line.2586"></a>
+<span class="sourceLineNo">2587</span>      if (quota != null) {<a name="line.2587"></a>
+<span class="sourceLineNo">2588</span>        quota.close();<a name="line.2588"></a>
+<span class="sourceLineNo">2589</span>      }<a name="line.2589"></a>
+<span class="sourceLineNo">2590</span>    }<a name="line.2590"></a>
+<span class="sourceLineNo">2591</span>  }<a name="line.2591"></a>
+<span class="sourceLineNo">2592</span><a name="line.2592"></a>
+<span class="sourceLineNo">2593</span>  private Result get(Get get, HRegion region, RegionScannersCloseCallBack closeCallBack,<a name="line.2593"></a>
+<span class="sourceLineNo">2594</span>      RpcCallContext context) throws IOException {<a name="line.2594"></a>
+<span class="sourceLineNo">2595</span>    region.prepareGet(get);<a name="line.2595"></a>
+<span class="sourceLineNo">2596</span>    boolean stale = region.getRegionInfo().getReplicaId() != 0;<a name="line.2596"></a>
+<span class="sourceLineNo">2597</span><a name="line.2597"></a>
+<span class="sourceLineNo">2598</span>    // This method is almost the same as HRegion#get.<a name="line.2598"></a>
+<span class="sourceLineNo">2599</span>    List&lt;Cell&gt; results = new ArrayList&lt;&gt;();<a name="line.2599"></a>
+<span class="sourceLineNo">2600</span>    long before = EnvironmentEdgeManager.currentTime();<a name="line.2600"></a>
+<span class="sourceLineNo">2601</span>    // pre-get CP hook<a name="line.2601"></a>
+<span class="sourceLineNo">2602</span>    if (region.getCoprocessorHost() != null) {<a name="line.2602"></a>
+<span class="sourceLineNo">2603</span>      if (region.getCoprocessorHost().preGet(get, results)) {<a name="line.2603"></a>
+<span class="sourceLineNo">2604</span>        region.metricsUpdateForGet(results, before);<a name="line.2604"></a>
+<span class="sourceLineNo">2605</span>        return Result<a name="line.2605"></a>
+<span class="sourceLineNo">2606</span>            .create(results, get.isCheckExistenceOnly() ? !results.isEmpty() : null, stale);<a name="line.2606"></a>
+<span class="sourceLineNo">2607</span>      }<a name="line.2607"></a>
+<span class="sourceLineNo">2608</span>    }<a name="line.2608"></a>
+<span class="sourceLineNo">2609</span>    Scan scan = new Scan(get);<a name="line.2609"></a>
+<span class="sourceLineNo">2610</span>    if (scan.getLoadColumnFamiliesOnDemandValue() == null) {<a name="line.2610"></a>
+<span class="sourceLineNo">2611</span>      scan.setLoadColumnFamiliesOnDemand(region.isLoadingCfsOnDemandDefault());<a name="line.2611"></a>
+<span class="sourceLineNo">2612</span>    }<a name="line.2612"></a>
+<span class="sourceLineNo">2613</span>    RegionScannerImpl scanner = null;<a name="line.2613"></a>
+<span class="sourceLineNo">2614</span>    try {<a name="line.2614"></a>
+<span class="sourceLineNo">2615</span>      scanner = region.getScanner(scan);<a name="line.2615"></a>
+<span class="sourceLineNo">2616</span>      scanner.next(results);<a name="line.2616"></a>
+<span class="sourceLineNo">2617</span>    } finally {<a name="line.2617"></a>
+<span class="sourceLineNo">2618</span>      if (scanner != null) {<a name="line.2618"></a>
+<span class="sourceLineNo">2619</span>        if (closeCallBack == null) {<a name="line.2619"></a>
+<span class="sourceLineNo">2620</span>          // If there is a context then the scanner can be added to the current<a name="line.2620"></a>
+<span class="sourceLineNo">2621</span>          // RpcCallContext. The rpc callback will take care of closing the<a name="line.2621"></a>
+<span class="sourceLineNo">2622</span>          // scanner, for eg in case<a name="line.2622"></a>
+<span class="sourceLineNo">2623</span>          // of get()<a name="line.2623"></a>
+<span class="sourceLineNo">2624</span>          context.setCallBack(scanner);<a name="line.2624"></a>
+<span class="sourceLineNo">2625</span>        } else {<a name="line.2625"></a>
+<span class="sourceLineNo">2626</span>          // The call is from multi() where the results from the get() are<a name="line.2626"></a>
+<span class="sourceLineNo">2627</span>          // aggregated and then send out to the<a name="line.2627"></a>
+<span class="sourceLineNo">2628</span>          // rpc. The rpccall back will close all such scanners created as part<a name="line.2628"></a>
+<span class="sourceLineNo">2629</span>          // of multi().<a name="line.2629"></a>
+<span class="sourceLineNo">2630</span>          closeCallBack.addScanner(scanner);<a name="line.2630"></a>
+<span class="sourceLineNo">2631</span>        }<a name="line.2631"></a>
+<span class="sourceLineNo">2632</span>      }<a name="line.2632"></a>
+<span class="sourceLineNo">2633</span>    }<a name="line.2633"></a>
+<span class="sourceLineNo">2634</span><a name="line.2634"></a>
+<span class="sourceLineNo">2635</span>    // post-get CP hook<a name="line.2635"></a>
+<span class="sourceLineNo">2636</span>    if (region.getCoprocessorHost() != null) {<a name="line.2636"></a>
+<span class="sourceLineNo">2637</span>      region.getCoprocessorHost().postGet(get, results);<a name="line.2637"></a>
+<span class="sourceLineNo">2638</span>    }<a name="line.2638"></a>
+<span class="sourceLineNo">2639</span>    region.metricsUpdateForGet(results, before);<a name="line.2639"></a>
+<span class="sourceLineNo">2640</span><a name="line.2640"></a>
+<span class="sourceLineNo">2641</span>    return Result.create(results, get.isCheckExistenceOnly() ? !results.isEmpty() : null, stale);<a name="line.2641"></a>
+<span class="sourceLineNo">2642</span>  }<a name="line.2642"></a>
+<span class="sourceLineNo">2643</span><a name="line.2643"></a>
+<span class="sourceLineNo">2644</span>  private void checkBatchSizeAndLogLargeSize(MultiRequest request) {<a name="line.2644"></a>
+<span class="sourceLineNo">2645</span>    int sum = 0;<a name="line.2645"></a>
+<span class="sourceLineNo">2646</span>    String firstRegionName = null;<a name="line.2646"></a>
+<span class="sourceLineNo">2647</span>    for (RegionAction regionAction : request.getRegionActionList()) {<a name="line.2647"></a>
+<span class="sourceLineNo">2648</span>      if (sum == 0) {<a name="line.2648"></a>
+<span class="sourceLineNo">2649</span>        firstRegionName = Bytes.toStringBinary(regionAction.getRegion().getValue().toByteArray());<a name="line.2649"></a>
+<span class="sourceLineNo">2650</span>      }<a name="line.2650"></a>
+<span class="sourceLineNo">2651</span>      sum += regionAction.getActionCount();<a name="line.2651"></a>
+<span class="sourceLineNo">2652</span>    }<a name="line.2652"></a>
+<span class="sourceLineNo">2653</span>    if (sum &gt; rowSizeWarnThreshold) {<a name="line.2653"></a>
+<span class="sourceLineNo">2654</span>      ld.logBatchWarning(firstRegionName, sum, rowSizeWarnThreshold);<a name="line.2654"></a>
+<span class="sourceLineNo">2655</span>    }<a name="line.2655"></a>
+<span class="sourceLineNo">2656</span>  }<a name="line.2656"></a>
+<span class="sourceLineNo">2657</span><a name="line.2657"></a>
+<span class="sourceLineNo">2658</span>  private void failRegionAction(MultiResponse.Builder responseBuilder,<a name="line.2658"></a>
+<span class="sourceLineNo">2659</span>      RegionActionResult.Builder regionActionResultBuilder, RegionAction regionAction,<a name="line.2659"></a>
+<span class="sourceLineNo">2660</span>      CellScanner cellScanner, Throwable error) {<a name="line.2660"></a>
+<span class="sourceLineNo">2661</span>    rpcServer.getMetrics().exception(error);<a name="line.2661"></a>
+<span class="sourceLineNo">2662</span>    regionActionResultBuilder.setException(ResponseConverter.buildException(error));<a name="line.2662"></a>
+<span class="sourceLineNo">2663</span>    responseBuilder.addRegionActionResult(regionActionResultBuilder.build());<a name="line.2663"></a>
+<span class="sourceLineNo">2664</span>    // All Mutations in this RegionAction not executed as we can not see the Region online here<a name="line.2664"></a>
+<span class="sourceLineNo">2665</span>    // in this RS. Will be retried from Client. Skipping all the Cells in CellScanner<a name="line.2665"></a>
+<span class="sourceLineNo">2666</span>    // corresponding to these Mutations.<a name="line.2666"></a>
+<span class="sourceLineNo">2667</span>    if (cellScanner != null) {<a name="line.2667"></a>
+<span class="sourceLineNo">2668</span>      skipCellsForMutations(regionAction.getActionList(), cellScanner);<a name="line.2668"></a>
+<span class="sourceLineNo">2669</span>    }<a name="line.2669"></a>
+<span class="sourceLineNo">2670</span>  }<a name="line.2670"></a>
+<span class="sourceLineNo">2671</span><a name="line.2671"></a>
+<span class="sourceLineNo">2672</span>  private boolean isReplicationRequest(Action action) {<a name="line.2672"></a>
+<span class="sourceLineNo">2673</span>    // replication request can only be put or delete.<a name="line.2673"></a>
+<span class="sourceLineNo">2674</span>    if (!action.hasMutation()) {<a name="line.2674"></a>
+<span class="sourceLineNo">2675</span>      return false;<a name="line.2675"></a>
+<span class="sourceLineNo">2676</span>    }<a name="line.2676"></a>
+<span class="sourceLineNo">2677</span>    MutationProto mutation = action.getMutation();<a name="line.2677"></a>
+<span class="sourceLineNo">2678</span>    MutationType type = mutation.getMutateType();<a name="line.2678"></a>
+<span class="sourceLineNo">2679</span>    if (type != MutationType.PUT &amp;&amp; type != MutationType.DELETE) {<a name="line.2679"></a>
+<span class="sourceLineNo">2680</span>      return false;<a name="line.2680"></a>
+<span class="sourceLineNo">2681</span>    }<a name="line.2681"></a>
+<span class="sourceLineNo">2682</span>    // replication will set a special attribute so we can make use of it to decide whether a request<a name="line.2682"></a>
+<span class="sourceLineNo">2683</span>    // is for replication.<a name="line.2683"></a>
+<span class="sourceLineNo">2684</span>    return mutation.getAttributeList().stream().map(p -&gt; p.getName())<a name="line.2684"></a>
+<span class="sourceLineNo">2685</span>      .filter(n -&gt; n.equals(ReplicationUtils.REPLICATION_ATTR_NAME)).findAny().isPresent();<a name="line.2685"></a>
+<span class="sourceLineNo">2686</span>  }<a name="line.2686"></a>
+<span class="sourceLineNo">2687</span><a name="line.2687"></a>
+<span class="sourceLineNo">2688</span>  /**<a name="line.2688"></a>
+<span class="sourceLineNo">2689</span>   * Execute multiple actions on a table: get, mutate, and/or execCoprocessor<a name="line.2689"></a>
+<span class="sourceLineNo">2690</span>   * @param rpcc the RPC controller<a name="line.2690"></a>
+<span class="sourceLineNo">2691</span>   * @param request the multi request<a name="line.2691"></a>
+<span class="sourceLineNo">2692</span>   * @throws ServiceException<a name="line.2692"></a>
+<span class="sourceLineNo">2693</span>   */<a name="line.2693"></a>
+<span class="sourceLineNo">2694</span>  @Override<a name="line.2694"></a>
+<span class="sourceLineNo">2695</span>  public MultiResponse multi(final RpcController rpcc, final MultiRequest request)<a name="line.2695"></a>
+<span class="sourceLineNo">2696</span>      throws ServiceException {<a name="line.2696"></a>
+<span class="sourceLineNo">2697</span>    try {<a name="line.2697"></a>
+<span class="sourceLineNo">2698</span>      checkOpen();<a name="line.2698"></a>
+<span class="sourceLineNo">2699</span>    } catch (IOException ie) {<a name="line.2699"></a>
+<span class="sourceLineNo">2700</span>      throw new ServiceException(ie);<a name="line.2700"></a>
+<span class="sourceLineNo">2701</span>    }<a name="line.2701"></a>
 <span class="sourceLineNo">2702</span><a name="line.2702"></a>
-<span class="sourceLineNo">2703</span>    // rpc controller is how we bring in data via the back door;  it is unprotobuf'ed data.<a name="line.2703"></a>
-<span class="sourceLineNo">2704</span>    // It is also the conduit via which we pass back data.<a name="line.2704"></a>
-<span class="sourceLineNo">2705</span>    HBaseRpcController controller = (HBaseRpcController)rpcc;<a name="line.2705"></a>
-<span class="sourceLineNo">2706</span>    CellScanner cellScanner = controller != null ? controller.cellScanner(): null;<a name="line.2706"></a>
-<span class="sourceLineNo">2707</span>    if (controller != null) {<a name="line.2707"></a>
-<span class="sourceLineNo">2708</span>      controller.setCellScanner(null);<a name="line.2708"></a>
-<span class="sourceLineNo">2709</span>    }<a name="line.2709"></a>
-<span class="sourceLineNo">2710</span><a name="line.2710"></a>
-<span class="sourceLineNo">2711</span>    long nonceGroup = request.hasNonceGroup() ? request.getNonceGroup() : HConstants.NO_NONCE;<a name="line.2711"></a>
+<span class="sourceLineNo">2703</span>    checkBatchSizeAndLogLargeSize(request);<a name="line.2703"></a>
+<span class="sourceLineNo">2704</span><a name="line.2704"></a>
+<span class="sourceLineNo">2705</span>    // rpc controller is how we bring in data via the back door;  it is unprotobuf'ed data.<a name="line.2705"></a>
+<span class="sourceLineNo">2706</span>    // It is also the conduit via which we pass back data.<a name="line.2706"></a>
+<span class="sourceLineNo">2707</span>    HBaseRpcController controller = (HBaseRpcController)rpcc;<a name="line.2707"></a>
+<span class="sourceLineNo">2708</span>    CellScanner cellScanner = controller != null ? controller.cellScanner(): null;<a name="line.2708"></a>
+<span class="sourceLineNo">2709</span>    if (controller != null) {<a name="line.2709"></a>
+<span class="sourceLineNo">2710</span>      controller.setCellScanner(null);<a name="line.2710"></a>
+<span class="sourceLineNo">2711</span>    }<a name="line.2711"></a>
 <span class="sourceLineNo">2712</span><a name="line.2712"></a>
-<span class="sourceLineNo">2713</span>    // this will contain all the cells that we need to return. It's created later, if needed.<a name="line.2713"></a>
-<span class="sourceLineNo">2714</span>    List&lt;CellScannable&gt; cellsToReturn = null;<a name="line.2714"></a>
-<span class="sourceLineNo">2715</span>    MultiResponse.Builder responseBuilder = MultiResponse.newBuilder();<a name="line.2715"></a>
-<span class="sourceLineNo">2716</span>    RegionActionResult.Builder regionActionResultBuilder = RegionActionResult.newBuilder();<a name="line.2716"></a>
-<span class="sourceLineNo">2717</span>    Boolean processed = null;<a name="line.2717"></a>
-<span class="sourceLineNo">2718</span>    RegionScannersCloseCallBack closeCallBack = null;<a name="line.2718"></a>
-<span class="sourceLineNo">2719</span>    RpcCallContext context = RpcServer.getCurrentCall().orElse(null);<a name="line.2719"></a>
-<span class="sourceLineNo">2720</span>    this.rpcMultiRequestCount.increment();<a name="line.2720"></a>
-<span class="sourceLineNo">2721</span>    this.requestCount.increment();<a name="line.2721"></a>
-<span class="sourceLineNo">2722</span>    Map&lt;RegionSpecifier, ClientProtos.RegionLoadStats&gt; regionStats = new HashMap&lt;&gt;(request<a name="line.2722"></a>
-<span class="sourceLineNo">2723</span>      .getRegionActionCount());<a name="line.2723"></a>
-<span class="sourceLineNo">2724</span>    ActivePolicyEnforcement spaceQuotaEnforcement = getSpaceQuotaManager().getActiveEnforcements();<a name="line.2724"></a>
-<span class="sourceLineNo">2725</span>    for (RegionAction regionAction : request.getRegionActionList()) {<a name="line.2725"></a>
-<span class="sourceLineNo">2726</span>      OperationQuota quota;<a name="line.2726"></a>
-<span class="sourceLineNo">2727</span>      HRegion region;<a name="line.2727"></a>
-<span class="sourceLineNo">2728</span>      regionActionResultBuilder.clear();<a name="line.2728"></a>
-<span class="sourceLineNo">2729</span>      RegionSpecifier regionSpecifier = regionAction.getRegion();<a name="line.2729"></a>
-<span class="sourceLineNo">2730</span>      try {<a name="line.2730"></a>
-<span class="sourceLineNo">2731</span>        region = getRegion(regionSpecifier);<a name="line.2731"></a>
-<span class="sourceLineNo">2732</span>        quota = getRpcQuotaManager().checkQuota(region, regionAction.getActionList());<a name="line.2732"></a>
-<span class="sourceLineNo">2733</span>      } catch (IOException e) {<a name="line.2733"></a>
-<span class="sourceLineNo">2734</span>        failRegionAction(responseBuilder, regionActionResultBuilder, regionAction, cellScanner, e);<a name="line.2734"></a>
-<span class="sourceLineNo">2735</span>        continue;  // For this region it's a failure.<a name="line.2735"></a>
-<span class="sourceLineNo">2736</span>      }<a name="line.2736"></a>
-<span class="sourceLineNo">2737</span>      boolean rejectIfFromClient = shouldRejectRequestsFromClient(region);<a name="line.2737"></a>
-<span class="sourceLineNo">2738</span>      if (regionAction.hasAtomic() &amp;&amp; regionAction.getAtomic()) {<a name="line.2738"></a>
-<span class="sourceLineNo">2739</span>        // We only allow replication in standby state and it will not set the atomic flag.<a name="line.2739"></a>
-<span class="sourceLineNo">2740</span>        if (rejectIfFromClient) {<a name="line.2740"></a>
-<span class="sourceLineNo">2741</span>          failRegionAction(responseBuilder, regionActionResultBuilder, regionAction, cellScanner,<a name="line.2741"></a>
-<span class="sourceLineNo">2742</span>            new DoNotRetryIOException(<a name="line.2742"></a>
-<span class="sourceLineNo">2743</span>              region.getRegionInfo().getRegionNameAsString() + " is in STANDBY state"));<a name="line.2743"></a>
-<span class="sourceLineNo">2744</span>          quota.close();<a name="line.2744"></a>
-<span class="sourceLineNo">2745</span>          continue;<a name="line.2745"></a>
-<span class="sourceLineNo">2746</span>        }<a name="line.2746"></a>
-<span class="sourceLineNo">2747</span>        // How does this call happen?  It may need some work to play well w/ the surroundings.<a name="line.2747"></a>
-<span class="sourceLineNo">2748</span>        // Need to return an item per Action along w/ Action index.  TODO.<a name="line.2748"></a>
-<span class="sourceLineNo">2749</span>        try {<a name="line.2749"></a>
-<span class="sourceLineNo">2750</span>          if (request.hasCondition()) {<a name="line.2750"></a>
-<span class="sourceLineNo">2751</span>            Condition condition = request.getCondition();<a name="line.2751"></a>
-<span class="sourceLineNo">2752</span>            byte[] row = condition.getRow().toByteArray();<a name="line.2752"></a>
-<span class="sourceLineNo">2753</span>            byte[] family = condition.getFamily().toByteArray();<a name="line.2753"></a>
-<span class="sourceLineNo">2754</span>            byte[] qualifier = condition.getQualifier().toByteArray();<a name="line.2754"></a>
-<span class="sourceLineNo">2755</span>            CompareOperator op =<a name="line.2755"></a>
-<span class="sourceLineNo">2756</span>              CompareOperator.valueOf(condition.getCompareType().name());<a name="line.2756"></a>
-<span class="sourceLineNo">2757</span>            ByteArrayComparable comparator =<a name="line.2757"></a>
-<span class="sourceLineNo">2758</span>                ProtobufUtil.toComparator(condition.getComparator());<a name="line.2758"></a>
-<span class="sourceLineNo">2759</span>            TimeRange timeRange = condition.hasTimeRange() ?<a name="line.2759"></a>
-<span class="sourceLineNo">2760</span>              ProtobufUtil.toTimeRange(condition.getTimeRange()) :<a name="line.2760"></a>
-<span class="sourceLineNo">2761</span>              TimeRange.allTime();<a name="line.2761"></a>
-<span class="sourceLineNo">2762</span>            processed =<a name="line.2762"></a>
-<span class="sourceLineNo">2763</span>              checkAndRowMutate(region, regionAction.getActionList(), cellScanner, row, family,<a name="line.2763"></a>
-<span class="sourceLineNo">2764</span>                qualifier, op, comparator, timeRange, regionActionResultBuilder,<a name="line.2764"></a>
-<span class="sourceLineNo">2765</span>                spaceQuotaEnforcement);<a name="line.2765"></a>
-<span class="sourceLineNo">2766</span>          } else {<a name="line.2766"></a>
-<span class="sourceLineNo">2767</span>            doAtomicBatchOp(regionActionResultBuilder, region, quota, regionAction.getActionList(),<a name="line.2767"></a>
-<span class="sourceLineNo">2768</span>              cellScanner, spaceQuotaEnforcement);<a name="line.2768"></a>
-<span class="sourceLineNo">2769</span>            processed = Boolean.TRUE;<a name="line.2769"></a>
-<span class="sourceLineNo">2770</span>          }<a name="line.2770"></a>
-<span class="sourceLineNo">2771</span>        } catch (IOException e) {<a name="line.2771"></a>
-<span class="sourceLineNo">2772</span>          rpcServer.getMetrics().exception(e);<a name="line.2772"></a>
-<span class="sourceLineNo">2773</span>          // As it's atomic, we may expect it's a global failure.<a name="line.2773"></a>
-<span class="sourceLineNo">2774</span>          regionActionResultBuilder.setException(ResponseConverter.buildException(e));<a name="line.2774"></a>
-<span class="sourceLineNo">2775</span>        }<a name="line.2775"></a>
-<span class="sourceLineNo">2776</span>      } else {<a name="line.2776"></a>
-<span class="sourceLineNo">2777</span>        if (rejectIfFromClient &amp;&amp; regionAction.getActionCount() &gt; 0 &amp;&amp;<a name="line.2777"></a>
-<span class="sourceLineNo">2778</span>          !isReplicationRequest(regionAction.getAction(0))) {<a name="line.2778"></a>
-<span class="sourceLineNo">2779</span>          // fail if it is not a replication request<a name="line.2779"></a>
-<span class="sourceLineNo">2780</span>          failRegionAction(responseBuilder, regionActionResultBuilder, regionAction, cellScanner,<a name="line.2780"></a>
-<span class="sourceLineNo">2781</span>            new DoNotRetryIOException(<a name="line.2781"></a>
-<span class="sourceLineNo">2782</span>              region.getRegionInfo().getRegionNameAsString() + " is in STANDBY state"));<a name="line.2782"></a>
-<span class="sourceLineNo">2783</span>          quota.close();<a name="line.2783"></a>
-<span class="sourceLineNo">2784</span>          continue;<a name="line.2784"></a>
-<span class="sourceLineNo">2785</span>        }<a name="line.2785"></a>
-<span class="sourceLineNo">2786</span>        // doNonAtomicRegionMutation manages the exception internally<a name="line.2786"></a>
-<span class="sourceLineNo">2787</span>        if (context != null &amp;&amp; closeCallBack == null) {<a name="line.2787"></a>
-<span class="sourceLineNo">2788</span>          // An RpcCallBack that creates a list of scanners that needs to perform callBack<a name="line.2788"></a>
-<span class="sourceLineNo">2789</span>          // operation on completion of multiGets.<a name="line.2789"></a>
-<span class="sourceLineNo">2790</span>          // Set this only once<a name="line.2790"></a>
-<span class="sourceLineNo">2791</span>          closeCallBack = new RegionScannersCloseCallBack();<a name="line.2791"></a>
-<span class="sourceLineNo">2792</span>          context.setCallBack(closeCallBack);<a name="line.2792"></a>
-<span class="sourceLineNo">2793</span>        }<a name="line.2793"></a>
-<span class="sourceLineNo">2794</span>        cellsToReturn = doNonAtomicRegionMutation(region, quota, regionAction, cellScanner,<a name="line.2794"></a>
-<span class="sourceLineNo">2795</span>            regionActionResultBuilder, cellsToReturn, nonceGroup, closeCallBack, context,<a name="line.2795"></a>
-<span class="sourceLineNo">2796</span>            spaceQuotaEnforcement);<a name="line.2796"></a>
-<span class="sourceLineNo">2797</span>      }<a name="line.2797"></a>
-<span class="sourceLineNo">2798</span>      responseBuilder.addRegionActionResult(regionActionResultBuilder.build());<a name="line.2798"></a>
-<span class="sourceLineNo">2799</span>      quota.close();<a name="line.2799"></a>
-<span class="sourceLineNo">2800</span>      ClientProtos.RegionLoadStats regionLoadStats = region.getLoadStatistics();<a name="line.2800"></a>
-<span class="sourceLineNo">2801</span>      if (regionLoadStats != null) {<a name="line.2801"></a>
-<span class="sourceLineNo">2802</span>        regionStats.put(regionSpecifier, regionLoadStats);<a name="line.2802"></a>
-<span class="sourceLineNo">2803</span>      }<a name="line.2803"></a>
-<span class="sourceLineNo">2804</span>    }<a name="line.2804"></a>
-<span class="sourceLineNo">2805</span>    // Load the controller with the Cells to return.<a name="line.2805"></a>
-<span class="sourceLineNo">2806</span>    if (cellsToReturn != null &amp;&amp; !cellsToReturn.isEmpty() &amp;&amp; controller != null) {<a name="line.2806"></a>
-<span class="sourceLineNo">2807</span>      controller.setCellScanner(CellUtil.createCellScanner(cellsToReturn));<a name="line.2807"></a>
-<span class="sourceLineNo">2808</span>    }<a name="line.2808"></a>
-<span class="sourceLineNo">2809</span><a name="line.2809"></a>
-<span class="sourceLineNo">2810</span>    if (processed != null) {<a name="line.2810"></a>
-<span class="sourceLineNo">2811</span>      responseBuilder.setProcessed(processed);<a name="line.2811"></a>
-<span class="sourceLineNo">2812</span>    }<a name="line.2812"></a>
-<span class="sourceLineNo">2813</span><a name="line.2813"></a>
-<span class="sourceLineNo">2814</span>    MultiRegionLoadStats.Builder builder = MultiRegionLoadStats.newBuilder();<a name="line.2814"></a>
-<span class="sourceLineNo">2815</span>    for(Entry&lt;RegionSpecifier, ClientProtos.RegionLoadStats&gt; stat: regionStats.entrySet()){<a name="line.2815"></a>
-<span class="sourceLineNo">2816</span>      builder.addRegion(stat.getKey());<a name="line.2816"></a>
-<span class="sourceLineNo">2817</span>      builder.addStat(stat.getValue());<a name="line.2817"></a>
-<span class="sourceLineNo">2818</span>    }<a name="line.2818"></a>
-<span class="sourceLineNo">2819</span>    responseBuilder.setRegionStatistics(builder);<a name="line.2819"></a>
-<span class="sourceLineNo">2820</span>    return responseBuilder.build();<a name="line.2820"></a>
-<span class="sourceLineNo">2821</span>  }<a name="line.2821"></a>
-<span class="sourceLineNo">2822</span><a name="line.2822"></a>
-<span class="sourceLineNo">2823</span>  private void skipCellsForMutations(List&lt;Action&gt; actions, CellScanner cellScanner) {<a name="line.2823"></a>
-<span class="sourceLineNo">2824</span>    if (cellScanner == null) {<a name="line.2824"></a>
-<span class="sourceLineNo">2825</span>      return;<a name="line.2825"></a>
-<span class="sourceLineNo">2826</span>    }<a name="line.2826"></a>
-<span class="sourceLineNo">2827</span>    for (Action action : actions) {<a name="line.2827"></a>
-<span class="sourceLineNo">2828</span>      skipCellsForMutation(action, cellScanner);<a name="line.2828"></a>
-<span class="sourceLineNo">2829</span>    }<a name="line.2829"></a>
-<span class="sourceLineNo">2830</span>  }<a name="line.2830"></a>
-<span class="sourceLineNo">2831</span><a name="line.2831"></a>
-<span class="sourceLineNo">2832</span>  private void skipCellsForMutation(Action action, CellScanner cellScanner) {<a name="line.2832"></a>
-<span class="sourceLineNo">2833</span>    if (cellScanner == null) {<a name="line.2833"></a>
-<span class="sourceLineNo">2834</span>      return;<a name="line.2834"></a>
-<span class="sourceLineNo">2835</span>    }<a name="line.2835"></a>
-<span class="sourceLineNo">2836</span>    try {<a name="line.2836"></a>
-<span class="sourceLineNo">2837</span>      if (action.hasMutation()) {<a name="line.2837"></a>
-<span class="sourceLineNo">2838</span>        MutationProto m = action.getMutation();<a name="line.2838"></a>
-<span class="sourceLineNo">2839</span>        if (m.hasAssociatedCellCount()) {<a name="line.2839"></a>
-<span class="sourceLineNo">2840</span>          for (int i = 0; i &lt; m.getAssociatedCellCount(); i++) {<a name="line.2840"></a>
-<span class="sourceLineNo">2841</span>            cellScanner.advance();<a name="line.2841"></a>
-<span class="sourceLineNo">2842</span>          }<a name="line.2842"></a>
-<span class="sourceLineNo">2843</span>        }<a name="line.2843"></a>
-<span class="sourceLineNo">2844</span>      }<a name="line.2844"></a>
-<span class="sourceLineNo">2845</span>    } catch (IOException e) {<a name="line.2845"></a>
-<span class="sourceLineNo">2846</span>      // No need to handle these Individual Muatation level issue. Any way this entire RegionAction<a name="line.2846"></a>
-<span class="sourceLineNo">2847</span>      // marked as failed as we could not see the Region here. At client side the top level<a name="line.2847"></a>
-<span class="sourceLineNo">2848</span>      // RegionAction exception will be considered first.<a name="line.2848"></a>
-<span class="sourceLineNo">2849</span>      LOG.error("Error while skipping Cells in CellScanner for invalid Region Mutations", e);<a name="line.2849"></a>
-<span class="sourceLineNo">2850</span>    }<a name="line.2850"></a>
-<span class="sourceLineNo">2851</span>  }<a name="line.2851"></a>
-<span class="sourceLineNo">2852</span><a name="line.2852"></a>
-<span class="sourceLineNo">2853</span>  /**<a name="line.2853"></a>
-<span class="sourceLineNo">2854</span>   * Mutate data in a table.<a name="line.2854"></a>
-<span class="sourceLineNo">2855</span>   *<a name="line.2855"></a>
-<span class="sourceLineNo">2856</span>   * @param rpcc the RPC controller<a name="line.2856"></a>
-<span class="sourceLineNo">2857</span>   * @param request the mutate request<a name="line.2857"></a>
-<span class="sourceLineNo">2858</span>   */<a name="line.2858"></a>
-<span class="sourceLineNo">2859</span>  @Override<a name="line.2859"></a>
-<span class="sourceLineNo">2860</span>  public MutateResponse mutate(final RpcController rpcc, final MutateRequest request)<a name="line.2860"></a>
-<span class="sourceLineNo">2861</span>      throws ServiceException {<a name="line.2861"></a>
-<span class="sourceLineNo">2862</span>    // rpc controller is how we bring in data via the back door;  it is unprotobuf'ed data.<a name="line.2862"></a>
-<span class="sourceLineNo">2863</span>    // It is also the conduit via which we pass back data.<a name="line.2863"></a>
-<span class="sourceLineNo">2864</span>    HBaseRpcController controller = (HBaseRpcController)rpcc;<a name="line.2864"></a>
-<span class="sourceLineNo">2865</span>    CellScanner cellScanner = controller != null ? controller.cellScanner() : null;<a name="line.2865"></a>
-<span class="sourceLineNo">2866</span>    OperationQuota quota = null;<a name="line.2866"></a>
-<span class="sourceLineNo">2867</span>    RpcCallContext context = RpcServer.getCurrentCall().orElse(null);<a name="line.2867"></a>
-<span class="sourceLineNo">2868</span>    ActivePolicyEnforcement spaceQuotaEnforcement = null;<a name="line.2868"></a>
-<span class="sourceLineNo">2869</span>    MutationType type = null;<a name="line.2869"></a>
-<span class="sourceLineNo">2870</span>    HRegion region = null;<a name="line.2870"></a>
-<span class="sourceLineNo">2871</span>    long before = EnvironmentEdgeManager.currentTime();<a name="line.2871"></a>
-<span class="sourceLineNo">2872</span>    // Clear scanner so we are not holding on to reference across call.<a name="line.2872"></a>
-<span class="sourceLineNo">2873</span>    if (controller != null) {<a name="line.2873"></a>
-<span class="sourceLineNo">2874</span>      controller.setCellScanner(null);<a name="line.2874"></a>
-<span class="sourceLineNo">2875</span>    }<a name="line.2875"></a>
-<span class="sourceLineNo">2876</span>    try {<a name="line.2876"></a>
-<span class="sourceLineNo">2877</span>      checkOpen();<a name="line.2877"></a>
-<span class="sourceLineNo">2878</span>      requestCount.increment();<a name="line.2878"></a>
-<span class="sourceLineNo">2879</span>      rpcMutateRequestCount.increment();<a name="line.2879"></a>
-<span class="sourceLineNo">2880</span>      region = getRegion(request.getRegion());<a name="line.2880"></a>
-<span class="sourceLineNo">2881</span>      rejectIfInStandByState(region);<a name="line.2881"></a>
-<span class="sourceLineNo">2882</span>      MutateResponse.Builder builder = MutateResponse.newBuilder();<a name="line.2882"></a>
-<span class="sourceLineNo">2883</span>      MutationProto mutation = request.getMutation();<a name="line.2883"></a>
-<span class="sourceLineNo">2884</span>      if (!region.getRegionInfo().isMetaRegion()) {<a name="line.2884"></a>
-<span class="sourceLineNo">2885</span>        regionServer.cacheFlusher.reclaimMemStoreMemory();<a name="line.2885"></a>
-<span class="sourceLineNo">2886</span>      }<a name="line.2886"></a>
-<span class="sourceLineNo">2887</span>      long nonceGroup = request.hasNonceGroup() ? request.getNonceGroup() : HConstants.NO_NONCE;<a name="line.2887"></a>
-<span class="sourceLineNo">2888</span>      Result r = null;<a name="line.2888"></a>
-<span class="sourceLineNo">2889</span>      Boolean processed = null;<a name="line.2889"></a>
-<span class="sourceLineNo">2890</span>      type = mutation.getMutateType();<a name="line.2890"></a>
-<span class="sourceLineNo">2891</span><a name="line.2891"></a>
-<span class="sourceLineNo">2892</span>      quota = getRpcQuotaManager().checkQuota(region, OperationQuota.OperationType.MUTATE);<a name="line.2892"></a>
-<span class="sourceLineNo">2893</span>      spaceQuotaEnforcement = getSpaceQuotaManager().getActiveEnforcements();<a name="line.2893"></a>
-<span class="sourceLineNo">2894</span><a name="line.2894"></a>
-<span class="sourceLineNo">2895</span>      switch (type) {<a name="line.2895"></a>
-<span class="sourceLineNo">2896</span>        case APPEND:<a name="line.2896"></a>
-<span class="sourceLineNo">2897</span>          // TODO: this doesn't actually check anything.<a name="line.2897"></a>
-<span class="sourceLineNo">2898</span>          r = append(region, quota, mutation, cellScanner, nonceGroup, spaceQuotaEnforcement);<a name="line.2898"></a>
-<span class="sourceLineNo">2899</span>          break;<a name="line.2899"></a>
-<span class="sourceLineNo">2900</span>        case INCREMENT:<a name="line.2900"></a>
-<span class="sourceLineNo">2901</span>          // TODO: this doesn't actually check anything.<a name="line.2901"></a>
-<span class="sourceLineNo">2902</span>          r = increment(region, quota, mutation, cellScanner, nonceGroup, spaceQuotaEnforcement);<a name="line.2902"></a>
-<span class="sourceLineNo">2903</span>          break;<a name="line.2903"></a>
-<span class="sourceLineNo">2904</span>        case PUT:<a name="line.2904"></a>
-<span class="sourceLineNo">2905</span>          Put put = ProtobufUtil.toPut(mutation, cellScanner);<a name="line.2905"></a>
-<span class="sourceLineNo">2906</span>          checkCellSizeLimit(region, put);<a name="line.2906"></a>
-<span class="sourceLineNo">2907</span>          // Throws an exception when violated<a name="line.2907"></a>
-<span class="sourceLineNo">2908</span>          spaceQuotaEnforcement.getPolicyEnforcement(region).check(put);<a name="line.2908"></a>
-<span class="sourceLineNo">2909</span>          quota.addMutation(put);<a name="line.2909"></a>
-<span class="sourceLineNo">2910</span>          if (request.hasCondition()) {<a name="line.2910"></a>
-<span class="sourceLineNo">2911</span>            Condition condition = request.getCondition();<a name="line.2911"></a>
-<span class="sourceLineNo">2912</span>            byte[] row = condition.getRow().toByteArray();<a name="line.2912"></a>
-<span class="sourceLineNo">2913</span>            byte[] family = condition.getFamily().toByteArray();<a name="line.2913"></a>
-<span class="sourceLineNo">2914</span>            byte[] qualifier = condition.getQualifier().toByteArray();<a name="line.2914"></a>
-<span class="sourceLineNo">2915</span>            CompareOperator compareOp =<a name="line.2915"></a>
-<span class="sourceLineNo">2916</span>              CompareOperator.valueOf(condition.getCompareType().name());<a name="line.2916"></a>
-<span class="sourceLineNo">2917</span>            ByteArrayComparable comparator = ProtobufUtil.toComparator(condition.getComparator());<a name="line.2917"></a>
-<span class="sourceLineNo">2918</span>            TimeRange timeRange = condition.hasTimeRange() ?<a name="line.2918"></a>
-<span class="sourceLineNo">2919</span>              ProtobufUtil.toTimeRange(condition.getTimeRange()) :<a name="line.2919"></a>
-<span class="sourceLineNo">2920</span>              TimeRange.allTime();<a name="line.2920"></a>
-<span class="sourceLineNo">2921</span>            if (region.getCoprocessorHost() != null) {<a name="line.2921"></a>
-<span class="sourceLineNo">2922</span>              processed = region.getCoprocessorHost().preCheckAndPut(row, family, qualifier,<a name="line.2922"></a>
-<span class="sourceLineNo">2923</span>                  compareOp, comparator, put);<a name="line.2923"></a>
-<span class="sourceLineNo">2924</span>            }<a name="line.2924"></a>
-<span class="sourceLineNo">2925</span>            if (processed == null) {<a name="line.2925"></a>
-<span class="sourceLineNo">2926</span>              boolean result = region.checkAndMutate(row, family,<a name="line.2926"></a>
-<span class="sourceLineNo">2927</span>                qualifier, compareOp, comparator, timeRange, put);<a name="line.2927"></a>
-<span class="sourceLineNo">2928</span>              if (region.getCoprocessorHost() != null) {<a name="line.2928"></a>
-<span class="sourceLineNo">2929</span>                result = region.getCoprocessorHost().postCheckAndPut(row, family,<a name="line.2929"></a>
-<span class="sourceLineNo">2930</span>                  qualifier, compareOp, comparator, put, result);<a name="line.2930"></a>
-<span class="sourceLineNo">2931</span>              }<a name="line.2931"></a>
-<span class="sourceLineNo">2932</span>              processed = result;<a name="line.2932"></a>
-<span class="sourceLineNo">2933</span>            }<a name="line.2933"></a>
-<span class="sourceLineNo">2934</span>          } else {<a name="line.2934"></a>
-<span class="sourceLineNo">2935</span>            region.put(put);<a name="line.2935"></a>
-<span class="sourceLineNo">2936</span>            processed = Boolean.TRUE;<a name="line.2936"></a>
-<span class="sourceLineNo">2937</span>          }<a name="line.2937"></a>
-<span class="sourceLineNo">2938</span>          break;<a name="line.2938"></a>
-<span class="sourceLineNo">2939</span>        case DELETE:<a name="line.2939"></a>
-<span class="sourceLineNo">2940</span>          Delete delete = ProtobufUtil.toDelete(mutation, cellScanner);<a name="line.2940"></a>
-<span class="sourceLineNo">2941</span>          checkCellSizeLimit(region, delete);<a name="line.2941"></a>
-<span class="sourceLineNo">2942</span>          spaceQuotaEnforcement.getPolicyEnforcement(region).check(delete);<a name="line.2942"></a>
-<span class="sourceLineNo">2943</span>          quota.addMutation(delete);<a name="line.2943"></a>
-<span class="sourceLineNo">2944</span>          if (request.hasCondition()) {<a name="line.2944"></a>
-<span class="sourceLineNo">2945</span>            Condition condition = request.getCondition();<a name="line.2945"></a>
-<span class="sourceLineNo">2946</span>            byte[] row = condition.getRow().toByteArray();<a name="line.2946"></a>
-<span class="sourceLineNo">2947</span>            byte[] family = condition.getFamily().toByteArray();<a name="line.2947"></a>
-<span class="sourceLineNo">2948</span>            byte[] qualifier = condition.getQualifier().toByteArray();<a name="line.2948"></a>
-<span class="sourceLineNo">2949</span>            CompareOperator op = CompareOperator.valueOf(condition.getCompareType().name());<a name="line.2949"></a>
-<span class="sourceLineNo">2950</span>            ByteArrayComparable comparator = ProtobufUtil.toComparator(condition.getComparator());<a name="line.2950"></a>
-<span class="sourceLineNo">2951</span>            TimeRange timeRange = condition.hasTimeRange() ?<a name="line.2951"></a>
-<span class="sourceLineNo">2952</span>              ProtobufUtil.toTimeRange(condition.getTimeRange()) :<a name="line.2952"></a>
-<span class="sourceLineNo">2953</span>              TimeRange.allTime();<a name="line.2953"></a>
-<span class="sourceLineNo">2954</span>            if (region.getCoprocessorHost() != null) {<a name="line.2954"></a>
-<span class="sourceLineNo">2955</span>              processed = region.getCoprocessorHost().preCheckAndDelete(row, family, qualifier, op,<a name="line.2955"></a>
-<span class="sourceLineNo">2956</span>                  comparator, delete);<a name="line.2956"></a>
-<span class="sourceLineNo">2957</span>            }<a name="line.2957"></a>
-<span class="sourceLineNo">2958</span>            if (processed == null) {<a name="line.2958"></a>
-<span class="sourceLineNo">2959</span>              boolean result = region.checkAndMutate(row, family,<a name="line.2959"></a>
-<span class="sourceLineNo">2960</span>                qualifier, op, comparator, timeRange, delete);<a name="line.2960"></a>
-<span class="sourceLineNo">2961</span>              if (region.getCoprocessorHost() != null) {<a name="line.2961"></a>
-<span class="sourceLineNo">2962</span>                result = region.getCoprocessorHost().postCheckAndDelete(row, family,<a name="line.2962"></a>
-<span class="sourceLineNo">2963</span>                  qualifier, op, comparator, delete, result);<a name="line.2963"></a>
-<span class="sourceLineNo">2964</span>              }<a name="line.2964"></a>
-<span class="sourceLineNo">2965</span>              processed = result;<a name="line.2965"></a>
-<span class="sourceLineNo">2966</span>            }<a name="line.2966"></a>
-<span class="sourceLineNo">2967</span>          } else {<a name="line.2967"></a>
-<span class="sourceLineNo">2968</span>            region.delete(delete);<a name="line.2968"></a>
-<span class="sourceLineNo">2969</span>            processed = Boolean.TRUE;<a name="line.2969"></a>
-<span class="sourceLineNo">2970</span>          }<a name="line.2970"></a>
-<span class="sourceLineNo">2971</span>          break;<a name="line.2971"></a>
-<span class="sourceLineNo">2972</span>        default:<a name="line.2972"></a>
-<span class="sourceLineNo">2973</span>          throw new DoNotRetryIOException("Unsupported mutate type: " + type.name());<a name="line.2973"></a>
-<span class="sourceLineNo">2974</span>      }<a name="line.2974"></a>
-<span class="sourceLineNo">2975</span>      if (processed != null) {<a name="line.2975"></a>
-<span class="sourceLineNo">2976</span>        builder.setProcessed(processed.booleanValue());<a name="line.2976"></a>
-<span class="sourceLineNo">2977</span>      }<a name="line.2977"></a>
-<span class="sourceLineNo">2978</span>      boolean clientCellBlockSupported = isClientCellBlockSupport(context);<a name="line.2978"></a>
-<span class="sourceLineNo">2979</span>      addResult(builder, r, controller, clientCellBlockSupported);<a name="line.2979"></a>
-<span class="sourceLineNo">2980</span>      if (clientCellBlockSupported) {<a name="line.2980"></a>
-<span class="sourceLineNo">2981</span>        addSize(context, r, null);<a name="line.2981"></a>
-<span class="sourceLineNo">2982</span>      }<a name="line.2982"></a>
-<span class="sourceLineNo">2983</span>      return builder.build();<a name="line.2983"></a>
-<span class="sourceLineNo">2984</span>    } catch (IOException ie) {<a name="line.2984"></a>
-<span class="sourceLineNo">2985</span>      regionServer.checkFileSystem();<a name="line.2985"></a>
-<span class="sourceLineNo">2986</span>      throw new ServiceException(ie);<a name="line.2986"></a>
-<span class="sourceLineNo">2987</span>    } finally {<a name="line.2987"></a>
-<span class="sourceLineNo">2988</span>      if (quota != null) {<a name="line.2988"></a>
-<span class="sourceLineNo">2989</span>        quota.close();<a name="line.2989"></a>
-<span class="sourceLineNo">2990</span>      }<a name="line.2990"></a>
-<span class="sourceLineNo">2991</span>      // Update metrics<a name="line.2991"></a>
-<span class="sourceLineNo">2992</span>      if (regionServer.metricsRegionServer != null &amp;&amp; type != null) {<a name="line.2992"></a>
-<span class="sourceLineNo">2993</span>        long after = EnvironmentEdgeManager.currentTime();<a name="line.2993"></a>
-<span class="sourceLineNo">2994</span>        switch (type) {<a name="line.2994"></a>
-<span class="sourceLineNo">2995</span>        case DELETE:<a name="line.2995"></a>
-<span class="sourceLineNo">2996</span>          if (request.hasCondition()) {<a name="line.2996"></a>
-<span class="sourceLineNo">2997</span>            regionServer.metricsRegionServer.updateCheckAndDelete(after - before);<a name="line.2997"></a>
-<span class="sourceLineNo">2998</span>          } else {<a name="line.2998"></a>
-<span class="sourceLineNo">2999</span>            regionServer.metricsRegionServer.updateDelete(<a name="line.2999"></a>
-<span class="sourceLineNo">3000</span>                region == null ? null : region.getRegionInfo().getTable(), after - before);<a name="line.3000"></a>
-<span class="sourceLineNo">3001</span>          }<a name="line.3001"></a>
-<span class="sourceLineNo">3002</span>          break;<a name="line.3002"></a>
-<span class="sourceLineNo">3003</span>        case PUT:<a name="line.3003"></a>
-<span class="sourceLineNo">3004</span>          if (request.hasCondition()) {<a name="line.3004"></a>
-<span class="sourceLineNo">3005</span>            regionServer.metricsRegionServer.updateCheckAndPut(after - before);<a name="line.3005"></a>
-<span class="sourceLineNo">3006</span>          } else {<a name="line.3006"></a>
-<span class="sourceLineNo">3007</span>            regionServer.metricsRegionServer.updatePut(<a name="line.3007"></a>
-<span class="sourceLineNo">3008</span>                region == null ? null : region.getRegionInfo().getTable(),after - before);<a name="line.3008"></a>
-<span class="sourceLineNo">3009</span>          }<a name="line.3009"></a>
-<span class="sourceLineNo">3010</span>          break;<a name="line.3010"></a>
-<span class="sourceLineNo">3011</span>        default:<a name="line.3011"></a>
+<span class="sourceLineNo">2713</span>    long nonceGroup = request.hasNonceGroup() ? request.getNonceGroup() : HConstants.NO_NONCE;<a name="line.2713"></a>
+<span class="sourceLineNo">2714</span><a name="line.2714"></a>
+<span class="sourceLineNo">2715</span>    // this will contain all the cells that we need to return. It's created later, if needed.<a name="line.2715"></a>
+<span class="sourceLineNo">2716</span>    List&lt;CellScannable&gt; cellsToReturn = null;<a name="line.2716"></a>
+<span class="sourceLineNo">2717</span>    MultiResponse.Builder responseBuilder = MultiResponse.newBuilder();<a name="line.2717"></a>
+<span class="sourceLineNo">2718</span>    RegionActionResult.Builder regionActionResultBuilder = RegionActionResult.newBuilder();<a name="line.2718"></a>
+<span class="sourceLineNo">2719</span>    Boolean processed = null;<a name="line.2719"></a>
+<span class="sourceLineNo">2720</span>    RegionScannersCloseCallBack closeCallBack = null;<a name="line.2720"></a>
+<span class="sourceLineNo">2721</span>    RpcCallContext context = RpcServer.getCurrentCall().orElse(null);<a name="line.2721"></a>
+<span class="sourceLineNo">2722</span>    this.rpcMultiRequestCount.increment();<a name="line.2722"></a>
+<span class="sourceLineNo">2723</span>    this.requestCount.increment();<a name="line.2723"></a>
+<span class="sourceLineNo">2724</span>    Map&lt;RegionSpecifier, ClientProtos.RegionLoadStats&gt; regionStats = new HashMap&lt;&gt;(request<a name="line.2724"></a>
+<span class="sourceLineNo">2725</span>      .getRegionActionCount());<a name="line.2725"></a>
+<span class="sourceLineNo">2726</span>    ActivePolicyEnforcement spaceQuotaEnforcement = getSpaceQuotaManager().getActiveEnforcements();<a name="line.2726"></a>
+<span class="sourceLineNo">2727</span>    for (RegionAction regionAction : request.getRegionActionList()) {<a name="line.2727"></a>
+<span class="sourceLineNo">2728</span>      OperationQuota quota;<a name="line.2728"></a>
+<span class="sourceLineNo">2729</span>      HRegion region;<a name="line.2729"></a>
+<span class="sourceLineNo">2730</span>      regionActionResultBuilder.clear();<a name="line.2730"></a>
+<span class="sourceLineNo">2731</span>      RegionSpecifier regionSpecifier = regionAction.getRegion();<a name="line.2731"></a>
+<span class="sourceLineNo">2732</span>      try {<a name="line.2732"></a>
+<span class="sourceLineNo">2733</span>        region = getRegion(regionSpecifier);<a name="line.2733"></a>
+<span class="sourceLineNo">2734</span>        quota = getRpcQuotaManager().checkQuota(region, regionAction.getActionList());<a name="line.2734"></a>
+<span class="sourceLineNo">2735</span>      } catch (IOException e) {<a name="line.2735"></a>
+<span class="sourceLineNo">2736</span>        failRegionAction(responseBuilder, regionActionResultBuilder, regionAction, cellScanner, e);<a name="line.2736"></a>
+<span class="sourceLineNo">2737</span>        continue;  // For this region it's a failure.<a name="line.2737"></a>
+<span class="sourceLineNo">2738</span>      }<a name="line.2738"></a>
+<span class="sourceLineNo">2739</span>      boolean rejectIfFromClient = shouldRejectRequestsFromClient(region);<a name="line.2739"></a>
+<span class="sourceLineNo">2740</span>      if (regionAction.hasAtomic() &amp;&amp; regionAction.getAtomic()) {<a name="line.2740"></a>
+<span class="sourceLineNo">2741</span>        // We only allow replication in standby state and it will not set the atomic flag.<a name="line.2741"></a>
+<span class="sourceLineNo">2742</span>        if (rejectIfFromClient) {<a name="line.2742"></a>
+<span class="sourceLineNo">2743</span>          failRegionAction(responseBuilder, regionActionResultBuilder, regionAction, cellScanner,<a name="line.2743"></a>
+<span class="sourceLineNo">2744</span>            new DoNotRetryIOException(<a name="line.2744"></a>
+<span class="sourceLineNo">2745</span>              region.getRegionInfo().getRegionNameAsString() + " is in STANDBY state"));<a name="line.2745"></a>
+<span class="sourceLineNo">2746</span>          quota.close();<a name="line.2746"></a>
+<span class="sourceLineNo">2747</span>          continue;<a name="line.2747"></a>
+<span class="sourceLineNo">2748</span>        }<a name="line.2748"></a>
+<span class="sourceLineNo">2749</span>        // How does this call happen?  It may need some work to play well w/ the surroundings.<a name="line.2749"></a>
+<span class="sourceLineNo">2750</span>        // Need to return an item per Action along w/ Action index.  TODO.<a name="line.2750"></a>
+<span class="sourceLineNo">2751</span>        try {<a name="line.2751"></a>
+<span class="sourceLineNo">2752</span>          if (request.hasCondition()) {<a name="line.2752"></a>
+<span class="sourceLineNo">2753</span>            Condition condition = request.getCondition();<a name="line.2753"></a>
+<span class="sourceLineNo">2754</span>            byte[] row = condition.getRow().toByteArray();<a name="line.2754"></a>
+<span class="sourceLineNo">2755</span>            byte[] family = condition.getFamily().toByteArray();<a name="line.2755"></a>
+<span class="sourceLineNo">2756</span>            byte[] qualifier = condition.getQualifier().toByteArray();<a name="line.2756"></a>
+<span class="sourceLineNo">2757</span>            CompareOperator op =<a name="line.2757"></a>
+<span class="sourceLineNo">2758</span>              CompareOperator.valueOf(condition.getCompareType().name());<a name="line.2758"></a>
+<span class="sourceLineNo">2759</span>            ByteArrayComparable comparator =<a name="line.2759"></a>
+<span class="sourceLineNo">2760</span>                ProtobufUtil.toComparator(condition.getComparator());<a name="line.2760"></a>
+<span class="sourceLineNo">2761</span>            TimeRange timeRange = condition.hasTimeRange() ?<a name="line.2761"></a>
+<span class="sourceLineNo">2762</span>              ProtobufUtil.toTimeRange(condition.getTimeRange()) :<a name="line.2762"></a>
+<span class="sourceLineNo">2763</span>              TimeRange.allTime();<a name="line.2763"></a>
+<span class="sourceLineNo">2764</span>            processed =<a name="line.2764"></a>
+<span class="sourceLineNo">2765</span>              checkAndRowMutate(region, regionAction.getActionList(), cellScanner, row, family,<a name="line.2765"></a>
+<span class="sourceLineNo">2766</span>                qualifier, op, comparator, timeRange, regionActionResultBuilder,<a name="line.2766"></a>
+<span class="sourceLineNo">2767</span>                spaceQuotaEnforcement);<a name="line.2767"></a>
+<span class="sourceLineNo">2768</span>          } else {<a name="line.2768"></a>
+<span class="sourceLineNo">2769</span>            doAtomicBatchOp(regionActionResultBuilder, region, quota, regionAction.getActionList(),<a name="line.2769"></a>
+<span class="sourceLineNo">2770</span>              cellScanner, spaceQuotaEnforcement);<a name="line.2770"></a>
+<span class="sourceLineNo">2771</span>            processed = Boolean.TRUE;<a name="line.2771"></a>
+<span class="sourceLineNo">2772</span>          }<a name="line.2772"></a>
+<span class="sourceLineNo">2773</span>        } catch (IOException e) {<a name="line.2773"></a>
+<span class="sourceLineNo">2774</span>          rpcServer.getMetrics().exception(e);<a name="line.2774"></a>
+<span class="sourceLineNo">2775</span>          // As it's atomic, we may expect it's a global failure.<a name="line.2775"></a>
+<span class="sourceLineNo">2776</span>          regionActionResultBuilder.setException(ResponseConverter.buildException(e));<a name="line.2776"></a>
+<span class="sourceLineNo">2777</span>        }<a name="line.2777"></a>
+<span class="sourceLineNo">2778</span>      } else {<a name="line.2778"></a>
+<span class="sourceLineNo">2779</span>        if (rejectIfFromClient &amp;&amp; regionAction.getActionCount() &gt; 0 &amp;&amp;<a name="line.2779"></a>
+<span class="sourceLineNo">2780</span>          !isReplicationRequest(regionAction.getAction(0))) {<a name="line.2780"></a>
+<span class="sourceLineNo">2781</span>          // fail if it is not a replication request<a name="line.2781"></a>
+<span class="sourceLineNo">2782</span>          failRegionAction(responseBuilder, regionActionResultBuilder, regionAction, cellScanner,<a name="line.2782"></a>
+<span class="sourceLineNo">2783</span>            new DoNotRetryIOException(<a name="line.2783"></a>
+<span class="sourceLineNo">2784</span>              region.getRegionInfo().getRegionNameAsString() + " is in STANDBY state"));<a name="line.2784"></a>
+<span class="sourceLineNo">2785</span>          quota.close();<a name="line.2785"></a>
+<span class="sourceLineNo">2786</span>          continue;<a name="line.2786"></a>
+<span class="sourceLineNo">2787</span>        }<a name="line.2787"></a>
+<span class="sourceLineNo">2788</span>        // doNonAtomicRegionMutation manages the exception internally<a name="line.2788"></a>
+<span class="sourceLineNo">2789</span>        if (context != null &amp;&amp; closeCallBack == null) {<a name="line.2789"></a>
+<span class="sourceLineNo">2790</span>          // An RpcCallBack that creates a list of scanners that needs to perform callBack<a name="line.2790"></a>
+<span class="sourceLineNo">2791</span>          // operation on completion of multiGets.<a name="line.2791"></a>
+<span class="sourceLineNo">2792</span>          // Set this only once<a name="line.2792"></a>
+<span class="sourceLineNo">2793</span>          closeCallBack = new RegionScannersCloseCallBack();<a name="line.2793"></a>
+<span class="sourceLineNo">2794</span>          context.setCallBack(closeCallBack);<a name="line.2794"></a>
+<span class="sourceLineNo">2795</span>        }<a name="line.2795"></a>
+<span class="sourceLineNo">2796</span>        cellsToReturn = doNonAtomicRegionMutation(region, quota, regionAction, cellScanner,<a name="line.2796"></a>
+<span class="sourceLineNo">2797</span>            regionActionResultBuilder, cellsToReturn, nonceGroup, closeCallBack, context,<a name="line.2797"></a>
+<span class="sourceLineNo">2798</span>            spaceQuotaEnforcement);<a name="line.2798"></a>
+<span class="sourceLineNo">2799</span>      }<a name="line.2799"></a>
+<span class="source

<TRUNCATED>

[24/46] hbase-site git commit: Published site at 05d22ed960204183fbd9bd16f1dbca6410ccde76.

Posted by gi...@apache.org.
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/3649682c/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 c307d41..d82bfd8 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
@@ -1020,8 +1020,8 @@
 <span class="sourceLineNo">1012</span>  protected ClusterMetrics clusterStatus = null;<a name="line.1012"></a>
 <span class="sourceLineNo">1013</span>  protected ServerName masterServerName;<a name="line.1013"></a>
 <span class="sourceLineNo">1014</span>  protected MasterServices services;<a name="line.1014"></a>
-<span class="sourceLineNo">1015</span>  protected boolean tablesOnMaster;<a name="line.1015"></a>
-<span class="sourceLineNo">1016</span>  protected boolean onlySystemTablesOnMaster;<a name="line.1016"></a>
+<span class="sourceLineNo">1015</span>  protected boolean onlySystemTablesOnMaster;<a name="line.1015"></a>
+<span class="sourceLineNo">1016</span>  protected boolean maintenanceMode;<a name="line.1016"></a>
 <span class="sourceLineNo">1017</span><a name="line.1017"></a>
 <span class="sourceLineNo">1018</span>  @Override<a name="line.1018"></a>
 <span class="sourceLineNo">1019</span>  public void setConf(Configuration conf) {<a name="line.1019"></a>
@@ -1033,627 +1033,626 @@
 <span class="sourceLineNo">1025</span>    if (overallSlop &lt; 0) overallSlop = 0;<a name="line.1025"></a>
 <span class="sourceLineNo">1026</span>    else if (overallSlop &gt; 1) overallSlop = 1;<a name="line.1026"></a>
 <span class="sourceLineNo">1027</span><a name="line.1027"></a>
-<span class="sourceLineNo">1028</span>    this.tablesOnMaster = LoadBalancer.isTablesOnMaster(this.config);<a name="line.1028"></a>
-<span class="sourceLineNo">1029</span>    this.onlySystemTablesOnMaster = LoadBalancer.isSystemTablesOnlyOnMaster(this.config);<a name="line.1029"></a>
-<span class="sourceLineNo">1030</span>    // If system tables on master, implies tablesOnMaster = true.<a name="line.1030"></a>
-<span class="sourceLineNo">1031</span>    if (this.onlySystemTablesOnMaster &amp;&amp; !this.tablesOnMaster) {<a name="line.1031"></a>
-<span class="sourceLineNo">1032</span>      LOG.warn("Set " + TABLES_ON_MASTER + "=true because " + SYSTEM_TABLES_ON_MASTER + "=true");<a name="line.1032"></a>
-<span class="sourceLineNo">1033</span>      this.tablesOnMaster = true;<a name="line.1033"></a>
-<span class="sourceLineNo">1034</span>    }<a name="line.1034"></a>
-<span class="sourceLineNo">1035</span>    this.rackManager = new RackManager(getConf());<a name="line.1035"></a>
-<span class="sourceLineNo">1036</span>    if (useRegionFinder) {<a name="line.1036"></a>
-<span class="sourceLineNo">1037</span>      regionFinder.setConf(conf);<a name="line.1037"></a>
-<span class="sourceLineNo">1038</span>    }<a name="line.1038"></a>
-<span class="sourceLineNo">1039</span>    // Print out base configs. Don't print overallSlop since it for simple balancer exclusively.<a name="line.1039"></a>
-<span class="sourceLineNo">1040</span>    LOG.info("slop=" + this.slop + ", tablesOnMaster=" + this.tablesOnMaster +<a name="line.1040"></a>
-<span class="sourceLineNo">1041</span>      ", systemTablesOnMaster=" + this.onlySystemTablesOnMaster);<a name="line.1041"></a>
+<span class="sourceLineNo">1028</span>    this.onlySystemTablesOnMaster = LoadBalancer.isSystemTablesOnlyOnMaster(this.config);<a name="line.1028"></a>
+<span class="sourceLineNo">1029</span><a name="line.1029"></a>
+<span class="sourceLineNo">1030</span>    this.rackManager = new RackManager(getConf());<a name="line.1030"></a>
+<span class="sourceLineNo">1031</span>    if (useRegionFinder) {<a name="line.1031"></a>
+<span class="sourceLineNo">1032</span>      regionFinder.setConf(conf);<a name="line.1032"></a>
+<span class="sourceLineNo">1033</span>    }<a name="line.1033"></a>
+<span class="sourceLineNo">1034</span>    // Print out base configs. Don't print overallSlop since it for simple balancer exclusively.<a name="line.1034"></a>
+<span class="sourceLineNo">1035</span>    LOG.info("slop={}, systemTablesOnMaster={}",<a name="line.1035"></a>
+<span class="sourceLineNo">1036</span>        this.slop, this.onlySystemTablesOnMaster);<a name="line.1036"></a>
+<span class="sourceLineNo">1037</span>  }<a name="line.1037"></a>
+<span class="sourceLineNo">1038</span><a name="line.1038"></a>
+<span class="sourceLineNo">1039</span>  protected void setSlop(Configuration conf) {<a name="line.1039"></a>
+<span class="sourceLineNo">1040</span>    this.slop = conf.getFloat("hbase.regions.slop", (float) 0.2);<a name="line.1040"></a>
+<span class="sourceLineNo">1041</span>    this.overallSlop = conf.getFloat("hbase.regions.overallSlop", slop);<a name="line.1041"></a>
 <span class="sourceLineNo">1042</span>  }<a name="line.1042"></a>
 <span class="sourceLineNo">1043</span><a name="line.1043"></a>
-<span class="sourceLineNo">1044</span>  protected void setSlop(Configuration conf) {<a name="line.1044"></a>
-<span class="sourceLineNo">1045</span>    this.slop = conf.getFloat("hbase.regions.slop", (float) 0.2);<a name="line.1045"></a>
-<span class="sourceLineNo">1046</span>    this.overallSlop = conf.getFloat("hbase.regions.overallSlop", slop);<a name="line.1046"></a>
-<span class="sourceLineNo">1047</span>  }<a name="line.1047"></a>
-<span class="sourceLineNo">1048</span><a name="line.1048"></a>
-<span class="sourceLineNo">1049</span>  /**<a name="line.1049"></a>
-<span class="sourceLineNo">1050</span>   * Check if a region belongs to some system table.<a name="line.1050"></a>
-<span class="sourceLineNo">1051</span>   * If so, the primary replica may be expected to be put on the master regionserver.<a name="line.1051"></a>
-<span class="sourceLineNo">1052</span>   */<a name="line.1052"></a>
-<span class="sourceLineNo">1053</span>  public boolean shouldBeOnMaster(RegionInfo region) {<a name="line.1053"></a>
-<span class="sourceLineNo">1054</span>    return this.onlySystemTablesOnMaster &amp;&amp; region.getTable().isSystemTable();<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>   * Balance the regions that should be on master regionserver.<a name="line.1058"></a>
-<span class="sourceLineNo">1059</span>   */<a name="line.1059"></a>
-<span class="sourceLineNo">1060</span>  protected List&lt;RegionPlan&gt; balanceMasterRegions(Map&lt;ServerName, List&lt;RegionInfo&gt;&gt; clusterMap) {<a name="line.1060"></a>
-<span class="sourceLineNo">1061</span>    if (masterServerName == null || clusterMap == null || clusterMap.size() &lt;= 1) return null;<a name="line.1061"></a>
-<span class="sourceLineNo">1062</span>    List&lt;RegionPlan&gt; plans = null;<a name="line.1062"></a>
-<span class="sourceLineNo">1063</span>    List&lt;RegionInfo&gt; regions = clusterMap.get(masterServerName);<a name="line.1063"></a>
-<span class="sourceLineNo">1064</span>    if (regions != null) {<a name="line.1064"></a>
-<span class="sourceLineNo">1065</span>      Iterator&lt;ServerName&gt; keyIt = null;<a name="line.1065"></a>
-<span class="sourceLineNo">1066</span>      for (RegionInfo region: regions) {<a name="line.1066"></a>
-<span class="sourceLineNo">1067</span>        if (shouldBeOnMaster(region)) continue;<a name="line.1067"></a>
-<span class="sourceLineNo">1068</span><a name="line.1068"></a>
-<span class="sourceLineNo">1069</span>        // Find a non-master regionserver to host the region<a name="line.1069"></a>
-<span class="sourceLineNo">1070</span>        if (keyIt == null || !keyIt.hasNext()) {<a name="line.1070"></a>
-<span class="sourceLineNo">1071</span>          keyIt = clusterMap.keySet().iterator();<a name="line.1071"></a>
-<span class="sourceLineNo">1072</span>        }<a name="line.1072"></a>
-<span class="sourceLineNo">1073</span>        ServerName dest = keyIt.next();<a name="line.1073"></a>
-<span class="sourceLineNo">1074</span>        if (masterServerName.equals(dest)) {<a name="line.1074"></a>
-<span class="sourceLineNo">1075</span>          if (!keyIt.hasNext()) {<a name="line.1075"></a>
-<span class="sourceLineNo">1076</span>            keyIt = clusterMap.keySet().iterator();<a name="line.1076"></a>
-<span class="sourceLineNo">1077</span>          }<a name="line.1077"></a>
-<span class="sourceLineNo">1078</span>          dest = keyIt.next();<a name="line.1078"></a>
-<span class="sourceLineNo">1079</span>        }<a name="line.1079"></a>
-<span class="sourceLineNo">1080</span><a name="line.1080"></a>
-<span class="sourceLineNo">1081</span>        // Move this region away from the master regionserver<a name="line.1081"></a>
-<span class="sourceLineNo">1082</span>        RegionPlan plan = new RegionPlan(region, masterServerName, dest);<a name="line.1082"></a>
-<span class="sourceLineNo">1083</span>        if (plans == null) {<a name="line.1083"></a>
-<span class="sourceLineNo">1084</span>          plans = new ArrayList&lt;&gt;();<a name="line.1084"></a>
-<span class="sourceLineNo">1085</span>        }<a name="line.1085"></a>
-<span class="sourceLineNo">1086</span>        plans.add(plan);<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>    for (Map.Entry&lt;ServerName, List&lt;RegionInfo&gt;&gt; server: clusterMap.entrySet()) {<a name="line.1089"></a>
-<span class="sourceLineNo">1090</span>      if (masterServerName.equals(server.getKey())) continue;<a name="line.1090"></a>
-<span class="sourceLineNo">1091</span>      for (RegionInfo region: server.getValue()) {<a name="line.1091"></a>
-<span class="sourceLineNo">1092</span>        if (!shouldBeOnMaster(region)) continue;<a name="line.1092"></a>
-<span class="sourceLineNo">1093</span><a name="line.1093"></a>
-<span class="sourceLineNo">1094</span>        // Move this region to the master regionserver<a name="line.1094"></a>
-<span class="sourceLineNo">1095</span>        RegionPlan plan = new RegionPlan(region, server.getKey(), masterServerName);<a name="line.1095"></a>
-<span class="sourceLineNo">1096</span>        if (plans == null) {<a name="line.1096"></a>
-<span class="sourceLineNo">1097</span>          plans = new ArrayList&lt;&gt;();<a name="line.1097"></a>
-<span class="sourceLineNo">1098</span>        }<a name="line.1098"></a>
-<span class="sourceLineNo">1099</span>        plans.add(plan);<a name="line.1099"></a>
-<span class="sourceLineNo">1100</span>      }<a name="line.1100"></a>
-<span class="sourceLineNo">1101</span>    }<a name="line.1101"></a>
-<span class="sourceLineNo">1102</span>    return plans;<a name="line.1102"></a>
-<span class="sourceLineNo">1103</span>  }<a name="line.1103"></a>
-<span class="sourceLineNo">1104</span><a name="line.1104"></a>
-<span class="sourceLineNo">1105</span>  /**<a name="line.1105"></a>
-<span class="sourceLineNo">1106</span>   * If master is configured to carry system tables only, in here is<a name="line.1106"></a>
-<span class="sourceLineNo">1107</span>   * where we figure what to assign it.<a name="line.1107"></a>
-<span class="sourceLineNo">1108</span>   */<a name="line.1108"></a>
-<span class="sourceLineNo">1109</span>  protected Map&lt;ServerName, List&lt;RegionInfo&gt;&gt; assignMasterSystemRegions(<a name="line.1109"></a>
-<span class="sourceLineNo">1110</span>      Collection&lt;RegionInfo&gt; regions, List&lt;ServerName&gt; servers) {<a name="line.1110"></a>
-<span class="sourceLineNo">1111</span>    if (servers == null || regions == null || regions.isEmpty()) {<a name="line.1111"></a>
-<span class="sourceLineNo">1112</span>      return null;<a name="line.1112"></a>
-<span class="sourceLineNo">1113</span>    }<a name="line.1113"></a>
-<span class="sourceLineNo">1114</span>    Map&lt;ServerName, List&lt;RegionInfo&gt;&gt; assignments = new TreeMap&lt;&gt;();<a name="line.1114"></a>
-<span class="sourceLineNo">1115</span>    if (this.onlySystemTablesOnMaster) {<a name="line.1115"></a>
-<span class="sourceLineNo">1116</span>      if (masterServerName != null &amp;&amp; servers.contains(masterServerName)) {<a name="line.1116"></a>
-<span class="sourceLineNo">1117</span>        assignments.put(masterServerName, new ArrayList&lt;&gt;());<a name="line.1117"></a>
-<span class="sourceLineNo">1118</span>        for (RegionInfo region : regions) {<a name="line.1118"></a>
-<span class="sourceLineNo">1119</span>          if (shouldBeOnMaster(region)) {<a name="line.1119"></a>
-<span class="sourceLineNo">1120</span>            assignments.get(masterServerName).add(region);<a name="line.1120"></a>
-<span class="sourceLineNo">1121</span>          }<a name="line.1121"></a>
-<span class="sourceLineNo">1122</span>        }<a name="line.1122"></a>
-<span class="sourceLineNo">1123</span>      }<a name="line.1123"></a>
-<span class="sourceLineNo">1124</span>    }<a name="line.1124"></a>
-<span class="sourceLineNo">1125</span>    return assignments;<a name="line.1125"></a>
-<span class="sourceLineNo">1126</span>  }<a name="line.1126"></a>
-<span class="sourceLineNo">1127</span><a name="line.1127"></a>
-<span class="sourceLineNo">1128</span>  @Override<a name="line.1128"></a>
-<span class="sourceLineNo">1129</span>  public Configuration getConf() {<a name="line.1129"></a>
-<span class="sourceLineNo">1130</span>    return this.config;<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 synchronized void setClusterMetrics(ClusterMetrics st) {<a name="line.1134"></a>
-<span class="sourceLineNo">1135</span>    this.clusterStatus = st;<a name="line.1135"></a>
-<span class="sourceLineNo">1136</span>    if (useRegionFinder) {<a name="line.1136"></a>
-<span class="sourceLineNo">1137</span>      regionFinder.setClusterMetrics(st);<a name="line.1137"></a>
-<span class="sourceLineNo">1138</span>    }<a name="line.1138"></a>
-<span class="sourceLineNo">1139</span>  }<a name="line.1139"></a>
-<span class="sourceLineNo">1140</span><a name="line.1140"></a>
-<span class="sourceLineNo">1141</span>  @Override<a name="line.1141"></a>
-<span class="sourceLineNo">1142</span>  public void setClusterLoad(Map&lt;TableName, Map&lt;ServerName, List&lt;RegionInfo&gt;&gt;&gt; clusterLoad){<a name="line.1142"></a>
-<span class="sourceLineNo">1143</span><a name="line.1143"></a>
-<span class="sourceLineNo">1144</span>  }<a name="line.1144"></a>
-<span class="sourceLineNo">1145</span><a name="line.1145"></a>
-<span class="sourceLineNo">1146</span>  @Override<a name="line.1146"></a>
-<span class="sourceLineNo">1147</span>  public void setMasterServices(MasterServices masterServices) {<a name="line.1147"></a>
-<span class="sourceLineNo">1148</span>    masterServerName = masterServices.getServerName();<a name="line.1148"></a>
-<span class="sourceLineNo">1149</span>    this.services = masterServices;<a name="line.1149"></a>
-<span class="sourceLineNo">1150</span>    if (useRegionFinder) {<a name="line.1150"></a>
-<span class="sourceLineNo">1151</span>      this.regionFinder.setServices(masterServices);<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><a name="line.1154"></a>
-<span class="sourceLineNo">1155</span>  @Override<a name="line.1155"></a>
-<span class="sourceLineNo">1156</span>  public void postMasterStartupInitialize() {<a name="line.1156"></a>
-<span class="sourceLineNo">1157</span>    if (services != null &amp;&amp; regionFinder != null) {<a name="line.1157"></a>
-<span class="sourceLineNo">1158</span>      try {<a name="line.1158"></a>
-<span class="sourceLineNo">1159</span>        Set&lt;RegionInfo&gt; regions =<a name="line.1159"></a>
-<span class="sourceLineNo">1160</span>            services.getAssignmentManager().getRegionStates().getRegionAssignments().keySet();<a name="line.1160"></a>
-<span class="sourceLineNo">1161</span>        regionFinder.refreshAndWait(regions);<a name="line.1161"></a>
-<span class="sourceLineNo">1162</span>      } catch (Exception e) {<a name="line.1162"></a>
-<span class="sourceLineNo">1163</span>        LOG.warn("Refreshing region HDFS Block dist failed with exception, ignoring", e);<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><a name="line.1167"></a>
-<span class="sourceLineNo">1168</span>  public void setRackManager(RackManager rackManager) {<a name="line.1168"></a>
-<span class="sourceLineNo">1169</span>    this.rackManager = rackManager;<a name="line.1169"></a>
-<span class="sourceLineNo">1170</span>  }<a name="line.1170"></a>
-<span class="sourceLineNo">1171</span><a name="line.1171"></a>
-<span class="sourceLineNo">1172</span>  protected boolean needsBalance(Cluster c) {<a name="line.1172"></a>
-<span class="sourceLineNo">1173</span>    ClusterLoadState cs = new ClusterLoadState(c.clusterState);<a name="line.1173"></a>
-<span class="sourceLineNo">1174</span>    if (cs.getNumServers() &lt; MIN_SERVER_BALANCE) {<a name="line.1174"></a>
-<span class="sourceLineNo">1175</span>      if (LOG.isDebugEnabled()) {<a name="line.1175"></a>
-<span class="sourceLineNo">1176</span>        LOG.debug("Not running balancer because only " + cs.getNumServers()<a name="line.1176"></a>
-<span class="sourceLineNo">1177</span>            + " active regionserver(s)");<a name="line.1177"></a>
-<span class="sourceLineNo">1178</span>      }<a name="line.1178"></a>
-<span class="sourceLineNo">1179</span>      return false;<a name="line.1179"></a>
-<span class="sourceLineNo">1180</span>    }<a name="line.1180"></a>
-<span class="sourceLineNo">1181</span>    if(areSomeRegionReplicasColocated(c)) return true;<a name="line.1181"></a>
-<span class="sourceLineNo">1182</span>    // Check if we even need to do any load balancing<a name="line.1182"></a>
-<span class="sourceLineNo">1183</span>    // HBASE-3681 check sloppiness first<a name="line.1183"></a>
-<span class="sourceLineNo">1184</span>    float average = cs.getLoadAverage(); // for logging<a name="line.1184"></a>
-<span class="sourceLineNo">1185</span>    int floor = (int) Math.floor(average * (1 - slop));<a name="line.1185"></a>
-<span class="sourceLineNo">1186</span>    int ceiling = (int) Math.ceil(average * (1 + slop));<a name="line.1186"></a>
-<span class="sourceLineNo">1187</span>    if (!(cs.getMaxLoad() &gt; ceiling || cs.getMinLoad() &lt; floor)) {<a name="line.1187"></a>
-<span class="sourceLineNo">1188</span>      NavigableMap&lt;ServerAndLoad, List&lt;RegionInfo&gt;&gt; serversByLoad = cs.getServersByLoad();<a name="line.1188"></a>
-<span class="sourceLineNo">1189</span>      if (LOG.isTraceEnabled()) {<a name="line.1189"></a>
-<span class="sourceLineNo">1190</span>        // If nothing to balance, then don't say anything unless trace-level logging.<a name="line.1190"></a>
-<span class="sourceLineNo">1191</span>        LOG.trace("Skipping load balancing because balanced cluster; " +<a name="line.1191"></a>
-<span class="sourceLineNo">1192</span>          "servers=" + cs.getNumServers() +<a name="line.1192"></a>
-<span class="sourceLineNo">1193</span>          " regions=" + cs.getNumRegions() + " average=" + average +<a name="line.1193"></a>
-<span class="sourceLineNo">1194</span>          " mostloaded=" + serversByLoad.lastKey().getLoad() +<a name="line.1194"></a>
-<span class="sourceLineNo">1195</span>          " leastloaded=" + serversByLoad.firstKey().getLoad());<a name="line.1195"></a>
-<span class="sourceLineNo">1196</span>      }<a name="line.1196"></a>
-<span class="sourceLineNo">1197</span>      return false;<a name="line.1197"></a>
-<span class="sourceLineNo">1198</span>    }<a name="line.1198"></a>
-<span class="sourceLineNo">1199</span>    return true;<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>   * Subclasses should implement this to return true if the cluster has nodes that hosts<a name="line.1203"></a>
-<span class="sourceLineNo">1204</span>   * multiple replicas for the same region, or, if there are multiple racks and the same<a name="line.1204"></a>
-<span class="sourceLineNo">1205</span>   * rack hosts replicas of the same region<a name="line.1205"></a>
-<span class="sourceLineNo">1206</span>   * @param c Cluster information<a name="line.1206"></a>
-<span class="sourceLineNo">1207</span>   * @return whether region replicas are currently co-located<a name="line.1207"></a>
-<span class="sourceLineNo">1208</span>   */<a name="line.1208"></a>
-<span class="sourceLineNo">1209</span>  protected boolean areSomeRegionReplicasColocated(Cluster c) {<a name="line.1209"></a>
-<span class="sourceLineNo">1210</span>    return false;<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>   * Generates a bulk assignment plan to be used on cluster startup using a<a name="line.1214"></a>
-<span class="sourceLineNo">1215</span>   * simple round-robin assignment.<a name="line.1215"></a>
-<span class="sourceLineNo">1216</span>   * &lt;p&gt;<a name="line.1216"></a>
-<span class="sourceLineNo">1217</span>   * Takes a list of all the regions and all the servers in the cluster and<a name="line.1217"></a>
-<span class="sourceLineNo">1218</span>   * returns a map of each server to the regions that it should be assigned.<a name="line.1218"></a>
-<span class="sourceLineNo">1219</span>   * &lt;p&gt;<a name="line.1219"></a>
-<span class="sourceLineNo">1220</span>   * Currently implemented as a round-robin assignment. Same invariant as load<a name="line.1220"></a>
-<span class="sourceLineNo">1221</span>   * balancing, all servers holding floor(avg) or ceiling(avg).<a name="line.1221"></a>
-<span class="sourceLineNo">1222</span>   *<a name="line.1222"></a>
-<span class="sourceLineNo">1223</span>   * TODO: Use block locations from HDFS to place regions with their blocks<a name="line.1223"></a>
-<span class="sourceLineNo">1224</span>   *<a name="line.1224"></a>
-<span class="sourceLineNo">1225</span>   * @param regions all regions<a name="line.1225"></a>
-<span class="sourceLineNo">1226</span>   * @param servers all servers<a name="line.1226"></a>
-<span class="sourceLineNo">1227</span>   * @return map of server to the regions it should take, or null if no<a name="line.1227"></a>
-<span class="sourceLineNo">1228</span>   *         assignment is possible (ie. no regions or no servers)<a name="line.1228"></a>
-<span class="sourceLineNo">1229</span>   */<a name="line.1229"></a>
-<span class="sourceLineNo">1230</span>  @Override<a name="line.1230"></a>
-<span class="sourceLineNo">1231</span>  public Map&lt;ServerName, List&lt;RegionInfo&gt;&gt; roundRobinAssignment(List&lt;RegionInfo&gt; regions,<a name="line.1231"></a>
-<span class="sourceLineNo">1232</span>      List&lt;ServerName&gt; servers) throws HBaseIOException {<a name="line.1232"></a>
-<span class="sourceLineNo">1233</span>    metricsBalancer.incrMiscInvocations();<a name="line.1233"></a>
-<span class="sourceLineNo">1234</span>    Map&lt;ServerName, List&lt;RegionInfo&gt;&gt; assignments = assignMasterSystemRegions(regions, servers);<a name="line.1234"></a>
-<span class="sourceLineNo">1235</span>    if (assignments != null &amp;&amp; !assignments.isEmpty()) {<a name="line.1235"></a>
-<span class="sourceLineNo">1236</span>      servers = new ArrayList&lt;&gt;(servers);<a name="line.1236"></a>
-<span class="sourceLineNo">1237</span>      // Guarantee not to put other regions on master<a name="line.1237"></a>
-<span class="sourceLineNo">1238</span>      servers.remove(masterServerName);<a name="line.1238"></a>
-<span class="sourceLineNo">1239</span>      List&lt;RegionInfo&gt; masterRegions = assignments.get(masterServerName);<a name="line.1239"></a>
-<span class="sourceLineNo">1240</span>      if (!masterRegions.isEmpty()) {<a name="line.1240"></a>
-<span class="sourceLineNo">1241</span>        regions = new ArrayList&lt;&gt;(regions);<a name="line.1241"></a>
-<span class="sourceLineNo">1242</span>        regions.removeAll(masterRegions);<a name="line.1242"></a>
-<span class="sourceLineNo">1243</span>      }<a name="line.1243"></a>
-<span class="sourceLineNo">1244</span>    }<a name="line.1244"></a>
-<span class="sourceLineNo">1245</span>    if (regions == null || regions.isEmpty()) {<a name="line.1245"></a>
-<span class="sourceLineNo">1246</span>      return assignments;<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>    int numServers = servers == null ? 0 : servers.size();<a name="line.1249"></a>
-<span class="sourceLineNo">1250</span>    if (numServers == 0) {<a name="line.1250"></a>
-<span class="sourceLineNo">1251</span>      LOG.warn("Wanted to do round robin assignment but no servers to assign to");<a name="line.1251"></a>
-<span class="sourceLineNo">1252</span>      return null;<a name="line.1252"></a>
-<span class="sourceLineNo">1253</span>    }<a name="line.1253"></a>
-<span class="sourceLineNo">1254</span><a name="line.1254"></a>
-<span class="sourceLineNo">1255</span>    // TODO: instead of retainAssignment() and roundRobinAssignment(), we should just run the<a name="line.1255"></a>
-<span class="sourceLineNo">1256</span>    // normal LB.balancerCluster() with unassignedRegions. We only need to have a candidate<a name="line.1256"></a>
-<span class="sourceLineNo">1257</span>    // generator for AssignRegionAction. The LB will ensure the regions are mostly local<a name="line.1257"></a>
-<span class="sourceLineNo">1258</span>    // and balanced. This should also run fast with fewer number of iterations.<a name="line.1258"></a>
-<span class="sourceLineNo">1259</span><a name="line.1259"></a>
-<span class="sourceLineNo">1260</span>    if (numServers == 1) { // Only one server, nothing fancy we can do here<a name="line.1260"></a>
-<span class="sourceLineNo">1261</span>      ServerName server = servers.get(0);<a name="line.1261"></a>
-<span class="sourceLineNo">1262</span>      assignments.put(server, new ArrayList&lt;&gt;(regions));<a name="line.1262"></a>
-<span class="sourceLineNo">1263</span>      return assignments;<a name="line.1263"></a>
-<span class="sourceLineNo">1264</span>    }<a name="line.1264"></a>
-<span class="sourceLineNo">1265</span><a name="line.1265"></a>
-<span class="sourceLineNo">1266</span>    Cluster cluster = createCluster(servers, regions, false);<a name="line.1266"></a>
-<span class="sourceLineNo">1267</span>    List&lt;RegionInfo&gt; unassignedRegions = new ArrayList&lt;&gt;();<a name="line.1267"></a>
-<span class="sourceLineNo">1268</span><a name="line.1268"></a>
-<span class="sourceLineNo">1269</span>    roundRobinAssignment(cluster, regions, unassignedRegions,<a name="line.1269"></a>
-<span class="sourceLineNo">1270</span>      servers, assignments);<a name="line.1270"></a>
-<span class="sourceLineNo">1271</span><a name="line.1271"></a>
-<span class="sourceLineNo">1272</span>    List&lt;RegionInfo&gt; lastFewRegions = new ArrayList&lt;&gt;();<a name="line.1272"></a>
-<span class="sourceLineNo">1273</span>    // assign the remaining by going through the list and try to assign to servers one-by-one<a name="line.1273"></a>
-<span class="sourceLineNo">1274</span>    int serverIdx = RANDOM.nextInt(numServers);<a name="line.1274"></a>
-<span class="sourceLineNo">1275</span>    OUTER : for (RegionInfo region : unassignedRegions) {<a name="line.1275"></a>
-<span class="sourceLineNo">1276</span>      boolean assigned = false;<a name="line.1276"></a>
-<span class="sourceLineNo">1277</span>      INNER : for (int j = 0; j &lt; numServers; j++) { // try all servers one by one<a name="line.1277"></a>
-<span class="sourceLineNo">1278</span>        ServerName serverName = servers.get((j + serverIdx) % numServers);<a name="line.1278"></a>
-<span class="sourceLineNo">1279</span>        if (!cluster.wouldLowerAvailability(region, serverName)) {<a name="line.1279"></a>
-<span class="sourceLineNo">1280</span>          List&lt;RegionInfo&gt; serverRegions =<a name="line.1280"></a>
-<span class="sourceLineNo">1281</span>              assignments.computeIfAbsent(serverName, k -&gt; new ArrayList&lt;&gt;());<a name="line.1281"></a>
-<span class="sourceLineNo">1282</span>          if (!RegionReplicaUtil.isDefaultReplica(region.getReplicaId())) {<a name="line.1282"></a>
-<span class="sourceLineNo">1283</span>            // if the region is not a default replica<a name="line.1283"></a>
-<span class="sourceLineNo">1284</span>            // check if the assignments map has the other replica region on this server<a name="line.1284"></a>
-<span class="sourceLineNo">1285</span>            for (RegionInfo hri : serverRegions) {<a name="line.1285"></a>
-<span class="sourceLineNo">1286</span>              if (RegionReplicaUtil.isReplicasForSameRegion(region, hri)) {<a name="line.1286"></a>
-<span class="sourceLineNo">1287</span>                if (LOG.isTraceEnabled()) {<a name="line.1287"></a>
-<span class="sourceLineNo">1288</span>                  LOG.trace("Skipping the server, " + serverName<a name="line.1288"></a>
-<span class="sourceLineNo">1289</span>                      + " , got the same server for the region " + region);<a name="line.1289"></a>
-<span class="sourceLineNo">1290</span>                }<a name="line.1290"></a>
-<span class="sourceLineNo">1291</span>                // do not allow this case. The unassignedRegions we got because the<a name="line.1291"></a>
-<span class="sourceLineNo">1292</span>                // replica region in this list was not assigned because of lower availablity issue.<a name="line.1292"></a>
-<span class="sourceLineNo">1293</span>                // So when we assign here we should ensure that as far as possible the server being<a name="line.1293"></a>
-<span class="sourceLineNo">1294</span>                // selected does not have the server where the replica region was not assigned.<a name="line.1294"></a>
-<span class="sourceLineNo">1295</span>                continue INNER; // continue the inner loop, ie go to the next server<a name="line.1295"></a>
-<span class="sourceLineNo">1296</span>              }<a name="line.1296"></a>
-<span class="sourceLineNo">1297</span>            }<a name="line.1297"></a>
-<span class="sourceLineNo">1298</span>          }<a name="line.1298"></a>
-<span class="sourceLineNo">1299</span>          serverRegions.add(region);<a name="line.1299"></a>
-<span class="sourceLineNo">1300</span>          cluster.doAssignRegion(region, serverName);<a name="line.1300"></a>
-<span class="sourceLineNo">1301</span>          serverIdx = (j + serverIdx + 1) % numServers; //remain from next server<a name="line.1301"></a>
-<span class="sourceLineNo">1302</span>          assigned = true;<a name="line.1302"></a>
-<span class="sourceLineNo">1303</span>          break;<a name="line.1303"></a>
-<span class="sourceLineNo">1304</span>        }<a name="line.1304"></a>
-<span class="sourceLineNo">1305</span>      }<a name="line.1305"></a>
-<span class="sourceLineNo">1306</span>      if (!assigned) {<a name="line.1306"></a>
-<span class="sourceLineNo">1307</span>        lastFewRegions.add(region);<a name="line.1307"></a>
-<span class="sourceLineNo">1308</span>      }<a name="line.1308"></a>
-<span class="sourceLineNo">1309</span>    }<a name="line.1309"></a>
-<span class="sourceLineNo">1310</span>    // just sprinkle the rest of the regions on random regionservers. The balanceCluster will<a name="line.1310"></a>
-<span class="sourceLineNo">1311</span>    // make it optimal later. we can end up with this if numReplicas &gt; numServers.<a name="line.1311"></a>
-<span class="sourceLineNo">1312</span>    for (RegionInfo region : lastFewRegions) {<a name="line.1312"></a>
-<span class="sourceLineNo">1313</span>      int i = RANDOM.nextInt(numServers);<a name="line.1313"></a>
-<span class="sourceLineNo">1314</span>      ServerName server = servers.get(i);<a name="line.1314"></a>
-<span class="sourceLineNo">1315</span>      List&lt;RegionInfo&gt; serverRegions = assignments.computeIfAbsent(server, k -&gt; new ArrayList&lt;&gt;());<a name="line.1315"></a>
-<span class="sourceLineNo">1316</span>      serverRegions.add(region);<a name="line.1316"></a>
-<span class="sourceLineNo">1317</span>      cluster.doAssignRegion(region, server);<a name="line.1317"></a>
-<span class="sourceLineNo">1318</span>    }<a name="line.1318"></a>
-<span class="sourceLineNo">1319</span>    return assignments;<a name="line.1319"></a>
-<span class="sourceLineNo">1320</span>  }<a name="line.1320"></a>
-<span class="sourceLineNo">1321</span><a name="line.1321"></a>
-<span class="sourceLineNo">1322</span>  protected Cluster createCluster(List&lt;ServerName&gt; servers, Collection&lt;RegionInfo&gt; regions,<a name="line.1322"></a>
-<span class="sourceLineNo">1323</span>      boolean hasRegionReplica) {<a name="line.1323"></a>
-<span class="sourceLineNo">1324</span>    // Get the snapshot of the current assignments for the regions in question, and then create<a name="line.1324"></a>
-<span class="sourceLineNo">1325</span>    // a cluster out of it. Note that we might have replicas already assigned to some servers<a name="line.1325"></a>
-<span class="sourceLineNo">1326</span>    // earlier. So we want to get the snapshot to see those assignments, but this will only contain<a name="line.1326"></a>
-<span class="sourceLineNo">1327</span>    // replicas of the regions that are passed (for performance).<a name="line.1327"></a>
-<span class="sourceLineNo">1328</span>    Map&lt;ServerName, List&lt;RegionInfo&gt;&gt; clusterState = null;<a name="line.1328"></a>
-<span class="sourceLineNo">1329</span>    if (!hasRegionReplica) {<a name="line.1329"></a>
-<span class="sourceLineNo">1330</span>      clusterState = getRegionAssignmentsByServer(regions);<a name="line.1330"></a>
-<span class="sourceLineNo">1331</span>    } else {<a name="line.1331"></a>
-<span class="sourceLineNo">1332</span>      // for the case where we have region replica it is better we get the entire cluster's snapshot<a name="line.1332"></a>
-<span class="sourceLineNo">1333</span>      clusterState = getRegionAssignmentsByServer(null);<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>    for (ServerName server : servers) {<a name="line.1336"></a>
-<span class="sourceLineNo">1337</span>      if (!clusterState.containsKey(server)) {<a name="line.1337"></a>
-<span class="sourceLineNo">1338</span>        clusterState.put(server, EMPTY_REGION_LIST);<a name="line.1338"></a>
-<span class="sourceLineNo">1339</span>      }<a name="line.1339"></a>
-<span class="sourceLineNo">1340</span>    }<a name="line.1340"></a>
-<span class="sourceLineNo">1341</span>    return new Cluster(regions, clusterState, null, this.regionFinder,<a name="line.1341"></a>
-<span class="sourceLineNo">1342</span>        rackManager);<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>  private List&lt;ServerName&gt; findIdleServers(List&lt;ServerName&gt; servers) {<a name="line.1345"></a>
-<span class="sourceLineNo">1346</span>    return this.services.getServerManager()<a name="line.1346"></a>
-<span class="sourceLineNo">1347</span>            .getOnlineServersListWithPredicator(servers, IDLE_SERVER_PREDICATOR);<a name="line.1347"></a>
-<span class="sourceLineNo">1348</span>  }<a name="line.1348"></a>
-<span class="sourceLineNo">1349</span><a name="line.1349"></a>
-<span class="sourceLineNo">1350</span>  /**<a name="line.1350"></a>
-<span class="sourceLineNo">1351</span>   * Used to assign a single region to a random server.<a name="line.1351"></a>
-<span class="sourceLineNo">1352</span>   */<a name="line.1352"></a>
-<span class="sourceLineNo">1353</span>  @Override<a name="line.1353"></a>
-<span class="sourceLineNo">1354</span>  public ServerName randomAssignment(RegionInfo regionInfo, List&lt;ServerName&gt; servers)<a name="line.1354"></a>
-<span class="sourceLineNo">1355</span>      throws HBaseIOException {<a name="line.1355"></a>
-<span class="sourceLineNo">1356</span>    metricsBalancer.incrMiscInvocations();<a name="line.1356"></a>
-<span class="sourceLineNo">1357</span>    if (servers != null &amp;&amp; servers.contains(masterServerName)) {<a name="line.1357"></a>
-<span class="sourceLineNo">1358</span>      if (shouldBeOnMaster(regionInfo)) {<a name="line.1358"></a>
-<span class="sourceLineNo">1359</span>        return masterServerName;<a name="line.1359"></a>
-<span class="sourceLineNo">1360</span>      }<a name="line.1360"></a>
-<span class="sourceLineNo">1361</span>      if (!LoadBalancer.isTablesOnMaster(getConf())) {<a name="line.1361"></a>
-<span class="sourceLineNo">1362</span>        // Guarantee we do not put any regions on master<a name="line.1362"></a>
-<span class="sourceLineNo">1363</span>        servers = new ArrayList&lt;&gt;(servers);<a name="line.1363"></a>
-<span class="sourceLineNo">1364</span>        servers.remove(masterServerName);<a name="line.1364"></a>
-<span class="sourceLineNo">1365</span>      }<a name="line.1365"></a>
-<span class="sourceLineNo">1366</span>    }<a name="line.1366"></a>
-<span class="sourceLineNo">1367</span><a name="line.1367"></a>
-<span class="sourceLineNo">1368</span>    int numServers = servers == null ? 0 : servers.size();<a name="line.1368"></a>
-<span class="sourceLineNo">1369</span>    if (numServers == 0) {<a name="line.1369"></a>
-<span class="sourceLineNo">1370</span>      LOG.warn("Wanted to retain assignment but no servers to assign to");<a name="line.1370"></a>
-<span class="sourceLineNo">1371</span>      return null;<a name="line.1371"></a>
-<span class="sourceLineNo">1372</span>    }<a name="line.1372"></a>
-<span class="sourceLineNo">1373</span>    if (numServers == 1) { // Only one server, nothing fancy we can do here<a name="line.1373"></a>
-<span class="sourceLineNo">1374</span>      return servers.get(0);<a name="line.1374"></a>
-<span class="sourceLineNo">1375</span>    }<a name="line.1375"></a>
-<span class="sourceLineNo">1376</span>    List&lt;ServerName&gt; idleServers = findIdleServers(servers);<a name="line.1376"></a>
-<span class="sourceLineNo">1377</span>    if (idleServers.size() == 1) {<a name="line.1377"></a>
-<span class="sourceLineNo">1378</span>      return idleServers.get(0);<a name="line.1378"></a>
-<span class="sourceLineNo">1379</span>    }<a name="line.1379"></a>
-<span class="sourceLineNo">1380</span>    final List&lt;ServerName&gt; finalServers = idleServers.isEmpty() ?<a name="line.1380"></a>
-<span class="sourceLineNo">1381</span>            servers : idleServers;<a name="line.1381"></a>
-<span class="sourceLineNo">1382</span>    List&lt;RegionInfo&gt; regions = Lists.newArrayList(regionInfo);<a name="line.1382"></a>
-<span class="sourceLineNo">1383</span>    Cluster cluster = createCluster(finalServers, regions, false);<a name="line.1383"></a>
-<span class="sourceLineNo">1384</span>    return randomAssignment(cluster, regionInfo, finalServers);<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>  /**<a name="line.1387"></a>
-<span class="sourceLineNo">1388</span>   * Generates a bulk assignment startup plan, attempting to reuse the existing<a name="line.1388"></a>
-<span class="sourceLineNo">1389</span>   * assignment information from META, but adjusting for the specified list of<a name="line.1389"></a>
-<span class="sourceLineNo">1390</span>   * available/online servers available for assignment.<a name="line.1390"></a>
-<span class="sourceLineNo">1391</span>   * &lt;p&gt;<a name="line.1391"></a>
-<span class="sourceLineNo">1392</span>   * Takes a map of all regions to their existing assignment from META. Also<a name="line.1392"></a>
-<span class="sourceLineNo">1393</span>   * takes a list of online servers for regions to be assigned to. Attempts to<a name="line.1393"></a>
-<span class="sourceLineNo">1394</span>   * retain all assignment, so in some instances initial assignment will not be<a name="line.1394"></a>
-<span class="sourceLineNo">1395</span>   * completely balanced.<a name="line.1395"></a>
-<span class="sourceLineNo">1396</span>   * &lt;p&gt;<a name="line.1396"></a>
-<span class="sourceLineNo">1397</span>   * Any leftover regions without an existing server to be assigned to will be<a name="line.1397"></a>
-<span class="sourceLineNo">1398</span>   * assigned randomly to available servers.<a name="line.1398"></a>
-<span class="sourceLineNo">1399</span>   *<a name="line.1399"></a>
-<span class="sourceLineNo">1400</span>   * @param regions regions and existing assignment from meta<a name="line.1400"></a>
-<span class="sourceLineNo">1401</span>   * @param servers available servers<a name="line.1401"></a>
-<span class="sourceLineNo">1402</span>   * @return map of servers and regions to be assigned to them<a name="line.1402"></a>
-<span class="sourceLineNo">1403</span>   */<a name="line.1403"></a>
-<span class="sourceLineNo">1404</span>  @Override<a name="line.1404"></a>
-<span class="sourceLineNo">1405</span>  public Map&lt;ServerName, List&lt;RegionInfo&gt;&gt; retainAssignment(Map&lt;RegionInfo, ServerName&gt; regions,<a name="line.1405"></a>
-<span class="sourceLineNo">1406</span>      List&lt;ServerName&gt; servers) throws HBaseIOException {<a name="line.1406"></a>
-<span class="sourceLineNo">1407</span>    // Update metrics<a name="line.1407"></a>
-<span class="sourceLineNo">1408</span>    metricsBalancer.incrMiscInvocations();<a name="line.1408"></a>
-<span class="sourceLineNo">1409</span>    Map&lt;ServerName, List&lt;RegionInfo&gt;&gt; assignments = assignMasterSystemRegions(regions.keySet(), servers);<a name="line.1409"></a>
-<span class="sourceLineNo">1410</span>    if (assignments != null &amp;&amp; !assignments.isEmpty()) {<a name="line.1410"></a>
-<span class="sourceLineNo">1411</span>      servers = new ArrayList&lt;&gt;(servers);<a name="line.1411"></a>
-<span class="sourceLineNo">1412</span>      // Guarantee not to put other regions on master<a name="line.1412"></a>
-<span class="sourceLineNo">1413</span>      servers.remove(masterServerName);<a name="line.1413"></a>
-<span class="sourceLineNo">1414</span>      List&lt;RegionInfo&gt; masterRegions = assignments.get(masterServerName);<a name="line.1414"></a>
-<span class="sourceLineNo">1415</span>      regions = regions.entrySet().stream().filter(e -&gt; !masterRegions.contains(e.getKey()))<a name="line.1415"></a>
-<span class="sourceLineNo">1416</span>          .collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue));<a name="line.1416"></a>
-<span class="sourceLineNo">1417</span>    }<a name="line.1417"></a>
-<span class="sourceLineNo">1418</span>    if (regions.isEmpty()) {<a name="line.1418"></a>
-<span class="sourceLineNo">1419</span>      return assignments;<a name="line.1419"></a>
-<span class="sourceLineNo">1420</span>    }<a name="line.1420"></a>
-<span class="sourceLineNo">1421</span><a name="line.1421"></a>
-<span class="sourceLineNo">1422</span>    int numServers = servers == null ? 0 : servers.size();<a name="line.1422"></a>
-<span class="sourceLineNo">1423</span>    if (numServers == 0) {<a name="line.1423"></a>
-<span class="sourceLineNo">1424</span>      LOG.warn("Wanted to do retain assignment but no servers to assign to");<a name="line.1424"></a>
-<span class="sourceLineNo">1425</span>      return null;<a name="line.1425"></a>
-<span class="sourceLineNo">1426</span>    }<a name="line.1426"></a>
-<span class="sourceLineNo">1427</span>    if (numServers == 1) { // Only one server, nothing fancy we can do here<a name="line.1427"></a>
-<span class="sourceLineNo">1428</span>      ServerName server = servers.get(0);<a name="line.1428"></a>
-<span class="sourceLineNo">1429</span>      assignments.put(server, new ArrayList&lt;&gt;(regions.keySet()));<a name="line.1429"></a>
-<span class="sourceLineNo">1430</span>      return assignments;<a name="line.1430"></a>
-<span class="sourceLineNo">1431</span>    }<a name="line.1431"></a>
-<span class="sourceLineNo">1432</span><a name="line.1432"></a>
-<span class="sourceLineNo">1433</span>    // Group all of the old assignments by their hostname.<a name="line.1433"></a>
-<span class="sourceLineNo">1434</span>    // We can't group directly by ServerName since the servers all have<a name="line.1434"></a>
-<span class="sourceLineNo">1435</span>    // new start-codes.<a name="line.1435"></a>
-<span class="sourceLineNo">1436</span><a name="line.1436"></a>
-<span class="sourceLineNo">1437</span>    // Group the servers by their hostname. It's possible we have multiple<a name="line.1437"></a>
-<span class="sourceLineNo">1438</span>    // servers on the same host on different ports.<a name="line.1438"></a>
-<span class="sourceLineNo">1439</span>    ArrayListMultimap&lt;String, ServerName&gt; serversByHostname = ArrayListMultimap.create();<a name="line.1439"></a>
-<span class="sourceLineNo">1440</span>    for (ServerName server : servers) {<a name="line.1440"></a>
-<span class="sourceLineNo">1441</span>      assignments.put(server, new ArrayList&lt;&gt;());<a name="line.1441"></a>
-<span class="sourceLineNo">1442</span>      serversByHostname.put(server.getHostnameLowerCase(), server);<a name="line.1442"></a>
-<span class="sourceLineNo">1443</span>    }<a name="line.1443"></a>
-<span class="sourceLineNo">1444</span><a name="line.1444"></a>
-<span class="sourceLineNo">1445</span>    // Collection of the hostnames that used to have regions<a name="line.1445"></a>
-<span class="sourceLineNo">1446</span>    // assigned, but for which we no longer have any RS running<a name="line.1446"></a>
-<span class="sourceLineNo">1447</span>    // after the cluster restart.<a name="line.1447"></a>
-<span class="sourceLineNo">1448</span>    Set&lt;String&gt; oldHostsNoLongerPresent = Sets.newTreeSet();<a name="line.1448"></a>
-<span class="sourceLineNo">1449</span><a name="line.1449"></a>
-<span class="sourceLineNo">1450</span>    // If the old servers aren't present, lets assign those regions later.<a name="line.1450"></a>
-<span class="sourceLineNo">1451</span>    List&lt;RegionInfo&gt; randomAssignRegions = Lists.newArrayList();<a name="line.1451"></a>
-<span class="sourceLineNo">1452</span><a name="line.1452"></a>
-<span class="sourceLineNo">1453</span>    int numRandomAssignments = 0;<a name="line.1453"></a>
-<span class="sourceLineNo">1454</span>    int numRetainedAssigments = 0;<a name="line.1454"></a>
-<span class="sourceLineNo">1455</span>    boolean hasRegionReplica = false;<a name="line.1455"></a>
-<span class="sourceLineNo">1456</span>    for (Map.Entry&lt;RegionInfo, ServerName&gt; entry : regions.entrySet()) {<a name="line.1456"></a>
-<span class="sourceLineNo">1457</span>      RegionInfo region = entry.getKey();<a name="line.1457"></a>
-<span class="sourceLineNo">1458</span>      ServerName oldServerName = entry.getValue();<a name="line.1458"></a>
-<span class="sourceLineNo">1459</span>      // In the current set of regions even if one has region replica let us go with<a name="line.1459"></a>
-<span class="sourceLineNo">1460</span>      // getting the entire snapshot<a name="line.1460"></a>
-<span class="sourceLineNo">1461</span>      if (this.services != null) { // for tests<a name="line.1461"></a>
-<span class="sourceLineNo">1462</span>        AssignmentManager am = this.services.getAssignmentManager();<a name="line.1462"></a>
-<span class="sourceLineNo">1463</span>        if (am != null) {<a name="line.1463"></a>
-<span class="sourceLineNo">1464</span>          RegionStates states = am.getRegionStates();<a name="line.1464"></a>
-<span class="sourceLineNo">1465</span>          if (!hasRegionReplica &amp;&amp; states != null &amp;&amp; states.isReplicaAvailableForRegion(region)) {<a name="line.1465"></a>
-<span class="sourceLineNo">1466</span>            hasRegionReplica = true;<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>      List&lt;ServerName&gt; localServers = new ArrayList&lt;&gt;();<a name="line.1470"></a>
-<span class="sourceLineNo">1471</span>      if (oldServerName != null) {<a name="line.1471"></a>
-<span class="sourceLineNo">1472</span>        localServers = serversByHostname.get(oldServerName.getHostnameLowerCase());<a name="line.1472"></a>
-<span class="sourceLineNo">1473</span>      }<a name="line.1473"></a>
-<span class="sourceLineNo">1474</span>      if (localServers.isEmpty()) {<a name="line.1474"></a>
-<span class="sourceLineNo">1475</span>        // No servers on the new cluster match up with this hostname, assign randomly, later.<a name="line.1475"></a>
-<span class="sourceLineNo">1476</span>        randomAssignRegions.add(region);<a name="line.1476"></a>
-<span class="sourceLineNo">1477</span>        if (oldServerName != null) {<a name="line.1477"></a>
-<span class="sourceLineNo">1478</span>          oldHostsNoLongerPresent.add(oldServerName.getHostnameLowerCase());<a name="line.1478"></a>
-<span class="sourceLineNo">1479</span>        }<a name="line.1479"></a>
-<span class="sourceLineNo">1480</span>      } else if (localServers.size() == 1) {<a name="line.1480"></a>
-<span class="sourceLineNo">1481</span>        // the usual case - one new server on same host<a name="line.1481"></a>
-<span class="sourceLineNo">1482</span>        ServerName target = localServers.get(0);<a name="line.1482"></a>
-<span class="sourceLineNo">1483</span>        assignments.get(target).add(region);<a name="line.1483"></a>
-<span class="sourceLineNo">1484</span>        numRetainedAssigments++;<a name="line.1484"></a>
-<span class="sourceLineNo">1485</span>      } else {<a name="line.1485"></a>
-<span class="sourceLineNo">1486</span>        // multiple new servers in the cluster on this same host<a name="line.1486"></a>
-<span class="sourceLineNo">1487</span>        if (localServers.contains(oldServerName)) {<a name="line.1487"></a>
-<span class="sourceLineNo">1488</span>          assignments.get(oldServerName).add(region);<a name="line.1488"></a>
-<span class="sourceLineNo">1489</span>          numRetainedAssigments++;<a name="line.1489"></a>
-<span class="sourceLineNo">1490</span>        } else {<a name="line.1490"></a>
-<span class="sourceLineNo">1491</span>          ServerName target = null;<a name="line.1491"></a>
-<span class="sourceLineNo">1492</span>          for (ServerName tmp : localServers) {<a name="line.1492"></a>
-<span class="sourceLineNo">1493</span>            if (tmp.getPort() == oldServerName.getPort()) {<a name="line.1493"></a>
-<span class="sourceLineNo">1494</span>              target = tmp;<a name="line.1494"></a>
-<span class="sourceLineNo">1495</span>              assignments.get(tmp).add(region);<a name="line.1495"></a>
-<span class="sourceLineNo">1496</span>              numRetainedAssigments++;<a name="line.1496"></a>
-<span class="sourceLineNo">1497</span>              break;<a name="line.1497"></a>
-<span class="sourceLineNo">1498</span>            }<a name="line.1498"></a>
-<span class="sourceLineNo">1499</span>          }<a name="line.1499"></a>
-<span class="sourceLineNo">1500</span>          if (target == null) {<a name="line.1500"></a>
-<span class="sourceLineNo">1501</span>            randomAssignRegions.add(region);<a name="line.1501"></a>
-<span class="sourceLineNo">1502</span>          }<a name="line.1502"></a>
-<span class="sourceLineNo">1503</span>        }<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><a name="line.1506"></a>
-<span class="sourceLineNo">1507</span>    // If servers from prior assignment aren't present, then lets do randomAssignment on regions.<a name="line.1507"></a>
-<span class="sourceLineNo">1508</span>    if (randomAssignRegions.size() &gt; 0) {<a name="line.1508"></a>
-<span class="sourceLineNo">1509</span>      Cluster cluster = createCluster(servers, regions.keySet(), hasRegionReplica);<a name="line.1509"></a>
-<span class="sourceLineNo">1510</span>      for (Map.Entry&lt;ServerName, List&lt;RegionInfo&gt;&gt; entry : assignments.entrySet()) {<a name="line.1510"></a>
-<span class="sourceLineNo">1511</span>        ServerName sn = entry.getKey();<a name="line.1511"></a>
-<span class="sourceLineNo">1512</span>        for (RegionInfo region : entry.getValue()) {<a name="line.1512"></a>
-<span class="sourceLineNo">1513</span>          cluster.doAssignRegion(region, sn);<a name="line.1513"></a>
-<span class="sourceLineNo">1514</span>        }<a name="line.1514"></a>
-<span class="sourceLineNo">1515</span>      }<a name="line.1515"></a>
-<span class="sourceLineNo">1516</span>      for (RegionInfo region : randomAssignRegions) {<a name="line.1516"></a>
-<span class="sourceLineNo">1517</span>        ServerName target = randomAssignment(cluster, region, servers);<a name="line.1517"></a>
-<span class="sourceLineNo">1518</span>        assignments.get(target).add(region);<a name="line.1518"></a>
-<span class="sourceLineNo">1519</span>        numRandomAssignments++;<a name="line.1519"></a>
-<span class="sourceLineNo">1520</span>      }<a name="line.1520"></a>
-<span class="sourceLineNo">1521</span>    }<a name="line.1521"></a>
-<span class="sourceLineNo">1522</span><a name="line.1522"></a>
-<span class="sourceLineNo">1523</span>    String randomAssignMsg = "";<a name="line.1523"></a>
-<span class="sourceLineNo">1524</span>    if (numRandomAssignments &gt; 0) {<a name="line.1524"></a>
-<span class="sourceLineNo">1525</span>      randomAssignMsg =<a name="line.1525"></a>
-<span class="sourceLineNo">1526</span>          numRandomAssignments + " regions were assigned "<a name="line.1526"></a>
-<span class="sourceLineNo">1527</span>              + "to random hosts, since the old hosts for these regions are no "<a name="line.1527"></a>
-<span class="sourceLineNo">1528</span>              + "longer present in the cluster. These hosts were:\n  "<a name="line.1528"></a>
-<span class="sourceLineNo">1529</span>              + Joiner.on("\n  ").join(oldHostsNoLongerPresent);<a name="line.1529"></a>
-<span class="sourceLineNo">1530</span>    }<a name="line.1530"></a>
-<span class="sourceLineNo">1531</span><a name="line.1531"></a>
-<span class="sourceLineNo">1532</span>    LOG.info("Reassigned " + regions.size() + " regions. " + numRetainedAssigments<a name="line.1532"></a>
-<span class="sourceLineNo">1533</span>        + " retained the pre-restart assignment. " + randomAssignMsg);<a name="line.1533"></a>
-<span class="sourceLineNo">1534</span>    return assignments;<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>  @Override<a name="line.1537"></a>
-<span class="sourceLineNo">1538</span>  public void initialize() throws HBaseIOException{<a name="line.1538"></a>
-<span class="sourceLineNo">1539</span>  }<a name="line.1539"></a>
-<span class="sourceLineNo">1540</span><a name="line.1540"></a>
-<span class="sourceLineNo">1541</span>  @Override<a name="line.1541"></a>
-<span class="sourceLineNo">1542</span>  public void regionOnline(RegionInfo regionInfo, ServerName sn) {<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>  @Override<a name="line.1545"></a>
-<span class="sourceLineNo">1546</span>  public void regionOffline(RegionInfo regionInfo) {<a name="line.1546"></a>
-<span class="sourceLineNo">1547</span>  }<a name="line.1547"></a>
-<span class="sourceLineNo">1548</span><a name="line.1548"></a>
-<span class="sourceLineNo">1549</span>  @Override<a name="line.1549"></a>
-<span class="sourceLineNo">1550</span>  public boolean isStopped() {<a name="line.1550"></a>
-<span class="sourceLineNo">1551</span>    return stopped;<a name="line.1551"></a>
-<span class="sourceLineNo">1552</span>  }<a name="line.1552"></a>
-<span class="sourceLineNo">1553</span><a name="line.1553"></a>
-<span class="sourceLineNo">1554</span>  @Override<a name="line.1554"></a>
-<span class="sourceLineNo">1555</span>  public void stop(String why) {<a name="line.1555"></a>
-<span class="sourceLineNo">1556</span>    LOG.info("Load Balancer stop requested: "+why);<a name="line.1556"></a>
-<span class="sourceLineNo">1557</span>    stopped = true;<a name="line.1557"></a>
-<span class="sourceLineNo">1558</span>  }<a name="line.1558"></a>
-<span class="sourceLineNo">1559</span><a name="line.1559"></a>
-<span class="sourceLineNo">1560</span>  /**<a name="line.1560"></a>
-<span class="sourceLineNo">1561</span>  * Updates the balancer status tag reported to JMX<a name="line.1561"></a>
-<span class="sourceLineNo">1562</span>  */<a name="line.1562"></a>
-<span class="sourceLineNo">1563</span>  public void updateBalancerStatus(boolean status) {<a name="line.1563"></a>
-<span class="sourceLineNo">1564</span>    metricsBalancer.balancerStatus(status);<a name="line.1564"></a>
-<span class="sourceLineNo">1565</span>  }<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>   * Used to assign a single region to a random server.<a name="line.1568"></a>
-<span class="sourceLineNo">1569</span>   */<a name="line.1569"></a>
-<span class="sourceLineNo">1570</span>  private ServerName randomAssignment(Cluster cluster, RegionInfo regionInfo,<a name="line.1570"></a>
-<span class="sourceLineNo">1571</span>      List&lt;ServerName&gt; servers) {<a name="line.1571"></a>
-<span class="sourceLineNo">1572</span>    int numServers = servers.size(); // servers is not null, numServers &gt; 1<a name="line.1572"></a>
-<span class="sourceLineNo">1573</span>    ServerName sn = null;<a name="line.1573"></a>
-<span class="sourceLineNo">1574</span>    final int maxIterations = numServers * 4;<a name="line.1574"></a>
-<span class="sourceLineNo">1575</span>    int iterations = 0;<a name="line.1575"></a>
-<span class="sourceLineNo">1576</span>    List&lt;ServerName&gt; usedSNs = new ArrayList&lt;&gt;(servers.size());<a name="line.1576"></a>
-<span class="sourceLineNo">1577</span>    do {<a name="line.1577"></a>
-<span class="sourceLineNo">1578</span>      int i = RANDOM.nextInt(numServers);<a name="line.1578"></a>
-<span class="sourceLineNo">1579</span>      sn = servers.get(i);<a name="line.1579"></a>
-<span class="sourceLineNo">1580</span>      if (!usedSNs.contains(sn)) {<a name="line.1580"></a>
-<span class="sourceLineNo">1581</span>        usedSNs.add(sn);<a name="line.1581"></a>
-<span class="sourceLineNo">1582</span>      }<a name="line.1582"></a>
-<span class="sourceLineNo">1583</span>    } while (cluster.wouldLowerAvailability(regionInfo, sn)<a name="line.1583"></a>
-<span class="sourceLineNo">1584</span>        &amp;&amp; iterations++ &lt; maxIterations);<a name="line.1584"></a>
-<span class="sourceLineNo">1585</span>    if (iterations &gt;= maxIterations) {<a name="line.1585"></a>
-<span class="sourceLineNo">1586</span>      // We have reached the max. Means the servers that we collected is still lowering the<a name="line.1586"></a>
-<span class="sourceLineNo">1587</span>      // availability<a name="line.1587"></a>
-<span class="sourceLineNo">1588</span>      for (ServerName unusedServer : servers) {<a name="line.1588"></a>
-<span class="sourceLineNo">1589</span>        if (!usedSNs.contains(unusedServer)) {<a name="line.1589"></a>
-<span class="sourceLineNo">1590</span>          // check if any other unused server is there for us to use.<a name="line.1590"></a>
-<span class="sourceLineNo">1591</span>          // If so use it. Else we have not other go but to go with one of them<a name="line.1591"></a>
-<span class="sourceLineNo">1592</span>          if (!cluster.wouldLowerAvailability(regionInfo, unusedServer)) {<a name="line.1592"></a>
-<span class="sourceLineNo">1593</span>            sn = unusedServer;<a name="line.1593"></a>
-<span class="sourceLineNo">1594</span>            break;<a name="line.1594"></a>
-<span class="sourceLineNo">1595</span>          }<a name="line.1595"></a>
-<span class="sourceLineNo">1596</span>        }<a name="line.1596"></a>
-<span class="sourceLineNo">1597</span>      }<a name="line.1597"></a>
-<span class="sourceLineNo">1598</span>    }<a name="line.1598"></a>
-<span class="sourceLineNo">1599</span>    cluster.doAssignRegion(regionInfo, sn);<a name="line.1599"></a>
-<span class="sourceLineNo">1600</span>    return sn;<a name="line.1600"></a>
-<span class="sourceLineNo">1601</span>  }<a name="line.1601"></a>
-<span class="sourceLineNo">1602</span><a name="line.1602"></a>
-<span class="sourceLineNo">1603</span>  /**<a name="line.1603"></a>
-<span class="sourceLineNo">1604</span>   * Round robin a list of regions to a list of servers<a name="line.1604"></a>
-<span class="sourceLineNo">1605</span>   */<a name="line.1605"></a>
-<span class="sourceLineNo">1606</span>  private void roundRobinAssignment(Cluster cluster, List&lt;RegionInfo&gt; regions,<a name="line.1606"></a>
-<span class="sourceLineNo">1607</span>      List&lt;RegionInfo&gt; unassignedRegions, List&lt;ServerName&gt; servers,<a name="line.1607"></a>
-<span class="sourceLineNo">1608</span>      Map&lt;ServerName, List&lt;RegionInfo&gt;&gt; assignments) {<a name="line.1608"></a>
-<span class="sourceLineNo">1609</span><a name="line.1609"></a>
-<span class="sourceLineNo">1610</span>    int numServers = servers.size();<a name="line.1610"></a>
-<span class="sourceLineNo">1611</span>    int numRegions = regions.size();<a name="line.1611"></a>
-<span class="sourceLineNo">1612</span>    int max = (int) Math.ceil((float) numRegions / numServers);<a name="line.1612"></a>
-<span class="sourceLineNo">1613</span>    int serverIdx = 0;<a name="line.1613"></a>
-<span class="sourceLineNo">1614</span>    if (numServers &gt; 1) {<a name="line.1614"></a>
-<span class="sourceLineNo">1615</span>      serverIdx = RANDOM.nextInt(numServers);<a name="line.1615"></a>
-<span class="sourceLineNo">1616</span>    }<a name="line.1616"></a>
-<span class="sourceLineNo">1617</span>    int regionIdx = 0;<a name="line.1617"></a>
-<span class="sourceLineNo">1618</span><a name="line.1618"></a>
-<span class="sourceLineNo">1619</span>    for (int j = 0; j &lt; numServers; j++) {<a name="line.1619"></a>
-<span class="sourceLineNo">1620</span>      ServerName server = servers.get((j + serverIdx) % numServers);<a name="line.1620"></a>
-<span class="sourceLineNo">1621</span>      List&lt;RegionInfo&gt; serverRegions = new ArrayList&lt;&gt;(max);<a name="line.1621"></a>
-<span class="sourceLineNo">1622</span>      for (int i = regionIdx; i &lt; numRegions; i += numServers) {<a name="line.1622"></a>
-<span class="sourceLineNo">1623</span>        RegionInfo region = regions.get(i % numRegions);<a name="line.1623"></a>
-<span class="sourceLineNo">1624</span>        if (cluster.wouldLowerAvailability(region, server)) {<a name="line.1624"></a>
-<span class="sourceLineNo">1625</span>          unassignedRegions.add(region);<a name="line.1625"></a>
-<span class="sourceLineNo">1626</span>        } else {<a name="line.1626"></a>
-<span class="sourceLineNo">1627</span>          serverRegions.add(region);<a name="line.1627"></a>
-<span class="sourceLineNo">1628</span>          cluster.doAssignRegion(region, server);<a name="line.1628"></a>
-<span class="sourceLineNo">1629</span>        }<a name="line.1629"></a>
-<span class="sourceLineNo">1630</span>      }<a name="line.1630"></a>
-<span class="sourceLineNo">1631</span>      assignments.put(server, serverRegions);<a name="line.1631"></a>
-<span class="sourceLineNo">1632</span>      regionIdx++;<a name="line.1632"></a>
-<span class="sourceLineNo">1633</span>    }<a name="line.1633"></a>
-<span class="sourceLineNo">1634</span>  }<a name="line.1634"></a>
-<span class="sourceLineNo">1635</span><a name="line.1635"></a>
-<span class="sourceLineNo">1636</span>  protected Map&lt;ServerName, List&lt;RegionInfo&gt;&gt; getRegionAssignmentsByServer(<a name="line.1636"></a>
-<span class="sourceLineNo">1637</span>    Collection&lt;RegionInfo&gt; regions) {<a name="line.1637"></a>
-<span class="sourceLineNo">1638</span>    if (this.services != null &amp;&amp; this.services.getAssignmentManager() != null) {<a name="line.1638"></a>
-<span class="sourceLineNo">1639</span>      return this.services.getAssignmentManager().getSnapShotOfAssignment(regions);<a name="line.1639"></a>
-<span class="sourceLineNo">1640</span>    } else {<a name="line.1640"></a>
-<span class="sourceLineNo">1641</span>      return new HashMap&lt;&gt;();<a name="line.1641"></a>
-<span class="sourceLineNo">1642</span>    }<a name="line.1642"></a>
-<span class="sourceLineNo">1643</span>  }<a name="line.1643"></a>
-<span class="sourceLineNo">1644</span><a name="line.1644"></a>
-<span class="sourceLineNo">1645</span>  @Override<a name="line.1645"></a>
-<span class="sourceLineNo">1646</span>  public void onConfigurationChange(Configuration conf) {<a name="line.1646"></a>
-<span class="sourceLineNo">1647</span>  }<a name="line.1647"></a>
-<span class="sourceLineNo">1648</span>}<a name="line.1648"></a>
+<span class="sourceLineNo">1044</span>  /**<a name="line.1044"></a>
+<span class="sourceLineNo">1045</span>   * Check if a region belongs to some system table.<a name="line.1045"></a>
+<span class="sourceLineNo">1046</span>   * If so, the primary replica may be expected to be put on the master regionserver.<a name="line.1046"></a>
+<span class="sourceLineNo">1047</span>   */<a name="line.1047"></a>
+<span class="sourceLineNo">1048</span>  public boolean shouldBeOnMaster(RegionInfo region) {<a name="line.1048"></a>
+<span class="sourceLineNo">1049</span>    return (this.maintenanceMode || this.onlySystemTablesOnMaster)<a name="line.1049"></a>
+<span class="sourceLineNo">1050</span>        &amp;&amp; region.getTable().isSystemTable();<a name="line.1050"></a>
+<span class="sourceLineNo">1051</span>  }<a name="line.1051"></a>
+<span class="sourceLineNo">1052</span><a name="line.1052"></a>
+<span class="sourceLineNo">1053</span>  /**<a name="line.1053"></a>
+<span class="sourceLineNo">1054</span>   * Balance the regions that should be on master regionserver.<a name="line.1054"></a>
+<span class="sourceLineNo">1055</span>   */<a name="line.1055"></a>
+<span class="sourceLineNo">1056</span>  protected List&lt;RegionPlan&gt; balanceMasterRegions(Map&lt;ServerName, List&lt;RegionInfo&gt;&gt; clusterMap) {<a name="line.1056"></a>
+<span class="sourceLineNo">1057</span>    if (masterServerName == null || clusterMap == null || clusterMap.size() &lt;= 1) return null;<a name="line.1057"></a>
+<span class="sourceLineNo">1058</span>    List&lt;RegionPlan&gt; plans = null;<a name="line.1058"></a>
+<span class="sourceLineNo">1059</span>    List&lt;RegionInfo&gt; regions = clusterMap.get(masterServerName);<a name="line.1059"></a>
+<span class="sourceLineNo">1060</span>    if (regions != null) {<a name="line.1060"></a>
+<span class="sourceLineNo">1061</span>      Iterator&lt;ServerName&gt; keyIt = null;<a name="line.1061"></a>
+<span class="sourceLineNo">1062</span>      for (RegionInfo region: regions) {<a name="line.1062"></a>
+<span class="sourceLineNo">1063</span>        if (shouldBeOnMaster(region)) continue;<a name="line.1063"></a>
+<span class="sourceLineNo">1064</span><a name="line.1064"></a>
+<span class="sourceLineNo">1065</span>        // Find a non-master regionserver to host the region<a name="line.1065"></a>
+<span class="sourceLineNo">1066</span>        if (keyIt == null || !keyIt.hasNext()) {<a name="line.1066"></a>
+<span class="sourceLineNo">1067</span>          keyIt = clusterMap.keySet().iterator();<a name="line.1067"></a>
+<span class="sourceLineNo">1068</span>        }<a name="line.1068"></a>
+<span class="sourceLineNo">1069</span>        ServerName dest = keyIt.next();<a name="line.1069"></a>
+<span class="sourceLineNo">1070</span>        if (masterServerName.equals(dest)) {<a name="line.1070"></a>
+<span class="sourceLineNo">1071</span>          if (!keyIt.hasNext()) {<a name="line.1071"></a>
+<span class="sourceLineNo">1072</span>            keyIt = clusterMap.keySet().iterator();<a name="line.1072"></a>
+<span class="sourceLineNo">1073</span>          }<a name="line.1073"></a>
+<span class="sourceLineNo">1074</span>          dest = keyIt.next();<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>        // Move this region away from the master regionserver<a name="line.1077"></a>
+<span class="sourceLineNo">1078</span>        RegionPlan plan = new RegionPlan(region, masterServerName, dest);<a name="line.1078"></a>
+<span class="sourceLineNo">1079</span>        if (plans == null) {<a name="line.1079"></a>
+<span class="sourceLineNo">1080</span>          plans = new ArrayList&lt;&gt;();<a name="line.1080"></a>
+<span class="sourceLineNo">1081</span>        }<a name="line.1081"></a>
+<span class="sourceLineNo">1082</span>        plans.add(plan);<a name="line.1082"></a>
+<span class="sourceLineNo">1083</span>      }<a name="line.1083"></a>
+<span class="sourceLineNo">1084</span>    }<a name="line.1084"></a>
+<span class="sourceLineNo">1085</span>    for (Map.Entry&lt;ServerName, List&lt;RegionInfo&gt;&gt; server: clusterMap.entrySet()) {<a name="line.1085"></a>
+<span class="sourceLineNo">1086</span>      if (masterServerName.equals(server.getKey())) continue;<a name="line.1086"></a>
+<span class="sourceLineNo">1087</span>      for (RegionInfo region: server.getValue()) {<a name="line.1087"></a>
+<span class="sourceLineNo">1088</span>        if (!shouldBeOnMaster(region)) continue;<a name="line.1088"></a>
+<span class="sourceLineNo">1089</span><a name="line.1089"></a>
+<span class="sourceLineNo">1090</span>        // Move this region to the master regionserver<a name="line.1090"></a>
+<span class="sourceLineNo">1091</span>        RegionPlan plan = new RegionPlan(region, server.getKey(), masterServerName);<a name="line.1091"></a>
+<span class="sourceLineNo">1092</span>        if (plans == null) {<a name="line.1092"></a>
+<span class="sourceLineNo">1093</span>          plans = new ArrayList&lt;&gt;();<a name="line.1093"></a>
+<span class="sourceLineNo">1094</span>        }<a name="line.1094"></a>
+<span class="sourceLineNo">1095</span>        plans.add(plan);<a name="line.1095"></a>
+<span class="sourceLineNo">1096</span>      }<a name="line.1096"></a>
+<span class="sourceLineNo">1097</span>    }<a name="line.1097"></a>
+<span class="sourceLineNo">1098</span>    return plans;<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>  /**<a name="line.1101"></a>
+<span class="sourceLineNo">1102</span>   * If master is configured to carry system tables only, in here is<a name="line.1102"></a>
+<span class="sourceLineNo">1103</span>   * where we figure what to assign it.<a name="line.1103"></a>
+<span class="sourceLineNo">1104</span>   */<a name="line.1104"></a>
+<span class="sourceLineNo">1105</span>  protected Map&lt;ServerName, List&lt;RegionInfo&gt;&gt; assignMasterSystemRegions(<a name="line.1105"></a>
+<span class="sourceLineNo">1106</span>      Collection&lt;RegionInfo&gt; regions, List&lt;ServerName&gt; servers) {<a name="line.1106"></a>
+<span class="sourceLineNo">1107</span>    if (servers == null || regions == null || regions.isEmpty()) {<a name="line.1107"></a>
+<span class="sourceLineNo">1108</span>      return null;<a name="line.1108"></a>
+<span class="sourceLineNo">1109</span>    }<a name="line.1109"></a>
+<span class="sourceLineNo">1110</span>    Map&lt;ServerName, List&lt;RegionInfo&gt;&gt; assignments = new TreeMap&lt;&gt;();<a name="line.1110"></a>
+<span class="sourceLineNo">1111</span>    if (this.maintenanceMode || this.onlySystemTablesOnMaster) {<a name="line.1111"></a>
+<span class="sourceLineNo">1112</span>      if (masterServerName != null &amp;&amp; servers.contains(masterServerName)) {<a name="line.1112"></a>
+<span class="sourceLineNo">1113</span>        assignments.put(masterServerName, new ArrayList&lt;&gt;());<a name="line.1113"></a>
+<span class="sourceLineNo">1114</span>        for (RegionInfo region : regions) {<a name="line.1114"></a>
+<span class="sourceLineNo">1115</span>          if (shouldBeOnMaster(region)) {<a name="line.1115"></a>
+<span class="sourceLineNo">1116</span>            assignments.get(masterServerName).add(region);<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>      }<a name="line.1119"></a>
+<span class="sourceLineNo">1120</span>    }<a name="line.1120"></a>
+<span class="sourceLineNo">1121</span>    return assignments;<a name="line.1121"></a>
+<span class="sourceLineNo">1122</span>  }<a name="line.1122"></a>
+<span class="sourceLineNo">1123</span><a name="line.1123"></a>
+<span class="sourceLineNo">1124</span>  @Override<a name="line.1124"></a>
+<span class="sourceLineNo">1125</span>  public Configuration getConf() {<a name="line.1125"></a>
+<span class="sourceLineNo">1126</span>    return this.config;<a name="line.1126"></a>
+<span class="sourceLineNo">1127</span>  }<a name="line.1127"></a>
+<span class="sourceLineNo">1128</span><a name="line.1128"></a>
+<span class="sourceLineNo">1129</span>  @Override<a name="line.1129"></a>
+<span class="sourceLineNo">1130</span>  public synchronized void setClusterMetrics(ClusterMetrics st) {<a name="line.1130"></a>
+<span class="sourceLineNo">1131</span>    this.clusterStatus = st;<a name="line.1131"></a>
+<span class="sourceLineNo">1132</span>    if (useRegionFinder) {<a name="line.1132"></a>
+<span class="sourceLineNo">1133</span>      regionFinder.setClusterMetrics(st);<a name="line.1133"></a>
+<span class="sourceLineNo">1134</span>    }<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 void setClusterLoad(Map&lt;TableName, Map&lt;ServerName, List&lt;RegionInfo&gt;&gt;&gt; clusterLoad){<a name="line.1138"></a>
+<span class="sourceLineNo">1139</span><a name="line.1139"></a>
+<span class="sourceLineNo">1140</span>  }<a name="line.1140"></a>
+<span class="sourceLineNo">1141</span><a name="line.1141"></a>
+<span class="sourceLineNo">1142</span>  @Override<a name="line.1142"></a>
+<span class="sourceLineNo">1143</span>  public void setMasterServices(MasterServices masterServices) {<a name="line.1143"></a>
+<span class="sourceLineNo">1144</span>    masterServerName = masterServices.getServerName();<a name="line.1144"></a>
+<span class="sourceLineNo">1145</span>    this.services = masterServices;<a name="line.1145"></a>
+<span class="sourceLineNo">1146</span>    if (useRegionFinder) {<a name="line.1146"></a>
+<span class="sourceLineNo">1147</span>      this.regionFinder.setServices(masterServices);<a name="line.1147"></a>
+<span class="sourceLineNo">1148</span>    }<a name="line.1148"></a>
+<span class="sourceLineNo">1149</span>    if (this.services.isInMaintenanceMode()) {<a name="line.1149"></a>
+<span class="sourceLineNo">1150</span>      this.maintenanceMode = true;<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><a name="line.1153"></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 (this.maintenanceMode || 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

<TRUNCATED>

[18/46] hbase-site git commit: Published site at 05d22ed960204183fbd9bd16f1dbca6410ccde76.

Posted by gi...@apache.org.
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/3649682c/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 c307d41..d82bfd8 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
@@ -1020,8 +1020,8 @@
 <span class="sourceLineNo">1012</span>  protected ClusterMetrics clusterStatus = null;<a name="line.1012"></a>
 <span class="sourceLineNo">1013</span>  protected ServerName masterServerName;<a name="line.1013"></a>
 <span class="sourceLineNo">1014</span>  protected MasterServices services;<a name="line.1014"></a>
-<span class="sourceLineNo">1015</span>  protected boolean tablesOnMaster;<a name="line.1015"></a>
-<span class="sourceLineNo">1016</span>  protected boolean onlySystemTablesOnMaster;<a name="line.1016"></a>
+<span class="sourceLineNo">1015</span>  protected boolean onlySystemTablesOnMaster;<a name="line.1015"></a>
+<span class="sourceLineNo">1016</span>  protected boolean maintenanceMode;<a name="line.1016"></a>
 <span class="sourceLineNo">1017</span><a name="line.1017"></a>
 <span class="sourceLineNo">1018</span>  @Override<a name="line.1018"></a>
 <span class="sourceLineNo">1019</span>  public void setConf(Configuration conf) {<a name="line.1019"></a>
@@ -1033,627 +1033,626 @@
 <span class="sourceLineNo">1025</span>    if (overallSlop &lt; 0) overallSlop = 0;<a name="line.1025"></a>
 <span class="sourceLineNo">1026</span>    else if (overallSlop &gt; 1) overallSlop = 1;<a name="line.1026"></a>
 <span class="sourceLineNo">1027</span><a name="line.1027"></a>
-<span class="sourceLineNo">1028</span>    this.tablesOnMaster = LoadBalancer.isTablesOnMaster(this.config);<a name="line.1028"></a>
-<span class="sourceLineNo">1029</span>    this.onlySystemTablesOnMaster = LoadBalancer.isSystemTablesOnlyOnMaster(this.config);<a name="line.1029"></a>
-<span class="sourceLineNo">1030</span>    // If system tables on master, implies tablesOnMaster = true.<a name="line.1030"></a>
-<span class="sourceLineNo">1031</span>    if (this.onlySystemTablesOnMaster &amp;&amp; !this.tablesOnMaster) {<a name="line.1031"></a>
-<span class="sourceLineNo">1032</span>      LOG.warn("Set " + TABLES_ON_MASTER + "=true because " + SYSTEM_TABLES_ON_MASTER + "=true");<a name="line.1032"></a>
-<span class="sourceLineNo">1033</span>      this.tablesOnMaster = true;<a name="line.1033"></a>
-<span class="sourceLineNo">1034</span>    }<a name="line.1034"></a>
-<span class="sourceLineNo">1035</span>    this.rackManager = new RackManager(getConf());<a name="line.1035"></a>
-<span class="sourceLineNo">1036</span>    if (useRegionFinder) {<a name="line.1036"></a>
-<span class="sourceLineNo">1037</span>      regionFinder.setConf(conf);<a name="line.1037"></a>
-<span class="sourceLineNo">1038</span>    }<a name="line.1038"></a>
-<span class="sourceLineNo">1039</span>    // Print out base configs. Don't print overallSlop since it for simple balancer exclusively.<a name="line.1039"></a>
-<span class="sourceLineNo">1040</span>    LOG.info("slop=" + this.slop + ", tablesOnMaster=" + this.tablesOnMaster +<a name="line.1040"></a>
-<span class="sourceLineNo">1041</span>      ", systemTablesOnMaster=" + this.onlySystemTablesOnMaster);<a name="line.1041"></a>
+<span class="sourceLineNo">1028</span>    this.onlySystemTablesOnMaster = LoadBalancer.isSystemTablesOnlyOnMaster(this.config);<a name="line.1028"></a>
+<span class="sourceLineNo">1029</span><a name="line.1029"></a>
+<span class="sourceLineNo">1030</span>    this.rackManager = new RackManager(getConf());<a name="line.1030"></a>
+<span class="sourceLineNo">1031</span>    if (useRegionFinder) {<a name="line.1031"></a>
+<span class="sourceLineNo">1032</span>      regionFinder.setConf(conf);<a name="line.1032"></a>
+<span class="sourceLineNo">1033</span>    }<a name="line.1033"></a>
+<span class="sourceLineNo">1034</span>    // Print out base configs. Don't print overallSlop since it for simple balancer exclusively.<a name="line.1034"></a>
+<span class="sourceLineNo">1035</span>    LOG.info("slop={}, systemTablesOnMaster={}",<a name="line.1035"></a>
+<span class="sourceLineNo">1036</span>        this.slop, this.onlySystemTablesOnMaster);<a name="line.1036"></a>
+<span class="sourceLineNo">1037</span>  }<a name="line.1037"></a>
+<span class="sourceLineNo">1038</span><a name="line.1038"></a>
+<span class="sourceLineNo">1039</span>  protected void setSlop(Configuration conf) {<a name="line.1039"></a>
+<span class="sourceLineNo">1040</span>    this.slop = conf.getFloat("hbase.regions.slop", (float) 0.2);<a name="line.1040"></a>
+<span class="sourceLineNo">1041</span>    this.overallSlop = conf.getFloat("hbase.regions.overallSlop", slop);<a name="line.1041"></a>
 <span class="sourceLineNo">1042</span>  }<a name="line.1042"></a>
 <span class="sourceLineNo">1043</span><a name="line.1043"></a>
-<span class="sourceLineNo">1044</span>  protected void setSlop(Configuration conf) {<a name="line.1044"></a>
-<span class="sourceLineNo">1045</span>    this.slop = conf.getFloat("hbase.regions.slop", (float) 0.2);<a name="line.1045"></a>
-<span class="sourceLineNo">1046</span>    this.overallSlop = conf.getFloat("hbase.regions.overallSlop", slop);<a name="line.1046"></a>
-<span class="sourceLineNo">1047</span>  }<a name="line.1047"></a>
-<span class="sourceLineNo">1048</span><a name="line.1048"></a>
-<span class="sourceLineNo">1049</span>  /**<a name="line.1049"></a>
-<span class="sourceLineNo">1050</span>   * Check if a region belongs to some system table.<a name="line.1050"></a>
-<span class="sourceLineNo">1051</span>   * If so, the primary replica may be expected to be put on the master regionserver.<a name="line.1051"></a>
-<span class="sourceLineNo">1052</span>   */<a name="line.1052"></a>
-<span class="sourceLineNo">1053</span>  public boolean shouldBeOnMaster(RegionInfo region) {<a name="line.1053"></a>
-<span class="sourceLineNo">1054</span>    return this.onlySystemTablesOnMaster &amp;&amp; region.getTable().isSystemTable();<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>   * Balance the regions that should be on master regionserver.<a name="line.1058"></a>
-<span class="sourceLineNo">1059</span>   */<a name="line.1059"></a>
-<span class="sourceLineNo">1060</span>  protected List&lt;RegionPlan&gt; balanceMasterRegions(Map&lt;ServerName, List&lt;RegionInfo&gt;&gt; clusterMap) {<a name="line.1060"></a>
-<span class="sourceLineNo">1061</span>    if (masterServerName == null || clusterMap == null || clusterMap.size() &lt;= 1) return null;<a name="line.1061"></a>
-<span class="sourceLineNo">1062</span>    List&lt;RegionPlan&gt; plans = null;<a name="line.1062"></a>
-<span class="sourceLineNo">1063</span>    List&lt;RegionInfo&gt; regions = clusterMap.get(masterServerName);<a name="line.1063"></a>
-<span class="sourceLineNo">1064</span>    if (regions != null) {<a name="line.1064"></a>
-<span class="sourceLineNo">1065</span>      Iterator&lt;ServerName&gt; keyIt = null;<a name="line.1065"></a>
-<span class="sourceLineNo">1066</span>      for (RegionInfo region: regions) {<a name="line.1066"></a>
-<span class="sourceLineNo">1067</span>        if (shouldBeOnMaster(region)) continue;<a name="line.1067"></a>
-<span class="sourceLineNo">1068</span><a name="line.1068"></a>
-<span class="sourceLineNo">1069</span>        // Find a non-master regionserver to host the region<a name="line.1069"></a>
-<span class="sourceLineNo">1070</span>        if (keyIt == null || !keyIt.hasNext()) {<a name="line.1070"></a>
-<span class="sourceLineNo">1071</span>          keyIt = clusterMap.keySet().iterator();<a name="line.1071"></a>
-<span class="sourceLineNo">1072</span>        }<a name="line.1072"></a>
-<span class="sourceLineNo">1073</span>        ServerName dest = keyIt.next();<a name="line.1073"></a>
-<span class="sourceLineNo">1074</span>        if (masterServerName.equals(dest)) {<a name="line.1074"></a>
-<span class="sourceLineNo">1075</span>          if (!keyIt.hasNext()) {<a name="line.1075"></a>
-<span class="sourceLineNo">1076</span>            keyIt = clusterMap.keySet().iterator();<a name="line.1076"></a>
-<span class="sourceLineNo">1077</span>          }<a name="line.1077"></a>
-<span class="sourceLineNo">1078</span>          dest = keyIt.next();<a name="line.1078"></a>
-<span class="sourceLineNo">1079</span>        }<a name="line.1079"></a>
-<span class="sourceLineNo">1080</span><a name="line.1080"></a>
-<span class="sourceLineNo">1081</span>        // Move this region away from the master regionserver<a name="line.1081"></a>
-<span class="sourceLineNo">1082</span>        RegionPlan plan = new RegionPlan(region, masterServerName, dest);<a name="line.1082"></a>
-<span class="sourceLineNo">1083</span>        if (plans == null) {<a name="line.1083"></a>
-<span class="sourceLineNo">1084</span>          plans = new ArrayList&lt;&gt;();<a name="line.1084"></a>
-<span class="sourceLineNo">1085</span>        }<a name="line.1085"></a>
-<span class="sourceLineNo">1086</span>        plans.add(plan);<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>    for (Map.Entry&lt;ServerName, List&lt;RegionInfo&gt;&gt; server: clusterMap.entrySet()) {<a name="line.1089"></a>
-<span class="sourceLineNo">1090</span>      if (masterServerName.equals(server.getKey())) continue;<a name="line.1090"></a>
-<span class="sourceLineNo">1091</span>      for (RegionInfo region: server.getValue()) {<a name="line.1091"></a>
-<span class="sourceLineNo">1092</span>        if (!shouldBeOnMaster(region)) continue;<a name="line.1092"></a>
-<span class="sourceLineNo">1093</span><a name="line.1093"></a>
-<span class="sourceLineNo">1094</span>        // Move this region to the master regionserver<a name="line.1094"></a>
-<span class="sourceLineNo">1095</span>        RegionPlan plan = new RegionPlan(region, server.getKey(), masterServerName);<a name="line.1095"></a>
-<span class="sourceLineNo">1096</span>        if (plans == null) {<a name="line.1096"></a>
-<span class="sourceLineNo">1097</span>          plans = new ArrayList&lt;&gt;();<a name="line.1097"></a>
-<span class="sourceLineNo">1098</span>        }<a name="line.1098"></a>
-<span class="sourceLineNo">1099</span>        plans.add(plan);<a name="line.1099"></a>
-<span class="sourceLineNo">1100</span>      }<a name="line.1100"></a>
-<span class="sourceLineNo">1101</span>    }<a name="line.1101"></a>
-<span class="sourceLineNo">1102</span>    return plans;<a name="line.1102"></a>
-<span class="sourceLineNo">1103</span>  }<a name="line.1103"></a>
-<span class="sourceLineNo">1104</span><a name="line.1104"></a>
-<span class="sourceLineNo">1105</span>  /**<a name="line.1105"></a>
-<span class="sourceLineNo">1106</span>   * If master is configured to carry system tables only, in here is<a name="line.1106"></a>
-<span class="sourceLineNo">1107</span>   * where we figure what to assign it.<a name="line.1107"></a>
-<span class="sourceLineNo">1108</span>   */<a name="line.1108"></a>
-<span class="sourceLineNo">1109</span>  protected Map&lt;ServerName, List&lt;RegionInfo&gt;&gt; assignMasterSystemRegions(<a name="line.1109"></a>
-<span class="sourceLineNo">1110</span>      Collection&lt;RegionInfo&gt; regions, List&lt;ServerName&gt; servers) {<a name="line.1110"></a>
-<span class="sourceLineNo">1111</span>    if (servers == null || regions == null || regions.isEmpty()) {<a name="line.1111"></a>
-<span class="sourceLineNo">1112</span>      return null;<a name="line.1112"></a>
-<span class="sourceLineNo">1113</span>    }<a name="line.1113"></a>
-<span class="sourceLineNo">1114</span>    Map&lt;ServerName, List&lt;RegionInfo&gt;&gt; assignments = new TreeMap&lt;&gt;();<a name="line.1114"></a>
-<span class="sourceLineNo">1115</span>    if (this.onlySystemTablesOnMaster) {<a name="line.1115"></a>
-<span class="sourceLineNo">1116</span>      if (masterServerName != null &amp;&amp; servers.contains(masterServerName)) {<a name="line.1116"></a>
-<span class="sourceLineNo">1117</span>        assignments.put(masterServerName, new ArrayList&lt;&gt;());<a name="line.1117"></a>
-<span class="sourceLineNo">1118</span>        for (RegionInfo region : regions) {<a name="line.1118"></a>
-<span class="sourceLineNo">1119</span>          if (shouldBeOnMaster(region)) {<a name="line.1119"></a>
-<span class="sourceLineNo">1120</span>            assignments.get(masterServerName).add(region);<a name="line.1120"></a>
-<span class="sourceLineNo">1121</span>          }<a name="line.1121"></a>
-<span class="sourceLineNo">1122</span>        }<a name="line.1122"></a>
-<span class="sourceLineNo">1123</span>      }<a name="line.1123"></a>
-<span class="sourceLineNo">1124</span>    }<a name="line.1124"></a>
-<span class="sourceLineNo">1125</span>    return assignments;<a name="line.1125"></a>
-<span class="sourceLineNo">1126</span>  }<a name="line.1126"></a>
-<span class="sourceLineNo">1127</span><a name="line.1127"></a>
-<span class="sourceLineNo">1128</span>  @Override<a name="line.1128"></a>
-<span class="sourceLineNo">1129</span>  public Configuration getConf() {<a name="line.1129"></a>
-<span class="sourceLineNo">1130</span>    return this.config;<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 synchronized void setClusterMetrics(ClusterMetrics st) {<a name="line.1134"></a>
-<span class="sourceLineNo">1135</span>    this.clusterStatus = st;<a name="line.1135"></a>
-<span class="sourceLineNo">1136</span>    if (useRegionFinder) {<a name="line.1136"></a>
-<span class="sourceLineNo">1137</span>      regionFinder.setClusterMetrics(st);<a name="line.1137"></a>
-<span class="sourceLineNo">1138</span>    }<a name="line.1138"></a>
-<span class="sourceLineNo">1139</span>  }<a name="line.1139"></a>
-<span class="sourceLineNo">1140</span><a name="line.1140"></a>
-<span class="sourceLineNo">1141</span>  @Override<a name="line.1141"></a>
-<span class="sourceLineNo">1142</span>  public void setClusterLoad(Map&lt;TableName, Map&lt;ServerName, List&lt;RegionInfo&gt;&gt;&gt; clusterLoad){<a name="line.1142"></a>
-<span class="sourceLineNo">1143</span><a name="line.1143"></a>
-<span class="sourceLineNo">1144</span>  }<a name="line.1144"></a>
-<span class="sourceLineNo">1145</span><a name="line.1145"></a>
-<span class="sourceLineNo">1146</span>  @Override<a name="line.1146"></a>
-<span class="sourceLineNo">1147</span>  public void setMasterServices(MasterServices masterServices) {<a name="line.1147"></a>
-<span class="sourceLineNo">1148</span>    masterServerName = masterServices.getServerName();<a name="line.1148"></a>
-<span class="sourceLineNo">1149</span>    this.services = masterServices;<a name="line.1149"></a>
-<span class="sourceLineNo">1150</span>    if (useRegionFinder) {<a name="line.1150"></a>
-<span class="sourceLineNo">1151</span>      this.regionFinder.setServices(masterServices);<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><a name="line.1154"></a>
-<span class="sourceLineNo">1155</span>  @Override<a name="line.1155"></a>
-<span class="sourceLineNo">1156</span>  public void postMasterStartupInitialize() {<a name="line.1156"></a>
-<span class="sourceLineNo">1157</span>    if (services != null &amp;&amp; regionFinder != null) {<a name="line.1157"></a>
-<span class="sourceLineNo">1158</span>      try {<a name="line.1158"></a>
-<span class="sourceLineNo">1159</span>        Set&lt;RegionInfo&gt; regions =<a name="line.1159"></a>
-<span class="sourceLineNo">1160</span>            services.getAssignmentManager().getRegionStates().getRegionAssignments().keySet();<a name="line.1160"></a>
-<span class="sourceLineNo">1161</span>        regionFinder.refreshAndWait(regions);<a name="line.1161"></a>
-<span class="sourceLineNo">1162</span>      } catch (Exception e) {<a name="line.1162"></a>
-<span class="sourceLineNo">1163</span>        LOG.warn("Refreshing region HDFS Block dist failed with exception, ignoring", e);<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><a name="line.1167"></a>
-<span class="sourceLineNo">1168</span>  public void setRackManager(RackManager rackManager) {<a name="line.1168"></a>
-<span class="sourceLineNo">1169</span>    this.rackManager = rackManager;<a name="line.1169"></a>
-<span class="sourceLineNo">1170</span>  }<a name="line.1170"></a>
-<span class="sourceLineNo">1171</span><a name="line.1171"></a>
-<span class="sourceLineNo">1172</span>  protected boolean needsBalance(Cluster c) {<a name="line.1172"></a>
-<span class="sourceLineNo">1173</span>    ClusterLoadState cs = new ClusterLoadState(c.clusterState);<a name="line.1173"></a>
-<span class="sourceLineNo">1174</span>    if (cs.getNumServers() &lt; MIN_SERVER_BALANCE) {<a name="line.1174"></a>
-<span class="sourceLineNo">1175</span>      if (LOG.isDebugEnabled()) {<a name="line.1175"></a>
-<span class="sourceLineNo">1176</span>        LOG.debug("Not running balancer because only " + cs.getNumServers()<a name="line.1176"></a>
-<span class="sourceLineNo">1177</span>            + " active regionserver(s)");<a name="line.1177"></a>
-<span class="sourceLineNo">1178</span>      }<a name="line.1178"></a>
-<span class="sourceLineNo">1179</span>      return false;<a name="line.1179"></a>
-<span class="sourceLineNo">1180</span>    }<a name="line.1180"></a>
-<span class="sourceLineNo">1181</span>    if(areSomeRegionReplicasColocated(c)) return true;<a name="line.1181"></a>
-<span class="sourceLineNo">1182</span>    // Check if we even need to do any load balancing<a name="line.1182"></a>
-<span class="sourceLineNo">1183</span>    // HBASE-3681 check sloppiness first<a name="line.1183"></a>
-<span class="sourceLineNo">1184</span>    float average = cs.getLoadAverage(); // for logging<a name="line.1184"></a>
-<span class="sourceLineNo">1185</span>    int floor = (int) Math.floor(average * (1 - slop));<a name="line.1185"></a>
-<span class="sourceLineNo">1186</span>    int ceiling = (int) Math.ceil(average * (1 + slop));<a name="line.1186"></a>
-<span class="sourceLineNo">1187</span>    if (!(cs.getMaxLoad() &gt; ceiling || cs.getMinLoad() &lt; floor)) {<a name="line.1187"></a>
-<span class="sourceLineNo">1188</span>      NavigableMap&lt;ServerAndLoad, List&lt;RegionInfo&gt;&gt; serversByLoad = cs.getServersByLoad();<a name="line.1188"></a>
-<span class="sourceLineNo">1189</span>      if (LOG.isTraceEnabled()) {<a name="line.1189"></a>
-<span class="sourceLineNo">1190</span>        // If nothing to balance, then don't say anything unless trace-level logging.<a name="line.1190"></a>
-<span class="sourceLineNo">1191</span>        LOG.trace("Skipping load balancing because balanced cluster; " +<a name="line.1191"></a>
-<span class="sourceLineNo">1192</span>          "servers=" + cs.getNumServers() +<a name="line.1192"></a>
-<span class="sourceLineNo">1193</span>          " regions=" + cs.getNumRegions() + " average=" + average +<a name="line.1193"></a>
-<span class="sourceLineNo">1194</span>          " mostloaded=" + serversByLoad.lastKey().getLoad() +<a name="line.1194"></a>
-<span class="sourceLineNo">1195</span>          " leastloaded=" + serversByLoad.firstKey().getLoad());<a name="line.1195"></a>
-<span class="sourceLineNo">1196</span>      }<a name="line.1196"></a>
-<span class="sourceLineNo">1197</span>      return false;<a name="line.1197"></a>
-<span class="sourceLineNo">1198</span>    }<a name="line.1198"></a>
-<span class="sourceLineNo">1199</span>    return true;<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>   * Subclasses should implement this to return true if the cluster has nodes that hosts<a name="line.1203"></a>
-<span class="sourceLineNo">1204</span>   * multiple replicas for the same region, or, if there are multiple racks and the same<a name="line.1204"></a>
-<span class="sourceLineNo">1205</span>   * rack hosts replicas of the same region<a name="line.1205"></a>
-<span class="sourceLineNo">1206</span>   * @param c Cluster information<a name="line.1206"></a>
-<span class="sourceLineNo">1207</span>   * @return whether region replicas are currently co-located<a name="line.1207"></a>
-<span class="sourceLineNo">1208</span>   */<a name="line.1208"></a>
-<span class="sourceLineNo">1209</span>  protected boolean areSomeRegionReplicasColocated(Cluster c) {<a name="line.1209"></a>
-<span class="sourceLineNo">1210</span>    return false;<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>   * Generates a bulk assignment plan to be used on cluster startup using a<a name="line.1214"></a>
-<span class="sourceLineNo">1215</span>   * simple round-robin assignment.<a name="line.1215"></a>
-<span class="sourceLineNo">1216</span>   * &lt;p&gt;<a name="line.1216"></a>
-<span class="sourceLineNo">1217</span>   * Takes a list of all the regions and all the servers in the cluster and<a name="line.1217"></a>
-<span class="sourceLineNo">1218</span>   * returns a map of each server to the regions that it should be assigned.<a name="line.1218"></a>
-<span class="sourceLineNo">1219</span>   * &lt;p&gt;<a name="line.1219"></a>
-<span class="sourceLineNo">1220</span>   * Currently implemented as a round-robin assignment. Same invariant as load<a name="line.1220"></a>
-<span class="sourceLineNo">1221</span>   * balancing, all servers holding floor(avg) or ceiling(avg).<a name="line.1221"></a>
-<span class="sourceLineNo">1222</span>   *<a name="line.1222"></a>
-<span class="sourceLineNo">1223</span>   * TODO: Use block locations from HDFS to place regions with their blocks<a name="line.1223"></a>
-<span class="sourceLineNo">1224</span>   *<a name="line.1224"></a>
-<span class="sourceLineNo">1225</span>   * @param regions all regions<a name="line.1225"></a>
-<span class="sourceLineNo">1226</span>   * @param servers all servers<a name="line.1226"></a>
-<span class="sourceLineNo">1227</span>   * @return map of server to the regions it should take, or null if no<a name="line.1227"></a>
-<span class="sourceLineNo">1228</span>   *         assignment is possible (ie. no regions or no servers)<a name="line.1228"></a>
-<span class="sourceLineNo">1229</span>   */<a name="line.1229"></a>
-<span class="sourceLineNo">1230</span>  @Override<a name="line.1230"></a>
-<span class="sourceLineNo">1231</span>  public Map&lt;ServerName, List&lt;RegionInfo&gt;&gt; roundRobinAssignment(List&lt;RegionInfo&gt; regions,<a name="line.1231"></a>
-<span class="sourceLineNo">1232</span>      List&lt;ServerName&gt; servers) throws HBaseIOException {<a name="line.1232"></a>
-<span class="sourceLineNo">1233</span>    metricsBalancer.incrMiscInvocations();<a name="line.1233"></a>
-<span class="sourceLineNo">1234</span>    Map&lt;ServerName, List&lt;RegionInfo&gt;&gt; assignments = assignMasterSystemRegions(regions, servers);<a name="line.1234"></a>
-<span class="sourceLineNo">1235</span>    if (assignments != null &amp;&amp; !assignments.isEmpty()) {<a name="line.1235"></a>
-<span class="sourceLineNo">1236</span>      servers = new ArrayList&lt;&gt;(servers);<a name="line.1236"></a>
-<span class="sourceLineNo">1237</span>      // Guarantee not to put other regions on master<a name="line.1237"></a>
-<span class="sourceLineNo">1238</span>      servers.remove(masterServerName);<a name="line.1238"></a>
-<span class="sourceLineNo">1239</span>      List&lt;RegionInfo&gt; masterRegions = assignments.get(masterServerName);<a name="line.1239"></a>
-<span class="sourceLineNo">1240</span>      if (!masterRegions.isEmpty()) {<a name="line.1240"></a>
-<span class="sourceLineNo">1241</span>        regions = new ArrayList&lt;&gt;(regions);<a name="line.1241"></a>
-<span class="sourceLineNo">1242</span>        regions.removeAll(masterRegions);<a name="line.1242"></a>
-<span class="sourceLineNo">1243</span>      }<a name="line.1243"></a>
-<span class="sourceLineNo">1244</span>    }<a name="line.1244"></a>
-<span class="sourceLineNo">1245</span>    if (regions == null || regions.isEmpty()) {<a name="line.1245"></a>
-<span class="sourceLineNo">1246</span>      return assignments;<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>    int numServers = servers == null ? 0 : servers.size();<a name="line.1249"></a>
-<span class="sourceLineNo">1250</span>    if (numServers == 0) {<a name="line.1250"></a>
-<span class="sourceLineNo">1251</span>      LOG.warn("Wanted to do round robin assignment but no servers to assign to");<a name="line.1251"></a>
-<span class="sourceLineNo">1252</span>      return null;<a name="line.1252"></a>
-<span class="sourceLineNo">1253</span>    }<a name="line.1253"></a>
-<span class="sourceLineNo">1254</span><a name="line.1254"></a>
-<span class="sourceLineNo">1255</span>    // TODO: instead of retainAssignment() and roundRobinAssignment(), we should just run the<a name="line.1255"></a>
-<span class="sourceLineNo">1256</span>    // normal LB.balancerCluster() with unassignedRegions. We only need to have a candidate<a name="line.1256"></a>
-<span class="sourceLineNo">1257</span>    // generator for AssignRegionAction. The LB will ensure the regions are mostly local<a name="line.1257"></a>
-<span class="sourceLineNo">1258</span>    // and balanced. This should also run fast with fewer number of iterations.<a name="line.1258"></a>
-<span class="sourceLineNo">1259</span><a name="line.1259"></a>
-<span class="sourceLineNo">1260</span>    if (numServers == 1) { // Only one server, nothing fancy we can do here<a name="line.1260"></a>
-<span class="sourceLineNo">1261</span>      ServerName server = servers.get(0);<a name="line.1261"></a>
-<span class="sourceLineNo">1262</span>      assignments.put(server, new ArrayList&lt;&gt;(regions));<a name="line.1262"></a>
-<span class="sourceLineNo">1263</span>      return assignments;<a name="line.1263"></a>
-<span class="sourceLineNo">1264</span>    }<a name="line.1264"></a>
-<span class="sourceLineNo">1265</span><a name="line.1265"></a>
-<span class="sourceLineNo">1266</span>    Cluster cluster = createCluster(servers, regions, false);<a name="line.1266"></a>
-<span class="sourceLineNo">1267</span>    List&lt;RegionInfo&gt; unassignedRegions = new ArrayList&lt;&gt;();<a name="line.1267"></a>
-<span class="sourceLineNo">1268</span><a name="line.1268"></a>
-<span class="sourceLineNo">1269</span>    roundRobinAssignment(cluster, regions, unassignedRegions,<a name="line.1269"></a>
-<span class="sourceLineNo">1270</span>      servers, assignments);<a name="line.1270"></a>
-<span class="sourceLineNo">1271</span><a name="line.1271"></a>
-<span class="sourceLineNo">1272</span>    List&lt;RegionInfo&gt; lastFewRegions = new ArrayList&lt;&gt;();<a name="line.1272"></a>
-<span class="sourceLineNo">1273</span>    // assign the remaining by going through the list and try to assign to servers one-by-one<a name="line.1273"></a>
-<span class="sourceLineNo">1274</span>    int serverIdx = RANDOM.nextInt(numServers);<a name="line.1274"></a>
-<span class="sourceLineNo">1275</span>    OUTER : for (RegionInfo region : unassignedRegions) {<a name="line.1275"></a>
-<span class="sourceLineNo">1276</span>      boolean assigned = false;<a name="line.1276"></a>
-<span class="sourceLineNo">1277</span>      INNER : for (int j = 0; j &lt; numServers; j++) { // try all servers one by one<a name="line.1277"></a>
-<span class="sourceLineNo">1278</span>        ServerName serverName = servers.get((j + serverIdx) % numServers);<a name="line.1278"></a>
-<span class="sourceLineNo">1279</span>        if (!cluster.wouldLowerAvailability(region, serverName)) {<a name="line.1279"></a>
-<span class="sourceLineNo">1280</span>          List&lt;RegionInfo&gt; serverRegions =<a name="line.1280"></a>
-<span class="sourceLineNo">1281</span>              assignments.computeIfAbsent(serverName, k -&gt; new ArrayList&lt;&gt;());<a name="line.1281"></a>
-<span class="sourceLineNo">1282</span>          if (!RegionReplicaUtil.isDefaultReplica(region.getReplicaId())) {<a name="line.1282"></a>
-<span class="sourceLineNo">1283</span>            // if the region is not a default replica<a name="line.1283"></a>
-<span class="sourceLineNo">1284</span>            // check if the assignments map has the other replica region on this server<a name="line.1284"></a>
-<span class="sourceLineNo">1285</span>            for (RegionInfo hri : serverRegions) {<a name="line.1285"></a>
-<span class="sourceLineNo">1286</span>              if (RegionReplicaUtil.isReplicasForSameRegion(region, hri)) {<a name="line.1286"></a>
-<span class="sourceLineNo">1287</span>                if (LOG.isTraceEnabled()) {<a name="line.1287"></a>
-<span class="sourceLineNo">1288</span>                  LOG.trace("Skipping the server, " + serverName<a name="line.1288"></a>
-<span class="sourceLineNo">1289</span>                      + " , got the same server for the region " + region);<a name="line.1289"></a>
-<span class="sourceLineNo">1290</span>                }<a name="line.1290"></a>
-<span class="sourceLineNo">1291</span>                // do not allow this case. The unassignedRegions we got because the<a name="line.1291"></a>
-<span class="sourceLineNo">1292</span>                // replica region in this list was not assigned because of lower availablity issue.<a name="line.1292"></a>
-<span class="sourceLineNo">1293</span>                // So when we assign here we should ensure that as far as possible the server being<a name="line.1293"></a>
-<span class="sourceLineNo">1294</span>                // selected does not have the server where the replica region was not assigned.<a name="line.1294"></a>
-<span class="sourceLineNo">1295</span>                continue INNER; // continue the inner loop, ie go to the next server<a name="line.1295"></a>
-<span class="sourceLineNo">1296</span>              }<a name="line.1296"></a>
-<span class="sourceLineNo">1297</span>            }<a name="line.1297"></a>
-<span class="sourceLineNo">1298</span>          }<a name="line.1298"></a>
-<span class="sourceLineNo">1299</span>          serverRegions.add(region);<a name="line.1299"></a>
-<span class="sourceLineNo">1300</span>          cluster.doAssignRegion(region, serverName);<a name="line.1300"></a>
-<span class="sourceLineNo">1301</span>          serverIdx = (j + serverIdx + 1) % numServers; //remain from next server<a name="line.1301"></a>
-<span class="sourceLineNo">1302</span>          assigned = true;<a name="line.1302"></a>
-<span class="sourceLineNo">1303</span>          break;<a name="line.1303"></a>
-<span class="sourceLineNo">1304</span>        }<a name="line.1304"></a>
-<span class="sourceLineNo">1305</span>      }<a name="line.1305"></a>
-<span class="sourceLineNo">1306</span>      if (!assigned) {<a name="line.1306"></a>
-<span class="sourceLineNo">1307</span>        lastFewRegions.add(region);<a name="line.1307"></a>
-<span class="sourceLineNo">1308</span>      }<a name="line.1308"></a>
-<span class="sourceLineNo">1309</span>    }<a name="line.1309"></a>
-<span class="sourceLineNo">1310</span>    // just sprinkle the rest of the regions on random regionservers. The balanceCluster will<a name="line.1310"></a>
-<span class="sourceLineNo">1311</span>    // make it optimal later. we can end up with this if numReplicas &gt; numServers.<a name="line.1311"></a>
-<span class="sourceLineNo">1312</span>    for (RegionInfo region : lastFewRegions) {<a name="line.1312"></a>
-<span class="sourceLineNo">1313</span>      int i = RANDOM.nextInt(numServers);<a name="line.1313"></a>
-<span class="sourceLineNo">1314</span>      ServerName server = servers.get(i);<a name="line.1314"></a>
-<span class="sourceLineNo">1315</span>      List&lt;RegionInfo&gt; serverRegions = assignments.computeIfAbsent(server, k -&gt; new ArrayList&lt;&gt;());<a name="line.1315"></a>
-<span class="sourceLineNo">1316</span>      serverRegions.add(region);<a name="line.1316"></a>
-<span class="sourceLineNo">1317</span>      cluster.doAssignRegion(region, server);<a name="line.1317"></a>
-<span class="sourceLineNo">1318</span>    }<a name="line.1318"></a>
-<span class="sourceLineNo">1319</span>    return assignments;<a name="line.1319"></a>
-<span class="sourceLineNo">1320</span>  }<a name="line.1320"></a>
-<span class="sourceLineNo">1321</span><a name="line.1321"></a>
-<span class="sourceLineNo">1322</span>  protected Cluster createCluster(List&lt;ServerName&gt; servers, Collection&lt;RegionInfo&gt; regions,<a name="line.1322"></a>
-<span class="sourceLineNo">1323</span>      boolean hasRegionReplica) {<a name="line.1323"></a>
-<span class="sourceLineNo">1324</span>    // Get the snapshot of the current assignments for the regions in question, and then create<a name="line.1324"></a>
-<span class="sourceLineNo">1325</span>    // a cluster out of it. Note that we might have replicas already assigned to some servers<a name="line.1325"></a>
-<span class="sourceLineNo">1326</span>    // earlier. So we want to get the snapshot to see those assignments, but this will only contain<a name="line.1326"></a>
-<span class="sourceLineNo">1327</span>    // replicas of the regions that are passed (for performance).<a name="line.1327"></a>
-<span class="sourceLineNo">1328</span>    Map&lt;ServerName, List&lt;RegionInfo&gt;&gt; clusterState = null;<a name="line.1328"></a>
-<span class="sourceLineNo">1329</span>    if (!hasRegionReplica) {<a name="line.1329"></a>
-<span class="sourceLineNo">1330</span>      clusterState = getRegionAssignmentsByServer(regions);<a name="line.1330"></a>
-<span class="sourceLineNo">1331</span>    } else {<a name="line.1331"></a>
-<span class="sourceLineNo">1332</span>      // for the case where we have region replica it is better we get the entire cluster's snapshot<a name="line.1332"></a>
-<span class="sourceLineNo">1333</span>      clusterState = getRegionAssignmentsByServer(null);<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>    for (ServerName server : servers) {<a name="line.1336"></a>
-<span class="sourceLineNo">1337</span>      if (!clusterState.containsKey(server)) {<a name="line.1337"></a>
-<span class="sourceLineNo">1338</span>        clusterState.put(server, EMPTY_REGION_LIST);<a name="line.1338"></a>
-<span class="sourceLineNo">1339</span>      }<a name="line.1339"></a>
-<span class="sourceLineNo">1340</span>    }<a name="line.1340"></a>
-<span class="sourceLineNo">1341</span>    return new Cluster(regions, clusterState, null, this.regionFinder,<a name="line.1341"></a>
-<span class="sourceLineNo">1342</span>        rackManager);<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>  private List&lt;ServerName&gt; findIdleServers(List&lt;ServerName&gt; servers) {<a name="line.1345"></a>
-<span class="sourceLineNo">1346</span>    return this.services.getServerManager()<a name="line.1346"></a>
-<span class="sourceLineNo">1347</span>            .getOnlineServersListWithPredicator(servers, IDLE_SERVER_PREDICATOR);<a name="line.1347"></a>
-<span class="sourceLineNo">1348</span>  }<a name="line.1348"></a>
-<span class="sourceLineNo">1349</span><a name="line.1349"></a>
-<span class="sourceLineNo">1350</span>  /**<a name="line.1350"></a>
-<span class="sourceLineNo">1351</span>   * Used to assign a single region to a random server.<a name="line.1351"></a>
-<span class="sourceLineNo">1352</span>   */<a name="line.1352"></a>
-<span class="sourceLineNo">1353</span>  @Override<a name="line.1353"></a>
-<span class="sourceLineNo">1354</span>  public ServerName randomAssignment(RegionInfo regionInfo, List&lt;ServerName&gt; servers)<a name="line.1354"></a>
-<span class="sourceLineNo">1355</span>      throws HBaseIOException {<a name="line.1355"></a>
-<span class="sourceLineNo">1356</span>    metricsBalancer.incrMiscInvocations();<a name="line.1356"></a>
-<span class="sourceLineNo">1357</span>    if (servers != null &amp;&amp; servers.contains(masterServerName)) {<a name="line.1357"></a>
-<span class="sourceLineNo">1358</span>      if (shouldBeOnMaster(regionInfo)) {<a name="line.1358"></a>
-<span class="sourceLineNo">1359</span>        return masterServerName;<a name="line.1359"></a>
-<span class="sourceLineNo">1360</span>      }<a name="line.1360"></a>
-<span class="sourceLineNo">1361</span>      if (!LoadBalancer.isTablesOnMaster(getConf())) {<a name="line.1361"></a>
-<span class="sourceLineNo">1362</span>        // Guarantee we do not put any regions on master<a name="line.1362"></a>
-<span class="sourceLineNo">1363</span>        servers = new ArrayList&lt;&gt;(servers);<a name="line.1363"></a>
-<span class="sourceLineNo">1364</span>        servers.remove(masterServerName);<a name="line.1364"></a>
-<span class="sourceLineNo">1365</span>      }<a name="line.1365"></a>
-<span class="sourceLineNo">1366</span>    }<a name="line.1366"></a>
-<span class="sourceLineNo">1367</span><a name="line.1367"></a>
-<span class="sourceLineNo">1368</span>    int numServers = servers == null ? 0 : servers.size();<a name="line.1368"></a>
-<span class="sourceLineNo">1369</span>    if (numServers == 0) {<a name="line.1369"></a>
-<span class="sourceLineNo">1370</span>      LOG.warn("Wanted to retain assignment but no servers to assign to");<a name="line.1370"></a>
-<span class="sourceLineNo">1371</span>      return null;<a name="line.1371"></a>
-<span class="sourceLineNo">1372</span>    }<a name="line.1372"></a>
-<span class="sourceLineNo">1373</span>    if (numServers == 1) { // Only one server, nothing fancy we can do here<a name="line.1373"></a>
-<span class="sourceLineNo">1374</span>      return servers.get(0);<a name="line.1374"></a>
-<span class="sourceLineNo">1375</span>    }<a name="line.1375"></a>
-<span class="sourceLineNo">1376</span>    List&lt;ServerName&gt; idleServers = findIdleServers(servers);<a name="line.1376"></a>
-<span class="sourceLineNo">1377</span>    if (idleServers.size() == 1) {<a name="line.1377"></a>
-<span class="sourceLineNo">1378</span>      return idleServers.get(0);<a name="line.1378"></a>
-<span class="sourceLineNo">1379</span>    }<a name="line.1379"></a>
-<span class="sourceLineNo">1380</span>    final List&lt;ServerName&gt; finalServers = idleServers.isEmpty() ?<a name="line.1380"></a>
-<span class="sourceLineNo">1381</span>            servers : idleServers;<a name="line.1381"></a>
-<span class="sourceLineNo">1382</span>    List&lt;RegionInfo&gt; regions = Lists.newArrayList(regionInfo);<a name="line.1382"></a>
-<span class="sourceLineNo">1383</span>    Cluster cluster = createCluster(finalServers, regions, false);<a name="line.1383"></a>
-<span class="sourceLineNo">1384</span>    return randomAssignment(cluster, regionInfo, finalServers);<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>  /**<a name="line.1387"></a>
-<span class="sourceLineNo">1388</span>   * Generates a bulk assignment startup plan, attempting to reuse the existing<a name="line.1388"></a>
-<span class="sourceLineNo">1389</span>   * assignment information from META, but adjusting for the specified list of<a name="line.1389"></a>
-<span class="sourceLineNo">1390</span>   * available/online servers available for assignment.<a name="line.1390"></a>
-<span class="sourceLineNo">1391</span>   * &lt;p&gt;<a name="line.1391"></a>
-<span class="sourceLineNo">1392</span>   * Takes a map of all regions to their existing assignment from META. Also<a name="line.1392"></a>
-<span class="sourceLineNo">1393</span>   * takes a list of online servers for regions to be assigned to. Attempts to<a name="line.1393"></a>
-<span class="sourceLineNo">1394</span>   * retain all assignment, so in some instances initial assignment will not be<a name="line.1394"></a>
-<span class="sourceLineNo">1395</span>   * completely balanced.<a name="line.1395"></a>
-<span class="sourceLineNo">1396</span>   * &lt;p&gt;<a name="line.1396"></a>
-<span class="sourceLineNo">1397</span>   * Any leftover regions without an existing server to be assigned to will be<a name="line.1397"></a>
-<span class="sourceLineNo">1398</span>   * assigned randomly to available servers.<a name="line.1398"></a>
-<span class="sourceLineNo">1399</span>   *<a name="line.1399"></a>
-<span class="sourceLineNo">1400</span>   * @param regions regions and existing assignment from meta<a name="line.1400"></a>
-<span class="sourceLineNo">1401</span>   * @param servers available servers<a name="line.1401"></a>
-<span class="sourceLineNo">1402</span>   * @return map of servers and regions to be assigned to them<a name="line.1402"></a>
-<span class="sourceLineNo">1403</span>   */<a name="line.1403"></a>
-<span class="sourceLineNo">1404</span>  @Override<a name="line.1404"></a>
-<span class="sourceLineNo">1405</span>  public Map&lt;ServerName, List&lt;RegionInfo&gt;&gt; retainAssignment(Map&lt;RegionInfo, ServerName&gt; regions,<a name="line.1405"></a>
-<span class="sourceLineNo">1406</span>      List&lt;ServerName&gt; servers) throws HBaseIOException {<a name="line.1406"></a>
-<span class="sourceLineNo">1407</span>    // Update metrics<a name="line.1407"></a>
-<span class="sourceLineNo">1408</span>    metricsBalancer.incrMiscInvocations();<a name="line.1408"></a>
-<span class="sourceLineNo">1409</span>    Map&lt;ServerName, List&lt;RegionInfo&gt;&gt; assignments = assignMasterSystemRegions(regions.keySet(), servers);<a name="line.1409"></a>
-<span class="sourceLineNo">1410</span>    if (assignments != null &amp;&amp; !assignments.isEmpty()) {<a name="line.1410"></a>
-<span class="sourceLineNo">1411</span>      servers = new ArrayList&lt;&gt;(servers);<a name="line.1411"></a>
-<span class="sourceLineNo">1412</span>      // Guarantee not to put other regions on master<a name="line.1412"></a>
-<span class="sourceLineNo">1413</span>      servers.remove(masterServerName);<a name="line.1413"></a>
-<span class="sourceLineNo">1414</span>      List&lt;RegionInfo&gt; masterRegions = assignments.get(masterServerName);<a name="line.1414"></a>
-<span class="sourceLineNo">1415</span>      regions = regions.entrySet().stream().filter(e -&gt; !masterRegions.contains(e.getKey()))<a name="line.1415"></a>
-<span class="sourceLineNo">1416</span>          .collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue));<a name="line.1416"></a>
-<span class="sourceLineNo">1417</span>    }<a name="line.1417"></a>
-<span class="sourceLineNo">1418</span>    if (regions.isEmpty()) {<a name="line.1418"></a>
-<span class="sourceLineNo">1419</span>      return assignments;<a name="line.1419"></a>
-<span class="sourceLineNo">1420</span>    }<a name="line.1420"></a>
-<span class="sourceLineNo">1421</span><a name="line.1421"></a>
-<span class="sourceLineNo">1422</span>    int numServers = servers == null ? 0 : servers.size();<a name="line.1422"></a>
-<span class="sourceLineNo">1423</span>    if (numServers == 0) {<a name="line.1423"></a>
-<span class="sourceLineNo">1424</span>      LOG.warn("Wanted to do retain assignment but no servers to assign to");<a name="line.1424"></a>
-<span class="sourceLineNo">1425</span>      return null;<a name="line.1425"></a>
-<span class="sourceLineNo">1426</span>    }<a name="line.1426"></a>
-<span class="sourceLineNo">1427</span>    if (numServers == 1) { // Only one server, nothing fancy we can do here<a name="line.1427"></a>
-<span class="sourceLineNo">1428</span>      ServerName server = servers.get(0);<a name="line.1428"></a>
-<span class="sourceLineNo">1429</span>      assignments.put(server, new ArrayList&lt;&gt;(regions.keySet()));<a name="line.1429"></a>
-<span class="sourceLineNo">1430</span>      return assignments;<a name="line.1430"></a>
-<span class="sourceLineNo">1431</span>    }<a name="line.1431"></a>
-<span class="sourceLineNo">1432</span><a name="line.1432"></a>
-<span class="sourceLineNo">1433</span>    // Group all of the old assignments by their hostname.<a name="line.1433"></a>
-<span class="sourceLineNo">1434</span>    // We can't group directly by ServerName since the servers all have<a name="line.1434"></a>
-<span class="sourceLineNo">1435</span>    // new start-codes.<a name="line.1435"></a>
-<span class="sourceLineNo">1436</span><a name="line.1436"></a>
-<span class="sourceLineNo">1437</span>    // Group the servers by their hostname. It's possible we have multiple<a name="line.1437"></a>
-<span class="sourceLineNo">1438</span>    // servers on the same host on different ports.<a name="line.1438"></a>
-<span class="sourceLineNo">1439</span>    ArrayListMultimap&lt;String, ServerName&gt; serversByHostname = ArrayListMultimap.create();<a name="line.1439"></a>
-<span class="sourceLineNo">1440</span>    for (ServerName server : servers) {<a name="line.1440"></a>
-<span class="sourceLineNo">1441</span>      assignments.put(server, new ArrayList&lt;&gt;());<a name="line.1441"></a>
-<span class="sourceLineNo">1442</span>      serversByHostname.put(server.getHostnameLowerCase(), server);<a name="line.1442"></a>
-<span class="sourceLineNo">1443</span>    }<a name="line.1443"></a>
-<span class="sourceLineNo">1444</span><a name="line.1444"></a>
-<span class="sourceLineNo">1445</span>    // Collection of the hostnames that used to have regions<a name="line.1445"></a>
-<span class="sourceLineNo">1446</span>    // assigned, but for which we no longer have any RS running<a name="line.1446"></a>
-<span class="sourceLineNo">1447</span>    // after the cluster restart.<a name="line.1447"></a>
-<span class="sourceLineNo">1448</span>    Set&lt;String&gt; oldHostsNoLongerPresent = Sets.newTreeSet();<a name="line.1448"></a>
-<span class="sourceLineNo">1449</span><a name="line.1449"></a>
-<span class="sourceLineNo">1450</span>    // If the old servers aren't present, lets assign those regions later.<a name="line.1450"></a>
-<span class="sourceLineNo">1451</span>    List&lt;RegionInfo&gt; randomAssignRegions = Lists.newArrayList();<a name="line.1451"></a>
-<span class="sourceLineNo">1452</span><a name="line.1452"></a>
-<span class="sourceLineNo">1453</span>    int numRandomAssignments = 0;<a name="line.1453"></a>
-<span class="sourceLineNo">1454</span>    int numRetainedAssigments = 0;<a name="line.1454"></a>
-<span class="sourceLineNo">1455</span>    boolean hasRegionReplica = false;<a name="line.1455"></a>
-<span class="sourceLineNo">1456</span>    for (Map.Entry&lt;RegionInfo, ServerName&gt; entry : regions.entrySet()) {<a name="line.1456"></a>
-<span class="sourceLineNo">1457</span>      RegionInfo region = entry.getKey();<a name="line.1457"></a>
-<span class="sourceLineNo">1458</span>      ServerName oldServerName = entry.getValue();<a name="line.1458"></a>
-<span class="sourceLineNo">1459</span>      // In the current set of regions even if one has region replica let us go with<a name="line.1459"></a>
-<span class="sourceLineNo">1460</span>      // getting the entire snapshot<a name="line.1460"></a>
-<span class="sourceLineNo">1461</span>      if (this.services != null) { // for tests<a name="line.1461"></a>
-<span class="sourceLineNo">1462</span>        AssignmentManager am = this.services.getAssignmentManager();<a name="line.1462"></a>
-<span class="sourceLineNo">1463</span>        if (am != null) {<a name="line.1463"></a>
-<span class="sourceLineNo">1464</span>          RegionStates states = am.getRegionStates();<a name="line.1464"></a>
-<span class="sourceLineNo">1465</span>          if (!hasRegionReplica &amp;&amp; states != null &amp;&amp; states.isReplicaAvailableForRegion(region)) {<a name="line.1465"></a>
-<span class="sourceLineNo">1466</span>            hasRegionReplica = true;<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>      List&lt;ServerName&gt; localServers = new ArrayList&lt;&gt;();<a name="line.1470"></a>
-<span class="sourceLineNo">1471</span>      if (oldServerName != null) {<a name="line.1471"></a>
-<span class="sourceLineNo">1472</span>        localServers = serversByHostname.get(oldServerName.getHostnameLowerCase());<a name="line.1472"></a>
-<span class="sourceLineNo">1473</span>      }<a name="line.1473"></a>
-<span class="sourceLineNo">1474</span>      if (localServers.isEmpty()) {<a name="line.1474"></a>
-<span class="sourceLineNo">1475</span>        // No servers on the new cluster match up with this hostname, assign randomly, later.<a name="line.1475"></a>
-<span class="sourceLineNo">1476</span>        randomAssignRegions.add(region);<a name="line.1476"></a>
-<span class="sourceLineNo">1477</span>        if (oldServerName != null) {<a name="line.1477"></a>
-<span class="sourceLineNo">1478</span>          oldHostsNoLongerPresent.add(oldServerName.getHostnameLowerCase());<a name="line.1478"></a>
-<span class="sourceLineNo">1479</span>        }<a name="line.1479"></a>
-<span class="sourceLineNo">1480</span>      } else if (localServers.size() == 1) {<a name="line.1480"></a>
-<span class="sourceLineNo">1481</span>        // the usual case - one new server on same host<a name="line.1481"></a>
-<span class="sourceLineNo">1482</span>        ServerName target = localServers.get(0);<a name="line.1482"></a>
-<span class="sourceLineNo">1483</span>        assignments.get(target).add(region);<a name="line.1483"></a>
-<span class="sourceLineNo">1484</span>        numRetainedAssigments++;<a name="line.1484"></a>
-<span class="sourceLineNo">1485</span>      } else {<a name="line.1485"></a>
-<span class="sourceLineNo">1486</span>        // multiple new servers in the cluster on this same host<a name="line.1486"></a>
-<span class="sourceLineNo">1487</span>        if (localServers.contains(oldServerName)) {<a name="line.1487"></a>
-<span class="sourceLineNo">1488</span>          assignments.get(oldServerName).add(region);<a name="line.1488"></a>
-<span class="sourceLineNo">1489</span>          numRetainedAssigments++;<a name="line.1489"></a>
-<span class="sourceLineNo">1490</span>        } else {<a name="line.1490"></a>
-<span class="sourceLineNo">1491</span>          ServerName target = null;<a name="line.1491"></a>
-<span class="sourceLineNo">1492</span>          for (ServerName tmp : localServers) {<a name="line.1492"></a>
-<span class="sourceLineNo">1493</span>            if (tmp.getPort() == oldServerName.getPort()) {<a name="line.1493"></a>
-<span class="sourceLineNo">1494</span>              target = tmp;<a name="line.1494"></a>
-<span class="sourceLineNo">1495</span>              assignments.get(tmp).add(region);<a name="line.1495"></a>
-<span class="sourceLineNo">1496</span>              numRetainedAssigments++;<a name="line.1496"></a>
-<span class="sourceLineNo">1497</span>              break;<a name="line.1497"></a>
-<span class="sourceLineNo">1498</span>            }<a name="line.1498"></a>
-<span class="sourceLineNo">1499</span>          }<a name="line.1499"></a>
-<span class="sourceLineNo">1500</span>          if (target == null) {<a name="line.1500"></a>
-<span class="sourceLineNo">1501</span>            randomAssignRegions.add(region);<a name="line.1501"></a>
-<span class="sourceLineNo">1502</span>          }<a name="line.1502"></a>
-<span class="sourceLineNo">1503</span>        }<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><a name="line.1506"></a>
-<span class="sourceLineNo">1507</span>    // If servers from prior assignment aren't present, then lets do randomAssignment on regions.<a name="line.1507"></a>
-<span class="sourceLineNo">1508</span>    if (randomAssignRegions.size() &gt; 0) {<a name="line.1508"></a>
-<span class="sourceLineNo">1509</span>      Cluster cluster = createCluster(servers, regions.keySet(), hasRegionReplica);<a name="line.1509"></a>
-<span class="sourceLineNo">1510</span>      for (Map.Entry&lt;ServerName, List&lt;RegionInfo&gt;&gt; entry : assignments.entrySet()) {<a name="line.1510"></a>
-<span class="sourceLineNo">1511</span>        ServerName sn = entry.getKey();<a name="line.1511"></a>
-<span class="sourceLineNo">1512</span>        for (RegionInfo region : entry.getValue()) {<a name="line.1512"></a>
-<span class="sourceLineNo">1513</span>          cluster.doAssignRegion(region, sn);<a name="line.1513"></a>
-<span class="sourceLineNo">1514</span>        }<a name="line.1514"></a>
-<span class="sourceLineNo">1515</span>      }<a name="line.1515"></a>
-<span class="sourceLineNo">1516</span>      for (RegionInfo region : randomAssignRegions) {<a name="line.1516"></a>
-<span class="sourceLineNo">1517</span>        ServerName target = randomAssignment(cluster, region, servers);<a name="line.1517"></a>
-<span class="sourceLineNo">1518</span>        assignments.get(target).add(region);<a name="line.1518"></a>
-<span class="sourceLineNo">1519</span>        numRandomAssignments++;<a name="line.1519"></a>
-<span class="sourceLineNo">1520</span>      }<a name="line.1520"></a>
-<span class="sourceLineNo">1521</span>    }<a name="line.1521"></a>
-<span class="sourceLineNo">1522</span><a name="line.1522"></a>
-<span class="sourceLineNo">1523</span>    String randomAssignMsg = "";<a name="line.1523"></a>
-<span class="sourceLineNo">1524</span>    if (numRandomAssignments &gt; 0) {<a name="line.1524"></a>
-<span class="sourceLineNo">1525</span>      randomAssignMsg =<a name="line.1525"></a>
-<span class="sourceLineNo">1526</span>          numRandomAssignments + " regions were assigned "<a name="line.1526"></a>
-<span class="sourceLineNo">1527</span>              + "to random hosts, since the old hosts for these regions are no "<a name="line.1527"></a>
-<span class="sourceLineNo">1528</span>              + "longer present in the cluster. These hosts were:\n  "<a name="line.1528"></a>
-<span class="sourceLineNo">1529</span>              + Joiner.on("\n  ").join(oldHostsNoLongerPresent);<a name="line.1529"></a>
-<span class="sourceLineNo">1530</span>    }<a name="line.1530"></a>
-<span class="sourceLineNo">1531</span><a name="line.1531"></a>
-<span class="sourceLineNo">1532</span>    LOG.info("Reassigned " + regions.size() + " regions. " + numRetainedAssigments<a name="line.1532"></a>
-<span class="sourceLineNo">1533</span>        + " retained the pre-restart assignment. " + randomAssignMsg);<a name="line.1533"></a>
-<span class="sourceLineNo">1534</span>    return assignments;<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>  @Override<a name="line.1537"></a>
-<span class="sourceLineNo">1538</span>  public void initialize() throws HBaseIOException{<a name="line.1538"></a>
-<span class="sourceLineNo">1539</span>  }<a name="line.1539"></a>
-<span class="sourceLineNo">1540</span><a name="line.1540"></a>
-<span class="sourceLineNo">1541</span>  @Override<a name="line.1541"></a>
-<span class="sourceLineNo">1542</span>  public void regionOnline(RegionInfo regionInfo, ServerName sn) {<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>  @Override<a name="line.1545"></a>
-<span class="sourceLineNo">1546</span>  public void regionOffline(RegionInfo regionInfo) {<a name="line.1546"></a>
-<span class="sourceLineNo">1547</span>  }<a name="line.1547"></a>
-<span class="sourceLineNo">1548</span><a name="line.1548"></a>
-<span class="sourceLineNo">1549</span>  @Override<a name="line.1549"></a>
-<span class="sourceLineNo">1550</span>  public boolean isStopped() {<a name="line.1550"></a>
-<span class="sourceLineNo">1551</span>    return stopped;<a name="line.1551"></a>
-<span class="sourceLineNo">1552</span>  }<a name="line.1552"></a>
-<span class="sourceLineNo">1553</span><a name="line.1553"></a>
-<span class="sourceLineNo">1554</span>  @Override<a name="line.1554"></a>
-<span class="sourceLineNo">1555</span>  public void stop(String why) {<a name="line.1555"></a>
-<span class="sourceLineNo">1556</span>    LOG.info("Load Balancer stop requested: "+why);<a name="line.1556"></a>
-<span class="sourceLineNo">1557</span>    stopped = true;<a name="line.1557"></a>
-<span class="sourceLineNo">1558</span>  }<a name="line.1558"></a>
-<span class="sourceLineNo">1559</span><a name="line.1559"></a>
-<span class="sourceLineNo">1560</span>  /**<a name="line.1560"></a>
-<span class="sourceLineNo">1561</span>  * Updates the balancer status tag reported to JMX<a name="line.1561"></a>
-<span class="sourceLineNo">1562</span>  */<a name="line.1562"></a>
-<span class="sourceLineNo">1563</span>  public void updateBalancerStatus(boolean status) {<a name="line.1563"></a>
-<span class="sourceLineNo">1564</span>    metricsBalancer.balancerStatus(status);<a name="line.1564"></a>
-<span class="sourceLineNo">1565</span>  }<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>   * Used to assign a single region to a random server.<a name="line.1568"></a>
-<span class="sourceLineNo">1569</span>   */<a name="line.1569"></a>
-<span class="sourceLineNo">1570</span>  private ServerName randomAssignment(Cluster cluster, RegionInfo regionInfo,<a name="line.1570"></a>
-<span class="sourceLineNo">1571</span>      List&lt;ServerName&gt; servers) {<a name="line.1571"></a>
-<span class="sourceLineNo">1572</span>    int numServers = servers.size(); // servers is not null, numServers &gt; 1<a name="line.1572"></a>
-<span class="sourceLineNo">1573</span>    ServerName sn = null;<a name="line.1573"></a>
-<span class="sourceLineNo">1574</span>    final int maxIterations = numServers * 4;<a name="line.1574"></a>
-<span class="sourceLineNo">1575</span>    int iterations = 0;<a name="line.1575"></a>
-<span class="sourceLineNo">1576</span>    List&lt;ServerName&gt; usedSNs = new ArrayList&lt;&gt;(servers.size());<a name="line.1576"></a>
-<span class="sourceLineNo">1577</span>    do {<a name="line.1577"></a>
-<span class="sourceLineNo">1578</span>      int i = RANDOM.nextInt(numServers);<a name="line.1578"></a>
-<span class="sourceLineNo">1579</span>      sn = servers.get(i);<a name="line.1579"></a>
-<span class="sourceLineNo">1580</span>      if (!usedSNs.contains(sn)) {<a name="line.1580"></a>
-<span class="sourceLineNo">1581</span>        usedSNs.add(sn);<a name="line.1581"></a>
-<span class="sourceLineNo">1582</span>      }<a name="line.1582"></a>
-<span class="sourceLineNo">1583</span>    } while (cluster.wouldLowerAvailability(regionInfo, sn)<a name="line.1583"></a>
-<span class="sourceLineNo">1584</span>        &amp;&amp; iterations++ &lt; maxIterations);<a name="line.1584"></a>
-<span class="sourceLineNo">1585</span>    if (iterations &gt;= maxIterations) {<a name="line.1585"></a>
-<span class="sourceLineNo">1586</span>      // We have reached the max. Means the servers that we collected is still lowering the<a name="line.1586"></a>
-<span class="sourceLineNo">1587</span>      // availability<a name="line.1587"></a>
-<span class="sourceLineNo">1588</span>      for (ServerName unusedServer : servers) {<a name="line.1588"></a>
-<span class="sourceLineNo">1589</span>        if (!usedSNs.contains(unusedServer)) {<a name="line.1589"></a>
-<span class="sourceLineNo">1590</span>          // check if any other unused server is there for us to use.<a name="line.1590"></a>
-<span class="sourceLineNo">1591</span>          // If so use it. Else we have not other go but to go with one of them<a name="line.1591"></a>
-<span class="sourceLineNo">1592</span>          if (!cluster.wouldLowerAvailability(regionInfo, unusedServer)) {<a name="line.1592"></a>
-<span class="sourceLineNo">1593</span>            sn = unusedServer;<a name="line.1593"></a>
-<span class="sourceLineNo">1594</span>            break;<a name="line.1594"></a>
-<span class="sourceLineNo">1595</span>          }<a name="line.1595"></a>
-<span class="sourceLineNo">1596</span>        }<a name="line.1596"></a>
-<span class="sourceLineNo">1597</span>      }<a name="line.1597"></a>
-<span class="sourceLineNo">1598</span>    }<a name="line.1598"></a>
-<span class="sourceLineNo">1599</span>    cluster.doAssignRegion(regionInfo, sn);<a name="line.1599"></a>
-<span class="sourceLineNo">1600</span>    return sn;<a name="line.1600"></a>
-<span class="sourceLineNo">1601</span>  }<a name="line.1601"></a>
-<span class="sourceLineNo">1602</span><a name="line.1602"></a>
-<span class="sourceLineNo">1603</span>  /**<a name="line.1603"></a>
-<span class="sourceLineNo">1604</span>   * Round robin a list of regions to a list of servers<a name="line.1604"></a>
-<span class="sourceLineNo">1605</span>   */<a name="line.1605"></a>
-<span class="sourceLineNo">1606</span>  private void roundRobinAssignment(Cluster cluster, List&lt;RegionInfo&gt; regions,<a name="line.1606"></a>
-<span class="sourceLineNo">1607</span>      List&lt;RegionInfo&gt; unassignedRegions, List&lt;ServerName&gt; servers,<a name="line.1607"></a>
-<span class="sourceLineNo">1608</span>      Map&lt;ServerName, List&lt;RegionInfo&gt;&gt; assignments) {<a name="line.1608"></a>
-<span class="sourceLineNo">1609</span><a name="line.1609"></a>
-<span class="sourceLineNo">1610</span>    int numServers = servers.size();<a name="line.1610"></a>
-<span class="sourceLineNo">1611</span>    int numRegions = regions.size();<a name="line.1611"></a>
-<span class="sourceLineNo">1612</span>    int max = (int) Math.ceil((float) numRegions / numServers);<a name="line.1612"></a>
-<span class="sourceLineNo">1613</span>    int serverIdx = 0;<a name="line.1613"></a>
-<span class="sourceLineNo">1614</span>    if (numServers &gt; 1) {<a name="line.1614"></a>
-<span class="sourceLineNo">1615</span>      serverIdx = RANDOM.nextInt(numServers);<a name="line.1615"></a>
-<span class="sourceLineNo">1616</span>    }<a name="line.1616"></a>
-<span class="sourceLineNo">1617</span>    int regionIdx = 0;<a name="line.1617"></a>
-<span class="sourceLineNo">1618</span><a name="line.1618"></a>
-<span class="sourceLineNo">1619</span>    for (int j = 0; j &lt; numServers; j++) {<a name="line.1619"></a>
-<span class="sourceLineNo">1620</span>      ServerName server = servers.get((j + serverIdx) % numServers);<a name="line.1620"></a>
-<span class="sourceLineNo">1621</span>      List&lt;RegionInfo&gt; serverRegions = new ArrayList&lt;&gt;(max);<a name="line.1621"></a>
-<span class="sourceLineNo">1622</span>      for (int i = regionIdx; i &lt; numRegions; i += numServers) {<a name="line.1622"></a>
-<span class="sourceLineNo">1623</span>        RegionInfo region = regions.get(i % numRegions);<a name="line.1623"></a>
-<span class="sourceLineNo">1624</span>        if (cluster.wouldLowerAvailability(region, server)) {<a name="line.1624"></a>
-<span class="sourceLineNo">1625</span>          unassignedRegions.add(region);<a name="line.1625"></a>
-<span class="sourceLineNo">1626</span>        } else {<a name="line.1626"></a>
-<span class="sourceLineNo">1627</span>          serverRegions.add(region);<a name="line.1627"></a>
-<span class="sourceLineNo">1628</span>          cluster.doAssignRegion(region, server);<a name="line.1628"></a>
-<span class="sourceLineNo">1629</span>        }<a name="line.1629"></a>
-<span class="sourceLineNo">1630</span>      }<a name="line.1630"></a>
-<span class="sourceLineNo">1631</span>      assignments.put(server, serverRegions);<a name="line.1631"></a>
-<span class="sourceLineNo">1632</span>      regionIdx++;<a name="line.1632"></a>
-<span class="sourceLineNo">1633</span>    }<a name="line.1633"></a>
-<span class="sourceLineNo">1634</span>  }<a name="line.1634"></a>
-<span class="sourceLineNo">1635</span><a name="line.1635"></a>
-<span class="sourceLineNo">1636</span>  protected Map&lt;ServerName, List&lt;RegionInfo&gt;&gt; getRegionAssignmentsByServer(<a name="line.1636"></a>
-<span class="sourceLineNo">1637</span>    Collection&lt;RegionInfo&gt; regions) {<a name="line.1637"></a>
-<span class="sourceLineNo">1638</span>    if (this.services != null &amp;&amp; this.services.getAssignmentManager() != null) {<a name="line.1638"></a>
-<span class="sourceLineNo">1639</span>      return this.services.getAssignmentManager().getSnapShotOfAssignment(regions);<a name="line.1639"></a>
-<span class="sourceLineNo">1640</span>    } else {<a name="line.1640"></a>
-<span class="sourceLineNo">1641</span>      return new HashMap&lt;&gt;();<a name="line.1641"></a>
-<span class="sourceLineNo">1642</span>    }<a name="line.1642"></a>
-<span class="sourceLineNo">1643</span>  }<a name="line.1643"></a>
-<span class="sourceLineNo">1644</span><a name="line.1644"></a>
-<span class="sourceLineNo">1645</span>  @Override<a name="line.1645"></a>
-<span class="sourceLineNo">1646</span>  public void onConfigurationChange(Configuration conf) {<a name="line.1646"></a>
-<span class="sourceLineNo">1647</span>  }<a name="line.1647"></a>
-<span class="sourceLineNo">1648</span>}<a name="line.1648"></a>
+<span class="sourceLineNo">1044</span>  /**<a name="line.1044"></a>
+<span class="sourceLineNo">1045</span>   * Check if a region belongs to some system table.<a name="line.1045"></a>
+<span class="sourceLineNo">1046</span>   * If so, the primary replica may be expected to be put on the master regionserver.<a name="line.1046"></a>
+<span class="sourceLineNo">1047</span>   */<a name="line.1047"></a>
+<span class="sourceLineNo">1048</span>  public boolean shouldBeOnMaster(RegionInfo region) {<a name="line.1048"></a>
+<span class="sourceLineNo">1049</span>    return (this.maintenanceMode || this.onlySystemTablesOnMaster)<a name="line.1049"></a>
+<span class="sourceLineNo">1050</span>        &amp;&amp; region.getTable().isSystemTable();<a name="line.1050"></a>
+<span class="sourceLineNo">1051</span>  }<a name="line.1051"></a>
+<span class="sourceLineNo">1052</span><a name="line.1052"></a>
+<span class="sourceLineNo">1053</span>  /**<a name="line.1053"></a>
+<span class="sourceLineNo">1054</span>   * Balance the regions that should be on master regionserver.<a name="line.1054"></a>
+<span class="sourceLineNo">1055</span>   */<a name="line.1055"></a>
+<span class="sourceLineNo">1056</span>  protected List&lt;RegionPlan&gt; balanceMasterRegions(Map&lt;ServerName, List&lt;RegionInfo&gt;&gt; clusterMap) {<a name="line.1056"></a>
+<span class="sourceLineNo">1057</span>    if (masterServerName == null || clusterMap == null || clusterMap.size() &lt;= 1) return null;<a name="line.1057"></a>
+<span class="sourceLineNo">1058</span>    List&lt;RegionPlan&gt; plans = null;<a name="line.1058"></a>
+<span class="sourceLineNo">1059</span>    List&lt;RegionInfo&gt; regions = clusterMap.get(masterServerName);<a name="line.1059"></a>
+<span class="sourceLineNo">1060</span>    if (regions != null) {<a name="line.1060"></a>
+<span class="sourceLineNo">1061</span>      Iterator&lt;ServerName&gt; keyIt = null;<a name="line.1061"></a>
+<span class="sourceLineNo">1062</span>      for (RegionInfo region: regions) {<a name="line.1062"></a>
+<span class="sourceLineNo">1063</span>        if (shouldBeOnMaster(region)) continue;<a name="line.1063"></a>
+<span class="sourceLineNo">1064</span><a name="line.1064"></a>
+<span class="sourceLineNo">1065</span>        // Find a non-master regionserver to host the region<a name="line.1065"></a>
+<span class="sourceLineNo">1066</span>        if (keyIt == null || !keyIt.hasNext()) {<a name="line.1066"></a>
+<span class="sourceLineNo">1067</span>          keyIt = clusterMap.keySet().iterator();<a name="line.1067"></a>
+<span class="sourceLineNo">1068</span>        }<a name="line.1068"></a>
+<span class="sourceLineNo">1069</span>        ServerName dest = keyIt.next();<a name="line.1069"></a>
+<span class="sourceLineNo">1070</span>        if (masterServerName.equals(dest)) {<a name="line.1070"></a>
+<span class="sourceLineNo">1071</span>          if (!keyIt.hasNext()) {<a name="line.1071"></a>
+<span class="sourceLineNo">1072</span>            keyIt = clusterMap.keySet().iterator();<a name="line.1072"></a>
+<span class="sourceLineNo">1073</span>          }<a name="line.1073"></a>
+<span class="sourceLineNo">1074</span>          dest = keyIt.next();<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>        // Move this region away from the master regionserver<a name="line.1077"></a>
+<span class="sourceLineNo">1078</span>        RegionPlan plan = new RegionPlan(region, masterServerName, dest);<a name="line.1078"></a>
+<span class="sourceLineNo">1079</span>        if (plans == null) {<a name="line.1079"></a>
+<span class="sourceLineNo">1080</span>          plans = new ArrayList&lt;&gt;();<a name="line.1080"></a>
+<span class="sourceLineNo">1081</span>        }<a name="line.1081"></a>
+<span class="sourceLineNo">1082</span>        plans.add(plan);<a name="line.1082"></a>
+<span class="sourceLineNo">1083</span>      }<a name="line.1083"></a>
+<span class="sourceLineNo">1084</span>    }<a name="line.1084"></a>
+<span class="sourceLineNo">1085</span>    for (Map.Entry&lt;ServerName, List&lt;RegionInfo&gt;&gt; server: clusterMap.entrySet()) {<a name="line.1085"></a>
+<span class="sourceLineNo">1086</span>      if (masterServerName.equals(server.getKey())) continue;<a name="line.1086"></a>
+<span class="sourceLineNo">1087</span>      for (RegionInfo region: server.getValue()) {<a name="line.1087"></a>
+<span class="sourceLineNo">1088</span>        if (!shouldBeOnMaster(region)) continue;<a name="line.1088"></a>
+<span class="sourceLineNo">1089</span><a name="line.1089"></a>
+<span class="sourceLineNo">1090</span>        // Move this region to the master regionserver<a name="line.1090"></a>
+<span class="sourceLineNo">1091</span>        RegionPlan plan = new RegionPlan(region, server.getKey(), masterServerName);<a name="line.1091"></a>
+<span class="sourceLineNo">1092</span>        if (plans == null) {<a name="line.1092"></a>
+<span class="sourceLineNo">1093</span>          plans = new ArrayList&lt;&gt;();<a name="line.1093"></a>
+<span class="sourceLineNo">1094</span>        }<a name="line.1094"></a>
+<span class="sourceLineNo">1095</span>        plans.add(plan);<a name="line.1095"></a>
+<span class="sourceLineNo">1096</span>      }<a name="line.1096"></a>
+<span class="sourceLineNo">1097</span>    }<a name="line.1097"></a>
+<span class="sourceLineNo">1098</span>    return plans;<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>  /**<a name="line.1101"></a>
+<span class="sourceLineNo">1102</span>   * If master is configured to carry system tables only, in here is<a name="line.1102"></a>
+<span class="sourceLineNo">1103</span>   * where we figure what to assign it.<a name="line.1103"></a>
+<span class="sourceLineNo">1104</span>   */<a name="line.1104"></a>
+<span class="sourceLineNo">1105</span>  protected Map&lt;ServerName, List&lt;RegionInfo&gt;&gt; assignMasterSystemRegions(<a name="line.1105"></a>
+<span class="sourceLineNo">1106</span>      Collection&lt;RegionInfo&gt; regions, List&lt;ServerName&gt; servers) {<a name="line.1106"></a>
+<span class="sourceLineNo">1107</span>    if (servers == null || regions == null || regions.isEmpty()) {<a name="line.1107"></a>
+<span class="sourceLineNo">1108</span>      return null;<a name="line.1108"></a>
+<span class="sourceLineNo">1109</span>    }<a name="line.1109"></a>
+<span class="sourceLineNo">1110</span>    Map&lt;ServerName, List&lt;RegionInfo&gt;&gt; assignments = new TreeMap&lt;&gt;();<a name="line.1110"></a>
+<span class="sourceLineNo">1111</span>    if (this.maintenanceMode || this.onlySystemTablesOnMaster) {<a name="line.1111"></a>
+<span class="sourceLineNo">1112</span>      if (masterServerName != null &amp;&amp; servers.contains(masterServerName)) {<a name="line.1112"></a>
+<span class="sourceLineNo">1113</span>        assignments.put(masterServerName, new ArrayList&lt;&gt;());<a name="line.1113"></a>
+<span class="sourceLineNo">1114</span>        for (RegionInfo region : regions) {<a name="line.1114"></a>
+<span class="sourceLineNo">1115</span>          if (shouldBeOnMaster(region)) {<a name="line.1115"></a>
+<span class="sourceLineNo">1116</span>            assignments.get(masterServerName).add(region);<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>      }<a name="line.1119"></a>
+<span class="sourceLineNo">1120</span>    }<a name="line.1120"></a>
+<span class="sourceLineNo">1121</span>    return assignments;<a name="line.1121"></a>
+<span class="sourceLineNo">1122</span>  }<a name="line.1122"></a>
+<span class="sourceLineNo">1123</span><a name="line.1123"></a>
+<span class="sourceLineNo">1124</span>  @Override<a name="line.1124"></a>
+<span class="sourceLineNo">1125</span>  public Configuration getConf() {<a name="line.1125"></a>
+<span class="sourceLineNo">1126</span>    return this.config;<a name="line.1126"></a>
+<span class="sourceLineNo">1127</span>  }<a name="line.1127"></a>
+<span class="sourceLineNo">1128</span><a name="line.1128"></a>
+<span class="sourceLineNo">1129</span>  @Override<a name="line.1129"></a>
+<span class="sourceLineNo">1130</span>  public synchronized void setClusterMetrics(ClusterMetrics st) {<a name="line.1130"></a>
+<span class="sourceLineNo">1131</span>    this.clusterStatus = st;<a name="line.1131"></a>
+<span class="sourceLineNo">1132</span>    if (useRegionFinder) {<a name="line.1132"></a>
+<span class="sourceLineNo">1133</span>      regionFinder.setClusterMetrics(st);<a name="line.1133"></a>
+<span class="sourceLineNo">1134</span>    }<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 void setClusterLoad(Map&lt;TableName, Map&lt;ServerName, List&lt;RegionInfo&gt;&gt;&gt; clusterLoad){<a name="line.1138"></a>
+<span class="sourceLineNo">1139</span><a name="line.1139"></a>
+<span class="sourceLineNo">1140</span>  }<a name="line.1140"></a>
+<span class="sourceLineNo">1141</span><a name="line.1141"></a>
+<span class="sourceLineNo">1142</span>  @Override<a name="line.1142"></a>
+<span class="sourceLineNo">1143</span>  public void setMasterServices(MasterServices masterServices) {<a name="line.1143"></a>
+<span class="sourceLineNo">1144</span>    masterServerName = masterServices.getServerName();<a name="line.1144"></a>
+<span class="sourceLineNo">1145</span>    this.services = masterServices;<a name="line.1145"></a>
+<span class="sourceLineNo">1146</span>    if (useRegionFinder) {<a name="line.1146"></a>
+<span class="sourceLineNo">1147</span>      this.regionFinder.setServices(masterServices);<a name="line.1147"></a>
+<span class="sourceLineNo">1148</span>    }<a name="line.1148"></a>
+<span class="sourceLineNo">1149</span>    if (this.services.isInMaintenanceMode()) {<a name="line.1149"></a>
+<span class="sourceLineNo">1150</span>      this.maintenanceMode = true;<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><a name="line.1153"></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 (this.maintenanceMode || 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="sour

<TRUNCATED>

[37/46] hbase-site git commit: Published site at 05d22ed960204183fbd9bd16f1dbca6410ccde76.

Posted by gi...@apache.org.
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/3649682c/devapidocs/org/apache/hadoop/hbase/regionserver/HRegionServer.html
----------------------------------------------------------------------
diff --git a/devapidocs/org/apache/hadoop/hbase/regionserver/HRegionServer.html b/devapidocs/org/apache/hadoop/hbase/regionserver/HRegionServer.html
index f12c72e..5ad6589 100644
--- a/devapidocs/org/apache/hadoop/hbase/regionserver/HRegionServer.html
+++ b/devapidocs/org/apache/hadoop/hbase/regionserver/HRegionServer.html
@@ -2424,7 +2424,7 @@ protected static final&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/j
 <ul class="blockList">
 <li class="blockList">
 <h4>movedRegions</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="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>,<a href="../../../../../org/apache/hadoop/hbase/regionserver/HRegionServer.MovedRegionInfo.html" title="class in org.apache.hadoop.hbase.regionserver">HRegionServer.MovedRegionInfo</a>&gt; <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegionServer.html#line.3440">movedRegions</a></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="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>,<a href="../../../../../org/apache/hadoop/hbase/regionserver/HRegionServer.MovedRegionInfo.html" title="class in org.apache.hadoop.hbase.regionserver">HRegionServer.MovedRegionInfo</a>&gt; <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegionServer.html#line.3441">movedRegions</a></pre>
 </li>
 </ul>
 <a name="TIMEOUT_REGION_MOVED">
@@ -2433,7 +2433,7 @@ protected static final&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/j
 <ul class="blockListLast">
 <li class="blockList">
 <h4>TIMEOUT_REGION_MOVED</h4>
-<pre>private static final&nbsp;int <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegionServer.html#line.3444">TIMEOUT_REGION_MOVED</a></pre>
+<pre>private static final&nbsp;int <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegionServer.html#line.3445">TIMEOUT_REGION_MOVED</a></pre>
 <dl>
 <dt><span class="seeLabel">See Also:</span></dt>
 <dd><a href="../../../../../constant-values.html#org.apache.hadoop.hbase.regionserver.HRegionServer.TIMEOUT_REGION_MOVED">Constant Field Values</a></dd>
@@ -2794,7 +2794,7 @@ protected static final&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/j
 <ul class="blockList">
 <li class="blockList">
 <h4>containsMetaTableRegions</h4>
-<pre>private&nbsp;boolean&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegionServer.html#line.1160">containsMetaTableRegions</a>()</pre>
+<pre>private&nbsp;boolean&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegionServer.html#line.1161">containsMetaTableRegions</a>()</pre>
 </li>
 </ul>
 <a name="areAllUserRegionsOffline--">
@@ -2803,7 +2803,7 @@ protected static final&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/j
 <ul class="blockList">
 <li class="blockList">
 <h4>areAllUserRegionsOffline</h4>
-<pre>private&nbsp;boolean&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegionServer.html#line.1164">areAllUserRegionsOffline</a>()</pre>
+<pre>private&nbsp;boolean&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegionServer.html#line.1165">areAllUserRegionsOffline</a>()</pre>
 </li>
 </ul>
 <a name="getWriteRequestCount--">
@@ -2812,7 +2812,7 @@ protected static final&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/j
 <ul class="blockList">
 <li class="blockList">
 <h4>getWriteRequestCount</h4>
-<pre>private&nbsp;long&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegionServer.html#line.1179">getWriteRequestCount</a>()</pre>
+<pre>private&nbsp;long&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegionServer.html#line.1180">getWriteRequestCount</a>()</pre>
 <dl>
 <dt><span class="returnLabel">Returns:</span></dt>
 <dd>Current write count for all online regions.</dd>
@@ -2825,7 +2825,7 @@ protected static final&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/j
 <ul class="blockList">
 <li class="blockList">
 <h4>tryRegionServerReport</h4>
-<pre>protected&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegionServer.html#line.1188">tryRegionServerReport</a>(long&nbsp;reportStartTime,
+<pre>protected&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegionServer.html#line.1189">tryRegionServerReport</a>(long&nbsp;reportStartTime,
                                      long&nbsp;reportEndTime)
                               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>
@@ -2840,7 +2840,7 @@ protected static final&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/j
 <ul class="blockList">
 <li class="blockList">
 <h4>reportRegionSizesForQuotas</h4>
-<pre>public&nbsp;boolean&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegionServer.html#line.1222">reportRegionSizesForQuotas</a>(<a href="../../../../../org/apache/hadoop/hbase/quotas/RegionSizeStore.html" title="interface in org.apache.hadoop.hbase.quotas">RegionSizeStore</a>&nbsp;regionSizeStore)</pre>
+<pre>public&nbsp;boolean&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegionServer.html#line.1223">reportRegionSizesForQuotas</a>(<a href="../../../../../org/apache/hadoop/hbase/quotas/RegionSizeStore.html" title="interface in org.apache.hadoop.hbase.quotas">RegionSizeStore</a>&nbsp;regionSizeStore)</pre>
 <div class="block">Reports the given map of Regions and their size on the filesystem to the active Master.</div>
 <dl>
 <dt><span class="overrideSpecifyLabel">Specified by:</span></dt>
@@ -2858,7 +2858,7 @@ protected static final&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/j
 <ul class="blockList">
 <li class="blockList">
 <h4>buildReportAndSend</h4>
-<pre>void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegionServer.html#line.1265">buildReportAndSend</a>(org.apache.hadoop.hbase.shaded.protobuf.generated.RegionServerStatusProtos.RegionServerStatusService.BlockingInterface&nbsp;rss,
+<pre>void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegionServer.html#line.1266">buildReportAndSend</a>(org.apache.hadoop.hbase.shaded.protobuf.generated.RegionServerStatusProtos.RegionServerStatusService.BlockingInterface&nbsp;rss,
                         <a href="../../../../../org/apache/hadoop/hbase/quotas/RegionSizeStore.html" title="interface in org.apache.hadoop.hbase.quotas">RegionSizeStore</a>&nbsp;regionSizeStore)
                  throws org.apache.hbase.thirdparty.com.google.protobuf.ServiceException</pre>
 <div class="block">Builds the region size report and sends it to the master. Upon successful sending of the
@@ -2878,7 +2878,7 @@ protected static final&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/j
 <ul class="blockList">
 <li class="blockList">
 <h4>buildRegionSpaceUseReportRequest</h4>
-<pre>org.apache.hadoop.hbase.shaded.protobuf.generated.RegionServerStatusProtos.RegionSpaceUseReportRequest&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegionServer.html#line.1282">buildRegionSpaceUseReportRequest</a>(<a href="../../../../../org/apache/hadoop/hbase/quotas/RegionSizeStore.html" title="interface in org.apache.hadoop.hbase.quotas">RegionSizeStore</a>&nbsp;regionSizes)</pre>
+<pre>org.apache.hadoop.hbase.shaded.protobuf.generated.RegionServerStatusProtos.RegionSpaceUseReportRequest&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegionServer.html#line.1283">buildRegionSpaceUseReportRequest</a>(<a href="../../../../../org/apache/hadoop/hbase/quotas/RegionSizeStore.html" title="interface in org.apache.hadoop.hbase.quotas">RegionSizeStore</a>&nbsp;regionSizes)</pre>
 <div class="block">Builds a <code>RegionServerStatusProtos.RegionSpaceUseReportRequest</code> protobuf message from the region size map.</div>
 <dl>
 <dt><span class="paramLabel">Parameters:</span></dt>
@@ -2894,7 +2894,7 @@ protected static final&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/j
 <ul class="blockList">
 <li class="blockList">
 <h4>convertRegionSize</h4>
-<pre>org.apache.hadoop.hbase.shaded.protobuf.generated.RegionServerStatusProtos.RegionSpaceUse&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegionServer.html#line.1298">convertRegionSize</a>(<a href="../../../../../org/apache/hadoop/hbase/client/RegionInfo.html" title="interface in org.apache.hadoop.hbase.client">RegionInfo</a>&nbsp;regionInfo,
+<pre>org.apache.hadoop.hbase.shaded.protobuf.generated.RegionServerStatusProtos.RegionSpaceUse&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegionServer.html#line.1299">convertRegionSize</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/lang/Long.html?is-external=true" title="class or interface in java.lang">Long</a>&nbsp;sizeInBytes)</pre>
 <div class="block">Converts a pair of <a href="../../../../../org/apache/hadoop/hbase/client/RegionInfo.html" title="interface in org.apache.hadoop.hbase.client"><code>RegionInfo</code></a> and <code>long</code> into a <code>RegionServerStatusProtos.RegionSpaceUse</code>
  protobuf message.</div>
@@ -2913,7 +2913,7 @@ protected static final&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/j
 <ul class="blockList">
 <li class="blockList">
 <h4>buildServerLoad</h4>
-<pre>org.apache.hadoop.hbase.shaded.protobuf.generated.ClusterStatusProtos.ServerLoad&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegionServer.html#line.1305">buildServerLoad</a>(long&nbsp;reportStartTime,
+<pre>org.apache.hadoop.hbase.shaded.protobuf.generated.ClusterStatusProtos.ServerLoad&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegionServer.html#line.1306">buildServerLoad</a>(long&nbsp;reportStartTime,
                                                                                                  long&nbsp;reportEndTime)
                                                                                           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>
@@ -2928,7 +2928,7 @@ protected static final&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/j
 <ul class="blockList">
 <li class="blockList">
 <h4>getOnlineRegionsAsPrintableString</h4>
-<pre><a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegionServer.html#line.1376">getOnlineRegionsAsPrintableString</a>()</pre>
+<pre><a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegionServer.html#line.1377">getOnlineRegionsAsPrintableString</a>()</pre>
 </li>
 </ul>
 <a name="waitOnAllRegionsToClose-boolean-">
@@ -2937,7 +2937,7 @@ protected static final&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/j
 <ul class="blockList">
 <li class="blockList">
 <h4>waitOnAllRegionsToClose</h4>
-<pre>private&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegionServer.html#line.1388">waitOnAllRegionsToClose</a>(boolean&nbsp;abort)</pre>
+<pre>private&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegionServer.html#line.1389">waitOnAllRegionsToClose</a>(boolean&nbsp;abort)</pre>
 <div class="block">Wait on regions close.</div>
 </li>
 </ul>
@@ -2947,7 +2947,7 @@ protected static final&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/j
 <ul class="blockList">
 <li class="blockList">
 <h4>sleep</h4>
-<pre>private&nbsp;boolean&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegionServer.html#line.1442">sleep</a>(long&nbsp;millis)</pre>
+<pre>private&nbsp;boolean&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegionServer.html#line.1443">sleep</a>(long&nbsp;millis)</pre>
 </li>
 </ul>
 <a name="shutdownWAL-boolean-">
@@ -2956,7 +2956,7 @@ protected static final&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/j
 <ul class="blockList">
 <li class="blockList">
 <h4>shutdownWAL</h4>
-<pre>private&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegionServer.html#line.1453">shutdownWAL</a>(boolean&nbsp;close)</pre>
+<pre>private&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegionServer.html#line.1454">shutdownWAL</a>(boolean&nbsp;close)</pre>
 </li>
 </ul>
 <a name="handleReportForDutyResponse-org.apache.hadoop.hbase.shaded.protobuf.generated.RegionServerStatusProtos.RegionServerStartupResponse-">
@@ -2965,7 +2965,7 @@ protected static final&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/j
 <ul class="blockList">
 <li class="blockList">
 <h4>handleReportForDutyResponse</h4>
-<pre>protected&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegionServer.html#line.1474">handleReportForDutyResponse</a>(org.apache.hadoop.hbase.shaded.protobuf.generated.RegionServerStatusProtos.RegionServerStartupResponse&nbsp;c)
+<pre>protected&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegionServer.html#line.1475">handleReportForDutyResponse</a>(org.apache.hadoop.hbase.shaded.protobuf.generated.RegionServerStatusProtos.RegionServerStartupResponse&nbsp;c)
                                     throws <a href="https://docs.oracle.com/javase/8/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</a></pre>
 <dl>
 <dt><span class="throwsLabel">Throws:</span></dt>
@@ -2979,7 +2979,7 @@ protected static final&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/j
 <ul class="blockList">
 <li class="blockList">
 <h4>initializeMemStoreChunkCreator</h4>
-<pre>protected&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegionServer.html#line.1568">initializeMemStoreChunkCreator</a>()</pre>
+<pre>protected&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegionServer.html#line.1569">initializeMemStoreChunkCreator</a>()</pre>
 </li>
 </ul>
 <a name="startHeapMemoryManager--">
@@ -2988,7 +2988,7 @@ protected static final&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/j
 <ul class="blockList">
 <li class="blockList">
 <h4>startHeapMemoryManager</h4>
-<pre>private&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegionServer.html#line.1589">startHeapMemoryManager</a>()</pre>
+<pre>private&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegionServer.html#line.1590">startHeapMemoryManager</a>()</pre>
 </li>
 </ul>
 <a name="createMyEphemeralNode--">
@@ -2997,7 +2997,7 @@ protected static final&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/j
 <ul class="blockList">
 <li class="blockList">
 <h4>createMyEphemeralNode</h4>
-<pre>private&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegionServer.html#line.1597">createMyEphemeralNode</a>()
+<pre>private&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegionServer.html#line.1598">createMyEphemeralNode</a>()
                             throws org.apache.zookeeper.KeeperException,
                                    <a href="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>
@@ -3013,7 +3013,7 @@ protected static final&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/j
 <ul class="blockList">
 <li class="blockList">
 <h4>deleteMyEphemeralNode</h4>
-<pre>private&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegionServer.html#line.1605">deleteMyEphemeralNode</a>()
+<pre>private&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegionServer.html#line.1606">deleteMyEphemeralNode</a>()
                             throws org.apache.zookeeper.KeeperException</pre>
 <dl>
 <dt><span class="throwsLabel">Throws:</span></dt>
@@ -3027,7 +3027,7 @@ protected static final&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/j
 <ul class="blockList">
 <li class="blockList">
 <h4>getRegionServerAccounting</h4>
-<pre>public&nbsp;<a href="../../../../../org/apache/hadoop/hbase/regionserver/RegionServerAccounting.html" title="class in org.apache.hadoop.hbase.regionserver">RegionServerAccounting</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegionServer.html#line.1610">getRegionServerAccounting</a>()</pre>
+<pre>public&nbsp;<a href="../../../../../org/apache/hadoop/hbase/regionserver/RegionServerAccounting.html" title="class in org.apache.hadoop.hbase.regionserver">RegionServerAccounting</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegionServer.html#line.1611">getRegionServerAccounting</a>()</pre>
 <dl>
 <dt><span class="overrideSpecifyLabel">Specified by:</span></dt>
 <dd><code><a href="../../../../../org/apache/hadoop/hbase/regionserver/RegionServerServices.html#getRegionServerAccounting--">getRegionServerAccounting</a></code>&nbsp;in interface&nbsp;<code><a href="../../../../../org/apache/hadoop/hbase/regionserver/RegionServerServices.html" title="interface in org.apache.hadoop.hbase.regionserver">RegionServerServices</a></code></dd>
@@ -3042,7 +3042,7 @@ protected static final&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/j
 <ul class="blockList">
 <li class="blockList">
 <h4>createRegionLoad</h4>
-<pre>org.apache.hadoop.hbase.shaded.protobuf.generated.ClusterStatusProtos.RegionLoad&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegionServer.html#line.1622">createRegionLoad</a>(<a href="../../../../../org/apache/hadoop/hbase/regionserver/HRegion.html" title="class in org.apache.hadoop.hbase.regionserver">HRegion</a>&nbsp;r,
+<pre>org.apache.hadoop.hbase.shaded.protobuf.generated.ClusterStatusProtos.RegionLoad&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegionServer.html#line.1623">createRegionLoad</a>(<a href="../../../../../org/apache/hadoop/hbase/regionserver/HRegion.html" title="class in org.apache.hadoop.hbase.regionserver">HRegion</a>&nbsp;r,
                                                                                                   org.apache.hadoop.hbase.shaded.protobuf.generated.ClusterStatusProtos.RegionLoad.Builder&nbsp;regionLoadBldr,
                                                                                                   org.apache.hadoop.hbase.shaded.protobuf.generated.HBaseProtos.RegionSpecifier.Builder&nbsp;regionSpecifier)
                                                                                            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>
@@ -3058,7 +3058,7 @@ protected static final&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/j
 <ul class="blockList">
 <li class="blockList">
 <h4>createRegionLoad</h4>
-<pre>public&nbsp;org.apache.hadoop.hbase.shaded.protobuf.generated.ClusterStatusProtos.RegionLoad&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegionServer.html#line.1691">createRegionLoad</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;encodedRegionName)
+<pre>public&nbsp;org.apache.hadoop.hbase.shaded.protobuf.generated.ClusterStatusProtos.RegionLoad&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegionServer.html#line.1692">createRegionLoad</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;encodedRegionName)
                                                                                                   throws <a href="https://docs.oracle.com/javase/8/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</a></pre>
 <dl>
 <dt><span class="paramLabel">Parameters:</span></dt>
@@ -3076,7 +3076,7 @@ protected static final&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/j
 <ul class="blockList">
 <li class="blockList">
 <h4>isOnline</h4>
-<pre>public&nbsp;boolean&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegionServer.html#line.1805">isOnline</a>()</pre>
+<pre>public&nbsp;boolean&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegionServer.html#line.1806">isOnline</a>()</pre>
 <div class="block">Report the status of the server. A server is online once all the startup is
  completed (setting up filesystem, starting executorService threads, etc.). This
  method is designed mostly to be useful in tests.</div>
@@ -3092,7 +3092,7 @@ protected static final&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/j
 <ul class="blockList">
 <li class="blockList">
 <h4>setupWALAndReplication</h4>
-<pre>private&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegionServer.html#line.1813">setupWALAndReplication</a>()
+<pre>private&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegionServer.html#line.1814">setupWALAndReplication</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">Setup WAL log and replication if enabled. Replication setup is done in here because it wants to
  be hooked up to WAL.</div>
@@ -3108,7 +3108,7 @@ protected static final&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/j
 <ul class="blockList">
 <li class="blockList">
 <h4>startReplicationService</h4>
-<pre>private&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegionServer.html#line.1845">startReplicationService</a>()
+<pre>private&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegionServer.html#line.1846">startReplicationService</a>()
                               throws <a href="https://docs.oracle.com/javase/8/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</a></pre>
 <div class="block">Start up replication source and sink handlers.</div>
 <dl>
@@ -3123,7 +3123,7 @@ protected static final&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/j
 <ul class="blockList">
 <li class="blockList">
 <h4>getRegionServerMetrics</h4>
-<pre>public&nbsp;<a href="../../../../../org/apache/hadoop/hbase/regionserver/MetricsRegionServer.html" title="class in org.apache.hadoop.hbase.regionserver">MetricsRegionServer</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegionServer.html#line.1860">getRegionServerMetrics</a>()</pre>
+<pre>public&nbsp;<a href="../../../../../org/apache/hadoop/hbase/regionserver/MetricsRegionServer.html" title="class in org.apache.hadoop.hbase.regionserver">MetricsRegionServer</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegionServer.html#line.1861">getRegionServerMetrics</a>()</pre>
 </li>
 </ul>
 <a name="getMasterAddressTracker--">
@@ -3132,7 +3132,7 @@ protected static final&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/j
 <ul class="blockList">
 <li class="blockList">
 <h4>getMasterAddressTracker</h4>
-<pre>public&nbsp;<a href="../../../../../org/apache/hadoop/hbase/zookeeper/MasterAddressTracker.html" title="class in org.apache.hadoop.hbase.zookeeper">MasterAddressTracker</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegionServer.html#line.1867">getMasterAddressTracker</a>()</pre>
+<pre>public&nbsp;<a href="../../../../../org/apache/hadoop/hbase/zookeeper/MasterAddressTracker.html" title="class in org.apache.hadoop.hbase.zookeeper">MasterAddressTracker</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegionServer.html#line.1868">getMasterAddressTracker</a>()</pre>
 <dl>
 <dt><span class="returnLabel">Returns:</span></dt>
 <dd>Master address tracker instance.</dd>
@@ -3145,7 +3145,7 @@ protected static final&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/j
 <ul class="blockList">
 <li class="blockList">
 <h4>startServices</h4>
-<pre>private&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegionServer.html#line.1885">startServices</a>()
+<pre>private&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegionServer.html#line.1886">startServices</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>
@@ -3159,7 +3159,7 @@ protected static final&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/j
 <ul class="blockList">
 <li class="blockList">
 <h4>initializeThreads</h4>
-<pre>private&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegionServer.html#line.1987">initializeThreads</a>()
+<pre>private&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegionServer.html#line.1988">initializeThreads</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>
@@ -3173,7 +3173,7 @@ protected static final&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/j
 <ul class="blockList">
 <li class="blockList">
 <h4>registerConfigurationObservers</h4>
-<pre>private&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegionServer.html#line.2034">registerConfigurationObservers</a>()</pre>
+<pre>private&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegionServer.html#line.2035">registerConfigurationObservers</a>()</pre>
 </li>
 </ul>
 <a name="putUpWebUI--">
@@ -3182,7 +3182,7 @@ protected static final&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/j
 <ul class="blockList">
 <li class="blockList">
 <h4>putUpWebUI</h4>
-<pre>private&nbsp;int&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegionServer.html#line.2046">putUpWebUI</a>()
+<pre>private&nbsp;int&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegionServer.html#line.2047">putUpWebUI</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">Puts up the webui.</div>
 <dl>
@@ -3199,7 +3199,7 @@ protected static final&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/j
 <ul class="blockList">
 <li class="blockList">
 <h4>isHealthy</h4>
-<pre>private&nbsp;boolean&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegionServer.html#line.2100">isHealthy</a>()</pre>
+<pre>private&nbsp;boolean&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegionServer.html#line.2101">isHealthy</a>()</pre>
 </li>
 </ul>
 <a name="getWALs--">
@@ -3208,7 +3208,7 @@ protected static final&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/j
 <ul class="blockList">
 <li class="blockList">
 <h4>getWALs</h4>
-<pre>public&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/util/List.html?is-external=true" title="class or interface in java.util">List</a>&lt;<a href="../../../../../org/apache/hadoop/hbase/wal/WAL.html" title="interface in org.apache.hadoop.hbase.wal">WAL</a>&gt;&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegionServer.html#line.2118">getWALs</a>()
+<pre>public&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/util/List.html?is-external=true" title="class or interface in java.util">List</a>&lt;<a href="../../../../../org/apache/hadoop/hbase/wal/WAL.html" title="interface in org.apache.hadoop.hbase.wal">WAL</a>&gt;&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegionServer.html#line.2119">getWALs</a>()
                   throws <a href="https://docs.oracle.com/javase/8/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</a></pre>
 <dl>
 <dt><span class="overrideSpecifyLabel">Specified by:</span></dt>
@@ -3227,7 +3227,7 @@ protected static final&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/j
 <ul class="blockList">
 <li class="blockList">
 <h4>getWAL</h4>
-<pre>public&nbsp;<a href="../../../../../org/apache/hadoop/hbase/wal/WAL.html" title="interface in org.apache.hadoop.hbase.wal">WAL</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegionServer.html#line.2123">getWAL</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/wal/WAL.html" title="interface in org.apache.hadoop.hbase.wal">WAL</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegionServer.html#line.2124">getWAL</a>(<a href="../../../../../org/apache/hadoop/hbase/client/RegionInfo.html" title="interface in org.apache.hadoop.hbase.client">RegionInfo</a>&nbsp;regionInfo)
            throws <a href="https://docs.oracle.com/javase/8/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</a></pre>
 <dl>
 <dt><span class="overrideSpecifyLabel">Specified by:</span></dt>
@@ -3246,7 +3246,7 @@ protected static final&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/j
 <ul class="blockList">
 <li class="blockList">
 <h4>getWalRoller</h4>
-<pre>public&nbsp;<a href="../../../../../org/apache/hadoop/hbase/regionserver/LogRoller.html" title="class in org.apache.hadoop.hbase.regionserver">LogRoller</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegionServer.html#line.2131">getWalRoller</a>()</pre>
+<pre>public&nbsp;<a href="../../../../../org/apache/hadoop/hbase/regionserver/LogRoller.html" title="class in org.apache.hadoop.hbase.regionserver">LogRoller</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegionServer.html#line.2132">getWalRoller</a>()</pre>
 </li>
 </ul>
 <a name="getConnection--">
@@ -3255,7 +3255,7 @@ protected static final&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/j
 <ul class="blockList">
 <li class="blockList">
 <h4>getConnection</h4>
-<pre>public&nbsp;<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/regionserver/HRegionServer.html#line.2136">getConnection</a>()</pre>
+<pre>public&nbsp;<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/regionserver/HRegionServer.html#line.2137">getConnection</a>()</pre>
 <div class="block"><span class="descfrmTypeLabel">Description copied from interface:&nbsp;<code><a href="../../../../../org/apache/hadoop/hbase/Server.html#getConnection--">Server</a></code></span></div>
 <div class="block">Returns a reference to the servers' connection.
 
@@ -3273,7 +3273,7 @@ protected static final&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/j
 <ul class="blockList">
 <li class="blockList">
 <h4>getClusterConnection</h4>
-<pre>public&nbsp;<a href="../../../../../org/apache/hadoop/hbase/client/ClusterConnection.html" title="interface in org.apache.hadoop.hbase.client">ClusterConnection</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegionServer.html#line.2141">getClusterConnection</a>()</pre>
+<pre>public&nbsp;<a href="../../../../../org/apache/hadoop/hbase/client/ClusterConnection.html" title="interface in org.apache.hadoop.hbase.client">ClusterConnection</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegionServer.html#line.2142">getClusterConnection</a>()</pre>
 <div class="block"><span class="descfrmTypeLabel">Description copied from interface:&nbsp;<code><a href="../../../../../org/apache/hadoop/hbase/Server.html#getClusterConnection--">Server</a></code></span></div>
 <div class="block">Returns a reference to the servers' cluster connection. Prefer <a href="../../../../../org/apache/hadoop/hbase/Server.html#getConnection--"><code>Server.getConnection()</code></a>.
 
@@ -3291,7 +3291,7 @@ protected static final&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/j
 <ul class="blockList">
 <li class="blockList">
 <h4>getMetaTableLocator</h4>
-<pre>public&nbsp;<a href="../../../../../org/apache/hadoop/hbase/zookeeper/MetaTableLocator.html" title="class in org.apache.hadoop.hbase.zookeeper">MetaTableLocator</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegionServer.html#line.2146">getMetaTableLocator</a>()</pre>
+<pre>public&nbsp;<a href="../../../../../org/apache/hadoop/hbase/zookeeper/MetaTableLocator.html" title="class in org.apache.hadoop.hbase.zookeeper">MetaTableLocator</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegionServer.html#line.2147">getMetaTableLocator</a>()</pre>
 <div class="block"><span class="descfrmTypeLabel">Description copied from interface:&nbsp;<code><a href="../../../../../org/apache/hadoop/hbase/Server.html#getMetaTableLocator--">Server</a></code></span></div>
 <div class="block">Returns instance of <a href="../../../../../org/apache/hadoop/hbase/zookeeper/MetaTableLocator.html" title="class in org.apache.hadoop.hbase.zookeeper"><code>MetaTableLocator</code></a>
  running inside this server. This MetaServerLocator is started and stopped by server, clients
@@ -3310,7 +3310,7 @@ protected static final&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/j
 <ul class="blockList">
 <li class="blockList">
 <h4>stop</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegionServer.html#line.2151">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/regionserver/HRegionServer.html#line.2152">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>
@@ -3328,7 +3328,7 @@ protected static final&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/j
 <ul class="blockList">
 <li class="blockList">
 <h4>stop</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegionServer.html#line.2161">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>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegionServer.html#line.2162">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,
                  boolean&nbsp;force,
                  <a href="../../../../../org/apache/hadoop/hbase/security/User.html" title="class in org.apache.hadoop.hbase.security">User</a>&nbsp;user)</pre>
 <div class="block">Stops the regionserver.</div>
@@ -3346,7 +3346,7 @@ protected static final&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/j
 <ul class="blockList">
 <li class="blockList">
 <h4>waitForServerOnline</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegionServer.html#line.2183">waitForServerOnline</a>()</pre>
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegionServer.html#line.2184">waitForServerOnline</a>()</pre>
 </li>
 </ul>
 <a name="postOpenDeployTasks-org.apache.hadoop.hbase.regionserver.RegionServerServices.PostOpenDeployContext-">
@@ -3355,7 +3355,7 @@ protected static final&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/j
 <ul class="blockList">
 <li class="blockList">
 <h4>postOpenDeployTasks</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegionServer.html#line.2197">postOpenDeployTasks</a>(<a href="../../../../../org/apache/hadoop/hbase/regionserver/RegionServerServices.PostOpenDeployContext.html" title="class in org.apache.hadoop.hbase.regionserver">RegionServerServices.PostOpenDeployContext</a>&nbsp;context)
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegionServer.html#line.2198">postOpenDeployTasks</a>(<a href="../../../../../org/apache/hadoop/hbase/regionserver/RegionServerServices.PostOpenDeployContext.html" title="class in org.apache.hadoop.hbase.regionserver">RegionServerServices.PostOpenDeployContext</a>&nbsp;context)
                          throws <a href="https://docs.oracle.com/javase/8/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</a></pre>
 <div class="block"><span class="descfrmTypeLabel">Description copied from interface:&nbsp;<code><a href="../../../../../org/apache/hadoop/hbase/regionserver/RegionServerServices.html#postOpenDeployTasks-org.apache.hadoop.hbase.regionserver.RegionServerServices.PostOpenDeployContext-">RegionServerServices</a></code></span></div>
 <div class="block">Tasks to perform after region open to complete deploy of region on regionserver</div>
@@ -3375,7 +3375,7 @@ protected static final&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/j
 <ul class="blockList">
 <li class="blockList">
 <h4>reportRegionStateTransition</h4>
-<pre>public&nbsp;boolean&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegionServer.html#line.2229">reportRegionStateTransition</a>(<a href="../../../../../org/apache/hadoop/hbase/regionserver/RegionServerServices.RegionStateTransitionContext.html" title="class in org.apache.hadoop.hbase.regionserver">RegionServerServices.RegionStateTransitionContext</a>&nbsp;context)</pre>
+<pre>public&nbsp;boolean&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegionServer.html#line.2230">reportRegionStateTransition</a>(<a href="../../../../../org/apache/hadoop/hbase/regionserver/RegionServerServices.RegionStateTransitionContext.html" title="class in org.apache.hadoop.hbase.regionserver">RegionServerServices.RegionStateTransitionContext</a>&nbsp;context)</pre>
 <div class="block"><span class="descfrmTypeLabel">Description copied from interface:&nbsp;<code><a href="../../../../../org/apache/hadoop/hbase/regionserver/RegionServerServices.html#reportRegionStateTransition-org.apache.hadoop.hbase.regionserver.RegionServerServices.RegionStateTransitionContext-">RegionServerServices</a></code></span></div>
 <div class="block">Notify master that a handler requests to change a region state</div>
 <dl>
@@ -3390,7 +3390,7 @@ protected static final&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/j
 <ul class="blockList">
 <li class="blockList">
 <h4>triggerFlushInPrimaryRegion</h4>
-<pre>void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegionServer.html#line.2328">triggerFlushInPrimaryRegion</a>(<a href="../../../../../org/apache/hadoop/hbase/regionserver/HRegion.html" title="class in org.apache.hadoop.hbase.regionserver">HRegion</a>&nbsp;region)</pre>
+<pre>void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegionServer.html#line.2329">triggerFlushInPrimaryRegion</a>(<a href="../../../../../org/apache/hadoop/hbase/regionserver/HRegion.html" title="class in org.apache.hadoop.hbase.regionserver">HRegion</a>&nbsp;region)</pre>
 <div class="block">Trigger a flush in the primary region replica if this region is a secondary replica. Does not
  block this thread. See RegionReplicaFlushHandler for details.</div>
 </li>
@@ -3401,7 +3401,7 @@ protected static final&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/j
 <ul class="blockList">
 <li class="blockList">
 <h4>getRpcServer</h4>
-<pre>public&nbsp;<a href="../../../../../org/apache/hadoop/hbase/ipc/RpcServerInterface.html" title="interface in org.apache.hadoop.hbase.ipc">RpcServerInterface</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegionServer.html#line.2350">getRpcServer</a>()</pre>
+<pre>public&nbsp;<a href="../../../../../org/apache/hadoop/hbase/ipc/RpcServerInterface.html" title="interface in org.apache.hadoop.hbase.ipc">RpcServerInterface</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegionServer.html#line.2351">getRpcServer</a>()</pre>
 <div class="block"><span class="descfrmTypeLabel">Description copied from interface:&nbsp;<code><a href="../../../../../org/apache/hadoop/hbase/regionserver/RegionServerServices.html#getRpcServer--">RegionServerServices</a></code></span></div>
 <div class="block">Returns a reference to the region server's RPC server</div>
 <dl>
@@ -3416,7 +3416,7 @@ protected static final&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/j
 <ul class="blockList">
 <li class="blockList">
 <h4>getRSRpcServices</h4>
-<pre>public&nbsp;<a href="../../../../../org/apache/hadoop/hbase/regionserver/RSRpcServices.html" title="class in org.apache.hadoop.hbase.regionserver">RSRpcServices</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegionServer.html#line.2355">getRSRpcServices</a>()</pre>
+<pre>public&nbsp;<a href="../../../../../org/apache/hadoop/hbase/regionserver/RSRpcServices.html" title="class in org.apache.hadoop.hbase.regionserver">RSRpcServices</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegionServer.html#line.2356">getRSRpcServices</a>()</pre>
 </li>
 </ul>
 <a name="abort-java.lang.String-java.lang.Throwable-">
@@ -3425,7 +3425,7 @@ protected static final&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/j
 <ul class="blockList">
 <li class="blockList">
 <h4>abort</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegionServer.html#line.2370">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/regionserver/HRegionServer.html#line.2371">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">Cause the server to exit without closing the regions it is serving, the log
  it is using and without notifying the master. Used unit testing and on
@@ -3445,7 +3445,7 @@ protected static final&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/j
 <ul class="blockList">
 <li class="blockList">
 <h4>abort</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegionServer.html#line.2413">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>
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegionServer.html#line.2414">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>
 <dl>
 <dt><span class="seeLabel">See Also:</span></dt>
 <dd><a href="../../../../../org/apache/hadoop/hbase/regionserver/HRegionServer.html#abort-java.lang.String-java.lang.Throwable-"><code>abort(String, Throwable)</code></a></dd>
@@ -3458,7 +3458,7 @@ protected static final&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/j
 <ul class="blockList">
 <li class="blockList">
 <h4>isAborted</h4>
-<pre>public&nbsp;boolean&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegionServer.html#line.2418">isAborted</a>()</pre>
+<pre>public&nbsp;boolean&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegionServer.html#line.2419">isAborted</a>()</pre>
 <div class="block"><span class="descfrmTypeLabel">Description copied from interface:&nbsp;<code><a href="../../../../../org/apache/hadoop/hbase/Abortable.html#isAborted--">Abortable</a></code></span></div>
 <div class="block">Check if the server or client was aborted.</div>
 <dl>
@@ -3475,7 +3475,7 @@ protected static final&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/j
 <ul class="blockList">
 <li class="blockList">
 <h4>kill</h4>
-<pre>protected&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegionServer.html#line.2428">kill</a>()</pre>
+<pre>protected&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegionServer.html#line.2429">kill</a>()</pre>
 </li>
 </ul>
 <a name="sendShutdownInterrupt--">
@@ -3484,7 +3484,7 @@ protected static final&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/j
 <ul class="blockList">
 <li class="blockList">
 <h4>sendShutdownInterrupt</h4>
-<pre>protected&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegionServer.html#line.2436">sendShutdownInterrupt</a>()</pre>
+<pre>protected&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegionServer.html#line.2437">sendShutdownInterrupt</a>()</pre>
 <div class="block">Called on stop/abort before closing the cluster connection and meta locator.</div>
 </li>
 </ul>
@@ -3494,7 +3494,7 @@ protected static final&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/j
 <ul class="blockList">
 <li class="blockList">
 <h4>stopServiceThreads</h4>
-<pre>protected&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegionServer.html#line.2443">stopServiceThreads</a>()</pre>
+<pre>protected&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegionServer.html#line.2444">stopServiceThreads</a>()</pre>
 <div class="block">Wait on all threads to finish. Presumption is that all closes and stops
  have already been called.</div>
 </li>
@@ -3505,7 +3505,7 @@ protected static final&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/j
 <ul class="blockList">
 <li class="blockList">
 <h4>getReplicationSourceService</h4>
-<pre>public&nbsp;<a href="../../../../../org/apache/hadoop/hbase/regionserver/ReplicationSourceService.html" title="interface in org.apache.hadoop.hbase.regionserver">ReplicationSourceService</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegionServer.html#line.2489">getReplicationSourceService</a>()</pre>
+<pre>public&nbsp;<a href="../../../../../org/apache/hadoop/hbase/regionserver/ReplicationSourceService.html" title="interface in org.apache.hadoop.hbase.regionserver">ReplicationSourceService</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegionServer.html#line.2490">getReplicationSourceService</a>()</pre>
 <dl>
 <dt><span class="overrideSpecifyLabel">Specified by:</span></dt>
 <dd><code><a href="../../../../../org/apache/hadoop/hbase/regionserver/RegionServerServices.html#getReplicationSourceService--">getReplicationSourceService</a></code>&nbsp;in interface&nbsp;<code><a href="../../../../../org/apache/hadoop/hbase/regionserver/RegionServerServices.html" title="interface in org.apache.hadoop.hbase.regionserver">RegionServerServices</a></code></dd>
@@ -3521,7 +3521,7 @@ protected static final&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/j
 <ul class="blockList">
 <li class="blockList">
 <h4>getReplicationSinkService</h4>
-<pre>public&nbsp;<a href="../../../../../org/apache/hadoop/hbase/regionserver/ReplicationSinkService.html" title="interface in org.apache.hadoop.hbase.regionserver">ReplicationSinkService</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegionServer.html#line.2496">getReplicationSinkService</a>()</pre>
+<pre>public&nbsp;<a href="../../../../../org/apache/hadoop/hbase/regionserver/ReplicationSinkService.html" title="interface in org.apache.hadoop.hbase.regionserver">ReplicationSinkService</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegionServer.html#line.2497">getReplicationSinkService</a>()</pre>
 <dl>
 <dt><span class="returnLabel">Returns:</span></dt>
 <dd>Return the object that implements the replication sink executorService.</dd>
@@ -3534,7 +3534,7 @@ protected static final&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/j
 <ul class="blockList">
 <li class="blockList">
 <h4>createRegionServerStatusStub</h4>
-<pre>protected&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/regionserver/HRegionServer.html#line.2509">createRegionServerStatusStub</a>()</pre>
+<pre>protected&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/regionserver/HRegionServer.html#line.2510">createRegionServerStatusStub</a>()</pre>
 <div class="block">Get the current master from ZooKeeper and open the RPC connection to it.
  To get a fresh connection, the current rssStub must be null.
  Method will block until a master is available. You can break from this
@@ -3551,7 +3551,7 @@ protected static final&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/j
 <ul class="blockList">
 <li class="blockList">
 <h4>createRegionServerStatusStub</h4>
-<pre>protected&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/regionserver/HRegionServer.html#line.2522">createRegionServerStatusStub</a>(boolean&nbsp;refresh)</pre>
+<pre>protected&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/regionserver/HRegionServer.html#line.2523">createRegionServerStatusStub</a>(boolean&nbsp;refresh)</pre>
 <div class="block">Get the current master from ZooKeeper and open the RPC connection to it. To get a fresh
  connection, the current rssStub must be null. Method will block until a master is available.
  You can break from this block by requesting the server stop.</div>
@@ -3569,7 +3569,7 @@ protected static final&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/j
 <ul class="blockList">
 <li class="blockList">
 <h4>keepLooping</h4>
-<pre>private&nbsp;boolean&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegionServer.html#line.2594">keepLooping</a>()</pre>
+<pre>private&nbsp;boolean&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegionServer.html#line.2595">keepLooping</a>()</pre>
 <dl>
 <dt><span class="returnLabel">Returns:</span></dt>
 <dd>True if we should break loop because cluster is going down or
@@ -3583,7 +3583,7 @@ protected static final&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/j
 <ul class="blockList">
 <li class="blockList">
 <h4>reportForDuty</h4>
-<pre>private&nbsp;org.apache.hadoop.hbase.shaded.protobuf.generated.RegionServerStatusProtos.RegionServerStartupResponse&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegionServer.html#line.2605">reportForDuty</a>()
+<pre>private&nbsp;org.apache.hadoop.hbase.shaded.protobuf.generated.RegionServerStatusProtos.RegionServerStartupResponse&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegionServer.html#line.2606">reportForDuty</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>
@@ -3597,7 +3597,7 @@ protected static final&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/j
 <ul class="blockList">
 <li class="blockList">
 <h4>getLastSequenceId</h4>
-<pre>public&nbsp;org.apache.hadoop.hbase.shaded.protobuf.generated.ClusterStatusProtos.RegionStoreSequenceIds&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegionServer.html#line.2646">getLastSequenceId</a>(byte[]&nbsp;encodedRegionName)</pre>
+<pre>public&nbsp;org.apache.hadoop.hbase.shaded.protobuf.generated.ClusterStatusProtos.RegionStoreSequenceIds&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegionServer.html#line.2647">getLastSequenceId</a>(byte[]&nbsp;encodedRegionName)</pre>
 <dl>
 <dt><span class="overrideSpecifyLabel">Specified by:</span></dt>
 <dd><code><a href="../../../../../org/apache/hadoop/hbase/regionserver/LastSequenceId.html#getLastSequenceId-byte:A-">getLastSequenceId</a></code>&nbsp;in interface&nbsp;<code><a href="../../../../../org/apache/hadoop/hbase/regionserver/LastSequenceId.html" title="interface in org.apache.hadoop.hbase.regionserver">LastSequenceId</a></code></dd>
@@ -3615,7 +3615,7 @@ protected static final&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/j
 <ul class="blockList">
 <li class="blockList">
 <h4>closeAllRegions</h4>
-<pre>protected&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegionServer.html#line.2677">closeAllRegions</a>(boolean&nbsp;abort)</pre>
+<pre>protected&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegionServer.html#line.2678">closeAllRegions</a>(boolean&nbsp;abort)</pre>
 <div class="block">Closes all regions.  Called on our way out.
  Assumes that its not possible for new regions to be added to onlineRegions
  while this method runs.</div>
@@ -3627,7 +3627,7 @@ protected static final&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/j
 <ul class="blockList">
 <li class="blockList">
 <h4>closeMetaTableRegions</h4>
-<pre>void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegionServer.html#line.2686">closeMetaTableRegions</a>(boolean&nbsp;abort)</pre>
+<pre>void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegionServer.html#line.2687">closeMetaTableRegions</a>(boolean&nbsp;abort)</pre>
 <div class="block">Close meta region if we carry it</div>
 <dl>
 <dt><span class="paramLabel">Parameters:</span></dt>
@@ -3641,7 +3641,7 @@ protected static final&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/j
 <ul class="blockList">
 <li class="blockList">
 <h4>closeUserRegions</h4>
-<pre>void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegionServer.html#line.2709">closeUserRegions</a>(boolean&nbsp;abort)</pre>
+<pre>void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegionServer.html#line.2710">closeUserRegions</a>(boolean&nbsp;abort)</pre>
 <div class="block">Schedule closes on all user regions.
  Should be safe calling multiple times because it wont' close regions
  that are already closed or that are closing.</div>
@@ -3657,7 +3657,7 @@ protected static final&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/j
 <ul class="blockList">
 <li class="blockList">
 <h4>getInfoServer</h4>
-<pre>public&nbsp;<a href="../../../../../org/apache/hadoop/hbase/http/InfoServer.html" title="class in org.apache.hadoop.hbase.http">InfoServer</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegionServer.html#line.2725">getInfoServer</a>()</pre>
+<pre>public&nbsp;<a href="../../../../../org/apache/hadoop/hbase/http/InfoServer.html" title="class in org.apache.hadoop.hbase.http">InfoServer</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegionServer.html#line.2726">getInfoServer</a>()</pre>
 <dl>
 <dt><span class="returnLabel">Returns:</span></dt>
 <dd>the info server</dd>
@@ -3670,7 +3670,7 @@ protected static final&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/j
 <ul class="blockList">
 <li class="blockList">
 <h4>isStopped</h4>
-<pre>public&nbsp;boolean&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegionServer.html#line.2733">isStopped</a>()</pre>
+<pre>public&nbsp;boolean&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegionServer.html#line.2734">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>
@@ -3685,7 +3685,7 @@ protected static final&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/j
 <ul class="blockList">
 <li class="blockList">
 <h4>isStopping</h4>
-<pre>public&nbsp;boolean&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegionServer.html#line.2738">isStopping</a>()</pre>
+<pre>public&nbsp;boolean&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegionServer.html#line.2739">isStopping</a>()</pre>
 <dl>
 <dt><span class="overrideSpecifyLabel">Specified by:</span></dt>
 <dd><code><a href="../../../../../org/apache/hadoop/hbase/Server.html#isStopping--">isStopping</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>
@@ -3700,7 +3700,7 @@ protected static final&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/j
 <ul class="blockList">
 <li class="blockList">
 <h4>getConfiguration</h4>
-<pre>public&nbsp;org.apache.hadoop.conf.Configuration&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegionServer.html#line.2747">getConfiguration</a>()</pre>
+<pre>public&nbsp;org.apache.hadoop.conf.Configuration&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegionServer.html#line.2748">getConfiguration</a>()</pre>
 <div class="block"><span class="descfrmTypeLabel">Description copied from interface:&nbsp;<code><a href="../../../../../org/apache/hadoop/hbase/Server.html#getConfiguration--">Server</a></code></span></div>
 <div class="block">Gets the configuration object for this server.</div>
 <dl>
@@ -3717,7 +3717,7 @@ protected static final&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/j
 <ul class="blockList">
 <li class="blockList">
 <h4>getWriteLock</h4>
-<pre><a href="https://docs.oracle.com/javase/8/docs/api/java/util/concurrent/locks/ReentrantReadWriteLock.WriteLock.html?is-external=true" title="class or interface in java.util.concurrent.locks">ReentrantReadWriteLock.WriteLock</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegionServer.html#line.2752">getWriteLock</a>()</pre>
+<pre><a href="https://docs.oracle.com/javase/8/docs/api/java/util/concurrent/locks/ReentrantReadWriteLock.WriteLock.html?is-external=true" title="class or interface in java.util.concurrent.locks">ReentrantReadWriteLock.WriteLock</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegionServer.html#line.2753">getWriteLock</a>()</pre>
 <dl>
 <dt><span class="returnLabel">Returns:</span></dt>
 <dd>the write lock for the server</dd>
@@ -3730,7 +3730,7 @@ protected static final&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/j
 <ul class="blockList">
 <li class="blockList">
 <h4>getNumberOfOnlineRegions</h4>
-<pre>public&nbsp;int&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegionServer.html#line.2756">getNumberOfOnlineRegions</a>()</pre>
+<pre>public&nbsp;int&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegionServer.html#line.2757">getNumberOfOnlineRegions</a>()</pre>
 </li>
 </ul>
 <a name="isOnlineRegionsEmpty--">
@@ -3739,7 +3739,7 @@ protected static final&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/j
 <ul class="blockList">
 <li class="blockList">
 <h4>isOnlineRegionsEmpty</h4>
-<pre>boolean&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegionServer.html#line.2760">isOnlineRegionsEmpty</a>()</pre>
+<pre>boolean&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegionServer.html#line.2761">isOnlineRegionsEmpty</a>()</pre>
 </li>
 </ul>
 <a name="getOnlineRegionsLocalContext--">
@@ -3748,7 +3748,7 @@ protected static final&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/j
 <ul class="blockList">
 <li class="blockList">
 <h4>getOnlineRegionsLocalContext</h4>
-<pre>public&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/util/Collection.html?is-external=true" title="class or interface in java.util">Collection</a>&lt;<a href="../../../../../org/apache/hadoop/hbase/regionserver/HRegion.html" title="class in org.apache.hadoop.hbase.regionserver">HRegion</a>&gt;&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegionServer.html#line.2769">getOnlineRegionsLocalContext</a>()</pre>
+<pre>public&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/util/Collection.html?is-external=true" title="class or interface in java.util">Collection</a>&lt;<a href="../../../../../org/apache/hadoop/hbase/regionserver/HRegion.html" title="class in org.apache.hadoop.hbase.regionserver">HRegion</a>&gt;&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegionServer.html#line.2770">getOnlineRegionsLocalContext</a>()</pre>
 <div class="block">For tests, web ui and metrics.
  This method will only work if HRegionServer is in the same JVM as client;
  HRegion cannot be serialized to cross an rpc.</div>
@@ -3760,7 +3760,7 @@ protected static final&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/j
 <ul class="blockList">
 <li class="blockList">
 <h4>addRegion</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegionServer.html#line.2775">addRegion</a>(<a href="../../../../../org/apache/hadoop/hbase/regionserver/HRegion.html" title="class in org.apache.hadoop.hbase.regionserver">HRegion</a>&nbsp;region)</pre>
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegionServer.html#line.2776">addRegion</a>(<a href="../../../../../org/apache/hadoop/hbase/regionserver/HRegion.html" title="class in org.apache.hadoop.hbase.regionserver">HRegion</a>&nbsp;region)</pre>
 <div class="block"><span class="descfrmTypeLabel">Description copied from interface:&nbsp;<code><a href="../../../../../org/apache/hadoop/hbase/regionserver/MutableOnlineRegions.html#addRegion-org.apache.hadoop.hbase.regionserver.HRegion-">MutableOnlineRegions</a></code></span></div>
 <div class="block">Add to online regions.</div>
 <dl>
@@ -3775,7 +3775,7 @@ protected static final&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/j
 <ul class="blockList">
 <li class="blockList">
 <h4>addRegion</h4>
-<pre>private&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegionServer.html#line.2780">addRegion</a>(<a href="https://docs.oracle.com/javase/8/docs/api/java/util/SortedMap.html?is-external=true" title="class or interface in java.util">SortedMap</a>&lt;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Long.html?is-external=true" title="class or interface in java.lang">Long</a>,<a href="https://docs.oracle.com/javase/8/docs/api/java/util/Collection.html?is-external=true" title="class or interface in java.util">Collection</a>&lt;<a href="../../../../../org/apache/hadoop/hbase/regionserver/HRegion.html" title="class in org.apache.hadoop.hbase.regionserver">HRegion</a>&gt;&gt;&nbsp;sortedRegions,
+<pre>private&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegionServer.html#line.2781">addRegion</a>(<a href="https://docs.oracle.com/javase/8/docs/api/java/util/SortedMap.html?is-external=true" title="class or interface in java.util">SortedMap</a>&lt;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Long.html?is-external=true" title="class or interface in java.lang">Long</a>,<a href="https://docs.oracle.com/javase/8/docs/api/java/util/Collection.html?is-external=true" title="class or interface in java.util">Collection</a>&lt;<a href="../../../../../org/apache/hadoop/hbase/regionserver/HRegion.html" title="class in org.apache.hadoop.hbase.regionserver">HRegion</a>&gt;&gt;&nbsp;sortedRegions,
                        <a href="../../../../../org/apache/hadoop/hbase/regionserver/HRegion.html" title="class in org.apache.hadoop.hbase.regionserver">HRegion</a>&nbsp;region,
                        long&nbsp;size)</pre>
 </li>
@@ -3786,7 +3786,7 @@ protected static final&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/j
 <ul class="blockList">
 <li class="blockList">
 <h4>getCopyOfOnlineRegionsSortedByOffHeapSize</h4>
-<pre><a href="https://docs.oracle.com/javase/8/docs/api/java/util/SortedMap.html?is-external=true" title="class or interface in java.util">SortedMap</a>&lt;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Long.html?is-external=true" title="class or interface in java.lang">Long</a>,<a href="https://docs.oracle.com/javase/8/docs/api/java/util/Collection.html?is-external=true" title="class or interface in java.util">Collection</a>&lt;<a href="../../../../../org/apache/hadoop/hbase/regionserver/HRegion.html" title="class in org.apache.hadoop.hbase.regionserver">HRegion</a>&gt;&gt;&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegionServer.html#line.2791">getCopyOfOnlineRegionsSortedByOffHeapSize</a>()</pre>
+<pre><a href="https://docs.oracle.com/javase/8/docs/api/java/util/SortedMap.html?is-external=true" title="class or interface in java.util">SortedMap</a>&lt;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Long.html?is-external=true" title="class or interface in java.lang">Long</a>,<a href="https://docs.oracle.com/javase/8/docs/api/java/util/Collection.html?is-external=true" title="class or interface in java.util">Collection</a>&lt;<a href="../../../../../org/apache/hadoop/hbase/regionserver/HRegion.html" title="class in org.apache.hadoop.hbase.regionserver">HRegion</a>&gt;&gt;&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegionServer.html#line.2792">getCopyOfOnlineRegionsSortedByOffHeapSize</a>()</pre>
 <dl>
 <dt><span class="returnLabel">Returns:</span></dt>
 <dd>A new Map of online regions sorted by region off-heap size with the first entry being
@@ -3800,7 +3800,7 @@ protected static final&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/j
 <ul class="blockList">
 <li class="blockList">
 <h4>getCopyOfOnlineRegionsSortedByOnHeapSize</h4>
-<pre><a href="https://docs.oracle.com/javase/8/docs/api/java/util/SortedMap.html?is-external=true" title="class or interface in java.util">SortedMap</a>&lt;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Long.html?is-external=true" title="class or interface in java.lang">Long</a>,<a href="https://docs.oracle.com/javase/8/docs/api/java/util/Collection.html?is-external=true" title="class or interface in java.util">Collection</a>&lt;<a href="../../../../../org/apache/hadoop/hbase/regionserver/HRegion.html" title="class in org.apache.hadoop.hbase.regionserver">HRegion</a>&gt;&gt;&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegionServer.html#line.2811">getCopyOfOnlineRegionsSortedByOnHeapSize</a>()</pre>
+<pre><a href="https://docs.oracle.com/javase/8/docs/api/java/util/SortedMap.html?is-external=true" title="class or interface in java.util">SortedMap</a>&lt;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Long.html?is-external=true" title="class or interface in java.lang">Long</a>,<a href="https://docs.oracle.com/javase/8/docs/api/java/util/Collection.html?is-external=true" title="class or interface in java.util">Collection</a>&lt;<a href="../../../../../org/apache/hadoop/hbase/regionserver/HRegion.html" title="class in org.apache.hadoop.hbase.regionserver">HRegion</a>&gt;&gt;&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegionServer.html#line.2812">getCopyOfOnlineRegionsSortedByOnHeapSize</a>()</pre>
 <dl>
 <dt><span class="returnLabel">Returns:</span></dt>
 <dd>A new Map of online regions sorted by region heap size with the first entry being the
@@ -3814,7 +3814,7 @@ protected static final&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/j
 <ul class="blockList">
 <li class="blockList">
 <h4>getStartcode</h4>
-<pre>public&nbsp;long&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegionServer.html#line.2830">getStartcode</a>()</pre>
+<pre>public&nbsp;long&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegionServer.html#line.2831">getStartcode</a>()</pre>
 <dl>
 <dt><span class="returnLabel">Returns:</span></dt>
 <dd>time stamp in millis of when this region server was started</dd>
@@ -3827,7 +3827,7 @@ protected static final&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/j
 <ul class="blockList">
 <li class="blockList">
 <h4>getFlushRequester</h4>
-<pre>public&nbsp;<a href="../../../../../org/apache/hadoop/hbase/regionserver/FlushRequester.html" title="interface in org.apache.hadoop.hbase.regionserver">FlushRequester</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegionServer.html#line.2836">getFlushRequester</a>()</pre>
+<pre>public&nbsp;<a href="../../../../../org/apache/hadoop/hbase/regionserver/FlushRequester.html" title="interface in org.apache.hadoop.hbase.regionserver">FlushRequester</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegionServer.html#line.2837">getFlushRequester</a>()</pre>
 <dl>
 <dt><span class="overrideSpecifyLabel">Specified by:</span></dt>
 <dd><code><a href="../../../../../org/apache/hadoop/hbase/regionserver/RegionServerServices.html#getFlushRequester--">getFlushRequester</a></code>&nbsp;in interface&nbsp;<code><a href="../../../../../org/apache/hadoop/hbase/regionserver/RegionServerServices.html" title="interface in org.apache.hadoop.hbase.regionserver">RegionServerServices</a></code></dd>
@@ -3842,7 +3842,7 @@ protected static final&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/j
 <ul class="blockList">
 <li class="blockList">
 <h4>getCompactionRequestor</h4>
-<pre>public&nbsp;<a href="../../../../../org/apache/hadoop/hbase/regionserver/compactions/CompactionRequester.html" title="interface in org.apache.hadoop.hbase.regionserver.compactions">CompactionRequester</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegionServer.html#line.2841">getCompactionRequestor</a>()</pre>
+<pre>public&nbsp;<a href="../../../../../org/apache/hadoop/hbase/regionserver/compactions/CompactionRequester.html" title="interface in org.apache.hadoop.hbase.regionserver.compactions">CompactionRequester</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegionServer.html#line.2842">getCompactionRequestor</a>()</pre>
 <dl>
 <dt><span class="overrideSpecifyLabel">Specified by:</span></dt>
 <dd><code><a href="../../../../../org/apache/hadoop/hbase/regionserver/RegionServerServices.html#getCompactionRequestor--">getCompactionRequestor</a></code>&nbsp;in interface&nbsp;<code><a href="../../../../../org/apache/hadoop/hbase/regionserver/RegionServerServices.html" title="interface in org.apache.hadoop.hbase.regionserver">RegionServerServices</a></code></dd>
@@ -3858,7 +3858,7 @@ protected static final&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/j
 <ul class="blockList">
 <li class="blockList">
 <h4>getMostLoadedRegions</h4>
-<pre>protected&nbsp;<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/regionserver/HRegionServer.html#line.2851">getMostLoadedRegions</a>()</pre>
+<pre>protected&nbsp;<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/regionserver/HRegionServer.html#line.2852">getMostLoadedRegions</a>()</pre>
 <div class="block">Get the top N most loaded regions this server is serving so we can tell the
  master which regions it can reallocate if we're overloaded. TODO: actually
  calculate which regions are most loaded. (Right now, we're just grabbing
@@ -3871,7 +3871,7 @@ protected static final&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/j
 <ul class="blockList">
 <li class="blockList">
 <h4>getLeases</h4>
-<pre>public&nbsp;<a href="../../../../../org/apache/hadoop/hbase/regionserver/Leases.html" title="class in org.apache.hadoop.hbase.regionserver">Leases</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegionServer.html#line.2867">getLeases</a>()</pre>
+<pre>public&nbsp;<a href="../../../../../org/apache/hadoop/hbase/regionserver/Leases.html" title="class in org.apache.hadoop.hbase.regionserver">Leases</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegionServer.html#line.2868">getLeases</a>()</pre>
 <dl>
 <dt><span class="overrideSpecifyLabel">Specified by:</span></dt>
 <dd><code><a href="../../../../../org/apache/hadoop/hbase/regionserver/RegionServerServices.html#getLeases--">getLeases</a></code>&nbsp;in interface&nbsp;<code><a href="../../../../../org/apache/hadoop/hbase/regionserver/RegionServerServices.html" title="interface in org.apache.hadoop.hbase.regionserver">RegionServerServices</a></code></dd>
@@ -3886,7 +3886,7 @@ protected static final&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/j
 <ul class="blockList">
 <li class="blockList">
 <h4>getRootDir</h4>
-<pre>protected&nbsp;org.apache.hadoop.fs.Path&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegionServer.html#line.2874">getRootDir</a>()</pre>
+<pre>protected&nbsp;org.apache.hadoop.fs.Path&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegionServer.html#line.2875">getRootDir</a>()</pre>
 <dl>
 <dt><span class="returnLabel">Returns:</span></dt>
 <dd>Return the rootDir.</dd>
@@ -3899,7 +3899,7 @@ protected static final&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/j
 <ul class="blockList">
 <li class="blockList">
 <h4>getFileSystem</h4>
-<pre>public&nbsp;org.apache.hadoop.fs.FileSystem&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegionServer.html#line.2882">getFileSystem</a>()</pre>
+<pre>public&nbsp;org.apache.hadoop.fs.FileSystem&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegionServer.html#line.2883">getFileSystem</a>()</pre>
 <dl>
 <dt><span class="overrideSpecifyLabel">Specified by:</span></dt>
 <dd><code><a href="../../../../../org/apache/hadoop/hbase/Server.html#getFileSystem--">getFileSystem</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>
@@ -3914,7 +3914,7 @@ protected static final&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/j
 <ul class="blockList">
 <li class="blockList">
 <h4>getWALRootDir</h4>
-<pre>public&nbsp;org.apache.hadoop.fs.Path&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegionServer.html#line.2889">getWALRootDir</a>()</pre>
+<pre>public&nbsp;org.apache.hadoop.fs.Path&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegionServer.html#line.2890">getWALRootDir</a>()</pre>
 <dl>
 <dt><span class="returnLabel">Returns:</span></dt>
 <dd>Return the walRootDir.</dd>
@@ -3927,7 +3927,7 @@ protected static final&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/j
 <ul class="blockList">
 <li class="blockList">
 <h4>getWALFileSystem</h4>
-<pre>public&nbsp;org.apache.hadoop.fs.FileSystem&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegionServer.html#line.2896">getWALFileSystem</a>()</pre>
+<pre>public&nbsp;org.apache.hadoop.fs.FileSystem&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegionServer.html#line.2897">getWALFileSystem</a>()</pre>
 <dl>
 <dt><span class="returnLabel">Returns:</span></dt>
 <dd>Return the walFs.</dd>
@@ -3940,7 +3940,7 @@ protected static final&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/j
 <ul class="blockList">
 <li class="blockList">
 <h4>toString</h4>
-<pre>public&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegionServer.html#line.2901">toString</a>()</pre>
+<pre>public&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegionServer.html#line.2902">toString</a>()</pre>
 <dl>
 <dt><span class="overrideSpecifyLabel">Overrides:</span></dt>
 <dd><code><a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html?is-external=true#toString--" title="class or interface in java.lang">toString</a></code>&nbsp;in class&nbsp;<code><a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html?is-external=true" title="class or interface in java.lang">Object</a></code></dd>
@@ -3953,7 +3953,7 @@ protected static final&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/j
 <ul class="blockList">
 <li class="blockList">
 <h4>getThreadWakeFrequency</h4>
-<pre>public&nbsp;int&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegionServer.html#line.2910">getThreadWakeFrequency</a>()</pre>
+<pre>public&nbsp;int&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegionServer.html#line.2911">getThreadWakeFrequency</a>()</pre>
 <div class="block">Interval at which threads should run</div>
 <dl>
 <dt><span class="returnLabel">Returns:</span></dt>
@@ -3967,7 +3967,7 @@ protected static final&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/j
 <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/regionserver/HRegionServer.html#line.2915">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/regionserver/HRegionServer.html#line.2916">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>
@@ -3982,7 +3982,7 @@ protected static final&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/j
 <ul class="blockList">
 <li class="blockList">
 <h4>getCoordinatedStateManager</h4>
-<pre>public&nbsp;<a href="../../../../../org/apache/hadoop/hbase/CoordinatedStateManager.html" title="interface in org.apache.hadoop.hbase">CoordinatedStateManager</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegionServer.html#line.2920">getCoordinatedStateManager</a>()</pre>
+<pre>public&nbsp;<a href="../../../../../org/apache/hadoop/hbase/CoordinatedStateManager.html" title="interface in org.apache.hadoop.hbase">CoordinatedStateManager</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegionServer.html#line.2921">getCoordinatedStateManager</a>()</pre>
 <div class="block"><span class="descfrmTypeLabel">Description copied from interface:&nbsp;<code><a href="../../../../../org/apache/hadoop/hbase/Server.html#getCoordinatedStateManager--">Server</a></code></span></div>
 <div class="block">Get CoordinatedStateManager instance for this server.</div>
 <dl>
@@ -3997,7 +3997,7 @@ protected static final&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/j
 <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/regionserver/HRegionServer.html#line.2925">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/regionserver/HRegionServer.html#line.2926">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>
@@ -4012,7 +4012,7 @@ protected static final&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/j
 <ul class="blockList">
 <li class="blockList">
 <h4>getRegionServerCoprocessorHost</h4>
-<pre>public&nbsp;<a href="../../../../../org/apache/hadoop/hbase/regionserver/RegionServerCoprocessorHost.html" title="class in org.apache.hadoop.hbase.regionserver">RegionServerCoprocessorHost</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegionServer.html#line.2929">getRegionServerCoprocessorHost</a>()</pre>
+<pre>public&nbsp;<a href="../../../../../org/apache/hadoop/hbase/regionserver/RegionServerCoprocessorHost.html" title="class in org.apache.hadoop.hbase.regionserver">RegionServerCoprocessorHost</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegionServer.html#line.2930">getRegionServerCoprocessorHost</a>()</pre>
 </li>
 </ul>
 <a name="getRegionsInTransitionInRS--">
@@ -4021,7 +4021,7 @@ protected static final&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/j
 <ul class="blockList">
 <li class="blockList">
 <h4>getRegionsInTransitionInRS</h4>
-<pre>public&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/util/concurrent/ConcurrentMap.html?is-external=true" title="class or interface in java.util.concurrent">ConcurrentMap</a>&lt;byte[],<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Boolean.html?is-external=true" title="class or interface in java.lang">Boolean</a>&gt;&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegionServer.html#line.2934">getRegionsInTransitionInRS</a>()</pre>
+<pre>public&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/util/concurrent/ConcurrentMap.html?is-external=true" title="class or interface in java.util.concurrent">ConcurrentMap</a>&lt;byte[],<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Boolean.html?is-external=true" title="class or interface in java.lang">Boolean</a>&gt;&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegionServer.html#line.2935">getRegionsInTransitionInRS</a>()</pre>
 <div class="block"><span class="descfrmTypeLabel">Description copied from interface:&nbsp;<code><a href="../../../../../org/apache/hadoop/hbase/regionserver/RegionServerServices.html#getRegionsInTransitionInRS--">RegionServerServices</a></code></span></div>
 <div class="block">Get the regions that are currently being opened or closed in the RS</div>
 <dl>
@@ -4038,7 +4038,7 @@ protected static final&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/j
 <ul class="blockList">
 <li class="blockList">
 <h4>getExecutorService</h4>
-<pre>public&nbsp;<a href="../../../../../org/apache/hadoop/hbase/executor/ExecutorService.html" title="class in org.apache.hadoop.hbase.executor">ExecutorService</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegionServer.html#line.2939">getExecutorService</a>()</pre>
+<pre>public&nbsp;<a href="../../../../../org/apache/hadoop/hbase/executor/ExecutorService.html" title="class in org.apache.hadoop.hbase.executor">ExecutorService</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegionServer.html#line.2940">getExecutorService</a>()</pre>
 <dl>
 <dt><span class="overrideSpecifyLabel">Specified by:</span></dt>
 <dd><code><a href="../../../../../org/apache/hadoop/hbase/regionserver/RegionServerServices.html#getExecutorService--">getExecutorService</a></code>&nbsp;in interface&nbsp;<code><a href="../../../../../org/apache/hadoop/hbase/regionserver/RegionServerServices.html" title="interface in org.apache.hadoop.hbase.regionserver">RegionServerServices</a></code></dd>
@@ -4053,7 +4053,7 @@ protected static final&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/j
 <ul class="blockList">
 <li class="blockList">
 <h4>getChoreService</h4>
-<pre>public&nbsp;<a href="../../../../../org/apache/hadoop/hbase/ChoreService.html" title="class in org.apache.hadoop.hbase">ChoreService</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegionServer.html#line.2944">getChoreService</a>()</pre>
+<pre>public&nbsp;<a href="../../../../../org/apache/hadoop/hbase/ChoreService.html" title="class in org.apache.hadoop.hbase">ChoreService</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegionServer.html#line.2945">getChoreService</a>()</pre>
 <dl>
 <dt><span class="overrideSpecifyLabel">Specified by:</span></dt>
 <dd><code><a href="../../../../../org/apache/hadoop/hbase/Server.html#getChoreService--">getChoreService</a></code>&nbsp;in interface&nbsp;<code><a href="

<TRUNCATED>

[06/46] hbase-site git commit: Published site at 05d22ed960204183fbd9bd16f1dbca6410ccde76.

Posted by gi...@apache.org.
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/3649682c/devapidocs/src-html/org/apache/hadoop/hbase/regionserver/RSRpcServices.ScannerListener.html
----------------------------------------------------------------------
diff --git a/devapidocs/src-html/org/apache/hadoop/hbase/regionserver/RSRpcServices.ScannerListener.html b/devapidocs/src-html/org/apache/hadoop/hbase/regionserver/RSRpcServices.ScannerListener.html
index 20e3eaa..b257d07 100644
--- a/devapidocs/src-html/org/apache/hadoop/hbase/regionserver/RSRpcServices.ScannerListener.html
+++ b/devapidocs/src-html/org/apache/hadoop/hbase/regionserver/RSRpcServices.ScannerListener.html
@@ -2493,1291 +2493,1293 @@
 <span class="sourceLineNo">2485</span>  }<a name="line.2485"></a>
 <span class="sourceLineNo">2486</span><a name="line.2486"></a>
 <span class="sourceLineNo">2487</span>  private boolean shouldRejectRequestsFromClient(HRegion region) {<a name="line.2487"></a>
-<span class="sourceLineNo">2488</span>    return regionServer.getReplicationSourceService().getSyncReplicationPeerInfoProvider()<a name="line.2488"></a>
-<span class="sourceLineNo">2489</span>      .checkState(region.getRegionInfo().getTable(), RejectRequestsFromClientStateChecker.get());<a name="line.2489"></a>
-<span class="sourceLineNo">2490</span>  }<a name="line.2490"></a>
-<span class="sourceLineNo">2491</span><a name="line.2491"></a>
-<span class="sourceLineNo">2492</span>  private void rejectIfInStandByState(HRegion region) throws DoNotRetryIOException {<a name="line.2492"></a>
-<span class="sourceLineNo">2493</span>    if (shouldRejectRequestsFromClient(region)) {<a name="line.2493"></a>
-<span class="sourceLineNo">2494</span>      throw new DoNotRetryIOException(<a name="line.2494"></a>
-<span class="sourceLineNo">2495</span>        region.getRegionInfo().getRegionNameAsString() + " is in STANDBY state.");<a name="line.2495"></a>
-<span class="sourceLineNo">2496</span>    }<a name="line.2496"></a>
-<span class="sourceLineNo">2497</span>  }<a name="line.2497"></a>
-<span class="sourceLineNo">2498</span><a name="line.2498"></a>
-<span class="sourceLineNo">2499</span>  /**<a name="line.2499"></a>
-<span class="sourceLineNo">2500</span>   * Get data from a table.<a name="line.2500"></a>
-<span class="sourceLineNo">2501</span>   *<a name="line.2501"></a>
-<span class="sourceLineNo">2502</span>   * @param controller the RPC controller<a name="line.2502"></a>
-<span class="sourceLineNo">2503</span>   * @param request the get request<a name="line.2503"></a>
-<span class="sourceLineNo">2504</span>   * @throws ServiceException<a name="line.2504"></a>
-<span class="sourceLineNo">2505</span>   */<a name="line.2505"></a>
-<span class="sourceLineNo">2506</span>  @Override<a name="line.2506"></a>
-<span class="sourceLineNo">2507</span>  public GetResponse get(final RpcController controller, final GetRequest request)<a name="line.2507"></a>
-<span class="sourceLineNo">2508</span>      throws ServiceException {<a name="line.2508"></a>
-<span class="sourceLineNo">2509</span>    long before = EnvironmentEdgeManager.currentTime();<a name="line.2509"></a>
-<span class="sourceLineNo">2510</span>    OperationQuota quota = null;<a name="line.2510"></a>
-<span class="sourceLineNo">2511</span>    HRegion region = null;<a name="line.2511"></a>
-<span class="sourceLineNo">2512</span>    try {<a name="line.2512"></a>
-<span class="sourceLineNo">2513</span>      checkOpen();<a name="line.2513"></a>
-<span class="sourceLineNo">2514</span>      requestCount.increment();<a name="line.2514"></a>
-<span class="sourceLineNo">2515</span>      rpcGetRequestCount.increment();<a name="line.2515"></a>
-<span class="sourceLineNo">2516</span>      region = getRegion(request.getRegion());<a name="line.2516"></a>
-<span class="sourceLineNo">2517</span>      rejectIfInStandByState(region);<a name="line.2517"></a>
-<span class="sourceLineNo">2518</span><a name="line.2518"></a>
-<span class="sourceLineNo">2519</span>      GetResponse.Builder builder = GetResponse.newBuilder();<a name="line.2519"></a>
-<span class="sourceLineNo">2520</span>      ClientProtos.Get get = request.getGet();<a name="line.2520"></a>
-<span class="sourceLineNo">2521</span>      // An asynchbase client, https://github.com/OpenTSDB/asynchbase, starts by trying to do<a name="line.2521"></a>
-<span class="sourceLineNo">2522</span>      // a get closest before. Throwing the UnknownProtocolException signals it that it needs<a name="line.2522"></a>
-<span class="sourceLineNo">2523</span>      // to switch and do hbase2 protocol (HBase servers do not tell clients what versions<a name="line.2523"></a>
-<span class="sourceLineNo">2524</span>      // they are; its a problem for non-native clients like asynchbase. HBASE-20225.<a name="line.2524"></a>
-<span class="sourceLineNo">2525</span>      if (get.hasClosestRowBefore() &amp;&amp; get.getClosestRowBefore()) {<a name="line.2525"></a>
-<span class="sourceLineNo">2526</span>        throw new UnknownProtocolException("Is this a pre-hbase-1.0.0 or asynchbase client? " +<a name="line.2526"></a>
-<span class="sourceLineNo">2527</span>            "Client is invoking getClosestRowBefore removed in hbase-2.0.0 replaced by " +<a name="line.2527"></a>
-<span class="sourceLineNo">2528</span>            "reverse Scan.");<a name="line.2528"></a>
-<span class="sourceLineNo">2529</span>      }<a name="line.2529"></a>
-<span class="sourceLineNo">2530</span>      Boolean existence = null;<a name="line.2530"></a>
-<span class="sourceLineNo">2531</span>      Result r = null;<a name="line.2531"></a>
-<span class="sourceLineNo">2532</span>      RpcCallContext context = RpcServer.getCurrentCall().orElse(null);<a name="line.2532"></a>
-<span class="sourceLineNo">2533</span>      quota = getRpcQuotaManager().checkQuota(region, OperationQuota.OperationType.GET);<a name="line.2533"></a>
-<span class="sourceLineNo">2534</span><a name="line.2534"></a>
-<span class="sourceLineNo">2535</span>      Get clientGet = ProtobufUtil.toGet(get);<a name="line.2535"></a>
-<span class="sourceLineNo">2536</span>      if (get.getExistenceOnly() &amp;&amp; region.getCoprocessorHost() != null) {<a name="line.2536"></a>
-<span class="sourceLineNo">2537</span>        existence = region.getCoprocessorHost().preExists(clientGet);<a name="line.2537"></a>
-<span class="sourceLineNo">2538</span>      }<a name="line.2538"></a>
-<span class="sourceLineNo">2539</span>      if (existence == null) {<a name="line.2539"></a>
-<span class="sourceLineNo">2540</span>        if (context != null) {<a name="line.2540"></a>
-<span class="sourceLineNo">2541</span>          r = get(clientGet, (region), null, context);<a name="line.2541"></a>
-<span class="sourceLineNo">2542</span>        } else {<a name="line.2542"></a>
-<span class="sourceLineNo">2543</span>          // for test purpose<a name="line.2543"></a>
-<span class="sourceLineNo">2544</span>          r = region.get(clientGet);<a name="line.2544"></a>
-<span class="sourceLineNo">2545</span>        }<a name="line.2545"></a>
-<span class="sourceLineNo">2546</span>        if (get.getExistenceOnly()) {<a name="line.2546"></a>
-<span class="sourceLineNo">2547</span>          boolean exists = r.getExists();<a name="line.2547"></a>
-<span class="sourceLineNo">2548</span>          if (region.getCoprocessorHost() != null) {<a name="line.2548"></a>
-<span class="sourceLineNo">2549</span>            exists = region.getCoprocessorHost().postExists(clientGet, exists);<a name="line.2549"></a>
-<span class="sourceLineNo">2550</span>          }<a name="line.2550"></a>
-<span class="sourceLineNo">2551</span>          existence = exists;<a name="line.2551"></a>
-<span class="sourceLineNo">2552</span>        }<a name="line.2552"></a>
-<span class="sourceLineNo">2553</span>      }<a name="line.2553"></a>
-<span class="sourceLineNo">2554</span>      if (existence != null) {<a name="line.2554"></a>
-<span class="sourceLineNo">2555</span>        ClientProtos.Result pbr =<a name="line.2555"></a>
-<span class="sourceLineNo">2556</span>            ProtobufUtil.toResult(existence, region.getRegionInfo().getReplicaId() != 0);<a name="line.2556"></a>
-<span class="sourceLineNo">2557</span>        builder.setResult(pbr);<a name="line.2557"></a>
-<span class="sourceLineNo">2558</span>      } else if (r != null) {<a name="line.2558"></a>
-<span class="sourceLineNo">2559</span>        ClientProtos.Result pbr;<a name="line.2559"></a>
-<span class="sourceLineNo">2560</span>        if (isClientCellBlockSupport(context) &amp;&amp; controller instanceof HBaseRpcController<a name="line.2560"></a>
-<span class="sourceLineNo">2561</span>            &amp;&amp; VersionInfoUtil.hasMinimumVersion(context.getClientVersionInfo(), 1, 3)) {<a name="line.2561"></a>
-<span class="sourceLineNo">2562</span>          pbr = ProtobufUtil.toResultNoData(r);<a name="line.2562"></a>
-<span class="sourceLineNo">2563</span>          ((HBaseRpcController) controller).setCellScanner(CellUtil.createCellScanner(r<a name="line.2563"></a>
-<span class="sourceLineNo">2564</span>              .rawCells()));<a name="line.2564"></a>
-<span class="sourceLineNo">2565</span>          addSize(context, r, null);<a name="line.2565"></a>
-<span class="sourceLineNo">2566</span>        } else {<a name="line.2566"></a>
-<span class="sourceLineNo">2567</span>          pbr = ProtobufUtil.toResult(r);<a name="line.2567"></a>
-<span class="sourceLineNo">2568</span>        }<a name="line.2568"></a>
-<span class="sourceLineNo">2569</span>        builder.setResult(pbr);<a name="line.2569"></a>
-<span class="sourceLineNo">2570</span>      }<a name="line.2570"></a>
-<span class="sourceLineNo">2571</span>      if (r != null) {<a name="line.2571"></a>
-<span class="sourceLineNo">2572</span>        quota.addGetResult(r);<a name="line.2572"></a>
-<span class="sourceLineNo">2573</span>      }<a name="line.2573"></a>
-<span class="sourceLineNo">2574</span>      return builder.build();<a name="line.2574"></a>
-<span class="sourceLineNo">2575</span>    } catch (IOException ie) {<a name="line.2575"></a>
-<span class="sourceLineNo">2576</span>      throw new ServiceException(ie);<a name="line.2576"></a>
-<span class="sourceLineNo">2577</span>    } finally {<a name="line.2577"></a>
-<span class="sourceLineNo">2578</span>      MetricsRegionServer mrs = regionServer.metricsRegionServer;<a name="line.2578"></a>
-<span class="sourceLineNo">2579</span>      if (mrs != null) {<a name="line.2579"></a>
-<span class="sourceLineNo">2580</span>        TableDescriptor td = region != null? region.getTableDescriptor(): null;<a name="line.2580"></a>
-<span class="sourceLineNo">2581</span>        if (td != null) {<a name="line.2581"></a>
-<span class="sourceLineNo">2582</span>          mrs.updateGet(td.getTableName(), EnvironmentEdgeManager.currentTime() - before);<a name="line.2582"></a>
-<span class="sourceLineNo">2583</span>        }<a name="line.2583"></a>
-<span class="sourceLineNo">2584</span>      }<a name="line.2584"></a>
-<span class="sourceLineNo">2585</span>      if (quota != null) {<a name="line.2585"></a>
-<span class="sourceLineNo">2586</span>        quota.close();<a name="line.2586"></a>
-<span class="sourceLineNo">2587</span>      }<a name="line.2587"></a>
-<span class="sourceLineNo">2588</span>    }<a name="line.2588"></a>
-<span class="sourceLineNo">2589</span>  }<a name="line.2589"></a>
-<span class="sourceLineNo">2590</span><a name="line.2590"></a>
-<span class="sourceLineNo">2591</span>  private Result get(Get get, HRegion region, RegionScannersCloseCallBack closeCallBack,<a name="line.2591"></a>
-<span class="sourceLineNo">2592</span>      RpcCallContext context) throws IOException {<a name="line.2592"></a>
-<span class="sourceLineNo">2593</span>    region.prepareGet(get);<a name="line.2593"></a>
-<span class="sourceLineNo">2594</span>    boolean stale = region.getRegionInfo().getReplicaId() != 0;<a name="line.2594"></a>
-<span class="sourceLineNo">2595</span><a name="line.2595"></a>
-<span class="sourceLineNo">2596</span>    // This method is almost the same as HRegion#get.<a name="line.2596"></a>
-<span class="sourceLineNo">2597</span>    List&lt;Cell&gt; results = new ArrayList&lt;&gt;();<a name="line.2597"></a>
-<span class="sourceLineNo">2598</span>    long before = EnvironmentEdgeManager.currentTime();<a name="line.2598"></a>
-<span class="sourceLineNo">2599</span>    // pre-get CP hook<a name="line.2599"></a>
-<span class="sourceLineNo">2600</span>    if (region.getCoprocessorHost() != null) {<a name="line.2600"></a>
-<span class="sourceLineNo">2601</span>      if (region.getCoprocessorHost().preGet(get, results)) {<a name="line.2601"></a>
-<span class="sourceLineNo">2602</span>        region.metricsUpdateForGet(results, before);<a name="line.2602"></a>
-<span class="sourceLineNo">2603</span>        return Result<a name="line.2603"></a>
-<span class="sourceLineNo">2604</span>            .create(results, get.isCheckExistenceOnly() ? !results.isEmpty() : null, stale);<a name="line.2604"></a>
-<span class="sourceLineNo">2605</span>      }<a name="line.2605"></a>
-<span class="sourceLineNo">2606</span>    }<a name="line.2606"></a>
-<span class="sourceLineNo">2607</span>    Scan scan = new Scan(get);<a name="line.2607"></a>
-<span class="sourceLineNo">2608</span>    if (scan.getLoadColumnFamiliesOnDemandValue() == null) {<a name="line.2608"></a>
-<span class="sourceLineNo">2609</span>      scan.setLoadColumnFamiliesOnDemand(region.isLoadingCfsOnDemandDefault());<a name="line.2609"></a>
-<span class="sourceLineNo">2610</span>    }<a name="line.2610"></a>
-<span class="sourceLineNo">2611</span>    RegionScannerImpl scanner = null;<a name="line.2611"></a>
-<span class="sourceLineNo">2612</span>    try {<a name="line.2612"></a>
-<span class="sourceLineNo">2613</span>      scanner = region.getScanner(scan);<a name="line.2613"></a>
-<span class="sourceLineNo">2614</span>      scanner.next(results);<a name="line.2614"></a>
-<span class="sourceLineNo">2615</span>    } finally {<a name="line.2615"></a>
-<span class="sourceLineNo">2616</span>      if (scanner != null) {<a name="line.2616"></a>
-<span class="sourceLineNo">2617</span>        if (closeCallBack == null) {<a name="line.2617"></a>
-<span class="sourceLineNo">2618</span>          // If there is a context then the scanner can be added to the current<a name="line.2618"></a>
-<span class="sourceLineNo">2619</span>          // RpcCallContext. The rpc callback will take care of closing the<a name="line.2619"></a>
-<span class="sourceLineNo">2620</span>          // scanner, for eg in case<a name="line.2620"></a>
-<span class="sourceLineNo">2621</span>          // of get()<a name="line.2621"></a>
-<span class="sourceLineNo">2622</span>          context.setCallBack(scanner);<a name="line.2622"></a>
-<span class="sourceLineNo">2623</span>        } else {<a name="line.2623"></a>
-<span class="sourceLineNo">2624</span>          // The call is from multi() where the results from the get() are<a name="line.2624"></a>
-<span class="sourceLineNo">2625</span>          // aggregated and then send out to the<a name="line.2625"></a>
-<span class="sourceLineNo">2626</span>          // rpc. The rpccall back will close all such scanners created as part<a name="line.2626"></a>
-<span class="sourceLineNo">2627</span>          // of multi().<a name="line.2627"></a>
-<span class="sourceLineNo">2628</span>          closeCallBack.addScanner(scanner);<a name="line.2628"></a>
-<span class="sourceLineNo">2629</span>        }<a name="line.2629"></a>
-<span class="sourceLineNo">2630</span>      }<a name="line.2630"></a>
-<span class="sourceLineNo">2631</span>    }<a name="line.2631"></a>
-<span class="sourceLineNo">2632</span><a name="line.2632"></a>
-<span class="sourceLineNo">2633</span>    // post-get CP hook<a name="line.2633"></a>
-<span class="sourceLineNo">2634</span>    if (region.getCoprocessorHost() != null) {<a name="line.2634"></a>
-<span class="sourceLineNo">2635</span>      region.getCoprocessorHost().postGet(get, results);<a name="line.2635"></a>
-<span class="sourceLineNo">2636</span>    }<a name="line.2636"></a>
-<span class="sourceLineNo">2637</span>    region.metricsUpdateForGet(results, before);<a name="line.2637"></a>
-<span class="sourceLineNo">2638</span><a name="line.2638"></a>
-<span class="sourceLineNo">2639</span>    return Result.create(results, get.isCheckExistenceOnly() ? !results.isEmpty() : null, stale);<a name="line.2639"></a>
-<span class="sourceLineNo">2640</span>  }<a name="line.2640"></a>
-<span class="sourceLineNo">2641</span><a name="line.2641"></a>
-<span class="sourceLineNo">2642</span>  private void checkBatchSizeAndLogLargeSize(MultiRequest request) {<a name="line.2642"></a>
-<span class="sourceLineNo">2643</span>    int sum = 0;<a name="line.2643"></a>
-<span class="sourceLineNo">2644</span>    String firstRegionName = null;<a name="line.2644"></a>
-<span class="sourceLineNo">2645</span>    for (RegionAction regionAction : request.getRegionActionList()) {<a name="line.2645"></a>
-<span class="sourceLineNo">2646</span>      if (sum == 0) {<a name="line.2646"></a>
-<span class="sourceLineNo">2647</span>        firstRegionName = Bytes.toStringBinary(regionAction.getRegion().getValue().toByteArray());<a name="line.2647"></a>
-<span class="sourceLineNo">2648</span>      }<a name="line.2648"></a>
-<span class="sourceLineNo">2649</span>      sum += regionAction.getActionCount();<a name="line.2649"></a>
-<span class="sourceLineNo">2650</span>    }<a name="line.2650"></a>
-<span class="sourceLineNo">2651</span>    if (sum &gt; rowSizeWarnThreshold) {<a name="line.2651"></a>
-<span class="sourceLineNo">2652</span>      ld.logBatchWarning(firstRegionName, sum, rowSizeWarnThreshold);<a name="line.2652"></a>
-<span class="sourceLineNo">2653</span>    }<a name="line.2653"></a>
-<span class="sourceLineNo">2654</span>  }<a name="line.2654"></a>
-<span class="sourceLineNo">2655</span><a name="line.2655"></a>
-<span class="sourceLineNo">2656</span>  private void failRegionAction(MultiResponse.Builder responseBuilder,<a name="line.2656"></a>
-<span class="sourceLineNo">2657</span>      RegionActionResult.Builder regionActionResultBuilder, RegionAction regionAction,<a name="line.2657"></a>
-<span class="sourceLineNo">2658</span>      CellScanner cellScanner, Throwable error) {<a name="line.2658"></a>
-<span class="sourceLineNo">2659</span>    rpcServer.getMetrics().exception(error);<a name="line.2659"></a>
-<span class="sourceLineNo">2660</span>    regionActionResultBuilder.setException(ResponseConverter.buildException(error));<a name="line.2660"></a>
-<span class="sourceLineNo">2661</span>    responseBuilder.addRegionActionResult(regionActionResultBuilder.build());<a name="line.2661"></a>
-<span class="sourceLineNo">2662</span>    // All Mutations in this RegionAction not executed as we can not see the Region online here<a name="line.2662"></a>
-<span class="sourceLineNo">2663</span>    // in this RS. Will be retried from Client. Skipping all the Cells in CellScanner<a name="line.2663"></a>
-<span class="sourceLineNo">2664</span>    // corresponding to these Mutations.<a name="line.2664"></a>
-<span class="sourceLineNo">2665</span>    if (cellScanner != null) {<a name="line.2665"></a>
-<span class="sourceLineNo">2666</span>      skipCellsForMutations(regionAction.getActionList(), cellScanner);<a name="line.2666"></a>
-<span class="sourceLineNo">2667</span>    }<a name="line.2667"></a>
-<span class="sourceLineNo">2668</span>  }<a name="line.2668"></a>
-<span class="sourceLineNo">2669</span><a name="line.2669"></a>
-<span class="sourceLineNo">2670</span>  private boolean isReplicationRequest(Action action) {<a name="line.2670"></a>
-<span class="sourceLineNo">2671</span>    // replication request can only be put or delete.<a name="line.2671"></a>
-<span class="sourceLineNo">2672</span>    if (!action.hasMutation()) {<a name="line.2672"></a>
-<span class="sourceLineNo">2673</span>      return false;<a name="line.2673"></a>
-<span class="sourceLineNo">2674</span>    }<a name="line.2674"></a>
-<span class="sourceLineNo">2675</span>    MutationProto mutation = action.getMutation();<a name="line.2675"></a>
-<span class="sourceLineNo">2676</span>    MutationType type = mutation.getMutateType();<a name="line.2676"></a>
-<span class="sourceLineNo">2677</span>    if (type != MutationType.PUT &amp;&amp; type != MutationType.DELETE) {<a name="line.2677"></a>
-<span class="sourceLineNo">2678</span>      return false;<a name="line.2678"></a>
-<span class="sourceLineNo">2679</span>    }<a name="line.2679"></a>
-<span class="sourceLineNo">2680</span>    // replication will set a special attribute so we can make use of it to decide whether a request<a name="line.2680"></a>
-<span class="sourceLineNo">2681</span>    // is for replication.<a name="line.2681"></a>
-<span class="sourceLineNo">2682</span>    return mutation.getAttributeList().stream().map(p -&gt; p.getName())<a name="line.2682"></a>
-<span class="sourceLineNo">2683</span>      .filter(n -&gt; n.equals(ReplicationUtils.REPLICATION_ATTR_NAME)).findAny().isPresent();<a name="line.2683"></a>
-<span class="sourceLineNo">2684</span>  }<a name="line.2684"></a>
-<span class="sourceLineNo">2685</span><a name="line.2685"></a>
-<span class="sourceLineNo">2686</span>  /**<a name="line.2686"></a>
-<span class="sourceLineNo">2687</span>   * Execute multiple actions on a table: get, mutate, and/or execCoprocessor<a name="line.2687"></a>
-<span class="sourceLineNo">2688</span>   * @param rpcc the RPC controller<a name="line.2688"></a>
-<span class="sourceLineNo">2689</span>   * @param request the multi request<a name="line.2689"></a>
-<span class="sourceLineNo">2690</span>   * @throws ServiceException<a name="line.2690"></a>
-<span class="sourceLineNo">2691</span>   */<a name="line.2691"></a>
-<span class="sourceLineNo">2692</span>  @Override<a name="line.2692"></a>
-<span class="sourceLineNo">2693</span>  public MultiResponse multi(final RpcController rpcc, final MultiRequest request)<a name="line.2693"></a>
-<span class="sourceLineNo">2694</span>      throws ServiceException {<a name="line.2694"></a>
-<span class="sourceLineNo">2695</span>    try {<a name="line.2695"></a>
-<span class="sourceLineNo">2696</span>      checkOpen();<a name="line.2696"></a>
-<span class="sourceLineNo">2697</span>    } catch (IOException ie) {<a name="line.2697"></a>
-<span class="sourceLineNo">2698</span>      throw new ServiceException(ie);<a name="line.2698"></a>
-<span class="sourceLineNo">2699</span>    }<a name="line.2699"></a>
-<span class="sourceLineNo">2700</span><a name="line.2700"></a>
-<span class="sourceLineNo">2701</span>    checkBatchSizeAndLogLargeSize(request);<a name="line.2701"></a>
+<span class="sourceLineNo">2488</span>    TableName table = region.getRegionInfo().getTable();<a name="line.2488"></a>
+<span class="sourceLineNo">2489</span>    ReplicationSourceService service = regionServer.getReplicationSourceService();<a name="line.2489"></a>
+<span class="sourceLineNo">2490</span>    return service != null &amp;&amp; service.getSyncReplicationPeerInfoProvider()<a name="line.2490"></a>
+<span class="sourceLineNo">2491</span>            .checkState(table, RejectRequestsFromClientStateChecker.get());<a name="line.2491"></a>
+<span class="sourceLineNo">2492</span>  }<a name="line.2492"></a>
+<span class="sourceLineNo">2493</span><a name="line.2493"></a>
+<span class="sourceLineNo">2494</span>  private void rejectIfInStandByState(HRegion region) throws DoNotRetryIOException {<a name="line.2494"></a>
+<span class="sourceLineNo">2495</span>    if (shouldRejectRequestsFromClient(region)) {<a name="line.2495"></a>
+<span class="sourceLineNo">2496</span>      throw new DoNotRetryIOException(<a name="line.2496"></a>
+<span class="sourceLineNo">2497</span>        region.getRegionInfo().getRegionNameAsString() + " is in STANDBY state.");<a name="line.2497"></a>
+<span class="sourceLineNo">2498</span>    }<a name="line.2498"></a>
+<span class="sourceLineNo">2499</span>  }<a name="line.2499"></a>
+<span class="sourceLineNo">2500</span><a name="line.2500"></a>
+<span class="sourceLineNo">2501</span>  /**<a name="line.2501"></a>
+<span class="sourceLineNo">2502</span>   * Get data from a table.<a name="line.2502"></a>
+<span class="sourceLineNo">2503</span>   *<a name="line.2503"></a>
+<span class="sourceLineNo">2504</span>   * @param controller the RPC controller<a name="line.2504"></a>
+<span class="sourceLineNo">2505</span>   * @param request the get request<a name="line.2505"></a>
+<span class="sourceLineNo">2506</span>   * @throws ServiceException<a name="line.2506"></a>
+<span class="sourceLineNo">2507</span>   */<a name="line.2507"></a>
+<span class="sourceLineNo">2508</span>  @Override<a name="line.2508"></a>
+<span class="sourceLineNo">2509</span>  public GetResponse get(final RpcController controller, final GetRequest request)<a name="line.2509"></a>
+<span class="sourceLineNo">2510</span>      throws ServiceException {<a name="line.2510"></a>
+<span class="sourceLineNo">2511</span>    long before = EnvironmentEdgeManager.currentTime();<a name="line.2511"></a>
+<span class="sourceLineNo">2512</span>    OperationQuota quota = null;<a name="line.2512"></a>
+<span class="sourceLineNo">2513</span>    HRegion region = null;<a name="line.2513"></a>
+<span class="sourceLineNo">2514</span>    try {<a name="line.2514"></a>
+<span class="sourceLineNo">2515</span>      checkOpen();<a name="line.2515"></a>
+<span class="sourceLineNo">2516</span>      requestCount.increment();<a name="line.2516"></a>
+<span class="sourceLineNo">2517</span>      rpcGetRequestCount.increment();<a name="line.2517"></a>
+<span class="sourceLineNo">2518</span>      region = getRegion(request.getRegion());<a name="line.2518"></a>
+<span class="sourceLineNo">2519</span>      rejectIfInStandByState(region);<a name="line.2519"></a>
+<span class="sourceLineNo">2520</span><a name="line.2520"></a>
+<span class="sourceLineNo">2521</span>      GetResponse.Builder builder = GetResponse.newBuilder();<a name="line.2521"></a>
+<span class="sourceLineNo">2522</span>      ClientProtos.Get get = request.getGet();<a name="line.2522"></a>
+<span class="sourceLineNo">2523</span>      // An asynchbase client, https://github.com/OpenTSDB/asynchbase, starts by trying to do<a name="line.2523"></a>
+<span class="sourceLineNo">2524</span>      // a get closest before. Throwing the UnknownProtocolException signals it that it needs<a name="line.2524"></a>
+<span class="sourceLineNo">2525</span>      // to switch and do hbase2 protocol (HBase servers do not tell clients what versions<a name="line.2525"></a>
+<span class="sourceLineNo">2526</span>      // they are; its a problem for non-native clients like asynchbase. HBASE-20225.<a name="line.2526"></a>
+<span class="sourceLineNo">2527</span>      if (get.hasClosestRowBefore() &amp;&amp; get.getClosestRowBefore()) {<a name="line.2527"></a>
+<span class="sourceLineNo">2528</span>        throw new UnknownProtocolException("Is this a pre-hbase-1.0.0 or asynchbase client? " +<a name="line.2528"></a>
+<span class="sourceLineNo">2529</span>            "Client is invoking getClosestRowBefore removed in hbase-2.0.0 replaced by " +<a name="line.2529"></a>
+<span class="sourceLineNo">2530</span>            "reverse Scan.");<a name="line.2530"></a>
+<span class="sourceLineNo">2531</span>      }<a name="line.2531"></a>
+<span class="sourceLineNo">2532</span>      Boolean existence = null;<a name="line.2532"></a>
+<span class="sourceLineNo">2533</span>      Result r = null;<a name="line.2533"></a>
+<span class="sourceLineNo">2534</span>      RpcCallContext context = RpcServer.getCurrentCall().orElse(null);<a name="line.2534"></a>
+<span class="sourceLineNo">2535</span>      quota = getRpcQuotaManager().checkQuota(region, OperationQuota.OperationType.GET);<a name="line.2535"></a>
+<span class="sourceLineNo">2536</span><a name="line.2536"></a>
+<span class="sourceLineNo">2537</span>      Get clientGet = ProtobufUtil.toGet(get);<a name="line.2537"></a>
+<span class="sourceLineNo">2538</span>      if (get.getExistenceOnly() &amp;&amp; region.getCoprocessorHost() != null) {<a name="line.2538"></a>
+<span class="sourceLineNo">2539</span>        existence = region.getCoprocessorHost().preExists(clientGet);<a name="line.2539"></a>
+<span class="sourceLineNo">2540</span>      }<a name="line.2540"></a>
+<span class="sourceLineNo">2541</span>      if (existence == null) {<a name="line.2541"></a>
+<span class="sourceLineNo">2542</span>        if (context != null) {<a name="line.2542"></a>
+<span class="sourceLineNo">2543</span>          r = get(clientGet, (region), null, context);<a name="line.2543"></a>
+<span class="sourceLineNo">2544</span>        } else {<a name="line.2544"></a>
+<span class="sourceLineNo">2545</span>          // for test purpose<a name="line.2545"></a>
+<span class="sourceLineNo">2546</span>          r = region.get(clientGet);<a name="line.2546"></a>
+<span class="sourceLineNo">2547</span>        }<a name="line.2547"></a>
+<span class="sourceLineNo">2548</span>        if (get.getExistenceOnly()) {<a name="line.2548"></a>
+<span class="sourceLineNo">2549</span>          boolean exists = r.getExists();<a name="line.2549"></a>
+<span class="sourceLineNo">2550</span>          if (region.getCoprocessorHost() != null) {<a name="line.2550"></a>
+<span class="sourceLineNo">2551</span>            exists = region.getCoprocessorHost().postExists(clientGet, exists);<a name="line.2551"></a>
+<span class="sourceLineNo">2552</span>          }<a name="line.2552"></a>
+<span class="sourceLineNo">2553</span>          existence = exists;<a name="line.2553"></a>
+<span class="sourceLineNo">2554</span>        }<a name="line.2554"></a>
+<span class="sourceLineNo">2555</span>      }<a name="line.2555"></a>
+<span class="sourceLineNo">2556</span>      if (existence != null) {<a name="line.2556"></a>
+<span class="sourceLineNo">2557</span>        ClientProtos.Result pbr =<a name="line.2557"></a>
+<span class="sourceLineNo">2558</span>            ProtobufUtil.toResult(existence, region.getRegionInfo().getReplicaId() != 0);<a name="line.2558"></a>
+<span class="sourceLineNo">2559</span>        builder.setResult(pbr);<a name="line.2559"></a>
+<span class="sourceLineNo">2560</span>      } else if (r != null) {<a name="line.2560"></a>
+<span class="sourceLineNo">2561</span>        ClientProtos.Result pbr;<a name="line.2561"></a>
+<span class="sourceLineNo">2562</span>        if (isClientCellBlockSupport(context) &amp;&amp; controller instanceof HBaseRpcController<a name="line.2562"></a>
+<span class="sourceLineNo">2563</span>            &amp;&amp; VersionInfoUtil.hasMinimumVersion(context.getClientVersionInfo(), 1, 3)) {<a name="line.2563"></a>
+<span class="sourceLineNo">2564</span>          pbr = ProtobufUtil.toResultNoData(r);<a name="line.2564"></a>
+<span class="sourceLineNo">2565</span>          ((HBaseRpcController) controller).setCellScanner(CellUtil.createCellScanner(r<a name="line.2565"></a>
+<span class="sourceLineNo">2566</span>              .rawCells()));<a name="line.2566"></a>
+<span class="sourceLineNo">2567</span>          addSize(context, r, null);<a name="line.2567"></a>
+<span class="sourceLineNo">2568</span>        } else {<a name="line.2568"></a>
+<span class="sourceLineNo">2569</span>          pbr = ProtobufUtil.toResult(r);<a name="line.2569"></a>
+<span class="sourceLineNo">2570</span>        }<a name="line.2570"></a>
+<span class="sourceLineNo">2571</span>        builder.setResult(pbr);<a name="line.2571"></a>
+<span class="sourceLineNo">2572</span>      }<a name="line.2572"></a>
+<span class="sourceLineNo">2573</span>      if (r != null) {<a name="line.2573"></a>
+<span class="sourceLineNo">2574</span>        quota.addGetResult(r);<a name="line.2574"></a>
+<span class="sourceLineNo">2575</span>      }<a name="line.2575"></a>
+<span class="sourceLineNo">2576</span>      return builder.build();<a name="line.2576"></a>
+<span class="sourceLineNo">2577</span>    } catch (IOException ie) {<a name="line.2577"></a>
+<span class="sourceLineNo">2578</span>      throw new ServiceException(ie);<a name="line.2578"></a>
+<span class="sourceLineNo">2579</span>    } finally {<a name="line.2579"></a>
+<span class="sourceLineNo">2580</span>      MetricsRegionServer mrs = regionServer.metricsRegionServer;<a name="line.2580"></a>
+<span class="sourceLineNo">2581</span>      if (mrs != null) {<a name="line.2581"></a>
+<span class="sourceLineNo">2582</span>        TableDescriptor td = region != null? region.getTableDescriptor(): null;<a name="line.2582"></a>
+<span class="sourceLineNo">2583</span>        if (td != null) {<a name="line.2583"></a>
+<span class="sourceLineNo">2584</span>          mrs.updateGet(td.getTableName(), EnvironmentEdgeManager.currentTime() - before);<a name="line.2584"></a>
+<span class="sourceLineNo">2585</span>        }<a name="line.2585"></a>
+<span class="sourceLineNo">2586</span>      }<a name="line.2586"></a>
+<span class="sourceLineNo">2587</span>      if (quota != null) {<a name="line.2587"></a>
+<span class="sourceLineNo">2588</span>        quota.close();<a name="line.2588"></a>
+<span class="sourceLineNo">2589</span>      }<a name="line.2589"></a>
+<span class="sourceLineNo">2590</span>    }<a name="line.2590"></a>
+<span class="sourceLineNo">2591</span>  }<a name="line.2591"></a>
+<span class="sourceLineNo">2592</span><a name="line.2592"></a>
+<span class="sourceLineNo">2593</span>  private Result get(Get get, HRegion region, RegionScannersCloseCallBack closeCallBack,<a name="line.2593"></a>
+<span class="sourceLineNo">2594</span>      RpcCallContext context) throws IOException {<a name="line.2594"></a>
+<span class="sourceLineNo">2595</span>    region.prepareGet(get);<a name="line.2595"></a>
+<span class="sourceLineNo">2596</span>    boolean stale = region.getRegionInfo().getReplicaId() != 0;<a name="line.2596"></a>
+<span class="sourceLineNo">2597</span><a name="line.2597"></a>
+<span class="sourceLineNo">2598</span>    // This method is almost the same as HRegion#get.<a name="line.2598"></a>
+<span class="sourceLineNo">2599</span>    List&lt;Cell&gt; results = new ArrayList&lt;&gt;();<a name="line.2599"></a>
+<span class="sourceLineNo">2600</span>    long before = EnvironmentEdgeManager.currentTime();<a name="line.2600"></a>
+<span class="sourceLineNo">2601</span>    // pre-get CP hook<a name="line.2601"></a>
+<span class="sourceLineNo">2602</span>    if (region.getCoprocessorHost() != null) {<a name="line.2602"></a>
+<span class="sourceLineNo">2603</span>      if (region.getCoprocessorHost().preGet(get, results)) {<a name="line.2603"></a>
+<span class="sourceLineNo">2604</span>        region.metricsUpdateForGet(results, before);<a name="line.2604"></a>
+<span class="sourceLineNo">2605</span>        return Result<a name="line.2605"></a>
+<span class="sourceLineNo">2606</span>            .create(results, get.isCheckExistenceOnly() ? !results.isEmpty() : null, stale);<a name="line.2606"></a>
+<span class="sourceLineNo">2607</span>      }<a name="line.2607"></a>
+<span class="sourceLineNo">2608</span>    }<a name="line.2608"></a>
+<span class="sourceLineNo">2609</span>    Scan scan = new Scan(get);<a name="line.2609"></a>
+<span class="sourceLineNo">2610</span>    if (scan.getLoadColumnFamiliesOnDemandValue() == null) {<a name="line.2610"></a>
+<span class="sourceLineNo">2611</span>      scan.setLoadColumnFamiliesOnDemand(region.isLoadingCfsOnDemandDefault());<a name="line.2611"></a>
+<span class="sourceLineNo">2612</span>    }<a name="line.2612"></a>
+<span class="sourceLineNo">2613</span>    RegionScannerImpl scanner = null;<a name="line.2613"></a>
+<span class="sourceLineNo">2614</span>    try {<a name="line.2614"></a>
+<span class="sourceLineNo">2615</span>      scanner = region.getScanner(scan);<a name="line.2615"></a>
+<span class="sourceLineNo">2616</span>      scanner.next(results);<a name="line.2616"></a>
+<span class="sourceLineNo">2617</span>    } finally {<a name="line.2617"></a>
+<span class="sourceLineNo">2618</span>      if (scanner != null) {<a name="line.2618"></a>
+<span class="sourceLineNo">2619</span>        if (closeCallBack == null) {<a name="line.2619"></a>
+<span class="sourceLineNo">2620</span>          // If there is a context then the scanner can be added to the current<a name="line.2620"></a>
+<span class="sourceLineNo">2621</span>          // RpcCallContext. The rpc callback will take care of closing the<a name="line.2621"></a>
+<span class="sourceLineNo">2622</span>          // scanner, for eg in case<a name="line.2622"></a>
+<span class="sourceLineNo">2623</span>          // of get()<a name="line.2623"></a>
+<span class="sourceLineNo">2624</span>          context.setCallBack(scanner);<a name="line.2624"></a>
+<span class="sourceLineNo">2625</span>        } else {<a name="line.2625"></a>
+<span class="sourceLineNo">2626</span>          // The call is from multi() where the results from the get() are<a name="line.2626"></a>
+<span class="sourceLineNo">2627</span>          // aggregated and then send out to the<a name="line.2627"></a>
+<span class="sourceLineNo">2628</span>          // rpc. The rpccall back will close all such scanners created as part<a name="line.2628"></a>
+<span class="sourceLineNo">2629</span>          // of multi().<a name="line.2629"></a>
+<span class="sourceLineNo">2630</span>          closeCallBack.addScanner(scanner);<a name="line.2630"></a>
+<span class="sourceLineNo">2631</span>        }<a name="line.2631"></a>
+<span class="sourceLineNo">2632</span>      }<a name="line.2632"></a>
+<span class="sourceLineNo">2633</span>    }<a name="line.2633"></a>
+<span class="sourceLineNo">2634</span><a name="line.2634"></a>
+<span class="sourceLineNo">2635</span>    // post-get CP hook<a name="line.2635"></a>
+<span class="sourceLineNo">2636</span>    if (region.getCoprocessorHost() != null) {<a name="line.2636"></a>
+<span class="sourceLineNo">2637</span>      region.getCoprocessorHost().postGet(get, results);<a name="line.2637"></a>
+<span class="sourceLineNo">2638</span>    }<a name="line.2638"></a>
+<span class="sourceLineNo">2639</span>    region.metricsUpdateForGet(results, before);<a name="line.2639"></a>
+<span class="sourceLineNo">2640</span><a name="line.2640"></a>
+<span class="sourceLineNo">2641</span>    return Result.create(results, get.isCheckExistenceOnly() ? !results.isEmpty() : null, stale);<a name="line.2641"></a>
+<span class="sourceLineNo">2642</span>  }<a name="line.2642"></a>
+<span class="sourceLineNo">2643</span><a name="line.2643"></a>
+<span class="sourceLineNo">2644</span>  private void checkBatchSizeAndLogLargeSize(MultiRequest request) {<a name="line.2644"></a>
+<span class="sourceLineNo">2645</span>    int sum = 0;<a name="line.2645"></a>
+<span class="sourceLineNo">2646</span>    String firstRegionName = null;<a name="line.2646"></a>
+<span class="sourceLineNo">2647</span>    for (RegionAction regionAction : request.getRegionActionList()) {<a name="line.2647"></a>
+<span class="sourceLineNo">2648</span>      if (sum == 0) {<a name="line.2648"></a>
+<span class="sourceLineNo">2649</span>        firstRegionName = Bytes.toStringBinary(regionAction.getRegion().getValue().toByteArray());<a name="line.2649"></a>
+<span class="sourceLineNo">2650</span>      }<a name="line.2650"></a>
+<span class="sourceLineNo">2651</span>      sum += regionAction.getActionCount();<a name="line.2651"></a>
+<span class="sourceLineNo">2652</span>    }<a name="line.2652"></a>
+<span class="sourceLineNo">2653</span>    if (sum &gt; rowSizeWarnThreshold) {<a name="line.2653"></a>
+<span class="sourceLineNo">2654</span>      ld.logBatchWarning(firstRegionName, sum, rowSizeWarnThreshold);<a name="line.2654"></a>
+<span class="sourceLineNo">2655</span>    }<a name="line.2655"></a>
+<span class="sourceLineNo">2656</span>  }<a name="line.2656"></a>
+<span class="sourceLineNo">2657</span><a name="line.2657"></a>
+<span class="sourceLineNo">2658</span>  private void failRegionAction(MultiResponse.Builder responseBuilder,<a name="line.2658"></a>
+<span class="sourceLineNo">2659</span>      RegionActionResult.Builder regionActionResultBuilder, RegionAction regionAction,<a name="line.2659"></a>
+<span class="sourceLineNo">2660</span>      CellScanner cellScanner, Throwable error) {<a name="line.2660"></a>
+<span class="sourceLineNo">2661</span>    rpcServer.getMetrics().exception(error);<a name="line.2661"></a>
+<span class="sourceLineNo">2662</span>    regionActionResultBuilder.setException(ResponseConverter.buildException(error));<a name="line.2662"></a>
+<span class="sourceLineNo">2663</span>    responseBuilder.addRegionActionResult(regionActionResultBuilder.build());<a name="line.2663"></a>
+<span class="sourceLineNo">2664</span>    // All Mutations in this RegionAction not executed as we can not see the Region online here<a name="line.2664"></a>
+<span class="sourceLineNo">2665</span>    // in this RS. Will be retried from Client. Skipping all the Cells in CellScanner<a name="line.2665"></a>
+<span class="sourceLineNo">2666</span>    // corresponding to these Mutations.<a name="line.2666"></a>
+<span class="sourceLineNo">2667</span>    if (cellScanner != null) {<a name="line.2667"></a>
+<span class="sourceLineNo">2668</span>      skipCellsForMutations(regionAction.getActionList(), cellScanner);<a name="line.2668"></a>
+<span class="sourceLineNo">2669</span>    }<a name="line.2669"></a>
+<span class="sourceLineNo">2670</span>  }<a name="line.2670"></a>
+<span class="sourceLineNo">2671</span><a name="line.2671"></a>
+<span class="sourceLineNo">2672</span>  private boolean isReplicationRequest(Action action) {<a name="line.2672"></a>
+<span class="sourceLineNo">2673</span>    // replication request can only be put or delete.<a name="line.2673"></a>
+<span class="sourceLineNo">2674</span>    if (!action.hasMutation()) {<a name="line.2674"></a>
+<span class="sourceLineNo">2675</span>      return false;<a name="line.2675"></a>
+<span class="sourceLineNo">2676</span>    }<a name="line.2676"></a>
+<span class="sourceLineNo">2677</span>    MutationProto mutation = action.getMutation();<a name="line.2677"></a>
+<span class="sourceLineNo">2678</span>    MutationType type = mutation.getMutateType();<a name="line.2678"></a>
+<span class="sourceLineNo">2679</span>    if (type != MutationType.PUT &amp;&amp; type != MutationType.DELETE) {<a name="line.2679"></a>
+<span class="sourceLineNo">2680</span>      return false;<a name="line.2680"></a>
+<span class="sourceLineNo">2681</span>    }<a name="line.2681"></a>
+<span class="sourceLineNo">2682</span>    // replication will set a special attribute so we can make use of it to decide whether a request<a name="line.2682"></a>
+<span class="sourceLineNo">2683</span>    // is for replication.<a name="line.2683"></a>
+<span class="sourceLineNo">2684</span>    return mutation.getAttributeList().stream().map(p -&gt; p.getName())<a name="line.2684"></a>
+<span class="sourceLineNo">2685</span>      .filter(n -&gt; n.equals(ReplicationUtils.REPLICATION_ATTR_NAME)).findAny().isPresent();<a name="line.2685"></a>
+<span class="sourceLineNo">2686</span>  }<a name="line.2686"></a>
+<span class="sourceLineNo">2687</span><a name="line.2687"></a>
+<span class="sourceLineNo">2688</span>  /**<a name="line.2688"></a>
+<span class="sourceLineNo">2689</span>   * Execute multiple actions on a table: get, mutate, and/or execCoprocessor<a name="line.2689"></a>
+<span class="sourceLineNo">2690</span>   * @param rpcc the RPC controller<a name="line.2690"></a>
+<span class="sourceLineNo">2691</span>   * @param request the multi request<a name="line.2691"></a>
+<span class="sourceLineNo">2692</span>   * @throws ServiceException<a name="line.2692"></a>
+<span class="sourceLineNo">2693</span>   */<a name="line.2693"></a>
+<span class="sourceLineNo">2694</span>  @Override<a name="line.2694"></a>
+<span class="sourceLineNo">2695</span>  public MultiResponse multi(final RpcController rpcc, final MultiRequest request)<a name="line.2695"></a>
+<span class="sourceLineNo">2696</span>      throws ServiceException {<a name="line.2696"></a>
+<span class="sourceLineNo">2697</span>    try {<a name="line.2697"></a>
+<span class="sourceLineNo">2698</span>      checkOpen();<a name="line.2698"></a>
+<span class="sourceLineNo">2699</span>    } catch (IOException ie) {<a name="line.2699"></a>
+<span class="sourceLineNo">2700</span>      throw new ServiceException(ie);<a name="line.2700"></a>
+<span class="sourceLineNo">2701</span>    }<a name="line.2701"></a>
 <span class="sourceLineNo">2702</span><a name="line.2702"></a>
-<span class="sourceLineNo">2703</span>    // rpc controller is how we bring in data via the back door;  it is unprotobuf'ed data.<a name="line.2703"></a>
-<span class="sourceLineNo">2704</span>    // It is also the conduit via which we pass back data.<a name="line.2704"></a>
-<span class="sourceLineNo">2705</span>    HBaseRpcController controller = (HBaseRpcController)rpcc;<a name="line.2705"></a>
-<span class="sourceLineNo">2706</span>    CellScanner cellScanner = controller != null ? controller.cellScanner(): null;<a name="line.2706"></a>
-<span class="sourceLineNo">2707</span>    if (controller != null) {<a name="line.2707"></a>
-<span class="sourceLineNo">2708</span>      controller.setCellScanner(null);<a name="line.2708"></a>
-<span class="sourceLineNo">2709</span>    }<a name="line.2709"></a>
-<span class="sourceLineNo">2710</span><a name="line.2710"></a>
-<span class="sourceLineNo">2711</span>    long nonceGroup = request.hasNonceGroup() ? request.getNonceGroup() : HConstants.NO_NONCE;<a name="line.2711"></a>
+<span class="sourceLineNo">2703</span>    checkBatchSizeAndLogLargeSize(request);<a name="line.2703"></a>
+<span class="sourceLineNo">2704</span><a name="line.2704"></a>
+<span class="sourceLineNo">2705</span>    // rpc controller is how we bring in data via the back door;  it is unprotobuf'ed data.<a name="line.2705"></a>
+<span class="sourceLineNo">2706</span>    // It is also the conduit via which we pass back data.<a name="line.2706"></a>
+<span class="sourceLineNo">2707</span>    HBaseRpcController controller = (HBaseRpcController)rpcc;<a name="line.2707"></a>
+<span class="sourceLineNo">2708</span>    CellScanner cellScanner = controller != null ? controller.cellScanner(): null;<a name="line.2708"></a>
+<span class="sourceLineNo">2709</span>    if (controller != null) {<a name="line.2709"></a>
+<span class="sourceLineNo">2710</span>      controller.setCellScanner(null);<a name="line.2710"></a>
+<span class="sourceLineNo">2711</span>    }<a name="line.2711"></a>
 <span class="sourceLineNo">2712</span><a name="line.2712"></a>
-<span class="sourceLineNo">2713</span>    // this will contain all the cells that we need to return. It's created later, if needed.<a name="line.2713"></a>
-<span class="sourceLineNo">2714</span>    List&lt;CellScannable&gt; cellsToReturn = null;<a name="line.2714"></a>
-<span class="sourceLineNo">2715</span>    MultiResponse.Builder responseBuilder = MultiResponse.newBuilder();<a name="line.2715"></a>
-<span class="sourceLineNo">2716</span>    RegionActionResult.Builder regionActionResultBuilder = RegionActionResult.newBuilder();<a name="line.2716"></a>
-<span class="sourceLineNo">2717</span>    Boolean processed = null;<a name="line.2717"></a>
-<span class="sourceLineNo">2718</span>    RegionScannersCloseCallBack closeCallBack = null;<a name="line.2718"></a>
-<span class="sourceLineNo">2719</span>    RpcCallContext context = RpcServer.getCurrentCall().orElse(null);<a name="line.2719"></a>
-<span class="sourceLineNo">2720</span>    this.rpcMultiRequestCount.increment();<a name="line.2720"></a>
-<span class="sourceLineNo">2721</span>    this.requestCount.increment();<a name="line.2721"></a>
-<span class="sourceLineNo">2722</span>    Map&lt;RegionSpecifier, ClientProtos.RegionLoadStats&gt; regionStats = new HashMap&lt;&gt;(request<a name="line.2722"></a>
-<span class="sourceLineNo">2723</span>      .getRegionActionCount());<a name="line.2723"></a>
-<span class="sourceLineNo">2724</span>    ActivePolicyEnforcement spaceQuotaEnforcement = getSpaceQuotaManager().getActiveEnforcements();<a name="line.2724"></a>
-<span class="sourceLineNo">2725</span>    for (RegionAction regionAction : request.getRegionActionList()) {<a name="line.2725"></a>
-<span class="sourceLineNo">2726</span>      OperationQuota quota;<a name="line.2726"></a>
-<span class="sourceLineNo">2727</span>      HRegion region;<a name="line.2727"></a>
-<span class="sourceLineNo">2728</span>      regionActionResultBuilder.clear();<a name="line.2728"></a>
-<span class="sourceLineNo">2729</span>      RegionSpecifier regionSpecifier = regionAction.getRegion();<a name="line.2729"></a>
-<span class="sourceLineNo">2730</span>      try {<a name="line.2730"></a>
-<span class="sourceLineNo">2731</span>        region = getRegion(regionSpecifier);<a name="line.2731"></a>
-<span class="sourceLineNo">2732</span>        quota = getRpcQuotaManager().checkQuota(region, regionAction.getActionList());<a name="line.2732"></a>
-<span class="sourceLineNo">2733</span>      } catch (IOException e) {<a name="line.2733"></a>
-<span class="sourceLineNo">2734</span>        failRegionAction(responseBuilder, regionActionResultBuilder, regionAction, cellScanner, e);<a name="line.2734"></a>
-<span class="sourceLineNo">2735</span>        continue;  // For this region it's a failure.<a name="line.2735"></a>
-<span class="sourceLineNo">2736</span>      }<a name="line.2736"></a>
-<span class="sourceLineNo">2737</span>      boolean rejectIfFromClient = shouldRejectRequestsFromClient(region);<a name="line.2737"></a>
-<span class="sourceLineNo">2738</span>      if (regionAction.hasAtomic() &amp;&amp; regionAction.getAtomic()) {<a name="line.2738"></a>
-<span class="sourceLineNo">2739</span>        // We only allow replication in standby state and it will not set the atomic flag.<a name="line.2739"></a>
-<span class="sourceLineNo">2740</span>        if (rejectIfFromClient) {<a name="line.2740"></a>
-<span class="sourceLineNo">2741</span>          failRegionAction(responseBuilder, regionActionResultBuilder, regionAction, cellScanner,<a name="line.2741"></a>
-<span class="sourceLineNo">2742</span>            new DoNotRetryIOException(<a name="line.2742"></a>
-<span class="sourceLineNo">2743</span>              region.getRegionInfo().getRegionNameAsString() + " is in STANDBY state"));<a name="line.2743"></a>
-<span class="sourceLineNo">2744</span>          quota.close();<a name="line.2744"></a>
-<span class="sourceLineNo">2745</span>          continue;<a name="line.2745"></a>
-<span class="sourceLineNo">2746</span>        }<a name="line.2746"></a>
-<span class="sourceLineNo">2747</span>        // How does this call happen?  It may need some work to play well w/ the surroundings.<a name="line.2747"></a>
-<span class="sourceLineNo">2748</span>        // Need to return an item per Action along w/ Action index.  TODO.<a name="line.2748"></a>
-<span class="sourceLineNo">2749</span>        try {<a name="line.2749"></a>
-<span class="sourceLineNo">2750</span>          if (request.hasCondition()) {<a name="line.2750"></a>
-<span class="sourceLineNo">2751</span>            Condition condition = request.getCondition();<a name="line.2751"></a>
-<span class="sourceLineNo">2752</span>            byte[] row = condition.getRow().toByteArray();<a name="line.2752"></a>
-<span class="sourceLineNo">2753</span>            byte[] family = condition.getFamily().toByteArray();<a name="line.2753"></a>
-<span class="sourceLineNo">2754</span>            byte[] qualifier = condition.getQualifier().toByteArray();<a name="line.2754"></a>
-<span class="sourceLineNo">2755</span>            CompareOperator op =<a name="line.2755"></a>
-<span class="sourceLineNo">2756</span>              CompareOperator.valueOf(condition.getCompareType().name());<a name="line.2756"></a>
-<span class="sourceLineNo">2757</span>            ByteArrayComparable comparator =<a name="line.2757"></a>
-<span class="sourceLineNo">2758</span>                ProtobufUtil.toComparator(condition.getComparator());<a name="line.2758"></a>
-<span class="sourceLineNo">2759</span>            TimeRange timeRange = condition.hasTimeRange() ?<a name="line.2759"></a>
-<span class="sourceLineNo">2760</span>              ProtobufUtil.toTimeRange(condition.getTimeRange()) :<a name="line.2760"></a>
-<span class="sourceLineNo">2761</span>              TimeRange.allTime();<a name="line.2761"></a>
-<span class="sourceLineNo">2762</span>            processed =<a name="line.2762"></a>
-<span class="sourceLineNo">2763</span>              checkAndRowMutate(region, regionAction.getActionList(), cellScanner, row, family,<a name="line.2763"></a>
-<span class="sourceLineNo">2764</span>                qualifier, op, comparator, timeRange, regionActionResultBuilder,<a name="line.2764"></a>
-<span class="sourceLineNo">2765</span>                spaceQuotaEnforcement);<a name="line.2765"></a>
-<span class="sourceLineNo">2766</span>          } else {<a name="line.2766"></a>
-<span class="sourceLineNo">2767</span>            doAtomicBatchOp(regionActionResultBuilder, region, quota, regionAction.getActionList(),<a name="line.2767"></a>
-<span class="sourceLineNo">2768</span>              cellScanner, spaceQuotaEnforcement);<a name="line.2768"></a>
-<span class="sourceLineNo">2769</span>            processed = Boolean.TRUE;<a name="line.2769"></a>
-<span class="sourceLineNo">2770</span>          }<a name="line.2770"></a>
-<span class="sourceLineNo">2771</span>        } catch (IOException e) {<a name="line.2771"></a>
-<span class="sourceLineNo">2772</span>          rpcServer.getMetrics().exception(e);<a name="line.2772"></a>
-<span class="sourceLineNo">2773</span>          // As it's atomic, we may expect it's a global failure.<a name="line.2773"></a>
-<span class="sourceLineNo">2774</span>          regionActionResultBuilder.setException(ResponseConverter.buildException(e));<a name="line.2774"></a>
-<span class="sourceLineNo">2775</span>        }<a name="line.2775"></a>
-<span class="sourceLineNo">2776</span>      } else {<a name="line.2776"></a>
-<span class="sourceLineNo">2777</span>        if (rejectIfFromClient &amp;&amp; regionAction.getActionCount() &gt; 0 &amp;&amp;<a name="line.2777"></a>
-<span class="sourceLineNo">2778</span>          !isReplicationRequest(regionAction.getAction(0))) {<a name="line.2778"></a>
-<span class="sourceLineNo">2779</span>          // fail if it is not a replication request<a name="line.2779"></a>
-<span class="sourceLineNo">2780</span>          failRegionAction(responseBuilder, regionActionResultBuilder, regionAction, cellScanner,<a name="line.2780"></a>
-<span class="sourceLineNo">2781</span>            new DoNotRetryIOException(<a name="line.2781"></a>
-<span class="sourceLineNo">2782</span>              region.getRegionInfo().getRegionNameAsString() + " is in STANDBY state"));<a name="line.2782"></a>
-<span class="sourceLineNo">2783</span>          quota.close();<a name="line.2783"></a>
-<span class="sourceLineNo">2784</span>          continue;<a name="line.2784"></a>
-<span class="sourceLineNo">2785</span>        }<a name="line.2785"></a>
-<span class="sourceLineNo">2786</span>        // doNonAtomicRegionMutation manages the exception internally<a name="line.2786"></a>
-<span class="sourceLineNo">2787</span>        if (context != null &amp;&amp; closeCallBack == null) {<a name="line.2787"></a>
-<span class="sourceLineNo">2788</span>          // An RpcCallBack that creates a list of scanners that needs to perform callBack<a name="line.2788"></a>
-<span class="sourceLineNo">2789</span>          // operation on completion of multiGets.<a name="line.2789"></a>
-<span class="sourceLineNo">2790</span>          // Set this only once<a name="line.2790"></a>
-<span class="sourceLineNo">2791</span>          closeCallBack = new RegionScannersCloseCallBack();<a name="line.2791"></a>
-<span class="sourceLineNo">2792</span>          context.setCallBack(closeCallBack);<a name="line.2792"></a>
-<span class="sourceLineNo">2793</span>        }<a name="line.2793"></a>
-<span class="sourceLineNo">2794</span>        cellsToReturn = doNonAtomicRegionMutation(region, quota, regionAction, cellScanner,<a name="line.2794"></a>
-<span class="sourceLineNo">2795</span>            regionActionResultBuilder, cellsToReturn, nonceGroup, closeCallBack, context,<a name="line.2795"></a>
-<span class="sourceLineNo">2796</span>            spaceQuotaEnforcement);<a name="line.2796"></a>
-<span class="sourceLineNo">2797</span>      }<a name="line.2797"></a>
-<span class="sourceLineNo">2798</span>      responseBuilder.addRegionActionResult(regionActionResultBuilder.build());<a name="line.2798"></a>
-<span class="sourceLineNo">2799</span>      quota.close();<a name="line.2799"></a>
-<span class="sourceLineNo">2800</span>      ClientProtos.RegionLoadStats regionLoadStats = region.getLoadStatistics();<a name="line.2800"></a>
-<span class="sourceLineNo">2801</span>      if (regionLoadStats != null) {<a name="line.2801"></a>
-<span class="sourceLineNo">2802</span>        regionStats.put(regionSpecifier, regionLoadStats);<a name="line.2802"></a>
-<span class="sourceLineNo">2803</span>      }<a name="line.2803"></a>
-<span class="sourceLineNo">2804</span>    }<a name="line.2804"></a>
-<span class="sourceLineNo">2805</span>    // Load the controller with the Cells to return.<a name="line.2805"></a>
-<span class="sourceLineNo">2806</span>    if (cellsToReturn != null &amp;&amp; !cellsToReturn.isEmpty() &amp;&amp; controller != null) {<a name="line.2806"></a>
-<span class="sourceLineNo">2807</span>      controller.setCellScanner(CellUtil.createCellScanner(cellsToReturn));<a name="line.2807"></a>
-<span class="sourceLineNo">2808</span>    }<a name="line.2808"></a>
-<span class="sourceLineNo">2809</span><a name="line.2809"></a>
-<span class="sourceLineNo">2810</span>    if (processed != null) {<a name="line.2810"></a>
-<span class="sourceLineNo">2811</span>      responseBuilder.setProcessed(processed);<a name="line.2811"></a>
-<span class="sourceLineNo">2812</span>    }<a name="line.2812"></a>
-<span class="sourceLineNo">2813</span><a name="line.2813"></a>
-<span class="sourceLineNo">2814</span>    MultiRegionLoadStats.Builder builder = MultiRegionLoadStats.newBuilder();<a name="line.2814"></a>
-<span class="sourceLineNo">2815</span>    for(Entry&lt;RegionSpecifier, ClientProtos.RegionLoadStats&gt; stat: regionStats.entrySet()){<a name="line.2815"></a>
-<span class="sourceLineNo">2816</span>      builder.addRegion(stat.getKey());<a name="line.2816"></a>
-<span class="sourceLineNo">2817</span>      builder.addStat(stat.getValue());<a name="line.2817"></a>
-<span class="sourceLineNo">2818</span>    }<a name="line.2818"></a>
-<span class="sourceLineNo">2819</span>    responseBuilder.setRegionStatistics(builder);<a name="line.2819"></a>
-<span class="sourceLineNo">2820</span>    return responseBuilder.build();<a name="line.2820"></a>
-<span class="sourceLineNo">2821</span>  }<a name="line.2821"></a>
-<span class="sourceLineNo">2822</span><a name="line.2822"></a>
-<span class="sourceLineNo">2823</span>  private void skipCellsForMutations(List&lt;Action&gt; actions, CellScanner cellScanner) {<a name="line.2823"></a>
-<span class="sourceLineNo">2824</span>    if (cellScanner == null) {<a name="line.2824"></a>
-<span class="sourceLineNo">2825</span>      return;<a name="line.2825"></a>
-<span class="sourceLineNo">2826</span>    }<a name="line.2826"></a>
-<span class="sourceLineNo">2827</span>    for (Action action : actions) {<a name="line.2827"></a>
-<span class="sourceLineNo">2828</span>      skipCellsForMutation(action, cellScanner);<a name="line.2828"></a>
-<span class="sourceLineNo">2829</span>    }<a name="line.2829"></a>
-<span class="sourceLineNo">2830</span>  }<a name="line.2830"></a>
-<span class="sourceLineNo">2831</span><a name="line.2831"></a>
-<span class="sourceLineNo">2832</span>  private void skipCellsForMutation(Action action, CellScanner cellScanner) {<a name="line.2832"></a>
-<span class="sourceLineNo">2833</span>    if (cellScanner == null) {<a name="line.2833"></a>
-<span class="sourceLineNo">2834</span>      return;<a name="line.2834"></a>
-<span class="sourceLineNo">2835</span>    }<a name="line.2835"></a>
-<span class="sourceLineNo">2836</span>    try {<a name="line.2836"></a>
-<span class="sourceLineNo">2837</span>      if (action.hasMutation()) {<a name="line.2837"></a>
-<span class="sourceLineNo">2838</span>        MutationProto m = action.getMutation();<a name="line.2838"></a>
-<span class="sourceLineNo">2839</span>        if (m.hasAssociatedCellCount()) {<a name="line.2839"></a>
-<span class="sourceLineNo">2840</span>          for (int i = 0; i &lt; m.getAssociatedCellCount(); i++) {<a name="line.2840"></a>
-<span class="sourceLineNo">2841</span>            cellScanner.advance();<a name="line.2841"></a>
-<span class="sourceLineNo">2842</span>          }<a name="line.2842"></a>
-<span class="sourceLineNo">2843</span>        }<a name="line.2843"></a>
-<span class="sourceLineNo">2844</span>      }<a name="line.2844"></a>
-<span class="sourceLineNo">2845</span>    } catch (IOException e) {<a name="line.2845"></a>
-<span class="sourceLineNo">2846</span>      // No need to handle these Individual Muatation level issue. Any way this entire RegionAction<a name="line.2846"></a>
-<span class="sourceLineNo">2847</span>      // marked as failed as we could not see the Region here. At client side the top level<a name="line.2847"></a>
-<span class="sourceLineNo">2848</span>      // RegionAction exception will be considered first.<a name="line.2848"></a>
-<span class="sourceLineNo">2849</span>      LOG.error("Error while skipping Cells in CellScanner for invalid Region Mutations", e);<a name="line.2849"></a>
-<span class="sourceLineNo">2850</span>    }<a name="line.2850"></a>
-<span class="sourceLineNo">2851</span>  }<a name="line.2851"></a>
-<span class="sourceLineNo">2852</span><a name="line.2852"></a>
-<span class="sourceLineNo">2853</span>  /**<a name="line.2853"></a>
-<span class="sourceLineNo">2854</span>   * Mutate data in a table.<a name="line.2854"></a>
-<span class="sourceLineNo">2855</span>   *<a name="line.2855"></a>
-<span class="sourceLineNo">2856</span>   * @param rpcc the RPC controller<a name="line.2856"></a>
-<span class="sourceLineNo">2857</span>   * @param request the mutate request<a name="line.2857"></a>
-<span class="sourceLineNo">2858</span>   */<a name="line.2858"></a>
-<span class="sourceLineNo">2859</span>  @Override<a name="line.2859"></a>
-<span class="sourceLineNo">2860</span>  public MutateResponse mutate(final RpcController rpcc, final MutateRequest request)<a name="line.2860"></a>
-<span class="sourceLineNo">2861</span>      throws ServiceException {<a name="line.2861"></a>
-<span class="sourceLineNo">2862</span>    // rpc controller is how we bring in data via the back door;  it is unprotobuf'ed data.<a name="line.2862"></a>
-<span class="sourceLineNo">2863</span>    // It is also the conduit via which we pass back data.<a name="line.2863"></a>
-<span class="sourceLineNo">2864</span>    HBaseRpcController controller = (HBaseRpcController)rpcc;<a name="line.2864"></a>
-<span class="sourceLineNo">2865</span>    CellScanner cellScanner = controller != null ? controller.cellScanner() : null;<a name="line.2865"></a>
-<span class="sourceLineNo">2866</span>    OperationQuota quota = null;<a name="line.2866"></a>
-<span class="sourceLineNo">2867</span>    RpcCallContext context = RpcServer.getCurrentCall().orElse(null);<a name="line.2867"></a>
-<span class="sourceLineNo">2868</span>    ActivePolicyEnforcement spaceQuotaEnforcement = null;<a name="line.2868"></a>
-<span class="sourceLineNo">2869</span>    MutationType type = null;<a name="line.2869"></a>
-<span class="sourceLineNo">2870</span>    HRegion region = null;<a name="line.2870"></a>
-<span class="sourceLineNo">2871</span>    long before = EnvironmentEdgeManager.currentTime();<a name="line.2871"></a>
-<span class="sourceLineNo">2872</span>    // Clear scanner so we are not holding on to reference across call.<a name="line.2872"></a>
-<span class="sourceLineNo">2873</span>    if (controller != null) {<a name="line.2873"></a>
-<span class="sourceLineNo">2874</span>      controller.setCellScanner(null);<a name="line.2874"></a>
-<span class="sourceLineNo">2875</span>    }<a name="line.2875"></a>
-<span class="sourceLineNo">2876</span>    try {<a name="line.2876"></a>
-<span class="sourceLineNo">2877</span>      checkOpen();<a name="line.2877"></a>
-<span class="sourceLineNo">2878</span>      requestCount.increment();<a name="line.2878"></a>
-<span class="sourceLineNo">2879</span>      rpcMutateRequestCount.increment();<a name="line.2879"></a>
-<span class="sourceLineNo">2880</span>      region = getRegion(request.getRegion());<a name="line.2880"></a>
-<span class="sourceLineNo">2881</span>      rejectIfInStandByState(region);<a name="line.2881"></a>
-<span class="sourceLineNo">2882</span>      MutateResponse.Builder builder = MutateResponse.newBuilder();<a name="line.2882"></a>
-<span class="sourceLineNo">2883</span>      MutationProto mutation = request.getMutation();<a name="line.2883"></a>
-<span class="sourceLineNo">2884</span>      if (!region.getRegionInfo().isMetaRegion()) {<a name="line.2884"></a>
-<span class="sourceLineNo">2885</span>        regionServer.cacheFlusher.reclaimMemStoreMemory();<a name="line.2885"></a>
-<span class="sourceLineNo">2886</span>      }<a name="line.2886"></a>
-<span class="sourceLineNo">2887</span>      long nonceGroup = request.hasNonceGroup() ? request.getNonceGroup() : HConstants.NO_NONCE;<a name="line.2887"></a>
-<span class="sourceLineNo">2888</span>      Result r = null;<a name="line.2888"></a>
-<span class="sourceLineNo">2889</span>      Boolean processed = null;<a name="line.2889"></a>
-<span class="sourceLineNo">2890</span>      type = mutation.getMutateType();<a name="line.2890"></a>
-<span class="sourceLineNo">2891</span><a name="line.2891"></a>
-<span class="sourceLineNo">2892</span>      quota = getRpcQuotaManager().checkQuota(region, OperationQuota.OperationType.MUTATE);<a name="line.2892"></a>
-<span class="sourceLineNo">2893</span>      spaceQuotaEnforcement = getSpaceQuotaManager().getActiveEnforcements();<a name="line.2893"></a>
-<span class="sourceLineNo">2894</span><a name="line.2894"></a>
-<span class="sourceLineNo">2895</span>      switch (type) {<a name="line.2895"></a>
-<span class="sourceLineNo">2896</span>        case APPEND:<a name="line.2896"></a>
-<span class="sourceLineNo">2897</span>          // TODO: this doesn't actually check anything.<a name="line.2897"></a>
-<span class="sourceLineNo">2898</span>          r = append(region, quota, mutation, cellScanner, nonceGroup, spaceQuotaEnforcement);<a name="line.2898"></a>
-<span class="sourceLineNo">2899</span>          break;<a name="line.2899"></a>
-<span class="sourceLineNo">2900</span>        case INCREMENT:<a name="line.2900"></a>
-<span class="sourceLineNo">2901</span>          // TODO: this doesn't actually check anything.<a name="line.2901"></a>
-<span class="sourceLineNo">2902</span>          r = increment(region, quota, mutation, cellScanner, nonceGroup, spaceQuotaEnforcement);<a name="line.2902"></a>
-<span class="sourceLineNo">2903</span>          break;<a name="line.2903"></a>
-<span class="sourceLineNo">2904</span>        case PUT:<a name="line.2904"></a>
-<span class="sourceLineNo">2905</span>          Put put = ProtobufUtil.toPut(mutation, cellScanner);<a name="line.2905"></a>
-<span class="sourceLineNo">2906</span>          checkCellSizeLimit(region, put);<a name="line.2906"></a>
-<span class="sourceLineNo">2907</span>          // Throws an exception when violated<a name="line.2907"></a>
-<span class="sourceLineNo">2908</span>          spaceQuotaEnforcement.getPolicyEnforcement(region).check(put);<a name="line.2908"></a>
-<span class="sourceLineNo">2909</span>          quota.addMutation(put);<a name="line.2909"></a>
-<span class="sourceLineNo">2910</span>          if (request.hasCondition()) {<a name="line.2910"></a>
-<span class="sourceLineNo">2911</span>            Condition condition = request.getCondition();<a name="line.2911"></a>
-<span class="sourceLineNo">2912</span>            byte[] row = condition.getRow().toByteArray();<a name="line.2912"></a>
-<span class="sourceLineNo">2913</span>            byte[] family = condition.getFamily().toByteArray();<a name="line.2913"></a>
-<span class="sourceLineNo">2914</span>            byte[] qualifier = condition.getQualifier().toByteArray();<a name="line.2914"></a>
-<span class="sourceLineNo">2915</span>            CompareOperator compareOp =<a name="line.2915"></a>
-<span class="sourceLineNo">2916</span>              CompareOperator.valueOf(condition.getCompareType().name());<a name="line.2916"></a>
-<span class="sourceLineNo">2917</span>            ByteArrayComparable comparator = ProtobufUtil.toComparator(condition.getComparator());<a name="line.2917"></a>
-<span class="sourceLineNo">2918</span>            TimeRange timeRange = condition.hasTimeRange() ?<a name="line.2918"></a>
-<span class="sourceLineNo">2919</span>              ProtobufUtil.toTimeRange(condition.getTimeRange()) :<a name="line.2919"></a>
-<span class="sourceLineNo">2920</span>              TimeRange.allTime();<a name="line.2920"></a>
-<span class="sourceLineNo">2921</span>            if (region.getCoprocessorHost() != null) {<a name="line.2921"></a>
-<span class="sourceLineNo">2922</span>              processed = region.getCoprocessorHost().preCheckAndPut(row, family, qualifier,<a name="line.2922"></a>
-<span class="sourceLineNo">2923</span>                  compareOp, comparator, put);<a name="line.2923"></a>
-<span class="sourceLineNo">2924</span>            }<a name="line.2924"></a>
-<span class="sourceLineNo">2925</span>            if (processed == null) {<a name="line.2925"></a>
-<span class="sourceLineNo">2926</span>              boolean result = region.checkAndMutate(row, family,<a name="line.2926"></a>
-<span class="sourceLineNo">2927</span>                qualifier, compareOp, comparator, timeRange, put);<a name="line.2927"></a>
-<span class="sourceLineNo">2928</span>              if (region.getCoprocessorHost() != null) {<a name="line.2928"></a>
-<span class="sourceLineNo">2929</span>                result = region.getCoprocessorHost().postCheckAndPut(row, family,<a name="line.2929"></a>
-<span class="sourceLineNo">2930</span>                  qualifier, compareOp, comparator, put, result);<a name="line.2930"></a>
-<span class="sourceLineNo">2931</span>              }<a name="line.2931"></a>
-<span class="sourceLineNo">2932</span>              processed = result;<a name="line.2932"></a>
-<span class="sourceLineNo">2933</span>            }<a name="line.2933"></a>
-<span class="sourceLineNo">2934</span>          } else {<a name="line.2934"></a>
-<span class="sourceLineNo">2935</span>            region.put(put);<a name="line.2935"></a>
-<span class="sourceLineNo">2936</span>            processed = Boolean.TRUE;<a name="line.2936"></a>
-<span class="sourceLineNo">2937</span>          }<a name="line.2937"></a>
-<span class="sourceLineNo">2938</span>          break;<a name="line.2938"></a>
-<span class="sourceLineNo">2939</span>        case DELETE:<a name="line.2939"></a>
-<span class="sourceLineNo">2940</span>          Delete delete = ProtobufUtil.toDelete(mutation, cellScanner);<a name="line.2940"></a>
-<span class="sourceLineNo">2941</span>          checkCellSizeLimit(region, delete);<a name="line.2941"></a>
-<span class="sourceLineNo">2942</span>          spaceQuotaEnforcement.getPolicyEnforcement(region).check(delete);<a name="line.2942"></a>
-<span class="sourceLineNo">2943</span>          quota.addMutation(delete);<a name="line.2943"></a>
-<span class="sourceLineNo">2944</span>          if (request.hasCondition()) {<a name="line.2944"></a>
-<span class="sourceLineNo">2945</span>            Condition condition = request.getCondition();<a name="line.2945"></a>
-<span class="sourceLineNo">2946</span>            byte[] row = condition.getRow().toByteArray();<a name="line.2946"></a>
-<span class="sourceLineNo">2947</span>            byte[] family = condition.getFamily().toByteArray();<a name="line.2947"></a>
-<span class="sourceLineNo">2948</span>            byte[] qualifier = condition.getQualifier().toByteArray();<a name="line.2948"></a>
-<span class="sourceLineNo">2949</span>            CompareOperator op = CompareOperator.valueOf(condition.getCompareType().name());<a name="line.2949"></a>
-<span class="sourceLineNo">2950</span>            ByteArrayComparable comparator = ProtobufUtil.toComparator(condition.getComparator());<a name="line.2950"></a>
-<span class="sourceLineNo">2951</span>            TimeRange timeRange = condition.hasTimeRange() ?<a name="line.2951"></a>
-<span class="sourceLineNo">2952</span>              ProtobufUtil.toTimeRange(condition.getTimeRange()) :<a name="line.2952"></a>
-<span class="sourceLineNo">2953</span>              TimeRange.allTime();<a name="line.2953"></a>
-<span class="sourceLineNo">2954</span>            if (region.getCoprocessorHost() != null) {<a name="line.2954"></a>
-<span class="sourceLineNo">2955</span>              processed = region.getCoprocessorHost().preCheckAndDelete(row, family, qualifier, op,<a name="line.2955"></a>
-<span class="sourceLineNo">2956</span>                  comparator, delete);<a name="line.2956"></a>
-<span class="sourceLineNo">2957</span>            }<a name="line.2957"></a>
-<span class="sourceLineNo">2958</span>            if (processed == null) {<a name="line.2958"></a>
-<span class="sourceLineNo">2959</span>              boolean result = region.checkAndMutate(row, family,<a name="line.2959"></a>
-<span class="sourceLineNo">2960</span>                qualifier, op, comparator, timeRange, delete);<a name="line.2960"></a>
-<span class="sourceLineNo">2961</span>              if (region.getCoprocessorHost() != null) {<a name="line.2961"></a>
-<span class="sourceLineNo">2962</span>                result = region.getCoprocessorHost().postCheckAndDelete(row, family,<a name="line.2962"></a>
-<span class="sourceLineNo">2963</span>                  qualifier, op, comparator, delete, result);<a name="line.2963"></a>
-<span class="sourceLineNo">2964</span>              }<a name="line.2964"></a>
-<span class="sourceLineNo">2965</span>              processed = result;<a name="line.2965"></a>
-<span class="sourceLineNo">2966</span>            }<a name="line.2966"></a>
-<span class="sourceLineNo">2967</span>          } else {<a name="line.2967"></a>
-<span class="sourceLineNo">2968</span>            region.delete(delete);<a name="line.2968"></a>
-<span class="sourceLineNo">2969</span>            processed = Boolean.TRUE;<a name="line.2969"></a>
-<span class="sourceLineNo">2970</span>          }<a name="line.2970"></a>
-<span class="sourceLineNo">2971</span>          break;<a name="line.2971"></a>
-<span class="sourceLineNo">2972</span>        default:<a name="line.2972"></a>
-<span class="sourceLineNo">2973</span>          throw new DoNotRetryIOException("Unsupported mutate type: " + type.name());<a name="line.2973"></a>
-<span class="sourceLineNo">2974</span>      }<a name="line.2974"></a>
-<span class="sourceLineNo">2975</span>      if (processed != null) {<a name="line.2975"></a>
-<span class="sourceLineNo">2976</span>        builder.setProcessed(processed.booleanValue());<a name="line.2976"></a>
-<span class="sourceLineNo">2977</span>      }<a name="line.2977"></a>
-<span class="sourceLineNo">2978</span>      boolean clientCellBlockSupported = isClientCellBlockSupport(context);<a name="line.2978"></a>
-<span class="sourceLineNo">2979</span>      addResult(builder, r, controller, clientCellBlockSupported);<a name="line.2979"></a>
-<span class="sourceLineNo">2980</span>      if (clientCellBlockSupported) {<a name="line.2980"></a>
-<span class="sourceLineNo">2981</span>        addSize(context, r, null);<a name="line.2981"></a>
-<span class="sourceLineNo">2982</span>      }<a name="line.2982"></a>
-<span class="sourceLineNo">2983</span>      return builder.build();<a name="line.2983"></a>
-<span class="sourceLineNo">2984</span>    } catch (IOException ie) {<a name="line.2984"></a>
-<span class="sourceLineNo">2985</span>      regionServer.checkFileSystem();<a name="line.2985"></a>
-<span class="sourceLineNo">2986</span>      throw new ServiceException(ie);<a name="line.2986"></a>
-<span class="sourceLineNo">2987</span>    } finally {<a name="line.2987"></a>
-<span class="sourceLineNo">2988</span>      if (quota != null) {<a name="line.2988"></a>
-<span class="sourceLineNo">2989</span>        quota.close();<a name="line.2989"></a>
-<span class="sourceLineNo">2990</span>      }<a name="line.2990"></a>
-<span class="sourceLineNo">2991</span>      // Update metrics<a name="line.2991"></a>
-<span class="sourceLineNo">2992</span>      if (regionServer.metricsRegionServer != null &amp;&amp; type != null) {<a name="line.2992"></a>
-<span class="sourceLineNo">2993</span>        long after = EnvironmentEdgeManager.currentTime();<a name="line.2993"></a>
-<span class="sourceLineNo">2994</span>        switch (type) {<a name="line.2994"></a>
-<span class="sourceLineNo">2995</span>        case DELETE:<a name="line.2995"></a>
-<span class="sourceLineNo">2996</span>          if (request.hasCondition()) {<a name="line.2996"></a>
-<span class="sourceLineNo">2997</span>            regionServer.metricsRegionServer.updateCheckAndDelete(after - before);<a name="line.2997"></a>
-<span class="sourceLineNo">2998</span>          } else {<a name="line.2998"></a>
-<span class="sourceLineNo">2999</span>            regionServer.metricsRegionServer.updateDelete(<a name="line.2999"></a>
-<span class="sourceLineNo">3000</span>                region == null ? null : region.getRegionInfo().getTable(), after - before);<a name="line.3000"></a>
-<span class="sourceLineNo">3001</span>          }<a name="line.3001"></a>
-<span class="sourceLineNo">3002</span>          break;<a name="line.3002"></a>
-<span class="sourceLineNo">3003</span>        case PUT:<a name="line.3003"></a>
-<span class="sourceLineNo">3004</span>          if (request.hasCondition()) {<a name="line.3004"></a>
-<span class="sourceLineNo">3005</span>            regionServer.metricsRegionServer.updateCheckAndPut(after - before);<a name="line.3005"></a>
-<span class="sourceLineNo">3006</span>          } else {<a name="line.3006"></a>
-<span class="sourceLineNo">3007</span>            regionServer.metricsRegionServer.updatePut(<a name="line.3007"></a>
-<span class="sourceLineNo">3008</span>                region == null ? null : region.getRegionInfo().getTable(),after - before);<a name="line.3008"></a>
-<span class="sourceLineNo">3009</span>          }<a name="line.3009"></a>
-<span class="sourceLineNo">3010</span>          break;<a name="line.3010"></a>
-<span class="sourceLineNo">3011</span>        default:<a name="line.3011"></a>
+<span class="sourceLineNo">2713</span>    long nonceGroup = request.hasNonceGroup() ? request.getNonceGroup() : HConstants.NO_NONCE;<a name="line.2713"></a>
+<span class="sourceLineNo">2714</span><a name="line.2714"></a>
+<span class="sourceLineNo">2715</span>    // this will contain all the cells that we need to return. It's created later, if needed.<a name="line.2715"></a>
+<span class="sourceLineNo">2716</span>    List&lt;CellScannable&gt; cellsToReturn = null;<a name="line.2716"></a>
+<span class="sourceLineNo">2717</span>    MultiResponse.Builder responseBuilder = MultiResponse.newBuilder();<a name="line.2717"></a>
+<span class="sourceLineNo">2718</span>    RegionActionResult.Builder regionActionResultBuilder = RegionActionResult.newBuilder();<a name="line.2718"></a>
+<span class="sourceLineNo">2719</span>    Boolean processed = null;<a name="line.2719"></a>
+<span class="sourceLineNo">2720</span>    RegionScannersCloseCallBack closeCallBack = null;<a name="line.2720"></a>
+<span class="sourceLineNo">2721</span>    RpcCallContext context = RpcServer.getCurrentCall().orElse(null);<a name="line.2721"></a>
+<span class="sourceLineNo">2722</span>    this.rpcMultiRequestCount.increment();<a name="line.2722"></a>
+<span class="sourceLineNo">2723</span>    this.requestCount.increment();<a name="line.2723"></a>
+<span class="sourceLineNo">2724</span>    Map&lt;RegionSpecifier, ClientProtos.RegionLoadStats&gt; regionStats = new HashMap&lt;&gt;(request<a name="line.2724"></a>
+<span class="sourceLineNo">2725</span>      .getRegionActionCount());<a name="line.2725"></a>
+<span class="sourceLineNo">2726</span>    ActivePolicyEnforcement spaceQuotaEnforcement = getSpaceQuotaManager().getActiveEnforcements();<a name="line.2726"></a>
+<span class="sourceLineNo">2727</span>    for (RegionAction regionAction : request.getRegionActionList()) {<a name="line.2727"></a>
+<span class="sourceLineNo">2728</span>      OperationQuota quota;<a name="line.2728"></a>
+<span class="sourceLineNo">2729</span>      HRegion region;<a name="line.2729"></a>
+<span class="sourceLineNo">2730</span>      regionActionResultBuilder.clear();<a name="line.2730"></a>
+<span class="sourceLineNo">2731</span>      RegionSpecifier regionSpecifier = regionAction.getRegion();<a name="line.2731"></a>
+<span class="sourceLineNo">2732</span>      try {<a name="line.2732"></a>
+<span class="sourceLineNo">2733</span>        region = getRegion(regionSpecifier);<a name="line.2733"></a>
+<span class="sourceLineNo">2734</span>        quota = getRpcQuotaManager().checkQuota(region, regionAction.getActionList());<a name="line.2734"></a>
+<span class="sourceLineNo">2735</span>      } catch (IOException e) {<a name="line.2735"></a>
+<span class="sourceLineNo">2736</span>        failRegionAction(responseBuilder, regionActionResultBuilder, regionAction, cellScanner, e);<a name="line.2736"></a>
+<span class="sourceLineNo">2737</span>        continue;  // For this region it's a failure.<a name="line.2737"></a>
+<span class="sourceLineNo">2738</span>      }<a name="line.2738"></a>
+<span class="sourceLineNo">2739</span>      boolean rejectIfFromClient = shouldRejectRequestsFromClient(region);<a name="line.2739"></a>
+<span class="sourceLineNo">2740</span>      if (regionAction.hasAtomic() &amp;&amp; regionAction.getAtomic()) {<a name="line.2740"></a>
+<span class="sourceLineNo">2741</span>        // We only allow replication in standby state and it will not set the atomic flag.<a name="line.2741"></a>
+<span class="sourceLineNo">2742</span>        if (rejectIfFromClient) {<a name="line.2742"></a>
+<span class="sourceLineNo">2743</span>          failRegionAction(responseBuilder, regionActionResultBuilder, regionAction, cellScanner,<a name="line.2743"></a>
+<span class="sourceLineNo">2744</span>            new DoNotRetryIOException(<a name="line.2744"></a>
+<span class="sourceLineNo">2745</span>              region.getRegionInfo().getRegionNameAsString() + " is in STANDBY state"));<a name="line.2745"></a>
+<span class="sourceLineNo">2746</span>          quota.close();<a name="line.2746"></a>
+<span class="sourceLineNo">2747</span>          continue;<a name="line.2747"></a>
+<span class="sourceLineNo">2748</span>        }<a name="line.2748"></a>
+<span class="sourceLineNo">2749</span>        // How does this call happen?  It may need some work to play well w/ the surroundings.<a name="line.2749"></a>
+<span class="sourceLineNo">2750</span>        // Need to return an item per Action along w/ Action index.  TODO.<a name="line.2750"></a>
+<span class="sourceLineNo">2751</span>        try {<a name="line.2751"></a>
+<span class="sourceLineNo">2752</span>          if (request.hasCondition()) {<a name="line.2752"></a>
+<span class="sourceLineNo">2753</span>            Condition condition = request.getCondition();<a name="line.2753"></a>
+<span class="sourceLineNo">2754</span>            byte[] row = condition.getRow().toByteArray();<a name="line.2754"></a>
+<span class="sourceLineNo">2755</span>            byte[] family = condition.getFamily().toByteArray();<a name="line.2755"></a>
+<span class="sourceLineNo">2756</span>            byte[] qualifier = condition.getQualifier().toByteArray();<a name="line.2756"></a>
+<span class="sourceLineNo">2757</span>            CompareOperator op =<a name="line.2757"></a>
+<span class="sourceLineNo">2758</span>              CompareOperator.valueOf(condition.getCompareType().name());<a name="line.2758"></a>
+<span class="sourceLineNo">2759</span>            ByteArrayComparable comparator =<a name="line.2759"></a>
+<span class="sourceLineNo">2760</span>                ProtobufUtil.toComparator(condition.getComparator());<a name="line.2760"></a>
+<span class="sourceLineNo">2761</span>            TimeRange timeRange = condition.hasTimeRange() ?<a name="line.2761"></a>
+<span class="sourceLineNo">2762</span>              ProtobufUtil.toTimeRange(condition.getTimeRange()) :<a name="line.2762"></a>
+<span class="sourceLineNo">2763</span>              TimeRange.allTime();<a name="line.2763"></a>
+<span class="sourceLineNo">2764</span>            processed =<a name="line.2764"></a>
+<span class="sourceLineNo">2765</span>              checkAndRowMutate(region, regionAction.getActionList(), cellScanner, row, family,<a name="line.2765"></a>
+<span class="sourceLineNo">2766</span>                qualifier, op, comparator, timeRange, regionActionResultBuilder,<a name="line.2766"></a>
+<span class="sourceLineNo">2767</span>                spaceQuotaEnforcement);<a name="line.2767"></a>
+<span class="sourceLineNo">2768</span>          } else {<a name="line.2768"></a>
+<span class="sourceLineNo">2769</span>            doAtomicBatchOp(regionActionResultBuilder, region, quota, regionAction.getActionList(),<a name="line.2769"></a>
+<span class="sourceLineNo">2770</span>              cellScanner, spaceQuotaEnforcement);<a name="line.2770"></a>
+<span class="sourceLineNo">2771</span>            processed = Boolean.TRUE;<a name="line.2771"></a>
+<span class="sourceLineNo">2772</span>          }<a name="line.2772"></a>
+<span class="sourceLineNo">2773</span>        } catch (IOException e) {<a name="line.2773"></a>
+<span class="sourceLineNo">2774</span>          rpcServer.getMetrics().exception(e);<a name="line.2774"></a>
+<span class="sourceLineNo">2775</span>          // As it's atomic, we may expect it's a global failure.<a name="line.2775"></a>
+<span class="sourceLineNo">2776</span>          regionActionResultBuilder.setException(ResponseConverter.buildException(e));<a name="line.2776"></a>
+<span class="sourceLineNo">2777</span>        }<a name="line.2777"></a>
+<span class="sourceLineNo">2778</span>      } else {<a name="line.2778"></a>
+<span class="sourceLineNo">2779</span>        if (rejectIfFromClient &amp;&amp; regionAction.getActionCount() &gt; 0 &amp;&amp;<a name="line.2779"></a>
+<span class="sourceLineNo">2780</span>          !isReplicationRequest(regionAction.getAction(0))) {<a name="line.2780"></a>
+<span class="sourceLineNo">2781</span>          // fail if it is not a replication request<a name="line.2781"></a>
+<span class="sourceLineNo">2782</span>          failRegionAction(responseBuilder, regionActionResultBuilder, regionAction, cellScanner,<a name="line.2782"></a>
+<span class="sourceLineNo">2783</span>            new DoNotRetryIOException(<a name="line.2783"></a>
+<span class="sourceLineNo">2784</span>              region.getRegionInfo().getRegionNameAsString() + " is in STANDBY state"));<a name="line.2784"></a>
+<span class="sourceLineNo">2785</span>          quota.close();<a name="line.2785"></a>
+<span class="sourceLineNo">2786</span>          continue;<a name="line.2786"></a>
+<span class="sourceLineNo">2787</span>        }<a name="line.2787"></a>
+<span class="sourceLineNo">2788</span>        // doNonAtomicRegionMutation manages the exception internally<a name="line.2788"></a>
+<span class="sourceLineNo">2789</span>        if (context != null &amp;&amp; closeCallBack == null) {<a name="line.2789"></a>
+<span class="sourceLineNo">2790</span>          // An RpcCallBack that creates a list of scanners that needs to perform callBack<a name="line.2790"></a>
+<span class="sourceLineNo">2791</span>          // operation on completion of multiGets.<a name="line.2791"></a>
+<span class="sourceLineNo">2792</span>          // Set this only once<a name="line.2792"></a>
+<span class="sourceLineNo">2793</span>          closeCallBack = new RegionScannersCloseCallBack();<a name="line.2793"></a>
+<span class="sourceLineNo">2794</span>          context.setCallBack(closeCallBack);<a name="line.2794"></a>
+<span class="sourceLineNo">2795</span>        }<a name="line.2795"></a>
+<span class="sourceLineNo">2796</span>        cellsToReturn = doNonAtomicRegionMutation(region, quota, regionAction, cellScanner,<a name="line.2796"></a>
+<span class="sourceLineNo">2797</span>            regionActionResultBuilder, cellsToReturn, nonceGroup, closeCallBack, context,<a name="line.2797"></a>
+<span class="sourceLineNo">2798</span>            spaceQuotaEnforcement);<a name="line.2798"></a>
+<span clas

<TRUNCATED>

[07/46] hbase-site git commit: Published site at 05d22ed960204183fbd9bd16f1dbca6410ccde76.

Posted by gi...@apache.org.
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/3649682c/devapidocs/src-html/org/apache/hadoop/hbase/regionserver/RSRpcServices.RegionScannersCloseCallBack.html
----------------------------------------------------------------------
diff --git a/devapidocs/src-html/org/apache/hadoop/hbase/regionserver/RSRpcServices.RegionScannersCloseCallBack.html b/devapidocs/src-html/org/apache/hadoop/hbase/regionserver/RSRpcServices.RegionScannersCloseCallBack.html
index 20e3eaa..b257d07 100644
--- a/devapidocs/src-html/org/apache/hadoop/hbase/regionserver/RSRpcServices.RegionScannersCloseCallBack.html
+++ b/devapidocs/src-html/org/apache/hadoop/hbase/regionserver/RSRpcServices.RegionScannersCloseCallBack.html
@@ -2493,1291 +2493,1293 @@
 <span class="sourceLineNo">2485</span>  }<a name="line.2485"></a>
 <span class="sourceLineNo">2486</span><a name="line.2486"></a>
 <span class="sourceLineNo">2487</span>  private boolean shouldRejectRequestsFromClient(HRegion region) {<a name="line.2487"></a>
-<span class="sourceLineNo">2488</span>    return regionServer.getReplicationSourceService().getSyncReplicationPeerInfoProvider()<a name="line.2488"></a>
-<span class="sourceLineNo">2489</span>      .checkState(region.getRegionInfo().getTable(), RejectRequestsFromClientStateChecker.get());<a name="line.2489"></a>
-<span class="sourceLineNo">2490</span>  }<a name="line.2490"></a>
-<span class="sourceLineNo">2491</span><a name="line.2491"></a>
-<span class="sourceLineNo">2492</span>  private void rejectIfInStandByState(HRegion region) throws DoNotRetryIOException {<a name="line.2492"></a>
-<span class="sourceLineNo">2493</span>    if (shouldRejectRequestsFromClient(region)) {<a name="line.2493"></a>
-<span class="sourceLineNo">2494</span>      throw new DoNotRetryIOException(<a name="line.2494"></a>
-<span class="sourceLineNo">2495</span>        region.getRegionInfo().getRegionNameAsString() + " is in STANDBY state.");<a name="line.2495"></a>
-<span class="sourceLineNo">2496</span>    }<a name="line.2496"></a>
-<span class="sourceLineNo">2497</span>  }<a name="line.2497"></a>
-<span class="sourceLineNo">2498</span><a name="line.2498"></a>
-<span class="sourceLineNo">2499</span>  /**<a name="line.2499"></a>
-<span class="sourceLineNo">2500</span>   * Get data from a table.<a name="line.2500"></a>
-<span class="sourceLineNo">2501</span>   *<a name="line.2501"></a>
-<span class="sourceLineNo">2502</span>   * @param controller the RPC controller<a name="line.2502"></a>
-<span class="sourceLineNo">2503</span>   * @param request the get request<a name="line.2503"></a>
-<span class="sourceLineNo">2504</span>   * @throws ServiceException<a name="line.2504"></a>
-<span class="sourceLineNo">2505</span>   */<a name="line.2505"></a>
-<span class="sourceLineNo">2506</span>  @Override<a name="line.2506"></a>
-<span class="sourceLineNo">2507</span>  public GetResponse get(final RpcController controller, final GetRequest request)<a name="line.2507"></a>
-<span class="sourceLineNo">2508</span>      throws ServiceException {<a name="line.2508"></a>
-<span class="sourceLineNo">2509</span>    long before = EnvironmentEdgeManager.currentTime();<a name="line.2509"></a>
-<span class="sourceLineNo">2510</span>    OperationQuota quota = null;<a name="line.2510"></a>
-<span class="sourceLineNo">2511</span>    HRegion region = null;<a name="line.2511"></a>
-<span class="sourceLineNo">2512</span>    try {<a name="line.2512"></a>
-<span class="sourceLineNo">2513</span>      checkOpen();<a name="line.2513"></a>
-<span class="sourceLineNo">2514</span>      requestCount.increment();<a name="line.2514"></a>
-<span class="sourceLineNo">2515</span>      rpcGetRequestCount.increment();<a name="line.2515"></a>
-<span class="sourceLineNo">2516</span>      region = getRegion(request.getRegion());<a name="line.2516"></a>
-<span class="sourceLineNo">2517</span>      rejectIfInStandByState(region);<a name="line.2517"></a>
-<span class="sourceLineNo">2518</span><a name="line.2518"></a>
-<span class="sourceLineNo">2519</span>      GetResponse.Builder builder = GetResponse.newBuilder();<a name="line.2519"></a>
-<span class="sourceLineNo">2520</span>      ClientProtos.Get get = request.getGet();<a name="line.2520"></a>
-<span class="sourceLineNo">2521</span>      // An asynchbase client, https://github.com/OpenTSDB/asynchbase, starts by trying to do<a name="line.2521"></a>
-<span class="sourceLineNo">2522</span>      // a get closest before. Throwing the UnknownProtocolException signals it that it needs<a name="line.2522"></a>
-<span class="sourceLineNo">2523</span>      // to switch and do hbase2 protocol (HBase servers do not tell clients what versions<a name="line.2523"></a>
-<span class="sourceLineNo">2524</span>      // they are; its a problem for non-native clients like asynchbase. HBASE-20225.<a name="line.2524"></a>
-<span class="sourceLineNo">2525</span>      if (get.hasClosestRowBefore() &amp;&amp; get.getClosestRowBefore()) {<a name="line.2525"></a>
-<span class="sourceLineNo">2526</span>        throw new UnknownProtocolException("Is this a pre-hbase-1.0.0 or asynchbase client? " +<a name="line.2526"></a>
-<span class="sourceLineNo">2527</span>            "Client is invoking getClosestRowBefore removed in hbase-2.0.0 replaced by " +<a name="line.2527"></a>
-<span class="sourceLineNo">2528</span>            "reverse Scan.");<a name="line.2528"></a>
-<span class="sourceLineNo">2529</span>      }<a name="line.2529"></a>
-<span class="sourceLineNo">2530</span>      Boolean existence = null;<a name="line.2530"></a>
-<span class="sourceLineNo">2531</span>      Result r = null;<a name="line.2531"></a>
-<span class="sourceLineNo">2532</span>      RpcCallContext context = RpcServer.getCurrentCall().orElse(null);<a name="line.2532"></a>
-<span class="sourceLineNo">2533</span>      quota = getRpcQuotaManager().checkQuota(region, OperationQuota.OperationType.GET);<a name="line.2533"></a>
-<span class="sourceLineNo">2534</span><a name="line.2534"></a>
-<span class="sourceLineNo">2535</span>      Get clientGet = ProtobufUtil.toGet(get);<a name="line.2535"></a>
-<span class="sourceLineNo">2536</span>      if (get.getExistenceOnly() &amp;&amp; region.getCoprocessorHost() != null) {<a name="line.2536"></a>
-<span class="sourceLineNo">2537</span>        existence = region.getCoprocessorHost().preExists(clientGet);<a name="line.2537"></a>
-<span class="sourceLineNo">2538</span>      }<a name="line.2538"></a>
-<span class="sourceLineNo">2539</span>      if (existence == null) {<a name="line.2539"></a>
-<span class="sourceLineNo">2540</span>        if (context != null) {<a name="line.2540"></a>
-<span class="sourceLineNo">2541</span>          r = get(clientGet, (region), null, context);<a name="line.2541"></a>
-<span class="sourceLineNo">2542</span>        } else {<a name="line.2542"></a>
-<span class="sourceLineNo">2543</span>          // for test purpose<a name="line.2543"></a>
-<span class="sourceLineNo">2544</span>          r = region.get(clientGet);<a name="line.2544"></a>
-<span class="sourceLineNo">2545</span>        }<a name="line.2545"></a>
-<span class="sourceLineNo">2546</span>        if (get.getExistenceOnly()) {<a name="line.2546"></a>
-<span class="sourceLineNo">2547</span>          boolean exists = r.getExists();<a name="line.2547"></a>
-<span class="sourceLineNo">2548</span>          if (region.getCoprocessorHost() != null) {<a name="line.2548"></a>
-<span class="sourceLineNo">2549</span>            exists = region.getCoprocessorHost().postExists(clientGet, exists);<a name="line.2549"></a>
-<span class="sourceLineNo">2550</span>          }<a name="line.2550"></a>
-<span class="sourceLineNo">2551</span>          existence = exists;<a name="line.2551"></a>
-<span class="sourceLineNo">2552</span>        }<a name="line.2552"></a>
-<span class="sourceLineNo">2553</span>      }<a name="line.2553"></a>
-<span class="sourceLineNo">2554</span>      if (existence != null) {<a name="line.2554"></a>
-<span class="sourceLineNo">2555</span>        ClientProtos.Result pbr =<a name="line.2555"></a>
-<span class="sourceLineNo">2556</span>            ProtobufUtil.toResult(existence, region.getRegionInfo().getReplicaId() != 0);<a name="line.2556"></a>
-<span class="sourceLineNo">2557</span>        builder.setResult(pbr);<a name="line.2557"></a>
-<span class="sourceLineNo">2558</span>      } else if (r != null) {<a name="line.2558"></a>
-<span class="sourceLineNo">2559</span>        ClientProtos.Result pbr;<a name="line.2559"></a>
-<span class="sourceLineNo">2560</span>        if (isClientCellBlockSupport(context) &amp;&amp; controller instanceof HBaseRpcController<a name="line.2560"></a>
-<span class="sourceLineNo">2561</span>            &amp;&amp; VersionInfoUtil.hasMinimumVersion(context.getClientVersionInfo(), 1, 3)) {<a name="line.2561"></a>
-<span class="sourceLineNo">2562</span>          pbr = ProtobufUtil.toResultNoData(r);<a name="line.2562"></a>
-<span class="sourceLineNo">2563</span>          ((HBaseRpcController) controller).setCellScanner(CellUtil.createCellScanner(r<a name="line.2563"></a>
-<span class="sourceLineNo">2564</span>              .rawCells()));<a name="line.2564"></a>
-<span class="sourceLineNo">2565</span>          addSize(context, r, null);<a name="line.2565"></a>
-<span class="sourceLineNo">2566</span>        } else {<a name="line.2566"></a>
-<span class="sourceLineNo">2567</span>          pbr = ProtobufUtil.toResult(r);<a name="line.2567"></a>
-<span class="sourceLineNo">2568</span>        }<a name="line.2568"></a>
-<span class="sourceLineNo">2569</span>        builder.setResult(pbr);<a name="line.2569"></a>
-<span class="sourceLineNo">2570</span>      }<a name="line.2570"></a>
-<span class="sourceLineNo">2571</span>      if (r != null) {<a name="line.2571"></a>
-<span class="sourceLineNo">2572</span>        quota.addGetResult(r);<a name="line.2572"></a>
-<span class="sourceLineNo">2573</span>      }<a name="line.2573"></a>
-<span class="sourceLineNo">2574</span>      return builder.build();<a name="line.2574"></a>
-<span class="sourceLineNo">2575</span>    } catch (IOException ie) {<a name="line.2575"></a>
-<span class="sourceLineNo">2576</span>      throw new ServiceException(ie);<a name="line.2576"></a>
-<span class="sourceLineNo">2577</span>    } finally {<a name="line.2577"></a>
-<span class="sourceLineNo">2578</span>      MetricsRegionServer mrs = regionServer.metricsRegionServer;<a name="line.2578"></a>
-<span class="sourceLineNo">2579</span>      if (mrs != null) {<a name="line.2579"></a>
-<span class="sourceLineNo">2580</span>        TableDescriptor td = region != null? region.getTableDescriptor(): null;<a name="line.2580"></a>
-<span class="sourceLineNo">2581</span>        if (td != null) {<a name="line.2581"></a>
-<span class="sourceLineNo">2582</span>          mrs.updateGet(td.getTableName(), EnvironmentEdgeManager.currentTime() - before);<a name="line.2582"></a>
-<span class="sourceLineNo">2583</span>        }<a name="line.2583"></a>
-<span class="sourceLineNo">2584</span>      }<a name="line.2584"></a>
-<span class="sourceLineNo">2585</span>      if (quota != null) {<a name="line.2585"></a>
-<span class="sourceLineNo">2586</span>        quota.close();<a name="line.2586"></a>
-<span class="sourceLineNo">2587</span>      }<a name="line.2587"></a>
-<span class="sourceLineNo">2588</span>    }<a name="line.2588"></a>
-<span class="sourceLineNo">2589</span>  }<a name="line.2589"></a>
-<span class="sourceLineNo">2590</span><a name="line.2590"></a>
-<span class="sourceLineNo">2591</span>  private Result get(Get get, HRegion region, RegionScannersCloseCallBack closeCallBack,<a name="line.2591"></a>
-<span class="sourceLineNo">2592</span>      RpcCallContext context) throws IOException {<a name="line.2592"></a>
-<span class="sourceLineNo">2593</span>    region.prepareGet(get);<a name="line.2593"></a>
-<span class="sourceLineNo">2594</span>    boolean stale = region.getRegionInfo().getReplicaId() != 0;<a name="line.2594"></a>
-<span class="sourceLineNo">2595</span><a name="line.2595"></a>
-<span class="sourceLineNo">2596</span>    // This method is almost the same as HRegion#get.<a name="line.2596"></a>
-<span class="sourceLineNo">2597</span>    List&lt;Cell&gt; results = new ArrayList&lt;&gt;();<a name="line.2597"></a>
-<span class="sourceLineNo">2598</span>    long before = EnvironmentEdgeManager.currentTime();<a name="line.2598"></a>
-<span class="sourceLineNo">2599</span>    // pre-get CP hook<a name="line.2599"></a>
-<span class="sourceLineNo">2600</span>    if (region.getCoprocessorHost() != null) {<a name="line.2600"></a>
-<span class="sourceLineNo">2601</span>      if (region.getCoprocessorHost().preGet(get, results)) {<a name="line.2601"></a>
-<span class="sourceLineNo">2602</span>        region.metricsUpdateForGet(results, before);<a name="line.2602"></a>
-<span class="sourceLineNo">2603</span>        return Result<a name="line.2603"></a>
-<span class="sourceLineNo">2604</span>            .create(results, get.isCheckExistenceOnly() ? !results.isEmpty() : null, stale);<a name="line.2604"></a>
-<span class="sourceLineNo">2605</span>      }<a name="line.2605"></a>
-<span class="sourceLineNo">2606</span>    }<a name="line.2606"></a>
-<span class="sourceLineNo">2607</span>    Scan scan = new Scan(get);<a name="line.2607"></a>
-<span class="sourceLineNo">2608</span>    if (scan.getLoadColumnFamiliesOnDemandValue() == null) {<a name="line.2608"></a>
-<span class="sourceLineNo">2609</span>      scan.setLoadColumnFamiliesOnDemand(region.isLoadingCfsOnDemandDefault());<a name="line.2609"></a>
-<span class="sourceLineNo">2610</span>    }<a name="line.2610"></a>
-<span class="sourceLineNo">2611</span>    RegionScannerImpl scanner = null;<a name="line.2611"></a>
-<span class="sourceLineNo">2612</span>    try {<a name="line.2612"></a>
-<span class="sourceLineNo">2613</span>      scanner = region.getScanner(scan);<a name="line.2613"></a>
-<span class="sourceLineNo">2614</span>      scanner.next(results);<a name="line.2614"></a>
-<span class="sourceLineNo">2615</span>    } finally {<a name="line.2615"></a>
-<span class="sourceLineNo">2616</span>      if (scanner != null) {<a name="line.2616"></a>
-<span class="sourceLineNo">2617</span>        if (closeCallBack == null) {<a name="line.2617"></a>
-<span class="sourceLineNo">2618</span>          // If there is a context then the scanner can be added to the current<a name="line.2618"></a>
-<span class="sourceLineNo">2619</span>          // RpcCallContext. The rpc callback will take care of closing the<a name="line.2619"></a>
-<span class="sourceLineNo">2620</span>          // scanner, for eg in case<a name="line.2620"></a>
-<span class="sourceLineNo">2621</span>          // of get()<a name="line.2621"></a>
-<span class="sourceLineNo">2622</span>          context.setCallBack(scanner);<a name="line.2622"></a>
-<span class="sourceLineNo">2623</span>        } else {<a name="line.2623"></a>
-<span class="sourceLineNo">2624</span>          // The call is from multi() where the results from the get() are<a name="line.2624"></a>
-<span class="sourceLineNo">2625</span>          // aggregated and then send out to the<a name="line.2625"></a>
-<span class="sourceLineNo">2626</span>          // rpc. The rpccall back will close all such scanners created as part<a name="line.2626"></a>
-<span class="sourceLineNo">2627</span>          // of multi().<a name="line.2627"></a>
-<span class="sourceLineNo">2628</span>          closeCallBack.addScanner(scanner);<a name="line.2628"></a>
-<span class="sourceLineNo">2629</span>        }<a name="line.2629"></a>
-<span class="sourceLineNo">2630</span>      }<a name="line.2630"></a>
-<span class="sourceLineNo">2631</span>    }<a name="line.2631"></a>
-<span class="sourceLineNo">2632</span><a name="line.2632"></a>
-<span class="sourceLineNo">2633</span>    // post-get CP hook<a name="line.2633"></a>
-<span class="sourceLineNo">2634</span>    if (region.getCoprocessorHost() != null) {<a name="line.2634"></a>
-<span class="sourceLineNo">2635</span>      region.getCoprocessorHost().postGet(get, results);<a name="line.2635"></a>
-<span class="sourceLineNo">2636</span>    }<a name="line.2636"></a>
-<span class="sourceLineNo">2637</span>    region.metricsUpdateForGet(results, before);<a name="line.2637"></a>
-<span class="sourceLineNo">2638</span><a name="line.2638"></a>
-<span class="sourceLineNo">2639</span>    return Result.create(results, get.isCheckExistenceOnly() ? !results.isEmpty() : null, stale);<a name="line.2639"></a>
-<span class="sourceLineNo">2640</span>  }<a name="line.2640"></a>
-<span class="sourceLineNo">2641</span><a name="line.2641"></a>
-<span class="sourceLineNo">2642</span>  private void checkBatchSizeAndLogLargeSize(MultiRequest request) {<a name="line.2642"></a>
-<span class="sourceLineNo">2643</span>    int sum = 0;<a name="line.2643"></a>
-<span class="sourceLineNo">2644</span>    String firstRegionName = null;<a name="line.2644"></a>
-<span class="sourceLineNo">2645</span>    for (RegionAction regionAction : request.getRegionActionList()) {<a name="line.2645"></a>
-<span class="sourceLineNo">2646</span>      if (sum == 0) {<a name="line.2646"></a>
-<span class="sourceLineNo">2647</span>        firstRegionName = Bytes.toStringBinary(regionAction.getRegion().getValue().toByteArray());<a name="line.2647"></a>
-<span class="sourceLineNo">2648</span>      }<a name="line.2648"></a>
-<span class="sourceLineNo">2649</span>      sum += regionAction.getActionCount();<a name="line.2649"></a>
-<span class="sourceLineNo">2650</span>    }<a name="line.2650"></a>
-<span class="sourceLineNo">2651</span>    if (sum &gt; rowSizeWarnThreshold) {<a name="line.2651"></a>
-<span class="sourceLineNo">2652</span>      ld.logBatchWarning(firstRegionName, sum, rowSizeWarnThreshold);<a name="line.2652"></a>
-<span class="sourceLineNo">2653</span>    }<a name="line.2653"></a>
-<span class="sourceLineNo">2654</span>  }<a name="line.2654"></a>
-<span class="sourceLineNo">2655</span><a name="line.2655"></a>
-<span class="sourceLineNo">2656</span>  private void failRegionAction(MultiResponse.Builder responseBuilder,<a name="line.2656"></a>
-<span class="sourceLineNo">2657</span>      RegionActionResult.Builder regionActionResultBuilder, RegionAction regionAction,<a name="line.2657"></a>
-<span class="sourceLineNo">2658</span>      CellScanner cellScanner, Throwable error) {<a name="line.2658"></a>
-<span class="sourceLineNo">2659</span>    rpcServer.getMetrics().exception(error);<a name="line.2659"></a>
-<span class="sourceLineNo">2660</span>    regionActionResultBuilder.setException(ResponseConverter.buildException(error));<a name="line.2660"></a>
-<span class="sourceLineNo">2661</span>    responseBuilder.addRegionActionResult(regionActionResultBuilder.build());<a name="line.2661"></a>
-<span class="sourceLineNo">2662</span>    // All Mutations in this RegionAction not executed as we can not see the Region online here<a name="line.2662"></a>
-<span class="sourceLineNo">2663</span>    // in this RS. Will be retried from Client. Skipping all the Cells in CellScanner<a name="line.2663"></a>
-<span class="sourceLineNo">2664</span>    // corresponding to these Mutations.<a name="line.2664"></a>
-<span class="sourceLineNo">2665</span>    if (cellScanner != null) {<a name="line.2665"></a>
-<span class="sourceLineNo">2666</span>      skipCellsForMutations(regionAction.getActionList(), cellScanner);<a name="line.2666"></a>
-<span class="sourceLineNo">2667</span>    }<a name="line.2667"></a>
-<span class="sourceLineNo">2668</span>  }<a name="line.2668"></a>
-<span class="sourceLineNo">2669</span><a name="line.2669"></a>
-<span class="sourceLineNo">2670</span>  private boolean isReplicationRequest(Action action) {<a name="line.2670"></a>
-<span class="sourceLineNo">2671</span>    // replication request can only be put or delete.<a name="line.2671"></a>
-<span class="sourceLineNo">2672</span>    if (!action.hasMutation()) {<a name="line.2672"></a>
-<span class="sourceLineNo">2673</span>      return false;<a name="line.2673"></a>
-<span class="sourceLineNo">2674</span>    }<a name="line.2674"></a>
-<span class="sourceLineNo">2675</span>    MutationProto mutation = action.getMutation();<a name="line.2675"></a>
-<span class="sourceLineNo">2676</span>    MutationType type = mutation.getMutateType();<a name="line.2676"></a>
-<span class="sourceLineNo">2677</span>    if (type != MutationType.PUT &amp;&amp; type != MutationType.DELETE) {<a name="line.2677"></a>
-<span class="sourceLineNo">2678</span>      return false;<a name="line.2678"></a>
-<span class="sourceLineNo">2679</span>    }<a name="line.2679"></a>
-<span class="sourceLineNo">2680</span>    // replication will set a special attribute so we can make use of it to decide whether a request<a name="line.2680"></a>
-<span class="sourceLineNo">2681</span>    // is for replication.<a name="line.2681"></a>
-<span class="sourceLineNo">2682</span>    return mutation.getAttributeList().stream().map(p -&gt; p.getName())<a name="line.2682"></a>
-<span class="sourceLineNo">2683</span>      .filter(n -&gt; n.equals(ReplicationUtils.REPLICATION_ATTR_NAME)).findAny().isPresent();<a name="line.2683"></a>
-<span class="sourceLineNo">2684</span>  }<a name="line.2684"></a>
-<span class="sourceLineNo">2685</span><a name="line.2685"></a>
-<span class="sourceLineNo">2686</span>  /**<a name="line.2686"></a>
-<span class="sourceLineNo">2687</span>   * Execute multiple actions on a table: get, mutate, and/or execCoprocessor<a name="line.2687"></a>
-<span class="sourceLineNo">2688</span>   * @param rpcc the RPC controller<a name="line.2688"></a>
-<span class="sourceLineNo">2689</span>   * @param request the multi request<a name="line.2689"></a>
-<span class="sourceLineNo">2690</span>   * @throws ServiceException<a name="line.2690"></a>
-<span class="sourceLineNo">2691</span>   */<a name="line.2691"></a>
-<span class="sourceLineNo">2692</span>  @Override<a name="line.2692"></a>
-<span class="sourceLineNo">2693</span>  public MultiResponse multi(final RpcController rpcc, final MultiRequest request)<a name="line.2693"></a>
-<span class="sourceLineNo">2694</span>      throws ServiceException {<a name="line.2694"></a>
-<span class="sourceLineNo">2695</span>    try {<a name="line.2695"></a>
-<span class="sourceLineNo">2696</span>      checkOpen();<a name="line.2696"></a>
-<span class="sourceLineNo">2697</span>    } catch (IOException ie) {<a name="line.2697"></a>
-<span class="sourceLineNo">2698</span>      throw new ServiceException(ie);<a name="line.2698"></a>
-<span class="sourceLineNo">2699</span>    }<a name="line.2699"></a>
-<span class="sourceLineNo">2700</span><a name="line.2700"></a>
-<span class="sourceLineNo">2701</span>    checkBatchSizeAndLogLargeSize(request);<a name="line.2701"></a>
+<span class="sourceLineNo">2488</span>    TableName table = region.getRegionInfo().getTable();<a name="line.2488"></a>
+<span class="sourceLineNo">2489</span>    ReplicationSourceService service = regionServer.getReplicationSourceService();<a name="line.2489"></a>
+<span class="sourceLineNo">2490</span>    return service != null &amp;&amp; service.getSyncReplicationPeerInfoProvider()<a name="line.2490"></a>
+<span class="sourceLineNo">2491</span>            .checkState(table, RejectRequestsFromClientStateChecker.get());<a name="line.2491"></a>
+<span class="sourceLineNo">2492</span>  }<a name="line.2492"></a>
+<span class="sourceLineNo">2493</span><a name="line.2493"></a>
+<span class="sourceLineNo">2494</span>  private void rejectIfInStandByState(HRegion region) throws DoNotRetryIOException {<a name="line.2494"></a>
+<span class="sourceLineNo">2495</span>    if (shouldRejectRequestsFromClient(region)) {<a name="line.2495"></a>
+<span class="sourceLineNo">2496</span>      throw new DoNotRetryIOException(<a name="line.2496"></a>
+<span class="sourceLineNo">2497</span>        region.getRegionInfo().getRegionNameAsString() + " is in STANDBY state.");<a name="line.2497"></a>
+<span class="sourceLineNo">2498</span>    }<a name="line.2498"></a>
+<span class="sourceLineNo">2499</span>  }<a name="line.2499"></a>
+<span class="sourceLineNo">2500</span><a name="line.2500"></a>
+<span class="sourceLineNo">2501</span>  /**<a name="line.2501"></a>
+<span class="sourceLineNo">2502</span>   * Get data from a table.<a name="line.2502"></a>
+<span class="sourceLineNo">2503</span>   *<a name="line.2503"></a>
+<span class="sourceLineNo">2504</span>   * @param controller the RPC controller<a name="line.2504"></a>
+<span class="sourceLineNo">2505</span>   * @param request the get request<a name="line.2505"></a>
+<span class="sourceLineNo">2506</span>   * @throws ServiceException<a name="line.2506"></a>
+<span class="sourceLineNo">2507</span>   */<a name="line.2507"></a>
+<span class="sourceLineNo">2508</span>  @Override<a name="line.2508"></a>
+<span class="sourceLineNo">2509</span>  public GetResponse get(final RpcController controller, final GetRequest request)<a name="line.2509"></a>
+<span class="sourceLineNo">2510</span>      throws ServiceException {<a name="line.2510"></a>
+<span class="sourceLineNo">2511</span>    long before = EnvironmentEdgeManager.currentTime();<a name="line.2511"></a>
+<span class="sourceLineNo">2512</span>    OperationQuota quota = null;<a name="line.2512"></a>
+<span class="sourceLineNo">2513</span>    HRegion region = null;<a name="line.2513"></a>
+<span class="sourceLineNo">2514</span>    try {<a name="line.2514"></a>
+<span class="sourceLineNo">2515</span>      checkOpen();<a name="line.2515"></a>
+<span class="sourceLineNo">2516</span>      requestCount.increment();<a name="line.2516"></a>
+<span class="sourceLineNo">2517</span>      rpcGetRequestCount.increment();<a name="line.2517"></a>
+<span class="sourceLineNo">2518</span>      region = getRegion(request.getRegion());<a name="line.2518"></a>
+<span class="sourceLineNo">2519</span>      rejectIfInStandByState(region);<a name="line.2519"></a>
+<span class="sourceLineNo">2520</span><a name="line.2520"></a>
+<span class="sourceLineNo">2521</span>      GetResponse.Builder builder = GetResponse.newBuilder();<a name="line.2521"></a>
+<span class="sourceLineNo">2522</span>      ClientProtos.Get get = request.getGet();<a name="line.2522"></a>
+<span class="sourceLineNo">2523</span>      // An asynchbase client, https://github.com/OpenTSDB/asynchbase, starts by trying to do<a name="line.2523"></a>
+<span class="sourceLineNo">2524</span>      // a get closest before. Throwing the UnknownProtocolException signals it that it needs<a name="line.2524"></a>
+<span class="sourceLineNo">2525</span>      // to switch and do hbase2 protocol (HBase servers do not tell clients what versions<a name="line.2525"></a>
+<span class="sourceLineNo">2526</span>      // they are; its a problem for non-native clients like asynchbase. HBASE-20225.<a name="line.2526"></a>
+<span class="sourceLineNo">2527</span>      if (get.hasClosestRowBefore() &amp;&amp; get.getClosestRowBefore()) {<a name="line.2527"></a>
+<span class="sourceLineNo">2528</span>        throw new UnknownProtocolException("Is this a pre-hbase-1.0.0 or asynchbase client? " +<a name="line.2528"></a>
+<span class="sourceLineNo">2529</span>            "Client is invoking getClosestRowBefore removed in hbase-2.0.0 replaced by " +<a name="line.2529"></a>
+<span class="sourceLineNo">2530</span>            "reverse Scan.");<a name="line.2530"></a>
+<span class="sourceLineNo">2531</span>      }<a name="line.2531"></a>
+<span class="sourceLineNo">2532</span>      Boolean existence = null;<a name="line.2532"></a>
+<span class="sourceLineNo">2533</span>      Result r = null;<a name="line.2533"></a>
+<span class="sourceLineNo">2534</span>      RpcCallContext context = RpcServer.getCurrentCall().orElse(null);<a name="line.2534"></a>
+<span class="sourceLineNo">2535</span>      quota = getRpcQuotaManager().checkQuota(region, OperationQuota.OperationType.GET);<a name="line.2535"></a>
+<span class="sourceLineNo">2536</span><a name="line.2536"></a>
+<span class="sourceLineNo">2537</span>      Get clientGet = ProtobufUtil.toGet(get);<a name="line.2537"></a>
+<span class="sourceLineNo">2538</span>      if (get.getExistenceOnly() &amp;&amp; region.getCoprocessorHost() != null) {<a name="line.2538"></a>
+<span class="sourceLineNo">2539</span>        existence = region.getCoprocessorHost().preExists(clientGet);<a name="line.2539"></a>
+<span class="sourceLineNo">2540</span>      }<a name="line.2540"></a>
+<span class="sourceLineNo">2541</span>      if (existence == null) {<a name="line.2541"></a>
+<span class="sourceLineNo">2542</span>        if (context != null) {<a name="line.2542"></a>
+<span class="sourceLineNo">2543</span>          r = get(clientGet, (region), null, context);<a name="line.2543"></a>
+<span class="sourceLineNo">2544</span>        } else {<a name="line.2544"></a>
+<span class="sourceLineNo">2545</span>          // for test purpose<a name="line.2545"></a>
+<span class="sourceLineNo">2546</span>          r = region.get(clientGet);<a name="line.2546"></a>
+<span class="sourceLineNo">2547</span>        }<a name="line.2547"></a>
+<span class="sourceLineNo">2548</span>        if (get.getExistenceOnly()) {<a name="line.2548"></a>
+<span class="sourceLineNo">2549</span>          boolean exists = r.getExists();<a name="line.2549"></a>
+<span class="sourceLineNo">2550</span>          if (region.getCoprocessorHost() != null) {<a name="line.2550"></a>
+<span class="sourceLineNo">2551</span>            exists = region.getCoprocessorHost().postExists(clientGet, exists);<a name="line.2551"></a>
+<span class="sourceLineNo">2552</span>          }<a name="line.2552"></a>
+<span class="sourceLineNo">2553</span>          existence = exists;<a name="line.2553"></a>
+<span class="sourceLineNo">2554</span>        }<a name="line.2554"></a>
+<span class="sourceLineNo">2555</span>      }<a name="line.2555"></a>
+<span class="sourceLineNo">2556</span>      if (existence != null) {<a name="line.2556"></a>
+<span class="sourceLineNo">2557</span>        ClientProtos.Result pbr =<a name="line.2557"></a>
+<span class="sourceLineNo">2558</span>            ProtobufUtil.toResult(existence, region.getRegionInfo().getReplicaId() != 0);<a name="line.2558"></a>
+<span class="sourceLineNo">2559</span>        builder.setResult(pbr);<a name="line.2559"></a>
+<span class="sourceLineNo">2560</span>      } else if (r != null) {<a name="line.2560"></a>
+<span class="sourceLineNo">2561</span>        ClientProtos.Result pbr;<a name="line.2561"></a>
+<span class="sourceLineNo">2562</span>        if (isClientCellBlockSupport(context) &amp;&amp; controller instanceof HBaseRpcController<a name="line.2562"></a>
+<span class="sourceLineNo">2563</span>            &amp;&amp; VersionInfoUtil.hasMinimumVersion(context.getClientVersionInfo(), 1, 3)) {<a name="line.2563"></a>
+<span class="sourceLineNo">2564</span>          pbr = ProtobufUtil.toResultNoData(r);<a name="line.2564"></a>
+<span class="sourceLineNo">2565</span>          ((HBaseRpcController) controller).setCellScanner(CellUtil.createCellScanner(r<a name="line.2565"></a>
+<span class="sourceLineNo">2566</span>              .rawCells()));<a name="line.2566"></a>
+<span class="sourceLineNo">2567</span>          addSize(context, r, null);<a name="line.2567"></a>
+<span class="sourceLineNo">2568</span>        } else {<a name="line.2568"></a>
+<span class="sourceLineNo">2569</span>          pbr = ProtobufUtil.toResult(r);<a name="line.2569"></a>
+<span class="sourceLineNo">2570</span>        }<a name="line.2570"></a>
+<span class="sourceLineNo">2571</span>        builder.setResult(pbr);<a name="line.2571"></a>
+<span class="sourceLineNo">2572</span>      }<a name="line.2572"></a>
+<span class="sourceLineNo">2573</span>      if (r != null) {<a name="line.2573"></a>
+<span class="sourceLineNo">2574</span>        quota.addGetResult(r);<a name="line.2574"></a>
+<span class="sourceLineNo">2575</span>      }<a name="line.2575"></a>
+<span class="sourceLineNo">2576</span>      return builder.build();<a name="line.2576"></a>
+<span class="sourceLineNo">2577</span>    } catch (IOException ie) {<a name="line.2577"></a>
+<span class="sourceLineNo">2578</span>      throw new ServiceException(ie);<a name="line.2578"></a>
+<span class="sourceLineNo">2579</span>    } finally {<a name="line.2579"></a>
+<span class="sourceLineNo">2580</span>      MetricsRegionServer mrs = regionServer.metricsRegionServer;<a name="line.2580"></a>
+<span class="sourceLineNo">2581</span>      if (mrs != null) {<a name="line.2581"></a>
+<span class="sourceLineNo">2582</span>        TableDescriptor td = region != null? region.getTableDescriptor(): null;<a name="line.2582"></a>
+<span class="sourceLineNo">2583</span>        if (td != null) {<a name="line.2583"></a>
+<span class="sourceLineNo">2584</span>          mrs.updateGet(td.getTableName(), EnvironmentEdgeManager.currentTime() - before);<a name="line.2584"></a>
+<span class="sourceLineNo">2585</span>        }<a name="line.2585"></a>
+<span class="sourceLineNo">2586</span>      }<a name="line.2586"></a>
+<span class="sourceLineNo">2587</span>      if (quota != null) {<a name="line.2587"></a>
+<span class="sourceLineNo">2588</span>        quota.close();<a name="line.2588"></a>
+<span class="sourceLineNo">2589</span>      }<a name="line.2589"></a>
+<span class="sourceLineNo">2590</span>    }<a name="line.2590"></a>
+<span class="sourceLineNo">2591</span>  }<a name="line.2591"></a>
+<span class="sourceLineNo">2592</span><a name="line.2592"></a>
+<span class="sourceLineNo">2593</span>  private Result get(Get get, HRegion region, RegionScannersCloseCallBack closeCallBack,<a name="line.2593"></a>
+<span class="sourceLineNo">2594</span>      RpcCallContext context) throws IOException {<a name="line.2594"></a>
+<span class="sourceLineNo">2595</span>    region.prepareGet(get);<a name="line.2595"></a>
+<span class="sourceLineNo">2596</span>    boolean stale = region.getRegionInfo().getReplicaId() != 0;<a name="line.2596"></a>
+<span class="sourceLineNo">2597</span><a name="line.2597"></a>
+<span class="sourceLineNo">2598</span>    // This method is almost the same as HRegion#get.<a name="line.2598"></a>
+<span class="sourceLineNo">2599</span>    List&lt;Cell&gt; results = new ArrayList&lt;&gt;();<a name="line.2599"></a>
+<span class="sourceLineNo">2600</span>    long before = EnvironmentEdgeManager.currentTime();<a name="line.2600"></a>
+<span class="sourceLineNo">2601</span>    // pre-get CP hook<a name="line.2601"></a>
+<span class="sourceLineNo">2602</span>    if (region.getCoprocessorHost() != null) {<a name="line.2602"></a>
+<span class="sourceLineNo">2603</span>      if (region.getCoprocessorHost().preGet(get, results)) {<a name="line.2603"></a>
+<span class="sourceLineNo">2604</span>        region.metricsUpdateForGet(results, before);<a name="line.2604"></a>
+<span class="sourceLineNo">2605</span>        return Result<a name="line.2605"></a>
+<span class="sourceLineNo">2606</span>            .create(results, get.isCheckExistenceOnly() ? !results.isEmpty() : null, stale);<a name="line.2606"></a>
+<span class="sourceLineNo">2607</span>      }<a name="line.2607"></a>
+<span class="sourceLineNo">2608</span>    }<a name="line.2608"></a>
+<span class="sourceLineNo">2609</span>    Scan scan = new Scan(get);<a name="line.2609"></a>
+<span class="sourceLineNo">2610</span>    if (scan.getLoadColumnFamiliesOnDemandValue() == null) {<a name="line.2610"></a>
+<span class="sourceLineNo">2611</span>      scan.setLoadColumnFamiliesOnDemand(region.isLoadingCfsOnDemandDefault());<a name="line.2611"></a>
+<span class="sourceLineNo">2612</span>    }<a name="line.2612"></a>
+<span class="sourceLineNo">2613</span>    RegionScannerImpl scanner = null;<a name="line.2613"></a>
+<span class="sourceLineNo">2614</span>    try {<a name="line.2614"></a>
+<span class="sourceLineNo">2615</span>      scanner = region.getScanner(scan);<a name="line.2615"></a>
+<span class="sourceLineNo">2616</span>      scanner.next(results);<a name="line.2616"></a>
+<span class="sourceLineNo">2617</span>    } finally {<a name="line.2617"></a>
+<span class="sourceLineNo">2618</span>      if (scanner != null) {<a name="line.2618"></a>
+<span class="sourceLineNo">2619</span>        if (closeCallBack == null) {<a name="line.2619"></a>
+<span class="sourceLineNo">2620</span>          // If there is a context then the scanner can be added to the current<a name="line.2620"></a>
+<span class="sourceLineNo">2621</span>          // RpcCallContext. The rpc callback will take care of closing the<a name="line.2621"></a>
+<span class="sourceLineNo">2622</span>          // scanner, for eg in case<a name="line.2622"></a>
+<span class="sourceLineNo">2623</span>          // of get()<a name="line.2623"></a>
+<span class="sourceLineNo">2624</span>          context.setCallBack(scanner);<a name="line.2624"></a>
+<span class="sourceLineNo">2625</span>        } else {<a name="line.2625"></a>
+<span class="sourceLineNo">2626</span>          // The call is from multi() where the results from the get() are<a name="line.2626"></a>
+<span class="sourceLineNo">2627</span>          // aggregated and then send out to the<a name="line.2627"></a>
+<span class="sourceLineNo">2628</span>          // rpc. The rpccall back will close all such scanners created as part<a name="line.2628"></a>
+<span class="sourceLineNo">2629</span>          // of multi().<a name="line.2629"></a>
+<span class="sourceLineNo">2630</span>          closeCallBack.addScanner(scanner);<a name="line.2630"></a>
+<span class="sourceLineNo">2631</span>        }<a name="line.2631"></a>
+<span class="sourceLineNo">2632</span>      }<a name="line.2632"></a>
+<span class="sourceLineNo">2633</span>    }<a name="line.2633"></a>
+<span class="sourceLineNo">2634</span><a name="line.2634"></a>
+<span class="sourceLineNo">2635</span>    // post-get CP hook<a name="line.2635"></a>
+<span class="sourceLineNo">2636</span>    if (region.getCoprocessorHost() != null) {<a name="line.2636"></a>
+<span class="sourceLineNo">2637</span>      region.getCoprocessorHost().postGet(get, results);<a name="line.2637"></a>
+<span class="sourceLineNo">2638</span>    }<a name="line.2638"></a>
+<span class="sourceLineNo">2639</span>    region.metricsUpdateForGet(results, before);<a name="line.2639"></a>
+<span class="sourceLineNo">2640</span><a name="line.2640"></a>
+<span class="sourceLineNo">2641</span>    return Result.create(results, get.isCheckExistenceOnly() ? !results.isEmpty() : null, stale);<a name="line.2641"></a>
+<span class="sourceLineNo">2642</span>  }<a name="line.2642"></a>
+<span class="sourceLineNo">2643</span><a name="line.2643"></a>
+<span class="sourceLineNo">2644</span>  private void checkBatchSizeAndLogLargeSize(MultiRequest request) {<a name="line.2644"></a>
+<span class="sourceLineNo">2645</span>    int sum = 0;<a name="line.2645"></a>
+<span class="sourceLineNo">2646</span>    String firstRegionName = null;<a name="line.2646"></a>
+<span class="sourceLineNo">2647</span>    for (RegionAction regionAction : request.getRegionActionList()) {<a name="line.2647"></a>
+<span class="sourceLineNo">2648</span>      if (sum == 0) {<a name="line.2648"></a>
+<span class="sourceLineNo">2649</span>        firstRegionName = Bytes.toStringBinary(regionAction.getRegion().getValue().toByteArray());<a name="line.2649"></a>
+<span class="sourceLineNo">2650</span>      }<a name="line.2650"></a>
+<span class="sourceLineNo">2651</span>      sum += regionAction.getActionCount();<a name="line.2651"></a>
+<span class="sourceLineNo">2652</span>    }<a name="line.2652"></a>
+<span class="sourceLineNo">2653</span>    if (sum &gt; rowSizeWarnThreshold) {<a name="line.2653"></a>
+<span class="sourceLineNo">2654</span>      ld.logBatchWarning(firstRegionName, sum, rowSizeWarnThreshold);<a name="line.2654"></a>
+<span class="sourceLineNo">2655</span>    }<a name="line.2655"></a>
+<span class="sourceLineNo">2656</span>  }<a name="line.2656"></a>
+<span class="sourceLineNo">2657</span><a name="line.2657"></a>
+<span class="sourceLineNo">2658</span>  private void failRegionAction(MultiResponse.Builder responseBuilder,<a name="line.2658"></a>
+<span class="sourceLineNo">2659</span>      RegionActionResult.Builder regionActionResultBuilder, RegionAction regionAction,<a name="line.2659"></a>
+<span class="sourceLineNo">2660</span>      CellScanner cellScanner, Throwable error) {<a name="line.2660"></a>
+<span class="sourceLineNo">2661</span>    rpcServer.getMetrics().exception(error);<a name="line.2661"></a>
+<span class="sourceLineNo">2662</span>    regionActionResultBuilder.setException(ResponseConverter.buildException(error));<a name="line.2662"></a>
+<span class="sourceLineNo">2663</span>    responseBuilder.addRegionActionResult(regionActionResultBuilder.build());<a name="line.2663"></a>
+<span class="sourceLineNo">2664</span>    // All Mutations in this RegionAction not executed as we can not see the Region online here<a name="line.2664"></a>
+<span class="sourceLineNo">2665</span>    // in this RS. Will be retried from Client. Skipping all the Cells in CellScanner<a name="line.2665"></a>
+<span class="sourceLineNo">2666</span>    // corresponding to these Mutations.<a name="line.2666"></a>
+<span class="sourceLineNo">2667</span>    if (cellScanner != null) {<a name="line.2667"></a>
+<span class="sourceLineNo">2668</span>      skipCellsForMutations(regionAction.getActionList(), cellScanner);<a name="line.2668"></a>
+<span class="sourceLineNo">2669</span>    }<a name="line.2669"></a>
+<span class="sourceLineNo">2670</span>  }<a name="line.2670"></a>
+<span class="sourceLineNo">2671</span><a name="line.2671"></a>
+<span class="sourceLineNo">2672</span>  private boolean isReplicationRequest(Action action) {<a name="line.2672"></a>
+<span class="sourceLineNo">2673</span>    // replication request can only be put or delete.<a name="line.2673"></a>
+<span class="sourceLineNo">2674</span>    if (!action.hasMutation()) {<a name="line.2674"></a>
+<span class="sourceLineNo">2675</span>      return false;<a name="line.2675"></a>
+<span class="sourceLineNo">2676</span>    }<a name="line.2676"></a>
+<span class="sourceLineNo">2677</span>    MutationProto mutation = action.getMutation();<a name="line.2677"></a>
+<span class="sourceLineNo">2678</span>    MutationType type = mutation.getMutateType();<a name="line.2678"></a>
+<span class="sourceLineNo">2679</span>    if (type != MutationType.PUT &amp;&amp; type != MutationType.DELETE) {<a name="line.2679"></a>
+<span class="sourceLineNo">2680</span>      return false;<a name="line.2680"></a>
+<span class="sourceLineNo">2681</span>    }<a name="line.2681"></a>
+<span class="sourceLineNo">2682</span>    // replication will set a special attribute so we can make use of it to decide whether a request<a name="line.2682"></a>
+<span class="sourceLineNo">2683</span>    // is for replication.<a name="line.2683"></a>
+<span class="sourceLineNo">2684</span>    return mutation.getAttributeList().stream().map(p -&gt; p.getName())<a name="line.2684"></a>
+<span class="sourceLineNo">2685</span>      .filter(n -&gt; n.equals(ReplicationUtils.REPLICATION_ATTR_NAME)).findAny().isPresent();<a name="line.2685"></a>
+<span class="sourceLineNo">2686</span>  }<a name="line.2686"></a>
+<span class="sourceLineNo">2687</span><a name="line.2687"></a>
+<span class="sourceLineNo">2688</span>  /**<a name="line.2688"></a>
+<span class="sourceLineNo">2689</span>   * Execute multiple actions on a table: get, mutate, and/or execCoprocessor<a name="line.2689"></a>
+<span class="sourceLineNo">2690</span>   * @param rpcc the RPC controller<a name="line.2690"></a>
+<span class="sourceLineNo">2691</span>   * @param request the multi request<a name="line.2691"></a>
+<span class="sourceLineNo">2692</span>   * @throws ServiceException<a name="line.2692"></a>
+<span class="sourceLineNo">2693</span>   */<a name="line.2693"></a>
+<span class="sourceLineNo">2694</span>  @Override<a name="line.2694"></a>
+<span class="sourceLineNo">2695</span>  public MultiResponse multi(final RpcController rpcc, final MultiRequest request)<a name="line.2695"></a>
+<span class="sourceLineNo">2696</span>      throws ServiceException {<a name="line.2696"></a>
+<span class="sourceLineNo">2697</span>    try {<a name="line.2697"></a>
+<span class="sourceLineNo">2698</span>      checkOpen();<a name="line.2698"></a>
+<span class="sourceLineNo">2699</span>    } catch (IOException ie) {<a name="line.2699"></a>
+<span class="sourceLineNo">2700</span>      throw new ServiceException(ie);<a name="line.2700"></a>
+<span class="sourceLineNo">2701</span>    }<a name="line.2701"></a>
 <span class="sourceLineNo">2702</span><a name="line.2702"></a>
-<span class="sourceLineNo">2703</span>    // rpc controller is how we bring in data via the back door;  it is unprotobuf'ed data.<a name="line.2703"></a>
-<span class="sourceLineNo">2704</span>    // It is also the conduit via which we pass back data.<a name="line.2704"></a>
-<span class="sourceLineNo">2705</span>    HBaseRpcController controller = (HBaseRpcController)rpcc;<a name="line.2705"></a>
-<span class="sourceLineNo">2706</span>    CellScanner cellScanner = controller != null ? controller.cellScanner(): null;<a name="line.2706"></a>
-<span class="sourceLineNo">2707</span>    if (controller != null) {<a name="line.2707"></a>
-<span class="sourceLineNo">2708</span>      controller.setCellScanner(null);<a name="line.2708"></a>
-<span class="sourceLineNo">2709</span>    }<a name="line.2709"></a>
-<span class="sourceLineNo">2710</span><a name="line.2710"></a>
-<span class="sourceLineNo">2711</span>    long nonceGroup = request.hasNonceGroup() ? request.getNonceGroup() : HConstants.NO_NONCE;<a name="line.2711"></a>
+<span class="sourceLineNo">2703</span>    checkBatchSizeAndLogLargeSize(request);<a name="line.2703"></a>
+<span class="sourceLineNo">2704</span><a name="line.2704"></a>
+<span class="sourceLineNo">2705</span>    // rpc controller is how we bring in data via the back door;  it is unprotobuf'ed data.<a name="line.2705"></a>
+<span class="sourceLineNo">2706</span>    // It is also the conduit via which we pass back data.<a name="line.2706"></a>
+<span class="sourceLineNo">2707</span>    HBaseRpcController controller = (HBaseRpcController)rpcc;<a name="line.2707"></a>
+<span class="sourceLineNo">2708</span>    CellScanner cellScanner = controller != null ? controller.cellScanner(): null;<a name="line.2708"></a>
+<span class="sourceLineNo">2709</span>    if (controller != null) {<a name="line.2709"></a>
+<span class="sourceLineNo">2710</span>      controller.setCellScanner(null);<a name="line.2710"></a>
+<span class="sourceLineNo">2711</span>    }<a name="line.2711"></a>
 <span class="sourceLineNo">2712</span><a name="line.2712"></a>
-<span class="sourceLineNo">2713</span>    // this will contain all the cells that we need to return. It's created later, if needed.<a name="line.2713"></a>
-<span class="sourceLineNo">2714</span>    List&lt;CellScannable&gt; cellsToReturn = null;<a name="line.2714"></a>
-<span class="sourceLineNo">2715</span>    MultiResponse.Builder responseBuilder = MultiResponse.newBuilder();<a name="line.2715"></a>
-<span class="sourceLineNo">2716</span>    RegionActionResult.Builder regionActionResultBuilder = RegionActionResult.newBuilder();<a name="line.2716"></a>
-<span class="sourceLineNo">2717</span>    Boolean processed = null;<a name="line.2717"></a>
-<span class="sourceLineNo">2718</span>    RegionScannersCloseCallBack closeCallBack = null;<a name="line.2718"></a>
-<span class="sourceLineNo">2719</span>    RpcCallContext context = RpcServer.getCurrentCall().orElse(null);<a name="line.2719"></a>
-<span class="sourceLineNo">2720</span>    this.rpcMultiRequestCount.increment();<a name="line.2720"></a>
-<span class="sourceLineNo">2721</span>    this.requestCount.increment();<a name="line.2721"></a>
-<span class="sourceLineNo">2722</span>    Map&lt;RegionSpecifier, ClientProtos.RegionLoadStats&gt; regionStats = new HashMap&lt;&gt;(request<a name="line.2722"></a>
-<span class="sourceLineNo">2723</span>      .getRegionActionCount());<a name="line.2723"></a>
-<span class="sourceLineNo">2724</span>    ActivePolicyEnforcement spaceQuotaEnforcement = getSpaceQuotaManager().getActiveEnforcements();<a name="line.2724"></a>
-<span class="sourceLineNo">2725</span>    for (RegionAction regionAction : request.getRegionActionList()) {<a name="line.2725"></a>
-<span class="sourceLineNo">2726</span>      OperationQuota quota;<a name="line.2726"></a>
-<span class="sourceLineNo">2727</span>      HRegion region;<a name="line.2727"></a>
-<span class="sourceLineNo">2728</span>      regionActionResultBuilder.clear();<a name="line.2728"></a>
-<span class="sourceLineNo">2729</span>      RegionSpecifier regionSpecifier = regionAction.getRegion();<a name="line.2729"></a>
-<span class="sourceLineNo">2730</span>      try {<a name="line.2730"></a>
-<span class="sourceLineNo">2731</span>        region = getRegion(regionSpecifier);<a name="line.2731"></a>
-<span class="sourceLineNo">2732</span>        quota = getRpcQuotaManager().checkQuota(region, regionAction.getActionList());<a name="line.2732"></a>
-<span class="sourceLineNo">2733</span>      } catch (IOException e) {<a name="line.2733"></a>
-<span class="sourceLineNo">2734</span>        failRegionAction(responseBuilder, regionActionResultBuilder, regionAction, cellScanner, e);<a name="line.2734"></a>
-<span class="sourceLineNo">2735</span>        continue;  // For this region it's a failure.<a name="line.2735"></a>
-<span class="sourceLineNo">2736</span>      }<a name="line.2736"></a>
-<span class="sourceLineNo">2737</span>      boolean rejectIfFromClient = shouldRejectRequestsFromClient(region);<a name="line.2737"></a>
-<span class="sourceLineNo">2738</span>      if (regionAction.hasAtomic() &amp;&amp; regionAction.getAtomic()) {<a name="line.2738"></a>
-<span class="sourceLineNo">2739</span>        // We only allow replication in standby state and it will not set the atomic flag.<a name="line.2739"></a>
-<span class="sourceLineNo">2740</span>        if (rejectIfFromClient) {<a name="line.2740"></a>
-<span class="sourceLineNo">2741</span>          failRegionAction(responseBuilder, regionActionResultBuilder, regionAction, cellScanner,<a name="line.2741"></a>
-<span class="sourceLineNo">2742</span>            new DoNotRetryIOException(<a name="line.2742"></a>
-<span class="sourceLineNo">2743</span>              region.getRegionInfo().getRegionNameAsString() + " is in STANDBY state"));<a name="line.2743"></a>
-<span class="sourceLineNo">2744</span>          quota.close();<a name="line.2744"></a>
-<span class="sourceLineNo">2745</span>          continue;<a name="line.2745"></a>
-<span class="sourceLineNo">2746</span>        }<a name="line.2746"></a>
-<span class="sourceLineNo">2747</span>        // How does this call happen?  It may need some work to play well w/ the surroundings.<a name="line.2747"></a>
-<span class="sourceLineNo">2748</span>        // Need to return an item per Action along w/ Action index.  TODO.<a name="line.2748"></a>
-<span class="sourceLineNo">2749</span>        try {<a name="line.2749"></a>
-<span class="sourceLineNo">2750</span>          if (request.hasCondition()) {<a name="line.2750"></a>
-<span class="sourceLineNo">2751</span>            Condition condition = request.getCondition();<a name="line.2751"></a>
-<span class="sourceLineNo">2752</span>            byte[] row = condition.getRow().toByteArray();<a name="line.2752"></a>
-<span class="sourceLineNo">2753</span>            byte[] family = condition.getFamily().toByteArray();<a name="line.2753"></a>
-<span class="sourceLineNo">2754</span>            byte[] qualifier = condition.getQualifier().toByteArray();<a name="line.2754"></a>
-<span class="sourceLineNo">2755</span>            CompareOperator op =<a name="line.2755"></a>
-<span class="sourceLineNo">2756</span>              CompareOperator.valueOf(condition.getCompareType().name());<a name="line.2756"></a>
-<span class="sourceLineNo">2757</span>            ByteArrayComparable comparator =<a name="line.2757"></a>
-<span class="sourceLineNo">2758</span>                ProtobufUtil.toComparator(condition.getComparator());<a name="line.2758"></a>
-<span class="sourceLineNo">2759</span>            TimeRange timeRange = condition.hasTimeRange() ?<a name="line.2759"></a>
-<span class="sourceLineNo">2760</span>              ProtobufUtil.toTimeRange(condition.getTimeRange()) :<a name="line.2760"></a>
-<span class="sourceLineNo">2761</span>              TimeRange.allTime();<a name="line.2761"></a>
-<span class="sourceLineNo">2762</span>            processed =<a name="line.2762"></a>
-<span class="sourceLineNo">2763</span>              checkAndRowMutate(region, regionAction.getActionList(), cellScanner, row, family,<a name="line.2763"></a>
-<span class="sourceLineNo">2764</span>                qualifier, op, comparator, timeRange, regionActionResultBuilder,<a name="line.2764"></a>
-<span class="sourceLineNo">2765</span>                spaceQuotaEnforcement);<a name="line.2765"></a>
-<span class="sourceLineNo">2766</span>          } else {<a name="line.2766"></a>
-<span class="sourceLineNo">2767</span>            doAtomicBatchOp(regionActionResultBuilder, region, quota, regionAction.getActionList(),<a name="line.2767"></a>
-<span class="sourceLineNo">2768</span>              cellScanner, spaceQuotaEnforcement);<a name="line.2768"></a>
-<span class="sourceLineNo">2769</span>            processed = Boolean.TRUE;<a name="line.2769"></a>
-<span class="sourceLineNo">2770</span>          }<a name="line.2770"></a>
-<span class="sourceLineNo">2771</span>        } catch (IOException e) {<a name="line.2771"></a>
-<span class="sourceLineNo">2772</span>          rpcServer.getMetrics().exception(e);<a name="line.2772"></a>
-<span class="sourceLineNo">2773</span>          // As it's atomic, we may expect it's a global failure.<a name="line.2773"></a>
-<span class="sourceLineNo">2774</span>          regionActionResultBuilder.setException(ResponseConverter.buildException(e));<a name="line.2774"></a>
-<span class="sourceLineNo">2775</span>        }<a name="line.2775"></a>
-<span class="sourceLineNo">2776</span>      } else {<a name="line.2776"></a>
-<span class="sourceLineNo">2777</span>        if (rejectIfFromClient &amp;&amp; regionAction.getActionCount() &gt; 0 &amp;&amp;<a name="line.2777"></a>
-<span class="sourceLineNo">2778</span>          !isReplicationRequest(regionAction.getAction(0))) {<a name="line.2778"></a>
-<span class="sourceLineNo">2779</span>          // fail if it is not a replication request<a name="line.2779"></a>
-<span class="sourceLineNo">2780</span>          failRegionAction(responseBuilder, regionActionResultBuilder, regionAction, cellScanner,<a name="line.2780"></a>
-<span class="sourceLineNo">2781</span>            new DoNotRetryIOException(<a name="line.2781"></a>
-<span class="sourceLineNo">2782</span>              region.getRegionInfo().getRegionNameAsString() + " is in STANDBY state"));<a name="line.2782"></a>
-<span class="sourceLineNo">2783</span>          quota.close();<a name="line.2783"></a>
-<span class="sourceLineNo">2784</span>          continue;<a name="line.2784"></a>
-<span class="sourceLineNo">2785</span>        }<a name="line.2785"></a>
-<span class="sourceLineNo">2786</span>        // doNonAtomicRegionMutation manages the exception internally<a name="line.2786"></a>
-<span class="sourceLineNo">2787</span>        if (context != null &amp;&amp; closeCallBack == null) {<a name="line.2787"></a>
-<span class="sourceLineNo">2788</span>          // An RpcCallBack that creates a list of scanners that needs to perform callBack<a name="line.2788"></a>
-<span class="sourceLineNo">2789</span>          // operation on completion of multiGets.<a name="line.2789"></a>
-<span class="sourceLineNo">2790</span>          // Set this only once<a name="line.2790"></a>
-<span class="sourceLineNo">2791</span>          closeCallBack = new RegionScannersCloseCallBack();<a name="line.2791"></a>
-<span class="sourceLineNo">2792</span>          context.setCallBack(closeCallBack);<a name="line.2792"></a>
-<span class="sourceLineNo">2793</span>        }<a name="line.2793"></a>
-<span class="sourceLineNo">2794</span>        cellsToReturn = doNonAtomicRegionMutation(region, quota, regionAction, cellScanner,<a name="line.2794"></a>
-<span class="sourceLineNo">2795</span>            regionActionResultBuilder, cellsToReturn, nonceGroup, closeCallBack, context,<a name="line.2795"></a>
-<span class="sourceLineNo">2796</span>            spaceQuotaEnforcement);<a name="line.2796"></a>
-<span class="sourceLineNo">2797</span>      }<a name="line.2797"></a>
-<span class="sourceLineNo">2798</span>      responseBuilder.addRegionActionResult(regionActionResultBuilder.build());<a name="line.2798"></a>
-<span class="sourceLineNo">2799</span>      quota.close();<a name="line.2799"></a>
-<span class="sourceLineNo">2800</span>      ClientProtos.RegionLoadStats regionLoadStats = region.getLoadStatistics();<a name="line.2800"></a>
-<span class="sourceLineNo">2801</span>      if (regionLoadStats != null) {<a name="line.2801"></a>
-<span class="sourceLineNo">2802</span>        regionStats.put(regionSpecifier, regionLoadStats);<a name="line.2802"></a>
-<span class="sourceLineNo">2803</span>      }<a name="line.2803"></a>
-<span class="sourceLineNo">2804</span>    }<a name="line.2804"></a>
-<span class="sourceLineNo">2805</span>    // Load the controller with the Cells to return.<a name="line.2805"></a>
-<span class="sourceLineNo">2806</span>    if (cellsToReturn != null &amp;&amp; !cellsToReturn.isEmpty() &amp;&amp; controller != null) {<a name="line.2806"></a>
-<span class="sourceLineNo">2807</span>      controller.setCellScanner(CellUtil.createCellScanner(cellsToReturn));<a name="line.2807"></a>
-<span class="sourceLineNo">2808</span>    }<a name="line.2808"></a>
-<span class="sourceLineNo">2809</span><a name="line.2809"></a>
-<span class="sourceLineNo">2810</span>    if (processed != null) {<a name="line.2810"></a>
-<span class="sourceLineNo">2811</span>      responseBuilder.setProcessed(processed);<a name="line.2811"></a>
-<span class="sourceLineNo">2812</span>    }<a name="line.2812"></a>
-<span class="sourceLineNo">2813</span><a name="line.2813"></a>
-<span class="sourceLineNo">2814</span>    MultiRegionLoadStats.Builder builder = MultiRegionLoadStats.newBuilder();<a name="line.2814"></a>
-<span class="sourceLineNo">2815</span>    for(Entry&lt;RegionSpecifier, ClientProtos.RegionLoadStats&gt; stat: regionStats.entrySet()){<a name="line.2815"></a>
-<span class="sourceLineNo">2816</span>      builder.addRegion(stat.getKey());<a name="line.2816"></a>
-<span class="sourceLineNo">2817</span>      builder.addStat(stat.getValue());<a name="line.2817"></a>
-<span class="sourceLineNo">2818</span>    }<a name="line.2818"></a>
-<span class="sourceLineNo">2819</span>    responseBuilder.setRegionStatistics(builder);<a name="line.2819"></a>
-<span class="sourceLineNo">2820</span>    return responseBuilder.build();<a name="line.2820"></a>
-<span class="sourceLineNo">2821</span>  }<a name="line.2821"></a>
-<span class="sourceLineNo">2822</span><a name="line.2822"></a>
-<span class="sourceLineNo">2823</span>  private void skipCellsForMutations(List&lt;Action&gt; actions, CellScanner cellScanner) {<a name="line.2823"></a>
-<span class="sourceLineNo">2824</span>    if (cellScanner == null) {<a name="line.2824"></a>
-<span class="sourceLineNo">2825</span>      return;<a name="line.2825"></a>
-<span class="sourceLineNo">2826</span>    }<a name="line.2826"></a>
-<span class="sourceLineNo">2827</span>    for (Action action : actions) {<a name="line.2827"></a>
-<span class="sourceLineNo">2828</span>      skipCellsForMutation(action, cellScanner);<a name="line.2828"></a>
-<span class="sourceLineNo">2829</span>    }<a name="line.2829"></a>
-<span class="sourceLineNo">2830</span>  }<a name="line.2830"></a>
-<span class="sourceLineNo">2831</span><a name="line.2831"></a>
-<span class="sourceLineNo">2832</span>  private void skipCellsForMutation(Action action, CellScanner cellScanner) {<a name="line.2832"></a>
-<span class="sourceLineNo">2833</span>    if (cellScanner == null) {<a name="line.2833"></a>
-<span class="sourceLineNo">2834</span>      return;<a name="line.2834"></a>
-<span class="sourceLineNo">2835</span>    }<a name="line.2835"></a>
-<span class="sourceLineNo">2836</span>    try {<a name="line.2836"></a>
-<span class="sourceLineNo">2837</span>      if (action.hasMutation()) {<a name="line.2837"></a>
-<span class="sourceLineNo">2838</span>        MutationProto m = action.getMutation();<a name="line.2838"></a>
-<span class="sourceLineNo">2839</span>        if (m.hasAssociatedCellCount()) {<a name="line.2839"></a>
-<span class="sourceLineNo">2840</span>          for (int i = 0; i &lt; m.getAssociatedCellCount(); i++) {<a name="line.2840"></a>
-<span class="sourceLineNo">2841</span>            cellScanner.advance();<a name="line.2841"></a>
-<span class="sourceLineNo">2842</span>          }<a name="line.2842"></a>
-<span class="sourceLineNo">2843</span>        }<a name="line.2843"></a>
-<span class="sourceLineNo">2844</span>      }<a name="line.2844"></a>
-<span class="sourceLineNo">2845</span>    } catch (IOException e) {<a name="line.2845"></a>
-<span class="sourceLineNo">2846</span>      // No need to handle these Individual Muatation level issue. Any way this entire RegionAction<a name="line.2846"></a>
-<span class="sourceLineNo">2847</span>      // marked as failed as we could not see the Region here. At client side the top level<a name="line.2847"></a>
-<span class="sourceLineNo">2848</span>      // RegionAction exception will be considered first.<a name="line.2848"></a>
-<span class="sourceLineNo">2849</span>      LOG.error("Error while skipping Cells in CellScanner for invalid Region Mutations", e);<a name="line.2849"></a>
-<span class="sourceLineNo">2850</span>    }<a name="line.2850"></a>
-<span class="sourceLineNo">2851</span>  }<a name="line.2851"></a>
-<span class="sourceLineNo">2852</span><a name="line.2852"></a>
-<span class="sourceLineNo">2853</span>  /**<a name="line.2853"></a>
-<span class="sourceLineNo">2854</span>   * Mutate data in a table.<a name="line.2854"></a>
-<span class="sourceLineNo">2855</span>   *<a name="line.2855"></a>
-<span class="sourceLineNo">2856</span>   * @param rpcc the RPC controller<a name="line.2856"></a>
-<span class="sourceLineNo">2857</span>   * @param request the mutate request<a name="line.2857"></a>
-<span class="sourceLineNo">2858</span>   */<a name="line.2858"></a>
-<span class="sourceLineNo">2859</span>  @Override<a name="line.2859"></a>
-<span class="sourceLineNo">2860</span>  public MutateResponse mutate(final RpcController rpcc, final MutateRequest request)<a name="line.2860"></a>
-<span class="sourceLineNo">2861</span>      throws ServiceException {<a name="line.2861"></a>
-<span class="sourceLineNo">2862</span>    // rpc controller is how we bring in data via the back door;  it is unprotobuf'ed data.<a name="line.2862"></a>
-<span class="sourceLineNo">2863</span>    // It is also the conduit via which we pass back data.<a name="line.2863"></a>
-<span class="sourceLineNo">2864</span>    HBaseRpcController controller = (HBaseRpcController)rpcc;<a name="line.2864"></a>
-<span class="sourceLineNo">2865</span>    CellScanner cellScanner = controller != null ? controller.cellScanner() : null;<a name="line.2865"></a>
-<span class="sourceLineNo">2866</span>    OperationQuota quota = null;<a name="line.2866"></a>
-<span class="sourceLineNo">2867</span>    RpcCallContext context = RpcServer.getCurrentCall().orElse(null);<a name="line.2867"></a>
-<span class="sourceLineNo">2868</span>    ActivePolicyEnforcement spaceQuotaEnforcement = null;<a name="line.2868"></a>
-<span class="sourceLineNo">2869</span>    MutationType type = null;<a name="line.2869"></a>
-<span class="sourceLineNo">2870</span>    HRegion region = null;<a name="line.2870"></a>
-<span class="sourceLineNo">2871</span>    long before = EnvironmentEdgeManager.currentTime();<a name="line.2871"></a>
-<span class="sourceLineNo">2872</span>    // Clear scanner so we are not holding on to reference across call.<a name="line.2872"></a>
-<span class="sourceLineNo">2873</span>    if (controller != null) {<a name="line.2873"></a>
-<span class="sourceLineNo">2874</span>      controller.setCellScanner(null);<a name="line.2874"></a>
-<span class="sourceLineNo">2875</span>    }<a name="line.2875"></a>
-<span class="sourceLineNo">2876</span>    try {<a name="line.2876"></a>
-<span class="sourceLineNo">2877</span>      checkOpen();<a name="line.2877"></a>
-<span class="sourceLineNo">2878</span>      requestCount.increment();<a name="line.2878"></a>
-<span class="sourceLineNo">2879</span>      rpcMutateRequestCount.increment();<a name="line.2879"></a>
-<span class="sourceLineNo">2880</span>      region = getRegion(request.getRegion());<a name="line.2880"></a>
-<span class="sourceLineNo">2881</span>      rejectIfInStandByState(region);<a name="line.2881"></a>
-<span class="sourceLineNo">2882</span>      MutateResponse.Builder builder = MutateResponse.newBuilder();<a name="line.2882"></a>
-<span class="sourceLineNo">2883</span>      MutationProto mutation = request.getMutation();<a name="line.2883"></a>
-<span class="sourceLineNo">2884</span>      if (!region.getRegionInfo().isMetaRegion()) {<a name="line.2884"></a>
-<span class="sourceLineNo">2885</span>        regionServer.cacheFlusher.reclaimMemStoreMemory();<a name="line.2885"></a>
-<span class="sourceLineNo">2886</span>      }<a name="line.2886"></a>
-<span class="sourceLineNo">2887</span>      long nonceGroup = request.hasNonceGroup() ? request.getNonceGroup() : HConstants.NO_NONCE;<a name="line.2887"></a>
-<span class="sourceLineNo">2888</span>      Result r = null;<a name="line.2888"></a>
-<span class="sourceLineNo">2889</span>      Boolean processed = null;<a name="line.2889"></a>
-<span class="sourceLineNo">2890</span>      type = mutation.getMutateType();<a name="line.2890"></a>
-<span class="sourceLineNo">2891</span><a name="line.2891"></a>
-<span class="sourceLineNo">2892</span>      quota = getRpcQuotaManager().checkQuota(region, OperationQuota.OperationType.MUTATE);<a name="line.2892"></a>
-<span class="sourceLineNo">2893</span>      spaceQuotaEnforcement = getSpaceQuotaManager().getActiveEnforcements();<a name="line.2893"></a>
-<span class="sourceLineNo">2894</span><a name="line.2894"></a>
-<span class="sourceLineNo">2895</span>      switch (type) {<a name="line.2895"></a>
-<span class="sourceLineNo">2896</span>        case APPEND:<a name="line.2896"></a>
-<span class="sourceLineNo">2897</span>          // TODO: this doesn't actually check anything.<a name="line.2897"></a>
-<span class="sourceLineNo">2898</span>          r = append(region, quota, mutation, cellScanner, nonceGroup, spaceQuotaEnforcement);<a name="line.2898"></a>
-<span class="sourceLineNo">2899</span>          break;<a name="line.2899"></a>
-<span class="sourceLineNo">2900</span>        case INCREMENT:<a name="line.2900"></a>
-<span class="sourceLineNo">2901</span>          // TODO: this doesn't actually check anything.<a name="line.2901"></a>
-<span class="sourceLineNo">2902</span>          r = increment(region, quota, mutation, cellScanner, nonceGroup, spaceQuotaEnforcement);<a name="line.2902"></a>
-<span class="sourceLineNo">2903</span>          break;<a name="line.2903"></a>
-<span class="sourceLineNo">2904</span>        case PUT:<a name="line.2904"></a>
-<span class="sourceLineNo">2905</span>          Put put = ProtobufUtil.toPut(mutation, cellScanner);<a name="line.2905"></a>
-<span class="sourceLineNo">2906</span>          checkCellSizeLimit(region, put);<a name="line.2906"></a>
-<span class="sourceLineNo">2907</span>          // Throws an exception when violated<a name="line.2907"></a>
-<span class="sourceLineNo">2908</span>          spaceQuotaEnforcement.getPolicyEnforcement(region).check(put);<a name="line.2908"></a>
-<span class="sourceLineNo">2909</span>          quota.addMutation(put);<a name="line.2909"></a>
-<span class="sourceLineNo">2910</span>          if (request.hasCondition()) {<a name="line.2910"></a>
-<span class="sourceLineNo">2911</span>            Condition condition = request.getCondition();<a name="line.2911"></a>
-<span class="sourceLineNo">2912</span>            byte[] row = condition.getRow().toByteArray();<a name="line.2912"></a>
-<span class="sourceLineNo">2913</span>            byte[] family = condition.getFamily().toByteArray();<a name="line.2913"></a>
-<span class="sourceLineNo">2914</span>            byte[] qualifier = condition.getQualifier().toByteArray();<a name="line.2914"></a>
-<span class="sourceLineNo">2915</span>            CompareOperator compareOp =<a name="line.2915"></a>
-<span class="sourceLineNo">2916</span>              CompareOperator.valueOf(condition.getCompareType().name());<a name="line.2916"></a>
-<span class="sourceLineNo">2917</span>            ByteArrayComparable comparator = ProtobufUtil.toComparator(condition.getComparator());<a name="line.2917"></a>
-<span class="sourceLineNo">2918</span>            TimeRange timeRange = condition.hasTimeRange() ?<a name="line.2918"></a>
-<span class="sourceLineNo">2919</span>              ProtobufUtil.toTimeRange(condition.getTimeRange()) :<a name="line.2919"></a>
-<span class="sourceLineNo">2920</span>              TimeRange.allTime();<a name="line.2920"></a>
-<span class="sourceLineNo">2921</span>            if (region.getCoprocessorHost() != null) {<a name="line.2921"></a>
-<span class="sourceLineNo">2922</span>              processed = region.getCoprocessorHost().preCheckAndPut(row, family, qualifier,<a name="line.2922"></a>
-<span class="sourceLineNo">2923</span>                  compareOp, comparator, put);<a name="line.2923"></a>
-<span class="sourceLineNo">2924</span>            }<a name="line.2924"></a>
-<span class="sourceLineNo">2925</span>            if (processed == null) {<a name="line.2925"></a>
-<span class="sourceLineNo">2926</span>              boolean result = region.checkAndMutate(row, family,<a name="line.2926"></a>
-<span class="sourceLineNo">2927</span>                qualifier, compareOp, comparator, timeRange, put);<a name="line.2927"></a>
-<span class="sourceLineNo">2928</span>              if (region.getCoprocessorHost() != null) {<a name="line.2928"></a>
-<span class="sourceLineNo">2929</span>                result = region.getCoprocessorHost().postCheckAndPut(row, family,<a name="line.2929"></a>
-<span class="sourceLineNo">2930</span>                  qualifier, compareOp, comparator, put, result);<a name="line.2930"></a>
-<span class="sourceLineNo">2931</span>              }<a name="line.2931"></a>
-<span class="sourceLineNo">2932</span>              processed = result;<a name="line.2932"></a>
-<span class="sourceLineNo">2933</span>            }<a name="line.2933"></a>
-<span class="sourceLineNo">2934</span>          } else {<a name="line.2934"></a>
-<span class="sourceLineNo">2935</span>            region.put(put);<a name="line.2935"></a>
-<span class="sourceLineNo">2936</span>            processed = Boolean.TRUE;<a name="line.2936"></a>
-<span class="sourceLineNo">2937</span>          }<a name="line.2937"></a>
-<span class="sourceLineNo">2938</span>          break;<a name="line.2938"></a>
-<span class="sourceLineNo">2939</span>        case DELETE:<a name="line.2939"></a>
-<span class="sourceLineNo">2940</span>          Delete delete = ProtobufUtil.toDelete(mutation, cellScanner);<a name="line.2940"></a>
-<span class="sourceLineNo">2941</span>          checkCellSizeLimit(region, delete);<a name="line.2941"></a>
-<span class="sourceLineNo">2942</span>          spaceQuotaEnforcement.getPolicyEnforcement(region).check(delete);<a name="line.2942"></a>
-<span class="sourceLineNo">2943</span>          quota.addMutation(delete);<a name="line.2943"></a>
-<span class="sourceLineNo">2944</span>          if (request.hasCondition()) {<a name="line.2944"></a>
-<span class="sourceLineNo">2945</span>            Condition condition = request.getCondition();<a name="line.2945"></a>
-<span class="sourceLineNo">2946</span>            byte[] row = condition.getRow().toByteArray();<a name="line.2946"></a>
-<span class="sourceLineNo">2947</span>            byte[] family = condition.getFamily().toByteArray();<a name="line.2947"></a>
-<span class="sourceLineNo">2948</span>            byte[] qualifier = condition.getQualifier().toByteArray();<a name="line.2948"></a>
-<span class="sourceLineNo">2949</span>            CompareOperator op = CompareOperator.valueOf(condition.getCompareType().name());<a name="line.2949"></a>
-<span class="sourceLineNo">2950</span>            ByteArrayComparable comparator = ProtobufUtil.toComparator(condition.getComparator());<a name="line.2950"></a>
-<span class="sourceLineNo">2951</span>            TimeRange timeRange = condition.hasTimeRange() ?<a name="line.2951"></a>
-<span class="sourceLineNo">2952</span>              ProtobufUtil.toTimeRange(condition.getTimeRange()) :<a name="line.2952"></a>
-<span class="sourceLineNo">2953</span>              TimeRange.allTime();<a name="line.2953"></a>
-<span class="sourceLineNo">2954</span>            if (region.getCoprocessorHost() != null) {<a name="line.2954"></a>
-<span class="sourceLineNo">2955</span>              processed = region.getCoprocessorHost().preCheckAndDelete(row, family, qualifier, op,<a name="line.2955"></a>
-<span class="sourceLineNo">2956</span>                  comparator, delete);<a name="line.2956"></a>
-<span class="sourceLineNo">2957</span>            }<a name="line.2957"></a>
-<span class="sourceLineNo">2958</span>            if (processed == null) {<a name="line.2958"></a>
-<span class="sourceLineNo">2959</span>              boolean result = region.checkAndMutate(row, family,<a name="line.2959"></a>
-<span class="sourceLineNo">2960</span>                qualifier, op, comparator, timeRange, delete);<a name="line.2960"></a>
-<span class="sourceLineNo">2961</span>              if (region.getCoprocessorHost() != null) {<a name="line.2961"></a>
-<span class="sourceLineNo">2962</span>                result = region.getCoprocessorHost().postCheckAndDelete(row, family,<a name="line.2962"></a>
-<span class="sourceLineNo">2963</span>                  qualifier, op, comparator, delete, result);<a name="line.2963"></a>
-<span class="sourceLineNo">2964</span>              }<a name="line.2964"></a>
-<span class="sourceLineNo">2965</span>              processed = result;<a name="line.2965"></a>
-<span class="sourceLineNo">2966</span>            }<a name="line.2966"></a>
-<span class="sourceLineNo">2967</span>          } else {<a name="line.2967"></a>
-<span class="sourceLineNo">2968</span>            region.delete(delete);<a name="line.2968"></a>
-<span class="sourceLineNo">2969</span>            processed = Boolean.TRUE;<a name="line.2969"></a>
-<span class="sourceLineNo">2970</span>          }<a name="line.2970"></a>
-<span class="sourceLineNo">2971</span>          break;<a name="line.2971"></a>
-<span class="sourceLineNo">2972</span>        default:<a name="line.2972"></a>
-<span class="sourceLineNo">2973</span>          throw new DoNotRetryIOException("Unsupported mutate type: " + type.name());<a name="line.2973"></a>
-<span class="sourceLineNo">2974</span>      }<a name="line.2974"></a>
-<span class="sourceLineNo">2975</span>      if (processed != null) {<a name="line.2975"></a>
-<span class="sourceLineNo">2976</span>        builder.setProcessed(processed.booleanValue());<a name="line.2976"></a>
-<span class="sourceLineNo">2977</span>      }<a name="line.2977"></a>
-<span class="sourceLineNo">2978</span>      boolean clientCellBlockSupported = isClientCellBlockSupport(context);<a name="line.2978"></a>
-<span class="sourceLineNo">2979</span>      addResult(builder, r, controller, clientCellBlockSupported);<a name="line.2979"></a>
-<span class="sourceLineNo">2980</span>      if (clientCellBlockSupported) {<a name="line.2980"></a>
-<span class="sourceLineNo">2981</span>        addSize(context, r, null);<a name="line.2981"></a>
-<span class="sourceLineNo">2982</span>      }<a name="line.2982"></a>
-<span class="sourceLineNo">2983</span>      return builder.build();<a name="line.2983"></a>
-<span class="sourceLineNo">2984</span>    } catch (IOException ie) {<a name="line.2984"></a>
-<span class="sourceLineNo">2985</span>      regionServer.checkFileSystem();<a name="line.2985"></a>
-<span class="sourceLineNo">2986</span>      throw new ServiceException(ie);<a name="line.2986"></a>
-<span class="sourceLineNo">2987</span>    } finally {<a name="line.2987"></a>
-<span class="sourceLineNo">2988</span>      if (quota != null) {<a name="line.2988"></a>
-<span class="sourceLineNo">2989</span>        quota.close();<a name="line.2989"></a>
-<span class="sourceLineNo">2990</span>      }<a name="line.2990"></a>
-<span class="sourceLineNo">2991</span>      // Update metrics<a name="line.2991"></a>
-<span class="sourceLineNo">2992</span>      if (regionServer.metricsRegionServer != null &amp;&amp; type != null) {<a name="line.2992"></a>
-<span class="sourceLineNo">2993</span>        long after = EnvironmentEdgeManager.currentTime();<a name="line.2993"></a>
-<span class="sourceLineNo">2994</span>        switch (type) {<a name="line.2994"></a>
-<span class="sourceLineNo">2995</span>        case DELETE:<a name="line.2995"></a>
-<span class="sourceLineNo">2996</span>          if (request.hasCondition()) {<a name="line.2996"></a>
-<span class="sourceLineNo">2997</span>            regionServer.metricsRegionServer.updateCheckAndDelete(after - before);<a name="line.2997"></a>
-<span class="sourceLineNo">2998</span>          } else {<a name="line.2998"></a>
-<span class="sourceLineNo">2999</span>            regionServer.metricsRegionServer.updateDelete(<a name="line.2999"></a>
-<span class="sourceLineNo">3000</span>                region == null ? null : region.getRegionInfo().getTable(), after - before);<a name="line.3000"></a>
-<span class="sourceLineNo">3001</span>          }<a name="line.3001"></a>
-<span class="sourceLineNo">3002</span>          break;<a name="line.3002"></a>
-<span class="sourceLineNo">3003</span>        case PUT:<a name="line.3003"></a>
-<span class="sourceLineNo">3004</span>          if (request.hasCondition()) {<a name="line.3004"></a>
-<span class="sourceLineNo">3005</span>            regionServer.metricsRegionServer.updateCheckAndPut(after - before);<a name="line.3005"></a>
-<span class="sourceLineNo">3006</span>          } else {<a name="line.3006"></a>
-<span class="sourceLineNo">3007</span>            regionServer.metricsRegionServer.updatePut(<a name="line.3007"></a>
-<span class="sourceLineNo">3008</span>                region == null ? null : region.getRegionInfo().getTable(),after - before);<a name="line.3008"></a>
-<span class="sourceLineNo">3009</span>          }<a name="line.3009"></a>
-<span class="sourceLineNo">3010</span>          break;<a name="line.3010"></a>
-<span class="sourceLineNo">3011</span>        default:<a name="line.3011"></a>
+<span class="sourceLineNo">2713</span>    long nonceGroup = request.hasNonceGroup() ? request.getNonceGroup() : HConstants.NO_NONCE;<a name="line.2713"></a>
+<span class="sourceLineNo">2714</span><a name="line.2714"></a>
+<span class="sourceLineNo">2715</span>    // this will contain all the cells that we need to return. It's created later, if needed.<a name="line.2715"></a>
+<span class="sourceLineNo">2716</span>    List&lt;CellScannable&gt; cellsToReturn = null;<a name="line.2716"></a>
+<span class="sourceLineNo">2717</span>    MultiResponse.Builder responseBuilder = MultiResponse.newBuilder();<a name="line.2717"></a>
+<span class="sourceLineNo">2718</span>    RegionActionResult.Builder regionActionResultBuilder = RegionActionResult.newBuilder();<a name="line.2718"></a>
+<span class="sourceLineNo">2719</span>    Boolean processed = null;<a name="line.2719"></a>
+<span class="sourceLineNo">2720</span>    RegionScannersCloseCallBack closeCallBack = null;<a name="line.2720"></a>
+<span class="sourceLineNo">2721</span>    RpcCallContext context = RpcServer.getCurrentCall().orElse(null);<a name="line.2721"></a>
+<span class="sourceLineNo">2722</span>    this.rpcMultiRequestCount.increment();<a name="line.2722"></a>
+<span class="sourceLineNo">2723</span>    this.requestCount.increment();<a name="line.2723"></a>
+<span class="sourceLineNo">2724</span>    Map&lt;RegionSpecifier, ClientProtos.RegionLoadStats&gt; regionStats = new HashMap&lt;&gt;(request<a name="line.2724"></a>
+<span class="sourceLineNo">2725</span>      .getRegionActionCount());<a name="line.2725"></a>
+<span class="sourceLineNo">2726</span>    ActivePolicyEnforcement spaceQuotaEnforcement = getSpaceQuotaManager().getActiveEnforcements();<a name="line.2726"></a>
+<span class="sourceLineNo">2727</span>    for (RegionAction regionAction : request.getRegionActionList()) {<a name="line.2727"></a>
+<span class="sourceLineNo">2728</span>      OperationQuota quota;<a name="line.2728"></a>
+<span class="sourceLineNo">2729</span>      HRegion region;<a name="line.2729"></a>
+<span class="sourceLineNo">2730</span>      regionActionResultBuilder.clear();<a name="line.2730"></a>
+<span class="sourceLineNo">2731</span>      RegionSpecifier regionSpecifier = regionAction.getRegion();<a name="line.2731"></a>
+<span class="sourceLineNo">2732</span>      try {<a name="line.2732"></a>
+<span class="sourceLineNo">2733</span>        region = getRegion(regionSpecifier);<a name="line.2733"></a>
+<span class="sourceLineNo">2734</span>        quota = getRpcQuotaManager().checkQuota(region, regionAction.getActionList());<a name="line.2734"></a>
+<span class="sourceLineNo">2735</span>      } catch (IOException e) {<a name="line.2735"></a>
+<span class="sourceLineNo">2736</span>        failRegionAction(responseBuilder, regionActionResultBuilder, regionAction, cellScanner, e);<a name="line.2736"></a>
+<span class="sourceLineNo">2737</span>        continue;  // For this region it's a failure.<a name="line.2737"></a>
+<span class="sourceLineNo">2738</span>      }<a name="line.2738"></a>
+<span class="sourceLineNo">2739</span>      boolean rejectIfFromClient = shouldRejectRequestsFromClient(region);<a name="line.2739"></a>
+<span class="sourceLineNo">2740</span>      if (regionAction.hasAtomic() &amp;&amp; regionAction.getAtomic()) {<a name="line.2740"></a>
+<span class="sourceLineNo">2741</span>        // We only allow replication in standby state and it will not set the atomic flag.<a name="line.2741"></a>
+<span class="sourceLineNo">2742</span>        if (rejectIfFromClient) {<a name="line.2742"></a>
+<span class="sourceLineNo">2743</span>          failRegionAction(responseBuilder, regionActionResultBuilder, regionAction, cellScanner,<a name="line.2743"></a>
+<span class="sourceLineNo">2744</span>            new DoNotRetryIOException(<a name="line.2744"></a>
+<span class="sourceLineNo">2745</span>              region.getRegionInfo().getRegionNameAsString() + " is in STANDBY state"));<a name="line.2745"></a>
+<span class="sourceLineNo">2746</span>          quota.close();<a name="line.2746"></a>
+<span class="sourceLineNo">2747</span>          continue;<a name="line.2747"></a>
+<span class="sourceLineNo">2748</span>        }<a name="line.2748"></a>
+<span class="sourceLineNo">2749</span>        // How does this call happen?  It may need some work to play well w/ the surroundings.<a name="line.2749"></a>
+<span class="sourceLineNo">2750</span>        // Need to return an item per Action along w/ Action index.  TODO.<a name="line.2750"></a>
+<span class="sourceLineNo">2751</span>        try {<a name="line.2751"></a>
+<span class="sourceLineNo">2752</span>          if (request.hasCondition()) {<a name="line.2752"></a>
+<span class="sourceLineNo">2753</span>            Condition condition = request.getCondition();<a name="line.2753"></a>
+<span class="sourceLineNo">2754</span>            byte[] row = condition.getRow().toByteArray();<a name="line.2754"></a>
+<span class="sourceLineNo">2755</span>            byte[] family = condition.getFamily().toByteArray();<a name="line.2755"></a>
+<span class="sourceLineNo">2756</span>            byte[] qualifier = condition.getQualifier().toByteArray();<a name="line.2756"></a>
+<span class="sourceLineNo">2757</span>            CompareOperator op =<a name="line.2757"></a>
+<span class="sourceLineNo">2758</span>              CompareOperator.valueOf(condition.getCompareType().name());<a name="line.2758"></a>
+<span class="sourceLineNo">2759</span>            ByteArrayComparable comparator =<a name="line.2759"></a>
+<span class="sourceLineNo">2760</span>                ProtobufUtil.toComparator(condition.getComparator());<a name="line.2760"></a>
+<span class="sourceLineNo">2761</span>            TimeRange timeRange = condition.hasTimeRange() ?<a name="line.2761"></a>
+<span class="sourceLineNo">2762</span>              ProtobufUtil.toTimeRange(condition.getTimeRange()) :<a name="line.2762"></a>
+<span class="sourceLineNo">2763</span>              TimeRange.allTime();<a name="line.2763"></a>
+<span class="sourceLineNo">2764</span>            processed =<a name="line.2764"></a>
+<span class="sourceLineNo">2765</span>              checkAndRowMutate(region, regionAction.getActionList(), cellScanner, row, family,<a name="line.2765"></a>
+<span class="sourceLineNo">2766</span>                qualifier, op, comparator, timeRange, regionActionResultBuilder,<a name="line.2766"></a>
+<span class="sourceLineNo">2767</span>                spaceQuotaEnforcement);<a name="line.2767"></a>
+<span class="sourceLineNo">2768</span>          } else {<a name="line.2768"></a>
+<span class="sourceLineNo">2769</span>            doAtomicBatchOp(regionActionResultBuilder, region, quota, regionAction.getActionList(),<a name="line.2769"></a>
+<span class="sourceLineNo">2770</span>              cellScanner, spaceQuotaEnforcement);<a name="line.2770"></a>
+<span class="sourceLineNo">2771</span>            processed = Boolean.TRUE;<a name="line.2771"></a>
+<span class="sourceLineNo">2772</span>          }<a name="line.2772"></a>
+<span class="sourceLineNo">2773</span>        } catch (IOException e) {<a name="line.2773"></a>
+<span class="sourceLineNo">2774</span>          rpcServer.getMetrics().exception(e);<a name="line.2774"></a>
+<span class="sourceLineNo">2775</span>          // As it's atomic, we may expect it's a global failure.<a name="line.2775"></a>
+<span class="sourceLineNo">2776</span>          regionActionResultBuilder.setException(ResponseConverter.buildException(e));<a name="line.2776"></a>
+<span class="sourceLineNo">2777</span>        }<a name="line.2777"></a>
+<span class="sourceLineNo">2778</span>      } else {<a name="line.2778"></a>
+<span class="sourceLineNo">2779</span>        if (rejectIfFromClient &amp;&amp; regionAction.getActionCount() &gt; 0 &amp;&amp;<a name="line.2779"></a>
+<span class="sourceLineNo">2780</span>          !isReplicationRequest(regionAction.getAction(0))) {<a name="line.2780"></a>
+<span class="sourceLineNo">2781</span>          // fail if it is not a replication request<a name="line.2781"></a>
+<span class="sourceLineNo">2782</span>          failRegionAction(responseBuilder, regionActionResultBuilder, regionAction, cellScanner,<a name="line.2782"></a>
+<span class="sourceLineNo">2783</span>            new DoNotRetryIOException(<a name="line.2783"></a>
+<span class="sourceLineNo">2784</span>              region.getRegionInfo().getRegionNameAsString() + " is in STANDBY state"));<a name="line.2784"></a>
+<span class="sourceLineNo">2785</span>          quota.close();<a name="line.2785"></a>
+<span class="sourceLineNo">2786</span>          continue;<a name="line.2786"></a>
+<span class="sourceLineNo">2787</span>        }<a name="line.2787"></a>
+<span class="sourceLineNo">2788</span>        // doNonAtomicRegionMutation manages the exception internally<a name="line.2788"></a>
+<span class="sourceLineNo">2789</span>        if (context != null &amp;&amp; closeCallBack == null) {<a name="line.2789"></a>
+<span class="sourceLineNo">2790</span>          // An RpcCallBack that creates a list of scanners that needs to perform callBack<a name="line.2790"></a>
+<span class="sourceLineNo">2791</span>          // operation on completion of multiGets.<a name="line.2791"></a>
+<span class="sourceLineNo">2792</span>          // Set this only once<a name="line.2792"></a>
+<span class="sourceLineNo">2793</span>          closeCallBack = new RegionScannersCloseCallBack();<a name="line.2793"></a>
+<span class="sourceLineNo">2794</span>          context.setCallBack(closeCallBack);<a name="line.2794"></a>
+<span class="sourceLineNo">2795</span>        }<a name="line.2795"></a>
+<span class="sourceLineNo">2796</span>        cellsToReturn = doNonAtomicRegionMutation(region, quota, regionAction, cellScanner,<a name="line.2796"></a>
+<span class="sourceLineNo">2797</span>            regionActionResultBuilder, cellsToReturn, nonceGroup, closeCallBack, context,<a name="line.2797"></a>
+<span class="sourceLineNo">2798</span>           

<TRUNCATED>

[32/46] hbase-site git commit: Published site at 05d22ed960204183fbd9bd16f1dbca6410ccde76.

Posted by gi...@apache.org.
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/3649682c/devapidocs/src-html/org/apache/hadoop/hbase/master/HMaster.TableDescriptorGetter.html
----------------------------------------------------------------------
diff --git a/devapidocs/src-html/org/apache/hadoop/hbase/master/HMaster.TableDescriptorGetter.html b/devapidocs/src-html/org/apache/hadoop/hbase/master/HMaster.TableDescriptorGetter.html
index 9fbe400..b7a2a38 100644
--- a/devapidocs/src-html/org/apache/hadoop/hbase/master/HMaster.TableDescriptorGetter.html
+++ b/devapidocs/src-html/org/apache/hadoop/hbase/master/HMaster.TableDescriptorGetter.html
@@ -215,3746 +215,3748 @@
 <span class="sourceLineNo">207</span>import org.apache.hadoop.hbase.util.VersionInfo;<a name="line.207"></a>
 <span class="sourceLineNo">208</span>import org.apache.hadoop.hbase.zookeeper.LoadBalancerTracker;<a name="line.208"></a>
 <span class="sourceLineNo">209</span>import org.apache.hadoop.hbase.zookeeper.MasterAddressTracker;<a name="line.209"></a>
-<span class="sourceLineNo">210</span>import org.apache.hadoop.hbase.zookeeper.MasterMaintenanceModeTracker;<a name="line.210"></a>
-<span class="sourceLineNo">211</span>import org.apache.hadoop.hbase.zookeeper.RegionNormalizerTracker;<a name="line.211"></a>
-<span class="sourceLineNo">212</span>import org.apache.hadoop.hbase.zookeeper.ZKClusterId;<a name="line.212"></a>
-<span class="sourceLineNo">213</span>import org.apache.hadoop.hbase.zookeeper.ZKUtil;<a name="line.213"></a>
-<span class="sourceLineNo">214</span>import org.apache.hadoop.hbase.zookeeper.ZKWatcher;<a name="line.214"></a>
-<span class="sourceLineNo">215</span>import org.apache.hadoop.hbase.zookeeper.ZNodePaths;<a name="line.215"></a>
-<span class="sourceLineNo">216</span>import org.apache.yetus.audience.InterfaceAudience;<a name="line.216"></a>
-<span class="sourceLineNo">217</span>import org.apache.zookeeper.KeeperException;<a name="line.217"></a>
-<span class="sourceLineNo">218</span>import org.eclipse.jetty.server.Server;<a name="line.218"></a>
-<span class="sourceLineNo">219</span>import org.eclipse.jetty.server.ServerConnector;<a name="line.219"></a>
-<span class="sourceLineNo">220</span>import org.eclipse.jetty.servlet.ServletHolder;<a name="line.220"></a>
-<span class="sourceLineNo">221</span>import org.eclipse.jetty.webapp.WebAppContext;<a name="line.221"></a>
-<span class="sourceLineNo">222</span>import org.slf4j.Logger;<a name="line.222"></a>
-<span class="sourceLineNo">223</span>import org.slf4j.LoggerFactory;<a name="line.223"></a>
-<span class="sourceLineNo">224</span><a name="line.224"></a>
-<span class="sourceLineNo">225</span>import org.apache.hbase.thirdparty.com.google.common.annotations.VisibleForTesting;<a name="line.225"></a>
-<span class="sourceLineNo">226</span>import org.apache.hbase.thirdparty.com.google.common.collect.ImmutableSet;<a name="line.226"></a>
-<span class="sourceLineNo">227</span>import org.apache.hbase.thirdparty.com.google.common.collect.Lists;<a name="line.227"></a>
-<span class="sourceLineNo">228</span>import org.apache.hbase.thirdparty.com.google.common.collect.Maps;<a name="line.228"></a>
-<span class="sourceLineNo">229</span><a name="line.229"></a>
-<span class="sourceLineNo">230</span>import org.apache.hadoop.hbase.shaded.protobuf.ProtobufUtil;<a name="line.230"></a>
-<span class="sourceLineNo">231</span>import org.apache.hadoop.hbase.shaded.protobuf.generated.AdminProtos.GetRegionInfoResponse.CompactionState;<a name="line.231"></a>
-<span class="sourceLineNo">232</span>import org.apache.hadoop.hbase.shaded.protobuf.generated.QuotaProtos.Quotas;<a name="line.232"></a>
-<span class="sourceLineNo">233</span>import org.apache.hadoop.hbase.shaded.protobuf.generated.QuotaProtos.SpaceViolationPolicy;<a name="line.233"></a>
-<span class="sourceLineNo">234</span>import org.apache.hadoop.hbase.shaded.protobuf.generated.SnapshotProtos.SnapshotDescription;<a name="line.234"></a>
-<span class="sourceLineNo">235</span>import org.apache.hadoop.hbase.shaded.protobuf.generated.WALProtos;<a name="line.235"></a>
-<span class="sourceLineNo">236</span><a name="line.236"></a>
-<span class="sourceLineNo">237</span>/**<a name="line.237"></a>
-<span class="sourceLineNo">238</span> * HMaster is the "master server" for HBase. An HBase cluster has one active<a name="line.238"></a>
-<span class="sourceLineNo">239</span> * master.  If many masters are started, all compete.  Whichever wins goes on to<a name="line.239"></a>
-<span class="sourceLineNo">240</span> * run the cluster.  All others park themselves in their constructor until<a name="line.240"></a>
-<span class="sourceLineNo">241</span> * master or cluster shutdown or until the active master loses its lease in<a name="line.241"></a>
-<span class="sourceLineNo">242</span> * zookeeper.  Thereafter, all running master jostle to take over master role.<a name="line.242"></a>
-<span class="sourceLineNo">243</span> *<a name="line.243"></a>
-<span class="sourceLineNo">244</span> * &lt;p&gt;The Master can be asked shutdown the cluster. See {@link #shutdown()}.  In<a name="line.244"></a>
-<span class="sourceLineNo">245</span> * this case it will tell all regionservers to go down and then wait on them<a name="line.245"></a>
-<span class="sourceLineNo">246</span> * all reporting in that they are down.  This master will then shut itself down.<a name="line.246"></a>
-<span class="sourceLineNo">247</span> *<a name="line.247"></a>
-<span class="sourceLineNo">248</span> * &lt;p&gt;You can also shutdown just this master.  Call {@link #stopMaster()}.<a name="line.248"></a>
-<span class="sourceLineNo">249</span> *<a name="line.249"></a>
-<span class="sourceLineNo">250</span> * @see org.apache.zookeeper.Watcher<a name="line.250"></a>
-<span class="sourceLineNo">251</span> */<a name="line.251"></a>
-<span class="sourceLineNo">252</span>@InterfaceAudience.LimitedPrivate(HBaseInterfaceAudience.TOOLS)<a name="line.252"></a>
-<span class="sourceLineNo">253</span>@SuppressWarnings("deprecation")<a name="line.253"></a>
-<span class="sourceLineNo">254</span>public class HMaster extends HRegionServer implements MasterServices {<a name="line.254"></a>
-<span class="sourceLineNo">255</span>  private static Logger LOG = LoggerFactory.getLogger(HMaster.class);<a name="line.255"></a>
-<span class="sourceLineNo">256</span><a name="line.256"></a>
-<span class="sourceLineNo">257</span>  /**<a name="line.257"></a>
-<span class="sourceLineNo">258</span>   * Protection against zombie master. Started once Master accepts active responsibility and<a name="line.258"></a>
-<span class="sourceLineNo">259</span>   * starts taking over responsibilities. Allows a finite time window before giving up ownership.<a name="line.259"></a>
-<span class="sourceLineNo">260</span>   */<a name="line.260"></a>
-<span class="sourceLineNo">261</span>  private static class InitializationMonitor extends HasThread {<a name="line.261"></a>
-<span class="sourceLineNo">262</span>    /** The amount of time in milliseconds to sleep before checking initialization status. */<a name="line.262"></a>
-<span class="sourceLineNo">263</span>    public static final String TIMEOUT_KEY = "hbase.master.initializationmonitor.timeout";<a name="line.263"></a>
-<span class="sourceLineNo">264</span>    public static final long TIMEOUT_DEFAULT = TimeUnit.MILLISECONDS.convert(15, TimeUnit.MINUTES);<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>     * When timeout expired and initialization has not complete, call {@link System#exit(int)} when<a name="line.267"></a>
-<span class="sourceLineNo">268</span>     * true, do nothing otherwise.<a name="line.268"></a>
-<span class="sourceLineNo">269</span>     */<a name="line.269"></a>
-<span class="sourceLineNo">270</span>    public static final String HALT_KEY = "hbase.master.initializationmonitor.haltontimeout";<a name="line.270"></a>
-<span class="sourceLineNo">271</span>    public static final boolean HALT_DEFAULT = false;<a name="line.271"></a>
-<span class="sourceLineNo">272</span><a name="line.272"></a>
-<span class="sourceLineNo">273</span>    private final HMaster master;<a name="line.273"></a>
-<span class="sourceLineNo">274</span>    private final long timeout;<a name="line.274"></a>
-<span class="sourceLineNo">275</span>    private final boolean haltOnTimeout;<a name="line.275"></a>
-<span class="sourceLineNo">276</span><a name="line.276"></a>
-<span class="sourceLineNo">277</span>    /** Creates a Thread that monitors the {@link #isInitialized()} state. */<a name="line.277"></a>
-<span class="sourceLineNo">278</span>    InitializationMonitor(HMaster master) {<a name="line.278"></a>
-<span class="sourceLineNo">279</span>      super("MasterInitializationMonitor");<a name="line.279"></a>
-<span class="sourceLineNo">280</span>      this.master = master;<a name="line.280"></a>
-<span class="sourceLineNo">281</span>      this.timeout = master.getConfiguration().getLong(TIMEOUT_KEY, TIMEOUT_DEFAULT);<a name="line.281"></a>
-<span class="sourceLineNo">282</span>      this.haltOnTimeout = master.getConfiguration().getBoolean(HALT_KEY, HALT_DEFAULT);<a name="line.282"></a>
-<span class="sourceLineNo">283</span>      this.setDaemon(true);<a name="line.283"></a>
-<span class="sourceLineNo">284</span>    }<a name="line.284"></a>
-<span class="sourceLineNo">285</span><a name="line.285"></a>
-<span class="sourceLineNo">286</span>    @Override<a name="line.286"></a>
-<span class="sourceLineNo">287</span>    public void run() {<a name="line.287"></a>
-<span class="sourceLineNo">288</span>      try {<a name="line.288"></a>
-<span class="sourceLineNo">289</span>        while (!master.isStopped() &amp;&amp; master.isActiveMaster()) {<a name="line.289"></a>
-<span class="sourceLineNo">290</span>          Thread.sleep(timeout);<a name="line.290"></a>
-<span class="sourceLineNo">291</span>          if (master.isInitialized()) {<a name="line.291"></a>
-<span class="sourceLineNo">292</span>            LOG.debug("Initialization completed within allotted tolerance. Monitor exiting.");<a name="line.292"></a>
-<span class="sourceLineNo">293</span>          } else {<a name="line.293"></a>
-<span class="sourceLineNo">294</span>            LOG.error("Master failed to complete initialization after " + timeout + "ms. Please"<a name="line.294"></a>
-<span class="sourceLineNo">295</span>                + " consider submitting a bug report including a thread dump of this process.");<a name="line.295"></a>
-<span class="sourceLineNo">296</span>            if (haltOnTimeout) {<a name="line.296"></a>
-<span class="sourceLineNo">297</span>              LOG.error("Zombie Master exiting. Thread dump to stdout");<a name="line.297"></a>
-<span class="sourceLineNo">298</span>              Threads.printThreadInfo(System.out, "Zombie HMaster");<a name="line.298"></a>
-<span class="sourceLineNo">299</span>              System.exit(-1);<a name="line.299"></a>
-<span class="sourceLineNo">300</span>            }<a name="line.300"></a>
-<span class="sourceLineNo">301</span>          }<a name="line.301"></a>
-<span class="sourceLineNo">302</span>        }<a name="line.302"></a>
-<span class="sourceLineNo">303</span>      } catch (InterruptedException ie) {<a name="line.303"></a>
-<span class="sourceLineNo">304</span>        LOG.trace("InitMonitor thread interrupted. Existing.");<a name="line.304"></a>
-<span class="sourceLineNo">305</span>      }<a name="line.305"></a>
-<span class="sourceLineNo">306</span>    }<a name="line.306"></a>
-<span class="sourceLineNo">307</span>  }<a name="line.307"></a>
-<span class="sourceLineNo">308</span><a name="line.308"></a>
-<span class="sourceLineNo">309</span>  // MASTER is name of the webapp and the attribute name used stuffing this<a name="line.309"></a>
-<span class="sourceLineNo">310</span>  //instance into web context.<a name="line.310"></a>
-<span class="sourceLineNo">311</span>  public static final String MASTER = "master";<a name="line.311"></a>
-<span class="sourceLineNo">312</span><a name="line.312"></a>
-<span class="sourceLineNo">313</span>  // Manager and zk listener for master election<a name="line.313"></a>
-<span class="sourceLineNo">314</span>  private final ActiveMasterManager activeMasterManager;<a name="line.314"></a>
-<span class="sourceLineNo">315</span>  // Region server tracker<a name="line.315"></a>
-<span class="sourceLineNo">316</span>  private RegionServerTracker regionServerTracker;<a name="line.316"></a>
-<span class="sourceLineNo">317</span>  // Draining region server tracker<a name="line.317"></a>
-<span class="sourceLineNo">318</span>  private DrainingServerTracker drainingServerTracker;<a name="line.318"></a>
-<span class="sourceLineNo">319</span>  // Tracker for load balancer state<a name="line.319"></a>
-<span class="sourceLineNo">320</span>  LoadBalancerTracker loadBalancerTracker;<a name="line.320"></a>
-<span class="sourceLineNo">321</span>  // Tracker for meta location, if any client ZK quorum specified<a name="line.321"></a>
-<span class="sourceLineNo">322</span>  MetaLocationSyncer metaLocationSyncer;<a name="line.322"></a>
-<span class="sourceLineNo">323</span>  // Tracker for active master location, if any client ZK quorum specified<a name="line.323"></a>
-<span class="sourceLineNo">324</span>  MasterAddressSyncer masterAddressSyncer;<a name="line.324"></a>
-<span class="sourceLineNo">325</span><a name="line.325"></a>
-<span class="sourceLineNo">326</span>  // Tracker for split and merge state<a name="line.326"></a>
-<span class="sourceLineNo">327</span>  private SplitOrMergeTracker splitOrMergeTracker;<a name="line.327"></a>
-<span class="sourceLineNo">328</span><a name="line.328"></a>
-<span class="sourceLineNo">329</span>  // Tracker for region normalizer state<a name="line.329"></a>
-<span class="sourceLineNo">330</span>  private RegionNormalizerTracker regionNormalizerTracker;<a name="line.330"></a>
-<span class="sourceLineNo">331</span><a name="line.331"></a>
-<span class="sourceLineNo">332</span>  //Tracker for master maintenance mode setting<a name="line.332"></a>
-<span class="sourceLineNo">333</span>  private MasterMaintenanceModeTracker maintenanceModeTracker;<a name="line.333"></a>
-<span class="sourceLineNo">334</span><a name="line.334"></a>
-<span class="sourceLineNo">335</span>  private ClusterSchemaService clusterSchemaService;<a name="line.335"></a>
+<span class="sourceLineNo">210</span>import org.apache.hadoop.hbase.zookeeper.RegionNormalizerTracker;<a name="line.210"></a>
+<span class="sourceLineNo">211</span>import org.apache.hadoop.hbase.zookeeper.ZKClusterId;<a name="line.211"></a>
+<span class="sourceLineNo">212</span>import org.apache.hadoop.hbase.zookeeper.ZKUtil;<a name="line.212"></a>
+<span class="sourceLineNo">213</span>import org.apache.hadoop.hbase.zookeeper.ZKWatcher;<a name="line.213"></a>
+<span class="sourceLineNo">214</span>import org.apache.hadoop.hbase.zookeeper.ZNodePaths;<a name="line.214"></a>
+<span class="sourceLineNo">215</span>import org.apache.yetus.audience.InterfaceAudience;<a name="line.215"></a>
+<span class="sourceLineNo">216</span>import org.apache.zookeeper.KeeperException;<a name="line.216"></a>
+<span class="sourceLineNo">217</span>import org.eclipse.jetty.server.Server;<a name="line.217"></a>
+<span class="sourceLineNo">218</span>import org.eclipse.jetty.server.ServerConnector;<a name="line.218"></a>
+<span class="sourceLineNo">219</span>import org.eclipse.jetty.servlet.ServletHolder;<a name="line.219"></a>
+<span class="sourceLineNo">220</span>import org.eclipse.jetty.webapp.WebAppContext;<a name="line.220"></a>
+<span class="sourceLineNo">221</span>import org.slf4j.Logger;<a name="line.221"></a>
+<span class="sourceLineNo">222</span>import org.slf4j.LoggerFactory;<a name="line.222"></a>
+<span class="sourceLineNo">223</span><a name="line.223"></a>
+<span class="sourceLineNo">224</span>import org.apache.hbase.thirdparty.com.google.common.annotations.VisibleForTesting;<a name="line.224"></a>
+<span class="sourceLineNo">225</span>import org.apache.hbase.thirdparty.com.google.common.collect.ImmutableSet;<a name="line.225"></a>
+<span class="sourceLineNo">226</span>import org.apache.hbase.thirdparty.com.google.common.collect.Lists;<a name="line.226"></a>
+<span class="sourceLineNo">227</span>import org.apache.hbase.thirdparty.com.google.common.collect.Maps;<a name="line.227"></a>
+<span class="sourceLineNo">228</span><a name="line.228"></a>
+<span class="sourceLineNo">229</span>import org.apache.hadoop.hbase.shaded.protobuf.ProtobufUtil;<a name="line.229"></a>
+<span class="sourceLineNo">230</span>import org.apache.hadoop.hbase.shaded.protobuf.generated.AdminProtos.GetRegionInfoResponse.CompactionState;<a name="line.230"></a>
+<span class="sourceLineNo">231</span>import org.apache.hadoop.hbase.shaded.protobuf.generated.QuotaProtos.Quotas;<a name="line.231"></a>
+<span class="sourceLineNo">232</span>import org.apache.hadoop.hbase.shaded.protobuf.generated.QuotaProtos.SpaceViolationPolicy;<a name="line.232"></a>
+<span class="sourceLineNo">233</span>import org.apache.hadoop.hbase.shaded.protobuf.generated.SnapshotProtos.SnapshotDescription;<a name="line.233"></a>
+<span class="sourceLineNo">234</span>import org.apache.hadoop.hbase.shaded.protobuf.generated.WALProtos;<a name="line.234"></a>
+<span class="sourceLineNo">235</span><a name="line.235"></a>
+<span class="sourceLineNo">236</span>/**<a name="line.236"></a>
+<span class="sourceLineNo">237</span> * HMaster is the "master server" for HBase. An HBase cluster has one active<a name="line.237"></a>
+<span class="sourceLineNo">238</span> * master.  If many masters are started, all compete.  Whichever wins goes on to<a name="line.238"></a>
+<span class="sourceLineNo">239</span> * run the cluster.  All others park themselves in their constructor until<a name="line.239"></a>
+<span class="sourceLineNo">240</span> * master or cluster shutdown or until the active master loses its lease in<a name="line.240"></a>
+<span class="sourceLineNo">241</span> * zookeeper.  Thereafter, all running master jostle to take over master role.<a name="line.241"></a>
+<span class="sourceLineNo">242</span> *<a name="line.242"></a>
+<span class="sourceLineNo">243</span> * &lt;p&gt;The Master can be asked shutdown the cluster. See {@link #shutdown()}.  In<a name="line.243"></a>
+<span class="sourceLineNo">244</span> * this case it will tell all regionservers to go down and then wait on them<a name="line.244"></a>
+<span class="sourceLineNo">245</span> * all reporting in that they are down.  This master will then shut itself down.<a name="line.245"></a>
+<span class="sourceLineNo">246</span> *<a name="line.246"></a>
+<span class="sourceLineNo">247</span> * &lt;p&gt;You can also shutdown just this master.  Call {@link #stopMaster()}.<a name="line.247"></a>
+<span class="sourceLineNo">248</span> *<a name="line.248"></a>
+<span class="sourceLineNo">249</span> * @see org.apache.zookeeper.Watcher<a name="line.249"></a>
+<span class="sourceLineNo">250</span> */<a name="line.250"></a>
+<span class="sourceLineNo">251</span>@InterfaceAudience.LimitedPrivate(HBaseInterfaceAudience.TOOLS)<a name="line.251"></a>
+<span class="sourceLineNo">252</span>@SuppressWarnings("deprecation")<a name="line.252"></a>
+<span class="sourceLineNo">253</span>public class HMaster extends HRegionServer implements MasterServices {<a name="line.253"></a>
+<span class="sourceLineNo">254</span>  private static Logger LOG = LoggerFactory.getLogger(HMaster.class);<a name="line.254"></a>
+<span class="sourceLineNo">255</span><a name="line.255"></a>
+<span class="sourceLineNo">256</span>  /**<a name="line.256"></a>
+<span class="sourceLineNo">257</span>   * Protection against zombie master. Started once Master accepts active responsibility and<a name="line.257"></a>
+<span class="sourceLineNo">258</span>   * starts taking over responsibilities. Allows a finite time window before giving up ownership.<a name="line.258"></a>
+<span class="sourceLineNo">259</span>   */<a name="line.259"></a>
+<span class="sourceLineNo">260</span>  private static class InitializationMonitor extends HasThread {<a name="line.260"></a>
+<span class="sourceLineNo">261</span>    /** The amount of time in milliseconds to sleep before checking initialization status. */<a name="line.261"></a>
+<span class="sourceLineNo">262</span>    public static final String TIMEOUT_KEY = "hbase.master.initializationmonitor.timeout";<a name="line.262"></a>
+<span class="sourceLineNo">263</span>    public static final long TIMEOUT_DEFAULT = TimeUnit.MILLISECONDS.convert(15, TimeUnit.MINUTES);<a name="line.263"></a>
+<span class="sourceLineNo">264</span><a name="line.264"></a>
+<span class="sourceLineNo">265</span>    /**<a name="line.265"></a>
+<span class="sourceLineNo">266</span>     * When timeout expired and initialization has not complete, call {@link System#exit(int)} when<a name="line.266"></a>
+<span class="sourceLineNo">267</span>     * true, do nothing otherwise.<a name="line.267"></a>
+<span class="sourceLineNo">268</span>     */<a name="line.268"></a>
+<span class="sourceLineNo">269</span>    public static final String HALT_KEY = "hbase.master.initializationmonitor.haltontimeout";<a name="line.269"></a>
+<span class="sourceLineNo">270</span>    public static final boolean HALT_DEFAULT = false;<a name="line.270"></a>
+<span class="sourceLineNo">271</span><a name="line.271"></a>
+<span class="sourceLineNo">272</span>    private final HMaster master;<a name="line.272"></a>
+<span class="sourceLineNo">273</span>    private final long timeout;<a name="line.273"></a>
+<span class="sourceLineNo">274</span>    private final boolean haltOnTimeout;<a name="line.274"></a>
+<span class="sourceLineNo">275</span><a name="line.275"></a>
+<span class="sourceLineNo">276</span>    /** Creates a Thread that monitors the {@link #isInitialized()} state. */<a name="line.276"></a>
+<span class="sourceLineNo">277</span>    InitializationMonitor(HMaster master) {<a name="line.277"></a>
+<span class="sourceLineNo">278</span>      super("MasterInitializationMonitor");<a name="line.278"></a>
+<span class="sourceLineNo">279</span>      this.master = master;<a name="line.279"></a>
+<span class="sourceLineNo">280</span>      this.timeout = master.getConfiguration().getLong(TIMEOUT_KEY, TIMEOUT_DEFAULT);<a name="line.280"></a>
+<span class="sourceLineNo">281</span>      this.haltOnTimeout = master.getConfiguration().getBoolean(HALT_KEY, HALT_DEFAULT);<a name="line.281"></a>
+<span class="sourceLineNo">282</span>      this.setDaemon(true);<a name="line.282"></a>
+<span class="sourceLineNo">283</span>    }<a name="line.283"></a>
+<span class="sourceLineNo">284</span><a name="line.284"></a>
+<span class="sourceLineNo">285</span>    @Override<a name="line.285"></a>
+<span class="sourceLineNo">286</span>    public void run() {<a name="line.286"></a>
+<span class="sourceLineNo">287</span>      try {<a name="line.287"></a>
+<span class="sourceLineNo">288</span>        while (!master.isStopped() &amp;&amp; master.isActiveMaster()) {<a name="line.288"></a>
+<span class="sourceLineNo">289</span>          Thread.sleep(timeout);<a name="line.289"></a>
+<span class="sourceLineNo">290</span>          if (master.isInitialized()) {<a name="line.290"></a>
+<span class="sourceLineNo">291</span>            LOG.debug("Initialization completed within allotted tolerance. Monitor exiting.");<a name="line.291"></a>
+<span class="sourceLineNo">292</span>          } else {<a name="line.292"></a>
+<span class="sourceLineNo">293</span>            LOG.error("Master failed to complete initialization after " + timeout + "ms. Please"<a name="line.293"></a>
+<span class="sourceLineNo">294</span>                + " consider submitting a bug report including a thread dump of this process.");<a name="line.294"></a>
+<span class="sourceLineNo">295</span>            if (haltOnTimeout) {<a name="line.295"></a>
+<span class="sourceLineNo">296</span>              LOG.error("Zombie Master exiting. Thread dump to stdout");<a name="line.296"></a>
+<span class="sourceLineNo">297</span>              Threads.printThreadInfo(System.out, "Zombie HMaster");<a name="line.297"></a>
+<span class="sourceLineNo">298</span>              System.exit(-1);<a name="line.298"></a>
+<span class="sourceLineNo">299</span>            }<a name="line.299"></a>
+<span class="sourceLineNo">300</span>          }<a name="line.300"></a>
+<span class="sourceLineNo">301</span>        }<a name="line.301"></a>
+<span class="sourceLineNo">302</span>      } catch (InterruptedException ie) {<a name="line.302"></a>
+<span class="sourceLineNo">303</span>        LOG.trace("InitMonitor thread interrupted. Existing.");<a name="line.303"></a>
+<span class="sourceLineNo">304</span>      }<a name="line.304"></a>
+<span class="sourceLineNo">305</span>    }<a name="line.305"></a>
+<span class="sourceLineNo">306</span>  }<a name="line.306"></a>
+<span class="sourceLineNo">307</span><a name="line.307"></a>
+<span class="sourceLineNo">308</span>  // MASTER is name of the webapp and the attribute name used stuffing this<a name="line.308"></a>
+<span class="sourceLineNo">309</span>  //instance into web context.<a name="line.309"></a>
+<span class="sourceLineNo">310</span>  public static final String MASTER = "master";<a name="line.310"></a>
+<span class="sourceLineNo">311</span><a name="line.311"></a>
+<span class="sourceLineNo">312</span>  // Manager and zk listener for master election<a name="line.312"></a>
+<span class="sourceLineNo">313</span>  private final ActiveMasterManager activeMasterManager;<a name="line.313"></a>
+<span class="sourceLineNo">314</span>  // Region server tracker<a name="line.314"></a>
+<span class="sourceLineNo">315</span>  private RegionServerTracker regionServerTracker;<a name="line.315"></a>
+<span class="sourceLineNo">316</span>  // Draining region server tracker<a name="line.316"></a>
+<span class="sourceLineNo">317</span>  private DrainingServerTracker drainingServerTracker;<a name="line.317"></a>
+<span class="sourceLineNo">318</span>  // Tracker for load balancer state<a name="line.318"></a>
+<span class="sourceLineNo">319</span>  LoadBalancerTracker loadBalancerTracker;<a name="line.319"></a>
+<span class="sourceLineNo">320</span>  // Tracker for meta location, if any client ZK quorum specified<a name="line.320"></a>
+<span class="sourceLineNo">321</span>  MetaLocationSyncer metaLocationSyncer;<a name="line.321"></a>
+<span class="sourceLineNo">322</span>  // Tracker for active master location, if any client ZK quorum specified<a name="line.322"></a>
+<span class="sourceLineNo">323</span>  MasterAddressSyncer masterAddressSyncer;<a name="line.323"></a>
+<span class="sourceLineNo">324</span><a name="line.324"></a>
+<span class="sourceLineNo">325</span>  // Tracker for split and merge state<a name="line.325"></a>
+<span class="sourceLineNo">326</span>  private SplitOrMergeTracker splitOrMergeTracker;<a name="line.326"></a>
+<span class="sourceLineNo">327</span><a name="line.327"></a>
+<span class="sourceLineNo">328</span>  // Tracker for region normalizer state<a name="line.328"></a>
+<span class="sourceLineNo">329</span>  private RegionNormalizerTracker regionNormalizerTracker;<a name="line.329"></a>
+<span class="sourceLineNo">330</span><a name="line.330"></a>
+<span class="sourceLineNo">331</span>  private ClusterSchemaService clusterSchemaService;<a name="line.331"></a>
+<span class="sourceLineNo">332</span><a name="line.332"></a>
+<span class="sourceLineNo">333</span>  public static final String HBASE_MASTER_WAIT_ON_SERVICE_IN_SECONDS =<a name="line.333"></a>
+<span class="sourceLineNo">334</span>    "hbase.master.wait.on.service.seconds";<a name="line.334"></a>
+<span class="sourceLineNo">335</span>  public static final int DEFAULT_HBASE_MASTER_WAIT_ON_SERVICE_IN_SECONDS = 5 * 60;<a name="line.335"></a>
 <span class="sourceLineNo">336</span><a name="line.336"></a>
-<span class="sourceLineNo">337</span>  public static final String HBASE_MASTER_WAIT_ON_SERVICE_IN_SECONDS =<a name="line.337"></a>
-<span class="sourceLineNo">338</span>    "hbase.master.wait.on.service.seconds";<a name="line.338"></a>
-<span class="sourceLineNo">339</span>  public static final int DEFAULT_HBASE_MASTER_WAIT_ON_SERVICE_IN_SECONDS = 5 * 60;<a name="line.339"></a>
-<span class="sourceLineNo">340</span><a name="line.340"></a>
-<span class="sourceLineNo">341</span>  // Metrics for the HMaster<a name="line.341"></a>
-<span class="sourceLineNo">342</span>  final MetricsMaster metricsMaster;<a name="line.342"></a>
-<span class="sourceLineNo">343</span>  // file system manager for the master FS operations<a name="line.343"></a>
-<span class="sourceLineNo">344</span>  private MasterFileSystem fileSystemManager;<a name="line.344"></a>
-<span class="sourceLineNo">345</span>  private MasterWalManager walManager;<a name="line.345"></a>
-<span class="sourceLineNo">346</span><a name="line.346"></a>
-<span class="sourceLineNo">347</span>  // server manager to deal with region server info<a name="line.347"></a>
-<span class="sourceLineNo">348</span>  private volatile ServerManager serverManager;<a name="line.348"></a>
-<span class="sourceLineNo">349</span><a name="line.349"></a>
-<span class="sourceLineNo">350</span>  // manager of assignment nodes in zookeeper<a name="line.350"></a>
-<span class="sourceLineNo">351</span>  private AssignmentManager assignmentManager;<a name="line.351"></a>
-<span class="sourceLineNo">352</span><a name="line.352"></a>
-<span class="sourceLineNo">353</span>  // manager of replication<a name="line.353"></a>
-<span class="sourceLineNo">354</span>  private ReplicationPeerManager replicationPeerManager;<a name="line.354"></a>
-<span class="sourceLineNo">355</span><a name="line.355"></a>
-<span class="sourceLineNo">356</span>  private SyncReplicationReplayWALManager syncReplicationReplayWALManager;<a name="line.356"></a>
-<span class="sourceLineNo">357</span><a name="line.357"></a>
-<span class="sourceLineNo">358</span>  // buffer for "fatal error" notices from region servers<a name="line.358"></a>
-<span class="sourceLineNo">359</span>  // in the cluster. This is only used for assisting<a name="line.359"></a>
-<span class="sourceLineNo">360</span>  // operations/debugging.<a name="line.360"></a>
-<span class="sourceLineNo">361</span>  MemoryBoundedLogMessageBuffer rsFatals;<a name="line.361"></a>
-<span class="sourceLineNo">362</span><a name="line.362"></a>
-<span class="sourceLineNo">363</span>  // flag set after we become the active master (used for testing)<a name="line.363"></a>
-<span class="sourceLineNo">364</span>  private volatile boolean activeMaster = false;<a name="line.364"></a>
-<span class="sourceLineNo">365</span><a name="line.365"></a>
-<span class="sourceLineNo">366</span>  // flag set after we complete initialization once active<a name="line.366"></a>
-<span class="sourceLineNo">367</span>  private final ProcedureEvent&lt;?&gt; initialized = new ProcedureEvent&lt;&gt;("master initialized");<a name="line.367"></a>
+<span class="sourceLineNo">337</span>  // Metrics for the HMaster<a name="line.337"></a>
+<span class="sourceLineNo">338</span>  final MetricsMaster metricsMaster;<a name="line.338"></a>
+<span class="sourceLineNo">339</span>  // file system manager for the master FS operations<a name="line.339"></a>
+<span class="sourceLineNo">340</span>  private MasterFileSystem fileSystemManager;<a name="line.340"></a>
+<span class="sourceLineNo">341</span>  private MasterWalManager walManager;<a name="line.341"></a>
+<span class="sourceLineNo">342</span><a name="line.342"></a>
+<span class="sourceLineNo">343</span>  // server manager to deal with region server info<a name="line.343"></a>
+<span class="sourceLineNo">344</span>  private volatile ServerManager serverManager;<a name="line.344"></a>
+<span class="sourceLineNo">345</span><a name="line.345"></a>
+<span class="sourceLineNo">346</span>  // manager of assignment nodes in zookeeper<a name="line.346"></a>
+<span class="sourceLineNo">347</span>  private AssignmentManager assignmentManager;<a name="line.347"></a>
+<span class="sourceLineNo">348</span><a name="line.348"></a>
+<span class="sourceLineNo">349</span>  // manager of replication<a name="line.349"></a>
+<span class="sourceLineNo">350</span>  private ReplicationPeerManager replicationPeerManager;<a name="line.350"></a>
+<span class="sourceLineNo">351</span><a name="line.351"></a>
+<span class="sourceLineNo">352</span>  private SyncReplicationReplayWALManager syncReplicationReplayWALManager;<a name="line.352"></a>
+<span class="sourceLineNo">353</span><a name="line.353"></a>
+<span class="sourceLineNo">354</span>  // buffer for "fatal error" notices from region servers<a name="line.354"></a>
+<span class="sourceLineNo">355</span>  // in the cluster. This is only used for assisting<a name="line.355"></a>
+<span class="sourceLineNo">356</span>  // operations/debugging.<a name="line.356"></a>
+<span class="sourceLineNo">357</span>  MemoryBoundedLogMessageBuffer rsFatals;<a name="line.357"></a>
+<span class="sourceLineNo">358</span><a name="line.358"></a>
+<span class="sourceLineNo">359</span>  // flag set after we become the active master (used for testing)<a name="line.359"></a>
+<span class="sourceLineNo">360</span>  private volatile boolean activeMaster = false;<a name="line.360"></a>
+<span class="sourceLineNo">361</span><a name="line.361"></a>
+<span class="sourceLineNo">362</span>  // flag set after we complete initialization once active<a name="line.362"></a>
+<span class="sourceLineNo">363</span>  private final ProcedureEvent&lt;?&gt; initialized = new ProcedureEvent&lt;&gt;("master initialized");<a name="line.363"></a>
+<span class="sourceLineNo">364</span><a name="line.364"></a>
+<span class="sourceLineNo">365</span>  // flag set after master services are started,<a name="line.365"></a>
+<span class="sourceLineNo">366</span>  // initialization may have not completed yet.<a name="line.366"></a>
+<span class="sourceLineNo">367</span>  volatile boolean serviceStarted = false;<a name="line.367"></a>
 <span class="sourceLineNo">368</span><a name="line.368"></a>
-<span class="sourceLineNo">369</span>  // flag set after master services are started,<a name="line.369"></a>
-<span class="sourceLineNo">370</span>  // initialization may have not completed yet.<a name="line.370"></a>
-<span class="sourceLineNo">371</span>  volatile boolean serviceStarted = false;<a name="line.371"></a>
-<span class="sourceLineNo">372</span><a name="line.372"></a>
-<span class="sourceLineNo">373</span>  // Maximum time we should run balancer for<a name="line.373"></a>
-<span class="sourceLineNo">374</span>  private final int maxBlancingTime;<a name="line.374"></a>
-<span class="sourceLineNo">375</span>  // Maximum percent of regions in transition when balancing<a name="line.375"></a>
-<span class="sourceLineNo">376</span>  private final double maxRitPercent;<a name="line.376"></a>
-<span class="sourceLineNo">377</span><a name="line.377"></a>
-<span class="sourceLineNo">378</span>  private final LockManager lockManager = new LockManager(this);<a name="line.378"></a>
-<span class="sourceLineNo">379</span><a name="line.379"></a>
-<span class="sourceLineNo">380</span>  private LoadBalancer balancer;<a name="line.380"></a>
-<span class="sourceLineNo">381</span>  private RegionNormalizer normalizer;<a name="line.381"></a>
-<span class="sourceLineNo">382</span>  private BalancerChore balancerChore;<a name="line.382"></a>
-<span class="sourceLineNo">383</span>  private RegionNormalizerChore normalizerChore;<a name="line.383"></a>
-<span class="sourceLineNo">384</span>  private ClusterStatusChore clusterStatusChore;<a name="line.384"></a>
-<span class="sourceLineNo">385</span>  private ClusterStatusPublisher clusterStatusPublisherChore = null;<a name="line.385"></a>
-<span class="sourceLineNo">386</span><a name="line.386"></a>
-<span class="sourceLineNo">387</span>  CatalogJanitor catalogJanitorChore;<a name="line.387"></a>
-<span class="sourceLineNo">388</span>  private LogCleaner logCleaner;<a name="line.388"></a>
-<span class="sourceLineNo">389</span>  private HFileCleaner hfileCleaner;<a name="line.389"></a>
-<span class="sourceLineNo">390</span>  private ReplicationBarrierCleaner replicationBarrierCleaner;<a name="line.390"></a>
-<span class="sourceLineNo">391</span>  private ExpiredMobFileCleanerChore expiredMobFileCleanerChore;<a name="line.391"></a>
-<span class="sourceLineNo">392</span>  private MobCompactionChore mobCompactChore;<a name="line.392"></a>
-<span class="sourceLineNo">393</span>  private MasterMobCompactionThread mobCompactThread;<a name="line.393"></a>
-<span class="sourceLineNo">394</span>  // used to synchronize the mobCompactionStates<a name="line.394"></a>
-<span class="sourceLineNo">395</span>  private final IdLock mobCompactionLock = new IdLock();<a name="line.395"></a>
-<span class="sourceLineNo">396</span>  // save the information of mob compactions in tables.<a name="line.396"></a>
-<span class="sourceLineNo">397</span>  // the key is table name, the value is the number of compactions in that table.<a name="line.397"></a>
-<span class="sourceLineNo">398</span>  private Map&lt;TableName, AtomicInteger&gt; mobCompactionStates = Maps.newConcurrentMap();<a name="line.398"></a>
+<span class="sourceLineNo">369</span>  // Maximum time we should run balancer for<a name="line.369"></a>
+<span class="sourceLineNo">370</span>  private final int maxBlancingTime;<a name="line.370"></a>
+<span class="sourceLineNo">371</span>  // Maximum percent of regions in transition when balancing<a name="line.371"></a>
+<span class="sourceLineNo">372</span>  private final double maxRitPercent;<a name="line.372"></a>
+<span class="sourceLineNo">373</span><a name="line.373"></a>
+<span class="sourceLineNo">374</span>  private final LockManager lockManager = new LockManager(this);<a name="line.374"></a>
+<span class="sourceLineNo">375</span><a name="line.375"></a>
+<span class="sourceLineNo">376</span>  private LoadBalancer balancer;<a name="line.376"></a>
+<span class="sourceLineNo">377</span>  private RegionNormalizer normalizer;<a name="line.377"></a>
+<span class="sourceLineNo">378</span>  private BalancerChore balancerChore;<a name="line.378"></a>
+<span class="sourceLineNo">379</span>  private RegionNormalizerChore normalizerChore;<a name="line.379"></a>
+<span class="sourceLineNo">380</span>  private ClusterStatusChore clusterStatusChore;<a name="line.380"></a>
+<span class="sourceLineNo">381</span>  private ClusterStatusPublisher clusterStatusPublisherChore = null;<a name="line.381"></a>
+<span class="sourceLineNo">382</span><a name="line.382"></a>
+<span class="sourceLineNo">383</span>  CatalogJanitor catalogJanitorChore;<a name="line.383"></a>
+<span class="sourceLineNo">384</span>  private LogCleaner logCleaner;<a name="line.384"></a>
+<span class="sourceLineNo">385</span>  private HFileCleaner hfileCleaner;<a name="line.385"></a>
+<span class="sourceLineNo">386</span>  private ReplicationBarrierCleaner replicationBarrierCleaner;<a name="line.386"></a>
+<span class="sourceLineNo">387</span>  private ExpiredMobFileCleanerChore expiredMobFileCleanerChore;<a name="line.387"></a>
+<span class="sourceLineNo">388</span>  private MobCompactionChore mobCompactChore;<a name="line.388"></a>
+<span class="sourceLineNo">389</span>  private MasterMobCompactionThread mobCompactThread;<a name="line.389"></a>
+<span class="sourceLineNo">390</span>  // used to synchronize the mobCompactionStates<a name="line.390"></a>
+<span class="sourceLineNo">391</span>  private final IdLock mobCompactionLock = new IdLock();<a name="line.391"></a>
+<span class="sourceLineNo">392</span>  // save the information of mob compactions in tables.<a name="line.392"></a>
+<span class="sourceLineNo">393</span>  // the key is table name, the value is the number of compactions in that table.<a name="line.393"></a>
+<span class="sourceLineNo">394</span>  private Map&lt;TableName, AtomicInteger&gt; mobCompactionStates = Maps.newConcurrentMap();<a name="line.394"></a>
+<span class="sourceLineNo">395</span><a name="line.395"></a>
+<span class="sourceLineNo">396</span>  MasterCoprocessorHost cpHost;<a name="line.396"></a>
+<span class="sourceLineNo">397</span><a name="line.397"></a>
+<span class="sourceLineNo">398</span>  private final boolean preLoadTableDescriptors;<a name="line.398"></a>
 <span class="sourceLineNo">399</span><a name="line.399"></a>
-<span class="sourceLineNo">400</span>  MasterCoprocessorHost cpHost;<a name="line.400"></a>
-<span class="sourceLineNo">401</span><a name="line.401"></a>
-<span class="sourceLineNo">402</span>  private final boolean preLoadTableDescriptors;<a name="line.402"></a>
-<span class="sourceLineNo">403</span><a name="line.403"></a>
-<span class="sourceLineNo">404</span>  // Time stamps for when a hmaster became active<a name="line.404"></a>
-<span class="sourceLineNo">405</span>  private long masterActiveTime;<a name="line.405"></a>
-<span class="sourceLineNo">406</span><a name="line.406"></a>
-<span class="sourceLineNo">407</span>  // Time stamp for when HMaster finishes becoming Active Master<a name="line.407"></a>
-<span class="sourceLineNo">408</span>  private long masterFinishedInitializationTime;<a name="line.408"></a>
-<span class="sourceLineNo">409</span><a name="line.409"></a>
-<span class="sourceLineNo">410</span>  //should we check the compression codec type at master side, default true, HBASE-6370<a name="line.410"></a>
-<span class="sourceLineNo">411</span>  private final boolean masterCheckCompression;<a name="line.411"></a>
-<span class="sourceLineNo">412</span><a name="line.412"></a>
-<span class="sourceLineNo">413</span>  //should we check encryption settings at master side, default true<a name="line.413"></a>
-<span class="sourceLineNo">414</span>  private final boolean masterCheckEncryption;<a name="line.414"></a>
-<span class="sourceLineNo">415</span><a name="line.415"></a>
-<span class="sourceLineNo">416</span>  Map&lt;String, Service&gt; coprocessorServiceHandlers = Maps.newHashMap();<a name="line.416"></a>
-<span class="sourceLineNo">417</span><a name="line.417"></a>
-<span class="sourceLineNo">418</span>  // monitor for snapshot of hbase tables<a name="line.418"></a>
-<span class="sourceLineNo">419</span>  SnapshotManager snapshotManager;<a name="line.419"></a>
-<span class="sourceLineNo">420</span>  // monitor for distributed procedures<a name="line.420"></a>
-<span class="sourceLineNo">421</span>  private MasterProcedureManagerHost mpmHost;<a name="line.421"></a>
-<span class="sourceLineNo">422</span><a name="line.422"></a>
-<span class="sourceLineNo">423</span>  // it is assigned after 'initialized' guard set to true, so should be volatile<a name="line.423"></a>
-<span class="sourceLineNo">424</span>  private volatile MasterQuotaManager quotaManager;<a name="line.424"></a>
-<span class="sourceLineNo">425</span>  private SpaceQuotaSnapshotNotifier spaceQuotaSnapshotNotifier;<a name="line.425"></a>
-<span class="sourceLineNo">426</span>  private QuotaObserverChore quotaObserverChore;<a name="line.426"></a>
-<span class="sourceLineNo">427</span>  private SnapshotQuotaObserverChore snapshotQuotaChore;<a name="line.427"></a>
-<span class="sourceLineNo">428</span><a name="line.428"></a>
-<span class="sourceLineNo">429</span>  private ProcedureExecutor&lt;MasterProcedureEnv&gt; procedureExecutor;<a name="line.429"></a>
-<span class="sourceLineNo">430</span>  private WALProcedureStore procedureStore;<a name="line.430"></a>
-<span class="sourceLineNo">431</span><a name="line.431"></a>
-<span class="sourceLineNo">432</span>  // handle table states<a name="line.432"></a>
-<span class="sourceLineNo">433</span>  private TableStateManager tableStateManager;<a name="line.433"></a>
-<span class="sourceLineNo">434</span><a name="line.434"></a>
-<span class="sourceLineNo">435</span>  private long splitPlanCount;<a name="line.435"></a>
-<span class="sourceLineNo">436</span>  private long mergePlanCount;<a name="line.436"></a>
-<span class="sourceLineNo">437</span><a name="line.437"></a>
-<span class="sourceLineNo">438</span>  /* Handle favored nodes information */<a name="line.438"></a>
-<span class="sourceLineNo">439</span>  private FavoredNodesManager favoredNodesManager;<a name="line.439"></a>
-<span class="sourceLineNo">440</span><a name="line.440"></a>
-<span class="sourceLineNo">441</span>  /** jetty server for master to redirect requests to regionserver infoServer */<a name="line.441"></a>
-<span class="sourceLineNo">442</span>  private Server masterJettyServer;<a name="line.442"></a>
-<span class="sourceLineNo">443</span><a name="line.443"></a>
-<span class="sourceLineNo">444</span>  public static class RedirectServlet extends HttpServlet {<a name="line.444"></a>
-<span class="sourceLineNo">445</span>    private static final long serialVersionUID = 2894774810058302473L;<a name="line.445"></a>
-<span class="sourceLineNo">446</span>    private final int regionServerInfoPort;<a name="line.446"></a>
-<span class="sourceLineNo">447</span>    private final String regionServerHostname;<a name="line.447"></a>
-<span class="sourceLineNo">448</span><a name="line.448"></a>
-<span class="sourceLineNo">449</span>    /**<a name="line.449"></a>
-<span class="sourceLineNo">450</span>     * @param infoServer that we're trying to send all requests to<a name="line.450"></a>
-<span class="sourceLineNo">451</span>     * @param hostname may be null. if given, will be used for redirects instead of host from client.<a name="line.451"></a>
-<span class="sourceLineNo">452</span>     */<a name="line.452"></a>
-<span class="sourceLineNo">453</span>    public RedirectServlet(InfoServer infoServer, String hostname) {<a name="line.453"></a>
-<span class="sourceLineNo">454</span>       regionServerInfoPort = infoServer.getPort();<a name="line.454"></a>
-<span class="sourceLineNo">455</span>       regionServerHostname = hostname;<a name="line.455"></a>
-<span class="sourceLineNo">456</span>    }<a name="line.456"></a>
-<span class="sourceLineNo">457</span><a name="line.457"></a>
-<span class="sourceLineNo">458</span>    @Override<a name="line.458"></a>
-<span class="sourceLineNo">459</span>    public void doGet(HttpServletRequest request,<a name="line.459"></a>
-<span class="sourceLineNo">460</span>        HttpServletResponse response) throws ServletException, IOException {<a name="line.460"></a>
-<span class="sourceLineNo">461</span>      String redirectHost = regionServerHostname;<a name="line.461"></a>
-<span class="sourceLineNo">462</span>      if(redirectHost == null) {<a name="line.462"></a>
-<span class="sourceLineNo">463</span>        redirectHost = request.getServerName();<a name="line.463"></a>
-<span class="sourceLineNo">464</span>        if(!Addressing.isLocalAddress(InetAddress.getByName(redirectHost))) {<a name="line.464"></a>
-<span class="sourceLineNo">465</span>          LOG.warn("Couldn't resolve '" + redirectHost + "' as an address local to this node and '" +<a name="line.465"></a>
-<span class="sourceLineNo">466</span>              MASTER_HOSTNAME_KEY + "' is not set; client will get a HTTP 400 response. If " +<a name="line.466"></a>
-<span class="sourceLineNo">467</span>              "your HBase deployment relies on client accessible names that the region server process " +<a name="line.467"></a>
-<span class="sourceLineNo">468</span>              "can't resolve locally, then you should set the previously mentioned configuration variable " +<a name="line.468"></a>
-<span class="sourceLineNo">469</span>              "to an appropriate hostname.");<a name="line.469"></a>
-<span class="sourceLineNo">470</span>          // no sending client provided input back to the client, so the goal host is just in the logs.<a name="line.470"></a>
-<span class="sourceLineNo">471</span>          response.sendError(400, "Request was to a host that I can't resolve for any of the network interfaces on " +<a name="line.471"></a>
-<span class="sourceLineNo">472</span>              "this node. If this is due to an intermediary such as an HTTP load balancer or other proxy, your HBase " +<a name="line.472"></a>
-<span class="sourceLineNo">473</span>              "administrator can set '" + MASTER_HOSTNAME_KEY + "' to point to the correct hostname.");<a name="line.473"></a>
-<span class="sourceLineNo">474</span>          return;<a name="line.474"></a>
-<span class="sourceLineNo">475</span>        }<a name="line.475"></a>
-<span class="sourceLineNo">476</span>      }<a name="line.476"></a>
-<span class="sourceLineNo">477</span>      // TODO this scheme should come from looking at the scheme registered in the infoserver's http server for the<a name="line.477"></a>
-<span class="sourceLineNo">478</span>      // host and port we're using, but it's buried way too deep to do that ATM.<a name="line.478"></a>
-<span class="sourceLineNo">479</span>      String redirectUrl = request.getScheme() + "://"<a name="line.479"></a>
-<span class="sourceLineNo">480</span>        + redirectHost + ":" + regionServerInfoPort<a name="line.480"></a>
-<span class="sourceLineNo">481</span>        + request.getRequestURI();<a name="line.481"></a>
-<span class="sourceLineNo">482</span>      response.sendRedirect(redirectUrl);<a name="line.482"></a>
-<span class="sourceLineNo">483</span>    }<a name="line.483"></a>
-<span class="sourceLineNo">484</span>  }<a name="line.484"></a>
-<span class="sourceLineNo">485</span><a name="line.485"></a>
-<span class="sourceLineNo">486</span>  /**<a name="line.486"></a>
-<span class="sourceLineNo">487</span>   * Initializes the HMaster. The steps are as follows:<a name="line.487"></a>
-<span class="sourceLineNo">488</span>   * &lt;p&gt;<a name="line.488"></a>
-<span class="sourceLineNo">489</span>   * &lt;ol&gt;<a name="line.489"></a>
-<span class="sourceLineNo">490</span>   * &lt;li&gt;Initialize the local HRegionServer<a name="line.490"></a>
-<span class="sourceLineNo">491</span>   * &lt;li&gt;Start the ActiveMasterManager.<a name="line.491"></a>
-<span class="sourceLineNo">492</span>   * &lt;/ol&gt;<a name="line.492"></a>
-<span class="sourceLineNo">493</span>   * &lt;p&gt;<a name="line.493"></a>
-<span class="sourceLineNo">494</span>   * Remaining steps of initialization occur in<a name="line.494"></a>
-<span class="sourceLineNo">495</span>   * #finishActiveMasterInitialization(MonitoredTask) after<a name="line.495"></a>
-<span class="sourceLineNo">496</span>   * the master becomes the active one.<a name="line.496"></a>
-<span class="sourceLineNo">497</span>   */<a name="line.497"></a>
-<span class="sourceLineNo">498</span>  public HMaster(final Configuration conf)<a name="line.498"></a>
-<span class="sourceLineNo">499</span>      throws IOException, KeeperException {<a name="line.499"></a>
-<span class="sourceLineNo">500</span>    super(conf);<a name="line.500"></a>
-<span class="sourceLineNo">501</span>    TraceUtil.initTracer(conf);<a name="line.501"></a>
-<span class="sourceLineNo">502</span>    try {<a name="line.502"></a>
-<span class="sourceLineNo">503</span>      this.rsFatals = new MemoryBoundedLogMessageBuffer(<a name="line.503"></a>
-<span class="sourceLineNo">504</span>          conf.getLong("hbase.master.buffer.for.rs.fatals", 1 * 1024 * 1024));<a name="line.504"></a>
-<span class="sourceLineNo">505</span>      LOG.info("hbase.rootdir=" + getRootDir() +<a name="line.505"></a>
-<span class="sourceLineNo">506</span>          ", hbase.cluster.distributed=" + this.conf.getBoolean(HConstants.CLUSTER_DISTRIBUTED, false));<a name="line.506"></a>
-<span class="sourceLineNo">507</span><a name="line.507"></a>
-<span class="sourceLineNo">508</span>      // Disable usage of meta replicas in the master<a name="line.508"></a>
-<span class="sourceLineNo">509</span>      this.conf.setBoolean(HConstants.USE_META_REPLICAS, false);<a name="line.509"></a>
-<span class="sourceLineNo">510</span><a name="line.510"></a>
-<span class="sourceLineNo">511</span>      decorateMasterConfiguration(this.conf);<a name="line.511"></a>
-<span class="sourceLineNo">512</span><a name="line.512"></a>
-<span class="sourceLineNo">513</span>      // Hack! Maps DFSClient =&gt; Master for logs.  HDFS made this<a name="line.513"></a>
-<span class="sourceLineNo">514</span>      // config param for task trackers, but we can piggyback off of it.<a name="line.514"></a>
-<span class="sourceLineNo">515</span>      if (this.conf.get("mapreduce.task.attempt.id") == null) {<a name="line.515"></a>
-<span class="sourceLineNo">516</span>        this.conf.set("mapreduce.task.attempt.id", "hb_m_" + this.serverName.toString());<a name="line.516"></a>
-<span class="sourceLineNo">517</span>      }<a name="line.517"></a>
+<span class="sourceLineNo">400</span>  // Time stamps for when a hmaster became active<a name="line.400"></a>
+<span class="sourceLineNo">401</span>  private long masterActiveTime;<a name="line.401"></a>
+<span class="sourceLineNo">402</span><a name="line.402"></a>
+<span class="sourceLineNo">403</span>  // Time stamp for when HMaster finishes becoming Active Master<a name="line.403"></a>
+<span class="sourceLineNo">404</span>  private long masterFinishedInitializationTime;<a name="line.404"></a>
+<span class="sourceLineNo">405</span><a name="line.405"></a>
+<span class="sourceLineNo">406</span>  //should we check the compression codec type at master side, default true, HBASE-6370<a name="line.406"></a>
+<span class="sourceLineNo">407</span>  private final boolean masterCheckCompression;<a name="line.407"></a>
+<span class="sourceLineNo">408</span><a name="line.408"></a>
+<span class="sourceLineNo">409</span>  //should we check encryption settings at master side, default true<a name="line.409"></a>
+<span class="sourceLineNo">410</span>  private final boolean masterCheckEncryption;<a name="line.410"></a>
+<span class="sourceLineNo">411</span><a name="line.411"></a>
+<span class="sourceLineNo">412</span>  Map&lt;String, Service&gt; coprocessorServiceHandlers = Maps.newHashMap();<a name="line.412"></a>
+<span class="sourceLineNo">413</span><a name="line.413"></a>
+<span class="sourceLineNo">414</span>  // monitor for snapshot of hbase tables<a name="line.414"></a>
+<span class="sourceLineNo">415</span>  SnapshotManager snapshotManager;<a name="line.415"></a>
+<span class="sourceLineNo">416</span>  // monitor for distributed procedures<a name="line.416"></a>
+<span class="sourceLineNo">417</span>  private MasterProcedureManagerHost mpmHost;<a name="line.417"></a>
+<span class="sourceLineNo">418</span><a name="line.418"></a>
+<span class="sourceLineNo">419</span>  // it is assigned after 'initialized' guard set to true, so should be volatile<a name="line.419"></a>
+<span class="sourceLineNo">420</span>  private volatile MasterQuotaManager quotaManager;<a name="line.420"></a>
+<span class="sourceLineNo">421</span>  private SpaceQuotaSnapshotNotifier spaceQuotaSnapshotNotifier;<a name="line.421"></a>
+<span class="sourceLineNo">422</span>  private QuotaObserverChore quotaObserverChore;<a name="line.422"></a>
+<span class="sourceLineNo">423</span>  private SnapshotQuotaObserverChore snapshotQuotaChore;<a name="line.423"></a>
+<span class="sourceLineNo">424</span><a name="line.424"></a>
+<span class="sourceLineNo">425</span>  private ProcedureExecutor&lt;MasterProcedureEnv&gt; procedureExecutor;<a name="line.425"></a>
+<span class="sourceLineNo">426</span>  private WALProcedureStore procedureStore;<a name="line.426"></a>
+<span class="sourceLineNo">427</span><a name="line.427"></a>
+<span class="sourceLineNo">428</span>  // handle table states<a name="line.428"></a>
+<span class="sourceLineNo">429</span>  private TableStateManager tableStateManager;<a name="line.429"></a>
+<span class="sourceLineNo">430</span><a name="line.430"></a>
+<span class="sourceLineNo">431</span>  private long splitPlanCount;<a name="line.431"></a>
+<span class="sourceLineNo">432</span>  private long mergePlanCount;<a name="line.432"></a>
+<span class="sourceLineNo">433</span><a name="line.433"></a>
+<span class="sourceLineNo">434</span>  /* Handle favored nodes information */<a name="line.434"></a>
+<span class="sourceLineNo">435</span>  private FavoredNodesManager favoredNodesManager;<a name="line.435"></a>
+<span class="sourceLineNo">436</span><a name="line.436"></a>
+<span class="sourceLineNo">437</span>  /** jetty server for master to redirect requests to regionserver infoServer */<a name="line.437"></a>
+<span class="sourceLineNo">438</span>  private Server masterJettyServer;<a name="line.438"></a>
+<span class="sourceLineNo">439</span><a name="line.439"></a>
+<span class="sourceLineNo">440</span>  // Determine if we should do normal startup or minimal "single-user" mode with no region<a name="line.440"></a>
+<span class="sourceLineNo">441</span>  // servers and no user tables. Useful for repair and recovery of hbase:meta<a name="line.441"></a>
+<span class="sourceLineNo">442</span>  private final boolean maintenanceMode;<a name="line.442"></a>
+<span class="sourceLineNo">443</span>  static final String MAINTENANCE_MODE = "hbase.master.maintenance_mode";<a name="line.443"></a>
+<span class="sourceLineNo">444</span><a name="line.444"></a>
+<span class="sourceLineNo">445</span>  public static class RedirectServlet extends HttpServlet {<a name="line.445"></a>
+<span class="sourceLineNo">446</span>    private static final long serialVersionUID = 2894774810058302473L;<a name="line.446"></a>
+<span class="sourceLineNo">447</span>    private final int regionServerInfoPort;<a name="line.447"></a>
+<span class="sourceLineNo">448</span>    private final String regionServerHostname;<a name="line.448"></a>
+<span class="sourceLineNo">449</span><a name="line.449"></a>
+<span class="sourceLineNo">450</span>    /**<a name="line.450"></a>
+<span class="sourceLineNo">451</span>     * @param infoServer that we're trying to send all requests to<a name="line.451"></a>
+<span class="sourceLineNo">452</span>     * @param hostname may be null. if given, will be used for redirects instead of host from client.<a name="line.452"></a>
+<span class="sourceLineNo">453</span>     */<a name="line.453"></a>
+<span class="sourceLineNo">454</span>    public RedirectServlet(InfoServer infoServer, String hostname) {<a name="line.454"></a>
+<span class="sourceLineNo">455</span>       regionServerInfoPort = infoServer.getPort();<a name="line.455"></a>
+<span class="sourceLineNo">456</span>       regionServerHostname = hostname;<a name="line.456"></a>
+<span class="sourceLineNo">457</span>    }<a name="line.457"></a>
+<span class="sourceLineNo">458</span><a name="line.458"></a>
+<span class="sourceLineNo">459</span>    @Override<a name="line.459"></a>
+<span class="sourceLineNo">460</span>    public void doGet(HttpServletRequest request,<a name="line.460"></a>
+<span class="sourceLineNo">461</span>        HttpServletResponse response) throws ServletException, IOException {<a name="line.461"></a>
+<span class="sourceLineNo">462</span>      String redirectHost = regionServerHostname;<a name="line.462"></a>
+<span class="sourceLineNo">463</span>      if(redirectHost == null) {<a name="line.463"></a>
+<span class="sourceLineNo">464</span>        redirectHost = request.getServerName();<a name="line.464"></a>
+<span class="sourceLineNo">465</span>        if(!Addressing.isLocalAddress(InetAddress.getByName(redirectHost))) {<a name="line.465"></a>
+<span class="sourceLineNo">466</span>          LOG.warn("Couldn't resolve '" + redirectHost + "' as an address local to this node and '" +<a name="line.466"></a>
+<span class="sourceLineNo">467</span>              MASTER_HOSTNAME_KEY + "' is not set; client will get a HTTP 400 response. If " +<a name="line.467"></a>
+<span class="sourceLineNo">468</span>              "your HBase deployment relies on client accessible names that the region server process " +<a name="line.468"></a>
+<span class="sourceLineNo">469</span>              "can't resolve locally, then you should set the previously mentioned configuration variable " +<a name="line.469"></a>
+<span class="sourceLineNo">470</span>              "to an appropriate hostname.");<a name="line.470"></a>
+<span class="sourceLineNo">471</span>          // no sending client provided input back to the client, so the goal host is just in the logs.<a name="line.471"></a>
+<span class="sourceLineNo">472</span>          response.sendError(400, "Request was to a host that I can't resolve for any of the network interfaces on " +<a name="line.472"></a>
+<span class="sourceLineNo">473</span>              "this node. If this is due to an intermediary such as an HTTP load balancer or other proxy, your HBase " +<a name="line.473"></a>
+<span class="sourceLineNo">474</span>              "administrator can set '" + MASTER_HOSTNAME_KEY + "' to point to the correct hostname.");<a name="line.474"></a>
+<span class="sourceLineNo">475</span>          return;<a name="line.475"></a>
+<span class="sourceLineNo">476</span>        }<a name="line.476"></a>
+<span class="sourceLineNo">477</span>      }<a name="line.477"></a>
+<span class="sourceLineNo">478</span>      // TODO this scheme should come from looking at the scheme registered in the infoserver's http server for the<a name="line.478"></a>
+<span class="sourceLineNo">479</span>      // host and port we're using, but it's buried way too deep to do that ATM.<a name="line.479"></a>
+<span class="sourceLineNo">480</span>      String redirectUrl = request.getScheme() + "://"<a name="line.480"></a>
+<span class="sourceLineNo">481</span>        + redirectHost + ":" + regionServerInfoPort<a name="line.481"></a>
+<span class="sourceLineNo">482</span>        + request.getRequestURI();<a name="line.482"></a>
+<span class="sourceLineNo">483</span>      response.sendRedirect(redirectUrl);<a name="line.483"></a>
+<span class="sourceLineNo">484</span>    }<a name="line.484"></a>
+<span class="sourceLineNo">485</span>  }<a name="line.485"></a>
+<span class="sourceLineNo">486</span><a name="line.486"></a>
+<span class="sourceLineNo">487</span>  /**<a name="line.487"></a>
+<span class="sourceLineNo">488</span>   * Initializes the HMaster. The steps are as follows:<a name="line.488"></a>
+<span class="sourceLineNo">489</span>   * &lt;p&gt;<a name="line.489"></a>
+<span class="sourceLineNo">490</span>   * &lt;ol&gt;<a name="line.490"></a>
+<span class="sourceLineNo">491</span>   * &lt;li&gt;Initialize the local HRegionServer<a name="line.491"></a>
+<span class="sourceLineNo">492</span>   * &lt;li&gt;Start the ActiveMasterManager.<a name="line.492"></a>
+<span class="sourceLineNo">493</span>   * &lt;/ol&gt;<a name="line.493"></a>
+<span class="sourceLineNo">494</span>   * &lt;p&gt;<a name="line.494"></a>
+<span class="sourceLineNo">495</span>   * Remaining steps of initialization occur in<a name="line.495"></a>
+<span class="sourceLineNo">496</span>   * #finishActiveMasterInitialization(MonitoredTask) after<a name="line.496"></a>
+<span class="sourceLineNo">497</span>   * the master becomes the active one.<a name="line.497"></a>
+<span class="sourceLineNo">498</span>   */<a name="line.498"></a>
+<span class="sourceLineNo">499</span>  public HMaster(final Configuration conf)<a name="line.499"></a>
+<span class="sourceLineNo">500</span>      throws IOException, KeeperException {<a name="line.500"></a>
+<span class="sourceLineNo">501</span>    super(conf);<a name="line.501"></a>
+<span class="sourceLineNo">502</span>    TraceUtil.initTracer(conf);<a name="line.502"></a>
+<span class="sourceLineNo">503</span>    try {<a name="line.503"></a>
+<span class="sourceLineNo">504</span>      if (conf.getBoolean(MAINTENANCE_MODE, false)) {<a name="line.504"></a>
+<span class="sourceLineNo">505</span>        LOG.info("Detected {}=true via configuration.", MAINTENANCE_MODE);<a name="line.505"></a>
+<span class="sourceLineNo">506</span>        maintenanceMode = true;<a name="line.506"></a>
+<span class="sourceLineNo">507</span>      } else if (Boolean.getBoolean(MAINTENANCE_MODE)) {<a name="line.507"></a>
+<span class="sourceLineNo">508</span>        LOG.info("Detected {}=true via environment variables.", MAINTENANCE_MODE);<a name="line.508"></a>
+<span class="sourceLineNo">509</span>        maintenanceMode = true;<a name="line.509"></a>
+<span class="sourceLineNo">510</span>      } else {<a name="line.510"></a>
+<span class="sourceLineNo">511</span>        maintenanceMode = false;<a name="line.511"></a>
+<span class="sourceLineNo">512</span>      }<a name="line.512"></a>
+<span class="sourceLineNo">513</span><a name="line.513"></a>
+<span class="sourceLineNo">514</span>      this.rsFatals = new MemoryBoundedLogMessageBuffer(<a name="line.514"></a>
+<span class="sourceLineNo">515</span>          conf.getLong("hbase.master.buffer.for.rs.fatals", 1 * 1024 * 1024));<a name="line.515"></a>
+<span class="sourceLineNo">516</span>      LOG.info("hbase.rootdir=" + getRootDir() +<a name="line.516"></a>
+<span class="sourceLineNo">517</span>          ", hbase.cluster.distributed=" + this.conf.getBoolean(HConstants.CLUSTER_DISTRIBUTED, false));<a name="line.517"></a>
 <span class="sourceLineNo">518</span><a name="line.518"></a>
-<span class="sourceLineNo">519</span>      // should we check the compression codec type at master side, default true, HBASE-6370<a name="line.519"></a>
-<span class="sourceLineNo">520</span>      this.masterCheckCompression = conf.getBoolean("hbase.master.check.compression", true);<a name="line.520"></a>
+<span class="sourceLineNo">519</span>      // Disable usage of meta replicas in the master<a name="line.519"></a>
+<span class="sourceLineNo">520</span>      this.conf.setBoolean(HConstants.USE_META_REPLICAS, false);<a name="line.520"></a>
 <span class="sourceLineNo">521</span><a name="line.521"></a>
-<span class="sourceLineNo">522</span>      // should we check encryption settings at master side, default true<a name="line.522"></a>
-<span class="sourceLineNo">523</span>      this.masterCheckEncryption = conf.getBoolean("hbase.master.check.encryption", true);<a name="line.523"></a>
-<span class="sourceLineNo">524</span><a name="line.524"></a>
-<span class="sourceLineNo">525</span>      this.metricsMaster = new MetricsMaster(new MetricsMasterWrapperImpl(this));<a name="line.525"></a>
-<span class="sourceLineNo">526</span><a name="line.526"></a>
-<span class="sourceLineNo">527</span>      // preload table descriptor at startup<a name="line.527"></a>
-<span class="sourceLineNo">528</span>      this.preLoadTableDescriptors = conf.getBoolean("hbase.master.preload.tabledescriptors", true);<a name="line.528"></a>
+<span class="sourceLineNo">522</span>      decorateMasterConfiguration(this.conf);<a name="line.522"></a>
+<span class="sourceLineNo">523</span><a name="line.523"></a>
+<span class="sourceLineNo">524</span>      // Hack! Maps DFSClient =&gt; Master for logs.  HDFS made this<a name="line.524"></a>
+<span class="sourceLineNo">525</span>      // config param for task trackers, but we can piggyback off of it.<a name="line.525"></a>
+<span class="sourceLineNo">526</span>      if (this.conf.get("mapreduce.task.attempt.id") == null) {<a name="line.526"></a>
+<span class="sourceLineNo">527</span>        this.conf.set("mapreduce.task.attempt.id", "hb_m_" + this.serverName.toString());<a name="line.527"></a>
+<span class="sourceLineNo">528</span>      }<a name="line.528"></a>
 <span class="sourceLineNo">529</span><a name="line.529"></a>
-<span class="sourceLineNo">530</span>      this.maxBlancingTime = getMaxBalancingTime();<a name="line.530"></a>
-<span class="sourceLineNo">531</span>      this.maxRitPercent = conf.getDouble(HConstants.HBASE_MASTER_BALANCER_MAX_RIT_PERCENT,<a name="line.531"></a>
-<span class="sourceLineNo">532</span>          HConstants.DEFAULT_HBASE_MASTER_BALANCER_MAX_RIT_PERCENT);<a name="line.532"></a>
-<span class="sourceLineNo">533</span><a name="line.533"></a>
-<span class="sourceLineNo">534</span>      // Do we publish the status?<a name="line.534"></a>
+<span class="sourceLineNo">530</span>      // should we check the compression codec type at master side, default true, HBASE-6370<a name="line.530"></a>
+<span class="sourceLineNo">531</span>      this.masterCheckCompression = conf.getBoolean("hbase.master.check.compression", true);<a name="line.531"></a>
+<span class="sourceLineNo">532</span><a name="line.532"></a>
+<span class="sourceLineNo">533</span>      // should we check encryption settings at master side, default true<a name="line.533"></a>
+<span class="sourceLineNo">534</span>      this.masterCheckEncryption = conf.getBoolean("hbase.master.check.encryption", true);<a name="line.534"></a>
 <span class="sourceLineNo">535</span><a name="line.535"></a>
-<span class="sourceLineNo">536</span>      boolean shouldPublish = conf.getBoolean(HConstants.STATUS_PUBLISHED,<a name="line.536"></a>
-<span class="sourceLineNo">537</span>          HConstants.STATUS_PUBLISHED_DEFAULT);<a name="line.537"></a>
-<span class="sourceLineNo">538</span>      Class&lt;? extends ClusterStatusPublisher.Publisher&gt; publisherClass =<a name="line.538"></a>
-<span class="sourceLineNo">539</span>          conf.getClass(ClusterStatusPublisher.STATUS_PUBLISHER_CLASS,<a name="line.539"></a>
-<span class="sourceLineNo">540</span>              ClusterStatusPublisher.DEFAULT_STATUS_PUBLISHER_CLASS,<a name="line.540"></a>
-<span class="sourceLineNo">541</span>              ClusterStatusPublisher.Publisher.class);<a name="line.541"></a>
-<span class="sourceLineNo">542</span><a name="line.542"></a>
-<span class="sourceLineNo">543</span>      if (shouldPublish) {<a name="line.543"></a>
-<span class="sourceLineNo">544</span>        if (publisherClass == null) {<a name="line.544"></a>
-<span class="sourceLineNo">545</span>          LOG.warn(HConstants.STATUS_PUBLISHED + " is true, but " +<a name="line.545"></a>
-<span class="sourceLineNo">546</span>              ClusterStatusPublisher.DEFAULT_STATUS_PUBLISHER_CLASS +<a name="line.546"></a>
-<span class="sourceLineNo">547</span>              " is not set - not publishing status");<a name="line.547"></a>
-<span class="sourceLineNo">548</span>        } else {<a name="line.548"></a>
-<span class="sourceLineNo">549</span>          clusterStatusPublisherChore = new ClusterStatusPublisher(this, conf, publisherClass);<a name="line.549"></a>
-<span class="sourceLineNo">550</span>          getChoreService().scheduleChore(clusterStatusPublisherChore);<a name="line.550"></a>
-<span class="sourceLineNo">551</span>        }<a name="line.551"></a>
-<span class="sourceLineNo">552</span>      }<a name="line.552"></a>
+<span class="sourceLineNo">536</span>      this.metricsMaster = new MetricsMaster(new MetricsMasterWrapperImpl(this));<a name="line.536"></a>
+<span class="sourceLineNo">537</span><a name="line.537"></a>
+<span class="sourceLineNo">538</span>      // preload table descriptor at startup<a name="line.538"></a>
+<span class="sourceLineNo">539</span>      this.preLoadTableDescriptors = conf.getBoolean("hbase.master.preload.tabledescriptors", true);<a name="line.539"></a>
+<span class="sourceLineNo">540</span><a name="line.540"></a>
+<span class="sourceLineNo">541</span>      this.maxBlancingTime = getMaxBalancingTime();<a name="line.541"></a>
+<span class="sourceLineNo">542</span>      this.maxRitPercent = conf.getDouble(HConstants.HBASE_MASTER_BALANCER_MAX_RIT_PERCENT,<a name="line.542"></a>
+<span class="sourceLineNo">543</span>          HConstants.DEFAULT_HBASE_MASTER_BALANCER_MAX_RIT_PERCENT);<a name="line.543"></a>
+<span class="sourceLineNo">544</span><a name="line.544"></a>
+<span class="sourceLineNo">545</span>      // Do we publish the status?<a name="line.545"></a>
+<span class="sourceLineNo">546</span><a name="line.546"></a>
+<span class="sourceLineNo">547</span>      boolean shouldPublish = conf.getBoolean(HConstants.STATUS_PUBLISHED,<a name="line.547"></a>
+<span class="sourceLineNo">548</span>          HConstants.STATUS_PUBLISHED_DEFAULT);<a name="line.548"></a>
+<span class="sourceLineNo">549</span>      Class&lt;? extends ClusterStatusPublisher.Publisher&gt; publisherClass =<a name="line.549"></a>
+<span class="sourceLineNo">550</span>          conf.getClass(ClusterStatusPublisher.STATUS_PUBLISHER_CLASS,<a name="line.550"></a>
+<span class="sourceLineNo">551</span>              ClusterStatusPublisher.DEFAULT_STATUS_PUBLISHER_CLASS,<a name="line.551"></a>
+<span class="sourceLineNo">552</span>              ClusterStatusPublisher.Publisher.class);<a name="line.552"></a>
 <span class="sourceLineNo">553</span><a name="line.553"></a>
-<span class="sourceLineNo">554</span>      // Some unit tests don't need a cluster, so no zookeeper at all<a name="line.554"></a>
-<span class="sourceLineNo">555</span>      if (!conf.getBoolean("hbase.testing.nocluster", false)) {<a name="line.555"></a>
-<span class="sourceLineNo">556</span>        this.activeMasterManager = new ActiveMasterManager(zooKeeper, this.serverName, this);<a name="line.556"></a>
-<span class="sourceLineNo">557</span>      } else {<a name="line.557"></a>
-<span class="sourceLineNo">558</span>        this.activeMasterManager = null;<a name="line.558"></a>
-<span class="sourceLineNo">559</span>      }<a name="line.559"></a>
-<span class="sourceLineNo">560</span>    } catch (Throwable t) {<a name="line.560"></a>
-<span class="sourceLineNo">561</span>      // Make sure we log the exception. HMaster is often started via reflection and the<a name="line.561"></a>
-<span class="sourceLineNo">562</span>      // cause of failed startup is lost.<a name="line.562"></a>
-<span class="sourceLineNo">563</span>      LOG.error("Failed construction of Master", t);<a name="line.563"></a>
-<span class="sourceLineNo">564</span>      throw t;<a name="line.564"></a>
-<span class="sourceLineNo">565</span>    }<a name="line.565"></a>
-<span class="sourceLineNo">566</span>  }<a name="line.566"></a>
-<span class="sourceLineNo">567</span><a name="line.567"></a>
-<span class="sourceLineNo">568</span>  @Override<a name="line.568"></a>
-<span class="sourceLineNo">569</span>  protected String getUseThisHostnameInstead(Configuration conf) {<a name="line.569"></a>
-<span class="sourceLineNo">570</span>    return conf.get(MASTER_HOSTNAME_KEY);<a name="line.570"></a>
-<span class="sourceLineNo">571</span>  }<a name="line.571"></a>
-<span class="sourceLineNo">572</span><a name="line.572"></a>
-<span class="sourceLineNo">573</span>  // Main run loop. Calls through to the regionserver run loop AFTER becoming active Master; will<a name="line.573"></a>
-<span class="sourceLineNo">574</span>  // block in here until then.<a name="line.574"></a>
-<span class="sourceLineNo">575</span>  @Override<a name="line.575"></a>
-<span class="sourceLineNo">576</span>  public void run() {<a name="line.576"></a>
-<span class="sourceLineNo">577</span>    try {<a name="line.577"></a>
-<span class="sourceLineNo">578</span>      if (!conf.getBoolean("hbase.testing.nocluster", false)) {<a name="line.578"></a>
-<span class="sourceLineNo">579</span>        Threads.setDaemonThreadRunning(new Thread(() -&gt; {<a name="line.579"></a>
-<span class="sourceLineNo">580</span>          try {<a name="line.580"></a>
-<span class="sourceLineNo">581</span>            int infoPort = putUpJettyServer();<a name="line.581"></a>
-<span class="sourceLineNo">582</span>            startActiveMasterManager(infoPort);<a name="line.582"></a>
-<span class="sourceLineNo">583</span>          } catch (Throwable t) {<a name="line.583"></a>
-<span class="sourceLineNo">584</span>            // Make sure we log the exception.<a name="line.584"></a>
-<span class="sourceLineNo">585</span>            String error = "Failed to become Active Master";<a name="line.585"></a>
-<span class="sourceLineNo">586</span>            LOG.error(error, t);<a name="line.586"></a>
-<span class="sourceLineNo">587</span>            // Abort should have been called already.<a name="line.587"></a>
-<span class="sourceLineNo">588</span>            if (!isAborted()) {<a name="line.588"></a>
-<span class="sourceLineNo">589</span>              abort(error, t);<a name="line.589"></a>
-<span class="sourceLineNo">590</span>            }<a name="line.590"></a>
-<span class="sourceLineNo">591</span>          }<a name="line.591"></a>
-<span class="sourceLineNo">592</span>        }), getName() + ":becomeActiveMaster");<a name="line.592"></a>
-<span class="sourceLineNo">593</span>      }<a name="line.593"></a>
-<span class="sourceLineNo">594</span>      // Fall in here even if we have been aborted. Need to run the shutdown services and<a name="line.594"></a>
-<span class="sourceLineNo">595</span>      // the super run call will do this for us.<a name="line.595"></a>
-<span class="sourceLineNo">596</span>      super.run();<a name="line.596"></a>
-<span class="sourceLineNo">597</span>    } finally {<a name="line.597"></a>
-<span class="sourceLineNo">598</span>      if (this.clusterSchemaService != null) {<a name="line.598"></a>
-<span class="sourceLineNo">599</span>        // If on way out, then we are no longer active master.<a name="line.599"></a>
-<span class="sourceLineNo">600</span>        this.clusterSchemaService.stopAsync();<a name="line.600"></a>
-<span class="sourceLineNo">601</span>        try {<a name="line.601"></a>
-<span class="sourceLineNo">602</span>          this.clusterSchemaService.awaitTerminated(<a name="line.602"></a>
-<span class="sourceLineNo">603</span>              getConfiguration().getInt(HBASE_MASTER_WAIT_ON_SERVICE_IN_SECONDS,<a name="line.603"></a>
-<span class="sourceLineNo">604</span>              DEFAULT_HBASE_MASTER_WAIT_ON_SERVICE_IN_SECONDS), TimeUnit.SECONDS);<a name="line.604"></a>
-<span class="sourceLineNo">605</span>        } catch (TimeoutException te) {<a name="line.605"></a>
-<span class="sourceLineNo">606</span>          LOG.warn("Failed shutdown of clusterSchemaService", te);<a name="line.606"></a>
-<span class="sourceLineNo">607</span>        }<a name="line.607"></a>
-<span class="sourceLineNo">608</span>      }<a name="line.608"></a>
-<span class="sourceLineNo">609</span>      this.activeMaster = false;<a name="line.609"></a>
-<span class="sourceLineNo">610</span>    }<a name="line.610"></a>
-<span class="sourceLineNo">611</span>  }<a name="line.611"></a>
-<span class="sourceLineNo">612</span><a name="line.612"></a>
-<span class="sourceLineNo">613</span>  // return the actual infoPort, -1 means disable info server.<a name="line.613"></a>
-<span class="sourceLineNo">614</span>  private int putUpJettyServer() throws IOException {<a name="line.614"></a>
-<span class="sourceLineNo">615</span>    if (!conf.getBoolean("hbase.master.infoserver.redirect", true)) {<a name="line.615"></a>
-<span class="sourceLineNo">616</span>      return -1;<a name="line.616"></a>
-<span class="sourceLineNo">617</span>    }<a name="line.617"></a>
-<span class="sourceLineNo">618</span>    final int infoPort = conf.getInt("hbase.master.info.port.orig",<a name="line.618"></a>
-<span class="sourceLineNo">619</span>      HConstants.DEFAULT_MASTER_INFOPORT);<a name="line.619"></a>
-<span class="sourceLineNo">620</span>    // -1 is for disabling info server, so no redirecting<a name="line.620"></a>
-<span class="sourceLineNo">621</span>    if (infoPort &lt; 0 || infoServer == null) {<a name="line.621"></a>
-<span class="sourceLineNo">622</span>      return -1;<a name="line.622"></a>
-<span class="sourceLineNo">623</span>    }<a name="line.623"></a>
-<span class="sourceLineNo">624</span>    if(infoPort == infoServer.getPort()) {<a name="line.624"></a>
-<span class="sourceLineNo">625</span>      return infoPort;<a name="line.625"></a>
-<span class="sourceLineNo">626</span>    }<a name="line.626"></a>
-<span class="sourceLineNo">627</span>    final String addr = conf.get("hbase.master.info.bindAddress", "0.0.0.0");<a name="line.627"></a>
-<span class="sourceLineNo">628</span>    if (!Addressing.isLocalAddress(InetAddress.getByName(addr))) {<a name="line.628"></a>
-<span class="sourceLineNo">629</span>      String msg =<a name="line.629"></a>
-<span class="sourceLineNo">630</span>          "Failed to start redirecting jetty server. Address " + addr<a name="line.630"></a>
-<span class="sourceLineNo">631</span>              + " does not belong to this host. Correct configuration parameter: "<a name="line.631"></a>
-<span class="sourceLineNo">632</span>              + "hbase.master.info.bindAddress";<a name="line.632"></a>
-<span class="sourceLineNo">633</span>      LOG.error(msg);<a name="line.633"></a>
-<span class="sourceLineNo">634</span>      throw new IOException(msg);<a name="line.634"></a>
-<span class="sourceLineNo">635</span>    }<a name="line.635"></a>
-<span class="sourceLineNo">636</span><a name="line.636"></a>
-<span class="sourceLineNo">637</span>    // TODO I'm pretty sure we could just add another binding to the InfoServer run by<a name="line.637"></a>
-<span class="sourceLineNo">638</span>    // the RegionServer and have it run the RedirectServlet instead of standing up<a name="line.638"></a>
-<span class="sourceLineNo">639</span>    // a second entire stack here.<a name="line.639"></a>
-<span class="sourceLineNo">640</span>    masterJettyServer = new Server();<a name="line.640"></a>
-<span class="sourceLineNo">641</span>    final ServerConnector connector = new ServerConnector(masterJettyServer);<a name="line.641"></a>
-<span class="sourceLineNo">642</span>    connector.setHost(addr);<a name="line.642"></a>
-<span class="sourceLineNo">643</span>    connector.setPort(infoPort);<a name="line.643"></a>
-<span class="sourceLineNo">644</span>    masterJettyServer.addConnector(connector);<a name="line.644"></a>
-<span class="sourceLineNo">645</span>    masterJettyServer.setStopAtShutdown(true);<a name="line.645"></a>
-<span class="sourceLineNo">646</span><a name="line.646"></a>
-<span class="sourceLineNo">647</span>    final String redirectHostname =<a name="line.647"></a>
-<span class="sourceLineNo">648</span>        StringUtils.isBlank(useThisHostnameInstead) ? null : useThisHostnameInstead;<a name="line.648"></a>
-<span class="sourceLineNo">649</span><a name="line.649"></a>
-<span class="sourceLineNo">650</span>    final RedirectServlet redirect = new RedirectServlet(infoServer, redirectHostname);<a name="line.650"></a>
-<span class="sourceLineNo">651</span>    final WebAppContext context = new WebAppContext(null, "/", null, null, null, null, WebAppContext.NO_SESSIONS);<a name="line.651"></a>
-<span class="sourceLineNo">652</span>    context.addServlet(new ServletHolder(redirect), "/*");<a name="line.652"></a>
-<span class="sourceLineNo">653</span>    context.setServer(masterJettyServer);<a name="line.653"></a>
-<span class="sourceLineNo">654</span><a name="line.654"></a>
-<span class="sourceLineNo">655</span>    try {<a name="line.655"></a>
-<span class="sourceLineNo">656</span>      masterJettyServer.start();<a name="line.656"></a>
-<span class="sourceLineNo">657</span>    } catch (Exception e) {<a name="line.657"></a>
-<span class="sourceLineNo">658</span>      throw new IOException("Failed to start redirecting jetty server", e);<a name="line.658"></a>
-<span class="sourceLineNo">659</span>    }<a name="line.659"></a>
-<span class="sourceLineNo">660</span>    return connector.getLocalPort();<a name="line.660"></a>
-<span class="sourceLineNo">661</span>  }<a name="line.661"></a>
-<span class="sourceLineNo">662</span><a name="line.662"></a>
-<span class="sourceLineNo">663</span>  @Override<a name="line.663"></a>
-<span class="sourceLineNo">664</span>  protected Function&lt;TableDescriptorBuilder, TableDescriptorBuilder&gt; getMetaTableObserver() {<a name="line.664"></a>
-<span class="sourceLineNo">665</span>    return builder -&gt; builder.setRegionReplication(conf.getInt(HConstants.META_REPLICAS_NUM, HConstants.DEFAULT_META_REPLICA_NUM));<a name="line.665"></a>
-<span class="sourceLineNo">666</span>  }<a name="line.666"></a>
-<span class="sourceLineNo">667</span>  /**<a name="line.667"></a>
-<span class="sourceLineNo">668</span>   * For compatibility, if failed with regionserver credentials, try the master one<a name="line.668"></a>
-<span class="sourceLineNo">669</span>   */<a name="line.669"></a>
-<span class="sourceLineNo">670</span>  @Override<a name="line.670"></a>
-<span class="sourceLineNo">671</span>  protected void login(UserProvider user, String host) throws IOException {<a name="line.671"></a>
-<span class="sourceLineNo">672</span>    try {<a name="line.672"></a>
-<span class="sourceLineNo">673</span>      super.login(user, host);<a name="line.673"></a>
-<span class="sourceLineNo">674</span>    } catch (IOException ie) {<a name="line.674"></a>
-<span class="sourceLineNo">675</span>      user.login("hbase.master.keytab.file",<a name="line.675"></a>
-<span class="sourceLineNo">676</span>        "hbase.master.kerberos.principal", host);<a name="line.676"></a>
-<span class="sourceLineNo">677</span>    }<a name="line.677"></a>
-<span class="sourceLineNo">678</span>  }<a name="line.678"></a>
-<span class="sourceLineNo">679</span><a name="line.679"></a>
-<span class="sourceLineNo">680</span>  /**<a name="line.680"></a>
-<span class="sourceLineNo">681</span>   * If configured to put regions on active master,<a name="line.681"></a>
-<span class="sourceLineNo">682</span>   * wait till a backup master becomes active.<a name="line.682"></a>
-<span class="sourceLineNo">683</span>   * Otherwise, loop till the server is stopped or aborted.<a name="line.683"></a>
-<span class="sourceLineNo">684</span>   */<a name="line.684"></a>
-<span class="sourceLineNo">685</span>  @Override<a name="line.685"></a>
-<span class="sourceLineNo">686</span>  protected void waitForMasterActive(){<a name="line.686"></a>
-<span class="sourceLineNo">687</span>    boolean tablesOnMaster = LoadBalancer.isTablesOnMaster(conf);<a name="line.687"></a>
-<span class="sourceLineNo">688</span>    while (!(tablesOnMaster &amp;&amp; activeMaster) &amp;&amp; !isStopped() &amp;&amp; !isAborted()) {<a name="line.688"></a>
-<span class="sourceLineNo">689</span>      sleeper.sleep();<a name="line.689"></a>
-<span class="sourceLineNo">690</span>    }<a name="line.690"></a>
-<span class="sourceLineNo">691</span>  }<a name="line.691"></a>
-<span class="sourceLineNo">692</span><a name="line.692"></a>
-<span class="sourceLineNo">693</span>  @VisibleForTesting<a name="line.693"></a>
-<span class="sourceLineNo">694</span>  public MasterRpcServices getMasterRpcServices() {<a name="line.694"></a>
-<span class="sourceLineNo">695</span>    return (MasterRpcServices)rpcServices;<a name="line.695"></a>
-<span class="sourceLineNo">696</span>  }<a name="line.696"></a>
-<span class="sourceLineNo">697</span><a name="line.697"></a>
-<span class="sourceLineNo">698</span>  public boolean balanceSwitch(final boolean b) throws IOException {<a name="line.698"></a>
-<span class="sourceLineNo">699</span>    return getMasterRpcServices().switchBalancer(b, BalanceSwitchMode.ASYNC);<a name="line.699"></a>
-<span class="sourceLineNo">700</span>  }<a name="line.700"></a>
-<span class="sourceLineNo">701</span><a name="line.701"></a>
-<span class="sourceLineNo">702</span>  @Override<a name="line.702"></a>
-<span class="sourceLineNo">703</span>  protected String getProcessName() {<a name="line.703"></a>
-<span class="sourceLineNo">704</span>    return MASTER;<a name="line.704"></a>
+<span class="sourceLineNo">554</span>      if (shouldPublish) {<a name="line.554"></a>
+<span class="sourceLineNo">555</span>        if (publisherClass == null) {<a name="line.555"></a>
+<span class="sourceLineNo">556</span>          LOG.warn(HConstants.STATUS_PUBLISHED + " is true, but " +<a name="line.556"></a>
+<span class="sourceLineNo">557</span>              ClusterStatusPublisher.DEFAULT_STATUS_PUBLISHER_CLASS +<a name="line.557"></a>
+<span class="sourceLineNo">558</span>              " is not set - not publishing status");<a name="line.558"></a>
+<span class="sourceLineNo">559</span>        } else {<a name="line.559"></a>
+<span class="sourceLineNo">560</span>          clusterStatusPublisherChore = new ClusterStatusPublisher(this, conf, publisherClass);<a name="line.560"></a>
+<span class="sourceLineNo">561</span>          getChoreService().scheduleChore(clusterStatusPublisherChore);<a name="line.561"></a>
+<span class="sourceLineNo">562</span>        }<a name="line.562"></a>
+<span class="sourceLineNo">563</span>      }<a name="line.563"></a>
+<span class="sourceLineNo">564</span><a name="line.564"></a>
+<span class="sourceLineNo">565</span>      // Some unit tests don't need a cluster, so no zookeeper at all<a name="line.565"></a>
+<span class="sourceLineNo">566</span>      if (!conf.getBoolean("hbase.testing.nocluster", false)) {<a name="line.566"></a>
+<span class="sourceLineNo">567</span>        this.activeMasterManager = new ActiveMasterManager(zooKeeper, this.serverName, this);<a name="line.567"></a>
+<span class="sourceLineNo">568</span>      } else {<a name="line.568"></a>
+<span class="sourceLineNo">569</span>        this.activeMasterManager = null;<a name="line.569"></a>
+<span class="sourceLineNo">570</span>      }<a name="line.570"></a>
+<span class="sourceLineNo">571</span

<TRUNCATED>

[12/46] hbase-site git commit: Published site at 05d22ed960204183fbd9bd16f1dbca6410ccde76.

Posted by gi...@apache.org.
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/3649682c/devapidocs/src-html/org/apache/hadoop/hbase/regionserver/HRegionServer.html
----------------------------------------------------------------------
diff --git a/devapidocs/src-html/org/apache/hadoop/hbase/regionserver/HRegionServer.html b/devapidocs/src-html/org/apache/hadoop/hbase/regionserver/HRegionServer.html
index 90087b4..b2a9771 100644
--- a/devapidocs/src-html/org/apache/hadoop/hbase/regionserver/HRegionServer.html
+++ b/devapidocs/src-html/org/apache/hadoop/hbase/regionserver/HRegionServer.html
@@ -956,2857 +956,2858 @@
 <span class="sourceLineNo">948</span>      // Try and register with the Master; tell it we are here.  Break if server is stopped or the<a name="line.948"></a>
 <span class="sourceLineNo">949</span>      // clusterup flag is down or hdfs went wacky. Once registered successfully, go ahead and start<a name="line.949"></a>
 <span class="sourceLineNo">950</span>      // up all Services. Use RetryCounter to get backoff in case Master is struggling to come up.<a name="line.950"></a>
-<span class="sourceLineNo">951</span>      RetryCounterFactory rcf = new RetryCounterFactory(Integer.MAX_VALUE,<a name="line.951"></a>
-<span class="sourceLineNo">952</span>          this.sleeper.getPeriod(), 1000 * 60 * 5);<a name="line.952"></a>
-<span class="sourceLineNo">953</span>      RetryCounter rc = rcf.create();<a name="line.953"></a>
-<span class="sourceLineNo">954</span>      while (keepLooping()) {<a name="line.954"></a>
-<span class="sourceLineNo">955</span>        RegionServerStartupResponse w = reportForDuty();<a name="line.955"></a>
-<span class="sourceLineNo">956</span>        if (w == null) {<a name="line.956"></a>
-<span class="sourceLineNo">957</span>          long sleepTime = rc.getBackoffTimeAndIncrementAttempts();<a name="line.957"></a>
-<span class="sourceLineNo">958</span>          LOG.warn("reportForDuty failed; sleeping {} ms and then retrying.", sleepTime);<a name="line.958"></a>
-<span class="sourceLineNo">959</span>          this.sleeper.sleep(sleepTime);<a name="line.959"></a>
-<span class="sourceLineNo">960</span>        } else {<a name="line.960"></a>
-<span class="sourceLineNo">961</span>          handleReportForDutyResponse(w);<a name="line.961"></a>
-<span class="sourceLineNo">962</span>          break;<a name="line.962"></a>
-<span class="sourceLineNo">963</span>        }<a name="line.963"></a>
-<span class="sourceLineNo">964</span>      }<a name="line.964"></a>
-<span class="sourceLineNo">965</span><a name="line.965"></a>
-<span class="sourceLineNo">966</span>      if (!isStopped() &amp;&amp; isHealthy()) {<a name="line.966"></a>
-<span class="sourceLineNo">967</span>        // start the snapshot handler and other procedure handlers,<a name="line.967"></a>
-<span class="sourceLineNo">968</span>        // since the server is ready to run<a name="line.968"></a>
-<span class="sourceLineNo">969</span>        if (this.rspmHost != null) {<a name="line.969"></a>
-<span class="sourceLineNo">970</span>          this.rspmHost.start();<a name="line.970"></a>
-<span class="sourceLineNo">971</span>        }<a name="line.971"></a>
-<span class="sourceLineNo">972</span>        // Start the Quota Manager<a name="line.972"></a>
-<span class="sourceLineNo">973</span>        if (this.rsQuotaManager != null) {<a name="line.973"></a>
-<span class="sourceLineNo">974</span>          rsQuotaManager.start(getRpcServer().getScheduler());<a name="line.974"></a>
-<span class="sourceLineNo">975</span>        }<a name="line.975"></a>
-<span class="sourceLineNo">976</span>        if (this.rsSpaceQuotaManager != null) {<a name="line.976"></a>
-<span class="sourceLineNo">977</span>          this.rsSpaceQuotaManager.start();<a name="line.977"></a>
-<span class="sourceLineNo">978</span>        }<a name="line.978"></a>
-<span class="sourceLineNo">979</span>      }<a name="line.979"></a>
-<span class="sourceLineNo">980</span><a name="line.980"></a>
-<span class="sourceLineNo">981</span>      // We registered with the Master.  Go into run mode.<a name="line.981"></a>
-<span class="sourceLineNo">982</span>      long lastMsg = System.currentTimeMillis();<a name="line.982"></a>
-<span class="sourceLineNo">983</span>      long oldRequestCount = -1;<a name="line.983"></a>
-<span class="sourceLineNo">984</span>      // The main run loop.<a name="line.984"></a>
-<span class="sourceLineNo">985</span>      while (!isStopped() &amp;&amp; isHealthy()) {<a name="line.985"></a>
-<span class="sourceLineNo">986</span>        if (!isClusterUp()) {<a name="line.986"></a>
-<span class="sourceLineNo">987</span>          if (isOnlineRegionsEmpty()) {<a name="line.987"></a>
-<span class="sourceLineNo">988</span>            stop("Exiting; cluster shutdown set and not carrying any regions");<a name="line.988"></a>
-<span class="sourceLineNo">989</span>          } else if (!this.stopping) {<a name="line.989"></a>
-<span class="sourceLineNo">990</span>            this.stopping = true;<a name="line.990"></a>
-<span class="sourceLineNo">991</span>            LOG.info("Closing user regions");<a name="line.991"></a>
-<span class="sourceLineNo">992</span>            closeUserRegions(this.abortRequested);<a name="line.992"></a>
-<span class="sourceLineNo">993</span>          } else if (this.stopping) {<a name="line.993"></a>
-<span class="sourceLineNo">994</span>            boolean allUserRegionsOffline = areAllUserRegionsOffline();<a name="line.994"></a>
-<span class="sourceLineNo">995</span>            if (allUserRegionsOffline) {<a name="line.995"></a>
-<span class="sourceLineNo">996</span>              // Set stopped if no more write requests tp meta tables<a name="line.996"></a>
-<span class="sourceLineNo">997</span>              // since last time we went around the loop.  Any open<a name="line.997"></a>
-<span class="sourceLineNo">998</span>              // meta regions will be closed on our way out.<a name="line.998"></a>
-<span class="sourceLineNo">999</span>              if (oldRequestCount == getWriteRequestCount()) {<a name="line.999"></a>
-<span class="sourceLineNo">1000</span>                stop("Stopped; only catalog regions remaining online");<a name="line.1000"></a>
-<span class="sourceLineNo">1001</span>                break;<a name="line.1001"></a>
-<span class="sourceLineNo">1002</span>              }<a name="line.1002"></a>
-<span class="sourceLineNo">1003</span>              oldRequestCount = getWriteRequestCount();<a name="line.1003"></a>
-<span class="sourceLineNo">1004</span>            } else {<a name="line.1004"></a>
-<span class="sourceLineNo">1005</span>              // Make sure all regions have been closed -- some regions may<a name="line.1005"></a>
-<span class="sourceLineNo">1006</span>              // have not got it because we were splitting at the time of<a name="line.1006"></a>
-<span class="sourceLineNo">1007</span>              // the call to closeUserRegions.<a name="line.1007"></a>
-<span class="sourceLineNo">1008</span>              closeUserRegions(this.abortRequested);<a name="line.1008"></a>
-<span class="sourceLineNo">1009</span>            }<a name="line.1009"></a>
-<span class="sourceLineNo">1010</span>            LOG.debug("Waiting on " + getOnlineRegionsAsPrintableString());<a name="line.1010"></a>
-<span class="sourceLineNo">1011</span>          }<a name="line.1011"></a>
-<span class="sourceLineNo">1012</span>        }<a name="line.1012"></a>
-<span class="sourceLineNo">1013</span>        long now = System.currentTimeMillis();<a name="line.1013"></a>
-<span class="sourceLineNo">1014</span>        if ((now - lastMsg) &gt;= msgInterval) {<a name="line.1014"></a>
-<span class="sourceLineNo">1015</span>          tryRegionServerReport(lastMsg, now);<a name="line.1015"></a>
-<span class="sourceLineNo">1016</span>          lastMsg = System.currentTimeMillis();<a name="line.1016"></a>
-<span class="sourceLineNo">1017</span>        }<a name="line.1017"></a>
-<span class="sourceLineNo">1018</span>        if (!isStopped() &amp;&amp; !isAborted()) {<a name="line.1018"></a>
-<span class="sourceLineNo">1019</span>          this.sleeper.sleep();<a name="line.1019"></a>
-<span class="sourceLineNo">1020</span>        }<a name="line.1020"></a>
-<span class="sourceLineNo">1021</span>      } // for<a name="line.1021"></a>
-<span class="sourceLineNo">1022</span>    } catch (Throwable t) {<a name="line.1022"></a>
-<span class="sourceLineNo">1023</span>      if (!rpcServices.checkOOME(t)) {<a name="line.1023"></a>
-<span class="sourceLineNo">1024</span>        String prefix = t instanceof YouAreDeadException? "": "Unhandled: ";<a name="line.1024"></a>
-<span class="sourceLineNo">1025</span>        abort(prefix + t.getMessage(), t);<a name="line.1025"></a>
-<span class="sourceLineNo">1026</span>      }<a name="line.1026"></a>
-<span class="sourceLineNo">1027</span>    }<a name="line.1027"></a>
-<span class="sourceLineNo">1028</span>    if (this.leases != null) {<a name="line.1028"></a>
-<span class="sourceLineNo">1029</span>      this.leases.closeAfterLeasesExpire();<a name="line.1029"></a>
-<span class="sourceLineNo">1030</span>    }<a name="line.1030"></a>
-<span class="sourceLineNo">1031</span>    if (this.splitLogWorker != null) {<a name="line.1031"></a>
-<span class="sourceLineNo">1032</span>      splitLogWorker.stop();<a name="line.1032"></a>
-<span class="sourceLineNo">1033</span>    }<a name="line.1033"></a>
-<span class="sourceLineNo">1034</span>    if (this.infoServer != null) {<a name="line.1034"></a>
-<span class="sourceLineNo">1035</span>      LOG.info("Stopping infoServer");<a name="line.1035"></a>
-<span class="sourceLineNo">1036</span>      try {<a name="line.1036"></a>
-<span class="sourceLineNo">1037</span>        this.infoServer.stop();<a name="line.1037"></a>
-<span class="sourceLineNo">1038</span>      } catch (Exception e) {<a name="line.1038"></a>
-<span class="sourceLineNo">1039</span>        LOG.error("Failed to stop infoServer", e);<a name="line.1039"></a>
-<span class="sourceLineNo">1040</span>      }<a name="line.1040"></a>
-<span class="sourceLineNo">1041</span>    }<a name="line.1041"></a>
-<span class="sourceLineNo">1042</span>    // Send cache a shutdown.<a name="line.1042"></a>
-<span class="sourceLineNo">1043</span>    if (cacheConfig != null &amp;&amp; cacheConfig.isBlockCacheEnabled()) {<a name="line.1043"></a>
-<span class="sourceLineNo">1044</span>      cacheConfig.getBlockCache().shutdown();<a name="line.1044"></a>
-<span class="sourceLineNo">1045</span>    }<a name="line.1045"></a>
-<span class="sourceLineNo">1046</span>    mobCacheConfig.getMobFileCache().shutdown();<a name="line.1046"></a>
-<span class="sourceLineNo">1047</span><a name="line.1047"></a>
-<span class="sourceLineNo">1048</span>    if (movedRegionsCleaner != null) {<a name="line.1048"></a>
-<span class="sourceLineNo">1049</span>      movedRegionsCleaner.stop("Region Server stopping");<a name="line.1049"></a>
-<span class="sourceLineNo">1050</span>    }<a name="line.1050"></a>
-<span class="sourceLineNo">1051</span><a name="line.1051"></a>
-<span class="sourceLineNo">1052</span>    // Send interrupts to wake up threads if sleeping so they notice shutdown.<a name="line.1052"></a>
-<span class="sourceLineNo">1053</span>    // TODO: Should we check they are alive? If OOME could have exited already<a name="line.1053"></a>
-<span class="sourceLineNo">1054</span>    if (this.hMemManager != null) this.hMemManager.stop();<a name="line.1054"></a>
-<span class="sourceLineNo">1055</span>    if (this.cacheFlusher != null) this.cacheFlusher.interruptIfNecessary();<a name="line.1055"></a>
-<span class="sourceLineNo">1056</span>    if (this.compactSplitThread != null) this.compactSplitThread.interruptIfNecessary();<a name="line.1056"></a>
-<span class="sourceLineNo">1057</span>    sendShutdownInterrupt();<a name="line.1057"></a>
-<span class="sourceLineNo">1058</span><a name="line.1058"></a>
-<span class="sourceLineNo">1059</span>    // Stop the snapshot and other procedure handlers, forcefully killing all running tasks<a name="line.1059"></a>
-<span class="sourceLineNo">1060</span>    if (rspmHost != null) {<a name="line.1060"></a>
-<span class="sourceLineNo">1061</span>      rspmHost.stop(this.abortRequested || this.killed);<a name="line.1061"></a>
-<span class="sourceLineNo">1062</span>    }<a name="line.1062"></a>
-<span class="sourceLineNo">1063</span><a name="line.1063"></a>
-<span class="sourceLineNo">1064</span>    if (this.killed) {<a name="line.1064"></a>
-<span class="sourceLineNo">1065</span>      // Just skip out w/o closing regions.  Used when testing.<a name="line.1065"></a>
-<span class="sourceLineNo">1066</span>    } else if (abortRequested) {<a name="line.1066"></a>
-<span class="sourceLineNo">1067</span>      if (this.fsOk) {<a name="line.1067"></a>
-<span class="sourceLineNo">1068</span>        closeUserRegions(abortRequested); // Don't leave any open file handles<a name="line.1068"></a>
-<span class="sourceLineNo">1069</span>      }<a name="line.1069"></a>
-<span class="sourceLineNo">1070</span>      LOG.info("aborting server " + this.serverName);<a name="line.1070"></a>
-<span class="sourceLineNo">1071</span>    } else {<a name="line.1071"></a>
-<span class="sourceLineNo">1072</span>      closeUserRegions(abortRequested);<a name="line.1072"></a>
-<span class="sourceLineNo">1073</span>      LOG.info("stopping server " + this.serverName);<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>    // so callers waiting for meta without timeout can stop<a name="line.1076"></a>
-<span class="sourceLineNo">1077</span>    if (this.metaTableLocator != null) this.metaTableLocator.stop();<a name="line.1077"></a>
-<span class="sourceLineNo">1078</span>    if (this.clusterConnection != null &amp;&amp; !clusterConnection.isClosed()) {<a name="line.1078"></a>
-<span class="sourceLineNo">1079</span>      try {<a name="line.1079"></a>
-<span class="sourceLineNo">1080</span>        this.clusterConnection.close();<a name="line.1080"></a>
-<span class="sourceLineNo">1081</span>      } catch (IOException e) {<a name="line.1081"></a>
-<span class="sourceLineNo">1082</span>        // Although the {@link Closeable} interface throws an {@link<a name="line.1082"></a>
-<span class="sourceLineNo">1083</span>        // IOException}, in reality, the implementation would never do that.<a name="line.1083"></a>
-<span class="sourceLineNo">1084</span>        LOG.warn("Attempt to close server's short circuit ClusterConnection failed.", e);<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>    // Closing the compactSplit thread before closing meta regions<a name="line.1088"></a>
-<span class="sourceLineNo">1089</span>    if (!this.killed &amp;&amp; containsMetaTableRegions()) {<a name="line.1089"></a>
-<span class="sourceLineNo">1090</span>      if (!abortRequested || this.fsOk) {<a name="line.1090"></a>
-<span class="sourceLineNo">1091</span>        if (this.compactSplitThread != null) {<a name="line.1091"></a>
-<span class="sourceLineNo">1092</span>          this.compactSplitThread.join();<a name="line.1092"></a>
-<span class="sourceLineNo">1093</span>          this.compactSplitThread = null;<a name="line.1093"></a>
-<span class="sourceLineNo">1094</span>        }<a name="line.1094"></a>
-<span class="sourceLineNo">1095</span>        closeMetaTableRegions(abortRequested);<a name="line.1095"></a>
-<span class="sourceLineNo">1096</span>      }<a name="line.1096"></a>
-<span class="sourceLineNo">1097</span>    }<a name="line.1097"></a>
-<span class="sourceLineNo">1098</span><a name="line.1098"></a>
-<span class="sourceLineNo">1099</span>    if (!this.killed &amp;&amp; this.fsOk) {<a name="line.1099"></a>
-<span class="sourceLineNo">1100</span>      waitOnAllRegionsToClose(abortRequested);<a name="line.1100"></a>
-<span class="sourceLineNo">1101</span>      LOG.info("stopping server " + this.serverName + "; all regions closed.");<a name="line.1101"></a>
-<span class="sourceLineNo">1102</span>    }<a name="line.1102"></a>
-<span class="sourceLineNo">1103</span><a name="line.1103"></a>
-<span class="sourceLineNo">1104</span>    // Stop the quota manager<a name="line.1104"></a>
-<span class="sourceLineNo">1105</span>    if (rsQuotaManager != null) {<a name="line.1105"></a>
-<span class="sourceLineNo">1106</span>      rsQuotaManager.stop();<a name="line.1106"></a>
-<span class="sourceLineNo">1107</span>    }<a name="line.1107"></a>
-<span class="sourceLineNo">1108</span>    if (rsSpaceQuotaManager != null) {<a name="line.1108"></a>
-<span class="sourceLineNo">1109</span>      rsSpaceQuotaManager.stop();<a name="line.1109"></a>
-<span class="sourceLineNo">1110</span>      rsSpaceQuotaManager = null;<a name="line.1110"></a>
-<span class="sourceLineNo">1111</span>    }<a name="line.1111"></a>
-<span class="sourceLineNo">1112</span><a name="line.1112"></a>
-<span class="sourceLineNo">1113</span>    //fsOk flag may be changed when closing regions throws exception.<a name="line.1113"></a>
-<span class="sourceLineNo">1114</span>    if (this.fsOk) {<a name="line.1114"></a>
-<span class="sourceLineNo">1115</span>      shutdownWAL(!abortRequested);<a name="line.1115"></a>
-<span class="sourceLineNo">1116</span>    }<a name="line.1116"></a>
-<span class="sourceLineNo">1117</span><a name="line.1117"></a>
-<span class="sourceLineNo">1118</span>    // Make sure the proxy is down.<a name="line.1118"></a>
-<span class="sourceLineNo">1119</span>    if (this.rssStub != null) {<a name="line.1119"></a>
-<span class="sourceLineNo">1120</span>      this.rssStub = null;<a name="line.1120"></a>
-<span class="sourceLineNo">1121</span>    }<a name="line.1121"></a>
-<span class="sourceLineNo">1122</span>    if (this.lockStub != null) {<a name="line.1122"></a>
-<span class="sourceLineNo">1123</span>      this.lockStub = null;<a name="line.1123"></a>
-<span class="sourceLineNo">1124</span>    }<a name="line.1124"></a>
-<span class="sourceLineNo">1125</span>    if (this.rpcClient != null) {<a name="line.1125"></a>
-<span class="sourceLineNo">1126</span>      this.rpcClient.close();<a name="line.1126"></a>
-<span class="sourceLineNo">1127</span>    }<a name="line.1127"></a>
-<span class="sourceLineNo">1128</span>    if (this.leases != null) {<a name="line.1128"></a>
-<span class="sourceLineNo">1129</span>      this.leases.close();<a name="line.1129"></a>
-<span class="sourceLineNo">1130</span>    }<a name="line.1130"></a>
-<span class="sourceLineNo">1131</span>    if (this.pauseMonitor != null) {<a name="line.1131"></a>
-<span class="sourceLineNo">1132</span>      this.pauseMonitor.stop();<a name="line.1132"></a>
-<span class="sourceLineNo">1133</span>    }<a name="line.1133"></a>
-<span class="sourceLineNo">1134</span><a name="line.1134"></a>
-<span class="sourceLineNo">1135</span>    if (!killed) {<a name="line.1135"></a>
-<span class="sourceLineNo">1136</span>      stopServiceThreads();<a name="line.1136"></a>
-<span class="sourceLineNo">1137</span>    }<a name="line.1137"></a>
-<span class="sourceLineNo">1138</span><a name="line.1138"></a>
-<span class="sourceLineNo">1139</span>    if (this.rpcServices != null) {<a name="line.1139"></a>
-<span class="sourceLineNo">1140</span>      this.rpcServices.stop();<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>    try {<a name="line.1143"></a>
-<span class="sourceLineNo">1144</span>      deleteMyEphemeralNode();<a name="line.1144"></a>
-<span class="sourceLineNo">1145</span>    } catch (KeeperException.NoNodeException nn) {<a name="line.1145"></a>
-<span class="sourceLineNo">1146</span>    } catch (KeeperException e) {<a name="line.1146"></a>
-<span class="sourceLineNo">1147</span>      LOG.warn("Failed deleting my ephemeral node", e);<a name="line.1147"></a>
-<span class="sourceLineNo">1148</span>    }<a name="line.1148"></a>
-<span class="sourceLineNo">1149</span>    // We may have failed to delete the znode at the previous step, but<a name="line.1149"></a>
-<span class="sourceLineNo">1150</span>    //  we delete the file anyway: a second attempt to delete the znode is likely to fail again.<a name="line.1150"></a>
-<span class="sourceLineNo">1151</span>    ZNodeClearer.deleteMyEphemeralNodeOnDisk();<a name="line.1151"></a>
-<span class="sourceLineNo">1152</span><a name="line.1152"></a>
-<span class="sourceLineNo">1153</span>    if (this.zooKeeper != null) {<a name="line.1153"></a>
-<span class="sourceLineNo">1154</span>      this.zooKeeper.close();<a name="line.1154"></a>
-<span class="sourceLineNo">1155</span>    }<a name="line.1155"></a>
-<span class="sourceLineNo">1156</span>    this.shutDown = true;<a name="line.1156"></a>
-<span class="sourceLineNo">1157</span>    LOG.info("Exiting; stopping=" + this.serverName + "; zookeeper connection closed.");<a name="line.1157"></a>
-<span class="sourceLineNo">1158</span>  }<a name="line.1158"></a>
-<span class="sourceLineNo">1159</span><a name="line.1159"></a>
-<span class="sourceLineNo">1160</span>  private boolean containsMetaTableRegions() {<a name="line.1160"></a>
-<span class="sourceLineNo">1161</span>    return onlineRegions.containsKey(RegionInfoBuilder.FIRST_META_REGIONINFO.getEncodedName());<a name="line.1161"></a>
-<span class="sourceLineNo">1162</span>  }<a name="line.1162"></a>
-<span class="sourceLineNo">1163</span><a name="line.1163"></a>
-<span class="sourceLineNo">1164</span>  private boolean areAllUserRegionsOffline() {<a name="line.1164"></a>
-<span class="sourceLineNo">1165</span>    if (getNumberOfOnlineRegions() &gt; 2) return false;<a name="line.1165"></a>
-<span class="sourceLineNo">1166</span>    boolean allUserRegionsOffline = true;<a name="line.1166"></a>
-<span class="sourceLineNo">1167</span>    for (Map.Entry&lt;String, HRegion&gt; e: this.onlineRegions.entrySet()) {<a name="line.1167"></a>
-<span class="sourceLineNo">1168</span>      if (!e.getValue().getRegionInfo().isMetaRegion()) {<a name="line.1168"></a>
-<span class="sourceLineNo">1169</span>        allUserRegionsOffline = false;<a name="line.1169"></a>
-<span class="sourceLineNo">1170</span>        break;<a name="line.1170"></a>
-<span class="sourceLineNo">1171</span>      }<a name="line.1171"></a>
-<span class="sourceLineNo">1172</span>    }<a name="line.1172"></a>
-<span class="sourceLineNo">1173</span>    return allUserRegionsOffline;<a name="line.1173"></a>
-<span class="sourceLineNo">1174</span>  }<a name="line.1174"></a>
-<span class="sourceLineNo">1175</span><a name="line.1175"></a>
-<span class="sourceLineNo">1176</span>  /**<a name="line.1176"></a>
-<span class="sourceLineNo">1177</span>   * @return Current write count for all online regions.<a name="line.1177"></a>
-<span class="sourceLineNo">1178</span>   */<a name="line.1178"></a>
-<span class="sourceLineNo">1179</span>  private long getWriteRequestCount() {<a name="line.1179"></a>
-<span class="sourceLineNo">1180</span>    long writeCount = 0;<a name="line.1180"></a>
-<span class="sourceLineNo">1181</span>    for (Map.Entry&lt;String, HRegion&gt; e: this.onlineRegions.entrySet()) {<a name="line.1181"></a>
-<span class="sourceLineNo">1182</span>      writeCount += e.getValue().getWriteRequestsCount();<a name="line.1182"></a>
-<span class="sourceLineNo">1183</span>    }<a name="line.1183"></a>
-<span class="sourceLineNo">1184</span>    return writeCount;<a name="line.1184"></a>
-<span class="sourceLineNo">1185</span>  }<a name="line.1185"></a>
-<span class="sourceLineNo">1186</span><a name="line.1186"></a>
-<span class="sourceLineNo">1187</span>  @VisibleForTesting<a name="line.1187"></a>
-<span class="sourceLineNo">1188</span>  protected void tryRegionServerReport(long reportStartTime, long reportEndTime)<a name="line.1188"></a>
-<span class="sourceLineNo">1189</span>      throws IOException {<a name="line.1189"></a>
-<span class="sourceLineNo">1190</span>    RegionServerStatusService.BlockingInterface rss = rssStub;<a name="line.1190"></a>
-<span class="sourceLineNo">1191</span>    if (rss == null) {<a name="line.1191"></a>
-<span class="sourceLineNo">1192</span>      // the current server could be stopping.<a name="line.1192"></a>
-<span class="sourceLineNo">1193</span>      return;<a name="line.1193"></a>
-<span class="sourceLineNo">1194</span>    }<a name="line.1194"></a>
-<span class="sourceLineNo">1195</span>    ClusterStatusProtos.ServerLoad sl = buildServerLoad(reportStartTime, reportEndTime);<a name="line.1195"></a>
-<span class="sourceLineNo">1196</span>    try {<a name="line.1196"></a>
-<span class="sourceLineNo">1197</span>      RegionServerReportRequest.Builder request = RegionServerReportRequest.newBuilder();<a name="line.1197"></a>
-<span class="sourceLineNo">1198</span>      request.setServer(ProtobufUtil.toServerName(this.serverName));<a name="line.1198"></a>
-<span class="sourceLineNo">1199</span>      request.setLoad(sl);<a name="line.1199"></a>
-<span class="sourceLineNo">1200</span>      rss.regionServerReport(null, request.build());<a name="line.1200"></a>
-<span class="sourceLineNo">1201</span>    } catch (ServiceException se) {<a name="line.1201"></a>
-<span class="sourceLineNo">1202</span>      IOException ioe = ProtobufUtil.getRemoteException(se);<a name="line.1202"></a>
-<span class="sourceLineNo">1203</span>      if (ioe instanceof YouAreDeadException) {<a name="line.1203"></a>
-<span class="sourceLineNo">1204</span>        // This will be caught and handled as a fatal error in run()<a name="line.1204"></a>
-<span class="sourceLineNo">1205</span>        throw ioe;<a name="line.1205"></a>
-<span class="sourceLineNo">1206</span>      }<a name="line.1206"></a>
-<span class="sourceLineNo">1207</span>      if (rssStub == rss) {<a name="line.1207"></a>
-<span class="sourceLineNo">1208</span>        rssStub = null;<a name="line.1208"></a>
-<span class="sourceLineNo">1209</span>      }<a name="line.1209"></a>
-<span class="sourceLineNo">1210</span>      // Couldn't connect to the master, get location from zk and reconnect<a name="line.1210"></a>
-<span class="sourceLineNo">1211</span>      // Method blocks until new master is found or we are stopped<a name="line.1211"></a>
-<span class="sourceLineNo">1212</span>      createRegionServerStatusStub(true);<a name="line.1212"></a>
-<span class="sourceLineNo">1213</span>    }<a name="line.1213"></a>
-<span class="sourceLineNo">1214</span>  }<a name="line.1214"></a>
-<span class="sourceLineNo">1215</span><a name="line.1215"></a>
-<span class="sourceLineNo">1216</span>  /**<a name="line.1216"></a>
-<span class="sourceLineNo">1217</span>   * Reports the given map of Regions and their size on the filesystem to the active Master.<a name="line.1217"></a>
-<span class="sourceLineNo">1218</span>   *<a name="line.1218"></a>
-<span class="sourceLineNo">1219</span>   * @param regionSizeStore The store containing region sizes<a name="line.1219"></a>
-<span class="sourceLineNo">1220</span>   * @return false if FileSystemUtilizationChore should pause reporting to master. true otherwise<a name="line.1220"></a>
-<span class="sourceLineNo">1221</span>   */<a name="line.1221"></a>
-<span class="sourceLineNo">1222</span>  public boolean reportRegionSizesForQuotas(RegionSizeStore regionSizeStore) {<a name="line.1222"></a>
-<span class="sourceLineNo">1223</span>    RegionServerStatusService.BlockingInterface rss = rssStub;<a name="line.1223"></a>
-<span class="sourceLineNo">1224</span>    if (rss == null) {<a name="line.1224"></a>
-<span class="sourceLineNo">1225</span>      // the current server could be stopping.<a name="line.1225"></a>
-<span class="sourceLineNo">1226</span>      LOG.trace("Skipping Region size report to HMaster as stub is null");<a name="line.1226"></a>
-<span class="sourceLineNo">1227</span>      return true;<a name="line.1227"></a>
-<span class="sourceLineNo">1228</span>    }<a name="line.1228"></a>
-<span class="sourceLineNo">1229</span>    try {<a name="line.1229"></a>
-<span class="sourceLineNo">1230</span>      buildReportAndSend(rss, regionSizeStore);<a name="line.1230"></a>
-<span class="sourceLineNo">1231</span>    } catch (ServiceException se) {<a name="line.1231"></a>
-<span class="sourceLineNo">1232</span>      IOException ioe = ProtobufUtil.getRemoteException(se);<a name="line.1232"></a>
-<span class="sourceLineNo">1233</span>      if (ioe instanceof PleaseHoldException) {<a name="line.1233"></a>
-<span class="sourceLineNo">1234</span>        LOG.trace("Failed to report region sizes to Master because it is initializing."<a name="line.1234"></a>
-<span class="sourceLineNo">1235</span>            + " This will be retried.", ioe);<a name="line.1235"></a>
-<span class="sourceLineNo">1236</span>        // The Master is coming up. Will retry the report later. Avoid re-creating the stub.<a name="line.1236"></a>
-<span class="sourceLineNo">1237</span>        return true;<a name="line.1237"></a>
-<span class="sourceLineNo">1238</span>      }<a name="line.1238"></a>
-<span class="sourceLineNo">1239</span>      if (rssStub == rss) {<a name="line.1239"></a>
-<span class="sourceLineNo">1240</span>        rssStub = null;<a name="line.1240"></a>
-<span class="sourceLineNo">1241</span>      }<a name="line.1241"></a>
-<span class="sourceLineNo">1242</span>      createRegionServerStatusStub(true);<a name="line.1242"></a>
-<span class="sourceLineNo">1243</span>      if (ioe instanceof DoNotRetryIOException) {<a name="line.1243"></a>
-<span class="sourceLineNo">1244</span>        DoNotRetryIOException doNotRetryEx = (DoNotRetryIOException) ioe;<a name="line.1244"></a>
-<span class="sourceLineNo">1245</span>        if (doNotRetryEx.getCause() != null) {<a name="line.1245"></a>
-<span class="sourceLineNo">1246</span>          Throwable t = doNotRetryEx.getCause();<a name="line.1246"></a>
-<span class="sourceLineNo">1247</span>          if (t instanceof UnsupportedOperationException) {<a name="line.1247"></a>
-<span class="sourceLineNo">1248</span>            LOG.debug("master doesn't support ReportRegionSpaceUse, pause before retrying");<a name="line.1248"></a>
-<span class="sourceLineNo">1249</span>            return false;<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>      }<a name="line.1252"></a>
-<span class="sourceLineNo">1253</span>      LOG.debug("Failed to report region sizes to Master. This will be retried.", ioe);<a name="line.1253"></a>
-<span class="sourceLineNo">1254</span>    }<a name="line.1254"></a>
-<span class="sourceLineNo">1255</span>    return true;<a name="line.1255"></a>
-<span class="sourceLineNo">1256</span>  }<a name="line.1256"></a>
-<span class="sourceLineNo">1257</span><a name="line.1257"></a>
-<span class="sourceLineNo">1258</span>  /**<a name="line.1258"></a>
-<span class="sourceLineNo">1259</span>   * Builds the region size report and sends it to the master. Upon successful sending of the<a name="line.1259"></a>
-<span class="sourceLineNo">1260</span>   * report, the region sizes that were sent are marked as sent.<a name="line.1260"></a>
-<span class="sourceLineNo">1261</span>   *<a name="line.1261"></a>
-<span class="sourceLineNo">1262</span>   * @param rss The stub to send to the Master<a name="line.1262"></a>
-<span class="sourceLineNo">1263</span>   * @param regionSizeStore The store containing region sizes<a name="line.1263"></a>
-<span class="sourceLineNo">1264</span>   */<a name="line.1264"></a>
-<span class="sourceLineNo">1265</span>  void buildReportAndSend(RegionServerStatusService.BlockingInterface rss,<a name="line.1265"></a>
-<span class="sourceLineNo">1266</span>      RegionSizeStore regionSizeStore) throws ServiceException {<a name="line.1266"></a>
-<span class="sourceLineNo">1267</span>    RegionSpaceUseReportRequest request =<a name="line.1267"></a>
-<span class="sourceLineNo">1268</span>        buildRegionSpaceUseReportRequest(Objects.requireNonNull(regionSizeStore));<a name="line.1268"></a>
-<span class="sourceLineNo">1269</span>    rss.reportRegionSpaceUse(null, request);<a name="line.1269"></a>
-<span class="sourceLineNo">1270</span>    // Record the number of size reports sent<a name="line.1270"></a>
-<span class="sourceLineNo">1271</span>    if (metricsRegionServer != null) {<a name="line.1271"></a>
-<span class="sourceLineNo">1272</span>      metricsRegionServer.incrementNumRegionSizeReportsSent(regionSizeStore.size());<a name="line.1272"></a>
-<span class="sourceLineNo">1273</span>    }<a name="line.1273"></a>
-<span class="sourceLineNo">1274</span>  }<a name="line.1274"></a>
-<span class="sourceLineNo">1275</span><a name="line.1275"></a>
-<span class="sourceLineNo">1276</span>  /**<a name="line.1276"></a>
-<span class="sourceLineNo">1277</span>   * Builds a {@link RegionSpaceUseReportRequest} protobuf message from the region size map.<a name="line.1277"></a>
-<span class="sourceLineNo">1278</span>   *<a name="line.1278"></a>
-<span class="sourceLineNo">1279</span>   * @param regionSizes The size in bytes of regions<a name="line.1279"></a>
-<span class="sourceLineNo">1280</span>   * @return The corresponding protocol buffer message.<a name="line.1280"></a>
-<span class="sourceLineNo">1281</span>   */<a name="line.1281"></a>
-<span class="sourceLineNo">1282</span>  RegionSpaceUseReportRequest buildRegionSpaceUseReportRequest(RegionSizeStore regionSizes) {<a name="line.1282"></a>
-<span class="sourceLineNo">1283</span>    RegionSpaceUseReportRequest.Builder request = RegionSpaceUseReportRequest.newBuilder();<a name="line.1283"></a>
-<span class="sourceLineNo">1284</span>    for (Entry&lt;RegionInfo, RegionSize&gt; entry : regionSizes) {<a name="line.1284"></a>
-<span class="sourceLineNo">1285</span>      request.addSpaceUse(convertRegionSize(entry.getKey(), entry.getValue().getSize()));<a name="line.1285"></a>
-<span class="sourceLineNo">1286</span>    }<a name="line.1286"></a>
-<span class="sourceLineNo">1287</span>    return request.build();<a name="line.1287"></a>
-<span class="sourceLineNo">1288</span>  }<a name="line.1288"></a>
-<span class="sourceLineNo">1289</span><a name="line.1289"></a>
-<span class="sourceLineNo">1290</span>  /**<a name="line.1290"></a>
-<span class="sourceLineNo">1291</span>   * Converts a pair of {@link RegionInfo} and {@code long} into a {@link RegionSpaceUse}<a name="line.1291"></a>
-<span class="sourceLineNo">1292</span>   * protobuf message.<a name="line.1292"></a>
-<span class="sourceLineNo">1293</span>   *<a name="line.1293"></a>
-<span class="sourceLineNo">1294</span>   * @param regionInfo The RegionInfo<a name="line.1294"></a>
-<span class="sourceLineNo">1295</span>   * @param sizeInBytes The size in bytes of the Region<a name="line.1295"></a>
-<span class="sourceLineNo">1296</span>   * @return The protocol buffer<a name="line.1296"></a>
-<span class="sourceLineNo">1297</span>   */<a name="line.1297"></a>
-<span class="sourceLineNo">1298</span>  RegionSpaceUse convertRegionSize(RegionInfo regionInfo, Long sizeInBytes) {<a name="line.1298"></a>
-<span class="sourceLineNo">1299</span>    return RegionSpaceUse.newBuilder()<a name="line.1299"></a>
-<span class="sourceLineNo">1300</span>        .setRegionInfo(ProtobufUtil.toRegionInfo(Objects.requireNonNull(regionInfo)))<a name="line.1300"></a>
-<span class="sourceLineNo">1301</span>        .setRegionSize(Objects.requireNonNull(sizeInBytes))<a name="line.1301"></a>
-<span class="sourceLineNo">1302</span>        .build();<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>  ClusterStatusProtos.ServerLoad buildServerLoad(long reportStartTime, long reportEndTime)<a name="line.1305"></a>
-<span class="sourceLineNo">1306</span>      throws IOException {<a name="line.1306"></a>
-<span class="sourceLineNo">1307</span>    // We're getting the MetricsRegionServerWrapper here because the wrapper computes requests<a name="line.1307"></a>
-<span class="sourceLineNo">1308</span>    // per second, and other metrics  As long as metrics are part of ServerLoad it's best to use<a name="line.1308"></a>
-<span class="sourceLineNo">1309</span>    // the wrapper to compute those numbers in one place.<a name="line.1309"></a>
-<span class="sourceLineNo">1310</span>    // In the long term most of these should be moved off of ServerLoad and the heart beat.<a name="line.1310"></a>
-<span class="sourceLineNo">1311</span>    // Instead they should be stored in an HBase table so that external visibility into HBase is<a name="line.1311"></a>
-<span class="sourceLineNo">1312</span>    // improved; Additionally the load balancer will be able to take advantage of a more complete<a name="line.1312"></a>
-<span class="sourceLineNo">1313</span>    // history.<a name="line.1313"></a>
-<span class="sourceLineNo">1314</span>    MetricsRegionServerWrapper regionServerWrapper = metricsRegionServer.getRegionServerWrapper();<a name="line.1314"></a>
-<span class="sourceLineNo">1315</span>    Collection&lt;HRegion&gt; regions = getOnlineRegionsLocalContext();<a name="line.1315"></a>
-<span class="sourceLineNo">1316</span>    long usedMemory = -1L;<a name="line.1316"></a>
-<span class="sourceLineNo">1317</span>    long maxMemory = -1L;<a name="line.1317"></a>
-<span class="sourceLineNo">1318</span>    final MemoryUsage usage = MemorySizeUtil.safeGetHeapMemoryUsage();<a name="line.1318"></a>
-<span class="sourceLineNo">1319</span>    if (usage != null) {<a name="line.1319"></a>
-<span class="sourceLineNo">1320</span>      usedMemory = usage.getUsed();<a name="line.1320"></a>
-<span class="sourceLineNo">1321</span>      maxMemory = usage.getMax();<a name="line.1321"></a>
-<span class="sourceLineNo">1322</span>    }<a name="line.1322"></a>
-<span class="sourceLineNo">1323</span><a name="line.1323"></a>
-<span class="sourceLineNo">1324</span>    ClusterStatusProtos.ServerLoad.Builder serverLoad = ClusterStatusProtos.ServerLoad.newBuilder();<a name="line.1324"></a>
-<span class="sourceLineNo">1325</span>    serverLoad.setNumberOfRequests((int) regionServerWrapper.getRequestsPerSecond());<a name="line.1325"></a>
-<span class="sourceLineNo">1326</span>    serverLoad.setTotalNumberOfRequests(regionServerWrapper.getTotalRequestCount());<a name="line.1326"></a>
-<span class="sourceLineNo">1327</span>    serverLoad.setUsedHeapMB((int)(usedMemory / 1024 / 1024));<a name="line.1327"></a>
-<span class="sourceLineNo">1328</span>    serverLoad.setMaxHeapMB((int) (maxMemory / 1024 / 1024));<a name="line.1328"></a>
-<span class="sourceLineNo">1329</span>    Set&lt;String&gt; coprocessors = getWAL(null).getCoprocessorHost().getCoprocessors();<a name="line.1329"></a>
-<span class="sourceLineNo">1330</span>    Builder coprocessorBuilder = Coprocessor.newBuilder();<a name="line.1330"></a>
-<span class="sourceLineNo">1331</span>    for (String coprocessor : coprocessors) {<a name="line.1331"></a>
-<span class="sourceLineNo">1332</span>      serverLoad.addCoprocessors(coprocessorBuilder.setName(coprocessor).build());<a name="line.1332"></a>
-<span class="sourceLineNo">1333</span>    }<a name="line.1333"></a>
-<span class="sourceLineNo">1334</span>    RegionLoad.Builder regionLoadBldr = RegionLoad.newBuilder();<a name="line.1334"></a>
-<span class="sourceLineNo">1335</span>    RegionSpecifier.Builder regionSpecifier = RegionSpecifier.newBuilder();<a name="line.1335"></a>
-<span class="sourceLineNo">1336</span>    for (HRegion region : regions) {<a name="line.1336"></a>
-<span class="sourceLineNo">1337</span>      if (region.getCoprocessorHost() != null) {<a name="line.1337"></a>
-<span class="sourceLineNo">1338</span>        Set&lt;String&gt; regionCoprocessors = region.getCoprocessorHost().getCoprocessors();<a name="line.1338"></a>
-<span class="sourceLineNo">1339</span>        Iterator&lt;String&gt; iterator = regionCoprocessors.iterator();<a name="line.1339"></a>
-<span class="sourceLineNo">1340</span>        while (iterator.hasNext()) {<a name="line.1340"></a>
-<span class="sourceLineNo">1341</span>          serverLoad.addCoprocessors(coprocessorBuilder.setName(iterator.next()).build());<a name="line.1341"></a>
-<span class="sourceLineNo">1342</span>        }<a name="line.1342"></a>
-<span class="sourceLineNo">1343</span>      }<a name="line.1343"></a>
-<span class="sourceLineNo">1344</span>      serverLoad.addRegionLoads(createRegionLoad(region, regionLoadBldr, regionSpecifier));<a name="line.1344"></a>
-<span class="sourceLineNo">1345</span>      for (String coprocessor : getWAL(region.getRegionInfo()).getCoprocessorHost()<a name="line.1345"></a>
-<span class="sourceLineNo">1346</span>          .getCoprocessors()) {<a name="line.1346"></a>
-<span class="sourceLineNo">1347</span>        serverLoad.addCoprocessors(coprocessorBuilder.setName(coprocessor).build());<a name="line.1347"></a>
-<span class="sourceLineNo">1348</span>      }<a name="line.1348"></a>
-<span class="sourceLineNo">1349</span>    }<a name="line.1349"></a>
-<span class="sourceLineNo">1350</span>    serverLoad.setReportStartTime(reportStartTime);<a name="line.1350"></a>
-<span class="sourceLineNo">1351</span>    serverLoad.setReportEndTime(reportEndTime);<a name="line.1351"></a>
-<span class="sourceLineNo">1352</span>    if (this.infoServer != null) {<a name="line.1352"></a>
-<span class="sourceLineNo">1353</span>      serverLoad.setInfoServerPort(this.infoServer.getPort());<a name="line.1353"></a>
-<span class="sourceLineNo">1354</span>    } else {<a name="line.1354"></a>
-<span class="sourceLineNo">1355</span>      serverLoad.setInfoServerPort(-1);<a name="line.1355"></a>
-<span class="sourceLineNo">1356</span>    }<a name="line.1356"></a>
-<span class="sourceLineNo">1357</span><a name="line.1357"></a>
-<span class="sourceLineNo">1358</span>    // for the replicationLoad purpose. Only need to get from one executorService<a name="line.1358"></a>
-<span class="sourceLineNo">1359</span>    // either source or sink will get the same info<a name="line.1359"></a>
-<span class="sourceLineNo">1360</span>    ReplicationSourceService rsources = getReplicationSourceService();<a name="line.1360"></a>
-<span class="sourceLineNo">1361</span><a name="line.1361"></a>
-<span class="sourceLineNo">1362</span>    if (rsources != null) {<a name="line.1362"></a>
-<span class="sourceLineNo">1363</span>      // always refresh first to get the latest value<a name="line.1363"></a>
-<span class="sourceLineNo">1364</span>      ReplicationLoad rLoad = rsources.refreshAndGetReplicationLoad();<a name="line.1364"></a>
-<span class="sourceLineNo">1365</span>      if (rLoad != null) {<a name="line.1365"></a>
-<span class="sourceLineNo">1366</span>        serverLoad.setReplLoadSink(rLoad.getReplicationLoadSink());<a name="line.1366"></a>
-<span class="sourceLineNo">1367</span>        for (ClusterStatusProtos.ReplicationLoadSource rLS : rLoad.getReplicationLoadSourceList()) {<a name="line.1367"></a>
-<span class="sourceLineNo">1368</span>          serverLoad.addReplLoadSource(rLS);<a name="line.1368"></a>
-<span class="sourceLineNo">1369</span>        }<a name="line.1369"></a>
-<span class="sourceLineNo">1370</span>      }<a name="line.1370"></a>
-<span class="sourceLineNo">1371</span>    }<a name="line.1371"></a>
-<span class="sourceLineNo">1372</span><a name="line.1372"></a>
-<span class="sourceLineNo">1373</span>    return serverLoad.build();<a name="line.1373"></a>
-<span class="sourceLineNo">1374</span>  }<a name="line.1374"></a>
-<span class="sourceLineNo">1375</span><a name="line.1375"></a>
-<span class="sourceLineNo">1376</span>  String getOnlineRegionsAsPrintableString() {<a name="line.1376"></a>
-<span class="sourceLineNo">1377</span>    StringBuilder sb = new StringBuilder();<a name="line.1377"></a>
-<span class="sourceLineNo">1378</span>    for (Region r: this.onlineRegions.values()) {<a name="line.1378"></a>
-<span class="sourceLineNo">1379</span>      if (sb.length() &gt; 0) sb.append(", ");<a name="line.1379"></a>
-<span class="sourceLineNo">1380</span>      sb.append(r.getRegionInfo().getEncodedName());<a name="line.1380"></a>
-<span class="sourceLineNo">1381</span>    }<a name="line.1381"></a>
-<span class="sourceLineNo">1382</span>    return sb.toString();<a name="line.1382"></a>
-<span class="sourceLineNo">1383</span>  }<a name="line.1383"></a>
-<span class="sourceLineNo">1384</span><a name="line.1384"></a>
-<span class="sourceLineNo">1385</span>  /**<a name="line.1385"></a>
-<span class="sourceLineNo">1386</span>   * Wait on regions close.<a name="line.1386"></a>
-<span class="sourceLineNo">1387</span>   */<a name="line.1387"></a>
-<span class="sourceLineNo">1388</span>  private void waitOnAllRegionsToClose(final boolean abort) {<a name="line.1388"></a>
-<span class="sourceLineNo">1389</span>    // Wait till all regions are closed before going out.<a name="line.1389"></a>
-<span class="sourceLineNo">1390</span>    int lastCount = -1;<a name="line.1390"></a>
-<span class="sourceLineNo">1391</span>    long previousLogTime = 0;<a name="line.1391"></a>
-<span class="sourceLineNo">1392</span>    Set&lt;String&gt; closedRegions = new HashSet&lt;&gt;();<a name="line.1392"></a>
-<span class="sourceLineNo">1393</span>    boolean interrupted = false;<a name="line.1393"></a>
-<span class="sourceLineNo">1394</span>    try {<a name="line.1394"></a>
-<span class="sourceLineNo">1395</span>      while (!isOnlineRegionsEmpty()) {<a name="line.1395"></a>
-<span class="sourceLineNo">1396</span>        int count = getNumberOfOnlineRegions();<a name="line.1396"></a>
-<span class="sourceLineNo">1397</span>        // Only print a message if the count of regions has changed.<a name="line.1397"></a>
-<span class="sourceLineNo">1398</span>        if (count != lastCount) {<a name="line.1398"></a>
-<span class="sourceLineNo">1399</span>          // Log every second at most<a name="line.1399"></a>
-<span class="sourceLineNo">1400</span>          if (System.currentTimeMillis() &gt; (previousLogTime + 1000)) {<a name="line.1400"></a>
-<span class="sourceLineNo">1401</span>            previousLogTime = System.currentTimeMillis();<a name="line.1401"></a>
-<span class="sourceLineNo">1402</span>            lastCount = count;<a name="line.1402"></a>
-<span class="sourceLineNo">1403</span>            LOG.info("Waiting on " + count + " regions to close");<a name="line.1403"></a>
-<span class="sourceLineNo">1404</span>            // Only print out regions still closing if a small number else will<a name="line.1404"></a>
-<span class="sourceLineNo">1405</span>            // swamp the log.<a name="line.1405"></a>
-<span class="sourceLineNo">1406</span>            if (count &lt; 10 &amp;&amp; LOG.isDebugEnabled()) {<a name="line.1406"></a>
-<span class="sourceLineNo">1407</span>              LOG.debug("Online Regions=" + this.onlineRegions);<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>        }<a name="line.1410"></a>
-<span class="sourceLineNo">1411</span>        // Ensure all user regions have been sent a close. Use this to<a name="line.1411"></a>
-<span class="sourceLineNo">1412</span>        // protect against the case where an open comes in after we start the<a name="line.1412"></a>
-<span class="sourceLineNo">1413</span>        // iterator of onlineRegions to close all user regions.<a name="line.1413"></a>
-<span class="sourceLineNo">1414</span>        for (Map.Entry&lt;String, HRegion&gt; e : this.onlineRegions.entrySet()) {<a name="line.1414"></a>
-<span class="sourceLineNo">1415</span>          RegionInfo hri = e.getValue().getRegionInfo();<a name="line.1415"></a>
-<span class="sourceLineNo">1416</span>          if (!this.regionsInTransitionInRS.containsKey(hri.getEncodedNameAsBytes()) &amp;&amp;<a name="line.1416"></a>
-<span class="sourceLineNo">1417</span>              !closedRegions.contains(hri.getEncodedName())) {<a name="line.1417"></a>
-<span class="sourceLineNo">1418</span>            closedRegions.add(hri.getEncodedName());<a name="line.1418"></a>
-<span class="sourceLineNo">1419</span>            // Don't update zk with this close transition; pass false.<a name="line.1419"></a>
-<span class="sourceLineNo">1420</span>            closeRegionIgnoreErrors(hri, abort);<a name="line.1420"></a>
-<span class="sourceLineNo">1421</span>          }<a name="line.1421"></a>
-<span class="sourceLineNo">1422</span>        }<a name="line.1422"></a>
-<span class="sourceLineNo">1423</span>        // No regions in RIT, we could stop waiting now.<a name="line.1423"></a>
-<span class="sourceLineNo">1424</span>        if (this.regionsInTransitionInRS.isEmpty()) {<a name="line.1424"></a>
-<span class="sourceLineNo">1425</span>          if (!isOnlineRegionsEmpty()) {<a name="line.1425"></a>
-<span class="sourceLineNo">1426</span>            LOG.info("We were exiting though online regions are not empty," +<a name="line.1426"></a>
-<span class="sourceLineNo">1427</span>                " because some regions failed closing");<a name="line.1427"></a>
-<span class="sourceLineNo">1428</span>          }<a name="line.1428"></a>
-<span class="sourceLineNo">1429</span>          break;<a name="line.1429"></a>
-<span class="sourceLineNo">1430</span>        }<a name="line.1430"></a>
-<span class="sourceLineNo">1431</span>        if (sleep(200)) {<a name="line.1431"></a>
-<span class="sourceLineNo">1432</span>          interrupted = true;<a name="line.1432"></a>
-<span class="sourceLineNo">1433</span>        }<a name="line.1433"></a>
-<span class="sourceLineNo">1434</span>      }<a name="line.1434"></a>
-<span class="sourceLineNo">1435</span>    } finally {<a name="line.1435"></a>
-<span class="sourceLineNo">1436</span>      if (interrupted) {<a name="line.1436"></a>
-<span class="sourceLineNo">1437</span>        Thread.currentThread().interrupt();<a name="line.1437"></a>
-<span class="sourceLineNo">1438</span>      }<a name="line.1438"></a>
-<span class="sourceLineNo">1439</span>    }<a name="line.1439"></a>
-<span class="sourceLineNo">1440</span>  }<a name="line.1440"></a>
-<span class="sourceLineNo">1441</span><a name="line.1441"></a>
-<span class="sourceLineNo">1442</span>  private boolean sleep(long millis) {<a name="line.1442"></a>
-<span class="sourceLineNo">1443</span>    boolean interrupted = false;<a name="line.1443"></a>
-<span class="sourceLineNo">1444</span>    try {<a name="line.1444"></a>
-<span class="sourceLineNo">1445</span>      Thread.sleep(millis);<a name="line.1445"></a>
-<span class="sourceLineNo">1446</span>    } catch (InterruptedException e) {<a name="line.1446"></a>
-<span class="sourceLineNo">1447</span>      LOG.warn("Interrupted while sleeping");<a name="line.1447"></a>
-<span class="sourceLineNo">1448</span>      interrupted = true;<a name="line.1448"></a>
-<span class="sourceLineNo">1449</span>    }<a name="line.1449"></a>
-<span class="sourceLineNo">1450</span>    return interrupted;<a name="line.1450"></a>
-<span class="sourceLineNo">1451</span>  }<a name="line.1451"></a>
-<span class="sourceLineNo">1452</span><a name="line.1452"></a>
-<span class="sourceLineNo">1453</span>  private void shutdownWAL(final boolean close) {<a name="line.1453"></a>
-<span class="sourceLineNo">1454</span>    if (this.walFactory != null) {<a name="line.1454"></a>
-<span class="sourceLineNo">1455</span>      try {<a name="line.1455"></a>
-<span class="sourceLineNo">1456</span>        if (close) {<a name="line.1456"></a>
-<span class="sourceLineNo">1457</span>          walFactory.close();<a name="line.1457"></a>
-<span class="sourceLineNo">1458</span>        } else {<a name="line.1458"></a>
-<span class="sourceLineNo">1459</span>          walFactory.shutdown();<a name="line.1459"></a>
-<span class="sourceLineNo">1460</span>        }<a name="line.1460"></a>
-<span class="sourceLineNo">1461</span>      } catch (Throwable e) {<a name="line.1461"></a>
-<span class="sourceLineNo">1462</span>        e = e instanceof RemoteException ? ((RemoteException) e).unwrapRemoteException() : e;<a name="line.1462"></a>
-<span class="sourceLineNo">1463</span>        LOG.error("Shutdown / close of WAL failed: " + e);<a name="line.1463"></a>
-<span class="sourceLineNo">1464</span>        LOG.debug("Shutdown / close exception details:", e);<a name="line.1464"></a>
-<span class="sourceLineNo">1465</span>      }<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>   * Run init. Sets up wal and starts up all server threads.<a name="line.1470"></a>
-<span class="sourceLineNo">1471</span>   *<a name="line.1471"></a>
-<span class="sourceLineNo">1472</span>   * @param c Extra configuration.<a name="line.1472"></a>
-<span class="sourceLineNo">1473</span>   */<a name="line.1473"></a>
-<span class="sourceLineNo">1474</span>  protected void handleReportForDutyResponse(final RegionServerStartupResponse c)<a name="line.1474"></a>
-<span class="sourceLineNo">1475</span>  throws IOException {<a name="line.1475"></a>
-<span class="sourceLineNo">1476</span>    try {<a name="line.1476"></a>
-<span class="sourceLineNo">1477</span>      boolean updateRootDir = false;<a name="line.1477"></a>
-<span class="sourceLineNo">1478</span>      for (NameStringPair e : c.getMapEntriesList()) {<a name="line.1478"></a>
-<span class="sourceLineNo">1479</span>        String key = e.getName();<a name="line.1479"></a>
-<span class="sourceLineNo">1480</span>        // The hostname the master sees us as.<a name="line.1480"></a>
-<span class="sourceLineNo">1481</span>        if (key.equals(HConstants.KEY_FOR_HOSTNAME_SEEN_BY_MASTER)) {<a name="line.1481"></a>
-<span class="sourceLineNo">1482</span>          String hostnameFromMasterPOV = e.getValue();<a name="line.1482"></a>
-<span class="sourceLineNo">1483</span>          this.serverName = ServerName.valueOf(hostnameFromMasterPOV, rpcServices.isa.getPort(),<a name="line.1483"></a>
-<span class="sourceLineNo">1484</span>              this.startcode);<a name="line.1484"></a>
-<span class="sourceLineNo">1485</span>          if (!StringUtils.isBlank(useThisHostnameInstead) &amp;&amp;<a name="line.1485"></a>
-<span class="sourceLineNo">1486</span>              !hostnameFromMasterPOV.equals(useThisHostnameInstead)) {<a name="line.1486"></a>
-<span class="sourceLineNo">1487</span>            String msg = "Master passed us a different hostname to use; was=" +<a name="line.1487"></a>
-<span class="sourceLineNo">1488</span>                this.useThisHostnameInstead + ", but now=" + hostnameFromMasterPOV;<a name="line.1488"></a>
-<span class="sourceLineNo">1489</span>            LOG.error(msg);<a name="line.1489"></a>
-<span class="sourceLineNo">1490</span>            throw new IOException(msg);<a name="line.1490"></a>
-<span class="sourceLineNo">1491</span>          }<a name="line.1491"></a>
-<span class="sourceLineNo">1492</span>          if (StringUtils.isBlank(useThisHostnameInstead) &amp;&amp;<a name="line.1492"></a>
-<span class="sourceLineNo">1493</span>              !hostnameFromMasterPOV.equals(rpcServices.isa.getHostName())) {<a name="line.1493"></a>
-<span class="sourceLineNo">1494</span>            String msg = "Master passed us a different hostname to use; was=" +<a name="line.1494"></a>
-<span class="sourceLineNo">1495</span>                rpcServices.isa.getHostName() + ", but now=" + hostnameFromMasterPOV;<a name="line.1495"></a>
-<span class="sourceLineNo">1496</span>            LOG.error(msg);<a name="line.1496"></a>
-<span class="sourceLineNo">1497</span>          }<a name="line.1497"></a>
-<span class="sourceLineNo">1498</span>          continue;<a name="line.1498"></a>
-<span class="sourceLineNo">1499</span>        }<a name="line.1499"></a>
-<span class="sourceLineNo">1500</span><a name="line.1500"></a>
-<span class="sourceLineNo">1501</span>        String value = e.getValue();<a name="line.1501"></a>
-<span class="sourceLineNo">1502</span>        if (key.equals(HConstants.HBASE_DIR)) {<a name="line.1502"></a>
-<span class="sourceLineNo">1503</span>          if (value != null &amp;&amp; !value.equals(conf.get(HConstants.HBASE_DIR))) {<a name="line.1503"></a>
-<span class="sourceLineNo">1504</span>            updateRootDir = true;<a name="line.1504"></a>
-<span class="sourceLineNo">1505</span>          }<a name="line.1505"></a>
-<span class="sourceLineNo">1506</span>        }<a name="line.1506"></a>
-<span class="sourceLineNo">1507</span><a name="line.1507"></a>
-<span class="sourceLineNo">1508</span>        if (LOG.isDebugEnabled()) {<a name="line.1508"></a>
-<span class="sourceLineNo">1509</span>          LOG.debug("Config from master: " + key + "=" + value);<a name="line.1509"></a>
-<span class="sourceLineNo">1510</span>        }<a name="line.1510"></a>
-<span class="sourceLineNo">1511</span>        this.conf.set(key, value);<a name="line.1511"></a>
-<span class="sourceLineNo">1512</span>      }<a name="line.1512"></a>
-<span class="sourceLineNo">1513</span>      // Set our ephemeral znode up in zookeeper now we have a name.<a name="line.1513"></a>
-<span class="sourceLineNo">1514</span>      createMyEphemeralNode();<a name="line.1514"></a>
-<span class="sourceLineNo">1515</span><a name="line.1515"></a>
-<span class="sourceLineNo">1516</span>      if (updateRootDir) {<a name="line.1516"></a>
-<span class="sourceLineNo">1517</span>        // initialize file system by the config fs.defaultFS and hbase.rootdir from master<a name="line.1517"></a>
-<span class="sourceLineNo">1518</span>        initializeFileSystem();<a name="line.1518"></a>
-<span class="sourceLineNo">1519</span>      }<a name="line.1519"></a>
-<span class="sourceLineNo">1520</span><a name="line.1520"></a>
-<span class="sourceLineNo">1521</span>      // hack! Maps DFSClient =&gt; RegionServer for logs.  HDFS made this<a name="line.1521"></a>
-<span class="sourceLineNo">1522</span>      // config param for task trackers, but we can piggyback off of it.<a name="line.1522"></a>
-<span class="sourceLineNo">1523</span>      if (this.conf.get("mapreduce.task.attempt.id") == null) {<a name="line.1523"></a>
-<span class="sourceLineNo">1524</span>        this.conf.set("mapreduce.task.attempt.id", "hb_rs_" + this.serverName.toString());<a name="line.1524"></a>
-<span class="sourceLineNo">1525</span>      }<a name="line.1525"></a>
-<span class="sourceLineNo">1526</span><a name="line.1526"></a>
-<span class="sourceLineNo">1527</span>      // Save it in a file, this will allow to see if we crash<a name="line.1527"></a>
-<span class="sourceLineNo">1528</span>      ZNodeClearer.writeMyEphemeralNodeOnDisk(getMyEphemeralNodePath());<a name="line.1528"></a>
-<span class="sourceLineNo">1529</span><a name="line.1529"></a>
-<span class="sourceLineNo">1530</span>      // This call sets up an initialized replication and WAL. Later we start it up.<a name="line.1530"></a>
-<span class="sourceLineNo">1531</span>      setupWALAndReplication();<a name="line.1531"></a>
-<span class="sourceLineNo">1532</span>      // Init in here rather than in constructor after thread name has been set<a name="line.1532"></a>
-<span class="sourceLineNo">1533</span>      this.metricsTable = new MetricsTable(new MetricsTableWrapperAggregateImpl(this));<a name="line.1533"></a>
-<span class="sourceLineNo">1534</span>      this.metricsRegionServer = new MetricsRegionServer(<a name="line.1534"></a>
-<span class="sourceLineNo">1535</span>          new MetricsRegionServerWrapperImpl(this), conf, metricsTable);<a name="line.1535"></a>
-<span class="sourceLineNo">1536</span>      // Now that we have a metrics source, start the pause monitor<a name="line.1536"></a>
-<span class="sourceLineNo">1537</span>      this.pauseMonitor = new JvmPauseMonitor(conf, getMetrics().getMetricsSource());<a name="line.1537"></a>
-<span class="sourceLineNo">1538</span>      pauseMonitor.start();<a name="line.1538"></a>
-<span class="sourceLineNo">1539</span><a name="line.1539"></a>
-<span class="sourceLineNo">1540</span>      // There is a rare case where we do NOT want services to start. Check config.<a name="line.1540"></a>
-<span class="sourceLineNo">1541</span>      if (getConfiguration().getBoolean("hbase.regionserver.workers", true)) {<a name="line.1541"></a>
-<span class="sourceLineNo">1542</span>        startServices();<a name="line.1542"></a>
-<span class="sourceLineNo">1543</span>      }<a name="line.1543"></a>
-<span class="sourceLineNo">1544</span>      // In here we start up the replication Service. Above we initialized it. TODO. Reconcile.<a name="line.1544"></a>
-<span class="sourceLineNo">1545</span>      // or make sense of it.<a name="line.1545"></a>
-<span class="sourceLineNo">1546</span>      startReplicationService();<a name="line.1546"></a>
-<span class="sourceLineNo">1547</span><a name="line.1547"></a>
+<span class="sourceLineNo">951</span>      LOG.debug("About to register with Master.");<a name="line.951"></a>
+<span class="sourceLineNo">952</span>      RetryCounterFactory rcf = new RetryCounterFactory(Integer.MAX_VALUE,<a name="line.952"></a>
+<span class="sourceLineNo">953</span>          this.sleeper.getPeriod(), 1000 * 60 * 5);<a name="line.953"></a>
+<span class="sourceLineNo">954</span>      RetryCounter rc = rcf.create();<a name="line.954"></a>
+<span class="sourceLineNo">955</span>      while (keepLooping()) {<a name="line.955"></a>
+<span class="sourceLineNo">956</span>        RegionServerStartupResponse w = reportForDuty();<a name="line.956"></a>
+<span class="sourceLineNo">957</span>        if (w == null) {<a name="line.957"></a>
+<span class="sourceLineNo">958</span>          long sleepTime = rc.getBackoffTimeAndIncrementAttempts();<a name="line.958"></a>
+<span class="sourceLineNo">959</span>          LOG.warn("reportForDuty failed; sleeping {} ms and then retrying.", sleepTime);<a name="line.959"></a>
+<span class="sourceLineNo">960</span>          this.sleeper.sleep(sleepTime);<a name="line.960"></a>
+<span class="sourceLineNo">961</span>        } else {<a name="line.961"></a>
+<span class="sourceLineNo">962</span>          handleReportForDutyResponse(w);<a name="line.962"></a>
+<span class="sourceLineNo">963</span>          break;<a name="line.963"></a>
+<span class="sourceLineNo">964</span>        }<a name="line.964"></a>
+<span class="sourceLineNo">965</span>      }<a name="line.965"></a>
+<span class="sourceLineNo">966</span><a name="line.966"></a>
+<span class="sourceLineNo">967</span>      if (!isStopped() &amp;&amp; isHealthy()) {<a name="line.967"></a>
+<span class="sourceLineNo">968</span>        // start the snapshot handler and other procedure handlers,<a name="line.968"></a>
+<span class="sourceLineNo">969</span>        // since the server is ready to run<a name="line.969"></a>
+<span class="sourceLineNo">970</span>        if (this.rspmHost != null) {<a name="line.970"></a>
+<span class="sourceLineNo">971</span>          this.rspmHost.start();<a name="line.971"></a>
+<span class="sourceLineNo">972</span>        }<a name="line.972"></a>
+<span class="sourceLineNo">973</span>        // Start the Quota Manager<a name="line.973"></a>
+<span class="sourceLineNo">974</span>        if (this.rsQuotaManager != null) {<a name="line.974"></a>
+<span class="sourceLineNo">975</span>          rsQuotaManager.start(getRpcServer().getScheduler());<a name="line.975"></a>
+<span class="sourceLineNo">976</span>        }<a name="line.976"></a>
+<span class="sourceLineNo">977</span>        if (this.rsSpaceQuotaManager != null) {<a name="line.977"></a>
+<span class="sourceLineNo">978</span>          this.rsSpaceQuotaManager.start();<a name="line.978"></a>
+<span class="sourceLineNo">979</span>        }<a name="line.979"></a>
+<span class="sourceLineNo">980</span>      }<a name="line.980"></a>
+<span class="sourceLineNo">981</span><a name="line.981"></a>
+<span class="sourceLineNo">982</span>      // We registered with the Master.  Go into run mode.<a name="line.982"></a>
+<span class="sourceLineNo">983</span>      long lastMsg = System.currentTimeMillis();<a name="line.983"></a>
+<span class="sourceLineNo">984</span>      long oldRequestCount = -1;<a name="line.984"></a>
+<span class="sourceLineNo">985</span>      // The main run loop.<a name="line.985"></a>
+<span class="sourceLineNo">986</span>      while (!isStopped() &amp;&amp; isHealthy()) {<a name="line.986"></a>
+<span class="sourceLineNo">987</span>        if (!isClusterUp()) {<a name="line.987"></a>
+<span class="sourceLineNo">988</span>          if (isOnlineRegionsEmpty()) {<a name="line.988"></a>
+<span class="sourceLineNo">989</span>            stop("Exiting; cluster shutdown set and not carrying any regions");<a name="line.989"></a>
+<span class="sourceLineNo">990</span>          } else if (!this.stopping) {<a name="line.990"></a>
+<span class="sourceLineNo">991</span>            this.stopping = true;<a name="line.991"></a>
+<span class="sourceLineNo">992</span>            LOG.info("Closing user regions");<a name="line.992"></a>
+<span class="sourceLineNo">993</span>            closeUserRegions(this.abortRequested);<a name="line.993"></a>
+<span class="sourceLineNo">994</span>          } else if (this.stopping) {<a name="line.994"></a>
+<span class="sourceLineNo">995</span>            boolean allUserRegionsOffline = areAllUserRegionsOffline();<a name="line.995"></a>
+<span class="sourceLineNo">996</span>            if (allUserRegionsOffline) {<a name="line.996"></a>
+<span class="sourceLineNo">997</span>              // Set stopped if no more write requests tp meta tables<a name="line.997"></a>
+<span class="sourceLineNo">998</span>              // since last time we went around the loop.  Any open<a name="line.998"></a>
+<span class="sourceLineNo">999</span>              // meta regions will be closed on our way out.<a name="line.999"></a>
+<span class="sourceLineNo">1000</span>              if (oldRequestCount == getWriteRequestCount()) {<a name="line.1000"></a>
+<span class="sourceLineNo">1001</span>                stop("Stopped; only catalog regions remaining online");<a name="line.1001"></a>
+<span class="sourceLineNo">1002</span>                break;<a name="line.1002"></a>
+<span class="sourceLineNo">1003</span>              }<a name="line.1003"></a>
+<span class="sourceLineNo">1004</span>              oldRequestCount = getWriteRequestCount();<a name="line.1004"></a>
+<span class="sourceLineNo">1005</span>            } else {<a name="line.1005"></a>
+<span class="sourceLineNo">1006</span>              // Make sure all regions have been closed -- some regions may<a name="line.1006"></a>
+<span class="sourceLineNo">1007</span>              // have not got it because we were splitting at the time of<a name="line.1007"></a>
+<span class="sourceLineNo">1008</span>              // the call to closeUserRegions.<a name="line.1008"></a>
+<span class="sourceLineNo">1009</span>              closeUserRegions(this.abortRequested);<a name="line.1009"></a>
+<span class="sourceLineNo">1010</span>            }<a name="line.1010"></a>
+<span class="sourceLineNo">1011</span>            LOG.debug("Waiting on " + getOnlineRegionsAsPrintableString());<a name="line.1011"></a>
+<span class="sourceLineNo">1012</span>          }<a name="line.1012"></a>
+<span class="sourceLineNo">1013</span>        }<a name="line.1013"></a>
+<span class="sourceLineNo">1014</span>        long now = System.currentTimeMillis();<a name="line.1014"></a>
+<span class="sourceLineNo">1015</span>        if ((now - lastMsg) &gt;= msgInterval) {<a name="line.1015"></a>
+<span class="sourceLineNo">1016</span>          tryRegionServerReport(lastMsg, now);<a name="line.1016"></a>
+<span class="sourceLineNo">1017</span>          lastMsg = System.currentTimeMillis();<a name="line.1017"></a>
+<span class="sourceLineNo">1018</span>        }<a name="line.1018"></a>
+<span class="sourceLineNo">1019</span>        if (!isStopped() &amp;&amp; !isAborted()) {<a name="line.1019"></a>
+<span class="sourceLineNo">1020</span>          this.sleeper.sleep();<a name="line.1020"></a>
+<span class="sourceLineNo">1021</span>        }<a name="line.1021"></a>
+<span class="sourceLineNo">1022</span>      } // for<a name="line.1022"></a>
+<span class="sourceLineNo">1023</span>    } catch (Throwable t) {<a name="line.1023"></a>
+<span class="sourceLineNo">1024</span>      if (!rpcServices.checkOOME(t)) {<a name="line.1024"></a>
+<span class="sourceLineNo">1025</span>        String prefix = t instanceof YouAreDeadException? "": "Unhandled: ";<a name="line.1025"></a>
+<span class="sourceLineNo">1026</span>        abort(prefix + t.getMessage(), t);<a name="line.1026"></a>
+<span class="sourceLineNo">1027</span>      }<a name="line.1027"></a>
+<span class="sourceLineNo">1028</span>    }<a name="line.1028"></a>
+<span class="sourceLineNo">1029</span>    if (this.leases != null) {<a name="line.1029"></a>
+<span class="sourceLineNo">1030</span>      this.leases.closeAfterLeasesExpire();<a name="line.1030"></a>
+<span class="sourceLineNo">1031</span>    }<a name="line.1031"></a>
+<span class="sourceLineNo">1032</span>    if (this.splitLogWorker != null) {<a name="line.1032"></a>
+<span class="sourceLineNo">1033</span>      splitLogWorker.stop();<a name="line.1033"></a>
+<span class="sourceLineNo">1034</span>    }<a name="line.1034"></a>
+<span class="sourceLineNo">1035</span>    if (this.infoServer != null) {<a name="line.1035"></a>
+<span class="sourceLineNo">1036</span>      LOG.info("Stopping infoServer");<a name="line.1036"></a>
+<span class="sourceLineNo">1037</span>      try {<a name="line.1037"></a>
+<span class="sourceLineNo">1038</span>        this.infoServer.stop();<a name="line.1038"></a>
+<span class="sourceLineNo">1039</span>      } catch (Exception e) {<a name="line.1039"></a>
+<span class="sourceLineNo">1040</span>        LOG.error("Failed to stop infoServer", e);<a name="line.1040"></a>
+<span class="sourceLineNo">1041</span>      }<a name="line.1041"></a>
+<span class="sourceLineNo">1042</span>    }<a name="line.1042"></a>
+<span class="sourceLineNo">1043</span>    // Send cache a shutdown.<a name="line.1043"></a>
+<span class="sourceLineNo">1044</span>    if (cacheConfig != null &amp;&amp; cacheConfig.isBlockCacheEnabled()) {<a name="line.1044"></a>
+<span class="sourceLineNo">1045</span>      cacheConfig.getBlockCache().shutdown();<a name="line.1045"></a>
+<span class="sourceLineNo">1046</span>    }<a name="line.1046"></a>
+<span class="sourceLineNo">1047</span>    mobCacheConfig.getMobFileCache().shutdown();<a name="line.1047"></a>
+<span class="sourceLineNo">1048</span><a name="line.1048"></a>
+<span class="sourceLineNo">1049</span>    if (movedRegionsCleaner != null) {<a name="line.1049"></a>
+<span class="sourceLineNo">1050</span>      movedRegionsCleaner.stop("Region Server stopping");<a name="line.1050"></a>
+<span class="sourceLineNo">1051</span>    }<a name="line.1051"></a>
+<span class="sourceLineNo">1052</span><a name="line.1052"></a>
+<span class="sourceLineNo">1053</span>    // Send interrupts to wake up threads if sleeping so they notice shutdown.<a name="line.1053"></a>
+<span class="sourceLineNo">1054</span>    // TODO: Should we check they are alive? If OOME could have exited already<a name="line.1054"></a>
+<span class="sourceLineNo">1055</span>    if (this.hMemManager != null) this.hMemManager.stop();<a name="line.1055"></a>
+<span class="sourceLineNo">1056</span>    if (this.cacheFlusher != null) this.cacheFlusher.interruptIfNecessary();<a name="line.1056"></a>
+<span class="sourceLineNo">1057</span>    if (this.compactSplitThread != null) this.compactSplitThread.interruptIfNecessary();<a name="line.1057"></a>
+<span class="sourceLineNo">1058</span>    sendShutdownInterrupt();<a name="line.1058"></a>
+<span class="sourceLineNo">1059</span><a name="line.1059"></a>
+<span class="sourceLineNo">1060</span>    // Stop the snapshot and other procedure handlers, forcefully killing all running tasks<a name="line.1060"></a>
+<span class="sourceLineNo">1061</span>    if (rspmHost != null) {<a name="line.1061"></a>
+<span class="sourceLineNo">1062</span>      rspmHost.stop(this.abortRequested || this.killed);<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>    if (this.killed) {<a name="line.1065"></a>
+<span class="sourceLineNo">1066</span>      // Just skip out w/o closing regions.  Used when testing.<a name="line.1066"></a>
+<span class="sourceLineNo">1067</span>    } else if (abortRequested) {<a name="line.1067"></a>
+<span class="sourceLineNo">1068</span>      if (this.fsOk) {<a name="line.1068"></a>
+<span class="sourceLineNo">1069</span>        closeUserRegions(abortRequested); // Don't leave any open file handles<a name="line.1069"></a>
+<span class="sourceLineNo">1070</span>      }<a name="line.1070"></a>
+<span class="sourceLineNo">1071</span>      LOG.info("aborting server " + this.serverName);<a name="line.1071"></a>
+<span class="sourceLineNo">1072</span>    } else {<a name="line.1072"></a>
+<span class="sourceLineNo">1073</span>      closeUserRegions(abortRequested);<a name="line.1073"></a>
+<span class="sourceLineNo">1074</span>      LOG.info("stopping server " + this.serverName);<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>    // so callers waiting for meta without timeout can stop<a name="line.1077"></a>
+<span class="sourceLineNo">1078</span>    if (this.metaTableLocator != null) this.metaTableLocator.stop();<a name="line.1078"></a>
+<span class="sourceLineNo">1079</span>    if (this.clusterConnection != null &amp;&amp; !clusterConnection.isClosed()) {<a name="line.1079"></a>
+<span class="sourceLineNo">1080</span>      try {<a name="line.1080"></a>
+<span class="sourceLineNo">1081</span>        this.clusterConnection.close();<a name="line.1081"></a>
+<span class="sourceLineNo">1082</span>      } catch (IOException e) {<a name="line.1082"></a>
+<span class="sourceLineNo">1083</span>        // Although the {@link Closeable} interface throws an {@link<a name="line.1083"></a>
+<span class="sourceLineNo">1084</span>        // IOException}, in reality, the implementation would never do that.<a name="line.1084"></a>
+<span class="sourceLineNo">1085</span>        LOG.warn("Attempt to close server's short circuit ClusterConnection failed.", e);<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>    // Closing the compactSplit thread before closing meta regions<a name="line.1089"></a>
+<span class="sourceLineNo">1090</span>    if (!this.killed &amp;&amp; containsMetaTableRegions()) {<a name="line.1090"></a>
+<span class="sourceLineNo">1091</span>      if (!abortRequested || this.fsOk) {<a name="line.1091"></a>
+<span class="sourceLineNo">1092</span>        if (this.compactSplitThread != null) {<a name="line.1092"></a>
+<span class="sourceLineNo">1093</span>          this.compactSplitThread.join();<a name="line.1093"></a>
+<span class="sourceLineNo">1094</span>          this.compactSplitThread = null;<a name="line.1094"></a>
+<span class="sourceLineNo">1095</span>        }<a name="line.1095"></a>
+<span class="sourceLineNo">1096</span>        closeMetaTableRegions(abortRequested);<a name="line.1096"></a>
+<span class="sourceLineNo">1097</span>      }<a name="line.1097"></a>
+<span class="sourceLineNo">1098</span>    }<a name="line.1098"></a>
+<span class="sourceLineNo">1099</span><a name="line.1099"></a>
+<span class="sourceLineNo">1100</span>    if (!this.killed &amp;&amp; this.fsOk) {<a name="line.1100"></a>
+<span class="sourceLineNo">1101</span>      waitOnAllRegionsToClose(abortRequested);<a name="line.1101"></a>
+<span class="sourceLineNo">1102</span>      LOG.info("stopping server " + this.serverName + "; all regions closed.");<a name="line.1102"></a>
+<span class="sourceLineNo">1103</span>    }<a name="line.1103"></a>
+<span class="sourceLineNo">1104</span><a name="line.1104"></a>
+<span class="sourceLineNo">1105</span>    // Stop the quota manager<a name="line.1105"></a>
+<span class="sourceLineNo">1106</span>    if (rsQuotaManager != null) {<a name="line.1106"></a>
+<span class="sourceLineNo">1107</span>      rsQuotaManager.stop();<a name="line.1107"></a>
+<span class="sourceLineNo">1108</span>    }<a name="line.1108"></a>
+<span class="sourceLineNo">1109</span>    if (rsSpaceQuotaManager != null) {<a name="line.1109"></a>
+<span class="sourceLineNo">1110</span>      rsSpaceQuotaManager.stop();<a name="line.1110"></a>
+<span class="sourceLineNo">1111</span>      rsSpaceQuotaManager = null;<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>    //fsOk flag may be changed when closing regions throws exception.<a name="line.1114"></a>
+<span class="sourceLineNo">1115</span>    if (this.fsOk) {<a name="line.1115"></a>
+<span class="sourceLineNo">1116</span>      shutdownWAL(!abortRequested);<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>    // Make sure the proxy is down.<a name="line.1119"></a>
+<span class="sourceLineNo">1120</span>    if (this.rssStub != null) {<a name="line.1120"></a>
+<span class="sourceLineNo">1121</span>      this.rssStub = null;<a name="line.1121"></a>
+<span class="sourceLineNo">1122</span>    }<a name="line.1122"></a>
+<span class="sourceLineNo">1123</span>    if (this.lockStub != null) {<a name="line.1123"></a>
+<span class="sourceLineNo">1124</span>      this.lockStub = null;<a name="line.1124"></a>
+<span class="sourceLineNo">1125</span>    }<a name="line.1125"></a>
+<span class="sourceLineNo">1126</span>    if (this.rpcClient != null) {<a name="line.1126"></a>
+<span class="sourceLineNo">1127</span>      this.rpcClient.close();<a name="line.1127"></a>
+<span class="sourceLineNo">1128</span>    }<a name="line.1128"></a>
+<span class="sourceLineNo">1129</span>    if (this.leases != null) {<a name="line.1129"></a>
+<span class="sourceLineNo">1130</span>      this.leases.close();<a name="line.1130"></a>
+<span class="sourceLineNo">1131</span>    }<a name="line.1131"></a>
+<span class="sourceLineNo">1132</span>    if (this.pauseMonitor != null) {<a name="line.1132"></a>
+<span class="sourceLineNo">1133</span>      this.pauseMonitor.stop();<a name="line.1133"></a>
+<span class="sourceLineNo">1134</span>    }<a name="line.1134"></a>
+<span class="sourceLineNo">1135</span><a name="line.1135"></a>
+<span class="sourceLineNo">1136</span>    if (!killed) {<a name="line.1136"></a>
+<span class="sourceLineNo">1137</span>      stopServiceThreads();<a name="line.1137"></a>
+<span class="sourceLineNo">1138</span>    }<a name="line.1138"></a>
+<span class="sourceLineNo">1139</span><a name="line.1139"></a>
+<span class="sourceLineNo">1140</span>    if (this.rpcServices != null) {<a name="line.1140"></a>
+<span class="sourceLineNo">1141</span>      this.rpcServices.stop();<a name="line.1141"></a>
+<span class="sourceLineNo">1142</span>    }<a name="line.1142"></a>
+<span class="sourceLineNo">1143</span><a name="line.1143"></a>
+<span class="sourceLineNo">1144</span>    try {<a name="line.1144"></a>
+<span class="sourceLineNo">1145</span>      deleteMyEphemeralNode();<a name="line.1145"></a>
+<span class="sourceLineNo">1146</span>    } catch (KeeperException.NoNodeException nn) {<a name="line.1146"></a>
+<span class="sourceLineNo">1147</span>    } catch (KeeperException e) {<a name="line.1147"></a>
+<span class="sourceLineNo">1148</span>      LOG.warn("Failed deleting my ephemeral node", e);<a name="line.1148"></a>
+<span class="sourceLineNo">1149</span>    }<a name="line.1149"></a>
+<span class="sourceLineNo">1150</span>    // We may have failed to delete the znode at the previous step, but<a name="line.1150"></a>
+<span class="sourceLineNo">1151</span>    //  we delete the file anyway: a second attempt to delete the znode is likely to fail again.<a name="line.1151"></a>
+<span class="sourceLineNo">1152</span>    ZNodeClearer.deleteMyEphemeralNodeOnDisk();<a name="line.1152"></a>
+<span class="sourceLineNo">1153</span><a name="line.1153"></a>
+<span class="sourceLineNo">1154</span>    if (this.zooKeeper != null) {<a name="line.1154"></a>
+<span class="sourceLineNo">1155</span>      this.zooKeeper.close();<a name="line.1155"></a>
+<span class="sourceLineNo">1156</span>    }<a name="line.1156"></a>
+<span class="sourceLineNo">1157</span>    this.shutDown = true;<a name="line.1157"></a>
+<span class="sourceLineNo">1158</span>    LOG.info("Exiting; stopping=" + this.serverName + "; zookeeper connection closed.");<a name="line.1158"></a>
+<span class="sourceLineNo">1159</span>  }<a name="line.1159"></a>
+<span class="sourceLineNo">1160</span><a name="line.1160"></a>
+<span class="sourceLineNo">1161</span>  private boolean containsMetaTableRegions() {<a name="line.1161"></a>
+<span class="sourceLineNo">1162</span>    return onlineRegions.containsKey(RegionInfoBuilder.FIRST_META_REGIONINFO.getEncodedName());<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>  private boolean areAllUserRegionsOffline() {<a name="line.1165"></a>
+<span class="sourceLineNo">1166</span>    if (getNumberOfOnlineRegions() &gt; 2) return false;<a name="line.1166"></a>
+<span class="sourceLineNo">1167</span>    boolean allUserRegionsOffline = true;<a name="line.1167"></a>
+<span class="sourceLineNo">1168</span>    for (Map.Entry&lt;String, HRegion&gt; e: this.onlineRegions.entrySet()) {<a name="line.1168"></a>
+<span class="sourceLineNo">1169</span>      if (!e.getValue().getRegionInfo().isMetaRegion()) {<a name="line.1169"></a>
+<span class="sourceLineNo">1170</span>        allUserRegionsOffline = false;<a name="line.1170"></a>
+<span class="sourceLineNo">1171</span>        break;<a name="line.1171"></a>
+<span class="sourceLineNo">1172</span>      }<a name="line.1172"></a>
+<span class="sourceLineNo">1173</span>    }<a name="line.1173"></a>
+<span class="sourceLineNo">1174</span>    return allUserRegionsOffline;<a name="line.1174"></a>
+<span class="sourceLineNo">1175</span>  }<a name="line.1175"></a>
+<span class="sourceLineNo">1176</span><a name="line.1176"></a>
+<span class="sourceLineNo">1177</span>  /**<a name="line.1177"></a>
+<span class="sourceLineNo">1178</span>   * @return Current write count for all online regions.<a name="line.1178"></a>
+<span class="sourceLineNo">1179</span>   */<a name="line.1179"></a>
+<span class="sourceLineNo">1180</span>  private long getWriteRequestCount() {<a name="line.1180"></a>
+<span class="sourceLineNo">1181</span>    long writeCount = 0;<a name="line.1181"></a>
+<span class="sourceLineNo">1182</span>    for (Map.Entry&lt;String, HRegion&gt; e: this.onlineRegions.entrySet()) {<a name="line.1182"></a>
+<span class="sourceLineNo">1183</span>      writeCount += e.getValue().getWriteRequestsCount();<a name="line.1183"></a>
+<span class="sourceLineNo">1184</span>    }<a name="line.1184"></a>
+<span class="sourceLineNo">1185</span>    return writeCount;<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>  @VisibleForTesting<a name="line.1188"></a>
+<span class="sourceLineNo">1189</span>  protected void tryRegionServerReport(long reportStartTime, long reportEndTime)<a name="line.1189"></a>
+<span class="sourceLineNo">1190</span>      throws IOException {<a name="line.1190"></a>
+<span class="sourceLineNo">1191</span>    RegionServerStatusService.BlockingInterface rss = rssStub;<a name="line.1191"></a>
+<span class="sourceLineNo">1192</span>    if (rss == null) {<a name="line.1192"></a>
+<span class="sourceLineNo">1193</span>      // the current server could be stopping.<a name="line.1193"></a>
+<span class="sourceLineNo">1194</span>      return;<a name="line.1194"></a>
+<span class="sourceLineNo">1195</span>    }<a name="line.1195"></a>
+<span class="sourceLineNo">1196</span>    ClusterStatusProtos.ServerLoad sl = buildServerLoad(reportStartTime, reportEndTime);<a name="line.1196"></a>
+<span class="sourceLineNo">1197</span>    try {<a name="line.1197"></a>
+<span class="sourceLineNo">1198</span>      RegionServerReportRequest.Builder request = RegionServerReportRequest.newBuilder();<a name="line.1198"></a>
+<span class="sourceLineNo">1199</span>      request.setServer(ProtobufUtil.toServerName(this.serverName));<a name="line.1199"></a>
+<span class="sourceLineNo">1200</span>      request.setLoad(sl);<a name="line.1200"></a>
+<span class="sourceLineNo">1201</span>      rss.regionServerReport(null, request.build());<a name="line.1201"></a>
+<span class="sourceLineNo">1202</span>    } catch (ServiceException se) {<a name="line.1202"></a>
+<span class="sourceLineNo">1203</span>      IOException ioe = ProtobufUtil.getRemoteException(se);<a name="line.1203"></a>
+<span class="sourceLineNo">1204</span>      if (ioe instanceof YouAreDeadException) {<a name="line.1204"></a>
+<span class="sourceLineNo">1205</span>        // This will be caught and handled as a fatal error in run()<a name="line.1205"></a>
+<span class="sourceLineNo">1206</span>        throw ioe;<a name="line.1206"></a>
+<span class="sourceLineNo">1207</span>      }<a name="line.1207"></a>
+<span class="sourceLineNo">1208</span>      if (rssStub == rss) {<a name="line.1208"></a>
+<span class="sourceLineNo">1209</span>        rssStub = null;<a name="line.1209"></a>
+<span class="sourceLineNo">1210</span>      }<a name="line.1210"></a>
+<span class="sourceLineNo">1211</span>      // Couldn't connect to the master, get location from zk and reconnect<a name="line.1211"></a>
+<span class="sourceLineNo">1212</span>      // Method blocks until new master is found or we are stopped<a name="line.1212"></a>
+<span class="sourceLineNo">1213</span>      createRegionServerStatusStub(true);<a name="line.1213"></a>
+<span class="sourceLineNo">1214</span>    }<a name="line.1214"></a>
+<span class="sourceLineNo">1215</span>  }<a name="line.1215"></a>
+<span class="sourceLineNo">1216</span><a name="line.1216"></a>
+<span class="sourceLineNo">1217</span>  /**<a name="line.1217"></a>
+<span class="sourceLineNo">1218</span>   * Reports the given map of Regions and their size on the filesystem to the active Master.<a name="line.1218"></a>
+<span class="sourceLineNo">1219</span>   *<a name="line.1219"></a>
+<span class="sourceLineNo">1220</span>   * @param regionSizeStore The store containing region sizes<a name="line.1220"></a>
+<span class="sourceLineNo">1221</span>   * @return false if FileSystemUtilizationChore should pause reporting to master. true otherwise<a name="line.1221"></a>
+<span class="sourceLineNo">1222</span>   */<a name="line.1222"></a>
+<span class="sourceLineNo">1223</span>  public boolean reportRegionSizesForQuotas(RegionSizeStore regionSizeStore) {<a name="line.1223"></a>
+<span class="sourceLineNo">1224</span>    RegionServerStatusService.BlockingInterface rss = rssStub;<a name="line.1224"></a>
+<span class="sourceLineNo">1225</span>    if (rss == null) {<a name="line.1225"></a>
+<span class="sourceLineNo">1226</span>      // the current server could be stopping.<a name="line.1226"></a>
+<span class="sourceLineNo">1227</span>      LOG.trace("Skipping Region size report to HMaster as stub is null");<a name="line.1227"></a>
+<span class="sourceLineNo">1228</span>      return true;<a name="line.1228"></a>
+<span class="sourceLineNo">1229</span>    }<a name="line.1229"></a>
+<span class="sourceLineNo">1230</span>    try {<a name="line.1230"></a>
+<span class="sourceLineNo">1231</span>      buildReportAndSend(rss, regionSizeStore);<a name="line.1231"></a>
+<span class="sourceLineNo">1232</span>    } catch (ServiceException se) {<a name="line.1232"></a>
+<span class="sourceLineNo">1233</span>      IOException ioe = ProtobufUtil.getRemoteException(

<TRUNCATED>

[03/46] hbase-site git commit: Published site at 05d22ed960204183fbd9bd16f1dbca6410ccde76.

Posted by gi...@apache.org.
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/3649682c/testdevapidocs/index-all.html
----------------------------------------------------------------------
diff --git a/testdevapidocs/index-all.html b/testdevapidocs/index-all.html
index 3ad74e3..c78f132 100644
--- a/testdevapidocs/index-all.html
+++ b/testdevapidocs/index-all.html
@@ -5361,6 +5361,8 @@
 <dd>&nbsp;</dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/master/TestMasterQosFunction.html#CLASS_RULE">CLASS_RULE</a></span> - Static variable in class org.apache.hadoop.hbase.master.<a href="org/apache/hadoop/hbase/master/TestMasterQosFunction.html" title="class in org.apache.hadoop.hbase.master">TestMasterQosFunction</a></dt>
 <dd>&nbsp;</dd>
+<dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/master/TestMasterRepairMode.html#CLASS_RULE">CLASS_RULE</a></span> - Static variable in class org.apache.hadoop.hbase.master.<a href="org/apache/hadoop/hbase/master/TestMasterRepairMode.html" title="class in org.apache.hadoop.hbase.master">TestMasterRepairMode</a></dt>
+<dd>&nbsp;</dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/master/TestMasterRestartAfterDisablingTable.html#CLASS_RULE">CLASS_RULE</a></span> - Static variable in class org.apache.hadoop.hbase.master.<a href="org/apache/hadoop/hbase/master/TestMasterRestartAfterDisablingTable.html" title="class in org.apache.hadoop.hbase.master">TestMasterRestartAfterDisablingTable</a></dt>
 <dd>&nbsp;</dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/master/TestMasterShutdown.html#CLASS_RULE">CLASS_RULE</a></span> - Static variable in class org.apache.hadoop.hbase.master.<a href="org/apache/hadoop/hbase/master/TestMasterShutdown.html" title="class in org.apache.hadoop.hbase.master">TestMasterShutdown</a></dt>
@@ -13081,6 +13083,8 @@
 </dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/IntegrationTestDDLMasterFailover.html#enabledTables">enabledTables</a></span> - Variable in class org.apache.hadoop.hbase.<a href="org/apache/hadoop/hbase/IntegrationTestDDLMasterFailover.html" title="class in org.apache.hadoop.hbase">IntegrationTestDDLMasterFailover</a></dt>
 <dd>&nbsp;</dd>
+<dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/master/TestMasterRepairMode.html#enableMaintenanceMode--">enableMaintenanceMode()</a></span> - Method in class org.apache.hadoop.hbase.master.<a href="org/apache/hadoop/hbase/master/TestMasterRepairMode.html" title="class in org.apache.hadoop.hbase.master">TestMasterRepairMode</a></dt>
+<dd>&nbsp;</dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/master/replication/TestModifyPeerProcedureRetryBackoff.TestModifyPeerProcedure.html#enablePeer-org.apache.hadoop.hbase.master.procedure.MasterProcedureEnv-">enablePeer(MasterProcedureEnv)</a></span> - Method in class org.apache.hadoop.hbase.master.replication.<a href="org/apache/hadoop/hbase/master/replication/TestModifyPeerProcedureRetryBackoff.TestModifyPeerProcedure.html" title="class in org.apache.hadoop.hbase.master.replication">TestModifyPeerProcedureRetryBackoff.TestModifyPeerProcedure</a></dt>
 <dd>&nbsp;</dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/replication/TestMasterReplication.html#enablePeer-java.lang.String-int-">enablePeer(String, int)</a></span> - Method in class org.apache.hadoop.hbase.replication.<a href="org/apache/hadoop/hbase/replication/TestMasterReplication.html" title="class in org.apache.hadoop.hbase.replication">TestMasterReplication</a></dt>
@@ -14665,6 +14669,8 @@
 <dd>&nbsp;</dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/master/TestMasterBalanceThrottling.html#FAMILYNAME">FAMILYNAME</a></span> - Static variable in class org.apache.hadoop.hbase.master.<a href="org/apache/hadoop/hbase/master/TestMasterBalanceThrottling.html" title="class in org.apache.hadoop.hbase.master">TestMasterBalanceThrottling</a></dt>
 <dd>&nbsp;</dd>
+<dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/master/TestMasterRepairMode.html#FAMILYNAME">FAMILYNAME</a></span> - Static variable in class org.apache.hadoop.hbase.master.<a href="org/apache/hadoop/hbase/master/TestMasterRepairMode.html" title="class in org.apache.hadoop.hbase.master">TestMasterRepairMode</a></dt>
+<dd>&nbsp;</dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/regionserver/TestBulkLoad.WalMatcher.html#familyName">familyName</a></span> - Variable in class org.apache.hadoop.hbase.regionserver.<a href="org/apache/hadoop/hbase/regionserver/TestBulkLoad.WalMatcher.html" title="class in org.apache.hadoop.hbase.regionserver">TestBulkLoad.WalMatcher</a></dt>
 <dd>&nbsp;</dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/regionserver/TestRegionMergeTransactionOnCluster.html#FAMILYNAME">FAMILYNAME</a></span> - Static variable in class org.apache.hadoop.hbase.regionserver.<a href="org/apache/hadoop/hbase/regionserver/TestRegionMergeTransactionOnCluster.html" title="class in org.apache.hadoop.hbase.regionserver">TestRegionMergeTransactionOnCluster</a></dt>
@@ -24189,6 +24195,8 @@
 <dd>&nbsp;</dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/master/TestMasterOperationsForRegionReplicas.html#LOG">LOG</a></span> - Static variable in class org.apache.hadoop.hbase.master.<a href="org/apache/hadoop/hbase/master/TestMasterOperationsForRegionReplicas.html" title="class in org.apache.hadoop.hbase.master">TestMasterOperationsForRegionReplicas</a></dt>
 <dd>&nbsp;</dd>
+<dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/master/TestMasterRepairMode.html#LOG">LOG</a></span> - Static variable in class org.apache.hadoop.hbase.master.<a href="org/apache/hadoop/hbase/master/TestMasterRepairMode.html" title="class in org.apache.hadoop.hbase.master">TestMasterRepairMode</a></dt>
+<dd>&nbsp;</dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/master/TestMasterRestartAfterDisablingTable.html#LOG">LOG</a></span> - Static variable in class org.apache.hadoop.hbase.master.<a href="org/apache/hadoop/hbase/master/TestMasterRestartAfterDisablingTable.html" title="class in org.apache.hadoop.hbase.master">TestMasterRestartAfterDisablingTable</a></dt>
 <dd>&nbsp;</dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/master/TestMasterRestartAfterDisablingTable.html#log-java.lang.String-">log(String)</a></span> - Method in class org.apache.hadoop.hbase.master.<a href="org/apache/hadoop/hbase/master/TestMasterRestartAfterDisablingTable.html" title="class in org.apache.hadoop.hbase.master">TestMasterRestartAfterDisablingTable</a></dt>
@@ -27251,6 +27259,8 @@
 <dd>&nbsp;</dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/master/TestMasterOperationsForRegionReplicas.html#name">name</a></span> - Variable in class org.apache.hadoop.hbase.master.<a href="org/apache/hadoop/hbase/master/TestMasterOperationsForRegionReplicas.html" title="class in org.apache.hadoop.hbase.master">TestMasterOperationsForRegionReplicas</a></dt>
 <dd>&nbsp;</dd>
+<dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/master/TestMasterRepairMode.html#name">name</a></span> - Variable in class org.apache.hadoop.hbase.master.<a href="org/apache/hadoop/hbase/master/TestMasterRepairMode.html" title="class in org.apache.hadoop.hbase.master">TestMasterRepairMode</a></dt>
+<dd>&nbsp;</dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/master/TestMasterRestartAfterDisablingTable.html#name">name</a></span> - Variable in class org.apache.hadoop.hbase.master.<a href="org/apache/hadoop/hbase/master/TestMasterRestartAfterDisablingTable.html" title="class in org.apache.hadoop.hbase.master">TestMasterRestartAfterDisablingTable</a></dt>
 <dd>&nbsp;</dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/master/TestMirroringTableStateManager.html#name">name</a></span> - Variable in class org.apache.hadoop.hbase.master.<a href="org/apache/hadoop/hbase/master/TestMirroringTableStateManager.html" title="class in org.apache.hadoop.hbase.master">TestMirroringTableStateManager</a></dt>
@@ -37617,6 +37627,8 @@
 <dd>&nbsp;</dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/master/TestMasterQosFunction.html#setUp--">setUp()</a></span> - Method in class org.apache.hadoop.hbase.master.<a href="org/apache/hadoop/hbase/master/TestMasterQosFunction.html" title="class in org.apache.hadoop.hbase.master">TestMasterQosFunction</a></dt>
 <dd>&nbsp;</dd>
+<dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/master/TestMasterRepairMode.html#setUp--">setUp()</a></span> - Method in class org.apache.hadoop.hbase.master.<a href="org/apache/hadoop/hbase/master/TestMasterRepairMode.html" title="class in org.apache.hadoop.hbase.master">TestMasterRepairMode</a></dt>
+<dd>&nbsp;</dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/master/TestMasterTransitions.html#setup--">setup()</a></span> - Method in class org.apache.hadoop.hbase.master.<a href="org/apache/hadoop/hbase/master/TestMasterTransitions.html" title="class in org.apache.hadoop.hbase.master">TestMasterTransitions</a></dt>
 <dd>&nbsp;</dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/master/TestMetaAssignmentWithStopMaster.html#setUp--">setUp()</a></span> - Static method in class org.apache.hadoop.hbase.master.<a href="org/apache/hadoop/hbase/master/TestMetaAssignmentWithStopMaster.html" title="class in org.apache.hadoop.hbase.master">TestMetaAssignmentWithStopMaster</a></dt>
@@ -43045,6 +43057,8 @@
 <dd>&nbsp;</dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/master/TestMasterNoCluster.html#tearDown--">tearDown()</a></span> - Method in class org.apache.hadoop.hbase.master.<a href="org/apache/hadoop/hbase/master/TestMasterNoCluster.html" title="class in org.apache.hadoop.hbase.master">TestMasterNoCluster</a></dt>
 <dd>&nbsp;</dd>
+<dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/master/TestMasterRepairMode.html#tearDown--">tearDown()</a></span> - Method in class org.apache.hadoop.hbase.master.<a href="org/apache/hadoop/hbase/master/TestMasterRepairMode.html" title="class in org.apache.hadoop.hbase.master">TestMasterRepairMode</a></dt>
+<dd>&nbsp;</dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/master/TestRestartCluster.html#tearDown--">tearDown()</a></span> - Method in class org.apache.hadoop.hbase.master.<a href="org/apache/hadoop/hbase/master/TestRestartCluster.html" title="class in org.apache.hadoop.hbase.master">TestRestartCluster</a></dt>
 <dd>&nbsp;</dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/master/TestServerCrashProcedureCarryingMetaStuck.html#tearDown--">tearDown()</a></span> - Static method in class org.apache.hadoop.hbase.master.<a href="org/apache/hadoop/hbase/master/TestServerCrashProcedureCarryingMetaStuck.html" title="class in org.apache.hadoop.hbase.master">TestServerCrashProcedureCarryingMetaStuck</a></dt>
@@ -44777,6 +44791,8 @@
 <dd>&nbsp;</dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/master/TestMasterOperationsForRegionReplicas.html#TEST_UTIL">TEST_UTIL</a></span> - Static variable in class org.apache.hadoop.hbase.master.<a href="org/apache/hadoop/hbase/master/TestMasterOperationsForRegionReplicas.html" title="class in org.apache.hadoop.hbase.master">TestMasterOperationsForRegionReplicas</a></dt>
 <dd>&nbsp;</dd>
+<dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/master/TestMasterRepairMode.html#TEST_UTIL">TEST_UTIL</a></span> - Static variable in class org.apache.hadoop.hbase.master.<a href="org/apache/hadoop/hbase/master/TestMasterRepairMode.html" title="class in org.apache.hadoop.hbase.master">TestMasterRepairMode</a></dt>
+<dd>&nbsp;</dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/master/TestMasterTransitions.html#TEST_UTIL">TEST_UTIL</a></span> - Static variable in class org.apache.hadoop.hbase.master.<a href="org/apache/hadoop/hbase/master/TestMasterTransitions.html" title="class in org.apache.hadoop.hbase.master">TestMasterTransitions</a></dt>
 <dd>&nbsp;</dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/master/TestMetaShutdownHandler.html#TEST_UTIL">TEST_UTIL</a></span> - Static variable in class org.apache.hadoop.hbase.master.<a href="org/apache/hadoop/hbase/master/TestMetaShutdownHandler.html" title="class in org.apache.hadoop.hbase.master">TestMetaShutdownHandler</a></dt>
@@ -50859,6 +50875,8 @@
 <dd>&nbsp;</dd>
 <dt><a href="org/apache/hadoop/hbase/executor/TestExecutorService.TestEventHandler.html" title="class in org.apache.hadoop.hbase.executor"><span class="typeNameLink">TestExecutorService.TestEventHandler</span></a> - Class in <a href="org/apache/hadoop/hbase/executor/package-summary.html">org.apache.hadoop.hbase.executor</a></dt>
 <dd>&nbsp;</dd>
+<dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/master/TestMasterRepairMode.html#testExistingCluster--">testExistingCluster()</a></span> - Method in class org.apache.hadoop.hbase.master.<a href="org/apache/hadoop/hbase/master/TestMasterRepairMode.html" title="class in org.apache.hadoop.hbase.master">TestMasterRepairMode</a></dt>
+<dd>&nbsp;</dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/rest/model/TestScannerModel.html#testExistingFilter--">testExistingFilter()</a></span> - Method in class org.apache.hadoop.hbase.rest.model.<a href="org/apache/hadoop/hbase/rest/model/TestScannerModel.html" title="class in org.apache.hadoop.hbase.rest.model">TestScannerModel</a></dt>
 <dd>&nbsp;</dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/mapreduce/TestJarFinder.html#testExistingManifest--">testExistingManifest()</a></span> - Method in class org.apache.hadoop.hbase.mapreduce.<a href="org/apache/hadoop/hbase/mapreduce/TestJarFinder.html" title="class in org.apache.hadoop.hbase.mapreduce">TestJarFinder</a></dt>
@@ -55257,6 +55275,10 @@
 </dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/quotas/TestMasterQuotasObserverWithMocks.html#TestMasterQuotasObserverWithMocks--">TestMasterQuotasObserverWithMocks()</a></span> - Constructor for class org.apache.hadoop.hbase.quotas.<a href="org/apache/hadoop/hbase/quotas/TestMasterQuotasObserverWithMocks.html" title="class in org.apache.hadoop.hbase.quotas">TestMasterQuotasObserverWithMocks</a></dt>
 <dd>&nbsp;</dd>
+<dt><a href="org/apache/hadoop/hbase/master/TestMasterRepairMode.html" title="class in org.apache.hadoop.hbase.master"><span class="typeNameLink">TestMasterRepairMode</span></a> - Class in <a href="org/apache/hadoop/hbase/master/package-summary.html">org.apache.hadoop.hbase.master</a></dt>
+<dd>&nbsp;</dd>
+<dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/master/TestMasterRepairMode.html#TestMasterRepairMode--">TestMasterRepairMode()</a></span> - Constructor for class org.apache.hadoop.hbase.master.<a href="org/apache/hadoop/hbase/master/TestMasterRepairMode.html" title="class in org.apache.hadoop.hbase.master">TestMasterRepairMode</a></dt>
+<dd>&nbsp;</dd>
 <dt><a href="org/apache/hadoop/hbase/replication/TestMasterReplication.html" title="class in org.apache.hadoop.hbase.replication"><span class="typeNameLink">TestMasterReplication</span></a> - Class in <a href="org/apache/hadoop/hbase/replication/package-summary.html">org.apache.hadoop.hbase.replication</a></dt>
 <dd>&nbsp;</dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/replication/TestMasterReplication.html#TestMasterReplication--">TestMasterReplication()</a></span> - Constructor for class org.apache.hadoop.hbase.replication.<a href="org/apache/hadoop/hbase/replication/TestMasterReplication.html" title="class in org.apache.hadoop.hbase.replication">TestMasterReplication</a></dt>
@@ -56977,6 +56999,8 @@
 </dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/io/hfile/TestChecksum.html#testNewBlocksHaveDefaultChecksum--">testNewBlocksHaveDefaultChecksum()</a></span> - Method in class org.apache.hadoop.hbase.io.hfile.<a href="org/apache/hadoop/hbase/io/hfile/TestChecksum.html" title="class in org.apache.hadoop.hbase.io.hfile">TestChecksum</a></dt>
 <dd>&nbsp;</dd>
+<dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/master/TestMasterRepairMode.html#testNewCluster--">testNewCluster()</a></span> - Method in class org.apache.hadoop.hbase.master.<a href="org/apache/hadoop/hbase/master/TestMasterRepairMode.html" title="class in org.apache.hadoop.hbase.master">TestMasterRepairMode</a></dt>
+<dd>&nbsp;</dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/replication/regionserver/TestWALEntryStream.html#testNewEntriesWhileStreaming--">testNewEntriesWhileStreaming()</a></span> - Method in class org.apache.hadoop.hbase.replication.regionserver.<a href="org/apache/hadoop/hbase/replication/regionserver/TestWALEntryStream.html" title="class in org.apache.hadoop.hbase.replication.regionserver">TestWALEntryStream</a></dt>
 <dd>
 <div class="block">Tests that if writes come in while we have a stream open, we shouldn't miss them</div>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/3649682c/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 3414f4c..c260c40 100644
--- a/testdevapidocs/org/apache/hadoop/hbase/TestZooKeeper.MockLoadBalancer.html
+++ b/testdevapidocs/org/apache/hadoop/hbase/TestZooKeeper.MockLoadBalancer.html
@@ -172,7 +172,7 @@ extends org.apache.hadoop.hbase.master.balancer.SimpleLoadBalancer</pre>
 <!--   -->
 </a>
 <h3>Fields inherited from class&nbsp;org.apache.hadoop.hbase.master.balancer.BaseLoadBalancer</h3>
-<code>clusterStatus, config, masterServerName, metricsBalancer, MIN_SERVER_BALANCE, onlySystemTablesOnMaster, overallSlop, rackManager, regionFinder, services, slop, tablesOnMaster, useRegionFinder</code></li>
+<code>clusterStatus, config, maintenanceMode, masterServerName, metricsBalancer, MIN_SERVER_BALANCE, onlySystemTablesOnMaster, overallSlop, rackManager, regionFinder, services, slop, useRegionFinder</code></li>
 </ul>
 <ul class="blockList">
 <li class="blockList"><a name="fields.inherited.from.class.org.apache.hadoop.hbase.master.LoadBalancer">
@@ -244,7 +244,7 @@ extends org.apache.hadoop.hbase.master.balancer.SimpleLoadBalancer</pre>
 <!--   -->
 </a>
 <h3>Methods inherited from interface&nbsp;org.apache.hadoop.hbase.master.LoadBalancer</h3>
-<code>isSystemTablesOnlyOnMaster, isTablesOnMaster</code></li>
+<code>isMasterCanHostUserRegions, isSystemTablesOnlyOnMaster, isTablesOnMaster</code></li>
 </ul>
 </li>
 </ul>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/3649682c/testdevapidocs/org/apache/hadoop/hbase/backup/package-tree.html
----------------------------------------------------------------------
diff --git a/testdevapidocs/org/apache/hadoop/hbase/backup/package-tree.html b/testdevapidocs/org/apache/hadoop/hbase/backup/package-tree.html
index 6af42fe..2d9b60f 100644
--- a/testdevapidocs/org/apache/hadoop/hbase/backup/package-tree.html
+++ b/testdevapidocs/org/apache/hadoop/hbase/backup/package-tree.html
@@ -146,8 +146,8 @@
 <ul>
 <li type="circle">java.lang.<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Enum.html?is-external=true" title="class or interface in java.lang"><span class="typeNameLink">Enum</span></a>&lt;E&gt; (implements java.lang.<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Comparable.html?is-external=true" title="class or interface in java.lang">Comparable</a>&lt;T&gt;, java.io.<a href="https://docs.oracle.com/javase/8/docs/api/java/io/Serializable.html?is-external=true" title="class or interface in java.io">Serializable</a>)
 <ul>
-<li type="circle">org.apache.hadoop.hbase.backup.<a href="../../../../../org/apache/hadoop/hbase/backup/TestIncrementalBackupMergeWithFailures.FailurePhase.html" title="enum in org.apache.hadoop.hbase.backup"><span class="typeNameLink">TestIncrementalBackupMergeWithFailures.FailurePhase</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.backup.<a href="../../../../../org/apache/hadoop/hbase/backup/TestBackupDeleteWithFailures.Failure.html" title="enum in org.apache.hadoop.hbase.backup"><span class="typeNameLink">TestBackupDeleteWithFailures.Failure</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.backup.<a href="../../../../../org/apache/hadoop/hbase/backup/TestIncrementalBackupMergeWithFailures.FailurePhase.html" title="enum in org.apache.hadoop.hbase.backup"><span class="typeNameLink">TestIncrementalBackupMergeWithFailures.FailurePhase</span></a></li>
 </ul>
 </li>
 </ul>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/3649682c/testdevapidocs/org/apache/hadoop/hbase/class-use/HBaseClassTestRule.html
----------------------------------------------------------------------
diff --git a/testdevapidocs/org/apache/hadoop/hbase/class-use/HBaseClassTestRule.html b/testdevapidocs/org/apache/hadoop/hbase/class-use/HBaseClassTestRule.html
index b256b4e..57f4692 100644
--- a/testdevapidocs/org/apache/hadoop/hbase/class-use/HBaseClassTestRule.html
+++ b/testdevapidocs/org/apache/hadoop/hbase/class-use/HBaseClassTestRule.html
@@ -3421,42 +3421,46 @@
 </tr>
 <tr class="rowColor">
 <td class="colFirst"><code>static <a href="../../../../../org/apache/hadoop/hbase/HBaseClassTestRule.html" title="class in org.apache.hadoop.hbase">HBaseClassTestRule</a></code></td>
-<td class="colLast"><span class="typeNameLabel">TestDLSAsyncFSWAL.</span><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/master/TestDLSAsyncFSWAL.html#CLASS_RULE">CLASS_RULE</a></span></code>&nbsp;</td>
+<td class="colLast"><span class="typeNameLabel">TestMasterRepairMode.</span><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/master/TestMasterRepairMode.html#CLASS_RULE">CLASS_RULE</a></span></code>&nbsp;</td>
 </tr>
 <tr class="altColor">
 <td class="colFirst"><code>static <a href="../../../../../org/apache/hadoop/hbase/HBaseClassTestRule.html" title="class in org.apache.hadoop.hbase">HBaseClassTestRule</a></code></td>
-<td class="colLast"><span class="typeNameLabel">TestServerCrashProcedureCarryingMetaStuck.</span><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/master/TestServerCrashProcedureCarryingMetaStuck.html#CLASS_RULE">CLASS_RULE</a></span></code>&nbsp;</td>
+<td class="colLast"><span class="typeNameLabel">TestDLSAsyncFSWAL.</span><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/master/TestDLSAsyncFSWAL.html#CLASS_RULE">CLASS_RULE</a></span></code>&nbsp;</td>
 </tr>
 <tr class="rowColor">
 <td class="colFirst"><code>static <a href="../../../../../org/apache/hadoop/hbase/HBaseClassTestRule.html" title="class in org.apache.hadoop.hbase">HBaseClassTestRule</a></code></td>
-<td class="colLast"><span class="typeNameLabel">TestMaster.</span><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/master/TestMaster.html#CLASS_RULE">CLASS_RULE</a></span></code>&nbsp;</td>
+<td class="colLast"><span class="typeNameLabel">TestServerCrashProcedureCarryingMetaStuck.</span><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/master/TestServerCrashProcedureCarryingMetaStuck.html#CLASS_RULE">CLASS_RULE</a></span></code>&nbsp;</td>
 </tr>
 <tr class="altColor">
 <td class="colFirst"><code>static <a href="../../../../../org/apache/hadoop/hbase/HBaseClassTestRule.html" title="class in org.apache.hadoop.hbase">HBaseClassTestRule</a></code></td>
-<td class="colLast"><span class="typeNameLabel">TestMasterOperationsForRegionReplicas.</span><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/master/TestMasterOperationsForRegionReplicas.html#CLASS_RULE">CLASS_RULE</a></span></code>&nbsp;</td>
+<td class="colLast"><span class="typeNameLabel">TestMaster.</span><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/master/TestMaster.html#CLASS_RULE">CLASS_RULE</a></span></code>&nbsp;</td>
 </tr>
 <tr class="rowColor">
 <td class="colFirst"><code>static <a href="../../../../../org/apache/hadoop/hbase/HBaseClassTestRule.html" title="class in org.apache.hadoop.hbase">HBaseClassTestRule</a></code></td>
-<td class="colLast"><span class="typeNameLabel">TestGetReplicationLoad.</span><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/master/TestGetReplicationLoad.html#CLASS_RULE">CLASS_RULE</a></span></code>&nbsp;</td>
+<td class="colLast"><span class="typeNameLabel">TestMasterOperationsForRegionReplicas.</span><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/master/TestMasterOperationsForRegionReplicas.html#CLASS_RULE">CLASS_RULE</a></span></code>&nbsp;</td>
 </tr>
 <tr class="altColor">
 <td class="colFirst"><code>static <a href="../../../../../org/apache/hadoop/hbase/HBaseClassTestRule.html" title="class in org.apache.hadoop.hbase">HBaseClassTestRule</a></code></td>
-<td class="colLast"><span class="typeNameLabel">TestMasterBalanceThrottling.</span><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/master/TestMasterBalanceThrottling.html#CLASS_RULE">CLASS_RULE</a></span></code>&nbsp;</td>
+<td class="colLast"><span class="typeNameLabel">TestGetReplicationLoad.</span><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/master/TestGetReplicationLoad.html#CLASS_RULE">CLASS_RULE</a></span></code>&nbsp;</td>
 </tr>
 <tr class="rowColor">
 <td class="colFirst"><code>static <a href="../../../../../org/apache/hadoop/hbase/HBaseClassTestRule.html" title="class in org.apache.hadoop.hbase">HBaseClassTestRule</a></code></td>
-<td class="colLast"><span class="typeNameLabel">TestMasterFileSystemWithWALDir.</span><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/master/TestMasterFileSystemWithWALDir.html#CLASS_RULE">CLASS_RULE</a></span></code>&nbsp;</td>
+<td class="colLast"><span class="typeNameLabel">TestMasterBalanceThrottling.</span><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/master/TestMasterBalanceThrottling.html#CLASS_RULE">CLASS_RULE</a></span></code>&nbsp;</td>
 </tr>
 <tr class="altColor">
 <td class="colFirst"><code>static <a href="../../../../../org/apache/hadoop/hbase/HBaseClassTestRule.html" title="class in org.apache.hadoop.hbase">HBaseClassTestRule</a></code></td>
-<td class="colLast"><span class="typeNameLabel">TestMetaAssignmentWithStopMaster.</span><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/master/TestMetaAssignmentWithStopMaster.html#CLASS_RULE">CLASS_RULE</a></span></code>&nbsp;</td>
+<td class="colLast"><span class="typeNameLabel">TestMasterFileSystemWithWALDir.</span><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/master/TestMasterFileSystemWithWALDir.html#CLASS_RULE">CLASS_RULE</a></span></code>&nbsp;</td>
 </tr>
 <tr class="rowColor">
 <td class="colFirst"><code>static <a href="../../../../../org/apache/hadoop/hbase/HBaseClassTestRule.html" title="class in org.apache.hadoop.hbase">HBaseClassTestRule</a></code></td>
-<td class="colLast"><span class="typeNameLabel">TestMirroringTableStateManager.</span><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/master/TestMirroringTableStateManager.html#CLASS_RULE">CLASS_RULE</a></span></code>&nbsp;</td>
+<td class="colLast"><span class="typeNameLabel">TestMetaAssignmentWithStopMaster.</span><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/master/TestMetaAssignmentWithStopMaster.html#CLASS_RULE">CLASS_RULE</a></span></code>&nbsp;</td>
 </tr>
 <tr class="altColor">
 <td class="colFirst"><code>static <a href="../../../../../org/apache/hadoop/hbase/HBaseClassTestRule.html" title="class in org.apache.hadoop.hbase">HBaseClassTestRule</a></code></td>
+<td class="colLast"><span class="typeNameLabel">TestMirroringTableStateManager.</span><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/master/TestMirroringTableStateManager.html#CLASS_RULE">CLASS_RULE</a></span></code>&nbsp;</td>
+</tr>
+<tr class="rowColor">
+<td class="colFirst"><code>static <a href="../../../../../org/apache/hadoop/hbase/HBaseClassTestRule.html" title="class in org.apache.hadoop.hbase">HBaseClassTestRule</a></code></td>
 <td class="colLast"><span class="typeNameLabel">TestMasterMetricsWrapper.</span><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/master/TestMasterMetricsWrapper.html#CLASS_RULE">CLASS_RULE</a></span></code>&nbsp;</td>
 </tr>
 </tbody>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/3649682c/testdevapidocs/org/apache/hadoop/hbase/class-use/HBaseTestingUtility.html
----------------------------------------------------------------------
diff --git a/testdevapidocs/org/apache/hadoop/hbase/class-use/HBaseTestingUtility.html b/testdevapidocs/org/apache/hadoop/hbase/class-use/HBaseTestingUtility.html
index 273b320..dfc8716 100644
--- a/testdevapidocs/org/apache/hadoop/hbase/class-use/HBaseTestingUtility.html
+++ b/testdevapidocs/org/apache/hadoop/hbase/class-use/HBaseTestingUtility.html
@@ -2085,93 +2085,97 @@
 </tr>
 <tr class="altColor">
 <td class="colFirst"><code>private static <a href="../../../../../org/apache/hadoop/hbase/HBaseTestingUtility.html" title="class in org.apache.hadoop.hbase">HBaseTestingUtility</a></code></td>
-<td class="colLast"><span class="typeNameLabel">TestMaster.</span><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/master/TestMaster.html#TEST_UTIL">TEST_UTIL</a></span></code>&nbsp;</td>
+<td class="colLast"><span class="typeNameLabel">TestMasterRepairMode.</span><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/master/TestMasterRepairMode.html#TEST_UTIL">TEST_UTIL</a></span></code>&nbsp;</td>
 </tr>
 <tr class="rowColor">
 <td class="colFirst"><code>private static <a href="../../../../../org/apache/hadoop/hbase/HBaseTestingUtility.html" title="class in org.apache.hadoop.hbase">HBaseTestingUtility</a></code></td>
-<td class="colLast"><span class="typeNameLabel">TestMasterOperationsForRegionReplicas.</span><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/master/TestMasterOperationsForRegionReplicas.html#TEST_UTIL">TEST_UTIL</a></span></code>&nbsp;</td>
+<td class="colLast"><span class="typeNameLabel">TestMaster.</span><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/master/TestMaster.html#TEST_UTIL">TEST_UTIL</a></span></code>&nbsp;</td>
 </tr>
 <tr class="altColor">
 <td class="colFirst"><code>private static <a href="../../../../../org/apache/hadoop/hbase/HBaseTestingUtility.html" title="class in org.apache.hadoop.hbase">HBaseTestingUtility</a></code></td>
-<td class="colLast"><span class="typeNameLabel">TestGetReplicationLoad.</span><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/master/TestGetReplicationLoad.html#TEST_UTIL">TEST_UTIL</a></span></code>&nbsp;</td>
+<td class="colLast"><span class="typeNameLabel">TestMasterOperationsForRegionReplicas.</span><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/master/TestMasterOperationsForRegionReplicas.html#TEST_UTIL">TEST_UTIL</a></span></code>&nbsp;</td>
 </tr>
 <tr class="rowColor">
 <td class="colFirst"><code>private static <a href="../../../../../org/apache/hadoop/hbase/HBaseTestingUtility.html" title="class in org.apache.hadoop.hbase">HBaseTestingUtility</a></code></td>
-<td class="colLast"><span class="typeNameLabel">TestMasterBalanceThrottling.</span><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/master/TestMasterBalanceThrottling.html#TEST_UTIL">TEST_UTIL</a></span></code>&nbsp;</td>
+<td class="colLast"><span class="typeNameLabel">TestGetReplicationLoad.</span><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/master/TestGetReplicationLoad.html#TEST_UTIL">TEST_UTIL</a></span></code>&nbsp;</td>
 </tr>
 <tr class="altColor">
+<td class="colFirst"><code>private static <a href="../../../../../org/apache/hadoop/hbase/HBaseTestingUtility.html" title="class in org.apache.hadoop.hbase">HBaseTestingUtility</a></code></td>
+<td class="colLast"><span class="typeNameLabel">TestMasterBalanceThrottling.</span><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/master/TestMasterBalanceThrottling.html#TEST_UTIL">TEST_UTIL</a></span></code>&nbsp;</td>
+</tr>
+<tr class="rowColor">
 <td class="colFirst"><code>private <a href="../../../../../org/apache/hadoop/hbase/HBaseTestingUtility.html" title="class in org.apache.hadoop.hbase">HBaseTestingUtility</a></code></td>
 <td class="colLast"><span class="typeNameLabel">TestMirroringTableStateManager.</span><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/master/TestMirroringTableStateManager.html#TEST_UTIL">TEST_UTIL</a></span></code>&nbsp;</td>
 </tr>
-<tr class="rowColor">
+<tr class="altColor">
 <td class="colFirst"><code>private static <a href="../../../../../org/apache/hadoop/hbase/HBaseTestingUtility.html" title="class in org.apache.hadoop.hbase">HBaseTestingUtility</a></code></td>
 <td class="colLast"><span class="typeNameLabel">TestMasterMetricsWrapper.</span><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/master/TestMasterMetricsWrapper.html#TEST_UTIL">TEST_UTIL</a></span></code>&nbsp;</td>
 </tr>
-<tr class="altColor">
+<tr class="rowColor">
 <td class="colFirst"><code>private static <a href="../../../../../org/apache/hadoop/hbase/HBaseTestingUtility.html" title="class in org.apache.hadoop.hbase">HBaseTestingUtility</a></code></td>
 <td class="colLast"><span class="typeNameLabel">TestHMasterCommandLine.</span><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/master/TestHMasterCommandLine.html#TESTING_UTIL">TESTING_UTIL</a></span></code>&nbsp;</td>
 </tr>
-<tr class="rowColor">
+<tr class="altColor">
 <td class="colFirst"><code>private <a href="../../../../../org/apache/hadoop/hbase/HBaseTestingUtility.html" title="class in org.apache.hadoop.hbase">HBaseTestingUtility</a></code></td>
 <td class="colLast"><span class="typeNameLabel">TestGetInfoPort.</span><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/master/TestGetInfoPort.html#testUtil">testUtil</a></span></code>&nbsp;</td>
 </tr>
-<tr class="altColor">
+<tr class="rowColor">
 <td class="colFirst"><code>private <a href="../../../../../org/apache/hadoop/hbase/HBaseTestingUtility.html" title="class in org.apache.hadoop.hbase">HBaseTestingUtility</a></code></td>
 <td class="colLast"><span class="typeNameLabel">TestHMasterRPCException.</span><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/master/TestHMasterRPCException.html#testUtil">testUtil</a></span></code>&nbsp;</td>
 </tr>
-<tr class="rowColor">
+<tr class="altColor">
 <td class="colFirst"><code>private <a href="../../../../../org/apache/hadoop/hbase/HBaseTestingUtility.html" title="class in org.apache.hadoop.hbase">HBaseTestingUtility</a></code></td>
 <td class="colLast"><span class="typeNameLabel">TestGetLastFlushedSequenceId.</span><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/master/TestGetLastFlushedSequenceId.html#testUtil">testUtil</a></span></code>&nbsp;</td>
 </tr>
-<tr class="altColor">
+<tr class="rowColor">
 <td class="colFirst"><code>private static <a href="../../../../../org/apache/hadoop/hbase/HBaseTestingUtility.html" title="class in org.apache.hadoop.hbase">HBaseTestingUtility</a></code></td>
 <td class="colLast"><span class="typeNameLabel">TestMasterNoCluster.</span><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/master/TestMasterNoCluster.html#TESTUTIL">TESTUTIL</a></span></code>&nbsp;</td>
 </tr>
-<tr class="rowColor">
+<tr class="altColor">
 <td class="colFirst"><code>private static <a href="../../../../../org/apache/hadoop/hbase/HBaseTestingUtility.html" title="class in org.apache.hadoop.hbase">HBaseTestingUtility</a></code></td>
 <td class="colLast"><span class="typeNameLabel">TestShutdownBackupMaster.</span><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/master/TestShutdownBackupMaster.html#UTIL">UTIL</a></span></code>&nbsp;</td>
 </tr>
-<tr class="altColor">
+<tr class="rowColor">
 <td class="colFirst"><code>private static <a href="../../../../../org/apache/hadoop/hbase/HBaseTestingUtility.html" title="class in org.apache.hadoop.hbase">HBaseTestingUtility</a></code></td>
 <td class="colLast"><span class="typeNameLabel">TestMasterFileSystem.</span><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/master/TestMasterFileSystem.html#UTIL">UTIL</a></span></code>&nbsp;</td>
 </tr>
-<tr class="rowColor">
+<tr class="altColor">
 <td class="colFirst"><code>private static <a href="../../../../../org/apache/hadoop/hbase/HBaseTestingUtility.html" title="class in org.apache.hadoop.hbase">HBaseTestingUtility</a></code></td>
 <td class="colLast"><span class="typeNameLabel">TestCloseAnOpeningRegion.</span><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/master/TestCloseAnOpeningRegion.html#UTIL">UTIL</a></span></code>&nbsp;</td>
 </tr>
-<tr class="altColor">
+<tr class="rowColor">
 <td class="colFirst"><code>private static <a href="../../../../../org/apache/hadoop/hbase/HBaseTestingUtility.html" title="class in org.apache.hadoop.hbase">HBaseTestingUtility</a></code></td>
 <td class="colLast"><span class="typeNameLabel">TestServerCrashProcedureStuck.</span><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/master/TestServerCrashProcedureStuck.html#UTIL">UTIL</a></span></code>&nbsp;</td>
 </tr>
-<tr class="rowColor">
+<tr class="altColor">
 <td class="colFirst"><code>private static <a href="../../../../../org/apache/hadoop/hbase/HBaseTestingUtility.html" title="class in org.apache.hadoop.hbase">HBaseTestingUtility</a></code></td>
 <td class="colLast"><span class="typeNameLabel">TestShutdownWithNoRegionServer.</span><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/master/TestShutdownWithNoRegionServer.html#UTIL">UTIL</a></span></code>&nbsp;</td>
 </tr>
-<tr class="altColor">
+<tr class="rowColor">
 <td class="colFirst"><code>private <a href="../../../../../org/apache/hadoop/hbase/HBaseTestingUtility.html" title="class in org.apache.hadoop.hbase">HBaseTestingUtility</a></code></td>
 <td class="colLast"><span class="typeNameLabel">TestRestartCluster.</span><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/master/TestRestartCluster.html#UTIL">UTIL</a></span></code>&nbsp;</td>
 </tr>
-<tr class="rowColor">
+<tr class="altColor">
 <td class="colFirst"><code>protected static <a href="../../../../../org/apache/hadoop/hbase/HBaseTestingUtility.html" title="class in org.apache.hadoop.hbase">HBaseTestingUtility</a></code></td>
 <td class="colLast"><span class="typeNameLabel">TestMergeTableRegionsWhileRSCrash.</span><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/master/TestMergeTableRegionsWhileRSCrash.html#UTIL">UTIL</a></span></code>&nbsp;</td>
 </tr>
-<tr class="altColor">
+<tr class="rowColor">
 <td class="colFirst"><code>protected static <a href="../../../../../org/apache/hadoop/hbase/HBaseTestingUtility.html" title="class in org.apache.hadoop.hbase">HBaseTestingUtility</a></code></td>
 <td class="colLast"><span class="typeNameLabel">TestSplitRegionWhileRSCrash.</span><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/master/TestSplitRegionWhileRSCrash.html#UTIL">UTIL</a></span></code>&nbsp;</td>
 </tr>
-<tr class="rowColor">
+<tr class="altColor">
 <td class="colFirst"><code>private static <a href="../../../../../org/apache/hadoop/hbase/HBaseTestingUtility.html" title="class in org.apache.hadoop.hbase">HBaseTestingUtility</a></code></td>
 <td class="colLast"><span class="typeNameLabel">TestMasterAbortAndRSGotKilled.</span><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/master/TestMasterAbortAndRSGotKilled.html#UTIL">UTIL</a></span></code>&nbsp;</td>
 </tr>
-<tr class="altColor">
+<tr class="rowColor">
 <td class="colFirst"><code>private static <a href="../../../../../org/apache/hadoop/hbase/HBaseTestingUtility.html" title="class in org.apache.hadoop.hbase">HBaseTestingUtility</a></code></td>
 <td class="colLast"><span class="typeNameLabel">TestServerCrashProcedureCarryingMetaStuck.</span><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/master/TestServerCrashProcedureCarryingMetaStuck.html#UTIL">UTIL</a></span></code>&nbsp;</td>
 </tr>
-<tr class="rowColor">
+<tr class="altColor">
 <td class="colFirst"><code>private static <a href="../../../../../org/apache/hadoop/hbase/HBaseTestingUtility.html" title="class in org.apache.hadoop.hbase">HBaseTestingUtility</a></code></td>
 <td class="colLast"><span class="typeNameLabel">TestMasterFileSystemWithWALDir.</span><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/master/TestMasterFileSystemWithWALDir.html#UTIL">UTIL</a></span></code>&nbsp;</td>
 </tr>
-<tr class="altColor">
+<tr class="rowColor">
 <td class="colFirst"><code>private static <a href="../../../../../org/apache/hadoop/hbase/HBaseTestingUtility.html" title="class in org.apache.hadoop.hbase">HBaseTestingUtility</a></code></td>
 <td class="colLast"><span class="typeNameLabel">TestMetaAssignmentWithStopMaster.</span><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/master/TestMetaAssignmentWithStopMaster.html#UTIL">UTIL</a></span></code>&nbsp;</td>
 </tr>

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

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/3649682c/testdevapidocs/org/apache/hadoop/hbase/master/TestCloseAnOpeningRegion.MockHMaster.html
----------------------------------------------------------------------
diff --git a/testdevapidocs/org/apache/hadoop/hbase/master/TestCloseAnOpeningRegion.MockHMaster.html b/testdevapidocs/org/apache/hadoop/hbase/master/TestCloseAnOpeningRegion.MockHMaster.html
index 73532a4..f50fa6e 100644
--- a/testdevapidocs/org/apache/hadoop/hbase/master/TestCloseAnOpeningRegion.MockHMaster.html
+++ b/testdevapidocs/org/apache/hadoop/hbase/master/TestCloseAnOpeningRegion.MockHMaster.html
@@ -180,7 +180,7 @@ extends org.apache.hadoop.hbase.master.HMaster</pre>
 <!--   -->
 </a>
 <h3>Fields inherited from class&nbsp;org.apache.hadoop.hbase.master.HMaster</h3>
-<code>catalogJanitorChore, coprocessorServiceHandlers, cpHost, DEFAULT_HBASE_MASTER_WAIT_ON_SERVICE_IN_SECONDS, HBASE_MASTER_WAIT_ON_SERVICE_IN_SECONDS, loadBalancerTracker, MASTER, masterAddressSyncer, metaLocationSyncer, metricsMaster, rsFatals, serviceStarted, snapshotManager</code></li>
+<code>catalogJanitorChore, coprocessorServiceHandlers, cpHost, DEFAULT_HBASE_MASTER_WAIT_ON_SERVICE_IN_SECONDS, HBASE_MASTER_WAIT_ON_SERVICE_IN_SECONDS, loadBalancerTracker, MAINTENANCE_MODE, MASTER, masterAddressSyncer, metaLocationSyncer, metricsMaster, rsFatals, serviceStarted, snapshotManager</code></li>
 </ul>
 <ul class="blockList">
 <li class="blockList"><a name="fields.inherited.from.class.org.apache.hadoop.hbase.regionserver.HRegionServer">

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/3649682c/testdevapidocs/org/apache/hadoop/hbase/master/TestGetReplicationLoad.MyMaster.html
----------------------------------------------------------------------
diff --git a/testdevapidocs/org/apache/hadoop/hbase/master/TestGetReplicationLoad.MyMaster.html b/testdevapidocs/org/apache/hadoop/hbase/master/TestGetReplicationLoad.MyMaster.html
index 8f30096..6bf2d66 100644
--- a/testdevapidocs/org/apache/hadoop/hbase/master/TestGetReplicationLoad.MyMaster.html
+++ b/testdevapidocs/org/apache/hadoop/hbase/master/TestGetReplicationLoad.MyMaster.html
@@ -180,7 +180,7 @@ extends org.apache.hadoop.hbase.master.HMaster</pre>
 <!--   -->
 </a>
 <h3>Fields inherited from class&nbsp;org.apache.hadoop.hbase.master.HMaster</h3>
-<code>catalogJanitorChore, coprocessorServiceHandlers, cpHost, DEFAULT_HBASE_MASTER_WAIT_ON_SERVICE_IN_SECONDS, HBASE_MASTER_WAIT_ON_SERVICE_IN_SECONDS, loadBalancerTracker, MASTER, masterAddressSyncer, metaLocationSyncer, metricsMaster, rsFatals, serviceStarted, snapshotManager</code></li>
+<code>catalogJanitorChore, coprocessorServiceHandlers, cpHost, DEFAULT_HBASE_MASTER_WAIT_ON_SERVICE_IN_SECONDS, HBASE_MASTER_WAIT_ON_SERVICE_IN_SECONDS, loadBalancerTracker, MAINTENANCE_MODE, MASTER, masterAddressSyncer, metaLocationSyncer, metricsMaster, rsFatals, serviceStarted, snapshotManager</code></li>
 </ul>
 <ul class="blockList">
 <li class="blockList"><a name="fields.inherited.from.class.org.apache.hadoop.hbase.regionserver.HRegionServer">

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/3649682c/testdevapidocs/org/apache/hadoop/hbase/master/TestMaster.html
----------------------------------------------------------------------
diff --git a/testdevapidocs/org/apache/hadoop/hbase/master/TestMaster.html b/testdevapidocs/org/apache/hadoop/hbase/master/TestMaster.html
index 04d6e9b..0108817 100644
--- a/testdevapidocs/org/apache/hadoop/hbase/master/TestMaster.html
+++ b/testdevapidocs/org/apache/hadoop/hbase/master/TestMaster.html
@@ -289,7 +289,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>FAMILYNAME</h4>
-<pre>private static final&nbsp;byte[] <a href="../../../../../src-html/org/apache/hadoop/hbase/master/TestMaster.html#line.79">FAMILYNAME</a></pre>
+<pre>private static final&nbsp;byte[] <a href="../../../../../src-html/org/apache/hadoop/hbase/master/TestMaster.html#line.78">FAMILYNAME</a></pre>
 </li>
 </ul>
 <a name="admin">
@@ -298,7 +298,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>admin</h4>
-<pre>private static&nbsp;org.apache.hadoop.hbase.client.Admin <a href="../../../../../src-html/org/apache/hadoop/hbase/master/TestMaster.html#line.80">admin</a></pre>
+<pre>private static&nbsp;org.apache.hadoop.hbase.client.Admin <a href="../../../../../src-html/org/apache/hadoop/hbase/master/TestMaster.html#line.79">admin</a></pre>
 </li>
 </ul>
 <a name="name">
@@ -307,7 +307,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockListLast">
 <li class="blockList">
 <h4>name</h4>
-<pre>public&nbsp;org.junit.rules.TestName <a href="../../../../../src-html/org/apache/hadoop/hbase/master/TestMaster.html#line.83">name</a></pre>
+<pre>public&nbsp;org.junit.rules.TestName <a href="../../../../../src-html/org/apache/hadoop/hbase/master/TestMaster.html#line.82">name</a></pre>
 </li>
 </ul>
 </li>
@@ -341,7 +341,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>beforeAllTests</h4>
-<pre>public static&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/master/TestMaster.html#line.86">beforeAllTests</a>()
+<pre>public static&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/master/TestMaster.html#line.85">beforeAllTests</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>
@@ -355,7 +355,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>afterAllTests</h4>
-<pre>public static&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/master/TestMaster.html#line.95">afterAllTests</a>()
+<pre>public static&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/master/TestMaster.html#line.94">afterAllTests</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>
@@ -369,7 +369,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>testMasterOpsWhileSplitting</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/master/TestMaster.html#line.101">testMasterOpsWhileSplitting</a>()
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/master/TestMaster.html#line.100">testMasterOpsWhileSplitting</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>
@@ -383,7 +383,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>testMoveRegionWhenNotInitialized</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/master/TestMaster.html#line.143">testMoveRegionWhenNotInitialized</a>()</pre>
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/master/TestMaster.html#line.142">testMoveRegionWhenNotInitialized</a>()</pre>
 </li>
 </ul>
 <a name="testMoveThrowsUnknownRegionException--">
@@ -392,7 +392,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>testMoveThrowsUnknownRegionException</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/master/TestMaster.html#line.159">testMoveThrowsUnknownRegionException</a>()
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/master/TestMaster.html#line.158">testMoveThrowsUnknownRegionException</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>
@@ -406,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>testMoveThrowsPleaseHoldException</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/master/TestMaster.html#line.181">testMoveThrowsPleaseHoldException</a>()
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/master/TestMaster.html#line.180">testMoveThrowsPleaseHoldException</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>
@@ -420,7 +420,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>testFlushedSequenceIdPersistLoad</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/master/TestMaster.html#line.204">testFlushedSequenceIdPersistLoad</a>()
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/master/TestMaster.html#line.203">testFlushedSequenceIdPersistLoad</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>
@@ -434,7 +434,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>testBlockingHbkc1WithLockFile</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/master/TestMaster.html#line.232">testBlockingHbkc1WithLockFile</a>()
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/master/TestMaster.html#line.231">testBlockingHbkc1WithLockFile</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>
@@ -448,7 +448,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockListLast">
 <li class="blockList">
 <h4>testMasterBlockCache</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/master/TestMaster.html#line.269">testMasterBlockCache</a>()</pre>
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/master/TestMaster.html#line.268">testMasterBlockCache</a>()</pre>
 </li>
 </ul>
 </li>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/3649682c/testdevapidocs/org/apache/hadoop/hbase/master/TestMasterMetrics.MyMaster.html
----------------------------------------------------------------------
diff --git a/testdevapidocs/org/apache/hadoop/hbase/master/TestMasterMetrics.MyMaster.html b/testdevapidocs/org/apache/hadoop/hbase/master/TestMasterMetrics.MyMaster.html
index bde6568..3723df5 100644
--- a/testdevapidocs/org/apache/hadoop/hbase/master/TestMasterMetrics.MyMaster.html
+++ b/testdevapidocs/org/apache/hadoop/hbase/master/TestMasterMetrics.MyMaster.html
@@ -180,7 +180,7 @@ extends org.apache.hadoop.hbase.master.HMaster</pre>
 <!--   -->
 </a>
 <h3>Fields inherited from class&nbsp;org.apache.hadoop.hbase.master.HMaster</h3>
-<code>catalogJanitorChore, coprocessorServiceHandlers, cpHost, DEFAULT_HBASE_MASTER_WAIT_ON_SERVICE_IN_SECONDS, HBASE_MASTER_WAIT_ON_SERVICE_IN_SECONDS, loadBalancerTracker, MASTER, masterAddressSyncer, metaLocationSyncer, metricsMaster, rsFatals, serviceStarted, snapshotManager</code></li>
+<code>catalogJanitorChore, coprocessorServiceHandlers, cpHost, DEFAULT_HBASE_MASTER_WAIT_ON_SERVICE_IN_SECONDS, HBASE_MASTER_WAIT_ON_SERVICE_IN_SECONDS, loadBalancerTracker, MAINTENANCE_MODE, MASTER, masterAddressSyncer, metaLocationSyncer, metricsMaster, rsFatals, serviceStarted, snapshotManager</code></li>
 </ul>
 <ul class="blockList">
 <li class="blockList"><a name="fields.inherited.from.class.org.apache.hadoop.hbase.regionserver.HRegionServer">

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/3649682c/testdevapidocs/org/apache/hadoop/hbase/master/TestMasterQosFunction.html
----------------------------------------------------------------------
diff --git a/testdevapidocs/org/apache/hadoop/hbase/master/TestMasterQosFunction.html b/testdevapidocs/org/apache/hadoop/hbase/master/TestMasterQosFunction.html
index f7d2dae..eaa180f 100644
--- a/testdevapidocs/org/apache/hadoop/hbase/master/TestMasterQosFunction.html
+++ b/testdevapidocs/org/apache/hadoop/hbase/master/TestMasterQosFunction.html
@@ -50,7 +50,7 @@ var activeTableTab = "activeTableTab";
 <div class="subNav">
 <ul class="navList">
 <li><a href="../../../../../org/apache/hadoop/hbase/master/TestMasterOperationsForRegionReplicas.html" title="class in org.apache.hadoop.hbase.master"><span class="typeNameLink">Prev&nbsp;Class</span></a></li>
-<li><a href="../../../../../org/apache/hadoop/hbase/master/TestMasterRestartAfterDisablingTable.html" title="class in org.apache.hadoop.hbase.master"><span class="typeNameLink">Next&nbsp;Class</span></a></li>
+<li><a href="../../../../../org/apache/hadoop/hbase/master/TestMasterRepairMode.html" title="class in org.apache.hadoop.hbase.master"><span class="typeNameLink">Next&nbsp;Class</span></a></li>
 </ul>
 <ul class="navList">
 <li><a href="../../../../../index.html?org/apache/hadoop/hbase/master/TestMasterQosFunction.html" target="_top">Frames</a></li>
@@ -345,7 +345,7 @@ extends <a href="../../../../../org/apache/hadoop/hbase/QosTestHelper.html" titl
 <div class="subNav">
 <ul class="navList">
 <li><a href="../../../../../org/apache/hadoop/hbase/master/TestMasterOperationsForRegionReplicas.html" title="class in org.apache.hadoop.hbase.master"><span class="typeNameLink">Prev&nbsp;Class</span></a></li>
-<li><a href="../../../../../org/apache/hadoop/hbase/master/TestMasterRestartAfterDisablingTable.html" title="class in org.apache.hadoop.hbase.master"><span class="typeNameLink">Next&nbsp;Class</span></a></li>
+<li><a href="../../../../../org/apache/hadoop/hbase/master/TestMasterRepairMode.html" title="class in org.apache.hadoop.hbase.master"><span class="typeNameLink">Next&nbsp;Class</span></a></li>
 </ul>
 <ul class="navList">
 <li><a href="../../../../../index.html?org/apache/hadoop/hbase/master/TestMasterQosFunction.html" target="_top">Frames</a></li>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/3649682c/testdevapidocs/org/apache/hadoop/hbase/master/TestMasterRepairMode.html
----------------------------------------------------------------------
diff --git a/testdevapidocs/org/apache/hadoop/hbase/master/TestMasterRepairMode.html b/testdevapidocs/org/apache/hadoop/hbase/master/TestMasterRepairMode.html
new file mode 100644
index 0000000..48a5684
--- /dev/null
+++ b/testdevapidocs/org/apache/hadoop/hbase/master/TestMasterRepairMode.html
@@ -0,0 +1,432 @@
+<!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>TestMasterRepairMode (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="TestMasterRepairMode (Apache HBase 3.0.0-SNAPSHOT Test API)";
+        }
+    }
+    catch(err) {
+    }
+//-->
+var methods = {"i0":10,"i1":10,"i2":10,"i3":10,"i4":10};
+var tabs = {65535:["t0","All Methods"],2:["t2","Instance Methods"],8:["t4","Concrete Methods"]};
+var altColor = "altColor";
+var rowColor = "rowColor";
+var tableTab = "tableTab";
+var activeTableTab = "activeTableTab";
+</script>
+<noscript>
+<div>JavaScript is disabled on your browser.</div>
+</noscript>
+<!-- ========= START OF TOP NAVBAR ======= -->
+<div class="topNav"><a name="navbar.top">
+<!--   -->
+</a>
+<div class="skipNav"><a href="#skip.navbar.top" title="Skip navigation links">Skip navigation links</a></div>
+<a name="navbar.top.firstrow">
+<!--   -->
+</a>
+<ul class="navList" title="Navigation">
+<li><a href="../../../../../overview-summary.html">Overview</a></li>
+<li><a href="package-summary.html">Package</a></li>
+<li class="navBarCell1Rev">Class</li>
+<li><a href="class-use/TestMasterRepairMode.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/TestMasterQosFunction.html" title="class in org.apache.hadoop.hbase.master"><span class="typeNameLink">Prev&nbsp;Class</span></a></li>
+<li><a href="../../../../../org/apache/hadoop/hbase/master/TestMasterRestartAfterDisablingTable.html" title="class in org.apache.hadoop.hbase.master"><span class="typeNameLink">Next&nbsp;Class</span></a></li>
+</ul>
+<ul class="navList">
+<li><a href="../../../../../index.html?org/apache/hadoop/hbase/master/TestMasterRepairMode.html" target="_top">Frames</a></li>
+<li><a href="TestMasterRepairMode.html" target="_top">No&nbsp;Frames</a></li>
+</ul>
+<ul class="navList" id="allclasses_navbar_top">
+<li><a href="../../../../../allclasses-noframe.html">All&nbsp;Classes</a></li>
+</ul>
+<div>
+<script type="text/javascript"><!--
+  allClassesLink = document.getElementById("allclasses_navbar_top");
+  if(window==top) {
+    allClassesLink.style.display = "block";
+  }
+  else {
+    allClassesLink.style.display = "none";
+  }
+  //-->
+</script>
+</div>
+<div>
+<ul class="subNavList">
+<li>Summary:&nbsp;</li>
+<li>Nested&nbsp;|&nbsp;</li>
+<li><a href="#field.summary">Field</a>&nbsp;|&nbsp;</li>
+<li><a href="#constructor.summary">Constr</a>&nbsp;|&nbsp;</li>
+<li><a href="#method.summary">Method</a></li>
+</ul>
+<ul class="subNavList">
+<li>Detail:&nbsp;</li>
+<li><a href="#field.detail">Field</a>&nbsp;|&nbsp;</li>
+<li><a href="#constructor.detail">Constr</a>&nbsp;|&nbsp;</li>
+<li><a href="#method.detail">Method</a></li>
+</ul>
+</div>
+<a name="skip.navbar.top">
+<!--   -->
+</a></div>
+<!-- ========= END OF TOP NAVBAR ========= -->
+<!-- ======== START OF CLASS DATA ======== -->
+<div class="header">
+<div class="subTitle">org.apache.hadoop.hbase.master</div>
+<h2 title="Class TestMasterRepairMode" class="title">Class TestMasterRepairMode</h2>
+</div>
+<div class="contentContainer">
+<ul class="inheritance">
+<li><a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html?is-external=true" title="class or interface in java.lang">java.lang.Object</a></li>
+<li>
+<ul class="inheritance">
+<li>org.apache.hadoop.hbase.master.TestMasterRepairMode</li>
+</ul>
+</li>
+</ul>
+<div class="description">
+<ul class="blockList">
+<li class="blockList">
+<hr>
+<br>
+<pre>public class <a href="../../../../../src-html/org/apache/hadoop/hbase/master/TestMasterRepairMode.html#line.56">TestMasterRepairMode</a>
+extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html?is-external=true" title="class or interface in java.lang">Object</a></pre>
+</li>
+</ul>
+</div>
+<div class="summary">
+<ul class="blockList">
+<li class="blockList">
+<!-- =========== FIELD SUMMARY =========== -->
+<ul class="blockList">
+<li class="blockList"><a name="field.summary">
+<!--   -->
+</a>
+<h3>Field Summary</h3>
+<table class="memberSummary" border="0" cellpadding="3" cellspacing="0" summary="Field Summary table, listing fields, and an explanation">
+<caption><span>Fields</span><span class="tabEnd">&nbsp;</span></caption>
+<tr>
+<th class="colFirst" scope="col">Modifier and Type</th>
+<th class="colLast" scope="col">Field and Description</th>
+</tr>
+<tr class="altColor">
+<td class="colFirst"><code>static <a href="../../../../../org/apache/hadoop/hbase/HBaseClassTestRule.html" title="class in org.apache.hadoop.hbase">HBaseClassTestRule</a></code></td>
+<td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/master/TestMasterRepairMode.html#CLASS_RULE">CLASS_RULE</a></span></code>&nbsp;</td>
+</tr>
+<tr class="rowColor">
+<td class="colFirst"><code>private static byte[]</code></td>
+<td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/master/TestMasterRepairMode.html#FAMILYNAME">FAMILYNAME</a></span></code>&nbsp;</td>
+</tr>
+<tr class="altColor">
+<td class="colFirst"><code>private static org.slf4j.Logger</code></td>
+<td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/master/TestMasterRepairMode.html#LOG">LOG</a></span></code>&nbsp;</td>
+</tr>
+<tr class="rowColor">
+<td class="colFirst"><code>org.junit.rules.TestName</code></td>
+<td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/master/TestMasterRepairMode.html#name">name</a></span></code>&nbsp;</td>
+</tr>
+<tr class="altColor">
+<td class="colFirst"><code>private static <a href="../../../../../org/apache/hadoop/hbase/HBaseTestingUtility.html" title="class in org.apache.hadoop.hbase">HBaseTestingUtility</a></code></td>
+<td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/master/TestMasterRepairMode.html#TEST_UTIL">TEST_UTIL</a></span></code>&nbsp;</td>
+</tr>
+</table>
+</li>
+</ul>
+<!-- ======== CONSTRUCTOR SUMMARY ======== -->
+<ul class="blockList">
+<li class="blockList"><a name="constructor.summary">
+<!--   -->
+</a>
+<h3>Constructor Summary</h3>
+<table class="memberSummary" border="0" cellpadding="3" cellspacing="0" summary="Constructor Summary table, listing constructors, and an explanation">
+<caption><span>Constructors</span><span class="tabEnd">&nbsp;</span></caption>
+<tr>
+<th class="colOne" scope="col">Constructor and Description</th>
+</tr>
+<tr class="altColor">
+<td class="colOne"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/master/TestMasterRepairMode.html#TestMasterRepairMode--">TestMasterRepairMode</a></span>()</code>&nbsp;</td>
+</tr>
+</table>
+</li>
+</ul>
+<!-- ========== METHOD SUMMARY =========== -->
+<ul class="blockList">
+<li class="blockList"><a name="method.summary">
+<!--   -->
+</a>
+<h3>Method Summary</h3>
+<table class="memberSummary" border="0" cellpadding="3" cellspacing="0" summary="Method Summary table, listing methods, and an explanation">
+<caption><span id="t0" class="activeTableTab"><span>All Methods</span><span class="tabEnd">&nbsp;</span></span><span id="t2" class="tableTab"><span><a href="javascript:show(2);">Instance Methods</a></span><span class="tabEnd">&nbsp;</span></span><span id="t4" class="tableTab"><span><a href="javascript:show(8);">Concrete Methods</a></span><span class="tabEnd">&nbsp;</span></span></caption>
+<tr>
+<th class="colFirst" scope="col">Modifier and Type</th>
+<th class="colLast" scope="col">Method and Description</th>
+</tr>
+<tr id="i0" class="altColor">
+<td class="colFirst"><code>private void</code></td>
+<td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/master/TestMasterRepairMode.html#enableMaintenanceMode--">enableMaintenanceMode</a></span>()</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/TestMasterRepairMode.html#setUp--">setUp</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/TestMasterRepairMode.html#tearDown--">tearDown</a></span>()</code>&nbsp;</td>
+</tr>
+<tr id="i3" class="rowColor">
+<td class="colFirst"><code>void</code></td>
+<td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/master/TestMasterRepairMode.html#testExistingCluster--">testExistingCluster</a></span>()</code>&nbsp;</td>
+</tr>
+<tr id="i4" class="altColor">
+<td class="colFirst"><code>void</code></td>
+<td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/master/TestMasterRepairMode.html#testNewCluster--">testNewCluster</a></span>()</code>&nbsp;</td>
+</tr>
+</table>
+<ul class="blockList">
+<li class="blockList"><a name="methods.inherited.from.class.java.lang.Object">
+<!--   -->
+</a>
+<h3>Methods inherited from class&nbsp;java.lang.<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html?is-external=true" title="class or interface in java.lang">Object</a></h3>
+<code><a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html?is-external=true#clone--" title="class or interface in java.lang">clone</a>, <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html?is-external=true#equals-java.lang.Object-" title="class or interface in java.lang">equals</a>, <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html?is-external=true#finalize--" title="class or interface in java.lang">finalize</a>, <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html?is-external=true#getClass--" title="class or interface in java.lang">getClass</a>, <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html?is-external=true#hashCode--" title="class or interface in java.lang">hashCode</a>, <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html?is-external=true#notify--" title="class or interface in java.lang">notify</a>, <a href="https://docs.oracle.com/javase/8/docs/api/ja
 va/lang/Object.html?is-external=true#notifyAll--" title="class or interface in java.lang">notifyAll</a>, <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html?is-external=true#toString--" title="class or interface in java.lang">toString</a>, <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html?is-external=true#wait--" title="class or interface in java.lang">wait</a>, <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html?is-external=true#wait-long-" title="class or interface in java.lang">wait</a>, <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html?is-external=true#wait-long-int-" title="class or interface in java.lang">wait</a></code></li>
+</ul>
+</li>
+</ul>
+</li>
+</ul>
+</div>
+<div class="details">
+<ul class="blockList">
+<li class="blockList">
+<!-- ============ FIELD DETAIL =========== -->
+<ul class="blockList">
+<li class="blockList"><a name="field.detail">
+<!--   -->
+</a>
+<h3>Field Detail</h3>
+<a name="CLASS_RULE">
+<!--   -->
+</a>
+<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/TestMasterRepairMode.html#line.59">CLASS_RULE</a></pre>
+</li>
+</ul>
+<a name="name">
+<!--   -->
+</a>
+<ul class="blockList">
+<li class="blockList">
+<h4>name</h4>
+<pre>public&nbsp;org.junit.rules.TestName <a href="../../../../../src-html/org/apache/hadoop/hbase/master/TestMasterRepairMode.html#line.63">name</a></pre>
+</li>
+</ul>
+<a name="LOG">
+<!--   -->
+</a>
+<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/TestMasterRepairMode.html#line.65">LOG</a></pre>
+</li>
+</ul>
+<a name="FAMILYNAME">
+<!--   -->
+</a>
+<ul class="blockList">
+<li class="blockList">
+<h4>FAMILYNAME</h4>
+<pre>private static final&nbsp;byte[] <a href="../../../../../src-html/org/apache/hadoop/hbase/master/TestMasterRepairMode.html#line.67">FAMILYNAME</a></pre>
+</li>
+</ul>
+<a name="TEST_UTIL">
+<!--   -->
+</a>
+<ul class="blockListLast">
+<li class="blockList">
+<h4>TEST_UTIL</h4>
+<pre>private static&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/master/TestMasterRepairMode.html#line.69">TEST_UTIL</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="TestMasterRepairMode--">
+<!--   -->
+</a>
+<ul class="blockListLast">
+<li class="blockList">
+<h4>TestMasterRepairMode</h4>
+<pre>public&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/master/TestMasterRepairMode.html#line.56">TestMasterRepairMode</a>()</pre>
+</li>
+</ul>
+</li>
+</ul>
+<!-- ============ METHOD DETAIL ========== -->
+<ul class="blockList">
+<li class="blockList"><a name="method.detail">
+<!--   -->
+</a>
+<h3>Method Detail</h3>
+<a name="setUp--">
+<!--   -->
+</a>
+<ul class="blockList">
+<li class="blockList">
+<h4>setUp</h4>
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/master/TestMasterRepairMode.html#line.72">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>
+<dd><code><a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Exception.html?is-external=true" title="class or interface in java.lang">Exception</a></code></dd>
+</dl>
+</li>
+</ul>
+<a name="tearDown--">
+<!--   -->
+</a>
+<ul class="blockList">
+<li class="blockList">
+<h4>tearDown</h4>
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/master/TestMasterRepairMode.html#line.77">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>
+<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="enableMaintenanceMode--">
+<!--   -->
+</a>
+<ul class="blockList">
+<li class="blockList">
+<h4>enableMaintenanceMode</h4>
+<pre>private&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/master/TestMasterRepairMode.html#line.81">enableMaintenanceMode</a>()</pre>
+</li>
+</ul>
+<a name="testNewCluster--">
+<!--   -->
+</a>
+<ul class="blockList">
+<li class="blockList">
+<h4>testNewCluster</h4>
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/master/TestMasterRepairMode.html#line.88">testNewCluster</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="testExistingCluster--">
+<!--   -->
+</a>
+<ul class="blockListLast">
+<li class="blockList">
+<h4>testExistingCluster</h4>
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/master/TestMasterRepairMode.html#line.106">testExistingCluster</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>
+</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/TestMasterRepairMode.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/TestMasterQosFunction.html" title="class in org.apache.hadoop.hbase.master"><span class="typeNameLink">Prev&nbsp;Class</span></a></li>
+<li><a href="../../../../../org/apache/hadoop/hbase/master/TestMasterRestartAfterDisablingTable.html" title="class in org.apache.hadoop.hbase.master"><span class="typeNameLink">Next&nbsp;Class</span></a></li>
+</ul>
+<ul class="navList">
+<li><a href="../../../../../index.html?org/apache/hadoop/hbase/master/TestMasterRepairMode.html" target="_top">Frames</a></li>
+<li><a href="TestMasterRepairMode.html" target="_top">No&nbsp;Frames</a></li>
+</ul>
+<ul class="navList" id="allclasses_navbar_bottom">
+<li><a href="../../../../../allclasses-noframe.html">All&nbsp;Classes</a></li>
+</ul>
+<div>
+<script type="text/javascript"><!--
+  allClassesLink = document.getElementById("allclasses_navbar_bottom");
+  if(window==top) {
+    allClassesLink.style.display = "block";
+  }
+  else {
+    allClassesLink.style.display = "none";
+  }
+  //-->
+</script>
+</div>
+<div>
+<ul class="subNavList">
+<li>Summary:&nbsp;</li>
+<li>Nested&nbsp;|&nbsp;</li>
+<li><a href="#field.summary">Field</a>&nbsp;|&nbsp;</li>
+<li><a href="#constructor.summary">Constr</a>&nbsp;|&nbsp;</li>
+<li><a href="#method.summary">Method</a></li>
+</ul>
+<ul class="subNavList">
+<li>Detail:&nbsp;</li>
+<li><a href="#field.detail">Field</a>&nbsp;|&nbsp;</li>
+<li><a href="#constructor.detail">Constr</a>&nbsp;|&nbsp;</li>
+<li><a href="#method.detail">Method</a></li>
+</ul>
+</div>
+<a name="skip.navbar.bottom">
+<!--   -->
+</a></div>
+<!-- ======== END OF BOTTOM NAVBAR ======= -->
+<p class="legalCopy"><small>Copyright &#169; 2007&#x2013;2018 <a href="https://www.apache.org/">The Apache Software Foundation</a>. All rights reserved.</small></p>
+</body>
+</html>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/3649682c/testdevapidocs/org/apache/hadoop/hbase/master/TestMasterRestartAfterDisablingTable.html
----------------------------------------------------------------------
diff --git a/testdevapidocs/org/apache/hadoop/hbase/master/TestMasterRestartAfterDisablingTable.html b/testdevapidocs/org/apache/hadoop/hbase/master/TestMasterRestartAfterDisablingTable.html
index 0888ad2..ece0827 100644
--- a/testdevapidocs/org/apache/hadoop/hbase/master/TestMasterRestartAfterDisablingTable.html
+++ b/testdevapidocs/org/apache/hadoop/hbase/master/TestMasterRestartAfterDisablingTable.html
@@ -49,7 +49,7 @@ var activeTableTab = "activeTableTab";
 </div>
 <div class="subNav">
 <ul class="navList">
-<li><a href="../../../../../org/apache/hadoop/hbase/master/TestMasterQosFunction.html" title="class in org.apache.hadoop.hbase.master"><span class="typeNameLink">Prev&nbsp;Class</span></a></li>
+<li><a href="../../../../../org/apache/hadoop/hbase/master/TestMasterRepairMode.html" title="class in org.apache.hadoop.hbase.master"><span class="typeNameLink">Prev&nbsp;Class</span></a></li>
 <li><a href="../../../../../org/apache/hadoop/hbase/master/TestMasterShutdown.html" title="class in org.apache.hadoop.hbase.master"><span class="typeNameLink">Next&nbsp;Class</span></a></li>
 </ul>
 <ul class="navList">
@@ -306,7 +306,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/TestMasterQosFunction.html" title="class in org.apache.hadoop.hbase.master"><span class="typeNameLink">Prev&nbsp;Class</span></a></li>
+<li><a href="../../../../../org/apache/hadoop/hbase/master/TestMasterRepairMode.html" title="class in org.apache.hadoop.hbase.master"><span class="typeNameLink">Prev&nbsp;Class</span></a></li>
 <li><a href="../../../../../org/apache/hadoop/hbase/master/TestMasterShutdown.html" title="class in org.apache.hadoop.hbase.master"><span class="typeNameLink">Next&nbsp;Class</span></a></li>
 </ul>
 <ul class="navList">

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/3649682c/testdevapidocs/org/apache/hadoop/hbase/master/TestShutdownBackupMaster.MockHMaster.html
----------------------------------------------------------------------
diff --git a/testdevapidocs/org/apache/hadoop/hbase/master/TestShutdownBackupMaster.MockHMaster.html b/testdevapidocs/org/apache/hadoop/hbase/master/TestShutdownBackupMaster.MockHMaster.html
index 5ab4862..cdb4c76 100644
--- a/testdevapidocs/org/apache/hadoop/hbase/master/TestShutdownBackupMaster.MockHMaster.html
+++ b/testdevapidocs/org/apache/hadoop/hbase/master/TestShutdownBackupMaster.MockHMaster.html
@@ -180,7 +180,7 @@ extends org.apache.hadoop.hbase.master.HMaster</pre>
 <!--   -->
 </a>
 <h3>Fields inherited from class&nbsp;org.apache.hadoop.hbase.master.HMaster</h3>
-<code>catalogJanitorChore, coprocessorServiceHandlers, cpHost, DEFAULT_HBASE_MASTER_WAIT_ON_SERVICE_IN_SECONDS, HBASE_MASTER_WAIT_ON_SERVICE_IN_SECONDS, loadBalancerTracker, MASTER, masterAddressSyncer, metaLocationSyncer, metricsMaster, rsFatals, serviceStarted, snapshotManager</code></li>
+<code>catalogJanitorChore, coprocessorServiceHandlers, cpHost, DEFAULT_HBASE_MASTER_WAIT_ON_SERVICE_IN_SECONDS, HBASE_MASTER_WAIT_ON_SERVICE_IN_SECONDS, loadBalancerTracker, MAINTENANCE_MODE, MASTER, masterAddressSyncer, metaLocationSyncer, metricsMaster, rsFatals, serviceStarted, snapshotManager</code></li>
 </ul>
 <ul class="blockList">
 <li class="blockList"><a name="fields.inherited.from.class.org.apache.hadoop.hbase.regionserver.HRegionServer">

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/3649682c/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 0426e42..61ca04e 100644
--- a/testdevapidocs/org/apache/hadoop/hbase/master/balancer/LoadOnlyFavoredStochasticBalancer.html
+++ b/testdevapidocs/org/apache/hadoop/hbase/master/balancer/LoadOnlyFavoredStochasticBalancer.html
@@ -184,7 +184,7 @@ extends org.apache.hadoop.hbase.master.balancer.FavoredStochasticBalancer</pre>
 <!--   -->
 </a>
 <h3>Fields inherited from class&nbsp;org.apache.hadoop.hbase.master.balancer.BaseLoadBalancer</h3>
-<code>clusterStatus, config, IDLE_SERVER_PREDICATOR, masterServerName, metricsBalancer, MIN_SERVER_BALANCE, onlySystemTablesOnMaster, overallSlop, rackManager, regionFinder, services, slop, tablesOnMaster, useRegionFinder</code></li>
+<code>clusterStatus, config, IDLE_SERVER_PREDICATOR, maintenanceMode, masterServerName, metricsBalancer, MIN_SERVER_BALANCE, onlySystemTablesOnMaster, overallSlop, rackManager, regionFinder, services, slop, useRegionFinder</code></li>
 </ul>
 <ul class="blockList">
 <li class="blockList"><a name="fields.inherited.from.class.org.apache.hadoop.hbase.favored.FavoredNodesPromoter">
@@ -269,7 +269,7 @@ extends org.apache.hadoop.hbase.master.balancer.FavoredStochasticBalancer</pre>
 <!--   -->
 </a>
 <h3>Methods inherited from interface&nbsp;org.apache.hadoop.hbase.master.LoadBalancer</h3>
-<code>isSystemTablesOnlyOnMaster, isTablesOnMaster</code></li>
+<code>isMasterCanHostUserRegions, isSystemTablesOnlyOnMaster, isTablesOnMaster</code></li>
 </ul>
 </li>
 </ul>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/3649682c/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 edd01a4..d006d04 100644
--- a/testdevapidocs/org/apache/hadoop/hbase/master/balancer/TestBaseLoadBalancer.MockBalancer.html
+++ b/testdevapidocs/org/apache/hadoop/hbase/master/balancer/TestBaseLoadBalancer.MockBalancer.html
@@ -156,7 +156,7 @@ extends org.apache.hadoop.hbase.master.balancer.BaseLoadBalancer</pre>
 <!--   -->
 </a>
 <h3>Fields inherited from class&nbsp;org.apache.hadoop.hbase.master.balancer.BaseLoadBalancer</h3>
-<code>clusterStatus, config, IDLE_SERVER_PREDICATOR, masterServerName, metricsBalancer, MIN_SERVER_BALANCE, onlySystemTablesOnMaster, overallSlop, rackManager, regionFinder, services, slop, tablesOnMaster, useRegionFinder</code></li>
+<code>clusterStatus, config, IDLE_SERVER_PREDICATOR, maintenanceMode, masterServerName, metricsBalancer, MIN_SERVER_BALANCE, onlySystemTablesOnMaster, overallSlop, rackManager, regionFinder, services, slop, useRegionFinder</code></li>
 </ul>
 <ul class="blockList">
 <li class="blockList"><a name="fields.inherited.from.class.org.apache.hadoop.hbase.master.LoadBalancer">
@@ -225,7 +225,7 @@ extends org.apache.hadoop.hbase.master.balancer.BaseLoadBalancer</pre>
 <!--   -->
 </a>
 <h3>Methods inherited from interface&nbsp;org.apache.hadoop.hbase.master.LoadBalancer</h3>
-<code>isSystemTablesOnlyOnMaster, isTablesOnMaster</code></li>
+<code>isMasterCanHostUserRegions, isSystemTablesOnlyOnMaster, isTablesOnMaster</code></li>
 </ul>
 </li>
 </ul>


[08/46] hbase-site git commit: Published site at 05d22ed960204183fbd9bd16f1dbca6410ccde76.

Posted by gi...@apache.org.
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/3649682c/devapidocs/src-html/org/apache/hadoop/hbase/regionserver/RSRpcServices.RegionScannerShippedCallBack.html
----------------------------------------------------------------------
diff --git a/devapidocs/src-html/org/apache/hadoop/hbase/regionserver/RSRpcServices.RegionScannerShippedCallBack.html b/devapidocs/src-html/org/apache/hadoop/hbase/regionserver/RSRpcServices.RegionScannerShippedCallBack.html
index 20e3eaa..b257d07 100644
--- a/devapidocs/src-html/org/apache/hadoop/hbase/regionserver/RSRpcServices.RegionScannerShippedCallBack.html
+++ b/devapidocs/src-html/org/apache/hadoop/hbase/regionserver/RSRpcServices.RegionScannerShippedCallBack.html
@@ -2493,1291 +2493,1293 @@
 <span class="sourceLineNo">2485</span>  }<a name="line.2485"></a>
 <span class="sourceLineNo">2486</span><a name="line.2486"></a>
 <span class="sourceLineNo">2487</span>  private boolean shouldRejectRequestsFromClient(HRegion region) {<a name="line.2487"></a>
-<span class="sourceLineNo">2488</span>    return regionServer.getReplicationSourceService().getSyncReplicationPeerInfoProvider()<a name="line.2488"></a>
-<span class="sourceLineNo">2489</span>      .checkState(region.getRegionInfo().getTable(), RejectRequestsFromClientStateChecker.get());<a name="line.2489"></a>
-<span class="sourceLineNo">2490</span>  }<a name="line.2490"></a>
-<span class="sourceLineNo">2491</span><a name="line.2491"></a>
-<span class="sourceLineNo">2492</span>  private void rejectIfInStandByState(HRegion region) throws DoNotRetryIOException {<a name="line.2492"></a>
-<span class="sourceLineNo">2493</span>    if (shouldRejectRequestsFromClient(region)) {<a name="line.2493"></a>
-<span class="sourceLineNo">2494</span>      throw new DoNotRetryIOException(<a name="line.2494"></a>
-<span class="sourceLineNo">2495</span>        region.getRegionInfo().getRegionNameAsString() + " is in STANDBY state.");<a name="line.2495"></a>
-<span class="sourceLineNo">2496</span>    }<a name="line.2496"></a>
-<span class="sourceLineNo">2497</span>  }<a name="line.2497"></a>
-<span class="sourceLineNo">2498</span><a name="line.2498"></a>
-<span class="sourceLineNo">2499</span>  /**<a name="line.2499"></a>
-<span class="sourceLineNo">2500</span>   * Get data from a table.<a name="line.2500"></a>
-<span class="sourceLineNo">2501</span>   *<a name="line.2501"></a>
-<span class="sourceLineNo">2502</span>   * @param controller the RPC controller<a name="line.2502"></a>
-<span class="sourceLineNo">2503</span>   * @param request the get request<a name="line.2503"></a>
-<span class="sourceLineNo">2504</span>   * @throws ServiceException<a name="line.2504"></a>
-<span class="sourceLineNo">2505</span>   */<a name="line.2505"></a>
-<span class="sourceLineNo">2506</span>  @Override<a name="line.2506"></a>
-<span class="sourceLineNo">2507</span>  public GetResponse get(final RpcController controller, final GetRequest request)<a name="line.2507"></a>
-<span class="sourceLineNo">2508</span>      throws ServiceException {<a name="line.2508"></a>
-<span class="sourceLineNo">2509</span>    long before = EnvironmentEdgeManager.currentTime();<a name="line.2509"></a>
-<span class="sourceLineNo">2510</span>    OperationQuota quota = null;<a name="line.2510"></a>
-<span class="sourceLineNo">2511</span>    HRegion region = null;<a name="line.2511"></a>
-<span class="sourceLineNo">2512</span>    try {<a name="line.2512"></a>
-<span class="sourceLineNo">2513</span>      checkOpen();<a name="line.2513"></a>
-<span class="sourceLineNo">2514</span>      requestCount.increment();<a name="line.2514"></a>
-<span class="sourceLineNo">2515</span>      rpcGetRequestCount.increment();<a name="line.2515"></a>
-<span class="sourceLineNo">2516</span>      region = getRegion(request.getRegion());<a name="line.2516"></a>
-<span class="sourceLineNo">2517</span>      rejectIfInStandByState(region);<a name="line.2517"></a>
-<span class="sourceLineNo">2518</span><a name="line.2518"></a>
-<span class="sourceLineNo">2519</span>      GetResponse.Builder builder = GetResponse.newBuilder();<a name="line.2519"></a>
-<span class="sourceLineNo">2520</span>      ClientProtos.Get get = request.getGet();<a name="line.2520"></a>
-<span class="sourceLineNo">2521</span>      // An asynchbase client, https://github.com/OpenTSDB/asynchbase, starts by trying to do<a name="line.2521"></a>
-<span class="sourceLineNo">2522</span>      // a get closest before. Throwing the UnknownProtocolException signals it that it needs<a name="line.2522"></a>
-<span class="sourceLineNo">2523</span>      // to switch and do hbase2 protocol (HBase servers do not tell clients what versions<a name="line.2523"></a>
-<span class="sourceLineNo">2524</span>      // they are; its a problem for non-native clients like asynchbase. HBASE-20225.<a name="line.2524"></a>
-<span class="sourceLineNo">2525</span>      if (get.hasClosestRowBefore() &amp;&amp; get.getClosestRowBefore()) {<a name="line.2525"></a>
-<span class="sourceLineNo">2526</span>        throw new UnknownProtocolException("Is this a pre-hbase-1.0.0 or asynchbase client? " +<a name="line.2526"></a>
-<span class="sourceLineNo">2527</span>            "Client is invoking getClosestRowBefore removed in hbase-2.0.0 replaced by " +<a name="line.2527"></a>
-<span class="sourceLineNo">2528</span>            "reverse Scan.");<a name="line.2528"></a>
-<span class="sourceLineNo">2529</span>      }<a name="line.2529"></a>
-<span class="sourceLineNo">2530</span>      Boolean existence = null;<a name="line.2530"></a>
-<span class="sourceLineNo">2531</span>      Result r = null;<a name="line.2531"></a>
-<span class="sourceLineNo">2532</span>      RpcCallContext context = RpcServer.getCurrentCall().orElse(null);<a name="line.2532"></a>
-<span class="sourceLineNo">2533</span>      quota = getRpcQuotaManager().checkQuota(region, OperationQuota.OperationType.GET);<a name="line.2533"></a>
-<span class="sourceLineNo">2534</span><a name="line.2534"></a>
-<span class="sourceLineNo">2535</span>      Get clientGet = ProtobufUtil.toGet(get);<a name="line.2535"></a>
-<span class="sourceLineNo">2536</span>      if (get.getExistenceOnly() &amp;&amp; region.getCoprocessorHost() != null) {<a name="line.2536"></a>
-<span class="sourceLineNo">2537</span>        existence = region.getCoprocessorHost().preExists(clientGet);<a name="line.2537"></a>
-<span class="sourceLineNo">2538</span>      }<a name="line.2538"></a>
-<span class="sourceLineNo">2539</span>      if (existence == null) {<a name="line.2539"></a>
-<span class="sourceLineNo">2540</span>        if (context != null) {<a name="line.2540"></a>
-<span class="sourceLineNo">2541</span>          r = get(clientGet, (region), null, context);<a name="line.2541"></a>
-<span class="sourceLineNo">2542</span>        } else {<a name="line.2542"></a>
-<span class="sourceLineNo">2543</span>          // for test purpose<a name="line.2543"></a>
-<span class="sourceLineNo">2544</span>          r = region.get(clientGet);<a name="line.2544"></a>
-<span class="sourceLineNo">2545</span>        }<a name="line.2545"></a>
-<span class="sourceLineNo">2546</span>        if (get.getExistenceOnly()) {<a name="line.2546"></a>
-<span class="sourceLineNo">2547</span>          boolean exists = r.getExists();<a name="line.2547"></a>
-<span class="sourceLineNo">2548</span>          if (region.getCoprocessorHost() != null) {<a name="line.2548"></a>
-<span class="sourceLineNo">2549</span>            exists = region.getCoprocessorHost().postExists(clientGet, exists);<a name="line.2549"></a>
-<span class="sourceLineNo">2550</span>          }<a name="line.2550"></a>
-<span class="sourceLineNo">2551</span>          existence = exists;<a name="line.2551"></a>
-<span class="sourceLineNo">2552</span>        }<a name="line.2552"></a>
-<span class="sourceLineNo">2553</span>      }<a name="line.2553"></a>
-<span class="sourceLineNo">2554</span>      if (existence != null) {<a name="line.2554"></a>
-<span class="sourceLineNo">2555</span>        ClientProtos.Result pbr =<a name="line.2555"></a>
-<span class="sourceLineNo">2556</span>            ProtobufUtil.toResult(existence, region.getRegionInfo().getReplicaId() != 0);<a name="line.2556"></a>
-<span class="sourceLineNo">2557</span>        builder.setResult(pbr);<a name="line.2557"></a>
-<span class="sourceLineNo">2558</span>      } else if (r != null) {<a name="line.2558"></a>
-<span class="sourceLineNo">2559</span>        ClientProtos.Result pbr;<a name="line.2559"></a>
-<span class="sourceLineNo">2560</span>        if (isClientCellBlockSupport(context) &amp;&amp; controller instanceof HBaseRpcController<a name="line.2560"></a>
-<span class="sourceLineNo">2561</span>            &amp;&amp; VersionInfoUtil.hasMinimumVersion(context.getClientVersionInfo(), 1, 3)) {<a name="line.2561"></a>
-<span class="sourceLineNo">2562</span>          pbr = ProtobufUtil.toResultNoData(r);<a name="line.2562"></a>
-<span class="sourceLineNo">2563</span>          ((HBaseRpcController) controller).setCellScanner(CellUtil.createCellScanner(r<a name="line.2563"></a>
-<span class="sourceLineNo">2564</span>              .rawCells()));<a name="line.2564"></a>
-<span class="sourceLineNo">2565</span>          addSize(context, r, null);<a name="line.2565"></a>
-<span class="sourceLineNo">2566</span>        } else {<a name="line.2566"></a>
-<span class="sourceLineNo">2567</span>          pbr = ProtobufUtil.toResult(r);<a name="line.2567"></a>
-<span class="sourceLineNo">2568</span>        }<a name="line.2568"></a>
-<span class="sourceLineNo">2569</span>        builder.setResult(pbr);<a name="line.2569"></a>
-<span class="sourceLineNo">2570</span>      }<a name="line.2570"></a>
-<span class="sourceLineNo">2571</span>      if (r != null) {<a name="line.2571"></a>
-<span class="sourceLineNo">2572</span>        quota.addGetResult(r);<a name="line.2572"></a>
-<span class="sourceLineNo">2573</span>      }<a name="line.2573"></a>
-<span class="sourceLineNo">2574</span>      return builder.build();<a name="line.2574"></a>
-<span class="sourceLineNo">2575</span>    } catch (IOException ie) {<a name="line.2575"></a>
-<span class="sourceLineNo">2576</span>      throw new ServiceException(ie);<a name="line.2576"></a>
-<span class="sourceLineNo">2577</span>    } finally {<a name="line.2577"></a>
-<span class="sourceLineNo">2578</span>      MetricsRegionServer mrs = regionServer.metricsRegionServer;<a name="line.2578"></a>
-<span class="sourceLineNo">2579</span>      if (mrs != null) {<a name="line.2579"></a>
-<span class="sourceLineNo">2580</span>        TableDescriptor td = region != null? region.getTableDescriptor(): null;<a name="line.2580"></a>
-<span class="sourceLineNo">2581</span>        if (td != null) {<a name="line.2581"></a>
-<span class="sourceLineNo">2582</span>          mrs.updateGet(td.getTableName(), EnvironmentEdgeManager.currentTime() - before);<a name="line.2582"></a>
-<span class="sourceLineNo">2583</span>        }<a name="line.2583"></a>
-<span class="sourceLineNo">2584</span>      }<a name="line.2584"></a>
-<span class="sourceLineNo">2585</span>      if (quota != null) {<a name="line.2585"></a>
-<span class="sourceLineNo">2586</span>        quota.close();<a name="line.2586"></a>
-<span class="sourceLineNo">2587</span>      }<a name="line.2587"></a>
-<span class="sourceLineNo">2588</span>    }<a name="line.2588"></a>
-<span class="sourceLineNo">2589</span>  }<a name="line.2589"></a>
-<span class="sourceLineNo">2590</span><a name="line.2590"></a>
-<span class="sourceLineNo">2591</span>  private Result get(Get get, HRegion region, RegionScannersCloseCallBack closeCallBack,<a name="line.2591"></a>
-<span class="sourceLineNo">2592</span>      RpcCallContext context) throws IOException {<a name="line.2592"></a>
-<span class="sourceLineNo">2593</span>    region.prepareGet(get);<a name="line.2593"></a>
-<span class="sourceLineNo">2594</span>    boolean stale = region.getRegionInfo().getReplicaId() != 0;<a name="line.2594"></a>
-<span class="sourceLineNo">2595</span><a name="line.2595"></a>
-<span class="sourceLineNo">2596</span>    // This method is almost the same as HRegion#get.<a name="line.2596"></a>
-<span class="sourceLineNo">2597</span>    List&lt;Cell&gt; results = new ArrayList&lt;&gt;();<a name="line.2597"></a>
-<span class="sourceLineNo">2598</span>    long before = EnvironmentEdgeManager.currentTime();<a name="line.2598"></a>
-<span class="sourceLineNo">2599</span>    // pre-get CP hook<a name="line.2599"></a>
-<span class="sourceLineNo">2600</span>    if (region.getCoprocessorHost() != null) {<a name="line.2600"></a>
-<span class="sourceLineNo">2601</span>      if (region.getCoprocessorHost().preGet(get, results)) {<a name="line.2601"></a>
-<span class="sourceLineNo">2602</span>        region.metricsUpdateForGet(results, before);<a name="line.2602"></a>
-<span class="sourceLineNo">2603</span>        return Result<a name="line.2603"></a>
-<span class="sourceLineNo">2604</span>            .create(results, get.isCheckExistenceOnly() ? !results.isEmpty() : null, stale);<a name="line.2604"></a>
-<span class="sourceLineNo">2605</span>      }<a name="line.2605"></a>
-<span class="sourceLineNo">2606</span>    }<a name="line.2606"></a>
-<span class="sourceLineNo">2607</span>    Scan scan = new Scan(get);<a name="line.2607"></a>
-<span class="sourceLineNo">2608</span>    if (scan.getLoadColumnFamiliesOnDemandValue() == null) {<a name="line.2608"></a>
-<span class="sourceLineNo">2609</span>      scan.setLoadColumnFamiliesOnDemand(region.isLoadingCfsOnDemandDefault());<a name="line.2609"></a>
-<span class="sourceLineNo">2610</span>    }<a name="line.2610"></a>
-<span class="sourceLineNo">2611</span>    RegionScannerImpl scanner = null;<a name="line.2611"></a>
-<span class="sourceLineNo">2612</span>    try {<a name="line.2612"></a>
-<span class="sourceLineNo">2613</span>      scanner = region.getScanner(scan);<a name="line.2613"></a>
-<span class="sourceLineNo">2614</span>      scanner.next(results);<a name="line.2614"></a>
-<span class="sourceLineNo">2615</span>    } finally {<a name="line.2615"></a>
-<span class="sourceLineNo">2616</span>      if (scanner != null) {<a name="line.2616"></a>
-<span class="sourceLineNo">2617</span>        if (closeCallBack == null) {<a name="line.2617"></a>
-<span class="sourceLineNo">2618</span>          // If there is a context then the scanner can be added to the current<a name="line.2618"></a>
-<span class="sourceLineNo">2619</span>          // RpcCallContext. The rpc callback will take care of closing the<a name="line.2619"></a>
-<span class="sourceLineNo">2620</span>          // scanner, for eg in case<a name="line.2620"></a>
-<span class="sourceLineNo">2621</span>          // of get()<a name="line.2621"></a>
-<span class="sourceLineNo">2622</span>          context.setCallBack(scanner);<a name="line.2622"></a>
-<span class="sourceLineNo">2623</span>        } else {<a name="line.2623"></a>
-<span class="sourceLineNo">2624</span>          // The call is from multi() where the results from the get() are<a name="line.2624"></a>
-<span class="sourceLineNo">2625</span>          // aggregated and then send out to the<a name="line.2625"></a>
-<span class="sourceLineNo">2626</span>          // rpc. The rpccall back will close all such scanners created as part<a name="line.2626"></a>
-<span class="sourceLineNo">2627</span>          // of multi().<a name="line.2627"></a>
-<span class="sourceLineNo">2628</span>          closeCallBack.addScanner(scanner);<a name="line.2628"></a>
-<span class="sourceLineNo">2629</span>        }<a name="line.2629"></a>
-<span class="sourceLineNo">2630</span>      }<a name="line.2630"></a>
-<span class="sourceLineNo">2631</span>    }<a name="line.2631"></a>
-<span class="sourceLineNo">2632</span><a name="line.2632"></a>
-<span class="sourceLineNo">2633</span>    // post-get CP hook<a name="line.2633"></a>
-<span class="sourceLineNo">2634</span>    if (region.getCoprocessorHost() != null) {<a name="line.2634"></a>
-<span class="sourceLineNo">2635</span>      region.getCoprocessorHost().postGet(get, results);<a name="line.2635"></a>
-<span class="sourceLineNo">2636</span>    }<a name="line.2636"></a>
-<span class="sourceLineNo">2637</span>    region.metricsUpdateForGet(results, before);<a name="line.2637"></a>
-<span class="sourceLineNo">2638</span><a name="line.2638"></a>
-<span class="sourceLineNo">2639</span>    return Result.create(results, get.isCheckExistenceOnly() ? !results.isEmpty() : null, stale);<a name="line.2639"></a>
-<span class="sourceLineNo">2640</span>  }<a name="line.2640"></a>
-<span class="sourceLineNo">2641</span><a name="line.2641"></a>
-<span class="sourceLineNo">2642</span>  private void checkBatchSizeAndLogLargeSize(MultiRequest request) {<a name="line.2642"></a>
-<span class="sourceLineNo">2643</span>    int sum = 0;<a name="line.2643"></a>
-<span class="sourceLineNo">2644</span>    String firstRegionName = null;<a name="line.2644"></a>
-<span class="sourceLineNo">2645</span>    for (RegionAction regionAction : request.getRegionActionList()) {<a name="line.2645"></a>
-<span class="sourceLineNo">2646</span>      if (sum == 0) {<a name="line.2646"></a>
-<span class="sourceLineNo">2647</span>        firstRegionName = Bytes.toStringBinary(regionAction.getRegion().getValue().toByteArray());<a name="line.2647"></a>
-<span class="sourceLineNo">2648</span>      }<a name="line.2648"></a>
-<span class="sourceLineNo">2649</span>      sum += regionAction.getActionCount();<a name="line.2649"></a>
-<span class="sourceLineNo">2650</span>    }<a name="line.2650"></a>
-<span class="sourceLineNo">2651</span>    if (sum &gt; rowSizeWarnThreshold) {<a name="line.2651"></a>
-<span class="sourceLineNo">2652</span>      ld.logBatchWarning(firstRegionName, sum, rowSizeWarnThreshold);<a name="line.2652"></a>
-<span class="sourceLineNo">2653</span>    }<a name="line.2653"></a>
-<span class="sourceLineNo">2654</span>  }<a name="line.2654"></a>
-<span class="sourceLineNo">2655</span><a name="line.2655"></a>
-<span class="sourceLineNo">2656</span>  private void failRegionAction(MultiResponse.Builder responseBuilder,<a name="line.2656"></a>
-<span class="sourceLineNo">2657</span>      RegionActionResult.Builder regionActionResultBuilder, RegionAction regionAction,<a name="line.2657"></a>
-<span class="sourceLineNo">2658</span>      CellScanner cellScanner, Throwable error) {<a name="line.2658"></a>
-<span class="sourceLineNo">2659</span>    rpcServer.getMetrics().exception(error);<a name="line.2659"></a>
-<span class="sourceLineNo">2660</span>    regionActionResultBuilder.setException(ResponseConverter.buildException(error));<a name="line.2660"></a>
-<span class="sourceLineNo">2661</span>    responseBuilder.addRegionActionResult(regionActionResultBuilder.build());<a name="line.2661"></a>
-<span class="sourceLineNo">2662</span>    // All Mutations in this RegionAction not executed as we can not see the Region online here<a name="line.2662"></a>
-<span class="sourceLineNo">2663</span>    // in this RS. Will be retried from Client. Skipping all the Cells in CellScanner<a name="line.2663"></a>
-<span class="sourceLineNo">2664</span>    // corresponding to these Mutations.<a name="line.2664"></a>
-<span class="sourceLineNo">2665</span>    if (cellScanner != null) {<a name="line.2665"></a>
-<span class="sourceLineNo">2666</span>      skipCellsForMutations(regionAction.getActionList(), cellScanner);<a name="line.2666"></a>
-<span class="sourceLineNo">2667</span>    }<a name="line.2667"></a>
-<span class="sourceLineNo">2668</span>  }<a name="line.2668"></a>
-<span class="sourceLineNo">2669</span><a name="line.2669"></a>
-<span class="sourceLineNo">2670</span>  private boolean isReplicationRequest(Action action) {<a name="line.2670"></a>
-<span class="sourceLineNo">2671</span>    // replication request can only be put or delete.<a name="line.2671"></a>
-<span class="sourceLineNo">2672</span>    if (!action.hasMutation()) {<a name="line.2672"></a>
-<span class="sourceLineNo">2673</span>      return false;<a name="line.2673"></a>
-<span class="sourceLineNo">2674</span>    }<a name="line.2674"></a>
-<span class="sourceLineNo">2675</span>    MutationProto mutation = action.getMutation();<a name="line.2675"></a>
-<span class="sourceLineNo">2676</span>    MutationType type = mutation.getMutateType();<a name="line.2676"></a>
-<span class="sourceLineNo">2677</span>    if (type != MutationType.PUT &amp;&amp; type != MutationType.DELETE) {<a name="line.2677"></a>
-<span class="sourceLineNo">2678</span>      return false;<a name="line.2678"></a>
-<span class="sourceLineNo">2679</span>    }<a name="line.2679"></a>
-<span class="sourceLineNo">2680</span>    // replication will set a special attribute so we can make use of it to decide whether a request<a name="line.2680"></a>
-<span class="sourceLineNo">2681</span>    // is for replication.<a name="line.2681"></a>
-<span class="sourceLineNo">2682</span>    return mutation.getAttributeList().stream().map(p -&gt; p.getName())<a name="line.2682"></a>
-<span class="sourceLineNo">2683</span>      .filter(n -&gt; n.equals(ReplicationUtils.REPLICATION_ATTR_NAME)).findAny().isPresent();<a name="line.2683"></a>
-<span class="sourceLineNo">2684</span>  }<a name="line.2684"></a>
-<span class="sourceLineNo">2685</span><a name="line.2685"></a>
-<span class="sourceLineNo">2686</span>  /**<a name="line.2686"></a>
-<span class="sourceLineNo">2687</span>   * Execute multiple actions on a table: get, mutate, and/or execCoprocessor<a name="line.2687"></a>
-<span class="sourceLineNo">2688</span>   * @param rpcc the RPC controller<a name="line.2688"></a>
-<span class="sourceLineNo">2689</span>   * @param request the multi request<a name="line.2689"></a>
-<span class="sourceLineNo">2690</span>   * @throws ServiceException<a name="line.2690"></a>
-<span class="sourceLineNo">2691</span>   */<a name="line.2691"></a>
-<span class="sourceLineNo">2692</span>  @Override<a name="line.2692"></a>
-<span class="sourceLineNo">2693</span>  public MultiResponse multi(final RpcController rpcc, final MultiRequest request)<a name="line.2693"></a>
-<span class="sourceLineNo">2694</span>      throws ServiceException {<a name="line.2694"></a>
-<span class="sourceLineNo">2695</span>    try {<a name="line.2695"></a>
-<span class="sourceLineNo">2696</span>      checkOpen();<a name="line.2696"></a>
-<span class="sourceLineNo">2697</span>    } catch (IOException ie) {<a name="line.2697"></a>
-<span class="sourceLineNo">2698</span>      throw new ServiceException(ie);<a name="line.2698"></a>
-<span class="sourceLineNo">2699</span>    }<a name="line.2699"></a>
-<span class="sourceLineNo">2700</span><a name="line.2700"></a>
-<span class="sourceLineNo">2701</span>    checkBatchSizeAndLogLargeSize(request);<a name="line.2701"></a>
+<span class="sourceLineNo">2488</span>    TableName table = region.getRegionInfo().getTable();<a name="line.2488"></a>
+<span class="sourceLineNo">2489</span>    ReplicationSourceService service = regionServer.getReplicationSourceService();<a name="line.2489"></a>
+<span class="sourceLineNo">2490</span>    return service != null &amp;&amp; service.getSyncReplicationPeerInfoProvider()<a name="line.2490"></a>
+<span class="sourceLineNo">2491</span>            .checkState(table, RejectRequestsFromClientStateChecker.get());<a name="line.2491"></a>
+<span class="sourceLineNo">2492</span>  }<a name="line.2492"></a>
+<span class="sourceLineNo">2493</span><a name="line.2493"></a>
+<span class="sourceLineNo">2494</span>  private void rejectIfInStandByState(HRegion region) throws DoNotRetryIOException {<a name="line.2494"></a>
+<span class="sourceLineNo">2495</span>    if (shouldRejectRequestsFromClient(region)) {<a name="line.2495"></a>
+<span class="sourceLineNo">2496</span>      throw new DoNotRetryIOException(<a name="line.2496"></a>
+<span class="sourceLineNo">2497</span>        region.getRegionInfo().getRegionNameAsString() + " is in STANDBY state.");<a name="line.2497"></a>
+<span class="sourceLineNo">2498</span>    }<a name="line.2498"></a>
+<span class="sourceLineNo">2499</span>  }<a name="line.2499"></a>
+<span class="sourceLineNo">2500</span><a name="line.2500"></a>
+<span class="sourceLineNo">2501</span>  /**<a name="line.2501"></a>
+<span class="sourceLineNo">2502</span>   * Get data from a table.<a name="line.2502"></a>
+<span class="sourceLineNo">2503</span>   *<a name="line.2503"></a>
+<span class="sourceLineNo">2504</span>   * @param controller the RPC controller<a name="line.2504"></a>
+<span class="sourceLineNo">2505</span>   * @param request the get request<a name="line.2505"></a>
+<span class="sourceLineNo">2506</span>   * @throws ServiceException<a name="line.2506"></a>
+<span class="sourceLineNo">2507</span>   */<a name="line.2507"></a>
+<span class="sourceLineNo">2508</span>  @Override<a name="line.2508"></a>
+<span class="sourceLineNo">2509</span>  public GetResponse get(final RpcController controller, final GetRequest request)<a name="line.2509"></a>
+<span class="sourceLineNo">2510</span>      throws ServiceException {<a name="line.2510"></a>
+<span class="sourceLineNo">2511</span>    long before = EnvironmentEdgeManager.currentTime();<a name="line.2511"></a>
+<span class="sourceLineNo">2512</span>    OperationQuota quota = null;<a name="line.2512"></a>
+<span class="sourceLineNo">2513</span>    HRegion region = null;<a name="line.2513"></a>
+<span class="sourceLineNo">2514</span>    try {<a name="line.2514"></a>
+<span class="sourceLineNo">2515</span>      checkOpen();<a name="line.2515"></a>
+<span class="sourceLineNo">2516</span>      requestCount.increment();<a name="line.2516"></a>
+<span class="sourceLineNo">2517</span>      rpcGetRequestCount.increment();<a name="line.2517"></a>
+<span class="sourceLineNo">2518</span>      region = getRegion(request.getRegion());<a name="line.2518"></a>
+<span class="sourceLineNo">2519</span>      rejectIfInStandByState(region);<a name="line.2519"></a>
+<span class="sourceLineNo">2520</span><a name="line.2520"></a>
+<span class="sourceLineNo">2521</span>      GetResponse.Builder builder = GetResponse.newBuilder();<a name="line.2521"></a>
+<span class="sourceLineNo">2522</span>      ClientProtos.Get get = request.getGet();<a name="line.2522"></a>
+<span class="sourceLineNo">2523</span>      // An asynchbase client, https://github.com/OpenTSDB/asynchbase, starts by trying to do<a name="line.2523"></a>
+<span class="sourceLineNo">2524</span>      // a get closest before. Throwing the UnknownProtocolException signals it that it needs<a name="line.2524"></a>
+<span class="sourceLineNo">2525</span>      // to switch and do hbase2 protocol (HBase servers do not tell clients what versions<a name="line.2525"></a>
+<span class="sourceLineNo">2526</span>      // they are; its a problem for non-native clients like asynchbase. HBASE-20225.<a name="line.2526"></a>
+<span class="sourceLineNo">2527</span>      if (get.hasClosestRowBefore() &amp;&amp; get.getClosestRowBefore()) {<a name="line.2527"></a>
+<span class="sourceLineNo">2528</span>        throw new UnknownProtocolException("Is this a pre-hbase-1.0.0 or asynchbase client? " +<a name="line.2528"></a>
+<span class="sourceLineNo">2529</span>            "Client is invoking getClosestRowBefore removed in hbase-2.0.0 replaced by " +<a name="line.2529"></a>
+<span class="sourceLineNo">2530</span>            "reverse Scan.");<a name="line.2530"></a>
+<span class="sourceLineNo">2531</span>      }<a name="line.2531"></a>
+<span class="sourceLineNo">2532</span>      Boolean existence = null;<a name="line.2532"></a>
+<span class="sourceLineNo">2533</span>      Result r = null;<a name="line.2533"></a>
+<span class="sourceLineNo">2534</span>      RpcCallContext context = RpcServer.getCurrentCall().orElse(null);<a name="line.2534"></a>
+<span class="sourceLineNo">2535</span>      quota = getRpcQuotaManager().checkQuota(region, OperationQuota.OperationType.GET);<a name="line.2535"></a>
+<span class="sourceLineNo">2536</span><a name="line.2536"></a>
+<span class="sourceLineNo">2537</span>      Get clientGet = ProtobufUtil.toGet(get);<a name="line.2537"></a>
+<span class="sourceLineNo">2538</span>      if (get.getExistenceOnly() &amp;&amp; region.getCoprocessorHost() != null) {<a name="line.2538"></a>
+<span class="sourceLineNo">2539</span>        existence = region.getCoprocessorHost().preExists(clientGet);<a name="line.2539"></a>
+<span class="sourceLineNo">2540</span>      }<a name="line.2540"></a>
+<span class="sourceLineNo">2541</span>      if (existence == null) {<a name="line.2541"></a>
+<span class="sourceLineNo">2542</span>        if (context != null) {<a name="line.2542"></a>
+<span class="sourceLineNo">2543</span>          r = get(clientGet, (region), null, context);<a name="line.2543"></a>
+<span class="sourceLineNo">2544</span>        } else {<a name="line.2544"></a>
+<span class="sourceLineNo">2545</span>          // for test purpose<a name="line.2545"></a>
+<span class="sourceLineNo">2546</span>          r = region.get(clientGet);<a name="line.2546"></a>
+<span class="sourceLineNo">2547</span>        }<a name="line.2547"></a>
+<span class="sourceLineNo">2548</span>        if (get.getExistenceOnly()) {<a name="line.2548"></a>
+<span class="sourceLineNo">2549</span>          boolean exists = r.getExists();<a name="line.2549"></a>
+<span class="sourceLineNo">2550</span>          if (region.getCoprocessorHost() != null) {<a name="line.2550"></a>
+<span class="sourceLineNo">2551</span>            exists = region.getCoprocessorHost().postExists(clientGet, exists);<a name="line.2551"></a>
+<span class="sourceLineNo">2552</span>          }<a name="line.2552"></a>
+<span class="sourceLineNo">2553</span>          existence = exists;<a name="line.2553"></a>
+<span class="sourceLineNo">2554</span>        }<a name="line.2554"></a>
+<span class="sourceLineNo">2555</span>      }<a name="line.2555"></a>
+<span class="sourceLineNo">2556</span>      if (existence != null) {<a name="line.2556"></a>
+<span class="sourceLineNo">2557</span>        ClientProtos.Result pbr =<a name="line.2557"></a>
+<span class="sourceLineNo">2558</span>            ProtobufUtil.toResult(existence, region.getRegionInfo().getReplicaId() != 0);<a name="line.2558"></a>
+<span class="sourceLineNo">2559</span>        builder.setResult(pbr);<a name="line.2559"></a>
+<span class="sourceLineNo">2560</span>      } else if (r != null) {<a name="line.2560"></a>
+<span class="sourceLineNo">2561</span>        ClientProtos.Result pbr;<a name="line.2561"></a>
+<span class="sourceLineNo">2562</span>        if (isClientCellBlockSupport(context) &amp;&amp; controller instanceof HBaseRpcController<a name="line.2562"></a>
+<span class="sourceLineNo">2563</span>            &amp;&amp; VersionInfoUtil.hasMinimumVersion(context.getClientVersionInfo(), 1, 3)) {<a name="line.2563"></a>
+<span class="sourceLineNo">2564</span>          pbr = ProtobufUtil.toResultNoData(r);<a name="line.2564"></a>
+<span class="sourceLineNo">2565</span>          ((HBaseRpcController) controller).setCellScanner(CellUtil.createCellScanner(r<a name="line.2565"></a>
+<span class="sourceLineNo">2566</span>              .rawCells()));<a name="line.2566"></a>
+<span class="sourceLineNo">2567</span>          addSize(context, r, null);<a name="line.2567"></a>
+<span class="sourceLineNo">2568</span>        } else {<a name="line.2568"></a>
+<span class="sourceLineNo">2569</span>          pbr = ProtobufUtil.toResult(r);<a name="line.2569"></a>
+<span class="sourceLineNo">2570</span>        }<a name="line.2570"></a>
+<span class="sourceLineNo">2571</span>        builder.setResult(pbr);<a name="line.2571"></a>
+<span class="sourceLineNo">2572</span>      }<a name="line.2572"></a>
+<span class="sourceLineNo">2573</span>      if (r != null) {<a name="line.2573"></a>
+<span class="sourceLineNo">2574</span>        quota.addGetResult(r);<a name="line.2574"></a>
+<span class="sourceLineNo">2575</span>      }<a name="line.2575"></a>
+<span class="sourceLineNo">2576</span>      return builder.build();<a name="line.2576"></a>
+<span class="sourceLineNo">2577</span>    } catch (IOException ie) {<a name="line.2577"></a>
+<span class="sourceLineNo">2578</span>      throw new ServiceException(ie);<a name="line.2578"></a>
+<span class="sourceLineNo">2579</span>    } finally {<a name="line.2579"></a>
+<span class="sourceLineNo">2580</span>      MetricsRegionServer mrs = regionServer.metricsRegionServer;<a name="line.2580"></a>
+<span class="sourceLineNo">2581</span>      if (mrs != null) {<a name="line.2581"></a>
+<span class="sourceLineNo">2582</span>        TableDescriptor td = region != null? region.getTableDescriptor(): null;<a name="line.2582"></a>
+<span class="sourceLineNo">2583</span>        if (td != null) {<a name="line.2583"></a>
+<span class="sourceLineNo">2584</span>          mrs.updateGet(td.getTableName(), EnvironmentEdgeManager.currentTime() - before);<a name="line.2584"></a>
+<span class="sourceLineNo">2585</span>        }<a name="line.2585"></a>
+<span class="sourceLineNo">2586</span>      }<a name="line.2586"></a>
+<span class="sourceLineNo">2587</span>      if (quota != null) {<a name="line.2587"></a>
+<span class="sourceLineNo">2588</span>        quota.close();<a name="line.2588"></a>
+<span class="sourceLineNo">2589</span>      }<a name="line.2589"></a>
+<span class="sourceLineNo">2590</span>    }<a name="line.2590"></a>
+<span class="sourceLineNo">2591</span>  }<a name="line.2591"></a>
+<span class="sourceLineNo">2592</span><a name="line.2592"></a>
+<span class="sourceLineNo">2593</span>  private Result get(Get get, HRegion region, RegionScannersCloseCallBack closeCallBack,<a name="line.2593"></a>
+<span class="sourceLineNo">2594</span>      RpcCallContext context) throws IOException {<a name="line.2594"></a>
+<span class="sourceLineNo">2595</span>    region.prepareGet(get);<a name="line.2595"></a>
+<span class="sourceLineNo">2596</span>    boolean stale = region.getRegionInfo().getReplicaId() != 0;<a name="line.2596"></a>
+<span class="sourceLineNo">2597</span><a name="line.2597"></a>
+<span class="sourceLineNo">2598</span>    // This method is almost the same as HRegion#get.<a name="line.2598"></a>
+<span class="sourceLineNo">2599</span>    List&lt;Cell&gt; results = new ArrayList&lt;&gt;();<a name="line.2599"></a>
+<span class="sourceLineNo">2600</span>    long before = EnvironmentEdgeManager.currentTime();<a name="line.2600"></a>
+<span class="sourceLineNo">2601</span>    // pre-get CP hook<a name="line.2601"></a>
+<span class="sourceLineNo">2602</span>    if (region.getCoprocessorHost() != null) {<a name="line.2602"></a>
+<span class="sourceLineNo">2603</span>      if (region.getCoprocessorHost().preGet(get, results)) {<a name="line.2603"></a>
+<span class="sourceLineNo">2604</span>        region.metricsUpdateForGet(results, before);<a name="line.2604"></a>
+<span class="sourceLineNo">2605</span>        return Result<a name="line.2605"></a>
+<span class="sourceLineNo">2606</span>            .create(results, get.isCheckExistenceOnly() ? !results.isEmpty() : null, stale);<a name="line.2606"></a>
+<span class="sourceLineNo">2607</span>      }<a name="line.2607"></a>
+<span class="sourceLineNo">2608</span>    }<a name="line.2608"></a>
+<span class="sourceLineNo">2609</span>    Scan scan = new Scan(get);<a name="line.2609"></a>
+<span class="sourceLineNo">2610</span>    if (scan.getLoadColumnFamiliesOnDemandValue() == null) {<a name="line.2610"></a>
+<span class="sourceLineNo">2611</span>      scan.setLoadColumnFamiliesOnDemand(region.isLoadingCfsOnDemandDefault());<a name="line.2611"></a>
+<span class="sourceLineNo">2612</span>    }<a name="line.2612"></a>
+<span class="sourceLineNo">2613</span>    RegionScannerImpl scanner = null;<a name="line.2613"></a>
+<span class="sourceLineNo">2614</span>    try {<a name="line.2614"></a>
+<span class="sourceLineNo">2615</span>      scanner = region.getScanner(scan);<a name="line.2615"></a>
+<span class="sourceLineNo">2616</span>      scanner.next(results);<a name="line.2616"></a>
+<span class="sourceLineNo">2617</span>    } finally {<a name="line.2617"></a>
+<span class="sourceLineNo">2618</span>      if (scanner != null) {<a name="line.2618"></a>
+<span class="sourceLineNo">2619</span>        if (closeCallBack == null) {<a name="line.2619"></a>
+<span class="sourceLineNo">2620</span>          // If there is a context then the scanner can be added to the current<a name="line.2620"></a>
+<span class="sourceLineNo">2621</span>          // RpcCallContext. The rpc callback will take care of closing the<a name="line.2621"></a>
+<span class="sourceLineNo">2622</span>          // scanner, for eg in case<a name="line.2622"></a>
+<span class="sourceLineNo">2623</span>          // of get()<a name="line.2623"></a>
+<span class="sourceLineNo">2624</span>          context.setCallBack(scanner);<a name="line.2624"></a>
+<span class="sourceLineNo">2625</span>        } else {<a name="line.2625"></a>
+<span class="sourceLineNo">2626</span>          // The call is from multi() where the results from the get() are<a name="line.2626"></a>
+<span class="sourceLineNo">2627</span>          // aggregated and then send out to the<a name="line.2627"></a>
+<span class="sourceLineNo">2628</span>          // rpc. The rpccall back will close all such scanners created as part<a name="line.2628"></a>
+<span class="sourceLineNo">2629</span>          // of multi().<a name="line.2629"></a>
+<span class="sourceLineNo">2630</span>          closeCallBack.addScanner(scanner);<a name="line.2630"></a>
+<span class="sourceLineNo">2631</span>        }<a name="line.2631"></a>
+<span class="sourceLineNo">2632</span>      }<a name="line.2632"></a>
+<span class="sourceLineNo">2633</span>    }<a name="line.2633"></a>
+<span class="sourceLineNo">2634</span><a name="line.2634"></a>
+<span class="sourceLineNo">2635</span>    // post-get CP hook<a name="line.2635"></a>
+<span class="sourceLineNo">2636</span>    if (region.getCoprocessorHost() != null) {<a name="line.2636"></a>
+<span class="sourceLineNo">2637</span>      region.getCoprocessorHost().postGet(get, results);<a name="line.2637"></a>
+<span class="sourceLineNo">2638</span>    }<a name="line.2638"></a>
+<span class="sourceLineNo">2639</span>    region.metricsUpdateForGet(results, before);<a name="line.2639"></a>
+<span class="sourceLineNo">2640</span><a name="line.2640"></a>
+<span class="sourceLineNo">2641</span>    return Result.create(results, get.isCheckExistenceOnly() ? !results.isEmpty() : null, stale);<a name="line.2641"></a>
+<span class="sourceLineNo">2642</span>  }<a name="line.2642"></a>
+<span class="sourceLineNo">2643</span><a name="line.2643"></a>
+<span class="sourceLineNo">2644</span>  private void checkBatchSizeAndLogLargeSize(MultiRequest request) {<a name="line.2644"></a>
+<span class="sourceLineNo">2645</span>    int sum = 0;<a name="line.2645"></a>
+<span class="sourceLineNo">2646</span>    String firstRegionName = null;<a name="line.2646"></a>
+<span class="sourceLineNo">2647</span>    for (RegionAction regionAction : request.getRegionActionList()) {<a name="line.2647"></a>
+<span class="sourceLineNo">2648</span>      if (sum == 0) {<a name="line.2648"></a>
+<span class="sourceLineNo">2649</span>        firstRegionName = Bytes.toStringBinary(regionAction.getRegion().getValue().toByteArray());<a name="line.2649"></a>
+<span class="sourceLineNo">2650</span>      }<a name="line.2650"></a>
+<span class="sourceLineNo">2651</span>      sum += regionAction.getActionCount();<a name="line.2651"></a>
+<span class="sourceLineNo">2652</span>    }<a name="line.2652"></a>
+<span class="sourceLineNo">2653</span>    if (sum &gt; rowSizeWarnThreshold) {<a name="line.2653"></a>
+<span class="sourceLineNo">2654</span>      ld.logBatchWarning(firstRegionName, sum, rowSizeWarnThreshold);<a name="line.2654"></a>
+<span class="sourceLineNo">2655</span>    }<a name="line.2655"></a>
+<span class="sourceLineNo">2656</span>  }<a name="line.2656"></a>
+<span class="sourceLineNo">2657</span><a name="line.2657"></a>
+<span class="sourceLineNo">2658</span>  private void failRegionAction(MultiResponse.Builder responseBuilder,<a name="line.2658"></a>
+<span class="sourceLineNo">2659</span>      RegionActionResult.Builder regionActionResultBuilder, RegionAction regionAction,<a name="line.2659"></a>
+<span class="sourceLineNo">2660</span>      CellScanner cellScanner, Throwable error) {<a name="line.2660"></a>
+<span class="sourceLineNo">2661</span>    rpcServer.getMetrics().exception(error);<a name="line.2661"></a>
+<span class="sourceLineNo">2662</span>    regionActionResultBuilder.setException(ResponseConverter.buildException(error));<a name="line.2662"></a>
+<span class="sourceLineNo">2663</span>    responseBuilder.addRegionActionResult(regionActionResultBuilder.build());<a name="line.2663"></a>
+<span class="sourceLineNo">2664</span>    // All Mutations in this RegionAction not executed as we can not see the Region online here<a name="line.2664"></a>
+<span class="sourceLineNo">2665</span>    // in this RS. Will be retried from Client. Skipping all the Cells in CellScanner<a name="line.2665"></a>
+<span class="sourceLineNo">2666</span>    // corresponding to these Mutations.<a name="line.2666"></a>
+<span class="sourceLineNo">2667</span>    if (cellScanner != null) {<a name="line.2667"></a>
+<span class="sourceLineNo">2668</span>      skipCellsForMutations(regionAction.getActionList(), cellScanner);<a name="line.2668"></a>
+<span class="sourceLineNo">2669</span>    }<a name="line.2669"></a>
+<span class="sourceLineNo">2670</span>  }<a name="line.2670"></a>
+<span class="sourceLineNo">2671</span><a name="line.2671"></a>
+<span class="sourceLineNo">2672</span>  private boolean isReplicationRequest(Action action) {<a name="line.2672"></a>
+<span class="sourceLineNo">2673</span>    // replication request can only be put or delete.<a name="line.2673"></a>
+<span class="sourceLineNo">2674</span>    if (!action.hasMutation()) {<a name="line.2674"></a>
+<span class="sourceLineNo">2675</span>      return false;<a name="line.2675"></a>
+<span class="sourceLineNo">2676</span>    }<a name="line.2676"></a>
+<span class="sourceLineNo">2677</span>    MutationProto mutation = action.getMutation();<a name="line.2677"></a>
+<span class="sourceLineNo">2678</span>    MutationType type = mutation.getMutateType();<a name="line.2678"></a>
+<span class="sourceLineNo">2679</span>    if (type != MutationType.PUT &amp;&amp; type != MutationType.DELETE) {<a name="line.2679"></a>
+<span class="sourceLineNo">2680</span>      return false;<a name="line.2680"></a>
+<span class="sourceLineNo">2681</span>    }<a name="line.2681"></a>
+<span class="sourceLineNo">2682</span>    // replication will set a special attribute so we can make use of it to decide whether a request<a name="line.2682"></a>
+<span class="sourceLineNo">2683</span>    // is for replication.<a name="line.2683"></a>
+<span class="sourceLineNo">2684</span>    return mutation.getAttributeList().stream().map(p -&gt; p.getName())<a name="line.2684"></a>
+<span class="sourceLineNo">2685</span>      .filter(n -&gt; n.equals(ReplicationUtils.REPLICATION_ATTR_NAME)).findAny().isPresent();<a name="line.2685"></a>
+<span class="sourceLineNo">2686</span>  }<a name="line.2686"></a>
+<span class="sourceLineNo">2687</span><a name="line.2687"></a>
+<span class="sourceLineNo">2688</span>  /**<a name="line.2688"></a>
+<span class="sourceLineNo">2689</span>   * Execute multiple actions on a table: get, mutate, and/or execCoprocessor<a name="line.2689"></a>
+<span class="sourceLineNo">2690</span>   * @param rpcc the RPC controller<a name="line.2690"></a>
+<span class="sourceLineNo">2691</span>   * @param request the multi request<a name="line.2691"></a>
+<span class="sourceLineNo">2692</span>   * @throws ServiceException<a name="line.2692"></a>
+<span class="sourceLineNo">2693</span>   */<a name="line.2693"></a>
+<span class="sourceLineNo">2694</span>  @Override<a name="line.2694"></a>
+<span class="sourceLineNo">2695</span>  public MultiResponse multi(final RpcController rpcc, final MultiRequest request)<a name="line.2695"></a>
+<span class="sourceLineNo">2696</span>      throws ServiceException {<a name="line.2696"></a>
+<span class="sourceLineNo">2697</span>    try {<a name="line.2697"></a>
+<span class="sourceLineNo">2698</span>      checkOpen();<a name="line.2698"></a>
+<span class="sourceLineNo">2699</span>    } catch (IOException ie) {<a name="line.2699"></a>
+<span class="sourceLineNo">2700</span>      throw new ServiceException(ie);<a name="line.2700"></a>
+<span class="sourceLineNo">2701</span>    }<a name="line.2701"></a>
 <span class="sourceLineNo">2702</span><a name="line.2702"></a>
-<span class="sourceLineNo">2703</span>    // rpc controller is how we bring in data via the back door;  it is unprotobuf'ed data.<a name="line.2703"></a>
-<span class="sourceLineNo">2704</span>    // It is also the conduit via which we pass back data.<a name="line.2704"></a>
-<span class="sourceLineNo">2705</span>    HBaseRpcController controller = (HBaseRpcController)rpcc;<a name="line.2705"></a>
-<span class="sourceLineNo">2706</span>    CellScanner cellScanner = controller != null ? controller.cellScanner(): null;<a name="line.2706"></a>
-<span class="sourceLineNo">2707</span>    if (controller != null) {<a name="line.2707"></a>
-<span class="sourceLineNo">2708</span>      controller.setCellScanner(null);<a name="line.2708"></a>
-<span class="sourceLineNo">2709</span>    }<a name="line.2709"></a>
-<span class="sourceLineNo">2710</span><a name="line.2710"></a>
-<span class="sourceLineNo">2711</span>    long nonceGroup = request.hasNonceGroup() ? request.getNonceGroup() : HConstants.NO_NONCE;<a name="line.2711"></a>
+<span class="sourceLineNo">2703</span>    checkBatchSizeAndLogLargeSize(request);<a name="line.2703"></a>
+<span class="sourceLineNo">2704</span><a name="line.2704"></a>
+<span class="sourceLineNo">2705</span>    // rpc controller is how we bring in data via the back door;  it is unprotobuf'ed data.<a name="line.2705"></a>
+<span class="sourceLineNo">2706</span>    // It is also the conduit via which we pass back data.<a name="line.2706"></a>
+<span class="sourceLineNo">2707</span>    HBaseRpcController controller = (HBaseRpcController)rpcc;<a name="line.2707"></a>
+<span class="sourceLineNo">2708</span>    CellScanner cellScanner = controller != null ? controller.cellScanner(): null;<a name="line.2708"></a>
+<span class="sourceLineNo">2709</span>    if (controller != null) {<a name="line.2709"></a>
+<span class="sourceLineNo">2710</span>      controller.setCellScanner(null);<a name="line.2710"></a>
+<span class="sourceLineNo">2711</span>    }<a name="line.2711"></a>
 <span class="sourceLineNo">2712</span><a name="line.2712"></a>
-<span class="sourceLineNo">2713</span>    // this will contain all the cells that we need to return. It's created later, if needed.<a name="line.2713"></a>
-<span class="sourceLineNo">2714</span>    List&lt;CellScannable&gt; cellsToReturn = null;<a name="line.2714"></a>
-<span class="sourceLineNo">2715</span>    MultiResponse.Builder responseBuilder = MultiResponse.newBuilder();<a name="line.2715"></a>
-<span class="sourceLineNo">2716</span>    RegionActionResult.Builder regionActionResultBuilder = RegionActionResult.newBuilder();<a name="line.2716"></a>
-<span class="sourceLineNo">2717</span>    Boolean processed = null;<a name="line.2717"></a>
-<span class="sourceLineNo">2718</span>    RegionScannersCloseCallBack closeCallBack = null;<a name="line.2718"></a>
-<span class="sourceLineNo">2719</span>    RpcCallContext context = RpcServer.getCurrentCall().orElse(null);<a name="line.2719"></a>
-<span class="sourceLineNo">2720</span>    this.rpcMultiRequestCount.increment();<a name="line.2720"></a>
-<span class="sourceLineNo">2721</span>    this.requestCount.increment();<a name="line.2721"></a>
-<span class="sourceLineNo">2722</span>    Map&lt;RegionSpecifier, ClientProtos.RegionLoadStats&gt; regionStats = new HashMap&lt;&gt;(request<a name="line.2722"></a>
-<span class="sourceLineNo">2723</span>      .getRegionActionCount());<a name="line.2723"></a>
-<span class="sourceLineNo">2724</span>    ActivePolicyEnforcement spaceQuotaEnforcement = getSpaceQuotaManager().getActiveEnforcements();<a name="line.2724"></a>
-<span class="sourceLineNo">2725</span>    for (RegionAction regionAction : request.getRegionActionList()) {<a name="line.2725"></a>
-<span class="sourceLineNo">2726</span>      OperationQuota quota;<a name="line.2726"></a>
-<span class="sourceLineNo">2727</span>      HRegion region;<a name="line.2727"></a>
-<span class="sourceLineNo">2728</span>      regionActionResultBuilder.clear();<a name="line.2728"></a>
-<span class="sourceLineNo">2729</span>      RegionSpecifier regionSpecifier = regionAction.getRegion();<a name="line.2729"></a>
-<span class="sourceLineNo">2730</span>      try {<a name="line.2730"></a>
-<span class="sourceLineNo">2731</span>        region = getRegion(regionSpecifier);<a name="line.2731"></a>
-<span class="sourceLineNo">2732</span>        quota = getRpcQuotaManager().checkQuota(region, regionAction.getActionList());<a name="line.2732"></a>
-<span class="sourceLineNo">2733</span>      } catch (IOException e) {<a name="line.2733"></a>
-<span class="sourceLineNo">2734</span>        failRegionAction(responseBuilder, regionActionResultBuilder, regionAction, cellScanner, e);<a name="line.2734"></a>
-<span class="sourceLineNo">2735</span>        continue;  // For this region it's a failure.<a name="line.2735"></a>
-<span class="sourceLineNo">2736</span>      }<a name="line.2736"></a>
-<span class="sourceLineNo">2737</span>      boolean rejectIfFromClient = shouldRejectRequestsFromClient(region);<a name="line.2737"></a>
-<span class="sourceLineNo">2738</span>      if (regionAction.hasAtomic() &amp;&amp; regionAction.getAtomic()) {<a name="line.2738"></a>
-<span class="sourceLineNo">2739</span>        // We only allow replication in standby state and it will not set the atomic flag.<a name="line.2739"></a>
-<span class="sourceLineNo">2740</span>        if (rejectIfFromClient) {<a name="line.2740"></a>
-<span class="sourceLineNo">2741</span>          failRegionAction(responseBuilder, regionActionResultBuilder, regionAction, cellScanner,<a name="line.2741"></a>
-<span class="sourceLineNo">2742</span>            new DoNotRetryIOException(<a name="line.2742"></a>
-<span class="sourceLineNo">2743</span>              region.getRegionInfo().getRegionNameAsString() + " is in STANDBY state"));<a name="line.2743"></a>
-<span class="sourceLineNo">2744</span>          quota.close();<a name="line.2744"></a>
-<span class="sourceLineNo">2745</span>          continue;<a name="line.2745"></a>
-<span class="sourceLineNo">2746</span>        }<a name="line.2746"></a>
-<span class="sourceLineNo">2747</span>        // How does this call happen?  It may need some work to play well w/ the surroundings.<a name="line.2747"></a>
-<span class="sourceLineNo">2748</span>        // Need to return an item per Action along w/ Action index.  TODO.<a name="line.2748"></a>
-<span class="sourceLineNo">2749</span>        try {<a name="line.2749"></a>
-<span class="sourceLineNo">2750</span>          if (request.hasCondition()) {<a name="line.2750"></a>
-<span class="sourceLineNo">2751</span>            Condition condition = request.getCondition();<a name="line.2751"></a>
-<span class="sourceLineNo">2752</span>            byte[] row = condition.getRow().toByteArray();<a name="line.2752"></a>
-<span class="sourceLineNo">2753</span>            byte[] family = condition.getFamily().toByteArray();<a name="line.2753"></a>
-<span class="sourceLineNo">2754</span>            byte[] qualifier = condition.getQualifier().toByteArray();<a name="line.2754"></a>
-<span class="sourceLineNo">2755</span>            CompareOperator op =<a name="line.2755"></a>
-<span class="sourceLineNo">2756</span>              CompareOperator.valueOf(condition.getCompareType().name());<a name="line.2756"></a>
-<span class="sourceLineNo">2757</span>            ByteArrayComparable comparator =<a name="line.2757"></a>
-<span class="sourceLineNo">2758</span>                ProtobufUtil.toComparator(condition.getComparator());<a name="line.2758"></a>
-<span class="sourceLineNo">2759</span>            TimeRange timeRange = condition.hasTimeRange() ?<a name="line.2759"></a>
-<span class="sourceLineNo">2760</span>              ProtobufUtil.toTimeRange(condition.getTimeRange()) :<a name="line.2760"></a>
-<span class="sourceLineNo">2761</span>              TimeRange.allTime();<a name="line.2761"></a>
-<span class="sourceLineNo">2762</span>            processed =<a name="line.2762"></a>
-<span class="sourceLineNo">2763</span>              checkAndRowMutate(region, regionAction.getActionList(), cellScanner, row, family,<a name="line.2763"></a>
-<span class="sourceLineNo">2764</span>                qualifier, op, comparator, timeRange, regionActionResultBuilder,<a name="line.2764"></a>
-<span class="sourceLineNo">2765</span>                spaceQuotaEnforcement);<a name="line.2765"></a>
-<span class="sourceLineNo">2766</span>          } else {<a name="line.2766"></a>
-<span class="sourceLineNo">2767</span>            doAtomicBatchOp(regionActionResultBuilder, region, quota, regionAction.getActionList(),<a name="line.2767"></a>
-<span class="sourceLineNo">2768</span>              cellScanner, spaceQuotaEnforcement);<a name="line.2768"></a>
-<span class="sourceLineNo">2769</span>            processed = Boolean.TRUE;<a name="line.2769"></a>
-<span class="sourceLineNo">2770</span>          }<a name="line.2770"></a>
-<span class="sourceLineNo">2771</span>        } catch (IOException e) {<a name="line.2771"></a>
-<span class="sourceLineNo">2772</span>          rpcServer.getMetrics().exception(e);<a name="line.2772"></a>
-<span class="sourceLineNo">2773</span>          // As it's atomic, we may expect it's a global failure.<a name="line.2773"></a>
-<span class="sourceLineNo">2774</span>          regionActionResultBuilder.setException(ResponseConverter.buildException(e));<a name="line.2774"></a>
-<span class="sourceLineNo">2775</span>        }<a name="line.2775"></a>
-<span class="sourceLineNo">2776</span>      } else {<a name="line.2776"></a>
-<span class="sourceLineNo">2777</span>        if (rejectIfFromClient &amp;&amp; regionAction.getActionCount() &gt; 0 &amp;&amp;<a name="line.2777"></a>
-<span class="sourceLineNo">2778</span>          !isReplicationRequest(regionAction.getAction(0))) {<a name="line.2778"></a>
-<span class="sourceLineNo">2779</span>          // fail if it is not a replication request<a name="line.2779"></a>
-<span class="sourceLineNo">2780</span>          failRegionAction(responseBuilder, regionActionResultBuilder, regionAction, cellScanner,<a name="line.2780"></a>
-<span class="sourceLineNo">2781</span>            new DoNotRetryIOException(<a name="line.2781"></a>
-<span class="sourceLineNo">2782</span>              region.getRegionInfo().getRegionNameAsString() + " is in STANDBY state"));<a name="line.2782"></a>
-<span class="sourceLineNo">2783</span>          quota.close();<a name="line.2783"></a>
-<span class="sourceLineNo">2784</span>          continue;<a name="line.2784"></a>
-<span class="sourceLineNo">2785</span>        }<a name="line.2785"></a>
-<span class="sourceLineNo">2786</span>        // doNonAtomicRegionMutation manages the exception internally<a name="line.2786"></a>
-<span class="sourceLineNo">2787</span>        if (context != null &amp;&amp; closeCallBack == null) {<a name="line.2787"></a>
-<span class="sourceLineNo">2788</span>          // An RpcCallBack that creates a list of scanners that needs to perform callBack<a name="line.2788"></a>
-<span class="sourceLineNo">2789</span>          // operation on completion of multiGets.<a name="line.2789"></a>
-<span class="sourceLineNo">2790</span>          // Set this only once<a name="line.2790"></a>
-<span class="sourceLineNo">2791</span>          closeCallBack = new RegionScannersCloseCallBack();<a name="line.2791"></a>
-<span class="sourceLineNo">2792</span>          context.setCallBack(closeCallBack);<a name="line.2792"></a>
-<span class="sourceLineNo">2793</span>        }<a name="line.2793"></a>
-<span class="sourceLineNo">2794</span>        cellsToReturn = doNonAtomicRegionMutation(region, quota, regionAction, cellScanner,<a name="line.2794"></a>
-<span class="sourceLineNo">2795</span>            regionActionResultBuilder, cellsToReturn, nonceGroup, closeCallBack, context,<a name="line.2795"></a>
-<span class="sourceLineNo">2796</span>            spaceQuotaEnforcement);<a name="line.2796"></a>
-<span class="sourceLineNo">2797</span>      }<a name="line.2797"></a>
-<span class="sourceLineNo">2798</span>      responseBuilder.addRegionActionResult(regionActionResultBuilder.build());<a name="line.2798"></a>
-<span class="sourceLineNo">2799</span>      quota.close();<a name="line.2799"></a>
-<span class="sourceLineNo">2800</span>      ClientProtos.RegionLoadStats regionLoadStats = region.getLoadStatistics();<a name="line.2800"></a>
-<span class="sourceLineNo">2801</span>      if (regionLoadStats != null) {<a name="line.2801"></a>
-<span class="sourceLineNo">2802</span>        regionStats.put(regionSpecifier, regionLoadStats);<a name="line.2802"></a>
-<span class="sourceLineNo">2803</span>      }<a name="line.2803"></a>
-<span class="sourceLineNo">2804</span>    }<a name="line.2804"></a>
-<span class="sourceLineNo">2805</span>    // Load the controller with the Cells to return.<a name="line.2805"></a>
-<span class="sourceLineNo">2806</span>    if (cellsToReturn != null &amp;&amp; !cellsToReturn.isEmpty() &amp;&amp; controller != null) {<a name="line.2806"></a>
-<span class="sourceLineNo">2807</span>      controller.setCellScanner(CellUtil.createCellScanner(cellsToReturn));<a name="line.2807"></a>
-<span class="sourceLineNo">2808</span>    }<a name="line.2808"></a>
-<span class="sourceLineNo">2809</span><a name="line.2809"></a>
-<span class="sourceLineNo">2810</span>    if (processed != null) {<a name="line.2810"></a>
-<span class="sourceLineNo">2811</span>      responseBuilder.setProcessed(processed);<a name="line.2811"></a>
-<span class="sourceLineNo">2812</span>    }<a name="line.2812"></a>
-<span class="sourceLineNo">2813</span><a name="line.2813"></a>
-<span class="sourceLineNo">2814</span>    MultiRegionLoadStats.Builder builder = MultiRegionLoadStats.newBuilder();<a name="line.2814"></a>
-<span class="sourceLineNo">2815</span>    for(Entry&lt;RegionSpecifier, ClientProtos.RegionLoadStats&gt; stat: regionStats.entrySet()){<a name="line.2815"></a>
-<span class="sourceLineNo">2816</span>      builder.addRegion(stat.getKey());<a name="line.2816"></a>
-<span class="sourceLineNo">2817</span>      builder.addStat(stat.getValue());<a name="line.2817"></a>
-<span class="sourceLineNo">2818</span>    }<a name="line.2818"></a>
-<span class="sourceLineNo">2819</span>    responseBuilder.setRegionStatistics(builder);<a name="line.2819"></a>
-<span class="sourceLineNo">2820</span>    return responseBuilder.build();<a name="line.2820"></a>
-<span class="sourceLineNo">2821</span>  }<a name="line.2821"></a>
-<span class="sourceLineNo">2822</span><a name="line.2822"></a>
-<span class="sourceLineNo">2823</span>  private void skipCellsForMutations(List&lt;Action&gt; actions, CellScanner cellScanner) {<a name="line.2823"></a>
-<span class="sourceLineNo">2824</span>    if (cellScanner == null) {<a name="line.2824"></a>
-<span class="sourceLineNo">2825</span>      return;<a name="line.2825"></a>
-<span class="sourceLineNo">2826</span>    }<a name="line.2826"></a>
-<span class="sourceLineNo">2827</span>    for (Action action : actions) {<a name="line.2827"></a>
-<span class="sourceLineNo">2828</span>      skipCellsForMutation(action, cellScanner);<a name="line.2828"></a>
-<span class="sourceLineNo">2829</span>    }<a name="line.2829"></a>
-<span class="sourceLineNo">2830</span>  }<a name="line.2830"></a>
-<span class="sourceLineNo">2831</span><a name="line.2831"></a>
-<span class="sourceLineNo">2832</span>  private void skipCellsForMutation(Action action, CellScanner cellScanner) {<a name="line.2832"></a>
-<span class="sourceLineNo">2833</span>    if (cellScanner == null) {<a name="line.2833"></a>
-<span class="sourceLineNo">2834</span>      return;<a name="line.2834"></a>
-<span class="sourceLineNo">2835</span>    }<a name="line.2835"></a>
-<span class="sourceLineNo">2836</span>    try {<a name="line.2836"></a>
-<span class="sourceLineNo">2837</span>      if (action.hasMutation()) {<a name="line.2837"></a>
-<span class="sourceLineNo">2838</span>        MutationProto m = action.getMutation();<a name="line.2838"></a>
-<span class="sourceLineNo">2839</span>        if (m.hasAssociatedCellCount()) {<a name="line.2839"></a>
-<span class="sourceLineNo">2840</span>          for (int i = 0; i &lt; m.getAssociatedCellCount(); i++) {<a name="line.2840"></a>
-<span class="sourceLineNo">2841</span>            cellScanner.advance();<a name="line.2841"></a>
-<span class="sourceLineNo">2842</span>          }<a name="line.2842"></a>
-<span class="sourceLineNo">2843</span>        }<a name="line.2843"></a>
-<span class="sourceLineNo">2844</span>      }<a name="line.2844"></a>
-<span class="sourceLineNo">2845</span>    } catch (IOException e) {<a name="line.2845"></a>
-<span class="sourceLineNo">2846</span>      // No need to handle these Individual Muatation level issue. Any way this entire RegionAction<a name="line.2846"></a>
-<span class="sourceLineNo">2847</span>      // marked as failed as we could not see the Region here. At client side the top level<a name="line.2847"></a>
-<span class="sourceLineNo">2848</span>      // RegionAction exception will be considered first.<a name="line.2848"></a>
-<span class="sourceLineNo">2849</span>      LOG.error("Error while skipping Cells in CellScanner for invalid Region Mutations", e);<a name="line.2849"></a>
-<span class="sourceLineNo">2850</span>    }<a name="line.2850"></a>
-<span class="sourceLineNo">2851</span>  }<a name="line.2851"></a>
-<span class="sourceLineNo">2852</span><a name="line.2852"></a>
-<span class="sourceLineNo">2853</span>  /**<a name="line.2853"></a>
-<span class="sourceLineNo">2854</span>   * Mutate data in a table.<a name="line.2854"></a>
-<span class="sourceLineNo">2855</span>   *<a name="line.2855"></a>
-<span class="sourceLineNo">2856</span>   * @param rpcc the RPC controller<a name="line.2856"></a>
-<span class="sourceLineNo">2857</span>   * @param request the mutate request<a name="line.2857"></a>
-<span class="sourceLineNo">2858</span>   */<a name="line.2858"></a>
-<span class="sourceLineNo">2859</span>  @Override<a name="line.2859"></a>
-<span class="sourceLineNo">2860</span>  public MutateResponse mutate(final RpcController rpcc, final MutateRequest request)<a name="line.2860"></a>
-<span class="sourceLineNo">2861</span>      throws ServiceException {<a name="line.2861"></a>
-<span class="sourceLineNo">2862</span>    // rpc controller is how we bring in data via the back door;  it is unprotobuf'ed data.<a name="line.2862"></a>
-<span class="sourceLineNo">2863</span>    // It is also the conduit via which we pass back data.<a name="line.2863"></a>
-<span class="sourceLineNo">2864</span>    HBaseRpcController controller = (HBaseRpcController)rpcc;<a name="line.2864"></a>
-<span class="sourceLineNo">2865</span>    CellScanner cellScanner = controller != null ? controller.cellScanner() : null;<a name="line.2865"></a>
-<span class="sourceLineNo">2866</span>    OperationQuota quota = null;<a name="line.2866"></a>
-<span class="sourceLineNo">2867</span>    RpcCallContext context = RpcServer.getCurrentCall().orElse(null);<a name="line.2867"></a>
-<span class="sourceLineNo">2868</span>    ActivePolicyEnforcement spaceQuotaEnforcement = null;<a name="line.2868"></a>
-<span class="sourceLineNo">2869</span>    MutationType type = null;<a name="line.2869"></a>
-<span class="sourceLineNo">2870</span>    HRegion region = null;<a name="line.2870"></a>
-<span class="sourceLineNo">2871</span>    long before = EnvironmentEdgeManager.currentTime();<a name="line.2871"></a>
-<span class="sourceLineNo">2872</span>    // Clear scanner so we are not holding on to reference across call.<a name="line.2872"></a>
-<span class="sourceLineNo">2873</span>    if (controller != null) {<a name="line.2873"></a>
-<span class="sourceLineNo">2874</span>      controller.setCellScanner(null);<a name="line.2874"></a>
-<span class="sourceLineNo">2875</span>    }<a name="line.2875"></a>
-<span class="sourceLineNo">2876</span>    try {<a name="line.2876"></a>
-<span class="sourceLineNo">2877</span>      checkOpen();<a name="line.2877"></a>
-<span class="sourceLineNo">2878</span>      requestCount.increment();<a name="line.2878"></a>
-<span class="sourceLineNo">2879</span>      rpcMutateRequestCount.increment();<a name="line.2879"></a>
-<span class="sourceLineNo">2880</span>      region = getRegion(request.getRegion());<a name="line.2880"></a>
-<span class="sourceLineNo">2881</span>      rejectIfInStandByState(region);<a name="line.2881"></a>
-<span class="sourceLineNo">2882</span>      MutateResponse.Builder builder = MutateResponse.newBuilder();<a name="line.2882"></a>
-<span class="sourceLineNo">2883</span>      MutationProto mutation = request.getMutation();<a name="line.2883"></a>
-<span class="sourceLineNo">2884</span>      if (!region.getRegionInfo().isMetaRegion()) {<a name="line.2884"></a>
-<span class="sourceLineNo">2885</span>        regionServer.cacheFlusher.reclaimMemStoreMemory();<a name="line.2885"></a>
-<span class="sourceLineNo">2886</span>      }<a name="line.2886"></a>
-<span class="sourceLineNo">2887</span>      long nonceGroup = request.hasNonceGroup() ? request.getNonceGroup() : HConstants.NO_NONCE;<a name="line.2887"></a>
-<span class="sourceLineNo">2888</span>      Result r = null;<a name="line.2888"></a>
-<span class="sourceLineNo">2889</span>      Boolean processed = null;<a name="line.2889"></a>
-<span class="sourceLineNo">2890</span>      type = mutation.getMutateType();<a name="line.2890"></a>
-<span class="sourceLineNo">2891</span><a name="line.2891"></a>
-<span class="sourceLineNo">2892</span>      quota = getRpcQuotaManager().checkQuota(region, OperationQuota.OperationType.MUTATE);<a name="line.2892"></a>
-<span class="sourceLineNo">2893</span>      spaceQuotaEnforcement = getSpaceQuotaManager().getActiveEnforcements();<a name="line.2893"></a>
-<span class="sourceLineNo">2894</span><a name="line.2894"></a>
-<span class="sourceLineNo">2895</span>      switch (type) {<a name="line.2895"></a>
-<span class="sourceLineNo">2896</span>        case APPEND:<a name="line.2896"></a>
-<span class="sourceLineNo">2897</span>          // TODO: this doesn't actually check anything.<a name="line.2897"></a>
-<span class="sourceLineNo">2898</span>          r = append(region, quota, mutation, cellScanner, nonceGroup, spaceQuotaEnforcement);<a name="line.2898"></a>
-<span class="sourceLineNo">2899</span>          break;<a name="line.2899"></a>
-<span class="sourceLineNo">2900</span>        case INCREMENT:<a name="line.2900"></a>
-<span class="sourceLineNo">2901</span>          // TODO: this doesn't actually check anything.<a name="line.2901"></a>
-<span class="sourceLineNo">2902</span>          r = increment(region, quota, mutation, cellScanner, nonceGroup, spaceQuotaEnforcement);<a name="line.2902"></a>
-<span class="sourceLineNo">2903</span>          break;<a name="line.2903"></a>
-<span class="sourceLineNo">2904</span>        case PUT:<a name="line.2904"></a>
-<span class="sourceLineNo">2905</span>          Put put = ProtobufUtil.toPut(mutation, cellScanner);<a name="line.2905"></a>
-<span class="sourceLineNo">2906</span>          checkCellSizeLimit(region, put);<a name="line.2906"></a>
-<span class="sourceLineNo">2907</span>          // Throws an exception when violated<a name="line.2907"></a>
-<span class="sourceLineNo">2908</span>          spaceQuotaEnforcement.getPolicyEnforcement(region).check(put);<a name="line.2908"></a>
-<span class="sourceLineNo">2909</span>          quota.addMutation(put);<a name="line.2909"></a>
-<span class="sourceLineNo">2910</span>          if (request.hasCondition()) {<a name="line.2910"></a>
-<span class="sourceLineNo">2911</span>            Condition condition = request.getCondition();<a name="line.2911"></a>
-<span class="sourceLineNo">2912</span>            byte[] row = condition.getRow().toByteArray();<a name="line.2912"></a>
-<span class="sourceLineNo">2913</span>            byte[] family = condition.getFamily().toByteArray();<a name="line.2913"></a>
-<span class="sourceLineNo">2914</span>            byte[] qualifier = condition.getQualifier().toByteArray();<a name="line.2914"></a>
-<span class="sourceLineNo">2915</span>            CompareOperator compareOp =<a name="line.2915"></a>
-<span class="sourceLineNo">2916</span>              CompareOperator.valueOf(condition.getCompareType().name());<a name="line.2916"></a>
-<span class="sourceLineNo">2917</span>            ByteArrayComparable comparator = ProtobufUtil.toComparator(condition.getComparator());<a name="line.2917"></a>
-<span class="sourceLineNo">2918</span>            TimeRange timeRange = condition.hasTimeRange() ?<a name="line.2918"></a>
-<span class="sourceLineNo">2919</span>              ProtobufUtil.toTimeRange(condition.getTimeRange()) :<a name="line.2919"></a>
-<span class="sourceLineNo">2920</span>              TimeRange.allTime();<a name="line.2920"></a>
-<span class="sourceLineNo">2921</span>            if (region.getCoprocessorHost() != null) {<a name="line.2921"></a>
-<span class="sourceLineNo">2922</span>              processed = region.getCoprocessorHost().preCheckAndPut(row, family, qualifier,<a name="line.2922"></a>
-<span class="sourceLineNo">2923</span>                  compareOp, comparator, put);<a name="line.2923"></a>
-<span class="sourceLineNo">2924</span>            }<a name="line.2924"></a>
-<span class="sourceLineNo">2925</span>            if (processed == null) {<a name="line.2925"></a>
-<span class="sourceLineNo">2926</span>              boolean result = region.checkAndMutate(row, family,<a name="line.2926"></a>
-<span class="sourceLineNo">2927</span>                qualifier, compareOp, comparator, timeRange, put);<a name="line.2927"></a>
-<span class="sourceLineNo">2928</span>              if (region.getCoprocessorHost() != null) {<a name="line.2928"></a>
-<span class="sourceLineNo">2929</span>                result = region.getCoprocessorHost().postCheckAndPut(row, family,<a name="line.2929"></a>
-<span class="sourceLineNo">2930</span>                  qualifier, compareOp, comparator, put, result);<a name="line.2930"></a>
-<span class="sourceLineNo">2931</span>              }<a name="line.2931"></a>
-<span class="sourceLineNo">2932</span>              processed = result;<a name="line.2932"></a>
-<span class="sourceLineNo">2933</span>            }<a name="line.2933"></a>
-<span class="sourceLineNo">2934</span>          } else {<a name="line.2934"></a>
-<span class="sourceLineNo">2935</span>            region.put(put);<a name="line.2935"></a>
-<span class="sourceLineNo">2936</span>            processed = Boolean.TRUE;<a name="line.2936"></a>
-<span class="sourceLineNo">2937</span>          }<a name="line.2937"></a>
-<span class="sourceLineNo">2938</span>          break;<a name="line.2938"></a>
-<span class="sourceLineNo">2939</span>        case DELETE:<a name="line.2939"></a>
-<span class="sourceLineNo">2940</span>          Delete delete = ProtobufUtil.toDelete(mutation, cellScanner);<a name="line.2940"></a>
-<span class="sourceLineNo">2941</span>          checkCellSizeLimit(region, delete);<a name="line.2941"></a>
-<span class="sourceLineNo">2942</span>          spaceQuotaEnforcement.getPolicyEnforcement(region).check(delete);<a name="line.2942"></a>
-<span class="sourceLineNo">2943</span>          quota.addMutation(delete);<a name="line.2943"></a>
-<span class="sourceLineNo">2944</span>          if (request.hasCondition()) {<a name="line.2944"></a>
-<span class="sourceLineNo">2945</span>            Condition condition = request.getCondition();<a name="line.2945"></a>
-<span class="sourceLineNo">2946</span>            byte[] row = condition.getRow().toByteArray();<a name="line.2946"></a>
-<span class="sourceLineNo">2947</span>            byte[] family = condition.getFamily().toByteArray();<a name="line.2947"></a>
-<span class="sourceLineNo">2948</span>            byte[] qualifier = condition.getQualifier().toByteArray();<a name="line.2948"></a>
-<span class="sourceLineNo">2949</span>            CompareOperator op = CompareOperator.valueOf(condition.getCompareType().name());<a name="line.2949"></a>
-<span class="sourceLineNo">2950</span>            ByteArrayComparable comparator = ProtobufUtil.toComparator(condition.getComparator());<a name="line.2950"></a>
-<span class="sourceLineNo">2951</span>            TimeRange timeRange = condition.hasTimeRange() ?<a name="line.2951"></a>
-<span class="sourceLineNo">2952</span>              ProtobufUtil.toTimeRange(condition.getTimeRange()) :<a name="line.2952"></a>
-<span class="sourceLineNo">2953</span>              TimeRange.allTime();<a name="line.2953"></a>
-<span class="sourceLineNo">2954</span>            if (region.getCoprocessorHost() != null) {<a name="line.2954"></a>
-<span class="sourceLineNo">2955</span>              processed = region.getCoprocessorHost().preCheckAndDelete(row, family, qualifier, op,<a name="line.2955"></a>
-<span class="sourceLineNo">2956</span>                  comparator, delete);<a name="line.2956"></a>
-<span class="sourceLineNo">2957</span>            }<a name="line.2957"></a>
-<span class="sourceLineNo">2958</span>            if (processed == null) {<a name="line.2958"></a>
-<span class="sourceLineNo">2959</span>              boolean result = region.checkAndMutate(row, family,<a name="line.2959"></a>
-<span class="sourceLineNo">2960</span>                qualifier, op, comparator, timeRange, delete);<a name="line.2960"></a>
-<span class="sourceLineNo">2961</span>              if (region.getCoprocessorHost() != null) {<a name="line.2961"></a>
-<span class="sourceLineNo">2962</span>                result = region.getCoprocessorHost().postCheckAndDelete(row, family,<a name="line.2962"></a>
-<span class="sourceLineNo">2963</span>                  qualifier, op, comparator, delete, result);<a name="line.2963"></a>
-<span class="sourceLineNo">2964</span>              }<a name="line.2964"></a>
-<span class="sourceLineNo">2965</span>              processed = result;<a name="line.2965"></a>
-<span class="sourceLineNo">2966</span>            }<a name="line.2966"></a>
-<span class="sourceLineNo">2967</span>          } else {<a name="line.2967"></a>
-<span class="sourceLineNo">2968</span>            region.delete(delete);<a name="line.2968"></a>
-<span class="sourceLineNo">2969</span>            processed = Boolean.TRUE;<a name="line.2969"></a>
-<span class="sourceLineNo">2970</span>          }<a name="line.2970"></a>
-<span class="sourceLineNo">2971</span>          break;<a name="line.2971"></a>
-<span class="sourceLineNo">2972</span>        default:<a name="line.2972"></a>
-<span class="sourceLineNo">2973</span>          throw new DoNotRetryIOException("Unsupported mutate type: " + type.name());<a name="line.2973"></a>
-<span class="sourceLineNo">2974</span>      }<a name="line.2974"></a>
-<span class="sourceLineNo">2975</span>      if (processed != null) {<a name="line.2975"></a>
-<span class="sourceLineNo">2976</span>        builder.setProcessed(processed.booleanValue());<a name="line.2976"></a>
-<span class="sourceLineNo">2977</span>      }<a name="line.2977"></a>
-<span class="sourceLineNo">2978</span>      boolean clientCellBlockSupported = isClientCellBlockSupport(context);<a name="line.2978"></a>
-<span class="sourceLineNo">2979</span>      addResult(builder, r, controller, clientCellBlockSupported);<a name="line.2979"></a>
-<span class="sourceLineNo">2980</span>      if (clientCellBlockSupported) {<a name="line.2980"></a>
-<span class="sourceLineNo">2981</span>        addSize(context, r, null);<a name="line.2981"></a>
-<span class="sourceLineNo">2982</span>      }<a name="line.2982"></a>
-<span class="sourceLineNo">2983</span>      return builder.build();<a name="line.2983"></a>
-<span class="sourceLineNo">2984</span>    } catch (IOException ie) {<a name="line.2984"></a>
-<span class="sourceLineNo">2985</span>      regionServer.checkFileSystem();<a name="line.2985"></a>
-<span class="sourceLineNo">2986</span>      throw new ServiceException(ie);<a name="line.2986"></a>
-<span class="sourceLineNo">2987</span>    } finally {<a name="line.2987"></a>
-<span class="sourceLineNo">2988</span>      if (quota != null) {<a name="line.2988"></a>
-<span class="sourceLineNo">2989</span>        quota.close();<a name="line.2989"></a>
-<span class="sourceLineNo">2990</span>      }<a name="line.2990"></a>
-<span class="sourceLineNo">2991</span>      // Update metrics<a name="line.2991"></a>
-<span class="sourceLineNo">2992</span>      if (regionServer.metricsRegionServer != null &amp;&amp; type != null) {<a name="line.2992"></a>
-<span class="sourceLineNo">2993</span>        long after = EnvironmentEdgeManager.currentTime();<a name="line.2993"></a>
-<span class="sourceLineNo">2994</span>        switch (type) {<a name="line.2994"></a>
-<span class="sourceLineNo">2995</span>        case DELETE:<a name="line.2995"></a>
-<span class="sourceLineNo">2996</span>          if (request.hasCondition()) {<a name="line.2996"></a>
-<span class="sourceLineNo">2997</span>            regionServer.metricsRegionServer.updateCheckAndDelete(after - before);<a name="line.2997"></a>
-<span class="sourceLineNo">2998</span>          } else {<a name="line.2998"></a>
-<span class="sourceLineNo">2999</span>            regionServer.metricsRegionServer.updateDelete(<a name="line.2999"></a>
-<span class="sourceLineNo">3000</span>                region == null ? null : region.getRegionInfo().getTable(), after - before);<a name="line.3000"></a>
-<span class="sourceLineNo">3001</span>          }<a name="line.3001"></a>
-<span class="sourceLineNo">3002</span>          break;<a name="line.3002"></a>
-<span class="sourceLineNo">3003</span>        case PUT:<a name="line.3003"></a>
-<span class="sourceLineNo">3004</span>          if (request.hasCondition()) {<a name="line.3004"></a>
-<span class="sourceLineNo">3005</span>            regionServer.metricsRegionServer.updateCheckAndPut(after - before);<a name="line.3005"></a>
-<span class="sourceLineNo">3006</span>          } else {<a name="line.3006"></a>
-<span class="sourceLineNo">3007</span>            regionServer.metricsRegionServer.updatePut(<a name="line.3007"></a>
-<span class="sourceLineNo">3008</span>                region == null ? null : region.getRegionInfo().getTable(),after - before);<a name="line.3008"></a>
-<span class="sourceLineNo">3009</span>          }<a name="line.3009"></a>
-<span class="sourceLineNo">3010</span>          break;<a name="line.3010"></a>
-<span class="sourceLineNo">3011</span>        default:<a name="line.3011"></a>
+<span class="sourceLineNo">2713</span>    long nonceGroup = request.hasNonceGroup() ? request.getNonceGroup() : HConstants.NO_NONCE;<a name="line.2713"></a>
+<span class="sourceLineNo">2714</span><a name="line.2714"></a>
+<span class="sourceLineNo">2715</span>    // this will contain all the cells that we need to return. It's created later, if needed.<a name="line.2715"></a>
+<span class="sourceLineNo">2716</span>    List&lt;CellScannable&gt; cellsToReturn = null;<a name="line.2716"></a>
+<span class="sourceLineNo">2717</span>    MultiResponse.Builder responseBuilder = MultiResponse.newBuilder();<a name="line.2717"></a>
+<span class="sourceLineNo">2718</span>    RegionActionResult.Builder regionActionResultBuilder = RegionActionResult.newBuilder();<a name="line.2718"></a>
+<span class="sourceLineNo">2719</span>    Boolean processed = null;<a name="line.2719"></a>
+<span class="sourceLineNo">2720</span>    RegionScannersCloseCallBack closeCallBack = null;<a name="line.2720"></a>
+<span class="sourceLineNo">2721</span>    RpcCallContext context = RpcServer.getCurrentCall().orElse(null);<a name="line.2721"></a>
+<span class="sourceLineNo">2722</span>    this.rpcMultiRequestCount.increment();<a name="line.2722"></a>
+<span class="sourceLineNo">2723</span>    this.requestCount.increment();<a name="line.2723"></a>
+<span class="sourceLineNo">2724</span>    Map&lt;RegionSpecifier, ClientProtos.RegionLoadStats&gt; regionStats = new HashMap&lt;&gt;(request<a name="line.2724"></a>
+<span class="sourceLineNo">2725</span>      .getRegionActionCount());<a name="line.2725"></a>
+<span class="sourceLineNo">2726</span>    ActivePolicyEnforcement spaceQuotaEnforcement = getSpaceQuotaManager().getActiveEnforcements();<a name="line.2726"></a>
+<span class="sourceLineNo">2727</span>    for (RegionAction regionAction : request.getRegionActionList()) {<a name="line.2727"></a>
+<span class="sourceLineNo">2728</span>      OperationQuota quota;<a name="line.2728"></a>
+<span class="sourceLineNo">2729</span>      HRegion region;<a name="line.2729"></a>
+<span class="sourceLineNo">2730</span>      regionActionResultBuilder.clear();<a name="line.2730"></a>
+<span class="sourceLineNo">2731</span>      RegionSpecifier regionSpecifier = regionAction.getRegion();<a name="line.2731"></a>
+<span class="sourceLineNo">2732</span>      try {<a name="line.2732"></a>
+<span class="sourceLineNo">2733</span>        region = getRegion(regionSpecifier);<a name="line.2733"></a>
+<span class="sourceLineNo">2734</span>        quota = getRpcQuotaManager().checkQuota(region, regionAction.getActionList());<a name="line.2734"></a>
+<span class="sourceLineNo">2735</span>      } catch (IOException e) {<a name="line.2735"></a>
+<span class="sourceLineNo">2736</span>        failRegionAction(responseBuilder, regionActionResultBuilder, regionAction, cellScanner, e);<a name="line.2736"></a>
+<span class="sourceLineNo">2737</span>        continue;  // For this region it's a failure.<a name="line.2737"></a>
+<span class="sourceLineNo">2738</span>      }<a name="line.2738"></a>
+<span class="sourceLineNo">2739</span>      boolean rejectIfFromClient = shouldRejectRequestsFromClient(region);<a name="line.2739"></a>
+<span class="sourceLineNo">2740</span>      if (regionAction.hasAtomic() &amp;&amp; regionAction.getAtomic()) {<a name="line.2740"></a>
+<span class="sourceLineNo">2741</span>        // We only allow replication in standby state and it will not set the atomic flag.<a name="line.2741"></a>
+<span class="sourceLineNo">2742</span>        if (rejectIfFromClient) {<a name="line.2742"></a>
+<span class="sourceLineNo">2743</span>          failRegionAction(responseBuilder, regionActionResultBuilder, regionAction, cellScanner,<a name="line.2743"></a>
+<span class="sourceLineNo">2744</span>            new DoNotRetryIOException(<a name="line.2744"></a>
+<span class="sourceLineNo">2745</span>              region.getRegionInfo().getRegionNameAsString() + " is in STANDBY state"));<a name="line.2745"></a>
+<span class="sourceLineNo">2746</span>          quota.close();<a name="line.2746"></a>
+<span class="sourceLineNo">2747</span>          continue;<a name="line.2747"></a>
+<span class="sourceLineNo">2748</span>        }<a name="line.2748"></a>
+<span class="sourceLineNo">2749</span>        // How does this call happen?  It may need some work to play well w/ the surroundings.<a name="line.2749"></a>
+<span class="sourceLineNo">2750</span>        // Need to return an item per Action along w/ Action index.  TODO.<a name="line.2750"></a>
+<span class="sourceLineNo">2751</span>        try {<a name="line.2751"></a>
+<span class="sourceLineNo">2752</span>          if (request.hasCondition()) {<a name="line.2752"></a>
+<span class="sourceLineNo">2753</span>            Condition condition = request.getCondition();<a name="line.2753"></a>
+<span class="sourceLineNo">2754</span>            byte[] row = condition.getRow().toByteArray();<a name="line.2754"></a>
+<span class="sourceLineNo">2755</span>            byte[] family = condition.getFamily().toByteArray();<a name="line.2755"></a>
+<span class="sourceLineNo">2756</span>            byte[] qualifier = condition.getQualifier().toByteArray();<a name="line.2756"></a>
+<span class="sourceLineNo">2757</span>            CompareOperator op =<a name="line.2757"></a>
+<span class="sourceLineNo">2758</span>              CompareOperator.valueOf(condition.getCompareType().name());<a name="line.2758"></a>
+<span class="sourceLineNo">2759</span>            ByteArrayComparable comparator =<a name="line.2759"></a>
+<span class="sourceLineNo">2760</span>                ProtobufUtil.toComparator(condition.getComparator());<a name="line.2760"></a>
+<span class="sourceLineNo">2761</span>            TimeRange timeRange = condition.hasTimeRange() ?<a name="line.2761"></a>
+<span class="sourceLineNo">2762</span>              ProtobufUtil.toTimeRange(condition.getTimeRange()) :<a name="line.2762"></a>
+<span class="sourceLineNo">2763</span>              TimeRange.allTime();<a name="line.2763"></a>
+<span class="sourceLineNo">2764</span>            processed =<a name="line.2764"></a>
+<span class="sourceLineNo">2765</span>              checkAndRowMutate(region, regionAction.getActionList(), cellScanner, row, family,<a name="line.2765"></a>
+<span class="sourceLineNo">2766</span>                qualifier, op, comparator, timeRange, regionActionResultBuilder,<a name="line.2766"></a>
+<span class="sourceLineNo">2767</span>                spaceQuotaEnforcement);<a name="line.2767"></a>
+<span class="sourceLineNo">2768</span>          } else {<a name="line.2768"></a>
+<span class="sourceLineNo">2769</span>            doAtomicBatchOp(regionActionResultBuilder, region, quota, regionAction.getActionList(),<a name="line.2769"></a>
+<span class="sourceLineNo">2770</span>              cellScanner, spaceQuotaEnforcement);<a name="line.2770"></a>
+<span class="sourceLineNo">2771</span>            processed = Boolean.TRUE;<a name="line.2771"></a>
+<span class="sourceLineNo">2772</span>          }<a name="line.2772"></a>
+<span class="sourceLineNo">2773</span>        } catch (IOException e) {<a name="line.2773"></a>
+<span class="sourceLineNo">2774</span>          rpcServer.getMetrics().exception(e);<a name="line.2774"></a>
+<span class="sourceLineNo">2775</span>          // As it's atomic, we may expect it's a global failure.<a name="line.2775"></a>
+<span class="sourceLineNo">2776</span>          regionActionResultBuilder.setException(ResponseConverter.buildException(e));<a name="line.2776"></a>
+<span class="sourceLineNo">2777</span>        }<a name="line.2777"></a>
+<span class="sourceLineNo">2778</span>      } else {<a name="line.2778"></a>
+<span class="sourceLineNo">2779</span>        if (rejectIfFromClient &amp;&amp; regionAction.getActionCount() &gt; 0 &amp;&amp;<a name="line.2779"></a>
+<span class="sourceLineNo">2780</span>          !isReplicationRequest(regionAction.getAction(0))) {<a name="line.2780"></a>
+<span class="sourceLineNo">2781</span>          // fail if it is not a replication request<a name="line.2781"></a>
+<span class="sourceLineNo">2782</span>          failRegionAction(responseBuilder, regionActionResultBuilder, regionAction, cellScanner,<a name="line.2782"></a>
+<span class="sourceLineNo">2783</span>            new DoNotRetryIOException(<a name="line.2783"></a>
+<span class="sourceLineNo">2784</span>              region.getRegionInfo().getRegionNameAsString() + " is in STANDBY state"));<a name="line.2784"></a>
+<span class="sourceLineNo">2785</span>          quota.close();<a name="line.2785"></a>
+<span class="sourceLineNo">2786</span>          continue;<a name="line.2786"></a>
+<span class="sourceLineNo">2787</span>        }<a name="line.2787"></a>
+<span class="sourceLineNo">2788</span>        // doNonAtomicRegionMutation manages the exception internally<a name="line.2788"></a>
+<span class="sourceLineNo">2789</span>        if (context != null &amp;&amp; closeCallBack == null) {<a name="line.2789"></a>
+<span class="sourceLineNo">2790</span>          // An RpcCallBack that creates a list of scanners that needs to perform callBack<a name="line.2790"></a>
+<span class="sourceLineNo">2791</span>          // operation on completion of multiGets.<a name="line.2791"></a>
+<span class="sourceLineNo">2792</span>          // Set this only once<a name="line.2792"></a>
+<span class="sourceLineNo">2793</span>          closeCallBack = new RegionScannersCloseCallBack();<a name="line.2793"></a>
+<span class="sourceLineNo">2794</span>          context.setCallBack(closeCallBack);<a name="line.2794"></a>
+<span class="sourceLineNo">2795</span>        }<a name="line.2795"></a>
+<span class="sourceLineNo">2796</span>        cellsToReturn = doNonAtomicRegionMutation(region, quota, regionAction, cellScanner,<a name="line.2796"></a>
+<span class="sourceLineNo">2797</span>            regionActionResultBuilder, cellsToReturn, nonceGroup, closeCallBack, context,<a name="line.2797"></a>
+<span class="sourceLineNo">2798</span>      

<TRUNCATED>

[41/46] hbase-site git commit: Published site at 05d22ed960204183fbd9bd16f1dbca6410ccde76.

Posted by gi...@apache.org.
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/3649682c/devapidocs/org/apache/hadoop/hbase/master/HMasterCommandLine.LocalHMaster.html
----------------------------------------------------------------------
diff --git a/devapidocs/org/apache/hadoop/hbase/master/HMasterCommandLine.LocalHMaster.html b/devapidocs/org/apache/hadoop/hbase/master/HMasterCommandLine.LocalHMaster.html
index db0f525..f7f743b 100644
--- a/devapidocs/org/apache/hadoop/hbase/master/HMasterCommandLine.LocalHMaster.html
+++ b/devapidocs/org/apache/hadoop/hbase/master/HMasterCommandLine.LocalHMaster.html
@@ -191,7 +191,7 @@ extends <a href="../../../../../org/apache/hadoop/hbase/master/HMaster.html" tit
 <!--   -->
 </a>
 <h3>Fields inherited from class&nbsp;org.apache.hadoop.hbase.master.<a href="../../../../../org/apache/hadoop/hbase/master/HMaster.html" title="class in org.apache.hadoop.hbase.master">HMaster</a></h3>
-<code><a href="../../../../../org/apache/hadoop/hbase/master/HMaster.html#catalogJanitorChore">catalogJanitorChore</a>, <a href="../../../../../org/apache/hadoop/hbase/master/HMaster.html#coprocessorServiceHandlers">coprocessorServiceHandlers</a>, <a href="../../../../../org/apache/hadoop/hbase/master/HMaster.html#cpHost">cpHost</a>, <a href="../../../../../org/apache/hadoop/hbase/master/HMaster.html#DEFAULT_HBASE_MASTER_WAIT_ON_SERVICE_IN_SECONDS">DEFAULT_HBASE_MASTER_WAIT_ON_SERVICE_IN_SECONDS</a>, <a href="../../../../../org/apache/hadoop/hbase/master/HMaster.html#HBASE_MASTER_WAIT_ON_SERVICE_IN_SECONDS">HBASE_MASTER_WAIT_ON_SERVICE_IN_SECONDS</a>, <a href="../../../../../org/apache/hadoop/hbase/master/HMaster.html#loadBalancerTracker">loadBalancerTracker</a>, <a href="../../../../../org/apache/hadoop/hbase/master/HMaster.html#MASTER">MASTER</a>, <a href="../../../../../org/apache/hadoop/hbase/master/HMaster.html#masterAddressSyncer">masterAddressSyncer</a>, <a href="../../../../
 ../org/apache/hadoop/hbase/master/HMaster.html#metaLocationSyncer">metaLocationSyncer</a>, <a href="../../../../../org/apache/hadoop/hbase/master/HMaster.html#metricsMaster">metricsMaster</a>, <a href="../../../../../org/apache/hadoop/hbase/master/HMaster.html#rsFatals">rsFatals</a>, <a href="../../../../../org/apache/hadoop/hbase/master/HMaster.html#serviceStarted">serviceStarted</a>, <a href="../../../../../org/apache/hadoop/hbase/master/HMaster.html#snapshotManager">snapshotManager</a></code></li>
+<code><a href="../../../../../org/apache/hadoop/hbase/master/HMaster.html#catalogJanitorChore">catalogJanitorChore</a>, <a href="../../../../../org/apache/hadoop/hbase/master/HMaster.html#coprocessorServiceHandlers">coprocessorServiceHandlers</a>, <a href="../../../../../org/apache/hadoop/hbase/master/HMaster.html#cpHost">cpHost</a>, <a href="../../../../../org/apache/hadoop/hbase/master/HMaster.html#DEFAULT_HBASE_MASTER_WAIT_ON_SERVICE_IN_SECONDS">DEFAULT_HBASE_MASTER_WAIT_ON_SERVICE_IN_SECONDS</a>, <a href="../../../../../org/apache/hadoop/hbase/master/HMaster.html#HBASE_MASTER_WAIT_ON_SERVICE_IN_SECONDS">HBASE_MASTER_WAIT_ON_SERVICE_IN_SECONDS</a>, <a href="../../../../../org/apache/hadoop/hbase/master/HMaster.html#loadBalancerTracker">loadBalancerTracker</a>, <a href="../../../../../org/apache/hadoop/hbase/master/HMaster.html#MAINTENANCE_MODE">MAINTENANCE_MODE</a>, <a href="../../../../../org/apache/hadoop/hbase/master/HMaster.html#MASTER">MASTER</a>, <a href="../../../../../org
 /apache/hadoop/hbase/master/HMaster.html#masterAddressSyncer">masterAddressSyncer</a>, <a href="../../../../../org/apache/hadoop/hbase/master/HMaster.html#metaLocationSyncer">metaLocationSyncer</a>, <a href="../../../../../org/apache/hadoop/hbase/master/HMaster.html#metricsMaster">metricsMaster</a>, <a href="../../../../../org/apache/hadoop/hbase/master/HMaster.html#rsFatals">rsFatals</a>, <a href="../../../../../org/apache/hadoop/hbase/master/HMaster.html#serviceStarted">serviceStarted</a>, <a href="../../../../../org/apache/hadoop/hbase/master/HMaster.html#snapshotManager">snapshotManager</a></code></li>
 </ul>
 <ul class="blockList">
 <li class="blockList"><a name="fields.inherited.from.class.org.apache.hadoop.hbase.regionserver.HRegionServer">

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/3649682c/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 2200db0..db4a0e1 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,"i14":6,"i15":6};
+var methods = {"i0":6,"i1":6,"i2":6,"i3":17,"i4":17,"i5":17,"i6":6,"i7":6,"i8":6,"i9":6,"i10":6,"i11":6,"i12":6,"i13":6,"i14":6,"i15":6,"i16":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";
@@ -198,78 +198,82 @@ extends org.apache.hadoop.conf.Configurable, <a href="../../../../../org/apache/
 </tr>
 <tr id="i3" class="rowColor">
 <td class="colFirst"><code>static boolean</code></td>
-<td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/master/LoadBalancer.html#isSystemTablesOnlyOnMaster-org.apache.hadoop.conf.Configuration-">isSystemTablesOnlyOnMaster</a></span>(org.apache.hadoop.conf.Configuration&nbsp;conf)</code>&nbsp;</td>
+<td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/master/LoadBalancer.html#isMasterCanHostUserRegions-org.apache.hadoop.conf.Configuration-">isMasterCanHostUserRegions</a></span>(org.apache.hadoop.conf.Configuration&nbsp;conf)</code>&nbsp;</td>
 </tr>
 <tr id="i4" class="altColor">
 <td class="colFirst"><code>static boolean</code></td>
-<td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/master/LoadBalancer.html#isTablesOnMaster-org.apache.hadoop.conf.Configuration-">isTablesOnMaster</a></span>(org.apache.hadoop.conf.Configuration&nbsp;conf)</code>&nbsp;</td>
+<td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/master/LoadBalancer.html#isSystemTablesOnlyOnMaster-org.apache.hadoop.conf.Configuration-">isSystemTablesOnlyOnMaster</a></span>(org.apache.hadoop.conf.Configuration&nbsp;conf)</code>&nbsp;</td>
 </tr>
 <tr id="i5" class="rowColor">
+<td class="colFirst"><code>static boolean</code></td>
+<td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/master/LoadBalancer.html#isTablesOnMaster-org.apache.hadoop.conf.Configuration-">isTablesOnMaster</a></span>(org.apache.hadoop.conf.Configuration&nbsp;conf)</code>&nbsp;</td>
+</tr>
+<tr id="i6" class="altColor">
 <td class="colFirst"><code>void</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/master/LoadBalancer.html#onConfigurationChange-org.apache.hadoop.conf.Configuration-">onConfigurationChange</a></span>(org.apache.hadoop.conf.Configuration&nbsp;conf)</code>
 <div class="block">This method would be called by the <a href="../../../../../org/apache/hadoop/hbase/conf/ConfigurationManager.html" title="class in org.apache.hadoop.hbase.conf"><code>ConfigurationManager</code></a>
  object when the <code>Configuration</code> object is reloaded from disk.</div>
 </td>
 </tr>
-<tr id="i6" 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/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">
+<tr id="i8" 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/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="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#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="i9" 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/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="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#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="i11" class="rowColor">
+<tr id="i12" 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#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="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#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="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#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="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/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>
 </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/LoadBalancer.html#updateBalancerStatus-boolean-">updateBalancerStatus</a></span>(boolean&nbsp;status)</code>&nbsp;</td>
 </tr>
@@ -338,7 +342,7 @@ extends org.apache.hadoop.conf.Configurable, <a href="../../../../../org/apache/
 <ul class="blockListLast">
 <li class="blockList">
 <h4>BOGUS_SERVER_NAME</h4>
-<pre>static final&nbsp;<a href="../../../../../org/apache/hadoop/hbase/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/master/LoadBalancer.html#line.66">BOGUS_SERVER_NAME</a></pre>
+<pre>static final&nbsp;<a href="../../../../../org/apache/hadoop/hbase/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/master/LoadBalancer.html#line.65">BOGUS_SERVER_NAME</a></pre>
 </li>
 </ul>
 </li>
@@ -355,7 +359,7 @@ extends org.apache.hadoop.conf.Configurable, <a href="../../../../../org/apache/
 <ul class="blockList">
 <li class="blockList">
 <h4>setClusterMetrics</h4>
-<pre>void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/master/LoadBalancer.html#line.72">setClusterMetrics</a>(<a href="../../../../../org/apache/hadoop/hbase/ClusterMetrics.html" title="interface in org.apache.hadoop.hbase">ClusterMetrics</a>&nbsp;st)</pre>
+<pre>void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/master/LoadBalancer.html#line.71">setClusterMetrics</a>(<a href="../../../../../org/apache/hadoop/hbase/ClusterMetrics.html" title="interface in org.apache.hadoop.hbase">ClusterMetrics</a>&nbsp;st)</pre>
 <div class="block">Set the current cluster status.  This allows a LoadBalancer to map host name to a server</div>
 <dl>
 <dt><span class="paramLabel">Parameters:</span></dt>
@@ -369,7 +373,7 @@ extends org.apache.hadoop.conf.Configurable, <a href="../../../../../org/apache/
 <ul class="blockList">
 <li class="blockList">
 <h4>setClusterLoad</h4>
-<pre>void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/master/LoadBalancer.html#line.78">setClusterLoad</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/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;&nbsp;ClusterLoad)</pre>
+<pre>void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/master/LoadBalancer.html#line.77">setClusterLoad</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/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;&nbsp;ClusterLoad)</pre>
 <div class="block">Pass RegionStates and allow balancer to set the current cluster load.</div>
 <dl>
 <dt><span class="paramLabel">Parameters:</span></dt>
@@ -383,7 +387,7 @@ extends org.apache.hadoop.conf.Configurable, <a href="../../../../../org/apache/
 <ul class="blockList">
 <li class="blockList">
 <h4>setMasterServices</h4>
-<pre>void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/master/LoadBalancer.html#line.84">setMasterServices</a>(<a href="../../../../../org/apache/hadoop/hbase/master/MasterServices.html" title="interface in org.apache.hadoop.hbase.master">MasterServices</a>&nbsp;masterServices)</pre>
+<pre>void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/master/LoadBalancer.html#line.83">setMasterServices</a>(<a href="../../../../../org/apache/hadoop/hbase/master/MasterServices.html" title="interface in org.apache.hadoop.hbase.master">MasterServices</a>&nbsp;masterServices)</pre>
 <div class="block">Set the master service.</div>
 <dl>
 <dt><span class="paramLabel">Parameters:</span></dt>
@@ -397,7 +401,7 @@ extends org.apache.hadoop.conf.Configurable, <a href="../../../../../org/apache/
 <ul class="blockList">
 <li class="blockList">
 <h4>balanceCluster</h4>
-<pre><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/master/RegionPlan.html" title="class in org.apache.hadoop.hbase.master">RegionPlan</a>&gt;&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/master/LoadBalancer.html#line.92">balanceCluster</a>(<a href="../../../../../org/apache/hadoop/hbase/TableName.html" title="class in org.apache.hadoop.hbase">TableName</a>&nbsp;tableName,
+<pre><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/master/RegionPlan.html" title="class in org.apache.hadoop.hbase.master">RegionPlan</a>&gt;&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/master/LoadBalancer.html#line.91">balanceCluster</a>(<a href="../../../../../org/apache/hadoop/hbase/TableName.html" title="class in org.apache.hadoop.hbase">TableName</a>&nbsp;tableName,
                                 <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;clusterState)
                          throws <a href="../../../../../org/apache/hadoop/hbase/HBaseIOException.html" title="class in org.apache.hadoop.hbase">HBaseIOException</a></pre>
 <div class="block">Perform the major balance operation</div>
@@ -418,7 +422,7 @@ extends org.apache.hadoop.conf.Configurable, <a href="../../../../../org/apache/
 <ul class="blockList">
 <li class="blockList">
 <h4>balanceCluster</h4>
-<pre><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/master/RegionPlan.html" title="class in org.apache.hadoop.hbase.master">RegionPlan</a>&gt;&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/master/LoadBalancer.html#line.100">balanceCluster</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;&nbsp;clusterState)
+<pre><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/master/RegionPlan.html" title="class in org.apache.hadoop.hbase.master">RegionPlan</a>&gt;&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/master/LoadBalancer.html#line.99">balanceCluster</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;&nbsp;clusterState)
                          throws <a href="../../../../../org/apache/hadoop/hbase/HBaseIOException.html" title="class in org.apache.hadoop.hbase">HBaseIOException</a></pre>
 <div class="block">Perform the major balance operation</div>
 <dl>
@@ -437,7 +441,7 @@ extends org.apache.hadoop.conf.Configurable, <a href="../../../../../org/apache/
 <ul class="blockList">
 <li class="blockList">
 <h4>roundRobinAssignment</h4>
-<pre><a href="https://docs.oracle.com/javase/8/docs/api/java/util/Map.html?is-external=true" title="class or interface in java.util">Map</a>&lt;<a href="../../../../../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/LoadBalancer.html#line.109">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><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/LoadBalancer.html#line.108">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">Perform a Round Robin assignment of regions.</div>
@@ -459,7 +463,7 @@ extends org.apache.hadoop.conf.Configurable, <a href="../../../../../org/apache/
 <li class="blockList">
 <h4>retainAssignment</h4>
 <pre>@Nullable
-<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/LoadBalancer.html#line.121">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/Serve
 rName.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/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/LoadBalancer.html#line.120">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/Serve
 rName.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">Assign regions to the previously hosting region server</div>
@@ -480,7 +484,7 @@ extends org.apache.hadoop.conf.Configurable, <a href="../../../../../org/apache/
 <ul class="blockList">
 <li class="blockList">
 <h4>randomAssignment</h4>
-<pre><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/LoadBalancer.html#line.132">randomAssignment</a>(<a href="../../../../../org/apache/hadoop/hbase/client/RegionInfo.html" title="interface in org.apache.hadoop.hbase.client">RegionInfo</a>&nbsp;regionInfo,
+<pre><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/LoadBalancer.html#line.131">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">Get a random region server from the list</div>
@@ -501,7 +505,7 @@ extends org.apache.hadoop.conf.Configurable, <a href="../../../../../org/apache/
 <ul class="blockList">
 <li class="blockList">
 <h4>initialize</h4>
-<pre>void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/master/LoadBalancer.html#line.140">initialize</a>()
+<pre>void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/master/LoadBalancer.html#line.139">initialize</a>()
          throws <a href="../../../../../org/apache/hadoop/hbase/HBaseIOException.html" title="class in org.apache.hadoop.hbase">HBaseIOException</a></pre>
 <div class="block">Initialize the load balancer. Must be called after setters.</div>
 <dl>
@@ -516,7 +520,7 @@ extends org.apache.hadoop.conf.Configurable, <a href="../../../../../org/apache/
 <ul class="blockList">
 <li class="blockList">
 <h4>regionOnline</h4>
-<pre>void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/master/LoadBalancer.html#line.147">regionOnline</a>(<a href="../../../../../org/apache/hadoop/hbase/client/RegionInfo.html" title="interface in org.apache.hadoop.hbase.client">RegionInfo</a>&nbsp;regionInfo,
+<pre>void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/master/LoadBalancer.html#line.146">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">Marks the region as online at balancer.</div>
 <dl>
@@ -532,7 +536,7 @@ extends org.apache.hadoop.conf.Configurable, <a href="../../../../../org/apache/
 <ul class="blockList">
 <li class="blockList">
 <h4>regionOffline</h4>
-<pre>void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/master/LoadBalancer.html#line.153">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>void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/master/LoadBalancer.html#line.152">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">Marks the region as offline at balancer.</div>
 <dl>
 <dt><span class="paramLabel">Parameters:</span></dt>
@@ -546,7 +550,7 @@ extends org.apache.hadoop.conf.Configurable, <a href="../../../../../org/apache/
 <ul class="blockList">
 <li class="blockList">
 <h4>onConfigurationChange</h4>
-<pre>void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/master/LoadBalancer.html#line.160">onConfigurationChange</a>(org.apache.hadoop.conf.Configuration&nbsp;conf)</pre>
+<pre>void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/master/LoadBalancer.html#line.159">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>
@@ -562,7 +566,7 @@ extends org.apache.hadoop.conf.Configurable, <a href="../../../../../org/apache/
 <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>
+<pre>void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/master/LoadBalancer.html#line.164">postMasterStartupInitialize</a>()</pre>
 <div class="block">If balancer needs to do initialization after Master has started up, lets do that here.</div>
 </li>
 </ul>
@@ -572,7 +576,7 @@ extends org.apache.hadoop.conf.Configurable, <a href="../../../../../org/apache/
 <ul class="blockList">
 <li class="blockList">
 <h4>updateBalancerStatus</h4>
-<pre>void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/master/LoadBalancer.html#line.168">updateBalancerStatus</a>(boolean&nbsp;status)</pre>
+<pre>void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/master/LoadBalancer.html#line.167">updateBalancerStatus</a>(boolean&nbsp;status)</pre>
 </li>
 </ul>
 <a name="isTablesOnMaster-org.apache.hadoop.conf.Configuration-">
@@ -581,7 +585,7 @@ extends org.apache.hadoop.conf.Configurable, <a href="../../../../../org/apache/
 <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.173">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.172">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>
@@ -591,10 +595,19 @@ extends org.apache.hadoop.conf.Configurable, <a href="../../../../../org/apache/
 <a name="isSystemTablesOnlyOnMaster-org.apache.hadoop.conf.Configuration-">
 <!--   -->
 </a>
-<ul class="blockListLast">
+<ul class="blockList">
 <li class="blockList">
 <h4>isSystemTablesOnlyOnMaster</h4>
-<pre>static&nbsp;boolean&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/master/LoadBalancer.html#line.177">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.176">isSystemTablesOnlyOnMaster</a>(org.apache.hadoop.conf.Configuration&nbsp;conf)</pre>
+</li>
+</ul>
+<a name="isMasterCanHostUserRegions-org.apache.hadoop.conf.Configuration-">
+<!--   -->
+</a>
+<ul class="blockListLast">
+<li class="blockList">
+<h4>isMasterCanHostUserRegions</h4>
+<pre>static&nbsp;boolean&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/master/LoadBalancer.html#line.180">isMasterCanHostUserRegions</a>(org.apache.hadoop.conf.Configuration&nbsp;conf)</pre>
 </li>
 </ul>
 </li>


[17/46] hbase-site git commit: Published site at 05d22ed960204183fbd9bd16f1dbca6410ccde76.

Posted by gi...@apache.org.
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/3649682c/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 c307d41..d82bfd8 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
@@ -1020,8 +1020,8 @@
 <span class="sourceLineNo">1012</span>  protected ClusterMetrics clusterStatus = null;<a name="line.1012"></a>
 <span class="sourceLineNo">1013</span>  protected ServerName masterServerName;<a name="line.1013"></a>
 <span class="sourceLineNo">1014</span>  protected MasterServices services;<a name="line.1014"></a>
-<span class="sourceLineNo">1015</span>  protected boolean tablesOnMaster;<a name="line.1015"></a>
-<span class="sourceLineNo">1016</span>  protected boolean onlySystemTablesOnMaster;<a name="line.1016"></a>
+<span class="sourceLineNo">1015</span>  protected boolean onlySystemTablesOnMaster;<a name="line.1015"></a>
+<span class="sourceLineNo">1016</span>  protected boolean maintenanceMode;<a name="line.1016"></a>
 <span class="sourceLineNo">1017</span><a name="line.1017"></a>
 <span class="sourceLineNo">1018</span>  @Override<a name="line.1018"></a>
 <span class="sourceLineNo">1019</span>  public void setConf(Configuration conf) {<a name="line.1019"></a>
@@ -1033,627 +1033,626 @@
 <span class="sourceLineNo">1025</span>    if (overallSlop &lt; 0) overallSlop = 0;<a name="line.1025"></a>
 <span class="sourceLineNo">1026</span>    else if (overallSlop &gt; 1) overallSlop = 1;<a name="line.1026"></a>
 <span class="sourceLineNo">1027</span><a name="line.1027"></a>
-<span class="sourceLineNo">1028</span>    this.tablesOnMaster = LoadBalancer.isTablesOnMaster(this.config);<a name="line.1028"></a>
-<span class="sourceLineNo">1029</span>    this.onlySystemTablesOnMaster = LoadBalancer.isSystemTablesOnlyOnMaster(this.config);<a name="line.1029"></a>
-<span class="sourceLineNo">1030</span>    // If system tables on master, implies tablesOnMaster = true.<a name="line.1030"></a>
-<span class="sourceLineNo">1031</span>    if (this.onlySystemTablesOnMaster &amp;&amp; !this.tablesOnMaster) {<a name="line.1031"></a>
-<span class="sourceLineNo">1032</span>      LOG.warn("Set " + TABLES_ON_MASTER + "=true because " + SYSTEM_TABLES_ON_MASTER + "=true");<a name="line.1032"></a>
-<span class="sourceLineNo">1033</span>      this.tablesOnMaster = true;<a name="line.1033"></a>
-<span class="sourceLineNo">1034</span>    }<a name="line.1034"></a>
-<span class="sourceLineNo">1035</span>    this.rackManager = new RackManager(getConf());<a name="line.1035"></a>
-<span class="sourceLineNo">1036</span>    if (useRegionFinder) {<a name="line.1036"></a>
-<span class="sourceLineNo">1037</span>      regionFinder.setConf(conf);<a name="line.1037"></a>
-<span class="sourceLineNo">1038</span>    }<a name="line.1038"></a>
-<span class="sourceLineNo">1039</span>    // Print out base configs. Don't print overallSlop since it for simple balancer exclusively.<a name="line.1039"></a>
-<span class="sourceLineNo">1040</span>    LOG.info("slop=" + this.slop + ", tablesOnMaster=" + this.tablesOnMaster +<a name="line.1040"></a>
-<span class="sourceLineNo">1041</span>      ", systemTablesOnMaster=" + this.onlySystemTablesOnMaster);<a name="line.1041"></a>
+<span class="sourceLineNo">1028</span>    this.onlySystemTablesOnMaster = LoadBalancer.isSystemTablesOnlyOnMaster(this.config);<a name="line.1028"></a>
+<span class="sourceLineNo">1029</span><a name="line.1029"></a>
+<span class="sourceLineNo">1030</span>    this.rackManager = new RackManager(getConf());<a name="line.1030"></a>
+<span class="sourceLineNo">1031</span>    if (useRegionFinder) {<a name="line.1031"></a>
+<span class="sourceLineNo">1032</span>      regionFinder.setConf(conf);<a name="line.1032"></a>
+<span class="sourceLineNo">1033</span>    }<a name="line.1033"></a>
+<span class="sourceLineNo">1034</span>    // Print out base configs. Don't print overallSlop since it for simple balancer exclusively.<a name="line.1034"></a>
+<span class="sourceLineNo">1035</span>    LOG.info("slop={}, systemTablesOnMaster={}",<a name="line.1035"></a>
+<span class="sourceLineNo">1036</span>        this.slop, this.onlySystemTablesOnMaster);<a name="line.1036"></a>
+<span class="sourceLineNo">1037</span>  }<a name="line.1037"></a>
+<span class="sourceLineNo">1038</span><a name="line.1038"></a>
+<span class="sourceLineNo">1039</span>  protected void setSlop(Configuration conf) {<a name="line.1039"></a>
+<span class="sourceLineNo">1040</span>    this.slop = conf.getFloat("hbase.regions.slop", (float) 0.2);<a name="line.1040"></a>
+<span class="sourceLineNo">1041</span>    this.overallSlop = conf.getFloat("hbase.regions.overallSlop", slop);<a name="line.1041"></a>
 <span class="sourceLineNo">1042</span>  }<a name="line.1042"></a>
 <span class="sourceLineNo">1043</span><a name="line.1043"></a>
-<span class="sourceLineNo">1044</span>  protected void setSlop(Configuration conf) {<a name="line.1044"></a>
-<span class="sourceLineNo">1045</span>    this.slop = conf.getFloat("hbase.regions.slop", (float) 0.2);<a name="line.1045"></a>
-<span class="sourceLineNo">1046</span>    this.overallSlop = conf.getFloat("hbase.regions.overallSlop", slop);<a name="line.1046"></a>
-<span class="sourceLineNo">1047</span>  }<a name="line.1047"></a>
-<span class="sourceLineNo">1048</span><a name="line.1048"></a>
-<span class="sourceLineNo">1049</span>  /**<a name="line.1049"></a>
-<span class="sourceLineNo">1050</span>   * Check if a region belongs to some system table.<a name="line.1050"></a>
-<span class="sourceLineNo">1051</span>   * If so, the primary replica may be expected to be put on the master regionserver.<a name="line.1051"></a>
-<span class="sourceLineNo">1052</span>   */<a name="line.1052"></a>
-<span class="sourceLineNo">1053</span>  public boolean shouldBeOnMaster(RegionInfo region) {<a name="line.1053"></a>
-<span class="sourceLineNo">1054</span>    return this.onlySystemTablesOnMaster &amp;&amp; region.getTable().isSystemTable();<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>   * Balance the regions that should be on master regionserver.<a name="line.1058"></a>
-<span class="sourceLineNo">1059</span>   */<a name="line.1059"></a>
-<span class="sourceLineNo">1060</span>  protected List&lt;RegionPlan&gt; balanceMasterRegions(Map&lt;ServerName, List&lt;RegionInfo&gt;&gt; clusterMap) {<a name="line.1060"></a>
-<span class="sourceLineNo">1061</span>    if (masterServerName == null || clusterMap == null || clusterMap.size() &lt;= 1) return null;<a name="line.1061"></a>
-<span class="sourceLineNo">1062</span>    List&lt;RegionPlan&gt; plans = null;<a name="line.1062"></a>
-<span class="sourceLineNo">1063</span>    List&lt;RegionInfo&gt; regions = clusterMap.get(masterServerName);<a name="line.1063"></a>
-<span class="sourceLineNo">1064</span>    if (regions != null) {<a name="line.1064"></a>
-<span class="sourceLineNo">1065</span>      Iterator&lt;ServerName&gt; keyIt = null;<a name="line.1065"></a>
-<span class="sourceLineNo">1066</span>      for (RegionInfo region: regions) {<a name="line.1066"></a>
-<span class="sourceLineNo">1067</span>        if (shouldBeOnMaster(region)) continue;<a name="line.1067"></a>
-<span class="sourceLineNo">1068</span><a name="line.1068"></a>
-<span class="sourceLineNo">1069</span>        // Find a non-master regionserver to host the region<a name="line.1069"></a>
-<span class="sourceLineNo">1070</span>        if (keyIt == null || !keyIt.hasNext()) {<a name="line.1070"></a>
-<span class="sourceLineNo">1071</span>          keyIt = clusterMap.keySet().iterator();<a name="line.1071"></a>
-<span class="sourceLineNo">1072</span>        }<a name="line.1072"></a>
-<span class="sourceLineNo">1073</span>        ServerName dest = keyIt.next();<a name="line.1073"></a>
-<span class="sourceLineNo">1074</span>        if (masterServerName.equals(dest)) {<a name="line.1074"></a>
-<span class="sourceLineNo">1075</span>          if (!keyIt.hasNext()) {<a name="line.1075"></a>
-<span class="sourceLineNo">1076</span>            keyIt = clusterMap.keySet().iterator();<a name="line.1076"></a>
-<span class="sourceLineNo">1077</span>          }<a name="line.1077"></a>
-<span class="sourceLineNo">1078</span>          dest = keyIt.next();<a name="line.1078"></a>
-<span class="sourceLineNo">1079</span>        }<a name="line.1079"></a>
-<span class="sourceLineNo">1080</span><a name="line.1080"></a>
-<span class="sourceLineNo">1081</span>        // Move this region away from the master regionserver<a name="line.1081"></a>
-<span class="sourceLineNo">1082</span>        RegionPlan plan = new RegionPlan(region, masterServerName, dest);<a name="line.1082"></a>
-<span class="sourceLineNo">1083</span>        if (plans == null) {<a name="line.1083"></a>
-<span class="sourceLineNo">1084</span>          plans = new ArrayList&lt;&gt;();<a name="line.1084"></a>
-<span class="sourceLineNo">1085</span>        }<a name="line.1085"></a>
-<span class="sourceLineNo">1086</span>        plans.add(plan);<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>    for (Map.Entry&lt;ServerName, List&lt;RegionInfo&gt;&gt; server: clusterMap.entrySet()) {<a name="line.1089"></a>
-<span class="sourceLineNo">1090</span>      if (masterServerName.equals(server.getKey())) continue;<a name="line.1090"></a>
-<span class="sourceLineNo">1091</span>      for (RegionInfo region: server.getValue()) {<a name="line.1091"></a>
-<span class="sourceLineNo">1092</span>        if (!shouldBeOnMaster(region)) continue;<a name="line.1092"></a>
-<span class="sourceLineNo">1093</span><a name="line.1093"></a>
-<span class="sourceLineNo">1094</span>        // Move this region to the master regionserver<a name="line.1094"></a>
-<span class="sourceLineNo">1095</span>        RegionPlan plan = new RegionPlan(region, server.getKey(), masterServerName);<a name="line.1095"></a>
-<span class="sourceLineNo">1096</span>        if (plans == null) {<a name="line.1096"></a>
-<span class="sourceLineNo">1097</span>          plans = new ArrayList&lt;&gt;();<a name="line.1097"></a>
-<span class="sourceLineNo">1098</span>        }<a name="line.1098"></a>
-<span class="sourceLineNo">1099</span>        plans.add(plan);<a name="line.1099"></a>
-<span class="sourceLineNo">1100</span>      }<a name="line.1100"></a>
-<span class="sourceLineNo">1101</span>    }<a name="line.1101"></a>
-<span class="sourceLineNo">1102</span>    return plans;<a name="line.1102"></a>
-<span class="sourceLineNo">1103</span>  }<a name="line.1103"></a>
-<span class="sourceLineNo">1104</span><a name="line.1104"></a>
-<span class="sourceLineNo">1105</span>  /**<a name="line.1105"></a>
-<span class="sourceLineNo">1106</span>   * If master is configured to carry system tables only, in here is<a name="line.1106"></a>
-<span class="sourceLineNo">1107</span>   * where we figure what to assign it.<a name="line.1107"></a>
-<span class="sourceLineNo">1108</span>   */<a name="line.1108"></a>
-<span class="sourceLineNo">1109</span>  protected Map&lt;ServerName, List&lt;RegionInfo&gt;&gt; assignMasterSystemRegions(<a name="line.1109"></a>
-<span class="sourceLineNo">1110</span>      Collection&lt;RegionInfo&gt; regions, List&lt;ServerName&gt; servers) {<a name="line.1110"></a>
-<span class="sourceLineNo">1111</span>    if (servers == null || regions == null || regions.isEmpty()) {<a name="line.1111"></a>
-<span class="sourceLineNo">1112</span>      return null;<a name="line.1112"></a>
-<span class="sourceLineNo">1113</span>    }<a name="line.1113"></a>
-<span class="sourceLineNo">1114</span>    Map&lt;ServerName, List&lt;RegionInfo&gt;&gt; assignments = new TreeMap&lt;&gt;();<a name="line.1114"></a>
-<span class="sourceLineNo">1115</span>    if (this.onlySystemTablesOnMaster) {<a name="line.1115"></a>
-<span class="sourceLineNo">1116</span>      if (masterServerName != null &amp;&amp; servers.contains(masterServerName)) {<a name="line.1116"></a>
-<span class="sourceLineNo">1117</span>        assignments.put(masterServerName, new ArrayList&lt;&gt;());<a name="line.1117"></a>
-<span class="sourceLineNo">1118</span>        for (RegionInfo region : regions) {<a name="line.1118"></a>
-<span class="sourceLineNo">1119</span>          if (shouldBeOnMaster(region)) {<a name="line.1119"></a>
-<span class="sourceLineNo">1120</span>            assignments.get(masterServerName).add(region);<a name="line.1120"></a>
-<span class="sourceLineNo">1121</span>          }<a name="line.1121"></a>
-<span class="sourceLineNo">1122</span>        }<a name="line.1122"></a>
-<span class="sourceLineNo">1123</span>      }<a name="line.1123"></a>
-<span class="sourceLineNo">1124</span>    }<a name="line.1124"></a>
-<span class="sourceLineNo">1125</span>    return assignments;<a name="line.1125"></a>
-<span class="sourceLineNo">1126</span>  }<a name="line.1126"></a>
-<span class="sourceLineNo">1127</span><a name="line.1127"></a>
-<span class="sourceLineNo">1128</span>  @Override<a name="line.1128"></a>
-<span class="sourceLineNo">1129</span>  public Configuration getConf() {<a name="line.1129"></a>
-<span class="sourceLineNo">1130</span>    return this.config;<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 synchronized void setClusterMetrics(ClusterMetrics st) {<a name="line.1134"></a>
-<span class="sourceLineNo">1135</span>    this.clusterStatus = st;<a name="line.1135"></a>
-<span class="sourceLineNo">1136</span>    if (useRegionFinder) {<a name="line.1136"></a>
-<span class="sourceLineNo">1137</span>      regionFinder.setClusterMetrics(st);<a name="line.1137"></a>
-<span class="sourceLineNo">1138</span>    }<a name="line.1138"></a>
-<span class="sourceLineNo">1139</span>  }<a name="line.1139"></a>
-<span class="sourceLineNo">1140</span><a name="line.1140"></a>
-<span class="sourceLineNo">1141</span>  @Override<a name="line.1141"></a>
-<span class="sourceLineNo">1142</span>  public void setClusterLoad(Map&lt;TableName, Map&lt;ServerName, List&lt;RegionInfo&gt;&gt;&gt; clusterLoad){<a name="line.1142"></a>
-<span class="sourceLineNo">1143</span><a name="line.1143"></a>
-<span class="sourceLineNo">1144</span>  }<a name="line.1144"></a>
-<span class="sourceLineNo">1145</span><a name="line.1145"></a>
-<span class="sourceLineNo">1146</span>  @Override<a name="line.1146"></a>
-<span class="sourceLineNo">1147</span>  public void setMasterServices(MasterServices masterServices) {<a name="line.1147"></a>
-<span class="sourceLineNo">1148</span>    masterServerName = masterServices.getServerName();<a name="line.1148"></a>
-<span class="sourceLineNo">1149</span>    this.services = masterServices;<a name="line.1149"></a>
-<span class="sourceLineNo">1150</span>    if (useRegionFinder) {<a name="line.1150"></a>
-<span class="sourceLineNo">1151</span>      this.regionFinder.setServices(masterServices);<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><a name="line.1154"></a>
-<span class="sourceLineNo">1155</span>  @Override<a name="line.1155"></a>
-<span class="sourceLineNo">1156</span>  public void postMasterStartupInitialize() {<a name="line.1156"></a>
-<span class="sourceLineNo">1157</span>    if (services != null &amp;&amp; regionFinder != null) {<a name="line.1157"></a>
-<span class="sourceLineNo">1158</span>      try {<a name="line.1158"></a>
-<span class="sourceLineNo">1159</span>        Set&lt;RegionInfo&gt; regions =<a name="line.1159"></a>
-<span class="sourceLineNo">1160</span>            services.getAssignmentManager().getRegionStates().getRegionAssignments().keySet();<a name="line.1160"></a>
-<span class="sourceLineNo">1161</span>        regionFinder.refreshAndWait(regions);<a name="line.1161"></a>
-<span class="sourceLineNo">1162</span>      } catch (Exception e) {<a name="line.1162"></a>
-<span class="sourceLineNo">1163</span>        LOG.warn("Refreshing region HDFS Block dist failed with exception, ignoring", e);<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><a name="line.1167"></a>
-<span class="sourceLineNo">1168</span>  public void setRackManager(RackManager rackManager) {<a name="line.1168"></a>
-<span class="sourceLineNo">1169</span>    this.rackManager = rackManager;<a name="line.1169"></a>
-<span class="sourceLineNo">1170</span>  }<a name="line.1170"></a>
-<span class="sourceLineNo">1171</span><a name="line.1171"></a>
-<span class="sourceLineNo">1172</span>  protected boolean needsBalance(Cluster c) {<a name="line.1172"></a>
-<span class="sourceLineNo">1173</span>    ClusterLoadState cs = new ClusterLoadState(c.clusterState);<a name="line.1173"></a>
-<span class="sourceLineNo">1174</span>    if (cs.getNumServers() &lt; MIN_SERVER_BALANCE) {<a name="line.1174"></a>
-<span class="sourceLineNo">1175</span>      if (LOG.isDebugEnabled()) {<a name="line.1175"></a>
-<span class="sourceLineNo">1176</span>        LOG.debug("Not running balancer because only " + cs.getNumServers()<a name="line.1176"></a>
-<span class="sourceLineNo">1177</span>            + " active regionserver(s)");<a name="line.1177"></a>
-<span class="sourceLineNo">1178</span>      }<a name="line.1178"></a>
-<span class="sourceLineNo">1179</span>      return false;<a name="line.1179"></a>
-<span class="sourceLineNo">1180</span>    }<a name="line.1180"></a>
-<span class="sourceLineNo">1181</span>    if(areSomeRegionReplicasColocated(c)) return true;<a name="line.1181"></a>
-<span class="sourceLineNo">1182</span>    // Check if we even need to do any load balancing<a name="line.1182"></a>
-<span class="sourceLineNo">1183</span>    // HBASE-3681 check sloppiness first<a name="line.1183"></a>
-<span class="sourceLineNo">1184</span>    float average = cs.getLoadAverage(); // for logging<a name="line.1184"></a>
-<span class="sourceLineNo">1185</span>    int floor = (int) Math.floor(average * (1 - slop));<a name="line.1185"></a>
-<span class="sourceLineNo">1186</span>    int ceiling = (int) Math.ceil(average * (1 + slop));<a name="line.1186"></a>
-<span class="sourceLineNo">1187</span>    if (!(cs.getMaxLoad() &gt; ceiling || cs.getMinLoad() &lt; floor)) {<a name="line.1187"></a>
-<span class="sourceLineNo">1188</span>      NavigableMap&lt;ServerAndLoad, List&lt;RegionInfo&gt;&gt; serversByLoad = cs.getServersByLoad();<a name="line.1188"></a>
-<span class="sourceLineNo">1189</span>      if (LOG.isTraceEnabled()) {<a name="line.1189"></a>
-<span class="sourceLineNo">1190</span>        // If nothing to balance, then don't say anything unless trace-level logging.<a name="line.1190"></a>
-<span class="sourceLineNo">1191</span>        LOG.trace("Skipping load balancing because balanced cluster; " +<a name="line.1191"></a>
-<span class="sourceLineNo">1192</span>          "servers=" + cs.getNumServers() +<a name="line.1192"></a>
-<span class="sourceLineNo">1193</span>          " regions=" + cs.getNumRegions() + " average=" + average +<a name="line.1193"></a>
-<span class="sourceLineNo">1194</span>          " mostloaded=" + serversByLoad.lastKey().getLoad() +<a name="line.1194"></a>
-<span class="sourceLineNo">1195</span>          " leastloaded=" + serversByLoad.firstKey().getLoad());<a name="line.1195"></a>
-<span class="sourceLineNo">1196</span>      }<a name="line.1196"></a>
-<span class="sourceLineNo">1197</span>      return false;<a name="line.1197"></a>
-<span class="sourceLineNo">1198</span>    }<a name="line.1198"></a>
-<span class="sourceLineNo">1199</span>    return true;<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>   * Subclasses should implement this to return true if the cluster has nodes that hosts<a name="line.1203"></a>
-<span class="sourceLineNo">1204</span>   * multiple replicas for the same region, or, if there are multiple racks and the same<a name="line.1204"></a>
-<span class="sourceLineNo">1205</span>   * rack hosts replicas of the same region<a name="line.1205"></a>
-<span class="sourceLineNo">1206</span>   * @param c Cluster information<a name="line.1206"></a>
-<span class="sourceLineNo">1207</span>   * @return whether region replicas are currently co-located<a name="line.1207"></a>
-<span class="sourceLineNo">1208</span>   */<a name="line.1208"></a>
-<span class="sourceLineNo">1209</span>  protected boolean areSomeRegionReplicasColocated(Cluster c) {<a name="line.1209"></a>
-<span class="sourceLineNo">1210</span>    return false;<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>   * Generates a bulk assignment plan to be used on cluster startup using a<a name="line.1214"></a>
-<span class="sourceLineNo">1215</span>   * simple round-robin assignment.<a name="line.1215"></a>
-<span class="sourceLineNo">1216</span>   * &lt;p&gt;<a name="line.1216"></a>
-<span class="sourceLineNo">1217</span>   * Takes a list of all the regions and all the servers in the cluster and<a name="line.1217"></a>
-<span class="sourceLineNo">1218</span>   * returns a map of each server to the regions that it should be assigned.<a name="line.1218"></a>
-<span class="sourceLineNo">1219</span>   * &lt;p&gt;<a name="line.1219"></a>
-<span class="sourceLineNo">1220</span>   * Currently implemented as a round-robin assignment. Same invariant as load<a name="line.1220"></a>
-<span class="sourceLineNo">1221</span>   * balancing, all servers holding floor(avg) or ceiling(avg).<a name="line.1221"></a>
-<span class="sourceLineNo">1222</span>   *<a name="line.1222"></a>
-<span class="sourceLineNo">1223</span>   * TODO: Use block locations from HDFS to place regions with their blocks<a name="line.1223"></a>
-<span class="sourceLineNo">1224</span>   *<a name="line.1224"></a>
-<span class="sourceLineNo">1225</span>   * @param regions all regions<a name="line.1225"></a>
-<span class="sourceLineNo">1226</span>   * @param servers all servers<a name="line.1226"></a>
-<span class="sourceLineNo">1227</span>   * @return map of server to the regions it should take, or null if no<a name="line.1227"></a>
-<span class="sourceLineNo">1228</span>   *         assignment is possible (ie. no regions or no servers)<a name="line.1228"></a>
-<span class="sourceLineNo">1229</span>   */<a name="line.1229"></a>
-<span class="sourceLineNo">1230</span>  @Override<a name="line.1230"></a>
-<span class="sourceLineNo">1231</span>  public Map&lt;ServerName, List&lt;RegionInfo&gt;&gt; roundRobinAssignment(List&lt;RegionInfo&gt; regions,<a name="line.1231"></a>
-<span class="sourceLineNo">1232</span>      List&lt;ServerName&gt; servers) throws HBaseIOException {<a name="line.1232"></a>
-<span class="sourceLineNo">1233</span>    metricsBalancer.incrMiscInvocations();<a name="line.1233"></a>
-<span class="sourceLineNo">1234</span>    Map&lt;ServerName, List&lt;RegionInfo&gt;&gt; assignments = assignMasterSystemRegions(regions, servers);<a name="line.1234"></a>
-<span class="sourceLineNo">1235</span>    if (assignments != null &amp;&amp; !assignments.isEmpty()) {<a name="line.1235"></a>
-<span class="sourceLineNo">1236</span>      servers = new ArrayList&lt;&gt;(servers);<a name="line.1236"></a>
-<span class="sourceLineNo">1237</span>      // Guarantee not to put other regions on master<a name="line.1237"></a>
-<span class="sourceLineNo">1238</span>      servers.remove(masterServerName);<a name="line.1238"></a>
-<span class="sourceLineNo">1239</span>      List&lt;RegionInfo&gt; masterRegions = assignments.get(masterServerName);<a name="line.1239"></a>
-<span class="sourceLineNo">1240</span>      if (!masterRegions.isEmpty()) {<a name="line.1240"></a>
-<span class="sourceLineNo">1241</span>        regions = new ArrayList&lt;&gt;(regions);<a name="line.1241"></a>
-<span class="sourceLineNo">1242</span>        regions.removeAll(masterRegions);<a name="line.1242"></a>
-<span class="sourceLineNo">1243</span>      }<a name="line.1243"></a>
-<span class="sourceLineNo">1244</span>    }<a name="line.1244"></a>
-<span class="sourceLineNo">1245</span>    if (regions == null || regions.isEmpty()) {<a name="line.1245"></a>
-<span class="sourceLineNo">1246</span>      return assignments;<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>    int numServers = servers == null ? 0 : servers.size();<a name="line.1249"></a>
-<span class="sourceLineNo">1250</span>    if (numServers == 0) {<a name="line.1250"></a>
-<span class="sourceLineNo">1251</span>      LOG.warn("Wanted to do round robin assignment but no servers to assign to");<a name="line.1251"></a>
-<span class="sourceLineNo">1252</span>      return null;<a name="line.1252"></a>
-<span class="sourceLineNo">1253</span>    }<a name="line.1253"></a>
-<span class="sourceLineNo">1254</span><a name="line.1254"></a>
-<span class="sourceLineNo">1255</span>    // TODO: instead of retainAssignment() and roundRobinAssignment(), we should just run the<a name="line.1255"></a>
-<span class="sourceLineNo">1256</span>    // normal LB.balancerCluster() with unassignedRegions. We only need to have a candidate<a name="line.1256"></a>
-<span class="sourceLineNo">1257</span>    // generator for AssignRegionAction. The LB will ensure the regions are mostly local<a name="line.1257"></a>
-<span class="sourceLineNo">1258</span>    // and balanced. This should also run fast with fewer number of iterations.<a name="line.1258"></a>
-<span class="sourceLineNo">1259</span><a name="line.1259"></a>
-<span class="sourceLineNo">1260</span>    if (numServers == 1) { // Only one server, nothing fancy we can do here<a name="line.1260"></a>
-<span class="sourceLineNo">1261</span>      ServerName server = servers.get(0);<a name="line.1261"></a>
-<span class="sourceLineNo">1262</span>      assignments.put(server, new ArrayList&lt;&gt;(regions));<a name="line.1262"></a>
-<span class="sourceLineNo">1263</span>      return assignments;<a name="line.1263"></a>
-<span class="sourceLineNo">1264</span>    }<a name="line.1264"></a>
-<span class="sourceLineNo">1265</span><a name="line.1265"></a>
-<span class="sourceLineNo">1266</span>    Cluster cluster = createCluster(servers, regions, false);<a name="line.1266"></a>
-<span class="sourceLineNo">1267</span>    List&lt;RegionInfo&gt; unassignedRegions = new ArrayList&lt;&gt;();<a name="line.1267"></a>
-<span class="sourceLineNo">1268</span><a name="line.1268"></a>
-<span class="sourceLineNo">1269</span>    roundRobinAssignment(cluster, regions, unassignedRegions,<a name="line.1269"></a>
-<span class="sourceLineNo">1270</span>      servers, assignments);<a name="line.1270"></a>
-<span class="sourceLineNo">1271</span><a name="line.1271"></a>
-<span class="sourceLineNo">1272</span>    List&lt;RegionInfo&gt; lastFewRegions = new ArrayList&lt;&gt;();<a name="line.1272"></a>
-<span class="sourceLineNo">1273</span>    // assign the remaining by going through the list and try to assign to servers one-by-one<a name="line.1273"></a>
-<span class="sourceLineNo">1274</span>    int serverIdx = RANDOM.nextInt(numServers);<a name="line.1274"></a>
-<span class="sourceLineNo">1275</span>    OUTER : for (RegionInfo region : unassignedRegions) {<a name="line.1275"></a>
-<span class="sourceLineNo">1276</span>      boolean assigned = false;<a name="line.1276"></a>
-<span class="sourceLineNo">1277</span>      INNER : for (int j = 0; j &lt; numServers; j++) { // try all servers one by one<a name="line.1277"></a>
-<span class="sourceLineNo">1278</span>        ServerName serverName = servers.get((j + serverIdx) % numServers);<a name="line.1278"></a>
-<span class="sourceLineNo">1279</span>        if (!cluster.wouldLowerAvailability(region, serverName)) {<a name="line.1279"></a>
-<span class="sourceLineNo">1280</span>          List&lt;RegionInfo&gt; serverRegions =<a name="line.1280"></a>
-<span class="sourceLineNo">1281</span>              assignments.computeIfAbsent(serverName, k -&gt; new ArrayList&lt;&gt;());<a name="line.1281"></a>
-<span class="sourceLineNo">1282</span>          if (!RegionReplicaUtil.isDefaultReplica(region.getReplicaId())) {<a name="line.1282"></a>
-<span class="sourceLineNo">1283</span>            // if the region is not a default replica<a name="line.1283"></a>
-<span class="sourceLineNo">1284</span>            // check if the assignments map has the other replica region on this server<a name="line.1284"></a>
-<span class="sourceLineNo">1285</span>            for (RegionInfo hri : serverRegions) {<a name="line.1285"></a>
-<span class="sourceLineNo">1286</span>              if (RegionReplicaUtil.isReplicasForSameRegion(region, hri)) {<a name="line.1286"></a>
-<span class="sourceLineNo">1287</span>                if (LOG.isTraceEnabled()) {<a name="line.1287"></a>
-<span class="sourceLineNo">1288</span>                  LOG.trace("Skipping the server, " + serverName<a name="line.1288"></a>
-<span class="sourceLineNo">1289</span>                      + " , got the same server for the region " + region);<a name="line.1289"></a>
-<span class="sourceLineNo">1290</span>                }<a name="line.1290"></a>
-<span class="sourceLineNo">1291</span>                // do not allow this case. The unassignedRegions we got because the<a name="line.1291"></a>
-<span class="sourceLineNo">1292</span>                // replica region in this list was not assigned because of lower availablity issue.<a name="line.1292"></a>
-<span class="sourceLineNo">1293</span>                // So when we assign here we should ensure that as far as possible the server being<a name="line.1293"></a>
-<span class="sourceLineNo">1294</span>                // selected does not have the server where the replica region was not assigned.<a name="line.1294"></a>
-<span class="sourceLineNo">1295</span>                continue INNER; // continue the inner loop, ie go to the next server<a name="line.1295"></a>
-<span class="sourceLineNo">1296</span>              }<a name="line.1296"></a>
-<span class="sourceLineNo">1297</span>            }<a name="line.1297"></a>
-<span class="sourceLineNo">1298</span>          }<a name="line.1298"></a>
-<span class="sourceLineNo">1299</span>          serverRegions.add(region);<a name="line.1299"></a>
-<span class="sourceLineNo">1300</span>          cluster.doAssignRegion(region, serverName);<a name="line.1300"></a>
-<span class="sourceLineNo">1301</span>          serverIdx = (j + serverIdx + 1) % numServers; //remain from next server<a name="line.1301"></a>
-<span class="sourceLineNo">1302</span>          assigned = true;<a name="line.1302"></a>
-<span class="sourceLineNo">1303</span>          break;<a name="line.1303"></a>
-<span class="sourceLineNo">1304</span>        }<a name="line.1304"></a>
-<span class="sourceLineNo">1305</span>      }<a name="line.1305"></a>
-<span class="sourceLineNo">1306</span>      if (!assigned) {<a name="line.1306"></a>
-<span class="sourceLineNo">1307</span>        lastFewRegions.add(region);<a name="line.1307"></a>
-<span class="sourceLineNo">1308</span>      }<a name="line.1308"></a>
-<span class="sourceLineNo">1309</span>    }<a name="line.1309"></a>
-<span class="sourceLineNo">1310</span>    // just sprinkle the rest of the regions on random regionservers. The balanceCluster will<a name="line.1310"></a>
-<span class="sourceLineNo">1311</span>    // make it optimal later. we can end up with this if numReplicas &gt; numServers.<a name="line.1311"></a>
-<span class="sourceLineNo">1312</span>    for (RegionInfo region : lastFewRegions) {<a name="line.1312"></a>
-<span class="sourceLineNo">1313</span>      int i = RANDOM.nextInt(numServers);<a name="line.1313"></a>
-<span class="sourceLineNo">1314</span>      ServerName server = servers.get(i);<a name="line.1314"></a>
-<span class="sourceLineNo">1315</span>      List&lt;RegionInfo&gt; serverRegions = assignments.computeIfAbsent(server, k -&gt; new ArrayList&lt;&gt;());<a name="line.1315"></a>
-<span class="sourceLineNo">1316</span>      serverRegions.add(region);<a name="line.1316"></a>
-<span class="sourceLineNo">1317</span>      cluster.doAssignRegion(region, server);<a name="line.1317"></a>
-<span class="sourceLineNo">1318</span>    }<a name="line.1318"></a>
-<span class="sourceLineNo">1319</span>    return assignments;<a name="line.1319"></a>
-<span class="sourceLineNo">1320</span>  }<a name="line.1320"></a>
-<span class="sourceLineNo">1321</span><a name="line.1321"></a>
-<span class="sourceLineNo">1322</span>  protected Cluster createCluster(List&lt;ServerName&gt; servers, Collection&lt;RegionInfo&gt; regions,<a name="line.1322"></a>
-<span class="sourceLineNo">1323</span>      boolean hasRegionReplica) {<a name="line.1323"></a>
-<span class="sourceLineNo">1324</span>    // Get the snapshot of the current assignments for the regions in question, and then create<a name="line.1324"></a>
-<span class="sourceLineNo">1325</span>    // a cluster out of it. Note that we might have replicas already assigned to some servers<a name="line.1325"></a>
-<span class="sourceLineNo">1326</span>    // earlier. So we want to get the snapshot to see those assignments, but this will only contain<a name="line.1326"></a>
-<span class="sourceLineNo">1327</span>    // replicas of the regions that are passed (for performance).<a name="line.1327"></a>
-<span class="sourceLineNo">1328</span>    Map&lt;ServerName, List&lt;RegionInfo&gt;&gt; clusterState = null;<a name="line.1328"></a>
-<span class="sourceLineNo">1329</span>    if (!hasRegionReplica) {<a name="line.1329"></a>
-<span class="sourceLineNo">1330</span>      clusterState = getRegionAssignmentsByServer(regions);<a name="line.1330"></a>
-<span class="sourceLineNo">1331</span>    } else {<a name="line.1331"></a>
-<span class="sourceLineNo">1332</span>      // for the case where we have region replica it is better we get the entire cluster's snapshot<a name="line.1332"></a>
-<span class="sourceLineNo">1333</span>      clusterState = getRegionAssignmentsByServer(null);<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>    for (ServerName server : servers) {<a name="line.1336"></a>
-<span class="sourceLineNo">1337</span>      if (!clusterState.containsKey(server)) {<a name="line.1337"></a>
-<span class="sourceLineNo">1338</span>        clusterState.put(server, EMPTY_REGION_LIST);<a name="line.1338"></a>
-<span class="sourceLineNo">1339</span>      }<a name="line.1339"></a>
-<span class="sourceLineNo">1340</span>    }<a name="line.1340"></a>
-<span class="sourceLineNo">1341</span>    return new Cluster(regions, clusterState, null, this.regionFinder,<a name="line.1341"></a>
-<span class="sourceLineNo">1342</span>        rackManager);<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>  private List&lt;ServerName&gt; findIdleServers(List&lt;ServerName&gt; servers) {<a name="line.1345"></a>
-<span class="sourceLineNo">1346</span>    return this.services.getServerManager()<a name="line.1346"></a>
-<span class="sourceLineNo">1347</span>            .getOnlineServersListWithPredicator(servers, IDLE_SERVER_PREDICATOR);<a name="line.1347"></a>
-<span class="sourceLineNo">1348</span>  }<a name="line.1348"></a>
-<span class="sourceLineNo">1349</span><a name="line.1349"></a>
-<span class="sourceLineNo">1350</span>  /**<a name="line.1350"></a>
-<span class="sourceLineNo">1351</span>   * Used to assign a single region to a random server.<a name="line.1351"></a>
-<span class="sourceLineNo">1352</span>   */<a name="line.1352"></a>
-<span class="sourceLineNo">1353</span>  @Override<a name="line.1353"></a>
-<span class="sourceLineNo">1354</span>  public ServerName randomAssignment(RegionInfo regionInfo, List&lt;ServerName&gt; servers)<a name="line.1354"></a>
-<span class="sourceLineNo">1355</span>      throws HBaseIOException {<a name="line.1355"></a>
-<span class="sourceLineNo">1356</span>    metricsBalancer.incrMiscInvocations();<a name="line.1356"></a>
-<span class="sourceLineNo">1357</span>    if (servers != null &amp;&amp; servers.contains(masterServerName)) {<a name="line.1357"></a>
-<span class="sourceLineNo">1358</span>      if (shouldBeOnMaster(regionInfo)) {<a name="line.1358"></a>
-<span class="sourceLineNo">1359</span>        return masterServerName;<a name="line.1359"></a>
-<span class="sourceLineNo">1360</span>      }<a name="line.1360"></a>
-<span class="sourceLineNo">1361</span>      if (!LoadBalancer.isTablesOnMaster(getConf())) {<a name="line.1361"></a>
-<span class="sourceLineNo">1362</span>        // Guarantee we do not put any regions on master<a name="line.1362"></a>
-<span class="sourceLineNo">1363</span>        servers = new ArrayList&lt;&gt;(servers);<a name="line.1363"></a>
-<span class="sourceLineNo">1364</span>        servers.remove(masterServerName);<a name="line.1364"></a>
-<span class="sourceLineNo">1365</span>      }<a name="line.1365"></a>
-<span class="sourceLineNo">1366</span>    }<a name="line.1366"></a>
-<span class="sourceLineNo">1367</span><a name="line.1367"></a>
-<span class="sourceLineNo">1368</span>    int numServers = servers == null ? 0 : servers.size();<a name="line.1368"></a>
-<span class="sourceLineNo">1369</span>    if (numServers == 0) {<a name="line.1369"></a>
-<span class="sourceLineNo">1370</span>      LOG.warn("Wanted to retain assignment but no servers to assign to");<a name="line.1370"></a>
-<span class="sourceLineNo">1371</span>      return null;<a name="line.1371"></a>
-<span class="sourceLineNo">1372</span>    }<a name="line.1372"></a>
-<span class="sourceLineNo">1373</span>    if (numServers == 1) { // Only one server, nothing fancy we can do here<a name="line.1373"></a>
-<span class="sourceLineNo">1374</span>      return servers.get(0);<a name="line.1374"></a>
-<span class="sourceLineNo">1375</span>    }<a name="line.1375"></a>
-<span class="sourceLineNo">1376</span>    List&lt;ServerName&gt; idleServers = findIdleServers(servers);<a name="line.1376"></a>
-<span class="sourceLineNo">1377</span>    if (idleServers.size() == 1) {<a name="line.1377"></a>
-<span class="sourceLineNo">1378</span>      return idleServers.get(0);<a name="line.1378"></a>
-<span class="sourceLineNo">1379</span>    }<a name="line.1379"></a>
-<span class="sourceLineNo">1380</span>    final List&lt;ServerName&gt; finalServers = idleServers.isEmpty() ?<a name="line.1380"></a>
-<span class="sourceLineNo">1381</span>            servers : idleServers;<a name="line.1381"></a>
-<span class="sourceLineNo">1382</span>    List&lt;RegionInfo&gt; regions = Lists.newArrayList(regionInfo);<a name="line.1382"></a>
-<span class="sourceLineNo">1383</span>    Cluster cluster = createCluster(finalServers, regions, false);<a name="line.1383"></a>
-<span class="sourceLineNo">1384</span>    return randomAssignment(cluster, regionInfo, finalServers);<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>  /**<a name="line.1387"></a>
-<span class="sourceLineNo">1388</span>   * Generates a bulk assignment startup plan, attempting to reuse the existing<a name="line.1388"></a>
-<span class="sourceLineNo">1389</span>   * assignment information from META, but adjusting for the specified list of<a name="line.1389"></a>
-<span class="sourceLineNo">1390</span>   * available/online servers available for assignment.<a name="line.1390"></a>
-<span class="sourceLineNo">1391</span>   * &lt;p&gt;<a name="line.1391"></a>
-<span class="sourceLineNo">1392</span>   * Takes a map of all regions to their existing assignment from META. Also<a name="line.1392"></a>
-<span class="sourceLineNo">1393</span>   * takes a list of online servers for regions to be assigned to. Attempts to<a name="line.1393"></a>
-<span class="sourceLineNo">1394</span>   * retain all assignment, so in some instances initial assignment will not be<a name="line.1394"></a>
-<span class="sourceLineNo">1395</span>   * completely balanced.<a name="line.1395"></a>
-<span class="sourceLineNo">1396</span>   * &lt;p&gt;<a name="line.1396"></a>
-<span class="sourceLineNo">1397</span>   * Any leftover regions without an existing server to be assigned to will be<a name="line.1397"></a>
-<span class="sourceLineNo">1398</span>   * assigned randomly to available servers.<a name="line.1398"></a>
-<span class="sourceLineNo">1399</span>   *<a name="line.1399"></a>
-<span class="sourceLineNo">1400</span>   * @param regions regions and existing assignment from meta<a name="line.1400"></a>
-<span class="sourceLineNo">1401</span>   * @param servers available servers<a name="line.1401"></a>
-<span class="sourceLineNo">1402</span>   * @return map of servers and regions to be assigned to them<a name="line.1402"></a>
-<span class="sourceLineNo">1403</span>   */<a name="line.1403"></a>
-<span class="sourceLineNo">1404</span>  @Override<a name="line.1404"></a>
-<span class="sourceLineNo">1405</span>  public Map&lt;ServerName, List&lt;RegionInfo&gt;&gt; retainAssignment(Map&lt;RegionInfo, ServerName&gt; regions,<a name="line.1405"></a>
-<span class="sourceLineNo">1406</span>      List&lt;ServerName&gt; servers) throws HBaseIOException {<a name="line.1406"></a>
-<span class="sourceLineNo">1407</span>    // Update metrics<a name="line.1407"></a>
-<span class="sourceLineNo">1408</span>    metricsBalancer.incrMiscInvocations();<a name="line.1408"></a>
-<span class="sourceLineNo">1409</span>    Map&lt;ServerName, List&lt;RegionInfo&gt;&gt; assignments = assignMasterSystemRegions(regions.keySet(), servers);<a name="line.1409"></a>
-<span class="sourceLineNo">1410</span>    if (assignments != null &amp;&amp; !assignments.isEmpty()) {<a name="line.1410"></a>
-<span class="sourceLineNo">1411</span>      servers = new ArrayList&lt;&gt;(servers);<a name="line.1411"></a>
-<span class="sourceLineNo">1412</span>      // Guarantee not to put other regions on master<a name="line.1412"></a>
-<span class="sourceLineNo">1413</span>      servers.remove(masterServerName);<a name="line.1413"></a>
-<span class="sourceLineNo">1414</span>      List&lt;RegionInfo&gt; masterRegions = assignments.get(masterServerName);<a name="line.1414"></a>
-<span class="sourceLineNo">1415</span>      regions = regions.entrySet().stream().filter(e -&gt; !masterRegions.contains(e.getKey()))<a name="line.1415"></a>
-<span class="sourceLineNo">1416</span>          .collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue));<a name="line.1416"></a>
-<span class="sourceLineNo">1417</span>    }<a name="line.1417"></a>
-<span class="sourceLineNo">1418</span>    if (regions.isEmpty()) {<a name="line.1418"></a>
-<span class="sourceLineNo">1419</span>      return assignments;<a name="line.1419"></a>
-<span class="sourceLineNo">1420</span>    }<a name="line.1420"></a>
-<span class="sourceLineNo">1421</span><a name="line.1421"></a>
-<span class="sourceLineNo">1422</span>    int numServers = servers == null ? 0 : servers.size();<a name="line.1422"></a>
-<span class="sourceLineNo">1423</span>    if (numServers == 0) {<a name="line.1423"></a>
-<span class="sourceLineNo">1424</span>      LOG.warn("Wanted to do retain assignment but no servers to assign to");<a name="line.1424"></a>
-<span class="sourceLineNo">1425</span>      return null;<a name="line.1425"></a>
-<span class="sourceLineNo">1426</span>    }<a name="line.1426"></a>
-<span class="sourceLineNo">1427</span>    if (numServers == 1) { // Only one server, nothing fancy we can do here<a name="line.1427"></a>
-<span class="sourceLineNo">1428</span>      ServerName server = servers.get(0);<a name="line.1428"></a>
-<span class="sourceLineNo">1429</span>      assignments.put(server, new ArrayList&lt;&gt;(regions.keySet()));<a name="line.1429"></a>
-<span class="sourceLineNo">1430</span>      return assignments;<a name="line.1430"></a>
-<span class="sourceLineNo">1431</span>    }<a name="line.1431"></a>
-<span class="sourceLineNo">1432</span><a name="line.1432"></a>
-<span class="sourceLineNo">1433</span>    // Group all of the old assignments by their hostname.<a name="line.1433"></a>
-<span class="sourceLineNo">1434</span>    // We can't group directly by ServerName since the servers all have<a name="line.1434"></a>
-<span class="sourceLineNo">1435</span>    // new start-codes.<a name="line.1435"></a>
-<span class="sourceLineNo">1436</span><a name="line.1436"></a>
-<span class="sourceLineNo">1437</span>    // Group the servers by their hostname. It's possible we have multiple<a name="line.1437"></a>
-<span class="sourceLineNo">1438</span>    // servers on the same host on different ports.<a name="line.1438"></a>
-<span class="sourceLineNo">1439</span>    ArrayListMultimap&lt;String, ServerName&gt; serversByHostname = ArrayListMultimap.create();<a name="line.1439"></a>
-<span class="sourceLineNo">1440</span>    for (ServerName server : servers) {<a name="line.1440"></a>
-<span class="sourceLineNo">1441</span>      assignments.put(server, new ArrayList&lt;&gt;());<a name="line.1441"></a>
-<span class="sourceLineNo">1442</span>      serversByHostname.put(server.getHostnameLowerCase(), server);<a name="line.1442"></a>
-<span class="sourceLineNo">1443</span>    }<a name="line.1443"></a>
-<span class="sourceLineNo">1444</span><a name="line.1444"></a>
-<span class="sourceLineNo">1445</span>    // Collection of the hostnames that used to have regions<a name="line.1445"></a>
-<span class="sourceLineNo">1446</span>    // assigned, but for which we no longer have any RS running<a name="line.1446"></a>
-<span class="sourceLineNo">1447</span>    // after the cluster restart.<a name="line.1447"></a>
-<span class="sourceLineNo">1448</span>    Set&lt;String&gt; oldHostsNoLongerPresent = Sets.newTreeSet();<a name="line.1448"></a>
-<span class="sourceLineNo">1449</span><a name="line.1449"></a>
-<span class="sourceLineNo">1450</span>    // If the old servers aren't present, lets assign those regions later.<a name="line.1450"></a>
-<span class="sourceLineNo">1451</span>    List&lt;RegionInfo&gt; randomAssignRegions = Lists.newArrayList();<a name="line.1451"></a>
-<span class="sourceLineNo">1452</span><a name="line.1452"></a>
-<span class="sourceLineNo">1453</span>    int numRandomAssignments = 0;<a name="line.1453"></a>
-<span class="sourceLineNo">1454</span>    int numRetainedAssigments = 0;<a name="line.1454"></a>
-<span class="sourceLineNo">1455</span>    boolean hasRegionReplica = false;<a name="line.1455"></a>
-<span class="sourceLineNo">1456</span>    for (Map.Entry&lt;RegionInfo, ServerName&gt; entry : regions.entrySet()) {<a name="line.1456"></a>
-<span class="sourceLineNo">1457</span>      RegionInfo region = entry.getKey();<a name="line.1457"></a>
-<span class="sourceLineNo">1458</span>      ServerName oldServerName = entry.getValue();<a name="line.1458"></a>
-<span class="sourceLineNo">1459</span>      // In the current set of regions even if one has region replica let us go with<a name="line.1459"></a>
-<span class="sourceLineNo">1460</span>      // getting the entire snapshot<a name="line.1460"></a>
-<span class="sourceLineNo">1461</span>      if (this.services != null) { // for tests<a name="line.1461"></a>
-<span class="sourceLineNo">1462</span>        AssignmentManager am = this.services.getAssignmentManager();<a name="line.1462"></a>
-<span class="sourceLineNo">1463</span>        if (am != null) {<a name="line.1463"></a>
-<span class="sourceLineNo">1464</span>          RegionStates states = am.getRegionStates();<a name="line.1464"></a>
-<span class="sourceLineNo">1465</span>          if (!hasRegionReplica &amp;&amp; states != null &amp;&amp; states.isReplicaAvailableForRegion(region)) {<a name="line.1465"></a>
-<span class="sourceLineNo">1466</span>            hasRegionReplica = true;<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>      List&lt;ServerName&gt; localServers = new ArrayList&lt;&gt;();<a name="line.1470"></a>
-<span class="sourceLineNo">1471</span>      if (oldServerName != null) {<a name="line.1471"></a>
-<span class="sourceLineNo">1472</span>        localServers = serversByHostname.get(oldServerName.getHostnameLowerCase());<a name="line.1472"></a>
-<span class="sourceLineNo">1473</span>      }<a name="line.1473"></a>
-<span class="sourceLineNo">1474</span>      if (localServers.isEmpty()) {<a name="line.1474"></a>
-<span class="sourceLineNo">1475</span>        // No servers on the new cluster match up with this hostname, assign randomly, later.<a name="line.1475"></a>
-<span class="sourceLineNo">1476</span>        randomAssignRegions.add(region);<a name="line.1476"></a>
-<span class="sourceLineNo">1477</span>        if (oldServerName != null) {<a name="line.1477"></a>
-<span class="sourceLineNo">1478</span>          oldHostsNoLongerPresent.add(oldServerName.getHostnameLowerCase());<a name="line.1478"></a>
-<span class="sourceLineNo">1479</span>        }<a name="line.1479"></a>
-<span class="sourceLineNo">1480</span>      } else if (localServers.size() == 1) {<a name="line.1480"></a>
-<span class="sourceLineNo">1481</span>        // the usual case - one new server on same host<a name="line.1481"></a>
-<span class="sourceLineNo">1482</span>        ServerName target = localServers.get(0);<a name="line.1482"></a>
-<span class="sourceLineNo">1483</span>        assignments.get(target).add(region);<a name="line.1483"></a>
-<span class="sourceLineNo">1484</span>        numRetainedAssigments++;<a name="line.1484"></a>
-<span class="sourceLineNo">1485</span>      } else {<a name="line.1485"></a>
-<span class="sourceLineNo">1486</span>        // multiple new servers in the cluster on this same host<a name="line.1486"></a>
-<span class="sourceLineNo">1487</span>        if (localServers.contains(oldServerName)) {<a name="line.1487"></a>
-<span class="sourceLineNo">1488</span>          assignments.get(oldServerName).add(region);<a name="line.1488"></a>
-<span class="sourceLineNo">1489</span>          numRetainedAssigments++;<a name="line.1489"></a>
-<span class="sourceLineNo">1490</span>        } else {<a name="line.1490"></a>
-<span class="sourceLineNo">1491</span>          ServerName target = null;<a name="line.1491"></a>
-<span class="sourceLineNo">1492</span>          for (ServerName tmp : localServers) {<a name="line.1492"></a>
-<span class="sourceLineNo">1493</span>            if (tmp.getPort() == oldServerName.getPort()) {<a name="line.1493"></a>
-<span class="sourceLineNo">1494</span>              target = tmp;<a name="line.1494"></a>
-<span class="sourceLineNo">1495</span>              assignments.get(tmp).add(region);<a name="line.1495"></a>
-<span class="sourceLineNo">1496</span>              numRetainedAssigments++;<a name="line.1496"></a>
-<span class="sourceLineNo">1497</span>              break;<a name="line.1497"></a>
-<span class="sourceLineNo">1498</span>            }<a name="line.1498"></a>
-<span class="sourceLineNo">1499</span>          }<a name="line.1499"></a>
-<span class="sourceLineNo">1500</span>          if (target == null) {<a name="line.1500"></a>
-<span class="sourceLineNo">1501</span>            randomAssignRegions.add(region);<a name="line.1501"></a>
-<span class="sourceLineNo">1502</span>          }<a name="line.1502"></a>
-<span class="sourceLineNo">1503</span>        }<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><a name="line.1506"></a>
-<span class="sourceLineNo">1507</span>    // If servers from prior assignment aren't present, then lets do randomAssignment on regions.<a name="line.1507"></a>
-<span class="sourceLineNo">1508</span>    if (randomAssignRegions.size() &gt; 0) {<a name="line.1508"></a>
-<span class="sourceLineNo">1509</span>      Cluster cluster = createCluster(servers, regions.keySet(), hasRegionReplica);<a name="line.1509"></a>
-<span class="sourceLineNo">1510</span>      for (Map.Entry&lt;ServerName, List&lt;RegionInfo&gt;&gt; entry : assignments.entrySet()) {<a name="line.1510"></a>
-<span class="sourceLineNo">1511</span>        ServerName sn = entry.getKey();<a name="line.1511"></a>
-<span class="sourceLineNo">1512</span>        for (RegionInfo region : entry.getValue()) {<a name="line.1512"></a>
-<span class="sourceLineNo">1513</span>          cluster.doAssignRegion(region, sn);<a name="line.1513"></a>
-<span class="sourceLineNo">1514</span>        }<a name="line.1514"></a>
-<span class="sourceLineNo">1515</span>      }<a name="line.1515"></a>
-<span class="sourceLineNo">1516</span>      for (RegionInfo region : randomAssignRegions) {<a name="line.1516"></a>
-<span class="sourceLineNo">1517</span>        ServerName target = randomAssignment(cluster, region, servers);<a name="line.1517"></a>
-<span class="sourceLineNo">1518</span>        assignments.get(target).add(region);<a name="line.1518"></a>
-<span class="sourceLineNo">1519</span>        numRandomAssignments++;<a name="line.1519"></a>
-<span class="sourceLineNo">1520</span>      }<a name="line.1520"></a>
-<span class="sourceLineNo">1521</span>    }<a name="line.1521"></a>
-<span class="sourceLineNo">1522</span><a name="line.1522"></a>
-<span class="sourceLineNo">1523</span>    String randomAssignMsg = "";<a name="line.1523"></a>
-<span class="sourceLineNo">1524</span>    if (numRandomAssignments &gt; 0) {<a name="line.1524"></a>
-<span class="sourceLineNo">1525</span>      randomAssignMsg =<a name="line.1525"></a>
-<span class="sourceLineNo">1526</span>          numRandomAssignments + " regions were assigned "<a name="line.1526"></a>
-<span class="sourceLineNo">1527</span>              + "to random hosts, since the old hosts for these regions are no "<a name="line.1527"></a>
-<span class="sourceLineNo">1528</span>              + "longer present in the cluster. These hosts were:\n  "<a name="line.1528"></a>
-<span class="sourceLineNo">1529</span>              + Joiner.on("\n  ").join(oldHostsNoLongerPresent);<a name="line.1529"></a>
-<span class="sourceLineNo">1530</span>    }<a name="line.1530"></a>
-<span class="sourceLineNo">1531</span><a name="line.1531"></a>
-<span class="sourceLineNo">1532</span>    LOG.info("Reassigned " + regions.size() + " regions. " + numRetainedAssigments<a name="line.1532"></a>
-<span class="sourceLineNo">1533</span>        + " retained the pre-restart assignment. " + randomAssignMsg);<a name="line.1533"></a>
-<span class="sourceLineNo">1534</span>    return assignments;<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>  @Override<a name="line.1537"></a>
-<span class="sourceLineNo">1538</span>  public void initialize() throws HBaseIOException{<a name="line.1538"></a>
-<span class="sourceLineNo">1539</span>  }<a name="line.1539"></a>
-<span class="sourceLineNo">1540</span><a name="line.1540"></a>
-<span class="sourceLineNo">1541</span>  @Override<a name="line.1541"></a>
-<span class="sourceLineNo">1542</span>  public void regionOnline(RegionInfo regionInfo, ServerName sn) {<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>  @Override<a name="line.1545"></a>
-<span class="sourceLineNo">1546</span>  public void regionOffline(RegionInfo regionInfo) {<a name="line.1546"></a>
-<span class="sourceLineNo">1547</span>  }<a name="line.1547"></a>
-<span class="sourceLineNo">1548</span><a name="line.1548"></a>
-<span class="sourceLineNo">1549</span>  @Override<a name="line.1549"></a>
-<span class="sourceLineNo">1550</span>  public boolean isStopped() {<a name="line.1550"></a>
-<span class="sourceLineNo">1551</span>    return stopped;<a name="line.1551"></a>
-<span class="sourceLineNo">1552</span>  }<a name="line.1552"></a>
-<span class="sourceLineNo">1553</span><a name="line.1553"></a>
-<span class="sourceLineNo">1554</span>  @Override<a name="line.1554"></a>
-<span class="sourceLineNo">1555</span>  public void stop(String why) {<a name="line.1555"></a>
-<span class="sourceLineNo">1556</span>    LOG.info("Load Balancer stop requested: "+why);<a name="line.1556"></a>
-<span class="sourceLineNo">1557</span>    stopped = true;<a name="line.1557"></a>
-<span class="sourceLineNo">1558</span>  }<a name="line.1558"></a>
-<span class="sourceLineNo">1559</span><a name="line.1559"></a>
-<span class="sourceLineNo">1560</span>  /**<a name="line.1560"></a>
-<span class="sourceLineNo">1561</span>  * Updates the balancer status tag reported to JMX<a name="line.1561"></a>
-<span class="sourceLineNo">1562</span>  */<a name="line.1562"></a>
-<span class="sourceLineNo">1563</span>  public void updateBalancerStatus(boolean status) {<a name="line.1563"></a>
-<span class="sourceLineNo">1564</span>    metricsBalancer.balancerStatus(status);<a name="line.1564"></a>
-<span class="sourceLineNo">1565</span>  }<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>   * Used to assign a single region to a random server.<a name="line.1568"></a>
-<span class="sourceLineNo">1569</span>   */<a name="line.1569"></a>
-<span class="sourceLineNo">1570</span>  private ServerName randomAssignment(Cluster cluster, RegionInfo regionInfo,<a name="line.1570"></a>
-<span class="sourceLineNo">1571</span>      List&lt;ServerName&gt; servers) {<a name="line.1571"></a>
-<span class="sourceLineNo">1572</span>    int numServers = servers.size(); // servers is not null, numServers &gt; 1<a name="line.1572"></a>
-<span class="sourceLineNo">1573</span>    ServerName sn = null;<a name="line.1573"></a>
-<span class="sourceLineNo">1574</span>    final int maxIterations = numServers * 4;<a name="line.1574"></a>
-<span class="sourceLineNo">1575</span>    int iterations = 0;<a name="line.1575"></a>
-<span class="sourceLineNo">1576</span>    List&lt;ServerName&gt; usedSNs = new ArrayList&lt;&gt;(servers.size());<a name="line.1576"></a>
-<span class="sourceLineNo">1577</span>    do {<a name="line.1577"></a>
-<span class="sourceLineNo">1578</span>      int i = RANDOM.nextInt(numServers);<a name="line.1578"></a>
-<span class="sourceLineNo">1579</span>      sn = servers.get(i);<a name="line.1579"></a>
-<span class="sourceLineNo">1580</span>      if (!usedSNs.contains(sn)) {<a name="line.1580"></a>
-<span class="sourceLineNo">1581</span>        usedSNs.add(sn);<a name="line.1581"></a>
-<span class="sourceLineNo">1582</span>      }<a name="line.1582"></a>
-<span class="sourceLineNo">1583</span>    } while (cluster.wouldLowerAvailability(regionInfo, sn)<a name="line.1583"></a>
-<span class="sourceLineNo">1584</span>        &amp;&amp; iterations++ &lt; maxIterations);<a name="line.1584"></a>
-<span class="sourceLineNo">1585</span>    if (iterations &gt;= maxIterations) {<a name="line.1585"></a>
-<span class="sourceLineNo">1586</span>      // We have reached the max. Means the servers that we collected is still lowering the<a name="line.1586"></a>
-<span class="sourceLineNo">1587</span>      // availability<a name="line.1587"></a>
-<span class="sourceLineNo">1588</span>      for (ServerName unusedServer : servers) {<a name="line.1588"></a>
-<span class="sourceLineNo">1589</span>        if (!usedSNs.contains(unusedServer)) {<a name="line.1589"></a>
-<span class="sourceLineNo">1590</span>          // check if any other unused server is there for us to use.<a name="line.1590"></a>
-<span class="sourceLineNo">1591</span>          // If so use it. Else we have not other go but to go with one of them<a name="line.1591"></a>
-<span class="sourceLineNo">1592</span>          if (!cluster.wouldLowerAvailability(regionInfo, unusedServer)) {<a name="line.1592"></a>
-<span class="sourceLineNo">1593</span>            sn = unusedServer;<a name="line.1593"></a>
-<span class="sourceLineNo">1594</span>            break;<a name="line.1594"></a>
-<span class="sourceLineNo">1595</span>          }<a name="line.1595"></a>
-<span class="sourceLineNo">1596</span>        }<a name="line.1596"></a>
-<span class="sourceLineNo">1597</span>      }<a name="line.1597"></a>
-<span class="sourceLineNo">1598</span>    }<a name="line.1598"></a>
-<span class="sourceLineNo">1599</span>    cluster.doAssignRegion(regionInfo, sn);<a name="line.1599"></a>
-<span class="sourceLineNo">1600</span>    return sn;<a name="line.1600"></a>
-<span class="sourceLineNo">1601</span>  }<a name="line.1601"></a>
-<span class="sourceLineNo">1602</span><a name="line.1602"></a>
-<span class="sourceLineNo">1603</span>  /**<a name="line.1603"></a>
-<span class="sourceLineNo">1604</span>   * Round robin a list of regions to a list of servers<a name="line.1604"></a>
-<span class="sourceLineNo">1605</span>   */<a name="line.1605"></a>
-<span class="sourceLineNo">1606</span>  private void roundRobinAssignment(Cluster cluster, List&lt;RegionInfo&gt; regions,<a name="line.1606"></a>
-<span class="sourceLineNo">1607</span>      List&lt;RegionInfo&gt; unassignedRegions, List&lt;ServerName&gt; servers,<a name="line.1607"></a>
-<span class="sourceLineNo">1608</span>      Map&lt;ServerName, List&lt;RegionInfo&gt;&gt; assignments) {<a name="line.1608"></a>
-<span class="sourceLineNo">1609</span><a name="line.1609"></a>
-<span class="sourceLineNo">1610</span>    int numServers = servers.size();<a name="line.1610"></a>
-<span class="sourceLineNo">1611</span>    int numRegions = regions.size();<a name="line.1611"></a>
-<span class="sourceLineNo">1612</span>    int max = (int) Math.ceil((float) numRegions / numServers);<a name="line.1612"></a>
-<span class="sourceLineNo">1613</span>    int serverIdx = 0;<a name="line.1613"></a>
-<span class="sourceLineNo">1614</span>    if (numServers &gt; 1) {<a name="line.1614"></a>
-<span class="sourceLineNo">1615</span>      serverIdx = RANDOM.nextInt(numServers);<a name="line.1615"></a>
-<span class="sourceLineNo">1616</span>    }<a name="line.1616"></a>
-<span class="sourceLineNo">1617</span>    int regionIdx = 0;<a name="line.1617"></a>
-<span class="sourceLineNo">1618</span><a name="line.1618"></a>
-<span class="sourceLineNo">1619</span>    for (int j = 0; j &lt; numServers; j++) {<a name="line.1619"></a>
-<span class="sourceLineNo">1620</span>      ServerName server = servers.get((j + serverIdx) % numServers);<a name="line.1620"></a>
-<span class="sourceLineNo">1621</span>      List&lt;RegionInfo&gt; serverRegions = new ArrayList&lt;&gt;(max);<a name="line.1621"></a>
-<span class="sourceLineNo">1622</span>      for (int i = regionIdx; i &lt; numRegions; i += numServers) {<a name="line.1622"></a>
-<span class="sourceLineNo">1623</span>        RegionInfo region = regions.get(i % numRegions);<a name="line.1623"></a>
-<span class="sourceLineNo">1624</span>        if (cluster.wouldLowerAvailability(region, server)) {<a name="line.1624"></a>
-<span class="sourceLineNo">1625</span>          unassignedRegions.add(region);<a name="line.1625"></a>
-<span class="sourceLineNo">1626</span>        } else {<a name="line.1626"></a>
-<span class="sourceLineNo">1627</span>          serverRegions.add(region);<a name="line.1627"></a>
-<span class="sourceLineNo">1628</span>          cluster.doAssignRegion(region, server);<a name="line.1628"></a>
-<span class="sourceLineNo">1629</span>        }<a name="line.1629"></a>
-<span class="sourceLineNo">1630</span>      }<a name="line.1630"></a>
-<span class="sourceLineNo">1631</span>      assignments.put(server, serverRegions);<a name="line.1631"></a>
-<span class="sourceLineNo">1632</span>      regionIdx++;<a name="line.1632"></a>
-<span class="sourceLineNo">1633</span>    }<a name="line.1633"></a>
-<span class="sourceLineNo">1634</span>  }<a name="line.1634"></a>
-<span class="sourceLineNo">1635</span><a name="line.1635"></a>
-<span class="sourceLineNo">1636</span>  protected Map&lt;ServerName, List&lt;RegionInfo&gt;&gt; getRegionAssignmentsByServer(<a name="line.1636"></a>
-<span class="sourceLineNo">1637</span>    Collection&lt;RegionInfo&gt; regions) {<a name="line.1637"></a>
-<span class="sourceLineNo">1638</span>    if (this.services != null &amp;&amp; this.services.getAssignmentManager() != null) {<a name="line.1638"></a>
-<span class="sourceLineNo">1639</span>      return this.services.getAssignmentManager().getSnapShotOfAssignment(regions);<a name="line.1639"></a>
-<span class="sourceLineNo">1640</span>    } else {<a name="line.1640"></a>
-<span class="sourceLineNo">1641</span>      return new HashMap&lt;&gt;();<a name="line.1641"></a>
-<span class="sourceLineNo">1642</span>    }<a name="line.1642"></a>
-<span class="sourceLineNo">1643</span>  }<a name="line.1643"></a>
-<span class="sourceLineNo">1644</span><a name="line.1644"></a>
-<span class="sourceLineNo">1645</span>  @Override<a name="line.1645"></a>
-<span class="sourceLineNo">1646</span>  public void onConfigurationChange(Configuration conf) {<a name="line.1646"></a>
-<span class="sourceLineNo">1647</span>  }<a name="line.1647"></a>
-<span class="sourceLineNo">1648</span>}<a name="line.1648"></a>
+<span class="sourceLineNo">1044</span>  /**<a name="line.1044"></a>
+<span class="sourceLineNo">1045</span>   * Check if a region belongs to some system table.<a name="line.1045"></a>
+<span class="sourceLineNo">1046</span>   * If so, the primary replica may be expected to be put on the master regionserver.<a name="line.1046"></a>
+<span class="sourceLineNo">1047</span>   */<a name="line.1047"></a>
+<span class="sourceLineNo">1048</span>  public boolean shouldBeOnMaster(RegionInfo region) {<a name="line.1048"></a>
+<span class="sourceLineNo">1049</span>    return (this.maintenanceMode || this.onlySystemTablesOnMaster)<a name="line.1049"></a>
+<span class="sourceLineNo">1050</span>        &amp;&amp; region.getTable().isSystemTable();<a name="line.1050"></a>
+<span class="sourceLineNo">1051</span>  }<a name="line.1051"></a>
+<span class="sourceLineNo">1052</span><a name="line.1052"></a>
+<span class="sourceLineNo">1053</span>  /**<a name="line.1053"></a>
+<span class="sourceLineNo">1054</span>   * Balance the regions that should be on master regionserver.<a name="line.1054"></a>
+<span class="sourceLineNo">1055</span>   */<a name="line.1055"></a>
+<span class="sourceLineNo">1056</span>  protected List&lt;RegionPlan&gt; balanceMasterRegions(Map&lt;ServerName, List&lt;RegionInfo&gt;&gt; clusterMap) {<a name="line.1056"></a>
+<span class="sourceLineNo">1057</span>    if (masterServerName == null || clusterMap == null || clusterMap.size() &lt;= 1) return null;<a name="line.1057"></a>
+<span class="sourceLineNo">1058</span>    List&lt;RegionPlan&gt; plans = null;<a name="line.1058"></a>
+<span class="sourceLineNo">1059</span>    List&lt;RegionInfo&gt; regions = clusterMap.get(masterServerName);<a name="line.1059"></a>
+<span class="sourceLineNo">1060</span>    if (regions != null) {<a name="line.1060"></a>
+<span class="sourceLineNo">1061</span>      Iterator&lt;ServerName&gt; keyIt = null;<a name="line.1061"></a>
+<span class="sourceLineNo">1062</span>      for (RegionInfo region: regions) {<a name="line.1062"></a>
+<span class="sourceLineNo">1063</span>        if (shouldBeOnMaster(region)) continue;<a name="line.1063"></a>
+<span class="sourceLineNo">1064</span><a name="line.1064"></a>
+<span class="sourceLineNo">1065</span>        // Find a non-master regionserver to host the region<a name="line.1065"></a>
+<span class="sourceLineNo">1066</span>        if (keyIt == null || !keyIt.hasNext()) {<a name="line.1066"></a>
+<span class="sourceLineNo">1067</span>          keyIt = clusterMap.keySet().iterator();<a name="line.1067"></a>
+<span class="sourceLineNo">1068</span>        }<a name="line.1068"></a>
+<span class="sourceLineNo">1069</span>        ServerName dest = keyIt.next();<a name="line.1069"></a>
+<span class="sourceLineNo">1070</span>        if (masterServerName.equals(dest)) {<a name="line.1070"></a>
+<span class="sourceLineNo">1071</span>          if (!keyIt.hasNext()) {<a name="line.1071"></a>
+<span class="sourceLineNo">1072</span>            keyIt = clusterMap.keySet().iterator();<a name="line.1072"></a>
+<span class="sourceLineNo">1073</span>          }<a name="line.1073"></a>
+<span class="sourceLineNo">1074</span>          dest = keyIt.next();<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>        // Move this region away from the master regionserver<a name="line.1077"></a>
+<span class="sourceLineNo">1078</span>        RegionPlan plan = new RegionPlan(region, masterServerName, dest);<a name="line.1078"></a>
+<span class="sourceLineNo">1079</span>        if (plans == null) {<a name="line.1079"></a>
+<span class="sourceLineNo">1080</span>          plans = new ArrayList&lt;&gt;();<a name="line.1080"></a>
+<span class="sourceLineNo">1081</span>        }<a name="line.1081"></a>
+<span class="sourceLineNo">1082</span>        plans.add(plan);<a name="line.1082"></a>
+<span class="sourceLineNo">1083</span>      }<a name="line.1083"></a>
+<span class="sourceLineNo">1084</span>    }<a name="line.1084"></a>
+<span class="sourceLineNo">1085</span>    for (Map.Entry&lt;ServerName, List&lt;RegionInfo&gt;&gt; server: clusterMap.entrySet()) {<a name="line.1085"></a>
+<span class="sourceLineNo">1086</span>      if (masterServerName.equals(server.getKey())) continue;<a name="line.1086"></a>
+<span class="sourceLineNo">1087</span>      for (RegionInfo region: server.getValue()) {<a name="line.1087"></a>
+<span class="sourceLineNo">1088</span>        if (!shouldBeOnMaster(region)) continue;<a name="line.1088"></a>
+<span class="sourceLineNo">1089</span><a name="line.1089"></a>
+<span class="sourceLineNo">1090</span>        // Move this region to the master regionserver<a name="line.1090"></a>
+<span class="sourceLineNo">1091</span>        RegionPlan plan = new RegionPlan(region, server.getKey(), masterServerName);<a name="line.1091"></a>
+<span class="sourceLineNo">1092</span>        if (plans == null) {<a name="line.1092"></a>
+<span class="sourceLineNo">1093</span>          plans = new ArrayList&lt;&gt;();<a name="line.1093"></a>
+<span class="sourceLineNo">1094</span>        }<a name="line.1094"></a>
+<span class="sourceLineNo">1095</span>        plans.add(plan);<a name="line.1095"></a>
+<span class="sourceLineNo">1096</span>      }<a name="line.1096"></a>
+<span class="sourceLineNo">1097</span>    }<a name="line.1097"></a>
+<span class="sourceLineNo">1098</span>    return plans;<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>  /**<a name="line.1101"></a>
+<span class="sourceLineNo">1102</span>   * If master is configured to carry system tables only, in here is<a name="line.1102"></a>
+<span class="sourceLineNo">1103</span>   * where we figure what to assign it.<a name="line.1103"></a>
+<span class="sourceLineNo">1104</span>   */<a name="line.1104"></a>
+<span class="sourceLineNo">1105</span>  protected Map&lt;ServerName, List&lt;RegionInfo&gt;&gt; assignMasterSystemRegions(<a name="line.1105"></a>
+<span class="sourceLineNo">1106</span>      Collection&lt;RegionInfo&gt; regions, List&lt;ServerName&gt; servers) {<a name="line.1106"></a>
+<span class="sourceLineNo">1107</span>    if (servers == null || regions == null || regions.isEmpty()) {<a name="line.1107"></a>
+<span class="sourceLineNo">1108</span>      return null;<a name="line.1108"></a>
+<span class="sourceLineNo">1109</span>    }<a name="line.1109"></a>
+<span class="sourceLineNo">1110</span>    Map&lt;ServerName, List&lt;RegionInfo&gt;&gt; assignments = new TreeMap&lt;&gt;();<a name="line.1110"></a>
+<span class="sourceLineNo">1111</span>    if (this.maintenanceMode || this.onlySystemTablesOnMaster) {<a name="line.1111"></a>
+<span class="sourceLineNo">1112</span>      if (masterServerName != null &amp;&amp; servers.contains(masterServerName)) {<a name="line.1112"></a>
+<span class="sourceLineNo">1113</span>        assignments.put(masterServerName, new ArrayList&lt;&gt;());<a name="line.1113"></a>
+<span class="sourceLineNo">1114</span>        for (RegionInfo region : regions) {<a name="line.1114"></a>
+<span class="sourceLineNo">1115</span>          if (shouldBeOnMaster(region)) {<a name="line.1115"></a>
+<span class="sourceLineNo">1116</span>            assignments.get(masterServerName).add(region);<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>      }<a name="line.1119"></a>
+<span class="sourceLineNo">1120</span>    }<a name="line.1120"></a>
+<span class="sourceLineNo">1121</span>    return assignments;<a name="line.1121"></a>
+<span class="sourceLineNo">1122</span>  }<a name="line.1122"></a>
+<span class="sourceLineNo">1123</span><a name="line.1123"></a>
+<span class="sourceLineNo">1124</span>  @Override<a name="line.1124"></a>
+<span class="sourceLineNo">1125</span>  public Configuration getConf() {<a name="line.1125"></a>
+<span class="sourceLineNo">1126</span>    return this.config;<a name="line.1126"></a>
+<span class="sourceLineNo">1127</span>  }<a name="line.1127"></a>
+<span class="sourceLineNo">1128</span><a name="line.1128"></a>
+<span class="sourceLineNo">1129</span>  @Override<a name="line.1129"></a>
+<span class="sourceLineNo">1130</span>  public synchronized void setClusterMetrics(ClusterMetrics st) {<a name="line.1130"></a>
+<span class="sourceLineNo">1131</span>    this.clusterStatus = st;<a name="line.1131"></a>
+<span class="sourceLineNo">1132</span>    if (useRegionFinder) {<a name="line.1132"></a>
+<span class="sourceLineNo">1133</span>      regionFinder.setClusterMetrics(st);<a name="line.1133"></a>
+<span class="sourceLineNo">1134</span>    }<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 void setClusterLoad(Map&lt;TableName, Map&lt;ServerName, List&lt;RegionInfo&gt;&gt;&gt; clusterLoad){<a name="line.1138"></a>
+<span class="sourceLineNo">1139</span><a name="line.1139"></a>
+<span class="sourceLineNo">1140</span>  }<a name="line.1140"></a>
+<span class="sourceLineNo">1141</span><a name="line.1141"></a>
+<span class="sourceLineNo">1142</span>  @Override<a name="line.1142"></a>
+<span class="sourceLineNo">1143</span>  public void setMasterServices(MasterServices masterServices) {<a name="line.1143"></a>
+<span class="sourceLineNo">1144</span>    masterServerName = masterServices.getServerName();<a name="line.1144"></a>
+<span class="sourceLineNo">1145</span>    this.services = masterServices;<a name="line.1145"></a>
+<span class="sourceLineNo">1146</span>    if (useRegionFinder) {<a name="line.1146"></a>
+<span class="sourceLineNo">1147</span>      this.regionFinder.setServices(masterServices);<a name="line.1147"></a>
+<span class="sourceLineNo">1148</span>    }<a name="line.1148"></a>
+<span class="sourceLineNo">1149</span>    if (this.services.isInMaintenanceMode()) {<a name="line.1149"></a>
+<span class="sourceLineNo">1150</span>      this.maintenanceMode = true;<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><a name="line.1153"></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 (this.maintenanceMode || 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 na

<TRUNCATED>

[04/46] hbase-site git commit: Published site at 05d22ed960204183fbd9bd16f1dbca6410ccde76.

Posted by gi...@apache.org.
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/3649682c/devapidocs/src-html/org/apache/hadoop/hbase/util/IdLock.Entry.html
----------------------------------------------------------------------
diff --git a/devapidocs/src-html/org/apache/hadoop/hbase/util/IdLock.Entry.html b/devapidocs/src-html/org/apache/hadoop/hbase/util/IdLock.Entry.html
index 8c0a262..5131a2c 100644
--- a/devapidocs/src-html/org/apache/hadoop/hbase/util/IdLock.Entry.html
+++ b/devapidocs/src-html/org/apache/hadoop/hbase/util/IdLock.Entry.html
@@ -89,114 +89,131 @@
 <span class="sourceLineNo">081</span>              existing.wait();<a name="line.81"></a>
 <span class="sourceLineNo">082</span>            } catch (InterruptedException e) {<a name="line.82"></a>
 <span class="sourceLineNo">083</span>              --existing.numWaiters;  // Remove ourselves from waiters.<a name="line.83"></a>
-<span class="sourceLineNo">084</span>              throw new InterruptedIOException(<a name="line.84"></a>
-<span class="sourceLineNo">085</span>                  "Interrupted waiting to acquire sparse lock");<a name="line.85"></a>
-<span class="sourceLineNo">086</span>            }<a name="line.86"></a>
-<span class="sourceLineNo">087</span>          }<a name="line.87"></a>
-<span class="sourceLineNo">088</span><a name="line.88"></a>
-<span class="sourceLineNo">089</span>          --existing.numWaiters;  // Remove ourselves from waiters.<a name="line.89"></a>
-<span class="sourceLineNo">090</span>          existing.locked = true;<a name="line.90"></a>
-<span class="sourceLineNo">091</span>          return existing;<a name="line.91"></a>
-<span class="sourceLineNo">092</span>        }<a name="line.92"></a>
-<span class="sourceLineNo">093</span>        // If the entry is not locked, it might already be deleted from the<a name="line.93"></a>
-<span class="sourceLineNo">094</span>        // map, so we cannot return it. We need to get our entry into the map<a name="line.94"></a>
-<span class="sourceLineNo">095</span>        // or get someone else's locked entry.<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>    return entry;<a name="line.98"></a>
-<span class="sourceLineNo">099</span>  }<a name="line.99"></a>
-<span class="sourceLineNo">100</span><a name="line.100"></a>
-<span class="sourceLineNo">101</span>  /**<a name="line.101"></a>
-<span class="sourceLineNo">102</span>   * Blocks until the lock corresponding to the given id is acquired.<a name="line.102"></a>
-<span class="sourceLineNo">103</span>   *<a name="line.103"></a>
-<span class="sourceLineNo">104</span>   * @param id an arbitrary number to lock on<a name="line.104"></a>
-<span class="sourceLineNo">105</span>   * @param time time to wait in ms<a name="line.105"></a>
-<span class="sourceLineNo">106</span>   * @return an "entry" to pass to {@link #releaseLockEntry(Entry)} to release<a name="line.106"></a>
-<span class="sourceLineNo">107</span>   *         the lock<a name="line.107"></a>
-<span class="sourceLineNo">108</span>   * @throws IOException if interrupted<a name="line.108"></a>
-<span class="sourceLineNo">109</span>   */<a name="line.109"></a>
-<span class="sourceLineNo">110</span>  public Entry tryLockEntry(long id, long time) throws IOException {<a name="line.110"></a>
-<span class="sourceLineNo">111</span>    Preconditions.checkArgument(time &gt;= 0);<a name="line.111"></a>
-<span class="sourceLineNo">112</span>    Entry entry = new Entry(id);<a name="line.112"></a>
-<span class="sourceLineNo">113</span>    Entry existing;<a name="line.113"></a>
-<span class="sourceLineNo">114</span>    long waitUtilTS = System.currentTimeMillis() + time;<a name="line.114"></a>
-<span class="sourceLineNo">115</span>    long remaining = time;<a name="line.115"></a>
-<span class="sourceLineNo">116</span>    while ((existing = map.putIfAbsent(entry.id, entry)) != null) {<a name="line.116"></a>
-<span class="sourceLineNo">117</span>      synchronized (existing) {<a name="line.117"></a>
-<span class="sourceLineNo">118</span>        if (existing.locked) {<a name="line.118"></a>
-<span class="sourceLineNo">119</span>          ++existing.numWaiters;  // Add ourselves to waiters.<a name="line.119"></a>
-<span class="sourceLineNo">120</span>          try {<a name="line.120"></a>
-<span class="sourceLineNo">121</span>            while (existing.locked) {<a name="line.121"></a>
-<span class="sourceLineNo">122</span>              existing.wait(remaining);<a name="line.122"></a>
-<span class="sourceLineNo">123</span>              if (existing.locked) {<a name="line.123"></a>
-<span class="sourceLineNo">124</span>                long currentTS = System.currentTimeMillis();<a name="line.124"></a>
-<span class="sourceLineNo">125</span>                if (currentTS &gt;= waitUtilTS) {<a name="line.125"></a>
-<span class="sourceLineNo">126</span>                  // time is up<a name="line.126"></a>
-<span class="sourceLineNo">127</span>                  return null;<a name="line.127"></a>
-<span class="sourceLineNo">128</span>                } else {<a name="line.128"></a>
-<span class="sourceLineNo">129</span>                  // our wait is waken, but the lock is still taken, this can happen<a name="line.129"></a>
-<span class="sourceLineNo">130</span>                  // due to JDK Object's wait/notify mechanism.<a name="line.130"></a>
-<span class="sourceLineNo">131</span>                  // Calculate the new remaining time to wait<a name="line.131"></a>
-<span class="sourceLineNo">132</span>                  remaining = waitUtilTS - currentTS;<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><a name="line.135"></a>
-<span class="sourceLineNo">136</span>            }<a name="line.136"></a>
-<span class="sourceLineNo">137</span>          } catch (InterruptedException e) {<a name="line.137"></a>
-<span class="sourceLineNo">138</span>            throw new InterruptedIOException(<a name="line.138"></a>
-<span class="sourceLineNo">139</span>                "Interrupted waiting to acquire sparse lock");<a name="line.139"></a>
-<span class="sourceLineNo">140</span>          } finally {<a name="line.140"></a>
-<span class="sourceLineNo">141</span>            --existing.numWaiters;  // Remove ourselves from waiters.<a name="line.141"></a>
-<span class="sourceLineNo">142</span>          }<a name="line.142"></a>
-<span class="sourceLineNo">143</span>          existing.locked = true;<a name="line.143"></a>
-<span class="sourceLineNo">144</span>          return existing;<a name="line.144"></a>
-<span class="sourceLineNo">145</span>        }<a name="line.145"></a>
-<span class="sourceLineNo">146</span>        // If the entry is not locked, it might already be deleted from the<a name="line.146"></a>
-<span class="sourceLineNo">147</span>        // map, so we cannot return it. We need to get our entry into the map<a name="line.147"></a>
-<span class="sourceLineNo">148</span>        // or get someone else's locked entry.<a name="line.148"></a>
-<span class="sourceLineNo">149</span>      }<a name="line.149"></a>
-<span class="sourceLineNo">150</span>    }<a name="line.150"></a>
-<span class="sourceLineNo">151</span>    return entry;<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>   * Must be called in a finally block to decrease the internal counter and<a name="line.155"></a>
-<span class="sourceLineNo">156</span>   * remove the monitor object for the given id if the caller is the last<a name="line.156"></a>
-<span class="sourceLineNo">157</span>   * client.<a name="line.157"></a>
-<span class="sourceLineNo">158</span>   *<a name="line.158"></a>
-<span class="sourceLineNo">159</span>   * @param entry the return value of {@link #getLockEntry(long)}<a name="line.159"></a>
-<span class="sourceLineNo">160</span>   */<a name="line.160"></a>
-<span class="sourceLineNo">161</span>  public void releaseLockEntry(Entry entry) {<a name="line.161"></a>
-<span class="sourceLineNo">162</span>    synchronized (entry) {<a name="line.162"></a>
-<span class="sourceLineNo">163</span>      entry.locked = false;<a name="line.163"></a>
-<span class="sourceLineNo">164</span>      if (entry.numWaiters &gt; 0) {<a name="line.164"></a>
-<span class="sourceLineNo">165</span>        entry.notify();<a name="line.165"></a>
-<span class="sourceLineNo">166</span>      } else {<a name="line.166"></a>
-<span class="sourceLineNo">167</span>        map.remove(entry.id);<a name="line.167"></a>
-<span class="sourceLineNo">168</span>      }<a name="line.168"></a>
-<span class="sourceLineNo">169</span>    }<a name="line.169"></a>
-<span class="sourceLineNo">170</span>  }<a name="line.170"></a>
-<span class="sourceLineNo">171</span><a name="line.171"></a>
-<span class="sourceLineNo">172</span>  /** For testing */<a name="line.172"></a>
-<span class="sourceLineNo">173</span>  void assertMapEmpty() {<a name="line.173"></a>
-<span class="sourceLineNo">174</span>    assert map.isEmpty();<a name="line.174"></a>
-<span class="sourceLineNo">175</span>  }<a name="line.175"></a>
-<span class="sourceLineNo">176</span><a name="line.176"></a>
-<span class="sourceLineNo">177</span>  @VisibleForTesting<a name="line.177"></a>
-<span class="sourceLineNo">178</span>  public void waitForWaiters(long id, int numWaiters) throws InterruptedException {<a name="line.178"></a>
-<span class="sourceLineNo">179</span>    for (Entry entry;;) {<a name="line.179"></a>
-<span class="sourceLineNo">180</span>      entry = map.get(id);<a name="line.180"></a>
-<span class="sourceLineNo">181</span>      if (entry != null) {<a name="line.181"></a>
-<span class="sourceLineNo">182</span>        synchronized (entry) {<a name="line.182"></a>
-<span class="sourceLineNo">183</span>          if (entry.numWaiters &gt;= numWaiters) {<a name="line.183"></a>
-<span class="sourceLineNo">184</span>            return;<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>      Thread.sleep(100);<a name="line.188"></a>
-<span class="sourceLineNo">189</span>    }<a name="line.189"></a>
-<span class="sourceLineNo">190</span>  }<a name="line.190"></a>
-<span class="sourceLineNo">191</span>}<a name="line.191"></a>
+<span class="sourceLineNo">084</span>              // HBASE-21292<a name="line.84"></a>
+<span class="sourceLineNo">085</span>              // There is a rare case that interrupting and the lock owner thread call<a name="line.85"></a>
+<span class="sourceLineNo">086</span>              // releaseLockEntry at the same time. Since the owner thread found there<a name="line.86"></a>
+<span class="sourceLineNo">087</span>              // still one waiting, it won't remove the entry from the map. If the interrupted<a name="line.87"></a>
+<span class="sourceLineNo">088</span>              // thread is the last one waiting on the lock, and since an exception is thrown,<a name="line.88"></a>
+<span class="sourceLineNo">089</span>              // the 'existing' entry will stay in the map forever. Later threads which try to<a name="line.89"></a>
+<span class="sourceLineNo">090</span>              // get this lock will stuck in a infinite loop because<a name="line.90"></a>
+<span class="sourceLineNo">091</span>              // existing = map.putIfAbsent(entry.id, entry)) != null and existing.locked=false.<a name="line.91"></a>
+<span class="sourceLineNo">092</span>              if (!existing.locked &amp;&amp; existing.numWaiters == 0) {<a name="line.92"></a>
+<span class="sourceLineNo">093</span>                map.remove(existing.id);<a name="line.93"></a>
+<span class="sourceLineNo">094</span>              }<a name="line.94"></a>
+<span class="sourceLineNo">095</span>              throw new InterruptedIOException(<a name="line.95"></a>
+<span class="sourceLineNo">096</span>                  "Interrupted waiting to acquire sparse lock");<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><a name="line.99"></a>
+<span class="sourceLineNo">100</span>          --existing.numWaiters;  // Remove ourselves from waiters.<a name="line.100"></a>
+<span class="sourceLineNo">101</span>          existing.locked = true;<a name="line.101"></a>
+<span class="sourceLineNo">102</span>          return existing;<a name="line.102"></a>
+<span class="sourceLineNo">103</span>        }<a name="line.103"></a>
+<span class="sourceLineNo">104</span>        // If the entry is not locked, it might already be deleted from the<a name="line.104"></a>
+<span class="sourceLineNo">105</span>        // map, so we cannot return it. We need to get our entry into the map<a name="line.105"></a>
+<span class="sourceLineNo">106</span>        // or get someone else's locked entry.<a name="line.106"></a>
+<span class="sourceLineNo">107</span>      }<a name="line.107"></a>
+<span class="sourceLineNo">108</span>    }<a name="line.108"></a>
+<span class="sourceLineNo">109</span>    return entry;<a name="line.109"></a>
+<span class="sourceLineNo">110</span>  }<a name="line.110"></a>
+<span class="sourceLineNo">111</span><a name="line.111"></a>
+<span class="sourceLineNo">112</span>  /**<a name="line.112"></a>
+<span class="sourceLineNo">113</span>   * Blocks until the lock corresponding to the given id is acquired.<a name="line.113"></a>
+<span class="sourceLineNo">114</span>   *<a name="line.114"></a>
+<span class="sourceLineNo">115</span>   * @param id an arbitrary number to lock on<a name="line.115"></a>
+<span class="sourceLineNo">116</span>   * @param time time to wait in ms<a name="line.116"></a>
+<span class="sourceLineNo">117</span>   * @return an "entry" to pass to {@link #releaseLockEntry(Entry)} to release<a name="line.117"></a>
+<span class="sourceLineNo">118</span>   *         the lock<a name="line.118"></a>
+<span class="sourceLineNo">119</span>   * @throws IOException if interrupted<a name="line.119"></a>
+<span class="sourceLineNo">120</span>   */<a name="line.120"></a>
+<span class="sourceLineNo">121</span>  public Entry tryLockEntry(long id, long time) throws IOException {<a name="line.121"></a>
+<span class="sourceLineNo">122</span>    Preconditions.checkArgument(time &gt;= 0);<a name="line.122"></a>
+<span class="sourceLineNo">123</span>    Entry entry = new Entry(id);<a name="line.123"></a>
+<span class="sourceLineNo">124</span>    Entry existing;<a name="line.124"></a>
+<span class="sourceLineNo">125</span>    long waitUtilTS = System.currentTimeMillis() + time;<a name="line.125"></a>
+<span class="sourceLineNo">126</span>    long remaining = time;<a name="line.126"></a>
+<span class="sourceLineNo">127</span>    while ((existing = map.putIfAbsent(entry.id, entry)) != null) {<a name="line.127"></a>
+<span class="sourceLineNo">128</span>      synchronized (existing) {<a name="line.128"></a>
+<span class="sourceLineNo">129</span>        if (existing.locked) {<a name="line.129"></a>
+<span class="sourceLineNo">130</span>          ++existing.numWaiters;  // Add ourselves to waiters.<a name="line.130"></a>
+<span class="sourceLineNo">131</span>          try {<a name="line.131"></a>
+<span class="sourceLineNo">132</span>            while (existing.locked) {<a name="line.132"></a>
+<span class="sourceLineNo">133</span>              existing.wait(remaining);<a name="line.133"></a>
+<span class="sourceLineNo">134</span>              if (existing.locked) {<a name="line.134"></a>
+<span class="sourceLineNo">135</span>                long currentTS = System.currentTimeMillis();<a name="line.135"></a>
+<span class="sourceLineNo">136</span>                if (currentTS &gt;= waitUtilTS) {<a name="line.136"></a>
+<span class="sourceLineNo">137</span>                  // time is up<a name="line.137"></a>
+<span class="sourceLineNo">138</span>                  return null;<a name="line.138"></a>
+<span class="sourceLineNo">139</span>                } else {<a name="line.139"></a>
+<span class="sourceLineNo">140</span>                  // our wait is waken, but the lock is still taken, this can happen<a name="line.140"></a>
+<span class="sourceLineNo">141</span>                  // due to JDK Object's wait/notify mechanism.<a name="line.141"></a>
+<span class="sourceLineNo">142</span>                  // Calculate the new remaining time to wait<a name="line.142"></a>
+<span class="sourceLineNo">143</span>                  remaining = waitUtilTS - currentTS;<a name="line.143"></a>
+<span class="sourceLineNo">144</span>                }<a name="line.144"></a>
+<span class="sourceLineNo">145</span>              }<a name="line.145"></a>
+<span class="sourceLineNo">146</span><a name="line.146"></a>
+<span class="sourceLineNo">147</span>            }<a name="line.147"></a>
+<span class="sourceLineNo">148</span>          } catch (InterruptedException e) {<a name="line.148"></a>
+<span class="sourceLineNo">149</span>            // HBASE-21292<a name="line.149"></a>
+<span class="sourceLineNo">150</span>            // Please refer to the comments in getLockEntry()<a name="line.150"></a>
+<span class="sourceLineNo">151</span>            // the difference here is that we decrease numWaiters in finally block<a name="line.151"></a>
+<span class="sourceLineNo">152</span>            if (!existing.locked &amp;&amp; existing.numWaiters == 1) {<a name="line.152"></a>
+<span class="sourceLineNo">153</span>              map.remove(existing.id);<a name="line.153"></a>
+<span class="sourceLineNo">154</span>            }<a name="line.154"></a>
+<span class="sourceLineNo">155</span>            throw new InterruptedIOException(<a name="line.155"></a>
+<span class="sourceLineNo">156</span>                "Interrupted waiting to acquire sparse lock");<a name="line.156"></a>
+<span class="sourceLineNo">157</span>          } finally {<a name="line.157"></a>
+<span class="sourceLineNo">158</span>            --existing.numWaiters;  // Remove ourselves from waiters.<a name="line.158"></a>
+<span class="sourceLineNo">159</span>          }<a name="line.159"></a>
+<span class="sourceLineNo">160</span>          existing.locked = true;<a name="line.160"></a>
+<span class="sourceLineNo">161</span>          return existing;<a name="line.161"></a>
+<span class="sourceLineNo">162</span>        }<a name="line.162"></a>
+<span class="sourceLineNo">163</span>        // If the entry is not locked, it might already be deleted from the<a name="line.163"></a>
+<span class="sourceLineNo">164</span>        // map, so we cannot return it. We need to get our entry into the map<a name="line.164"></a>
+<span class="sourceLineNo">165</span>        // or get someone else's locked entry.<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 entry;<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>  /**<a name="line.171"></a>
+<span class="sourceLineNo">172</span>   * Must be called in a finally block to decrease the internal counter and<a name="line.172"></a>
+<span class="sourceLineNo">173</span>   * remove the monitor object for the given id if the caller is the last<a name="line.173"></a>
+<span class="sourceLineNo">174</span>   * client.<a name="line.174"></a>
+<span class="sourceLineNo">175</span>   *<a name="line.175"></a>
+<span class="sourceLineNo">176</span>   * @param entry the return value of {@link #getLockEntry(long)}<a name="line.176"></a>
+<span class="sourceLineNo">177</span>   */<a name="line.177"></a>
+<span class="sourceLineNo">178</span>  public void releaseLockEntry(Entry entry) {<a name="line.178"></a>
+<span class="sourceLineNo">179</span>    synchronized (entry) {<a name="line.179"></a>
+<span class="sourceLineNo">180</span>      entry.locked = false;<a name="line.180"></a>
+<span class="sourceLineNo">181</span>      if (entry.numWaiters &gt; 0) {<a name="line.181"></a>
+<span class="sourceLineNo">182</span>        entry.notify();<a name="line.182"></a>
+<span class="sourceLineNo">183</span>      } else {<a name="line.183"></a>
+<span class="sourceLineNo">184</span>        map.remove(entry.id);<a name="line.184"></a>
+<span class="sourceLineNo">185</span>      }<a name="line.185"></a>
+<span class="sourceLineNo">186</span>    }<a name="line.186"></a>
+<span class="sourceLineNo">187</span>  }<a name="line.187"></a>
+<span class="sourceLineNo">188</span><a name="line.188"></a>
+<span class="sourceLineNo">189</span>  /** For testing */<a name="line.189"></a>
+<span class="sourceLineNo">190</span>  void assertMapEmpty() {<a name="line.190"></a>
+<span class="sourceLineNo">191</span>    assert map.isEmpty();<a name="line.191"></a>
+<span class="sourceLineNo">192</span>  }<a name="line.192"></a>
+<span class="sourceLineNo">193</span><a name="line.193"></a>
+<span class="sourceLineNo">194</span>  @VisibleForTesting<a name="line.194"></a>
+<span class="sourceLineNo">195</span>  public void waitForWaiters(long id, int numWaiters) throws InterruptedException {<a name="line.195"></a>
+<span class="sourceLineNo">196</span>    for (Entry entry;;) {<a name="line.196"></a>
+<span class="sourceLineNo">197</span>      entry = map.get(id);<a name="line.197"></a>
+<span class="sourceLineNo">198</span>      if (entry != null) {<a name="line.198"></a>
+<span class="sourceLineNo">199</span>        synchronized (entry) {<a name="line.199"></a>
+<span class="sourceLineNo">200</span>          if (entry.numWaiters &gt;= numWaiters) {<a name="line.200"></a>
+<span class="sourceLineNo">201</span>            return;<a name="line.201"></a>
+<span class="sourceLineNo">202</span>          }<a name="line.202"></a>
+<span class="sourceLineNo">203</span>        }<a name="line.203"></a>
+<span class="sourceLineNo">204</span>      }<a name="line.204"></a>
+<span class="sourceLineNo">205</span>      Thread.sleep(100);<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>
 
 
 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/3649682c/devapidocs/src-html/org/apache/hadoop/hbase/util/IdLock.html
----------------------------------------------------------------------
diff --git a/devapidocs/src-html/org/apache/hadoop/hbase/util/IdLock.html b/devapidocs/src-html/org/apache/hadoop/hbase/util/IdLock.html
index 8c0a262..5131a2c 100644
--- a/devapidocs/src-html/org/apache/hadoop/hbase/util/IdLock.html
+++ b/devapidocs/src-html/org/apache/hadoop/hbase/util/IdLock.html
@@ -89,114 +89,131 @@
 <span class="sourceLineNo">081</span>              existing.wait();<a name="line.81"></a>
 <span class="sourceLineNo">082</span>            } catch (InterruptedException e) {<a name="line.82"></a>
 <span class="sourceLineNo">083</span>              --existing.numWaiters;  // Remove ourselves from waiters.<a name="line.83"></a>
-<span class="sourceLineNo">084</span>              throw new InterruptedIOException(<a name="line.84"></a>
-<span class="sourceLineNo">085</span>                  "Interrupted waiting to acquire sparse lock");<a name="line.85"></a>
-<span class="sourceLineNo">086</span>            }<a name="line.86"></a>
-<span class="sourceLineNo">087</span>          }<a name="line.87"></a>
-<span class="sourceLineNo">088</span><a name="line.88"></a>
-<span class="sourceLineNo">089</span>          --existing.numWaiters;  // Remove ourselves from waiters.<a name="line.89"></a>
-<span class="sourceLineNo">090</span>          existing.locked = true;<a name="line.90"></a>
-<span class="sourceLineNo">091</span>          return existing;<a name="line.91"></a>
-<span class="sourceLineNo">092</span>        }<a name="line.92"></a>
-<span class="sourceLineNo">093</span>        // If the entry is not locked, it might already be deleted from the<a name="line.93"></a>
-<span class="sourceLineNo">094</span>        // map, so we cannot return it. We need to get our entry into the map<a name="line.94"></a>
-<span class="sourceLineNo">095</span>        // or get someone else's locked entry.<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>    return entry;<a name="line.98"></a>
-<span class="sourceLineNo">099</span>  }<a name="line.99"></a>
-<span class="sourceLineNo">100</span><a name="line.100"></a>
-<span class="sourceLineNo">101</span>  /**<a name="line.101"></a>
-<span class="sourceLineNo">102</span>   * Blocks until the lock corresponding to the given id is acquired.<a name="line.102"></a>
-<span class="sourceLineNo">103</span>   *<a name="line.103"></a>
-<span class="sourceLineNo">104</span>   * @param id an arbitrary number to lock on<a name="line.104"></a>
-<span class="sourceLineNo">105</span>   * @param time time to wait in ms<a name="line.105"></a>
-<span class="sourceLineNo">106</span>   * @return an "entry" to pass to {@link #releaseLockEntry(Entry)} to release<a name="line.106"></a>
-<span class="sourceLineNo">107</span>   *         the lock<a name="line.107"></a>
-<span class="sourceLineNo">108</span>   * @throws IOException if interrupted<a name="line.108"></a>
-<span class="sourceLineNo">109</span>   */<a name="line.109"></a>
-<span class="sourceLineNo">110</span>  public Entry tryLockEntry(long id, long time) throws IOException {<a name="line.110"></a>
-<span class="sourceLineNo">111</span>    Preconditions.checkArgument(time &gt;= 0);<a name="line.111"></a>
-<span class="sourceLineNo">112</span>    Entry entry = new Entry(id);<a name="line.112"></a>
-<span class="sourceLineNo">113</span>    Entry existing;<a name="line.113"></a>
-<span class="sourceLineNo">114</span>    long waitUtilTS = System.currentTimeMillis() + time;<a name="line.114"></a>
-<span class="sourceLineNo">115</span>    long remaining = time;<a name="line.115"></a>
-<span class="sourceLineNo">116</span>    while ((existing = map.putIfAbsent(entry.id, entry)) != null) {<a name="line.116"></a>
-<span class="sourceLineNo">117</span>      synchronized (existing) {<a name="line.117"></a>
-<span class="sourceLineNo">118</span>        if (existing.locked) {<a name="line.118"></a>
-<span class="sourceLineNo">119</span>          ++existing.numWaiters;  // Add ourselves to waiters.<a name="line.119"></a>
-<span class="sourceLineNo">120</span>          try {<a name="line.120"></a>
-<span class="sourceLineNo">121</span>            while (existing.locked) {<a name="line.121"></a>
-<span class="sourceLineNo">122</span>              existing.wait(remaining);<a name="line.122"></a>
-<span class="sourceLineNo">123</span>              if (existing.locked) {<a name="line.123"></a>
-<span class="sourceLineNo">124</span>                long currentTS = System.currentTimeMillis();<a name="line.124"></a>
-<span class="sourceLineNo">125</span>                if (currentTS &gt;= waitUtilTS) {<a name="line.125"></a>
-<span class="sourceLineNo">126</span>                  // time is up<a name="line.126"></a>
-<span class="sourceLineNo">127</span>                  return null;<a name="line.127"></a>
-<span class="sourceLineNo">128</span>                } else {<a name="line.128"></a>
-<span class="sourceLineNo">129</span>                  // our wait is waken, but the lock is still taken, this can happen<a name="line.129"></a>
-<span class="sourceLineNo">130</span>                  // due to JDK Object's wait/notify mechanism.<a name="line.130"></a>
-<span class="sourceLineNo">131</span>                  // Calculate the new remaining time to wait<a name="line.131"></a>
-<span class="sourceLineNo">132</span>                  remaining = waitUtilTS - currentTS;<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><a name="line.135"></a>
-<span class="sourceLineNo">136</span>            }<a name="line.136"></a>
-<span class="sourceLineNo">137</span>          } catch (InterruptedException e) {<a name="line.137"></a>
-<span class="sourceLineNo">138</span>            throw new InterruptedIOException(<a name="line.138"></a>
-<span class="sourceLineNo">139</span>                "Interrupted waiting to acquire sparse lock");<a name="line.139"></a>
-<span class="sourceLineNo">140</span>          } finally {<a name="line.140"></a>
-<span class="sourceLineNo">141</span>            --existing.numWaiters;  // Remove ourselves from waiters.<a name="line.141"></a>
-<span class="sourceLineNo">142</span>          }<a name="line.142"></a>
-<span class="sourceLineNo">143</span>          existing.locked = true;<a name="line.143"></a>
-<span class="sourceLineNo">144</span>          return existing;<a name="line.144"></a>
-<span class="sourceLineNo">145</span>        }<a name="line.145"></a>
-<span class="sourceLineNo">146</span>        // If the entry is not locked, it might already be deleted from the<a name="line.146"></a>
-<span class="sourceLineNo">147</span>        // map, so we cannot return it. We need to get our entry into the map<a name="line.147"></a>
-<span class="sourceLineNo">148</span>        // or get someone else's locked entry.<a name="line.148"></a>
-<span class="sourceLineNo">149</span>      }<a name="line.149"></a>
-<span class="sourceLineNo">150</span>    }<a name="line.150"></a>
-<span class="sourceLineNo">151</span>    return entry;<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>   * Must be called in a finally block to decrease the internal counter and<a name="line.155"></a>
-<span class="sourceLineNo">156</span>   * remove the monitor object for the given id if the caller is the last<a name="line.156"></a>
-<span class="sourceLineNo">157</span>   * client.<a name="line.157"></a>
-<span class="sourceLineNo">158</span>   *<a name="line.158"></a>
-<span class="sourceLineNo">159</span>   * @param entry the return value of {@link #getLockEntry(long)}<a name="line.159"></a>
-<span class="sourceLineNo">160</span>   */<a name="line.160"></a>
-<span class="sourceLineNo">161</span>  public void releaseLockEntry(Entry entry) {<a name="line.161"></a>
-<span class="sourceLineNo">162</span>    synchronized (entry) {<a name="line.162"></a>
-<span class="sourceLineNo">163</span>      entry.locked = false;<a name="line.163"></a>
-<span class="sourceLineNo">164</span>      if (entry.numWaiters &gt; 0) {<a name="line.164"></a>
-<span class="sourceLineNo">165</span>        entry.notify();<a name="line.165"></a>
-<span class="sourceLineNo">166</span>      } else {<a name="line.166"></a>
-<span class="sourceLineNo">167</span>        map.remove(entry.id);<a name="line.167"></a>
-<span class="sourceLineNo">168</span>      }<a name="line.168"></a>
-<span class="sourceLineNo">169</span>    }<a name="line.169"></a>
-<span class="sourceLineNo">170</span>  }<a name="line.170"></a>
-<span class="sourceLineNo">171</span><a name="line.171"></a>
-<span class="sourceLineNo">172</span>  /** For testing */<a name="line.172"></a>
-<span class="sourceLineNo">173</span>  void assertMapEmpty() {<a name="line.173"></a>
-<span class="sourceLineNo">174</span>    assert map.isEmpty();<a name="line.174"></a>
-<span class="sourceLineNo">175</span>  }<a name="line.175"></a>
-<span class="sourceLineNo">176</span><a name="line.176"></a>
-<span class="sourceLineNo">177</span>  @VisibleForTesting<a name="line.177"></a>
-<span class="sourceLineNo">178</span>  public void waitForWaiters(long id, int numWaiters) throws InterruptedException {<a name="line.178"></a>
-<span class="sourceLineNo">179</span>    for (Entry entry;;) {<a name="line.179"></a>
-<span class="sourceLineNo">180</span>      entry = map.get(id);<a name="line.180"></a>
-<span class="sourceLineNo">181</span>      if (entry != null) {<a name="line.181"></a>
-<span class="sourceLineNo">182</span>        synchronized (entry) {<a name="line.182"></a>
-<span class="sourceLineNo">183</span>          if (entry.numWaiters &gt;= numWaiters) {<a name="line.183"></a>
-<span class="sourceLineNo">184</span>            return;<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>      Thread.sleep(100);<a name="line.188"></a>
-<span class="sourceLineNo">189</span>    }<a name="line.189"></a>
-<span class="sourceLineNo">190</span>  }<a name="line.190"></a>
-<span class="sourceLineNo">191</span>}<a name="line.191"></a>
+<span class="sourceLineNo">084</span>              // HBASE-21292<a name="line.84"></a>
+<span class="sourceLineNo">085</span>              // There is a rare case that interrupting and the lock owner thread call<a name="line.85"></a>
+<span class="sourceLineNo">086</span>              // releaseLockEntry at the same time. Since the owner thread found there<a name="line.86"></a>
+<span class="sourceLineNo">087</span>              // still one waiting, it won't remove the entry from the map. If the interrupted<a name="line.87"></a>
+<span class="sourceLineNo">088</span>              // thread is the last one waiting on the lock, and since an exception is thrown,<a name="line.88"></a>
+<span class="sourceLineNo">089</span>              // the 'existing' entry will stay in the map forever. Later threads which try to<a name="line.89"></a>
+<span class="sourceLineNo">090</span>              // get this lock will stuck in a infinite loop because<a name="line.90"></a>
+<span class="sourceLineNo">091</span>              // existing = map.putIfAbsent(entry.id, entry)) != null and existing.locked=false.<a name="line.91"></a>
+<span class="sourceLineNo">092</span>              if (!existing.locked &amp;&amp; existing.numWaiters == 0) {<a name="line.92"></a>
+<span class="sourceLineNo">093</span>                map.remove(existing.id);<a name="line.93"></a>
+<span class="sourceLineNo">094</span>              }<a name="line.94"></a>
+<span class="sourceLineNo">095</span>              throw new InterruptedIOException(<a name="line.95"></a>
+<span class="sourceLineNo">096</span>                  "Interrupted waiting to acquire sparse lock");<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><a name="line.99"></a>
+<span class="sourceLineNo">100</span>          --existing.numWaiters;  // Remove ourselves from waiters.<a name="line.100"></a>
+<span class="sourceLineNo">101</span>          existing.locked = true;<a name="line.101"></a>
+<span class="sourceLineNo">102</span>          return existing;<a name="line.102"></a>
+<span class="sourceLineNo">103</span>        }<a name="line.103"></a>
+<span class="sourceLineNo">104</span>        // If the entry is not locked, it might already be deleted from the<a name="line.104"></a>
+<span class="sourceLineNo">105</span>        // map, so we cannot return it. We need to get our entry into the map<a name="line.105"></a>
+<span class="sourceLineNo">106</span>        // or get someone else's locked entry.<a name="line.106"></a>
+<span class="sourceLineNo">107</span>      }<a name="line.107"></a>
+<span class="sourceLineNo">108</span>    }<a name="line.108"></a>
+<span class="sourceLineNo">109</span>    return entry;<a name="line.109"></a>
+<span class="sourceLineNo">110</span>  }<a name="line.110"></a>
+<span class="sourceLineNo">111</span><a name="line.111"></a>
+<span class="sourceLineNo">112</span>  /**<a name="line.112"></a>
+<span class="sourceLineNo">113</span>   * Blocks until the lock corresponding to the given id is acquired.<a name="line.113"></a>
+<span class="sourceLineNo">114</span>   *<a name="line.114"></a>
+<span class="sourceLineNo">115</span>   * @param id an arbitrary number to lock on<a name="line.115"></a>
+<span class="sourceLineNo">116</span>   * @param time time to wait in ms<a name="line.116"></a>
+<span class="sourceLineNo">117</span>   * @return an "entry" to pass to {@link #releaseLockEntry(Entry)} to release<a name="line.117"></a>
+<span class="sourceLineNo">118</span>   *         the lock<a name="line.118"></a>
+<span class="sourceLineNo">119</span>   * @throws IOException if interrupted<a name="line.119"></a>
+<span class="sourceLineNo">120</span>   */<a name="line.120"></a>
+<span class="sourceLineNo">121</span>  public Entry tryLockEntry(long id, long time) throws IOException {<a name="line.121"></a>
+<span class="sourceLineNo">122</span>    Preconditions.checkArgument(time &gt;= 0);<a name="line.122"></a>
+<span class="sourceLineNo">123</span>    Entry entry = new Entry(id);<a name="line.123"></a>
+<span class="sourceLineNo">124</span>    Entry existing;<a name="line.124"></a>
+<span class="sourceLineNo">125</span>    long waitUtilTS = System.currentTimeMillis() + time;<a name="line.125"></a>
+<span class="sourceLineNo">126</span>    long remaining = time;<a name="line.126"></a>
+<span class="sourceLineNo">127</span>    while ((existing = map.putIfAbsent(entry.id, entry)) != null) {<a name="line.127"></a>
+<span class="sourceLineNo">128</span>      synchronized (existing) {<a name="line.128"></a>
+<span class="sourceLineNo">129</span>        if (existing.locked) {<a name="line.129"></a>
+<span class="sourceLineNo">130</span>          ++existing.numWaiters;  // Add ourselves to waiters.<a name="line.130"></a>
+<span class="sourceLineNo">131</span>          try {<a name="line.131"></a>
+<span class="sourceLineNo">132</span>            while (existing.locked) {<a name="line.132"></a>
+<span class="sourceLineNo">133</span>              existing.wait(remaining);<a name="line.133"></a>
+<span class="sourceLineNo">134</span>              if (existing.locked) {<a name="line.134"></a>
+<span class="sourceLineNo">135</span>                long currentTS = System.currentTimeMillis();<a name="line.135"></a>
+<span class="sourceLineNo">136</span>                if (currentTS &gt;= waitUtilTS) {<a name="line.136"></a>
+<span class="sourceLineNo">137</span>                  // time is up<a name="line.137"></a>
+<span class="sourceLineNo">138</span>                  return null;<a name="line.138"></a>
+<span class="sourceLineNo">139</span>                } else {<a name="line.139"></a>
+<span class="sourceLineNo">140</span>                  // our wait is waken, but the lock is still taken, this can happen<a name="line.140"></a>
+<span class="sourceLineNo">141</span>                  // due to JDK Object's wait/notify mechanism.<a name="line.141"></a>
+<span class="sourceLineNo">142</span>                  // Calculate the new remaining time to wait<a name="line.142"></a>
+<span class="sourceLineNo">143</span>                  remaining = waitUtilTS - currentTS;<a name="line.143"></a>
+<span class="sourceLineNo">144</span>                }<a name="line.144"></a>
+<span class="sourceLineNo">145</span>              }<a name="line.145"></a>
+<span class="sourceLineNo">146</span><a name="line.146"></a>
+<span class="sourceLineNo">147</span>            }<a name="line.147"></a>
+<span class="sourceLineNo">148</span>          } catch (InterruptedException e) {<a name="line.148"></a>
+<span class="sourceLineNo">149</span>            // HBASE-21292<a name="line.149"></a>
+<span class="sourceLineNo">150</span>            // Please refer to the comments in getLockEntry()<a name="line.150"></a>
+<span class="sourceLineNo">151</span>            // the difference here is that we decrease numWaiters in finally block<a name="line.151"></a>
+<span class="sourceLineNo">152</span>            if (!existing.locked &amp;&amp; existing.numWaiters == 1) {<a name="line.152"></a>
+<span class="sourceLineNo">153</span>              map.remove(existing.id);<a name="line.153"></a>
+<span class="sourceLineNo">154</span>            }<a name="line.154"></a>
+<span class="sourceLineNo">155</span>            throw new InterruptedIOException(<a name="line.155"></a>
+<span class="sourceLineNo">156</span>                "Interrupted waiting to acquire sparse lock");<a name="line.156"></a>
+<span class="sourceLineNo">157</span>          } finally {<a name="line.157"></a>
+<span class="sourceLineNo">158</span>            --existing.numWaiters;  // Remove ourselves from waiters.<a name="line.158"></a>
+<span class="sourceLineNo">159</span>          }<a name="line.159"></a>
+<span class="sourceLineNo">160</span>          existing.locked = true;<a name="line.160"></a>
+<span class="sourceLineNo">161</span>          return existing;<a name="line.161"></a>
+<span class="sourceLineNo">162</span>        }<a name="line.162"></a>
+<span class="sourceLineNo">163</span>        // If the entry is not locked, it might already be deleted from the<a name="line.163"></a>
+<span class="sourceLineNo">164</span>        // map, so we cannot return it. We need to get our entry into the map<a name="line.164"></a>
+<span class="sourceLineNo">165</span>        // or get someone else's locked entry.<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 entry;<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>  /**<a name="line.171"></a>
+<span class="sourceLineNo">172</span>   * Must be called in a finally block to decrease the internal counter and<a name="line.172"></a>
+<span class="sourceLineNo">173</span>   * remove the monitor object for the given id if the caller is the last<a name="line.173"></a>
+<span class="sourceLineNo">174</span>   * client.<a name="line.174"></a>
+<span class="sourceLineNo">175</span>   *<a name="line.175"></a>
+<span class="sourceLineNo">176</span>   * @param entry the return value of {@link #getLockEntry(long)}<a name="line.176"></a>
+<span class="sourceLineNo">177</span>   */<a name="line.177"></a>
+<span class="sourceLineNo">178</span>  public void releaseLockEntry(Entry entry) {<a name="line.178"></a>
+<span class="sourceLineNo">179</span>    synchronized (entry) {<a name="line.179"></a>
+<span class="sourceLineNo">180</span>      entry.locked = false;<a name="line.180"></a>
+<span class="sourceLineNo">181</span>      if (entry.numWaiters &gt; 0) {<a name="line.181"></a>
+<span class="sourceLineNo">182</span>        entry.notify();<a name="line.182"></a>
+<span class="sourceLineNo">183</span>      } else {<a name="line.183"></a>
+<span class="sourceLineNo">184</span>        map.remove(entry.id);<a name="line.184"></a>
+<span class="sourceLineNo">185</span>      }<a name="line.185"></a>
+<span class="sourceLineNo">186</span>    }<a name="line.186"></a>
+<span class="sourceLineNo">187</span>  }<a name="line.187"></a>
+<span class="sourceLineNo">188</span><a name="line.188"></a>
+<span class="sourceLineNo">189</span>  /** For testing */<a name="line.189"></a>
+<span class="sourceLineNo">190</span>  void assertMapEmpty() {<a name="line.190"></a>
+<span class="sourceLineNo">191</span>    assert map.isEmpty();<a name="line.191"></a>
+<span class="sourceLineNo">192</span>  }<a name="line.192"></a>
+<span class="sourceLineNo">193</span><a name="line.193"></a>
+<span class="sourceLineNo">194</span>  @VisibleForTesting<a name="line.194"></a>
+<span class="sourceLineNo">195</span>  public void waitForWaiters(long id, int numWaiters) throws InterruptedException {<a name="line.195"></a>
+<span class="sourceLineNo">196</span>    for (Entry entry;;) {<a name="line.196"></a>
+<span class="sourceLineNo">197</span>      entry = map.get(id);<a name="line.197"></a>
+<span class="sourceLineNo">198</span>      if (entry != null) {<a name="line.198"></a>
+<span class="sourceLineNo">199</span>        synchronized (entry) {<a name="line.199"></a>
+<span class="sourceLineNo">200</span>          if (entry.numWaiters &gt;= numWaiters) {<a name="line.200"></a>
+<span class="sourceLineNo">201</span>            return;<a name="line.201"></a>
+<span class="sourceLineNo">202</span>          }<a name="line.202"></a>
+<span class="sourceLineNo">203</span>        }<a name="line.203"></a>
+<span class="sourceLineNo">204</span>      }<a name="line.204"></a>
+<span class="sourceLineNo">205</span>      Thread.sleep(100);<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>
 
 
 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/3649682c/devapidocs/src-html/org/apache/hadoop/hbase/zookeeper/MasterMaintenanceModeTracker.html
----------------------------------------------------------------------
diff --git a/devapidocs/src-html/org/apache/hadoop/hbase/zookeeper/MasterMaintenanceModeTracker.html b/devapidocs/src-html/org/apache/hadoop/hbase/zookeeper/MasterMaintenanceModeTracker.html
index 52a171b..7fa49ff 100644
--- a/devapidocs/src-html/org/apache/hadoop/hbase/zookeeper/MasterMaintenanceModeTracker.html
+++ b/devapidocs/src-html/org/apache/hadoop/hbase/zookeeper/MasterMaintenanceModeTracker.html
@@ -33,61 +33,65 @@
 <span class="sourceLineNo">025</span><a name="line.25"></a>
 <span class="sourceLineNo">026</span>/**<a name="line.26"></a>
 <span class="sourceLineNo">027</span> * Tracks the master Maintenance Mode via ZK.<a name="line.27"></a>
-<span class="sourceLineNo">028</span> */<a name="line.28"></a>
-<span class="sourceLineNo">029</span>@InterfaceAudience.Private<a name="line.29"></a>
-<span class="sourceLineNo">030</span>public class MasterMaintenanceModeTracker extends ZKListener {<a name="line.30"></a>
-<span class="sourceLineNo">031</span>  private boolean hasChildren;<a name="line.31"></a>
-<span class="sourceLineNo">032</span><a name="line.32"></a>
-<span class="sourceLineNo">033</span>  public MasterMaintenanceModeTracker(ZKWatcher watcher) {<a name="line.33"></a>
-<span class="sourceLineNo">034</span>    super(watcher);<a name="line.34"></a>
-<span class="sourceLineNo">035</span>    hasChildren = false;<a name="line.35"></a>
-<span class="sourceLineNo">036</span>  }<a name="line.36"></a>
-<span class="sourceLineNo">037</span><a name="line.37"></a>
-<span class="sourceLineNo">038</span>  public boolean isInMaintenanceMode() {<a name="line.38"></a>
-<span class="sourceLineNo">039</span>    return hasChildren;<a name="line.39"></a>
+<span class="sourceLineNo">028</span> *<a name="line.28"></a>
+<span class="sourceLineNo">029</span> * Unused. Used to be set by hbck to prevent concurrent splits/merges, but those use PV2 now and<a name="line.29"></a>
+<span class="sourceLineNo">030</span> * HBCK2 uses it's own service, so no longer an issue. Left in, in case we need to use this for<a name="line.30"></a>
+<span class="sourceLineNo">031</span> * the incomplete parts of HBCK2...<a name="line.31"></a>
+<span class="sourceLineNo">032</span> */<a name="line.32"></a>
+<span class="sourceLineNo">033</span>@InterfaceAudience.Private<a name="line.33"></a>
+<span class="sourceLineNo">034</span>public class MasterMaintenanceModeTracker extends ZKListener {<a name="line.34"></a>
+<span class="sourceLineNo">035</span>  private boolean hasChildren;<a name="line.35"></a>
+<span class="sourceLineNo">036</span><a name="line.36"></a>
+<span class="sourceLineNo">037</span>  public MasterMaintenanceModeTracker(ZKWatcher watcher) {<a name="line.37"></a>
+<span class="sourceLineNo">038</span>    super(watcher);<a name="line.38"></a>
+<span class="sourceLineNo">039</span>    hasChildren = false;<a name="line.39"></a>
 <span class="sourceLineNo">040</span>  }<a name="line.40"></a>
 <span class="sourceLineNo">041</span><a name="line.41"></a>
-<span class="sourceLineNo">042</span>  private void update(String path) {<a name="line.42"></a>
-<span class="sourceLineNo">043</span>    if (path.startsWith(watcher.getZNodePaths().masterMaintZNode)) {<a name="line.43"></a>
-<span class="sourceLineNo">044</span>      update();<a name="line.44"></a>
-<span class="sourceLineNo">045</span>    }<a name="line.45"></a>
-<span class="sourceLineNo">046</span>  }<a name="line.46"></a>
-<span class="sourceLineNo">047</span><a name="line.47"></a>
-<span class="sourceLineNo">048</span>  private void update() {<a name="line.48"></a>
-<span class="sourceLineNo">049</span>    try {<a name="line.49"></a>
-<span class="sourceLineNo">050</span>      List&lt;String&gt; children =<a name="line.50"></a>
-<span class="sourceLineNo">051</span>          ZKUtil.listChildrenAndWatchForNewChildren(watcher,<a name="line.51"></a>
-<span class="sourceLineNo">052</span>                  watcher.getZNodePaths().masterMaintZNode);<a name="line.52"></a>
-<span class="sourceLineNo">053</span>      hasChildren = (children != null &amp;&amp; children.size() &gt; 0);<a name="line.53"></a>
-<span class="sourceLineNo">054</span>    } catch (KeeperException e) {<a name="line.54"></a>
-<span class="sourceLineNo">055</span>      // Ignore the ZK keeper exception<a name="line.55"></a>
-<span class="sourceLineNo">056</span>      hasChildren = false;<a name="line.56"></a>
-<span class="sourceLineNo">057</span>    }<a name="line.57"></a>
-<span class="sourceLineNo">058</span>  }<a name="line.58"></a>
-<span class="sourceLineNo">059</span><a name="line.59"></a>
-<span class="sourceLineNo">060</span>  /**<a name="line.60"></a>
-<span class="sourceLineNo">061</span>   * Starts the tracking of whether master is in Maintenance Mode.<a name="line.61"></a>
-<span class="sourceLineNo">062</span>   */<a name="line.62"></a>
-<span class="sourceLineNo">063</span>  public void start() {<a name="line.63"></a>
-<span class="sourceLineNo">064</span>    watcher.registerListener(this);<a name="line.64"></a>
-<span class="sourceLineNo">065</span>    update();<a name="line.65"></a>
-<span class="sourceLineNo">066</span>  }<a name="line.66"></a>
-<span class="sourceLineNo">067</span><a name="line.67"></a>
-<span class="sourceLineNo">068</span>  @Override<a name="line.68"></a>
-<span class="sourceLineNo">069</span>  public void nodeCreated(String path) {<a name="line.69"></a>
-<span class="sourceLineNo">070</span>    update(path);<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>  @Override<a name="line.73"></a>
-<span class="sourceLineNo">074</span>  public void nodeDeleted(String path) {<a name="line.74"></a>
-<span class="sourceLineNo">075</span>    update(path);<a name="line.75"></a>
-<span class="sourceLineNo">076</span>  }<a name="line.76"></a>
-<span class="sourceLineNo">077</span><a name="line.77"></a>
-<span class="sourceLineNo">078</span>  @Override<a name="line.78"></a>
-<span class="sourceLineNo">079</span>  public void nodeChildrenChanged(String path) {<a name="line.79"></a>
-<span class="sourceLineNo">080</span>    update(path);<a name="line.80"></a>
-<span class="sourceLineNo">081</span>  }<a name="line.81"></a>
-<span class="sourceLineNo">082</span>}<a name="line.82"></a>
+<span class="sourceLineNo">042</span>  public boolean isInMaintenanceMode() {<a name="line.42"></a>
+<span class="sourceLineNo">043</span>    return hasChildren;<a name="line.43"></a>
+<span class="sourceLineNo">044</span>  }<a name="line.44"></a>
+<span class="sourceLineNo">045</span><a name="line.45"></a>
+<span class="sourceLineNo">046</span>  private void update(String path) {<a name="line.46"></a>
+<span class="sourceLineNo">047</span>    if (path.startsWith(watcher.getZNodePaths().masterMaintZNode)) {<a name="line.47"></a>
+<span class="sourceLineNo">048</span>      update();<a name="line.48"></a>
+<span class="sourceLineNo">049</span>    }<a name="line.49"></a>
+<span class="sourceLineNo">050</span>  }<a name="line.50"></a>
+<span class="sourceLineNo">051</span><a name="line.51"></a>
+<span class="sourceLineNo">052</span>  private void update() {<a name="line.52"></a>
+<span class="sourceLineNo">053</span>    try {<a name="line.53"></a>
+<span class="sourceLineNo">054</span>      List&lt;String&gt; children =<a name="line.54"></a>
+<span class="sourceLineNo">055</span>          ZKUtil.listChildrenAndWatchForNewChildren(watcher,<a name="line.55"></a>
+<span class="sourceLineNo">056</span>                  watcher.getZNodePaths().masterMaintZNode);<a name="line.56"></a>
+<span class="sourceLineNo">057</span>      hasChildren = (children != null &amp;&amp; children.size() &gt; 0);<a name="line.57"></a>
+<span class="sourceLineNo">058</span>    } catch (KeeperException e) {<a name="line.58"></a>
+<span class="sourceLineNo">059</span>      // Ignore the ZK keeper exception<a name="line.59"></a>
+<span class="sourceLineNo">060</span>      hasChildren = false;<a name="line.60"></a>
+<span class="sourceLineNo">061</span>    }<a name="line.61"></a>
+<span class="sourceLineNo">062</span>  }<a name="line.62"></a>
+<span class="sourceLineNo">063</span><a name="line.63"></a>
+<span class="sourceLineNo">064</span>  /**<a name="line.64"></a>
+<span class="sourceLineNo">065</span>   * Starts the tracking of whether master is in Maintenance Mode.<a name="line.65"></a>
+<span class="sourceLineNo">066</span>   */<a name="line.66"></a>
+<span class="sourceLineNo">067</span>  public void start() {<a name="line.67"></a>
+<span class="sourceLineNo">068</span>    watcher.registerListener(this);<a name="line.68"></a>
+<span class="sourceLineNo">069</span>    update();<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>  @Override<a name="line.72"></a>
+<span class="sourceLineNo">073</span>  public void nodeCreated(String path) {<a name="line.73"></a>
+<span class="sourceLineNo">074</span>    update(path);<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>  @Override<a name="line.77"></a>
+<span class="sourceLineNo">078</span>  public void nodeDeleted(String path) {<a name="line.78"></a>
+<span class="sourceLineNo">079</span>    update(path);<a name="line.79"></a>
+<span class="sourceLineNo">080</span>  }<a name="line.80"></a>
+<span class="sourceLineNo">081</span><a name="line.81"></a>
+<span class="sourceLineNo">082</span>  @Override<a name="line.82"></a>
+<span class="sourceLineNo">083</span>  public void nodeChildrenChanged(String path) {<a name="line.83"></a>
+<span class="sourceLineNo">084</span>    update(path);<a name="line.84"></a>
+<span class="sourceLineNo">085</span>  }<a name="line.85"></a>
+<span class="sourceLineNo">086</span>}<a name="line.86"></a>
 
 
 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/3649682c/downloads.html
----------------------------------------------------------------------
diff --git a/downloads.html b/downloads.html
index 47e2ba9..da56e41 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="20181018" />
+    <meta name="Date-Revision-yyyymmdd" content="20181019" />
     <meta http-equiv="Content-Language" content="en" />
     <title>Apache HBase &#x2013; Apache HBase Downloads</title>
     <link rel="stylesheet" href="./css/apache-maven-fluido-1.4-HBase.min.css" />
@@ -433,7 +433,7 @@ under the License. -->
                         <a href="https://www.apache.org/">The Apache Software Foundation</a>.
             All rights reserved.      
                     
-                  <li id="publishDate" class="pull-right">Last Published: 2018-10-18</li>
+                  <li id="publishDate" class="pull-right">Last Published: 2018-10-19</li>
             </p>
                 </div>
 

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

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

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

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

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

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

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

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

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

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/3649682c/plugins.html
----------------------------------------------------------------------
diff --git a/plugins.html b/plugins.html
index 68b03d1..94d29ad 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="20181018" />
+    <meta name="Date-Revision-yyyymmdd" content="20181019" />
     <meta http-equiv="Content-Language" content="en" />
     <title>Apache HBase &#x2013; Project Plugins</title>
     <link rel="stylesheet" href="./css/apache-maven-fluido-1.4-HBase.min.css" />
@@ -385,7 +385,7 @@
                         <a href="https://www.apache.org/">The Apache Software Foundation</a>.
             All rights reserved.      
                     
-                  <li id="publishDate" class="pull-right">Last Published: 2018-10-18</li>
+                  <li id="publishDate" class="pull-right">Last Published: 2018-10-19</li>
             </p>
                 </div>
 

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

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

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

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

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

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

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

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

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

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

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/3649682c/team-list.html
----------------------------------------------------------------------
diff --git a/team-list.html b/team-list.html
index ef9a5b1..b23cc72 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="20181018" />
+    <meta name="Date-Revision-yyyymmdd" content="20181019" />
     <meta http-equiv="Content-Language" content="en" />
     <title>Apache HBase &#x2013; Project Team</title>
     <link rel="stylesheet" href="./css/apache-maven-fluido-1.4-HBase.min.css" />
@@ -770,7 +770,7 @@
                         <a href="https://www.apache.org/">The Apache Software Foundation</a>.
             All rights reserved.      
                     
-                  <li id="publishDate" class="pull-right">Last Published: 2018-10-18</li>
+                  <li id="publishDate" class="pull-right">Last Published: 2018-10-19</li>
             </p>
                 </div>
 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/3649682c/testdevapidocs/allclasses-frame.html
----------------------------------------------------------------------
diff --git a/testdevapidocs/allclasses-frame.html b/testdevapidocs/allclasses-frame.html
index 848fb2f..1e6ee81 100644
--- a/testdevapidocs/allclasses-frame.html
+++ b/testdevapidocs/allclasses-frame.html
@@ -1463,6 +1463,7 @@
 <li><a href="org/apache/hadoop/hbase/quotas/TestMasterQuotaManager.html" title="class in org.apache.hadoop.hbase.quotas" target="classFrame">TestMasterQuotaManager</a></li>
 <li><a href="org/apache/hadoop/hbase/quotas/TestMasterQuotasObserver.html" title="class in org.apache.hadoop.hbase.quotas" target="classFrame">TestMasterQuotasObserver</a></li>
 <li><a href="org/apache/hadoop/hbase/quotas/TestMasterQuotasObserverWithMocks.html" title="class in org.apache.hadoop.hbase.quotas" target="classFrame">TestMasterQuotasObserverWithMocks</a></li>
+<li><a href="org/apache/hadoop/hbase/master/TestMasterRepairMode.html" title="class in org.apache.hadoop.hbase.master" target="classFrame">TestMasterRepairMode</a></li>
 <li><a href="org/apache/hadoop/hbase/replication/TestMasterReplication.html" title="class in org.apache.hadoop.hbase.replication" target="classFrame">TestMasterReplication</a></li>
 <li><a href="org/apache/hadoop/hbase/replication/TestMasterReplication.CoprocessorCounter.html" title="class in org.apache.hadoop.hbase.replication" target="classFrame">TestMasterReplication.CoprocessorCounter</a></li>
 <li><a href="org/apache/hadoop/hbase/master/TestMasterRestartAfterDisablingTable.html" title="class in org.apache.hadoop.hbase.master" target="classFrame">TestMasterRestartAfterDisablingTable</a></li>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/3649682c/testdevapidocs/allclasses-noframe.html
----------------------------------------------------------------------
diff --git a/testdevapidocs/allclasses-noframe.html b/testdevapidocs/allclasses-noframe.html
index 26253e7..131a5cd 100644
--- a/testdevapidocs/allclasses-noframe.html
+++ b/testdevapidocs/allclasses-noframe.html
@@ -1463,6 +1463,7 @@
 <li><a href="org/apache/hadoop/hbase/quotas/TestMasterQuotaManager.html" title="class in org.apache.hadoop.hbase.quotas">TestMasterQuotaManager</a></li>
 <li><a href="org/apache/hadoop/hbase/quotas/TestMasterQuotasObserver.html" title="class in org.apache.hadoop.hbase.quotas">TestMasterQuotasObserver</a></li>
 <li><a href="org/apache/hadoop/hbase/quotas/TestMasterQuotasObserverWithMocks.html" title="class in org.apache.hadoop.hbase.quotas">TestMasterQuotasObserverWithMocks</a></li>
+<li><a href="org/apache/hadoop/hbase/master/TestMasterRepairMode.html" title="class in org.apache.hadoop.hbase.master">TestMasterRepairMode</a></li>
 <li><a href="org/apache/hadoop/hbase/replication/TestMasterReplication.html" title="class in org.apache.hadoop.hbase.replication">TestMasterReplication</a></li>
 <li><a href="org/apache/hadoop/hbase/replication/TestMasterReplication.CoprocessorCounter.html" title="class in org.apache.hadoop.hbase.replication">TestMasterReplication.CoprocessorCounter</a></li>
 <li><a href="org/apache/hadoop/hbase/master/TestMasterRestartAfterDisablingTable.html" title="class in org.apache.hadoop.hbase.master">TestMasterRestartAfterDisablingTable</a></li>


[31/46] hbase-site git commit: Published site at 05d22ed960204183fbd9bd16f1dbca6410ccde76.

Posted by gi...@apache.org.
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/3649682c/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 9fbe400..b7a2a38 100644
--- a/devapidocs/src-html/org/apache/hadoop/hbase/master/HMaster.html
+++ b/devapidocs/src-html/org/apache/hadoop/hbase/master/HMaster.html
@@ -215,3746 +215,3748 @@
 <span class="sourceLineNo">207</span>import org.apache.hadoop.hbase.util.VersionInfo;<a name="line.207"></a>
 <span class="sourceLineNo">208</span>import org.apache.hadoop.hbase.zookeeper.LoadBalancerTracker;<a name="line.208"></a>
 <span class="sourceLineNo">209</span>import org.apache.hadoop.hbase.zookeeper.MasterAddressTracker;<a name="line.209"></a>
-<span class="sourceLineNo">210</span>import org.apache.hadoop.hbase.zookeeper.MasterMaintenanceModeTracker;<a name="line.210"></a>
-<span class="sourceLineNo">211</span>import org.apache.hadoop.hbase.zookeeper.RegionNormalizerTracker;<a name="line.211"></a>
-<span class="sourceLineNo">212</span>import org.apache.hadoop.hbase.zookeeper.ZKClusterId;<a name="line.212"></a>
-<span class="sourceLineNo">213</span>import org.apache.hadoop.hbase.zookeeper.ZKUtil;<a name="line.213"></a>
-<span class="sourceLineNo">214</span>import org.apache.hadoop.hbase.zookeeper.ZKWatcher;<a name="line.214"></a>
-<span class="sourceLineNo">215</span>import org.apache.hadoop.hbase.zookeeper.ZNodePaths;<a name="line.215"></a>
-<span class="sourceLineNo">216</span>import org.apache.yetus.audience.InterfaceAudience;<a name="line.216"></a>
-<span class="sourceLineNo">217</span>import org.apache.zookeeper.KeeperException;<a name="line.217"></a>
-<span class="sourceLineNo">218</span>import org.eclipse.jetty.server.Server;<a name="line.218"></a>
-<span class="sourceLineNo">219</span>import org.eclipse.jetty.server.ServerConnector;<a name="line.219"></a>
-<span class="sourceLineNo">220</span>import org.eclipse.jetty.servlet.ServletHolder;<a name="line.220"></a>
-<span class="sourceLineNo">221</span>import org.eclipse.jetty.webapp.WebAppContext;<a name="line.221"></a>
-<span class="sourceLineNo">222</span>import org.slf4j.Logger;<a name="line.222"></a>
-<span class="sourceLineNo">223</span>import org.slf4j.LoggerFactory;<a name="line.223"></a>
-<span class="sourceLineNo">224</span><a name="line.224"></a>
-<span class="sourceLineNo">225</span>import org.apache.hbase.thirdparty.com.google.common.annotations.VisibleForTesting;<a name="line.225"></a>
-<span class="sourceLineNo">226</span>import org.apache.hbase.thirdparty.com.google.common.collect.ImmutableSet;<a name="line.226"></a>
-<span class="sourceLineNo">227</span>import org.apache.hbase.thirdparty.com.google.common.collect.Lists;<a name="line.227"></a>
-<span class="sourceLineNo">228</span>import org.apache.hbase.thirdparty.com.google.common.collect.Maps;<a name="line.228"></a>
-<span class="sourceLineNo">229</span><a name="line.229"></a>
-<span class="sourceLineNo">230</span>import org.apache.hadoop.hbase.shaded.protobuf.ProtobufUtil;<a name="line.230"></a>
-<span class="sourceLineNo">231</span>import org.apache.hadoop.hbase.shaded.protobuf.generated.AdminProtos.GetRegionInfoResponse.CompactionState;<a name="line.231"></a>
-<span class="sourceLineNo">232</span>import org.apache.hadoop.hbase.shaded.protobuf.generated.QuotaProtos.Quotas;<a name="line.232"></a>
-<span class="sourceLineNo">233</span>import org.apache.hadoop.hbase.shaded.protobuf.generated.QuotaProtos.SpaceViolationPolicy;<a name="line.233"></a>
-<span class="sourceLineNo">234</span>import org.apache.hadoop.hbase.shaded.protobuf.generated.SnapshotProtos.SnapshotDescription;<a name="line.234"></a>
-<span class="sourceLineNo">235</span>import org.apache.hadoop.hbase.shaded.protobuf.generated.WALProtos;<a name="line.235"></a>
-<span class="sourceLineNo">236</span><a name="line.236"></a>
-<span class="sourceLineNo">237</span>/**<a name="line.237"></a>
-<span class="sourceLineNo">238</span> * HMaster is the "master server" for HBase. An HBase cluster has one active<a name="line.238"></a>
-<span class="sourceLineNo">239</span> * master.  If many masters are started, all compete.  Whichever wins goes on to<a name="line.239"></a>
-<span class="sourceLineNo">240</span> * run the cluster.  All others park themselves in their constructor until<a name="line.240"></a>
-<span class="sourceLineNo">241</span> * master or cluster shutdown or until the active master loses its lease in<a name="line.241"></a>
-<span class="sourceLineNo">242</span> * zookeeper.  Thereafter, all running master jostle to take over master role.<a name="line.242"></a>
-<span class="sourceLineNo">243</span> *<a name="line.243"></a>
-<span class="sourceLineNo">244</span> * &lt;p&gt;The Master can be asked shutdown the cluster. See {@link #shutdown()}.  In<a name="line.244"></a>
-<span class="sourceLineNo">245</span> * this case it will tell all regionservers to go down and then wait on them<a name="line.245"></a>
-<span class="sourceLineNo">246</span> * all reporting in that they are down.  This master will then shut itself down.<a name="line.246"></a>
-<span class="sourceLineNo">247</span> *<a name="line.247"></a>
-<span class="sourceLineNo">248</span> * &lt;p&gt;You can also shutdown just this master.  Call {@link #stopMaster()}.<a name="line.248"></a>
-<span class="sourceLineNo">249</span> *<a name="line.249"></a>
-<span class="sourceLineNo">250</span> * @see org.apache.zookeeper.Watcher<a name="line.250"></a>
-<span class="sourceLineNo">251</span> */<a name="line.251"></a>
-<span class="sourceLineNo">252</span>@InterfaceAudience.LimitedPrivate(HBaseInterfaceAudience.TOOLS)<a name="line.252"></a>
-<span class="sourceLineNo">253</span>@SuppressWarnings("deprecation")<a name="line.253"></a>
-<span class="sourceLineNo">254</span>public class HMaster extends HRegionServer implements MasterServices {<a name="line.254"></a>
-<span class="sourceLineNo">255</span>  private static Logger LOG = LoggerFactory.getLogger(HMaster.class);<a name="line.255"></a>
-<span class="sourceLineNo">256</span><a name="line.256"></a>
-<span class="sourceLineNo">257</span>  /**<a name="line.257"></a>
-<span class="sourceLineNo">258</span>   * Protection against zombie master. Started once Master accepts active responsibility and<a name="line.258"></a>
-<span class="sourceLineNo">259</span>   * starts taking over responsibilities. Allows a finite time window before giving up ownership.<a name="line.259"></a>
-<span class="sourceLineNo">260</span>   */<a name="line.260"></a>
-<span class="sourceLineNo">261</span>  private static class InitializationMonitor extends HasThread {<a name="line.261"></a>
-<span class="sourceLineNo">262</span>    /** The amount of time in milliseconds to sleep before checking initialization status. */<a name="line.262"></a>
-<span class="sourceLineNo">263</span>    public static final String TIMEOUT_KEY = "hbase.master.initializationmonitor.timeout";<a name="line.263"></a>
-<span class="sourceLineNo">264</span>    public static final long TIMEOUT_DEFAULT = TimeUnit.MILLISECONDS.convert(15, TimeUnit.MINUTES);<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>     * When timeout expired and initialization has not complete, call {@link System#exit(int)} when<a name="line.267"></a>
-<span class="sourceLineNo">268</span>     * true, do nothing otherwise.<a name="line.268"></a>
-<span class="sourceLineNo">269</span>     */<a name="line.269"></a>
-<span class="sourceLineNo">270</span>    public static final String HALT_KEY = "hbase.master.initializationmonitor.haltontimeout";<a name="line.270"></a>
-<span class="sourceLineNo">271</span>    public static final boolean HALT_DEFAULT = false;<a name="line.271"></a>
-<span class="sourceLineNo">272</span><a name="line.272"></a>
-<span class="sourceLineNo">273</span>    private final HMaster master;<a name="line.273"></a>
-<span class="sourceLineNo">274</span>    private final long timeout;<a name="line.274"></a>
-<span class="sourceLineNo">275</span>    private final boolean haltOnTimeout;<a name="line.275"></a>
-<span class="sourceLineNo">276</span><a name="line.276"></a>
-<span class="sourceLineNo">277</span>    /** Creates a Thread that monitors the {@link #isInitialized()} state. */<a name="line.277"></a>
-<span class="sourceLineNo">278</span>    InitializationMonitor(HMaster master) {<a name="line.278"></a>
-<span class="sourceLineNo">279</span>      super("MasterInitializationMonitor");<a name="line.279"></a>
-<span class="sourceLineNo">280</span>      this.master = master;<a name="line.280"></a>
-<span class="sourceLineNo">281</span>      this.timeout = master.getConfiguration().getLong(TIMEOUT_KEY, TIMEOUT_DEFAULT);<a name="line.281"></a>
-<span class="sourceLineNo">282</span>      this.haltOnTimeout = master.getConfiguration().getBoolean(HALT_KEY, HALT_DEFAULT);<a name="line.282"></a>
-<span class="sourceLineNo">283</span>      this.setDaemon(true);<a name="line.283"></a>
-<span class="sourceLineNo">284</span>    }<a name="line.284"></a>
-<span class="sourceLineNo">285</span><a name="line.285"></a>
-<span class="sourceLineNo">286</span>    @Override<a name="line.286"></a>
-<span class="sourceLineNo">287</span>    public void run() {<a name="line.287"></a>
-<span class="sourceLineNo">288</span>      try {<a name="line.288"></a>
-<span class="sourceLineNo">289</span>        while (!master.isStopped() &amp;&amp; master.isActiveMaster()) {<a name="line.289"></a>
-<span class="sourceLineNo">290</span>          Thread.sleep(timeout);<a name="line.290"></a>
-<span class="sourceLineNo">291</span>          if (master.isInitialized()) {<a name="line.291"></a>
-<span class="sourceLineNo">292</span>            LOG.debug("Initialization completed within allotted tolerance. Monitor exiting.");<a name="line.292"></a>
-<span class="sourceLineNo">293</span>          } else {<a name="line.293"></a>
-<span class="sourceLineNo">294</span>            LOG.error("Master failed to complete initialization after " + timeout + "ms. Please"<a name="line.294"></a>
-<span class="sourceLineNo">295</span>                + " consider submitting a bug report including a thread dump of this process.");<a name="line.295"></a>
-<span class="sourceLineNo">296</span>            if (haltOnTimeout) {<a name="line.296"></a>
-<span class="sourceLineNo">297</span>              LOG.error("Zombie Master exiting. Thread dump to stdout");<a name="line.297"></a>
-<span class="sourceLineNo">298</span>              Threads.printThreadInfo(System.out, "Zombie HMaster");<a name="line.298"></a>
-<span class="sourceLineNo">299</span>              System.exit(-1);<a name="line.299"></a>
-<span class="sourceLineNo">300</span>            }<a name="line.300"></a>
-<span class="sourceLineNo">301</span>          }<a name="line.301"></a>
-<span class="sourceLineNo">302</span>        }<a name="line.302"></a>
-<span class="sourceLineNo">303</span>      } catch (InterruptedException ie) {<a name="line.303"></a>
-<span class="sourceLineNo">304</span>        LOG.trace("InitMonitor thread interrupted. Existing.");<a name="line.304"></a>
-<span class="sourceLineNo">305</span>      }<a name="line.305"></a>
-<span class="sourceLineNo">306</span>    }<a name="line.306"></a>
-<span class="sourceLineNo">307</span>  }<a name="line.307"></a>
-<span class="sourceLineNo">308</span><a name="line.308"></a>
-<span class="sourceLineNo">309</span>  // MASTER is name of the webapp and the attribute name used stuffing this<a name="line.309"></a>
-<span class="sourceLineNo">310</span>  //instance into web context.<a name="line.310"></a>
-<span class="sourceLineNo">311</span>  public static final String MASTER = "master";<a name="line.311"></a>
-<span class="sourceLineNo">312</span><a name="line.312"></a>
-<span class="sourceLineNo">313</span>  // Manager and zk listener for master election<a name="line.313"></a>
-<span class="sourceLineNo">314</span>  private final ActiveMasterManager activeMasterManager;<a name="line.314"></a>
-<span class="sourceLineNo">315</span>  // Region server tracker<a name="line.315"></a>
-<span class="sourceLineNo">316</span>  private RegionServerTracker regionServerTracker;<a name="line.316"></a>
-<span class="sourceLineNo">317</span>  // Draining region server tracker<a name="line.317"></a>
-<span class="sourceLineNo">318</span>  private DrainingServerTracker drainingServerTracker;<a name="line.318"></a>
-<span class="sourceLineNo">319</span>  // Tracker for load balancer state<a name="line.319"></a>
-<span class="sourceLineNo">320</span>  LoadBalancerTracker loadBalancerTracker;<a name="line.320"></a>
-<span class="sourceLineNo">321</span>  // Tracker for meta location, if any client ZK quorum specified<a name="line.321"></a>
-<span class="sourceLineNo">322</span>  MetaLocationSyncer metaLocationSyncer;<a name="line.322"></a>
-<span class="sourceLineNo">323</span>  // Tracker for active master location, if any client ZK quorum specified<a name="line.323"></a>
-<span class="sourceLineNo">324</span>  MasterAddressSyncer masterAddressSyncer;<a name="line.324"></a>
-<span class="sourceLineNo">325</span><a name="line.325"></a>
-<span class="sourceLineNo">326</span>  // Tracker for split and merge state<a name="line.326"></a>
-<span class="sourceLineNo">327</span>  private SplitOrMergeTracker splitOrMergeTracker;<a name="line.327"></a>
-<span class="sourceLineNo">328</span><a name="line.328"></a>
-<span class="sourceLineNo">329</span>  // Tracker for region normalizer state<a name="line.329"></a>
-<span class="sourceLineNo">330</span>  private RegionNormalizerTracker regionNormalizerTracker;<a name="line.330"></a>
-<span class="sourceLineNo">331</span><a name="line.331"></a>
-<span class="sourceLineNo">332</span>  //Tracker for master maintenance mode setting<a name="line.332"></a>
-<span class="sourceLineNo">333</span>  private MasterMaintenanceModeTracker maintenanceModeTracker;<a name="line.333"></a>
-<span class="sourceLineNo">334</span><a name="line.334"></a>
-<span class="sourceLineNo">335</span>  private ClusterSchemaService clusterSchemaService;<a name="line.335"></a>
+<span class="sourceLineNo">210</span>import org.apache.hadoop.hbase.zookeeper.RegionNormalizerTracker;<a name="line.210"></a>
+<span class="sourceLineNo">211</span>import org.apache.hadoop.hbase.zookeeper.ZKClusterId;<a name="line.211"></a>
+<span class="sourceLineNo">212</span>import org.apache.hadoop.hbase.zookeeper.ZKUtil;<a name="line.212"></a>
+<span class="sourceLineNo">213</span>import org.apache.hadoop.hbase.zookeeper.ZKWatcher;<a name="line.213"></a>
+<span class="sourceLineNo">214</span>import org.apache.hadoop.hbase.zookeeper.ZNodePaths;<a name="line.214"></a>
+<span class="sourceLineNo">215</span>import org.apache.yetus.audience.InterfaceAudience;<a name="line.215"></a>
+<span class="sourceLineNo">216</span>import org.apache.zookeeper.KeeperException;<a name="line.216"></a>
+<span class="sourceLineNo">217</span>import org.eclipse.jetty.server.Server;<a name="line.217"></a>
+<span class="sourceLineNo">218</span>import org.eclipse.jetty.server.ServerConnector;<a name="line.218"></a>
+<span class="sourceLineNo">219</span>import org.eclipse.jetty.servlet.ServletHolder;<a name="line.219"></a>
+<span class="sourceLineNo">220</span>import org.eclipse.jetty.webapp.WebAppContext;<a name="line.220"></a>
+<span class="sourceLineNo">221</span>import org.slf4j.Logger;<a name="line.221"></a>
+<span class="sourceLineNo">222</span>import org.slf4j.LoggerFactory;<a name="line.222"></a>
+<span class="sourceLineNo">223</span><a name="line.223"></a>
+<span class="sourceLineNo">224</span>import org.apache.hbase.thirdparty.com.google.common.annotations.VisibleForTesting;<a name="line.224"></a>
+<span class="sourceLineNo">225</span>import org.apache.hbase.thirdparty.com.google.common.collect.ImmutableSet;<a name="line.225"></a>
+<span class="sourceLineNo">226</span>import org.apache.hbase.thirdparty.com.google.common.collect.Lists;<a name="line.226"></a>
+<span class="sourceLineNo">227</span>import org.apache.hbase.thirdparty.com.google.common.collect.Maps;<a name="line.227"></a>
+<span class="sourceLineNo">228</span><a name="line.228"></a>
+<span class="sourceLineNo">229</span>import org.apache.hadoop.hbase.shaded.protobuf.ProtobufUtil;<a name="line.229"></a>
+<span class="sourceLineNo">230</span>import org.apache.hadoop.hbase.shaded.protobuf.generated.AdminProtos.GetRegionInfoResponse.CompactionState;<a name="line.230"></a>
+<span class="sourceLineNo">231</span>import org.apache.hadoop.hbase.shaded.protobuf.generated.QuotaProtos.Quotas;<a name="line.231"></a>
+<span class="sourceLineNo">232</span>import org.apache.hadoop.hbase.shaded.protobuf.generated.QuotaProtos.SpaceViolationPolicy;<a name="line.232"></a>
+<span class="sourceLineNo">233</span>import org.apache.hadoop.hbase.shaded.protobuf.generated.SnapshotProtos.SnapshotDescription;<a name="line.233"></a>
+<span class="sourceLineNo">234</span>import org.apache.hadoop.hbase.shaded.protobuf.generated.WALProtos;<a name="line.234"></a>
+<span class="sourceLineNo">235</span><a name="line.235"></a>
+<span class="sourceLineNo">236</span>/**<a name="line.236"></a>
+<span class="sourceLineNo">237</span> * HMaster is the "master server" for HBase. An HBase cluster has one active<a name="line.237"></a>
+<span class="sourceLineNo">238</span> * master.  If many masters are started, all compete.  Whichever wins goes on to<a name="line.238"></a>
+<span class="sourceLineNo">239</span> * run the cluster.  All others park themselves in their constructor until<a name="line.239"></a>
+<span class="sourceLineNo">240</span> * master or cluster shutdown or until the active master loses its lease in<a name="line.240"></a>
+<span class="sourceLineNo">241</span> * zookeeper.  Thereafter, all running master jostle to take over master role.<a name="line.241"></a>
+<span class="sourceLineNo">242</span> *<a name="line.242"></a>
+<span class="sourceLineNo">243</span> * &lt;p&gt;The Master can be asked shutdown the cluster. See {@link #shutdown()}.  In<a name="line.243"></a>
+<span class="sourceLineNo">244</span> * this case it will tell all regionservers to go down and then wait on them<a name="line.244"></a>
+<span class="sourceLineNo">245</span> * all reporting in that they are down.  This master will then shut itself down.<a name="line.245"></a>
+<span class="sourceLineNo">246</span> *<a name="line.246"></a>
+<span class="sourceLineNo">247</span> * &lt;p&gt;You can also shutdown just this master.  Call {@link #stopMaster()}.<a name="line.247"></a>
+<span class="sourceLineNo">248</span> *<a name="line.248"></a>
+<span class="sourceLineNo">249</span> * @see org.apache.zookeeper.Watcher<a name="line.249"></a>
+<span class="sourceLineNo">250</span> */<a name="line.250"></a>
+<span class="sourceLineNo">251</span>@InterfaceAudience.LimitedPrivate(HBaseInterfaceAudience.TOOLS)<a name="line.251"></a>
+<span class="sourceLineNo">252</span>@SuppressWarnings("deprecation")<a name="line.252"></a>
+<span class="sourceLineNo">253</span>public class HMaster extends HRegionServer implements MasterServices {<a name="line.253"></a>
+<span class="sourceLineNo">254</span>  private static Logger LOG = LoggerFactory.getLogger(HMaster.class);<a name="line.254"></a>
+<span class="sourceLineNo">255</span><a name="line.255"></a>
+<span class="sourceLineNo">256</span>  /**<a name="line.256"></a>
+<span class="sourceLineNo">257</span>   * Protection against zombie master. Started once Master accepts active responsibility and<a name="line.257"></a>
+<span class="sourceLineNo">258</span>   * starts taking over responsibilities. Allows a finite time window before giving up ownership.<a name="line.258"></a>
+<span class="sourceLineNo">259</span>   */<a name="line.259"></a>
+<span class="sourceLineNo">260</span>  private static class InitializationMonitor extends HasThread {<a name="line.260"></a>
+<span class="sourceLineNo">261</span>    /** The amount of time in milliseconds to sleep before checking initialization status. */<a name="line.261"></a>
+<span class="sourceLineNo">262</span>    public static final String TIMEOUT_KEY = "hbase.master.initializationmonitor.timeout";<a name="line.262"></a>
+<span class="sourceLineNo">263</span>    public static final long TIMEOUT_DEFAULT = TimeUnit.MILLISECONDS.convert(15, TimeUnit.MINUTES);<a name="line.263"></a>
+<span class="sourceLineNo">264</span><a name="line.264"></a>
+<span class="sourceLineNo">265</span>    /**<a name="line.265"></a>
+<span class="sourceLineNo">266</span>     * When timeout expired and initialization has not complete, call {@link System#exit(int)} when<a name="line.266"></a>
+<span class="sourceLineNo">267</span>     * true, do nothing otherwise.<a name="line.267"></a>
+<span class="sourceLineNo">268</span>     */<a name="line.268"></a>
+<span class="sourceLineNo">269</span>    public static final String HALT_KEY = "hbase.master.initializationmonitor.haltontimeout";<a name="line.269"></a>
+<span class="sourceLineNo">270</span>    public static final boolean HALT_DEFAULT = false;<a name="line.270"></a>
+<span class="sourceLineNo">271</span><a name="line.271"></a>
+<span class="sourceLineNo">272</span>    private final HMaster master;<a name="line.272"></a>
+<span class="sourceLineNo">273</span>    private final long timeout;<a name="line.273"></a>
+<span class="sourceLineNo">274</span>    private final boolean haltOnTimeout;<a name="line.274"></a>
+<span class="sourceLineNo">275</span><a name="line.275"></a>
+<span class="sourceLineNo">276</span>    /** Creates a Thread that monitors the {@link #isInitialized()} state. */<a name="line.276"></a>
+<span class="sourceLineNo">277</span>    InitializationMonitor(HMaster master) {<a name="line.277"></a>
+<span class="sourceLineNo">278</span>      super("MasterInitializationMonitor");<a name="line.278"></a>
+<span class="sourceLineNo">279</span>      this.master = master;<a name="line.279"></a>
+<span class="sourceLineNo">280</span>      this.timeout = master.getConfiguration().getLong(TIMEOUT_KEY, TIMEOUT_DEFAULT);<a name="line.280"></a>
+<span class="sourceLineNo">281</span>      this.haltOnTimeout = master.getConfiguration().getBoolean(HALT_KEY, HALT_DEFAULT);<a name="line.281"></a>
+<span class="sourceLineNo">282</span>      this.setDaemon(true);<a name="line.282"></a>
+<span class="sourceLineNo">283</span>    }<a name="line.283"></a>
+<span class="sourceLineNo">284</span><a name="line.284"></a>
+<span class="sourceLineNo">285</span>    @Override<a name="line.285"></a>
+<span class="sourceLineNo">286</span>    public void run() {<a name="line.286"></a>
+<span class="sourceLineNo">287</span>      try {<a name="line.287"></a>
+<span class="sourceLineNo">288</span>        while (!master.isStopped() &amp;&amp; master.isActiveMaster()) {<a name="line.288"></a>
+<span class="sourceLineNo">289</span>          Thread.sleep(timeout);<a name="line.289"></a>
+<span class="sourceLineNo">290</span>          if (master.isInitialized()) {<a name="line.290"></a>
+<span class="sourceLineNo">291</span>            LOG.debug("Initialization completed within allotted tolerance. Monitor exiting.");<a name="line.291"></a>
+<span class="sourceLineNo">292</span>          } else {<a name="line.292"></a>
+<span class="sourceLineNo">293</span>            LOG.error("Master failed to complete initialization after " + timeout + "ms. Please"<a name="line.293"></a>
+<span class="sourceLineNo">294</span>                + " consider submitting a bug report including a thread dump of this process.");<a name="line.294"></a>
+<span class="sourceLineNo">295</span>            if (haltOnTimeout) {<a name="line.295"></a>
+<span class="sourceLineNo">296</span>              LOG.error("Zombie Master exiting. Thread dump to stdout");<a name="line.296"></a>
+<span class="sourceLineNo">297</span>              Threads.printThreadInfo(System.out, "Zombie HMaster");<a name="line.297"></a>
+<span class="sourceLineNo">298</span>              System.exit(-1);<a name="line.298"></a>
+<span class="sourceLineNo">299</span>            }<a name="line.299"></a>
+<span class="sourceLineNo">300</span>          }<a name="line.300"></a>
+<span class="sourceLineNo">301</span>        }<a name="line.301"></a>
+<span class="sourceLineNo">302</span>      } catch (InterruptedException ie) {<a name="line.302"></a>
+<span class="sourceLineNo">303</span>        LOG.trace("InitMonitor thread interrupted. Existing.");<a name="line.303"></a>
+<span class="sourceLineNo">304</span>      }<a name="line.304"></a>
+<span class="sourceLineNo">305</span>    }<a name="line.305"></a>
+<span class="sourceLineNo">306</span>  }<a name="line.306"></a>
+<span class="sourceLineNo">307</span><a name="line.307"></a>
+<span class="sourceLineNo">308</span>  // MASTER is name of the webapp and the attribute name used stuffing this<a name="line.308"></a>
+<span class="sourceLineNo">309</span>  //instance into web context.<a name="line.309"></a>
+<span class="sourceLineNo">310</span>  public static final String MASTER = "master";<a name="line.310"></a>
+<span class="sourceLineNo">311</span><a name="line.311"></a>
+<span class="sourceLineNo">312</span>  // Manager and zk listener for master election<a name="line.312"></a>
+<span class="sourceLineNo">313</span>  private final ActiveMasterManager activeMasterManager;<a name="line.313"></a>
+<span class="sourceLineNo">314</span>  // Region server tracker<a name="line.314"></a>
+<span class="sourceLineNo">315</span>  private RegionServerTracker regionServerTracker;<a name="line.315"></a>
+<span class="sourceLineNo">316</span>  // Draining region server tracker<a name="line.316"></a>
+<span class="sourceLineNo">317</span>  private DrainingServerTracker drainingServerTracker;<a name="line.317"></a>
+<span class="sourceLineNo">318</span>  // Tracker for load balancer state<a name="line.318"></a>
+<span class="sourceLineNo">319</span>  LoadBalancerTracker loadBalancerTracker;<a name="line.319"></a>
+<span class="sourceLineNo">320</span>  // Tracker for meta location, if any client ZK quorum specified<a name="line.320"></a>
+<span class="sourceLineNo">321</span>  MetaLocationSyncer metaLocationSyncer;<a name="line.321"></a>
+<span class="sourceLineNo">322</span>  // Tracker for active master location, if any client ZK quorum specified<a name="line.322"></a>
+<span class="sourceLineNo">323</span>  MasterAddressSyncer masterAddressSyncer;<a name="line.323"></a>
+<span class="sourceLineNo">324</span><a name="line.324"></a>
+<span class="sourceLineNo">325</span>  // Tracker for split and merge state<a name="line.325"></a>
+<span class="sourceLineNo">326</span>  private SplitOrMergeTracker splitOrMergeTracker;<a name="line.326"></a>
+<span class="sourceLineNo">327</span><a name="line.327"></a>
+<span class="sourceLineNo">328</span>  // Tracker for region normalizer state<a name="line.328"></a>
+<span class="sourceLineNo">329</span>  private RegionNormalizerTracker regionNormalizerTracker;<a name="line.329"></a>
+<span class="sourceLineNo">330</span><a name="line.330"></a>
+<span class="sourceLineNo">331</span>  private ClusterSchemaService clusterSchemaService;<a name="line.331"></a>
+<span class="sourceLineNo">332</span><a name="line.332"></a>
+<span class="sourceLineNo">333</span>  public static final String HBASE_MASTER_WAIT_ON_SERVICE_IN_SECONDS =<a name="line.333"></a>
+<span class="sourceLineNo">334</span>    "hbase.master.wait.on.service.seconds";<a name="line.334"></a>
+<span class="sourceLineNo">335</span>  public static final int DEFAULT_HBASE_MASTER_WAIT_ON_SERVICE_IN_SECONDS = 5 * 60;<a name="line.335"></a>
 <span class="sourceLineNo">336</span><a name="line.336"></a>
-<span class="sourceLineNo">337</span>  public static final String HBASE_MASTER_WAIT_ON_SERVICE_IN_SECONDS =<a name="line.337"></a>
-<span class="sourceLineNo">338</span>    "hbase.master.wait.on.service.seconds";<a name="line.338"></a>
-<span class="sourceLineNo">339</span>  public static final int DEFAULT_HBASE_MASTER_WAIT_ON_SERVICE_IN_SECONDS = 5 * 60;<a name="line.339"></a>
-<span class="sourceLineNo">340</span><a name="line.340"></a>
-<span class="sourceLineNo">341</span>  // Metrics for the HMaster<a name="line.341"></a>
-<span class="sourceLineNo">342</span>  final MetricsMaster metricsMaster;<a name="line.342"></a>
-<span class="sourceLineNo">343</span>  // file system manager for the master FS operations<a name="line.343"></a>
-<span class="sourceLineNo">344</span>  private MasterFileSystem fileSystemManager;<a name="line.344"></a>
-<span class="sourceLineNo">345</span>  private MasterWalManager walManager;<a name="line.345"></a>
-<span class="sourceLineNo">346</span><a name="line.346"></a>
-<span class="sourceLineNo">347</span>  // server manager to deal with region server info<a name="line.347"></a>
-<span class="sourceLineNo">348</span>  private volatile ServerManager serverManager;<a name="line.348"></a>
-<span class="sourceLineNo">349</span><a name="line.349"></a>
-<span class="sourceLineNo">350</span>  // manager of assignment nodes in zookeeper<a name="line.350"></a>
-<span class="sourceLineNo">351</span>  private AssignmentManager assignmentManager;<a name="line.351"></a>
-<span class="sourceLineNo">352</span><a name="line.352"></a>
-<span class="sourceLineNo">353</span>  // manager of replication<a name="line.353"></a>
-<span class="sourceLineNo">354</span>  private ReplicationPeerManager replicationPeerManager;<a name="line.354"></a>
-<span class="sourceLineNo">355</span><a name="line.355"></a>
-<span class="sourceLineNo">356</span>  private SyncReplicationReplayWALManager syncReplicationReplayWALManager;<a name="line.356"></a>
-<span class="sourceLineNo">357</span><a name="line.357"></a>
-<span class="sourceLineNo">358</span>  // buffer for "fatal error" notices from region servers<a name="line.358"></a>
-<span class="sourceLineNo">359</span>  // in the cluster. This is only used for assisting<a name="line.359"></a>
-<span class="sourceLineNo">360</span>  // operations/debugging.<a name="line.360"></a>
-<span class="sourceLineNo">361</span>  MemoryBoundedLogMessageBuffer rsFatals;<a name="line.361"></a>
-<span class="sourceLineNo">362</span><a name="line.362"></a>
-<span class="sourceLineNo">363</span>  // flag set after we become the active master (used for testing)<a name="line.363"></a>
-<span class="sourceLineNo">364</span>  private volatile boolean activeMaster = false;<a name="line.364"></a>
-<span class="sourceLineNo">365</span><a name="line.365"></a>
-<span class="sourceLineNo">366</span>  // flag set after we complete initialization once active<a name="line.366"></a>
-<span class="sourceLineNo">367</span>  private final ProcedureEvent&lt;?&gt; initialized = new ProcedureEvent&lt;&gt;("master initialized");<a name="line.367"></a>
+<span class="sourceLineNo">337</span>  // Metrics for the HMaster<a name="line.337"></a>
+<span class="sourceLineNo">338</span>  final MetricsMaster metricsMaster;<a name="line.338"></a>
+<span class="sourceLineNo">339</span>  // file system manager for the master FS operations<a name="line.339"></a>
+<span class="sourceLineNo">340</span>  private MasterFileSystem fileSystemManager;<a name="line.340"></a>
+<span class="sourceLineNo">341</span>  private MasterWalManager walManager;<a name="line.341"></a>
+<span class="sourceLineNo">342</span><a name="line.342"></a>
+<span class="sourceLineNo">343</span>  // server manager to deal with region server info<a name="line.343"></a>
+<span class="sourceLineNo">344</span>  private volatile ServerManager serverManager;<a name="line.344"></a>
+<span class="sourceLineNo">345</span><a name="line.345"></a>
+<span class="sourceLineNo">346</span>  // manager of assignment nodes in zookeeper<a name="line.346"></a>
+<span class="sourceLineNo">347</span>  private AssignmentManager assignmentManager;<a name="line.347"></a>
+<span class="sourceLineNo">348</span><a name="line.348"></a>
+<span class="sourceLineNo">349</span>  // manager of replication<a name="line.349"></a>
+<span class="sourceLineNo">350</span>  private ReplicationPeerManager replicationPeerManager;<a name="line.350"></a>
+<span class="sourceLineNo">351</span><a name="line.351"></a>
+<span class="sourceLineNo">352</span>  private SyncReplicationReplayWALManager syncReplicationReplayWALManager;<a name="line.352"></a>
+<span class="sourceLineNo">353</span><a name="line.353"></a>
+<span class="sourceLineNo">354</span>  // buffer for "fatal error" notices from region servers<a name="line.354"></a>
+<span class="sourceLineNo">355</span>  // in the cluster. This is only used for assisting<a name="line.355"></a>
+<span class="sourceLineNo">356</span>  // operations/debugging.<a name="line.356"></a>
+<span class="sourceLineNo">357</span>  MemoryBoundedLogMessageBuffer rsFatals;<a name="line.357"></a>
+<span class="sourceLineNo">358</span><a name="line.358"></a>
+<span class="sourceLineNo">359</span>  // flag set after we become the active master (used for testing)<a name="line.359"></a>
+<span class="sourceLineNo">360</span>  private volatile boolean activeMaster = false;<a name="line.360"></a>
+<span class="sourceLineNo">361</span><a name="line.361"></a>
+<span class="sourceLineNo">362</span>  // flag set after we complete initialization once active<a name="line.362"></a>
+<span class="sourceLineNo">363</span>  private final ProcedureEvent&lt;?&gt; initialized = new ProcedureEvent&lt;&gt;("master initialized");<a name="line.363"></a>
+<span class="sourceLineNo">364</span><a name="line.364"></a>
+<span class="sourceLineNo">365</span>  // flag set after master services are started,<a name="line.365"></a>
+<span class="sourceLineNo">366</span>  // initialization may have not completed yet.<a name="line.366"></a>
+<span class="sourceLineNo">367</span>  volatile boolean serviceStarted = false;<a name="line.367"></a>
 <span class="sourceLineNo">368</span><a name="line.368"></a>
-<span class="sourceLineNo">369</span>  // flag set after master services are started,<a name="line.369"></a>
-<span class="sourceLineNo">370</span>  // initialization may have not completed yet.<a name="line.370"></a>
-<span class="sourceLineNo">371</span>  volatile boolean serviceStarted = false;<a name="line.371"></a>
-<span class="sourceLineNo">372</span><a name="line.372"></a>
-<span class="sourceLineNo">373</span>  // Maximum time we should run balancer for<a name="line.373"></a>
-<span class="sourceLineNo">374</span>  private final int maxBlancingTime;<a name="line.374"></a>
-<span class="sourceLineNo">375</span>  // Maximum percent of regions in transition when balancing<a name="line.375"></a>
-<span class="sourceLineNo">376</span>  private final double maxRitPercent;<a name="line.376"></a>
-<span class="sourceLineNo">377</span><a name="line.377"></a>
-<span class="sourceLineNo">378</span>  private final LockManager lockManager = new LockManager(this);<a name="line.378"></a>
-<span class="sourceLineNo">379</span><a name="line.379"></a>
-<span class="sourceLineNo">380</span>  private LoadBalancer balancer;<a name="line.380"></a>
-<span class="sourceLineNo">381</span>  private RegionNormalizer normalizer;<a name="line.381"></a>
-<span class="sourceLineNo">382</span>  private BalancerChore balancerChore;<a name="line.382"></a>
-<span class="sourceLineNo">383</span>  private RegionNormalizerChore normalizerChore;<a name="line.383"></a>
-<span class="sourceLineNo">384</span>  private ClusterStatusChore clusterStatusChore;<a name="line.384"></a>
-<span class="sourceLineNo">385</span>  private ClusterStatusPublisher clusterStatusPublisherChore = null;<a name="line.385"></a>
-<span class="sourceLineNo">386</span><a name="line.386"></a>
-<span class="sourceLineNo">387</span>  CatalogJanitor catalogJanitorChore;<a name="line.387"></a>
-<span class="sourceLineNo">388</span>  private LogCleaner logCleaner;<a name="line.388"></a>
-<span class="sourceLineNo">389</span>  private HFileCleaner hfileCleaner;<a name="line.389"></a>
-<span class="sourceLineNo">390</span>  private ReplicationBarrierCleaner replicationBarrierCleaner;<a name="line.390"></a>
-<span class="sourceLineNo">391</span>  private ExpiredMobFileCleanerChore expiredMobFileCleanerChore;<a name="line.391"></a>
-<span class="sourceLineNo">392</span>  private MobCompactionChore mobCompactChore;<a name="line.392"></a>
-<span class="sourceLineNo">393</span>  private MasterMobCompactionThread mobCompactThread;<a name="line.393"></a>
-<span class="sourceLineNo">394</span>  // used to synchronize the mobCompactionStates<a name="line.394"></a>
-<span class="sourceLineNo">395</span>  private final IdLock mobCompactionLock = new IdLock();<a name="line.395"></a>
-<span class="sourceLineNo">396</span>  // save the information of mob compactions in tables.<a name="line.396"></a>
-<span class="sourceLineNo">397</span>  // the key is table name, the value is the number of compactions in that table.<a name="line.397"></a>
-<span class="sourceLineNo">398</span>  private Map&lt;TableName, AtomicInteger&gt; mobCompactionStates = Maps.newConcurrentMap();<a name="line.398"></a>
+<span class="sourceLineNo">369</span>  // Maximum time we should run balancer for<a name="line.369"></a>
+<span class="sourceLineNo">370</span>  private final int maxBlancingTime;<a name="line.370"></a>
+<span class="sourceLineNo">371</span>  // Maximum percent of regions in transition when balancing<a name="line.371"></a>
+<span class="sourceLineNo">372</span>  private final double maxRitPercent;<a name="line.372"></a>
+<span class="sourceLineNo">373</span><a name="line.373"></a>
+<span class="sourceLineNo">374</span>  private final LockManager lockManager = new LockManager(this);<a name="line.374"></a>
+<span class="sourceLineNo">375</span><a name="line.375"></a>
+<span class="sourceLineNo">376</span>  private LoadBalancer balancer;<a name="line.376"></a>
+<span class="sourceLineNo">377</span>  private RegionNormalizer normalizer;<a name="line.377"></a>
+<span class="sourceLineNo">378</span>  private BalancerChore balancerChore;<a name="line.378"></a>
+<span class="sourceLineNo">379</span>  private RegionNormalizerChore normalizerChore;<a name="line.379"></a>
+<span class="sourceLineNo">380</span>  private ClusterStatusChore clusterStatusChore;<a name="line.380"></a>
+<span class="sourceLineNo">381</span>  private ClusterStatusPublisher clusterStatusPublisherChore = null;<a name="line.381"></a>
+<span class="sourceLineNo">382</span><a name="line.382"></a>
+<span class="sourceLineNo">383</span>  CatalogJanitor catalogJanitorChore;<a name="line.383"></a>
+<span class="sourceLineNo">384</span>  private LogCleaner logCleaner;<a name="line.384"></a>
+<span class="sourceLineNo">385</span>  private HFileCleaner hfileCleaner;<a name="line.385"></a>
+<span class="sourceLineNo">386</span>  private ReplicationBarrierCleaner replicationBarrierCleaner;<a name="line.386"></a>
+<span class="sourceLineNo">387</span>  private ExpiredMobFileCleanerChore expiredMobFileCleanerChore;<a name="line.387"></a>
+<span class="sourceLineNo">388</span>  private MobCompactionChore mobCompactChore;<a name="line.388"></a>
+<span class="sourceLineNo">389</span>  private MasterMobCompactionThread mobCompactThread;<a name="line.389"></a>
+<span class="sourceLineNo">390</span>  // used to synchronize the mobCompactionStates<a name="line.390"></a>
+<span class="sourceLineNo">391</span>  private final IdLock mobCompactionLock = new IdLock();<a name="line.391"></a>
+<span class="sourceLineNo">392</span>  // save the information of mob compactions in tables.<a name="line.392"></a>
+<span class="sourceLineNo">393</span>  // the key is table name, the value is the number of compactions in that table.<a name="line.393"></a>
+<span class="sourceLineNo">394</span>  private Map&lt;TableName, AtomicInteger&gt; mobCompactionStates = Maps.newConcurrentMap();<a name="line.394"></a>
+<span class="sourceLineNo">395</span><a name="line.395"></a>
+<span class="sourceLineNo">396</span>  MasterCoprocessorHost cpHost;<a name="line.396"></a>
+<span class="sourceLineNo">397</span><a name="line.397"></a>
+<span class="sourceLineNo">398</span>  private final boolean preLoadTableDescriptors;<a name="line.398"></a>
 <span class="sourceLineNo">399</span><a name="line.399"></a>
-<span class="sourceLineNo">400</span>  MasterCoprocessorHost cpHost;<a name="line.400"></a>
-<span class="sourceLineNo">401</span><a name="line.401"></a>
-<span class="sourceLineNo">402</span>  private final boolean preLoadTableDescriptors;<a name="line.402"></a>
-<span class="sourceLineNo">403</span><a name="line.403"></a>
-<span class="sourceLineNo">404</span>  // Time stamps for when a hmaster became active<a name="line.404"></a>
-<span class="sourceLineNo">405</span>  private long masterActiveTime;<a name="line.405"></a>
-<span class="sourceLineNo">406</span><a name="line.406"></a>
-<span class="sourceLineNo">407</span>  // Time stamp for when HMaster finishes becoming Active Master<a name="line.407"></a>
-<span class="sourceLineNo">408</span>  private long masterFinishedInitializationTime;<a name="line.408"></a>
-<span class="sourceLineNo">409</span><a name="line.409"></a>
-<span class="sourceLineNo">410</span>  //should we check the compression codec type at master side, default true, HBASE-6370<a name="line.410"></a>
-<span class="sourceLineNo">411</span>  private final boolean masterCheckCompression;<a name="line.411"></a>
-<span class="sourceLineNo">412</span><a name="line.412"></a>
-<span class="sourceLineNo">413</span>  //should we check encryption settings at master side, default true<a name="line.413"></a>
-<span class="sourceLineNo">414</span>  private final boolean masterCheckEncryption;<a name="line.414"></a>
-<span class="sourceLineNo">415</span><a name="line.415"></a>
-<span class="sourceLineNo">416</span>  Map&lt;String, Service&gt; coprocessorServiceHandlers = Maps.newHashMap();<a name="line.416"></a>
-<span class="sourceLineNo">417</span><a name="line.417"></a>
-<span class="sourceLineNo">418</span>  // monitor for snapshot of hbase tables<a name="line.418"></a>
-<span class="sourceLineNo">419</span>  SnapshotManager snapshotManager;<a name="line.419"></a>
-<span class="sourceLineNo">420</span>  // monitor for distributed procedures<a name="line.420"></a>
-<span class="sourceLineNo">421</span>  private MasterProcedureManagerHost mpmHost;<a name="line.421"></a>
-<span class="sourceLineNo">422</span><a name="line.422"></a>
-<span class="sourceLineNo">423</span>  // it is assigned after 'initialized' guard set to true, so should be volatile<a name="line.423"></a>
-<span class="sourceLineNo">424</span>  private volatile MasterQuotaManager quotaManager;<a name="line.424"></a>
-<span class="sourceLineNo">425</span>  private SpaceQuotaSnapshotNotifier spaceQuotaSnapshotNotifier;<a name="line.425"></a>
-<span class="sourceLineNo">426</span>  private QuotaObserverChore quotaObserverChore;<a name="line.426"></a>
-<span class="sourceLineNo">427</span>  private SnapshotQuotaObserverChore snapshotQuotaChore;<a name="line.427"></a>
-<span class="sourceLineNo">428</span><a name="line.428"></a>
-<span class="sourceLineNo">429</span>  private ProcedureExecutor&lt;MasterProcedureEnv&gt; procedureExecutor;<a name="line.429"></a>
-<span class="sourceLineNo">430</span>  private WALProcedureStore procedureStore;<a name="line.430"></a>
-<span class="sourceLineNo">431</span><a name="line.431"></a>
-<span class="sourceLineNo">432</span>  // handle table states<a name="line.432"></a>
-<span class="sourceLineNo">433</span>  private TableStateManager tableStateManager;<a name="line.433"></a>
-<span class="sourceLineNo">434</span><a name="line.434"></a>
-<span class="sourceLineNo">435</span>  private long splitPlanCount;<a name="line.435"></a>
-<span class="sourceLineNo">436</span>  private long mergePlanCount;<a name="line.436"></a>
-<span class="sourceLineNo">437</span><a name="line.437"></a>
-<span class="sourceLineNo">438</span>  /* Handle favored nodes information */<a name="line.438"></a>
-<span class="sourceLineNo">439</span>  private FavoredNodesManager favoredNodesManager;<a name="line.439"></a>
-<span class="sourceLineNo">440</span><a name="line.440"></a>
-<span class="sourceLineNo">441</span>  /** jetty server for master to redirect requests to regionserver infoServer */<a name="line.441"></a>
-<span class="sourceLineNo">442</span>  private Server masterJettyServer;<a name="line.442"></a>
-<span class="sourceLineNo">443</span><a name="line.443"></a>
-<span class="sourceLineNo">444</span>  public static class RedirectServlet extends HttpServlet {<a name="line.444"></a>
-<span class="sourceLineNo">445</span>    private static final long serialVersionUID = 2894774810058302473L;<a name="line.445"></a>
-<span class="sourceLineNo">446</span>    private final int regionServerInfoPort;<a name="line.446"></a>
-<span class="sourceLineNo">447</span>    private final String regionServerHostname;<a name="line.447"></a>
-<span class="sourceLineNo">448</span><a name="line.448"></a>
-<span class="sourceLineNo">449</span>    /**<a name="line.449"></a>
-<span class="sourceLineNo">450</span>     * @param infoServer that we're trying to send all requests to<a name="line.450"></a>
-<span class="sourceLineNo">451</span>     * @param hostname may be null. if given, will be used for redirects instead of host from client.<a name="line.451"></a>
-<span class="sourceLineNo">452</span>     */<a name="line.452"></a>
-<span class="sourceLineNo">453</span>    public RedirectServlet(InfoServer infoServer, String hostname) {<a name="line.453"></a>
-<span class="sourceLineNo">454</span>       regionServerInfoPort = infoServer.getPort();<a name="line.454"></a>
-<span class="sourceLineNo">455</span>       regionServerHostname = hostname;<a name="line.455"></a>
-<span class="sourceLineNo">456</span>    }<a name="line.456"></a>
-<span class="sourceLineNo">457</span><a name="line.457"></a>
-<span class="sourceLineNo">458</span>    @Override<a name="line.458"></a>
-<span class="sourceLineNo">459</span>    public void doGet(HttpServletRequest request,<a name="line.459"></a>
-<span class="sourceLineNo">460</span>        HttpServletResponse response) throws ServletException, IOException {<a name="line.460"></a>
-<span class="sourceLineNo">461</span>      String redirectHost = regionServerHostname;<a name="line.461"></a>
-<span class="sourceLineNo">462</span>      if(redirectHost == null) {<a name="line.462"></a>
-<span class="sourceLineNo">463</span>        redirectHost = request.getServerName();<a name="line.463"></a>
-<span class="sourceLineNo">464</span>        if(!Addressing.isLocalAddress(InetAddress.getByName(redirectHost))) {<a name="line.464"></a>
-<span class="sourceLineNo">465</span>          LOG.warn("Couldn't resolve '" + redirectHost + "' as an address local to this node and '" +<a name="line.465"></a>
-<span class="sourceLineNo">466</span>              MASTER_HOSTNAME_KEY + "' is not set; client will get a HTTP 400 response. If " +<a name="line.466"></a>
-<span class="sourceLineNo">467</span>              "your HBase deployment relies on client accessible names that the region server process " +<a name="line.467"></a>
-<span class="sourceLineNo">468</span>              "can't resolve locally, then you should set the previously mentioned configuration variable " +<a name="line.468"></a>
-<span class="sourceLineNo">469</span>              "to an appropriate hostname.");<a name="line.469"></a>
-<span class="sourceLineNo">470</span>          // no sending client provided input back to the client, so the goal host is just in the logs.<a name="line.470"></a>
-<span class="sourceLineNo">471</span>          response.sendError(400, "Request was to a host that I can't resolve for any of the network interfaces on " +<a name="line.471"></a>
-<span class="sourceLineNo">472</span>              "this node. If this is due to an intermediary such as an HTTP load balancer or other proxy, your HBase " +<a name="line.472"></a>
-<span class="sourceLineNo">473</span>              "administrator can set '" + MASTER_HOSTNAME_KEY + "' to point to the correct hostname.");<a name="line.473"></a>
-<span class="sourceLineNo">474</span>          return;<a name="line.474"></a>
-<span class="sourceLineNo">475</span>        }<a name="line.475"></a>
-<span class="sourceLineNo">476</span>      }<a name="line.476"></a>
-<span class="sourceLineNo">477</span>      // TODO this scheme should come from looking at the scheme registered in the infoserver's http server for the<a name="line.477"></a>
-<span class="sourceLineNo">478</span>      // host and port we're using, but it's buried way too deep to do that ATM.<a name="line.478"></a>
-<span class="sourceLineNo">479</span>      String redirectUrl = request.getScheme() + "://"<a name="line.479"></a>
-<span class="sourceLineNo">480</span>        + redirectHost + ":" + regionServerInfoPort<a name="line.480"></a>
-<span class="sourceLineNo">481</span>        + request.getRequestURI();<a name="line.481"></a>
-<span class="sourceLineNo">482</span>      response.sendRedirect(redirectUrl);<a name="line.482"></a>
-<span class="sourceLineNo">483</span>    }<a name="line.483"></a>
-<span class="sourceLineNo">484</span>  }<a name="line.484"></a>
-<span class="sourceLineNo">485</span><a name="line.485"></a>
-<span class="sourceLineNo">486</span>  /**<a name="line.486"></a>
-<span class="sourceLineNo">487</span>   * Initializes the HMaster. The steps are as follows:<a name="line.487"></a>
-<span class="sourceLineNo">488</span>   * &lt;p&gt;<a name="line.488"></a>
-<span class="sourceLineNo">489</span>   * &lt;ol&gt;<a name="line.489"></a>
-<span class="sourceLineNo">490</span>   * &lt;li&gt;Initialize the local HRegionServer<a name="line.490"></a>
-<span class="sourceLineNo">491</span>   * &lt;li&gt;Start the ActiveMasterManager.<a name="line.491"></a>
-<span class="sourceLineNo">492</span>   * &lt;/ol&gt;<a name="line.492"></a>
-<span class="sourceLineNo">493</span>   * &lt;p&gt;<a name="line.493"></a>
-<span class="sourceLineNo">494</span>   * Remaining steps of initialization occur in<a name="line.494"></a>
-<span class="sourceLineNo">495</span>   * #finishActiveMasterInitialization(MonitoredTask) after<a name="line.495"></a>
-<span class="sourceLineNo">496</span>   * the master becomes the active one.<a name="line.496"></a>
-<span class="sourceLineNo">497</span>   */<a name="line.497"></a>
-<span class="sourceLineNo">498</span>  public HMaster(final Configuration conf)<a name="line.498"></a>
-<span class="sourceLineNo">499</span>      throws IOException, KeeperException {<a name="line.499"></a>
-<span class="sourceLineNo">500</span>    super(conf);<a name="line.500"></a>
-<span class="sourceLineNo">501</span>    TraceUtil.initTracer(conf);<a name="line.501"></a>
-<span class="sourceLineNo">502</span>    try {<a name="line.502"></a>
-<span class="sourceLineNo">503</span>      this.rsFatals = new MemoryBoundedLogMessageBuffer(<a name="line.503"></a>
-<span class="sourceLineNo">504</span>          conf.getLong("hbase.master.buffer.for.rs.fatals", 1 * 1024 * 1024));<a name="line.504"></a>
-<span class="sourceLineNo">505</span>      LOG.info("hbase.rootdir=" + getRootDir() +<a name="line.505"></a>
-<span class="sourceLineNo">506</span>          ", hbase.cluster.distributed=" + this.conf.getBoolean(HConstants.CLUSTER_DISTRIBUTED, false));<a name="line.506"></a>
-<span class="sourceLineNo">507</span><a name="line.507"></a>
-<span class="sourceLineNo">508</span>      // Disable usage of meta replicas in the master<a name="line.508"></a>
-<span class="sourceLineNo">509</span>      this.conf.setBoolean(HConstants.USE_META_REPLICAS, false);<a name="line.509"></a>
-<span class="sourceLineNo">510</span><a name="line.510"></a>
-<span class="sourceLineNo">511</span>      decorateMasterConfiguration(this.conf);<a name="line.511"></a>
-<span class="sourceLineNo">512</span><a name="line.512"></a>
-<span class="sourceLineNo">513</span>      // Hack! Maps DFSClient =&gt; Master for logs.  HDFS made this<a name="line.513"></a>
-<span class="sourceLineNo">514</span>      // config param for task trackers, but we can piggyback off of it.<a name="line.514"></a>
-<span class="sourceLineNo">515</span>      if (this.conf.get("mapreduce.task.attempt.id") == null) {<a name="line.515"></a>
-<span class="sourceLineNo">516</span>        this.conf.set("mapreduce.task.attempt.id", "hb_m_" + this.serverName.toString());<a name="line.516"></a>
-<span class="sourceLineNo">517</span>      }<a name="line.517"></a>
+<span class="sourceLineNo">400</span>  // Time stamps for when a hmaster became active<a name="line.400"></a>
+<span class="sourceLineNo">401</span>  private long masterActiveTime;<a name="line.401"></a>
+<span class="sourceLineNo">402</span><a name="line.402"></a>
+<span class="sourceLineNo">403</span>  // Time stamp for when HMaster finishes becoming Active Master<a name="line.403"></a>
+<span class="sourceLineNo">404</span>  private long masterFinishedInitializationTime;<a name="line.404"></a>
+<span class="sourceLineNo">405</span><a name="line.405"></a>
+<span class="sourceLineNo">406</span>  //should we check the compression codec type at master side, default true, HBASE-6370<a name="line.406"></a>
+<span class="sourceLineNo">407</span>  private final boolean masterCheckCompression;<a name="line.407"></a>
+<span class="sourceLineNo">408</span><a name="line.408"></a>
+<span class="sourceLineNo">409</span>  //should we check encryption settings at master side, default true<a name="line.409"></a>
+<span class="sourceLineNo">410</span>  private final boolean masterCheckEncryption;<a name="line.410"></a>
+<span class="sourceLineNo">411</span><a name="line.411"></a>
+<span class="sourceLineNo">412</span>  Map&lt;String, Service&gt; coprocessorServiceHandlers = Maps.newHashMap();<a name="line.412"></a>
+<span class="sourceLineNo">413</span><a name="line.413"></a>
+<span class="sourceLineNo">414</span>  // monitor for snapshot of hbase tables<a name="line.414"></a>
+<span class="sourceLineNo">415</span>  SnapshotManager snapshotManager;<a name="line.415"></a>
+<span class="sourceLineNo">416</span>  // monitor for distributed procedures<a name="line.416"></a>
+<span class="sourceLineNo">417</span>  private MasterProcedureManagerHost mpmHost;<a name="line.417"></a>
+<span class="sourceLineNo">418</span><a name="line.418"></a>
+<span class="sourceLineNo">419</span>  // it is assigned after 'initialized' guard set to true, so should be volatile<a name="line.419"></a>
+<span class="sourceLineNo">420</span>  private volatile MasterQuotaManager quotaManager;<a name="line.420"></a>
+<span class="sourceLineNo">421</span>  private SpaceQuotaSnapshotNotifier spaceQuotaSnapshotNotifier;<a name="line.421"></a>
+<span class="sourceLineNo">422</span>  private QuotaObserverChore quotaObserverChore;<a name="line.422"></a>
+<span class="sourceLineNo">423</span>  private SnapshotQuotaObserverChore snapshotQuotaChore;<a name="line.423"></a>
+<span class="sourceLineNo">424</span><a name="line.424"></a>
+<span class="sourceLineNo">425</span>  private ProcedureExecutor&lt;MasterProcedureEnv&gt; procedureExecutor;<a name="line.425"></a>
+<span class="sourceLineNo">426</span>  private WALProcedureStore procedureStore;<a name="line.426"></a>
+<span class="sourceLineNo">427</span><a name="line.427"></a>
+<span class="sourceLineNo">428</span>  // handle table states<a name="line.428"></a>
+<span class="sourceLineNo">429</span>  private TableStateManager tableStateManager;<a name="line.429"></a>
+<span class="sourceLineNo">430</span><a name="line.430"></a>
+<span class="sourceLineNo">431</span>  private long splitPlanCount;<a name="line.431"></a>
+<span class="sourceLineNo">432</span>  private long mergePlanCount;<a name="line.432"></a>
+<span class="sourceLineNo">433</span><a name="line.433"></a>
+<span class="sourceLineNo">434</span>  /* Handle favored nodes information */<a name="line.434"></a>
+<span class="sourceLineNo">435</span>  private FavoredNodesManager favoredNodesManager;<a name="line.435"></a>
+<span class="sourceLineNo">436</span><a name="line.436"></a>
+<span class="sourceLineNo">437</span>  /** jetty server for master to redirect requests to regionserver infoServer */<a name="line.437"></a>
+<span class="sourceLineNo">438</span>  private Server masterJettyServer;<a name="line.438"></a>
+<span class="sourceLineNo">439</span><a name="line.439"></a>
+<span class="sourceLineNo">440</span>  // Determine if we should do normal startup or minimal "single-user" mode with no region<a name="line.440"></a>
+<span class="sourceLineNo">441</span>  // servers and no user tables. Useful for repair and recovery of hbase:meta<a name="line.441"></a>
+<span class="sourceLineNo">442</span>  private final boolean maintenanceMode;<a name="line.442"></a>
+<span class="sourceLineNo">443</span>  static final String MAINTENANCE_MODE = "hbase.master.maintenance_mode";<a name="line.443"></a>
+<span class="sourceLineNo">444</span><a name="line.444"></a>
+<span class="sourceLineNo">445</span>  public static class RedirectServlet extends HttpServlet {<a name="line.445"></a>
+<span class="sourceLineNo">446</span>    private static final long serialVersionUID = 2894774810058302473L;<a name="line.446"></a>
+<span class="sourceLineNo">447</span>    private final int regionServerInfoPort;<a name="line.447"></a>
+<span class="sourceLineNo">448</span>    private final String regionServerHostname;<a name="line.448"></a>
+<span class="sourceLineNo">449</span><a name="line.449"></a>
+<span class="sourceLineNo">450</span>    /**<a name="line.450"></a>
+<span class="sourceLineNo">451</span>     * @param infoServer that we're trying to send all requests to<a name="line.451"></a>
+<span class="sourceLineNo">452</span>     * @param hostname may be null. if given, will be used for redirects instead of host from client.<a name="line.452"></a>
+<span class="sourceLineNo">453</span>     */<a name="line.453"></a>
+<span class="sourceLineNo">454</span>    public RedirectServlet(InfoServer infoServer, String hostname) {<a name="line.454"></a>
+<span class="sourceLineNo">455</span>       regionServerInfoPort = infoServer.getPort();<a name="line.455"></a>
+<span class="sourceLineNo">456</span>       regionServerHostname = hostname;<a name="line.456"></a>
+<span class="sourceLineNo">457</span>    }<a name="line.457"></a>
+<span class="sourceLineNo">458</span><a name="line.458"></a>
+<span class="sourceLineNo">459</span>    @Override<a name="line.459"></a>
+<span class="sourceLineNo">460</span>    public void doGet(HttpServletRequest request,<a name="line.460"></a>
+<span class="sourceLineNo">461</span>        HttpServletResponse response) throws ServletException, IOException {<a name="line.461"></a>
+<span class="sourceLineNo">462</span>      String redirectHost = regionServerHostname;<a name="line.462"></a>
+<span class="sourceLineNo">463</span>      if(redirectHost == null) {<a name="line.463"></a>
+<span class="sourceLineNo">464</span>        redirectHost = request.getServerName();<a name="line.464"></a>
+<span class="sourceLineNo">465</span>        if(!Addressing.isLocalAddress(InetAddress.getByName(redirectHost))) {<a name="line.465"></a>
+<span class="sourceLineNo">466</span>          LOG.warn("Couldn't resolve '" + redirectHost + "' as an address local to this node and '" +<a name="line.466"></a>
+<span class="sourceLineNo">467</span>              MASTER_HOSTNAME_KEY + "' is not set; client will get a HTTP 400 response. If " +<a name="line.467"></a>
+<span class="sourceLineNo">468</span>              "your HBase deployment relies on client accessible names that the region server process " +<a name="line.468"></a>
+<span class="sourceLineNo">469</span>              "can't resolve locally, then you should set the previously mentioned configuration variable " +<a name="line.469"></a>
+<span class="sourceLineNo">470</span>              "to an appropriate hostname.");<a name="line.470"></a>
+<span class="sourceLineNo">471</span>          // no sending client provided input back to the client, so the goal host is just in the logs.<a name="line.471"></a>
+<span class="sourceLineNo">472</span>          response.sendError(400, "Request was to a host that I can't resolve for any of the network interfaces on " +<a name="line.472"></a>
+<span class="sourceLineNo">473</span>              "this node. If this is due to an intermediary such as an HTTP load balancer or other proxy, your HBase " +<a name="line.473"></a>
+<span class="sourceLineNo">474</span>              "administrator can set '" + MASTER_HOSTNAME_KEY + "' to point to the correct hostname.");<a name="line.474"></a>
+<span class="sourceLineNo">475</span>          return;<a name="line.475"></a>
+<span class="sourceLineNo">476</span>        }<a name="line.476"></a>
+<span class="sourceLineNo">477</span>      }<a name="line.477"></a>
+<span class="sourceLineNo">478</span>      // TODO this scheme should come from looking at the scheme registered in the infoserver's http server for the<a name="line.478"></a>
+<span class="sourceLineNo">479</span>      // host and port we're using, but it's buried way too deep to do that ATM.<a name="line.479"></a>
+<span class="sourceLineNo">480</span>      String redirectUrl = request.getScheme() + "://"<a name="line.480"></a>
+<span class="sourceLineNo">481</span>        + redirectHost + ":" + regionServerInfoPort<a name="line.481"></a>
+<span class="sourceLineNo">482</span>        + request.getRequestURI();<a name="line.482"></a>
+<span class="sourceLineNo">483</span>      response.sendRedirect(redirectUrl);<a name="line.483"></a>
+<span class="sourceLineNo">484</span>    }<a name="line.484"></a>
+<span class="sourceLineNo">485</span>  }<a name="line.485"></a>
+<span class="sourceLineNo">486</span><a name="line.486"></a>
+<span class="sourceLineNo">487</span>  /**<a name="line.487"></a>
+<span class="sourceLineNo">488</span>   * Initializes the HMaster. The steps are as follows:<a name="line.488"></a>
+<span class="sourceLineNo">489</span>   * &lt;p&gt;<a name="line.489"></a>
+<span class="sourceLineNo">490</span>   * &lt;ol&gt;<a name="line.490"></a>
+<span class="sourceLineNo">491</span>   * &lt;li&gt;Initialize the local HRegionServer<a name="line.491"></a>
+<span class="sourceLineNo">492</span>   * &lt;li&gt;Start the ActiveMasterManager.<a name="line.492"></a>
+<span class="sourceLineNo">493</span>   * &lt;/ol&gt;<a name="line.493"></a>
+<span class="sourceLineNo">494</span>   * &lt;p&gt;<a name="line.494"></a>
+<span class="sourceLineNo">495</span>   * Remaining steps of initialization occur in<a name="line.495"></a>
+<span class="sourceLineNo">496</span>   * #finishActiveMasterInitialization(MonitoredTask) after<a name="line.496"></a>
+<span class="sourceLineNo">497</span>   * the master becomes the active one.<a name="line.497"></a>
+<span class="sourceLineNo">498</span>   */<a name="line.498"></a>
+<span class="sourceLineNo">499</span>  public HMaster(final Configuration conf)<a name="line.499"></a>
+<span class="sourceLineNo">500</span>      throws IOException, KeeperException {<a name="line.500"></a>
+<span class="sourceLineNo">501</span>    super(conf);<a name="line.501"></a>
+<span class="sourceLineNo">502</span>    TraceUtil.initTracer(conf);<a name="line.502"></a>
+<span class="sourceLineNo">503</span>    try {<a name="line.503"></a>
+<span class="sourceLineNo">504</span>      if (conf.getBoolean(MAINTENANCE_MODE, false)) {<a name="line.504"></a>
+<span class="sourceLineNo">505</span>        LOG.info("Detected {}=true via configuration.", MAINTENANCE_MODE);<a name="line.505"></a>
+<span class="sourceLineNo">506</span>        maintenanceMode = true;<a name="line.506"></a>
+<span class="sourceLineNo">507</span>      } else if (Boolean.getBoolean(MAINTENANCE_MODE)) {<a name="line.507"></a>
+<span class="sourceLineNo">508</span>        LOG.info("Detected {}=true via environment variables.", MAINTENANCE_MODE);<a name="line.508"></a>
+<span class="sourceLineNo">509</span>        maintenanceMode = true;<a name="line.509"></a>
+<span class="sourceLineNo">510</span>      } else {<a name="line.510"></a>
+<span class="sourceLineNo">511</span>        maintenanceMode = false;<a name="line.511"></a>
+<span class="sourceLineNo">512</span>      }<a name="line.512"></a>
+<span class="sourceLineNo">513</span><a name="line.513"></a>
+<span class="sourceLineNo">514</span>      this.rsFatals = new MemoryBoundedLogMessageBuffer(<a name="line.514"></a>
+<span class="sourceLineNo">515</span>          conf.getLong("hbase.master.buffer.for.rs.fatals", 1 * 1024 * 1024));<a name="line.515"></a>
+<span class="sourceLineNo">516</span>      LOG.info("hbase.rootdir=" + getRootDir() +<a name="line.516"></a>
+<span class="sourceLineNo">517</span>          ", hbase.cluster.distributed=" + this.conf.getBoolean(HConstants.CLUSTER_DISTRIBUTED, false));<a name="line.517"></a>
 <span class="sourceLineNo">518</span><a name="line.518"></a>
-<span class="sourceLineNo">519</span>      // should we check the compression codec type at master side, default true, HBASE-6370<a name="line.519"></a>
-<span class="sourceLineNo">520</span>      this.masterCheckCompression = conf.getBoolean("hbase.master.check.compression", true);<a name="line.520"></a>
+<span class="sourceLineNo">519</span>      // Disable usage of meta replicas in the master<a name="line.519"></a>
+<span class="sourceLineNo">520</span>      this.conf.setBoolean(HConstants.USE_META_REPLICAS, false);<a name="line.520"></a>
 <span class="sourceLineNo">521</span><a name="line.521"></a>
-<span class="sourceLineNo">522</span>      // should we check encryption settings at master side, default true<a name="line.522"></a>
-<span class="sourceLineNo">523</span>      this.masterCheckEncryption = conf.getBoolean("hbase.master.check.encryption", true);<a name="line.523"></a>
-<span class="sourceLineNo">524</span><a name="line.524"></a>
-<span class="sourceLineNo">525</span>      this.metricsMaster = new MetricsMaster(new MetricsMasterWrapperImpl(this));<a name="line.525"></a>
-<span class="sourceLineNo">526</span><a name="line.526"></a>
-<span class="sourceLineNo">527</span>      // preload table descriptor at startup<a name="line.527"></a>
-<span class="sourceLineNo">528</span>      this.preLoadTableDescriptors = conf.getBoolean("hbase.master.preload.tabledescriptors", true);<a name="line.528"></a>
+<span class="sourceLineNo">522</span>      decorateMasterConfiguration(this.conf);<a name="line.522"></a>
+<span class="sourceLineNo">523</span><a name="line.523"></a>
+<span class="sourceLineNo">524</span>      // Hack! Maps DFSClient =&gt; Master for logs.  HDFS made this<a name="line.524"></a>
+<span class="sourceLineNo">525</span>      // config param for task trackers, but we can piggyback off of it.<a name="line.525"></a>
+<span class="sourceLineNo">526</span>      if (this.conf.get("mapreduce.task.attempt.id") == null) {<a name="line.526"></a>
+<span class="sourceLineNo">527</span>        this.conf.set("mapreduce.task.attempt.id", "hb_m_" + this.serverName.toString());<a name="line.527"></a>
+<span class="sourceLineNo">528</span>      }<a name="line.528"></a>
 <span class="sourceLineNo">529</span><a name="line.529"></a>
-<span class="sourceLineNo">530</span>      this.maxBlancingTime = getMaxBalancingTime();<a name="line.530"></a>
-<span class="sourceLineNo">531</span>      this.maxRitPercent = conf.getDouble(HConstants.HBASE_MASTER_BALANCER_MAX_RIT_PERCENT,<a name="line.531"></a>
-<span class="sourceLineNo">532</span>          HConstants.DEFAULT_HBASE_MASTER_BALANCER_MAX_RIT_PERCENT);<a name="line.532"></a>
-<span class="sourceLineNo">533</span><a name="line.533"></a>
-<span class="sourceLineNo">534</span>      // Do we publish the status?<a name="line.534"></a>
+<span class="sourceLineNo">530</span>      // should we check the compression codec type at master side, default true, HBASE-6370<a name="line.530"></a>
+<span class="sourceLineNo">531</span>      this.masterCheckCompression = conf.getBoolean("hbase.master.check.compression", true);<a name="line.531"></a>
+<span class="sourceLineNo">532</span><a name="line.532"></a>
+<span class="sourceLineNo">533</span>      // should we check encryption settings at master side, default true<a name="line.533"></a>
+<span class="sourceLineNo">534</span>      this.masterCheckEncryption = conf.getBoolean("hbase.master.check.encryption", true);<a name="line.534"></a>
 <span class="sourceLineNo">535</span><a name="line.535"></a>
-<span class="sourceLineNo">536</span>      boolean shouldPublish = conf.getBoolean(HConstants.STATUS_PUBLISHED,<a name="line.536"></a>
-<span class="sourceLineNo">537</span>          HConstants.STATUS_PUBLISHED_DEFAULT);<a name="line.537"></a>
-<span class="sourceLineNo">538</span>      Class&lt;? extends ClusterStatusPublisher.Publisher&gt; publisherClass =<a name="line.538"></a>
-<span class="sourceLineNo">539</span>          conf.getClass(ClusterStatusPublisher.STATUS_PUBLISHER_CLASS,<a name="line.539"></a>
-<span class="sourceLineNo">540</span>              ClusterStatusPublisher.DEFAULT_STATUS_PUBLISHER_CLASS,<a name="line.540"></a>
-<span class="sourceLineNo">541</span>              ClusterStatusPublisher.Publisher.class);<a name="line.541"></a>
-<span class="sourceLineNo">542</span><a name="line.542"></a>
-<span class="sourceLineNo">543</span>      if (shouldPublish) {<a name="line.543"></a>
-<span class="sourceLineNo">544</span>        if (publisherClass == null) {<a name="line.544"></a>
-<span class="sourceLineNo">545</span>          LOG.warn(HConstants.STATUS_PUBLISHED + " is true, but " +<a name="line.545"></a>
-<span class="sourceLineNo">546</span>              ClusterStatusPublisher.DEFAULT_STATUS_PUBLISHER_CLASS +<a name="line.546"></a>
-<span class="sourceLineNo">547</span>              " is not set - not publishing status");<a name="line.547"></a>
-<span class="sourceLineNo">548</span>        } else {<a name="line.548"></a>
-<span class="sourceLineNo">549</span>          clusterStatusPublisherChore = new ClusterStatusPublisher(this, conf, publisherClass);<a name="line.549"></a>
-<span class="sourceLineNo">550</span>          getChoreService().scheduleChore(clusterStatusPublisherChore);<a name="line.550"></a>
-<span class="sourceLineNo">551</span>        }<a name="line.551"></a>
-<span class="sourceLineNo">552</span>      }<a name="line.552"></a>
+<span class="sourceLineNo">536</span>      this.metricsMaster = new MetricsMaster(new MetricsMasterWrapperImpl(this));<a name="line.536"></a>
+<span class="sourceLineNo">537</span><a name="line.537"></a>
+<span class="sourceLineNo">538</span>      // preload table descriptor at startup<a name="line.538"></a>
+<span class="sourceLineNo">539</span>      this.preLoadTableDescriptors = conf.getBoolean("hbase.master.preload.tabledescriptors", true);<a name="line.539"></a>
+<span class="sourceLineNo">540</span><a name="line.540"></a>
+<span class="sourceLineNo">541</span>      this.maxBlancingTime = getMaxBalancingTime();<a name="line.541"></a>
+<span class="sourceLineNo">542</span>      this.maxRitPercent = conf.getDouble(HConstants.HBASE_MASTER_BALANCER_MAX_RIT_PERCENT,<a name="line.542"></a>
+<span class="sourceLineNo">543</span>          HConstants.DEFAULT_HBASE_MASTER_BALANCER_MAX_RIT_PERCENT);<a name="line.543"></a>
+<span class="sourceLineNo">544</span><a name="line.544"></a>
+<span class="sourceLineNo">545</span>      // Do we publish the status?<a name="line.545"></a>
+<span class="sourceLineNo">546</span><a name="line.546"></a>
+<span class="sourceLineNo">547</span>      boolean shouldPublish = conf.getBoolean(HConstants.STATUS_PUBLISHED,<a name="line.547"></a>
+<span class="sourceLineNo">548</span>          HConstants.STATUS_PUBLISHED_DEFAULT);<a name="line.548"></a>
+<span class="sourceLineNo">549</span>      Class&lt;? extends ClusterStatusPublisher.Publisher&gt; publisherClass =<a name="line.549"></a>
+<span class="sourceLineNo">550</span>          conf.getClass(ClusterStatusPublisher.STATUS_PUBLISHER_CLASS,<a name="line.550"></a>
+<span class="sourceLineNo">551</span>              ClusterStatusPublisher.DEFAULT_STATUS_PUBLISHER_CLASS,<a name="line.551"></a>
+<span class="sourceLineNo">552</span>              ClusterStatusPublisher.Publisher.class);<a name="line.552"></a>
 <span class="sourceLineNo">553</span><a name="line.553"></a>
-<span class="sourceLineNo">554</span>      // Some unit tests don't need a cluster, so no zookeeper at all<a name="line.554"></a>
-<span class="sourceLineNo">555</span>      if (!conf.getBoolean("hbase.testing.nocluster", false)) {<a name="line.555"></a>
-<span class="sourceLineNo">556</span>        this.activeMasterManager = new ActiveMasterManager(zooKeeper, this.serverName, this);<a name="line.556"></a>
-<span class="sourceLineNo">557</span>      } else {<a name="line.557"></a>
-<span class="sourceLineNo">558</span>        this.activeMasterManager = null;<a name="line.558"></a>
-<span class="sourceLineNo">559</span>      }<a name="line.559"></a>
-<span class="sourceLineNo">560</span>    } catch (Throwable t) {<a name="line.560"></a>
-<span class="sourceLineNo">561</span>      // Make sure we log the exception. HMaster is often started via reflection and the<a name="line.561"></a>
-<span class="sourceLineNo">562</span>      // cause of failed startup is lost.<a name="line.562"></a>
-<span class="sourceLineNo">563</span>      LOG.error("Failed construction of Master", t);<a name="line.563"></a>
-<span class="sourceLineNo">564</span>      throw t;<a name="line.564"></a>
-<span class="sourceLineNo">565</span>    }<a name="line.565"></a>
-<span class="sourceLineNo">566</span>  }<a name="line.566"></a>
-<span class="sourceLineNo">567</span><a name="line.567"></a>
-<span class="sourceLineNo">568</span>  @Override<a name="line.568"></a>
-<span class="sourceLineNo">569</span>  protected String getUseThisHostnameInstead(Configuration conf) {<a name="line.569"></a>
-<span class="sourceLineNo">570</span>    return conf.get(MASTER_HOSTNAME_KEY);<a name="line.570"></a>
-<span class="sourceLineNo">571</span>  }<a name="line.571"></a>
-<span class="sourceLineNo">572</span><a name="line.572"></a>
-<span class="sourceLineNo">573</span>  // Main run loop. Calls through to the regionserver run loop AFTER becoming active Master; will<a name="line.573"></a>
-<span class="sourceLineNo">574</span>  // block in here until then.<a name="line.574"></a>
-<span class="sourceLineNo">575</span>  @Override<a name="line.575"></a>
-<span class="sourceLineNo">576</span>  public void run() {<a name="line.576"></a>
-<span class="sourceLineNo">577</span>    try {<a name="line.577"></a>
-<span class="sourceLineNo">578</span>      if (!conf.getBoolean("hbase.testing.nocluster", false)) {<a name="line.578"></a>
-<span class="sourceLineNo">579</span>        Threads.setDaemonThreadRunning(new Thread(() -&gt; {<a name="line.579"></a>
-<span class="sourceLineNo">580</span>          try {<a name="line.580"></a>
-<span class="sourceLineNo">581</span>            int infoPort = putUpJettyServer();<a name="line.581"></a>
-<span class="sourceLineNo">582</span>            startActiveMasterManager(infoPort);<a name="line.582"></a>
-<span class="sourceLineNo">583</span>          } catch (Throwable t) {<a name="line.583"></a>
-<span class="sourceLineNo">584</span>            // Make sure we log the exception.<a name="line.584"></a>
-<span class="sourceLineNo">585</span>            String error = "Failed to become Active Master";<a name="line.585"></a>
-<span class="sourceLineNo">586</span>            LOG.error(error, t);<a name="line.586"></a>
-<span class="sourceLineNo">587</span>            // Abort should have been called already.<a name="line.587"></a>
-<span class="sourceLineNo">588</span>            if (!isAborted()) {<a name="line.588"></a>
-<span class="sourceLineNo">589</span>              abort(error, t);<a name="line.589"></a>
-<span class="sourceLineNo">590</span>            }<a name="line.590"></a>
-<span class="sourceLineNo">591</span>          }<a name="line.591"></a>
-<span class="sourceLineNo">592</span>        }), getName() + ":becomeActiveMaster");<a name="line.592"></a>
-<span class="sourceLineNo">593</span>      }<a name="line.593"></a>
-<span class="sourceLineNo">594</span>      // Fall in here even if we have been aborted. Need to run the shutdown services and<a name="line.594"></a>
-<span class="sourceLineNo">595</span>      // the super run call will do this for us.<a name="line.595"></a>
-<span class="sourceLineNo">596</span>      super.run();<a name="line.596"></a>
-<span class="sourceLineNo">597</span>    } finally {<a name="line.597"></a>
-<span class="sourceLineNo">598</span>      if (this.clusterSchemaService != null) {<a name="line.598"></a>
-<span class="sourceLineNo">599</span>        // If on way out, then we are no longer active master.<a name="line.599"></a>
-<span class="sourceLineNo">600</span>        this.clusterSchemaService.stopAsync();<a name="line.600"></a>
-<span class="sourceLineNo">601</span>        try {<a name="line.601"></a>
-<span class="sourceLineNo">602</span>          this.clusterSchemaService.awaitTerminated(<a name="line.602"></a>
-<span class="sourceLineNo">603</span>              getConfiguration().getInt(HBASE_MASTER_WAIT_ON_SERVICE_IN_SECONDS,<a name="line.603"></a>
-<span class="sourceLineNo">604</span>              DEFAULT_HBASE_MASTER_WAIT_ON_SERVICE_IN_SECONDS), TimeUnit.SECONDS);<a name="line.604"></a>
-<span class="sourceLineNo">605</span>        } catch (TimeoutException te) {<a name="line.605"></a>
-<span class="sourceLineNo">606</span>          LOG.warn("Failed shutdown of clusterSchemaService", te);<a name="line.606"></a>
-<span class="sourceLineNo">607</span>        }<a name="line.607"></a>
-<span class="sourceLineNo">608</span>      }<a name="line.608"></a>
-<span class="sourceLineNo">609</span>      this.activeMaster = false;<a name="line.609"></a>
-<span class="sourceLineNo">610</span>    }<a name="line.610"></a>
-<span class="sourceLineNo">611</span>  }<a name="line.611"></a>
-<span class="sourceLineNo">612</span><a name="line.612"></a>
-<span class="sourceLineNo">613</span>  // return the actual infoPort, -1 means disable info server.<a name="line.613"></a>
-<span class="sourceLineNo">614</span>  private int putUpJettyServer() throws IOException {<a name="line.614"></a>
-<span class="sourceLineNo">615</span>    if (!conf.getBoolean("hbase.master.infoserver.redirect", true)) {<a name="line.615"></a>
-<span class="sourceLineNo">616</span>      return -1;<a name="line.616"></a>
-<span class="sourceLineNo">617</span>    }<a name="line.617"></a>
-<span class="sourceLineNo">618</span>    final int infoPort = conf.getInt("hbase.master.info.port.orig",<a name="line.618"></a>
-<span class="sourceLineNo">619</span>      HConstants.DEFAULT_MASTER_INFOPORT);<a name="line.619"></a>
-<span class="sourceLineNo">620</span>    // -1 is for disabling info server, so no redirecting<a name="line.620"></a>
-<span class="sourceLineNo">621</span>    if (infoPort &lt; 0 || infoServer == null) {<a name="line.621"></a>
-<span class="sourceLineNo">622</span>      return -1;<a name="line.622"></a>
-<span class="sourceLineNo">623</span>    }<a name="line.623"></a>
-<span class="sourceLineNo">624</span>    if(infoPort == infoServer.getPort()) {<a name="line.624"></a>
-<span class="sourceLineNo">625</span>      return infoPort;<a name="line.625"></a>
-<span class="sourceLineNo">626</span>    }<a name="line.626"></a>
-<span class="sourceLineNo">627</span>    final String addr = conf.get("hbase.master.info.bindAddress", "0.0.0.0");<a name="line.627"></a>
-<span class="sourceLineNo">628</span>    if (!Addressing.isLocalAddress(InetAddress.getByName(addr))) {<a name="line.628"></a>
-<span class="sourceLineNo">629</span>      String msg =<a name="line.629"></a>
-<span class="sourceLineNo">630</span>          "Failed to start redirecting jetty server. Address " + addr<a name="line.630"></a>
-<span class="sourceLineNo">631</span>              + " does not belong to this host. Correct configuration parameter: "<a name="line.631"></a>
-<span class="sourceLineNo">632</span>              + "hbase.master.info.bindAddress";<a name="line.632"></a>
-<span class="sourceLineNo">633</span>      LOG.error(msg);<a name="line.633"></a>
-<span class="sourceLineNo">634</span>      throw new IOException(msg);<a name="line.634"></a>
-<span class="sourceLineNo">635</span>    }<a name="line.635"></a>
-<span class="sourceLineNo">636</span><a name="line.636"></a>
-<span class="sourceLineNo">637</span>    // TODO I'm pretty sure we could just add another binding to the InfoServer run by<a name="line.637"></a>
-<span class="sourceLineNo">638</span>    // the RegionServer and have it run the RedirectServlet instead of standing up<a name="line.638"></a>
-<span class="sourceLineNo">639</span>    // a second entire stack here.<a name="line.639"></a>
-<span class="sourceLineNo">640</span>    masterJettyServer = new Server();<a name="line.640"></a>
-<span class="sourceLineNo">641</span>    final ServerConnector connector = new ServerConnector(masterJettyServer);<a name="line.641"></a>
-<span class="sourceLineNo">642</span>    connector.setHost(addr);<a name="line.642"></a>
-<span class="sourceLineNo">643</span>    connector.setPort(infoPort);<a name="line.643"></a>
-<span class="sourceLineNo">644</span>    masterJettyServer.addConnector(connector);<a name="line.644"></a>
-<span class="sourceLineNo">645</span>    masterJettyServer.setStopAtShutdown(true);<a name="line.645"></a>
-<span class="sourceLineNo">646</span><a name="line.646"></a>
-<span class="sourceLineNo">647</span>    final String redirectHostname =<a name="line.647"></a>
-<span class="sourceLineNo">648</span>        StringUtils.isBlank(useThisHostnameInstead) ? null : useThisHostnameInstead;<a name="line.648"></a>
-<span class="sourceLineNo">649</span><a name="line.649"></a>
-<span class="sourceLineNo">650</span>    final RedirectServlet redirect = new RedirectServlet(infoServer, redirectHostname);<a name="line.650"></a>
-<span class="sourceLineNo">651</span>    final WebAppContext context = new WebAppContext(null, "/", null, null, null, null, WebAppContext.NO_SESSIONS);<a name="line.651"></a>
-<span class="sourceLineNo">652</span>    context.addServlet(new ServletHolder(redirect), "/*");<a name="line.652"></a>
-<span class="sourceLineNo">653</span>    context.setServer(masterJettyServer);<a name="line.653"></a>
-<span class="sourceLineNo">654</span><a name="line.654"></a>
-<span class="sourceLineNo">655</span>    try {<a name="line.655"></a>
-<span class="sourceLineNo">656</span>      masterJettyServer.start();<a name="line.656"></a>
-<span class="sourceLineNo">657</span>    } catch (Exception e) {<a name="line.657"></a>
-<span class="sourceLineNo">658</span>      throw new IOException("Failed to start redirecting jetty server", e);<a name="line.658"></a>
-<span class="sourceLineNo">659</span>    }<a name="line.659"></a>
-<span class="sourceLineNo">660</span>    return connector.getLocalPort();<a name="line.660"></a>
-<span class="sourceLineNo">661</span>  }<a name="line.661"></a>
-<span class="sourceLineNo">662</span><a name="line.662"></a>
-<span class="sourceLineNo">663</span>  @Override<a name="line.663"></a>
-<span class="sourceLineNo">664</span>  protected Function&lt;TableDescriptorBuilder, TableDescriptorBuilder&gt; getMetaTableObserver() {<a name="line.664"></a>
-<span class="sourceLineNo">665</span>    return builder -&gt; builder.setRegionReplication(conf.getInt(HConstants.META_REPLICAS_NUM, HConstants.DEFAULT_META_REPLICA_NUM));<a name="line.665"></a>
-<span class="sourceLineNo">666</span>  }<a name="line.666"></a>
-<span class="sourceLineNo">667</span>  /**<a name="line.667"></a>
-<span class="sourceLineNo">668</span>   * For compatibility, if failed with regionserver credentials, try the master one<a name="line.668"></a>
-<span class="sourceLineNo">669</span>   */<a name="line.669"></a>
-<span class="sourceLineNo">670</span>  @Override<a name="line.670"></a>
-<span class="sourceLineNo">671</span>  protected void login(UserProvider user, String host) throws IOException {<a name="line.671"></a>
-<span class="sourceLineNo">672</span>    try {<a name="line.672"></a>
-<span class="sourceLineNo">673</span>      super.login(user, host);<a name="line.673"></a>
-<span class="sourceLineNo">674</span>    } catch (IOException ie) {<a name="line.674"></a>
-<span class="sourceLineNo">675</span>      user.login("hbase.master.keytab.file",<a name="line.675"></a>
-<span class="sourceLineNo">676</span>        "hbase.master.kerberos.principal", host);<a name="line.676"></a>
-<span class="sourceLineNo">677</span>    }<a name="line.677"></a>
-<span class="sourceLineNo">678</span>  }<a name="line.678"></a>
-<span class="sourceLineNo">679</span><a name="line.679"></a>
-<span class="sourceLineNo">680</span>  /**<a name="line.680"></a>
-<span class="sourceLineNo">681</span>   * If configured to put regions on active master,<a name="line.681"></a>
-<span class="sourceLineNo">682</span>   * wait till a backup master becomes active.<a name="line.682"></a>
-<span class="sourceLineNo">683</span>   * Otherwise, loop till the server is stopped or aborted.<a name="line.683"></a>
-<span class="sourceLineNo">684</span>   */<a name="line.684"></a>
-<span class="sourceLineNo">685</span>  @Override<a name="line.685"></a>
-<span class="sourceLineNo">686</span>  protected void waitForMasterActive(){<a name="line.686"></a>
-<span class="sourceLineNo">687</span>    boolean tablesOnMaster = LoadBalancer.isTablesOnMaster(conf);<a name="line.687"></a>
-<span class="sourceLineNo">688</span>    while (!(tablesOnMaster &amp;&amp; activeMaster) &amp;&amp; !isStopped() &amp;&amp; !isAborted()) {<a name="line.688"></a>
-<span class="sourceLineNo">689</span>      sleeper.sleep();<a name="line.689"></a>
-<span class="sourceLineNo">690</span>    }<a name="line.690"></a>
-<span class="sourceLineNo">691</span>  }<a name="line.691"></a>
-<span class="sourceLineNo">692</span><a name="line.692"></a>
-<span class="sourceLineNo">693</span>  @VisibleForTesting<a name="line.693"></a>
-<span class="sourceLineNo">694</span>  public MasterRpcServices getMasterRpcServices() {<a name="line.694"></a>
-<span class="sourceLineNo">695</span>    return (MasterRpcServices)rpcServices;<a name="line.695"></a>
-<span class="sourceLineNo">696</span>  }<a name="line.696"></a>
-<span class="sourceLineNo">697</span><a name="line.697"></a>
-<span class="sourceLineNo">698</span>  public boolean balanceSwitch(final boolean b) throws IOException {<a name="line.698"></a>
-<span class="sourceLineNo">699</span>    return getMasterRpcServices().switchBalancer(b, BalanceSwitchMode.ASYNC);<a name="line.699"></a>
-<span class="sourceLineNo">700</span>  }<a name="line.700"></a>
-<span class="sourceLineNo">701</span><a name="line.701"></a>
-<span class="sourceLineNo">702</span>  @Override<a name="line.702"></a>
-<span class="sourceLineNo">703</span>  protected String getProcessName() {<a name="line.703"></a>
-<span class="sourceLineNo">704</span>    return MASTER;<a name="line.704"></a>
+<span class="sourceLineNo">554</span>      if (shouldPublish) {<a name="line.554"></a>
+<span class="sourceLineNo">555</span>        if (publisherClass == null) {<a name="line.555"></a>
+<span class="sourceLineNo">556</span>          LOG.warn(HConstants.STATUS_PUBLISHED + " is true, but " +<a name="line.556"></a>
+<span class="sourceLineNo">557</span>              ClusterStatusPublisher.DEFAULT_STATUS_PUBLISHER_CLASS +<a name="line.557"></a>
+<span class="sourceLineNo">558</span>              " is not set - not publishing status");<a name="line.558"></a>
+<span class="sourceLineNo">559</span>        } else {<a name="line.559"></a>
+<span class="sourceLineNo">560</span>          clusterStatusPublisherChore = new ClusterStatusPublisher(this, conf, publisherClass);<a name="line.560"></a>
+<span class="sourceLineNo">561</span>          getChoreService().scheduleChore(clusterStatusPublisherChore);<a name="line.561"></a>
+<span class="sourceLineNo">562</span>        }<a name="line.562"></a>
+<span class="sourceLineNo">563</span>      }<a name="line.563"></a>
+<span class="sourceLineNo">564</span><a name="line.564"></a>
+<span class="sourceLineNo">565</span>      // Some unit tests don't need a cluster, so no zookeeper at all<a name="line.565"></a>
+<span class="sourceLineNo">566</span>      if (!conf.getBoolean("hbase.testing.nocluster", false)) {<a name="line.566"></a>
+<span class="sourceLineNo">567</span>        this.activeMasterManager = new ActiveMasterManager(zooKeeper, this.serverName, this);<a name="line.567"></a>
+<span class="sourceLineNo">568</span>      } else {<a name="line.568"></a>
+<span class="sourceLineNo">569</span>        this.activeMasterManager = null;<a name="line.569"></a>
+<span class="sourceLineNo">570</span>      }<a name="line.570"></a>
+<span class="sourceLineNo">571</span>    } catch (Throwable t) {<a name="line.571"></a>
+<span class="sourceLineNo">572</span>      // Make sure w

<TRUNCATED>

[40/46] hbase-site git commit: Published site at 05d22ed960204183fbd9bd16f1dbca6410ccde76.

Posted by gi...@apache.org.
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/3649682c/devapidocs/org/apache/hadoop/hbase/master/MasterRpcServices.html
----------------------------------------------------------------------
diff --git a/devapidocs/org/apache/hadoop/hbase/master/MasterRpcServices.html b/devapidocs/org/apache/hadoop/hbase/master/MasterRpcServices.html
index 9ff68ad..3ff4ce2 100644
--- a/devapidocs/org/apache/hadoop/hbase/master/MasterRpcServices.html
+++ b/devapidocs/org/apache/hadoop/hbase/master/MasterRpcServices.html
@@ -2021,7 +2021,7 @@ implements org.apache.hadoop.hbase.shaded.protobuf.generated.MasterProtos.Master
 <ul class="blockList">
 <li class="blockList">
 <h4>unassignRegion</h4>
-<pre>public&nbsp;org.apache.hadoop.hbase.shaded.protobuf.generated.MasterProtos.UnassignRegionResponse&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/master/MasterRpcServices.html#line.1536">unassignRegion</a>(org.apache.hbase.thirdparty.com.google.protobuf.RpcController&nbsp;controller,
+<pre>public&nbsp;org.apache.hadoop.hbase.shaded.protobuf.generated.MasterProtos.UnassignRegionResponse&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/master/MasterRpcServices.html#line.1532">unassignRegion</a>(org.apache.hbase.thirdparty.com.google.protobuf.RpcController&nbsp;controller,
                                                                                                             org.apache.hadoop.hbase.shaded.protobuf.generated.MasterProtos.UnassignRegionRequest&nbsp;req)
                                                                                                      throws org.apache.hbase.thirdparty.com.google.protobuf.ServiceException</pre>
 <dl>
@@ -2038,7 +2038,7 @@ implements org.apache.hadoop.hbase.shaded.protobuf.generated.MasterProtos.Master
 <ul class="blockList">
 <li class="blockList">
 <h4>reportRegionStateTransition</h4>
-<pre>public&nbsp;org.apache.hadoop.hbase.shaded.protobuf.generated.RegionServerStatusProtos.ReportRegionStateTransitionResponse&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/master/MasterRpcServices.html#line.1577">reportRegionStateTransition</a>(org.apache.hbase.thirdparty.com.google.protobuf.RpcController&nbsp;c,
+<pre>public&nbsp;org.apache.hadoop.hbase.shaded.protobuf.generated.RegionServerStatusProtos.ReportRegionStateTransitionResponse&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/master/MasterRpcServices.html#line.1573">reportRegionStateTransition</a>(org.apache.hbase.thirdparty.com.google.protobuf.RpcController&nbsp;c,
                                                                                                                                                   org.apache.hadoop.hbase.shaded.protobuf.generated.RegionServerStatusProtos.ReportRegionStateTransitionRequest&nbsp;req)
                                                                                                                                            throws org.apache.hbase.thirdparty.com.google.protobuf.ServiceException</pre>
 <dl>
@@ -2055,7 +2055,7 @@ implements org.apache.hadoop.hbase.shaded.protobuf.generated.MasterProtos.Master
 <ul class="blockList">
 <li class="blockList">
 <h4>setQuota</h4>
-<pre>public&nbsp;org.apache.hadoop.hbase.shaded.protobuf.generated.MasterProtos.SetQuotaResponse&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/master/MasterRpcServices.html#line.1588">setQuota</a>(org.apache.hbase.thirdparty.com.google.protobuf.RpcController&nbsp;c,
+<pre>public&nbsp;org.apache.hadoop.hbase.shaded.protobuf.generated.MasterProtos.SetQuotaResponse&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/master/MasterRpcServices.html#line.1584">setQuota</a>(org.apache.hbase.thirdparty.com.google.protobuf.RpcController&nbsp;c,
                                                                                                 org.apache.hadoop.hbase.shaded.protobuf.generated.MasterProtos.SetQuotaRequest&nbsp;req)
                                                                                          throws org.apache.hbase.thirdparty.com.google.protobuf.ServiceException</pre>
 <dl>
@@ -2072,7 +2072,7 @@ implements org.apache.hadoop.hbase.shaded.protobuf.generated.MasterProtos.Master
 <ul class="blockList">
 <li class="blockList">
 <h4>getLastMajorCompactionTimestamp</h4>
-<pre>public&nbsp;org.apache.hadoop.hbase.shaded.protobuf.generated.MasterProtos.MajorCompactionTimestampResponse&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/master/MasterRpcServices.html#line.1599">getLastMajorCompactionTimestamp</a>(org.apache.hbase.thirdparty.com.google.protobuf.RpcController&nbsp;controller,
+<pre>public&nbsp;org.apache.hadoop.hbase.shaded.protobuf.generated.MasterProtos.MajorCompactionTimestampResponse&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/master/MasterRpcServices.html#line.1595">getLastMajorCompactionTimestamp</a>(org.apache.hbase.thirdparty.com.google.protobuf.RpcController&nbsp;controller,
                                                                                                                                        org.apache.hadoop.hbase.shaded.protobuf.generated.MasterProtos.MajorCompactionTimestampRequest&nbsp;request)
                                                                                                                                 throws org.apache.hbase.thirdparty.com.google.protobuf.ServiceException</pre>
 <dl>
@@ -2089,7 +2089,7 @@ implements org.apache.hadoop.hbase.shaded.protobuf.generated.MasterProtos.Master
 <ul class="blockList">
 <li class="blockList">
 <h4>getLastMajorCompactionTimestampForRegion</h4>
-<pre>public&nbsp;org.apache.hadoop.hbase.shaded.protobuf.generated.MasterProtos.MajorCompactionTimestampResponse&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/master/MasterRpcServices.html#line.1614">getLastMajorCompactionTimestampForRegion</a>(org.apache.hbase.thirdparty.com.google.protobuf.RpcController&nbsp;controller,
+<pre>public&nbsp;org.apache.hadoop.hbase.shaded.protobuf.generated.MasterProtos.MajorCompactionTimestampResponse&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/master/MasterRpcServices.html#line.1610">getLastMajorCompactionTimestampForRegion</a>(org.apache.hbase.thirdparty.com.google.protobuf.RpcController&nbsp;controller,
                                                                                                                                                 org.apache.hadoop.hbase.shaded.protobuf.generated.MasterProtos.MajorCompactionTimestampForRegionRequest&nbsp;request)
                                                                                                                                          throws org.apache.hbase.thirdparty.com.google.protobuf.ServiceException</pre>
 <dl>
@@ -2106,7 +2106,7 @@ implements org.apache.hadoop.hbase.shaded.protobuf.generated.MasterProtos.Master
 <ul class="blockList">
 <li class="blockList">
 <h4>compactRegion</h4>
-<pre>public&nbsp;org.apache.hadoop.hbase.shaded.protobuf.generated.AdminProtos.CompactRegionResponse&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/master/MasterRpcServices.html#line.1638">compactRegion</a>(org.apache.hbase.thirdparty.com.google.protobuf.RpcController&nbsp;controller,
+<pre>public&nbsp;org.apache.hadoop.hbase.shaded.protobuf.generated.AdminProtos.CompactRegionResponse&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/master/MasterRpcServices.html#line.1634">compactRegion</a>(org.apache.hbase.thirdparty.com.google.protobuf.RpcController&nbsp;controller,
                                                                                                          org.apache.hadoop.hbase.shaded.protobuf.generated.AdminProtos.CompactRegionRequest&nbsp;request)
                                                                                                   throws org.apache.hbase.thirdparty.com.google.protobuf.ServiceException</pre>
 <div class="block">Compact a region on the master.</div>
@@ -2129,7 +2129,7 @@ implements org.apache.hadoop.hbase.shaded.protobuf.generated.MasterProtos.Master
 <ul class="blockList">
 <li class="blockList">
 <h4>checkHFileFormatVersionForMob</h4>
-<pre>private&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/master/MasterRpcServices.html#line.1660">checkHFileFormatVersionForMob</a>()
+<pre>private&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/master/MasterRpcServices.html#line.1656">checkHFileFormatVersionForMob</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">check configured hfile format version before to do compaction</div>
 <dl>
@@ -2144,7 +2144,7 @@ implements org.apache.hadoop.hbase.shaded.protobuf.generated.MasterProtos.Master
 <ul class="blockList">
 <li class="blockList">
 <h4>getRegionInfo</h4>
-<pre>public&nbsp;org.apache.hadoop.hbase.shaded.protobuf.generated.AdminProtos.GetRegionInfoResponse&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/master/MasterRpcServices.html#line.1672">getRegionInfo</a>(org.apache.hbase.thirdparty.com.google.protobuf.RpcController&nbsp;controller,
+<pre>public&nbsp;org.apache.hadoop.hbase.shaded.protobuf.generated.AdminProtos.GetRegionInfoResponse&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/master/MasterRpcServices.html#line.1668">getRegionInfo</a>(org.apache.hbase.thirdparty.com.google.protobuf.RpcController&nbsp;controller,
                                                                                                          org.apache.hadoop.hbase.shaded.protobuf.generated.AdminProtos.GetRegionInfoRequest&nbsp;request)
                                                                                                   throws org.apache.hbase.thirdparty.com.google.protobuf.ServiceException</pre>
 <dl>
@@ -2163,7 +2163,7 @@ implements org.apache.hadoop.hbase.shaded.protobuf.generated.MasterProtos.Master
 <ul class="blockList">
 <li class="blockList">
 <h4>compactMob</h4>
-<pre>private&nbsp;org.apache.hadoop.hbase.shaded.protobuf.generated.AdminProtos.CompactRegionResponse&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/master/MasterRpcServices.html#line.1697">compactMob</a>(org.apache.hadoop.hbase.shaded.protobuf.generated.AdminProtos.CompactRegionRequest&nbsp;request,
+<pre>private&nbsp;org.apache.hadoop.hbase.shaded.protobuf.generated.AdminProtos.CompactRegionResponse&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/master/MasterRpcServices.html#line.1693">compactMob</a>(org.apache.hadoop.hbase.shaded.protobuf.generated.AdminProtos.CompactRegionRequest&nbsp;request,
                                                                                                        <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></pre>
 <div class="block">Compacts the mob files in the current table.</div>
@@ -2184,7 +2184,7 @@ implements org.apache.hadoop.hbase.shaded.protobuf.generated.MasterProtos.Master
 <ul class="blockList">
 <li class="blockList">
 <h4>isBalancerEnabled</h4>
-<pre>public&nbsp;org.apache.hadoop.hbase.shaded.protobuf.generated.MasterProtos.IsBalancerEnabledResponse&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/master/MasterRpcServices.html#line.1743">isBalancerEnabled</a>(org.apache.hbase.thirdparty.com.google.protobuf.RpcController&nbsp;controller,
+<pre>public&nbsp;org.apache.hadoop.hbase.shaded.protobuf.generated.MasterProtos.IsBalancerEnabledResponse&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/master/MasterRpcServices.html#line.1739">isBalancerEnabled</a>(org.apache.hbase.thirdparty.com.google.protobuf.RpcController&nbsp;controller,
                                                                                                                   org.apache.hadoop.hbase.shaded.protobuf.generated.MasterProtos.IsBalancerEnabledRequest&nbsp;request)
                                                                                                            throws org.apache.hbase.thirdparty.com.google.protobuf.ServiceException</pre>
 <dl>
@@ -2201,7 +2201,7 @@ implements org.apache.hadoop.hbase.shaded.protobuf.generated.MasterProtos.Master
 <ul class="blockList">
 <li class="blockList">
 <h4>setSplitOrMergeEnabled</h4>
-<pre>public&nbsp;org.apache.hadoop.hbase.shaded.protobuf.generated.MasterProtos.SetSplitOrMergeEnabledResponse&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/master/MasterRpcServices.html#line.1751">setSplitOrMergeEnabled</a>(org.apache.hbase.thirdparty.com.google.protobuf.RpcController&nbsp;controller,
+<pre>public&nbsp;org.apache.hadoop.hbase.shaded.protobuf.generated.MasterProtos.SetSplitOrMergeEnabledResponse&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/master/MasterRpcServices.html#line.1747">setSplitOrMergeEnabled</a>(org.apache.hbase.thirdparty.com.google.protobuf.RpcController&nbsp;controller,
                                                                                                                             org.apache.hadoop.hbase.shaded.protobuf.generated.MasterProtos.SetSplitOrMergeEnabledRequest&nbsp;request)
                                                                                                                      throws org.apache.hbase.thirdparty.com.google.protobuf.ServiceException</pre>
 <dl>
@@ -2218,7 +2218,7 @@ implements org.apache.hadoop.hbase.shaded.protobuf.generated.MasterProtos.Master
 <ul class="blockList">
 <li class="blockList">
 <h4>isSplitOrMergeEnabled</h4>
-<pre>public&nbsp;org.apache.hadoop.hbase.shaded.protobuf.generated.MasterProtos.IsSplitOrMergeEnabledResponse&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/master/MasterRpcServices.html#line.1778">isSplitOrMergeEnabled</a>(org.apache.hbase.thirdparty.com.google.protobuf.RpcController&nbsp;controller,
+<pre>public&nbsp;org.apache.hadoop.hbase.shaded.protobuf.generated.MasterProtos.IsSplitOrMergeEnabledResponse&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/master/MasterRpcServices.html#line.1774">isSplitOrMergeEnabled</a>(org.apache.hbase.thirdparty.com.google.protobuf.RpcController&nbsp;controller,
                                                                                                                           org.apache.hadoop.hbase.shaded.protobuf.generated.MasterProtos.IsSplitOrMergeEnabledRequest&nbsp;request)
                                                                                                                    throws org.apache.hbase.thirdparty.com.google.protobuf.ServiceException</pre>
 <dl>
@@ -2235,7 +2235,7 @@ implements org.apache.hadoop.hbase.shaded.protobuf.generated.MasterProtos.Master
 <ul class="blockList">
 <li class="blockList">
 <h4>normalize</h4>
-<pre>public&nbsp;org.apache.hadoop.hbase.shaded.protobuf.generated.MasterProtos.NormalizeResponse&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/master/MasterRpcServices.html#line.1786">normalize</a>(org.apache.hbase.thirdparty.com.google.protobuf.RpcController&nbsp;controller,
+<pre>public&nbsp;org.apache.hadoop.hbase.shaded.protobuf.generated.MasterProtos.NormalizeResponse&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/master/MasterRpcServices.html#line.1782">normalize</a>(org.apache.hbase.thirdparty.com.google.protobuf.RpcController&nbsp;controller,
                                                                                                   org.apache.hadoop.hbase.shaded.protobuf.generated.MasterProtos.NormalizeRequest&nbsp;request)
                                                                                            throws org.apache.hbase.thirdparty.com.google.protobuf.ServiceException</pre>
 <dl>
@@ -2252,7 +2252,7 @@ implements org.apache.hadoop.hbase.shaded.protobuf.generated.MasterProtos.Master
 <ul class="blockList">
 <li class="blockList">
 <h4>setNormalizerRunning</h4>
-<pre>public&nbsp;org.apache.hadoop.hbase.shaded.protobuf.generated.MasterProtos.SetNormalizerRunningResponse&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/master/MasterRpcServices.html#line.1797">setNormalizerRunning</a>(org.apache.hbase.thirdparty.com.google.protobuf.RpcController&nbsp;controller,
+<pre>public&nbsp;org.apache.hadoop.hbase.shaded.protobuf.generated.MasterProtos.SetNormalizerRunningResponse&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/master/MasterRpcServices.html#line.1793">setNormalizerRunning</a>(org.apache.hbase.thirdparty.com.google.protobuf.RpcController&nbsp;controller,
                                                                                                                         org.apache.hadoop.hbase.shaded.protobuf.generated.MasterProtos.SetNormalizerRunningRequest&nbsp;request)
                                                                                                                  throws org.apache.hbase.thirdparty.com.google.protobuf.ServiceException</pre>
 <dl>
@@ -2269,7 +2269,7 @@ implements org.apache.hadoop.hbase.shaded.protobuf.generated.MasterProtos.Master
 <ul class="blockList">
 <li class="blockList">
 <h4>isNormalizerEnabled</h4>
-<pre>public&nbsp;org.apache.hadoop.hbase.shaded.protobuf.generated.MasterProtos.IsNormalizerEnabledResponse&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/master/MasterRpcServices.html#line.1814">isNormalizerEnabled</a>(org.apache.hbase.thirdparty.com.google.protobuf.RpcController&nbsp;controller,
+<pre>public&nbsp;org.apache.hadoop.hbase.shaded.protobuf.generated.MasterProtos.IsNormalizerEnabledResponse&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/master/MasterRpcServices.html#line.1810">isNormalizerEnabled</a>(org.apache.hbase.thirdparty.com.google.protobuf.RpcController&nbsp;controller,
                                                                                                                       org.apache.hadoop.hbase.shaded.protobuf.generated.MasterProtos.IsNormalizerEnabledRequest&nbsp;request)
                                                                                                                throws org.apache.hbase.thirdparty.com.google.protobuf.ServiceException</pre>
 <dl>
@@ -2286,7 +2286,7 @@ implements org.apache.hadoop.hbase.shaded.protobuf.generated.MasterProtos.Master
 <ul class="blockList">
 <li class="blockList">
 <h4>getSecurityCapabilities</h4>
-<pre>public&nbsp;org.apache.hadoop.hbase.shaded.protobuf.generated.MasterProtos.SecurityCapabilitiesResponse&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/master/MasterRpcServices.html#line.1825">getSecurityCapabilities</a>(org.apache.hbase.thirdparty.com.google.protobuf.RpcController&nbsp;controller,
+<pre>public&nbsp;org.apache.hadoop.hbase.shaded.protobuf.generated.MasterProtos.SecurityCapabilitiesResponse&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/master/MasterRpcServices.html#line.1821">getSecurityCapabilities</a>(org.apache.hbase.thirdparty.com.google.protobuf.RpcController&nbsp;controller,
                                                                                                                            org.apache.hadoop.hbase.shaded.protobuf.generated.MasterProtos.SecurityCapabilitiesRequest&nbsp;request)
                                                                                                                     throws org.apache.hbase.thirdparty.com.google.protobuf.ServiceException</pre>
 <div class="block">Returns the security capabilities in effect on the cluster</div>
@@ -2304,7 +2304,7 @@ implements org.apache.hadoop.hbase.shaded.protobuf.generated.MasterProtos.Master
 <ul class="blockList">
 <li class="blockList">
 <h4>hasAccessControlServiceCoprocessor</h4>
-<pre>boolean&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/master/MasterRpcServices.html#line.1864">hasAccessControlServiceCoprocessor</a>(<a href="../../../../../org/apache/hadoop/hbase/master/MasterCoprocessorHost.html" title="class in org.apache.hadoop.hbase.master">MasterCoprocessorHost</a>&nbsp;cpHost)</pre>
+<pre>boolean&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/master/MasterRpcServices.html#line.1860">hasAccessControlServiceCoprocessor</a>(<a href="../../../../../org/apache/hadoop/hbase/master/MasterCoprocessorHost.html" title="class in org.apache.hadoop.hbase.master">MasterCoprocessorHost</a>&nbsp;cpHost)</pre>
 <div class="block">Determines if there is a MasterCoprocessor deployed which implements
  <code>AccessControlProtos.AccessControlService.Interface</code>.</div>
 </li>
@@ -2315,7 +2315,7 @@ implements org.apache.hadoop.hbase.shaded.protobuf.generated.MasterProtos.Master
 <ul class="blockList">
 <li class="blockList">
 <h4>hasVisibilityLabelsServiceCoprocessor</h4>
-<pre>boolean&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/master/MasterRpcServices.html#line.1873">hasVisibilityLabelsServiceCoprocessor</a>(<a href="../../../../../org/apache/hadoop/hbase/master/MasterCoprocessorHost.html" title="class in org.apache.hadoop.hbase.master">MasterCoprocessorHost</a>&nbsp;cpHost)</pre>
+<pre>boolean&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/master/MasterRpcServices.html#line.1869">hasVisibilityLabelsServiceCoprocessor</a>(<a href="../../../../../org/apache/hadoop/hbase/master/MasterCoprocessorHost.html" title="class in org.apache.hadoop.hbase.master">MasterCoprocessorHost</a>&nbsp;cpHost)</pre>
 <div class="block">Determines if there is a MasterCoprocessor deployed which implements
  <code>VisibilityLabelsProtos.VisibilityLabelsService.Interface</code>.</div>
 </li>
@@ -2326,7 +2326,7 @@ implements org.apache.hadoop.hbase.shaded.protobuf.generated.MasterProtos.Master
 <ul class="blockList">
 <li class="blockList">
 <h4>checkCoprocessorWithService</h4>
-<pre>boolean&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/master/MasterRpcServices.html#line.1883">checkCoprocessorWithService</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/coprocessor/MasterCoprocessor.html" title="interface in org.apache.hadoop.hbase.coprocessor">MasterCoprocessor</a>&gt;&nbsp;coprocessorsToCheck,
+<pre>boolean&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/master/MasterRpcServices.html#line.1879">checkCoprocessorWithService</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/coprocessor/MasterCoprocessor.html" title="interface in org.apache.hadoop.hbase.coprocessor">MasterCoprocessor</a>&gt;&nbsp;coprocessorsToCheck,
                                     <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Class.html?is-external=true" title="class or interface in java.lang">Class</a>&lt;?&gt;&nbsp;service)</pre>
 <div class="block">Determines if there is a coprocessor implementation in the provided argument which extends
  or implements the provided <code>service</code>.</div>
@@ -2338,7 +2338,7 @@ implements org.apache.hadoop.hbase.shaded.protobuf.generated.MasterProtos.Master
 <ul class="blockList">
 <li class="blockList">
 <h4>convert</h4>
-<pre>private&nbsp;<a href="../../../../../org/apache/hadoop/hbase/client/MasterSwitchType.html" title="enum in org.apache.hadoop.hbase.client">MasterSwitchType</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/master/MasterRpcServices.html#line.1896">convert</a>(org.apache.hadoop.hbase.shaded.protobuf.generated.MasterProtos.MasterSwitchType&nbsp;switchType)</pre>
+<pre>private&nbsp;<a href="../../../../../org/apache/hadoop/hbase/client/MasterSwitchType.html" title="enum in org.apache.hadoop.hbase.client">MasterSwitchType</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/master/MasterRpcServices.html#line.1892">convert</a>(org.apache.hadoop.hbase.shaded.protobuf.generated.MasterProtos.MasterSwitchType&nbsp;switchType)</pre>
 </li>
 </ul>
 <a name="addReplicationPeer-org.apache.hbase.thirdparty.com.google.protobuf.RpcController-org.apache.hadoop.hbase.shaded.protobuf.generated.ReplicationProtos.AddReplicationPeerRequest-">
@@ -2347,7 +2347,7 @@ implements org.apache.hadoop.hbase.shaded.protobuf.generated.MasterProtos.Master
 <ul class="blockList">
 <li class="blockList">
 <h4>addReplicationPeer</h4>
-<pre>public&nbsp;org.apache.hadoop.hbase.shaded.protobuf.generated.ReplicationProtos.AddReplicationPeerResponse&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/master/MasterRpcServices.html#line.1909">addReplicationPeer</a>(org.apache.hbase.thirdparty.com.google.protobuf.RpcController&nbsp;controller,
+<pre>public&nbsp;org.apache.hadoop.hbase.shaded.protobuf.generated.ReplicationProtos.AddReplicationPeerResponse&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/master/MasterRpcServices.html#line.1905">addReplicationPeer</a>(org.apache.hbase.thirdparty.com.google.protobuf.RpcController&nbsp;controller,
                                                                                                                          org.apache.hadoop.hbase.shaded.protobuf.generated.ReplicationProtos.AddReplicationPeerRequest&nbsp;request)
                                                                                                                   throws org.apache.hbase.thirdparty.com.google.protobuf.ServiceException</pre>
 <dl>
@@ -2364,7 +2364,7 @@ implements org.apache.hadoop.hbase.shaded.protobuf.generated.MasterProtos.Master
 <ul class="blockList">
 <li class="blockList">
 <h4>removeReplicationPeer</h4>
-<pre>public&nbsp;org.apache.hadoop.hbase.shaded.protobuf.generated.ReplicationProtos.RemoveReplicationPeerResponse&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/master/MasterRpcServices.html#line.1922">removeReplicationPeer</a>(org.apache.hbase.thirdparty.com.google.protobuf.RpcController&nbsp;controller,
+<pre>public&nbsp;org.apache.hadoop.hbase.shaded.protobuf.generated.ReplicationProtos.RemoveReplicationPeerResponse&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/master/MasterRpcServices.html#line.1918">removeReplicationPeer</a>(org.apache.hbase.thirdparty.com.google.protobuf.RpcController&nbsp;controller,
                                                                                                                                org.apache.hadoop.hbase.shaded.protobuf.generated.ReplicationProtos.RemoveReplicationPeerRequest&nbsp;request)
                                                                                                                         throws org.apache.hbase.thirdparty.com.google.protobuf.ServiceException</pre>
 <dl>
@@ -2381,7 +2381,7 @@ implements org.apache.hadoop.hbase.shaded.protobuf.generated.MasterProtos.Master
 <ul class="blockList">
 <li class="blockList">
 <h4>enableReplicationPeer</h4>
-<pre>public&nbsp;org.apache.hadoop.hbase.shaded.protobuf.generated.ReplicationProtos.EnableReplicationPeerResponse&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/master/MasterRpcServices.html#line.1933">enableReplicationPeer</a>(org.apache.hbase.thirdparty.com.google.protobuf.RpcController&nbsp;controller,
+<pre>public&nbsp;org.apache.hadoop.hbase.shaded.protobuf.generated.ReplicationProtos.EnableReplicationPeerResponse&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/master/MasterRpcServices.html#line.1929">enableReplicationPeer</a>(org.apache.hbase.thirdparty.com.google.protobuf.RpcController&nbsp;controller,
                                                                                                                                org.apache.hadoop.hbase.shaded.protobuf.generated.ReplicationProtos.EnableReplicationPeerRequest&nbsp;request)
                                                                                                                         throws org.apache.hbase.thirdparty.com.google.protobuf.ServiceException</pre>
 <dl>
@@ -2398,7 +2398,7 @@ implements org.apache.hadoop.hbase.shaded.protobuf.generated.MasterProtos.Master
 <ul class="blockList">
 <li class="blockList">
 <h4>disableReplicationPeer</h4>
-<pre>public&nbsp;org.apache.hadoop.hbase.shaded.protobuf.generated.ReplicationProtos.DisableReplicationPeerResponse&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/master/MasterRpcServices.html#line.1944">disableReplicationPeer</a>(org.apache.hbase.thirdparty.com.google.protobuf.RpcController&nbsp;controller,
+<pre>public&nbsp;org.apache.hadoop.hbase.shaded.protobuf.generated.ReplicationProtos.DisableReplicationPeerResponse&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/master/MasterRpcServices.html#line.1940">disableReplicationPeer</a>(org.apache.hbase.thirdparty.com.google.protobuf.RpcController&nbsp;controller,
                                                                                                                                  org.apache.hadoop.hbase.shaded.protobuf.generated.ReplicationProtos.DisableReplicationPeerRequest&nbsp;request)
                                                                                                                           throws org.apache.hbase.thirdparty.com.google.protobuf.ServiceException</pre>
 <dl>
@@ -2415,7 +2415,7 @@ implements org.apache.hadoop.hbase.shaded.protobuf.generated.MasterProtos.Master
 <ul class="blockList">
 <li class="blockList">
 <h4>getReplicationPeerConfig</h4>
-<pre>public&nbsp;org.apache.hadoop.hbase.shaded.protobuf.generated.ReplicationProtos.GetReplicationPeerConfigResponse&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/master/MasterRpcServices.html#line.1955">getReplicationPeerConfig</a>(org.apache.hbase.thirdparty.com.google.protobuf.RpcController&nbsp;controller,
+<pre>public&nbsp;org.apache.hadoop.hbase.shaded.protobuf.generated.ReplicationProtos.GetReplicationPeerConfigResponse&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/master/MasterRpcServices.html#line.1951">getReplicationPeerConfig</a>(org.apache.hbase.thirdparty.com.google.protobuf.RpcController&nbsp;controller,
                                                                                                                                      org.apache.hadoop.hbase.shaded.protobuf.generated.ReplicationProtos.GetReplicationPeerConfigRequest&nbsp;request)
                                                                                                                               throws org.apache.hbase.thirdparty.com.google.protobuf.ServiceException</pre>
 <dl>
@@ -2432,7 +2432,7 @@ implements org.apache.hadoop.hbase.shaded.protobuf.generated.MasterProtos.Master
 <ul class="blockList">
 <li class="blockList">
 <h4>updateReplicationPeerConfig</h4>
-<pre>public&nbsp;org.apache.hadoop.hbase.shaded.protobuf.generated.ReplicationProtos.UpdateReplicationPeerConfigResponse&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/master/MasterRpcServices.html#line.1971">updateReplicationPeerConfig</a>(org.apache.hbase.thirdparty.com.google.protobuf.RpcController&nbsp;controller,
+<pre>public&nbsp;org.apache.hadoop.hbase.shaded.protobuf.generated.ReplicationProtos.UpdateReplicationPeerConfigResponse&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/master/MasterRpcServices.html#line.1967">updateReplicationPeerConfig</a>(org.apache.hbase.thirdparty.com.google.protobuf.RpcController&nbsp;controller,
                                                                                                                                            org.apache.hadoop.hbase.shaded.protobuf.generated.ReplicationProtos.UpdateReplicationPeerConfigRequest&nbsp;request)
                                                                                                                                     throws org.apache.hbase.thirdparty.com.google.protobuf.ServiceException</pre>
 <dl>
@@ -2449,7 +2449,7 @@ implements org.apache.hadoop.hbase.shaded.protobuf.generated.MasterProtos.Master
 <ul class="blockList">
 <li class="blockList">
 <h4>transitReplicationPeerSyncReplicationState</h4>
-<pre>public&nbsp;org.apache.hadoop.hbase.shaded.protobuf.generated.ReplicationProtos.TransitReplicationPeerSyncReplicationStateResponse&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/master/MasterRpcServices.html#line.1984">transitReplicationPeerSyncReplicationState</a>(org.apache.hbase.thirdparty.com.google.protobuf.RpcController&nbsp;controller,
+<pre>public&nbsp;org.apache.hadoop.hbase.shaded.protobuf.generated.ReplicationProtos.TransitReplicationPeerSyncReplicationStateResponse&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/master/MasterRpcServices.html#line.1980">transitReplicationPeerSyncReplicationState</a>(org.apache.hbase.thirdparty.com.google.protobuf.RpcController&nbsp;controller,
                                                                                                                                                                          org.apache.hadoop.hbase.shaded.protobuf.generated.ReplicationProtos.TransitReplicationPeerSyncReplicationStateRequest&nbsp;request)
                                                                                                                                                                   throws org.apache.hbase.thirdparty.com.google.protobuf.ServiceException</pre>
 <dl>
@@ -2466,7 +2466,7 @@ implements org.apache.hadoop.hbase.shaded.protobuf.generated.MasterProtos.Master
 <ul class="blockList">
 <li class="blockList">
 <h4>listReplicationPeers</h4>
-<pre>public&nbsp;org.apache.hadoop.hbase.shaded.protobuf.generated.ReplicationProtos.ListReplicationPeersResponse&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/master/MasterRpcServices.html#line.1997">listReplicationPeers</a>(org.apache.hbase.thirdparty.com.google.protobuf.RpcController&nbsp;controller,
+<pre>public&nbsp;org.apache.hadoop.hbase.shaded.protobuf.generated.ReplicationProtos.ListReplicationPeersResponse&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/master/MasterRpcServices.html#line.1993">listReplicationPeers</a>(org.apache.hbase.thirdparty.com.google.protobuf.RpcController&nbsp;controller,
                                                                                                                              org.apache.hadoop.hbase.shaded.protobuf.generated.ReplicationProtos.ListReplicationPeersRequest&nbsp;request)
                                                                                                                       throws org.apache.hbase.thirdparty.com.google.protobuf.ServiceException</pre>
 <dl>
@@ -2483,7 +2483,7 @@ implements org.apache.hadoop.hbase.shaded.protobuf.generated.MasterProtos.Master
 <ul class="blockList">
 <li class="blockList">
 <h4>listDecommissionedRegionServers</h4>
-<pre>public&nbsp;org.apache.hadoop.hbase.shaded.protobuf.generated.MasterProtos.ListDecommissionedRegionServersResponse&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/master/MasterRpcServices.html#line.2013">listDecommissionedRegionServers</a>(org.apache.hbase.thirdparty.com.google.protobuf.RpcController&nbsp;controller,
+<pre>public&nbsp;org.apache.hadoop.hbase.shaded.protobuf.generated.MasterProtos.ListDecommissionedRegionServersResponse&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/master/MasterRpcServices.html#line.2009">listDecommissionedRegionServers</a>(org.apache.hbase.thirdparty.com.google.protobuf.RpcController&nbsp;controller,
                                                                                                                                               org.apache.hadoop.hbase.shaded.protobuf.generated.MasterProtos.ListDecommissionedRegionServersRequest&nbsp;request)
                                                                                                                                        throws org.apache.hbase.thirdparty.com.google.protobuf.ServiceException</pre>
 <dl>
@@ -2500,7 +2500,7 @@ implements org.apache.hadoop.hbase.shaded.protobuf.generated.MasterProtos.Master
 <ul class="blockList">
 <li class="blockList">
 <h4>decommissionRegionServers</h4>
-<pre>public&nbsp;org.apache.hadoop.hbase.shaded.protobuf.generated.MasterProtos.DecommissionRegionServersResponse&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/master/MasterRpcServices.html#line.2037">decommissionRegionServers</a>(org.apache.hbase.thirdparty.com.google.protobuf.RpcController&nbsp;controller,
+<pre>public&nbsp;org.apache.hadoop.hbase.shaded.protobuf.generated.MasterProtos.DecommissionRegionServersResponse&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/master/MasterRpcServices.html#line.2033">decommissionRegionServers</a>(org.apache.hbase.thirdparty.com.google.protobuf.RpcController&nbsp;controller,
                                                                                                                                   org.apache.hadoop.hbase.shaded.protobuf.generated.MasterProtos.DecommissionRegionServersRequest&nbsp;request)
                                                                                                                            throws org.apache.hbase.thirdparty.com.google.protobuf.ServiceException</pre>
 <dl>
@@ -2517,7 +2517,7 @@ implements org.apache.hadoop.hbase.shaded.protobuf.generated.MasterProtos.Master
 <ul class="blockList">
 <li class="blockList">
 <h4>recommissionRegionServer</h4>
-<pre>public&nbsp;org.apache.hadoop.hbase.shaded.protobuf.generated.MasterProtos.RecommissionRegionServerResponse&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/master/MasterRpcServices.html#line.2059">recommissionRegionServer</a>(org.apache.hbase.thirdparty.com.google.protobuf.RpcController&nbsp;controller,
+<pre>public&nbsp;org.apache.hadoop.hbase.shaded.protobuf.generated.MasterProtos.RecommissionRegionServerResponse&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/master/MasterRpcServices.html#line.2055">recommissionRegionServer</a>(org.apache.hbase.thirdparty.com.google.protobuf.RpcController&nbsp;controller,
                                                                                                                                 org.apache.hadoop.hbase.shaded.protobuf.generated.MasterProtos.RecommissionRegionServerRequest&nbsp;request)
                                                                                                                          throws org.apache.hbase.thirdparty.com.google.protobuf.ServiceException</pre>
 <dl>
@@ -2534,7 +2534,7 @@ implements org.apache.hadoop.hbase.shaded.protobuf.generated.MasterProtos.Master
 <ul class="blockList">
 <li class="blockList">
 <h4>requestLock</h4>
-<pre>public&nbsp;org.apache.hadoop.hbase.shaded.protobuf.generated.LockServiceProtos.LockResponse&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/master/MasterRpcServices.html#line.2082">requestLock</a>(org.apache.hbase.thirdparty.com.google.protobuf.RpcController&nbsp;controller,
+<pre>public&nbsp;org.apache.hadoop.hbase.shaded.protobuf.generated.LockServiceProtos.LockResponse&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/master/MasterRpcServices.html#line.2078">requestLock</a>(org.apache.hbase.thirdparty.com.google.protobuf.RpcController&nbsp;controller,
                                                                                                     org.apache.hadoop.hbase.shaded.protobuf.generated.LockServiceProtos.LockRequest&nbsp;request)
                                                                                              throws org.apache.hbase.thirdparty.com.google.protobuf.ServiceException</pre>
 <dl>
@@ -2551,7 +2551,7 @@ implements org.apache.hadoop.hbase.shaded.protobuf.generated.MasterProtos.Master
 <ul class="blockList">
 <li class="blockList">
 <h4>lockHeartbeat</h4>
-<pre>public&nbsp;org.apache.hadoop.hbase.shaded.protobuf.generated.LockServiceProtos.LockHeartbeatResponse&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/master/MasterRpcServices.html#line.2153">lockHeartbeat</a>(org.apache.hbase.thirdparty.com.google.protobuf.RpcController&nbsp;controller,
+<pre>public&nbsp;org.apache.hadoop.hbase.shaded.protobuf.generated.LockServiceProtos.LockHeartbeatResponse&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/master/MasterRpcServices.html#line.2149">lockHeartbeat</a>(org.apache.hbase.thirdparty.com.google.protobuf.RpcController&nbsp;controller,
                                                                                                                org.apache.hadoop.hbase.shaded.protobuf.generated.LockServiceProtos.LockHeartbeatRequest&nbsp;request)
                                                                                                         throws org.apache.hbase.thirdparty.com.google.protobuf.ServiceException</pre>
 <dl>
@@ -2570,7 +2570,7 @@ implements org.apache.hadoop.hbase.shaded.protobuf.generated.MasterProtos.Master
 <ul class="blockList">
 <li class="blockList">
 <h4>reportRegionSpaceUse</h4>
-<pre>public&nbsp;org.apache.hadoop.hbase.shaded.protobuf.generated.RegionServerStatusProtos.RegionSpaceUseReportResponse&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/master/MasterRpcServices.html#line.2172">reportRegionSpaceUse</a>(org.apache.hbase.thirdparty.com.google.protobuf.RpcController&nbsp;controller,
+<pre>public&nbsp;org.apache.hadoop.hbase.shaded.protobuf.generated.RegionServerStatusProtos.RegionSpaceUseReportResponse&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/master/MasterRpcServices.html#line.2168">reportRegionSpaceUse</a>(org.apache.hbase.thirdparty.com.google.protobuf.RpcController&nbsp;controller,
                                                                                                                                     org.apache.hadoop.hbase.shaded.protobuf.generated.RegionServerStatusProtos.RegionSpaceUseReportRequest&nbsp;request)
                                                                                                                              throws org.apache.hbase.thirdparty.com.google.protobuf.ServiceException</pre>
 <dl>
@@ -2587,7 +2587,7 @@ implements org.apache.hadoop.hbase.shaded.protobuf.generated.MasterProtos.Master
 <ul class="blockList">
 <li class="blockList">
 <h4>getSpaceQuotaRegionSizes</h4>
-<pre>public&nbsp;org.apache.hadoop.hbase.shaded.protobuf.generated.QuotaProtos.GetSpaceQuotaRegionSizesResponse&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/master/MasterRpcServices.html#line.2192">getSpaceQuotaRegionSizes</a>(org.apache.hbase.thirdparty.com.google.protobuf.RpcController&nbsp;controller,
+<pre>public&nbsp;org.apache.hadoop.hbase.shaded.protobuf.generated.QuotaProtos.GetSpaceQuotaRegionSizesResponse&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/master/MasterRpcServices.html#line.2188">getSpaceQuotaRegionSizes</a>(org.apache.hbase.thirdparty.com.google.protobuf.RpcController&nbsp;controller,
                                                                                                                                org.apache.hadoop.hbase.shaded.protobuf.generated.QuotaProtos.GetSpaceQuotaRegionSizesRequest&nbsp;request)
                                                                                                                         throws org.apache.hbase.thirdparty.com.google.protobuf.ServiceException</pre>
 <dl>
@@ -2604,7 +2604,7 @@ implements org.apache.hadoop.hbase.shaded.protobuf.generated.MasterProtos.Master
 <ul class="blockList">
 <li class="blockList">
 <h4>getQuotaStates</h4>
-<pre>public&nbsp;org.apache.hadoop.hbase.shaded.protobuf.generated.QuotaProtos.GetQuotaStatesResponse&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/master/MasterRpcServices.html#line.2226">getQuotaStates</a>(org.apache.hbase.thirdparty.com.google.protobuf.RpcController&nbsp;controller,
+<pre>public&nbsp;org.apache.hadoop.hbase.shaded.protobuf.generated.QuotaProtos.GetQuotaStatesResponse&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/master/MasterRpcServices.html#line.2222">getQuotaStates</a>(org.apache.hbase.thirdparty.com.google.protobuf.RpcController&nbsp;controller,
                                                                                                            org.apache.hadoop.hbase.shaded.protobuf.generated.QuotaProtos.GetQuotaStatesRequest&nbsp;request)
                                                                                                     throws org.apache.hbase.thirdparty.com.google.protobuf.ServiceException</pre>
 <dl>
@@ -2621,7 +2621,7 @@ implements org.apache.hadoop.hbase.shaded.protobuf.generated.MasterProtos.Master
 <ul class="blockList">
 <li class="blockList">
 <h4>clearDeadServers</h4>
-<pre>public&nbsp;org.apache.hadoop.hbase.shaded.protobuf.generated.MasterProtos.ClearDeadServersResponse&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/master/MasterRpcServices.html#line.2258">clearDeadServers</a>(org.apache.hbase.thirdparty.com.google.protobuf.RpcController&nbsp;controller,
+<pre>public&nbsp;org.apache.hadoop.hbase.shaded.protobuf.generated.MasterProtos.ClearDeadServersResponse&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/master/MasterRpcServices.html#line.2254">clearDeadServers</a>(org.apache.hbase.thirdparty.com.google.protobuf.RpcController&nbsp;controller,
                                                                                                                 org.apache.hadoop.hbase.shaded.protobuf.generated.MasterProtos.ClearDeadServersRequest&nbsp;request)
                                                                                                          throws org.apache.hbase.thirdparty.com.google.protobuf.ServiceException</pre>
 <dl>
@@ -2638,7 +2638,7 @@ implements org.apache.hadoop.hbase.shaded.protobuf.generated.MasterProtos.Master
 <ul class="blockList">
 <li class="blockList">
 <h4>reportProcedureDone</h4>
-<pre>public&nbsp;org.apache.hadoop.hbase.shaded.protobuf.generated.RegionServerStatusProtos.ReportProcedureDoneResponse&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/master/MasterRpcServices.html#line.2292">reportProcedureDone</a>(org.apache.hbase.thirdparty.com.google.protobuf.RpcController&nbsp;controller,
+<pre>public&nbsp;org.apache.hadoop.hbase.shaded.protobuf.generated.RegionServerStatusProtos.ReportProcedureDoneResponse&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/master/MasterRpcServices.html#line.2288">reportProcedureDone</a>(org.apache.hbase.thirdparty.com.google.protobuf.RpcController&nbsp;controller,
                                                                                                                                   org.apache.hadoop.hbase.shaded.protobuf.generated.RegionServerStatusProtos.ReportProcedureDoneRequest&nbsp;request)
                                                                                                                            throws org.apache.hbase.thirdparty.com.google.protobuf.ServiceException</pre>
 <dl>
@@ -2655,7 +2655,7 @@ implements org.apache.hadoop.hbase.shaded.protobuf.generated.MasterProtos.Master
 <ul class="blockList">
 <li class="blockList">
 <h4>reportFileArchival</h4>
-<pre>public&nbsp;org.apache.hadoop.hbase.shaded.protobuf.generated.RegionServerStatusProtos.FileArchiveNotificationResponse&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/master/MasterRpcServices.html#line.2306">reportFileArchival</a>(org.apache.hbase.thirdparty.com.google.protobuf.RpcController&nbsp;controller,
+<pre>public&nbsp;org.apache.hadoop.hbase.shaded.protobuf.generated.RegionServerStatusProtos.FileArchiveNotificationResponse&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/master/MasterRpcServices.html#line.2302">reportFileArchival</a>(org.apache.hbase.thirdparty.com.google.protobuf.RpcController&nbsp;controller,
                                                                                                                                      org.apache.hadoop.hbase.shaded.protobuf.generated.RegionServerStatusProtos.FileArchiveNotificationRequest&nbsp;request)
                                                                                                                               throws org.apache.hbase.thirdparty.com.google.protobuf.ServiceException</pre>
 <dl>
@@ -2672,7 +2672,7 @@ implements org.apache.hadoop.hbase.shaded.protobuf.generated.MasterProtos.Master
 <ul class="blockList">
 <li class="blockList">
 <h4>setTableStateInMeta</h4>
-<pre>public&nbsp;org.apache.hadoop.hbase.shaded.protobuf.generated.MasterProtos.GetTableStateResponse&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/master/MasterRpcServices.html#line.2330">setTableStateInMeta</a>(org.apache.hbase.thirdparty.com.google.protobuf.RpcController&nbsp;controller,
+<pre>public&nbsp;org.apache.hadoop.hbase.shaded.protobuf.generated.MasterProtos.GetTableStateResponse&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/master/MasterRpcServices.html#line.2326">setTableStateInMeta</a>(org.apache.hbase.thirdparty.com.google.protobuf.RpcController&nbsp;controller,
                                                                                                                 org.apache.hadoop.hbase.shaded.protobuf.generated.MasterProtos.SetTableStateInMetaRequest&nbsp;request)
                                                                                                          throws org.apache.hbase.thirdparty.com.google.protobuf.ServiceException</pre>
 <div class="block">Update state of the table in meta only. This is required by hbck in some situations to cleanup
@@ -2693,7 +2693,7 @@ implements org.apache.hadoop.hbase.shaded.protobuf.generated.MasterProtos.Master
 <ul class="blockList">
 <li class="blockList">
 <h4>getRegionInfo</h4>
-<pre>private&nbsp;<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/MasterRpcServices.html#line.2348">getRegionInfo</a>(org.apache.hadoop.hbase.shaded.protobuf.generated.HBaseProtos.RegionSpecifier&nbsp;rs)
+<pre>private&nbsp;<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/MasterRpcServices.html#line.2344">getRegionInfo</a>(org.apache.hadoop.hbase.shaded.protobuf.generated.HBaseProtos.RegionSpecifier&nbsp;rs)
                           throws <a href="../../../../../org/apache/hadoop/hbase/UnknownRegionException.html" title="class in org.apache.hadoop.hbase">UnknownRegionException</a></pre>
 <div class="block">Get RegionInfo from Master using content of RegionSpecifier as key.</div>
 <dl>
@@ -2710,7 +2710,7 @@ implements org.apache.hadoop.hbase.shaded.protobuf.generated.MasterProtos.Master
 <ul class="blockList">
 <li class="blockList">
 <h4>assigns</h4>
-<pre>public&nbsp;org.apache.hadoop.hbase.shaded.protobuf.generated.MasterProtos.AssignsResponse&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/master/MasterRpcServices.html#line.2372">assigns</a>(org.apache.hbase.thirdparty.com.google.protobuf.RpcController&nbsp;controller,
+<pre>public&nbsp;org.apache.hadoop.hbase.shaded.protobuf.generated.MasterProtos.AssignsResponse&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/master/MasterRpcServices.html#line.2368">assigns</a>(org.apache.hbase.thirdparty.com.google.protobuf.RpcController&nbsp;controller,
                                                                                               org.apache.hadoop.hbase.shaded.protobuf.generated.MasterProtos.AssignsRequest&nbsp;request)
                                                                                        throws org.apache.hbase.thirdparty.com.google.protobuf.ServiceException</pre>
 <div class="block">A 'raw' version of assign that does bulk and skirts Master state checks (assigns can be made
@@ -2729,7 +2729,7 @@ implements org.apache.hadoop.hbase.shaded.protobuf.generated.MasterProtos.Master
 <ul class="blockList">
 <li class="blockList">
 <h4>unassigns</h4>
-<pre>public&nbsp;org.apache.hadoop.hbase.shaded.protobuf.generated.MasterProtos.UnassignsResponse&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/master/MasterRpcServices.html#line.2404">unassigns</a>(org.apache.hbase.thirdparty.com.google.protobuf.RpcController&nbsp;controller,
+<pre>public&nbsp;org.apache.hadoop.hbase.shaded.protobuf.generated.MasterProtos.UnassignsResponse&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/master/MasterRpcServices.html#line.2400">unassigns</a>(org.apache.hbase.thirdparty.com.google.protobuf.RpcController&nbsp;controller,
                                                                                                   org.apache.hadoop.hbase.shaded.protobuf.generated.MasterProtos.UnassignsRequest&nbsp;request)
                                                                                            throws org.apache.hbase.thirdparty.com.google.protobuf.ServiceException</pre>
 <div class="block">A 'raw' version of unassign that does bulk and skirts Master state checks (unassigns can be
@@ -2748,7 +2748,7 @@ implements org.apache.hadoop.hbase.shaded.protobuf.generated.MasterProtos.Master
 <ul class="blockListLast">
 <li class="blockList">
 <h4>bypassProcedure</h4>
-<pre>public&nbsp;org.apache.hadoop.hbase.shaded.protobuf.generated.MasterProtos.BypassProcedureResponse&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/master/MasterRpcServices.html#line.2443">bypassProcedure</a>(org.apache.hbase.thirdparty.com.google.protobuf.RpcController&nbsp;controller,
+<pre>public&nbsp;org.apache.hadoop.hbase.shaded.protobuf.generated.MasterProtos.BypassProcedureResponse&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/master/MasterRpcServices.html#line.2439">bypassProcedure</a>(org.apache.hbase.thirdparty.com.google.protobuf.RpcController&nbsp;controller,
                                                                                                               org.apache.hadoop.hbase.shaded.protobuf.generated.MasterProtos.BypassProcedureRequest&nbsp;request)
                                                                                                        throws org.apache.hbase.thirdparty.com.google.protobuf.ServiceException</pre>
 <div class="block">Bypass specified procedure to completion. Procedure is marked completed but no actual work

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/3649682c/devapidocs/org/apache/hadoop/hbase/master/MasterServices.html
----------------------------------------------------------------------
diff --git a/devapidocs/org/apache/hadoop/hbase/master/MasterServices.html b/devapidocs/org/apache/hadoop/hbase/master/MasterServices.html
index 0691797..9e51da1 100644
--- a/devapidocs/org/apache/hadoop/hbase/master/MasterServices.html
+++ b/devapidocs/org/apache/hadoop/hbase/master/MasterServices.html
@@ -1068,8 +1068,7 @@ extends <a href="../../../../../org/apache/hadoop/hbase/Server.html" title="inte
 <ul class="blockList">
 <li class="blockList">
 <h4>isInMaintenanceMode</h4>
-<pre>boolean&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/master/MasterServices.html#line.354">isInMaintenanceMode</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>
+<pre>boolean&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/master/MasterServices.html#line.354">isInMaintenanceMode</a>()</pre>
 <dl>
 <dt><span class="returnLabel">Returns:</span></dt>
 <dd>true if master is in maintanceMode</dd>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/3649682c/devapidocs/org/apache/hadoop/hbase/master/ServerManager.FlushedSequenceIdFlusher.html
----------------------------------------------------------------------
diff --git a/devapidocs/org/apache/hadoop/hbase/master/ServerManager.FlushedSequenceIdFlusher.html b/devapidocs/org/apache/hadoop/hbase/master/ServerManager.FlushedSequenceIdFlusher.html
index eb1b9a6..94908b9 100644
--- a/devapidocs/org/apache/hadoop/hbase/master/ServerManager.FlushedSequenceIdFlusher.html
+++ b/devapidocs/org/apache/hadoop/hbase/master/ServerManager.FlushedSequenceIdFlusher.html
@@ -122,7 +122,7 @@ var activeTableTab = "activeTableTab";
 </dl>
 <hr>
 <br>
-<pre>private class <a href="../../../../../src-html/org/apache/hadoop/hbase/master/ServerManager.html#line.1164">ServerManager.FlushedSequenceIdFlusher</a>
+<pre>private class <a href="../../../../../src-html/org/apache/hadoop/hbase/master/ServerManager.html#line.1167">ServerManager.FlushedSequenceIdFlusher</a>
 extends <a href="../../../../../org/apache/hadoop/hbase/ScheduledChore.html" title="class in org.apache.hadoop.hbase">ScheduledChore</a></pre>
 </li>
 </ul>
@@ -201,7 +201,7 @@ extends <a href="../../../../../org/apache/hadoop/hbase/ScheduledChore.html" tit
 <ul class="blockListLast">
 <li class="blockList">
 <h4>FlushedSequenceIdFlusher</h4>
-<pre>public&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/master/ServerManager.FlushedSequenceIdFlusher.html#line.1166">FlushedSequenceIdFlusher</a>(<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;name,
+<pre>public&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/master/ServerManager.FlushedSequenceIdFlusher.html#line.1169">FlushedSequenceIdFlusher</a>(<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;name,
                                 int&nbsp;p)</pre>
 </li>
 </ul>
@@ -219,7 +219,7 @@ extends <a href="../../../../../org/apache/hadoop/hbase/ScheduledChore.html" tit
 <ul class="blockListLast">
 <li class="blockList">
 <h4>chore</h4>
-<pre>protected&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/master/ServerManager.FlushedSequenceIdFlusher.html#line.1171">chore</a>()</pre>
+<pre>protected&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/master/ServerManager.FlushedSequenceIdFlusher.html#line.1174">chore</a>()</pre>
 <div class="block"><span class="descfrmTypeLabel">Description copied from class:&nbsp;<code><a href="../../../../../org/apache/hadoop/hbase/ScheduledChore.html#chore--">ScheduledChore</a></code></span></div>
 <div class="block">The task to execute on each scheduled execution of the Chore</div>
 <dl>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/3649682c/devapidocs/org/apache/hadoop/hbase/master/ServerManager.html
----------------------------------------------------------------------
diff --git a/devapidocs/org/apache/hadoop/hbase/master/ServerManager.html b/devapidocs/org/apache/hadoop/hbase/master/ServerManager.html
index b47e951..7236e62 100644
--- a/devapidocs/org/apache/hadoop/hbase/master/ServerManager.html
+++ b/devapidocs/org/apache/hadoop/hbase/master/ServerManager.html
@@ -1403,7 +1403,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>waitForRegionServers</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/master/ServerManager.html#line.792">waitForRegionServers</a>(<a href="../../../../../org/apache/hadoop/hbase/monitoring/MonitoredTask.html" title="interface in org.apache.hadoop.hbase.monitoring">MonitoredTask</a>&nbsp;status)
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/master/ServerManager.html#line.795">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/lang/InterruptedException.html?is-external=true" title="class or interface in java.lang">InterruptedException</a></pre>
 <div class="block">Wait for the region servers to report in.
  We will wait until one of this condition is met:
@@ -1426,7 +1426,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>getStrForMax</h4>
-<pre>private&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/master/ServerManager.html#line.859">getStrForMax</a>(int&nbsp;max)</pre>
+<pre>private&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/master/ServerManager.html#line.862">getStrForMax</a>(int&nbsp;max)</pre>
 </li>
 </ul>
 <a name="getOnlineServersList--">
@@ -1435,7 +1435,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>getOnlineServersList</h4>
-<pre>public&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/util/List.html?is-external=true" title="class or interface in java.util">List</a>&lt;<a href="../../../../../org/apache/hadoop/hbase/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a>&gt;&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/master/ServerManager.html#line.866">getOnlineServersList</a>()</pre>
+<pre>public&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/util/List.html?is-external=true" title="class or interface in java.util">List</a>&lt;<a href="../../../../../org/apache/hadoop/hbase/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a>&gt;&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/master/ServerManager.html#line.869">getOnlineServersList</a>()</pre>
 <dl>
 <dt><span class="returnLabel">Returns:</span></dt>
 <dd>A copy of the internal list of online servers.</dd>
@@ -1448,7 +1448,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>getOnlineServersListWithPredicator</h4>
-<pre>public&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/util/List.html?is-external=true" title="class or interface in java.util">List</a>&lt;<a href="../../../../../org/apache/hadoop/hbase/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a>&gt;&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/master/ServerManager.html#line.877">getOnlineServersListWithPredicator</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;keys,
+<pre>public&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/util/List.html?is-external=true" title="class or interface in java.util">List</a>&lt;<a href="../../../../../org/apache/hadoop/hbase/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a>&gt;&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/master/ServerManager.html#line.880">getOnlineServersListWithPredicator</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;keys,
                                                            <a href="https://docs.oracle.com/javase/8/docs/api/java/util/function/Predicate.html?is-external=true" title="class or interface in java.util.function">Predicate</a>&lt;<a href="../../../../../org/apache/hadoop/hbase/ServerMetrics.html" title="interface in org.apache.hadoop.hbase">ServerMetrics</a>&gt;&nbsp;idleServerPredicator)</pre>
 <dl>
 <dt><span class="paramLabel">Parameters:</span></dt>
@@ -1465,7 +1465,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>getDrainingServersList</h4>
-<pre>public&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/util/List.html?is-external=true" title="class or interface in java.util">List</a>&lt;<a href="../../../../../org/apache/hadoop/hbase/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a>&gt;&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/master/ServerManager.html#line.896">getDrainingServersList</a>()</pre>
+<pre>public&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/util/List.html?is-external=true" title="class or interface in java.util">List</a>&lt;<a href="../../../../../org/apache/hadoop/hbase/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a>&gt;&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/master/ServerManager.html#line.899">getDrainingServersList</a>()</pre>
 <dl>
 <dt><span class="returnLabel">Returns:</span></dt>
 <dd>A copy of the internal list of draining servers.</dd>
@@ -1478,7 +1478,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>isServerOnline</h4>
-<pre>public&nbsp;boolean&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/master/ServerManager.html#line.900">isServerOnline</a>(<a href="../../../../../org/apache/hadoop/hbase/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a>&nbsp;serverName)</pre>
+<pre>public&nbsp;boolean&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/master/ServerManager.html#line.903">isServerOnline</a>(<a href="../../../../../org/apache/hadoop/hbase/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a>&nbsp;serverName)</pre>
 </li>
 </ul>
 <a name="isServerDead-org.apache.hadoop.hbase.ServerName-">
@@ -1487,7 +1487,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>isServerDead</h4>
-<pre>public&nbsp;boolean&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/master/ServerManager.html#line.910">isServerDead</a>(<a href="../../../../../org/apache/hadoop/hbase/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a>&nbsp;serverName)</pre>
+<pre>public&nbsp;boolean&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/master/ServerManager.html#line.913">isServerDead</a>(<a href="../../../../../org/apache/hadoop/hbase/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a>&nbsp;serverName)</pre>
 <div class="block">Check if a server is known to be dead.  A server can be online,
  or known to be dead, or unknown to this manager (i.e, not online,
  not known to be dead either. it is simply not tracked by the
@@ -1500,7 +1500,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>shutdownCluster</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/master/ServerManager.html#line.914">shutdownCluster</a>()</pre>
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/master/ServerManager.html#line.917">shutdownCluster</a>()</pre>
 </li>
 </ul>
 <a name="isClusterShutdown--">
@@ -1509,7 +1509,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>isClusterShutdown</h4>
-<pre>public&nbsp;boolean&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/master/ServerManager.html#line.924">isClusterShutdown</a>()</pre>
+<pre>public&nbsp;boolean&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/master/ServerManager.html#line.927">isClusterShutdown</a>()</pre>
 </li>
 </ul>
 <a name="startChore--">
@@ -1518,7 +1518,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>startChore</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/master/ServerManager.html#line.931">startChore</a>()</pre>
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/master/ServerManager.html#line.934">startChore</a>()</pre>
 <div class="block">start chore in ServerManager</div>
 </li>
 </ul>
@@ -1528,7 +1528,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>stop</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/master/ServerManager.html#line.947">stop</a>()</pre>
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/master/ServerManager.html#line.950">stop</a>()</pre>
 <div class="block">Stop the ServerManager.</div>
 </li>
 </ul>
@@ -1538,7 +1538,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>createDestinationServersList</h4>
-<pre>public&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/util/List.html?is-external=true" title="class or interface in java.util">List</a>&lt;<a href="../../../../../org/apache/hadoop/hbase/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a>&gt;&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/master/ServerManager.html#line.966">createDestinationServersList</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;serversToExclude)</pre>
+<pre>public&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/util/List.html?is-external=true" title="class or interface in java.util">List</a>&lt;<a href="../../../../../org/apache/hadoop/hbase/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a>&gt;&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/master/ServerManager.html#line.969">createDestinationServersList</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;serversToExclude)</pre>
 <div class="block">Creates a list of possible destinations for a region. It contains the online servers, but not
   the draining or dying servers.</div>
 <dl>
@@ -1553,7 +1553,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>createDestinationServersList</h4>
-<pre>public&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/util/List.html?is-external=true" title="class or interface in java.util">List</a>&lt;<a href="../../../../../org/apache/hadoop/hbase/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a>&gt;&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/master/ServerManager.html#line.983">createDestinationServersList</a>()</pre>
+<pre>public&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/util/List.html?is-external=true" title="class or interface in java.util">List</a>&lt;<a href="../../../../../org/apache/hadoop/hbase/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a>&gt;&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/master/ServerManager.html#line.986">createDestinationServersList</a>()</pre>
 <div class="block">Calls <a href="../../../../../org/apache/hadoop/hbase/master/ServerManager.html#createDestinationServersList-java.util.List-"><code>createDestinationServersList(java.util.List&lt;org.apache.hadoop.hbase.ServerName&gt;)</code></a> without server to exclude.</div>
 </li>
 </ul>
@@ -1563,7 +1563,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>clearDeadServersWithSameHostNameAndPortOfOnlineServer</h4>
-<pre>void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/master/ServerManager.html#line.990">clearDeadServersWithSameHostNameAndPortOfOnlineServer</a>()</pre>
+<pre>void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/master/ServerManager.html#line.993">clearDeadServersWithSameHostNameAndPortOfOnlineServer</a>()</pre>
 <div class="block">To clear any dead server with same host name and port of any online server</div>
 </li>
 </ul>
@@ -1573,7 +1573,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>removeRegion</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/master/ServerManager.html#line.999">removeRegion</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/ServerManager.html#line.1002">removeRegion</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">Called by delete table and similar to notify the ServerManager that a region was removed.</div>
 </li>
 </ul>
@@ -1583,7 +1583,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>isRegionInServerManagerStates</h4>
-<pre>public&nbsp;boolean&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/master/ServerManager.html#line.1006">isRegionInServerManagerStates</a>(<a href="../../../../../org/apache/hadoop/hbase/client/RegionInfo.html" title="interface in org.apache.hadoop.hbase.client">RegionInfo</a>&nbsp;hri)</pre>
+<pre>public&nbsp;boolean&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/master/ServerManager.html#line.1009">isRegionInServerManagerStates</a>(<a href="../../../../../org/apache/hadoop/hbase/client/RegionInfo.html" title="interface in org.apache.hadoop.hbase.client">RegionInfo</a>&nbsp;hri)</pre>
 </li>
 </ul>
 <a name="removeRegions-java.util.List-">
@@ -1592,7 +1592,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>removeRegions</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/master/ServerManager.html#line.1015">removeRegions</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>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/master/ServerManager.html#line.1018">removeRegions</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>
 <div class="block">Called by delete table and similar to notify the ServerManager that a region was removed.</div>
 </li>
 </ul>
@@ -1602,7 +1602,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>getVersionNumber</h4>
-<pre>public&nbsp;int&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/master/ServerManager.html#line.1024">getVersionNumber</a>(<a href="../../../../../org/apache/hadoop/hbase/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a>&nbsp;serverName)</pre>
+<pre>public&nbsp;int&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/master/ServerManager.html#line.1027">getVersionNumber</a>(<a href="../../../../../org/apache/hadoop/hbase/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a>&nbsp;serverName)</pre>
 <div class="block">May return 0 when server is not online.</div>
 </li>
 </ul>
@@ -1612,7 +1612,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>getVersion</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/ServerManager.html#line.1032">getVersion</a>(<a href="../../../../../org/apache/hadoop/hbase/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a>&nbsp;serverName)</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/ServerManager.html#line.1035">getVersion</a>(<a href="../../../../../org/apache/hadoop/hbase/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a>&nbsp;serverName)</pre>
 <div class="block">May return "0.0.0" when server is not online</div>
 </li>
 </ul>
@@ -1622,7 +1622,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>getInfoPort</h4>
-<pre>public&nbsp;int&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/master/ServerManager.html#line.1037">getInfoPort</a>(<a href="../../../../../org/apache/hadoop/hbase/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a>&nbsp;serverName)</pre>
+<pre>public&nbsp;int&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/master/ServerManager.html#line.1040">getInfoPort</a>(<a href="../../../../../org/apache/hadoop/hbase/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a>&nbsp;serverName)</pre>
 </li>
 </ul>
 <a name="persistRegionLastFlushedSequenceIds--">
@@ -1631,7 +1631,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>persistRegionLastFlushedSequenceIds</h4>
-<pre>private&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/master/ServerManager.html#line.1046">persistRegionLastFlushedSequenceIds</a>()
+<pre>private&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/master/ServerManager.html#line.1049">persistRegionLastFlushedSequenceIds</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">Persist last flushed sequence id of each region to HDFS</div>
 <dl>
@@ -1646,7 +1646,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>loadLastFlushedSequenceIds</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/master/ServerManager.html#line.1103">loadLastFlushedSequenceIds</a>()
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/master/ServerManager.html#line.1106">loadLastFlushedSequenceIds</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">Load last flushed sequence id of each region from HDFS, if persisted</div>
 <dl>
@@ -1661,7 +1661,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockListLast">
 <li class="blockList">
 <h4>removeDeletedRegionFromLoadedFlushedSequenceIds</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/master/ServerManager.html#line.1152">removeDeletedRegionFromLoadedFlushedSequenceIds</a>()</pre>
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/master/ServerManager.html#line.1155">removeDeletedRegionFromLoadedFlushedSequenceIds</a>()</pre>
 <div class="block">Regions may have been removed between latest persist of FlushedSequenceIds
  and master abort. So after loading FlushedSequenceIds from file, and after
  meta loaded, we need to remove the deleted region according to RegionStates.</div>


[27/46] hbase-site git commit: Published site at 05d22ed960204183fbd9bd16f1dbca6410ccde76.

Posted by gi...@apache.org.
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/3649682c/devapidocs/src-html/org/apache/hadoop/hbase/master/MasterServices.html
----------------------------------------------------------------------
diff --git a/devapidocs/src-html/org/apache/hadoop/hbase/master/MasterServices.html b/devapidocs/src-html/org/apache/hadoop/hbase/master/MasterServices.html
index 340948c..237b402 100644
--- a/devapidocs/src-html/org/apache/hadoop/hbase/master/MasterServices.html
+++ b/devapidocs/src-html/org/apache/hadoop/hbase/master/MasterServices.html
@@ -359,7 +359,7 @@
 <span class="sourceLineNo">351</span>   * @return true if master is in maintanceMode<a name="line.351"></a>
 <span class="sourceLineNo">352</span>   * @throws IOException if the inquiry failed due to an IO problem<a name="line.352"></a>
 <span class="sourceLineNo">353</span>   */<a name="line.353"></a>
-<span class="sourceLineNo">354</span>  boolean isInMaintenanceMode() throws IOException;<a name="line.354"></a>
+<span class="sourceLineNo">354</span>  boolean isInMaintenanceMode();<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>   * Abort a procedure.<a name="line.357"></a>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/3649682c/devapidocs/src-html/org/apache/hadoop/hbase/master/ServerManager.FlushedSequenceIdFlusher.html
----------------------------------------------------------------------
diff --git a/devapidocs/src-html/org/apache/hadoop/hbase/master/ServerManager.FlushedSequenceIdFlusher.html b/devapidocs/src-html/org/apache/hadoop/hbase/master/ServerManager.FlushedSequenceIdFlusher.html
index c13e4a4..f1c0bc3 100644
--- a/devapidocs/src-html/org/apache/hadoop/hbase/master/ServerManager.FlushedSequenceIdFlusher.html
+++ b/devapidocs/src-html/org/apache/hadoop/hbase/master/ServerManager.FlushedSequenceIdFlusher.html
@@ -769,423 +769,426 @@
 <span class="sourceLineNo">761</span>   * RegionServers to check-in.<a name="line.761"></a>
 <span class="sourceLineNo">762</span>   */<a name="line.762"></a>
 <span class="sourceLineNo">763</span>  private int getMinToStart() {<a name="line.763"></a>
-<span class="sourceLineNo">764</span>    // One server should be enough to get us off the ground.<a name="line.764"></a>
-<span class="sourceLineNo">765</span>    int requiredMinToStart = 1;<a name="line.765"></a>
-<span class="sourceLineNo">766</span>    if (LoadBalancer.isTablesOnMaster(master.getConfiguration())) {<a name="line.766"></a>
-<span class="sourceLineNo">767</span>      if (LoadBalancer.isSystemTablesOnlyOnMaster(master.getConfiguration())) {<a name="line.767"></a>
-<span class="sourceLineNo">768</span>        // If Master is carrying regions but NOT user-space regions, it<a name="line.768"></a>
-<span class="sourceLineNo">769</span>        // still shows as a 'server'. We need at least one more server to check<a name="line.769"></a>
-<span class="sourceLineNo">770</span>        // in before we can start up so set defaultMinToStart to 2.<a name="line.770"></a>
-<span class="sourceLineNo">771</span>        requiredMinToStart = requiredMinToStart + 1;<a name="line.771"></a>
-<span class="sourceLineNo">772</span>      }<a name="line.772"></a>
-<span class="sourceLineNo">773</span>    }<a name="line.773"></a>
-<span class="sourceLineNo">774</span>    int minToStart = this.master.getConfiguration().getInt(WAIT_ON_REGIONSERVERS_MINTOSTART, -1);<a name="line.774"></a>
-<span class="sourceLineNo">775</span>    // Ensure we are never less than requiredMinToStart else stuff won't work.<a name="line.775"></a>
-<span class="sourceLineNo">776</span>    return minToStart == -1 || minToStart &lt; requiredMinToStart? requiredMinToStart: minToStart;<a name="line.776"></a>
-<span class="sourceLineNo">777</span>  }<a name="line.777"></a>
-<span class="sourceLineNo">778</span><a name="line.778"></a>
-<span class="sourceLineNo">779</span>  /**<a name="line.779"></a>
-<span class="sourceLineNo">780</span>   * Wait for the region servers to report in.<a name="line.780"></a>
-<span class="sourceLineNo">781</span>   * We will wait until one of this condition is met:<a name="line.781"></a>
-<span class="sourceLineNo">782</span>   *  - the master is stopped<a name="line.782"></a>
-<span class="sourceLineNo">783</span>   *  - the 'hbase.master.wait.on.regionservers.maxtostart' number of<a name="line.783"></a>
-<span class="sourceLineNo">784</span>   *    region servers is reached<a name="line.784"></a>
-<span class="sourceLineNo">785</span>   *  - the 'hbase.master.wait.on.regionservers.mintostart' is reached AND<a name="line.785"></a>
-<span class="sourceLineNo">786</span>   *   there have been no new region server in for<a name="line.786"></a>
-<span class="sourceLineNo">787</span>   *      'hbase.master.wait.on.regionservers.interval' time AND<a name="line.787"></a>
-<span class="sourceLineNo">788</span>   *   the 'hbase.master.wait.on.regionservers.timeout' is reached<a name="line.788"></a>
-<span class="sourceLineNo">789</span>   *<a name="line.789"></a>
-<span class="sourceLineNo">790</span>   * @throws InterruptedException<a name="line.790"></a>
-<span class="sourceLineNo">791</span>   */<a name="line.791"></a>
-<span class="sourceLineNo">792</span>  public void waitForRegionServers(MonitoredTask status) throws InterruptedException {<a name="line.792"></a>
-<span class="sourceLineNo">793</span>    final long interval = this.master.getConfiguration().<a name="line.793"></a>
-<span class="sourceLineNo">794</span>        getLong(WAIT_ON_REGIONSERVERS_INTERVAL, 1500);<a name="line.794"></a>
-<span class="sourceLineNo">795</span>    final long timeout = this.master.getConfiguration().<a name="line.795"></a>
-<span class="sourceLineNo">796</span>        getLong(WAIT_ON_REGIONSERVERS_TIMEOUT, 4500);<a name="line.796"></a>
-<span class="sourceLineNo">797</span>    // Min is not an absolute; just a friction making us wait longer on server checkin.<a name="line.797"></a>
-<span class="sourceLineNo">798</span>    int minToStart = getMinToStart();<a name="line.798"></a>
-<span class="sourceLineNo">799</span>    int maxToStart = this.master.getConfiguration().<a name="line.799"></a>
-<span class="sourceLineNo">800</span>        getInt(WAIT_ON_REGIONSERVERS_MAXTOSTART, Integer.MAX_VALUE);<a name="line.800"></a>
-<span class="sourceLineNo">801</span>    if (maxToStart &lt; minToStart) {<a name="line.801"></a>
-<span class="sourceLineNo">802</span>      LOG.warn(String.format("The value of '%s' (%d) is set less than '%s' (%d), ignoring.",<a name="line.802"></a>
-<span class="sourceLineNo">803</span>          WAIT_ON_REGIONSERVERS_MAXTOSTART, maxToStart,<a name="line.803"></a>
-<span class="sourceLineNo">804</span>          WAIT_ON_REGIONSERVERS_MINTOSTART, minToStart));<a name="line.804"></a>
-<span class="sourceLineNo">805</span>      maxToStart = Integer.MAX_VALUE;<a name="line.805"></a>
-<span class="sourceLineNo">806</span>    }<a name="line.806"></a>
-<span class="sourceLineNo">807</span><a name="line.807"></a>
-<span class="sourceLineNo">808</span>    long now =  System.currentTimeMillis();<a name="line.808"></a>
-<span class="sourceLineNo">809</span>    final long startTime = now;<a name="line.809"></a>
-<span class="sourceLineNo">810</span>    long slept = 0;<a name="line.810"></a>
-<span class="sourceLineNo">811</span>    long lastLogTime = 0;<a name="line.811"></a>
-<span class="sourceLineNo">812</span>    long lastCountChange = startTime;<a name="line.812"></a>
-<span class="sourceLineNo">813</span>    int count = countOfRegionServers();<a name="line.813"></a>
-<span class="sourceLineNo">814</span>    int oldCount = 0;<a name="line.814"></a>
-<span class="sourceLineNo">815</span>    // This while test is a little hard to read. We try to comment it in below but in essence:<a name="line.815"></a>
-<span class="sourceLineNo">816</span>    // Wait if Master is not stopped and the number of regionservers that have checked-in is<a name="line.816"></a>
-<span class="sourceLineNo">817</span>    // less than the maxToStart. Both of these conditions will be true near universally.<a name="line.817"></a>
-<span class="sourceLineNo">818</span>    // Next, we will keep cycling if ANY of the following three conditions are true:<a name="line.818"></a>
-<span class="sourceLineNo">819</span>    // 1. The time since a regionserver registered is &lt; interval (means servers are actively checking in).<a name="line.819"></a>
-<span class="sourceLineNo">820</span>    // 2. We are under the total timeout.<a name="line.820"></a>
-<span class="sourceLineNo">821</span>    // 3. The count of servers is &lt; minimum.<a name="line.821"></a>
-<span class="sourceLineNo">822</span>    for (ServerListener listener: this.listeners) {<a name="line.822"></a>
-<span class="sourceLineNo">823</span>      listener.waiting();<a name="line.823"></a>
-<span class="sourceLineNo">824</span>    }<a name="line.824"></a>
-<span class="sourceLineNo">825</span>    while (!this.master.isStopped() &amp;&amp; !isClusterShutdown() &amp;&amp; count &lt; maxToStart &amp;&amp;<a name="line.825"></a>
-<span class="sourceLineNo">826</span>        ((lastCountChange + interval) &gt; now || timeout &gt; slept || count &lt; minToStart)) {<a name="line.826"></a>
-<span class="sourceLineNo">827</span>      // Log some info at every interval time or if there is a change<a name="line.827"></a>
-<span class="sourceLineNo">828</span>      if (oldCount != count || lastLogTime + interval &lt; now) {<a name="line.828"></a>
-<span class="sourceLineNo">829</span>        lastLogTime = now;<a name="line.829"></a>
-<span class="sourceLineNo">830</span>        String msg =<a name="line.830"></a>
-<span class="sourceLineNo">831</span>            "Waiting on regionserver count=" + count + "; waited="+<a name="line.831"></a>
-<span class="sourceLineNo">832</span>                slept + "ms, expecting min=" + minToStart + " server(s), max="+ getStrForMax(maxToStart) +<a name="line.832"></a>
-<span class="sourceLineNo">833</span>                " server(s), " + "timeout=" + timeout + "ms, lastChange=" + (lastCountChange - now) + "ms";<a name="line.833"></a>
-<span class="sourceLineNo">834</span>        LOG.info(msg);<a name="line.834"></a>
-<span class="sourceLineNo">835</span>        status.setStatus(msg);<a name="line.835"></a>
-<span class="sourceLineNo">836</span>      }<a name="line.836"></a>
-<span class="sourceLineNo">837</span><a name="line.837"></a>
-<span class="sourceLineNo">838</span>      // We sleep for some time<a name="line.838"></a>
-<span class="sourceLineNo">839</span>      final long sleepTime = 50;<a name="line.839"></a>
-<span class="sourceLineNo">840</span>      Thread.sleep(sleepTime);<a name="line.840"></a>
-<span class="sourceLineNo">841</span>      now =  System.currentTimeMillis();<a name="line.841"></a>
-<span class="sourceLineNo">842</span>      slept = now - startTime;<a name="line.842"></a>
-<span class="sourceLineNo">843</span><a name="line.843"></a>
-<span class="sourceLineNo">844</span>      oldCount = count;<a name="line.844"></a>
-<span class="sourceLineNo">845</span>      count = countOfRegionServers();<a name="line.845"></a>
-<span class="sourceLineNo">846</span>      if (count != oldCount) {<a name="line.846"></a>
-<span class="sourceLineNo">847</span>        lastCountChange = now;<a name="line.847"></a>
-<span class="sourceLineNo">848</span>      }<a name="line.848"></a>
-<span class="sourceLineNo">849</span>    }<a name="line.849"></a>
-<span class="sourceLineNo">850</span>    // Did we exit the loop because cluster is going down?<a name="line.850"></a>
-<span class="sourceLineNo">851</span>    if (isClusterShutdown()) {<a name="line.851"></a>
-<span class="sourceLineNo">852</span>      this.master.stop("Cluster shutdown");<a name="line.852"></a>
-<span class="sourceLineNo">853</span>    }<a name="line.853"></a>
-<span class="sourceLineNo">854</span>    LOG.info("Finished waiting on RegionServer count=" + count + "; waited=" + slept + "ms," +<a name="line.854"></a>
-<span class="sourceLineNo">855</span>        " expected min=" + minToStart + " server(s), max=" +  getStrForMax(maxToStart) + " server(s),"+<a name="line.855"></a>
-<span class="sourceLineNo">856</span>        " master is "+ (this.master.isStopped() ? "stopped.": "running"));<a name="line.856"></a>
-<span class="sourceLineNo">857</span>  }<a name="line.857"></a>
-<span class="sourceLineNo">858</span><a name="line.858"></a>
-<span class="sourceLineNo">859</span>  private String getStrForMax(final int max) {<a name="line.859"></a>
-<span class="sourceLineNo">860</span>    return max == Integer.MAX_VALUE? "NO_LIMIT": Integer.toString(max);<a name="line.860"></a>
-<span class="sourceLineNo">861</span>  }<a name="line.861"></a>
-<span class="sourceLineNo">862</span><a name="line.862"></a>
-<span class="sourceLineNo">863</span>  /**<a name="line.863"></a>
-<span class="sourceLineNo">864</span>   * @return A copy of the internal list of online servers.<a name="line.864"></a>
-<span class="sourceLineNo">865</span>   */<a name="line.865"></a>
-<span class="sourceLineNo">866</span>  public List&lt;ServerName&gt; getOnlineServersList() {<a name="line.866"></a>
-<span class="sourceLineNo">867</span>    // TODO: optimize the load balancer call so we don't need to make a new list<a name="line.867"></a>
-<span class="sourceLineNo">868</span>    // TODO: FIX. THIS IS POPULAR CALL.<a name="line.868"></a>
-<span class="sourceLineNo">869</span>    return new ArrayList&lt;&gt;(this.onlineServers.keySet());<a name="line.869"></a>
-<span class="sourceLineNo">870</span>  }<a name="line.870"></a>
-<span class="sourceLineNo">871</span><a name="line.871"></a>
-<span class="sourceLineNo">872</span>  /**<a name="line.872"></a>
-<span class="sourceLineNo">873</span>   * @param keys The target server name<a name="line.873"></a>
-<span class="sourceLineNo">874</span>   * @param idleServerPredicator Evaluates the server on the given load<a name="line.874"></a>
-<span class="sourceLineNo">875</span>   * @return A copy of the internal list of online servers matched by the predicator<a name="line.875"></a>
-<span class="sourceLineNo">876</span>   */<a name="line.876"></a>
-<span class="sourceLineNo">877</span>  public List&lt;ServerName&gt; getOnlineServersListWithPredicator(List&lt;ServerName&gt; keys,<a name="line.877"></a>
-<span class="sourceLineNo">878</span>    Predicate&lt;ServerMetrics&gt; idleServerPredicator) {<a name="line.878"></a>
-<span class="sourceLineNo">879</span>    List&lt;ServerName&gt; names = new ArrayList&lt;&gt;();<a name="line.879"></a>
-<span class="sourceLineNo">880</span>    if (keys != null &amp;&amp; idleServerPredicator != null) {<a name="line.880"></a>
-<span class="sourceLineNo">881</span>      keys.forEach(name -&gt; {<a name="line.881"></a>
-<span class="sourceLineNo">882</span>        ServerMetrics load = onlineServers.get(name);<a name="line.882"></a>
-<span class="sourceLineNo">883</span>        if (load != null) {<a name="line.883"></a>
-<span class="sourceLineNo">884</span>          if (idleServerPredicator.test(load)) {<a name="line.884"></a>
-<span class="sourceLineNo">885</span>            names.add(name);<a name="line.885"></a>
-<span class="sourceLineNo">886</span>          }<a name="line.886"></a>
-<span class="sourceLineNo">887</span>        }<a name="line.887"></a>
-<span class="sourceLineNo">888</span>      });<a name="line.888"></a>
-<span class="sourceLineNo">889</span>    }<a name="line.889"></a>
-<span class="sourceLineNo">890</span>    return names;<a name="line.890"></a>
-<span class="sourceLineNo">891</span>  }<a name="line.891"></a>
-<span class="sourceLineNo">892</span><a name="line.892"></a>
-<span class="sourceLineNo">893</span>  /**<a name="line.893"></a>
-<span class="sourceLineNo">894</span>   * @return A copy of the internal list of draining servers.<a name="line.894"></a>
-<span class="sourceLineNo">895</span>   */<a name="line.895"></a>
-<span class="sourceLineNo">896</span>  public List&lt;ServerName&gt; getDrainingServersList() {<a name="line.896"></a>
-<span class="sourceLineNo">897</span>    return new ArrayList&lt;&gt;(this.drainingServers);<a name="line.897"></a>
-<span class="sourceLineNo">898</span>  }<a name="line.898"></a>
-<span class="sourceLineNo">899</span><a name="line.899"></a>
-<span class="sourceLineNo">900</span>  public boolean isServerOnline(ServerName serverName) {<a name="line.900"></a>
-<span class="sourceLineNo">901</span>    return serverName != null &amp;&amp; onlineServers.containsKey(serverName);<a name="line.901"></a>
-<span class="sourceLineNo">902</span>  }<a name="line.902"></a>
-<span class="sourceLineNo">903</span><a name="line.903"></a>
-<span class="sourceLineNo">904</span>  /**<a name="line.904"></a>
-<span class="sourceLineNo">905</span>   * Check if a server is known to be dead.  A server can be online,<a name="line.905"></a>
-<span class="sourceLineNo">906</span>   * or known to be dead, or unknown to this manager (i.e, not online,<a name="line.906"></a>
-<span class="sourceLineNo">907</span>   * not known to be dead either. it is simply not tracked by the<a name="line.907"></a>
-<span class="sourceLineNo">908</span>   * master any more, for example, a very old previous instance).<a name="line.908"></a>
-<span class="sourceLineNo">909</span>   */<a name="line.909"></a>
-<span class="sourceLineNo">910</span>  public synchronized boolean isServerDead(ServerName serverName) {<a name="line.910"></a>
-<span class="sourceLineNo">911</span>    return serverName == null || deadservers.isDeadServer(serverName);<a name="line.911"></a>
-<span class="sourceLineNo">912</span>  }<a name="line.912"></a>
-<span class="sourceLineNo">913</span><a name="line.913"></a>
-<span class="sourceLineNo">914</span>  public void shutdownCluster() {<a name="line.914"></a>
-<span class="sourceLineNo">915</span>    String statusStr = "Cluster shutdown requested of master=" + this.master.getServerName();<a name="line.915"></a>
-<span class="sourceLineNo">916</span>    LOG.info(statusStr);<a name="line.916"></a>
-<span class="sourceLineNo">917</span>    this.clusterShutdown.set(true);<a name="line.917"></a>
-<span class="sourceLineNo">918</span>    if (onlineServers.isEmpty()) {<a name="line.918"></a>
-<span class="sourceLineNo">919</span>      // we do not synchronize here so this may cause a double stop, but not a big deal<a name="line.919"></a>
-<span class="sourceLineNo">920</span>      master.stop("OnlineServer=0 right after cluster shutdown set");<a name="line.920"></a>
-<span class="sourceLineNo">921</span>    }<a name="line.921"></a>
-<span class="sourceLineNo">922</span>  }<a name="line.922"></a>
-<span class="sourceLineNo">923</span><a name="line.923"></a>
-<span class="sourceLineNo">924</span>  public boolean isClusterShutdown() {<a name="line.924"></a>
-<span class="sourceLineNo">925</span>    return this.clusterShutdown.get();<a name="line.925"></a>
-<span class="sourceLineNo">926</span>  }<a name="line.926"></a>
-<span class="sourceLineNo">927</span><a name="line.927"></a>
-<span class="sourceLineNo">928</span>  /**<a name="line.928"></a>
-<span class="sourceLineNo">929</span>   * start chore in ServerManager<a name="line.929"></a>
-<span class="sourceLineNo">930</span>   */<a name="line.930"></a>
-<span class="sourceLineNo">931</span>  public void startChore() {<a name="line.931"></a>
-<span class="sourceLineNo">932</span>    Configuration c = master.getConfiguration();<a name="line.932"></a>
-<span class="sourceLineNo">933</span>    if (persistFlushedSequenceId) {<a name="line.933"></a>
-<span class="sourceLineNo">934</span>      // when reach here, RegionStates should loaded, firstly, we call remove deleted regions<a name="line.934"></a>
-<span class="sourceLineNo">935</span>      removeDeletedRegionFromLoadedFlushedSequenceIds();<a name="line.935"></a>
-<span class="sourceLineNo">936</span>      int flushPeriod = c.getInt(FLUSHEDSEQUENCEID_FLUSHER_INTERVAL,<a name="line.936"></a>
-<span class="sourceLineNo">937</span>          FLUSHEDSEQUENCEID_FLUSHER_INTERVAL_DEFAULT);<a name="line.937"></a>
-<span class="sourceLineNo">938</span>      flushedSeqIdFlusher = new FlushedSequenceIdFlusher(<a name="line.938"></a>
-<span class="sourceLineNo">939</span>          "FlushedSequenceIdFlusher", flushPeriod);<a name="line.939"></a>
-<span class="sourceLineNo">940</span>      master.getChoreService().scheduleChore(flushedSeqIdFlusher);<a name="line.940"></a>
-<span class="sourceLineNo">941</span>    }<a name="line.941"></a>
-<span class="sourceLineNo">942</span>  }<a name="line.942"></a>
-<span class="sourceLineNo">943</span><a name="line.943"></a>
-<span class="sourceLineNo">944</span>  /**<a name="line.944"></a>
-<span class="sourceLineNo">945</span>   * Stop the ServerManager.<a name="line.945"></a>
-<span class="sourceLineNo">946</span>   */<a name="line.946"></a>
-<span class="sourceLineNo">947</span>  public void stop() {<a name="line.947"></a>
-<span class="sourceLineNo">948</span>    if (flushedSeqIdFlusher != null) {<a name="line.948"></a>
-<span class="sourceLineNo">949</span>      flushedSeqIdFlusher.cancel();<a name="line.949"></a>
-<span class="sourceLineNo">950</span>    }<a name="line.950"></a>
-<span class="sourceLineNo">951</span>    if (persistFlushedSequenceId) {<a name="line.951"></a>
-<span class="sourceLineNo">952</span>      try {<a name="line.952"></a>
-<span class="sourceLineNo">953</span>        persistRegionLastFlushedSequenceIds();<a name="line.953"></a>
-<span class="sourceLineNo">954</span>      } catch (IOException e) {<a name="line.954"></a>
-<span class="sourceLineNo">955</span>        LOG.warn("Failed to persist last flushed sequence id of regions"<a name="line.955"></a>
-<span class="sourceLineNo">956</span>            + " to file system", e);<a name="line.956"></a>
-<span class="sourceLineNo">957</span>      }<a name="line.957"></a>
-<span class="sourceLineNo">958</span>    }<a name="line.958"></a>
-<span class="sourceLineNo">959</span>  }<a name="line.959"></a>
-<span class="sourceLineNo">960</span><a name="line.960"></a>
-<span class="sourceLineNo">961</span>  /**<a name="line.961"></a>
-<span class="sourceLineNo">962</span>   * Creates a list of possible destinations for a region. It contains the online servers, but not<a name="line.962"></a>
-<span class="sourceLineNo">963</span>   *  the draining or dying servers.<a name="line.963"></a>
-<span class="sourceLineNo">964</span>   *  @param serversToExclude can be null if there is no server to exclude<a name="line.964"></a>
-<span class="sourceLineNo">965</span>   */<a name="line.965"></a>
-<span class="sourceLineNo">966</span>  public List&lt;ServerName&gt; createDestinationServersList(final List&lt;ServerName&gt; serversToExclude){<a name="line.966"></a>
-<span class="sourceLineNo">967</span>    final List&lt;ServerName&gt; destServers = getOnlineServersList();<a name="line.967"></a>
-<span class="sourceLineNo">968</span><a name="line.968"></a>
-<span class="sourceLineNo">969</span>    if (serversToExclude != null) {<a name="line.969"></a>
-<span class="sourceLineNo">970</span>      destServers.removeAll(serversToExclude);<a name="line.970"></a>
-<span class="sourceLineNo">971</span>    }<a name="line.971"></a>
-<span class="sourceLineNo">972</span><a name="line.972"></a>
-<span class="sourceLineNo">973</span>    // Loop through the draining server list and remove them from the server list<a name="line.973"></a>
-<span class="sourceLineNo">974</span>    final List&lt;ServerName&gt; drainingServersCopy = getDrainingServersList();<a name="line.974"></a>
-<span class="sourceLineNo">975</span>    destServers.removeAll(drainingServersCopy);<a name="line.975"></a>
-<span class="sourceLineNo">976</span><a name="line.976"></a>
-<span class="sourceLineNo">977</span>    return destServers;<a name="line.977"></a>
-<span class="sourceLineNo">978</span>  }<a name="line.978"></a>
+<span class="sourceLineNo">764</span>    if (master.isInMaintenanceMode()) {<a name="line.764"></a>
+<span class="sourceLineNo">765</span>      // If in maintenance mode, then master hosting meta will be the only server available<a name="line.765"></a>
+<span class="sourceLineNo">766</span>      return 1;<a name="line.766"></a>
+<span class="sourceLineNo">767</span>    }<a name="line.767"></a>
+<span class="sourceLineNo">768</span><a name="line.768"></a>
+<span class="sourceLineNo">769</span>    int minimumRequired = 1;<a name="line.769"></a>
+<span class="sourceLineNo">770</span>    if (LoadBalancer.isTablesOnMaster(master.getConfiguration()) &amp;&amp;<a name="line.770"></a>
+<span class="sourceLineNo">771</span>        LoadBalancer.isSystemTablesOnlyOnMaster(master.getConfiguration())) {<a name="line.771"></a>
+<span class="sourceLineNo">772</span>      // If Master is carrying regions it will show up as a 'server', but is not handling user-<a name="line.772"></a>
+<span class="sourceLineNo">773</span>      // space regions, so we need a second server.<a name="line.773"></a>
+<span class="sourceLineNo">774</span>      minimumRequired = 2;<a name="line.774"></a>
+<span class="sourceLineNo">775</span>    }<a name="line.775"></a>
+<span class="sourceLineNo">776</span><a name="line.776"></a>
+<span class="sourceLineNo">777</span>    int minToStart = this.master.getConfiguration().getInt(WAIT_ON_REGIONSERVERS_MINTOSTART, -1);<a name="line.777"></a>
+<span class="sourceLineNo">778</span>    // Ensure we are never less than minimumRequired else stuff won't work.<a name="line.778"></a>
+<span class="sourceLineNo">779</span>    return Math.max(minToStart, minimumRequired);<a name="line.779"></a>
+<span class="sourceLineNo">780</span>  }<a name="line.780"></a>
+<span class="sourceLineNo">781</span><a name="line.781"></a>
+<span class="sourceLineNo">782</span>  /**<a name="line.782"></a>
+<span class="sourceLineNo">783</span>   * Wait for the region servers to report in.<a name="line.783"></a>
+<span class="sourceLineNo">784</span>   * We will wait until one of this condition is met:<a name="line.784"></a>
+<span class="sourceLineNo">785</span>   *  - the master is stopped<a name="line.785"></a>
+<span class="sourceLineNo">786</span>   *  - the 'hbase.master.wait.on.regionservers.maxtostart' number of<a name="line.786"></a>
+<span class="sourceLineNo">787</span>   *    region servers is reached<a name="line.787"></a>
+<span class="sourceLineNo">788</span>   *  - the 'hbase.master.wait.on.regionservers.mintostart' is reached AND<a name="line.788"></a>
+<span class="sourceLineNo">789</span>   *   there have been no new region server in for<a name="line.789"></a>
+<span class="sourceLineNo">790</span>   *      'hbase.master.wait.on.regionservers.interval' time AND<a name="line.790"></a>
+<span class="sourceLineNo">791</span>   *   the 'hbase.master.wait.on.regionservers.timeout' is reached<a name="line.791"></a>
+<span class="sourceLineNo">792</span>   *<a name="line.792"></a>
+<span class="sourceLineNo">793</span>   * @throws InterruptedException<a name="line.793"></a>
+<span class="sourceLineNo">794</span>   */<a name="line.794"></a>
+<span class="sourceLineNo">795</span>  public void waitForRegionServers(MonitoredTask status) throws InterruptedException {<a name="line.795"></a>
+<span class="sourceLineNo">796</span>    final long interval = this.master.getConfiguration().<a name="line.796"></a>
+<span class="sourceLineNo">797</span>        getLong(WAIT_ON_REGIONSERVERS_INTERVAL, 1500);<a name="line.797"></a>
+<span class="sourceLineNo">798</span>    final long timeout = this.master.getConfiguration().<a name="line.798"></a>
+<span class="sourceLineNo">799</span>        getLong(WAIT_ON_REGIONSERVERS_TIMEOUT, 4500);<a name="line.799"></a>
+<span class="sourceLineNo">800</span>    // Min is not an absolute; just a friction making us wait longer on server checkin.<a name="line.800"></a>
+<span class="sourceLineNo">801</span>    int minToStart = getMinToStart();<a name="line.801"></a>
+<span class="sourceLineNo">802</span>    int maxToStart = this.master.getConfiguration().<a name="line.802"></a>
+<span class="sourceLineNo">803</span>        getInt(WAIT_ON_REGIONSERVERS_MAXTOSTART, Integer.MAX_VALUE);<a name="line.803"></a>
+<span class="sourceLineNo">804</span>    if (maxToStart &lt; minToStart) {<a name="line.804"></a>
+<span class="sourceLineNo">805</span>      LOG.warn(String.format("The value of '%s' (%d) is set less than '%s' (%d), ignoring.",<a name="line.805"></a>
+<span class="sourceLineNo">806</span>          WAIT_ON_REGIONSERVERS_MAXTOSTART, maxToStart,<a name="line.806"></a>
+<span class="sourceLineNo">807</span>          WAIT_ON_REGIONSERVERS_MINTOSTART, minToStart));<a name="line.807"></a>
+<span class="sourceLineNo">808</span>      maxToStart = Integer.MAX_VALUE;<a name="line.808"></a>
+<span class="sourceLineNo">809</span>    }<a name="line.809"></a>
+<span class="sourceLineNo">810</span><a name="line.810"></a>
+<span class="sourceLineNo">811</span>    long now =  System.currentTimeMillis();<a name="line.811"></a>
+<span class="sourceLineNo">812</span>    final long startTime = now;<a name="line.812"></a>
+<span class="sourceLineNo">813</span>    long slept = 0;<a name="line.813"></a>
+<span class="sourceLineNo">814</span>    long lastLogTime = 0;<a name="line.814"></a>
+<span class="sourceLineNo">815</span>    long lastCountChange = startTime;<a name="line.815"></a>
+<span class="sourceLineNo">816</span>    int count = countOfRegionServers();<a name="line.816"></a>
+<span class="sourceLineNo">817</span>    int oldCount = 0;<a name="line.817"></a>
+<span class="sourceLineNo">818</span>    // This while test is a little hard to read. We try to comment it in below but in essence:<a name="line.818"></a>
+<span class="sourceLineNo">819</span>    // Wait if Master is not stopped and the number of regionservers that have checked-in is<a name="line.819"></a>
+<span class="sourceLineNo">820</span>    // less than the maxToStart. Both of these conditions will be true near universally.<a name="line.820"></a>
+<span class="sourceLineNo">821</span>    // Next, we will keep cycling if ANY of the following three conditions are true:<a name="line.821"></a>
+<span class="sourceLineNo">822</span>    // 1. The time since a regionserver registered is &lt; interval (means servers are actively checking in).<a name="line.822"></a>
+<span class="sourceLineNo">823</span>    // 2. We are under the total timeout.<a name="line.823"></a>
+<span class="sourceLineNo">824</span>    // 3. The count of servers is &lt; minimum.<a name="line.824"></a>
+<span class="sourceLineNo">825</span>    for (ServerListener listener: this.listeners) {<a name="line.825"></a>
+<span class="sourceLineNo">826</span>      listener.waiting();<a name="line.826"></a>
+<span class="sourceLineNo">827</span>    }<a name="line.827"></a>
+<span class="sourceLineNo">828</span>    while (!this.master.isStopped() &amp;&amp; !isClusterShutdown() &amp;&amp; count &lt; maxToStart &amp;&amp;<a name="line.828"></a>
+<span class="sourceLineNo">829</span>        ((lastCountChange + interval) &gt; now || timeout &gt; slept || count &lt; minToStart)) {<a name="line.829"></a>
+<span class="sourceLineNo">830</span>      // Log some info at every interval time or if there is a change<a name="line.830"></a>
+<span class="sourceLineNo">831</span>      if (oldCount != count || lastLogTime + interval &lt; now) {<a name="line.831"></a>
+<span class="sourceLineNo">832</span>        lastLogTime = now;<a name="line.832"></a>
+<span class="sourceLineNo">833</span>        String msg =<a name="line.833"></a>
+<span class="sourceLineNo">834</span>            "Waiting on regionserver count=" + count + "; waited="+<a name="line.834"></a>
+<span class="sourceLineNo">835</span>                slept + "ms, expecting min=" + minToStart + " server(s), max="+ getStrForMax(maxToStart) +<a name="line.835"></a>
+<span class="sourceLineNo">836</span>                " server(s), " + "timeout=" + timeout + "ms, lastChange=" + (lastCountChange - now) + "ms";<a name="line.836"></a>
+<span class="sourceLineNo">837</span>        LOG.info(msg);<a name="line.837"></a>
+<span class="sourceLineNo">838</span>        status.setStatus(msg);<a name="line.838"></a>
+<span class="sourceLineNo">839</span>      }<a name="line.839"></a>
+<span class="sourceLineNo">840</span><a name="line.840"></a>
+<span class="sourceLineNo">841</span>      // We sleep for some time<a name="line.841"></a>
+<span class="sourceLineNo">842</span>      final long sleepTime = 50;<a name="line.842"></a>
+<span class="sourceLineNo">843</span>      Thread.sleep(sleepTime);<a name="line.843"></a>
+<span class="sourceLineNo">844</span>      now =  System.currentTimeMillis();<a name="line.844"></a>
+<span class="sourceLineNo">845</span>      slept = now - startTime;<a name="line.845"></a>
+<span class="sourceLineNo">846</span><a name="line.846"></a>
+<span class="sourceLineNo">847</span>      oldCount = count;<a name="line.847"></a>
+<span class="sourceLineNo">848</span>      count = countOfRegionServers();<a name="line.848"></a>
+<span class="sourceLineNo">849</span>      if (count != oldCount) {<a name="line.849"></a>
+<span class="sourceLineNo">850</span>        lastCountChange = now;<a name="line.850"></a>
+<span class="sourceLineNo">851</span>      }<a name="line.851"></a>
+<span class="sourceLineNo">852</span>    }<a name="line.852"></a>
+<span class="sourceLineNo">853</span>    // Did we exit the loop because cluster is going down?<a name="line.853"></a>
+<span class="sourceLineNo">854</span>    if (isClusterShutdown()) {<a name="line.854"></a>
+<span class="sourceLineNo">855</span>      this.master.stop("Cluster shutdown");<a name="line.855"></a>
+<span class="sourceLineNo">856</span>    }<a name="line.856"></a>
+<span class="sourceLineNo">857</span>    LOG.info("Finished waiting on RegionServer count=" + count + "; waited=" + slept + "ms," +<a name="line.857"></a>
+<span class="sourceLineNo">858</span>        " expected min=" + minToStart + " server(s), max=" +  getStrForMax(maxToStart) + " server(s),"+<a name="line.858"></a>
+<span class="sourceLineNo">859</span>        " master is "+ (this.master.isStopped() ? "stopped.": "running"));<a name="line.859"></a>
+<span class="sourceLineNo">860</span>  }<a name="line.860"></a>
+<span class="sourceLineNo">861</span><a name="line.861"></a>
+<span class="sourceLineNo">862</span>  private String getStrForMax(final int max) {<a name="line.862"></a>
+<span class="sourceLineNo">863</span>    return max == Integer.MAX_VALUE? "NO_LIMIT": Integer.toString(max);<a name="line.863"></a>
+<span class="sourceLineNo">864</span>  }<a name="line.864"></a>
+<span class="sourceLineNo">865</span><a name="line.865"></a>
+<span class="sourceLineNo">866</span>  /**<a name="line.866"></a>
+<span class="sourceLineNo">867</span>   * @return A copy of the internal list of online servers.<a name="line.867"></a>
+<span class="sourceLineNo">868</span>   */<a name="line.868"></a>
+<span class="sourceLineNo">869</span>  public List&lt;ServerName&gt; getOnlineServersList() {<a name="line.869"></a>
+<span class="sourceLineNo">870</span>    // TODO: optimize the load balancer call so we don't need to make a new list<a name="line.870"></a>
+<span class="sourceLineNo">871</span>    // TODO: FIX. THIS IS POPULAR CALL.<a name="line.871"></a>
+<span class="sourceLineNo">872</span>    return new ArrayList&lt;&gt;(this.onlineServers.keySet());<a name="line.872"></a>
+<span class="sourceLineNo">873</span>  }<a name="line.873"></a>
+<span class="sourceLineNo">874</span><a name="line.874"></a>
+<span class="sourceLineNo">875</span>  /**<a name="line.875"></a>
+<span class="sourceLineNo">876</span>   * @param keys The target server name<a name="line.876"></a>
+<span class="sourceLineNo">877</span>   * @param idleServerPredicator Evaluates the server on the given load<a name="line.877"></a>
+<span class="sourceLineNo">878</span>   * @return A copy of the internal list of online servers matched by the predicator<a name="line.878"></a>
+<span class="sourceLineNo">879</span>   */<a name="line.879"></a>
+<span class="sourceLineNo">880</span>  public List&lt;ServerName&gt; getOnlineServersListWithPredicator(List&lt;ServerName&gt; keys,<a name="line.880"></a>
+<span class="sourceLineNo">881</span>    Predicate&lt;ServerMetrics&gt; idleServerPredicator) {<a name="line.881"></a>
+<span class="sourceLineNo">882</span>    List&lt;ServerName&gt; names = new ArrayList&lt;&gt;();<a name="line.882"></a>
+<span class="sourceLineNo">883</span>    if (keys != null &amp;&amp; idleServerPredicator != null) {<a name="line.883"></a>
+<span class="sourceLineNo">884</span>      keys.forEach(name -&gt; {<a name="line.884"></a>
+<span class="sourceLineNo">885</span>        ServerMetrics load = onlineServers.get(name);<a name="line.885"></a>
+<span class="sourceLineNo">886</span>        if (load != null) {<a name="line.886"></a>
+<span class="sourceLineNo">887</span>          if (idleServerPredicator.test(load)) {<a name="line.887"></a>
+<span class="sourceLineNo">888</span>            names.add(name);<a name="line.888"></a>
+<span class="sourceLineNo">889</span>          }<a name="line.889"></a>
+<span class="sourceLineNo">890</span>        }<a name="line.890"></a>
+<span class="sourceLineNo">891</span>      });<a name="line.891"></a>
+<span class="sourceLineNo">892</span>    }<a name="line.892"></a>
+<span class="sourceLineNo">893</span>    return names;<a name="line.893"></a>
+<span class="sourceLineNo">894</span>  }<a name="line.894"></a>
+<span class="sourceLineNo">895</span><a name="line.895"></a>
+<span class="sourceLineNo">896</span>  /**<a name="line.896"></a>
+<span class="sourceLineNo">897</span>   * @return A copy of the internal list of draining servers.<a name="line.897"></a>
+<span class="sourceLineNo">898</span>   */<a name="line.898"></a>
+<span class="sourceLineNo">899</span>  public List&lt;ServerName&gt; getDrainingServersList() {<a name="line.899"></a>
+<span class="sourceLineNo">900</span>    return new ArrayList&lt;&gt;(this.drainingServers);<a name="line.900"></a>
+<span class="sourceLineNo">901</span>  }<a name="line.901"></a>
+<span class="sourceLineNo">902</span><a name="line.902"></a>
+<span class="sourceLineNo">903</span>  public boolean isServerOnline(ServerName serverName) {<a name="line.903"></a>
+<span class="sourceLineNo">904</span>    return serverName != null &amp;&amp; onlineServers.containsKey(serverName);<a name="line.904"></a>
+<span class="sourceLineNo">905</span>  }<a name="line.905"></a>
+<span class="sourceLineNo">906</span><a name="line.906"></a>
+<span class="sourceLineNo">907</span>  /**<a name="line.907"></a>
+<span class="sourceLineNo">908</span>   * Check if a server is known to be dead.  A server can be online,<a name="line.908"></a>
+<span class="sourceLineNo">909</span>   * or known to be dead, or unknown to this manager (i.e, not online,<a name="line.909"></a>
+<span class="sourceLineNo">910</span>   * not known to be dead either. it is simply not tracked by the<a name="line.910"></a>
+<span class="sourceLineNo">911</span>   * master any more, for example, a very old previous instance).<a name="line.911"></a>
+<span class="sourceLineNo">912</span>   */<a name="line.912"></a>
+<span class="sourceLineNo">913</span>  public synchronized boolean isServerDead(ServerName serverName) {<a name="line.913"></a>
+<span class="sourceLineNo">914</span>    return serverName == null || deadservers.isDeadServer(serverName);<a name="line.914"></a>
+<span class="sourceLineNo">915</span>  }<a name="line.915"></a>
+<span class="sourceLineNo">916</span><a name="line.916"></a>
+<span class="sourceLineNo">917</span>  public void shutdownCluster() {<a name="line.917"></a>
+<span class="sourceLineNo">918</span>    String statusStr = "Cluster shutdown requested of master=" + this.master.getServerName();<a name="line.918"></a>
+<span class="sourceLineNo">919</span>    LOG.info(statusStr);<a name="line.919"></a>
+<span class="sourceLineNo">920</span>    this.clusterShutdown.set(true);<a name="line.920"></a>
+<span class="sourceLineNo">921</span>    if (onlineServers.isEmpty()) {<a name="line.921"></a>
+<span class="sourceLineNo">922</span>      // we do not synchronize here so this may cause a double stop, but not a big deal<a name="line.922"></a>
+<span class="sourceLineNo">923</span>      master.stop("OnlineServer=0 right after cluster shutdown set");<a name="line.923"></a>
+<span class="sourceLineNo">924</span>    }<a name="line.924"></a>
+<span class="sourceLineNo">925</span>  }<a name="line.925"></a>
+<span class="sourceLineNo">926</span><a name="line.926"></a>
+<span class="sourceLineNo">927</span>  public boolean isClusterShutdown() {<a name="line.927"></a>
+<span class="sourceLineNo">928</span>    return this.clusterShutdown.get();<a name="line.928"></a>
+<span class="sourceLineNo">929</span>  }<a name="line.929"></a>
+<span class="sourceLineNo">930</span><a name="line.930"></a>
+<span class="sourceLineNo">931</span>  /**<a name="line.931"></a>
+<span class="sourceLineNo">932</span>   * start chore in ServerManager<a name="line.932"></a>
+<span class="sourceLineNo">933</span>   */<a name="line.933"></a>
+<span class="sourceLineNo">934</span>  public void startChore() {<a name="line.934"></a>
+<span class="sourceLineNo">935</span>    Configuration c = master.getConfiguration();<a name="line.935"></a>
+<span class="sourceLineNo">936</span>    if (persistFlushedSequenceId) {<a name="line.936"></a>
+<span class="sourceLineNo">937</span>      // when reach here, RegionStates should loaded, firstly, we call remove deleted regions<a name="line.937"></a>
+<span class="sourceLineNo">938</span>      removeDeletedRegionFromLoadedFlushedSequenceIds();<a name="line.938"></a>
+<span class="sourceLineNo">939</span>      int flushPeriod = c.getInt(FLUSHEDSEQUENCEID_FLUSHER_INTERVAL,<a name="line.939"></a>
+<span class="sourceLineNo">940</span>          FLUSHEDSEQUENCEID_FLUSHER_INTERVAL_DEFAULT);<a name="line.940"></a>
+<span class="sourceLineNo">941</span>      flushedSeqIdFlusher = new FlushedSequenceIdFlusher(<a name="line.941"></a>
+<span class="sourceLineNo">942</span>          "FlushedSequenceIdFlusher", flushPeriod);<a name="line.942"></a>
+<span class="sourceLineNo">943</span>      master.getChoreService().scheduleChore(flushedSeqIdFlusher);<a name="line.943"></a>
+<span class="sourceLineNo">944</span>    }<a name="line.944"></a>
+<span class="sourceLineNo">945</span>  }<a name="line.945"></a>
+<span class="sourceLineNo">946</span><a name="line.946"></a>
+<span class="sourceLineNo">947</span>  /**<a name="line.947"></a>
+<span class="sourceLineNo">948</span>   * Stop the ServerManager.<a name="line.948"></a>
+<span class="sourceLineNo">949</span>   */<a name="line.949"></a>
+<span class="sourceLineNo">950</span>  public void stop() {<a name="line.950"></a>
+<span class="sourceLineNo">951</span>    if (flushedSeqIdFlusher != null) {<a name="line.951"></a>
+<span class="sourceLineNo">952</span>      flushedSeqIdFlusher.cancel();<a name="line.952"></a>
+<span class="sourceLineNo">953</span>    }<a name="line.953"></a>
+<span class="sourceLineNo">954</span>    if (persistFlushedSequenceId) {<a name="line.954"></a>
+<span class="sourceLineNo">955</span>      try {<a name="line.955"></a>
+<span class="sourceLineNo">956</span>        persistRegionLastFlushedSequenceIds();<a name="line.956"></a>
+<span class="sourceLineNo">957</span>      } catch (IOException e) {<a name="line.957"></a>
+<span class="sourceLineNo">958</span>        LOG.warn("Failed to persist last flushed sequence id of regions"<a name="line.958"></a>
+<span class="sourceLineNo">959</span>            + " to file system", e);<a name="line.959"></a>
+<span class="sourceLineNo">960</span>      }<a name="line.960"></a>
+<span class="sourceLineNo">961</span>    }<a name="line.961"></a>
+<span class="sourceLineNo">962</span>  }<a name="line.962"></a>
+<span class="sourceLineNo">963</span><a name="line.963"></a>
+<span class="sourceLineNo">964</span>  /**<a name="line.964"></a>
+<span class="sourceLineNo">965</span>   * Creates a list of possible destinations for a region. It contains the online servers, but not<a name="line.965"></a>
+<span class="sourceLineNo">966</span>   *  the draining or dying servers.<a name="line.966"></a>
+<span class="sourceLineNo">967</span>   *  @param serversToExclude can be null if there is no server to exclude<a name="line.967"></a>
+<span class="sourceLineNo">968</span>   */<a name="line.968"></a>
+<span class="sourceLineNo">969</span>  public List&lt;ServerName&gt; createDestinationServersList(final List&lt;ServerName&gt; serversToExclude){<a name="line.969"></a>
+<span class="sourceLineNo">970</span>    final List&lt;ServerName&gt; destServers = getOnlineServersList();<a name="line.970"></a>
+<span class="sourceLineNo">971</span><a name="line.971"></a>
+<span class="sourceLineNo">972</span>    if (serversToExclude != null) {<a name="line.972"></a>
+<span class="sourceLineNo">973</span>      destServers.removeAll(serversToExclude);<a name="line.973"></a>
+<span class="sourceLineNo">974</span>    }<a name="line.974"></a>
+<span class="sourceLineNo">975</span><a name="line.975"></a>
+<span class="sourceLineNo">976</span>    // Loop through the draining server list and remove them from the server list<a name="line.976"></a>
+<span class="sourceLineNo">977</span>    final List&lt;ServerName&gt; drainingServersCopy = getDrainingServersList();<a name="line.977"></a>
+<span class="sourceLineNo">978</span>    destServers.removeAll(drainingServersCopy);<a name="line.978"></a>
 <span class="sourceLineNo">979</span><a name="line.979"></a>
-<span class="sourceLineNo">980</span>  /**<a name="line.980"></a>
-<span class="sourceLineNo">981</span>   * Calls {@link #createDestinationServersList} without server to exclude.<a name="line.981"></a>
-<span class="sourceLineNo">982</span>   */<a name="line.982"></a>
-<span class="sourceLineNo">983</span>  public List&lt;ServerName&gt; createDestinationServersList(){<a name="line.983"></a>
-<span class="sourceLineNo">984</span>    return createDestinationServersList(null);<a name="line.984"></a>
-<span class="sourceLineNo">985</span>  }<a name="line.985"></a>
-<span class="sourceLineNo">986</span><a name="line.986"></a>
-<span class="sourceLineNo">987</span>  /**<a name="line.987"></a>
-<span class="sourceLineNo">988</span>   * To clear any dead server with same host name and port of any online server<a name="line.988"></a>
-<span class="sourceLineNo">989</span>   */<a name="line.989"></a>
-<span class="sourceLineNo">990</span>  void clearDeadServersWithSameHostNameAndPortOfOnlineServer() {<a name="line.990"></a>
-<span class="sourceLineNo">991</span>    for (ServerName serverName : getOnlineServersList()) {<a name="line.991"></a>
-<span class="sourceLineNo">992</span>      deadservers.cleanAllPreviousInstances(serverName);<a name="line.992"></a>
-<span class="sourceLineNo">993</span>    }<a name="line.993"></a>
-<span class="sourceLineNo">994</span>  }<a name="line.994"></a>
-<span class="sourceLineNo">995</span><a name="line.995"></a>
-<span class="sourceLineNo">996</span>  /**<a name="line.996"></a>
-<span class="sourceLineNo">997</span>   * Called by delete table and similar to notify the ServerManager that a region was removed.<a name="line.997"></a>
-<span class="sourceLineNo">998</span>   */<a name="line.998"></a>
-<span class="sourceLineNo">999</span>  public void removeRegion(final RegionInfo regionInfo) {<a name="line.999"></a>
-<span class="sourceLineNo">1000</span>    final byte[] encodedName = regionInfo.getEncodedNameAsBytes();<a name="line.1000"></a>
-<span class="sourceLineNo">1001</span>    storeFlushedSequenceIdsByRegion.remove(encodedName);<a name="line.1001"></a>
-<span class="sourceLineNo">1002</span>    flushedSequenceIdByRegion.remove(encodedName);<a name="line.1002"></a>
-<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>  @VisibleForTesting<a name="line.1005"></a>
-<span class="sourceLineNo">1006</span>  public boolean isRegionInServerManagerStates(final RegionInfo hri) {<a name="line.1006"></a>
-<span class="sourceLineNo">1007</span>    final byte[] encodedName = hri.getEncodedNameAsBytes();<a name="line.1007"></a>
-<span class="sourceLineNo">1008</span>    return (storeFlushedSequenceIdsByRegion.containsKey(encodedName)<a name="line.1008"></a>
-<span class="sourceLineNo">1009</span>        || flushedSequenceIdByRegion.containsKey(encodedName));<a name="line.1009"></a>
-<span class="sourceLineNo">1010</span>  }<a name="line.1010"></a>
-<span class="sourceLineNo">1011</span><a name="line.1011"></a>
-<span class="sourceLineNo">1012</span>  /**<a name="line.1012"></a>
-<span class="sourceLineNo">1013</span>   * Called by delete table and similar to notify the ServerManager that a region was removed.<a name="line.1013"></a>
-<span class="sourceLineNo">1014</span>   */<a name="line.1014"></a>
-<span class="sourceLineNo">1015</span>  public void removeRegions(final List&lt;RegionInfo&gt; regions) {<a name="line.1015"></a>
-<span class="sourceLineNo">1016</span>    for (RegionInfo hri: regions) {<a name="line.1016"></a>
-<span class="sourceLineNo">1017</span>      removeRegion(hri);<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><a name="line.1020"></a>
-<span class="sourceLineNo">1021</span>  /**<a name="line.1021"></a>
-<span class="sourceLineNo">1022</span>   * May return 0 when server is not online.<a name="line.1022"></a>
-<span class="sourceLineNo">1023</span>   */<a name="line.1023"></a>
-<span class="sourceLineNo">1024</span>  public int getVersionNumber(ServerName serverName) {<a name="line.1024"></a>
-<span class="sourceLineNo">1025</span>    ServerMetrics serverMetrics = onlineServers.get(serverName);<a name="line.1025"></a>
-<span class="sourceLineNo">1026</span>    return serverMetrics != null ? serverMetrics.getVersionNumber() : 0;<a name="line.1026"></a>
-<span class="sourceLineNo">1027</span>  }<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>   * May return "0.0.0" when server is not online<a name="line.1030"></a>
-<span class="sourceLineNo">1031</span>   */<a name="line.1031"></a>
-<span class="sourceLineNo">1032</span>  public String getVersion(ServerName serverName) {<a name="line.1032"></a>
-<span class="sourceLineNo">1033</span>    ServerMetrics serverMetrics = onlineServers.get(serverName);<a name="line.1033"></a>
-<span class="sourceLineNo">1034</span>    return serverMetrics != null ? serverMetrics.getVersion() : "0.0.0";<a name="line.1034"></a>
-<span class="sourceLineNo">1035</span>  }<a name="line.1035"></a>
-<span class="sourceLineNo">1036</span><a name="line.1036"></a>
-<span class="sourceLineNo">1037</span>  public int getInfoPort(ServerName serverName) {<a name="line.1037"></a>
-<span class="sourceLineNo">1038</span>    ServerMetrics serverMetrics = onlineServers.get(serverName);<a name="line.1038"></a>
-<span class="sourceLineNo">1039</span>    return serverMetrics != null ? serverMetrics.getInfoServerPort() : 0;<a name="line.1039"></a>
-<span class="sourceLineNo">1040</span>  }<a name="line.1040"></a>
-<span class="sourceLineNo">1041</span><a name="line.1041"></a>
-<span class="sourceLineNo">1042</span>  /**<a name="line.1042"></a>
-<span class="sourceLineNo">1043</span>   * Persist last flushed sequence id of each region to HDFS<a name="line.1043"></a>
-<span class="sourceLineNo">1044</span>   * @throws IOException if persit to HDFS fails<a name="line.1044"></a>
-<span class="sourceLineNo">1045</span>   */<a name="line.1045"></a>
-<span class="sourceLineNo">1046</span>  private void persistRegionLastFlushedSequenceIds() throws IOException {<a name="line.1046"></a>
-<span class="sourceLineNo">1047</span>    if (isFlushSeqIdPersistInProgress) {<a name="line.1047"></a>
-<span class="sourceLineNo">1048</span>      return;<a name="line.1048"></a>
-<span class="sourceLineNo">1049</span>    }<a name="line.1049"></a>
-<span class="sourceLineNo">1050</span>    isFlushSeqIdPersistInProgress = true;<a name="line.1050"></a>
-<span class="sourceLineNo">1051</span>    try {<a name="line.1051"></a>
-<span class="sourceLineNo">1052</span>      Configuration conf = master.getConfiguration();<a name="line.1052"></a>
-<span class="sourceLineNo">1053</span>      Path rootDir = FSUtils.getRootDir(conf);<a name="line.1053"></a>
-<span class="sourceLineNo">1054</span>      Path lastFlushedSeqIdPath = new Path(rootDir, LAST_FLUSHED_SEQ_ID_FILE);<a name="line.1054"></a>
-<span class="sourceLineNo">1055</span>      FileSystem fs = FileSystem.get(conf);<a name="line.1055"></a>
-<span class="sourceLineNo">1056</span>      if (fs.exists(lastFlushedSeqIdPath)) {<a name="line.1056"></a>
-<span class="sourceLineNo">1057</span>        LOG.info("Rewriting .lastflushedseqids file at: "<a name="line.1057"></a>
-<span class="sourceLineNo">1058</span>            + lastFlushedSeqIdPath);<a name="line.1058"></a>
-<span class="sourceLineNo">1059</span>        if (!fs.delete(lastFlushedSeqIdPath, false)) {<a name="line.1059"></a>
-<span class="sourceLineNo">1060</span>          throw new IOException("Unable to remove existing "<a name="line.1060"></a>
-<span class="sourceLineNo">1061</span>              + lastFlushedSeqIdPath);<a name="line.1061"></a>
-<span class="sourceLineNo">1062</span>        }<a name="line.1062"></a>
-<span class="sourceLineNo">1063</span>      } else {<a name="line.1063"></a>
-<span class="sourceLineNo">1064</span>        LOG.info("Writing .lastflushedseqids file at: " + lastFlushedSeqIdPath);<a name="line.1064"></a>
-<span class="sourceLineNo">1065</span>      }<a name="line.1065"></a>
-<span class="sourceLineNo">1066</span>      FSDataOutputStream out = fs.create(lastFlushedSeqIdPath);<a name="line.1066"></a>
-<span class="sourceLineNo">1067</span>      FlushedSequenceId.Builder flushedSequenceIdBuilder =<a name="line.1067"></a>
-<span class="sourceLineNo">1068</span>          FlushedSequenceId.newBuilder();<a name="line.1068"></a>
-<span class="sourceLineNo">1069</span>      try {<a name="line.1069"></a>
-<span class="sourceLineNo">1070</span>        for (Entry&lt;byte[], Long&gt; entry : flushedSequenceIdByRegion.entrySet()) {<a name="line.1070"></a>
-<span class="sourceLineNo">1071</span>          FlushedRegionSequenceId.Builder flushedRegionSequenceIdBuilder =<a name="line.1071"></a>
-<span class="sourceLineNo">1072</span>              FlushedRegionSequenceId.newBuilder();<a name="line.1072"></a>
-<span class="sourceLineNo">1073</span>          flushedRegionSequenceIdBuilder.setRegionEncodedName(<a name="line.1073"></a>
-<span class="sourceLineNo">1074</span>              ByteString.copyFrom(entry.getKey()));<a name="line.1074"></a>
-<span class="sourceLineNo">1075</span>          flushedRegionSequenceIdBuilder.setSeqId(entry.getValue());<a name="line.1075"></a>
-<span class="sourceLineNo">1076</span>          ConcurrentNavigableMap&lt;byte[], Long&gt; storeSeqIds =<a name="line.1076"></a>
-<span class="sourceLineNo">1077</span>              storeFlushedSequenceIdsByRegion.get(entry.getKey());<a name="line.1077"></a>
-<span class="sourceLineNo">1078</span>          if (storeSeqIds != null) {<a name="line.1078"></a>
-<span class="sourceLineNo">1079</span>            for (Entry&lt;byte[], Long&gt; store : storeSeqIds.entrySet()) {<a name="line.1079"></a>
-<span class="sourceLineNo">1080</span>              FlushedStoreSequenceId.Builder flushedStoreSequenceIdBuilder =<a name="line.1080"></a>
-<span class="sourceLineNo">1081</span>                  FlushedStoreSequenceId.newBuilder();<a name="line.1081"></a>
-<span class="sourceLineNo">1082</span>              flushedStoreSequenceIdBuilder.setFamily(ByteString.copyFrom(store.getKey()));<a name="line.1082"></a>
-<span class="sourceLineNo">1083</span>              flushedStoreSequenceIdBuilder.setSeqId(store.getValue());<a name="line.1083"></a>
-<span class="sourceLineNo">1084</span>              flushedRegionSequenceIdBuilder.addStores(flushedStoreSequenceIdBuilder);<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>          flushedSequenceIdBuilder.addRegionSequenceId(flushedRegionSequenceIdBuilder);<a name="line.1087"></a>
-<span class="sourceLineNo">1088</span>        }<a name="line.1088"></a>
-<span class="sourceLineNo">1089</span>        flushedSequenceIdBuilder.build().writeDelimitedTo(out);<a name="line.1089"></a>
-<span class="sourceLineNo">1090</span>      } finally {<a name="line.1090"></a>
-<span class="sourceLineNo">1091</span>        if (out != null) {<a name="line.1091"></a>
-<span class="sourceLineNo">1092</span>          out.close();<a name="line.1092"></a>
-<span class="sourceLineNo">1093</span>        }<a name="line.1093"></a>
-<span class="sourceLineNo">1094</span>      }<a name="line.1094"></a>
-<span class="sourceLineNo">1095</span>    } finally {<a name="line.1095"></a>
-<span class="sourceLineNo">1096</span>      isFlushSeqIdPersistInProgress = false;<a name="line.1096"></a>
-<span class="sourceLineNo">1097</span>    }<a name="line.1097"></a>
-<span class="sourceLineNo">1098</span>  }<a name="line.1098"></a>
-<span class="sourceLineNo">1099</span><a name="line.1099"></a>
-<span class="sourceLineNo">1100</span>  /**<a name="line.1100"></a>
-<span class="sourceLineNo">1101</span>   * Load last flushed sequence id of each region from HDFS, if persisted<a name="line.1101"></a>
-<span class="sourceLineNo">1102</span>   */<a name="line.1102"></a>
-<span class="sourceLineNo">1103</span>  public void loadLastFlushedSequenceIds() throws IOException {<a name="line.1103"></a>
-<span class="sourceLineNo">1104</span>    if (!persistFlushedSequenceId) {<a name="line.1104"></a>
-<span class="sourceLineNo">1105</span>      return;<a name="line.1105"></a>
-<span class="sourceLineNo">1106</span>    }<a name="line.1106"></a>
-<span class="sourceLineNo">1107</span>    Configuration conf = master.getConfiguration();<a name="line.1107"></a>
-<span class="sourceLineNo">1108</span>    Path rootDir = FSUtils.getRootDir(conf);<a name="line.1108"></a>
-<span class="sourceLineNo">1109</span>    Path lastFlushedSeqIdPath = new Path(rootDir, LAST_FLUSHED_SEQ_ID_FILE);<a name="line.1109"></a>
-<span class="sourceLineNo">1110</span>    FileSystem fs = FileSystem.get(conf);<a name="line.1110"></a>
-<span class="sourceLineNo">1111</span>    if (!fs.exists(lastFlushedSeqIdPath)) {<a name="line.1111"></a>
-<span class="sourceLineNo">1112</span>      LOG.info("No .lastflushedseqids found at" + lastFlushedSeqIdPath<a name="line.1112"></a>
-<span class="sourceLineNo">1113</span>          + " will record last flushed sequence id"<a name="line.1113"></a>
-<span class="sourceLineNo">1114</span>          + " for regions by regionserver report all over again");<a name="line.1114"></a>
-<span class="sourceLineNo">1115</span>      return;<a name="line.1115"></a>
-<span class="sourceLineNo">1116</span>    } else {<a name="line.1116"></a>
-<span class="sourceLineNo">1117</span>      LOG.info("begin to load .lastflushedseqids at " + lastFlushedSeqIdPath);<a name="line.1117"></a>
-<span class="sourceLineNo">1118</span>    }<a name="line.1118"></a>
-<span class="sourceLineNo">1119</span>    FSDataInputStream in = fs.open(lastFlushedSeqIdPath);<a name="line.1119"></a>
-<span class="sourceLineNo">1120</span>    try {<a name="line.1120"></a>
-<span class="sourceLineNo">1121</span>      FlushedSequenceId flushedSequenceId =<a name="line.1121"></a>
-<span class="sourceLineNo">1122</span>          FlushedSequenceId.parseDelimitedFrom(in);<a name="line.1122"></a>
-<span class="sourceLineNo">1123</span>      for (FlushedRegionSequenceId flushedRegionSequenceId : flushedSequenceId<a name="line.1123"></a>
-<span class="sourceLineNo">1124</span>          .getRegionSequenceIdList()) {<a name="line.1124"></a>
-<span class="sourceLineNo">1125</span>        byte[] encodedRegionName = flushedRegionSequenceId<a name="line.1125"></a>
-<span class="sourceLineNo">1126</span>            .getRegionEncodedName().toByteArray();<a name="line.1126"></a>
-<span class="sourceLineNo">1127</span>        flushedSequenceIdByRegion<a name="line.1127"></a>
-<span class="sourceLineNo">1128</span>            .putIfAbsent(encodedRegionName, flushedRegionSequenceId.getSeqId());<a name="line.1128"></a>
-<span class="sourceLineNo">1129</span>        if (flushedRegionSequenceId.getStoresList() != null<a name="line.1129"></a>
-<span class="sourceLineNo">1130</span>            &amp;&amp; flushedRegionSequenceId.getStoresList().size() != 0) {<a name="line.1130"></a>
-<span class="sourceLineNo">1131</span>          ConcurrentNavigableMap&lt;byte[], Long&gt; storeFlushedSequenceId =<a name="line.1131"></a>
-<span class="sourceLineNo">1132</span>              computeIfAbsent(storeFlushedSequenceIdsByRegion, encodedRegionName,<a name="line.1132"></a>
-<span class="sourceLineNo">1133</span>                () -&gt; new ConcurrentSkipListMap&lt;&gt;(Bytes.BYTES_COMPARATOR));<a name="line.1133"></a>
-<span class="sourceLineNo">1134</span>          for (FlushedStoreSequenceId flushedStoreSequenceId : flushedRegionSequenceId<a name="line.1134"></a>
-<span class="sourceLineNo">1135</span>              .getStoresList()) {<a name="line.1135"></a>
-<span class="sourceLineNo">1136</span>            storeFlushedSequenceId<a name="line.1136"></a>
-<span class="sourceLineNo">1137</span>                .put(flushedStoreSequenceId.getFamily().toByteArray(),<a name="line.1137"></a>
-<span class="sourceLineNo">1138</span>                    flushedStoreSequenceId.getSeqId());<a name="line.1138"></a>
-<span class="sourceLineNo">1139</span>          }<a name="line.1139"></a>
-<span class="sourceLineNo">1140</span>        }<a name="line.1140"></a>
-<span class="sourceLineNo">1141</span>      }<a name="line.1141"></a>
-<span class="sourceLineNo">1142</span>    } finally {<a name="line.1142"></a>
-<span class="sourceLineNo">1143</span>      in.close();<a name="line.1143"></a>
-<span class="sourceLineNo">1144</span>    }<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>   * Regions may have been removed between latest persist of FlushedSequenceIds<a name="line.1148"></a>
-<span class="sourceLineNo">1149</span>   * and master abort. So after loading FlushedSequenceIds from file, and after<a name="line.1149"></a>
-<span class="sourceLineNo">1150</span>   * meta loaded, we need to remove the deleted region according to RegionStates.<a name="line.1150"></a>
-<span class="sourceLineNo">1151</span>   */<a name="line.1151"></a>
-<span class="sourceLineNo">1152</span>  public void removeDeletedRegionFromLoadedFlushedSequenceIds() {<a name="line.1152"></a>
-<span class="sourceLineNo">1153</span>    RegionStates regionStates = master.getAssignmentManager().getRegionStates();<a name="line.1153"></a>
-<span class="sourceLineNo">1154</span>    Iterator&lt;byte[]&gt; it = flushedSequenceIdByRegion.keySet().iterator();<a name="line.1154"></a>
-<span class="sourceLineNo">1155</span>    while(it.hasNext()) {<a name="line.1155"></a>
-<span class="sourceLineNo">1156</span>      byte[] regionEncodedName = it.next();<a name="line.1156"></a>
-<span class="sourceLineNo">1157</span>      if (regionStates.getRegionState(Bytes.toStringBinary(regionEncodedName)) == null) {<a name="line.1157"></a>
-<span class="sourceLineNo">1158</span>        it.remove();<a name="line.1158"></a>
-<span class="sourceLineNo">1159</span>        storeFlushedSequenceIdsByRegion.remove(regionEncodedName);<a name="line.1159"></a>
-<span class="sourceLineNo">1160</span>      }<a name="line.1160"></a>
-<span class="sourceLineNo">1161</span>    }<a name="line.1161"></a>
-<span class="sourceLineNo">1162</span>  }<a name="line.1162"></a>
-<span class="sourceLineNo">1163</span><a name="line.1163"></a>
-<span class="sourceLineNo">1164</span>  private class FlushedSequenceIdFlusher extends ScheduledChore {<a name="line.1164"></a>
-<span class="sourceLineNo">1165</span><a name="line.1165"></a>
-<span class="sourceLineNo">1166</span>    public FlushedSequenceIdFlusher(String name, int p) {<a name="line.1166"></a>
-<span class="sourceLineNo">1167</span>      super(name, master, p, 60 * 1000); //delay one minute before first execute<a name="line.1167"></a>
-<span class="sourceLineNo">1168</span>    }<a name="line.1168"></a>
-<span class="sourceLineNo">1169</span><a name="line.1169"></a>
-<span class="sourceLineNo">1170</span>    @Override<a name="line.1170"></a>
-<span class="sourceLineNo">1171</span>    protected void chore() {<a name="line.1171"></a>
-<span class="sourceLineNo">1172</span>      try {<a name="line.1172"></a>
-<span class="sourceLineNo">1173</span>        persistRegionLastFlushedSequenceIds();<a name="line.1173"></a>
-<span class="sourceLineNo">1174</span>      } catch (IOException e) {<a name="line.1174"></a>
-<span class="sourceLineNo">1175</span>        LOG.debug("Failed to persist last flushed sequence id of regions"<a name="line.1175"></a>
-<span class="sourceLineNo">1176</span>            + " to file system", e);<a name="line.1176"></a>
-<span class="sourceLineNo">1177</span>      }<a name="line.1177"></a>
-<span class="sourceLineNo">1178</span>    }<a name="line.1178"></a>
-<span class="sourceLineNo">1179</span>  }<a name="line.1179"></a>
-<span class="sourceLineNo">1180</span>}<a name="line.1180"></a>
+<span class="sourceLineNo">980</span>    return destServers;<a name="line.980"></a>
+<span class="sourceLineNo">981</span>  }<a name="line.981"></a>
+<span class="sourceLineNo">982</span><a name="line.982"></a>
+<span class="sourceLineNo">983</span>  /**<a name="line.983"></a>
+<span class="sourceLineNo">984</span>   * Calls {@link #createDestinationServersList} without server to exclude.<a name="line.984"></a>
+<span class="sourceLineNo">985</span>   */<a name="line.985"></a>
+<span class="sourceLineNo">986</span>  public List&lt;ServerName&gt; createDestinationServersList(){<a name="line.986"></a>
+<span class="sourceLineNo">987</span>    return createDestinationServersList(null);<a name="line.987"></a>
+<span class="sourceLineNo">988</span>  }<a name="line.988"></a>
+<span class="sourceLineNo">989</span><a name="line.989"></a>
+<span class="sourceLineNo">990</span>  /**<a name="line.990"></a>
+<span class="sourceLineNo">991</span>   * To clear any dead server with same host name and port of any online server<a name="line.991"></a>
+<span class="sourceLineNo">992</span>   */<a name="line.992"></a>
+<span class="sourceLineNo">993</span>  void clearDeadServersWithSameHostNameAndPortOfOnlineServer() {<a name="line.993"></a>
+<span class="sourceLineNo">994</span>    for (ServerName serverName : getOnlineServersList()) {<a name="line.994"></a>
+<span class="sourceLineNo">995</span>      deadservers.cleanAllPreviousInstances(serverName);<a name="line.995"></a>
+<span class="sourceLineNo">996</span>    }<a name="line.996"></a>
+<span class="sourceLineNo">997</span>  }<a name="line.997"></a>
+<span class="sourceLineNo">998</span><a name="line.998"></a>
+<span class="sourceLineNo">999</span>  /**<a name="line.999"></a>
+<span class="sourceLineNo">1000</span>   * Called by delete table and similar to notify the ServerManager that a region was removed.<a name="line.1000"></a>
+<span class="sourceLineNo">1001</span>   */<a name="line.1001"></a>
+<span class="sourceLineNo">1002</span>  public void removeRegion(final RegionInfo regionInfo) {<a name="line.1002"></a>
+<span class="sourceLineNo">1003</span>    final byte[] encodedName = regionInfo.getEncodedNameAsBytes();<a name="line.1003"></a>
+<span class="sourceLineNo">1004</span>    storeFlushedSequenceIdsByRegion.remove(encodedName);<a name="line.1004"></a>
+<span class="sourceLineNo">1005</span>    flushedSequenceIdByRegion.remove(encodedName);<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>  @VisibleForTesting<a name="line.1008"></a>
+<span class="sourceLineNo">1009</span>  public boolean isRegionInServerManagerStates(final RegionInfo hri) {<a name="line.1009"></a>
+<span class="sourceLineNo">1010</span>    final byte[] encodedName = hri.getEncodedNameAsBytes();<a name="line.1010"></a>
+<span class="sourceLineNo">1011</span>    return (storeFlushedSequenceIdsByRegion.containsKey(encodedName)<a name="line.1011"></a>
+<span class="sourceLineNo">1012</span>        || flushedSequenceIdByRegion.containsKey(encodedName));<a name="line.1012"></a>
+<span class="sourceLineNo">1013</span>  }<a name="line.1013"></a>
+<span class="sourceLineNo">1014</span><a name="line.1014"></a>
+<span class="sourceLineNo">1015</span>  /**<a name="line.1015"></a>
+<span class="sourceLineNo">1016</span>   * Called by delete table and similar to notify the ServerManager that a region was removed.<a name="line.1016"></a>
+<span class="sourceLineNo">1017</span>   */<a name="line.1017"></a>
+<span class="sourceLineNo">1018</span>  public void removeRegions(final List&lt;RegionInfo&gt; regions) {<a name="line.1018"></a>
+<span class="sourceLineNo">1019</span>    for (RegionInfo hri: regions) {<a name="line.1019"></a>
+<span class="sourceLineNo">1020</span>      removeRegion(hri);<a name="line.1020"></a>
+<span class="sourceLineNo">1021</span>    }<a name="line.1021"></a>
+<span class="sourceLineNo">1022</span>  }<a name="line.1022"></a>
+<span class="sourceLineNo">1023</span><a name="line.1023"></a>
+<span class="sourceLineNo">1024</span>  /**<a name="line.1024"></a>
+<span class="sourceLineNo">1025</span>   * May return 0 when server is not online.<a name="line.1025"></a>
+<span class="sourceLineNo">1026</span>   */<a name="line.1026"></a>
+<span class="sourceLineNo">1027</span>  public int getVersionNumber(ServerName serverName) {<a name="line.1027"></a>
+<span class="sourceLineNo">1028</span>    ServerMetrics serverMetrics = onlineServers.get(serverName);<a name="line.1028"></a>
+<span class="sourceLineNo">1029</span>    return serverMetrics != null ? serverMetrics.getVersionNumber() : 0;<a name="line.1029"></a>
+<span class="sourceLineNo">1030</span>  }<a name="line.1030"></a>
+<span class="sourceLineNo">1031</span><a name="line.1031"></a>
+<span class="sourceLineNo">1032</span>  /**<a name="line.1032"></a>
+<span class="sourceLineNo">1033</span>   * May return "0.0.0" when server is not online<a name="line.1033"></a>
+<span class="sourceLineNo">1034</span>   */<a name="line.1034"></a>
+<span class="sourceLineNo">1035</span>  public String getVersion(ServerName serverName) {<a name="line.1035"></a>
+<span class="sourceLineNo">1036</span>    ServerMetrics serverMetrics = onlineServers.get(serverName);<a name="line.1036"></a>
+<span class="sourceLineNo">1037</span>    return serverMetrics != null ? serverMetrics.getVersion() : "0.0.0";<a name="line.1037"></a>
+<span class="sourceLineNo">1038</span>  }<a name="line.1038"></a>
+<span class="sourceLineNo">1039</span><a name="line.1039"></a>
+<span class="sourceLineNo">1040</span>  public int getInfoPort(ServerName serverName) {<a name="line.1040"></a>
+<span class="sourceLineNo">1041</span>    ServerMetrics serverMetrics = onlineServers.get(serverName);<a name="line.1041"></a>
+<span class="sourceLineNo">1042</span>    return serverMetrics != null ? serverMetrics.getInfoServerPort() : 0;<a name="line.1042"></a>
+<span class="sourceLineNo">1043</span>  }<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>   * Persist last flushed sequence id of each region to HDFS<a name="line.1046"></a>
+<span class="sourceLineNo">1047</span>   * @throws IOException if persit to HDFS fails<a name="line.1047"></a>
+<span class="sourceLineNo">1048</span>   */<a name="line.1048"></a>
+<span class="sourceLineNo">1049</span>  private void persistRegionLastFlushedSequenceIds() throws IOException {<a name="line.1049"></a>
+<span class="sourceLineNo">1050</span>    if (isFlushSeqIdPersistInProgress) {<a name="line.1050"></a>
+<span class="sourceLineNo">1051</span>      return;<a name="line.1051"></a>
+<span class="sourceLineNo">1052</span>    }<a name="line.1052"></a>
+<span class="sourceLineNo">1053</span>    isFlushSeqIdPersistInProgress = true;<a name="line.1053"></a>
+<span class="sourceLineNo">1054</span>    try {<a name="line.1054"></a>
+<span class="sourceLineNo">1055</span>      Configuration conf = master.getConfiguration();<a name="line.1055"></a>
+<span class="sourceLineNo">1056</span>      Path rootDir = FSUtils.getRootDir(conf);<a name="line.1056"></a>
+<span class="sourceLineNo">1057</span>      Path lastFlushedSeqIdPath = new Path(rootDir, LAST_FLUSHED_SEQ_ID_FILE);<a name="line.1057"></a>
+<span class="sourceLineNo">1058</span>      FileSystem fs = FileSystem.get(conf);<a name="line.1058"></a>
+<span class="sourceLineNo">1059</span>      if (fs.exists(lastFlushedSeqIdPath)) {<a name="line.1059"></a>
+<span class="sourceLineNo">1060</span>        LOG.info("Rewriting .lastflushedseqids file at: "<a name="line.1060"></a>
+<span class="sourceLineNo">1061</span>            + lastFlushedSeqIdPath);<a name="line.1061"></a>
+<span class="sourceLineNo">1062</span>        if (!fs.delete(lastFlushedSeqIdPath, false)) {<a name="line.1062"></a>
+<span class="sourceLineNo">1063</span>          throw new IOException("Unable to remove existing "<a name="line.1063"></a>
+<span class="sourceLineNo">1064</span>              + lastFlushedSeqIdPath);<a name="line.1064"></a>
+<span class="sourceLineNo">1065</span>        }<a name="line.1065"></a>
+<span class="sourceLineNo">1066</span>      } else {<a name="line.1066"></a>
+<span class="sourceLineNo">1067</span>        LOG.info("Writing .lastflushedseqids file at: " + lastFlushedSeqIdPath);<a name="line.1067"></a>
+<span class="sourceLineNo">1068</span>      }<a name="line.1068"></a>
+<span class="sourceLineNo">1069</span>      FSDataOutputStream out = fs.create(lastFlushedSeqIdPath);<a name="line.1069"></a>
+<span class="sourceLineNo">1070</span>      FlushedSequenceId.Builder flushedSequenceIdBuilder =<a name="line.1070"></a>
+<span class="sourceLineNo">1071</span>          FlushedSequenceId.newBuilder();<a name="line.1071"></a>
+<span class="sourceLineNo">1072</span>      try {<a name="line.1072"></a>
+<span class="sourceLineNo">1073</span>        for (Entry&lt;byte[], Long&gt; entry : flushedSequenceIdByRegion.entrySet()) {<a name="line.1073"></a>
+<span class="sourceLineNo">1074</span>          FlushedRegionSequenceId.Builder flushedRegionSequenceIdBuilder =<a name="line.1074"></a>
+<span class="sourceLineNo">1075</span>              FlushedRegionSequenceId.newBuilder();<a name="line.1075"></a>
+<span class="sourceLineNo">1076</span>          flushedRegionSequenceIdBuilder.setRegionEncodedName(<a name="line.1076"></a>
+<span class="sourceLineNo">1077</span>              ByteString.copyFrom(entry.getKey()));<a name="line.1077"></a>
+<span class="sourceLineNo">1078</span>          flushedRegionSequenceIdBuilder.setSeqId(entry.getValue());<a name="line.1078"></a>
+<span class="sourceLineNo">1079</span>          ConcurrentNavigableMap&lt;byte[], Long&gt; storeSeqIds =<a name="line.1079"></a>
+<span class="sourceLineNo">1080</span>              storeFlushedSequenceIdsByRegion.get(entry.getKey());<a name="line.1080"></a>
+<span class="sourceLineNo">1081</span>          if (storeSeqIds != null) {<a name="line.1081"></a>
+<span class="sourceLineNo">1082</span>            for (Entry&lt;byte[], Long&gt; store : storeSeqIds.entrySet()) {<a name="line.1082"></a>
+<span class="sourceLineNo">1083</span>              FlushedStoreSequenceId.Builder flushedStoreSequenceIdBuilder =<a name="line.1083"></a>
+<span class="sourceLineNo">1084</span>                  FlushedStoreSequenceId.newBuilder();<a name="line.1084"></a>
+<span class="sourceLineNo">1085</span>              flushedStoreSequenceIdBuilder.setFamily(ByteString.copyFrom(store.getKey()));<a name="line.1085"></a>
+<span class="sourceLineNo">1086</span>              flushedStoreSequenceIdBuilder.setSeqId(store.getValue());<a name="line.1086"></a>
+<span class="sourceLineNo">1087</span>              flushedRegionSequenceIdBuilder.addStores(flushedStoreSequenceIdBuilder);<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>          flushedSequenceIdBuilder.addRegionSequenceId(flushedRegionSequenceIdBuilder);<a name="line.1090"></a>
+<span class="sourceLineNo">1091</span>        }<a name="line.1091"></a>
+<span class="sourceLineNo">1092</span>        flushedSequenceIdBuilder.build().writeDelimitedTo(out);<a name="line.1092"></a>
+<span class="sourceLineNo">1093</span>      } finally {<a name="line.1093"></a>
+<span class="sourceLineNo">1094</span>        if (out != null) {<a name="line.1094"></a>
+<span class="sourceLineNo">1095</span>          out.close();<a name="line.1095"></a>
+<span class="sourceLineNo">1096</span>        }<a name="line.1096"></a>
+<span class="sourceLineNo">1097</span>      }<a name="line.1097"></a>
+<span class="sourceLineNo">1098</span>    } finally {<a name="line.1098"></a>
+<span class="sourceLineNo">1099</span>      isFlushSeqIdPersistInProgress = false;<a name="line.1099"></a>
+<span class="sourceLineNo">1100</span>    }<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>  /**<a name="line.1103"></a>
+<span class="sourceLineNo">1104</span>   * Load last flushed sequence id of each region from HDFS, if persisted<a name="line.1104"></a>
+<span class="sourceLineNo">1105</span>   */<a name="line.1105"></a>
+<span class="sourceLineNo">1106</span>  public void loadLastFlushedSequenceIds() throws IOException {<a name="line.1106"></a>
+<span class="sourceLineNo">1107</span>    if (!persistFlushedSequenceId) {<a name="line.1107"></a>
+<span class="sourceLineNo">1108</span>      return;<a name="line.1108"></a>
+<span class="sourceLineNo">1109</span>    }<a name="line.1109"></a>
+<span class="sourceLineNo">1110</span>    Configuration conf = master.getConfiguration();<a name="line.1110"></a>
+<span class="sourceLineNo">1111</span>    Path rootDir = FSUtils.getRootDir(conf);<a name="line.1111"></a>
+<span class="sourceLineNo">1112</span>    Path lastFlushedSeqIdPath = new Path(rootDir, LAST_FLUSHED_SEQ_ID_FILE);<a name="line.1112"></a>
+<span class="sourceLineNo">1113</span>    FileSystem fs = FileSystem.get(conf);<a name="line.1113"></a>
+<span class="sourceLineNo">1114</span>    if (!fs.exists(lastFlushedSeqIdPath)) {<a name="line.1114"></a>
+<span class="sourceLineNo">1115</span>      LOG.info("No .lastflushedseqids found at" + lastFlushedSeqIdPath<a name="line.1115"></a>
+<span class="sourceLineNo">1116</span>          + " will record last flushed sequence id"<a name="line.1116"></a>
+<span class="sourceLineNo">1117</span>          + " for regions by regionserver report all over again");<a name="line.1117"></a>
+<span class="sourceLineNo">1118</span>      return;<a name="line.1118"></a>
+<span class="sourceLineNo">1119</span>    } else {<a name="line.1119"></a>
+<span class="sourceLineNo">1120</span>      LOG.info("begin to load .lastflushedseqids at " + lastFlushedSeqIdPath);<a name="line.1120"></a>
+<span class="sourceLineNo">1121</span>    }<a name="line.1121"></a>
+<span class="sourceLineNo">1122</span>    FSDataInputStream in = fs.open(lastFlushedSeqIdPath);<a name="line.1122"></a>
+<span class="sourceLineNo">1123</span>    try {<a name="line.1123"></a>
+<span class="sourceLineNo">1124</span>      FlushedSequenceId flushedSequenceId =<a name="line.1124"></a>
+<span class="sourceLineNo">1125</span>          FlushedSequenceId.parseDelimitedFrom(in);<a name="line.1125"></a>
+<span class="sourceLineNo">1126</span>      for (FlushedRegionSequenceId flushedRegionSequenceId : flushedSequenceId<a name="line.1126"></a>
+<span class="sourceLineNo">1127</span>          .getRegionSequenceIdList()) {<a name="line.1127"></a>
+<span class="sourceLineNo">1128</span>        byte[] encodedRegionName = flushedRegionSequenceId<a name="line.1128"></a>
+<span class="sourceLineNo">1129</span>            .getRegionEncodedName().toByteArray();<a name="line.1129"></a>
+<span class="sourceLineNo">1130</span>        flushedSequenceIdByRegion<a name="line.1130"></a>
+<span class="sourceLineNo">1131</span>            .putIfAbsent(encodedRegionName, flushedRegionSequenceId.getSeqId());<a name="line.1131"></a>
+<span class="sourceLineNo">1132</span>        if (flushedRegionSequenceId.getStoresList() != null<a name="line.1132"></a>
+<span class="sourceLineNo">1133</span>            &amp;&amp; flushedRegionSequenceId.getStoresList().size() != 0) {<a name="line.1133"></a>
+<span class="sourceLineNo">1134</span>          ConcurrentNavigableMap&lt;byte[], Long&gt; storeFlushedSequenceId =<a name="line.1134"></a>
+<span class="sourceLineNo">1135</span>              computeIfAbsent(storeFlushedSequenceIdsByRegion, encodedRegionName,<a name="line.1135"></a>
+<span class="sourceLineNo">1136</span>                () -&gt; new ConcurrentSkipListMap&lt;&gt;(Bytes.BYTES_COMPARATOR));<a name="line.1136"></a>
+<span class="sourceLineNo">1137</span>          for (FlushedStoreSequenceId flushedStoreSequenceId : flushedRegionSequenceId<a name="line.1137"></a>
+<span class="sourceLineNo">1138</span>              .getStoresList()) {<a name="line.1138"></a>
+<span class="sourceLineNo">1139</span>            storeFlushedSequenceId<a name="line.1139"></a>
+<span class="sourceLineNo">1140</span>                .put(flushedStoreSequenceId.getFamily().toByteArray(),<a name="line.1140"></a>
+<span class="sourceLineNo">1141</span>                    flushedStoreSequenceId.getSeqId());<a name="line.1141"></a>
+<span class="sourceLineNo">1142</span>          }<a name="line.1142"></a>
+<span class="sourceLineNo">1143</span>        }<a name="line.1143"></a>
+<span class="sourceLineNo">1144</span>      }<a name="line.1144"></a>
+<span class="sourceLineNo">1145</span>    } finally {<a name="line.1145"></a>
+<span class="sourceLineNo">1146</span>      in.close();<a name="line.1146"></a>
+<span class="sourceLineNo">1147</span>    }<a name="line.1147"></a>
+<span class="sourceLineNo">1148</span>  }<a name="line.1148"></a>
+<span class="sourceLineNo">1149</span><a name="line.1149"></a>
+<span class="sourceLineNo">1150</span>  /**<a name="line.1150"></a>
+<span class="sourceLineNo">1151</span>   * Regions may have been removed between latest persist of FlushedSequenceIds<a name="line.1151"></a>
+<span class="sourceLineNo">1152</span>   * and master abort. So after loading FlushedSequenceIds from file, and after<a name="line.1152"></a>
+<span class="sourceLineNo">1153</span>   * meta loaded, we need to remove the deleted region according to RegionStates.<a name="line.1153"></a>
+<span class="sourceLineNo">1154</span>   */<a name="line.1154"></a>
+<span class="sourceLineNo">1155</span>  public void removeDeletedRegionFromLoadedFlushedSequenceIds() {<a name="line.1155"></a>
+<span class="sourceLineNo">1156</span>    RegionStates regionStates = master.getAssignmentManager().getRegionStates();<a name="line.1156"></a>
+<span class="sourceLineNo">1157</span>    Iterator&lt;byte[]&gt; it = flushedSequenceIdByRegion.keySet().iterator();<a name="line.1157"></a>
+<span class="sourceLineNo">1158</span>    while(it.hasNext()) {<a name="line.1158"></a>
+<span class="sourceLineNo">1159</span>      byte[] regionEncodedName = it.next();<a name="line.1159"></a>
+<span class="sourceLineNo">1160</span>      if (regionStates.getRegionState(Bytes.toStringBinary(regionEncodedName)) == null) {<a name="line.1160"></a>
+<span class="sourceLineNo">1161</span>        it.remove();<a name="line.1161"></a>
+<span class="sourceLineNo">1162</span>        storeFlushedSequenceIdsByRegion.remove(regionEncodedName);<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>  private class FlushedSequenceIdFlusher extends ScheduledChore {<a name="line.1167"></a>
+<span class="sourceLineNo">1168</span><a name="line.1168"></a>
+<span class="sourceLineNo">1169</span>    public FlushedSequenceIdFlusher(String name, int p) {<a name="line.1169"></a>
+<span class="sourceLineNo">1170</span>      super(name, master, p, 60 * 1000); //delay one minute before first execute<a name="line.1170"></a>
+<span class="sourceLineNo">1171</span>    }<a name="line.1171"></a>
+<span class="sourceLineNo">1172</span><a name="line.1172"></a>
+<span class="sourceLineNo">1173</span>    @Override<a name="line.1173"></a>
+<span class="sourceLineNo">1174</span>    protected void chore() {<a name="line.1174"></a>
+<span class="sourceLineNo">1175</span>      try {<a name="line.1175"></a>
+<span class="sourceLineNo">1176</span>        persistRegionLastFlushedSequenceIds();<a name="line.1176"></a>
+<span class="sourceLineNo">1177</span>      } catch (IOException e) {<a name="line.1177"></a>
+<span class="sourceLineNo">1178</span>        LOG.debug("Failed to persist last flushed sequence id of regions"<a name="line.1178"></a>
+<span class="sourceLineNo">1179</span>            + " to file system", e);<a name="line.1179"></a>
+<span class="sourceLineNo">1180</span>      }<a name="line.1180"></a>
+<span class="sourceLineNo">1181</span>    }<a name="line.1181"></a>
+<span class="sourceLineNo">1182</span>  }<a name="line.1182"></a>
+<span class="sourceLineNo">1183</span>}<a name="line.1183"></a>
 
 
 


[45/46] hbase-site git commit: Published site at 05d22ed960204183fbd9bd16f1dbca6410ccde76.

Posted by gi...@apache.org.
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/3649682c/apache_hbase_reference_guide.pdf
----------------------------------------------------------------------
diff --git a/apache_hbase_reference_guide.pdf b/apache_hbase_reference_guide.pdf
index 64eba67..59c18b8 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:20181018143307+00'00')
-/CreationDate (D:20181018145026+00'00')
+/ModDate (D:20181019143259+00'00')
+/CreationDate (D:20181019144927+00'00')
 >>
 endobj
 2 0 obj
 << /Type /Catalog
 /Pages 3 0 R
 /Names 28 0 R
-/Outlines 5009 0 R
-/PageLabels 5260 0 R
+/Outlines 5012 0 R
+/PageLabels 5263 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 787
-/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 26 0 R 46 0 R 49 0 R 52 0 R 56 0 R 63 0 R 65 0 R 69 0 R 71 0 R 73 0 R 80 0 R 83 0 R 85 0 R 91 0 R 94 0 R 96 0 R 98 0 R 105 0 R 112 0 R 117 0 R 119 0 R 135 0 R 140 0 R 148 0 R 157 0 R 165 0 R 169 0 R 178 0 R 189 0 R 193 0 R 195 0 R 199 0 R 208 0 R 217 0 R 225 0 R 234 0 R 239 0 R 248 0 R 256 0 R 265 0 R 278 0 R 285 0 R 295 0 R 303 0 R 311 0 R 318 0 R 327 0 R 333 0 R 339 0 R 346 0 R 354 0 R 362 0 R 373 0 R 386 0 R 394 0 R 401 0 R 409 0 R 417 0 R 426 0 R 436 0 R 444 0 R 451 0 R 458 0 R 467 0 R 480 0 R 488 0 R 495 0 R 503 0 R 511 0 R 520 0 R 525 0 R 531 0 R 536 0 R 540 0 R 556 0 R 567 0 R 571 0 R 586 0 R 591 0 R 596 0 R 598 0 R 600 0 R 603 0 R 605 0 R 607 0 R 615 0 R 621 0 R 624 0 R 628 0 R 637 0 R 648 0 R 656 0 R 660 0 R 664 0 R 666 0 R 676 0 R 691 0 R 698 0 R 709 0 R 719 0 R 730 0 R 742 0 R 762 0 R 777 0 R 784 0 R 791 0 R 797 0 R 800 0 R 804 0 R 808 0 R 811 0 R 814 0 R 816 0 R 819 0 R 823 0 R 825 0 R 829 0 R 835 0 R 840 0 R 
 844 0 R 847 0 R 853 0 R 855 0 R 859 0 R 867 0 R 869 0 R 872 0 R 875 0 R 878 0 R 881 0 R 895 0 R 903 0 R 914 0 R 925 0 R 931 0 R 941 0 R 952 0 R 955 0 R 959 0 R 962 0 R 967 0 R 976 0 R 984 0 R 989 0 R 993 0 R 998 0 R 1002 0 R 1004 0 R 1019 0 R 1030 0 R 1035 0 R 1042 0 R 1045 0 R 1053 0 R 1061 0 R 1066 0 R 1071 0 R 1076 0 R 1078 0 R 1080 0 R 1082 0 R 1092 0 R 1100 0 R 1104 0 R 1111 0 R 1118 0 R 1126 0 R 1130 0 R 1136 0 R 1141 0 R 1149 0 R 1153 0 R 1158 0 R 1160 0 R 1166 0 R 1174 0 R 1180 0 R 1187 0 R 1198 0 R 1202 0 R 1204 0 R 1206 0 R 1210 0 R 1213 0 R 1218 0 R 1221 0 R 1233 0 R 1237 0 R 1243 0 R 1251 0 R 1256 0 R 1260 0 R 1264 0 R 1266 0 R 1269 0 R 1272 0 R 1275 0 R 1279 0 R 1283 0 R 1287 0 R 1292 0 R 1296 0 R 1299 0 R 1301 0 R 1311 0 R 1313 0 R 1318 0 R 1331 0 R 1335 0 R 1341 0 R 1343 0 R 1354 0 R 1357 0 R 1363 0 R 1371 0 R 1374 0 R 1381 0 R 1388 0 R 1391 0 R 1393 0 R 1402 0 R 1404 0 R 1406 0 R 1409 0 R 1411 0 R 1413 0 R 1415 0 R 1417 0 R 1420 0 R 1424 0 R 1429 0 R 1431 0 R 1433 0 
 R 1435 0 R 1440 0 R 1447 0 R 1453 0 R 1456 0 R 1458 0 R 1461 0 R 1465 0 R 1469 0 R 1472 0 R 1474 0 R 1476 0 R 1479 0 R 1484 0 R 1490 0 R 1498 0 R 1512 0 R 1526 0 R 1529 0 R 1534 0 R 1547 0 R 1552 0 R 1567 0 R 1575 0 R 1579 0 R 1588 0 R 1603 0 R 1615 0 R 1618 0 R 1632 0 R 1640 0 R 1645 0 R 1656 0 R 1661 0 R 1667 0 R 1673 0 R 1685 0 R 1688 0 R 1697 0 R 1700 0 R 1709 0 R 1714 0 R 1719 0 R 1723 0 R 1736 0 R 1738 0 R 1744 0 R 1750 0 R 1753 0 R 1761 0 R 1769 0 R 1773 0 R 1775 0 R 1777 0 R 1789 0 R 1795 0 R 1804 0 R 1811 0 R 1824 0 R 1830 0 R 1836 0 R 1847 0 R 1853 0 R 1858 0 R 1862 0 R 1866 0 R 1869 0 R 1874 0 R 1879 0 R 1885 0 R 1890 0 R 1894 0 R 1903 0 R 1909 0 R 1912 0 R 1916 0 R 1925 0 R 1932 0 R 1938 0 R 1945 0 R 1949 0 R 1952 0 R 1957 0 R 1962 0 R 1968 0 R 1970 0 R 1972 0 R 1975 0 R 1986 0 R 1989 0 R 1996 0 R 2004 0 R 2009 0 R 2012 0 R 2017 0 R 2019 0 R 2022 0 R 2027 0 R 2030 0 R 2032 0 R 2035 0 R 2038 0 R 2041 0 R 2051 0 R 2056 0 R 2061 0 R 2063 0 R 2071 0 R 2078 0 R 2085 0 R 2091 
 0 R 2096 0 R 2098 0 R 2107 0 R 2117 0 R 2127 0 R 2133 0 R 2140 0 R 2142 0 R 2147 0 R 2149 0 R 2151 0 R 2155 0 R 2158 0 R 2161 0 R 2166 0 R 2170 0 R 2181 0 R 2184 0 R 2187 0 R 2191 0 R 2195 0 R 2198 0 R 2200 0 R 2205 0 R 2208 0 R 2210 0 R 2215 0 R 2225 0 R 2227 0 R 2229 0 R 2231 0 R 2233 0 R 2236 0 R 2238 0 R 2240 0 R 2243 0 R 2245 0 R 2247 0 R 2251 0 R 2256 0 R 2265 0 R 2267 0 R 2269 0 R 2275 0 R 2277 0 R 2282 0 R 2284 0 R 2286 0 R 2293 0 R 2298 0 R 2302 0 R 2307 0 R 2311 0 R 2313 0 R 2315 0 R 2319 0 R 2322 0 R 2324 0 R 2326 0 R 2330 0 R 2332 0 R 2335 0 R 2337 0 R 2339 0 R 2341 0 R 2348 0 R 2351 0 R 2356 0 R 2358 0 R 2360 0 R 2362 0 R 2364 0 R 2372 0 R 2383 0 R 2397 0 R 2408 0 R 2412 0 R 2417 0 R 2421 0 R 2424 0 R 2429 0 R 2435 0 R 2437 0 R 2440 0 R 2442 0 R 2444 0 R 2446 0 R 2451 0 R 2453 0 R 2466 0 R 2469 0 R 2477 0 R 2483 0 R 2495 0 R 2509 0 R 2522 0 R 2541 0 R 2543 0 R 2545 0 R 2549 0 R 2567 0 R 2573 0 R 2585 0 R 2589 0 R 2593 0 R 2602 0 R 2614 0 R 2619 0 R 2629 0 R 2642 0 R 266
 1 0 R 2670 0 R 2673 0 R 2682 0 R 2699 0 R 2706 0 R 2709 0 R 2714 0 R 2718 0 R 2721 0 R 2730 0 R 2739 0 R 2742 0 R 2744 0 R 2748 0 R 2762 0 R 2771 0 R 2776 0 R 2780 0 R 2783 0 R 2785 0 R 2787 0 R 2789 0 R 2794 0 R 2807 0 R 2817 0 R 2825 0 R 2832 0 R 2837 0 R 2847 0 R 2854 0 R 2860 0 R 2862 0 R 2871 0 R 2879 0 R 2881 0 R 2885 0 R 2887 0 R 2898 0 R 2904 0 R 2906 0 R 2915 0 R 2918 0 R 2928 0 R 2932 0 R 2941 0 R 2949 0 R 2954 0 R 2958 0 R 2962 0 R 2964 0 R 2970 0 R 2974 0 R 2978 0 R 2984 0 R 2990 0 R 2993 0 R 2999 0 R 3003 0 R 3012 0 R 3017 0 R 3023 0 R 3033 0 R 3040 0 R 3047 0 R 3050 0 R 3053 0 R 3059 0 R 3065 0 R 3068 0 R 3073 0 R 3082 0 R 3088 0 R 3090 0 R 3094 0 R 3099 0 R 3104 0 R 3111 0 R 3118 0 R 3125 0 R 3133 0 R 3139 0 R 3144 0 R 3148 0 R 3151 0 R 3154 0 R 3163 0 R 3168 0 R 3172 0 R 3180 0 R 3185 0 R 3189 0 R 3191 0 R 3202 0 R 3207 0 R 3210 0 R 3212 0 R 3214 0 R 3224 0 R 3231 0 R 3235 0 R 3238 0 R 3245 0 R 3249 0 R 3252 0 R 3256 0 R 3261 0 R 3269 0 R 3274 0 R 3279 0 R 3284 0 R 3
 286 0 R 3289 0 R 3291 0 R 3295 0 R 3306 0 R 3308 0 R 3312 0 R 3315 0 R 3319 0 R 3322 0 R 3326 0 R 3328 0 R 3341 0 R 3346 0 R 3351 0 R 3357 0 R 3365 0 R 3367 0 R 3375 0 R 3393 0 R 3405 0 R 3411 0 R 3427 0 R 3431 0 R 3436 0 R 3438 0 R 3445 0 R 3448 0 R 3453 0 R 3456 0 R 3458 0 R 3460 0 R 3462 0 R 3466 0 R 3484 0 R 3487 0 R 3492 0 R 3498 0 R 3508 0 R 3513 0 R 3523 0 R 3534 0 R 3541 0 R 3546 0 R 3553 0 R 3558 0 R 3561 0 R 3569 0 R 3573 0 R 3578 0 R 3583 0 R 3596 0 R 3599 0 R 3605 0 R 3611 0 R 3616 0 R 3626 0 R 3635 0 R 3641 0 R 3650 0 R 3659 0 R 3664 0 R 3670 0 R 3676 0 R 3681 0 R 3683 0 R 3689 0 R 3696 0 R 3698 0 R 3706 0 R 3708 0 R 3714 0 R 3722 0 R 3728 0 R 3737 0 R 3743 0 R 3754 0 R 3763 0 R 3775 0 R 3785 0 R 3796 0 R 3800 0 R 3802 0 R 3806 0 R 3819 0 R 3825 0 R 3830 0 R 3836 0 R 3840 0 R 3843 0 R 3848 0 R 3850 0 R 3854 0 R 3856 0 R 3860 0 R 3863 0 R 3866 0 R 3874 0 R 3876 0 R 3882 0 R 3885 0 R 3891 0 R 3895 0 R 3898 0 R 3901 0 R 3904 0 R 3908 0 R 3911 0 R 3916 0 R 3921 0 R 3924 0 R
  3932 0 R 3936 0 R 3940 0 R 3942 0 R 3945 0 R 3948 0 R 3953 0 R 3960 0 R 3966 0 R 3970 0 R 3973 0 R 3980 0 R 3988 0 R 3992 0 R 3995 0 R 3997 0 R 4001 0 R 4006 0 R 4011 0 R 4014 0 R 4023 0 R 4028 0 R 4032 0 R 4035 0 R 4043 0 R 4048 0 R 4056 0 R 4061 0 R 4063 0 R 4069 0 R 4071 0 R 4076 0 R 4080 0 R 4085 0 R 4089 0 R 4101 0 R 4117 0 R 4132 0 R 4137 0 R 4140 0 R 4143 0 R 4149 0 R 4154 0 R 4156 0 R 4158 0 R 4160 0 R 4162 0 R 4164 0 R 4173 0 R 4177 0 R 4181 0 R 4185 0 R 4187 0 R 4194 0 R 4204 0 R 4211 0 R 4214 0 R 4217 0 R 4219 0 R 4226 0 R 4233 0 R 4244 0 R 4248 0 R 4251 0 R 4255 0 R 4258 0 R 4264 0 R 4267 0 R 4282 0 R 4287 0 R 4310 0 R 4314 0 R 4321 0 R 4332 0 R 4341 0 R 4344 0 R 4347 0 R 4350 0 R 4366 0 R 4371 0 R 4378 0 R 4381 0 R 4384 0 R 4391 0 R 4396 0 R 4400 0 R 4402 0 R 4408 0 R 4415 0 R 4423 0 R 4427 0 R 4432 0 R 4437 0 R 4443 0 R 4450 0 R 4457 0 R 4463 0 R 4471 0 R 4479 0 R 4483 0 R 4492 0 R 4500 0 R 4506 0 R]
+/Count 788
+/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 26 0 R 46 0 R 49 0 R 52 0 R 56 0 R 63 0 R 65 0 R 69 0 R 71 0 R 73 0 R 80 0 R 83 0 R 85 0 R 91 0 R 94 0 R 96 0 R 98 0 R 105 0 R 112 0 R 117 0 R 119 0 R 135 0 R 140 0 R 148 0 R 157 0 R 165 0 R 169 0 R 178 0 R 189 0 R 193 0 R 195 0 R 199 0 R 208 0 R 217 0 R 225 0 R 234 0 R 239 0 R 248 0 R 256 0 R 265 0 R 278 0 R 285 0 R 295 0 R 303 0 R 311 0 R 318 0 R 327 0 R 333 0 R 339 0 R 346 0 R 354 0 R 362 0 R 373 0 R 386 0 R 394 0 R 401 0 R 409 0 R 417 0 R 426 0 R 436 0 R 444 0 R 451 0 R 458 0 R 467 0 R 480 0 R 488 0 R 495 0 R 503 0 R 511 0 R 520 0 R 525 0 R 531 0 R 536 0 R 540 0 R 556 0 R 567 0 R 571 0 R 586 0 R 591 0 R 596 0 R 598 0 R 600 0 R 603 0 R 605 0 R 607 0 R 615 0 R 621 0 R 624 0 R 628 0 R 637 0 R 648 0 R 656 0 R 660 0 R 664 0 R 666 0 R 676 0 R 691 0 R 698 0 R 709 0 R 719 0 R 730 0 R 742 0 R 762 0 R 777 0 R 784 0 R 791 0 R 797 0 R 800 0 R 804 0 R 808 0 R 811 0 R 814 0 R 816 0 R 819 0 R 823 0 R 825 0 R 829 0 R 835 0 R 840 0 R 
 844 0 R 847 0 R 853 0 R 855 0 R 859 0 R 867 0 R 869 0 R 872 0 R 875 0 R 878 0 R 881 0 R 895 0 R 903 0 R 914 0 R 925 0 R 931 0 R 941 0 R 952 0 R 955 0 R 959 0 R 962 0 R 967 0 R 976 0 R 984 0 R 989 0 R 993 0 R 998 0 R 1002 0 R 1004 0 R 1019 0 R 1030 0 R 1035 0 R 1042 0 R 1045 0 R 1053 0 R 1061 0 R 1066 0 R 1071 0 R 1076 0 R 1078 0 R 1080 0 R 1082 0 R 1092 0 R 1100 0 R 1104 0 R 1111 0 R 1118 0 R 1126 0 R 1130 0 R 1136 0 R 1141 0 R 1149 0 R 1153 0 R 1158 0 R 1160 0 R 1166 0 R 1174 0 R 1180 0 R 1187 0 R 1198 0 R 1202 0 R 1204 0 R 1206 0 R 1210 0 R 1213 0 R 1218 0 R 1221 0 R 1233 0 R 1237 0 R 1243 0 R 1251 0 R 1256 0 R 1260 0 R 1264 0 R 1266 0 R 1269 0 R 1272 0 R 1275 0 R 1279 0 R 1283 0 R 1287 0 R 1292 0 R 1296 0 R 1299 0 R 1301 0 R 1311 0 R 1313 0 R 1318 0 R 1331 0 R 1335 0 R 1341 0 R 1343 0 R 1354 0 R 1357 0 R 1363 0 R 1371 0 R 1374 0 R 1381 0 R 1388 0 R 1391 0 R 1393 0 R 1402 0 R 1404 0 R 1406 0 R 1409 0 R 1411 0 R 1413 0 R 1415 0 R 1417 0 R 1420 0 R 1424 0 R 1429 0 R 1431 0 R 1433 0 
 R 1435 0 R 1440 0 R 1447 0 R 1453 0 R 1456 0 R 1458 0 R 1461 0 R 1465 0 R 1469 0 R 1472 0 R 1474 0 R 1476 0 R 1479 0 R 1484 0 R 1490 0 R 1498 0 R 1512 0 R 1526 0 R 1529 0 R 1534 0 R 1547 0 R 1552 0 R 1567 0 R 1575 0 R 1579 0 R 1588 0 R 1603 0 R 1615 0 R 1618 0 R 1632 0 R 1640 0 R 1645 0 R 1656 0 R 1661 0 R 1667 0 R 1673 0 R 1685 0 R 1688 0 R 1697 0 R 1700 0 R 1709 0 R 1714 0 R 1719 0 R 1723 0 R 1736 0 R 1738 0 R 1744 0 R 1750 0 R 1753 0 R 1761 0 R 1769 0 R 1773 0 R 1775 0 R 1777 0 R 1789 0 R 1795 0 R 1804 0 R 1811 0 R 1824 0 R 1830 0 R 1836 0 R 1847 0 R 1853 0 R 1858 0 R 1862 0 R 1866 0 R 1869 0 R 1874 0 R 1879 0 R 1885 0 R 1890 0 R 1894 0 R 1903 0 R 1909 0 R 1912 0 R 1916 0 R 1925 0 R 1932 0 R 1938 0 R 1945 0 R 1949 0 R 1952 0 R 1957 0 R 1962 0 R 1968 0 R 1970 0 R 1972 0 R 1975 0 R 1986 0 R 1989 0 R 1996 0 R 2004 0 R 2009 0 R 2012 0 R 2017 0 R 2019 0 R 2022 0 R 2027 0 R 2030 0 R 2032 0 R 2035 0 R 2038 0 R 2041 0 R 2051 0 R 2056 0 R 2061 0 R 2063 0 R 2071 0 R 2078 0 R 2085 0 R 2091 
 0 R 2096 0 R 2098 0 R 2107 0 R 2117 0 R 2127 0 R 2133 0 R 2140 0 R 2142 0 R 2147 0 R 2149 0 R 2151 0 R 2155 0 R 2158 0 R 2161 0 R 2166 0 R 2170 0 R 2181 0 R 2184 0 R 2187 0 R 2191 0 R 2195 0 R 2198 0 R 2200 0 R 2205 0 R 2208 0 R 2210 0 R 2215 0 R 2225 0 R 2227 0 R 2229 0 R 2231 0 R 2233 0 R 2236 0 R 2238 0 R 2240 0 R 2243 0 R 2245 0 R 2247 0 R 2251 0 R 2256 0 R 2265 0 R 2267 0 R 2269 0 R 2275 0 R 2277 0 R 2282 0 R 2284 0 R 2286 0 R 2293 0 R 2298 0 R 2302 0 R 2307 0 R 2311 0 R 2313 0 R 2315 0 R 2319 0 R 2322 0 R 2324 0 R 2326 0 R 2330 0 R 2332 0 R 2335 0 R 2337 0 R 2339 0 R 2341 0 R 2348 0 R 2351 0 R 2356 0 R 2358 0 R 2360 0 R 2362 0 R 2364 0 R 2372 0 R 2383 0 R 2397 0 R 2408 0 R 2412 0 R 2417 0 R 2421 0 R 2424 0 R 2429 0 R 2435 0 R 2437 0 R 2440 0 R 2442 0 R 2444 0 R 2446 0 R 2451 0 R 2453 0 R 2466 0 R 2469 0 R 2477 0 R 2483 0 R 2495 0 R 2509 0 R 2522 0 R 2541 0 R 2543 0 R 2545 0 R 2549 0 R 2567 0 R 2573 0 R 2585 0 R 2589 0 R 2593 0 R 2602 0 R 2614 0 R 2619 0 R 2629 0 R 2642 0 R 266
 1 0 R 2670 0 R 2673 0 R 2682 0 R 2699 0 R 2706 0 R 2709 0 R 2714 0 R 2718 0 R 2721 0 R 2730 0 R 2739 0 R 2742 0 R 2744 0 R 2748 0 R 2762 0 R 2771 0 R 2776 0 R 2781 0 R 2784 0 R 2786 0 R 2788 0 R 2790 0 R 2792 0 R 2797 0 R 2810 0 R 2820 0 R 2828 0 R 2835 0 R 2840 0 R 2850 0 R 2857 0 R 2864 0 R 2866 0 R 2875 0 R 2883 0 R 2885 0 R 2889 0 R 2891 0 R 2902 0 R 2908 0 R 2910 0 R 2919 0 R 2922 0 R 2932 0 R 2936 0 R 2944 0 R 2952 0 R 2957 0 R 2961 0 R 2965 0 R 2967 0 R 2973 0 R 2977 0 R 2981 0 R 2987 0 R 2993 0 R 2996 0 R 3002 0 R 3006 0 R 3015 0 R 3020 0 R 3026 0 R 3036 0 R 3043 0 R 3050 0 R 3053 0 R 3056 0 R 3062 0 R 3068 0 R 3071 0 R 3076 0 R 3085 0 R 3091 0 R 3093 0 R 3097 0 R 3102 0 R 3107 0 R 3114 0 R 3121 0 R 3128 0 R 3136 0 R 3142 0 R 3147 0 R 3151 0 R 3154 0 R 3157 0 R 3166 0 R 3171 0 R 3175 0 R 3183 0 R 3188 0 R 3192 0 R 3194 0 R 3205 0 R 3210 0 R 3213 0 R 3215 0 R 3217 0 R 3227 0 R 3234 0 R 3238 0 R 3241 0 R 3248 0 R 3252 0 R 3255 0 R 3259 0 R 3264 0 R 3272 0 R 3277 0 R 3282 0 R 3
 287 0 R 3289 0 R 3292 0 R 3294 0 R 3298 0 R 3309 0 R 3311 0 R 3315 0 R 3318 0 R 3322 0 R 3325 0 R 3329 0 R 3331 0 R 3344 0 R 3349 0 R 3354 0 R 3360 0 R 3368 0 R 3370 0 R 3378 0 R 3396 0 R 3408 0 R 3414 0 R 3430 0 R 3434 0 R 3439 0 R 3441 0 R 3448 0 R 3451 0 R 3456 0 R 3459 0 R 3461 0 R 3463 0 R 3465 0 R 3469 0 R 3487 0 R 3490 0 R 3495 0 R 3501 0 R 3511 0 R 3516 0 R 3526 0 R 3537 0 R 3544 0 R 3549 0 R 3556 0 R 3561 0 R 3564 0 R 3572 0 R 3576 0 R 3581 0 R 3586 0 R 3599 0 R 3602 0 R 3608 0 R 3614 0 R 3619 0 R 3629 0 R 3638 0 R 3644 0 R 3653 0 R 3662 0 R 3667 0 R 3673 0 R 3679 0 R 3684 0 R 3686 0 R 3692 0 R 3699 0 R 3701 0 R 3709 0 R 3711 0 R 3717 0 R 3725 0 R 3731 0 R 3740 0 R 3746 0 R 3757 0 R 3766 0 R 3778 0 R 3788 0 R 3799 0 R 3803 0 R 3805 0 R 3809 0 R 3822 0 R 3828 0 R 3833 0 R 3839 0 R 3843 0 R 3846 0 R 3851 0 R 3853 0 R 3857 0 R 3859 0 R 3863 0 R 3866 0 R 3869 0 R 3877 0 R 3879 0 R 3885 0 R 3888 0 R 3894 0 R 3898 0 R 3901 0 R 3904 0 R 3907 0 R 3911 0 R 3914 0 R 3919 0 R 3924 0 R
  3927 0 R 3935 0 R 3939 0 R 3943 0 R 3945 0 R 3948 0 R 3951 0 R 3956 0 R 3963 0 R 3969 0 R 3973 0 R 3976 0 R 3983 0 R 3991 0 R 3995 0 R 3998 0 R 4000 0 R 4004 0 R 4009 0 R 4014 0 R 4017 0 R 4026 0 R 4031 0 R 4035 0 R 4038 0 R 4046 0 R 4051 0 R 4059 0 R 4064 0 R 4066 0 R 4072 0 R 4074 0 R 4079 0 R 4083 0 R 4088 0 R 4092 0 R 4104 0 R 4120 0 R 4135 0 R 4140 0 R 4143 0 R 4146 0 R 4152 0 R 4157 0 R 4159 0 R 4161 0 R 4163 0 R 4165 0 R 4167 0 R 4176 0 R 4180 0 R 4184 0 R 4188 0 R 4190 0 R 4197 0 R 4207 0 R 4214 0 R 4217 0 R 4220 0 R 4222 0 R 4229 0 R 4236 0 R 4247 0 R 4251 0 R 4254 0 R 4258 0 R 4261 0 R 4267 0 R 4270 0 R 4285 0 R 4290 0 R 4313 0 R 4317 0 R 4324 0 R 4335 0 R 4344 0 R 4347 0 R 4350 0 R 4353 0 R 4369 0 R 4374 0 R 4381 0 R 4384 0 R 4387 0 R 4394 0 R 4399 0 R 4403 0 R 4405 0 R 4411 0 R 4418 0 R 4426 0 R 4430 0 R 4435 0 R 4440 0 R 4446 0 R 4453 0 R 4460 0 R 4466 0 R 4474 0 R 4482 0 R 4486 0 R 4495 0 R 4503 0 R 4509 0 R]
 >>
 endobj
 4 0 obj
@@ -187,11 +187,11 @@ endobj
 << /Type /Font
 /BaseFont /71be00+NotoSerif
 /Subtype /TrueType
-/FontDescriptor 5262 0 R
+/FontDescriptor 5265 0 R
 /FirstChar 32
 /LastChar 255
-/Widths 5264 0 R
-/ToUnicode 5263 0 R
+/Widths 5267 0 R
+/ToUnicode 5266 0 R
 >>
 endobj
 11 0 obj
@@ -1750,7 +1750,7 @@ endobj
 /F1.0 10 0 R
 >>
 >>
-/Annots [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 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]
+/Annots [4510 0 R 4511 0 R 4512 0 R 4513 0 R 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]
 >>
 endobj
 13 0 obj
@@ -3417,7 +3417,7 @@ endobj
 /Font << /F1.0 10 0 R
 >>
 >>
-/Annots [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 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 4645 0 R 4646 0 R 4647 0 R 4648 0 R 4649 0 R 4650 0 R 4651 0 R 4652 0 R 4653 0 R 4654 0 R 4655 0 R 4656 0 R 4657 0 R 4658 0 R 4659 0 R 4660 0 R 4661 0 R 4662 0 R 4663 0 R 4664 0 R]
+/Annots [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 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 4645 0 R 4646 0 R 4647 0 R 4648 0 R 4649 0 R 4650 0 R 4651 0 R 4652 0 R 4653 0 R 4654 0 R 4655 0 R 4656 0 R 4657 0 R 4658 0 R 4659 0 R 4660 0 R 4661 0 R 4662 0 R 4663 0 R 4664 0 R 4665 0 R 4666 0 R 4667 0 R]
 >>
 endobj
 15 0 obj
@@ -5084,7 +5084,7 @@ endobj
 /Font << /F1.0 10 0 R
 >>
 >>
-/Annots [4665 0 R 4666 0 R 4667 0 R 4668 0 R 4669 0 R 4670 0 R 4671 0 R 4672 0 R 4673 0 R 4674 0 R 4675 0 R 4676 0 R 4677 0 R 4678 0 R 4679 0 R 4680 0 R 4681 0 R 4682 0 R 4683 0 R 4684 0 R 4685 0 R 4686 0 R 4687 0 R 4688 0 R 4689 0 R 4690 0 R 4691 0 R 4692 0 R 4693 0 R 4694 0 R 4695 0 R 4696 0 R 4697 0 R 4698 0 R 4699 0 R 4700 0 R 4701 0 R 4702 0 R 4703 0 R 4704 0 R 4705 0 R 4706 0 R 4707 0 R 4708 0 R 4709 0 R 4710 0 R 4711 0 R 4712 0 R 4713 0 R 4714 0 R 4715 0 R 4716 0 R 4717 0 R 4718 0 R 4719 0 R 4720 0 R 4721 0 R 4722 0 R 4723 0 R 4724 0 R 4725 0 R 4726 0 R 4727 0 R 4728 0 R 4729 0 R 4730 0 R 4731 0 R 4732 0 R 4733 0 R 4734 0 R 4735 0 R 4736 0 R 4737 0 R 4738 0 R 4739 0 R 4740 0 R 4741 0 R 4742 0 R 4743 0 R 4744 0 R 4745 0 R 4746 0 R]
+/Annots [4668 0 R 4669 0 R 4670 0 R 4671 0 R 4672 0 R 4673 0 R 4674 0 R 4675 0 R 4676 0 R 4677 0 R 4678 0 R 4679 0 R 4680 0 R 4681 0 R 4682 0 R 4683 0 R 4684 0 R 4685 0 R 4686 0 R 4687 0 R 4688 0 R 4689 0 R 4690 0 R 4691 0 R 4692 0 R 4693 0 R 4694 0 R 4695 0 R 4696 0 R 4697 0 R 4698 0 R 4699 0 R 4700 0 R 4701 0 R 4702 0 R 4703 0 R 4704 0 R 4705 0 R 4706 0 R 4707 0 R 4708 0 R 4709 0 R 4710 0 R 4711 0 R 4712 0 R 4713 0 R 4714 0 R 4715 0 R 4716 0 R 4717 0 R 4718 0 R 4719 0 R 4720 0 R 4721 0 R 4722 0 R 4723 0 R 4724 0 R 4725 0 R 4726 0 R 4727 0 R 4728 0 R 4729 0 R 4730 0 R 4731 0 R 4732 0 R 4733 0 R 4734 0 R 4735 0 R 4736 0 R 4737 0 R 4738 0 R 4739 0 R 4740 0 R 4741 0 R 4742 0 R 4743 0 R 4744 0 R 4745 0 R 4746 0 R 4747 0 R 4748 0 R 4749 0 R]
 >>
 endobj
 17 0 obj
@@ -6369,7 +6369,7 @@ ET
 BT
 529.4315 221.796 Td
 /F1.0 10.5 Tf
-<343738> Tj
+<343739> Tj
 ET
 
 0.0 0.0 0.0 SCN
@@ -6409,7 +6409,7 @@ ET
 BT
 529.4315 203.316 Td
 /F1.0 10.5 Tf
-<343832> Tj
+<343833> Tj
 ET
 
 0.0 0.0 0.0 SCN
@@ -6449,7 +6449,7 @@ ET
 BT
 529.4315 184.836 Td
 /F1.0 10.5 Tf
-<343834> Tj
+<343835> Tj
 ET
 
 0.0 0.0 0.0 SCN
@@ -6489,7 +6489,7 @@ ET
 BT
 529.4315 166.356 Td
 /F1.0 10.5 Tf
-<343837> Tj
+<343838> Tj
 ET
 
 0.0 0.0 0.0 SCN
@@ -6529,7 +6529,7 @@ ET
 BT
 529.4315 147.876 Td
 /F1.0 10.5 Tf
-<343838> Tj
+<343839> Tj
 ET
 
 0.0 0.0 0.0 SCN
@@ -6569,7 +6569,7 @@ ET
 BT
 529.4315 129.396 Td
 /F1.0 10.5 Tf
-<343937> Tj
+<343938> Tj
 ET
 
 0.0 0.0 0.0 SCN
@@ -6609,7 +6609,7 @@ ET
 BT
 529.4315 110.916 Td
 /F1.0 10.5 Tf
-<343939> Tj
+<353030> Tj
 ET
 
 0.0 0.0 0.0 SCN
@@ -6649,7 +6649,7 @@ ET
 BT
 529.4315 92.436 Td
 /F1.0 10.5 Tf
-<353030> Tj
+<353031> Tj
 ET
 
 0.0 0.0 0.0 SCN
@@ -6689,7 +6689,7 @@ ET
 BT
 529.4315 73.956 Td
 /F1.0 10.5 Tf
-<353031> Tj
+<353032> Tj
 ET
 
 0.0 0.0 0.0 SCN
@@ -6729,7 +6729,7 @@ ET
 BT
 529.4315 55.476 Td
 /F1.0 10.5 Tf
-<353032> Tj
+<353033> Tj
 ET
 
 0.0 0.0 0.0 SCN
@@ -6751,7 +6751,7 @@ endobj
 /Font << /F1.0 10 0 R
 >>
 >>
-/Annots [4747 0 R 4748 0 R 4749 0 R 4750 0 R 4751 0 R 4752 0 R 4753 0 R 4754 0 R 4755 0 R 4756 0 R 4757 0 R 4758 0 R 4759 0 R 4760 0 R 4761 0 R 4762 0 R 4763 0 R 4764 0 R 4765 0 R 4766 0 R 4767 0 R 4768 0 R 4769 0 R 4770 0 R 4771 0 R 4772 0 R 4773 0 R 4774 0 R 4775 0 R 4776 0 R 4777 0 R 4778 0 R 4779 0 R 4780 0 R 4781 0 R 4782 0 R 4783 0 R 4784 0 R 4785 0 R 4786 0 R 4787 0 R 4788 0 R 4789 0 R 4790 0 R 4791 0 R 4792 0 R 4793 0 R 4794 0 R 4795 0 R 4796 0 R 4797 0 R 4798 0 R 4799 0 R 4800 0 R 4801 0 R 4802 0 R 4803 0 R 4804 0 R 4805 0 R 4806 0 R 4807 0 R 4808 0 R 4809 0 R 4810 0 R 4811 0 R 4812 0 R 4813 0 R 4814 0 R 4815 0 R 4816 0 R 4817 0 R 4818 0 R 4819 0 R 4820 0 R 4821 0 R 4822 0 R 4823 0 R 4824 0 R 4825 0 R 4826 0 R 4827 0 R 4828 0 R]
+/Annots [4750 0 R 4751 0 R 4752 0 R 4753 0 R 4754 0 R 4755 0 R 4756 0 R 4757 0 R 4758 0 R 4759 0 R 4760 0 R 4761 0 R 4762 0 R 4763 0 R 4764 0 R 4765 0 R 4766 0 R 4767 0 R 4768 0 R 4769 0 R 4770 0 R 4771 0 R 4772 0 R 4773 0 R 4774 0 R 4775 0 R 4776 0 R 4777 0 R 4778 0 R 4779 0 R 4780 0 R 4781 0 R 4782 0 R 4783 0 R 4784 0 R 4785 0 R 4786 0 R 4787 0 R 4788 0 R 4789 0 R 4790 0 R 4791 0 R 4792 0 R 4793 0 R 4794 0 R 4795 0 R 4796 0 R 4797 0 R 4798 0 R 4799 0 R 4800 0 R 4801 0 R 4802 0 R 4803 0 R 4804 0 R 4805 0 R 4806 0 R 4807 0 R 4808 0 R 4809 0 R 4810 0 R 4811 0 R 4812 0 R 4813 0 R 4814 0 R 4815 0 R 4816 0 R 4817 0 R 4818 0 R 4819 0 R 4820 0 R 4821 0 R 4822 0 R 4823 0 R 4824 0 R 4825 0 R 4826 0 R 4827 0 R 4828 0 R 4829 0 R 4830 0 R 4831 0 R]
 >>
 endobj
 19 0 obj
@@ -6796,7 +6796,7 @@ ET
 BT
 529.4315 794.676 Td
 /F1.0 10.5 Tf
-<353035> Tj
+<353036> Tj
 ET
 
 0.0 0.0 0.0 SCN
@@ -6836,7 +6836,7 @@ ET
 BT
 529.4315 776.196 Td
 /F1.0 10.5 Tf
-<353036> Tj
+<353037> Tj
 ET
 
 0.0 0.0 0.0 SCN
@@ -6876,7 +6876,7 @@ ET
 BT
 529.4315 757.716 Td
 /F1.0 10.5 Tf
-<353037> Tj
+<353038> Tj
 ET
 
 0.0 0.0 0.0 SCN
@@ -6916,7 +6916,7 @@ ET
 BT
 529.4315 739.236 Td
 /F1.0 10.5 Tf
-<353038> Tj
+<353039> Tj
 ET
 
 0.0 0.0 0.0 SCN
@@ -6956,7 +6956,7 @@ ET
 BT
 529.4315 720.756 Td
 /F1.0 10.5 Tf
-<353039> Tj
+<353130> Tj
 ET
 
 0.0 0.0 0.0 SCN
@@ -6996,7 +6996,7 @@ ET
 BT
 529.4315 702.276 Td
 /F1.0 10.5 Tf
-<353130> Tj
+<353131> Tj
 ET
 
 0.0 0.0 0.0 SCN
@@ -7036,7 +7036,7 @@ ET
 BT
 529.4315 683.796 Td
 /F1.0 10.5 Tf
-<353131> Tj
+<353132> Tj
 ET
 
 0.0 0.0 0.0 SCN
@@ -7076,7 +7076,7 @@ ET
 BT
 529.4315 665.316 Td
 /F1.0 10.5 Tf
-<353132> Tj
+<353133> Tj
 ET
 
 0.0 0.0 0.0 SCN
@@ -7116,7 +7116,7 @@ ET
 BT
 529.4315 646.836 Td
 /F1.0 10.5 Tf
-<353133> Tj
+<353134> Tj
 ET
 
 0.0 0.0 0.0 SCN
@@ -7156,7 +7156,7 @@ ET
 BT
 529.4315 628.356 Td
 /F1.0 10.5 Tf
-<353137> Tj
+<353138> Tj
 ET
 
 0.0 0.0 0.0 SCN
@@ -7196,7 +7196,7 @@ ET
 BT
 529.4315 609.876 Td
 /F1.0 10.5 Tf
-<353138> Tj
+<353139> Tj
 ET
 
 0.0 0.0 0.0 SCN
@@ -7236,7 +7236,7 @@ ET
 BT
 529.4315 591.396 Td
 /F1.0 10.5 Tf
-<353430> Tj
+<353431> Tj
 ET
 
 0.0 0.0 0.0 SCN
@@ -7276,7 +7276,7 @@ ET
 BT
 529.4315 572.916 Td
 /F1.0 10.5 Tf
-<353431> Tj
+<353432> Tj
 ET
 
 0.0 0.0 0.0 SCN
@@ -7316,7 +7316,7 @@ ET
 BT
 529.4315 554.436 Td
 /F1.0 10.5 Tf
-<353437> Tj
+<353438> Tj
 ET
 
 0.0 0.0 0.0 SCN
@@ -7356,7 +7356,7 @@ ET
 BT
 529.4315 535.956 Td
 /F1.0 10.5 Tf
-<353532> Tj
+<353533> Tj
 ET
 
 0.0 0.0 0.0 SCN
@@ -7396,7 +7396,7 @@ ET
 BT
 529.4315 517.476 Td
 /F1.0 10.5 Tf
-<353536> Tj
+<353537> Tj
 ET
 
 0.0 0.0 0.0 SCN
@@ -7436,7 +7436,7 @@ ET
 BT
 529.4315 498.996 Td
 /F1.0 10.5 Tf
-<353639> Tj
+<353730> Tj
 ET
 
 0.0 0.0 0.0 SCN
@@ -7476,7 +7476,7 @@ ET
 BT
 529.4315 480.516 Td
 /F1.0 10.5 Tf
-<353737> Tj
+<353738> Tj
 ET
 
 0.0 0.0 0.0 SCN
@@ -7516,7 +7516,7 @@ ET
 BT
 529.4315 462.036 Td
 /F1.0 10.5 Tf
-<353739> Tj
+<353830> Tj
 ET
 
 0.0 0.0 0.0 SCN
@@ -7556,7 +7556,7 @@ ET
 BT
 529.4315 443.556 Td
 /F1.0 10.5 Tf
-<353833> Tj
+<353834> 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
-<353834> Tj
+<353835> 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
-<353838> Tj
+<353839> 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
-<353839> Tj
+<353930> 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
-<353933> Tj
+<353934> 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
-<353938> Tj
+<353939> 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
-<353939> Tj
+<363030> 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
-<363032> Tj
+<363033> 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
-<363033> Tj
+<363034> 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
-<363036> Tj
+<363037> Tj
 ET
 
 0.0 0.0 0.0 SCN
@@ -7956,7 +7956,7 @@ ET
 BT
 529.4315 258.756 Td
 /F1.0 10.5 Tf
-<363130> Tj
+<363131> Tj
 ET
 
 0.0 0.0 0.0 SCN
@@ -7996,7 +7996,7 @@ ET
 BT
 529.4315 240.276 Td
 /F1.0 10.5 Tf
-<363138> Tj
+<363139> Tj
 ET
 
 0.0 0.0 0.0 SCN
@@ -8036,7 +8036,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
@@ -8076,7 +8076,7 @@ ET
 BT
 529.4315 203.316 Td
 /F1.0 10.5 Tf
-<363230> Tj
+<363231> 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
-<363231> Tj
+<363232> 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
-<363232> Tj
+<363233> 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
-<363336> Tj
+<363337> 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
-<363532> Tj
+<363533> 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
-<363533> Tj
+<363534> 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
-<363535> Tj
+<363536> 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
-<363537> Tj
+<363538> 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
-<363539> Tj
+<363630> Tj
 ET
 
 0.0 0.0 0.0 SCN
@@ -8429,7 +8429,7 @@ endobj
 /Font << /F1.0 10 0 R
 >>
 >>
-/Annots [4829 0 R 4830 0 R 4831 0 R 4832 0 R 4833 0 R 4834 0 R 4835 0 R 4836 0 R 4837 0 R 4838 0 R 4839 0 R 4840 0 R 4841 0 R 4842 0 R 4843 0 R 4844 0 R 4845 0 R 4846 0 R 4847 0 R 4848 0 R 4849 0 R 4850 0 R 4851 0 R 4852 0 R 4853 0 R 4854 0 R 4855 0 R 4856 0 R 4857 0 R 4858 0 R 4859 0 R 4860 0 R 4861 0 R 4862 0 R 4863 0 R 4864 0 R 4865 0 R 4866 0 R 4867 0 R 4868 0 R 4869 0 R 4870 0 R 4871 0 R 4872 0 R 4873 0 R 4874 0 R 4875 0 R 4876 0 R 4877 0 R 4878 0 R 4879 0 R 4880 0 R 4881 0 R 4882 0 R 4883 0 R 4884 0 R 4885 0 R 4886 0 R 4887 0 R 4888 0 R 4889 0 R 4890 0 R 4891 0 R 4892 0 R 4893 0 R 4894 0 R 4895 0 R 4896 0 R 4897 0 R 4898 0 R 4899 0 R 4900 0 R 4901 0 R 4902 0 R 4903 0 R 4904 0 R 4905 0 R 4906 0 R 4907 0 R 4908 0 R 4909 0 R 4910 0 R 4911 0 R 4912 0 R]
+/Annots [4832 0 R 4833 0 R 4834 0 R 4835 0 R 4836 0 R 4837 0 R 4838 0 R 4839 0 R 4840 0 R 4841 0 R 4842 0 R 4843 0 R 4844 0 R 4845 0 R 4846 0 R 4847 0 R 4848 0 R 4849 0 R 4850 0 R 4851 0 R 4852 0 R 4853 0 R 4854 0 R 4855 0 R 4856 0 R 4857 0 R 4858 0 R 4859 0 R 4860 0 R 4861 0 R 4862 0 R 4863 0 R 4864 0 R 4865 0 R 4866 0 R 4867 0 R 4868 0 R 4869 0 R 4870 0 R 4871 0 R 4872 0 R 4873 0 R 4874 0 R 4875 0 R 4876 0 R 4877 0 R 4878 0 R 4879 0 R 4880 0 R 4881 0 R 4882 0 R 4883 0 R 4884 0 R 4885 0 R 4886 0 R 4887 0 R 4888 0 R 4889 0 R 4890 0 R 4891 0 R 4892 0 R 4893 0 R 4894 0 R 4895 0 R 4896 0 R 4897 0 R 4898 0 R 4899 0 R 4900 0 R 4901 0 R 4902 0 R 4903 0 R 4904 0 R 4905 0 R 4906 0 R 4907 0 R 4908 0 R 4909 0 R 4910 0 R 4911 0 R 4912 0 R 4913 0 R 4914 0 R 4915 0 R]
 >>
 endobj
 21 0 obj
@@ -8474,7 +8474,7 @@ ET
 BT
 529.4315 794.676 Td
 /F1.0 10.5 Tf
-<363631> Tj
+<363632> 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
-<363632> Tj
+<363633> Tj
 ET
 
 0.0 0.0 0.0 SCN
@@ -8565,7 +8565,7 @@ ET
 BT
 529.4315 757.716 Td
 /F1.0 10.5 Tf
-<363634> Tj
+<363635> Tj
 ET
 
 0.0 0.0 0.0 SCN
@@ -8605,7 +8605,7 @@ ET
 BT
 529.4315 739.236 Td
 /F1.0 10.5 Tf
-<363635> Tj
+<363636> Tj
 ET
 
 0.0 0.0 0.0 SCN
@@ -8645,7 +8645,7 @@ ET
 BT
 529.4315 720.756 Td
 /F1.0 10.5 Tf
-<363638> Tj
+<363639> Tj
 ET
 
 0.0 0.0 0.0 SCN
@@ -8685,7 +8685,7 @@ ET
 BT
 529.4315 702.276 Td
 /F1.0 10.5 Tf
-<363639> Tj
+<363730> Tj
 ET
 
 0.0 0.0 0.0 SCN
@@ -8725,7 +8725,7 @@ ET
 BT
 529.4315 683.796 Td
 /F1.0 10.5 Tf
-<363730> Tj
+<363731> Tj
 ET
 
 0.0 0.0 0.0 SCN
@@ -8765,7 +8765,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
@@ -8805,7 +8805,7 @@ ET
 BT
 529.4315 646.836 Td
 /F1.0 10.5 Tf
-<363732> Tj
+<363733> Tj
 ET
 
 0.0 0.0 0.0 SCN
@@ -8845,7 +8845,7 @@ ET
 BT
 529.4315 628.356 Td
 /F1.0 10.5 Tf
-<363733> Tj
+<363734> Tj
 ET
 
 0.0 0.0 0.0 SCN
@@ -8885,7 +8885,7 @@ ET
 BT
 529.4315 609.876 Td
 /F1.0 10.5 Tf
-<363734> Tj
+<363735> Tj
 ET
 
 0.0 0.0 0.0 SCN
@@ -8925,7 +8925,7 @@ ET
 BT
 529.4315 591.396 Td
 /F1.0 10.5 Tf
-<363735> Tj
+<363736> Tj
 ET
 
 0.0 0.0 0.0 SCN
@@ -8965,7 +8965,7 @@ ET
 BT
 529.4315 572.916 Td
 /F1.0 10.5 Tf
-<363736> Tj
+<363737> Tj
 ET
 
 0.0 0.0 0.0 SCN
@@ -9005,7 +9005,7 @@ ET
 BT
 529.4315 554.436 Td
 /F1.0 10.5 Tf
-<363737> Tj
+<363738> Tj
 ET
 
 0.0 0.0 0.0 SCN
@@ -9045,7 +9045,7 @@ ET
 BT
 529.4315 535.956 Td
 /F1.0 10.5 Tf
-<363738> Tj
+<363739> Tj
 ET
 
 0.0 0.0 0.0 SCN
@@ -9085,7 +9085,7 @@ ET
 BT
 529.4315 517.476 Td
 /F1.0 10.5 Tf
-<363830> Tj
+<363831> Tj
 ET
 
 0.0 0.0 0.0 SCN
@@ -9125,7 +9125,7 @@ ET
 BT
 529.4315 498.996 Td
 /F1.0 10.5 Tf
-<363831> Tj
+<363832> Tj
 ET
 
 0.0 0.0 0.0 SCN
@@ -9165,7 +9165,7 @@ ET
 BT
 529.4315 480.516 Td
 /F1.0 10.5 Tf
-<363832> Tj
+<363833> Tj
 ET
 
 0.0 0.0 0.0 SCN
@@ -9205,7 +9205,7 @@ ET
 BT
 529.4315 462.036 Td
 /F1.0 10.5 Tf
-<363833> Tj
+<363834> Tj
 ET
 
 0.0 0.0 0.0 SCN
@@ -9245,7 +9245,7 @@ ET
 BT
 529.4315 443.556 Td
 /F1.0 10.5 Tf
-<363834> Tj
+<363835> Tj
 ET
 
 0.0 0.0 0.0 SCN
@@ -9285,7 +9285,7 @@ ET
 BT
 529.4315 425.076 Td
 /F1.0 10.5 Tf
-<363835> Tj
+<363836> Tj
 ET
 
 0.0 0.0 0.0 SCN
@@ -9325,7 +9325,7 @@ ET
 BT
 529.4315 406.596 Td
 /F1.0 10.5 Tf
-<363837> Tj
+<363838> Tj
 ET
 
 0.0 0.0 0.0 SCN
@@ -9365,7 +9365,7 @@ ET
 BT
 529.4315 388.116 Td
 /F1.0 10.5 Tf
-<363838> Tj
+<363839> Tj
 ET
 
 0.0 0.0 0.0 SCN
@@ -9405,7 +9405,7 @@ ET
 BT
 529.4315 369.636 Td
 /F1.0 10.5 Tf
-<363935> Tj
+<363936> Tj
 ET
 
 0.0 0.0 0.0 SCN
@@ -9445,7 +9445,7 @@ ET
 BT
 529.4315 351.156 Td
 /F1.0 10.5 Tf
-<363936> Tj
+<363937> Tj
 ET
 
 0.0 0.0 0.0 SCN
@@ -9485,7 +9485,7 @@ ET
 BT
 529.4315 332.676 Td
 /F1.0 10.5 Tf
-<363937> Tj
+<363938> Tj
 ET
 
 0.0 0.0 0.0 SCN
@@ -9525,7 +9525,7 @@ ET
 BT
 529.4315 314.196 Td
 /F1.0 10.5 Tf
-<363938> Tj
+<363939> Tj
 ET
 
 0.0 0.0 0.0 SCN
@@ -9565,7 +9565,7 @@ ET
 BT
 529.4315 295.716 Td
 /F1.0 10.5 Tf
-<363939> Tj
+<373030> Tj
 ET
 
 0.0 0.0 0.0 SCN
@@ -9605,7 +9605,7 @@ ET
 BT
 529.4315 277.236 Td
 /F1.0 10.5 Tf
-<373030> Tj
+<373031> Tj
 ET
 
 0.0 0.0 0.0 SCN
@@ -9645,7 +9645,7 @@ ET
 BT
 529.4315 258.756 Td
 /F1.0 10.5 Tf
-<373131> Tj
+<373132> Tj
 ET
 
 0.0 0.0 0.0 SCN
@@ -9685,7 +9685,7 @@ ET
 BT
 529.4315 240.276 Td
 /F1.0 10.5 Tf
-<373134> Tj
+<373135> Tj
 ET
 
 0.0 0.0 0.0 SCN
@@ -9725,7 +9725,7 @@ ET
 BT
 529.4315 221.796 Td
 /F1.0 10.5 Tf
-<373138> Tj
+<373139> Tj
 ET
 
 0.0 0.0 0.0 SCN
@@ -9765,7 +9765,7 @@ ET
 BT
 529.4315 203.316 Td
 /F1.0 10.5 Tf
-<373234> Tj
+<373235> Tj
 ET
 
 0.0 0.0 0.0 SCN
@@ -9805,7 +9805,7 @@ ET
 BT
 529.4315 184.836 Td
 /F1.0 10.5 Tf
-<373335> Tj
+<373336> Tj
 ET
 
 0.0 0.0 0.0 SCN
@@ -9845,7 +9845,7 @@ ET
 BT
 529.4315 166.356 Td
 /F1.0 10.5 Tf
-<373336> Tj
+<373337> Tj
 ET
 
 0.0 0.0 0.0 SCN
@@ -9885,7 +9885,7 @@ ET
 BT
 529.4315 147.876 Td
 /F1.0 10.5 Tf
-<373337> Tj
+<373338> Tj
 ET
 
 0.0 0.0 0.0 SCN
@@ -9925,7 +9925,7 @@ ET
 BT
 529.4315 129.396 Td
 /F1.0 10.5 Tf
-<373436> Tj
+<373437> Tj
 ET
 
 0.0 0.0 0.0 SCN
@@ -9965,7 +9965,7 @@ ET
 BT
 529.4315 110.916 Td
 /F1.0 10.5 Tf
-<373437> Tj
+<373438> Tj
 ET
 
 0.0 0.0 0.0 SCN
@@ -10005,7 +10005,7 @@ ET
 BT
 529.4315 92.436 Td
 /F1.0 10.5 Tf
-<373438> Tj
+<373439> Tj
 ET
 
 0.0 0.0 0.0 SCN
@@ -10045,7 +10045,7 @@ ET
 BT
 529.4315 73.956 Td
 /F1.0 10.5 Tf
-<373439> Tj
+<373530> Tj
 ET
 
 0.0 0.0 0.0 SCN
@@ -10085,7 +10085,7 @@ ET
 BT
 529.4315 55.476 Td
 /F1.0 10.5 Tf
-<373530> Tj
+<373531> Tj
 ET
 
 0.0 0.0 0.0 SCN
@@ -10107,7 +10107,7 @@ endobj
 /Font << /F1.0 10 0 R
 >>
 >>
-/Annots [4913 0 R 4914 0 R 4915 0 R 4916 0 R 4917 0 R 4918 0 R 4919 0 R 4920 0 R 4921 0 R 4922 0 R 4923 0 R 4924 0 R 4925 0 R 4926 0 R 4927 0 R 4928 0 R 4929 0 R 4930 0 R 4931 0 R 4932 0 R 4933 0 R 4934 0 R 4935 0 R 4936 0 R 4937 0 R 4938 0 R 4939 0 R 4940 0 R 4941 0 R 4942 0 R 4943 0 R 4944 0 R 4945 0 R 4946 0 R 4947 0 R 4948 0 R 4949 0 R 4950 0 R 4951 0 R 4952 0 R 4953 0 R 4954 0 R 4955 0 R 4956 0 R 4957 0 R 4958 0 R 4959 0 R 4960 0 R 4961 0 R 4962 0 R 4963 0 R 4964 0 R 4965 0 R 4966 0 R 4967 0 R 4968 0 R 4969 0 R 4970 0 R 4971 0 R 4972 0 R 4973 0 R 4974 0 R 4975 0 R 4976 0 R 4977 0 R 4978 0 R 4979 0 R 4980 0 R 4981 0 R 4982 0 R 4983 0 R 4984 0 R 4985 0 R 4986 0 R 4987 0 R 4988 0 R 4989 0 R 4990 0 R 4991 0 R 4992 0 R 4993 0 R 4994 0 R 4995 0 R 4996 0 R]
+/Annots [4916 0 R 4917 0 R 4918 0 R 4919 0 R 4920 0 R 4921 0 R 4922 0 R 4923 0 R 4924 0 R 4925 0 R 4926 0 R 4927 0 R 4928 0 R 4929 0 R 4930 0 R 4931 0 R 4932 0 R 4933 0 R 4934 0 R 4935 0 R 4936 0 R 4937 0 R 4938 0 R 4939 0 R 4940 0 R 4941 0 R 4942 0 R 4943 0 R 4944 0 R 4945 0 R 4946 0 R 4947 0 R 4948 0 R 4949 0 R 4950 0 R 4951 0 R 4952 0 R 4953 0 R 4954 0 R 4955 0 R 4956 0 R 4957 0 R 4958 0 R 4959 0 R 4960 0 R 4961 0 R 4962 0 R 4963 0 R 4964 0 R 4965 0 R 4966 0 R 4967 0 R 4968 0 R 4969 0 R 4970 0 R 4971 0 R 4972 0 R 4973 0 R 4974 0 R 4975 0 R 4976 0 R 4977 0 R 4978 0 R 4979 0 R 4980 0 R 4981 0 R 4982 0 R 4983 0 R 4984 0 R 4985 0 R 4986 0 R 4987 0 R 4988 0 R 4989 0 R 4990 0 R 4991 0 R 4992 0 R 4993 0 R 4994 0 R 4995 0 R 4996 0 R 4997 0 R 4998 0 R 4999 0 R]
 >>
 endobj
 23 0 obj
@@ -10152,7 +10152,7 @@ ET
 BT
 529.4315 794.676 Td
 /F1.0 10.5 Tf
-<373532> Tj
+<373533> Tj
 ET
 
 0.0 0.0 0.0 SCN
@@ -10192,7 +10192,7 @@ ET
 BT
 529.4315 776.196 Td
 /F1.0 10.5 Tf
-<373533> Tj
+<373534> Tj
 ET
 
 0.0 0.0 0.0 SCN
@@ -10232,7 +10232,7 @@ ET
 BT
 529.4315 757.716 Td
 /F1.0 10.5 Tf
-<373534> Tj
+<373535> Tj
 ET
 
 0.0 0.0 0.0 SCN
@@ -10272,7 +10272,7 @@ ET
 BT
 529.4315 739.236 Td
 /F1.0 10.5 Tf
-<373538> Tj
+<373539> Tj
 ET
 
 0.0 0.0 0.0 SCN
@@ -10312,7 +10312,7 @@ ET
 BT
 529.4315 720.756 Td
 /F1.0 10.5 Tf
-<373539> Tj
+<373630> Tj
 ET
 
 0.0 0.0 0.0 SCN
@@ -10334,7 +10334,7 @@ endobj
 /Font << /F1.0 10 0 R
 >>
 >>
-/Annots [4997 0 R 4998 0 R 4999 0 R 5000 0 R 5001 0 R 5002 0 R 5003 0 R 5004 0 R 5005 0 R 5006 0 R]
+/Annots [5000 0 R 5001 0 R 5002 0 R 5003 0 R 5004 0 R 5005 0 R 5006 0 R 5007 0 R 5008 0 R 5009 0 R]
 >>
 endobj
 25 0 obj
@@ -11146,7 +11146,7 @@ endobj
 /F4.0 37 0 R
 /F1.1 40 0 R
 >>
-/XObject << /Stamp1 5007 0 R
+/XObject << /Stamp1 5010 0 R
 >>
 >>
 /Annots [32 0 R 33 0 R 34 0 R 36 0 R 38 0 R 39 0 R 41 0 R 42 0 R 43 0 R]
@@ -11161,7 +11161,7 @@ endobj
 >>
 endobj
 29 0 obj
-<< /Kids [651 0 R 3748 0 R 1979 0 R 652 0 R 3679 0 R 1190 0 R 2609 0 R 3983 0 R]
+<< /Kids [651 0 R 3751 0 R 1979 0 R 652 0 R 3682 0 R 1190 0 R 2609 0 R 3986 0 R]
 >>
 endobj
 30 0 obj
@@ -11171,11 +11171,11 @@ endobj
 << /Type /Font
 /BaseFont /309344+NotoSerif-Bold
 /Subtype /TrueType
-/FontDescriptor 5266 0 R
+/FontDescriptor 5269 0 R
 /FirstChar 32
 /LastChar 255
-/Widths 5268 0 R
-/ToUnicode 5267 0 R
+/Widths 5271 0 R
+/ToUnicode 5270 0 R
 >>
 endobj
 32 0 obj
@@ -11215,11 +11215,11 @@ endobj
 << /Type /Font
 /BaseFont /fbe45d+NotoSerif-Italic
 /Subtype /TrueType
-/FontDescriptor 5270 0 R
+/FontDescriptor 5273 0 R
 /FirstChar 32
 /LastChar 255
-/Widths 5272 0 R
-/ToUnicode 5271 0 R
+/Widths 5275 0 R
+/ToUnicode 5274 0 R
 >>
 endobj
 36 0 obj
@@ -11237,11 +11237,11 @@ endobj
 << /Type /Font
 /BaseFont /c7d210+mplus1mn-regular
 /Subtype /TrueType
-/FontDescriptor 5274 0 R
+/FontDescriptor 5277 0 R
 /FirstChar 32
 /LastChar 255
-/Widths 5276 0 R
-/ToUnicode 5275 0 R
+/Widths 5279 0 R
+/ToUnicode 5278 0 R
 >>
 endobj
 38 0 obj
@@ -11267,11 +11267,11 @@ endobj
 << /Type /Font
 /BaseFont /6bc580+NotoSerif
 /Subtype /TrueType
-/FontDescriptor 5278 0 R
+/FontDescriptor 5281 0 R
 /FirstChar 32
 /LastChar 255
-/Widths 5280 0 R
-/ToUnicode 5279 0 R
+/Widths 5283 0 R
+/ToUnicode 5282 0 R
 >>
 endobj
 41 0 obj
@@ -11705,7 +11705,7 @@ endobj
 /F5.1 47 0 R
 /F2.0 31 0 R
 >>
-/XObject << /Stamp2 5008 0 R
+/XObject << /Stamp2 5011 0 R
 >>
 >>
 >>
@@ -11714,11 +11714,11 @@ endobj
 << /Type /Font
 /BaseFont /26ec65+FontAwesome
 /Subtype /TrueType
-/FontDescriptor 5282 0 R
+/FontDescriptor 5285 0 R
 /FirstChar 32
 /LastChar 255
-/Widths 5284 0 R
-/ToUnicode 5283 0 R
+/Widths 5287 0 R
+/ToUnicode 5286 0 R
 >>
 endobj
 48 0 obj
@@ -11776,7 +11776,7 @@ endobj
 /Font << /F2.0 31 0 R
 /F1.0 10 0 R
 >>
-/XObject << /Stamp1 5007 0 R
+/XObject << /Stamp1 5010 0 R
 >>
 >>
 >>
@@ -11861,7 +11861,7 @@ endobj
 /Font << /F2.0 31 0 R
 /F1.0 10 0 R
 >>
-/XObject << /Stamp2 5008 0 R
+/XObject << /Stamp2 5011 0 R
 >>
 >>
 /Annots [54 0 R]
@@ -13434,7 +13434,7 @@ endobj
 /F1.1 40 0 R
 /F4.0 37 0 R
 >>
-/XObject << /Stamp1 5007 0 R
+/XObject << /Stamp1 5010 0 R
 >>
 >>
 /Annots [59 0 R 61 0 R]
@@ -14554,7 +14554,7 @@ endobj
 /F1.0 10 0 R
 /F5.1 47 0 R
 >>
-/XObject << /Stamp2 5008 0 R
+/XObject << /Stamp2 5011 0 R
 >>
 >>
 >>
@@ -15433,7 +15433,7 @@ endobj
 /F3.0 35 0 R
 /F5.1 47 0 R
 >>
-/XObject << /Stamp1 5007 0 R
+/XObject << /Stamp1 5010 0 R
 >>
 >>
 /Annots [66 0 R]
@@ -16223,7 +16223,7 @@ endobj
 /Font << /F4.0 37 0 R
 /F1.0 10 0 R
 >>
-/XObject << /Stamp2 5008 0 R
+/XObject << /Stamp2 5011 0 R
 >>
 >>
 >>
@@ -16942,7 +16942,7 @@ endobj
 /Font << /F4.0 37 0 R
 /F1.0 10 0 R
 >>
-/XObject << /Stamp1 5007 0 R
+/XObject << /Stamp1 5010 0 R
 >>
 >>
 >>
@@ -17818,7 +17818,7 @@ endobj
 /F2.0 31 0 R
 /F5.1 47 0 R
 >>
-/XObject << /Stamp2 5008 0 R
+/XObject << /Stamp2 5011 0 R
 >>
 >>
 /Annots [75 0 R 76 0 R 77 0 R 78 0 R]
@@ -18808,7 +18808,7 @@ endobj
 /F1.0 10 0 R
 /F3.0 35 0 R
 >>
-/XObject << /Stamp1 5007 0 R
+/XObject << /Stamp1 5010 0 R
 >>
 >>
 /Annots [81 0 R]
@@ -19731,7 +19731,7 @@ endobj
 /F4.0 37 0 R
 /F3.0 35 0 R
 >>
-/XObject << /Stamp2 5008 0 R
+/XObject << /Stamp2 5011 0 R
 >>
 >>
 >>
@@ -21242,7 +21242,7 @@ endobj
 /F4.0 37 0 R
 /F5.1 47 0 R
 >>
-/XObject << /Stamp1 5007 0 R
+/XObject << /Stamp1 5010 0 R
 >>
 >>
 /Annots [86 0 R 88 0 R]
@@ -22590,7 +22590,7 @@ endobj
 /F4.0 37 0 R
 /F3.0 35 0 R
 >>
-/XObject << /Stamp2 5008 0 R
+/XObject << /Stamp2 5011 0 R
 >>
 >>
 /Annots [92 0 R]
@@ -23664,7 +23664,7 @@ endobj
 /F1.0 10 0 R
 /F3.0 35 0 R
 >>
-/XObject << /Stamp1 5007 0 R
+/XObject << /Stamp1 5010 0 R
 >>
 >>
 >>
@@ -24387,7 +24387,7 @@ endobj
 /F1.0 10 0 R
 /F3.0 35 0 R
 >>
-/XObject << /Stamp2 5008 0 R
+/XObject << /Stamp2 5011 0 R
 >>
 >>
 >>
@@ -25026,7 +25026,7 @@ endobj
 /F4.0 37 0 R
 /F2.0 31 0 R
 >>
-/XObject << /Stamp1 5007 0 R
+/XObject << /Stamp1 5010 0 R
 >>
 >>
 /Annots [99 0 R 100 0 R 101 0 R 103 0 R]
@@ -25270,7 +25270,7 @@ endobj
 /Font << /F2.0 31 0 R
 /F1.0 10 0 R
 >>
-/XObject << /Stamp2 5008 0 R
+/XObject << /Stamp2 5011 0 R
 >>
 >>
 /Annots [107 0 R 108 0 R 109 0 R 110 0 R]
@@ -26142,7 +26142,7 @@ endobj
 /F4.0 37 0 R
 /F5.1 47 0 R
 >>
-/XObject << /Stamp1 5007 0 R
+/XObject << /Stamp1 5010 0 R
 >>
 >>
 /Annots [114 0 R 115 0 R]
@@ -26422,7 +26422,7 @@ endobj
 /F1.0 10 0 R
 /F4.0 37 0 R
 >>
-/XObject << /Stamp2 5008 0 R
+/XObject << /Stamp2 5011 0 R
 >>
 >>
 >>
@@ -27902,7 +27902,7 @@ endobj
 /F5.1 47 0 R
 /F4.0 37 0 R
 >>
-/XObject << /Stamp1 5007 0 R
+/XObject << /Stamp1 5010 0 R
 >>
 >>
 /Annots [122 0 R 123 0 R 124 0 R 125 0 R 126 0 R 127 0 R 128 0 R 130 0 R 131 0 R 132 0 R 133 0 R]
@@ -28942,7 +28942,7 @@ endobj
 /F2.0 31 0 R
 /F4.0 37 0 R
 >>
-/XObject << /Stamp2 5008 0 R
+/XObject << /Stamp2 5011 0 R
 >>
 >>
 /Annots [136 0 R 138 0 R]
@@ -29695,7 +29695,7 @@ endobj
 /F2.0 31 0 R
 /F5.1 47 0 R
 >>
-/XObject << /Stamp1 5007 0 R
+/XObject << /Stamp1 5010 0 R
 >>
 >>
 /Annots [141 0 R 143 0 R 144 0 R 145 0 R 146 0 R]
@@ -33665,7 +33665,7 @@ endobj
 /F2.0 31 0 R
 /F5.1 47 0 R
 >>
-/XObject << /Stamp2 5008 0 R
+/XObject << /Stamp2 5011 0 R
 >>
 >>
 /Annots [149 0 R 150 0 R 151 0 R 152 0 R 153 0 R 154 0 R 155 0 R]
@@ -34622,7 +34622,7 @@ endobj
 /F2.0 31 0 R
 /F4.0 37 0 R
 >>
-/XObject << /Stamp1 5007 0 R
+/XObject << /Stamp1 5010 0 R
 >>
 >>
 /Annots [158 0 R 159 0 R 163 0 R]
@@ -34655,12 +34655,12 @@ endobj
 endobj
 161 0 obj
 << /Limits [(__anchor-top) (adding.new.node)]
-/Names [(__anchor-top) 27 0 R (__indexterm-2002) 3644 0 R (__indexterm-2004) 3646 0 R (__indexterm-2006) 3648 0 R (__indexterm-2008) 3651 0 R (accesscontrolclient-changes) 4504 0 R (acid) 963 0 R (acl) 3446 0 R (add-metric-name-and-function-to-hadoop-compat-interface) 3746 0 R (add-the-implementation-to-both-hadoop-1-and-hadoop-2-compat-modules) 3749 0 R (add.metrics) 3744 0 R (adding-a-new-chapter-to-the-hbase-reference-guide) 4086 0 R (adding.new.node) 3187 0 R]
+/Names [(__anchor-top) 27 0 R (__indexterm-2002) 3647 0 R (__indexterm-2004) 3649 0 R (__indexterm-2006) 3651 0 R (__indexterm-2008) 3654 0 R (accesscontrolclient-changes) 4507 0 R (acid) 963 0 R (acl) 3449 0 R (add-metric-name-and-function-to-hadoop-compat-interface) 3749 0 R (add-the-implementation-to-both-hadoop-1-and-hadoop-2-compat-modules) 3752 0 R (add.metrics) 3747 0 R (adding-a-new-chapter-to-the-hbase-reference-guide) 4089 0 R (adding.new.node) 3190 0 R]
 >>
 endobj
 162 0 obj
 << /Limits [(io.storefile.bloom.block.size) (jdk-version-requirements)]
-/Names [(io.storefile.bloom.block.size) 365 0 R (ipc) 4412 0 R (irbrc) 826 0 R (irc) 3478 0 R (isolate-system-tables) 3440 0 R (java) 121 0 R (java-2) 1982 0 R (java-3) 1987 0 R (java.client.config) 526 0 R (jdk-issues) 2985 0 R (jdk-version-requirements) 58 0 R]
+/Names [(io.storefile.bloom.block.size) 365 0 R (ipc) 4415 0 R (irbrc) 826 0 R (irc) 3481 0 R (isolate-system-tables) 3443 0 R (java) 121 0 R (java-2) 1982 0 R (java-3) 1987 0 R (java.client.config) 526 0 R (jdk-issues) 2988 0 R (jdk-version-requirements) 58 0 R]
 >>
 endobj
 163 0 obj
@@ -34782,7 +34782,7 @@ endobj
 /F1.0 10 0 R
 /F2.0 31 0 R
 >>
-/XObject << /Stamp2 5008 0 R
+/XObject << /Stamp2 5011 0 R
 >>
 >>
 /Annots [166 0 R]
@@ -35916,7 +35916,7 @@ endobj
 /F4.0 37 0 R
 /F1.1 40 0 R
 >>
-/XObject << /Stamp1 5007 0 R
+/XObject << /Stamp1 5010 0 R
 >>
 >>
 /Annots [171 0 R 172 0 R 174 0 R]
@@ -36716,7 +36716,7 @@ endobj
 /F5.1 47 0 R
 /F4.0 37 0 R
 >>
-/XObject << /Stamp2 5008 0 R
+/XObject << /Stamp2 5011 0 R
 >>
 >>
 /Annots [179 0 R 180 0 R 181 0 R 183 0 R 184 0 R 186 0 R 187 0 R]
@@ -38188,7 +38188,7 @@ endobj
 /F1.0 10 0 R
 /F4.0 37 0 R
 >>
-/XObject << /Stamp1 5007 0 R
+/XObject << /Stamp1 5010 0 R
 >>
 >>
 /Annots [190 0 R 191 0 R]
@@ -38613,7 +38613,7 @@ endobj
 /F4.0 37 0 R
 /F3.0 35 0 R
 >>
-/XObject << /Stamp2 5008 0 R
+/XObject << /Stamp2 5011 0 R
 >>
 >>
 >>
@@ -39269,7 +39269,7 @@ endobj
 /F3.0 35 0 R
 /F4.0 37 0 R
 >>
-/XObject << /Stamp1 5007 0 R
+/XObject << /Stamp1 5010 0 R
 >>
 >>
 /Annots [197 0 R]
@@ -40036,7 +40036,7 @@ endobj
 /F4.0 37 0 R
 /F1.1 40 0 R
 >>
-/XObject << /Stamp2 5008 0 R
+/XObject << /Stamp2 5011 0 R
 >>
 >>
 /Annots [202 0 R]
@@ -40567,7 +40567,7 @@ endobj
 /F3.0 35 0 R
 /F1.0 10 0 R
 >>
-/XObject << /Stamp1 5007 0 R
+/XObject << /Stamp1 5010 0 R
 >>
 >>
 >>
@@ -40583,7 +40583,7 @@ endobj
 endobj
 212 0 obj
 << /Limits [(getshortmidpointkey-an-optimization-for-data-index-block) (handling-of-errors-during-log-splitting)]
-/Names [(getshortmidpointkey-an-optimization-for-data-index-block) 4265 0 R (getting.involved) 3467 0 R (getting_started) 50 0 R (git.best.practices) 3750 0 R (git.patch.flow) 3812 0 R (goals) 4358 0 R (guide-for-hbase-committers) 3777 0 R (guidelines-for-deploying-a-coprocessor) 2447 0 R (guidelines-for-reporting-effective-issues) 3485 0 R (hadoop) 142 0 R (hadoop.native.lib) 4183 0 R (hadoop.policy.file) 391 0 R (handling-of-errors-during-log-splitting) 1720 0 R]
+/Names [(getshortmidpointkey-an-optimization-for-data-index-block) 4268 0 R (getting.involved) 3470 0 R (getting_started) 50 0 R (git.best.practices) 3753 0 R (git.patch.flow) 3815 0 R (goals) 4361 0 R (guide-for-hbase-committers) 3780 0 R (guidelines-for-deploying-a-coprocessor) 2447 0 R (guidelines-for-reporting-effective-issues) 3488 0 R (hadoop) 142 0 R (hadoop.native.lib) 4186 0 R (hadoop.policy.file) 391 0 R (handling-of-errors-during-log-splitting) 1720 0 R]
 >>
 endobj
 213 0 obj
@@ -41113,7 +41113,7 @@ endobj
 /F3.0 35 0 R
 /F1.0 10 0 R
 >>
-/XObject << /Stamp2 5008 0 R
+/XObject << /Stamp2 5011 0 R
 >>
 >>
 >>
@@ -41635,7 +41635,7 @@ endobj
 /F1.0 10 0 R
 /F4.0 37 0 R
 >>
-/XObject << /Stamp1 5007 0 R
+/XObject << /Stamp1 5010 0 R
 >>
 >>
 >>
@@ -42270,7 +42270,7 @@ endobj
 /F3.0 35 0 R
 /F1.0 10 0 R
 >>
-/XObject << /Stamp2 5008 0 R
+/XObject << /Stamp2 5011 0 R
 >>
 >>
 >>
@@ -42779,7 +42779,7 @@ endobj
 /F3.0 35 0 R
 /F4.0 37 0 R
 >>
-/XObject << /Stamp1 5007 0 R
+/XObject << /Stamp1 5010 0 R
 >>
 >>
 >>
@@ -43310,7 +43310,7 @@ endobj
 /F3.0 35 0 R
 /F4.0 37 0 R
 >>
-/XObject << /Stamp2 5008 0 R
+/XObject << /Stamp2 5011 0 R
 >>
 >>
 >>
@@ -43889,7 +43889,7 @@ endobj
 /F3.0 35 0 R
 /F1.0 10 0 R
 >>
-/XObject << /Stamp1 5007 0 R
+/XObject << /Stamp1 5010 0 R
 >>
 >>
 /Annots [258 0 R 259 0 R]
@@ -44456,7 +44456,7 @@ endobj
 /F1.0 10 0 R
 /F4.0 37 0 R
 >>
-/XObject << /Stamp2 5008 0 R
+/XObject << /Stamp2 5011 0 R
 >>
 >>
 /Annots [267 0 R 268 0 R 270 0 R 271 0 R]
@@ -44520,7 +44520,7 @@ endobj
 endobj
 274 0 obj
 << /Limits [(hbase.table.lock.enable) (hbase.tmp.dir)]
-/Names [(hbase.table.lock.enable) 418 0 R (hbase.table.max.rowsize) 419 0 R (hbase.tags) 1382 0 R (hbase.tests) 3627 0 R (hbase.tests.categories) 3671 0 R (hbase.tests.cluster) 3673 0 R (hbase.tests.example.code) 3674 0 R (hbase.tests.rules) 3667 0 R (hbase.tests.sleeps) 3672 0 R (hbase.tests.writing) 3666 0 R (hbase.thrift.maxQueuedRequests) 423 0 R (hbase.thrift.maxWorkerThreads) 422 0 R (hbase.thrift.minWorkerThreads) 421 0 R (hbase.tmp.dir) 204 0 R]
+/Names [(hbase.table.lock.enable) 418 0 R (hbase.table.max.rowsize) 419 0 R (hbase.tags) 1382 0 R (hbase.tests) 3630 0 R (hbase.tests.categories) 3674 0 R (hbase.tests.cluster) 3676 0 R (hbase.tests.example.code) 3677 0 R (hbase.tests.rules) 3670 0 R (hbase.tests.sleeps) 3675 0 R (hbase.tests.writing) 3669 0 R (hbase.thrift.maxQueuedRequests) 423 0 R (hbase.thrift.maxWorkerThreads) 422 0 R (hbase.thrift.minWorkerThreads) 421 0 R (hbase.tmp.dir) 204 0 R]
 >>
 endobj
 275 0 obj
@@ -45076,7 +45076,7 @@ endobj
 /F1.0 10 0 R
 /F1.1 40 0 R
 >>
-/XObject << /Stamp1 5007 0 R
+/XObject << /Stamp1 5010 0 R
 >>
 >>
 >>
@@ -45671,7 +45671,7 @@ endobj
 /F4.0 37 0 R
 /F1.0 10 0 R
 >>
-/XObject << /Stamp2 5008 0 R
+/XObject << /Stamp2 5011 0 R
 >>
 >>
 /Annots [291 0 R 292 0 R]
@@ -45691,7 +45691,7 @@ endobj
 endobj
 290 0 obj
 << /Limits [(hbase.cluster.distributed) (hbase.data.umask.enable)]
-/Names [(hbase.cluster.distributed) 206 0 R (hbase.column.max.version) 445 0 R (hbase.commit.msg.format) 4029 0 R (hbase.coordinated.state.manager.class) 485 0 R (hbase.coprocessor.abortonerror) 407 0 R (hbase.coprocessor.enabled) 402 0 R (hbase.coprocessor.master.classes) 406 0 R (hbase.coprocessor.region.classes) 405 0 R (hbase.coprocessor.user.enabled) 404 0 R (hbase.data.umask) 433 0 R (hbase.data.umask.enable) 432 0 R]
+/Names [(hbase.cluster.distributed) 206 0 R (hbase.column.max.version) 445 0 R (hbase.commit.msg.format) 4032 0 R (hbase.coordinated.state.manager.class) 485 0 R (hbase.coprocessor.abortonerror) 407 0 R (hbase.coprocessor.enabled) 402 0 R (hbase.coprocessor.master.classes) 406 0 R (hbase.coprocessor.region.classes) 405 0 R (hbase.coprocessor.user.enabled) 404 0 R (hbase.data.umask) 433 0 R (hbase.data.umask.enable) 432 0 R]
 >>
 endobj
 291 0 obj
@@ -46237,7 +46237,7 @@ endobj
 /F3.0 35 0 R
 /F4.0 37 0 R
 >>
-/XObject << /Stamp1 5007 0 R
+/XObject << /Stamp1 5010 0 R
 >>
 >>
 >>
@@ -46728,7 +46728,7 @@ endobj
 /F3.0 35 0 R
 /F4.0 37 0 R
 >>
-/XObject << /Stamp2 5008 0 R
+/XObject << /Stamp2 5011 0 R
 >>
 >>
 >>
@@ -47300,7 +47300,7 @@ endobj
 /F3.0 35 0 R
 /F1.0 10 0 R
 >>
-/XObject << /Stamp1 5007 0 R
+/XObject << /Stamp1 5010 0 R
 >>
 >>
 >>
@@ -47846,7 +47846,7 @@ endobj
 /F3.0 35 0 R
 /F1.0 10 0 R
 >>
-/XObject << /Stamp2 5008 0 R
+/XObject << /Stamp2 5011 0 R
 >>
 >>
 >>
@@ -48423,7 +48423,7 @@ endobj
 /F3.0 35 0 R
 /F1.0 10 0 R
 >>
-/XObject << /Stamp1 5007 0 R
+/XObject << /Stamp1 5010 0 R
 >>
 >>
 >>
@@ -49043,7 +49043,7 @@ endobj
 /F3.0 35 0 R
 /F1.0 10 0 R
 >>
-/XObject << /Stamp2 5008 0 R
+/XObject << /Stamp2 5011 0 R
 >>
 >>
 >>
@@ -49590,7 +49590,7 @@ endobj
 /F3.0 35 0 R
 /F4.0 37 0 R
 >>
-/XObject << /Stamp1 5007 0 R
+/XObject << /Stamp1 5010 0 R
 >>
 >>
 >>
@@ -50113,7 +50113,7 @@ endobj
 /F3.0 35 0 R
 /F4.0 37 0 R
 >>
-/XObject << /Stamp2 5008 0 R
+/XObject << /Stamp2 5011 0 R
 >>
 >>
 >>
@@ -50673,7 +50673,7 @@ endobj
 /F3.0 35 0 R
 /F1.0 10 0 R
 >>
-/XObject << /Stamp1 5007 0 R
+/XObject << /Stamp1 5010 0 R
 >>
 >>
 /Annots [357 0 R]
@@ -51208,7 +51208,7 @@ endobj
 /F3.0 35 0 R
 /F4.0 37 0 R
 >>
-/XObject << /Stamp2 5008 0 R
+/XObject << /Stamp2 5011 0 R
 >>
 >>
 /Annots [363 0 R]
@@ -51233,7 +51233,7 @@ endobj
 endobj
 366 0 obj
 << /Limits [(quota) (regions.arch)]
-/Names [(quota) 3300 0 R (read-api-and-usage) 1983 0 R (read-hbase-shell-commands-from-a-command-file) 812 0 R (reading-filtering-and-sending-edits) 3280 0 R (reading_cells_with_labels) 1436 0 R (recommended.configurations.hdfs) 554 0 R (recommended_configurations) 549 0 R (recommended_configurations.zk) 550 0 R (references) 3917 0 R (region-overlap-repairs) 4141 0 R (region-replication-for-meta-table-s-region) 1960 0 R (region-scanner-changes) 4484 0 R (region-transition-rpc-and-rs-heartbeat-can-arrive-at-same-time-on-master) 3950 0 R (regioncoprocessorenvironment-getregion-abstract-hregion) 4409 0 R (regioncoprocessorhost-postappend-append-append-result-result-void) 4410 0 R (regioncoprocessorhost-prestorefilereaderopen-filesystem-fs-path-p-fsdatainputstreamwrapper-in-long-size-cacheconfig-cacheconf-reference-r-storefile-reader) 4411 0 R (regionobserver) 4397 0 R (regions.arch) 1754 0 R]
+/Names [(quota) 3303 0 R (read-api-and-usage) 1983 0 R (read-hbase-shell-commands-from-a-command-file) 812 0 R (reading-filtering-and-sending-edits) 3283 0 R (reading_cells_with_labels) 1436 0 R (recommended.configurations.hdfs) 554 0 R (recommended_configurations) 549 0 R (recommended_configurations.zk) 550 0 R (references) 3920 0 R (region-overlap-repairs) 4144 0 R (region-replication-for-meta-table-s-region) 1960 0 R (region-scanner-changes) 4487 0 R (region-transition-rpc-and-rs-heartbeat-can-arrive-at-same-time-on-master) 3953 0 R (regioncoprocessorenvironment-getregion-abstract-hregion) 4412 0 R (regioncoprocessorhost-postappend-append-append-result-result-void) 4413 0 R (regioncoprocessorhost-prestorefilereaderopen-filesystem-fs-path-p-fsdatainputstreamwrapper-in-long-size-cacheconfig-cacheconf-reference-r-storefile-reader) 4414 0 R (regionobserver) 4400 0 R (regions.arch) 1754 0 R]
 >>
 endobj
 367 0 obj
@@ -51872,7 +51872,7 @@ endobj
 /F3.0 35 0 R
 /F1.0 10 0 R
 >>
-/XObject << /Stamp1 5007 0 R
+/XObject << /Stamp1 5010 0 R
 >>
 >>
 /Annots [377 0 R 378 0 R 380 0 R 383 0 R 384 0 R]
@@ -51883,7 +51883,7 @@ endobj
 endobj
 375 0 obj
 << /Limits [(hbase.regionserver.thrift.compact) (hbase.rootdir.perms)]
-/Names [(hbase.regionserver.thrift.compact) 428 0 R (hbase.regionserver.thrift.framed) 424 0 R (hbase.regionserver.thrift.framed.max_frame_size_in_mb) 427 0 R (hbase.release.announcement) 3606 0 R (hbase.replication.management) 3250 0 R (hbase.replication.rpc.codec) 496 0 R (hbase.replication.source.maxthreads) 497 0 R (hbase.rest-csrf.browser-useragents-regex) 478 0 R (hbase.rest.csrf.enabled) 477 0 R (hbase.rest.filter.classes) 468 0 R (hbase.rest.port) 410 0 R (hbase.rest.readonly) 411 0 R (hbase.rest.support.proxyuser) 414 0 R (hbase.rest.threads.max) 412 0 R (hbase.rest.threads.min) 413 0 R (hbase.rolling.restart) 643 0 R (hbase.rolling.upgrade) 639 0 R (hbase.rootdir) 205 0 R (hbase.rootdir.perms) 429 0 R]
+/Names [(hbase.regionserver.thrift.compact) 428 0 R (hbase.regionserver.thrift.framed) 424 0 R (hbase.regionserver.thrift.framed.max_frame_size_in_mb) 427 0 R (hbase.release.announcement) 3609 0 R (hbase.replication.management) 3253 0 R (hbase.replication.rpc.codec) 496 0 R (hbase.replication.source.maxthreads) 497 0 R (hbase.rest-csrf.browser-useragents-regex) 478 0 R (hbase.rest.csrf.enabled) 477 0 R (hbase.rest.filter.classes) 468 0 R (hbase.rest.port) 410 0 R (hbase.rest.readonly) 411 0 R (hbase.rest.support.proxyuser) 414 0 R (hbase.rest.threads.max) 412 0 R (hbase.rest.threads.min) 413 0 R (hbase.rolling.restart) 643 0 R (hbase.rolling.upgrade) 639 0 R (hbase.rootdir) 205 0 R (hbase.rootdir.perms) 429 0 R]
 >>
 endobj
 376 0 obj
@@ -52462,7 +52462,7 @@ endobj
 /F3.0 35 0 R
 /F1.0 10 0 R
 >>
-/XObject << /Stamp2 5008 0 R
+/XObject << /Stamp2 5011 0 R
 >>
 >>
 >>
@@ -52996,7 +52996,7 @@ endobj
 /F3.0 35 0 R
 /F4.0 37 0 R
 >>
-/XObject << /Stamp1 5007 0 R
+/XObject << /Stamp1 5010 0 R
 >>
 >>
 >>
@@ -53546,7 +53546,7 @@ endobj
 /F4.0 37 0 R
 /F1.0 10 0 R
 >>
-/XObject << /Stamp2 5008 0 R
+/XObject << /Stamp2 5011 0 R
 >>
 >>
 >>
@@ -54066,7 +54066,7 @@ endobj
 /F4.0 37 0 R
 /F1.0 10 0 R
 >>
-/XObject << /Stamp1 5007 0 R
+/XObject << /Stamp1 5010 0 R
 >>
 >>
 >>
@@ -54599,7 +54599,7 @@ endobj
 /F4.0 37 0 R
 /F1.0 10 0 R
 >>
-/XObject << /Stamp2 5008 0 R
+/XObject << /Stamp2 5011 0 R
 >>
 >>
 >>
@@ -54612,7 +54612,7 @@ endobj
 endobj
 420 0 obj
 << /Limits [(hbase.zookeeper.property.maxClientCnxns) (hbase_supported_tested_definitions)]
-/Names [(hbase.zookeeper.property.maxClientCnxns) 279 0 R (hbase.zookeeper.property.syncLimit) 273 0 R (hbase.zookeeper.quorum) 209 0 R (hbase_apis) 2201 0 R (hbase_default_configurations) 203 0 R (hbase_env) 538 0 R (hbase_metrics) 3192 0 R (hbase_mob) 1997 0 R (hbase_site) 534 0 R (hbase_supported_tested_definitions) 44 0 R]
+/Names [(hbase.zookeeper.property.maxClientCnxns) 279 0 R (hbase.zookeeper.property.syncLimit) 273 0 R (hbase.zookeeper.quorum) 209 0 R (hbase_apis) 2201 0 R (hbase_default_configurations) 203 0 R (hbase_env) 538 0 R (hbase_metrics) 3195 0 R (hbase_mob) 1997 0 R (hbase_site) 534 0 R (hbase_supported_tested_definitions) 44 0 R]
 >>
 endobj
 421 0 obj
@@ -55087,7 +55087,7 @@ endobj
 /F4.0 37 0 R
 /F1.0 10 0 R
 >>
-/XObject << /Stamp1 5007 0 R
+/XObject << /Stamp1 5010 0 R
 >>
 >>
 >>
@@ -55103,7 +55103,7 @@ endobj
 endobj
 430 0 obj
 << /Limits [(hbase.rpc) (hbase.secure.spnego.ui)]
-/Names [(hbase.rpc) 4351 0 R (hbase.rpc.rows.warning.threshold) 517 0 R (hbase.rpc.shortoperation.timeout) 374 0 R (hbase.rpc.timeout) 368 0 R (hbase.rs.cacheblocksonwrite) 367 0 R (hbase.secure.bulkload) 1462 0 R (hbase.secure.configuration) 1302 0 R (hbase.secure.enable) 1466 0 R (hbase.secure.simpleconfiguration) 1344 0 R (hbase.secure.spnego.ui) 1297 0 R]
+/Names [(hbase.rpc) 4354 0 R (hbase.rpc.rows.warning.threshold) 517 0 R (hbase.rpc.shortoperation.timeout) 374 0 R (hbase.rpc.timeout) 368 0 R (hbase.rs.cacheblocksonwrite) 367 0 R (hbase.secure.bulkload) 1462 0 R (hbase.secure.configuration) 1302 0 R (hbase.secure.enable) 1466 0 R (hbase.secure.simpleconfiguration) 1344 0 R (hbase.secure.spnego.ui) 1297 0 R]
 >>
 endobj
 431 0 obj
@@ -55625,7 +55625,7 @@ endobj
 /F4.0 37 0 R
 /F1.0 10 0 R
 >>
-/XObject << /Stamp2 5008 0 R
+/XObject << /Stamp2 5011 0 R
 >>
 >>
 >>
@@ -56170,7 +56170,7 @@ endobj
 /F3.0 35 0 R
 /F1.0 10 0 R
 >>
-/XObject << /Stamp1 5007 0 R
+/XObject << /Stamp1 5010 0 R
 >>
 >>
 >>
@@ -56720,7 +56720,7 @@ endobj
 /F3.0 35 0 R
 /F4.0 37 0 R
 >>
-/XObject << /Stamp2 5008 0 R
+/XObject << /Stamp2 5011 0 R
 >>
 >>
 >>
@@ -57208,7 +57208,7 @@ endobj
 /F3.0 35 0 R
 /F4.0 37 0 R
 >>
-/XObject << /Stamp1 5007 0 R
+/XObject << /Stamp1 5010 0 R
 >>
 >>
 >>
@@ -57803,7 +57803,7 @@ endobj
 /F3.0 35 0 R
 /F1.0 10 0 R
 >>
-/XObject << /Stamp2 5008 0 R
+/XObject << /Stamp2 5011 0 R
 >>
 >>
 /Annots [471 0 R 472 0 R 475 0 R 476 0 R]
@@ -58456,7 +58456,7 @@ endobj
 /F4.0 37 0 R
 /F6.0 481 0 R
 >>
-/XObject << /Stamp1 5007 0 R
+/XObject << /Stamp1 5010 0 R
 >>
 >>
 >>
@@ -58465,11 +58465,11 @@ endobj
 << /Type /Font
 /BaseFont /03fbbc+mplus1mn-bold
 /Subtype /TrueType
-/FontDescriptor 5286 0 R
+/FontDescriptor 5289 0 R
 /FirstChar 32
 /LastChar 255
-/Widths 5288 0 R
-/ToUnicode 5287 0 R
+/Widths 5291 0 R
+/ToUnicode 5290 0 R
 >>
 endobj
 482 0 obj
@@ -58486,7 +58486,7 @@ endobj
 endobj
 486 0 obj
 << /Limits [(hbase.defaults.for.version.skip) (hbase.hregion.percolumnfamilyflush.size.lower.bound.min)]
-/Names [(hbase.defaults.for.version.skip) 415 0 R (hbase.dfs.client.read.shortcircuit.buffer.size) 448 0 R (hbase.display.keys) 399 0 R (hbase.dynamic.jars.dir) 464 0 R (hbase.encryption.server) 1449 0 R (hbase.env.sh) 521 0 R (hbase.fix.version.in.jira) 4017 0 R (hbase.history) 4311 0 R (hbase.hregion.majorcompaction) 320 0 R (hbase.hregion.majorcompaction.jitter) 321 0 R (hbase.hregion.max.filesize) 319 0 R (hbase.hregion.memstore.block.multiplier) 315 0 R (hbase.hregion.memstore.flush.size) 312 0 R (hbase.hregion.memstore.mslab.enabled) 316 0 R (hbase.hregion.percolumnfamilyflush.size.lower.bound.min) 313 0 R]
+/Names [(hbase.defaults.for.version.skip) 415 0 R (hbase.dfs.client.read.shortcircuit.buffer.size) 448 0 R (hbase.display.keys) 399 0 R (hbase.dynamic.jars.dir) 464 0 R (hbase.encryption.server) 1449 0 R (hbase.env.sh) 521 0 R (hbase.fix.version.in.jira) 4020 0 R (hbase.history) 4314 0 R (hbase.hregion.majorcompaction) 320 0 R (hbase.hregion.majorcompaction.jitter) 321 0 R (hbase.hregion.max.filesize) 319 0 R (hbase.hregion.memstore.block.multiplier) 315 0 R (hbase.hregion.memstore.flush.size) 312 0 R (hbase.hregion.memstore.mslab.enabled) 316 0 R (hbase.hregion.percolumnfamilyflush.size.lower.bound.min) 313 0 R]
 >>
 endobj
 487 0 obj
@@ -59038,7 +59038,7 @@ endobj
 /F3.0 35 0 R
 /F1.0 10 0 R
 >>
-/XObject << /Stamp2 5008 0 R
+/XObject << /Stamp2 5011 0 R
 >>
 >>
 >>
@@ -59565,7 +59565,7 @@ endobj
 /F4.0 37 0 R
 /F1.0 10 0 R
 >>
-/XObject << /Stamp1 5007 0 R
+/XObject << /Stamp1 5010 0 R
 >>
 >>
 >>
@@ -60110,7 +60110,7 @@ endobj
 /F3.0 35 0 R
 /F1.0 10 0 R
 >>
-/XObject << /Stamp2 5008 0 R
+/XObject << /Stamp2 5011 0 R
 >>
 >>
 >>
@@ -60129,7 +60129,7 @@ endobj
 endobj
 508 0 obj
 << /Limits [(hbase.moduletest.run) (hbase.procedure.store.wal.max.retries.before.roll)]
-/Names [(hbase.moduletest.run) 3636 0 R (hbase.moduletest.shell) 3631 0 R (hbase.moduletests) 3629 0 R (hbase.normalizer.min.region.count) 306 0 R (hbase.normalizer.period) 305 0 R (hbase.offpeak.end.hour) 342 0 R (hbase.offpeak.start.hour) 341 0 R (hbase.org) 3617 0 R (hbase.org.site.contributing) 3619 0 R (hbase.org.site.publishing) 3622 0 R (hbase.private.api) 635 0 R (hbase.procedure.master.classes) 484 0 R (hbase.procedure.regionserver.classes) 483 0 R (hbase.procedure.store.wal.max.retries.before.roll) 1613 0 R]
+/Names [(hbase.moduletest.run) 3639 0 R (hbase.moduletest.shell) 3634 0 R (hbase.moduletests) 3632 0 R (hbase.normalizer.min.region.count) 306 0 R (hbase.normalizer.period) 305 0 R (hbase.offpeak.end.hour) 342 0 R (hbase.offpeak.start.hour) 341 0 R (hbase.org) 3620 0 R (hbase.org.site.contributing) 3622 0 R (hbase.org.site.publishing) 3625 0 R (hbase.private.api) 635 0 R (hbase.procedure.master.classes) 484 0 R (hbase.procedure.regionserver.classes) 483 0 R (hbase.procedure.store.wal.max.retries.before.roll) 1613 0 R]
 >>
 endobj
 509 0 obj
@@ -60576,7 +60576,7 @@ endobj
 /F3.0 35 0 R
 /F4.0 37 0 R
 >>
-/XObject << /Stamp1 5007 0 R
+/XObject << /Stamp1 5010 0 R
 >>
 >>
 >>
@@ -61397,7 +61397,7 @@ endobj
 /F2.0 31 0 R
 /F1.0 10 0 R
 >>
-/XObject << /Stamp2 5008 0 R
+/XObject << /Stamp2 5011 0 R
 >>
 >>
 >>
@@ -62735,7 +62735,7 @@ endobj
 /F1.0 10 0 R
 /F3.0 35 0 R
 >>
-/XObject << /Stamp1 5007 0 R
+/XObject << /Stamp1 5010 0 R
 >>
 >>
 /Annots [527 0 R 528 0 R]
@@ -64206,7 +64206,7 @@ endobj
 /F3.0 35 0 R
 /F1.1 40 0 R
 >>
-/XObject << /Stamp2 5008 0 R
+/XObject << /Stamp2 5011 0 R
 >>
 >>
 >>
@@ -64730,7 +64730,7 @@ endobj
 /F1.0 10 0 R
 /F4.0 37 0 R
 >>
-/XObject << /Stamp1 5007 0 R
+/XObject << /Stamp1 5010 0 R
 >>
 >>
 >>
@@ -65383,7 +65383,7 @@ endobj
 /F4.0 37 0 R
 /F1.1 40 0 R
 >>
-/XObject << /Stamp2 5008 0 R
+/XObject << /Stamp2 5011 0 R
 >>
 >>
 /Annots [543 0 R 544 0 R 546 0 R 547 0 R 548 0 R 553 0 R]
@@ -66138,7 +66138,7 @@ endobj
 /F2.0 31 0 R
 /F1.1 40 0 R
 >>
-/XObject << /Stamp1 5007 0 R
+/XObject << /Stamp1 5010 0 R
 >>
 >>
 /Annots [559 0 R 562 0 R 565 0 R]
@@ -66177,7 +66177,7 @@ endobj
 endobj
 564 0 obj
 << /Limits [(configuration) (coprocessor-implementation-overview)]
-/Names [(configuration) 106 0 R (configuration-2) 3221 0 R (configuration-3) 4104 0 R (configuration-files) 113 0 R (configuration-from-scratch) 4002 0 R (configuration-properties) 1965 0 R (configure-mob-compaction-mergeable-threshold) 2006 0 R (configure-mob-compaction-policy) 2005 0 R (configuring-columns-for-mob) 2002 0 R (configuring-server-wide-behavior-of-bloom-filters) 2571 0 R (configuring-the-rest-server-and-client) 2220 0 R (confirm) 196 0 R (connection-setup) 4363 0 R (constraints) 1101 0 R (contributing-to-documentation-or-other-strings) 4040 0 R (coprocessor-api-changes) 4387 0 R (coprocessor-implementation-overview) 2376 0 R]
+/Names [(configuration) 106 0 R (configuration-2) 3224 0 R (configuration-3) 4107 0 R (configuration-files) 113 0 R (configuration-from-scratch) 4005 0 R (configuration-properties) 1965 0 R (configure-mob-compaction-mergeable-threshold) 2006 0 R (configure-mob-compaction-policy) 2005 0 R (configuring-columns-for-mob) 2002 0 R (configuring-server-wide-behavior-of-bloom-filters) 2571 0 R (configuring-the-rest-server-and-client) 2220 0 R (confirm) 196 0 R (connection-setup) 4366 0 R (constraints) 1101 0 R (contributing-to-documentation-or-other-strings) 4043 0 R (coprocessor-api-changes) 4390 0 R (coprocessor-implementation-overview) 2376 0 R]
 >>
 endobj
 565 0 obj
@@ -67039,7 +67039,7 @@ endobj
 /F4.0 37 0 R
 /F5.1 47 0 R
 >>
-/XObject << /Stamp2 5008 0 R
+/XObject << /Stamp2 5011 0 R
 >>
 >>
 /Annots [569 0 R]
@@ -67853,7 +67853,7 @@ endobj
 /F5.1 47 0 R
 /F3.0 35 0 R
 >>
-/XObject << /Stamp1 5007 0 R
+/XObject << /Stamp1 5010 0 R
 >>
 >>
 /Annots [573 0 R 574 0 R 575 0 R 579 0 R 582 0 R 583 0 R 584 0 R]
@@ -68595,7 +68595,7 @@ endobj
 /F1.1 40 0 R
 /F4.0 37 0 R
 >>
-/XObject << /Stamp2 5008 0 R
+/XObject << /Stamp2 5011 0 R
 >>
 >>
 /Annots [588 0 R 589 0 R]
@@ -70027,7 +70027,7 @@ endobj
 /F1.0 10 0 R
 /F3.0 35 0 R
 >>
-/XObject << /Stamp1 5007 0 R
+/XObject << /Stamp1 5010 0 R
 >>
 >>
 /Annots [593 0 R 594 0 R]
@@ -70804,7 +70804,7 @@ endobj
 /F1.0 10 0 R
 /F3.0 35 0 R
 >>
-/XObject << /Stamp2 5008 0 R
+/XObject << /Stamp2 5011 0 R
 >>
 >>
 >>
@@ -71505,7 +71505,7 @@ endobj
 /F3.0 35 0 R
 /F5.1 47 0 R
 >>
-/XObject << /Stamp1 5007 0 R
+/XObject << /Stamp1 5010 0 R
 >>
 >>
 >>
@@ -72836,7 +72836,7 @@ endobj
 /F4.0 37 0 R
 /F3.0 35 0 R
 >>
-/XObject << /Stamp2 5008 0 R
+/XObject << /Stamp2 5011 0 R
 >>
 >>
 >>
@@ -74331,7 +74331,7 @@ endobj
 /Font << /F2.0 31 0 R
 /F1.0 10 0 R
 >>
-/XObject << /Stamp1 5007 0 R
+/XObject << /Stamp1 5010 0 R
 >>
 >>
 >>
@@ -74653,7 +74653,7 @@ endobj
 /Font << /F2.0 31 0 R
 /F1.0 10 0 R
 >>
-/XObject << /Stamp2 5008 0 R
+/XObject << /Stamp2 5011 0 R
 >>
 >>
 >>
@@ -74851,7 +74851,7 @@ endobj
 /Font << /F2.0 31 0 R
 /F1.0 10 0 R
 >>
-/XObject << /Stamp1 5007 0 R
+/XObject << /Stamp1 5010 0 R
 >>
 >>
 /Annots [609 0 R 610 0 R 611 0 R 612 0 R 613 0 R]
@@ -75605,7 +75605,7 @@ endobj
 /F1.0 10 0 R
 /F3.0 35 0 R
 >>
-/XObject << /Stamp2 5008 0 R
+/XObject << /Stamp2 5011 0 R
 >>
 >>
 /Annots [618 0 R]
@@ -76522,7 +76522,7 @@ endobj
 /F3.0 35 0 R
 /F5.1 47 0 R
 >>
-/XObject << /Stamp1 5007 0 R
+/XObject << /Stamp1 5010 0 R
 >>
 >>
 /Annots [622 0 R]
@@ -78837,7 +78837,7 @@ endobj
 /F4.0 37 0 R
 /F3.0 35 0 R
 >>
-/XObject << /Stamp2 5008 0 R
+/XObject << /Stamp2 5011 0 R
 >>
 >>
 /Annots [625 0 R 626 0 R]
@@ -79870,7 +79870,7 @@ endobj
 /F1.1 40 0 R
 /F4.0 37 0 R
 >>
-/XObject << /Stamp1 5007 0 R
+/XObject << /Stamp1 5010 0 R
 >>
 >>
 /Annots [630 0 R 631 0 R 632 0 R]
@@ -80534,7 +80534,7 @@ endobj
 /F2.0 31 0 R
 /F4.0 37 0 R
 >>
-/XObject << /Stamp2 5008 0 R
+/XObject << /Stamp2 5011 0 R
 >>
 >>
 /Annots [640 0 R 641 0 R 642 0 R 644 0 R 645 0 R 646 0 R]
@@ -81329,7 +81329,7 @@ endobj
 /F1.0 10 0 R
 /F3.0 35 0 R
 >>
-/XObject << /Stamp1 5007 0 R
+/XObject << /Stamp1 5010 0 R
 >>
 >>
 /Annots [654 0 R]
@@ -81340,17 +81340,17 @@ endobj
 endobj
 650 0 obj
 << /Limits [(standalone.over.hdfs) (storefile-refresher)]
-/Names [(standalone.over.hdfs) 175 0 R (standalone_dist) 170 0 R (starting-and-stopping-the-rest-server) 2219 0 R (statemachineprocedure) 3913 0 R (static-loading) 2410 0 R (static-unloading) 2413 0 R (store) 1805 0 R (store-file-ttl) 1959 0 R (store.file.dir) 1821 0 R (store.memstore) 1806 0 R (storefile-changes) 4486 0 R (storefile-refresher) 1955 0 R]
+/Names [(standalone.over.hdfs) 175 0 R (standalone_dist) 170 0 R (starting-and-stopping-the-rest-server) 2219 0 R (statemachineprocedure) 3916 0 R (static-loading) 2410 0 R (static-unloading) 2413 0 R (store) 1805 0 R (store-file-ttl) 1959 0 R (store.file.dir) 1821 0 R (store.memstore) 1806 0 R (storefile-changes) 4489 0 R (storefile-refresher) 1955 0 R]
 >>
 endobj
 651 0 obj
 << /Limits [(__anchor-top) (build.thrift)]
-/Kids [161 0 R 3747 0 R 4446 0 R 1923 0 R 1486 0 R 3700 0 R 1664 0 R 4260 0 R 2153 0 R 2111 0 R 2068 0 R 2102 0 R]
+/Kids [161 0 R 3750 0 R 4449 0 R 1923 0 R 1486 0 R 3703 0 R 1664 0 R 4263 0 R 2153 0 R 2111 0 R 2068 0 R 2102 0 R]
 >>
 endobj
 652 0 obj
 << /Limits [(hbase.moduletest.run) (hbase.zookeeper.property.initLimit)]
-/Kids [508 0 R 3620 0 R 382 0 R 245 0 R 375 0 R 430 0 R 4352 0 R 462 0 R 274 0 R 3668 0 R 3639 0 R]
+/Kids [508 0 R 3623 0 R 382 0 R 245 0 R 375 0 R 430 0 R 4355 0 R 462 0 R 274 0 R 3671 0 R 3642 0 R]
 >>
 endobj
 653 0 obj
@@ -82014,7 +82014,7 @@ endobj
 /F1.0 10 0 R
 /F3.0 35 0 R
 >>
-/XObject << /Stamp2 5008 0 R
+/XObject << /Stamp2 5011 0 R
 >>
 >>
 >>
@@ -82729,7 +82729,7 @@ endobj
 /F1.0 10 0 R
 /F2.0 31 0 R
 >>
-/XObject << /Stamp1 5007 0 R
+/XObject << /Stamp1 5010 0 R
 >>
 >>
 /Annots [662 0 R]
@@ -83196,7 +83196,7 @@ endobj
 /F3.0 35 0 R
 /F4.0 37 0 R
 >>
-/XObject << /Stamp2 5008 0 R
+/XObject << /Stamp2 5011 0 R
 >>
 >>
 >>
@@ -83916,7 +83916,7 @@ endobj
 /F1.0 10 0 R
 /F3.0 35 0 R
 >>
-/XObject << /Stamp1 5007 0 R
+/XObject << /Stamp1 5010 0 R
 >>
 >>
 /Annots [671 0 R 674 0 R]
@@ -85182,7 +85182,7 @@ endobj
 /F3.0 35 0 R
 /F2.0 31 0 R
 >>
-/XObject << /Stamp2 5008 0 R
+/XObject << /Stamp2 5011 0 R
 >>
 >>
 /Annots [677 0 R 678 0 R 679 0 R 680 0 R 681 0 R 682 0 R 683 0 R 684 0 R 687 0 R 688 0 R 689 0 R]
@@ -86118,7 +86118,7 @@ endobj
 /Font << /F1.0 10 0 R
 /F3.0 35 0 R
 >>
-/XObject << /Stamp1 5007 0 R
+/XObject << /Stamp1 5010 0 R
 >>
 >>
 /Annots [692 0 R 693 0 R 696 0 R]
@@ -87017,7 +87017,7 @@ endobj
 /F3.0 35 0 R
 /F4.0 37 0 R
 >>
-/XObject << /Stamp2 5008 0 R
+/XObject << /Stamp2 5011 0 R
 >>
 >>
 /Annots [701 0 R 702 0 R 704 0 R 706 0 R 707 0 R]
@@ -87836,7 +87836,7 @@ endobj
 /Font << /F1.0 10 0 R
 /F3.0 35 0 R
 >>
-/XObject << /Stamp1 5007 0 R
+/XObject << /Stamp1 5010 0 R
 >>
 >>
 /Annots [710 0 R 713 0 R 716 0 R 717 0 R]
@@ -88840,7 +88840,7 @@ endobj
 /F3.0 35 0 R
 /F4.0 37 0 R
 >>
-/XObject << /Stamp2 5008 0 R
+/XObject << /Stamp2 5011 0 R
 >>
 >>
 /Annots [722 0 R 724 0 R 726 0 R]
@@ -89660,7 +89660,7 @@ endobj
 /F3.0 35 0 R
 /F2.0 31 0 R
 >>
-/XObject << /Stamp1 5007 0 R
+/XObject << /Stamp1 5010 0 R
 >>
 >>
 /Annots [731 0 R 737 0 R 738 0 R 739 0 R]
@@ -90687,7 +90687,7 @@ endobj
 /F4.0 37 0 R
 /F2.0 31 0 R
 >>
-/XObject << /Stamp2 5008 0 R
+/XObject << /Stamp2 5011 0 R
 >>
 >>
 /Annots [745 0 R 746 0 R 747 0 R 749 0 R 750 0 R 751 0 R 753 0 R 755 0 R 756 0 R 757 0 R 758 0 R 759 0 R 760 0 R]
@@ -91905,7 +91905,7 @@ endobj
 /F3.0 35 0 R
 /F1.1 40 0 R
 >>
-/XObject << /Stamp1 5007 0 R
+/XObject << /Stamp1 5010 0 R
 >>
 >>
 /Annots [763 0 R 764 0 R 765 0 R 766 0 R 767 0 R 768 0 R 769 0 R 770 0 R 772 0 R 773 0 R 774 0 R 775 0 R]
@@ -92744,7 +92744,7 @@ endobj
 /F5.1 47 0 R
 /F2.0 31 0 R
 >>
-/XObject << /Stamp2 5008 0 R
+/XObject << /Stamp2 5011 0 R
 >>
 >>
 /Annots [778 0 R 779 0 R]
@@ -93217,7 +93217,7 @@ endobj
 /F1.0 10 0 R
 /F4.0 37 0 R
 >>
-/XObject << /Stamp1 5007 0 R
+/XObject << /Stamp1 5010 0 R
 >>
 >>
 /Annots [788 0 R]
@@ -93586,7 +93586,7 @@ endobj
 /F1.0 10 0 R
 /F4.0 37 0 R
 >>
-/XObject << /Stamp2 5008 0 R
+/XObject << /Stamp2 5011 0 R
 >>
 >>
 /Annots [793 0 R 794 0 R 795 0 R]
@@ -93787,7 +93787,7 @@ endobj
 /F3.0 35 0 R
 /F4.0 37 0 R
 >>
-/XObject << /Stamp1 5007 0 R
+/XObject << /Stamp1 5010 0 R
 >>
 >>
 >>
@@ -94025,7 +94025,7 @@ endobj
 /F1.0 10 0 R
 /F4.0 37 0 R
 >>
-/XObject << /Stamp2 5008 0 R
+/XObject << /Stamp2 5011 0 R
 >>
 >>
 /Annots [802 0 R]
@@ -94621,7 +94621,7 @@ endobj
 /F3.0 35 0 R
 /F4.0 37 0 R
 >>
-/XObject << /Stamp1 5007 0 R
+/XObject << /Stamp1 5010 0 R
 >>
 >>
 /Annots [806 0 R]
@@ -95158,7 +95158,7 @@ endobj
 /F4.0 37 0 R
 /F2.0 31 0 R
 >>
-/XObject << /Stamp2 5008 0 R
+/XObject << /Stamp2 5011 0 R
 >>
 >>
 >>
@@ -95408,7 +95408,7 @@ endobj
 /F3.0 35 0 R
 /F4.0 37 0 R
 >>
-/XObject << /Stamp1 5007 0 R
+/XObject << /Stamp1 5010 0 R
 >>
 >>
 >>
@@ -95892,7 +95892,7 @@ endobj
 /F1.0 10 0 R
 /F4.0 37 0 R
 >>
-/XObject << /Stamp2 5008 0 R
+/XObject << /Stamp2 5011 0 R
 >>
 >>
 >>
@@ -96167,7 +96167,7 @@ endobj
 /F4.0 37 0 R
 /F3.0 35 0 R
 >>
-/XObject << /Stamp1 5007 0 R
+/XObject << /Stamp1 5010 0 R
 >>
 >>
 >>
@@ -96604,7 +96604,7 @@ endobj
 /F1.0 10 0 R
 /F4.0 37 0 R
 >>
-/XObject << /Stamp2 5008 0 R
+/XObject << /Stamp2 5011 0 R
 >>
 >>
 >>
@@ -97167,7 +97167,7 @@ endobj
 /Font << /F4.0 37 0 R
 /F1.0 10 0 R
 >>
-/XObject << /Stamp1 5007 0 R
+/XObject << /Stamp1 5010 0 R
 >>
 >>
 >>
@@ -97778,7 +97778,7 @@ endobj
 /F3.0 35 0 R
 /F1.0 10 0 R
 >>
-/XObject << /Stamp2 5008 0 R
+/XObject << /Stamp2 5011 0 R
 >>
 >>
 >>
@@ -98948,7 +98948,7 @@ endobj
 /F2.0 31 0 R
 /F4.0 37 0 R
 >>
-/XObject << /Stamp1 5007 0 R
+/XObject << /Stamp1 5010 0 R
 >>
 >>
 /Annots [830 0 R]
@@ -98970,7 +98970,7 @@ endobj
 endobj
 832 0 obj
 << /Limits [(multiple-typed-queues) (new-system)]
-/Names [(multiple-typed-queues) 3313 0 R (multiwal) 1712 0 R (nagles) 581 0 R (namespace) 860 0 R (namespace_creation) 864 0 R (namespace_quotas) 3309 0 R (namespace_special) 865 0 R (network-saturation-the-winner) 3015 0 R (new-committers) 3787 0 R (new-configs) 3954 0 R (new-system) 3933 0 R]
+/Names [(multiple-typed-queues) 3316 0 R (multiwal) 1712 0 R (nagles) 581 0 R (namespace) 860 0 R (namespace_creation) 864 0 R (namespace_quotas) 3312 0 R (namespace_special) 865 0 R (network-saturation-the-winner) 3018 0 R (new-committers) 3790 0 R (new-configs) 3957 0 R (new-system) 3936 0 R]
 >>
 endobj
 833 0 obj
@@ -104234,7 +104234,7 @@ endobj
 /F2.0 31 0 R
 /F1.1 40 0 R
 >>
-/XObject << /Stamp2 5008 0 R
+/XObject << /Stamp2 5011 0 R
 >>
 >>
 >>
@@ -104610,7 +104610,7 @@ endobj
 /F2.0 31 0 R
 /F1.0 10 0 R
 >>
-/XObject << /Stamp1 5007 0 R
+/XObject << /Stamp1 5010 0 R
 >>
 >>
 >>
@@ -105225,7 +105225,7 @@ endobj
 /F3.0 35 0 R
 /F4.0 37 0 R
 >>
-/XObject << /Stamp2 5008 0 R
+/XObject << /Stamp2 5011 0 R
 >>
 >>
 >>
@@ -107766,7 +107766,7 @@ endobj
 /F5.1 47 0 R
 /F3.0 35 0 R
 >>
-/XObject << /Stamp1 5007 0 R
+/XObject << /Stamp1 5010 0 R
 >>
 >>
 /Annots [849 0 R 850 0 R 851 0 R]
@@ -110785,7 +110785,7 @@ endobj
 /Font << /F4.0 37 0 R
 /F1.0 10 0 R
 >>
-/XObject << /Stamp2 5008 0 R
+/XObject << /Stamp2 5011 0 R
 >>
 >>
 >>
@@ -112219,7 +112219,7 @@ endobj
 /F3.0 35 0 R
 /F4.0 37 0 R
 >>
-/XObject << /Stamp1 5007 0 R
+/XObject << /Stamp1 5010 0 R
 >>
 >>
 /Annots [857 0 R]
@@ -113003,7 +113003,7 @@ endobj
 /F4.0 37 0 R
 /F3.0 35 0 R
 >>
-/XObject << /Stamp2 5008 0 R
+/XObject << /Stamp2 5011 0 R
 >>
 >>
 /Annots [861 0 R 862 0 R 863 0 R]
@@ -113205,7 +113205,7 @@ endobj
 /F4.0 37 0 R
 /F1.0 10 0 R
 >>
-/XObject << /Stamp1 5007 0 R
+/XObject << /Stamp1 5010 0 R
 >>
 >>
 >>
@@ -113276,7 +113276,7 @@ endobj
 /Font << /F2.0 31 0 R
 /F1.0 10 0 R
 >>
-/XObject << /Stamp2 5008 0 R
+/XObject << /Stamp2 5011 0 R
 >>
 >>
 >>
@@ -113380,7 +113380,7 @@ endobj
 /Font << /F2.0 31 0 R
 /F1.0 10 0 R
 >>
-/XObject << /Stamp1 5007 0 R
+/XObject << /Stamp1 5010 0 R
 >>
 >>
 >>
@@ -113797,7 +113797,7 @@ endobj
 /F3.0 35 0 R
 /F4.0 37 0 R
 >>
-/XObject << /Stamp2 5008 0 R
+/XObject << /Stamp2 5011 0 R
 >>
 >>
 >>
@@ -113917,7 +113917,7 @@ endobj
 /F3.0 35 0 R
 /F4.0 37 0 R
 >>
-/XObject << /Stamp1 5007 0 R
+/XObject << /Stamp1 5010 0 R
 >>
 >>
 >>
@@ -116104,7 +116104,7 @@ endobj
 /F1.0 10 0 R
 /F4.0 37 0 R
 >>
-/XObject << /Stamp2 5008 0 R
+/XObject << /Stamp2 5011 0 R
 >>
 >>
 /Annots [883 0 R 885 0 R 886 0 R 888 0 R 889 0 R 890 0 R 892 0 R 893 0 R]
@@ -116433,7 +116433,7 @@ endobj
 /F1.0 10 0 R
 /F3.0 35 0 R
 >>
-/XObject << /Stamp1 5007 0 R
+/XObject << /Stamp1 5010 0 R
 >>
 >>
 /Annots [898 0 R 899 0 R 900 0 R 901 0 R]
@@ -116444,7 +116444,7 @@ endobj
 endobj
 897 0 obj
 << /Limits [(dfs.datanode.failed.volumes.tolerated) (dm.column.metadata)]
-/Names [(dfs.datanode.failed.volumes.tolerated) 557 0 R (dfs.datanode.max.transfer.threads) 160 0 R (dfs.domain.socket.path) 447 0 R (dialog) 3820 0 R (direct.memory) 1669 0 R (disable-nagle-for-rpc) 1163 0 R (disable.splitting) 568 0 R (disabling-metrics) 3199 0 R (disabling.blockcache) 580 0 R (discovering.available.metrics) 3200 0 R (distributed) 176 0 R (distributed.log.replay.failure.reasons) 1742 0 R (distributed.log.splitting) 1730 0 R (dm.column.metadata) 956 0 R]
+/Names [(dfs.datanode.failed.volumes.tolerated) 557 0 R (dfs.datanode.max.transfer.threads) 160 0 R (dfs.domain.socket.path) 447 0 R (dialog) 3823 0 R (direct.memory) 1669 0 R (disable-nagle-for-rpc) 1163 0 R (disable.splitting) 568 0 R (disabling-metrics) 3202 0 R (disabling.blockcache) 580 0 R (discovering.available.metrics) 3203 0 R (distributed) 176 0 R (distributed.log.replay.failure.reasons) 1742 0 R (distributed.log.splitting) 1730 0 R (dm.column.metadata) 956 0 R]
 >>
 endobj
 898 0 obj
@@ -117453,7 +117453,7 @@ endobj
 /F7.0 911 0 R
 /F7.1 912 0 R
 >>
-/XObject << /Stamp2 5008 0 R
+/XObject << /Stamp2 5011 0 R
 >>
 >>
 /Annots [906 0 R 907 0 R 910 0 R]
@@ -117464,7 +117464,7 @@ endobj
 endobj
 905 0 obj
 << /Limits [(upgrade2.0.ui.splitmerge.by.row) (using-the-java-api)]
-/Names [(upgrade2.0.ui.splitmerge.by.row) 720 0 R (upgrade2.0.zkconfig) 711 0 R (upgrading) 608 0 R (upgrading-2) 4099 0 R (use-cases-for-observer-coprocessors) 2388 0 R (user-interface) 1976 0 R (using-existing-zookeeper-ensemble) 3974 0 R (using-hbase-shell) 2426 0 R (using-rest-endpoints) 2223 0 R (using-secure-http-https-for-the-web-ui) 1293 0 R (using-the-code-rolling-restart-sh-code-script) 3178 0 R (using-the-java-api) 2427 0 R]
+/Names [(upgrade2.0.ui.splitmerge.by.row) 720 0 R (upgrade2.0.zkconfig) 711 0 R (upgrading) 608 0 R (upgrading-2) 4102 0 R (use-cases-for-observer-coprocessors) 2388 0 R (user-interface) 1976 0 R (using-existing-zookeeper-ensemble) 3977 0 R (using-hbase-shell) 2426 0 R (using-rest-endpoints) 2223 0 R (using-secure-http-https-for-the-web-ui) 1293 0 R (using-the-code-rolling-restart-sh-code-script) 3181 0 R (using-the-java-api) 2427 0 R]
 >>
 endobj
 906 0 obj
@@ -117494,7 +117494,7 @@ endobj
 endobj
 909 0 obj
 << /Limits [(rowcounter) (save-the-dataframe)]
-/Names [(rowcounter) 3119 0 R (rowcounter-example) 1238 0 R (rowkey.design) 999 0 R (rowkey.regionsplits) 1040 0 R (rowkey.scope) 1037 0 R (rpc) 4360 0 R (rpc.configs) 4379 0 R (rpc.logging) 2737 0 R (rpcscheduler-dispatch-callrunner-p1-abstract-void-1) 4417 0 R (rs.failover.details) 3282 0 R (rs_metrics) 3208 0 R (rsgroup) 3432 0 R (run-canary-test-as-a-daemon) 3057 0 R (run.insitu) 3741 0 R (running-canary-in-a-kerberos-enabled-cluster) 3063 0 R (running-hbck-to-identify-inconsistencies) 4134 0 R (running-multiple-workloads-on-a-single-cluster) 3296 0 R (running-the-shell-in-non-interactive-mode) 801 0 R (save-the-dataframe) 2346 0 R]
+/Names [(rowcounter) 3122 0 R (rowcounter-example) 1238 0 R (rowkey.design) 999 0 R (rowkey.regionsplits) 1040 0 R (rowkey.scope) 1037 0 R (rpc) 4363 0 R (rpc.configs) 4382 0 R (rpc.logging) 2737 0 R (rpcscheduler-dispatch-callrunner-p1-abstract-void-1) 4420 0 R (rs.failover.details) 3285 0 R (rs_metrics) 3211 0 R (rsgroup) 3435 0 R (run-canary-test-as-a-daemon) 3060 0 R (run.insitu) 3744 0 R (running-canary-in-a-kerberos-enabled-cluster) 3066 0 R (running-hbck-to-identify-inconsistencies) 4137 0 R (running-multiple-workloads-on-a-single-cluster) 3299 0 R (running-the-shell-in-non-interactive-mode) 801 0 R (save-the-dataframe) 2346 0 R]
 >>
 endobj
 910 0 obj
@@ -117512,22 +117512,22 @@ endobj
 << /Type /Font
 /BaseFont /0c7a4a+mplus-1p-regular
 /Subtype /TrueType
-/FontDescriptor 5290 0 R
+/FontDescriptor 5293 0 R
 /FirstChar 32
 /LastChar 255
-/Widths 5292 0 R
-/ToUnicode 5291 0 R
+/Widths 5295 0 R
+/ToUnicode 5294 0 R
 >>
 endobj
 912 0 obj
 << /Type /Font
 /BaseFont /a99fc7+mplus-1p-regular
 /Subtype /TrueType
-/FontDescriptor 5294 0 R
+/FontDescriptor 5297 0 R
 /FirstChar 32
 /LastChar 255
-/Widths 5296 0 R
-/ToUnicode 5295 0 R
+/Widths 5299 0 R
+/ToUnicode 5298 0 R
 >>
 endobj
 913 0 obj
@@ -119395,7 +119395,7 @@ endobj
 /F7.1 912 0 R
 /F2.0 31 0 R
 >>
-/XObject << /Stamp1 5007 0 R
+/XObject << /Stamp1 5010 0 R
 >>
 >>
 /Annots [915 0 R 916 0 R 919 0 R 920 0 R 921 0 R 922 0 R]
@@ -123331,7 +123331,7 @@ endobj
 /F1.0 10 0 R
 /F4.0 37 0 R
 >>
-/XObject << /Stamp2 5008 0 R
+/XObject << /Stamp2 5011 0 R
 >>
 >>
 >>
@@ -124313,7 +124313,7 @@ endobj
 /F1.1 40 0 R
 /F5.1 47 0 R
 >>
-/XObject << /Stamp1 5007 0 R
+/XObject << /Stamp1 5010 0 R
 >>
 >>
 /Annots [933 0 R 934 0 R 935 0 R 936 0 R 937 0 R 938 0 R]
@@ -125205,7 +125205,7 @@ endobj
 /F2.0 31 0 R
 /F3.0 35 0 R
 >>
-/XObject << /Stamp2 5008 0 R
+/XObject << /Stamp2 5011 0 R
 >>
 >>
 /Annots [942 0 R 943 0 R 945 0 R 946 0 R 948 0 R 950 0 R]
@@ -125370,7 +125370,7 @@ endobj
 /Font << /F2.0 31 0 R
 /F1.0 10 0 R
 >>
-/XObject << /Stamp1 5007 0 R
+/XObject << /Stamp1 5010 0 R
 >>
 >>
 >>
@@ -125537,7 +125537,7 @@ endobj
 /Font << /F2.0 31 0 R
 /F1.0 10 0 R
 >>
-/XObject << /Stamp2 5008 0 R
+/XObject << /Stamp2 5011 0 R
 >>
 >>
 /Annots [957 0 R]
@@ -125766,7 +125766,7 @@ endobj
 /Font << /F2.0 31 0 R
 /F1.0 10 0 R
 >>
-/XObject << /Stamp1 5007 0 R
+/XObject << /Stamp1 5010 0 R
 >>
 >>
 >>
@@ -125884,7 +125884,7 @@ endobj
 /Font << /F2.0 31 0 R
 /F1.0 10 0 R
 >>
-/XObject << /Stamp2 5008 0 R
+/XObject << /Stamp2 5011 0 R
 >>
 >>
 /Annots [964 0 R 965 0 R]
@@ -126297,7 +126297,7 @@ endobj
 /F1.0 10 0 R
 /F1.1 40 0 R
 >>
-/XObject << /Stamp1 5007 0 R
+/XObject << /Stamp1 5010 0 R
 >>
 >>
 /Annots [969 0 R 970 0 R 971 0 R 972 0 R 973 0 R 974 0 R]
@@ -127772,7 +127772,7 @@ endobj
 /F4.0 37 0 R
 /F5.1 47 0 R
 >>
-/XObject << /Stamp2 5008 0 R
+/XObject << /Stamp2 5011 0 R
 >>
 >>
 /Annots [978 0 R 979 0 R 980 0 R 982 0 R]
@@ -128292,7 +128292,7 @@ endobj
 /Font << /F2.0 31 0 R
 /F1.0 10 0 R
 >>
-/XObject << /Stamp1 5007 0 R
+/XObject << /Stamp1 5010 0 R
 >>
 >>
 /Annots [987 0 R]
@@ -128514,7 +128514,7 @@ endobj
 /Font << /F2.0 31 0 R
 /F1.0 10 0 R
 >>
-/XObject << /Stamp2 5008 0 R
+/XObject << /Stamp2 5011 0 R
 >>
 >>
 /Annots [991 0 R]
@@ -128831,7 +128831,7 @@ endobj
 /Font << /F2.0 31 0 R
 /F1.0 10 0 R
 >>
-/XObject << /Stamp1 5007 0 R
+/XObject << /Stamp1 5010 0 R
 >>
 >>
 /Annots [995 0 R]
@@ -129247,7 +129247,7 @@ endobj
 /F1.0 10 0 R
 /F3.0 35 0 R
 >>
-/XObject << /Stamp2 5008 0 R
+/XObject << /Stamp2 5011 0 R
 >>
 >>
 >>
@@ -129976,7 +129976,7 @@ endobj
 /F1.0 10 0 R
 /F4.0 37 0 R
 >>
-/XObject << /Stamp1 5007 0 R
+/XObject << /Stamp1 5010 0 R
 >>
 >>
 >>
@@ -130909,7 +130909,7 @@ endobj
 /F4.0 37 0 R
 /F2.0 31 0 R
 >>
-/XObject << /Stamp2 5008 0 R
+/XObject << /Stamp2 5011 0 R
 >>
 >>
 /Annots [1005 0 R 1006 0 R 1007 0 R 1008 0 R 1010 0 R 1011 0 R 1012 0 R 1013 0 R 1014 0 R 1016 0 R 1017 0 R]
@@ -131534,7 +131534,7 @@ endobj
 /F2.0 31 0 R
 /F1.1 40 0 R
 >>
-/XObject << /Stamp1 5007 0 R
+/XObject << /Stamp1 5010 0 R
 >>
 >>
 /Annots [1020 0 R 1021 0 R 1022 0 R 1024 0 R 1026 0 R]
@@ -135115,7 +135115,7 @@ endobj
 /F5.1 47 0 R
 /F3.0 35 0 R
 >>
-/XObject << /Stamp2 5008 0 R
+/XObject << /Stamp2 5011 0 R
 >>
 >>
 /Annots [1032 0 R 1033 0 R]
@@ -135833,7 +135833,7 @@ endobj
 /F2.0 31 0 R
 /F3.0 35 0 R
 >>
-/XObject << /Stamp1 5007 0 R
+/XObject << /Stamp1 5010 0 R
 >>
 >>
 /Annots [1036 0 R]
@@ -135855,7 +135855,7 @@ endobj
 endobj
 1039 0 obj
 << /Limits [(cf.in.memory) (class-coprocessorrpcchannel-1)]
-/Names [(cf.in.memory) 2577 0 R (cf.keep.deleted) 1072 0 R (changes-of-note) 669 0 R (changing.compression) 4209 0 R (changing.rowkeys) 1038 0 R (chaos.monkey.properties) 3701 0 R (checking-for-success-or-failure-in-scripts) 809 0 R (choosing-region-servers-to-replicate-to) 3275 0 R (class-class-locktimeoutexception-1) 4465 0 R (class-coprocessorhost-e) 4392 0 R (class-coprocessorrpcchannel-1) 4389 0 R]
+/Names [(cf.in.memory) 2577 0 R (cf.keep.deleted) 1072 0 R (changes-of-note) 669 0 R (changing.compression) 4212 0 R (changing.rowkeys) 1038 0 R (chaos.monkey.properties) 3704 0 R (checking-for-success-or-failure-in-scripts) 809 0 R (choosing-region-servers-to-replicate-to) 3278 0 R (class-class-locktimeoutexception-1) 4468 0 R (class-coprocessorhost-e) 4395 0 R (class-coprocessorrpcchannel-1) 4392 0 R]
 >>
 endobj
 1040 0 obj
@@ -139610,7 +139610,7 @@ endobj
 /F3.0 35 0 R
 /F4.0 37 0 R
 >>
-/XObject << /Stamp2 5008 0 R
+/XObject << /Stamp2 5011 0 R
 >>
 >>
 /Annots [1043 0 R]
@@ -140083,7 +140083,7 @@ endobj
 /F1.0 10 0 R
 /F3.0 35 0 R
 >>
-/XObject << /Stamp1 5007 0 R
+/XObject << /Stamp1 5010 0 R
 >>
 >>
 /Annots [1048 0 R 1049 0 R 1051 0 R]
@@ -140463,7 +140463,7 @@ endobj
 /F1.0 10 0 R
 /F4.0 37 0 R
 >>
-/XObject << /Stamp2 5008 0 R
+/XObject << /Stamp2 5011 0 R
 >>
 >>
 /Annots [1055 0 R 1056 0 R 1057 0 R 1059 0 R]
@@ -140604,7 +140604,7 @@ endobj
 /Font << /F2.0 31 0 R
 /F1.0 10 0 R
 >>
-/XObject << /Stamp1 5007 0 R
+/XObject << /Stamp1 5010 0 R
 >>
 >>
 /Annots [1064 0 R]
@@ -140615,7 +140615,7 @@ endobj
 endobj
 1063 0 obj
 << /Limits [(schema.versions) (sect.zookeeper.session.timeout)]
-/Names [(schema.versions) 1046 0 R (schema.versions.max) 1047 0 R (scopes) 4151 0 R (scripting) 798 0 R (secondary-replica-failover) 1964 0 R (secondary.indexes) 1083 0 R (secondary.indexes.coproc) 1097 0 R (secondary.indexes.dualwrite) 1093 0 R (secondary.indexes.filter) 1087 0 R (secondary.indexes.periodic) 1089 0 R (secondary.indexes.summary) 1095 0 R (sect.zookeeper.session.timeout) 551 0 R]
+/Names [(schema.versions) 1046 0 R (schema.versions.max) 1047 0 R (scopes) 4154 0 R (scripting) 798 0 R (secondary-replica-failover) 1964 0 R (secondary.indexes) 1083 0 R (secondary.indexes.coproc) 1097 0 R (secondary.indexes.dualwrite) 1093 0 R (secondary.indexes.filter) 1087 0 R (secondary.indexes.periodic) 1089 0 R (secondary.indexes.summary) 1095 0 R (sect.zookeeper.session.timeout) 551 0 R]
 >>
 endobj
 1064 0 obj
@@ -141041,7 +141041,7 @@ endobj
 /F3.0 35 0 R
 /F4.0 37 0 R
 >>
-/XObject << /Stamp2 5008 0 R
+/XObject << /Stamp2 5011 0 R
 >>
 >>
 /Annots [1068 0 R 1069 0 R]
@@ -141732,7 +141732,7 @@ endobj
 /F7.0 911 0 R
 /F7.1 912 0 R
 >>
-/XObject << /Stamp1 5007 0 R
+/XObject << /Stamp1 5010 0 R
 >>
 >>
 /Annots [1073 0 R 1074 0 R]
@@ -147447,7 +147447,7 @@ endobj
 /Font << /F4.0 37 0 R
 /F1.0 10 0 R
 >>
-/XObject << /Stamp2 5008 0 R
+/XObject << /Stamp2 5011 0 R
 >>
 >>
 >>
@@ -153393,7 +153393,7 @@ endobj
 /Font << /F4.0 37 0 R
 /F1.0 10 0 R
 >>
-/XObject << /Stamp1 5007 0 R
+/XObject << /Stamp1 5010 0 R
 >>
 >>
 >>
@@ -154479,7 +154479,7 @@ endobj
 /F1.0 10 0 R
 /F3.0 35 0 R
 >>
-/XObject << /Stamp2 5008 0 R
+/XObject << /Stamp2 5011 0 R
 >>
 >>
 >>
@@ -155165,7 +155165,7 @@ endobj
 /F1.0 10 0 R
 /F3.0 35 0 R
 >>
-/XObject << /Stamp1 5007 0 R
+/XObject << /Stamp1 5010 0 R
 >>
 >>
 /Annots [1084 0 R 1085 0 R 1086 0 R 1088 0 R 1090 0 R]
@@ -155470,7 +155470,7 @@ endobj
 /Font << /F2.0 31 0 R
 /F1.0 10 0 R
 >>
-/XObject << /Stamp2 5008 0 R
+/XObject << /Stamp2 5011 0 R
 >>
 >>
 /Annots [1094 0 R 1096 0 R 1098 0 R]
@@ -155678,7 +155678,7 @@ endobj
 /Font << /F2.0 31 0 R
 /F1.0 10 0 R
 >>
-/XObject << /Stamp1 5007 0 R
+/XObject << /Stamp1 5010 0 R
 >>
 >>
 /Annots [1102 0 R]
@@ -156474,7 +156474,7 @@ endobj
 /F1.0 10 0 R
 /F4.0 37 0 R
 >>
-/XObject << /Stamp2 5008 0 R
+/XObject << /Stamp2 5011 0 R
 >>
 >>
 /Annots [1106 0 R 1109 0 R]
@@ -157452,7 +157452,7 @@ endobj
 /F5.1 47 0 R
 /F3.0 35 0 R
 >>
-/XObject << /Stamp1 5007 0 R
+/XObject << /Stamp1 5010 0 R
 >>
 >>
 /Annots [1114 0 R 1115 0 R]
@@ -158132,7 +158132,7 @@ endobj
 /F4.0 37 0 R
 /F2.0 31 0 R
 >>
-/XObject << /Stamp2 5008 0 R
+/XObject << /Stamp2 5011 0 R
 >>
 >>
 /Annots [1119 0 R 1121 0 R 1122 0 R 1123 0 R]
@@ -158885,7 +158885,7 @@ endobj
 /F3.0 35 0 R
 /F2.0 31 0 R
 >>
-/XObject << /Stamp1 5007 0 R
+/XObject << /Stamp1 5010 0 R
 >>
 >>
 /Annots [1127 0 R]
@@ -159521,7 +159521,7 @@ endobj
 /F2.0 31 0 R
 /F4.0 37 0 R
 >>
-/XObject << /Stamp2 5008 0 R
+/XObject << /Stamp2 5011 0 R
 >>
 >>
 /Annots [1134 0 R]
@@ -160325,7 +160325,7 @@ endobj
 /F1.0 10 0 R
 /F4.0 37 0 R
 >>
-/XObject << /Stamp1 5007 0 R
+/XObject << /Stamp1 5010 0 R
 >>
 >>
 /Annots [1138 0 R]
@@ -160888,7 +160888,7 @@ endobj
 /Font << /F2.0 31 0 R
 /F1.0 10 0 R
 >>
-/XObject << /Stamp2 5008 0 R
+/XObject << /Stamp2 5011 0 R
 >>
 >>
 /Annots [1143 0 R]
@@ -162447,7 +162447,7 @@ endobj
 /F4.0 37 0 R
 /F1.1 40 0 R
 >>
-/XObject << /Stamp1 5007 0 R
+/XObject << /Stamp1 5010 0 R
 >>
 >>
 /Annots [1150 0 R]
@@ -163191,7 +163191,7 @@ endobj
 /F2.0 31 0 R
 /F4.0 37 0 R
 >>
-/XObject << /Stamp2 5008 0 R
+/XObject << /Stamp2 5011 0 R
 >>
 >>
 /Annots [1154 0 R 1155 0 R 1156 0 R]
@@ -163359,7 +163359,7 @@ endobj
 /Resources << /ProcSet [/PDF /Text /ImageB /ImageC /ImageI]
 /Font << /F1.0 10 0 R
 >>
-/XObject << /Stamp1 5007 0 R
+/XObject << /Stamp1 5010 0 R
 >>
 >>
 >>
@@ -164505,7 +164505,7 @@ endobj
 /F4.0 37 0 R
 /F1.1 40 0 R
 >>
-/XObject << /Stamp2 5008 0 R
+/XObject << /Stamp2 5011 0 R
 >>
 >>
 >>
@@ -165783,7 +165783,7 @@ endobj
 /F2.0 31 0 R
 /F3.0 35 0 R
 >>
-/XObject << /Stamp1 5007 0 R
+/XObject << /Stamp1 5010 0 R
 >>
 >>
 /Annots [1168 0 R 1169 0 R 1170 0 R 1171 0 R 1172 0 R]
@@ -166532,7 +166532,7 @@ endobj
 /F1.0 10 0 R
 /F4.0 37 0 R
 >>
-/XObject << /Stamp2 5008 0 R
+/XObject << /Stamp2 5011 0 R
 >>
 >>
 >>
@@ -166548,7 +166548,7 @@ endobj
 endobj
 1178 0 obj
 << /Limits [(others) (perf.general)]
-/Names [(others) 2354 0 R (output) 3225 0 R (package) 3528 0 R (page-allocation-failure) 2980 0 R (passing-vm-options-to-the-shell) 817 0 R (passwordless.ssh.quickstart) 89 0 R (perf.99th.percentile) 2512 0 R (perf.batch.loading) 2595 0 R (perf.casestudy) 2715 0 R (perf.compactions.and.splits) 2513 0 R (perf.compression) 2580 0 R (perf.compression.however) 2583 0 R (perf.configurations) 2510 0 R (perf.deleting) 2674 0 R (perf.deleting.queue) 2675 0 R (perf.deleting.rpc) 2679 0 R (perf.ec2) 2707 0 R (perf.general) 2590 0 R]
+/Names [(others) 2354 0 R (output) 3228 0 R (package) 3531 0 R (page-allocation-failure) 2983 0 R (passing-vm-options-to-the-shell) 817 0 R (passwordless.ssh.quickstart) 89 0 R (perf.99th.percentile) 2512 0 R (perf.batch.loading) 2595 0 R (perf.casestudy) 2715 0 R (perf.compactions.and.splits) 2513 0 R (perf.compression) 2580 0 R (perf.compression.however) 2583 0 R (perf.configurations) 2510 0 R (perf.deleting) 2674 0 R (perf.deleting.queue) 2675 0 R (perf.deleting.rpc) 2679 0 R (perf.ec2) 2707 0 R (perf.general) 2590 0 R]
 >>
 endobj
 1179 0 obj
@@ -167383,7 +167383,7 @@ endobj
 /F1.1 40 0 R
 /F7.0 911 0 R
 >>
-/XObject << /Stamp1 5007 0 R
+/XObject << /Stamp1 5010 0 R
 >>
 >>
 /Annots [1185 0 R]
@@ -167931,7 +167931,7 @@ endobj
 /F4.0 37 0 R
 /F3.0 35 0 R
 >>
-/XObject << /Stamp2 5008 0 R
+/XObject << /Stamp2 5011 0 R
 >>
 >>
 /Annots [1191 0 R 1192 0 R 1193 0 R 1194 0 R 1195 0 R 1196 0 R]
@@ -167942,12 +167942,12 @@ endobj
 endobj
 1189 0 obj
 << /Limits [(keysize.cf) (load-the-dataframe)]
-/Names [(keysize.cf) 1023 0 R (keysize.patterns) 1028 0 R (keysize.row) 1027 0 R (keyvalue) 1827 0 R (keyvalue.example) 1828 0 R (known-incompatibilities-among-hbase-versions) 4382 0 R (language-integrated-query) 2352 0 R (lb) 3169 0 R (life-of-a-wal-ed

<TRUNCATED>

[21/46] hbase-site git commit: Published site at 05d22ed960204183fbd9bd16f1dbca6410ccde76.

Posted by gi...@apache.org.
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/3649682c/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 c307d41..d82bfd8 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
@@ -1020,8 +1020,8 @@
 <span class="sourceLineNo">1012</span>  protected ClusterMetrics clusterStatus = null;<a name="line.1012"></a>
 <span class="sourceLineNo">1013</span>  protected ServerName masterServerName;<a name="line.1013"></a>
 <span class="sourceLineNo">1014</span>  protected MasterServices services;<a name="line.1014"></a>
-<span class="sourceLineNo">1015</span>  protected boolean tablesOnMaster;<a name="line.1015"></a>
-<span class="sourceLineNo">1016</span>  protected boolean onlySystemTablesOnMaster;<a name="line.1016"></a>
+<span class="sourceLineNo">1015</span>  protected boolean onlySystemTablesOnMaster;<a name="line.1015"></a>
+<span class="sourceLineNo">1016</span>  protected boolean maintenanceMode;<a name="line.1016"></a>
 <span class="sourceLineNo">1017</span><a name="line.1017"></a>
 <span class="sourceLineNo">1018</span>  @Override<a name="line.1018"></a>
 <span class="sourceLineNo">1019</span>  public void setConf(Configuration conf) {<a name="line.1019"></a>
@@ -1033,627 +1033,626 @@
 <span class="sourceLineNo">1025</span>    if (overallSlop &lt; 0) overallSlop = 0;<a name="line.1025"></a>
 <span class="sourceLineNo">1026</span>    else if (overallSlop &gt; 1) overallSlop = 1;<a name="line.1026"></a>
 <span class="sourceLineNo">1027</span><a name="line.1027"></a>
-<span class="sourceLineNo">1028</span>    this.tablesOnMaster = LoadBalancer.isTablesOnMaster(this.config);<a name="line.1028"></a>
-<span class="sourceLineNo">1029</span>    this.onlySystemTablesOnMaster = LoadBalancer.isSystemTablesOnlyOnMaster(this.config);<a name="line.1029"></a>
-<span class="sourceLineNo">1030</span>    // If system tables on master, implies tablesOnMaster = true.<a name="line.1030"></a>
-<span class="sourceLineNo">1031</span>    if (this.onlySystemTablesOnMaster &amp;&amp; !this.tablesOnMaster) {<a name="line.1031"></a>
-<span class="sourceLineNo">1032</span>      LOG.warn("Set " + TABLES_ON_MASTER + "=true because " + SYSTEM_TABLES_ON_MASTER + "=true");<a name="line.1032"></a>
-<span class="sourceLineNo">1033</span>      this.tablesOnMaster = true;<a name="line.1033"></a>
-<span class="sourceLineNo">1034</span>    }<a name="line.1034"></a>
-<span class="sourceLineNo">1035</span>    this.rackManager = new RackManager(getConf());<a name="line.1035"></a>
-<span class="sourceLineNo">1036</span>    if (useRegionFinder) {<a name="line.1036"></a>
-<span class="sourceLineNo">1037</span>      regionFinder.setConf(conf);<a name="line.1037"></a>
-<span class="sourceLineNo">1038</span>    }<a name="line.1038"></a>
-<span class="sourceLineNo">1039</span>    // Print out base configs. Don't print overallSlop since it for simple balancer exclusively.<a name="line.1039"></a>
-<span class="sourceLineNo">1040</span>    LOG.info("slop=" + this.slop + ", tablesOnMaster=" + this.tablesOnMaster +<a name="line.1040"></a>
-<span class="sourceLineNo">1041</span>      ", systemTablesOnMaster=" + this.onlySystemTablesOnMaster);<a name="line.1041"></a>
+<span class="sourceLineNo">1028</span>    this.onlySystemTablesOnMaster = LoadBalancer.isSystemTablesOnlyOnMaster(this.config);<a name="line.1028"></a>
+<span class="sourceLineNo">1029</span><a name="line.1029"></a>
+<span class="sourceLineNo">1030</span>    this.rackManager = new RackManager(getConf());<a name="line.1030"></a>
+<span class="sourceLineNo">1031</span>    if (useRegionFinder) {<a name="line.1031"></a>
+<span class="sourceLineNo">1032</span>      regionFinder.setConf(conf);<a name="line.1032"></a>
+<span class="sourceLineNo">1033</span>    }<a name="line.1033"></a>
+<span class="sourceLineNo">1034</span>    // Print out base configs. Don't print overallSlop since it for simple balancer exclusively.<a name="line.1034"></a>
+<span class="sourceLineNo">1035</span>    LOG.info("slop={}, systemTablesOnMaster={}",<a name="line.1035"></a>
+<span class="sourceLineNo">1036</span>        this.slop, this.onlySystemTablesOnMaster);<a name="line.1036"></a>
+<span class="sourceLineNo">1037</span>  }<a name="line.1037"></a>
+<span class="sourceLineNo">1038</span><a name="line.1038"></a>
+<span class="sourceLineNo">1039</span>  protected void setSlop(Configuration conf) {<a name="line.1039"></a>
+<span class="sourceLineNo">1040</span>    this.slop = conf.getFloat("hbase.regions.slop", (float) 0.2);<a name="line.1040"></a>
+<span class="sourceLineNo">1041</span>    this.overallSlop = conf.getFloat("hbase.regions.overallSlop", slop);<a name="line.1041"></a>
 <span class="sourceLineNo">1042</span>  }<a name="line.1042"></a>
 <span class="sourceLineNo">1043</span><a name="line.1043"></a>
-<span class="sourceLineNo">1044</span>  protected void setSlop(Configuration conf) {<a name="line.1044"></a>
-<span class="sourceLineNo">1045</span>    this.slop = conf.getFloat("hbase.regions.slop", (float) 0.2);<a name="line.1045"></a>
-<span class="sourceLineNo">1046</span>    this.overallSlop = conf.getFloat("hbase.regions.overallSlop", slop);<a name="line.1046"></a>
-<span class="sourceLineNo">1047</span>  }<a name="line.1047"></a>
-<span class="sourceLineNo">1048</span><a name="line.1048"></a>
-<span class="sourceLineNo">1049</span>  /**<a name="line.1049"></a>
-<span class="sourceLineNo">1050</span>   * Check if a region belongs to some system table.<a name="line.1050"></a>
-<span class="sourceLineNo">1051</span>   * If so, the primary replica may be expected to be put on the master regionserver.<a name="line.1051"></a>
-<span class="sourceLineNo">1052</span>   */<a name="line.1052"></a>
-<span class="sourceLineNo">1053</span>  public boolean shouldBeOnMaster(RegionInfo region) {<a name="line.1053"></a>
-<span class="sourceLineNo">1054</span>    return this.onlySystemTablesOnMaster &amp;&amp; region.getTable().isSystemTable();<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>   * Balance the regions that should be on master regionserver.<a name="line.1058"></a>
-<span class="sourceLineNo">1059</span>   */<a name="line.1059"></a>
-<span class="sourceLineNo">1060</span>  protected List&lt;RegionPlan&gt; balanceMasterRegions(Map&lt;ServerName, List&lt;RegionInfo&gt;&gt; clusterMap) {<a name="line.1060"></a>
-<span class="sourceLineNo">1061</span>    if (masterServerName == null || clusterMap == null || clusterMap.size() &lt;= 1) return null;<a name="line.1061"></a>
-<span class="sourceLineNo">1062</span>    List&lt;RegionPlan&gt; plans = null;<a name="line.1062"></a>
-<span class="sourceLineNo">1063</span>    List&lt;RegionInfo&gt; regions = clusterMap.get(masterServerName);<a name="line.1063"></a>
-<span class="sourceLineNo">1064</span>    if (regions != null) {<a name="line.1064"></a>
-<span class="sourceLineNo">1065</span>      Iterator&lt;ServerName&gt; keyIt = null;<a name="line.1065"></a>
-<span class="sourceLineNo">1066</span>      for (RegionInfo region: regions) {<a name="line.1066"></a>
-<span class="sourceLineNo">1067</span>        if (shouldBeOnMaster(region)) continue;<a name="line.1067"></a>
-<span class="sourceLineNo">1068</span><a name="line.1068"></a>
-<span class="sourceLineNo">1069</span>        // Find a non-master regionserver to host the region<a name="line.1069"></a>
-<span class="sourceLineNo">1070</span>        if (keyIt == null || !keyIt.hasNext()) {<a name="line.1070"></a>
-<span class="sourceLineNo">1071</span>          keyIt = clusterMap.keySet().iterator();<a name="line.1071"></a>
-<span class="sourceLineNo">1072</span>        }<a name="line.1072"></a>
-<span class="sourceLineNo">1073</span>        ServerName dest = keyIt.next();<a name="line.1073"></a>
-<span class="sourceLineNo">1074</span>        if (masterServerName.equals(dest)) {<a name="line.1074"></a>
-<span class="sourceLineNo">1075</span>          if (!keyIt.hasNext()) {<a name="line.1075"></a>
-<span class="sourceLineNo">1076</span>            keyIt = clusterMap.keySet().iterator();<a name="line.1076"></a>
-<span class="sourceLineNo">1077</span>          }<a name="line.1077"></a>
-<span class="sourceLineNo">1078</span>          dest = keyIt.next();<a name="line.1078"></a>
-<span class="sourceLineNo">1079</span>        }<a name="line.1079"></a>
-<span class="sourceLineNo">1080</span><a name="line.1080"></a>
-<span class="sourceLineNo">1081</span>        // Move this region away from the master regionserver<a name="line.1081"></a>
-<span class="sourceLineNo">1082</span>        RegionPlan plan = new RegionPlan(region, masterServerName, dest);<a name="line.1082"></a>
-<span class="sourceLineNo">1083</span>        if (plans == null) {<a name="line.1083"></a>
-<span class="sourceLineNo">1084</span>          plans = new ArrayList&lt;&gt;();<a name="line.1084"></a>
-<span class="sourceLineNo">1085</span>        }<a name="line.1085"></a>
-<span class="sourceLineNo">1086</span>        plans.add(plan);<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>    for (Map.Entry&lt;ServerName, List&lt;RegionInfo&gt;&gt; server: clusterMap.entrySet()) {<a name="line.1089"></a>
-<span class="sourceLineNo">1090</span>      if (masterServerName.equals(server.getKey())) continue;<a name="line.1090"></a>
-<span class="sourceLineNo">1091</span>      for (RegionInfo region: server.getValue()) {<a name="line.1091"></a>
-<span class="sourceLineNo">1092</span>        if (!shouldBeOnMaster(region)) continue;<a name="line.1092"></a>
-<span class="sourceLineNo">1093</span><a name="line.1093"></a>
-<span class="sourceLineNo">1094</span>        // Move this region to the master regionserver<a name="line.1094"></a>
-<span class="sourceLineNo">1095</span>        RegionPlan plan = new RegionPlan(region, server.getKey(), masterServerName);<a name="line.1095"></a>
-<span class="sourceLineNo">1096</span>        if (plans == null) {<a name="line.1096"></a>
-<span class="sourceLineNo">1097</span>          plans = new ArrayList&lt;&gt;();<a name="line.1097"></a>
-<span class="sourceLineNo">1098</span>        }<a name="line.1098"></a>
-<span class="sourceLineNo">1099</span>        plans.add(plan);<a name="line.1099"></a>
-<span class="sourceLineNo">1100</span>      }<a name="line.1100"></a>
-<span class="sourceLineNo">1101</span>    }<a name="line.1101"></a>
-<span class="sourceLineNo">1102</span>    return plans;<a name="line.1102"></a>
-<span class="sourceLineNo">1103</span>  }<a name="line.1103"></a>
-<span class="sourceLineNo">1104</span><a name="line.1104"></a>
-<span class="sourceLineNo">1105</span>  /**<a name="line.1105"></a>
-<span class="sourceLineNo">1106</span>   * If master is configured to carry system tables only, in here is<a name="line.1106"></a>
-<span class="sourceLineNo">1107</span>   * where we figure what to assign it.<a name="line.1107"></a>
-<span class="sourceLineNo">1108</span>   */<a name="line.1108"></a>
-<span class="sourceLineNo">1109</span>  protected Map&lt;ServerName, List&lt;RegionInfo&gt;&gt; assignMasterSystemRegions(<a name="line.1109"></a>
-<span class="sourceLineNo">1110</span>      Collection&lt;RegionInfo&gt; regions, List&lt;ServerName&gt; servers) {<a name="line.1110"></a>
-<span class="sourceLineNo">1111</span>    if (servers == null || regions == null || regions.isEmpty()) {<a name="line.1111"></a>
-<span class="sourceLineNo">1112</span>      return null;<a name="line.1112"></a>
-<span class="sourceLineNo">1113</span>    }<a name="line.1113"></a>
-<span class="sourceLineNo">1114</span>    Map&lt;ServerName, List&lt;RegionInfo&gt;&gt; assignments = new TreeMap&lt;&gt;();<a name="line.1114"></a>
-<span class="sourceLineNo">1115</span>    if (this.onlySystemTablesOnMaster) {<a name="line.1115"></a>
-<span class="sourceLineNo">1116</span>      if (masterServerName != null &amp;&amp; servers.contains(masterServerName)) {<a name="line.1116"></a>
-<span class="sourceLineNo">1117</span>        assignments.put(masterServerName, new ArrayList&lt;&gt;());<a name="line.1117"></a>
-<span class="sourceLineNo">1118</span>        for (RegionInfo region : regions) {<a name="line.1118"></a>
-<span class="sourceLineNo">1119</span>          if (shouldBeOnMaster(region)) {<a name="line.1119"></a>
-<span class="sourceLineNo">1120</span>            assignments.get(masterServerName).add(region);<a name="line.1120"></a>
-<span class="sourceLineNo">1121</span>          }<a name="line.1121"></a>
-<span class="sourceLineNo">1122</span>        }<a name="line.1122"></a>
-<span class="sourceLineNo">1123</span>      }<a name="line.1123"></a>
-<span class="sourceLineNo">1124</span>    }<a name="line.1124"></a>
-<span class="sourceLineNo">1125</span>    return assignments;<a name="line.1125"></a>
-<span class="sourceLineNo">1126</span>  }<a name="line.1126"></a>
-<span class="sourceLineNo">1127</span><a name="line.1127"></a>
-<span class="sourceLineNo">1128</span>  @Override<a name="line.1128"></a>
-<span class="sourceLineNo">1129</span>  public Configuration getConf() {<a name="line.1129"></a>
-<span class="sourceLineNo">1130</span>    return this.config;<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 synchronized void setClusterMetrics(ClusterMetrics st) {<a name="line.1134"></a>
-<span class="sourceLineNo">1135</span>    this.clusterStatus = st;<a name="line.1135"></a>
-<span class="sourceLineNo">1136</span>    if (useRegionFinder) {<a name="line.1136"></a>
-<span class="sourceLineNo">1137</span>      regionFinder.setClusterMetrics(st);<a name="line.1137"></a>
-<span class="sourceLineNo">1138</span>    }<a name="line.1138"></a>
-<span class="sourceLineNo">1139</span>  }<a name="line.1139"></a>
-<span class="sourceLineNo">1140</span><a name="line.1140"></a>
-<span class="sourceLineNo">1141</span>  @Override<a name="line.1141"></a>
-<span class="sourceLineNo">1142</span>  public void setClusterLoad(Map&lt;TableName, Map&lt;ServerName, List&lt;RegionInfo&gt;&gt;&gt; clusterLoad){<a name="line.1142"></a>
-<span class="sourceLineNo">1143</span><a name="line.1143"></a>
-<span class="sourceLineNo">1144</span>  }<a name="line.1144"></a>
-<span class="sourceLineNo">1145</span><a name="line.1145"></a>
-<span class="sourceLineNo">1146</span>  @Override<a name="line.1146"></a>
-<span class="sourceLineNo">1147</span>  public void setMasterServices(MasterServices masterServices) {<a name="line.1147"></a>
-<span class="sourceLineNo">1148</span>    masterServerName = masterServices.getServerName();<a name="line.1148"></a>
-<span class="sourceLineNo">1149</span>    this.services = masterServices;<a name="line.1149"></a>
-<span class="sourceLineNo">1150</span>    if (useRegionFinder) {<a name="line.1150"></a>
-<span class="sourceLineNo">1151</span>      this.regionFinder.setServices(masterServices);<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><a name="line.1154"></a>
-<span class="sourceLineNo">1155</span>  @Override<a name="line.1155"></a>
-<span class="sourceLineNo">1156</span>  public void postMasterStartupInitialize() {<a name="line.1156"></a>
-<span class="sourceLineNo">1157</span>    if (services != null &amp;&amp; regionFinder != null) {<a name="line.1157"></a>
-<span class="sourceLineNo">1158</span>      try {<a name="line.1158"></a>
-<span class="sourceLineNo">1159</span>        Set&lt;RegionInfo&gt; regions =<a name="line.1159"></a>
-<span class="sourceLineNo">1160</span>            services.getAssignmentManager().getRegionStates().getRegionAssignments().keySet();<a name="line.1160"></a>
-<span class="sourceLineNo">1161</span>        regionFinder.refreshAndWait(regions);<a name="line.1161"></a>
-<span class="sourceLineNo">1162</span>      } catch (Exception e) {<a name="line.1162"></a>
-<span class="sourceLineNo">1163</span>        LOG.warn("Refreshing region HDFS Block dist failed with exception, ignoring", e);<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><a name="line.1167"></a>
-<span class="sourceLineNo">1168</span>  public void setRackManager(RackManager rackManager) {<a name="line.1168"></a>
-<span class="sourceLineNo">1169</span>    this.rackManager = rackManager;<a name="line.1169"></a>
-<span class="sourceLineNo">1170</span>  }<a name="line.1170"></a>
-<span class="sourceLineNo">1171</span><a name="line.1171"></a>
-<span class="sourceLineNo">1172</span>  protected boolean needsBalance(Cluster c) {<a name="line.1172"></a>
-<span class="sourceLineNo">1173</span>    ClusterLoadState cs = new ClusterLoadState(c.clusterState);<a name="line.1173"></a>
-<span class="sourceLineNo">1174</span>    if (cs.getNumServers() &lt; MIN_SERVER_BALANCE) {<a name="line.1174"></a>
-<span class="sourceLineNo">1175</span>      if (LOG.isDebugEnabled()) {<a name="line.1175"></a>
-<span class="sourceLineNo">1176</span>        LOG.debug("Not running balancer because only " + cs.getNumServers()<a name="line.1176"></a>
-<span class="sourceLineNo">1177</span>            + " active regionserver(s)");<a name="line.1177"></a>
-<span class="sourceLineNo">1178</span>      }<a name="line.1178"></a>
-<span class="sourceLineNo">1179</span>      return false;<a name="line.1179"></a>
-<span class="sourceLineNo">1180</span>    }<a name="line.1180"></a>
-<span class="sourceLineNo">1181</span>    if(areSomeRegionReplicasColocated(c)) return true;<a name="line.1181"></a>
-<span class="sourceLineNo">1182</span>    // Check if we even need to do any load balancing<a name="line.1182"></a>
-<span class="sourceLineNo">1183</span>    // HBASE-3681 check sloppiness first<a name="line.1183"></a>
-<span class="sourceLineNo">1184</span>    float average = cs.getLoadAverage(); // for logging<a name="line.1184"></a>
-<span class="sourceLineNo">1185</span>    int floor = (int) Math.floor(average * (1 - slop));<a name="line.1185"></a>
-<span class="sourceLineNo">1186</span>    int ceiling = (int) Math.ceil(average * (1 + slop));<a name="line.1186"></a>
-<span class="sourceLineNo">1187</span>    if (!(cs.getMaxLoad() &gt; ceiling || cs.getMinLoad() &lt; floor)) {<a name="line.1187"></a>
-<span class="sourceLineNo">1188</span>      NavigableMap&lt;ServerAndLoad, List&lt;RegionInfo&gt;&gt; serversByLoad = cs.getServersByLoad();<a name="line.1188"></a>
-<span class="sourceLineNo">1189</span>      if (LOG.isTraceEnabled()) {<a name="line.1189"></a>
-<span class="sourceLineNo">1190</span>        // If nothing to balance, then don't say anything unless trace-level logging.<a name="line.1190"></a>
-<span class="sourceLineNo">1191</span>        LOG.trace("Skipping load balancing because balanced cluster; " +<a name="line.1191"></a>
-<span class="sourceLineNo">1192</span>          "servers=" + cs.getNumServers() +<a name="line.1192"></a>
-<span class="sourceLineNo">1193</span>          " regions=" + cs.getNumRegions() + " average=" + average +<a name="line.1193"></a>
-<span class="sourceLineNo">1194</span>          " mostloaded=" + serversByLoad.lastKey().getLoad() +<a name="line.1194"></a>
-<span class="sourceLineNo">1195</span>          " leastloaded=" + serversByLoad.firstKey().getLoad());<a name="line.1195"></a>
-<span class="sourceLineNo">1196</span>      }<a name="line.1196"></a>
-<span class="sourceLineNo">1197</span>      return false;<a name="line.1197"></a>
-<span class="sourceLineNo">1198</span>    }<a name="line.1198"></a>
-<span class="sourceLineNo">1199</span>    return true;<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>   * Subclasses should implement this to return true if the cluster has nodes that hosts<a name="line.1203"></a>
-<span class="sourceLineNo">1204</span>   * multiple replicas for the same region, or, if there are multiple racks and the same<a name="line.1204"></a>
-<span class="sourceLineNo">1205</span>   * rack hosts replicas of the same region<a name="line.1205"></a>
-<span class="sourceLineNo">1206</span>   * @param c Cluster information<a name="line.1206"></a>
-<span class="sourceLineNo">1207</span>   * @return whether region replicas are currently co-located<a name="line.1207"></a>
-<span class="sourceLineNo">1208</span>   */<a name="line.1208"></a>
-<span class="sourceLineNo">1209</span>  protected boolean areSomeRegionReplicasColocated(Cluster c) {<a name="line.1209"></a>
-<span class="sourceLineNo">1210</span>    return false;<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>   * Generates a bulk assignment plan to be used on cluster startup using a<a name="line.1214"></a>
-<span class="sourceLineNo">1215</span>   * simple round-robin assignment.<a name="line.1215"></a>
-<span class="sourceLineNo">1216</span>   * &lt;p&gt;<a name="line.1216"></a>
-<span class="sourceLineNo">1217</span>   * Takes a list of all the regions and all the servers in the cluster and<a name="line.1217"></a>
-<span class="sourceLineNo">1218</span>   * returns a map of each server to the regions that it should be assigned.<a name="line.1218"></a>
-<span class="sourceLineNo">1219</span>   * &lt;p&gt;<a name="line.1219"></a>
-<span class="sourceLineNo">1220</span>   * Currently implemented as a round-robin assignment. Same invariant as load<a name="line.1220"></a>
-<span class="sourceLineNo">1221</span>   * balancing, all servers holding floor(avg) or ceiling(avg).<a name="line.1221"></a>
-<span class="sourceLineNo">1222</span>   *<a name="line.1222"></a>
-<span class="sourceLineNo">1223</span>   * TODO: Use block locations from HDFS to place regions with their blocks<a name="line.1223"></a>
-<span class="sourceLineNo">1224</span>   *<a name="line.1224"></a>
-<span class="sourceLineNo">1225</span>   * @param regions all regions<a name="line.1225"></a>
-<span class="sourceLineNo">1226</span>   * @param servers all servers<a name="line.1226"></a>
-<span class="sourceLineNo">1227</span>   * @return map of server to the regions it should take, or null if no<a name="line.1227"></a>
-<span class="sourceLineNo">1228</span>   *         assignment is possible (ie. no regions or no servers)<a name="line.1228"></a>
-<span class="sourceLineNo">1229</span>   */<a name="line.1229"></a>
-<span class="sourceLineNo">1230</span>  @Override<a name="line.1230"></a>
-<span class="sourceLineNo">1231</span>  public Map&lt;ServerName, List&lt;RegionInfo&gt;&gt; roundRobinAssignment(List&lt;RegionInfo&gt; regions,<a name="line.1231"></a>
-<span class="sourceLineNo">1232</span>      List&lt;ServerName&gt; servers) throws HBaseIOException {<a name="line.1232"></a>
-<span class="sourceLineNo">1233</span>    metricsBalancer.incrMiscInvocations();<a name="line.1233"></a>
-<span class="sourceLineNo">1234</span>    Map&lt;ServerName, List&lt;RegionInfo&gt;&gt; assignments = assignMasterSystemRegions(regions, servers);<a name="line.1234"></a>
-<span class="sourceLineNo">1235</span>    if (assignments != null &amp;&amp; !assignments.isEmpty()) {<a name="line.1235"></a>
-<span class="sourceLineNo">1236</span>      servers = new ArrayList&lt;&gt;(servers);<a name="line.1236"></a>
-<span class="sourceLineNo">1237</span>      // Guarantee not to put other regions on master<a name="line.1237"></a>
-<span class="sourceLineNo">1238</span>      servers.remove(masterServerName);<a name="line.1238"></a>
-<span class="sourceLineNo">1239</span>      List&lt;RegionInfo&gt; masterRegions = assignments.get(masterServerName);<a name="line.1239"></a>
-<span class="sourceLineNo">1240</span>      if (!masterRegions.isEmpty()) {<a name="line.1240"></a>
-<span class="sourceLineNo">1241</span>        regions = new ArrayList&lt;&gt;(regions);<a name="line.1241"></a>
-<span class="sourceLineNo">1242</span>        regions.removeAll(masterRegions);<a name="line.1242"></a>
-<span class="sourceLineNo">1243</span>      }<a name="line.1243"></a>
-<span class="sourceLineNo">1244</span>    }<a name="line.1244"></a>
-<span class="sourceLineNo">1245</span>    if (regions == null || regions.isEmpty()) {<a name="line.1245"></a>
-<span class="sourceLineNo">1246</span>      return assignments;<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>    int numServers = servers == null ? 0 : servers.size();<a name="line.1249"></a>
-<span class="sourceLineNo">1250</span>    if (numServers == 0) {<a name="line.1250"></a>
-<span class="sourceLineNo">1251</span>      LOG.warn("Wanted to do round robin assignment but no servers to assign to");<a name="line.1251"></a>
-<span class="sourceLineNo">1252</span>      return null;<a name="line.1252"></a>
-<span class="sourceLineNo">1253</span>    }<a name="line.1253"></a>
-<span class="sourceLineNo">1254</span><a name="line.1254"></a>
-<span class="sourceLineNo">1255</span>    // TODO: instead of retainAssignment() and roundRobinAssignment(), we should just run the<a name="line.1255"></a>
-<span class="sourceLineNo">1256</span>    // normal LB.balancerCluster() with unassignedRegions. We only need to have a candidate<a name="line.1256"></a>
-<span class="sourceLineNo">1257</span>    // generator for AssignRegionAction. The LB will ensure the regions are mostly local<a name="line.1257"></a>
-<span class="sourceLineNo">1258</span>    // and balanced. This should also run fast with fewer number of iterations.<a name="line.1258"></a>
-<span class="sourceLineNo">1259</span><a name="line.1259"></a>
-<span class="sourceLineNo">1260</span>    if (numServers == 1) { // Only one server, nothing fancy we can do here<a name="line.1260"></a>
-<span class="sourceLineNo">1261</span>      ServerName server = servers.get(0);<a name="line.1261"></a>
-<span class="sourceLineNo">1262</span>      assignments.put(server, new ArrayList&lt;&gt;(regions));<a name="line.1262"></a>
-<span class="sourceLineNo">1263</span>      return assignments;<a name="line.1263"></a>
-<span class="sourceLineNo">1264</span>    }<a name="line.1264"></a>
-<span class="sourceLineNo">1265</span><a name="line.1265"></a>
-<span class="sourceLineNo">1266</span>    Cluster cluster = createCluster(servers, regions, false);<a name="line.1266"></a>
-<span class="sourceLineNo">1267</span>    List&lt;RegionInfo&gt; unassignedRegions = new ArrayList&lt;&gt;();<a name="line.1267"></a>
-<span class="sourceLineNo">1268</span><a name="line.1268"></a>
-<span class="sourceLineNo">1269</span>    roundRobinAssignment(cluster, regions, unassignedRegions,<a name="line.1269"></a>
-<span class="sourceLineNo">1270</span>      servers, assignments);<a name="line.1270"></a>
-<span class="sourceLineNo">1271</span><a name="line.1271"></a>
-<span class="sourceLineNo">1272</span>    List&lt;RegionInfo&gt; lastFewRegions = new ArrayList&lt;&gt;();<a name="line.1272"></a>
-<span class="sourceLineNo">1273</span>    // assign the remaining by going through the list and try to assign to servers one-by-one<a name="line.1273"></a>
-<span class="sourceLineNo">1274</span>    int serverIdx = RANDOM.nextInt(numServers);<a name="line.1274"></a>
-<span class="sourceLineNo">1275</span>    OUTER : for (RegionInfo region : unassignedRegions) {<a name="line.1275"></a>
-<span class="sourceLineNo">1276</span>      boolean assigned = false;<a name="line.1276"></a>
-<span class="sourceLineNo">1277</span>      INNER : for (int j = 0; j &lt; numServers; j++) { // try all servers one by one<a name="line.1277"></a>
-<span class="sourceLineNo">1278</span>        ServerName serverName = servers.get((j + serverIdx) % numServers);<a name="line.1278"></a>
-<span class="sourceLineNo">1279</span>        if (!cluster.wouldLowerAvailability(region, serverName)) {<a name="line.1279"></a>
-<span class="sourceLineNo">1280</span>          List&lt;RegionInfo&gt; serverRegions =<a name="line.1280"></a>
-<span class="sourceLineNo">1281</span>              assignments.computeIfAbsent(serverName, k -&gt; new ArrayList&lt;&gt;());<a name="line.1281"></a>
-<span class="sourceLineNo">1282</span>          if (!RegionReplicaUtil.isDefaultReplica(region.getReplicaId())) {<a name="line.1282"></a>
-<span class="sourceLineNo">1283</span>            // if the region is not a default replica<a name="line.1283"></a>
-<span class="sourceLineNo">1284</span>            // check if the assignments map has the other replica region on this server<a name="line.1284"></a>
-<span class="sourceLineNo">1285</span>            for (RegionInfo hri : serverRegions) {<a name="line.1285"></a>
-<span class="sourceLineNo">1286</span>              if (RegionReplicaUtil.isReplicasForSameRegion(region, hri)) {<a name="line.1286"></a>
-<span class="sourceLineNo">1287</span>                if (LOG.isTraceEnabled()) {<a name="line.1287"></a>
-<span class="sourceLineNo">1288</span>                  LOG.trace("Skipping the server, " + serverName<a name="line.1288"></a>
-<span class="sourceLineNo">1289</span>                      + " , got the same server for the region " + region);<a name="line.1289"></a>
-<span class="sourceLineNo">1290</span>                }<a name="line.1290"></a>
-<span class="sourceLineNo">1291</span>                // do not allow this case. The unassignedRegions we got because the<a name="line.1291"></a>
-<span class="sourceLineNo">1292</span>                // replica region in this list was not assigned because of lower availablity issue.<a name="line.1292"></a>
-<span class="sourceLineNo">1293</span>                // So when we assign here we should ensure that as far as possible the server being<a name="line.1293"></a>
-<span class="sourceLineNo">1294</span>                // selected does not have the server where the replica region was not assigned.<a name="line.1294"></a>
-<span class="sourceLineNo">1295</span>                continue INNER; // continue the inner loop, ie go to the next server<a name="line.1295"></a>
-<span class="sourceLineNo">1296</span>              }<a name="line.1296"></a>
-<span class="sourceLineNo">1297</span>            }<a name="line.1297"></a>
-<span class="sourceLineNo">1298</span>          }<a name="line.1298"></a>
-<span class="sourceLineNo">1299</span>          serverRegions.add(region);<a name="line.1299"></a>
-<span class="sourceLineNo">1300</span>          cluster.doAssignRegion(region, serverName);<a name="line.1300"></a>
-<span class="sourceLineNo">1301</span>          serverIdx = (j + serverIdx + 1) % numServers; //remain from next server<a name="line.1301"></a>
-<span class="sourceLineNo">1302</span>          assigned = true;<a name="line.1302"></a>
-<span class="sourceLineNo">1303</span>          break;<a name="line.1303"></a>
-<span class="sourceLineNo">1304</span>        }<a name="line.1304"></a>
-<span class="sourceLineNo">1305</span>      }<a name="line.1305"></a>
-<span class="sourceLineNo">1306</span>      if (!assigned) {<a name="line.1306"></a>
-<span class="sourceLineNo">1307</span>        lastFewRegions.add(region);<a name="line.1307"></a>
-<span class="sourceLineNo">1308</span>      }<a name="line.1308"></a>
-<span class="sourceLineNo">1309</span>    }<a name="line.1309"></a>
-<span class="sourceLineNo">1310</span>    // just sprinkle the rest of the regions on random regionservers. The balanceCluster will<a name="line.1310"></a>
-<span class="sourceLineNo">1311</span>    // make it optimal later. we can end up with this if numReplicas &gt; numServers.<a name="line.1311"></a>
-<span class="sourceLineNo">1312</span>    for (RegionInfo region : lastFewRegions) {<a name="line.1312"></a>
-<span class="sourceLineNo">1313</span>      int i = RANDOM.nextInt(numServers);<a name="line.1313"></a>
-<span class="sourceLineNo">1314</span>      ServerName server = servers.get(i);<a name="line.1314"></a>
-<span class="sourceLineNo">1315</span>      List&lt;RegionInfo&gt; serverRegions = assignments.computeIfAbsent(server, k -&gt; new ArrayList&lt;&gt;());<a name="line.1315"></a>
-<span class="sourceLineNo">1316</span>      serverRegions.add(region);<a name="line.1316"></a>
-<span class="sourceLineNo">1317</span>      cluster.doAssignRegion(region, server);<a name="line.1317"></a>
-<span class="sourceLineNo">1318</span>    }<a name="line.1318"></a>
-<span class="sourceLineNo">1319</span>    return assignments;<a name="line.1319"></a>
-<span class="sourceLineNo">1320</span>  }<a name="line.1320"></a>
-<span class="sourceLineNo">1321</span><a name="line.1321"></a>
-<span class="sourceLineNo">1322</span>  protected Cluster createCluster(List&lt;ServerName&gt; servers, Collection&lt;RegionInfo&gt; regions,<a name="line.1322"></a>
-<span class="sourceLineNo">1323</span>      boolean hasRegionReplica) {<a name="line.1323"></a>
-<span class="sourceLineNo">1324</span>    // Get the snapshot of the current assignments for the regions in question, and then create<a name="line.1324"></a>
-<span class="sourceLineNo">1325</span>    // a cluster out of it. Note that we might have replicas already assigned to some servers<a name="line.1325"></a>
-<span class="sourceLineNo">1326</span>    // earlier. So we want to get the snapshot to see those assignments, but this will only contain<a name="line.1326"></a>
-<span class="sourceLineNo">1327</span>    // replicas of the regions that are passed (for performance).<a name="line.1327"></a>
-<span class="sourceLineNo">1328</span>    Map&lt;ServerName, List&lt;RegionInfo&gt;&gt; clusterState = null;<a name="line.1328"></a>
-<span class="sourceLineNo">1329</span>    if (!hasRegionReplica) {<a name="line.1329"></a>
-<span class="sourceLineNo">1330</span>      clusterState = getRegionAssignmentsByServer(regions);<a name="line.1330"></a>
-<span class="sourceLineNo">1331</span>    } else {<a name="line.1331"></a>
-<span class="sourceLineNo">1332</span>      // for the case where we have region replica it is better we get the entire cluster's snapshot<a name="line.1332"></a>
-<span class="sourceLineNo">1333</span>      clusterState = getRegionAssignmentsByServer(null);<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>    for (ServerName server : servers) {<a name="line.1336"></a>
-<span class="sourceLineNo">1337</span>      if (!clusterState.containsKey(server)) {<a name="line.1337"></a>
-<span class="sourceLineNo">1338</span>        clusterState.put(server, EMPTY_REGION_LIST);<a name="line.1338"></a>
-<span class="sourceLineNo">1339</span>      }<a name="line.1339"></a>
-<span class="sourceLineNo">1340</span>    }<a name="line.1340"></a>
-<span class="sourceLineNo">1341</span>    return new Cluster(regions, clusterState, null, this.regionFinder,<a name="line.1341"></a>
-<span class="sourceLineNo">1342</span>        rackManager);<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>  private List&lt;ServerName&gt; findIdleServers(List&lt;ServerName&gt; servers) {<a name="line.1345"></a>
-<span class="sourceLineNo">1346</span>    return this.services.getServerManager()<a name="line.1346"></a>
-<span class="sourceLineNo">1347</span>            .getOnlineServersListWithPredicator(servers, IDLE_SERVER_PREDICATOR);<a name="line.1347"></a>
-<span class="sourceLineNo">1348</span>  }<a name="line.1348"></a>
-<span class="sourceLineNo">1349</span><a name="line.1349"></a>
-<span class="sourceLineNo">1350</span>  /**<a name="line.1350"></a>
-<span class="sourceLineNo">1351</span>   * Used to assign a single region to a random server.<a name="line.1351"></a>
-<span class="sourceLineNo">1352</span>   */<a name="line.1352"></a>
-<span class="sourceLineNo">1353</span>  @Override<a name="line.1353"></a>
-<span class="sourceLineNo">1354</span>  public ServerName randomAssignment(RegionInfo regionInfo, List&lt;ServerName&gt; servers)<a name="line.1354"></a>
-<span class="sourceLineNo">1355</span>      throws HBaseIOException {<a name="line.1355"></a>
-<span class="sourceLineNo">1356</span>    metricsBalancer.incrMiscInvocations();<a name="line.1356"></a>
-<span class="sourceLineNo">1357</span>    if (servers != null &amp;&amp; servers.contains(masterServerName)) {<a name="line.1357"></a>
-<span class="sourceLineNo">1358</span>      if (shouldBeOnMaster(regionInfo)) {<a name="line.1358"></a>
-<span class="sourceLineNo">1359</span>        return masterServerName;<a name="line.1359"></a>
-<span class="sourceLineNo">1360</span>      }<a name="line.1360"></a>
-<span class="sourceLineNo">1361</span>      if (!LoadBalancer.isTablesOnMaster(getConf())) {<a name="line.1361"></a>
-<span class="sourceLineNo">1362</span>        // Guarantee we do not put any regions on master<a name="line.1362"></a>
-<span class="sourceLineNo">1363</span>        servers = new ArrayList&lt;&gt;(servers);<a name="line.1363"></a>
-<span class="sourceLineNo">1364</span>        servers.remove(masterServerName);<a name="line.1364"></a>
-<span class="sourceLineNo">1365</span>      }<a name="line.1365"></a>
-<span class="sourceLineNo">1366</span>    }<a name="line.1366"></a>
-<span class="sourceLineNo">1367</span><a name="line.1367"></a>
-<span class="sourceLineNo">1368</span>    int numServers = servers == null ? 0 : servers.size();<a name="line.1368"></a>
-<span class="sourceLineNo">1369</span>    if (numServers == 0) {<a name="line.1369"></a>
-<span class="sourceLineNo">1370</span>      LOG.warn("Wanted to retain assignment but no servers to assign to");<a name="line.1370"></a>
-<span class="sourceLineNo">1371</span>      return null;<a name="line.1371"></a>
-<span class="sourceLineNo">1372</span>    }<a name="line.1372"></a>
-<span class="sourceLineNo">1373</span>    if (numServers == 1) { // Only one server, nothing fancy we can do here<a name="line.1373"></a>
-<span class="sourceLineNo">1374</span>      return servers.get(0);<a name="line.1374"></a>
-<span class="sourceLineNo">1375</span>    }<a name="line.1375"></a>
-<span class="sourceLineNo">1376</span>    List&lt;ServerName&gt; idleServers = findIdleServers(servers);<a name="line.1376"></a>
-<span class="sourceLineNo">1377</span>    if (idleServers.size() == 1) {<a name="line.1377"></a>
-<span class="sourceLineNo">1378</span>      return idleServers.get(0);<a name="line.1378"></a>
-<span class="sourceLineNo">1379</span>    }<a name="line.1379"></a>
-<span class="sourceLineNo">1380</span>    final List&lt;ServerName&gt; finalServers = idleServers.isEmpty() ?<a name="line.1380"></a>
-<span class="sourceLineNo">1381</span>            servers : idleServers;<a name="line.1381"></a>
-<span class="sourceLineNo">1382</span>    List&lt;RegionInfo&gt; regions = Lists.newArrayList(regionInfo);<a name="line.1382"></a>
-<span class="sourceLineNo">1383</span>    Cluster cluster = createCluster(finalServers, regions, false);<a name="line.1383"></a>
-<span class="sourceLineNo">1384</span>    return randomAssignment(cluster, regionInfo, finalServers);<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>  /**<a name="line.1387"></a>
-<span class="sourceLineNo">1388</span>   * Generates a bulk assignment startup plan, attempting to reuse the existing<a name="line.1388"></a>
-<span class="sourceLineNo">1389</span>   * assignment information from META, but adjusting for the specified list of<a name="line.1389"></a>
-<span class="sourceLineNo">1390</span>   * available/online servers available for assignment.<a name="line.1390"></a>
-<span class="sourceLineNo">1391</span>   * &lt;p&gt;<a name="line.1391"></a>
-<span class="sourceLineNo">1392</span>   * Takes a map of all regions to their existing assignment from META. Also<a name="line.1392"></a>
-<span class="sourceLineNo">1393</span>   * takes a list of online servers for regions to be assigned to. Attempts to<a name="line.1393"></a>
-<span class="sourceLineNo">1394</span>   * retain all assignment, so in some instances initial assignment will not be<a name="line.1394"></a>
-<span class="sourceLineNo">1395</span>   * completely balanced.<a name="line.1395"></a>
-<span class="sourceLineNo">1396</span>   * &lt;p&gt;<a name="line.1396"></a>
-<span class="sourceLineNo">1397</span>   * Any leftover regions without an existing server to be assigned to will be<a name="line.1397"></a>
-<span class="sourceLineNo">1398</span>   * assigned randomly to available servers.<a name="line.1398"></a>
-<span class="sourceLineNo">1399</span>   *<a name="line.1399"></a>
-<span class="sourceLineNo">1400</span>   * @param regions regions and existing assignment from meta<a name="line.1400"></a>
-<span class="sourceLineNo">1401</span>   * @param servers available servers<a name="line.1401"></a>
-<span class="sourceLineNo">1402</span>   * @return map of servers and regions to be assigned to them<a name="line.1402"></a>
-<span class="sourceLineNo">1403</span>   */<a name="line.1403"></a>
-<span class="sourceLineNo">1404</span>  @Override<a name="line.1404"></a>
-<span class="sourceLineNo">1405</span>  public Map&lt;ServerName, List&lt;RegionInfo&gt;&gt; retainAssignment(Map&lt;RegionInfo, ServerName&gt; regions,<a name="line.1405"></a>
-<span class="sourceLineNo">1406</span>      List&lt;ServerName&gt; servers) throws HBaseIOException {<a name="line.1406"></a>
-<span class="sourceLineNo">1407</span>    // Update metrics<a name="line.1407"></a>
-<span class="sourceLineNo">1408</span>    metricsBalancer.incrMiscInvocations();<a name="line.1408"></a>
-<span class="sourceLineNo">1409</span>    Map&lt;ServerName, List&lt;RegionInfo&gt;&gt; assignments = assignMasterSystemRegions(regions.keySet(), servers);<a name="line.1409"></a>
-<span class="sourceLineNo">1410</span>    if (assignments != null &amp;&amp; !assignments.isEmpty()) {<a name="line.1410"></a>
-<span class="sourceLineNo">1411</span>      servers = new ArrayList&lt;&gt;(servers);<a name="line.1411"></a>
-<span class="sourceLineNo">1412</span>      // Guarantee not to put other regions on master<a name="line.1412"></a>
-<span class="sourceLineNo">1413</span>      servers.remove(masterServerName);<a name="line.1413"></a>
-<span class="sourceLineNo">1414</span>      List&lt;RegionInfo&gt; masterRegions = assignments.get(masterServerName);<a name="line.1414"></a>
-<span class="sourceLineNo">1415</span>      regions = regions.entrySet().stream().filter(e -&gt; !masterRegions.contains(e.getKey()))<a name="line.1415"></a>
-<span class="sourceLineNo">1416</span>          .collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue));<a name="line.1416"></a>
-<span class="sourceLineNo">1417</span>    }<a name="line.1417"></a>
-<span class="sourceLineNo">1418</span>    if (regions.isEmpty()) {<a name="line.1418"></a>
-<span class="sourceLineNo">1419</span>      return assignments;<a name="line.1419"></a>
-<span class="sourceLineNo">1420</span>    }<a name="line.1420"></a>
-<span class="sourceLineNo">1421</span><a name="line.1421"></a>
-<span class="sourceLineNo">1422</span>    int numServers = servers == null ? 0 : servers.size();<a name="line.1422"></a>
-<span class="sourceLineNo">1423</span>    if (numServers == 0) {<a name="line.1423"></a>
-<span class="sourceLineNo">1424</span>      LOG.warn("Wanted to do retain assignment but no servers to assign to");<a name="line.1424"></a>
-<span class="sourceLineNo">1425</span>      return null;<a name="line.1425"></a>
-<span class="sourceLineNo">1426</span>    }<a name="line.1426"></a>
-<span class="sourceLineNo">1427</span>    if (numServers == 1) { // Only one server, nothing fancy we can do here<a name="line.1427"></a>
-<span class="sourceLineNo">1428</span>      ServerName server = servers.get(0);<a name="line.1428"></a>
-<span class="sourceLineNo">1429</span>      assignments.put(server, new ArrayList&lt;&gt;(regions.keySet()));<a name="line.1429"></a>
-<span class="sourceLineNo">1430</span>      return assignments;<a name="line.1430"></a>
-<span class="sourceLineNo">1431</span>    }<a name="line.1431"></a>
-<span class="sourceLineNo">1432</span><a name="line.1432"></a>
-<span class="sourceLineNo">1433</span>    // Group all of the old assignments by their hostname.<a name="line.1433"></a>
-<span class="sourceLineNo">1434</span>    // We can't group directly by ServerName since the servers all have<a name="line.1434"></a>
-<span class="sourceLineNo">1435</span>    // new start-codes.<a name="line.1435"></a>
-<span class="sourceLineNo">1436</span><a name="line.1436"></a>
-<span class="sourceLineNo">1437</span>    // Group the servers by their hostname. It's possible we have multiple<a name="line.1437"></a>
-<span class="sourceLineNo">1438</span>    // servers on the same host on different ports.<a name="line.1438"></a>
-<span class="sourceLineNo">1439</span>    ArrayListMultimap&lt;String, ServerName&gt; serversByHostname = ArrayListMultimap.create();<a name="line.1439"></a>
-<span class="sourceLineNo">1440</span>    for (ServerName server : servers) {<a name="line.1440"></a>
-<span class="sourceLineNo">1441</span>      assignments.put(server, new ArrayList&lt;&gt;());<a name="line.1441"></a>
-<span class="sourceLineNo">1442</span>      serversByHostname.put(server.getHostnameLowerCase(), server);<a name="line.1442"></a>
-<span class="sourceLineNo">1443</span>    }<a name="line.1443"></a>
-<span class="sourceLineNo">1444</span><a name="line.1444"></a>
-<span class="sourceLineNo">1445</span>    // Collection of the hostnames that used to have regions<a name="line.1445"></a>
-<span class="sourceLineNo">1446</span>    // assigned, but for which we no longer have any RS running<a name="line.1446"></a>
-<span class="sourceLineNo">1447</span>    // after the cluster restart.<a name="line.1447"></a>
-<span class="sourceLineNo">1448</span>    Set&lt;String&gt; oldHostsNoLongerPresent = Sets.newTreeSet();<a name="line.1448"></a>
-<span class="sourceLineNo">1449</span><a name="line.1449"></a>
-<span class="sourceLineNo">1450</span>    // If the old servers aren't present, lets assign those regions later.<a name="line.1450"></a>
-<span class="sourceLineNo">1451</span>    List&lt;RegionInfo&gt; randomAssignRegions = Lists.newArrayList();<a name="line.1451"></a>
-<span class="sourceLineNo">1452</span><a name="line.1452"></a>
-<span class="sourceLineNo">1453</span>    int numRandomAssignments = 0;<a name="line.1453"></a>
-<span class="sourceLineNo">1454</span>    int numRetainedAssigments = 0;<a name="line.1454"></a>
-<span class="sourceLineNo">1455</span>    boolean hasRegionReplica = false;<a name="line.1455"></a>
-<span class="sourceLineNo">1456</span>    for (Map.Entry&lt;RegionInfo, ServerName&gt; entry : regions.entrySet()) {<a name="line.1456"></a>
-<span class="sourceLineNo">1457</span>      RegionInfo region = entry.getKey();<a name="line.1457"></a>
-<span class="sourceLineNo">1458</span>      ServerName oldServerName = entry.getValue();<a name="line.1458"></a>
-<span class="sourceLineNo">1459</span>      // In the current set of regions even if one has region replica let us go with<a name="line.1459"></a>
-<span class="sourceLineNo">1460</span>      // getting the entire snapshot<a name="line.1460"></a>
-<span class="sourceLineNo">1461</span>      if (this.services != null) { // for tests<a name="line.1461"></a>
-<span class="sourceLineNo">1462</span>        AssignmentManager am = this.services.getAssignmentManager();<a name="line.1462"></a>
-<span class="sourceLineNo">1463</span>        if (am != null) {<a name="line.1463"></a>
-<span class="sourceLineNo">1464</span>          RegionStates states = am.getRegionStates();<a name="line.1464"></a>
-<span class="sourceLineNo">1465</span>          if (!hasRegionReplica &amp;&amp; states != null &amp;&amp; states.isReplicaAvailableForRegion(region)) {<a name="line.1465"></a>
-<span class="sourceLineNo">1466</span>            hasRegionReplica = true;<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>      List&lt;ServerName&gt; localServers = new ArrayList&lt;&gt;();<a name="line.1470"></a>
-<span class="sourceLineNo">1471</span>      if (oldServerName != null) {<a name="line.1471"></a>
-<span class="sourceLineNo">1472</span>        localServers = serversByHostname.get(oldServerName.getHostnameLowerCase());<a name="line.1472"></a>
-<span class="sourceLineNo">1473</span>      }<a name="line.1473"></a>
-<span class="sourceLineNo">1474</span>      if (localServers.isEmpty()) {<a name="line.1474"></a>
-<span class="sourceLineNo">1475</span>        // No servers on the new cluster match up with this hostname, assign randomly, later.<a name="line.1475"></a>
-<span class="sourceLineNo">1476</span>        randomAssignRegions.add(region);<a name="line.1476"></a>
-<span class="sourceLineNo">1477</span>        if (oldServerName != null) {<a name="line.1477"></a>
-<span class="sourceLineNo">1478</span>          oldHostsNoLongerPresent.add(oldServerName.getHostnameLowerCase());<a name="line.1478"></a>
-<span class="sourceLineNo">1479</span>        }<a name="line.1479"></a>
-<span class="sourceLineNo">1480</span>      } else if (localServers.size() == 1) {<a name="line.1480"></a>
-<span class="sourceLineNo">1481</span>        // the usual case - one new server on same host<a name="line.1481"></a>
-<span class="sourceLineNo">1482</span>        ServerName target = localServers.get(0);<a name="line.1482"></a>
-<span class="sourceLineNo">1483</span>        assignments.get(target).add(region);<a name="line.1483"></a>
-<span class="sourceLineNo">1484</span>        numRetainedAssigments++;<a name="line.1484"></a>
-<span class="sourceLineNo">1485</span>      } else {<a name="line.1485"></a>
-<span class="sourceLineNo">1486</span>        // multiple new servers in the cluster on this same host<a name="line.1486"></a>
-<span class="sourceLineNo">1487</span>        if (localServers.contains(oldServerName)) {<a name="line.1487"></a>
-<span class="sourceLineNo">1488</span>          assignments.get(oldServerName).add(region);<a name="line.1488"></a>
-<span class="sourceLineNo">1489</span>          numRetainedAssigments++;<a name="line.1489"></a>
-<span class="sourceLineNo">1490</span>        } else {<a name="line.1490"></a>
-<span class="sourceLineNo">1491</span>          ServerName target = null;<a name="line.1491"></a>
-<span class="sourceLineNo">1492</span>          for (ServerName tmp : localServers) {<a name="line.1492"></a>
-<span class="sourceLineNo">1493</span>            if (tmp.getPort() == oldServerName.getPort()) {<a name="line.1493"></a>
-<span class="sourceLineNo">1494</span>              target = tmp;<a name="line.1494"></a>
-<span class="sourceLineNo">1495</span>              assignments.get(tmp).add(region);<a name="line.1495"></a>
-<span class="sourceLineNo">1496</span>              numRetainedAssigments++;<a name="line.1496"></a>
-<span class="sourceLineNo">1497</span>              break;<a name="line.1497"></a>
-<span class="sourceLineNo">1498</span>            }<a name="line.1498"></a>
-<span class="sourceLineNo">1499</span>          }<a name="line.1499"></a>
-<span class="sourceLineNo">1500</span>          if (target == null) {<a name="line.1500"></a>
-<span class="sourceLineNo">1501</span>            randomAssignRegions.add(region);<a name="line.1501"></a>
-<span class="sourceLineNo">1502</span>          }<a name="line.1502"></a>
-<span class="sourceLineNo">1503</span>        }<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><a name="line.1506"></a>
-<span class="sourceLineNo">1507</span>    // If servers from prior assignment aren't present, then lets do randomAssignment on regions.<a name="line.1507"></a>
-<span class="sourceLineNo">1508</span>    if (randomAssignRegions.size() &gt; 0) {<a name="line.1508"></a>
-<span class="sourceLineNo">1509</span>      Cluster cluster = createCluster(servers, regions.keySet(), hasRegionReplica);<a name="line.1509"></a>
-<span class="sourceLineNo">1510</span>      for (Map.Entry&lt;ServerName, List&lt;RegionInfo&gt;&gt; entry : assignments.entrySet()) {<a name="line.1510"></a>
-<span class="sourceLineNo">1511</span>        ServerName sn = entry.getKey();<a name="line.1511"></a>
-<span class="sourceLineNo">1512</span>        for (RegionInfo region : entry.getValue()) {<a name="line.1512"></a>
-<span class="sourceLineNo">1513</span>          cluster.doAssignRegion(region, sn);<a name="line.1513"></a>
-<span class="sourceLineNo">1514</span>        }<a name="line.1514"></a>
-<span class="sourceLineNo">1515</span>      }<a name="line.1515"></a>
-<span class="sourceLineNo">1516</span>      for (RegionInfo region : randomAssignRegions) {<a name="line.1516"></a>
-<span class="sourceLineNo">1517</span>        ServerName target = randomAssignment(cluster, region, servers);<a name="line.1517"></a>
-<span class="sourceLineNo">1518</span>        assignments.get(target).add(region);<a name="line.1518"></a>
-<span class="sourceLineNo">1519</span>        numRandomAssignments++;<a name="line.1519"></a>
-<span class="sourceLineNo">1520</span>      }<a name="line.1520"></a>
-<span class="sourceLineNo">1521</span>    }<a name="line.1521"></a>
-<span class="sourceLineNo">1522</span><a name="line.1522"></a>
-<span class="sourceLineNo">1523</span>    String randomAssignMsg = "";<a name="line.1523"></a>
-<span class="sourceLineNo">1524</span>    if (numRandomAssignments &gt; 0) {<a name="line.1524"></a>
-<span class="sourceLineNo">1525</span>      randomAssignMsg =<a name="line.1525"></a>
-<span class="sourceLineNo">1526</span>          numRandomAssignments + " regions were assigned "<a name="line.1526"></a>
-<span class="sourceLineNo">1527</span>              + "to random hosts, since the old hosts for these regions are no "<a name="line.1527"></a>
-<span class="sourceLineNo">1528</span>              + "longer present in the cluster. These hosts were:\n  "<a name="line.1528"></a>
-<span class="sourceLineNo">1529</span>              + Joiner.on("\n  ").join(oldHostsNoLongerPresent);<a name="line.1529"></a>
-<span class="sourceLineNo">1530</span>    }<a name="line.1530"></a>
-<span class="sourceLineNo">1531</span><a name="line.1531"></a>
-<span class="sourceLineNo">1532</span>    LOG.info("Reassigned " + regions.size() + " regions. " + numRetainedAssigments<a name="line.1532"></a>
-<span class="sourceLineNo">1533</span>        + " retained the pre-restart assignment. " + randomAssignMsg);<a name="line.1533"></a>
-<span class="sourceLineNo">1534</span>    return assignments;<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>  @Override<a name="line.1537"></a>
-<span class="sourceLineNo">1538</span>  public void initialize() throws HBaseIOException{<a name="line.1538"></a>
-<span class="sourceLineNo">1539</span>  }<a name="line.1539"></a>
-<span class="sourceLineNo">1540</span><a name="line.1540"></a>
-<span class="sourceLineNo">1541</span>  @Override<a name="line.1541"></a>
-<span class="sourceLineNo">1542</span>  public void regionOnline(RegionInfo regionInfo, ServerName sn) {<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>  @Override<a name="line.1545"></a>
-<span class="sourceLineNo">1546</span>  public void regionOffline(RegionInfo regionInfo) {<a name="line.1546"></a>
-<span class="sourceLineNo">1547</span>  }<a name="line.1547"></a>
-<span class="sourceLineNo">1548</span><a name="line.1548"></a>
-<span class="sourceLineNo">1549</span>  @Override<a name="line.1549"></a>
-<span class="sourceLineNo">1550</span>  public boolean isStopped() {<a name="line.1550"></a>
-<span class="sourceLineNo">1551</span>    return stopped;<a name="line.1551"></a>
-<span class="sourceLineNo">1552</span>  }<a name="line.1552"></a>
-<span class="sourceLineNo">1553</span><a name="line.1553"></a>
-<span class="sourceLineNo">1554</span>  @Override<a name="line.1554"></a>
-<span class="sourceLineNo">1555</span>  public void stop(String why) {<a name="line.1555"></a>
-<span class="sourceLineNo">1556</span>    LOG.info("Load Balancer stop requested: "+why);<a name="line.1556"></a>
-<span class="sourceLineNo">1557</span>    stopped = true;<a name="line.1557"></a>
-<span class="sourceLineNo">1558</span>  }<a name="line.1558"></a>
-<span class="sourceLineNo">1559</span><a name="line.1559"></a>
-<span class="sourceLineNo">1560</span>  /**<a name="line.1560"></a>
-<span class="sourceLineNo">1561</span>  * Updates the balancer status tag reported to JMX<a name="line.1561"></a>
-<span class="sourceLineNo">1562</span>  */<a name="line.1562"></a>
-<span class="sourceLineNo">1563</span>  public void updateBalancerStatus(boolean status) {<a name="line.1563"></a>
-<span class="sourceLineNo">1564</span>    metricsBalancer.balancerStatus(status);<a name="line.1564"></a>
-<span class="sourceLineNo">1565</span>  }<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>   * Used to assign a single region to a random server.<a name="line.1568"></a>
-<span class="sourceLineNo">1569</span>   */<a name="line.1569"></a>
-<span class="sourceLineNo">1570</span>  private ServerName randomAssignment(Cluster cluster, RegionInfo regionInfo,<a name="line.1570"></a>
-<span class="sourceLineNo">1571</span>      List&lt;ServerName&gt; servers) {<a name="line.1571"></a>
-<span class="sourceLineNo">1572</span>    int numServers = servers.size(); // servers is not null, numServers &gt; 1<a name="line.1572"></a>
-<span class="sourceLineNo">1573</span>    ServerName sn = null;<a name="line.1573"></a>
-<span class="sourceLineNo">1574</span>    final int maxIterations = numServers * 4;<a name="line.1574"></a>
-<span class="sourceLineNo">1575</span>    int iterations = 0;<a name="line.1575"></a>
-<span class="sourceLineNo">1576</span>    List&lt;ServerName&gt; usedSNs = new ArrayList&lt;&gt;(servers.size());<a name="line.1576"></a>
-<span class="sourceLineNo">1577</span>    do {<a name="line.1577"></a>
-<span class="sourceLineNo">1578</span>      int i = RANDOM.nextInt(numServers);<a name="line.1578"></a>
-<span class="sourceLineNo">1579</span>      sn = servers.get(i);<a name="line.1579"></a>
-<span class="sourceLineNo">1580</span>      if (!usedSNs.contains(sn)) {<a name="line.1580"></a>
-<span class="sourceLineNo">1581</span>        usedSNs.add(sn);<a name="line.1581"></a>
-<span class="sourceLineNo">1582</span>      }<a name="line.1582"></a>
-<span class="sourceLineNo">1583</span>    } while (cluster.wouldLowerAvailability(regionInfo, sn)<a name="line.1583"></a>
-<span class="sourceLineNo">1584</span>        &amp;&amp; iterations++ &lt; maxIterations);<a name="line.1584"></a>
-<span class="sourceLineNo">1585</span>    if (iterations &gt;= maxIterations) {<a name="line.1585"></a>
-<span class="sourceLineNo">1586</span>      // We have reached the max. Means the servers that we collected is still lowering the<a name="line.1586"></a>
-<span class="sourceLineNo">1587</span>      // availability<a name="line.1587"></a>
-<span class="sourceLineNo">1588</span>      for (ServerName unusedServer : servers) {<a name="line.1588"></a>
-<span class="sourceLineNo">1589</span>        if (!usedSNs.contains(unusedServer)) {<a name="line.1589"></a>
-<span class="sourceLineNo">1590</span>          // check if any other unused server is there for us to use.<a name="line.1590"></a>
-<span class="sourceLineNo">1591</span>          // If so use it. Else we have not other go but to go with one of them<a name="line.1591"></a>
-<span class="sourceLineNo">1592</span>          if (!cluster.wouldLowerAvailability(regionInfo, unusedServer)) {<a name="line.1592"></a>
-<span class="sourceLineNo">1593</span>            sn = unusedServer;<a name="line.1593"></a>
-<span class="sourceLineNo">1594</span>            break;<a name="line.1594"></a>
-<span class="sourceLineNo">1595</span>          }<a name="line.1595"></a>
-<span class="sourceLineNo">1596</span>        }<a name="line.1596"></a>
-<span class="sourceLineNo">1597</span>      }<a name="line.1597"></a>
-<span class="sourceLineNo">1598</span>    }<a name="line.1598"></a>
-<span class="sourceLineNo">1599</span>    cluster.doAssignRegion(regionInfo, sn);<a name="line.1599"></a>
-<span class="sourceLineNo">1600</span>    return sn;<a name="line.1600"></a>
-<span class="sourceLineNo">1601</span>  }<a name="line.1601"></a>
-<span class="sourceLineNo">1602</span><a name="line.1602"></a>
-<span class="sourceLineNo">1603</span>  /**<a name="line.1603"></a>
-<span class="sourceLineNo">1604</span>   * Round robin a list of regions to a list of servers<a name="line.1604"></a>
-<span class="sourceLineNo">1605</span>   */<a name="line.1605"></a>
-<span class="sourceLineNo">1606</span>  private void roundRobinAssignment(Cluster cluster, List&lt;RegionInfo&gt; regions,<a name="line.1606"></a>
-<span class="sourceLineNo">1607</span>      List&lt;RegionInfo&gt; unassignedRegions, List&lt;ServerName&gt; servers,<a name="line.1607"></a>
-<span class="sourceLineNo">1608</span>      Map&lt;ServerName, List&lt;RegionInfo&gt;&gt; assignments) {<a name="line.1608"></a>
-<span class="sourceLineNo">1609</span><a name="line.1609"></a>
-<span class="sourceLineNo">1610</span>    int numServers = servers.size();<a name="line.1610"></a>
-<span class="sourceLineNo">1611</span>    int numRegions = regions.size();<a name="line.1611"></a>
-<span class="sourceLineNo">1612</span>    int max = (int) Math.ceil((float) numRegions / numServers);<a name="line.1612"></a>
-<span class="sourceLineNo">1613</span>    int serverIdx = 0;<a name="line.1613"></a>
-<span class="sourceLineNo">1614</span>    if (numServers &gt; 1) {<a name="line.1614"></a>
-<span class="sourceLineNo">1615</span>      serverIdx = RANDOM.nextInt(numServers);<a name="line.1615"></a>
-<span class="sourceLineNo">1616</span>    }<a name="line.1616"></a>
-<span class="sourceLineNo">1617</span>    int regionIdx = 0;<a name="line.1617"></a>
-<span class="sourceLineNo">1618</span><a name="line.1618"></a>
-<span class="sourceLineNo">1619</span>    for (int j = 0; j &lt; numServers; j++) {<a name="line.1619"></a>
-<span class="sourceLineNo">1620</span>      ServerName server = servers.get((j + serverIdx) % numServers);<a name="line.1620"></a>
-<span class="sourceLineNo">1621</span>      List&lt;RegionInfo&gt; serverRegions = new ArrayList&lt;&gt;(max);<a name="line.1621"></a>
-<span class="sourceLineNo">1622</span>      for (int i = regionIdx; i &lt; numRegions; i += numServers) {<a name="line.1622"></a>
-<span class="sourceLineNo">1623</span>        RegionInfo region = regions.get(i % numRegions);<a name="line.1623"></a>
-<span class="sourceLineNo">1624</span>        if (cluster.wouldLowerAvailability(region, server)) {<a name="line.1624"></a>
-<span class="sourceLineNo">1625</span>          unassignedRegions.add(region);<a name="line.1625"></a>
-<span class="sourceLineNo">1626</span>        } else {<a name="line.1626"></a>
-<span class="sourceLineNo">1627</span>          serverRegions.add(region);<a name="line.1627"></a>
-<span class="sourceLineNo">1628</span>          cluster.doAssignRegion(region, server);<a name="line.1628"></a>
-<span class="sourceLineNo">1629</span>        }<a name="line.1629"></a>
-<span class="sourceLineNo">1630</span>      }<a name="line.1630"></a>
-<span class="sourceLineNo">1631</span>      assignments.put(server, serverRegions);<a name="line.1631"></a>
-<span class="sourceLineNo">1632</span>      regionIdx++;<a name="line.1632"></a>
-<span class="sourceLineNo">1633</span>    }<a name="line.1633"></a>
-<span class="sourceLineNo">1634</span>  }<a name="line.1634"></a>
-<span class="sourceLineNo">1635</span><a name="line.1635"></a>
-<span class="sourceLineNo">1636</span>  protected Map&lt;ServerName, List&lt;RegionInfo&gt;&gt; getRegionAssignmentsByServer(<a name="line.1636"></a>
-<span class="sourceLineNo">1637</span>    Collection&lt;RegionInfo&gt; regions) {<a name="line.1637"></a>
-<span class="sourceLineNo">1638</span>    if (this.services != null &amp;&amp; this.services.getAssignmentManager() != null) {<a name="line.1638"></a>
-<span class="sourceLineNo">1639</span>      return this.services.getAssignmentManager().getSnapShotOfAssignment(regions);<a name="line.1639"></a>
-<span class="sourceLineNo">1640</span>    } else {<a name="line.1640"></a>
-<span class="sourceLineNo">1641</span>      return new HashMap&lt;&gt;();<a name="line.1641"></a>
-<span class="sourceLineNo">1642</span>    }<a name="line.1642"></a>
-<span class="sourceLineNo">1643</span>  }<a name="line.1643"></a>
-<span class="sourceLineNo">1644</span><a name="line.1644"></a>
-<span class="sourceLineNo">1645</span>  @Override<a name="line.1645"></a>
-<span class="sourceLineNo">1646</span>  public void onConfigurationChange(Configuration conf) {<a name="line.1646"></a>
-<span class="sourceLineNo">1647</span>  }<a name="line.1647"></a>
-<span class="sourceLineNo">1648</span>}<a name="line.1648"></a>
+<span class="sourceLineNo">1044</span>  /**<a name="line.1044"></a>
+<span class="sourceLineNo">1045</span>   * Check if a region belongs to some system table.<a name="line.1045"></a>
+<span class="sourceLineNo">1046</span>   * If so, the primary replica may be expected to be put on the master regionserver.<a name="line.1046"></a>
+<span class="sourceLineNo">1047</span>   */<a name="line.1047"></a>
+<span class="sourceLineNo">1048</span>  public boolean shouldBeOnMaster(RegionInfo region) {<a name="line.1048"></a>
+<span class="sourceLineNo">1049</span>    return (this.maintenanceMode || this.onlySystemTablesOnMaster)<a name="line.1049"></a>
+<span class="sourceLineNo">1050</span>        &amp;&amp; region.getTable().isSystemTable();<a name="line.1050"></a>
+<span class="sourceLineNo">1051</span>  }<a name="line.1051"></a>
+<span class="sourceLineNo">1052</span><a name="line.1052"></a>
+<span class="sourceLineNo">1053</span>  /**<a name="line.1053"></a>
+<span class="sourceLineNo">1054</span>   * Balance the regions that should be on master regionserver.<a name="line.1054"></a>
+<span class="sourceLineNo">1055</span>   */<a name="line.1055"></a>
+<span class="sourceLineNo">1056</span>  protected List&lt;RegionPlan&gt; balanceMasterRegions(Map&lt;ServerName, List&lt;RegionInfo&gt;&gt; clusterMap) {<a name="line.1056"></a>
+<span class="sourceLineNo">1057</span>    if (masterServerName == null || clusterMap == null || clusterMap.size() &lt;= 1) return null;<a name="line.1057"></a>
+<span class="sourceLineNo">1058</span>    List&lt;RegionPlan&gt; plans = null;<a name="line.1058"></a>
+<span class="sourceLineNo">1059</span>    List&lt;RegionInfo&gt; regions = clusterMap.get(masterServerName);<a name="line.1059"></a>
+<span class="sourceLineNo">1060</span>    if (regions != null) {<a name="line.1060"></a>
+<span class="sourceLineNo">1061</span>      Iterator&lt;ServerName&gt; keyIt = null;<a name="line.1061"></a>
+<span class="sourceLineNo">1062</span>      for (RegionInfo region: regions) {<a name="line.1062"></a>
+<span class="sourceLineNo">1063</span>        if (shouldBeOnMaster(region)) continue;<a name="line.1063"></a>
+<span class="sourceLineNo">1064</span><a name="line.1064"></a>
+<span class="sourceLineNo">1065</span>        // Find a non-master regionserver to host the region<a name="line.1065"></a>
+<span class="sourceLineNo">1066</span>        if (keyIt == null || !keyIt.hasNext()) {<a name="line.1066"></a>
+<span class="sourceLineNo">1067</span>          keyIt = clusterMap.keySet().iterator();<a name="line.1067"></a>
+<span class="sourceLineNo">1068</span>        }<a name="line.1068"></a>
+<span class="sourceLineNo">1069</span>        ServerName dest = keyIt.next();<a name="line.1069"></a>
+<span class="sourceLineNo">1070</span>        if (masterServerName.equals(dest)) {<a name="line.1070"></a>
+<span class="sourceLineNo">1071</span>          if (!keyIt.hasNext()) {<a name="line.1071"></a>
+<span class="sourceLineNo">1072</span>            keyIt = clusterMap.keySet().iterator();<a name="line.1072"></a>
+<span class="sourceLineNo">1073</span>          }<a name="line.1073"></a>
+<span class="sourceLineNo">1074</span>          dest = keyIt.next();<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>        // Move this region away from the master regionserver<a name="line.1077"></a>
+<span class="sourceLineNo">1078</span>        RegionPlan plan = new RegionPlan(region, masterServerName, dest);<a name="line.1078"></a>
+<span class="sourceLineNo">1079</span>        if (plans == null) {<a name="line.1079"></a>
+<span class="sourceLineNo">1080</span>          plans = new ArrayList&lt;&gt;();<a name="line.1080"></a>
+<span class="sourceLineNo">1081</span>        }<a name="line.1081"></a>
+<span class="sourceLineNo">1082</span>        plans.add(plan);<a name="line.1082"></a>
+<span class="sourceLineNo">1083</span>      }<a name="line.1083"></a>
+<span class="sourceLineNo">1084</span>    }<a name="line.1084"></a>
+<span class="sourceLineNo">1085</span>    for (Map.Entry&lt;ServerName, List&lt;RegionInfo&gt;&gt; server: clusterMap.entrySet()) {<a name="line.1085"></a>
+<span class="sourceLineNo">1086</span>      if (masterServerName.equals(server.getKey())) continue;<a name="line.1086"></a>
+<span class="sourceLineNo">1087</span>      for (RegionInfo region: server.getValue()) {<a name="line.1087"></a>
+<span class="sourceLineNo">1088</span>        if (!shouldBeOnMaster(region)) continue;<a name="line.1088"></a>
+<span class="sourceLineNo">1089</span><a name="line.1089"></a>
+<span class="sourceLineNo">1090</span>        // Move this region to the master regionserver<a name="line.1090"></a>
+<span class="sourceLineNo">1091</span>        RegionPlan plan = new RegionPlan(region, server.getKey(), masterServerName);<a name="line.1091"></a>
+<span class="sourceLineNo">1092</span>        if (plans == null) {<a name="line.1092"></a>
+<span class="sourceLineNo">1093</span>          plans = new ArrayList&lt;&gt;();<a name="line.1093"></a>
+<span class="sourceLineNo">1094</span>        }<a name="line.1094"></a>
+<span class="sourceLineNo">1095</span>        plans.add(plan);<a name="line.1095"></a>
+<span class="sourceLineNo">1096</span>      }<a name="line.1096"></a>
+<span class="sourceLineNo">1097</span>    }<a name="line.1097"></a>
+<span class="sourceLineNo">1098</span>    return plans;<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>  /**<a name="line.1101"></a>
+<span class="sourceLineNo">1102</span>   * If master is configured to carry system tables only, in here is<a name="line.1102"></a>
+<span class="sourceLineNo">1103</span>   * where we figure what to assign it.<a name="line.1103"></a>
+<span class="sourceLineNo">1104</span>   */<a name="line.1104"></a>
+<span class="sourceLineNo">1105</span>  protected Map&lt;ServerName, List&lt;RegionInfo&gt;&gt; assignMasterSystemRegions(<a name="line.1105"></a>
+<span class="sourceLineNo">1106</span>      Collection&lt;RegionInfo&gt; regions, List&lt;ServerName&gt; servers) {<a name="line.1106"></a>
+<span class="sourceLineNo">1107</span>    if (servers == null || regions == null || regions.isEmpty()) {<a name="line.1107"></a>
+<span class="sourceLineNo">1108</span>      return null;<a name="line.1108"></a>
+<span class="sourceLineNo">1109</span>    }<a name="line.1109"></a>
+<span class="sourceLineNo">1110</span>    Map&lt;ServerName, List&lt;RegionInfo&gt;&gt; assignments = new TreeMap&lt;&gt;();<a name="line.1110"></a>
+<span class="sourceLineNo">1111</span>    if (this.maintenanceMode || this.onlySystemTablesOnMaster) {<a name="line.1111"></a>
+<span class="sourceLineNo">1112</span>      if (masterServerName != null &amp;&amp; servers.contains(masterServerName)) {<a name="line.1112"></a>
+<span class="sourceLineNo">1113</span>        assignments.put(masterServerName, new ArrayList&lt;&gt;());<a name="line.1113"></a>
+<span class="sourceLineNo">1114</span>        for (RegionInfo region : regions) {<a name="line.1114"></a>
+<span class="sourceLineNo">1115</span>          if (shouldBeOnMaster(region)) {<a name="line.1115"></a>
+<span class="sourceLineNo">1116</span>            assignments.get(masterServerName).add(region);<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>      }<a name="line.1119"></a>
+<span class="sourceLineNo">1120</span>    }<a name="line.1120"></a>
+<span class="sourceLineNo">1121</span>    return assignments;<a name="line.1121"></a>
+<span class="sourceLineNo">1122</span>  }<a name="line.1122"></a>
+<span class="sourceLineNo">1123</span><a name="line.1123"></a>
+<span class="sourceLineNo">1124</span>  @Override<a name="line.1124"></a>
+<span class="sourceLineNo">1125</span>  public Configuration getConf() {<a name="line.1125"></a>
+<span class="sourceLineNo">1126</span>    return this.config;<a name="line.1126"></a>
+<span class="sourceLineNo">1127</span>  }<a name="line.1127"></a>
+<span class="sourceLineNo">1128</span><a name="line.1128"></a>
+<span class="sourceLineNo">1129</span>  @Override<a name="line.1129"></a>
+<span class="sourceLineNo">1130</span>  public synchronized void setClusterMetrics(ClusterMetrics st) {<a name="line.1130"></a>
+<span class="sourceLineNo">1131</span>    this.clusterStatus = st;<a name="line.1131"></a>
+<span class="sourceLineNo">1132</span>    if (useRegionFinder) {<a name="line.1132"></a>
+<span class="sourceLineNo">1133</span>      regionFinder.setClusterMetrics(st);<a name="line.1133"></a>
+<span class="sourceLineNo">1134</span>    }<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 void setClusterLoad(Map&lt;TableName, Map&lt;ServerName, List&lt;RegionInfo&gt;&gt;&gt; clusterLoad){<a name="line.1138"></a>
+<span class="sourceLineNo">1139</span><a name="line.1139"></a>
+<span class="sourceLineNo">1140</span>  }<a name="line.1140"></a>
+<span class="sourceLineNo">1141</span><a name="line.1141"></a>
+<span class="sourceLineNo">1142</span>  @Override<a name="line.1142"></a>
+<span class="sourceLineNo">1143</span>  public void setMasterServices(MasterServices masterServices) {<a name="line.1143"></a>
+<span class="sourceLineNo">1144</span>    masterServerName = masterServices.getServerName();<a name="line.1144"></a>
+<span class="sourceLineNo">1145</span>    this.services = masterServices;<a name="line.1145"></a>
+<span class="sourceLineNo">1146</span>    if (useRegionFinder) {<a name="line.1146"></a>
+<span class="sourceLineNo">1147</span>      this.regionFinder.setServices(masterServices);<a name="line.1147"></a>
+<span class="sourceLineNo">1148</span>    }<a name="line.1148"></a>
+<span class="sourceLineNo">1149</span>    if (this.services.isInMaintenanceMode()) {<a name="line.1149"></a>
+<span class="sourceLineNo">1150</span>      this.maintenanceMode = true;<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><a name="line.1153"></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 (this.maintenanceMode || 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

<TRUNCATED>