[ 
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)

Reply via email to