<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html lang="en">
<head>
<title>Source code</title>
<link rel="stylesheet" type="text/css" href="../../../../../../../stylesheet.css" title="Style">
</head>
<body>
<div class="sourceContainer">
<pre><span class="sourceLineNo">001</span>/**<a name="line.1"></a>
<span class="sourceLineNo">002</span> * Licensed to the Apache Software Foundation (ASF) under one<a name="line.2"></a>
<span class="sourceLineNo">003</span> * or more contributor license agreements.  See the NOTICE file<a name="line.3"></a>
<span class="sourceLineNo">004</span> * distributed with this work for additional information<a name="line.4"></a>
<span class="sourceLineNo">005</span> * regarding copyright ownership.  The ASF licenses this file<a name="line.5"></a>
<span class="sourceLineNo">006</span> * to you under the Apache License, Version 2.0 (the<a name="line.6"></a>
<span class="sourceLineNo">007</span> * "License"); you may not use this file except in compliance<a name="line.7"></a>
<span class="sourceLineNo">008</span> * with the License.  You may obtain a copy of the License at<a name="line.8"></a>
<span class="sourceLineNo">009</span> *<a name="line.9"></a>
<span class="sourceLineNo">010</span> *     http://www.apache.org/licenses/LICENSE-2.0<a name="line.10"></a>
<span class="sourceLineNo">011</span> *<a name="line.11"></a>
<span class="sourceLineNo">012</span> * Unless required by applicable law or agreed to in writing, software<a name="line.12"></a>
<span class="sourceLineNo">013</span> * distributed under the License is distributed on an "AS IS" BASIS,<a name="line.13"></a>
<span class="sourceLineNo">014</span> * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.<a name="line.14"></a>
<span class="sourceLineNo">015</span> * See the License for the specific language governing permissions and<a name="line.15"></a>
<span class="sourceLineNo">016</span> * limitations under the License.<a name="line.16"></a>
<span class="sourceLineNo">017</span> */<a name="line.17"></a>
<span class="sourceLineNo">018</span>package org.apache.hadoop.hbase.master.balancer;<a name="line.18"></a>
<span class="sourceLineNo">019</span><a name="line.19"></a>
<span class="sourceLineNo">020</span>import static org.junit.Assert.assertEquals;<a name="line.20"></a>
<span class="sourceLineNo">021</span>import static org.junit.Assert.assertNull;<a name="line.21"></a>
<span class="sourceLineNo">022</span>import static org.junit.Assert.assertTrue;<a name="line.22"></a>
<span class="sourceLineNo">023</span>import static org.mockito.Mockito.mock;<a name="line.23"></a>
<span class="sourceLineNo">024</span>import static org.mockito.Mockito.when;<a name="line.24"></a>
<span class="sourceLineNo">025</span><a name="line.25"></a>
<span class="sourceLineNo">026</span>import java.util.ArrayList;<a name="line.26"></a>
<span class="sourceLineNo">027</span>import java.util.Collections;<a name="line.27"></a>
<span class="sourceLineNo">028</span>import java.util.HashMap;<a name="line.28"></a>
<span class="sourceLineNo">029</span>import java.util.LinkedHashMap;<a name="line.29"></a>
<span class="sourceLineNo">030</span>import java.util.List;<a name="line.30"></a>
<span class="sourceLineNo">031</span>import java.util.Map;<a name="line.31"></a>
<span class="sourceLineNo">032</span>import java.util.Set;<a name="line.32"></a>
<span class="sourceLineNo">033</span>import java.util.TreeMap;<a name="line.33"></a>
<span class="sourceLineNo">034</span>import java.util.TreeSet;<a name="line.34"></a>
<span class="sourceLineNo">035</span>import java.util.stream.Collectors;<a name="line.35"></a>
<span class="sourceLineNo">036</span>import org.apache.commons.lang3.ArrayUtils;<a name="line.36"></a>
<span class="sourceLineNo">037</span>import org.apache.hadoop.conf.Configuration;<a name="line.37"></a>
<span class="sourceLineNo">038</span>import org.apache.hadoop.hbase.HBaseClassTestRule;<a name="line.38"></a>
<span class="sourceLineNo">039</span>import org.apache.hadoop.hbase.HBaseConfiguration;<a name="line.39"></a>
<span class="sourceLineNo">040</span>import org.apache.hadoop.hbase.ServerName;<a name="line.40"></a>
<span class="sourceLineNo">041</span>import org.apache.hadoop.hbase.TableName;<a name="line.41"></a>
<span class="sourceLineNo">042</span>import org.apache.hadoop.hbase.client.RegionInfo;<a name="line.42"></a>
<span class="sourceLineNo">043</span>import org.apache.hadoop.hbase.client.RegionInfoBuilder;<a name="line.43"></a>
<span class="sourceLineNo">044</span>import org.apache.hadoop.hbase.client.RegionReplicaUtil;<a name="line.44"></a>
<span class="sourceLineNo">045</span>import org.apache.hadoop.hbase.master.LoadBalancer;<a name="line.45"></a>
<span class="sourceLineNo">046</span>import org.apache.hadoop.hbase.master.MasterServices;<a name="line.46"></a>
<span class="sourceLineNo">047</span>import org.apache.hadoop.hbase.master.RackManager;<a name="line.47"></a>
<span class="sourceLineNo">048</span>import org.apache.hadoop.hbase.master.RegionPlan;<a name="line.48"></a>
<span class="sourceLineNo">049</span>import org.apache.hadoop.hbase.master.ServerManager;<a name="line.49"></a>
<span class="sourceLineNo">050</span>import org.apache.hadoop.hbase.master.balancer.BaseLoadBalancer.Cluster;<a name="line.50"></a>
<span class="sourceLineNo">051</span>import org.apache.hadoop.hbase.master.balancer.BaseLoadBalancer.Cluster.MoveRegionAction;<a name="line.51"></a>
<span class="sourceLineNo">052</span>import org.apache.hadoop.hbase.testclassification.MasterTests;<a name="line.52"></a>
<span class="sourceLineNo">053</span>import org.apache.hadoop.hbase.testclassification.MediumTests;<a name="line.53"></a>
<span class="sourceLineNo">054</span>import org.apache.hadoop.hbase.util.Bytes;<a name="line.54"></a>
<span class="sourceLineNo">055</span>import org.apache.hadoop.net.DNSToSwitchMapping;<a name="line.55"></a>
<span class="sourceLineNo">056</span>import org.junit.BeforeClass;<a name="line.56"></a>
<span class="sourceLineNo">057</span>import org.junit.ClassRule;<a name="line.57"></a>
<span class="sourceLineNo">058</span>import org.junit.Rule;<a name="line.58"></a>
<span class="sourceLineNo">059</span>import org.junit.Test;<a name="line.59"></a>
<span class="sourceLineNo">060</span>import org.junit.experimental.categories.Category;<a name="line.60"></a>
<span class="sourceLineNo">061</span>import org.junit.rules.TestName;<a name="line.61"></a>
<span class="sourceLineNo">062</span>import org.mockito.Mockito;<a name="line.62"></a>
<span class="sourceLineNo">063</span>import org.slf4j.Logger;<a name="line.63"></a>
<span class="sourceLineNo">064</span>import org.slf4j.LoggerFactory;<a name="line.64"></a>
<span class="sourceLineNo">065</span><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><a name="line.67"></a>
<span class="sourceLineNo">068</span>@Category({MasterTests.class, MediumTests.class})<a name="line.68"></a>
<span class="sourceLineNo">069</span>public class TestBaseLoadBalancer extends BalancerTestBase {<a name="line.69"></a>
<span class="sourceLineNo">070</span><a name="line.70"></a>
<span class="sourceLineNo">071</span>  @ClassRule<a name="line.71"></a>
<span class="sourceLineNo">072</span>  public static final HBaseClassTestRule CLASS_RULE =<a name="line.72"></a>
<span class="sourceLineNo">073</span>      HBaseClassTestRule.forClass(TestBaseLoadBalancer.class);<a name="line.73"></a>
<span class="sourceLineNo">074</span><a name="line.74"></a>
<span class="sourceLineNo">075</span>  private static LoadBalancer loadBalancer;<a name="line.75"></a>
<span class="sourceLineNo">076</span>  private static final Logger LOG = LoggerFactory.getLogger(TestBaseLoadBalancer.class);<a name="line.76"></a>
<span class="sourceLineNo">077</span>  private static final ServerName master = ServerName.valueOf("fake-master", 0, 1L);<a name="line.77"></a>
<span class="sourceLineNo">078</span>  private static RackManager rackManager;<a name="line.78"></a>
<span class="sourceLineNo">079</span>  private static final int NUM_SERVERS = 15;<a name="line.79"></a>
<span class="sourceLineNo">080</span>  private static ServerName[] servers = new ServerName[NUM_SERVERS];<a name="line.80"></a>
<span class="sourceLineNo">081</span><a name="line.81"></a>
<span class="sourceLineNo">082</span>  int[][] regionsAndServersMocks = new int[][] {<a name="line.82"></a>
<span class="sourceLineNo">083</span>      // { num regions, num servers }<a name="line.83"></a>
<span class="sourceLineNo">084</span>      new int[] { 0, 0 }, new int[] { 0, 1 }, new int[] { 1, 1 }, new int[] { 2, 1 },<a name="line.84"></a>
<span class="sourceLineNo">085</span>      new int[] { 10, 1 }, new int[] { 1, 2 }, new int[] { 2, 2 }, new int[] { 3, 2 },<a name="line.85"></a>
<span class="sourceLineNo">086</span>      new int[] { 1, 3 }, new int[] { 2, 3 }, new int[] { 3, 3 }, new int[] { 25, 3 },<a name="line.86"></a>
<span class="sourceLineNo">087</span>      new int[] { 2, 10 }, new int[] { 2, 100 }, new int[] { 12, 10 }, new int[] { 12, 100 }, };<a name="line.87"></a>
<span class="sourceLineNo">088</span><a name="line.88"></a>
<span class="sourceLineNo">089</span>  @Rule<a name="line.89"></a>
<span class="sourceLineNo">090</span>  public TestName name = new TestName();<a name="line.90"></a>
<span class="sourceLineNo">091</span><a name="line.91"></a>
<span class="sourceLineNo">092</span>  @BeforeClass<a name="line.92"></a>
<span class="sourceLineNo">093</span>  public static void beforeAllTests() throws Exception {<a name="line.93"></a>
<span class="sourceLineNo">094</span>    Configuration conf = HBaseConfiguration.create();<a name="line.94"></a>
<span class="sourceLineNo">095</span>    conf.setClass("hbase.util.ip.to.rack.determiner", MockMapping.class, DNSToSwitchMapping.class);<a name="line.95"></a>
<span class="sourceLineNo">096</span>    loadBalancer = new MockBalancer();<a name="line.96"></a>
<span class="sourceLineNo">097</span>    loadBalancer.setConf(conf);<a name="line.97"></a>
<span class="sourceLineNo">098</span>    MasterServices st = Mockito.mock(MasterServices.class);<a name="line.98"></a>
<span class="sourceLineNo">099</span>    Mockito.when(st.getServerName()).thenReturn(master);<a name="line.99"></a>
<span class="sourceLineNo">100</span>    loadBalancer.setMasterServices(st);<a name="line.100"></a>
<span class="sourceLineNo">101</span><a name="line.101"></a>
<span class="sourceLineNo">102</span>    // Set up the rack topologies (5 machines per rack)<a name="line.102"></a>
<span class="sourceLineNo">103</span>    rackManager = Mockito.mock(RackManager.class);<a name="line.103"></a>
<span class="sourceLineNo">104</span>    for (int i = 0; i &lt; NUM_SERVERS; i++) {<a name="line.104"></a>
<span class="sourceLineNo">105</span>      servers[i] = ServerName.valueOf("foo"+i+":1234",-1);<a name="line.105"></a>
<span class="sourceLineNo">106</span>      if (i &lt; 5) {<a name="line.106"></a>
<span class="sourceLineNo">107</span>        Mockito.when(rackManager.getRack(servers[i])).thenReturn("rack1");<a name="line.107"></a>
<span class="sourceLineNo">108</span>      }<a name="line.108"></a>
<span class="sourceLineNo">109</span>      if (i &gt;= 5 &amp;&amp; i &lt; 10) {<a name="line.109"></a>
<span class="sourceLineNo">110</span>        Mockito.when(rackManager.getRack(servers[i])).thenReturn("rack2");<a name="line.110"></a>
<span class="sourceLineNo">111</span>      }<a name="line.111"></a>
<span class="sourceLineNo">112</span>      if (i &gt;= 10) {<a name="line.112"></a>
<span class="sourceLineNo">113</span>        Mockito.when(rackManager.getRack(servers[i])).thenReturn("rack3");<a name="line.113"></a>
<span class="sourceLineNo">114</span>      }<a name="line.114"></a>
<span class="sourceLineNo">115</span>    }<a name="line.115"></a>
<span class="sourceLineNo">116</span>  }<a name="line.116"></a>
<span class="sourceLineNo">117</span><a name="line.117"></a>
<span class="sourceLineNo">118</span>  public static class MockBalancer extends BaseLoadBalancer {<a name="line.118"></a>
<span class="sourceLineNo">119</span>    @Override<a name="line.119"></a>
<span class="sourceLineNo">120</span>    public List&lt;RegionPlan&gt;<a name="line.120"></a>
<span class="sourceLineNo">121</span>        balanceCluster(Map&lt;TableName, Map&lt;ServerName, List&lt;RegionInfo&gt;&gt;&gt; loadOfAllTable) {<a name="line.121"></a>
<span class="sourceLineNo">122</span>      return null;<a name="line.122"></a>
<span class="sourceLineNo">123</span>    }<a name="line.123"></a>
<span class="sourceLineNo">124</span><a name="line.124"></a>
<span class="sourceLineNo">125</span>    @Override<a name="line.125"></a>
<span class="sourceLineNo">126</span>    public List&lt;RegionPlan&gt; balanceTable(TableName tableName,<a name="line.126"></a>
<span class="sourceLineNo">127</span>        Map&lt;ServerName, List&lt;RegionInfo&gt;&gt; loadOfOneTable) {<a name="line.127"></a>
<span class="sourceLineNo">128</span>      return null;<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>  /**<a name="line.132"></a>
<span class="sourceLineNo">133</span>   * All regions have an assignment.<a name="line.133"></a>
<span class="sourceLineNo">134</span>   * @param regions<a name="line.134"></a>
<span class="sourceLineNo">135</span>   * @param servers<a name="line.135"></a>
<span class="sourceLineNo">136</span>   * @param assignments<a name="line.136"></a>
<span class="sourceLineNo">137</span>   */<a name="line.137"></a>
<span class="sourceLineNo">138</span>  private void assertImmediateAssignment(List&lt;RegionInfo&gt; regions, List&lt;ServerName&gt; servers,<a name="line.138"></a>
<span class="sourceLineNo">139</span>      Map&lt;RegionInfo, ServerName&gt; assignments) {<a name="line.139"></a>
<span class="sourceLineNo">140</span>    for (RegionInfo region : regions) {<a name="line.140"></a>
<span class="sourceLineNo">141</span>      assertTrue(assignments.containsKey(region));<a name="line.141"></a>
<span class="sourceLineNo">142</span>    }<a name="line.142"></a>
<span class="sourceLineNo">143</span>  }<a name="line.143"></a>
<span class="sourceLineNo">144</span><a name="line.144"></a>
<span class="sourceLineNo">145</span>  /**<a name="line.145"></a>
<span class="sourceLineNo">146</span>   * Tests the bulk assignment used during cluster startup.<a name="line.146"></a>
<span class="sourceLineNo">147</span>   *<a name="line.147"></a>
<span class="sourceLineNo">148</span>   * Round-robin. Should yield a balanced cluster so same invariant as the load<a name="line.148"></a>
<span class="sourceLineNo">149</span>   * balancer holds, all servers holding either floor(avg) or ceiling(avg).<a name="line.149"></a>
<span class="sourceLineNo">150</span>   *<a name="line.150"></a>
<span class="sourceLineNo">151</span>   * @throws Exception<a name="line.151"></a>
<span class="sourceLineNo">152</span>   */<a name="line.152"></a>
<span class="sourceLineNo">153</span>  @Test<a name="line.153"></a>
<span class="sourceLineNo">154</span>  public void testBulkAssignment() throws Exception {<a name="line.154"></a>
<span class="sourceLineNo">155</span>    List&lt;ServerName&gt; tmp = getListOfServerNames(randomServers(5, 0));<a name="line.155"></a>
<span class="sourceLineNo">156</span>    List&lt;RegionInfo&gt; hris = randomRegions(20);<a name="line.156"></a>
<span class="sourceLineNo">157</span>    hris.add(RegionInfoBuilder.FIRST_META_REGIONINFO);<a name="line.157"></a>
<span class="sourceLineNo">158</span>    tmp.add(master);<a name="line.158"></a>
<span class="sourceLineNo">159</span>    Map&lt;ServerName, List&lt;RegionInfo&gt;&gt; plans = loadBalancer.roundRobinAssignment(hris, tmp);<a name="line.159"></a>
<span class="sourceLineNo">160</span>    if (LoadBalancer.isTablesOnMaster(loadBalancer.getConf())) {<a name="line.160"></a>
<span class="sourceLineNo">161</span>      assertTrue(plans.get(master).contains(RegionInfoBuilder.FIRST_META_REGIONINFO));<a name="line.161"></a>
<span class="sourceLineNo">162</span>      assertEquals(1, plans.get(master).size());<a name="line.162"></a>
<span class="sourceLineNo">163</span>    }<a name="line.163"></a>
<span class="sourceLineNo">164</span>    int totalRegion = 0;<a name="line.164"></a>
<span class="sourceLineNo">165</span>    for (List&lt;RegionInfo&gt; regions: plans.values()) {<a name="line.165"></a>
<span class="sourceLineNo">166</span>      totalRegion += regions.size();<a name="line.166"></a>
<span class="sourceLineNo">167</span>    }<a name="line.167"></a>
<span class="sourceLineNo">168</span>    assertEquals(hris.size(), totalRegion);<a name="line.168"></a>
<span class="sourceLineNo">169</span>    for (int[] mock : regionsAndServersMocks) {<a name="line.169"></a>
<span class="sourceLineNo">170</span>      LOG.debug("testBulkAssignment with " + mock[0] + " regions and " + mock[1] + " servers");<a name="line.170"></a>
<span class="sourceLineNo">171</span>      List&lt;RegionInfo&gt; regions = randomRegions(mock[0]);<a name="line.171"></a>
<span class="sourceLineNo">172</span>      List&lt;ServerAndLoad&gt; servers = randomServers(mock[1], 0);<a name="line.172"></a>
<span class="sourceLineNo">173</span>      List&lt;ServerName&gt; list = getListOfServerNames(servers);<a name="line.173"></a>
<span class="sourceLineNo">174</span>      Map&lt;ServerName, List&lt;RegionInfo&gt;&gt; assignments =<a name="line.174"></a>
<span class="sourceLineNo">175</span>          loadBalancer.roundRobinAssignment(regions, list);<a name="line.175"></a>
<span class="sourceLineNo">176</span>      float average = (float) regions.size() / servers.size();<a name="line.176"></a>
<span class="sourceLineNo">177</span>      int min = (int) Math.floor(average);<a name="line.177"></a>
<span class="sourceLineNo">178</span>      int max = (int) Math.ceil(average);<a name="line.178"></a>
<span class="sourceLineNo">179</span>      if (assignments != null &amp;&amp; !assignments.isEmpty()) {<a name="line.179"></a>
<span class="sourceLineNo">180</span>        for (List&lt;RegionInfo&gt; regionList : assignments.values()) {<a name="line.180"></a>
<span class="sourceLineNo">181</span>          assertTrue(regionList.size() == min || regionList.size() == max);<a name="line.181"></a>
<span class="sourceLineNo">182</span>        }<a name="line.182"></a>
<span class="sourceLineNo">183</span>      }<a name="line.183"></a>
<span class="sourceLineNo">184</span>      returnRegions(regions);<a name="line.184"></a>
<span class="sourceLineNo">185</span>      returnServers(list);<a name="line.185"></a>
<span class="sourceLineNo">186</span>    }<a name="line.186"></a>
<span class="sourceLineNo">187</span>  }<a name="line.187"></a>
<span class="sourceLineNo">188</span><a name="line.188"></a>
<span class="sourceLineNo">189</span>  /**<a name="line.189"></a>
<span class="sourceLineNo">190</span>   * Test the cluster startup bulk assignment which attempts to retain<a name="line.190"></a>
<span class="sourceLineNo">191</span>   * assignment info.<a name="line.191"></a>
<span class="sourceLineNo">192</span>   * @throws Exception<a name="line.192"></a>
<span class="sourceLineNo">193</span>   */<a name="line.193"></a>
<span class="sourceLineNo">194</span>  @Test<a name="line.194"></a>
<span class="sourceLineNo">195</span>  public void testRetainAssignment() throws Exception {<a name="line.195"></a>
<span class="sourceLineNo">196</span>    // Test simple case where all same servers are there<a name="line.196"></a>
<span class="sourceLineNo">197</span>    List&lt;ServerAndLoad&gt; servers = randomServers(10, 10);<a name="line.197"></a>
<span class="sourceLineNo">198</span>    List&lt;RegionInfo&gt; regions = randomRegions(100);<a name="line.198"></a>
<span class="sourceLineNo">199</span>    Map&lt;RegionInfo, ServerName&gt; existing = new TreeMap&lt;&gt;(RegionInfo.COMPARATOR);<a name="line.199"></a>
<span class="sourceLineNo">200</span>    for (int i = 0; i &lt; regions.size(); i++) {<a name="line.200"></a>
<span class="sourceLineNo">201</span>      ServerName sn = servers.get(i % servers.size()).getServerName();<a name="line.201"></a>
<span class="sourceLineNo">202</span>      // The old server would have had same host and port, but different<a name="line.202"></a>
<span class="sourceLineNo">203</span>      // start code!<a name="line.203"></a>
<span class="sourceLineNo">204</span>      ServerName snWithOldStartCode =<a name="line.204"></a>
<span class="sourceLineNo">205</span>          ServerName.valueOf(sn.getHostname(), sn.getPort(), sn.getStartcode() - 10);<a name="line.205"></a>
<span class="sourceLineNo">206</span>      existing.put(regions.get(i), snWithOldStartCode);<a name="line.206"></a>
<span class="sourceLineNo">207</span>    }<a name="line.207"></a>
<span class="sourceLineNo">208</span>    List&lt;ServerName&gt; listOfServerNames = getListOfServerNames(servers);<a name="line.208"></a>
<span class="sourceLineNo">209</span>    Map&lt;ServerName, List&lt;RegionInfo&gt;&gt; assignment =<a name="line.209"></a>
<span class="sourceLineNo">210</span>        loadBalancer.retainAssignment(existing, listOfServerNames);<a name="line.210"></a>
<span class="sourceLineNo">211</span>    assertRetainedAssignment(existing, listOfServerNames, assignment);<a name="line.211"></a>
<span class="sourceLineNo">212</span><a name="line.212"></a>
<span class="sourceLineNo">213</span>    // Include two new servers that were not there before<a name="line.213"></a>
<span class="sourceLineNo">214</span>    List&lt;ServerAndLoad&gt; servers2 = new ArrayList&lt;&gt;(servers);<a name="line.214"></a>
<span class="sourceLineNo">215</span>    servers2.add(randomServer(10));<a name="line.215"></a>
<span class="sourceLineNo">216</span>    servers2.add(randomServer(10));<a name="line.216"></a>
<span class="sourceLineNo">217</span>    listOfServerNames = getListOfServerNames(servers2);<a name="line.217"></a>
<span class="sourceLineNo">218</span>    assignment = loadBalancer.retainAssignment(existing, listOfServerNames);<a name="line.218"></a>
<span class="sourceLineNo">219</span>    assertRetainedAssignment(existing, listOfServerNames, assignment);<a name="line.219"></a>
<span class="sourceLineNo">220</span><a name="line.220"></a>
<span class="sourceLineNo">221</span>    // Remove two of the servers that were previously there<a name="line.221"></a>
<span class="sourceLineNo">222</span>    List&lt;ServerAndLoad&gt; servers3 = new ArrayList&lt;&gt;(servers);<a name="line.222"></a>
<span class="sourceLineNo">223</span>    servers3.remove(0);<a name="line.223"></a>
<span class="sourceLineNo">224</span>    servers3.remove(0);<a name="line.224"></a>
<span class="sourceLineNo">225</span>    listOfServerNames = getListOfServerNames(servers3);<a name="line.225"></a>
<span class="sourceLineNo">226</span>    assignment = loadBalancer.retainAssignment(existing, listOfServerNames);<a name="line.226"></a>
<span class="sourceLineNo">227</span>    assertRetainedAssignment(existing, listOfServerNames, assignment);<a name="line.227"></a>
<span class="sourceLineNo">228</span>  }<a name="line.228"></a>
<span class="sourceLineNo">229</span><a name="line.229"></a>
<span class="sourceLineNo">230</span>  @Test<a name="line.230"></a>
<span class="sourceLineNo">231</span>  public void testRandomAssignment() throws Exception {<a name="line.231"></a>
<span class="sourceLineNo">232</span>    for (int i = 1; i != 5; ++i) {<a name="line.232"></a>
<span class="sourceLineNo">233</span>      LOG.info("run testRandomAssignment() with idle servers:" + i);<a name="line.233"></a>
<span class="sourceLineNo">234</span>      testRandomAssignment(i);<a name="line.234"></a>
<span class="sourceLineNo">235</span>    }<a name="line.235"></a>
<span class="sourceLineNo">236</span>  }<a name="line.236"></a>
<span class="sourceLineNo">237</span><a name="line.237"></a>
<span class="sourceLineNo">238</span>  private void testRandomAssignment(int numberOfIdleServers) throws Exception {<a name="line.238"></a>
<span class="sourceLineNo">239</span>    assert numberOfIdleServers &gt; 0;<a name="line.239"></a>
<span class="sourceLineNo">240</span>    List&lt;ServerName&gt; idleServers = new ArrayList&lt;&gt;(numberOfIdleServers);<a name="line.240"></a>
<span class="sourceLineNo">241</span>    for (int i = 0; i != numberOfIdleServers; ++i) {<a name="line.241"></a>
<span class="sourceLineNo">242</span>      idleServers.add(ServerName.valueOf("server-" + i, 1000, 1L));<a name="line.242"></a>
<span class="sourceLineNo">243</span>    }<a name="line.243"></a>
<span class="sourceLineNo">244</span>    List&lt;ServerName&gt; allServers = new ArrayList&lt;&gt;(idleServers.size() + 1);<a name="line.244"></a>
<span class="sourceLineNo">245</span>    allServers.add(ServerName.valueOf("server-" + numberOfIdleServers, 1000, 1L));<a name="line.245"></a>
<span class="sourceLineNo">246</span>    allServers.addAll(idleServers);<a name="line.246"></a>
<span class="sourceLineNo">247</span>    LoadBalancer balancer = new MockBalancer() {<a name="line.247"></a>
<span class="sourceLineNo">248</span>      @Override<a name="line.248"></a>
<span class="sourceLineNo">249</span>      public boolean shouldBeOnMaster(RegionInfo region) {<a name="line.249"></a>
<span class="sourceLineNo">250</span>        return false;<a name="line.250"></a>
<span class="sourceLineNo">251</span>      }<a name="line.251"></a>
<span class="sourceLineNo">252</span>    };<a name="line.252"></a>
<span class="sourceLineNo">253</span>    Configuration conf = HBaseConfiguration.create();<a name="line.253"></a>
<span class="sourceLineNo">254</span>    conf.setClass("hbase.util.ip.to.rack.determiner", MockMapping.class, DNSToSwitchMapping.class);<a name="line.254"></a>
<span class="sourceLineNo">255</span>    balancer.setConf(conf);<a name="line.255"></a>
<span class="sourceLineNo">256</span>    ServerManager sm = Mockito.mock(ServerManager.class);<a name="line.256"></a>
<span class="sourceLineNo">257</span>    Mockito.when(sm.getOnlineServersListWithPredicator(allServers, BaseLoadBalancer.IDLE_SERVER_PREDICATOR))<a name="line.257"></a>
<span class="sourceLineNo">258</span>           .thenReturn(idleServers);<a name="line.258"></a>
<span class="sourceLineNo">259</span>    MasterServices services = Mockito.mock(MasterServices.class);<a name="line.259"></a>
<span class="sourceLineNo">260</span>    Mockito.when(services.getServerManager()).thenReturn(sm);<a name="line.260"></a>
<span class="sourceLineNo">261</span>    balancer.setMasterServices(services);<a name="line.261"></a>
<span class="sourceLineNo">262</span>    RegionInfo hri1 = RegionInfoBuilder.newBuilder(TableName.valueOf(name.getMethodName()))<a name="line.262"></a>
<span class="sourceLineNo">263</span>        .setStartKey(Bytes.toBytes("key1"))<a name="line.263"></a>
<span class="sourceLineNo">264</span>        .setEndKey(Bytes.toBytes("key2"))<a name="line.264"></a>
<span class="sourceLineNo">265</span>        .setSplit(false)<a name="line.265"></a>
<span class="sourceLineNo">266</span>        .setRegionId(100)<a name="line.266"></a>
<span class="sourceLineNo">267</span>        .build();<a name="line.267"></a>
<span class="sourceLineNo">268</span>    assertNull(balancer.randomAssignment(hri1, Collections.EMPTY_LIST));<a name="line.268"></a>
<span class="sourceLineNo">269</span>    assertNull(balancer.randomAssignment(hri1, null));<a name="line.269"></a>
<span class="sourceLineNo">270</span>    for (int i = 0; i != 3; ++i) {<a name="line.270"></a>
<span class="sourceLineNo">271</span>      ServerName sn = balancer.randomAssignment(hri1, allServers);<a name="line.271"></a>
<span class="sourceLineNo">272</span>      assertTrue("actual:" + sn + ", except:" + idleServers, idleServers.contains(sn));<a name="line.272"></a>
<span class="sourceLineNo">273</span>    }<a name="line.273"></a>
<span class="sourceLineNo">274</span>  }<a name="line.274"></a>
<span class="sourceLineNo">275</span><a name="line.275"></a>
<span class="sourceLineNo">276</span>  @Test<a name="line.276"></a>
<span class="sourceLineNo">277</span>  public void testRegionAvailability() throws Exception {<a name="line.277"></a>
<span class="sourceLineNo">278</span>    // Create a cluster with a few servers, assign them to specific racks<a name="line.278"></a>
<span class="sourceLineNo">279</span>    // then assign some regions. The tests should check whether moving a<a name="line.279"></a>
<span class="sourceLineNo">280</span>    // replica from one node to a specific other node or rack lowers the<a name="line.280"></a>
<span class="sourceLineNo">281</span>    // availability of the region or not<a name="line.281"></a>
<span class="sourceLineNo">282</span><a name="line.282"></a>
<span class="sourceLineNo">283</span>    List&lt;RegionInfo&gt; list0 = new ArrayList&lt;&gt;();<a name="line.283"></a>
<span class="sourceLineNo">284</span>    List&lt;RegionInfo&gt; list1 = new ArrayList&lt;&gt;();<a name="line.284"></a>
<span class="sourceLineNo">285</span>    List&lt;RegionInfo&gt; list2 = new ArrayList&lt;&gt;();<a name="line.285"></a>
<span class="sourceLineNo">286</span>    // create a region (region1)<a name="line.286"></a>
<span class="sourceLineNo">287</span>    RegionInfo hri1 = RegionInfoBuilder.newBuilder(TableName.valueOf(name.getMethodName()))<a name="line.287"></a>
<span class="sourceLineNo">288</span>        .setStartKey(Bytes.toBytes("key1"))<a name="line.288"></a>
<span class="sourceLineNo">289</span>        .setEndKey(Bytes.toBytes("key2"))<a name="line.289"></a>
<span class="sourceLineNo">290</span>        .setSplit(false)<a name="line.290"></a>
<span class="sourceLineNo">291</span>        .setRegionId(100)<a name="line.291"></a>
<span class="sourceLineNo">292</span>        .build();<a name="line.292"></a>
<span class="sourceLineNo">293</span>    // create a replica of the region (replica_of_region1)<a name="line.293"></a>
<span class="sourceLineNo">294</span>    RegionInfo hri2 = RegionReplicaUtil.getRegionInfoForReplica(hri1, 1);<a name="line.294"></a>
<span class="sourceLineNo">295</span>    // create a second region (region2)<a name="line.295"></a>
<span class="sourceLineNo">296</span>    RegionInfo hri3 = RegionInfoBuilder.newBuilder(TableName.valueOf(name.getMethodName()))<a name="line.296"></a>
<span class="sourceLineNo">297</span>        .setStartKey(Bytes.toBytes("key2"))<a name="line.297"></a>
<span class="sourceLineNo">298</span>        .setEndKey(Bytes.toBytes("key3"))<a name="line.298"></a>
<span class="sourceLineNo">299</span>        .setSplit(false)<a name="line.299"></a>
<span class="sourceLineNo">300</span>        .setRegionId(101)<a name="line.300"></a>
<span class="sourceLineNo">301</span>        .build();<a name="line.301"></a>
<span class="sourceLineNo">302</span>    list0.add(hri1); //only region1<a name="line.302"></a>
<span class="sourceLineNo">303</span>    list1.add(hri2); //only replica_of_region1<a name="line.303"></a>
<span class="sourceLineNo">304</span>    list2.add(hri3); //only region2<a name="line.304"></a>
<span class="sourceLineNo">305</span>    Map&lt;ServerName, List&lt;RegionInfo&gt;&gt; clusterState = new LinkedHashMap&lt;&gt;();<a name="line.305"></a>
<span class="sourceLineNo">306</span>    clusterState.put(servers[0], list0); //servers[0] hosts region1<a name="line.306"></a>
<span class="sourceLineNo">307</span>    clusterState.put(servers[1], list1); //servers[1] hosts replica_of_region1<a name="line.307"></a>
<span class="sourceLineNo">308</span>    clusterState.put(servers[2], list2); //servers[2] hosts region2<a name="line.308"></a>
<span class="sourceLineNo">309</span>    // create a cluster with the above clusterState. The way in which the<a name="line.309"></a>
<span class="sourceLineNo">310</span>    // cluster is created (constructor code) would make sure the indices of<a name="line.310"></a>
<span class="sourceLineNo">311</span>    // the servers are in the order in which it is inserted in the clusterState<a name="line.311"></a>
<span class="sourceLineNo">312</span>    // map (linkedhashmap is important). A similar thing applies to the region lists<a name="line.312"></a>
<span class="sourceLineNo">313</span>    Cluster cluster = new Cluster(clusterState, null, null, rackManager);<a name="line.313"></a>
<span class="sourceLineNo">314</span>    // check whether a move of region1 from servers[0] to servers[1] would lower<a name="line.314"></a>
<span class="sourceLineNo">315</span>    // the availability of region1<a name="line.315"></a>
<span class="sourceLineNo">316</span>    assertTrue(cluster.wouldLowerAvailability(hri1, servers[1]));<a name="line.316"></a>
<span class="sourceLineNo">317</span>    // check whether a move of region1 from servers[0] to servers[2] would lower<a name="line.317"></a>
<span class="sourceLineNo">318</span>    // the availability of region1<a name="line.318"></a>
<span class="sourceLineNo">319</span>    assertTrue(!cluster.wouldLowerAvailability(hri1, servers[2]));<a name="line.319"></a>
<span class="sourceLineNo">320</span>    // check whether a move of replica_of_region1 from servers[0] to servers[2] would lower<a name="line.320"></a>
<span class="sourceLineNo">321</span>    // the availability of replica_of_region1<a name="line.321"></a>
<span class="sourceLineNo">322</span>    assertTrue(!cluster.wouldLowerAvailability(hri2, servers[2]));<a name="line.322"></a>
<span class="sourceLineNo">323</span>    // check whether a move of region2 from servers[0] to servers[1] would lower<a name="line.323"></a>
<span class="sourceLineNo">324</span>    // the availability of region2<a name="line.324"></a>
<span class="sourceLineNo">325</span>    assertTrue(!cluster.wouldLowerAvailability(hri3, servers[1]));<a name="line.325"></a>
<span class="sourceLineNo">326</span><a name="line.326"></a>
<span class="sourceLineNo">327</span>    // now lets have servers[1] host replica_of_region2<a name="line.327"></a>
<span class="sourceLineNo">328</span>    list1.add(RegionReplicaUtil.getRegionInfoForReplica(hri3, 1));<a name="line.328"></a>
<span class="sourceLineNo">329</span>    // create a new clusterState with the above change<a name="line.329"></a>
<span class="sourceLineNo">330</span>    cluster = new Cluster(clusterState, null, null, rackManager);<a name="line.330"></a>
<span class="sourceLineNo">331</span>    // now check whether a move of a replica from servers[0] to servers[1] would lower<a name="line.331"></a>
<span class="sourceLineNo">332</span>    // the availability of region2<a name="line.332"></a>
<span class="sourceLineNo">333</span>    assertTrue(cluster.wouldLowerAvailability(hri3, servers[1]));<a name="line.333"></a>
<span class="sourceLineNo">334</span><a name="line.334"></a>
<span class="sourceLineNo">335</span>    // start over again<a name="line.335"></a>
<span class="sourceLineNo">336</span>    clusterState.clear();<a name="line.336"></a>
<span class="sourceLineNo">337</span>    clusterState.put(servers[0], list0); //servers[0], rack1 hosts region1<a name="line.337"></a>
<span class="sourceLineNo">338</span>    clusterState.put(servers[5], list1); //servers[5], rack2 hosts replica_of_region1 and replica_of_region2<a name="line.338"></a>
<span class="sourceLineNo">339</span>    clusterState.put(servers[6], list2); //servers[6], rack2 hosts region2<a name="line.339"></a>
<span class="sourceLineNo">340</span>    clusterState.put(servers[10], new ArrayList&lt;&gt;()); //servers[10], rack3 hosts no region<a name="line.340"></a>
<span class="sourceLineNo">341</span>    // create a cluster with the above clusterState<a name="line.341"></a>
<span class="sourceLineNo">342</span>    cluster = new Cluster(clusterState, null, null, rackManager);<a name="line.342"></a>
<span class="sourceLineNo">343</span>    // check whether a move of region1 from servers[0],rack1 to servers[6],rack2 would<a name="line.343"></a>
<span class="sourceLineNo">344</span>    // lower the availability<a name="line.344"></a>
<span class="sourceLineNo">345</span><a name="line.345"></a>
<span class="sourceLineNo">346</span>    assertTrue(cluster.wouldLowerAvailability(hri1, servers[0]));<a name="line.346"></a>
<span class="sourceLineNo">347</span><a name="line.347"></a>
<span class="sourceLineNo">348</span>    // now create a cluster without the rack manager<a name="line.348"></a>
<span class="sourceLineNo">349</span>    cluster = new Cluster(clusterState, null, null, null);<a name="line.349"></a>
<span class="sourceLineNo">350</span>    // now repeat check whether a move of region1 from servers[0] to servers[6] would<a name="line.350"></a>
<span class="sourceLineNo">351</span>    // lower the availability<a name="line.351"></a>
<span class="sourceLineNo">352</span>    assertTrue(!cluster.wouldLowerAvailability(hri1, servers[6]));<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>  @Test<a name="line.355"></a>
<span class="sourceLineNo">356</span>  public void testRegionAvailabilityWithRegionMoves() throws Exception {<a name="line.356"></a>
<span class="sourceLineNo">357</span>    List&lt;RegionInfo&gt; list0 = new ArrayList&lt;&gt;();<a name="line.357"></a>
<span class="sourceLineNo">358</span>    List&lt;RegionInfo&gt; list1 = new ArrayList&lt;&gt;();<a name="line.358"></a>
<span class="sourceLineNo">359</span>    List&lt;RegionInfo&gt; list2 = new ArrayList&lt;&gt;();<a name="line.359"></a>
<span class="sourceLineNo">360</span>    // create a region (region1)<a name="line.360"></a>
<span class="sourceLineNo">361</span>    RegionInfo hri1 = RegionInfoBuilder.newBuilder(TableName.valueOf(name.getMethodName()))<a name="line.361"></a>
<span class="sourceLineNo">362</span>        .setStartKey(Bytes.toBytes("key1"))<a name="line.362"></a>
<span class="sourceLineNo">363</span>        .setEndKey(Bytes.toBytes("key2"))<a name="line.363"></a>
<span class="sourceLineNo">364</span>        .setSplit(false)<a name="line.364"></a>
<span class="sourceLineNo">365</span>        .setRegionId(100)<a name="line.365"></a>
<span class="sourceLineNo">366</span>        .build();<a name="line.366"></a>
<span class="sourceLineNo">367</span>    // create a replica of the region (replica_of_region1)<a name="line.367"></a>
<span class="sourceLineNo">368</span>    RegionInfo hri2 = RegionReplicaUtil.getRegionInfoForReplica(hri1, 1);<a name="line.368"></a>
<span class="sourceLineNo">369</span>    // create a second region (region2)<a name="line.369"></a>
<span class="sourceLineNo">370</span>    RegionInfo hri3 = RegionInfoBuilder.newBuilder(TableName.valueOf(name.getMethodName()))<a name="line.370"></a>
<span class="sourceLineNo">371</span>        .setStartKey(Bytes.toBytes("key2"))<a name="line.371"></a>
<span class="sourceLineNo">372</span>        .setEndKey(Bytes.toBytes("key3"))<a name="line.372"></a>
<span class="sourceLineNo">373</span>        .setSplit(false)<a name="line.373"></a>
<span class="sourceLineNo">374</span>        .setRegionId(101)<a name="line.374"></a>
<span class="sourceLineNo">375</span>        .build();<a name="line.375"></a>
<span class="sourceLineNo">376</span>    list0.add(hri1); //only region1<a name="line.376"></a>
<span class="sourceLineNo">377</span>    list1.add(hri2); //only replica_of_region1<a name="line.377"></a>
<span class="sourceLineNo">378</span>    list2.add(hri3); //only region2<a name="line.378"></a>
<span class="sourceLineNo">379</span>    Map&lt;ServerName, List&lt;RegionInfo&gt;&gt; clusterState = new LinkedHashMap&lt;&gt;();<a name="line.379"></a>
<span class="sourceLineNo">380</span>    clusterState.put(servers[0], list0); //servers[0] hosts region1<a name="line.380"></a>
<span class="sourceLineNo">381</span>    clusterState.put(servers[1], list1); //servers[1] hosts replica_of_region1<a name="line.381"></a>
<span class="sourceLineNo">382</span>    clusterState.put(servers[2], list2); //servers[2] hosts region2<a name="line.382"></a>
<span class="sourceLineNo">383</span>    // create a cluster with the above clusterState. The way in which the<a name="line.383"></a>
<span class="sourceLineNo">384</span>    // cluster is created (constructor code) would make sure the indices of<a name="line.384"></a>
<span class="sourceLineNo">385</span>    // the servers are in the order in which it is inserted in the clusterState<a name="line.385"></a>
<span class="sourceLineNo">386</span>    // map (linkedhashmap is important).<a name="line.386"></a>
<span class="sourceLineNo">387</span>    Cluster cluster = new Cluster(clusterState, null, null, rackManager);<a name="line.387"></a>
<span class="sourceLineNo">388</span>    // check whether moving region1 from servers[1] to servers[2] would lower availability<a name="line.388"></a>
<span class="sourceLineNo">389</span>    assertTrue(!cluster.wouldLowerAvailability(hri1, servers[2]));<a name="line.389"></a>
<span class="sourceLineNo">390</span><a name="line.390"></a>
<span class="sourceLineNo">391</span>    // now move region1 from servers[0] to servers[2]<a name="line.391"></a>
<span class="sourceLineNo">392</span>    cluster.doAction(new MoveRegionAction(0, 0, 2));<a name="line.392"></a>
<span class="sourceLineNo">393</span>    // check that the numMaxRegionsPerTable for "table" has increased to 2<a name="line.393"></a>
<span class="sourceLineNo">394</span>    assertEquals(2, cluster.numMaxRegionsPerTable[0]);<a name="line.394"></a>
<span class="sourceLineNo">395</span>    // now repeat check whether moving region1 from servers[1] to servers[2]<a name="line.395"></a>
<span class="sourceLineNo">396</span>    // would lower availability<a name="line.396"></a>
<span class="sourceLineNo">397</span>    assertTrue(cluster.wouldLowerAvailability(hri1, servers[2]));<a name="line.397"></a>
<span class="sourceLineNo">398</span><a name="line.398"></a>
<span class="sourceLineNo">399</span>    // start over again<a name="line.399"></a>
<span class="sourceLineNo">400</span>    clusterState.clear();<a name="line.400"></a>
<span class="sourceLineNo">401</span>    List&lt;RegionInfo&gt; list3 = new ArrayList&lt;&gt;();<a name="line.401"></a>
<span class="sourceLineNo">402</span>    RegionInfo hri4 = RegionReplicaUtil.getRegionInfoForReplica(hri3, 1);<a name="line.402"></a>
<span class="sourceLineNo">403</span>    list3.add(hri4);<a name="line.403"></a>
<span class="sourceLineNo">404</span>    clusterState.put(servers[0], list0); //servers[0], rack1 hosts region1<a name="line.404"></a>
<span class="sourceLineNo">405</span>    clusterState.put(servers[5], list1); //servers[5], rack2 hosts replica_of_region1<a name="line.405"></a>
<span class="sourceLineNo">406</span>    clusterState.put(servers[6], list2); //servers[6], rack2 hosts region2<a name="line.406"></a>
<span class="sourceLineNo">407</span>    clusterState.put(servers[12], list3); //servers[12], rack3 hosts replica_of_region2<a name="line.407"></a>
<span class="sourceLineNo">408</span>    // create a cluster with the above clusterState<a name="line.408"></a>
<span class="sourceLineNo">409</span>    cluster = new Cluster(clusterState, null, null, rackManager);<a name="line.409"></a>
<span class="sourceLineNo">410</span>    // check whether a move of replica_of_region2 from servers[12],rack3 to servers[0],rack1 would<a name="line.410"></a>
<span class="sourceLineNo">411</span>    // lower the availability<a name="line.411"></a>
<span class="sourceLineNo">412</span>    assertTrue(!cluster.wouldLowerAvailability(hri4, servers[0]));<a name="line.412"></a>
<span class="sourceLineNo">413</span>    // now move region2 from servers[6],rack2 to servers[0],rack1<a name="line.413"></a>
<span class="sourceLineNo">414</span>    cluster.doAction(new MoveRegionAction(2, 2, 0));<a name="line.414"></a>
<span class="sourceLineNo">415</span>    // now repeat check if replica_of_region2 from servers[12],rack3 to servers[0],rack1 would<a name="line.415"></a>
<span class="sourceLineNo">416</span>    // lower the availability<a name="line.416"></a>
<span class="sourceLineNo">417</span>    assertTrue(cluster.wouldLowerAvailability(hri3, servers[0]));<a name="line.417"></a>
<span class="sourceLineNo">418</span>  }<a name="line.418"></a>
<span class="sourceLineNo">419</span><a name="line.419"></a>
<span class="sourceLineNo">420</span>  private List&lt;ServerName&gt; getListOfServerNames(final List&lt;ServerAndLoad&gt; sals) {<a name="line.420"></a>
<span class="sourceLineNo">421</span>    return sals.stream().map(ServerAndLoad::getServerName).collect(Collectors.toList());<a name="line.421"></a>
<span class="sourceLineNo">422</span>  }<a name="line.422"></a>
<span class="sourceLineNo">423</span><a name="line.423"></a>
<span class="sourceLineNo">424</span>  /**<a name="line.424"></a>
<span class="sourceLineNo">425</span>   * Asserts a valid retained assignment plan.<a name="line.425"></a>
<span class="sourceLineNo">426</span>   * &lt;p&gt;<a name="line.426"></a>
<span class="sourceLineNo">427</span>   * Must meet the following conditions:<a name="line.427"></a>
<span class="sourceLineNo">428</span>   * &lt;ul&gt;<a name="line.428"></a>
<span class="sourceLineNo">429</span>   * &lt;li&gt;Every input region has an assignment, and to an online server<a name="line.429"></a>
<span class="sourceLineNo">430</span>   * &lt;li&gt;If a region had an existing assignment to a server with the same<a name="line.430"></a>
<span class="sourceLineNo">431</span>   * address a a currently online server, it will be assigned to it<a name="line.431"></a>
<span class="sourceLineNo">432</span>   * &lt;/ul&gt;<a name="line.432"></a>
<span class="sourceLineNo">433</span>   * @param existing<a name="line.433"></a>
<span class="sourceLineNo">434</span>   * @param servers<a name="line.434"></a>
<span class="sourceLineNo">435</span>   * @param assignment<a name="line.435"></a>
<span class="sourceLineNo">436</span>   */<a name="line.436"></a>
<span class="sourceLineNo">437</span>  private void assertRetainedAssignment(Map&lt;RegionInfo, ServerName&gt; existing,<a name="line.437"></a>
<span class="sourceLineNo">438</span>      List&lt;ServerName&gt; servers, Map&lt;ServerName, List&lt;RegionInfo&gt;&gt; assignment) {<a name="line.438"></a>
<span class="sourceLineNo">439</span>    // Verify condition 1, every region assigned, and to online server<a name="line.439"></a>
<span class="sourceLineNo">440</span>    Set&lt;ServerName&gt; onlineServerSet = new TreeSet&lt;&gt;(servers);<a name="line.440"></a>
<span class="sourceLineNo">441</span>    Set&lt;RegionInfo&gt; assignedRegions = new TreeSet&lt;&gt;(RegionInfo.COMPARATOR);<a name="line.441"></a>
<span class="sourceLineNo">442</span>    for (Map.Entry&lt;ServerName, List&lt;RegionInfo&gt;&gt; a : assignment.entrySet()) {<a name="line.442"></a>
<span class="sourceLineNo">443</span>      assertTrue("Region assigned to server that was not listed as online",<a name="line.443"></a>
<span class="sourceLineNo">444</span>        onlineServerSet.contains(a.getKey()));<a name="line.444"></a>
<span class="sourceLineNo">445</span>      for (RegionInfo r : a.getValue())<a name="line.445"></a>
<span class="sourceLineNo">446</span>        assignedRegions.add(r);<a name="line.446"></a>
<span class="sourceLineNo">447</span>    }<a name="line.447"></a>
<span class="sourceLineNo">448</span>    assertEquals(existing.size(), assignedRegions.size());<a name="line.448"></a>
<span class="sourceLineNo">449</span><a name="line.449"></a>
<span class="sourceLineNo">450</span>    // Verify condition 2, if server had existing assignment, must have same<a name="line.450"></a>
<span class="sourceLineNo">451</span>    Set&lt;String&gt; onlineHostNames = new TreeSet&lt;&gt;();<a name="line.451"></a>
<span class="sourceLineNo">452</span>    for (ServerName s : servers) {<a name="line.452"></a>
<span class="sourceLineNo">453</span>      onlineHostNames.add(s.getHostname());<a name="line.453"></a>
<span class="sourceLineNo">454</span>    }<a name="line.454"></a>
<span class="sourceLineNo">455</span><a name="line.455"></a>
<span class="sourceLineNo">456</span>    for (Map.Entry&lt;ServerName, List&lt;RegionInfo&gt;&gt; a : assignment.entrySet()) {<a name="line.456"></a>
<span class="sourceLineNo">457</span>      ServerName assignedTo = a.getKey();<a name="line.457"></a>
<span class="sourceLineNo">458</span>      for (RegionInfo r : a.getValue()) {<a name="line.458"></a>
<span class="sourceLineNo">459</span>        ServerName address = existing.get(r);<a name="line.459"></a>
<span class="sourceLineNo">460</span>        if (address != null &amp;&amp; onlineHostNames.contains(address.getHostname())) {<a name="line.460"></a>
<span class="sourceLineNo">461</span>          // this region was prevously assigned somewhere, and that<a name="line.461"></a>
<span class="sourceLineNo">462</span>          // host is still around, then it should be re-assigned on the<a name="line.462"></a>
<span class="sourceLineNo">463</span>          // same host<a name="line.463"></a>
<span class="sourceLineNo">464</span>          assertEquals(address.getHostname(), assignedTo.getHostname());<a name="line.464"></a>
<span class="sourceLineNo">465</span>        }<a name="line.465"></a>
<span class="sourceLineNo">466</span>      }<a name="line.466"></a>
<span class="sourceLineNo">467</span>    }<a name="line.467"></a>
<span class="sourceLineNo">468</span>  }<a name="line.468"></a>
<span class="sourceLineNo">469</span><a name="line.469"></a>
<span class="sourceLineNo">470</span>  @Test<a name="line.470"></a>
<span class="sourceLineNo">471</span>  public void testClusterServersWithSameHostPort() {<a name="line.471"></a>
<span class="sourceLineNo">472</span>    // tests whether the BaseLoadBalancer.Cluster can be constructed with servers<a name="line.472"></a>
<span class="sourceLineNo">473</span>    // sharing same host and port<a name="line.473"></a>
<span class="sourceLineNo">474</span>    List&lt;ServerName&gt; servers = getListOfServerNames(randomServers(10, 10));<a name="line.474"></a>
<span class="sourceLineNo">475</span>    List&lt;RegionInfo&gt; regions = randomRegions(101);<a name="line.475"></a>
<span class="sourceLineNo">476</span>    Map&lt;ServerName, List&lt;RegionInfo&gt;&gt; clusterState = new TreeMap&lt;&gt;();<a name="line.476"></a>
<span class="sourceLineNo">477</span><a name="line.477"></a>
<span class="sourceLineNo">478</span>    assignRegions(regions, servers, clusterState);<a name="line.478"></a>
<span class="sourceLineNo">479</span><a name="line.479"></a>
<span class="sourceLineNo">480</span>    // construct another list of servers, but sharing same hosts and ports<a name="line.480"></a>
<span class="sourceLineNo">481</span>    List&lt;ServerName&gt; oldServers = new ArrayList&lt;&gt;(servers.size());<a name="line.481"></a>
<span class="sourceLineNo">482</span>    for (ServerName sn : servers) {<a name="line.482"></a>
<span class="sourceLineNo">483</span>      // The old server would have had same host and port, but different start code!<a name="line.483"></a>
<span class="sourceLineNo">484</span>      oldServers.add(ServerName.valueOf(sn.getHostname(), sn.getPort(), sn.getStartcode() - 10));<a name="line.484"></a>
<span class="sourceLineNo">485</span>    }<a name="line.485"></a>
<span class="sourceLineNo">486</span><a name="line.486"></a>
<span class="sourceLineNo">487</span>    regions = randomRegions(9); // some more regions<a name="line.487"></a>
<span class="sourceLineNo">488</span>    assignRegions(regions, oldServers, clusterState);<a name="line.488"></a>
<span class="sourceLineNo">489</span><a name="line.489"></a>
<span class="sourceLineNo">490</span>    // should not throw exception:<a name="line.490"></a>
<span class="sourceLineNo">491</span>    BaseLoadBalancer.Cluster cluster = new Cluster(clusterState, null, null, null);<a name="line.491"></a>
<span class="sourceLineNo">492</span>    assertEquals(101 + 9, cluster.numRegions);<a name="line.492"></a>
<span class="sourceLineNo">493</span>    assertEquals(10, cluster.numServers); // only 10 servers because they share the same host + port<a name="line.493"></a>
<span class="sourceLineNo">494</span><a name="line.494"></a>
<span class="sourceLineNo">495</span>    // test move<a name="line.495"></a>
<span class="sourceLineNo">496</span>    ServerName sn = oldServers.get(0);<a name="line.496"></a>
<span class="sourceLineNo">497</span>    int r0 = ArrayUtils.indexOf(cluster.regions, clusterState.get(sn).get(0));<a name="line.497"></a>
<span class="sourceLineNo">498</span>    int f0 = cluster.serversToIndex.get(sn.getAddress());<a name="line.498"></a>
<span class="sourceLineNo">499</span>    int t0 = cluster.serversToIndex.get(servers.get(1).getAddress());<a name="line.499"></a>
<span class="sourceLineNo">500</span>    cluster.doAction(new MoveRegionAction(r0, f0, t0));<a name="line.500"></a>
<span class="sourceLineNo">501</span>  }<a name="line.501"></a>
<span class="sourceLineNo">502</span><a name="line.502"></a>
<span class="sourceLineNo">503</span>  private void assignRegions(List&lt;RegionInfo&gt; regions, List&lt;ServerName&gt; servers,<a name="line.503"></a>
<span class="sourceLineNo">504</span>      Map&lt;ServerName, List&lt;RegionInfo&gt;&gt; clusterState) {<a name="line.504"></a>
<span class="sourceLineNo">505</span>    for (int i = 0; i &lt; regions.size(); i++) {<a name="line.505"></a>
<span class="sourceLineNo">506</span>      ServerName sn = servers.get(i % servers.size());<a name="line.506"></a>
<span class="sourceLineNo">507</span>      List&lt;RegionInfo&gt; regionsOfServer = clusterState.get(sn);<a name="line.507"></a>
<span class="sourceLineNo">508</span>      if (regionsOfServer == null) {<a name="line.508"></a>
<span class="sourceLineNo">509</span>        regionsOfServer = new ArrayList&lt;&gt;(10);<a name="line.509"></a>
<span class="sourceLineNo">510</span>        clusterState.put(sn, regionsOfServer);<a name="line.510"></a>
<span class="sourceLineNo">511</span>      }<a name="line.511"></a>
<span class="sourceLineNo">512</span><a name="line.512"></a>
<span class="sourceLineNo">513</span>      regionsOfServer.add(regions.get(i));<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>  @Test<a name="line.517"></a>
<span class="sourceLineNo">518</span>  public void testClusterRegionLocations() {<a name="line.518"></a>
<span class="sourceLineNo">519</span>    // tests whether region locations are handled correctly in Cluster<a name="line.519"></a>
<span class="sourceLineNo">520</span>    List&lt;ServerName&gt; servers = getListOfServerNames(randomServers(10, 10));<a name="line.520"></a>
<span class="sourceLineNo">521</span>    List&lt;RegionInfo&gt; regions = randomRegions(101);<a name="line.521"></a>
<span class="sourceLineNo">522</span>    Map&lt;ServerName, List&lt;RegionInfo&gt;&gt; clusterState = new HashMap&lt;&gt;();<a name="line.522"></a>
<span class="sourceLineNo">523</span><a name="line.523"></a>
<span class="sourceLineNo">524</span>    assignRegions(regions, servers, clusterState);<a name="line.524"></a>
<span class="sourceLineNo">525</span><a name="line.525"></a>
<span class="sourceLineNo">526</span>    // mock block locality for some regions<a name="line.526"></a>
<span class="sourceLineNo">527</span>    RegionHDFSBlockLocationFinder locationFinder = mock(RegionHDFSBlockLocationFinder.class);<a name="line.527"></a>
<span class="sourceLineNo">528</span>    // block locality: region:0   =&gt; {server:0}<a name="line.528"></a>
<span class="sourceLineNo">529</span>    //                 region:1   =&gt; {server:0, server:1}<a name="line.529"></a>
<span class="sourceLineNo">530</span>    //                 region:42 =&gt; {server:4, server:9, server:5}<a name="line.530"></a>
<span class="sourceLineNo">531</span>    when(locationFinder.getTopBlockLocations(regions.get(0))).thenReturn(<a name="line.531"></a>
<span class="sourceLineNo">532</span>        Lists.newArrayList(servers.get(0)));<a name="line.532"></a>
<span class="sourceLineNo">533</span>    when(locationFinder.getTopBlockLocations(regions.get(1))).thenReturn(<a name="line.533"></a>
<span class="sourceLineNo">534</span>        Lists.newArrayList(servers.get(0), servers.get(1)));<a name="line.534"></a>
<span class="sourceLineNo">535</span>    when(locationFinder.getTopBlockLocations(regions.get(42))).thenReturn(<a name="line.535"></a>
<span class="sourceLineNo">536</span>        Lists.newArrayList(servers.get(4), servers.get(9), servers.get(5)));<a name="line.536"></a>
<span class="sourceLineNo">537</span>    when(locationFinder.getTopBlockLocations(regions.get(43))).thenReturn(<a name="line.537"></a>
<span class="sourceLineNo">538</span>        Lists.newArrayList(ServerName.valueOf("foo", 0, 0))); // this server does not exists in clusterStatus<a name="line.538"></a>
<span class="sourceLineNo">539</span><a name="line.539"></a>
<span class="sourceLineNo">540</span>    BaseLoadBalancer.Cluster cluster = new Cluster(clusterState, null, locationFinder, null);<a name="line.540"></a>
<span class="sourceLineNo">541</span><a name="line.541"></a>
<span class="sourceLineNo">542</span>    int r0 = ArrayUtils.indexOf(cluster.regions, regions.get(0)); // this is ok, it is just a test<a name="line.542"></a>
<span class="sourceLineNo">543</span>    int r1 = ArrayUtils.indexOf(cluster.regions, regions.get(1));<a name="line.543"></a>
<span class="sourceLineNo">544</span>    int r10 = ArrayUtils.indexOf(cluster.regions, regions.get(10));<a name="line.544"></a>
<span class="sourceLineNo">545</span>    int r42 = ArrayUtils.indexOf(cluster.regions, regions.get(42));<a name="line.545"></a>
<span class="sourceLineNo">546</span>    int r43 = ArrayUtils.indexOf(cluster.regions, regions.get(43));<a name="line.546"></a>
<span class="sourceLineNo">547</span><a name="line.547"></a>
<span class="sourceLineNo">548</span>    int s0 = cluster.serversToIndex.get(servers.get(0).getAddress());<a name="line.548"></a>
<span class="sourceLineNo">549</span>    int s1 = cluster.serversToIndex.get(servers.get(1).getAddress());<a name="line.549"></a>
<span class="sourceLineNo">550</span>    int s4 = cluster.serversToIndex.get(servers.get(4).getAddress());<a name="line.550"></a>
<span class="sourceLineNo">551</span>    int s5 = cluster.serversToIndex.get(servers.get(5).getAddress());<a name="line.551"></a>
<span class="sourceLineNo">552</span>    int s9 = cluster.serversToIndex.get(servers.get(9).getAddress());<a name="line.552"></a>
<span class="sourceLineNo">553</span><a name="line.553"></a>
<span class="sourceLineNo">554</span>    // region 0 locations<a name="line.554"></a>
<span class="sourceLineNo">555</span>    assertEquals(1, cluster.regionLocations[r0].length);<a name="line.555"></a>
<span class="sourceLineNo">556</span>    assertEquals(s0, cluster.regionLocations[r0][0]);<a name="line.556"></a>
<span class="sourceLineNo">557</span><a name="line.557"></a>
<span class="sourceLineNo">558</span>    // region 1 locations<a name="line.558"></a>
<span class="sourceLineNo">559</span>    assertEquals(2, cluster.regionLocations[r1].length);<a name="line.559"></a>
<span class="sourceLineNo">560</span>    assertEquals(s0, cluster.regionLocations[r1][0]);<a name="line.560"></a>
<span class="sourceLineNo">561</span>    assertEquals(s1, cluster.regionLocations[r1][1]);<a name="line.561"></a>
<span class="sourceLineNo">562</span><a name="line.562"></a>
<span class="sourceLineNo">563</span>    // region 10 locations<a name="line.563"></a>
<span class="sourceLineNo">564</span>    assertEquals(0, cluster.regionLocations[r10].length);<a name="line.564"></a>
<span class="sourceLineNo">565</span><a name="line.565"></a>
<span class="sourceLineNo">566</span>    // region 42 locations<a name="line.566"></a>
<span class="sourceLineNo">567</span>    assertEquals(3, cluster.regionLocations[r42].length);<a name="line.567"></a>
<span class="sourceLineNo">568</span>    assertEquals(s4, cluster.regionLocations[r42][0]);<a name="line.568"></a>
<span class="sourceLineNo">569</span>    assertEquals(s9, cluster.regionLocations[r42][1]);<a name="line.569"></a>
<span class="sourceLineNo">570</span>    assertEquals(s5, cluster.regionLocations[r42][2]);<a name="line.570"></a>
<span class="sourceLineNo">571</span><a name="line.571"></a>
<span class="sourceLineNo">572</span>    // region 43 locations<a name="line.572"></a>
<span class="sourceLineNo">573</span>    assertEquals(1, cluster.regionLocations[r43].length);<a name="line.573"></a>
<span class="sourceLineNo">574</span>    assertEquals(-1, cluster.regionLocations[r43][0]);<a name="line.574"></a>
<span class="sourceLineNo">575</span>  }<a name="line.575"></a>
<span class="sourceLineNo">576</span>}<a name="line.576"></a>




























































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