You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@hbase.apache.org by st...@apache.org on 2019/10/30 20:33:51 UTC
[hbase] branch branch-2 updated: HBASE-22739
ArrayIndexOutOfBoundsException when balance (#729)
This is an automated email from the ASF dual-hosted git repository.
stack pushed a commit to branch branch-2
in repository https://gitbox.apache.org/repos/asf/hbase.git
The following commit(s) were added to refs/heads/branch-2 by this push:
new f02757d HBASE-22739 ArrayIndexOutOfBoundsException when balance (#729)
f02757d is described below
commit f02757d38afcfefcd107e2791400396552d5b014
Author: binlijin <bi...@gmail.com>
AuthorDate: Thu Oct 31 04:28:01 2019 +0800
HBASE-22739 ArrayIndexOutOfBoundsException when balance (#729)
Signed-off-by: stack <st...@apache.org>
---
.../apache/hadoop/hbase/master/balancer/BaseLoadBalancer.java | 5 ++++-
.../hadoop/hbase/master/balancer/TestBaseLoadBalancer.java | 9 ++++++++-
2 files changed, 12 insertions(+), 2 deletions(-)
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 1fa2bcd..5f1e0f9 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
@@ -142,6 +142,7 @@ public abstract class BaseLoadBalancer implements LoadBalancer {
int[] serverIndexToRackIndex; //serverIndex -> rack index
int[][] regionsPerServer; //serverIndex -> region list
+ int[] serverIndexToRegionsOffset; //serverIndex -> offset of region list
int[][] regionsPerHost; //hostIndex -> list of regions
int[][] regionsPerRack; //rackIndex -> region list
int[][] primariesOfRegionsPerServer; //serverIndex -> sorted list of regions by primary region index
@@ -276,6 +277,7 @@ public abstract class BaseLoadBalancer implements LoadBalancer {
serverIndexToHostIndex = new int[numServers];
serverIndexToRackIndex = new int[numServers];
regionsPerServer = new int[numServers][];
+ serverIndexToRegionsOffset = new int[numServers];
regionsPerHost = new int[numHosts][];
regionsPerRack = new int[numRacks][];
primariesOfRegionsPerServer = new int[numServers][];
@@ -321,7 +323,7 @@ public abstract class BaseLoadBalancer implements LoadBalancer {
for (Entry<ServerName, List<RegionInfo>> entry : clusterState.entrySet()) {
int serverIndex = serversToIndex.get(entry.getKey().getHostAndPort());
- regionPerServerIndex = 0;
+ regionPerServerIndex = serverIndexToRegionsOffset[serverIndex];
int hostIndex = hostsToIndex.get(entry.getKey().getHostname());
serverIndexToHostIndex[serverIndex] = hostIndex;
@@ -334,6 +336,7 @@ public abstract class BaseLoadBalancer implements LoadBalancer {
regionsPerServer[serverIndex][regionPerServerIndex++] = regionIndex;
regionIndex++;
}
+ serverIndexToRegionsOffset[serverIndex] = regionPerServerIndex;
}
for (RegionInfo region : unassignedRegions) {
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 8a0365f..5b080d8 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
@@ -472,7 +472,7 @@ public class TestBaseLoadBalancer extends BalancerTestBase {
// sharing same host and port
List<ServerName> servers = getListOfServerNames(randomServers(10, 10));
List<RegionInfo> regions = randomRegions(101);
- Map<ServerName, List<RegionInfo>> clusterState = new HashMap<>();
+ Map<ServerName, List<RegionInfo>> clusterState = new TreeMap<>();
assignRegions(regions, servers, clusterState);
@@ -490,6 +490,13 @@ public class TestBaseLoadBalancer extends BalancerTestBase {
BaseLoadBalancer.Cluster cluster = new Cluster(clusterState, null, null, null);
assertEquals(101 + 9, cluster.numRegions);
assertEquals(10, cluster.numServers); // only 10 servers because they share the same host + port
+
+ // test move
+ ServerName sn = oldServers.get(0);
+ int r0 = ArrayUtils.indexOf(cluster.regions, clusterState.get(sn).get(0));
+ int f0 = cluster.serversToIndex.get(sn.getHostAndPort());
+ int t0 = cluster.serversToIndex.get(servers.get(1).getHostAndPort());
+ cluster.doAction(new MoveRegionAction(r0, f0, t0));
}
private void assignRegions(List<RegionInfo> regions, List<ServerName> servers,