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,