diff --git hbase-server/src/main/java/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.java hbase-server/src/main/java/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.java index 0ffbc2e..7c6858e 100644 --- hbase-server/src/main/java/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.java +++ hbase-server/src/main/java/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.java @@ -561,15 +561,14 @@ public class StochasticLoadBalancer extends BaseLoadBalancer { return pickOtherRandomServer(cluster, thisServer); } - int idx = 0; - - while (idx < regionLocations.length && regionLocations[idx] == thisServer) { - idx++; + for (int loc : regionLocations) { + if (loc >= 0 && loc != thisServer) { // find the first suitable server + return loc; + } } - return idx < regionLocations.length - ? regionLocations[idx] - : pickOtherRandomServer(cluster, thisServer); + // no location found + return pickOtherRandomServer(cluster, thisServer); } void setServices(MasterServices services) { diff --git hbase-server/src/test/java/org/apache/hadoop/hbase/master/balancer/TestBaseLoadBalancer.java hbase-server/src/test/java/org/apache/hadoop/hbase/master/balancer/TestBaseLoadBalancer.java index 4fbf5d1..0d72e3f 100644 --- hbase-server/src/test/java/org/apache/hadoop/hbase/master/balancer/TestBaseLoadBalancer.java +++ hbase-server/src/test/java/org/apache/hadoop/hbase/master/balancer/TestBaseLoadBalancer.java @@ -448,6 +448,8 @@ public class TestBaseLoadBalancer extends BalancerTestBase { Lists.newArrayList(servers.get(0), servers.get(1))); when(locationFinder.getTopBlockLocations(regions.get(42))).thenReturn( Lists.newArrayList(servers.get(4), servers.get(9), servers.get(5))); + when(locationFinder.getTopBlockLocations(regions.get(43))).thenReturn( + Lists.newArrayList(ServerName.valueOf("foo", 0, 0))); // this server does not exists in clusterStatus BaseLoadBalancer.Cluster cluster = new Cluster(clusterState, null, locationFinder, null); @@ -455,6 +457,7 @@ public class TestBaseLoadBalancer extends BalancerTestBase { int r1 = ArrayUtils.indexOf(cluster.regions, regions.get(1)); int r10 = ArrayUtils.indexOf(cluster.regions, regions.get(10)); int r42 = ArrayUtils.indexOf(cluster.regions, regions.get(42)); + int r43 = ArrayUtils.indexOf(cluster.regions, regions.get(43)); int s0 = cluster.serversToIndex.get(servers.get(0).getHostAndPort()); int s1 = cluster.serversToIndex.get(servers.get(1).getHostAndPort()); @@ -479,6 +482,10 @@ public class TestBaseLoadBalancer extends BalancerTestBase { assertEquals(s4, cluster.regionLocations[r42][0]); assertEquals(s9, cluster.regionLocations[r42][1]); assertEquals(s5, cluster.regionLocations[r42][2]); + + // region 43 locations + assertEquals(1, cluster.regionLocations[r43].length); + assertEquals(-1, cluster.regionLocations[r43][0]); } }