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();
}