[ https://issues.apache.org/jira/browse/HBASE-16810?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel ]
David Pope updated HBASE-16810: ------------------------------- Attachment: master.patch The issue is that the wrong value from cluster.regionLocations is sent as the server index to cluster.getLocalityOfRegion(int region, int server) in LocalityCostFunction.cost(). Specifically, the index of the region's RegionLocation is being passed instead of its value, where the value is the server index. As a result, the calculation is based on a "random" server rather than the server hosting the region. So, this calculation is calculating the wrong value even when it doesn't throw an exception. In the case when region servers are in draining, the draining servers are removed from the servers array and a "-1" is stored where it existed in cluster.RegionLocations. If the server that is hosting the region is stored at an index of cluster.RegionLocations greater than the size of the servers array, cluster.getLocalityOfRegion(int region, int server) will throw an ArrayIndexOutOfBoundsException. E.g., servers: [0] = "server0" [1] = "server1" [2] = "server2" regions: [0] = "region0" [1] = "region1" [2] = "region2" regionIndexToServerIndex: [0] = 2 // region0 is hosted on server2 [1] = 0 [3] = 1 RegionLocations: [0][0] = 1 // region0 has blocks on server1 [0][1] = 0 [0][2] = -1 // region0 has blocks on a server in draining [0][3] = 2 // this is the matching entry, but 3 is used as the server index instead of 2 when calling getLocalityOfRegion(int region, int server) > HBase Balancer throws ArrayIndexOutOfBoundsException when regionservers in > /hbase/draining znode and unloaded > ------------------------------------------------------------------------------------------------------------- > > Key: HBASE-16810 > URL: https://issues.apache.org/jira/browse/HBASE-16810 > Project: HBase > Issue Type: Bug > Components: Balancer > Affects Versions: 2.0.0, 1.3.0 > Reporter: Ashu Pachauri > Assignee: David Pope > Attachments: master.patch > > > 1. Add a regionserver znode under /hbase/draining znode. > 2. Use RegionMover to unload all regions from the regionserver. > 3. Run balancer. > {code} > 16/09/21 14:17:33 ERROR ipc.RpcServer: Unexpected throwable object > java.lang.ArrayIndexOutOfBoundsException: 75 > at > org.apache.hadoop.hbase.master.balancer.BaseLoadBalancer$Cluster.getLocalityOfRegion(BaseLoadBalancer.java:867) > at > org.apache.hadoop.hbase.master.balancer.StochasticLoadBalancer$LocalityCostFunction.cost(StochasticLoadBalancer.java:1186) > at > org.apache.hadoop.hbase.master.balancer.StochasticLoadBalancer.computeCost(StochasticLoadBalancer.java:521) > at > org.apache.hadoop.hbase.master.balancer.StochasticLoadBalancer.balanceCluster(StochasticLoadBalancer.java:309) > at > org.apache.hadoop.hbase.master.balancer.StochasticLoadBalancer.balanceCluster(StochasticLoadBalancer.java:264) > at org.apache.hadoop.hbase.master.HMaster.balance(HMaster.java:1339) > at > org.apache.hadoop.hbase.master.MasterRpcServices.balance(MasterRpcServices.java:442) > at > org.apache.hadoop.hbase.protobuf.generated.MasterProtos$MasterService$2.callBlockingMethod(MasterProtos.java:58555) > at org.apache.hadoop.hbase.ipc.RpcServer.call(RpcServer.java:2268) > at org.apache.hadoop.hbase.ipc.CallRunner.run(CallRunner.java:123) > at > org.apache.hadoop.hbase.ipc.RpcExecutor$Handler.run(RpcExecutor.java:188) > at > org.apache.hadoop.hbase.ipc.RpcExecutor$Handler.run(RpcExecutor.java:168) > {code} -- This message was sent by Atlassian JIRA (v6.3.4#6332)