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




























































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