diff --git a/hbase-rsgroup/src/main/java/org/apache/hadoop/hbase/rsgroup/RSGroupBasedLoadBalancer.java b/hbase-rsgroup/src/main/java/org/apache/hadoop/hbase/rsgroup/RSGroupBasedLoadBalancer.java index 5e7061a8acc2..cc163ac199de 100644 --- a/hbase-rsgroup/src/main/java/org/apache/hadoop/hbase/rsgroup/RSGroupBasedLoadBalancer.java +++ b/hbase-rsgroup/src/main/java/org/apache/hadoop/hbase/rsgroup/RSGroupBasedLoadBalancer.java @@ -37,6 +37,7 @@ import org.apache.hadoop.hbase.master.LoadBalancer; import org.apache.hadoop.hbase.master.MasterServices; import org.apache.hadoop.hbase.master.RegionPlan; +import org.apache.hadoop.hbase.master.balancer.LoadBalancerFactory; import org.apache.hadoop.hbase.master.balancer.StochasticLoadBalancer; import org.apache.hadoop.hbase.net.Address; import org.apache.hadoop.hbase.util.Pair; @@ -354,9 +355,14 @@ public void initialize() throws HBaseIOException { } // Create the balancer - Class balancerKlass = config.getClass(HBASE_RSGROUP_LOADBALANCER_CLASS, + Class balancerClass = config.getClass(HBASE_RSGROUP_LOADBALANCER_CLASS, StochasticLoadBalancer.class, LoadBalancer.class); - internalBalancer = ReflectionUtils.newInstance(balancerKlass, config); + if (this.getClass().isAssignableFrom(balancerClass)) { + LOG.warn("The internal balancer of RSGroupBasedLoadBalancer cannot be itself, " + + "falling back to the default LoadBalancer class"); + balancerClass = LoadBalancerFactory.getDefaultLoadBalancerClass(); + } + internalBalancer = ReflectionUtils.newInstance(balancerClass, config); internalBalancer.setMasterServices(masterServices); if (clusterStatus != null) { internalBalancer.setClusterMetrics(clusterStatus);