Index: hbase-server/src/main/java/org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.java =================================================================== --- hbase-server/src/main/java/org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.java (revision 1469523) +++ hbase-server/src/main/java/org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.java (working copy) @@ -105,10 +105,15 @@ regionLocations = new int[numRegions][]; int tableIndex = 0, serverIndex = 0, regionIndex = 0, regionPerServerIndex = 0; + // populate serversToIndex first for (Entry> entry : clusterState.entrySet()) { servers[serverIndex] = entry.getKey(); regionsPerServer[serverIndex] = new int[entry.getValue().size()]; serversToIndex.put(servers[serverIndex], Integer.valueOf(serverIndex)); + serverIndex++; + } + serverIndex = 0; + for (Entry> entry : clusterState.entrySet()) { regionPerServerIndex = 0; for (HRegionInfo region : entry.getValue()) { byte[] tableName = region.getTableName(); @@ -142,7 +147,9 @@ List loc = regionFinder.getTopBlockLocations(region); regionLocations[regionIndex] = new int[loc.size()]; for (int i=0; i < loc.size(); i++) { - regionLocations[regionIndex][i] = serversToIndex.get(loc.get(i)); + regionLocations[regionIndex][i] = + loc.get(i) == null ? -1 : + (serversToIndex.get(loc.get(i)) == null ? -1 : serversToIndex.get(loc.get(i))); } } Index: 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 (revision 1469523) +++ hbase-server/src/main/java/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.java (working copy) @@ -505,7 +505,7 @@ int index = -1; for (int j = 0; j < regionLocations.length; j++) { - if (regionLocations[j] == serverIndex) { + if (regionLocations[j] >= 0 && regionLocations[j] == serverIndex) { index = j; break; }