diff --git a/hbase-server/src/main/java/org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.java b/hbase-server/src/main/java/org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.java index 1fa2bcda4adc..8fe4159c467d 100644 --- a/hbase-server/src/main/java/org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.java +++ b/hbase-server/src/main/java/org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.java @@ -863,19 +863,6 @@ void regionMoved(int region, int oldServer, int newServer) { } } - int[] removeRegion(int[] regions, int regionIndex) { - //TODO: this maybe costly. Consider using linked lists - int[] newRegions = new int[regions.length - 1]; - int i = 0; - for (i = 0; i < regions.length; i++) { - if (regions[i] == regionIndex) { - break; - } - newRegions[i] = regions[i]; - } - System.arraycopy(regions, i+1, newRegions, i, newRegions.length - i); - return newRegions; - } int[] addRegion(int[] regions, int regionIndex) { int[] newRegions = new int[regions.length + 1]; @@ -1646,6 +1633,28 @@ protected Map> getRegionAssignmentsByServer( } } + /** + * Returns a new array with the region at regionIndex + * removed (unless regionIndex > regions.length and then we just + * return regions). + */ + static int[] removeRegion(int[] regions, int regionIndex) { + if (regionIndex >= regions.length) { + return regions; + } + //TODO: this maybe costly. Consider using linked lists + int[] newRegions = new int[regions.length - 1]; + int i = 0; + for (; i < regions.length; i++) { + if (regions[i] == regionIndex) { + break; + } + newRegions[i] = regions[i]; + } + System.arraycopy(regions, i+1, newRegions, i, newRegions.length - i); + return newRegions; + } + @Override public void onConfigurationChange(Configuration conf) { } diff --git a/hbase-server/src/test/java/org/apache/hadoop/hbase/master/balancer/TestBaseLoadBalancer.java b/hbase-server/src/test/java/org/apache/hadoop/hbase/master/balancer/TestBaseLoadBalancer.java index 041167984e78..0b27e796f24b 100644 --- a/hbase-server/src/test/java/org/apache/hadoop/hbase/master/balancer/TestBaseLoadBalancer.java +++ b/hbase-server/src/test/java/org/apache/hadoop/hbase/master/balancer/TestBaseLoadBalancer.java @@ -566,4 +566,26 @@ public void testClusterRegionLocations() { assertEquals(1, cluster.regionLocations[r43].length); assertEquals(-1, cluster.regionLocations[r43][0]); } + + @Test + public void testRemoveRegion() { + int [] regions = new int [] {0, 1, 2}; + int [] result = BaseLoadBalancer.removeRegion(regions, 0); + assertTrue(result.length == 2); + assertTrue(result[0] == 1); + assertTrue(result[1] == 2); + result = BaseLoadBalancer.removeRegion(regions, 1); + assertTrue(result.length == 2); + assertTrue(result[0] == 0); + assertTrue(result[1] == 2); + result = BaseLoadBalancer.removeRegion(regions, 2); + assertTrue(result.length == 2); + assertTrue(result[0] == 0); + assertTrue(result[1] == 1); + result = BaseLoadBalancer.removeRegion(regions, regions.length); + assertTrue(result.length == 3); + assertTrue(result[0] == 0); + assertTrue(result[1] == 1); + assertTrue(result[2] == 2); + } }