You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@hbase.apache.org by ns...@apache.org on 2012/01/05 00:46:45 UTC

svn commit: r1227398 - /hbase/branches/0.89-fb/src/main/java/org/apache/hadoop/hbase/master/RegionManager.java

Author: nspiegelberg
Date: Wed Jan  4 23:46:44 2012
New Revision: 1227398

URL: http://svn.apache.org/viewvc?rev=1227398&view=rev
Log:
[master] LoadBalancer reflection needs outer class

Summary:
Using reflection to instantiate the load balancer implementation cannot
be done using ReflectionUtils because implementations of inner classes
must specify a reference to the outer class as an implicit first
parameter to all constructors. This change uses the java reflection API
to properly instantiate the load balancer implementation.

Test Plan:
Run on a cluster with non-default configuration:
<property>
  <name>hbase.loadbalancer.impl</name>

<value>org.apache.hadoop.hbase.master.RegionManager$AssignmentLoadBalancer</value>
  <description></description>
</property>

Reviewers: liyintang, kranganathan

Reviewed By: kranganathan

CC: hbase-eng@lists, kranganathan

Differential Revision: 379822

Modified:
    hbase/branches/0.89-fb/src/main/java/org/apache/hadoop/hbase/master/RegionManager.java

Modified: hbase/branches/0.89-fb/src/main/java/org/apache/hadoop/hbase/master/RegionManager.java
URL: http://svn.apache.org/viewvc/hbase/branches/0.89-fb/src/main/java/org/apache/hadoop/hbase/master/RegionManager.java?rev=1227398&r1=1227397&r2=1227398&view=diff
==============================================================================
--- hbase/branches/0.89-fb/src/main/java/org/apache/hadoop/hbase/master/RegionManager.java (original)
+++ hbase/branches/0.89-fb/src/main/java/org/apache/hadoop/hbase/master/RegionManager.java Wed Jan  4 23:46:44 2012
@@ -20,6 +20,7 @@
 package org.apache.hadoop.hbase.master;
 
 import java.io.IOException;
+import java.lang.reflect.Constructor;
 import java.util.ArrayList;
 import java.util.Collections;
 import java.util.HashMap;
@@ -184,10 +185,14 @@ public class RegionManager {
 
     LoadBalancer loadBalancerImpl;
     try {
-      loadBalancerImpl = (LoadBalancer) ReflectionUtils.newInstance(
-          conf.getClass(HConstants.LOAD_BALANCER_IMPL,
-              DefaultLoadBalancer.class, LoadBalancer.class), conf);
-    } catch (RuntimeException e) {
+      Class<? extends LoadBalancer> theClass = conf.getClass(
+          HConstants.LOAD_BALANCER_IMPL, DefaultLoadBalancer.class,
+          LoadBalancer.class);
+      Constructor<? extends LoadBalancer> meth =
+          theClass.getDeclaredConstructor(RegionManager.class);
+      meth.setAccessible(true);
+      loadBalancerImpl = meth.newInstance(this);
+    } catch (Exception e) {
       loadBalancerImpl = new DefaultLoadBalancer();
     }
     this.loadBalancer = loadBalancerImpl;
@@ -1603,7 +1608,7 @@ public class RegionManager {
    * servers. They operate by unassigning some regions from a server so that
    * those regions can be assigned to other servers.
    */
-  private abstract class LoadBalancer {
+  abstract class LoadBalancer {
 
     // The maximum number of regions to close on one server during one iteration
     // of load balancing.
@@ -1637,7 +1642,7 @@ public class RegionManager {
    * current host and assigned to their preferred host. This behavior will also
    * consider secondary and tertiary preferred hosts if the primary is dead.
    */
-  private class AssignmentLoadBalancer extends LoadBalancer {
+  class AssignmentLoadBalancer extends LoadBalancer {
     AssignmentLoadBalancer() {
       super();
     }
@@ -1883,7 +1888,7 @@ public class RegionManager {
    *  avgLoadPlusSlop = Math.ceil(avgLoad * (1 + this.slop)), and
    *  avgLoadMinusSlop = Math.floor(avgLoad * (1 - this.slop)) - 1.
    */
-  private class DefaultLoadBalancer extends LoadBalancer {
+  class DefaultLoadBalancer extends LoadBalancer {
     DefaultLoadBalancer() {
       super();
     }