<!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> *<a name="line.2"></a>
<span class="sourceLineNo">003</span> * Licensed to the Apache Software Foundation (ASF) under one<a name="line.3"></a>
<span class="sourceLineNo">004</span> * or more contributor license agreements.  See the NOTICE file<a name="line.4"></a>
<span class="sourceLineNo">005</span> * distributed with this work for additional information<a name="line.5"></a>
<span class="sourceLineNo">006</span> * regarding copyright ownership.  The ASF licenses this file<a name="line.6"></a>
<span class="sourceLineNo">007</span> * to you under the Apache License, Version 2.0 (the<a name="line.7"></a>
<span class="sourceLineNo">008</span> * "License"); you may not use this file except in compliance<a name="line.8"></a>
<span class="sourceLineNo">009</span> * with the License.  You may obtain a copy of the License at<a name="line.9"></a>
<span class="sourceLineNo">010</span> *<a name="line.10"></a>
<span class="sourceLineNo">011</span> *     http://www.apache.org/licenses/LICENSE-2.0<a name="line.11"></a>
<span class="sourceLineNo">012</span> *<a name="line.12"></a>
<span class="sourceLineNo">013</span> * Unless required by applicable law or agreed to in writing, software<a name="line.13"></a>
<span class="sourceLineNo">014</span> * distributed under the License is distributed on an "AS IS" BASIS,<a name="line.14"></a>
<span class="sourceLineNo">015</span> * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.<a name="line.15"></a>
<span class="sourceLineNo">016</span> * See the License for the specific language governing permissions and<a name="line.16"></a>
<span class="sourceLineNo">017</span> * limitations under the License.<a name="line.17"></a>
<span class="sourceLineNo">018</span> */<a name="line.18"></a>
<span class="sourceLineNo">019</span>package org.apache.hadoop.hbase.master.balancer;<a name="line.19"></a>
<span class="sourceLineNo">020</span><a name="line.20"></a>
<span class="sourceLineNo">021</span>import edu.umd.cs.findbugs.annotations.NonNull;<a name="line.21"></a>
<span class="sourceLineNo">022</span>import java.io.IOException;<a name="line.22"></a>
<span class="sourceLineNo">023</span>import java.util.ArrayList;<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.Collection;<a name="line.25"></a>
<span class="sourceLineNo">026</span>import java.util.Collections;<a name="line.26"></a>
<span class="sourceLineNo">027</span>import java.util.Comparator;<a name="line.27"></a>
<span class="sourceLineNo">028</span>import java.util.Deque;<a name="line.28"></a>
<span class="sourceLineNo">029</span>import java.util.HashMap;<a name="line.29"></a>
<span class="sourceLineNo">030</span>import java.util.Iterator;<a name="line.30"></a>
<span class="sourceLineNo">031</span>import java.util.List;<a name="line.31"></a>
<span class="sourceLineNo">032</span>import java.util.Map;<a name="line.32"></a>
<span class="sourceLineNo">033</span>import java.util.Map.Entry;<a name="line.33"></a>
<span class="sourceLineNo">034</span>import java.util.NavigableMap;<a name="line.34"></a>
<span class="sourceLineNo">035</span>import java.util.Random;<a name="line.35"></a>
<span class="sourceLineNo">036</span>import java.util.Set;<a name="line.36"></a>
<span class="sourceLineNo">037</span>import java.util.TreeMap;<a name="line.37"></a>
<span class="sourceLineNo">038</span>import java.util.function.Predicate;<a name="line.38"></a>
<span class="sourceLineNo">039</span>import java.util.stream.Collectors;<a name="line.39"></a>
<span class="sourceLineNo">040</span>import org.apache.commons.lang3.NotImplementedException;<a name="line.40"></a>
<span class="sourceLineNo">041</span>import org.apache.hadoop.conf.Configuration;<a name="line.41"></a>
<span class="sourceLineNo">042</span>import org.apache.hadoop.hbase.ClusterMetrics;<a name="line.42"></a>
<span class="sourceLineNo">043</span>import org.apache.hadoop.hbase.HBaseConfiguration;<a name="line.43"></a>
<span class="sourceLineNo">044</span>import org.apache.hadoop.hbase.HBaseIOException;<a name="line.44"></a>
<span class="sourceLineNo">045</span>import org.apache.hadoop.hbase.HConstants;<a name="line.45"></a>
<span class="sourceLineNo">046</span>import org.apache.hadoop.hbase.HDFSBlocksDistribution;<a name="line.46"></a>
<span class="sourceLineNo">047</span>import org.apache.hadoop.hbase.ServerMetrics;<a name="line.47"></a>
<span class="sourceLineNo">048</span>import org.apache.hadoop.hbase.ServerName;<a name="line.48"></a>
<span class="sourceLineNo">049</span>import org.apache.hadoop.hbase.TableName;<a name="line.49"></a>
<span class="sourceLineNo">050</span>import org.apache.hadoop.hbase.client.RegionInfo;<a name="line.50"></a>
<span class="sourceLineNo">051</span>import org.apache.hadoop.hbase.client.RegionReplicaUtil;<a name="line.51"></a>
<span class="sourceLineNo">052</span>import org.apache.hadoop.hbase.client.TableDescriptor;<a name="line.52"></a>
<span class="sourceLineNo">053</span>import org.apache.hadoop.hbase.master.LoadBalancer;<a name="line.53"></a>
<span class="sourceLineNo">054</span>import org.apache.hadoop.hbase.master.MasterServices;<a name="line.54"></a>
<span class="sourceLineNo">055</span>import org.apache.hadoop.hbase.master.RackManager;<a name="line.55"></a>
<span class="sourceLineNo">056</span>import org.apache.hadoop.hbase.master.RegionPlan;<a name="line.56"></a>
<span class="sourceLineNo">057</span>import org.apache.hadoop.hbase.master.balancer.BaseLoadBalancer.Cluster.Action.Type;<a name="line.57"></a>
<span class="sourceLineNo">058</span>import org.apache.hadoop.hbase.net.Address;<a name="line.58"></a>
<span class="sourceLineNo">059</span>import org.apache.yetus.audience.InterfaceAudience;<a name="line.59"></a>
<span class="sourceLineNo">060</span>import org.slf4j.Logger;<a name="line.60"></a>
<span class="sourceLineNo">061</span>import org.slf4j.LoggerFactory;<a name="line.61"></a>
<span class="sourceLineNo">062</span><a name="line.62"></a>
<span class="sourceLineNo">063</span>import org.apache.hbase.thirdparty.com.google.common.base.Joiner;<a name="line.63"></a>
<span class="sourceLineNo">064</span>import org.apache.hbase.thirdparty.com.google.common.collect.ArrayListMultimap;<a name="line.64"></a>
<span class="sourceLineNo">065</span>import org.apache.hbase.thirdparty.com.google.common.collect.Lists;<a name="line.65"></a>
<span class="sourceLineNo">066</span>import org.apache.hbase.thirdparty.com.google.common.collect.Sets;<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> * The base class for load balancers. It provides the the functions used to by<a name="line.69"></a>
<span class="sourceLineNo">070</span> * {@link org.apache.hadoop.hbase.master.assignment.AssignmentManager} to assign regions<a name="line.70"></a>
<span class="sourceLineNo">071</span> * in the edge cases. It doesn't provide an implementation of the<a name="line.71"></a>
<span class="sourceLineNo">072</span> * actual balancing algorithm.<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>@InterfaceAudience.Private<a name="line.75"></a>
<span class="sourceLineNo">076</span>public abstract class BaseLoadBalancer implements LoadBalancer {<a name="line.76"></a>
<span class="sourceLineNo">077</span><a name="line.77"></a>
<span class="sourceLineNo">078</span>  public static final String BALANCER_DECISION_BUFFER_ENABLED =<a name="line.78"></a>
<span class="sourceLineNo">079</span>    "hbase.master.balancer.decision.buffer.enabled";<a name="line.79"></a>
<span class="sourceLineNo">080</span>  public static final boolean DEFAULT_BALANCER_DECISION_BUFFER_ENABLED = false;<a name="line.80"></a>
<span class="sourceLineNo">081</span><a name="line.81"></a>
<span class="sourceLineNo">082</span>  protected static final int MIN_SERVER_BALANCE = 2;<a name="line.82"></a>
<span class="sourceLineNo">083</span>  private volatile boolean stopped = false;<a name="line.83"></a>
<span class="sourceLineNo">084</span><a name="line.84"></a>
<span class="sourceLineNo">085</span>  private static final List&lt;RegionInfo&gt; EMPTY_REGION_LIST = Collections.emptyList();<a name="line.85"></a>
<span class="sourceLineNo">086</span><a name="line.86"></a>
<span class="sourceLineNo">087</span>  static final Predicate&lt;ServerMetrics&gt; IDLE_SERVER_PREDICATOR<a name="line.87"></a>
<span class="sourceLineNo">088</span>    = load -&gt; load.getRegionMetrics().isEmpty();<a name="line.88"></a>
<span class="sourceLineNo">089</span><a name="line.89"></a>
<span class="sourceLineNo">090</span>  protected RegionHDFSBlockLocationFinder regionFinder;<a name="line.90"></a>
<span class="sourceLineNo">091</span>  protected boolean useRegionFinder;<a name="line.91"></a>
<span class="sourceLineNo">092</span>  protected boolean isByTable = false;<a name="line.92"></a>
<span class="sourceLineNo">093</span><a name="line.93"></a>
<span class="sourceLineNo">094</span>  private static class DefaultRackManager extends RackManager {<a name="line.94"></a>
<span class="sourceLineNo">095</span>    @Override<a name="line.95"></a>
<span class="sourceLineNo">096</span>    public String getRack(ServerName server) {<a name="line.96"></a>
<span class="sourceLineNo">097</span>      return UNKNOWN_RACK;<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><a name="line.100"></a>
<span class="sourceLineNo">101</span>  /**<a name="line.101"></a>
<span class="sourceLineNo">102</span>   * The constructor that uses the basic MetricsBalancer<a name="line.102"></a>
<span class="sourceLineNo">103</span>   */<a name="line.103"></a>
<span class="sourceLineNo">104</span>  protected BaseLoadBalancer() {<a name="line.104"></a>
<span class="sourceLineNo">105</span>    metricsBalancer = new MetricsBalancer();<a name="line.105"></a>
<span class="sourceLineNo">106</span>    createRegionFinder();<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>  /**<a name="line.109"></a>
<span class="sourceLineNo">110</span>   * This Constructor accepts an instance of MetricsBalancer,<a name="line.110"></a>
<span class="sourceLineNo">111</span>   * which will be used instead of creating a new one<a name="line.111"></a>
<span class="sourceLineNo">112</span>   */<a name="line.112"></a>
<span class="sourceLineNo">113</span>  protected BaseLoadBalancer(MetricsBalancer metricsBalancer) {<a name="line.113"></a>
<span class="sourceLineNo">114</span>    this.metricsBalancer = (metricsBalancer != null) ? metricsBalancer : new MetricsBalancer();<a name="line.114"></a>
<span class="sourceLineNo">115</span>    createRegionFinder();<a name="line.115"></a>
<span class="sourceLineNo">116</span>  }<a name="line.116"></a>
<span class="sourceLineNo">117</span><a name="line.117"></a>
<span class="sourceLineNo">118</span>  private void createRegionFinder() {<a name="line.118"></a>
<span class="sourceLineNo">119</span>    useRegionFinder = config.getBoolean("hbase.master.balancer.uselocality", true);<a name="line.119"></a>
<span class="sourceLineNo">120</span>    if (useRegionFinder) {<a name="line.120"></a>
<span class="sourceLineNo">121</span>      regionFinder = new RegionHDFSBlockLocationFinder();<a name="line.121"></a>
<span class="sourceLineNo">122</span>    }<a name="line.122"></a>
<span class="sourceLineNo">123</span>  }<a name="line.123"></a>
<span class="sourceLineNo">124</span><a name="line.124"></a>
<span class="sourceLineNo">125</span>  /**<a name="line.125"></a>
<span class="sourceLineNo">126</span>   * An efficient array based implementation similar to ClusterState for keeping<a name="line.126"></a>
<span class="sourceLineNo">127</span>   * the status of the cluster in terms of region assignment and distribution.<a name="line.127"></a>
<span class="sourceLineNo">128</span>   * LoadBalancers, such as StochasticLoadBalancer uses this Cluster object because of<a name="line.128"></a>
<span class="sourceLineNo">129</span>   * hundreds of thousands of hashmap manipulations are very costly, which is why this<a name="line.129"></a>
<span class="sourceLineNo">130</span>   * class uses mostly indexes and arrays.<a name="line.130"></a>
<span class="sourceLineNo">131</span>   *<a name="line.131"></a>
<span class="sourceLineNo">132</span>   * Cluster tracks a list of unassigned regions, region assignments, and the server<a name="line.132"></a>
<span class="sourceLineNo">133</span>   * topology in terms of server names, hostnames and racks.<a name="line.133"></a>
<span class="sourceLineNo">134</span>   */<a name="line.134"></a>
<span class="sourceLineNo">135</span>  protected static class Cluster {<a name="line.135"></a>
<span class="sourceLineNo">136</span>    ServerName[] servers;<a name="line.136"></a>
<span class="sourceLineNo">137</span>    String[] hosts; // ServerName uniquely identifies a region server. multiple RS can run on the same host<a name="line.137"></a>
<span class="sourceLineNo">138</span>    String[] racks;<a name="line.138"></a>
<span class="sourceLineNo">139</span>    boolean multiServersPerHost = false; // whether or not any host has more than one server<a name="line.139"></a>
<span class="sourceLineNo">140</span><a name="line.140"></a>
<span class="sourceLineNo">141</span>    ArrayList&lt;String&gt; tables;<a name="line.141"></a>
<span class="sourceLineNo">142</span>    RegionInfo[] regions;<a name="line.142"></a>
<span class="sourceLineNo">143</span>    Deque&lt;BalancerRegionLoad&gt;[] regionLoads;<a name="line.143"></a>
<span class="sourceLineNo">144</span>    private RegionHDFSBlockLocationFinder regionFinder;<a name="line.144"></a>
<span class="sourceLineNo">145</span><a name="line.145"></a>
<span class="sourceLineNo">146</span>    int[][] regionLocations; //regionIndex -&gt; list of serverIndex sorted by locality<a name="line.146"></a>
<span class="sourceLineNo">147</span><a name="line.147"></a>
<span class="sourceLineNo">148</span>    int[]   serverIndexToHostIndex;      //serverIndex -&gt; host index<a name="line.148"></a>
<span class="sourceLineNo">149</span>    int[]   serverIndexToRackIndex;      //serverIndex -&gt; rack index<a name="line.149"></a>
<span class="sourceLineNo">150</span><a name="line.150"></a>
<span class="sourceLineNo">151</span>    int[][] regionsPerServer;            //serverIndex -&gt; region list<a name="line.151"></a>
<span class="sourceLineNo">152</span>    int[]   serverIndexToRegionsOffset;  //serverIndex -&gt; offset of region list<a name="line.152"></a>
<span class="sourceLineNo">153</span>    int[][] regionsPerHost;              //hostIndex -&gt; list of regions<a name="line.153"></a>
<span class="sourceLineNo">154</span>    int[][] regionsPerRack;              //rackIndex -&gt; region list<a name="line.154"></a>
<span class="sourceLineNo">155</span>    int[][] primariesOfRegionsPerServer; //serverIndex -&gt; sorted list of regions by primary region index<a name="line.155"></a>
<span class="sourceLineNo">156</span>    int[][] primariesOfRegionsPerHost;   //hostIndex -&gt; sorted list of regions by primary region index<a name="line.156"></a>
<span class="sourceLineNo">157</span>    int[][] primariesOfRegionsPerRack;   //rackIndex -&gt; sorted list of regions by primary region index<a name="line.157"></a>
<span class="sourceLineNo">158</span><a name="line.158"></a>
<span class="sourceLineNo">159</span>    int[][] serversPerHost;              //hostIndex -&gt; list of server indexes<a name="line.159"></a>
<span class="sourceLineNo">160</span>    int[][] serversPerRack;              //rackIndex -&gt; list of server indexes<a name="line.160"></a>
<span class="sourceLineNo">161</span>    int[]   regionIndexToServerIndex;    //regionIndex -&gt; serverIndex<a name="line.161"></a>
<span class="sourceLineNo">162</span>    int[]   initialRegionIndexToServerIndex;    //regionIndex -&gt; serverIndex (initial cluster state)<a name="line.162"></a>
<span class="sourceLineNo">163</span>    int[]   regionIndexToTableIndex;     //regionIndex -&gt; tableIndex<a name="line.163"></a>
<span class="sourceLineNo">164</span>    int[][] numRegionsPerServerPerTable; //serverIndex -&gt; tableIndex -&gt; # regions<a name="line.164"></a>
<span class="sourceLineNo">165</span>    int[]   numMaxRegionsPerTable;       //tableIndex -&gt; max number of regions in a single RS<a name="line.165"></a>
<span class="sourceLineNo">166</span>    int[]   regionIndexToPrimaryIndex;   //regionIndex -&gt; regionIndex of the primary<a name="line.166"></a>
<span class="sourceLineNo">167</span>    boolean hasRegionReplicas = false;   //whether there is regions with replicas<a name="line.167"></a>
<span class="sourceLineNo">168</span><a name="line.168"></a>
<span class="sourceLineNo">169</span>    Integer[] serverIndicesSortedByRegionCount;<a name="line.169"></a>
<span class="sourceLineNo">170</span>    Integer[] serverIndicesSortedByLocality;<a name="line.170"></a>
<span class="sourceLineNo">171</span><a name="line.171"></a>
<span class="sourceLineNo">172</span>    Map&lt;Address, Integer&gt; serversToIndex;<a name="line.172"></a>
<span class="sourceLineNo">173</span>    Map&lt;String, Integer&gt; hostsToIndex;<a name="line.173"></a>
<span class="sourceLineNo">174</span>    Map&lt;String, Integer&gt; racksToIndex;<a name="line.174"></a>
<span class="sourceLineNo">175</span>    Map&lt;String, Integer&gt; tablesToIndex;<a name="line.175"></a>
<span class="sourceLineNo">176</span>    Map&lt;RegionInfo, Integer&gt; regionsToIndex;<a name="line.176"></a>
<span class="sourceLineNo">177</span>    float[] localityPerServer;<a name="line.177"></a>
<span class="sourceLineNo">178</span><a name="line.178"></a>
<span class="sourceLineNo">179</span>    int numServers;<a name="line.179"></a>
<span class="sourceLineNo">180</span>    int numHosts;<a name="line.180"></a>
<span class="sourceLineNo">181</span>    int numRacks;<a name="line.181"></a>
<span class="sourceLineNo">182</span>    int numTables;<a name="line.182"></a>
<span class="sourceLineNo">183</span>    int numRegions;<a name="line.183"></a>
<span class="sourceLineNo">184</span><a name="line.184"></a>
<span class="sourceLineNo">185</span>    int numMovedRegions = 0; //num moved regions from the initial configuration<a name="line.185"></a>
<span class="sourceLineNo">186</span>    Map&lt;ServerName, List&lt;RegionInfo&gt;&gt; clusterState;<a name="line.186"></a>
<span class="sourceLineNo">187</span><a name="line.187"></a>
<span class="sourceLineNo">188</span>    protected final RackManager rackManager;<a name="line.188"></a>
<span class="sourceLineNo">189</span>    // Maps region -&gt; rackIndex -&gt; locality of region on rack<a name="line.189"></a>
<span class="sourceLineNo">190</span>    private float[][] rackLocalities;<a name="line.190"></a>
<span class="sourceLineNo">191</span>    // Maps localityType -&gt; region -&gt; [server|rack]Index with highest locality<a name="line.191"></a>
<span class="sourceLineNo">192</span>    private int[][] regionsToMostLocalEntities;<a name="line.192"></a>
<span class="sourceLineNo">193</span><a name="line.193"></a>
<span class="sourceLineNo">194</span>    protected Cluster(<a name="line.194"></a>
<span class="sourceLineNo">195</span>        Map&lt;ServerName, List&lt;RegionInfo&gt;&gt; clusterState,<a name="line.195"></a>
<span class="sourceLineNo">196</span>        Map&lt;String, Deque&lt;BalancerRegionLoad&gt;&gt; loads,<a name="line.196"></a>
<span class="sourceLineNo">197</span>        RegionHDFSBlockLocationFinder regionFinder,<a name="line.197"></a>
<span class="sourceLineNo">198</span>        RackManager rackManager) {<a name="line.198"></a>
<span class="sourceLineNo">199</span>      this(null, clusterState, loads, regionFinder, rackManager);<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>    @SuppressWarnings("unchecked")<a name="line.202"></a>
<span class="sourceLineNo">203</span>    protected Cluster(<a name="line.203"></a>
<span class="sourceLineNo">204</span>        Collection&lt;RegionInfo&gt; unassignedRegions,<a name="line.204"></a>
<span class="sourceLineNo">205</span>        Map&lt;ServerName, List&lt;RegionInfo&gt;&gt; clusterState,<a name="line.205"></a>
<span class="sourceLineNo">206</span>        Map&lt;String, Deque&lt;BalancerRegionLoad&gt;&gt; loads,<a name="line.206"></a>
<span class="sourceLineNo">207</span>        RegionHDFSBlockLocationFinder regionFinder,<a name="line.207"></a>
<span class="sourceLineNo">208</span>        RackManager rackManager) {<a name="line.208"></a>
<span class="sourceLineNo">209</span><a name="line.209"></a>
<span class="sourceLineNo">210</span>      if (unassignedRegions == null) {<a name="line.210"></a>
<span class="sourceLineNo">211</span>        unassignedRegions = EMPTY_REGION_LIST;<a name="line.211"></a>
<span class="sourceLineNo">212</span>      }<a name="line.212"></a>
<span class="sourceLineNo">213</span><a name="line.213"></a>
<span class="sourceLineNo">214</span>      serversToIndex = new HashMap&lt;&gt;();<a name="line.214"></a>
<span class="sourceLineNo">215</span>      hostsToIndex = new HashMap&lt;&gt;();<a name="line.215"></a>
<span class="sourceLineNo">216</span>      racksToIndex = new HashMap&lt;&gt;();<a name="line.216"></a>
<span class="sourceLineNo">217</span>      tablesToIndex = new HashMap&lt;&gt;();<a name="line.217"></a>
<span class="sourceLineNo">218</span><a name="line.218"></a>
<span class="sourceLineNo">219</span>      //TODO: We should get the list of tables from master<a name="line.219"></a>
<span class="sourceLineNo">220</span>      tables = new ArrayList&lt;&gt;();<a name="line.220"></a>
<span class="sourceLineNo">221</span>      this.rackManager = rackManager != null ? rackManager : new DefaultRackManager();<a name="line.221"></a>
<span class="sourceLineNo">222</span><a name="line.222"></a>
<span class="sourceLineNo">223</span>      numRegions = 0;<a name="line.223"></a>
<span class="sourceLineNo">224</span><a name="line.224"></a>
<span class="sourceLineNo">225</span>      List&lt;List&lt;Integer&gt;&gt; serversPerHostList = new ArrayList&lt;&gt;();<a name="line.225"></a>
<span class="sourceLineNo">226</span>      List&lt;List&lt;Integer&gt;&gt; serversPerRackList = new ArrayList&lt;&gt;();<a name="line.226"></a>
<span class="sourceLineNo">227</span>      this.clusterState = clusterState;<a name="line.227"></a>
<span class="sourceLineNo">228</span>      this.regionFinder = regionFinder;<a name="line.228"></a>
<span class="sourceLineNo">229</span><a name="line.229"></a>
<span class="sourceLineNo">230</span>      // Use servername and port as there can be dead servers in this list. We want everything with<a name="line.230"></a>
<span class="sourceLineNo">231</span>      // a matching hostname and port to have the same index.<a name="line.231"></a>
<span class="sourceLineNo">232</span>      for (ServerName sn : clusterState.keySet()) {<a name="line.232"></a>
<span class="sourceLineNo">233</span>        if (sn == null) {<a name="line.233"></a>
<span class="sourceLineNo">234</span>          LOG.warn("TODO: Enable TRACE on BaseLoadBalancer. Empty servername); " +<a name="line.234"></a>
<span class="sourceLineNo">235</span>              "skipping; unassigned regions?");<a name="line.235"></a>
<span class="sourceLineNo">236</span>          if (LOG.isTraceEnabled()) {<a name="line.236"></a>
<span class="sourceLineNo">237</span>            LOG.trace("EMPTY SERVERNAME " + clusterState.toString());<a name="line.237"></a>
<span class="sourceLineNo">238</span>          }<a name="line.238"></a>
<span class="sourceLineNo">239</span>          continue;<a name="line.239"></a>
<span class="sourceLineNo">240</span>        }<a name="line.240"></a>
<span class="sourceLineNo">241</span>        if (serversToIndex.get(sn.getAddress()) == null) {<a name="line.241"></a>
<span class="sourceLineNo">242</span>          serversToIndex.put(sn.getAddress(), numServers++);<a name="line.242"></a>
<span class="sourceLineNo">243</span>        }<a name="line.243"></a>
<span class="sourceLineNo">244</span>        if (!hostsToIndex.containsKey(sn.getHostname())) {<a name="line.244"></a>
<span class="sourceLineNo">245</span>          hostsToIndex.put(sn.getHostname(), numHosts++);<a name="line.245"></a>
<span class="sourceLineNo">246</span>          serversPerHostList.add(new ArrayList&lt;&gt;(1));<a name="line.246"></a>
<span class="sourceLineNo">247</span>        }<a name="line.247"></a>
<span class="sourceLineNo">248</span><a name="line.248"></a>
<span class="sourceLineNo">249</span>        int serverIndex = serversToIndex.get(sn.getAddress());<a name="line.249"></a>
<span class="sourceLineNo">250</span>        int hostIndex = hostsToIndex.get(sn.getHostname());<a name="line.250"></a>
<span class="sourceLineNo">251</span>        serversPerHostList.get(hostIndex).add(serverIndex);<a name="line.251"></a>
<span class="sourceLineNo">252</span><a name="line.252"></a>
<span class="sourceLineNo">253</span>        String rack = this.rackManager.getRack(sn);<a name="line.253"></a>
<span class="sourceLineNo">254</span>        if (!racksToIndex.containsKey(rack)) {<a name="line.254"></a>
<span class="sourceLineNo">255</span>          racksToIndex.put(rack, numRacks++);<a name="line.255"></a>
<span class="sourceLineNo">256</span>          serversPerRackList.add(new ArrayList&lt;&gt;());<a name="line.256"></a>
<span class="sourceLineNo">257</span>        }<a name="line.257"></a>
<span class="sourceLineNo">258</span>        int rackIndex = racksToIndex.get(rack);<a name="line.258"></a>
<span class="sourceLineNo">259</span>        serversPerRackList.get(rackIndex).add(serverIndex);<a name="line.259"></a>
<span class="sourceLineNo">260</span>      }<a name="line.260"></a>
<span class="sourceLineNo">261</span><a name="line.261"></a>
<span class="sourceLineNo">262</span>      // Count how many regions there are.<a name="line.262"></a>
<span class="sourceLineNo">263</span>      for (Entry&lt;ServerName, List&lt;RegionInfo&gt;&gt; entry : clusterState.entrySet()) {<a name="line.263"></a>
<span class="sourceLineNo">264</span>        numRegions += entry.getValue().size();<a name="line.264"></a>
<span class="sourceLineNo">265</span>      }<a name="line.265"></a>
<span class="sourceLineNo">266</span>      numRegions += unassignedRegions.size();<a name="line.266"></a>
<span class="sourceLineNo">267</span><a name="line.267"></a>
<span class="sourceLineNo">268</span>      regionsToIndex = new HashMap&lt;&gt;(numRegions);<a name="line.268"></a>
<span class="sourceLineNo">269</span>      servers = new ServerName[numServers];<a name="line.269"></a>
<span class="sourceLineNo">270</span>      serversPerHost = new int[numHosts][];<a name="line.270"></a>
<span class="sourceLineNo">271</span>      serversPerRack = new int[numRacks][];<a name="line.271"></a>
<span class="sourceLineNo">272</span>      regions = new RegionInfo[numRegions];<a name="line.272"></a>
<span class="sourceLineNo">273</span>      regionIndexToServerIndex = new int[numRegions];<a name="line.273"></a>
<span class="sourceLineNo">274</span>      initialRegionIndexToServerIndex = new int[numRegions];<a name="line.274"></a>
<span class="sourceLineNo">275</span>      regionIndexToTableIndex = new int[numRegions];<a name="line.275"></a>
<span class="sourceLineNo">276</span>      regionIndexToPrimaryIndex = new int[numRegions];<a name="line.276"></a>
<span class="sourceLineNo">277</span>      regionLoads = new Deque[numRegions];<a name="line.277"></a>
<span class="sourceLineNo">278</span><a name="line.278"></a>
<span class="sourceLineNo">279</span>      regionLocations = new int[numRegions][];<a name="line.279"></a>
<span class="sourceLineNo">280</span>      serverIndicesSortedByRegionCount = new Integer[numServers];<a name="line.280"></a>
<span class="sourceLineNo">281</span>      serverIndicesSortedByLocality = new Integer[numServers];<a name="line.281"></a>
<span class="sourceLineNo">282</span>      localityPerServer = new float[numServers];<a name="line.282"></a>
<span class="sourceLineNo">283</span><a name="line.283"></a>
<span class="sourceLineNo">284</span>      serverIndexToHostIndex = new int[numServers];<a name="line.284"></a>
<span class="sourceLineNo">285</span>      serverIndexToRackIndex = new int[numServers];<a name="line.285"></a>
<span class="sourceLineNo">286</span>      regionsPerServer = new int[numServers][];<a name="line.286"></a>
<span class="sourceLineNo">287</span>      serverIndexToRegionsOffset = new int[numServers];<a name="line.287"></a>
<span class="sourceLineNo">288</span>      regionsPerHost = new int[numHosts][];<a name="line.288"></a>
<span class="sourceLineNo">289</span>      regionsPerRack = new int[numRacks][];<a name="line.289"></a>
<span class="sourceLineNo">290</span>      primariesOfRegionsPerServer = new int[numServers][];<a name="line.290"></a>
<span class="sourceLineNo">291</span>      primariesOfRegionsPerHost = new int[numHosts][];<a name="line.291"></a>
<span class="sourceLineNo">292</span>      primariesOfRegionsPerRack = new int[numRacks][];<a name="line.292"></a>
<span class="sourceLineNo">293</span><a name="line.293"></a>
<span class="sourceLineNo">294</span>      int tableIndex = 0, regionIndex = 0, regionPerServerIndex = 0;<a name="line.294"></a>
<span class="sourceLineNo">295</span><a name="line.295"></a>
<span class="sourceLineNo">296</span>      for (Entry&lt;ServerName, List&lt;RegionInfo&gt;&gt; entry : clusterState.entrySet()) {<a name="line.296"></a>
<span class="sourceLineNo">297</span>        if (entry.getKey() == null) {<a name="line.297"></a>
<span class="sourceLineNo">298</span>          LOG.warn("SERVERNAME IS NULL, skipping " + entry.getValue());<a name="line.298"></a>
<span class="sourceLineNo">299</span>          continue;<a name="line.299"></a>
<span class="sourceLineNo">300</span>        }<a name="line.300"></a>
<span class="sourceLineNo">301</span>        int serverIndex = serversToIndex.get(entry.getKey().getAddress());<a name="line.301"></a>
<span class="sourceLineNo">302</span><a name="line.302"></a>
<span class="sourceLineNo">303</span>        // keep the servername if this is the first server name for this hostname<a name="line.303"></a>
<span class="sourceLineNo">304</span>        // or this servername has the newest startcode.<a name="line.304"></a>
<span class="sourceLineNo">305</span>        if (servers[serverIndex] == null ||<a name="line.305"></a>
<span class="sourceLineNo">306</span>            servers[serverIndex].getStartcode() &lt; entry.getKey().getStartcode()) {<a name="line.306"></a>
<span class="sourceLineNo">307</span>          servers[serverIndex] = entry.getKey();<a name="line.307"></a>
<span class="sourceLineNo">308</span>        }<a name="line.308"></a>
<span class="sourceLineNo">309</span><a name="line.309"></a>
<span class="sourceLineNo">310</span>        if (regionsPerServer[serverIndex] != null) {<a name="line.310"></a>
<span class="sourceLineNo">311</span>          // there is another server with the same hostAndPort in ClusterState.<a name="line.311"></a>
<span class="sourceLineNo">312</span>          // allocate the array for the total size<a name="line.312"></a>
<span class="sourceLineNo">313</span>          regionsPerServer[serverIndex] = new int[entry.getValue().size() + regionsPerServer[serverIndex].length];<a name="line.313"></a>
<span class="sourceLineNo">314</span>        } else {<a name="line.314"></a>
<span class="sourceLineNo">315</span>          regionsPerServer[serverIndex] = new int[entry.getValue().size()];<a name="line.315"></a>
<span class="sourceLineNo">316</span>        }<a name="line.316"></a>
<span class="sourceLineNo">317</span>        primariesOfRegionsPerServer[serverIndex] = new int[regionsPerServer[serverIndex].length];<a name="line.317"></a>
<span class="sourceLineNo">318</span>        serverIndicesSortedByRegionCount[serverIndex] = serverIndex;<a name="line.318"></a>
<span class="sourceLineNo">319</span>        serverIndicesSortedByLocality[serverIndex] = serverIndex;<a name="line.319"></a>
<span class="sourceLineNo">320</span>      }<a name="line.320"></a>
<span class="sourceLineNo">321</span><a name="line.321"></a>
<span class="sourceLineNo">322</span>      hosts = new String[numHosts];<a name="line.322"></a>
<span class="sourceLineNo">323</span>      for (Entry&lt;String, Integer&gt; entry : hostsToIndex.entrySet()) {<a name="line.323"></a>
<span class="sourceLineNo">324</span>        hosts[entry.getValue()] = entry.getKey();<a name="line.324"></a>
<span class="sourceLineNo">325</span>      }<a name="line.325"></a>
<span class="sourceLineNo">326</span>      racks = new String[numRacks];<a name="line.326"></a>
<span class="sourceLineNo">327</span>      for (Entry&lt;String, Integer&gt; entry : racksToIndex.entrySet()) {<a name="line.327"></a>
<span class="sourceLineNo">328</span>        racks[entry.getValue()] = entry.getKey();<a name="line.328"></a>
<span class="sourceLineNo">329</span>      }<a name="line.329"></a>
<span class="sourceLineNo">330</span><a name="line.330"></a>
<span class="sourceLineNo">331</span>      for (Entry&lt;ServerName, List&lt;RegionInfo&gt;&gt; entry : clusterState.entrySet()) {<a name="line.331"></a>
<span class="sourceLineNo">332</span>        int serverIndex = serversToIndex.get(entry.getKey().getAddress());<a name="line.332"></a>
<span class="sourceLineNo">333</span>        regionPerServerIndex = serverIndexToRegionsOffset[serverIndex];<a name="line.333"></a>
<span class="sourceLineNo">334</span><a name="line.334"></a>
<span class="sourceLineNo">335</span>        int hostIndex = hostsToIndex.get(entry.getKey().getHostname());<a name="line.335"></a>
<span class="sourceLineNo">336</span>        serverIndexToHostIndex[serverIndex] = hostIndex;<a name="line.336"></a>
<span class="sourceLineNo">337</span><a name="line.337"></a>
<span class="sourceLineNo">338</span>        int rackIndex = racksToIndex.get(this.rackManager.getRack(entry.getKey()));<a name="line.338"></a>
<span class="sourceLineNo">339</span>        serverIndexToRackIndex[serverIndex] = rackIndex;<a name="line.339"></a>
<span class="sourceLineNo">340</span><a name="line.340"></a>
<span class="sourceLineNo">341</span>        for (RegionInfo region : entry.getValue()) {<a name="line.341"></a>
<span class="sourceLineNo">342</span>          registerRegion(region, regionIndex, serverIndex, loads, regionFinder);<a name="line.342"></a>
<span class="sourceLineNo">343</span>          regionsPerServer[serverIndex][regionPerServerIndex++] = regionIndex;<a name="line.343"></a>
<span class="sourceLineNo">344</span>          regionIndex++;<a name="line.344"></a>
<span class="sourceLineNo">345</span>        }<a name="line.345"></a>
<span class="sourceLineNo">346</span>        serverIndexToRegionsOffset[serverIndex] = regionPerServerIndex;<a name="line.346"></a>
<span class="sourceLineNo">347</span>      }<a name="line.347"></a>
<span class="sourceLineNo">348</span><a name="line.348"></a>
<span class="sourceLineNo">349</span>      for (RegionInfo region : unassignedRegions) {<a name="line.349"></a>
<span class="sourceLineNo">350</span>        registerRegion(region, regionIndex, -1, loads, regionFinder);<a name="line.350"></a>
<span class="sourceLineNo">351</span>        regionIndex++;<a name="line.351"></a>
<span class="sourceLineNo">352</span>      }<a name="line.352"></a>
<span class="sourceLineNo">353</span><a name="line.353"></a>
<span class="sourceLineNo">354</span>      for (int i = 0; i &lt; serversPerHostList.size(); i++) {<a name="line.354"></a>
<span class="sourceLineNo">355</span>        serversPerHost[i] = new int[serversPerHostList.get(i).size()];<a name="line.355"></a>
<span class="sourceLineNo">356</span>        for (int j = 0; j &lt; serversPerHost[i].length; j++) {<a name="line.356"></a>
<span class="sourceLineNo">357</span>          serversPerHost[i][j] = serversPerHostList.get(i).get(j);<a name="line.357"></a>
<span class="sourceLineNo">358</span>        }<a name="line.358"></a>
<span class="sourceLineNo">359</span>        if (serversPerHost[i].length &gt; 1) {<a name="line.359"></a>
<span class="sourceLineNo">360</span>          multiServersPerHost = true;<a name="line.360"></a>
<span class="sourceLineNo">361</span>        }<a name="line.361"></a>
<span class="sourceLineNo">362</span>      }<a name="line.362"></a>
<span class="sourceLineNo">363</span><a name="line.363"></a>
<span class="sourceLineNo">364</span>      for (int i = 0; i &lt; serversPerRackList.size(); i++) {<a name="line.364"></a>
<span class="sourceLineNo">365</span>        serversPerRack[i] = new int[serversPerRackList.get(i).size()];<a name="line.365"></a>
<span class="sourceLineNo">366</span>        for (int j = 0; j &lt; serversPerRack[i].length; j++) {<a name="line.366"></a>
<span class="sourceLineNo">367</span>          serversPerRack[i][j] = serversPerRackList.get(i).get(j);<a name="line.367"></a>
<span class="sourceLineNo">368</span>        }<a name="line.368"></a>
<span class="sourceLineNo">369</span>      }<a name="line.369"></a>
<span class="sourceLineNo">370</span><a name="line.370"></a>
<span class="sourceLineNo">371</span>      numTables = tables.size();<a name="line.371"></a>
<span class="sourceLineNo">372</span>      numRegionsPerServerPerTable = new int[numServers][numTables];<a name="line.372"></a>
<span class="sourceLineNo">373</span><a name="line.373"></a>
<span class="sourceLineNo">374</span>      for (int i = 0; i &lt; numServers; i++) {<a name="line.374"></a>
<span class="sourceLineNo">375</span>        for (int j = 0; j &lt; numTables; j++) {<a name="line.375"></a>
<span class="sourceLineNo">376</span>          numRegionsPerServerPerTable[i][j] = 0;<a name="line.376"></a>
<span class="sourceLineNo">377</span>        }<a name="line.377"></a>
<span class="sourceLineNo">378</span>      }<a name="line.378"></a>
<span class="sourceLineNo">379</span><a name="line.379"></a>
<span class="sourceLineNo">380</span>      for (int i=0; i &lt; regionIndexToServerIndex.length; i++) {<a name="line.380"></a>
<span class="sourceLineNo">381</span>        if (regionIndexToServerIndex[i] &gt;= 0) {<a name="line.381"></a>
<span class="sourceLineNo">382</span>          numRegionsPerServerPerTable[regionIndexToServerIndex[i]][regionIndexToTableIndex[i]]++;<a name="line.382"></a>
<span class="sourceLineNo">383</span>        }<a name="line.383"></a>
<span class="sourceLineNo">384</span>      }<a name="line.384"></a>
<span class="sourceLineNo">385</span><a name="line.385"></a>
<span class="sourceLineNo">386</span>      numMaxRegionsPerTable = new int[numTables];<a name="line.386"></a>
<span class="sourceLineNo">387</span>      for (int[] aNumRegionsPerServerPerTable : numRegionsPerServerPerTable) {<a name="line.387"></a>
<span class="sourceLineNo">388</span>        for (tableIndex = 0; tableIndex &lt; aNumRegionsPerServerPerTable.length; tableIndex++) {<a name="line.388"></a>
<span class="sourceLineNo">389</span>          if (aNumRegionsPerServerPerTable[tableIndex] &gt; numMaxRegionsPerTable[tableIndex]) {<a name="line.389"></a>
<span class="sourceLineNo">390</span>            numMaxRegionsPerTable[tableIndex] = aNumRegionsPerServerPerTable[tableIndex];<a name="line.390"></a>
<span class="sourceLineNo">391</span>          }<a name="line.391"></a>
<span class="sourceLineNo">392</span>        }<a name="line.392"></a>
<span class="sourceLineNo">393</span>      }<a name="line.393"></a>
<span class="sourceLineNo">394</span><a name="line.394"></a>
<span class="sourceLineNo">395</span>      for (int i = 0; i &lt; regions.length; i ++) {<a name="line.395"></a>
<span class="sourceLineNo">396</span>        RegionInfo info = regions[i];<a name="line.396"></a>
<span class="sourceLineNo">397</span>        if (RegionReplicaUtil.isDefaultReplica(info)) {<a name="line.397"></a>
<span class="sourceLineNo">398</span>          regionIndexToPrimaryIndex[i] = i;<a name="line.398"></a>
<span class="sourceLineNo">399</span>        } else {<a name="line.399"></a>
<span class="sourceLineNo">400</span>          hasRegionReplicas = true;<a name="line.400"></a>
<span class="sourceLineNo">401</span>          RegionInfo primaryInfo = RegionReplicaUtil.getRegionInfoForDefaultReplica(info);<a name="line.401"></a>
<span class="sourceLineNo">402</span>          regionIndexToPrimaryIndex[i] = regionsToIndex.getOrDefault(primaryInfo, -1);<a name="line.402"></a>
<span class="sourceLineNo">403</span>        }<a name="line.403"></a>
<span class="sourceLineNo">404</span>      }<a name="line.404"></a>
<span class="sourceLineNo">405</span><a name="line.405"></a>
<span class="sourceLineNo">406</span>      for (int i = 0; i &lt; regionsPerServer.length; i++) {<a name="line.406"></a>
<span class="sourceLineNo">407</span>        primariesOfRegionsPerServer[i] = new int[regionsPerServer[i].length];<a name="line.407"></a>
<span class="sourceLineNo">408</span>        for (int j = 0; j &lt; regionsPerServer[i].length; j++) {<a name="line.408"></a>
<span class="sourceLineNo">409</span>          int primaryIndex = regionIndexToPrimaryIndex[regionsPerServer[i][j]];<a name="line.409"></a>
<span class="sourceLineNo">410</span>          primariesOfRegionsPerServer[i][j] = primaryIndex;<a name="line.410"></a>
<span class="sourceLineNo">411</span>        }<a name="line.411"></a>
<span class="sourceLineNo">412</span>        // sort the regions by primaries.<a name="line.412"></a>
<span class="sourceLineNo">413</span>        Arrays.sort(primariesOfRegionsPerServer[i]);<a name="line.413"></a>
<span class="sourceLineNo">414</span>      }<a name="line.414"></a>
<span class="sourceLineNo">415</span><a name="line.415"></a>
<span class="sourceLineNo">416</span>      // compute regionsPerHost<a name="line.416"></a>
<span class="sourceLineNo">417</span>      if (multiServersPerHost) {<a name="line.417"></a>
<span class="sourceLineNo">418</span>        for (int i = 0 ; i &lt; serversPerHost.length; i++) {<a name="line.418"></a>
<span class="sourceLineNo">419</span>          int numRegionsPerHost = 0;<a name="line.419"></a>
<span class="sourceLineNo">420</span>          for (int j = 0; j &lt; serversPerHost[i].length; j++) {<a name="line.420"></a>
<span class="sourceLineNo">421</span>            numRegionsPerHost += regionsPerServer[serversPerHost[i][j]].length;<a name="line.421"></a>
<span class="sourceLineNo">422</span>          }<a name="line.422"></a>
<span class="sourceLineNo">423</span>          regionsPerHost[i] = new int[numRegionsPerHost];<a name="line.423"></a>
<span class="sourceLineNo">424</span>          primariesOfRegionsPerHost[i] = new int[numRegionsPerHost];<a name="line.424"></a>
<span class="sourceLineNo">425</span>        }<a name="line.425"></a>
<span class="sourceLineNo">426</span>        for (int i = 0 ; i &lt; serversPerHost.length; i++) {<a name="line.426"></a>
<span class="sourceLineNo">427</span>          int numRegionPerHostIndex = 0;<a name="line.427"></a>
<span class="sourceLineNo">428</span>          for (int j = 0; j &lt; serversPerHost[i].length; j++) {<a name="line.428"></a>
<span class="sourceLineNo">429</span>            for (int k = 0; k &lt; regionsPerServer[serversPerHost[i][j]].length; k++) {<a name="line.429"></a>
<span class="sourceLineNo">430</span>              int region = regionsPerServer[serversPerHost[i][j]][k];<a name="line.430"></a>
<span class="sourceLineNo">431</span>              regionsPerHost[i][numRegionPerHostIndex] = region;<a name="line.431"></a>
<span class="sourceLineNo">432</span>              int primaryIndex = regionIndexToPrimaryIndex[region];<a name="line.432"></a>
<span class="sourceLineNo">433</span>              primariesOfRegionsPerHost[i][numRegionPerHostIndex] = primaryIndex;<a name="line.433"></a>
<span class="sourceLineNo">434</span>              numRegionPerHostIndex++;<a name="line.434"></a>
<span class="sourceLineNo">435</span>            }<a name="line.435"></a>
<span class="sourceLineNo">436</span>          }<a name="line.436"></a>
<span class="sourceLineNo">437</span>          // sort the regions by primaries.<a name="line.437"></a>
<span class="sourceLineNo">438</span>          Arrays.sort(primariesOfRegionsPerHost[i]);<a name="line.438"></a>
<span class="sourceLineNo">439</span>        }<a name="line.439"></a>
<span class="sourceLineNo">440</span>      }<a name="line.440"></a>
<span class="sourceLineNo">441</span><a name="line.441"></a>
<span class="sourceLineNo">442</span>      // compute regionsPerRack<a name="line.442"></a>
<span class="sourceLineNo">443</span>      if (numRacks &gt; 1) {<a name="line.443"></a>
<span class="sourceLineNo">444</span>        for (int i = 0 ; i &lt; serversPerRack.length; i++) {<a name="line.444"></a>
<span class="sourceLineNo">445</span>          int numRegionsPerRack = 0;<a name="line.445"></a>
<span class="sourceLineNo">446</span>          for (int j = 0; j &lt; serversPerRack[i].length; j++) {<a name="line.446"></a>
<span class="sourceLineNo">447</span>            numRegionsPerRack += regionsPerServer[serversPerRack[i][j]].length;<a name="line.447"></a>
<span class="sourceLineNo">448</span>          }<a name="line.448"></a>
<span class="sourceLineNo">449</span>          regionsPerRack[i] = new int[numRegionsPerRack];<a name="line.449"></a>
<span class="sourceLineNo">450</span>          primariesOfRegionsPerRack[i] = new int[numRegionsPerRack];<a name="line.450"></a>
<span class="sourceLineNo">451</span>        }<a name="line.451"></a>
<span class="sourceLineNo">452</span><a name="line.452"></a>
<span class="sourceLineNo">453</span>        for (int i = 0 ; i &lt; serversPerRack.length; i++) {<a name="line.453"></a>
<span class="sourceLineNo">454</span>          int numRegionPerRackIndex = 0;<a name="line.454"></a>
<span class="sourceLineNo">455</span>          for (int j = 0; j &lt; serversPerRack[i].length; j++) {<a name="line.455"></a>
<span class="sourceLineNo">456</span>            for (int k = 0; k &lt; regionsPerServer[serversPerRack[i][j]].length; k++) {<a name="line.456"></a>
<span class="sourceLineNo">457</span>              int region = regionsPerServer[serversPerRack[i][j]][k];<a name="line.457"></a>
<span class="sourceLineNo">458</span>              regionsPerRack[i][numRegionPerRackIndex] = region;<a name="line.458"></a>
<span class="sourceLineNo">459</span>              int primaryIndex = regionIndexToPrimaryIndex[region];<a name="line.459"></a>
<span class="sourceLineNo">460</span>              primariesOfRegionsPerRack[i][numRegionPerRackIndex] = primaryIndex;<a name="line.460"></a>
<span class="sourceLineNo">461</span>              numRegionPerRackIndex++;<a name="line.461"></a>
<span class="sourceLineNo">462</span>            }<a name="line.462"></a>
<span class="sourceLineNo">463</span>          }<a name="line.463"></a>
<span class="sourceLineNo">464</span>          // sort the regions by primaries.<a name="line.464"></a>
<span class="sourceLineNo">465</span>          Arrays.sort(primariesOfRegionsPerRack[i]);<a name="line.465"></a>
<span class="sourceLineNo">466</span>        }<a name="line.466"></a>
<span class="sourceLineNo">467</span>      }<a name="line.467"></a>
<span class="sourceLineNo">468</span>    }<a name="line.468"></a>
<span class="sourceLineNo">469</span><a name="line.469"></a>
<span class="sourceLineNo">470</span>    /** Helper for Cluster constructor to handle a region */<a name="line.470"></a>
<span class="sourceLineNo">471</span>    private void registerRegion(RegionInfo region, int regionIndex,<a name="line.471"></a>
<span class="sourceLineNo">472</span>        int serverIndex, Map&lt;String, Deque&lt;BalancerRegionLoad&gt;&gt; loads,<a name="line.472"></a>
<span class="sourceLineNo">473</span>        RegionHDFSBlockLocationFinder regionFinder) {<a name="line.473"></a>
<span class="sourceLineNo">474</span>      String tableName = region.getTable().getNameAsString();<a name="line.474"></a>
<span class="sourceLineNo">475</span>      if (!tablesToIndex.containsKey(tableName)) {<a name="line.475"></a>
<span class="sourceLineNo">476</span>        tables.add(tableName);<a name="line.476"></a>
<span class="sourceLineNo">477</span>        tablesToIndex.put(tableName, tablesToIndex.size());<a name="line.477"></a>
<span class="sourceLineNo">478</span>      }<a name="line.478"></a>
<span class="sourceLineNo">479</span>      int tableIndex = tablesToIndex.get(tableName);<a name="line.479"></a>
<span class="sourceLineNo">480</span><a name="line.480"></a>
<span class="sourceLineNo">481</span>      regionsToIndex.put(region, regionIndex);<a name="line.481"></a>
<span class="sourceLineNo">482</span>      regions[regionIndex] = region;<a name="line.482"></a>
<span class="sourceLineNo">483</span>      regionIndexToServerIndex[regionIndex] = serverIndex;<a name="line.483"></a>
<span class="sourceLineNo">484</span>      initialRegionIndexToServerIndex[regionIndex] = serverIndex;<a name="line.484"></a>
<span class="sourceLineNo">485</span>      regionIndexToTableIndex[regionIndex] = tableIndex;<a name="line.485"></a>
<span class="sourceLineNo">486</span><a name="line.486"></a>
<span class="sourceLineNo">487</span>      // region load<a name="line.487"></a>
<span class="sourceLineNo">488</span>      if (loads != null) {<a name="line.488"></a>
<span class="sourceLineNo">489</span>        Deque&lt;BalancerRegionLoad&gt; rl = loads.get(region.getRegionNameAsString());<a name="line.489"></a>
<span class="sourceLineNo">490</span>        // That could have failed if the RegionLoad is using the other regionName<a name="line.490"></a>
<span class="sourceLineNo">491</span>        if (rl == null) {<a name="line.491"></a>
<span class="sourceLineNo">492</span>          // Try getting the region load using encoded name.<a name="line.492"></a>
<span class="sourceLineNo">493</span>          rl = loads.get(region.getEncodedName());<a name="line.493"></a>
<span class="sourceLineNo">494</span>        }<a name="line.494"></a>
<span class="sourceLineNo">495</span>        regionLoads[regionIndex] = rl;<a name="line.495"></a>
<span class="sourceLineNo">496</span>      }<a name="line.496"></a>
<span class="sourceLineNo">497</span><a name="line.497"></a>
<span class="sourceLineNo">498</span>      if (regionFinder != null) {<a name="line.498"></a>
<span class="sourceLineNo">499</span>        // region location<a name="line.499"></a>
<span class="sourceLineNo">500</span>        List&lt;ServerName&gt; loc = regionFinder.getTopBlockLocations(region);<a name="line.500"></a>
<span class="sourceLineNo">501</span>        regionLocations[regionIndex] = new int[loc.size()];<a name="line.501"></a>
<span class="sourceLineNo">502</span>        for (int i = 0; i &lt; loc.size(); i++) {<a name="line.502"></a>
<span class="sourceLineNo">503</span>          regionLocations[regionIndex][i] = loc.get(i) == null ? -1<a name="line.503"></a>
<span class="sourceLineNo">504</span>              : (serversToIndex.get(loc.get(i).getAddress()) == null ? -1<a name="line.504"></a>
<span class="sourceLineNo">505</span>                  : serversToIndex.get(loc.get(i).getAddress()));<a name="line.505"></a>
<span class="sourceLineNo">506</span>        }<a name="line.506"></a>
<span class="sourceLineNo">507</span>      }<a name="line.507"></a>
<span class="sourceLineNo">508</span>    }<a name="line.508"></a>
<span class="sourceLineNo">509</span><a name="line.509"></a>
<span class="sourceLineNo">510</span>    /**<a name="line.510"></a>
<span class="sourceLineNo">511</span>     * Returns true iff a given server has less regions than the balanced amount<a name="line.511"></a>
<span class="sourceLineNo">512</span>     */<a name="line.512"></a>
<span class="sourceLineNo">513</span>    public boolean serverHasTooFewRegions(int server) {<a name="line.513"></a>
<span class="sourceLineNo">514</span>      int minLoad = this.numRegions / numServers;<a name="line.514"></a>
<span class="sourceLineNo">515</span>      int numRegions = getNumRegions(server);<a name="line.515"></a>
<span class="sourceLineNo">516</span>      return numRegions &lt; minLoad;<a name="line.516"></a>
<span class="sourceLineNo">517</span>    }<a name="line.517"></a>
<span class="sourceLineNo">518</span><a name="line.518"></a>
<span class="sourceLineNo">519</span>    /**<a name="line.519"></a>
<span class="sourceLineNo">520</span>     * Retrieves and lazily initializes a field storing the locality of<a name="line.520"></a>
<span class="sourceLineNo">521</span>     * every region/server combination<a name="line.521"></a>
<span class="sourceLineNo">522</span>     */<a name="line.522"></a>
<span class="sourceLineNo">523</span>    public float[][] getOrComputeRackLocalities() {<a name="line.523"></a>
<span class="sourceLineNo">524</span>      if (rackLocalities == null || regionsToMostLocalEntities == null) {<a name="line.524"></a>
<span class="sourceLineNo">525</span>        computeCachedLocalities();<a name="line.525"></a>
<span class="sourceLineNo">526</span>      }<a name="line.526"></a>
<span class="sourceLineNo">527</span>      return rackLocalities;<a name="line.527"></a>
<span class="sourceLineNo">528</span>    }<a name="line.528"></a>
<span class="sourceLineNo">529</span><a name="line.529"></a>
<span class="sourceLineNo">530</span>    /**<a name="line.530"></a>
<span class="sourceLineNo">531</span>     * Lazily initializes and retrieves a mapping of region -&gt; server for which region has<a name="line.531"></a>
<span class="sourceLineNo">532</span>     * the highest the locality<a name="line.532"></a>
<span class="sourceLineNo">533</span>     */<a name="line.533"></a>
<span class="sourceLineNo">534</span>    public int[] getOrComputeRegionsToMostLocalEntities(LocalityType type) {<a name="line.534"></a>
<span class="sourceLineNo">535</span>      if (rackLocalities == null || regionsToMostLocalEntities == null) {<a name="line.535"></a>
<span class="sourceLineNo">536</span>        computeCachedLocalities();<a name="line.536"></a>
<span class="sourceLineNo">537</span>      }<a name="line.537"></a>
<span class="sourceLineNo">538</span>      return regionsToMostLocalEntities[type.ordinal()];<a name="line.538"></a>
<span class="sourceLineNo">539</span>    }<a name="line.539"></a>
<span class="sourceLineNo">540</span><a name="line.540"></a>
<span class="sourceLineNo">541</span>    /**<a name="line.541"></a>
<span class="sourceLineNo">542</span>     * Looks up locality from cache of localities. Will create cache if it does<a name="line.542"></a>
<span class="sourceLineNo">543</span>     * not already exist.<a name="line.543"></a>
<span class="sourceLineNo">544</span>     */<a name="line.544"></a>
<span class="sourceLineNo">545</span>    public float getOrComputeLocality(int region, int entity, LocalityType type) {<a name="line.545"></a>
<span class="sourceLineNo">546</span>      switch (type) {<a name="line.546"></a>
<span class="sourceLineNo">547</span>        case SERVER:<a name="line.547"></a>
<span class="sourceLineNo">548</span>          return getLocalityOfRegion(region, entity);<a name="line.548"></a>
<span class="sourceLineNo">549</span>        case RACK:<a name="line.549"></a>
<span class="sourceLineNo">550</span>          return getOrComputeRackLocalities()[region][entity];<a name="line.550"></a>
<span class="sourceLineNo">551</span>        default:<a name="line.551"></a>
<span class="sourceLineNo">552</span>          throw new IllegalArgumentException("Unsupported LocalityType: " + type);<a name="line.552"></a>
<span class="sourceLineNo">553</span>      }<a name="line.553"></a>
<span class="sourceLineNo">554</span>    }<a name="line.554"></a>
<span class="sourceLineNo">555</span><a name="line.555"></a>
<span class="sourceLineNo">556</span>    /**<a name="line.556"></a>
<span class="sourceLineNo">557</span>     * Returns locality weighted by region size in MB. Will create locality cache<a name="line.557"></a>
<span class="sourceLineNo">558</span>     * if it does not already exist.<a name="line.558"></a>
<span class="sourceLineNo">559</span>     */<a name="line.559"></a>
<span class="sourceLineNo">560</span>    public double getOrComputeWeightedLocality(int region, int server, LocalityType type) {<a name="line.560"></a>
<span class="sourceLineNo">561</span>      return getRegionSizeMB(region) * getOrComputeLocality(region, server, type);<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>     * Returns the size in MB from the most recent RegionLoad for region<a name="line.565"></a>
<span class="sourceLineNo">566</span>     */<a name="line.566"></a>
<span class="sourceLineNo">567</span>    public int getRegionSizeMB(int region) {<a name="line.567"></a>
<span class="sourceLineNo">568</span>      Deque&lt;BalancerRegionLoad&gt; load = regionLoads[region];<a name="line.568"></a>
<span class="sourceLineNo">569</span>      // This means regions have no actual data on disk<a name="line.569"></a>
<span class="sourceLineNo">570</span>      if (load == null) {<a name="line.570"></a>
<span class="sourceLineNo">571</span>        return 0;<a name="line.571"></a>
<span class="sourceLineNo">572</span>      }<a name="line.572"></a>
<span class="sourceLineNo">573</span>      return regionLoads[region].getLast().getStorefileSizeMB();<a name="line.573"></a>
<span class="sourceLineNo">574</span>    }<a name="line.574"></a>
<span class="sourceLineNo">575</span><a name="line.575"></a>
<span class="sourceLineNo">576</span>    /**<a name="line.576"></a>
<span class="sourceLineNo">577</span>     * Computes and caches the locality for each region/rack combinations,<a name="line.577"></a>
<span class="sourceLineNo">578</span>     * as well as storing a mapping of region -&gt; server and region -&gt; rack such that server<a name="line.578"></a>
<span class="sourceLineNo">579</span>     * and rack have the highest locality for region<a name="line.579"></a>
<span class="sourceLineNo">580</span>     */<a name="line.580"></a>
<span class="sourceLineNo">581</span>    private void computeCachedLocalities() {<a name="line.581"></a>
<span class="sourceLineNo">582</span>      rackLocalities = new float[numRegions][numRacks];<a name="line.582"></a>
<span class="sourceLineNo">583</span>      regionsToMostLocalEntities = new int[LocalityType.values().length][numRegions];<a name="line.583"></a>
<span class="sourceLineNo">584</span><a name="line.584"></a>
<span class="sourceLineNo">585</span>      // Compute localities and find most local server per region<a name="line.585"></a>
<span class="sourceLineNo">586</span>      for (int region = 0; region &lt; numRegions; region++) {<a name="line.586"></a>
<span class="sourceLineNo">587</span>        int serverWithBestLocality = 0;<a name="line.587"></a>
<span class="sourceLineNo">588</span>        float bestLocalityForRegion = 0;<a name="line.588"></a>
<span class="sourceLineNo">589</span>        for (int server = 0; server &lt; numServers; server++) {<a name="line.589"></a>
<span class="sourceLineNo">590</span>          // Aggregate per-rack locality<a name="line.590"></a>
<span class="sourceLineNo">591</span>          float locality = getLocalityOfRegion(region, server);<a name="line.591"></a>
<span class="sourceLineNo">592</span>          int rack = serverIndexToRackIndex[server];<a name="line.592"></a>
<span class="sourceLineNo">593</span>          int numServersInRack = serversPerRack[rack].length;<a name="line.593"></a>
<span class="sourceLineNo">594</span>          rackLocalities[region][rack] += locality / numServersInRack;<a name="line.594"></a>
<span class="sourceLineNo">595</span><a name="line.595"></a>
<span class="sourceLineNo">596</span>          if (locality &gt; bestLocalityForRegion) {<a name="line.596"></a>
<span class="sourceLineNo">597</span>            serverWithBestLocality = server;<a name="line.597"></a>
<span class="sourceLineNo">598</span>            bestLocalityForRegion = locality;<a name="line.598"></a>
<span class="sourceLineNo">599</span>          }<a name="line.599"></a>
<span class="sourceLineNo">600</span>        }<a name="line.600"></a>
<span class="sourceLineNo">601</span>        regionsToMostLocalEntities[LocalityType.SERVER.ordinal()][region] = serverWithBestLocality;<a name="line.601"></a>
<span class="sourceLineNo">602</span><a name="line.602"></a>
<span class="sourceLineNo">603</span>        // Find most local rack per region<a name="line.603"></a>
<span class="sourceLineNo">604</span>        int rackWithBestLocality = 0;<a name="line.604"></a>
<span class="sourceLineNo">605</span>        float bestRackLocalityForRegion = 0.0f;<a name="line.605"></a>
<span class="sourceLineNo">606</span>        for (int rack = 0; rack &lt; numRacks; rack++) {<a name="line.606"></a>
<span class="sourceLineNo">607</span>          float rackLocality = rackLocalities[region][rack];<a name="line.607"></a>
<span class="sourceLineNo">608</span>          if (rackLocality &gt; bestRackLocalityForRegion) {<a name="line.608"></a>
<span class="sourceLineNo">609</span>            bestRackLocalityForRegion = rackLocality;<a name="line.609"></a>
<span class="sourceLineNo">610</span>            rackWithBestLocality = rack;<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>        regionsToMostLocalEntities[LocalityType.RACK.ordinal()][region] = rackWithBestLocality;<a name="line.613"></a>
<span class="sourceLineNo">614</span>      }<a name="line.614"></a>
<span class="sourceLineNo">615</span><a name="line.615"></a>
<span class="sourceLineNo">616</span>    }<a name="line.616"></a>
<span class="sourceLineNo">617</span><a name="line.617"></a>
<span class="sourceLineNo">618</span>    /**<a name="line.618"></a>
<span class="sourceLineNo">619</span>     * Maps region index to rack index<a name="line.619"></a>
<span class="sourceLineNo">620</span>     */<a name="line.620"></a>
<span class="sourceLineNo">621</span>    public int getRackForRegion(int region) {<a name="line.621"></a>
<span class="sourceLineNo">622</span>      return serverIndexToRackIndex[regionIndexToServerIndex[region]];<a name="line.622"></a>
<span class="sourceLineNo">623</span>    }<a name="line.623"></a>
<span class="sourceLineNo">624</span><a name="line.624"></a>
<span class="sourceLineNo">625</span>    enum LocalityType {<a name="line.625"></a>
<span class="sourceLineNo">626</span>      SERVER,<a name="line.626"></a>
<span class="sourceLineNo">627</span>      RACK<a name="line.627"></a>
<span class="sourceLineNo">628</span>    }<a name="line.628"></a>
<span class="sourceLineNo">629</span><a name="line.629"></a>
<span class="sourceLineNo">630</span>    /** An action to move or swap a region */<a name="line.630"></a>
<span class="sourceLineNo">631</span>    public static class Action {<a name="line.631"></a>
<span class="sourceLineNo">632</span>      public enum Type {<a name="line.632"></a>
<span class="sourceLineNo">633</span>        ASSIGN_REGION,<a name="line.633"></a>
<span class="sourceLineNo">634</span>        MOVE_REGION,<a name="line.634"></a>
<span class="sourceLineNo">635</span>        SWAP_REGIONS,<a name="line.635"></a>
<span class="sourceLineNo">636</span>        NULL,<a name="line.636"></a>
<span class="sourceLineNo">637</span>      }<a name="line.637"></a>
<span class="sourceLineNo">638</span><a name="line.638"></a>
<span class="sourceLineNo">639</span>      public Type type;<a name="line.639"></a>
<span class="sourceLineNo">640</span>      public Action (Type type) {this.type = type;}<a name="line.640"></a>
<span class="sourceLineNo">641</span>      /** Returns an Action which would undo this action */<a name="line.641"></a>
<span class="sourceLineNo">642</span>      public Action undoAction() { return this; }<a name="line.642"></a>
<span class="sourceLineNo">643</span>      @Override<a name="line.643"></a>
<span class="sourceLineNo">644</span>      public String toString() { return type + ":";}<a name="line.644"></a>
<span class="sourceLineNo">645</span>    }<a name="line.645"></a>
<span class="sourceLineNo">646</span><a name="line.646"></a>
<span class="sourceLineNo">647</span>    public static class AssignRegionAction extends Action {<a name="line.647"></a>
<span class="sourceLineNo">648</span>      public int region;<a name="line.648"></a>
<span class="sourceLineNo">649</span>      public int server;<a name="line.649"></a>
<span class="sourceLineNo">650</span>      public AssignRegionAction(int region, int server) {<a name="line.650"></a>
<span class="sourceLineNo">651</span>        super(Type.ASSIGN_REGION);<a name="line.651"></a>
<span class="sourceLineNo">652</span>        this.region = region;<a name="line.652"></a>
<span class="sourceLineNo">653</span>        this.server = server;<a name="line.653"></a>
<span class="sourceLineNo">654</span>      }<a name="line.654"></a>
<span class="sourceLineNo">655</span>      @Override<a name="line.655"></a>
<span class="sourceLineNo">656</span>      public Action undoAction() {<a name="line.656"></a>
<span class="sourceLineNo">657</span>        // TODO implement this. This action is not being used by the StochasticLB for now<a name="line.657"></a>
<span class="sourceLineNo">658</span>        // in case it uses it, we should implement this function.<a name="line.658"></a>
<span class="sourceLineNo">659</span>        throw new NotImplementedException(HConstants.NOT_IMPLEMENTED);<a name="line.659"></a>
<span class="sourceLineNo">660</span>      }<a name="line.660"></a>
<span class="sourceLineNo">661</span>      @Override<a name="line.661"></a>
<span class="sourceLineNo">662</span>      public String toString() {<a name="line.662"></a>
<span class="sourceLineNo">663</span>        return type + ": " + region + ":" + server;<a name="line.663"></a>
<span class="sourceLineNo">664</span>      }<a name="line.664"></a>
<span class="sourceLineNo">665</span>    }<a name="line.665"></a>
<span class="sourceLineNo">666</span><a name="line.666"></a>
<span class="sourceLineNo">667</span>    public static class MoveRegionAction extends Action {<a name="line.667"></a>
<span class="sourceLineNo">668</span>      public int region;<a name="line.668"></a>
<span class="sourceLineNo">669</span>      public int fromServer;<a name="line.669"></a>
<span class="sourceLineNo">670</span>      public int toServer;<a name="line.670"></a>
<span class="sourceLineNo">671</span><a name="line.671"></a>
<span class="sourceLineNo">672</span>      public MoveRegionAction(int region, int fromServer, int toServer) {<a name="line.672"></a>
<span class="sourceLineNo">673</span>        super(Type.MOVE_REGION);<a name="line.673"></a>
<span class="sourceLineNo">674</span>        this.fromServer = fromServer;<a name="line.674"></a>
<span class="sourceLineNo">675</span>        this.region = region;<a name="line.675"></a>
<span class="sourceLineNo">676</span>        this.toServer = toServer;<a name="line.676"></a>
<span class="sourceLineNo">677</span>      }<a name="line.677"></a>
<span class="sourceLineNo">678</span>      @Override<a name="line.678"></a>
<span class="sourceLineNo">679</span>      public Action undoAction() {<a name="line.679"></a>
<span class="sourceLineNo">680</span>        return new MoveRegionAction (region, toServer, fromServer);<a name="line.680"></a>
<span class="sourceLineNo">681</span>      }<a name="line.681"></a>
<span class="sourceLineNo">682</span>      @Override<a name="line.682"></a>
<span class="sourceLineNo">683</span>      public String toString() {<a name="line.683"></a>
<span class="sourceLineNo">684</span>        return type + ": " + region + ":" + fromServer + " -&gt; " + toServer;<a name="line.684"></a>
<span class="sourceLineNo">685</span>      }<a name="line.685"></a>
<span class="sourceLineNo">686</span>    }<a name="line.686"></a>
<span class="sourceLineNo">687</span><a name="line.687"></a>
<span class="sourceLineNo">688</span>    public static class SwapRegionsAction extends Action {<a name="line.688"></a>
<span class="sourceLineNo">689</span>      public int fromServer;<a name="line.689"></a>
<span class="sourceLineNo">690</span>      public int fromRegion;<a name="line.690"></a>
<span class="sourceLineNo">691</span>      public int toServer;<a name="line.691"></a>
<span class="sourceLineNo">692</span>      public int toRegion;<a name="line.692"></a>
<span class="sourceLineNo">693</span>      public SwapRegionsAction(int fromServer, int fromRegion, int toServer, int toRegion) {<a name="line.693"></a>
<span class="sourceLineNo">694</span>        super(Type.SWAP_REGIONS);<a name="line.694"></a>
<span class="sourceLineNo">695</span>        this.fromServer = fromServer;<a name="line.695"></a>
<span class="sourceLineNo">696</span>        this.fromRegion = fromRegion;<a name="line.696"></a>
<span class="sourceLineNo">697</span>        this.toServer = toServer;<a name="line.697"></a>
<span class="sourceLineNo">698</span>        this.toRegion = toRegion;<a name="line.698"></a>
<span class="sourceLineNo">699</span>      }<a name="line.699"></a>
<span class="sourceLineNo">700</span>      @Override<a name="line.700"></a>
<span class="sourceLineNo">701</span>      public Action undoAction() {<a name="line.701"></a>
<span class="sourceLineNo">702</span>        return new SwapRegionsAction (fromServer, toRegion, toServer, fromRegion);<a name="line.702"></a>
<span class="sourceLineNo">703</span>      }<a name="line.703"></a>
<span class="sourceLineNo">704</span>      @Override<a name="line.704"></a>
<span class="sourceLineNo">705</span>      public String toString() {<a name="line.705"></a>
<span class="sourceLineNo">706</span>        return type + ": " + fromRegion + ":" + fromServer + " &lt;-&gt; " + toRegion + ":" + toServer;<a name="line.706"></a>
<span class="sourceLineNo">707</span>      }<a name="line.707"></a>
<span class="sourceLineNo">708</span>    }<a name="line.708"></a>
<span class="sourceLineNo">709</span><a name="line.709"></a>
<span class="sourceLineNo">710</span>    @edu.umd.cs.findbugs.annotations.SuppressWarnings(value="NM_FIELD_NAMING_CONVENTION",<a name="line.710"></a>
<span class="sourceLineNo">711</span>        justification="Mistake. Too disruptive to change now")<a name="line.711"></a>
<span class="sourceLineNo">712</span>    public static final Action NullAction = new Action(Type.NULL);<a name="line.712"></a>
<span class="sourceLineNo">713</span><a name="line.713"></a>
<span class="sourceLineNo">714</span>    public void doAction(Action action) {<a name="line.714"></a>
<span class="sourceLineNo">715</span>      switch (action.type) {<a name="line.715"></a>
<span class="sourceLineNo">716</span>      case NULL: break;<a name="line.716"></a>
<span class="sourceLineNo">717</span>      case ASSIGN_REGION:<a name="line.717"></a>
<span class="sourceLineNo">718</span>        // FindBugs: Having the assert quietens FB BC_UNCONFIRMED_CAST warnings<a name="line.718"></a>
<span class="sourceLineNo">719</span>        assert action instanceof AssignRegionAction: action.getClass();<a name="line.719"></a>
<span class="sourceLineNo">720</span>        AssignRegionAction ar = (AssignRegionAction) action;<a name="line.720"></a>
<span class="sourceLineNo">721</span>        regionsPerServer[ar.server] = addRegion(regionsPerServer[ar.server], ar.region);<a name="line.721"></a>
<span class="sourceLineNo">722</span>        regionMoved(ar.region, -1, ar.server);<a name="line.722"></a>
<span class="sourceLineNo">723</span>        break;<a name="line.723"></a>
<span class="sourceLineNo">724</span>      case MOVE_REGION:<a name="line.724"></a>
<span class="sourceLineNo">725</span>        assert action instanceof MoveRegionAction: action.getClass();<a name="line.725"></a>
<span class="sourceLineNo">726</span>        MoveRegionAction mra = (MoveRegionAction) action;<a name="line.726"></a>
<span class="sourceLineNo">727</span>        regionsPerServer[mra.fromServer] = removeRegion(regionsPerServer[mra.fromServer], mra.region);<a name="line.727"></a>
<span class="sourceLineNo">728</span>        regionsPerServer[mra.toServer] = addRegion(regionsPerServer[mra.toServer], mra.region);<a name="line.728"></a>
<span class="sourceLineNo">729</span>        regionMoved(mra.region, mra.fromServer, mra.toServer);<a name="line.729"></a>
<span class="sourceLineNo">730</span>        break;<a name="line.730"></a>
<span class="sourceLineNo">731</span>      case SWAP_REGIONS:<a name="line.731"></a>
<span class="sourceLineNo">732</span>        assert action instanceof SwapRegionsAction: action.getClass();<a name="line.732"></a>
<span class="sourceLineNo">733</span>        SwapRegionsAction a = (SwapRegionsAction) action;<a name="line.733"></a>
<span class="sourceLineNo">734</span>        regionsPerServer[a.fromServer] = replaceRegion(regionsPerServer[a.fromServer], a.fromRegion, a.toRegion);<a name="line.734"></a>
<span class="sourceLineNo">735</span>        regionsPerServer[a.toServer] = replaceRegion(regionsPerServer[a.toServer], a.toRegion, a.fromRegion);<a name="line.735"></a>
<span class="sourceLineNo">736</span>        regionMoved(a.fromRegion, a.fromServer, a.toServer);<a name="line.736"></a>
<span class="sourceLineNo">737</span>        regionMoved(a.toRegion, a.toServer, a.fromServer);<a name="line.737"></a>
<span class="sourceLineNo">738</span>        break;<a name="line.738"></a>
<span class="sourceLineNo">739</span>      default:<a name="line.739"></a>
<span class="sourceLineNo">740</span>        throw new RuntimeException("Uknown action:" + action.type);<a name="line.740"></a>
<span class="sourceLineNo">741</span>      }<a name="line.741"></a>
<span class="sourceLineNo">742</span>    }<a name="line.742"></a>
<span class="sourceLineNo">743</span><a name="line.743"></a>
<span class="sourceLineNo">744</span>    /**<a name="line.744"></a>
<span class="sourceLineNo">745</span>     * Return true if the placement of region on server would lower the availability<a name="line.745"></a>
<span class="sourceLineNo">746</span>     * of the region in question<a name="line.746"></a>
<span class="sourceLineNo">747</span>     * @return true or false<a name="line.747"></a>
<span class="sourceLineNo">748</span>     */<a name="line.748"></a>
<span class="sourceLineNo">749</span>    boolean wouldLowerAvailability(RegionInfo regionInfo, ServerName serverName) {<a name="line.749"></a>
<span class="sourceLineNo">750</span>      if (!serversToIndex.containsKey(serverName.getAddress())) {<a name="line.750"></a>
<span class="sourceLineNo">751</span>        return false; // safeguard against race between cluster.servers and servers from LB method args<a name="line.751"></a>
<span class="sourceLineNo">752</span>      }<a name="line.752"></a>
<span class="sourceLineNo">753</span>      int server = serversToIndex.get(serverName.getAddress());<a name="line.753"></a>
<span class="sourceLineNo">754</span>      int region = regionsToIndex.get(regionInfo);<a name="line.754"></a>
<span class="sourceLineNo">755</span><a name="line.755"></a>
<span class="sourceLineNo">756</span>      // Region replicas for same region should better assign to different servers<a name="line.756"></a>
<span class="sourceLineNo">757</span>      for (int i : regionsPerServer[server]) {<a name="line.757"></a>
<span class="sourceLineNo">758</span>        RegionInfo otherRegionInfo = regions[i];<a name="line.758"></a>
<span class="sourceLineNo">759</span>        if (RegionReplicaUtil.isReplicasForSameRegion(regionInfo, otherRegionInfo)) {<a name="line.759"></a>
<span class="sourceLineNo">760</span>          return true;<a name="line.760"></a>
<span class="sourceLineNo">761</span>        }<a name="line.761"></a>
<span class="sourceLineNo">762</span>      }<a name="line.762"></a>
<span class="sourceLineNo">763</span><a name="line.763"></a>
<span class="sourceLineNo">764</span>      int primary = regionIndexToPrimaryIndex[region];<a name="line.764"></a>
<span class="sourceLineNo">765</span>      if (primary == -1) {<a name="line.765"></a>
<span class="sourceLineNo">766</span>        return false;<a name="line.766"></a>
<span class="sourceLineNo">767</span>      }<a name="line.767"></a>
<span class="sourceLineNo">768</span>      // there is a subset relation for server &lt; host &lt; rack<a name="line.768"></a>
<span class="sourceLineNo">769</span>      // check server first<a name="line.769"></a>
<span class="sourceLineNo">770</span>      if (contains(primariesOfRegionsPerServer[server], primary)) {<a name="line.770"></a>
<span class="sourceLineNo">771</span>        // check for whether there are other servers that we can place this region<a name="line.771"></a>
<span class="sourceLineNo">772</span>        for (int i = 0; i &lt; primariesOfRegionsPerServer.length; i++) {<a name="line.772"></a>
<span class="sourceLineNo">773</span>          if (i != server &amp;&amp; !contains(primariesOfRegionsPerServer[i], primary)) {<a name="line.773"></a>
<span class="sourceLineNo">774</span>            return true; // meaning there is a better server<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>        return false; // there is not a better server to place this<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>      // check host<a name="line.780"></a>
<span class="sourceLineNo">781</span>      if (multiServersPerHost) {<a name="line.781"></a>
<span class="sourceLineNo">782</span>        // these arrays would only be allocated if we have more than one server per host<a name="line.782"></a>
<span class="sourceLineNo">783</span>        int host = serverIndexToHostIndex[server];<a name="line.783"></a>
<span class="sourceLineNo">784</span>        if (contains(primariesOfRegionsPerHost[host], primary)) {<a name="line.784"></a>
<span class="sourceLineNo">785</span>          // check for whether there are other hosts that we can place this region<a name="line.785"></a>
<span class="sourceLineNo">786</span>          for (int i = 0; i &lt; primariesOfRegionsPerHost.length; i++) {<a name="line.786"></a>
<span class="sourceLineNo">787</span>            if (i != host &amp;&amp; !contains(primariesOfRegionsPerHost[i], primary)) {<a name="line.787"></a>
<span class="sourceLineNo">788</span>              return true; // meaning there is a better host<a name="line.788"></a>
<span class="sourceLineNo">789</span>            }<a name="line.789"></a>
<span class="sourceLineNo">790</span>          }<a name="line.790"></a>
<span class="sourceLineNo">791</span>          return false; // there is not a better host to place this<a name="line.791"></a>
<span class="sourceLineNo">792</span>        }<a name="line.792"></a>
<span class="sourceLineNo">793</span>      }<a name="line.793"></a>
<span class="sourceLineNo">794</span><a name="line.794"></a>
<span class="sourceLineNo">795</span>      // check rack<a name="line.795"></a>
<span class="sourceLineNo">796</span>      if (numRacks &gt; 1) {<a name="line.796"></a>
<span class="sourceLineNo">797</span>        int rack = serverIndexToRackIndex[server];<a name="line.797"></a>
<span class="sourceLineNo">798</span>        if (contains(primariesOfRegionsPerRack[rack], primary)) {<a name="line.798"></a>
<span class="sourceLineNo">799</span>          // check for whether there are other racks that we can place this region<a name="line.799"></a>
<span class="sourceLineNo">800</span>          for (int i = 0; i &lt; primariesOfRegionsPerRack.length; i++) {<a name="line.800"></a>
<span class="sourceLineNo">801</span>            if (i != rack &amp;&amp; !contains(primariesOfRegionsPerRack[i], primary)) {<a name="line.801"></a>
<span class="sourceLineNo">802</span>              return true; // meaning there is a better rack<a name="line.802"></a>
<span class="sourceLineNo">803</span>            }<a name="line.803"></a>
<span class="sourceLineNo">804</span>          }<a name="line.804"></a>
<span class="sourceLineNo">805</span>          return false; // there is not a better rack to place this<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><a name="line.808"></a>
<span class="sourceLineNo">809</span>      return false;<a name="line.809"></a>
<span class="sourceLineNo">810</span>    }<a name="line.810"></a>
<span class="sourceLineNo">811</span><a name="line.811"></a>
<span class="sourceLineNo">812</span>    void doAssignRegion(RegionInfo regionInfo, ServerName serverName) {<a name="line.812"></a>
<span class="sourceLineNo">813</span>      if (!serversToIndex.containsKey(serverName.getAddress())) {<a name="line.813"></a>
<span class="sourceLineNo">814</span>        return;<a name="line.814"></a>
<span class="sourceLineNo">815</span>      }<a name="line.815"></a>
<span class="sourceLineNo">816</span>      int server = serversToIndex.get(serverName.getAddress());<a name="line.816"></a>
<span class="sourceLineNo">817</span>      int region = regionsToIndex.get(regionInfo);<a name="line.817"></a>
<span class="sourceLineNo">818</span>      doAction(new AssignRegionAction(region, server));<a name="line.818"></a>
<span class="sourceLineNo">819</span>    }<a name="line.819"></a>
<span class="sourceLineNo">820</span><a name="line.820"></a>
<span class="sourceLineNo">821</span>    void regionMoved(int region, int oldServer, int newServer) {<a name="line.821"></a>
<span class="sourceLineNo">822</span>      regionIndexToServerIndex[region] = newServer;<a name="line.822"></a>
<span class="sourceLineNo">823</span>      if (initialRegionIndexToServerIndex[region] == newServer) {<a name="line.823"></a>
<span class="sourceLineNo">824</span>        numMovedRegions--; //region moved back to original location<a name="line.824"></a>
<span class="sourceLineNo">825</span>      } else if (oldServer &gt;= 0 &amp;&amp; initialRegionIndexToServerIndex[region] == oldServer) {<a name="line.825"></a>
<span class="sourceLineNo">826</span>        numMovedRegions++; //region moved from original location<a name="line.826"></a>
<span class="sourceLineNo">827</span>      }<a name="line.827"></a>
<span class="sourceLineNo">828</span>      int tableIndex = regionIndexToTableIndex[region];<a name="line.828"></a>
<span class="sourceLineNo">829</span>      if (oldServer &gt;= 0) {<a name="line.829"></a>
<span class="sourceLineNo">830</span>        numRegionsPerServerPerTable[oldServer][tableIndex]--;<a name="line.830"></a>
<span class="sourceLineNo">831</span>      }<a name="line.831"></a>
<span class="sourceLineNo">832</span>      numRegionsPerServerPerTable[newServer][tableIndex]++;<a name="line.832"></a>
<span class="sourceLineNo">833</span><a name="line.833"></a>
<span class="sourceLineNo">834</span>      //check whether this caused maxRegionsPerTable in the new Server to be updated<a name="line.834"></a>
<span class="sourceLineNo">835</span>      if (numRegionsPerServerPerTable[newServer][tableIndex] &gt; numMaxRegionsPerTable[tableIndex]) {<a name="line.835"></a>
<span class="sourceLineNo">836</span>        numMaxRegionsPerTable[tableIndex] = numRegionsPerServerPerTable[newServer][tableIndex];<a name="line.836"></a>
<span class="sourceLineNo">837</span>      } else if (oldServer &gt;= 0 &amp;&amp; (numRegionsPerServerPerTable[oldServer][tableIndex] + 1)<a name="line.837"></a>
<span class="sourceLineNo">838</span>          == numMaxRegionsPerTable[tableIndex]) {<a name="line.838"></a>
<span class="sourceLineNo">839</span>        //recompute maxRegionsPerTable since the previous value was coming from the old server<a name="line.839"></a>
<span class="sourceLineNo">840</span>        numMaxRegionsPerTable[tableIndex] = 0;<a name="line.840"></a>
<span class="sourceLineNo">841</span>        for (int[] aNumRegionsPerServerPerTable : numRegionsPerServerPerTable) {<a name="line.841"></a>
<span class="sourceLineNo">842</span>          if (aNumRegionsPerServerPerTable[tableIndex] &gt; numMaxRegionsPerTable[tableIndex]) {<a name="line.842"></a>
<span class="sourceLineNo">843</span>            numMaxRegionsPerTable[tableIndex] = aNumRegionsPerServerPerTable[tableIndex];<a name="line.843"></a>
<span class="sourceLineNo">844</span>          }<a name="line.844"></a>
<span class="sourceLineNo">845</span>        }<a name="line.845"></a>
<span class="sourceLineNo">846</span>      }<a name="line.846"></a>
<span class="sourceLineNo">847</span><a name="line.847"></a>
<span class="sourceLineNo">848</span>      // update for servers<a name="line.848"></a>
<span class="sourceLineNo">849</span>      int primary = regionIndexToPrimaryIndex[region];<a name="line.849"></a>
<span class="sourceLineNo">850</span>      if (oldServer &gt;= 0) {<a name="line.850"></a>
<span class="sourceLineNo">851</span>        primariesOfRegionsPerServer[oldServer] = removeRegion(<a name="line.851"></a>
<span class="sourceLineNo">852</span>          primariesOfRegionsPerServer[oldServer], primary);<a name="line.852"></a>
<span class="sourceLineNo">853</span>      }<a name="line.853"></a>
<span class="sourceLineNo">854</span>      primariesOfRegionsPerServer[newServer] = addRegionSorted(<a name="line.854"></a>
<span class="sourceLineNo">855</span>        primariesOfRegionsPerServer[newServer], primary);<a name="line.855"></a>
<span class="sourceLineNo">856</span><a name="line.856"></a>
<span class="sourceLineNo">857</span>      // update for hosts<a name="line.857"></a>
<span class="sourceLineNo">858</span>      if (multiServersPerHost) {<a name="line.858"></a>
<span class="sourceLineNo">859</span>        int oldHost = oldServer &gt;= 0 ? serverIndexToHostIndex[oldServer] : -1;<a name="line.859"></a>
<span class="sourceLineNo">860</span>        int newHost = serverIndexToHostIndex[newServer];<a name="line.860"></a>
<span class="sourceLineNo">861</span>        if (newHost != oldHost) {<a name="line.861"></a>
<span class="sourceLineNo">862</span>          regionsPerHost[newHost] = addRegion(regionsPerHost[newHost], region);<a name="line.862"></a>
<span class="sourceLineNo">863</span>          primariesOfRegionsPerHost[newHost] = addRegionSorted(primariesOfRegionsPerHost[newHost], primary);<a name="line.863"></a>
<span class="sourceLineNo">864</span>          if (oldHost &gt;= 0) {<a name="line.864"></a>
<span class="sourceLineNo">865</span>            regionsPerHost[oldHost] = removeRegion(regionsPerHost[oldHost], region);<a name="line.865"></a>
<span class="sourceLineNo">866</span>            primariesOfRegionsPerHost[oldHost] = removeRegion(<a name="line.866"></a>
<span class="sourceLineNo">867</span>              primariesOfRegionsPerHost[oldHost], primary); // will still be sorted<a name="line.867"></a>
<span class="sourceLineNo">868</span>          }<a name="line.868"></a>
<span class="sourceLineNo">869</span>        }<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>      // update for racks<a name="line.872"></a>
<span class="sourceLineNo">873</span>      if (numRacks &gt; 1) {<a name="line.873"></a>
<span class="sourceLineNo">874</span>        int oldRack = oldServer &gt;= 0 ? serverIndexToRackIndex[oldServer] : -1;<a name="line.874"></a>
<span class="sourceLineNo">875</span>        int newRack = serverIndexToRackIndex[newServer];<a name="line.875"></a>
<span class="sourceLineNo">876</span>        if (newRack != oldRack) {<a name="line.876"></a>
<span class="sourceLineNo">877</span>          regionsPerRack[newRack] = addRegion(regionsPerRack[newRack], region);<a name="line.877"></a>
<span class="sourceLineNo">878</span>          primariesOfRegionsPerRack[newRack] = addRegionSorted(primariesOfRegionsPerRack[newRack], primary);<a name="line.878"></a>
<span class="sourceLineNo">879</span>          if (oldRack &gt;= 0) {<a name="line.879"></a>
<span class="sourceLineNo">880</span>            regionsPerRack[oldRack] = removeRegion(regionsPerRack[oldRack], region);<a name="line.880"></a>
<span class="sourceLineNo">881</span>            primariesOfRegionsPerRack[oldRack] = removeRegion(<a name="line.881"></a>
<span class="sourceLineNo">882</span>              primariesOfRegionsPerRack[oldRack], primary); // will still be sorted<a name="line.882"></a>
<span class="sourceLineNo">883</span>          }<a name="line.883"></a>
<span class="sourceLineNo">884</span>        }<a name="line.884"></a>
<span class="sourceLineNo">885</span>      }<a name="line.885"></a>
<span class="sourceLineNo">886</span>    }<a name="line.886"></a>
<span class="sourceLineNo">887</span><a name="line.887"></a>
<span class="sourceLineNo">888</span>    int[] removeRegion(int[] regions, int regionIndex) {<a name="line.888"></a>
<span class="sourceLineNo">889</span>      //TODO: this maybe costly. Consider using linked lists<a name="line.889"></a>
<span class="sourceLineNo">890</span>      int[] newRegions = new int[regions.length - 1];<a name="line.890"></a>
<span class="sourceLineNo">891</span>      int i = 0;<a name="line.891"></a>
<span class="sourceLineNo">892</span>      for (i = 0; i &lt; regions.length; i++) {<a name="line.892"></a>
<span class="sourceLineNo">893</span>        if (regions[i] == regionIndex) {<a name="line.893"></a>
<span class="sourceLineNo">894</span>          break;<a name="line.894"></a>
<span class="sourceLineNo">895</span>        }<a name="line.895"></a>
<span class="sourceLineNo">896</span>        newRegions[i] = regions[i];<a name="line.896"></a>
<span class="sourceLineNo">897</span>      }<a name="line.897"></a>
<span class="sourceLineNo">898</span>      System.arraycopy(regions, i+1, newRegions, i, newRegions.length - i);<a name="line.898"></a>
<span class="sourceLineNo">899</span>      return newRegions;<a name="line.899"></a>
<span class="sourceLineNo">900</span>    }<a name="line.900"></a>
<span class="sourceLineNo">901</span><a name="line.901"></a>
<span class="sourceLineNo">902</span>    int[] addRegion(int[] regions, int regionIndex) {<a name="line.902"></a>
<span class="sourceLineNo">903</span>      int[] newRegions = new int[regions.length + 1];<a name="line.903"></a>
<span class="sourceLineNo">904</span>      System.arraycopy(regions, 0, newRegions, 0, regions.length);<a name="line.904"></a>
<span class="sourceLineNo">905</span>      newRegions[newRegions.length - 1] = regionIndex;<a name="line.905"></a>
<span class="sourceLineNo">906</span>      return newRegions;<a name="line.906"></a>
<span class="sourceLineNo">907</span>    }<a name="line.907"></a>
<span class="sourceLineNo">908</span><a name="line.908"></a>
<span class="sourceLineNo">909</span>    int[] addRegionSorted(int[] regions, int regionIndex) {<a name="line.909"></a>
<span class="sourceLineNo">910</span>      int[] newRegions = new int[regions.length + 1];<a name="line.910"></a>
<span class="sourceLineNo">911</span>      int i = 0;<a name="line.911"></a>
<span class="sourceLineNo">912</span>      for (i = 0; i &lt; regions.length; i++) { // find the index to insert<a name="line.912"></a>
<span class="sourceLineNo">913</span>        if (regions[i] &gt; regionIndex) {<a name="line.913"></a>
<span class="sourceLineNo">914</span>          break;<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>      System.arraycopy(regions, 0, newRegions, 0, i); // copy first half<a name="line.917"></a>
<span class="sourceLineNo">918</span>      System.arraycopy(regions, i, newRegions, i+1, regions.length - i); // copy second half<a name="line.918"></a>
<span class="sourceLineNo">919</span>      newRegions[i] = regionIndex;<a name="line.919"></a>
<span class="sourceLineNo">920</span><a name="line.920"></a>
<span class="sourceLineNo">921</span>      return newRegions;<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>    int[] replaceRegion(int[] regions, int regionIndex, int newRegionIndex) {<a name="line.924"></a>
<span class="sourceLineNo">925</span>      int i = 0;<a name="line.925"></a>
<span class="sourceLineNo">926</span>      for (i = 0; i &lt; regions.length; i++) {<a name="line.926"></a>
<span class="sourceLineNo">927</span>        if (regions[i] == regionIndex) {<a name="line.927"></a>
<span class="sourceLineNo">928</span>          regions[i] = newRegionIndex;<a name="line.928"></a>
<span class="sourceLineNo">929</span>          break;<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>      return regions;<a name="line.932"></a>
<span class="sourceLineNo">933</span>    }<a name="line.933"></a>
<span class="sourceLineNo">934</span><a name="line.934"></a>
<span class="sourceLineNo">935</span>    void sortServersByRegionCount() {<a name="line.935"></a>
<span class="sourceLineNo">936</span>      Arrays.sort(serverIndicesSortedByRegionCount, numRegionsComparator);<a name="line.936"></a>
<span class="sourceLineNo">937</span>    }<a name="line.937"></a>
<span class="sourceLineNo">938</span><a name="line.938"></a>
<span class="sourceLineNo">939</span>    int getNumRegions(int server) {<a name="line.939"></a>
<span class="sourceLineNo">940</span>      return regionsPerServer[server].length;<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>    boolean contains(int[] arr, int val) {<a name="line.943"></a>
<span class="sourceLineNo">944</span>      return Arrays.binarySearch(arr, val) &gt;= 0;<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>    private Comparator&lt;Integer&gt; numRegionsComparator = Comparator.comparingInt(this::getNumRegions);<a name="line.947"></a>
<span class="sourceLineNo">948</span><a name="line.948"></a>
<span class="sourceLineNo">949</span>    int getLowestLocalityRegionOnServer(int serverIndex) {<a name="line.949"></a>
<span class="sourceLineNo">950</span>      if (regionFinder != null) {<a name="line.950"></a>
<span class="sourceLineNo">951</span>        float lowestLocality = 1.0f;<a name="line.951"></a>
<span class="sourceLineNo">952</span>        int lowestLocalityRegionIndex = -1;<a name="line.952"></a>
<span class="sourceLineNo">953</span>        if (regionsPerServer[serverIndex].length == 0) {<a name="line.953"></a>
<span class="sourceLineNo">954</span>          // No regions on that region server<a name="line.954"></a>
<span class="sourceLineNo">955</span>          return -1;<a name="line.955"></a>
<span class="sourceLineNo">956</span>        }<a name="line.956"></a>
<span class="sourceLineNo">957</span>        for (int j = 0; j &lt; regionsPerServer[serverIndex].length; j++) {<a name="line.957"></a>
<span class="sourceLineNo">958</span>          int regionIndex = regionsPerServer[serverIndex][j];<a name="line.958"></a>
<span class="sourceLineNo">959</span>          HDFSBlocksDistribution distribution = regionFinder<a name="line.959"></a>
<span class="sourceLineNo">960</span>              .getBlockDistribution(regions[regionIndex]);<a name="line.960"></a>
<span class="sourceLineNo">961</span>          float locality = distribution.getBlockLocalityIndex(servers[serverIndex].getHostname());<a name="line.961"></a>
<span class="sourceLineNo">962</span>          // skip empty region<a name="line.962"></a>
<span class="sourceLineNo">963</span>          if (distribution.getUniqueBlocksTotalWeight() == 0) {<a name="line.963"></a>
<span class="sourceLineNo">964</span>            continue;<a name="line.964"></a>
<span class="sourceLineNo">965</span>          }<a name="line.965"></a>
<span class="sourceLineNo">966</span>          if (locality &lt; lowestLocality) {<a name="line.966"></a>
<span class="sourceLineNo">967</span>            lowestLocality = locality;<a name="line.967"></a>
<span class="sourceLineNo">968</span>            lowestLocalityRegionIndex = j;<a name="line.968"></a>
<span class="sourceLineNo">969</span>          }<a name="line.969"></a>
<span class="sourceLineNo">970</span>        }<a name="line.970"></a>
<span class="sourceLineNo">971</span>        if (lowestLocalityRegionIndex == -1) {<a name="line.971"></a>
<span class="sourceLineNo">972</span>          return -1;<a name="line.972"></a>
<span class="sourceLineNo">973</span>        }<a name="line.973"></a>
<span class="sourceLineNo">974</span>        if (LOG.isTraceEnabled()) {<a name="line.974"></a>
<span class="sourceLineNo">975</span>          LOG.trace("Lowest locality region is "<a name="line.975"></a>
<span class="sourceLineNo">976</span>              + regions[regionsPerServer[serverIndex][lowestLocalityRegionIndex]]<a name="line.976"></a>
<span class="sourceLineNo">977</span>                  .getRegionNameAsString() + " with locality " + lowestLocality<a name="line.977"></a>
<span class="sourceLineNo">978</span>              + " and its region server contains " + regionsPerServer[serverIndex].length<a name="line.978"></a>
<span class="sourceLineNo">979</span>              + " regions");<a name="line.979"></a>
<span class="sourceLineNo">980</span>        }<a name="line.980"></a>
<span class="sourceLineNo">981</span>        return regionsPerServer[serverIndex][lowestLocalityRegionIndex];<a name="line.981"></a>
<span class="sourceLineNo">982</span>      } else {<a name="line.982"></a>
<span class="sourceLineNo">983</span>        return -1;<a name="line.983"></a>
<span class="sourceLineNo">984</span>      }<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>    float getLocalityOfRegion(int region, int server) {<a name="line.987"></a>
<span class="sourceLineNo">988</span>      if (regionFinder != null) {<a name="line.988"></a>
<span class="sourceLineNo">989</span>        HDFSBlocksDistribution distribution = regionFinder.getBlockDistribution(regions[region]);<a name="line.989"></a>
<span class="sourceLineNo">990</span>        return distribution.getBlockLocalityIndex(servers[server].getHostname());<a name="line.990"></a>
<span class="sourceLineNo">991</span>      } else {<a name="line.991"></a>
<span class="sourceLineNo">992</span>        return 0f;<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>    protected void setNumRegions(int numRegions) {<a name="line.996"></a>
<span class="sourceLineNo">997</span>      this.numRegions = numRegions;<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>    protected void setNumMovedRegions(int numMovedRegions) {<a name="line.1000"></a>
<span class="sourceLineNo">1001</span>      this.numMovedRegions = numMovedRegions;<a name="line.1001"></a>
<span class="sourceLineNo">1002</span>    }<a name="line.1002"></a>
<span class="sourceLineNo">1003</span><a name="line.1003"></a>
<span class="sourceLineNo">1004</span>    @edu.umd.cs.findbugs.annotations.SuppressWarnings(value="SBSC_USE_STRINGBUFFER_CONCATENATION",<a name="line.1004"></a>
<span class="sourceLineNo">1005</span>        justification="Not important but should be fixed")<a name="line.1005"></a>
<span class="sourceLineNo">1006</span>    @Override<a name="line.1006"></a>
<span class="sourceLineNo">1007</span>    public String toString() {<a name="line.1007"></a>
<span class="sourceLineNo">1008</span>      StringBuilder desc = new StringBuilder("Cluster={servers=[");<a name="line.1008"></a>
<span class="sourceLineNo">1009</span>      for(ServerName sn:servers) {<a name="line.1009"></a>
<span class="sourceLineNo">1010</span>        desc.append(sn.getAddress().toString()).append(", ");<a name="line.1010"></a>
<span class="sourceLineNo">1011</span>      }<a name="line.1011"></a>
<span class="sourceLineNo">1012</span>      desc.append("], serverIndicesSortedByRegionCount=")<a name="line.1012"></a>
<span class="sourceLineNo">1013</span>          .append(Arrays.toString(serverIndicesSortedByRegionCount))<a name="line.1013"></a>
<span class="sourceLineNo">1014</span>          .append(", regionsPerServer=").append(Arrays.deepToString(regionsPerServer));<a name="line.1014"></a>
<span class="sourceLineNo">1015</span><a name="line.1015"></a>
<span class="sourceLineNo">1016</span>      desc.append(", numMaxRegionsPerTable=").append(Arrays.toString(numMaxRegionsPerTable))<a name="line.1016"></a>
<span class="sourceLineNo">1017</span>          .append(", numRegions=").append(numRegions).append(", numServers=").append(numServers)<a name="line.1017"></a>
<span class="sourceLineNo">1018</span>          .append(", numTables=").append(numTables).append(", numMovedRegions=")<a name="line.1018"></a>
<span class="sourceLineNo">1019</span>          .append(numMovedRegions).append('}');<a name="line.1019"></a>
<span class="sourceLineNo">1020</span>      return desc.toString();<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>  // slop for regions<a name="line.1024"></a>
<span class="sourceLineNo">1025</span>  protected float slop;<a name="line.1025"></a>
<span class="sourceLineNo">1026</span>  // overallSlop to control simpleLoadBalancer's cluster level threshold<a name="line.1026"></a>
<span class="sourceLineNo">1027</span>  protected float overallSlop;<a name="line.1027"></a>
<span class="sourceLineNo">1028</span>  protected Configuration config = HBaseConfiguration.create();<a name="line.1028"></a>
<span class="sourceLineNo">1029</span>  protected RackManager rackManager;<a name="line.1029"></a>
<span class="sourceLineNo">1030</span>  private static final Random RANDOM = new Random(System.currentTimeMillis());<a name="line.1030"></a>
<span class="sourceLineNo">1031</span>  private static final Logger LOG = LoggerFactory.getLogger(BaseLoadBalancer.class);<a name="line.1031"></a>
<span class="sourceLineNo">1032</span>  protected MetricsBalancer metricsBalancer = null;<a name="line.1032"></a>
<span class="sourceLineNo">1033</span>  protected ClusterMetrics clusterStatus = null;<a name="line.1033"></a>
<span class="sourceLineNo">1034</span>  protected ServerName masterServerName;<a name="line.1034"></a>
<span class="sourceLineNo">1035</span>  protected MasterServices services;<a name="line.1035"></a>
<span class="sourceLineNo">1036</span><a name="line.1036"></a>
<span class="sourceLineNo">1037</span>  /**<a name="line.1037"></a>
<span class="sourceLineNo">1038</span>   * @deprecated since 2.4.0, will be removed in 3.0.0.<a name="line.1038"></a>
<span class="sourceLineNo">1039</span>   * @see &lt;a href="https://issues.apache.org/jira/browse/HBASE-15549"&gt;HBASE-15549&lt;/a&gt;<a name="line.1039"></a>
<span class="sourceLineNo">1040</span>   */<a name="line.1040"></a>
<span class="sourceLineNo">1041</span>  @Deprecated<a name="line.1041"></a>
<span class="sourceLineNo">1042</span>  protected boolean onlySystemTablesOnMaster;<a name="line.1042"></a>
<span class="sourceLineNo">1043</span><a name="line.1043"></a>
<span class="sourceLineNo">1044</span>  protected boolean maintenanceMode;<a name="line.1044"></a>
<span class="sourceLineNo">1045</span><a name="line.1045"></a>
<span class="sourceLineNo">1046</span>  @Override<a name="line.1046"></a>
<span class="sourceLineNo">1047</span>  public void setConf(Configuration conf) {<a name="line.1047"></a>
<span class="sourceLineNo">1048</span>    this.config = conf;<a name="line.1048"></a>
<span class="sourceLineNo">1049</span>    setSlop(conf);<a name="line.1049"></a>
<span class="sourceLineNo">1050</span>    if (slop &lt; 0) slop = 0;<a name="line.1050"></a>
<span class="sourceLineNo">1051</span>    else if (slop &gt; 1) slop = 1;<a name="line.1051"></a>
<span class="sourceLineNo">1052</span><a name="line.1052"></a>
<span class="sourceLineNo">1053</span>    if (overallSlop &lt; 0) overallSlop = 0;<a name="line.1053"></a>
<span class="sourceLineNo">1054</span>    else if (overallSlop &gt; 1) overallSlop = 1;<a name="line.1054"></a>
<span class="sourceLineNo">1055</span><a name="line.1055"></a>
<span class="sourceLineNo">1056</span>    this.onlySystemTablesOnMaster = LoadBalancer.isSystemTablesOnlyOnMaster(this.config);<a name="line.1056"></a>
<span class="sourceLineNo">1057</span><a name="line.1057"></a>
<span class="sourceLineNo">1058</span>    this.rackManager = new RackManager(getConf());<a name="line.1058"></a>
<span class="sourceLineNo">1059</span>    if (useRegionFinder) {<a name="line.1059"></a>
<span class="sourceLineNo">1060</span>      regionFinder.setConf(conf);<a name="line.1060"></a>
<span class="sourceLineNo">1061</span>    }<a name="line.1061"></a>
<span class="sourceLineNo">1062</span>    this.isByTable = conf.getBoolean(HConstants.HBASE_MASTER_LOADBALANCE_BYTABLE, isByTable);<a name="line.1062"></a>
<span class="sourceLineNo">1063</span>    // Print out base configs. Don't print overallSlop since it for simple balancer exclusively.<a name="line.1063"></a>
<span class="sourceLineNo">1064</span>    LOG.info("slop={}, systemTablesOnMaster={}",<a name="line.1064"></a>
<span class="sourceLineNo">1065</span>        this.slop, this.onlySystemTablesOnMaster);<a name="line.1065"></a>
<span class="sourceLineNo">1066</span>  }<a name="line.1066"></a>
<span class="sourceLineNo">1067</span><a name="line.1067"></a>
<span class="sourceLineNo">1068</span>  protected void setSlop(Configuration conf) {<a name="line.1068"></a>
<span class="sourceLineNo">1069</span>    this.slop = conf.getFloat("hbase.regions.slop", (float) 0.2);<a name="line.1069"></a>
<span class="sourceLineNo">1070</span>    this.overallSlop = conf.getFloat("hbase.regions.overallSlop", slop);<a name="line.1070"></a>
<span class="sourceLineNo">1071</span>  }<a name="line.1071"></a>
<span class="sourceLineNo">1072</span><a name="line.1072"></a>
<span class="sourceLineNo">1073</span>  /**<a name="line.1073"></a>
<span class="sourceLineNo">1074</span>   * Check if a region belongs to some system table.<a name="line.1074"></a>
<span class="sourceLineNo">1075</span>   * If so, the primary replica may be expected to be put on the master regionserver.<a name="line.1075"></a>
<span class="sourceLineNo">1076</span>   *<a name="line.1076"></a>
<span class="sourceLineNo">1077</span>   * @deprecated since 2.4.0, will be removed in 3.0.0.<a name="line.1077"></a>
<span class="sourceLineNo">1078</span>   * @see &lt;a href="https://issues.apache.org/jira/browse/HBASE-15549"&gt;HBASE-15549&lt;/a&gt;<a name="line.1078"></a>
<span class="sourceLineNo">1079</span>   */<a name="line.1079"></a>
<span class="sourceLineNo">1080</span>  @Deprecated<a name="line.1080"></a>
<span class="sourceLineNo">1081</span>  public boolean shouldBeOnMaster(RegionInfo region) {<a name="line.1081"></a>
<span class="sourceLineNo">1082</span>    return (this.maintenanceMode || this.onlySystemTablesOnMaster)<a name="line.1082"></a>
<span class="sourceLineNo">1083</span>        &amp;&amp; region.getTable().isSystemTable();<a name="line.1083"></a>
<span class="sourceLineNo">1084</span>  }<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>   * Balance the regions that should be on master regionserver.<a name="line.1087"></a>
<span class="sourceLineNo">1088</span>   *<a name="line.1088"></a>
<span class="sourceLineNo">1089</span>   * @deprecated since 2.4.0, will be removed in 3.0.0.<a name="line.1089"></a>
<span class="sourceLineNo">1090</span>   * @see &lt;a href="https://issues.apache.org/jira/browse/HBASE-15549"&gt;HBASE-15549&lt;/a&gt;<a name="line.1090"></a>
<span class="sourceLineNo">1091</span>   */<a name="line.1091"></a>
<span class="sourceLineNo">1092</span>  @Deprecated<a name="line.1092"></a>
<span class="sourceLineNo">1093</span>  protected List&lt;RegionPlan&gt; balanceMasterRegions(Map&lt;ServerName, List&lt;RegionInfo&gt;&gt; clusterMap) {<a name="line.1093"></a>
<span class="sourceLineNo">1094</span>    if (masterServerName == null || clusterMap == null || clusterMap.size() &lt;= 1) return null;<a name="line.1094"></a>
<span class="sourceLineNo">1095</span>    List&lt;RegionPlan&gt; plans = null;<a name="line.1095"></a>
<span class="sourceLineNo">1096</span>    List&lt;RegionInfo&gt; regions = clusterMap.get(masterServerName);<a name="line.1096"></a>
<span class="sourceLineNo">1097</span>    if (regions != null) {<a name="line.1097"></a>
<span class="sourceLineNo">1098</span>      Iterator&lt;ServerName&gt; keyIt = null;<a name="line.1098"></a>
<span class="sourceLineNo">1099</span>      for (RegionInfo region: regions) {<a name="line.1099"></a>
<span class="sourceLineNo">1100</span>        if (shouldBeOnMaster(region)) continue;<a name="line.1100"></a>
<span class="sourceLineNo">1101</span><a name="line.1101"></a>
<span class="sourceLineNo">1102</span>        // Find a non-master regionserver to host the region<a name="line.1102"></a>
<span class="sourceLineNo">1103</span>        if (keyIt == null || !keyIt.hasNext()) {<a name="line.1103"></a>
<span class="sourceLineNo">1104</span>          keyIt = clusterMap.keySet().iterator();<a name="line.1104"></a>
<span class="sourceLineNo">1105</span>        }<a name="line.1105"></a>
<span class="sourceLineNo">1106</span>        ServerName dest = keyIt.next();<a name="line.1106"></a>
<span class="sourceLineNo">1107</span>        if (masterServerName.equals(dest)) {<a name="line.1107"></a>
<span class="sourceLineNo">1108</span>          if (!keyIt.hasNext()) {<a name="line.1108"></a>
<span class="sourceLineNo">1109</span>            keyIt = clusterMap.keySet().iterator();<a name="line.1109"></a>
<span class="sourceLineNo">1110</span>          }<a name="line.1110"></a>
<span class="sourceLineNo">1111</span>          dest = keyIt.next();<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>        // Move this region away from the master regionserver<a name="line.1114"></a>
<span class="sourceLineNo">1115</span>        RegionPlan plan = new RegionPlan(region, masterServerName, dest);<a name="line.1115"></a>
<span class="sourceLineNo">1116</span>        if (plans == null) {<a name="line.1116"></a>
<span class="sourceLineNo">1117</span>          plans = new ArrayList&lt;&gt;();<a name="line.1117"></a>
<span class="sourceLineNo">1118</span>        }<a name="line.1118"></a>
<span class="sourceLineNo">1119</span>        plans.add(plan);<a name="line.1119"></a>
<span class="sourceLineNo">1120</span>      }<a name="line.1120"></a>
<span class="sourceLineNo">1121</span>    }<a name="line.1121"></a>
<span class="sourceLineNo">1122</span>    for (Map.Entry&lt;ServerName, List&lt;RegionInfo&gt;&gt; server: clusterMap.entrySet()) {<a name="line.1122"></a>
<span class="sourceLineNo">1123</span>      if (masterServerName.equals(server.getKey())) continue;<a name="line.1123"></a>
<span class="sourceLineNo">1124</span>      for (RegionInfo region: server.getValue()) {<a name="line.1124"></a>
<span class="sourceLineNo">1125</span>        if (!shouldBeOnMaster(region)) continue;<a name="line.1125"></a>
<span class="sourceLineNo">1126</span><a name="line.1126"></a>
<span class="sourceLineNo">1127</span>        // Move this region to the master regionserver<a name="line.1127"></a>
<span class="sourceLineNo">1128</span>        RegionPlan plan = new RegionPlan(region, server.getKey(), masterServerName);<a name="line.1128"></a>
<span class="sourceLineNo">1129</span>        if (plans == null) {<a name="line.1129"></a>
<span class="sourceLineNo">1130</span>          plans = new ArrayList&lt;&gt;();<a name="line.1130"></a>
<span class="sourceLineNo">1131</span>        }<a name="line.1131"></a>
<span class="sourceLineNo">1132</span>        plans.add(plan);<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>    return plans;<a name="line.1135"></a>
<span class="sourceLineNo">1136</span>  }<a name="line.1136"></a>
<span class="sourceLineNo">1137</span><a name="line.1137"></a>
<span class="sourceLineNo">1138</span>  /**<a name="line.1138"></a>
<span class="sourceLineNo">1139</span>   * If master is configured to carry system tables only, in here is<a name="line.1139"></a>
<span class="sourceLineNo">1140</span>   * where we figure what to assign it.<a name="line.1140"></a>
<span class="sourceLineNo">1141</span>   *<a name="line.1141"></a>
<span class="sourceLineNo">1142</span>   * @deprecated since 2.4.0, will be removed in 3.0.0.<a name="line.1142"></a>
<span class="sourceLineNo">1143</span>   * @see &lt;a href="https://issues.apache.org/jira/browse/HBASE-15549"&gt;HBASE-15549&lt;/a&gt;<a name="line.1143"></a>
<span class="sourceLineNo">1144</span>   */<a name="line.1144"></a>
<span class="sourceLineNo">1145</span>  @Deprecated<a name="line.1145"></a>
<span class="sourceLineNo">1146</span>  @NonNull<a name="line.1146"></a>
<span class="sourceLineNo">1147</span>  protected Map&lt;ServerName, List&lt;RegionInfo&gt;&gt; assignMasterSystemRegions(<a name="line.1147"></a>
<span class="sourceLineNo">1148</span>      Collection&lt;RegionInfo&gt; regions, List&lt;ServerName&gt; servers) {<a name="line.1148"></a>
<span class="sourceLineNo">1149</span>    Map&lt;ServerName, List&lt;RegionInfo&gt;&gt; assignments = new TreeMap&lt;&gt;();<a name="line.1149"></a>
<span class="sourceLineNo">1150</span>    if (this.maintenanceMode || this.onlySystemTablesOnMaster) {<a name="line.1150"></a>
<span class="sourceLineNo">1151</span>      if (masterServerName != null &amp;&amp; servers.contains(masterServerName)) {<a name="line.1151"></a>
<span class="sourceLineNo">1152</span>        assignments.put(masterServerName, new ArrayList&lt;&gt;());<a name="line.1152"></a>
<span class="sourceLineNo">1153</span>        for (RegionInfo region : regions) {<a name="line.1153"></a>
<span class="sourceLineNo">1154</span>          if (shouldBeOnMaster(region)) {<a name="line.1154"></a>
<span class="sourceLineNo">1155</span>            assignments.get(masterServerName).add(region);<a name="line.1155"></a>
<span class="sourceLineNo">1156</span>          }<a name="line.1156"></a>
<span class="sourceLineNo">1157</span>        }<a name="line.1157"></a>
<span class="sourceLineNo">1158</span>      }<a name="line.1158"></a>
<span class="sourceLineNo">1159</span>    }<a name="line.1159"></a>
<span class="sourceLineNo">1160</span>    return assignments;<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>  @Override<a name="line.1163"></a>
<span class="sourceLineNo">1164</span>  public Configuration getConf() {<a name="line.1164"></a>
<span class="sourceLineNo">1165</span>    return this.config;<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>  @Override<a name="line.1168"></a>
<span class="sourceLineNo">1169</span>  public synchronized void setClusterMetrics(ClusterMetrics st) {<a name="line.1169"></a>
<span class="sourceLineNo">1170</span>    this.clusterStatus = st;<a name="line.1170"></a>
<span class="sourceLineNo">1171</span>    if (useRegionFinder) {<a name="line.1171"></a>
<span class="sourceLineNo">1172</span>      regionFinder.setClusterMetrics(st);<a name="line.1172"></a>
<span class="sourceLineNo">1173</span>    }<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>  @Override<a name="line.1177"></a>
<span class="sourceLineNo">1178</span>  public void setMasterServices(MasterServices masterServices) {<a name="line.1178"></a>
<span class="sourceLineNo">1179</span>    masterServerName = masterServices.getServerName();<a name="line.1179"></a>
<span class="sourceLineNo">1180</span>    this.services = masterServices;<a name="line.1180"></a>
<span class="sourceLineNo">1181</span>    if (useRegionFinder) {<a name="line.1181"></a>
<span class="sourceLineNo">1182</span>      this.regionFinder.setClusterInfoProvider(new MasterClusterInfoProvider(services));<a name="line.1182"></a>
<span class="sourceLineNo">1183</span>    }<a name="line.1183"></a>
<span class="sourceLineNo">1184</span>    if (this.services.isInMaintenanceMode()) {<a name="line.1184"></a>
<span class="sourceLineNo">1185</span>      this.maintenanceMode = true;<a name="line.1185"></a>
<span class="sourceLineNo">1186</span>    }<a name="line.1186"></a>
<span class="sourceLineNo">1187</span>  }<a name="line.1187"></a>
<span class="sourceLineNo">1188</span><a name="line.1188"></a>
<span class="sourceLineNo">1189</span>  @Override<a name="line.1189"></a>
<span class="sourceLineNo">1190</span>  public void postMasterStartupInitialize() {<a name="line.1190"></a>
<span class="sourceLineNo">1191</span>    if (services != null &amp;&amp; regionFinder != null) {<a name="line.1191"></a>
<span class="sourceLineNo">1192</span>      try {<a name="line.1192"></a>
<span class="sourceLineNo">1193</span>        Set&lt;RegionInfo&gt; regions =<a name="line.1193"></a>
<span class="sourceLineNo">1194</span>            services.getAssignmentManager().getRegionStates().getRegionAssignments().keySet();<a name="line.1194"></a>
<span class="sourceLineNo">1195</span>        regionFinder.refreshAndWait(regions);<a name="line.1195"></a>
<span class="sourceLineNo">1196</span>      } catch (Exception e) {<a name="line.1196"></a>
<span class="sourceLineNo">1197</span>        LOG.warn("Refreshing region HDFS Block dist failed with exception, ignoring", e);<a name="line.1197"></a>
<span class="sourceLineNo">1198</span>      }<a name="line.1198"></a>
<span class="sourceLineNo">1199</span>    }<a name="line.1199"></a>
<span class="sourceLineNo">1200</span>  }<a name="line.1200"></a>
<span class="sourceLineNo">1201</span><a name="line.1201"></a>
<span class="sourceLineNo">1202</span>  public void setRackManager(RackManager rackManager) {<a name="line.1202"></a>
<span class="sourceLineNo">1203</span>    this.rackManager = rackManager;<a name="line.1203"></a>
<span class="sourceLineNo">1204</span>  }<a name="line.1204"></a>
<span class="sourceLineNo">1205</span><a name="line.1205"></a>
<span class="sourceLineNo">1206</span>  protected boolean needsBalance(TableName tableName, Cluster c) {<a name="line.1206"></a>
<span class="sourceLineNo">1207</span>    ClusterLoadState cs = new ClusterLoadState(c.clusterState);<a name="line.1207"></a>
<span class="sourceLineNo">1208</span>    if (cs.getNumServers() &lt; MIN_SERVER_BALANCE) {<a name="line.1208"></a>
<span class="sourceLineNo">1209</span>      if (LOG.isDebugEnabled()) {<a name="line.1209"></a>
<span class="sourceLineNo">1210</span>        LOG.debug("Not running balancer because only " + cs.getNumServers()<a name="line.1210"></a>
<span class="sourceLineNo">1211</span>            + " active regionserver(s)");<a name="line.1211"></a>
<span class="sourceLineNo">1212</span>      }<a name="line.1212"></a>
<span class="sourceLineNo">1213</span>      return false;<a name="line.1213"></a>
<span class="sourceLineNo">1214</span>    }<a name="line.1214"></a>
<span class="sourceLineNo">1215</span>    if(areSomeRegionReplicasColocated(c)) return true;<a name="line.1215"></a>
<span class="sourceLineNo">1216</span>    if(idleRegionServerExist(c)) {<a name="line.1216"></a>
<span class="sourceLineNo">1217</span>      return true;<a name="line.1217"></a>
<span class="sourceLineNo">1218</span>    }<a name="line.1218"></a>
<span class="sourceLineNo">1219</span><a name="line.1219"></a>
<span class="sourceLineNo">1220</span>    // Check if we even need to do any load balancing<a name="line.1220"></a>
<span class="sourceLineNo">1221</span>    // HBASE-3681 check sloppiness first<a name="line.1221"></a>
<span class="sourceLineNo">1222</span>    float average = cs.getLoadAverage(); // for logging<a name="line.1222"></a>
<span class="sourceLineNo">1223</span>    int floor = (int) Math.floor(average * (1 - slop));<a name="line.1223"></a>
<span class="sourceLineNo">1224</span>    int ceiling = (int) Math.ceil(average * (1 + slop));<a name="line.1224"></a>
<span class="sourceLineNo">1225</span>    if (!(cs.getMaxLoad() &gt; ceiling || cs.getMinLoad() &lt; floor)) {<a name="line.1225"></a>
<span class="sourceLineNo">1226</span>      NavigableMap&lt;ServerAndLoad, List&lt;RegionInfo&gt;&gt; serversByLoad = cs.getServersByLoad();<a name="line.1226"></a>
<span class="sourceLineNo">1227</span>      if (LOG.isTraceEnabled()) {<a name="line.1227"></a>
<span class="sourceLineNo">1228</span>        // If nothing to balance, then don't say anything unless trace-level logging.<a name="line.1228"></a>
<span class="sourceLineNo">1229</span>        LOG.trace("Skipping load balancing because balanced cluster; " +<a name="line.1229"></a>
<span class="sourceLineNo">1230</span>          "servers=" + cs.getNumServers() +<a name="line.1230"></a>
<span class="sourceLineNo">1231</span>          " regions=" + cs.getNumRegions() + " average=" + average +<a name="line.1231"></a>
<span class="sourceLineNo">1232</span>          " mostloaded=" + serversByLoad.lastKey().getLoad() +<a name="line.1232"></a>
<span class="sourceLineNo">1233</span>          " leastloaded=" + serversByLoad.firstKey().getLoad());<a name="line.1233"></a>
<span class="sourceLineNo">1234</span>      }<a name="line.1234"></a>
<span class="sourceLineNo">1235</span>      return false;<a name="line.1235"></a>
<span class="sourceLineNo">1236</span>    }<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><a name="line.1239"></a>
<span class="sourceLineNo">1240</span>  /**<a name="line.1240"></a>
<span class="sourceLineNo">1241</span>   * Subclasses should implement this to return true if the cluster has nodes that hosts<a name="line.1241"></a>
<span class="sourceLineNo">1242</span>   * multiple replicas for the same region, or, if there are multiple racks and the same<a name="line.1242"></a>
<span class="sourceLineNo">1243</span>   * rack hosts replicas of the same region<a name="line.1243"></a>
<span class="sourceLineNo">1244</span>   * @param c Cluster information<a name="line.1244"></a>
<span class="sourceLineNo">1245</span>   * @return whether region replicas are currently co-located<a name="line.1245"></a>
<span class="sourceLineNo">1246</span>   */<a name="line.1246"></a>
<span class="sourceLineNo">1247</span>  protected boolean areSomeRegionReplicasColocated(Cluster c) {<a name="line.1247"></a>
<span class="sourceLineNo">1248</span>    return false;<a name="line.1248"></a>
<span class="sourceLineNo">1249</span>  }<a name="line.1249"></a>
<span class="sourceLineNo">1250</span><a name="line.1250"></a>
<span class="sourceLineNo">1251</span>  protected final boolean idleRegionServerExist(Cluster c){<a name="line.1251"></a>
<span class="sourceLineNo">1252</span>    boolean isServerExistsWithMoreRegions = false;<a name="line.1252"></a>
<span class="sourceLineNo">1253</span>    boolean isServerExistsWithZeroRegions = false;<a name="line.1253"></a>
<span class="sourceLineNo">1254</span>    for (int[] serverList: c.regionsPerServer){<a name="line.1254"></a>
<span class="sourceLineNo">1255</span>      if (serverList.length &gt; 1) {<a name="line.1255"></a>
<span class="sourceLineNo">1256</span>        isServerExistsWithMoreRegions = true;<a name="line.1256"></a>
<span class="sourceLineNo">1257</span>      }<a name="line.1257"></a>
<span class="sourceLineNo">1258</span>      if (serverList.length == 0) {<a name="line.1258"></a>
<span class="sourceLineNo">1259</span>        isServerExistsWithZeroRegions = true;<a name="line.1259"></a>
<span class="sourceLineNo">1260</span>      }<a name="line.1260"></a>
<span class="sourceLineNo">1261</span>    }<a name="line.1261"></a>
<span class="sourceLineNo">1262</span>    return isServerExistsWithMoreRegions &amp;&amp; isServerExistsWithZeroRegions;<a name="line.1262"></a>
<span class="sourceLineNo">1263</span>  }<a name="line.1263"></a>
<span class="sourceLineNo">1264</span><a name="line.1264"></a>
<span class="sourceLineNo">1265</span>  /**<a name="line.1265"></a>
<span class="sourceLineNo">1266</span>   * Generates a bulk assignment plan to be used on cluster startup using a<a name="line.1266"></a>
<span class="sourceLineNo">1267</span>   * simple round-robin assignment.<a name="line.1267"></a>
<span class="sourceLineNo">1268</span>   * &lt;p&gt;<a name="line.1268"></a>
<span class="sourceLineNo">1269</span>   * Takes a list of all the regions and all the servers in the cluster and<a name="line.1269"></a>
<span class="sourceLineNo">1270</span>   * returns a map of each server to the regions that it should be assigned.<a name="line.1270"></a>
<span class="sourceLineNo">1271</span>   * &lt;p&gt;<a name="line.1271"></a>
<span class="sourceLineNo">1272</span>   * Currently implemented as a round-robin assignment. Same invariant as load<a name="line.1272"></a>
<span class="sourceLineNo">1273</span>   * balancing, all servers holding floor(avg) or ceiling(avg).<a name="line.1273"></a>
<span class="sourceLineNo">1274</span>   *<a name="line.1274"></a>
<span class="sourceLineNo">1275</span>   * TODO: Use block locations from HDFS to place regions with their blocks<a name="line.1275"></a>
<span class="sourceLineNo">1276</span>   *<a name="line.1276"></a>
<span class="sourceLineNo">1277</span>   * @param regions all regions<a name="line.1277"></a>
<span class="sourceLineNo">1278</span>   * @param servers all servers<a name="line.1278"></a>
<span class="sourceLineNo">1279</span>   * @return map of server to the regions it should take, or emptyMap if no<a name="line.1279"></a>
<span class="sourceLineNo">1280</span>   *         assignment is possible (ie. no servers)<a name="line.1280"></a>
<span class="sourceLineNo">1281</span>   */<a name="line.1281"></a>
<span class="sourceLineNo">1282</span>  @Override<a name="line.1282"></a>
<span class="sourceLineNo">1283</span>  @NonNull<a name="line.1283"></a>
<span class="sourceLineNo">1284</span>  public Map&lt;ServerName, List&lt;RegionInfo&gt;&gt; roundRobinAssignment(List&lt;RegionInfo&gt; regions,<a name="line.1284"></a>
<span class="sourceLineNo">1285</span>      List&lt;ServerName&gt; servers) throws HBaseIOException {<a name="line.1285"></a>
<span class="sourceLineNo">1286</span>    metricsBalancer.incrMiscInvocations();<a name="line.1286"></a>
<span class="sourceLineNo">1287</span>    Map&lt;ServerName, List&lt;RegionInfo&gt;&gt; assignments = assignMasterSystemRegions(regions, servers);<a name="line.1287"></a>
<span class="sourceLineNo">1288</span>    if (!assignments.isEmpty()) {<a name="line.1288"></a>
<span class="sourceLineNo">1289</span>      servers = new ArrayList&lt;&gt;(servers);<a name="line.1289"></a>
<span class="sourceLineNo">1290</span>      // Guarantee not to put other regions on master<a name="line.1290"></a>
<span class="sourceLineNo">1291</span>      servers.remove(masterServerName);<a name="line.1291"></a>
<span class="sourceLineNo">1292</span>      List&lt;RegionInfo&gt; masterRegions = assignments.get(masterServerName);<a name="line.1292"></a>
<span class="sourceLineNo">1293</span>      if (!masterRegions.isEmpty()) {<a name="line.1293"></a>
<span class="sourceLineNo">1294</span>        regions = new ArrayList&lt;&gt;(regions);<a name="line.1294"></a>
<span class="sourceLineNo">1295</span>        regions.removeAll(masterRegions);<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>     * only need assign system table<a name="line.1299"></a>
<span class="sourceLineNo">1300</span>     */<a name="line.1300"></a>
<span class="sourceLineNo">1301</span>    if (this.maintenanceMode || regions.isEmpty()) {<a name="line.1301"></a>
<span class="sourceLineNo">1302</span>      return assignments;<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>    int numServers = servers == null ? 0 : servers.size();<a name="line.1305"></a>
<span class="sourceLineNo">1306</span>    if (numServers == 0) {<a name="line.1306"></a>
<span class="sourceLineNo">1307</span>      LOG.warn("Wanted to do round robin assignment but no servers to assign to");<a name="line.1307"></a>
<span class="sourceLineNo">1308</span>      return Collections.emptyMap();<a name="line.1308"></a>
<span class="sourceLineNo">1309</span>    }<a name="line.1309"></a>
<span class="sourceLineNo">1310</span><a name="line.1310"></a>
<span class="sourceLineNo">1311</span>    // TODO: instead of retainAssignment() and roundRobinAssignment(), we should just run the<a name="line.1311"></a>
<span class="sourceLineNo">1312</span>    // normal LB.balancerCluster() with unassignedRegions. We only need to have a candidate<a name="line.1312"></a>
<span class="sourceLineNo">1313</span>    // generator for AssignRegionAction. The LB will ensure the regions are mostly local<a name="line.1313"></a>
<span class="sourceLineNo">1314</span>    // and balanced. This should also run fast with fewer number of iterations.<a name="line.1314"></a>
<span class="sourceLineNo">1315</span><a name="line.1315"></a>
<span class="sourceLineNo">1316</span>    if (numServers == 1) { // Only one server, nothing fancy we can do here<a name="line.1316"></a>
<span class="sourceLineNo">1317</span>      ServerName server = servers.get(0);<a name="line.1317"></a>
<span class="sourceLineNo">1318</span>      assignments.put(server, new ArrayList&lt;&gt;(regions));<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>    Cluster cluster = createCluster(servers, regions);<a name="line.1322"></a>
<span class="sourceLineNo">1323</span>    roundRobinAssignment(cluster, regions, servers, assignments);<a name="line.1323"></a>
<span class="sourceLineNo">1324</span>    return assignments;<a name="line.1324"></a>
<span class="sourceLineNo">1325</span>  }<a name="line.1325"></a>
<span class="sourceLineNo">1326</span><a name="line.1326"></a>
<span class="sourceLineNo">1327</span>  protected Cluster createCluster(List&lt;ServerName&gt; servers, Collection&lt;RegionInfo&gt; regions)<a name="line.1327"></a>
<span class="sourceLineNo">1328</span>      throws HBaseIOException {<a name="line.1328"></a>
<span class="sourceLineNo">1329</span>    boolean hasRegionReplica = false;<a name="line.1329"></a>
<span class="sourceLineNo">1330</span>    try {<a name="line.1330"></a>
<span class="sourceLineNo">1331</span>      if (services != null &amp;&amp; services.getTableDescriptors() != null) {<a name="line.1331"></a>
<span class="sourceLineNo">1332</span>        Map&lt;String, TableDescriptor&gt; tds = services.getTableDescriptors().getAll();<a name="line.1332"></a>
<span class="sourceLineNo">1333</span>        for (RegionInfo regionInfo : regions) {<a name="line.1333"></a>
<span class="sourceLineNo">1334</span>          TableDescriptor td = tds.get(regionInfo.getTable().getNameWithNamespaceInclAsString());<a name="line.1334"></a>
<span class="sourceLineNo">1335</span>          if (td != null &amp;&amp; td.getRegionReplication() &gt; 1) {<a name="line.1335"></a>
<span class="sourceLineNo">1336</span>            hasRegionReplica = true;<a name="line.1336"></a>
<span class="sourceLineNo">1337</span>            break;<a name="line.1337"></a>
<span class="sourceLineNo">1338</span>          }<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>    } catch (IOException ioe) {<a name="line.1341"></a>
<span class="sourceLineNo">1342</span>      throw new HBaseIOException(ioe);<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>    // Get the snapshot of the current assignments for the regions in question, and then create<a name="line.1345"></a>
<span class="sourceLineNo">1346</span>    // a cluster out of it. Note that we might have replicas already assigned to some servers<a name="line.1346"></a>
<span class="sourceLineNo">1347</span>    // earlier. So we want to get the snapshot to see those assignments, but this will only contain<a name="line.1347"></a>
<span class="sourceLineNo">1348</span>    // replicas of the regions that are passed (for performance).<a name="line.1348"></a>
<span class="sourceLineNo">1349</span>    Map&lt;ServerName, List&lt;RegionInfo&gt;&gt; clusterState = null;<a name="line.1349"></a>
<span class="sourceLineNo">1350</span>    if (!hasRegionReplica) {<a name="line.1350"></a>
<span class="sourceLineNo">1351</span>      clusterState = getRegionAssignmentsByServer(regions);<a name="line.1351"></a>
<span class="sourceLineNo">1352</span>    } else {<a name="line.1352"></a>
<span class="sourceLineNo">1353</span>      // for the case where we have region replica it is better we get the entire cluster's snapshot<a name="line.1353"></a>
<span class="sourceLineNo">1354</span>      clusterState = getRegionAssignmentsByServer(null);<a name="line.1354"></a>
<span class="sourceLineNo">1355</span>    }<a name="line.1355"></a>
<span class="sourceLineNo">1356</span><a name="line.1356"></a>
<span class="sourceLineNo">1357</span>    for (ServerName server : servers) {<a name="line.1357"></a>
<span class="sourceLineNo">1358</span>      if (!clusterState.containsKey(server)) {<a name="line.1358"></a>
<span class="sourceLineNo">1359</span>        clusterState.put(server, EMPTY_REGION_LIST);<a name="line.1359"></a>
<span class="sourceLineNo">1360</span>      }<a name="line.1360"></a>
<span class="sourceLineNo">1361</span>    }<a name="line.1361"></a>
<span class="sourceLineNo">1362</span>    return new Cluster(regions, clusterState, null, this.regionFinder,<a name="line.1362"></a>
<span class="sourceLineNo">1363</span>        rackManager);<a name="line.1363"></a>
<span class="sourceLineNo">1364</span>  }<a name="line.1364"></a>
<span class="sourceLineNo">1365</span><a name="line.1365"></a>
<span class="sourceLineNo">1366</span>  private List&lt;ServerName&gt; findIdleServers(List&lt;ServerName&gt; servers) {<a name="line.1366"></a>
<span class="sourceLineNo">1367</span>    return this.services.getServerManager()<a name="line.1367"></a>
<span class="sourceLineNo">1368</span>            .getOnlineServersListWithPredicator(servers, IDLE_SERVER_PREDICATOR);<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>   * Used to assign a single region to a random server.<a name="line.1372"></a>
<span class="sourceLineNo">1373</span>   */<a name="line.1373"></a>
<span class="sourceLineNo">1374</span>  @Override<a name="line.1374"></a>
<span class="sourceLineNo">1375</span>  public ServerName randomAssignment(RegionInfo regionInfo, List&lt;ServerName&gt; servers)<a name="line.1375"></a>
<span class="sourceLineNo">1376</span>      throws HBaseIOException {<a name="line.1376"></a>
<span class="sourceLineNo">1377</span>    metricsBalancer.incrMiscInvocations();<a name="line.1377"></a>
<span class="sourceLineNo">1378</span>    if (servers != null &amp;&amp; servers.contains(masterServerName)) {<a name="line.1378"></a>
<span class="sourceLineNo">1379</span>      if (shouldBeOnMaster(regionInfo)) {<a name="line.1379"></a>
<span class="sourceLineNo">1380</span>        return masterServerName;<a name="line.1380"></a>
<span class="sourceLineNo">1381</span>      }<a name="line.1381"></a>
<span class="sourceLineNo">1382</span>      if (!LoadBalancer.isTablesOnMaster(getConf())) {<a name="line.1382"></a>
<span class="sourceLineNo">1383</span>        // Guarantee we do not put any regions on master<a name="line.1383"></a>
<span class="sourceLineNo">1384</span>        servers = new ArrayList&lt;&gt;(servers);<a name="line.1384"></a>
<span class="sourceLineNo">1385</span>        servers.remove(masterServerName);<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><a name="line.1388"></a>
<span class="sourceLineNo">1389</span>    int numServers = servers == null ? 0 : servers.size();<a name="line.1389"></a>
<span class="sourceLineNo">1390</span>    if (numServers == 0) {<a name="line.1390"></a>
<span class="sourceLineNo">1391</span>      LOG.warn("Wanted to retain assignment but no servers to assign to");<a name="line.1391"></a>
<span class="sourceLineNo">1392</span>      return null;<a name="line.1392"></a>
<span class="sourceLineNo">1393</span>    }<a name="line.1393"></a>
<span class="sourceLineNo">1394</span>    if (numServers == 1) { // Only one server, nothing fancy we can do here<a name="line.1394"></a>
<span class="sourceLineNo">1395</span>      return servers.get(0);<a name="line.1395"></a>
<span class="sourceLineNo">1396</span>    }<a name="line.1396"></a>
<span class="sourceLineNo">1397</span>    List&lt;ServerName&gt; idleServers = findIdleServers(servers);<a name="line.1397"></a>
<span class="sourceLineNo">1398</span>    if (idleServers.size() == 1) {<a name="line.1398"></a>
<span class="sourceLineNo">1399</span>      return idleServers.get(0);<a name="line.1399"></a>
<span class="sourceLineNo">1400</span>    }<a name="line.1400"></a>
<span class="sourceLineNo">1401</span>    final List&lt;ServerName&gt; finalServers = idleServers.isEmpty() ?<a name="line.1401"></a>
<span class="sourceLineNo">1402</span>            servers : idleServers;<a name="line.1402"></a>
<span class="sourceLineNo">1403</span>    List&lt;RegionInfo&gt; regions = Lists.newArrayList(regionInfo);<a name="line.1403"></a>
<span class="sourceLineNo">1404</span>    Cluster cluster = createCluster(finalServers, regions);<a name="line.1404"></a>
<span class="sourceLineNo">1405</span>    return randomAssignment(cluster, regionInfo, finalServers);<a name="line.1405"></a>
<span class="sourceLineNo">1406</span>  }<a name="line.1406"></a>
<span class="sourceLineNo">1407</span><a name="line.1407"></a>
<span class="sourceLineNo">1408</span>  /**<a name="line.1408"></a>
<span class="sourceLineNo">1409</span>   * Generates a bulk assignment startup plan, attempting to reuse the existing<a name="line.1409"></a>
<span class="sourceLineNo">1410</span>   * assignment information from META, but adjusting for the specified list of<a name="line.1410"></a>
<span class="sourceLineNo">1411</span>   * available/online servers available for assignment.<a name="line.1411"></a>
<span class="sourceLineNo">1412</span>   * &lt;p&gt;<a name="line.1412"></a>
<span class="sourceLineNo">1413</span>   * Takes a map of all regions to their existing assignment from META. Also<a name="line.1413"></a>
<span class="sourceLineNo">1414</span>   * takes a list of online servers for regions to be assigned to. Attempts to<a name="line.1414"></a>
<span class="sourceLineNo">1415</span>   * retain all assignment, so in some instances initial assignment will not be<a name="line.1415"></a>
<span class="sourceLineNo">1416</span>   * completely balanced.<a name="line.1416"></a>
<span class="sourceLineNo">1417</span>   * &lt;p&gt;<a name="line.1417"></a>
<span class="sourceLineNo">1418</span>   * Any leftover regions without an existing server to be assigned to will be<a name="line.1418"></a>
<span class="sourceLineNo">1419</span>   * assigned randomly to available servers.<a name="line.1419"></a>
<span class="sourceLineNo">1420</span>   *<a name="line.1420"></a>
<span class="sourceLineNo">1421</span>   * @param regions regions and existing assignment from meta<a name="line.1421"></a>
<span class="sourceLineNo">1422</span>   * @param servers available servers<a name="line.1422"></a>
<span class="sourceLineNo">1423</span>   * @return map of servers and regions to be assigned to them, or emptyMap if no<a name="line.1423"></a>
<span class="sourceLineNo">1424</span>   *           assignment is possible (ie. no servers)<a name="line.1424"></a>
<span class="sourceLineNo">1425</span>   */<a name="line.1425"></a>
<span class="sourceLineNo">1426</span>  @Override<a name="line.1426"></a>
<span class="sourceLineNo">1427</span>  @NonNull<a name="line.1427"></a>
<span class="sourceLineNo">1428</span>  public Map&lt;ServerName, List&lt;RegionInfo&gt;&gt; retainAssignment(Map&lt;RegionInfo, ServerName&gt; regions,<a name="line.1428"></a>
<span class="sourceLineNo">1429</span>      List&lt;ServerName&gt; servers) throws HBaseIOException {<a name="line.1429"></a>
<span class="sourceLineNo">1430</span>    // Update metrics<a name="line.1430"></a>
<span class="sourceLineNo">1431</span>    metricsBalancer.incrMiscInvocations();<a name="line.1431"></a>
<span class="sourceLineNo">1432</span>    Map&lt;ServerName, List&lt;RegionInfo&gt;&gt; assignments = assignMasterSystemRegions(regions.keySet(), servers);<a name="line.1432"></a>
<span class="sourceLineNo">1433</span>    if (!assignments.isEmpty()) {<a name="line.1433"></a>
<span class="sourceLineNo">1434</span>      servers = new ArrayList&lt;&gt;(servers);<a name="line.1434"></a>
<span class="sourceLineNo">1435</span>      // Guarantee not to put other regions on master<a name="line.1435"></a>
<span class="sourceLineNo">1436</span>      servers.remove(masterServerName);<a name="line.1436"></a>
<span class="sourceLineNo">1437</span>      List&lt;RegionInfo&gt; masterRegions = assignments.get(masterServerName);<a name="line.1437"></a>
<span class="sourceLineNo">1438</span>      regions = regions.entrySet().stream().filter(e -&gt; !masterRegions.contains(e.getKey()))<a name="line.1438"></a>
<span class="sourceLineNo">1439</span>          .collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue));<a name="line.1439"></a>
<span class="sourceLineNo">1440</span>    }<a name="line.1440"></a>
<span class="sourceLineNo">1441</span>    if (this.maintenanceMode || regions.isEmpty()) {<a name="line.1441"></a>
<span class="sourceLineNo">1442</span>      return assignments;<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>    int numServers = servers == null ? 0 : servers.size();<a name="line.1445"></a>
<span class="sourceLineNo">1446</span>    if (numServers == 0) {<a name="line.1446"></a>
<span class="sourceLineNo">1447</span>      LOG.warn("Wanted to do retain assignment but no servers to assign to");<a name="line.1447"></a>
<span class="sourceLineNo">1448</span>      return Collections.emptyMap();<a name="line.1448"></a>
<span class="sourceLineNo">1449</span>    }<a name="line.1449"></a>
<span class="sourceLineNo">1450</span>    if (numServers == 1) { // Only one server, nothing fancy we can do here<a name="line.1450"></a>
<span class="sourceLineNo">1451</span>      ServerName server = servers.get(0);<a name="line.1451"></a>
<span class="sourceLineNo">1452</span>      assignments.put(server, new ArrayList&lt;&gt;(regions.keySet()));<a name="line.1452"></a>
<span class="sourceLineNo">1453</span>      return assignments;<a name="line.1453"></a>
<span class="sourceLineNo">1454</span>    }<a name="line.1454"></a>
<span class="sourceLineNo">1455</span><a name="line.1455"></a>
<span class="sourceLineNo">1456</span>    // Group all of the old assignments by their hostname.<a name="line.1456"></a>
<span class="sourceLineNo">1457</span>    // We can't group directly by ServerName since the servers all have<a name="line.1457"></a>
<span class="sourceLineNo">1458</span>    // new start-codes.<a name="line.1458"></a>
<span class="sourceLineNo">1459</span><a name="line.1459"></a>
<span class="sourceLineNo">1460</span>    // Group the servers by their hostname. It's possible we have multiple<a name="line.1460"></a>
<span class="sourceLineNo">1461</span>    // servers on the same host on different ports.<a name="line.1461"></a>
<span class="sourceLineNo">1462</span>    ArrayListMultimap&lt;String, ServerName&gt; serversByHostname = ArrayListMultimap.create();<a name="line.1462"></a>
<span class="sourceLineNo">1463</span>    for (ServerName server : servers) {<a name="line.1463"></a>
<span class="sourceLineNo">1464</span>      assignments.put(server, new ArrayList&lt;&gt;());<a name="line.1464"></a>
<span class="sourceLineNo">1465</span>      serversByHostname.put(server.getHostnameLowerCase(), server);<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>    // Collection of the hostnames that used to have regions<a name="line.1468"></a>
<span class="sourceLineNo">1469</span>    // assigned, but for which we no longer have any RS running<a name="line.1469"></a>
<span class="sourceLineNo">1470</span>    // after the cluster restart.<a name="line.1470"></a>
<span class="sourceLineNo">1471</span>    Set&lt;String&gt; oldHostsNoLongerPresent = Sets.newTreeSet();<a name="line.1471"></a>
<span class="sourceLineNo">1472</span><a name="line.1472"></a>
<span class="sourceLineNo">1473</span>    // If the old servers aren't present, lets assign those regions later.<a name="line.1473"></a>
<span class="sourceLineNo">1474</span>    List&lt;RegionInfo&gt; randomAssignRegions = Lists.newArrayList();<a name="line.1474"></a>
<span class="sourceLineNo">1475</span><a name="line.1475"></a>
<span class="sourceLineNo">1476</span>    int numRandomAssignments = 0;<a name="line.1476"></a>
<span class="sourceLineNo">1477</span>    int numRetainedAssigments = 0;<a name="line.1477"></a>
<span class="sourceLineNo">1478</span>    for (Map.Entry&lt;RegionInfo, ServerName&gt; entry : regions.entrySet()) {<a name="line.1478"></a>
<span class="sourceLineNo">1479</span>      RegionInfo region = entry.getKey();<a name="line.1479"></a>
<span class="sourceLineNo">1480</span>      ServerName oldServerName = entry.getValue();<a name="line.1480"></a>
<span class="sourceLineNo">1481</span>      List&lt;ServerName&gt; localServers = new ArrayList&lt;&gt;();<a name="line.1481"></a>
<span class="sourceLineNo">1482</span>      if (oldServerName != null) {<a name="line.1482"></a>
<span class="sourceLineNo">1483</span>        localServers = serversByHostname.get(oldServerName.getHostnameLowerCase());<a name="line.1483"></a>
<span class="sourceLineNo">1484</span>      }<a name="line.1484"></a>
<span class="sourceLineNo">1485</span>      if (localServers.isEmpty()) {<a name="line.1485"></a>
<span class="sourceLineNo">1486</span>        // No servers on the new cluster match up with this hostname, assign randomly, later.<a name="line.1486"></a>
<span class="sourceLineNo">1487</span>        randomAssignRegions.add(region);<a name="line.1487"></a>
<span class="sourceLineNo">1488</span>        if (oldServerName != null) {<a name="line.1488"></a>
<span class="sourceLineNo">1489</span>          oldHostsNoLongerPresent.add(oldServerName.getHostnameLowerCase());<a name="line.1489"></a>
<span class="sourceLineNo">1490</span>        }<a name="line.1490"></a>
<span class="sourceLineNo">1491</span>      } else if (localServers.size() == 1) {<a name="line.1491"></a>
<span class="sourceLineNo">1492</span>        // the usual case - one new server on same host<a name="line.1492"></a>
<span class="sourceLineNo">1493</span>        ServerName target = localServers.get(0);<a name="line.1493"></a>
<span class="sourceLineNo">1494</span>        assignments.get(target).add(region);<a name="line.1494"></a>
<span class="sourceLineNo">1495</span>        numRetainedAssigments++;<a name="line.1495"></a>
<span class="sourceLineNo">1496</span>      } else {<a name="line.1496"></a>
<span class="sourceLineNo">1497</span>        // multiple new servers in the cluster on this same host<a name="line.1497"></a>
<span class="sourceLineNo">1498</span>        if (localServers.contains(oldServerName)) {<a name="line.1498"></a>
<span class="sourceLineNo">1499</span>          assignments.get(oldServerName).add(region);<a name="line.1499"></a>
<span class="sourceLineNo">1500</span>          numRetainedAssigments++;<a name="line.1500"></a>
<span class="sourceLineNo">1501</span>        } else {<a name="line.1501"></a>
<span class="sourceLineNo">1502</span>          ServerName target = null;<a name="line.1502"></a>
<span class="sourceLineNo">1503</span>          for (ServerName tmp : localServers) {<a name="line.1503"></a>
<span class="sourceLineNo">1504</span>            if (tmp.getPort() == oldServerName.getPort()) {<a name="line.1504"></a>
<span class="sourceLineNo">1505</span>              target = tmp;<a name="line.1505"></a>
<span class="sourceLineNo">1506</span>              assignments.get(tmp).add(region);<a name="line.1506"></a>
<span class="sourceLineNo">1507</span>              numRetainedAssigments++;<a name="line.1507"></a>
<span class="sourceLineNo">1508</span>              break;<a name="line.1508"></a>
<span class="sourceLineNo">1509</span>            }<a name="line.1509"></a>
<span class="sourceLineNo">1510</span>          }<a name="line.1510"></a>
<span class="sourceLineNo">1511</span>          if (target == null) {<a name="line.1511"></a>
<span class="sourceLineNo">1512</span>            randomAssignRegions.add(region);<a name="line.1512"></a>
<span class="sourceLineNo">1513</span>          }<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>    }<a name="line.1516"></a>
<span class="sourceLineNo">1517</span><a name="line.1517"></a>
<span class="sourceLineNo">1518</span>    // If servers from prior assignment aren't present, then lets do randomAssignment on regions.<a name="line.1518"></a>
<span class="sourceLineNo">1519</span>    if (randomAssignRegions.size() &gt; 0) {<a name="line.1519"></a>
<span class="sourceLineNo">1520</span>      Cluster cluster = createCluster(servers, regions.keySet());<a name="line.1520"></a>
<span class="sourceLineNo">1521</span>      for (Map.Entry&lt;ServerName, List&lt;RegionInfo&gt;&gt; entry : assignments.entrySet()) {<a name="line.1521"></a>
<span class="sourceLineNo">1522</span>        ServerName sn = entry.getKey();<a name="line.1522"></a>
<span class="sourceLineNo">1523</span>        for (RegionInfo region : entry.getValue()) {<a name="line.1523"></a>
<span class="sourceLineNo">1524</span>          cluster.doAssignRegion(region, sn);<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>      for (RegionInfo region : randomAssignRegions) {<a name="line.1527"></a>
<span class="sourceLineNo">1528</span>        ServerName target = randomAssignment(cluster, region, servers);<a name="line.1528"></a>
<span class="sourceLineNo">1529</span>        assignments.get(target).add(region);<a name="line.1529"></a>
<span class="sourceLineNo">1530</span>        numRandomAssignments++;<a name="line.1530"></a>
<span class="sourceLineNo">1531</span>      }<a name="line.1531"></a>
<span class="sourceLineNo">1532</span>    }<a name="line.1532"></a>
<span class="sourceLineNo">1533</span><a name="line.1533"></a>
<span class="sourceLineNo">1534</span>    String randomAssignMsg = "";<a name="line.1534"></a>
<span class="sourceLineNo">1535</span>    if (numRandomAssignments &gt; 0) {<a name="line.1535"></a>
<span class="sourceLineNo">1536</span>      randomAssignMsg =<a name="line.1536"></a>
<span class="sourceLineNo">1537</span>          numRandomAssignments + " regions were assigned "<a name="line.1537"></a>
<span class="sourceLineNo">1538</span>              + "to random hosts, since the old hosts for these regions are no "<a name="line.1538"></a>
<span class="sourceLineNo">1539</span>              + "longer present in the cluster. These hosts were:\n  "<a name="line.1539"></a>
<span class="sourceLineNo">1540</span>              + Joiner.on("\n  ").join(oldHostsNoLongerPresent);<a name="line.1540"></a>
<span class="sourceLineNo">1541</span>    }<a name="line.1541"></a>
<span class="sourceLineNo">1542</span><a name="line.1542"></a>
<span class="sourceLineNo">1543</span>    LOG.info("Reassigned " + regions.size() + " regions. " + numRetainedAssigments<a name="line.1543"></a>
<span class="sourceLineNo">1544</span>        + " retained the pre-restart assignment. " + randomAssignMsg);<a name="line.1544"></a>
<span class="sourceLineNo">1545</span>    return assignments;<a name="line.1545"></a>
<span class="sourceLineNo">1546</span>  }<a name="line.1546"></a>
<span class="sourceLineNo">1547</span><a name="line.1547"></a>
<span class="sourceLineNo">1548</span>  @Override<a name="line.1548"></a>
<span class="sourceLineNo">1549</span>  public void initialize() throws HBaseIOException{<a name="line.1549"></a>
<span class="sourceLineNo">1550</span>  }<a name="line.1550"></a>
<span class="sourceLineNo">1551</span><a name="line.1551"></a>
<span class="sourceLineNo">1552</span>  @Override<a name="line.1552"></a>
<span class="sourceLineNo">1553</span>  public void regionOnline(RegionInfo regionInfo, ServerName sn) {<a name="line.1553"></a>
<span class="sourceLineNo">1554</span>  }<a name="line.1554"></a>
<span class="sourceLineNo">1555</span><a name="line.1555"></a>
<span class="sourceLineNo">1556</span>  @Override<a name="line.1556"></a>
<span class="sourceLineNo">1557</span>  public void regionOffline(RegionInfo regionInfo) {<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>  @Override<a name="line.1560"></a>
<span class="sourceLineNo">1561</span>  public boolean isStopped() {<a name="line.1561"></a>
<span class="sourceLineNo">1562</span>    return stopped;<a name="line.1562"></a>
<span class="sourceLineNo">1563</span>  }<a name="line.1563"></a>
<span class="sourceLineNo">1564</span><a name="line.1564"></a>
<span class="sourceLineNo">1565</span>  @Override<a name="line.1565"></a>
<span class="sourceLineNo">1566</span>  public void stop(String why) {<a name="line.1566"></a>
<span class="sourceLineNo">1567</span>    LOG.info("Load Balancer stop requested: "+why);<a name="line.1567"></a>
<span class="sourceLineNo">1568</span>    stopped = true;<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>  * Updates the balancer status tag reported to JMX<a name="line.1572"></a>
<span class="sourceLineNo">1573</span>  */<a name="line.1573"></a>
<span class="sourceLineNo">1574</span>  public void updateBalancerStatus(boolean status) {<a name="line.1574"></a>
<span class="sourceLineNo">1575</span>    metricsBalancer.balancerStatus(status);<a name="line.1575"></a>
<span class="sourceLineNo">1576</span>  }<a name="line.1576"></a>
<span class="sourceLineNo">1577</span><a name="line.1577"></a>
<span class="sourceLineNo">1578</span>  /**<a name="line.1578"></a>
<span class="sourceLineNo">1579</span>   * Used to assign a single region to a random server.<a name="line.1579"></a>
<span class="sourceLineNo">1580</span>   */<a name="line.1580"></a>
<span class="sourceLineNo">1581</span>  private ServerName randomAssignment(Cluster cluster, RegionInfo regionInfo,<a name="line.1581"></a>
<span class="sourceLineNo">1582</span>      List&lt;ServerName&gt; servers) {<a name="line.1582"></a>
<span class="sourceLineNo">1583</span>    int numServers = servers.size(); // servers is not null, numServers &gt; 1<a name="line.1583"></a>
<span class="sourceLineNo">1584</span>    ServerName sn = null;<a name="line.1584"></a>
<span class="sourceLineNo">1585</span>    final int maxIterations = numServers * 4;<a name="line.1585"></a>
<span class="sourceLineNo">1586</span>    int iterations = 0;<a name="line.1586"></a>
<span class="sourceLineNo">1587</span>    List&lt;ServerName&gt; usedSNs = new ArrayList&lt;&gt;(servers.size());<a name="line.1587"></a>
<span class="sourceLineNo">1588</span>    do {<a name="line.1588"></a>
<span class="sourceLineNo">1589</span>      int i = RANDOM.nextInt(numServers);<a name="line.1589"></a>
<span class="sourceLineNo">1590</span>      sn = servers.get(i);<a name="line.1590"></a>
<span class="sourceLineNo">1591</span>      if (!usedSNs.contains(sn)) {<a name="line.1591"></a>
<span class="sourceLineNo">1592</span>        usedSNs.add(sn);<a name="line.1592"></a>
<span class="sourceLineNo">1593</span>      }<a name="line.1593"></a>
<span class="sourceLineNo">1594</span>    } while (cluster.wouldLowerAvailability(regionInfo, sn)<a name="line.1594"></a>
<span class="sourceLineNo">1595</span>        &amp;&amp; iterations++ &lt; maxIterations);<a name="line.1595"></a>
<span class="sourceLineNo">1596</span>    if (iterations &gt;= maxIterations) {<a name="line.1596"></a>
<span class="sourceLineNo">1597</span>      // We have reached the max. Means the servers that we collected is still lowering the<a name="line.1597"></a>
<span class="sourceLineNo">1598</span>      // availability<a name="line.1598"></a>
<span class="sourceLineNo">1599</span>      for (ServerName unusedServer : servers) {<a name="line.1599"></a>
<span class="sourceLineNo">1600</span>        if (!usedSNs.contains(unusedServer)) {<a name="line.1600"></a>
<span class="sourceLineNo">1601</span>          // check if any other unused server is there for us to use.<a name="line.1601"></a>
<span class="sourceLineNo">1602</span>          // If so use it. Else we have not other go but to go with one of them<a name="line.1602"></a>
<span class="sourceLineNo">1603</span>          if (!cluster.wouldLowerAvailability(regionInfo, unusedServer)) {<a name="line.1603"></a>
<span class="sourceLineNo">1604</span>            sn = unusedServer;<a name="line.1604"></a>
<span class="sourceLineNo">1605</span>            break;<a name="line.1605"></a>
<span class="sourceLineNo">1606</span>          }<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>    }<a name="line.1609"></a>
<span class="sourceLineNo">1610</span>    cluster.doAssignRegion(regionInfo, sn);<a name="line.1610"></a>
<span class="sourceLineNo">1611</span>    return sn;<a name="line.1611"></a>
<span class="sourceLineNo">1612</span>  }<a name="line.1612"></a>
<span class="sourceLineNo">1613</span><a name="line.1613"></a>
<span class="sourceLineNo">1614</span>  /**<a name="line.1614"></a>
<span class="sourceLineNo">1615</span>   * Round robin a list of regions to a list of servers<a name="line.1615"></a>
<span class="sourceLineNo">1616</span>   */<a name="line.1616"></a>
<span class="sourceLineNo">1617</span>  private void roundRobinAssignment(Cluster cluster, List&lt;RegionInfo&gt; regions,<a name="line.1617"></a>
<span class="sourceLineNo">1618</span>    List&lt;ServerName&gt; servers, Map&lt;ServerName, List&lt;RegionInfo&gt;&gt; assignments) {<a name="line.1618"></a>
<span class="sourceLineNo">1619</span>    List&lt;RegionInfo&gt; unassignedRegions = new ArrayList&lt;&gt;();<a name="line.1619"></a>
<span class="sourceLineNo">1620</span>    int numServers = servers.size();<a name="line.1620"></a>
<span class="sourceLineNo">1621</span>    int numRegions = regions.size();<a name="line.1621"></a>
<span class="sourceLineNo">1622</span>    int max = (int) Math.ceil((float) numRegions / numServers);<a name="line.1622"></a>
<span class="sourceLineNo">1623</span>    int serverIdx = 0;<a name="line.1623"></a>
<span class="sourceLineNo">1624</span>    if (numServers &gt; 1) {<a name="line.1624"></a>
<span class="sourceLineNo">1625</span>      serverIdx = RANDOM.nextInt(numServers);<a name="line.1625"></a>
<span class="sourceLineNo">1626</span>    }<a name="line.1626"></a>
<span class="sourceLineNo">1627</span>    int regionIdx = 0;<a name="line.1627"></a>
<span class="sourceLineNo">1628</span>    for (int j = 0; j &lt; numServers; j++) {<a name="line.1628"></a>
<span class="sourceLineNo">1629</span>      ServerName server = servers.get((j + serverIdx) % numServers);<a name="line.1629"></a>
<span class="sourceLineNo">1630</span>      List&lt;RegionInfo&gt; serverRegions = new ArrayList&lt;&gt;(max);<a name="line.1630"></a>
<span class="sourceLineNo">1631</span>      for (int i = regionIdx; i &lt; numRegions; i += numServers) {<a name="line.1631"></a>
<span class="sourceLineNo">1632</span>        RegionInfo region = regions.get(i % numRegions);<a name="line.1632"></a>
<span class="sourceLineNo">1633</span>        if (cluster.wouldLowerAvailability(region, server)) {<a name="line.1633"></a>
<span class="sourceLineNo">1634</span>          unassignedRegions.add(region);<a name="line.1634"></a>
<span class="sourceLineNo">1635</span>        } else {<a name="line.1635"></a>
<span class="sourceLineNo">1636</span>          serverRegions.add(region);<a name="line.1636"></a>
<span class="sourceLineNo">1637</span>          cluster.doAssignRegion(region, server);<a name="line.1637"></a>
<span class="sourceLineNo">1638</span>        }<a name="line.1638"></a>
<span class="sourceLineNo">1639</span>      }<a name="line.1639"></a>
<span class="sourceLineNo">1640</span>      assignments.put(server, serverRegions);<a name="line.1640"></a>
<span class="sourceLineNo">1641</span>      regionIdx++;<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>    List&lt;RegionInfo&gt; lastFewRegions = new ArrayList&lt;&gt;();<a name="line.1645"></a>
<span class="sourceLineNo">1646</span>    // assign the remaining by going through the list and try to assign to servers one-by-one<a name="line.1646"></a>
<span class="sourceLineNo">1647</span>    serverIdx = RANDOM.nextInt(numServers);<a name="line.1647"></a>
<span class="sourceLineNo">1648</span>    OUTER : for (RegionInfo region : unassignedRegions) {<a name="line.1648"></a>
<span class="sourceLineNo">1649</span>      boolean assigned = false;<a name="line.1649"></a>
<span class="sourceLineNo">1650</span>      INNER : for (int j = 0; j &lt; numServers; j++) { // try all servers one by one<a name="line.1650"></a>
<span class="sourceLineNo">1651</span>        ServerName server = servers.get((j + serverIdx) % numServers);<a name="line.1651"></a>
<span class="sourceLineNo">1652</span>        if (cluster.wouldLowerAvailability(region, server)) {<a name="line.1652"></a>
<span class="sourceLineNo">1653</span>          continue INNER;<a name="line.1653"></a>
<span class="sourceLineNo">1654</span>        } else {<a name="line.1654"></a>
<span class="sourceLineNo">1655</span>          assignments.computeIfAbsent(server, k -&gt; new ArrayList&lt;&gt;()).add(region);<a name="line.1655"></a>
<span class="sourceLineNo">1656</span>          cluster.doAssignRegion(region, server);<a name="line.1656"></a>
<span class="sourceLineNo">1657</span>          serverIdx = (j + serverIdx + 1) % numServers; //remain from next server<a name="line.1657"></a>
<span class="sourceLineNo">1658</span>          assigned = true;<a name="line.1658"></a>
<span class="sourceLineNo">1659</span>          break;<a name="line.1659"></a>
<span class="sourceLineNo">1660</span>        }<a name="line.1660"></a>
<span class="sourceLineNo">1661</span>      }<a name="line.1661"></a>
<span class="sourceLineNo">1662</span>      if (!assigned) {<a name="line.1662"></a>
<span class="sourceLineNo">1663</span>        lastFewRegions.add(region);<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>    // just sprinkle the rest of the regions on random regionservers. The balanceCluster will<a name="line.1666"></a>
<span class="sourceLineNo">1667</span>    // make it optimal later. we can end up with this if numReplicas &gt; numServers.<a name="line.1667"></a>
<span class="sourceLineNo">1668</span>    for (RegionInfo region : lastFewRegions) {<a name="line.1668"></a>
<span class="sourceLineNo">1669</span>      int i = RANDOM.nextInt(numServers);<a name="line.1669"></a>
<span class="sourceLineNo">1670</span>      ServerName server = servers.get(i);<a name="line.1670"></a>
<span class="sourceLineNo">1671</span>      assignments.computeIfAbsent(server, k -&gt; new ArrayList&lt;&gt;()).add(region);<a name="line.1671"></a>
<span class="sourceLineNo">1672</span>      cluster.doAssignRegion(region, server);<a name="line.1672"></a>
<span class="sourceLineNo">1673</span>    }<a name="line.1673"></a>
<span class="sourceLineNo">1674</span>  }<a name="line.1674"></a>
<span class="sourceLineNo">1675</span><a name="line.1675"></a>
<span class="sourceLineNo">1676</span>  protected Map&lt;ServerName, List&lt;RegionInfo&gt;&gt; getRegionAssignmentsByServer(<a name="line.1676"></a>
<span class="sourceLineNo">1677</span>    Collection&lt;RegionInfo&gt; regions) {<a name="line.1677"></a>
<span class="sourceLineNo">1678</span>    if (this.services != null &amp;&amp; this.services.getAssignmentManager() != null) {<a name="line.1678"></a>
<span class="sourceLineNo">1679</span>      return this.services.getAssignmentManager().getSnapShotOfAssignment(regions);<a name="line.1679"></a>
<span class="sourceLineNo">1680</span>    } else {<a name="line.1680"></a>
<span class="sourceLineNo">1681</span>      return new HashMap&lt;&gt;();<a name="line.1681"></a>
<span class="sourceLineNo">1682</span>    }<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>  private Map&lt;ServerName, List&lt;RegionInfo&gt;&gt; toEnsumbleTableLoad(<a name="line.1685"></a>
<span class="sourceLineNo">1686</span>      Map&lt;TableName, Map&lt;ServerName, List&lt;RegionInfo&gt;&gt;&gt; LoadOfAllTable) {<a name="line.1686"></a>
<span class="sourceLineNo">1687</span>    Map&lt;ServerName, List&lt;RegionInfo&gt;&gt; returnMap = new TreeMap&lt;&gt;();<a name="line.1687"></a>
<span class="sourceLineNo">1688</span>    for (Map&lt;ServerName, List&lt;RegionInfo&gt;&gt; serverNameListMap : LoadOfAllTable.values()) {<a name="line.1688"></a>
<span class="sourceLineNo">1689</span>      serverNameListMap.forEach((serverName, regionInfoList) -&gt; {<a name="line.1689"></a>
<span class="sourceLineNo">1690</span>        List&lt;RegionInfo&gt; regionInfos =<a name="line.1690"></a>
<span class="sourceLineNo">1691</span>            returnMap.computeIfAbsent(serverName, k -&gt; new ArrayList&lt;&gt;());<a name="line.1691"></a>
<span class="sourceLineNo">1692</span>        regionInfos.addAll(regionInfoList);<a name="line.1692"></a>
<span class="sourceLineNo">1693</span>      });<a name="line.1693"></a>
<span class="sourceLineNo">1694</span>    }<a name="line.1694"></a>
<span class="sourceLineNo">1695</span>    return returnMap;<a name="line.1695"></a>
<span class="sourceLineNo">1696</span>  }<a name="line.1696"></a>
<span class="sourceLineNo">1697</span><a name="line.1697"></a>
<span class="sourceLineNo">1698</span>  @Override<a name="line.1698"></a>
<span class="sourceLineNo">1699</span>  public abstract List&lt;RegionPlan&gt; balanceTable(TableName tableName,<a name="line.1699"></a>
<span class="sourceLineNo">1700</span>      Map&lt;ServerName, List&lt;RegionInfo&gt;&gt; loadOfOneTable);<a name="line.1700"></a>
<span class="sourceLineNo">1701</span><a name="line.1701"></a>
<span class="sourceLineNo">1702</span>  @Override<a name="line.1702"></a>
<span class="sourceLineNo">1703</span>  public List&lt;RegionPlan&gt;<a name="line.1703"></a>
<span class="sourceLineNo">1704</span>      balanceCluster(Map&lt;TableName, Map&lt;ServerName, List&lt;RegionInfo&gt;&gt;&gt; loadOfAllTable) {<a name="line.1704"></a>
<span class="sourceLineNo">1705</span>    if (isByTable) {<a name="line.1705"></a>
<span class="sourceLineNo">1706</span>      List&lt;RegionPlan&gt; result = new ArrayList&lt;&gt;();<a name="line.1706"></a>
<span class="sourceLineNo">1707</span>      loadOfAllTable.forEach((tableName, loadOfOneTable) -&gt; {<a name="line.1707"></a>
<span class="sourceLineNo">1708</span>        LOG.info("Start Generate Balance plan for table: " + tableName);<a name="line.1708"></a>
<span class="sourceLineNo">1709</span>        List&lt;RegionPlan&gt; partialPlans = balanceTable(tableName, loadOfOneTable);<a name="line.1709"></a>
<span class="sourceLineNo">1710</span>        if (partialPlans != null) {<a name="line.1710"></a>
<span class="sourceLineNo">1711</span>          result.addAll(partialPlans);<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>      return result;<a name="line.1714"></a>
<span class="sourceLineNo">1715</span>    } else {<a name="line.1715"></a>
<span class="sourceLineNo">1716</span>      LOG.info("Start Generate Balance plan for cluster.");<a name="line.1716"></a>
<span class="sourceLineNo">1717</span>      return balanceTable(HConstants.ENSEMBLE_TABLE_NAME, toEnsumbleTableLoad(loadOfAllTable));<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>  @Override<a name="line.1721"></a>
<span class="sourceLineNo">1722</span>  public void onConfigurationChange(Configuration conf) {<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>




























































</pre>
</div>
</body>
</html>
