Skip to content

Commit 1f01c7f

Browse files
binlijinsaintstack
authored andcommitted
HBASE-22739 ArrayIndexOutOfBoundsException when balance (apache#729)
Signed-off-by: stack <stack@apache.org>
1 parent ec6074d commit 1f01c7f

File tree

2 files changed

+12
-2
lines changed

2 files changed

+12
-2
lines changed

hbase-server/src/main/java/org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.java

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -142,6 +142,7 @@ protected static class Cluster {
142142
int[] serverIndexToRackIndex; //serverIndex -> rack index
143143

144144
int[][] regionsPerServer; //serverIndex -> region list
145+
int[] serverIndexToRegionsOffset; //serverIndex -> offset of region list
145146
int[][] regionsPerHost; //hostIndex -> list of regions
146147
int[][] regionsPerRack; //rackIndex -> region list
147148
int[][] primariesOfRegionsPerServer; //serverIndex -> sorted list of regions by primary region index
@@ -276,6 +277,7 @@ protected Cluster(
276277
serverIndexToHostIndex = new int[numServers];
277278
serverIndexToRackIndex = new int[numServers];
278279
regionsPerServer = new int[numServers][];
280+
serverIndexToRegionsOffset = new int[numServers];
279281
regionsPerHost = new int[numHosts][];
280282
regionsPerRack = new int[numRacks][];
281283
primariesOfRegionsPerServer = new int[numServers][];
@@ -321,7 +323,7 @@ protected Cluster(
321323

322324
for (Entry<ServerName, List<RegionInfo>> entry : clusterState.entrySet()) {
323325
int serverIndex = serversToIndex.get(entry.getKey().getHostAndPort());
324-
regionPerServerIndex = 0;
326+
regionPerServerIndex = serverIndexToRegionsOffset[serverIndex];
325327

326328
int hostIndex = hostsToIndex.get(entry.getKey().getHostname());
327329
serverIndexToHostIndex[serverIndex] = hostIndex;
@@ -334,6 +336,7 @@ protected Cluster(
334336
regionsPerServer[serverIndex][regionPerServerIndex++] = regionIndex;
335337
regionIndex++;
336338
}
339+
serverIndexToRegionsOffset[serverIndex] = regionPerServerIndex;
337340
}
338341

339342
for (RegionInfo region : unassignedRegions) {

hbase-server/src/test/java/org/apache/hadoop/hbase/master/balancer/TestBaseLoadBalancer.java

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -472,7 +472,7 @@ public void testClusterServersWithSameHostPort() {
472472
// sharing same host and port
473473
List<ServerName> servers = getListOfServerNames(randomServers(10, 10));
474474
List<RegionInfo> regions = randomRegions(101);
475-
Map<ServerName, List<RegionInfo>> clusterState = new HashMap<>();
475+
Map<ServerName, List<RegionInfo>> clusterState = new TreeMap<>();
476476

477477
assignRegions(regions, servers, clusterState);
478478

@@ -490,6 +490,13 @@ public void testClusterServersWithSameHostPort() {
490490
BaseLoadBalancer.Cluster cluster = new Cluster(clusterState, null, null, null);
491491
assertEquals(101 + 9, cluster.numRegions);
492492
assertEquals(10, cluster.numServers); // only 10 servers because they share the same host + port
493+
494+
// test move
495+
ServerName sn = oldServers.get(0);
496+
int r0 = ArrayUtils.indexOf(cluster.regions, clusterState.get(sn).get(0));
497+
int f0 = cluster.serversToIndex.get(sn.getHostAndPort());
498+
int t0 = cluster.serversToIndex.get(servers.get(1).getHostAndPort());
499+
cluster.doAction(new MoveRegionAction(r0, f0, t0));
493500
}
494501

495502
private void assignRegions(List<RegionInfo> regions, List<ServerName> servers,

0 commit comments

Comments
 (0)