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