diff --git a/hbase-balancer/src/main/java/org/apache/hadoop/hbase/master/LoadBalancer.java b/hbase-balancer/src/main/java/org/apache/hadoop/hbase/master/LoadBalancer.java
index e78ad6960142..adead2849433 100644
--- a/hbase-balancer/src/main/java/org/apache/hadoop/hbase/master/LoadBalancer.java
+++ b/hbase-balancer/src/main/java/org/apache/hadoop/hbase/master/LoadBalancer.java
@@ -59,10 +59,11 @@ public interface LoadBalancer extends Stoppable, ConfigurationObserver {
*/
@Deprecated
String HBASE_RSGROUP_LOADBALANCER_CLASS = "hbase.rsgroup.grouploadbalancer.class";
+
/**
* Set the current cluster status. This allows a LoadBalancer to map host name to a server
*/
- void setClusterMetrics(ClusterMetrics st);
+ void updateClusterMetrics(ClusterMetrics metrics);
/**
diff --git a/hbase-balancer/src/main/java/org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.java b/hbase-balancer/src/main/java/org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.java
index 85c61ff508aa..0a237e6fbdb1 100644
--- a/hbase-balancer/src/main/java/org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.java
+++ b/hbase-balancer/src/main/java/org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.java
@@ -25,7 +25,6 @@
import java.util.HashMap;
import java.util.List;
import java.util.Map;
-import java.util.NavigableMap;
import java.util.Random;
import java.util.Set;
import java.util.TreeMap;
@@ -53,6 +52,10 @@
* The base class for load balancers. It provides the the functions used to by
* {@code AssignmentManager} to assign regions in the edge cases. It doesn't provide an
* implementation of the actual balancing algorithm.
+ *
+ * Since 3.0.0, all the balancers will be wrapped inside a {@code RSGroupBasedLoadBalancer}, it will
+ * be in charge of the synchronization of balancing and configuration changing, so we do not need to
+ * synchronized by ourselves.
*/
@InterfaceAudience.Private
public abstract class BaseLoadBalancer implements LoadBalancer {
@@ -76,8 +79,6 @@ public abstract class BaseLoadBalancer implements LoadBalancer {
// slop for regions
protected float slop;
- // overallSlop to control simpleLoadBalancer's cluster level threshold
- protected float overallSlop;
protected RackManager rackManager;
protected MetricsBalancer metricsBalancer = null;
protected ClusterMetrics clusterStatus = null;
@@ -103,38 +104,8 @@ protected final Configuration getConf() {
return provider.getConfiguration();
}
- protected void setConf(Configuration conf) {
- setSlop(conf);
- if (slop < 0) {
- slop = 0;
- } else if (slop > 1) {
- slop = 1;
- }
-
- if (overallSlop < 0) {
- overallSlop = 0;
- } else if (overallSlop > 1) {
- overallSlop = 1;
- }
-
- this.rackManager = new RackManager(conf);
- useRegionFinder = conf.getBoolean("hbase.master.balancer.uselocality", true);
- if (useRegionFinder) {
- regionFinder = new RegionHDFSBlockLocationFinder();
- regionFinder.setConf(conf);
- }
- this.isByTable = conf.getBoolean(HConstants.HBASE_MASTER_LOADBALANCE_BYTABLE, isByTable);
- // Print out base configs. Don't print overallSlop since it for simple balancer exclusively.
- LOG.info("slop={}", this.slop);
- }
-
- protected void setSlop(Configuration conf) {
- this.slop = conf.getFloat("hbase.regions.slop", (float) 0.2);
- this.overallSlop = conf.getFloat("hbase.regions.overallSlop", slop);
- }
-
@Override
- public synchronized void setClusterMetrics(ClusterMetrics st) {
+ public void updateClusterMetrics(ClusterMetrics st) {
this.clusterStatus = st;
if (useRegionFinder) {
regionFinder.setClusterMetrics(st);
@@ -145,10 +116,6 @@ public synchronized void setClusterMetrics(ClusterMetrics st) {
@Override
public void setClusterInfoProvider(ClusterInfoProvider provider) {
this.provider = provider;
- setConf(provider.getConfiguration());
- if (useRegionFinder) {
- this.regionFinder.setClusterInfoProvider(provider);
- }
}
@Override
@@ -158,57 +125,6 @@ public void postMasterStartupInitialize() {
}
}
- public void setRackManager(RackManager rackManager) {
- this.rackManager = rackManager;
- }
-
- protected boolean needsBalance(TableName tableName, BalancerClusterState c) {
- ClusterLoadState cs = new ClusterLoadState(c.clusterState);
- if (cs.getNumServers() < MIN_SERVER_BALANCE) {
- if (LOG.isDebugEnabled()) {
- LOG.debug("Not running balancer because only " + cs.getNumServers()
- + " active regionserver(s)");
- }
- return false;
- }
- if (areSomeRegionReplicasColocated(c)) {
- return true;
- }
- if(idleRegionServerExist(c)) {
- return true;
- }
-
- // Check if we even need to do any load balancing
- // HBASE-3681 check sloppiness first
- float average = cs.getLoadAverage(); // for logging
- int floor = (int) Math.floor(average * (1 - slop));
- int ceiling = (int) Math.ceil(average * (1 + slop));
- if (!(cs.getMaxLoad() > ceiling || cs.getMinLoad() < floor)) {
- NavigableMap> serversByLoad = cs.getServersByLoad();
- if (LOG.isTraceEnabled()) {
- // If nothing to balance, then don't say anything unless trace-level logging.
- LOG.trace("Skipping load balancing because balanced cluster; " +
- "servers=" + cs.getNumServers() +
- " regions=" + cs.getNumRegions() + " average=" + average +
- " mostloaded=" + serversByLoad.lastKey().getLoad() +
- " leastloaded=" + serversByLoad.firstKey().getLoad());
- }
- return false;
- }
- return true;
- }
-
- /**
- * Subclasses should implement this to return true if the cluster has nodes that hosts
- * multiple replicas for the same region, or, if there are multiple racks and the same
- * rack hosts replicas of the same region
- * @param c Cluster information
- * @return whether region replicas are currently co-located
- */
- protected boolean areSomeRegionReplicasColocated(BalancerClusterState c) {
- return false;
- }
-
protected final boolean idleRegionServerExist(BalancerClusterState c){
boolean isServerExistsWithMoreRegions = false;
boolean isServerExistsWithZeroRegions = false;
@@ -456,8 +372,37 @@ public Map> retainAssignment(Map 1) {
+ return 1;
+ }
+ return slop;
+ }
+
+ protected float getDefaultSlop() {
+ return 0.2f;
+ }
+
+ protected void loadConf(Configuration conf) {
+ this.slop =normalizeSlop(conf.getFloat("hbase.regions.slop", getDefaultSlop()));
+ this.rackManager = new RackManager(conf);
+ useRegionFinder = conf.getBoolean("hbase.master.balancer.uselocality", true);
+ if (useRegionFinder) {
+ regionFinder = new RegionHDFSBlockLocationFinder();
+ regionFinder.setConf(conf);
+ regionFinder.setClusterInfoProvider(provider);
+ }
+ this.isByTable = conf.getBoolean(HConstants.HBASE_MASTER_LOADBALANCE_BYTABLE, isByTable);
+ // Print out base configs. Don't print overallSlop since it for simple balancer exclusively.
+ LOG.info("slop={}", this.slop);
+ }
+
@Override
- public void initialize() throws HBaseIOException{
+ public void initialize() {
+ loadConf(getConf());
}
@Override
@@ -475,7 +420,7 @@ public boolean isStopped() {
@Override
public void stop(String why) {
- LOG.info("Load Balancer stop requested: "+why);
+ LOG.info("Load Balancer stop requested: {}", why);
stopped = true;
}
@@ -642,7 +587,7 @@ protected abstract List balanceTable(TableName tableName,
* @see #balanceTable(TableName, Map)
*/
@Override
- public final synchronized List
+ public final List
balanceCluster(Map>> loadOfAllTable) {
preBalanceCluster(loadOfAllTable);
if (isByTable) {
@@ -663,5 +608,6 @@ protected abstract List balanceTable(TableName tableName,
@Override
public void onConfigurationChange(Configuration conf) {
+ loadConf(conf);
}
}
diff --git a/hbase-balancer/src/main/java/org/apache/hadoop/hbase/master/balancer/SimpleLoadBalancer.java b/hbase-balancer/src/main/java/org/apache/hadoop/hbase/master/balancer/SimpleLoadBalancer.java
index 57fae1193631..c716f2fa6434 100644
--- a/hbase-balancer/src/main/java/org/apache/hadoop/hbase/master/balancer/SimpleLoadBalancer.java
+++ b/hbase-balancer/src/main/java/org/apache/hadoop/hbase/master/balancer/SimpleLoadBalancer.java
@@ -17,6 +17,7 @@
*/
package org.apache.hadoop.hbase.master.balancer;
+import com.google.errorprone.annotations.RestrictedApi;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
@@ -58,7 +59,8 @@ public class SimpleLoadBalancer extends BaseLoadBalancer {
private RegionPlan.RegionPlanComparator rpComparator = new RegionPlan.RegionPlanComparator();
private float avgLoadOverall;
private List serverLoadList = new ArrayList<>();
-
+ // overallSlop to control simpleLoadBalancer's cluster level threshold
+ private float overallSlop;
/**
* Stores additional per-server information about the regions added/removed
* during the run of the balancing algorithm.
@@ -104,6 +106,8 @@ void setNextRegionForUnload(int nextRegionForUnload) {
/**
* Pass RegionStates and allow balancer to set the current cluster load.
*/
+ @RestrictedApi(explanation = "Should only be called in tests", link = "",
+ allowedOnPath = ".*(/src/test/.*|SimpleLoadBalancer).java")
void setClusterLoad(Map>> clusterLoad) {
serverLoadList.clear();
Map server2LoadMap = new HashMap<>();
@@ -129,11 +133,17 @@ void setClusterLoad(Map>> clusterLoa
setClusterLoad(loadOfAllTable);
}
+ @Override
+ protected void loadConf(Configuration conf) {
+ super.loadConf(conf);
+ this.overallSlop = conf.getFloat("hbase.regions.overallSlop", slop);
+ }
+
@Override
public void onConfigurationChange(Configuration conf) {
float originSlop = slop;
float originOverallSlop = overallSlop;
- super.setConf(conf);
+ loadConf(conf);
LOG.info("Update configuration of SimpleLoadBalancer, previous slop is {},"
+ " current slop is {}, previous overallSlop is {}, current overallSlop is {}",
originSlop, slop, originOverallSlop, overallSlop);
@@ -168,6 +178,38 @@ private boolean overallNeedsBalance() {
return true;
}
+ private boolean needsBalance(BalancerClusterState c) {
+ ClusterLoadState cs = new ClusterLoadState(c.clusterState);
+ if (cs.getNumServers() < MIN_SERVER_BALANCE) {
+ if (LOG.isDebugEnabled()) {
+ LOG.debug(
+ "Not running balancer because only " + cs.getNumServers() + " active regionserver(s)");
+ }
+ return false;
+ }
+ if (idleRegionServerExist(c)) {
+ return true;
+ }
+
+ // Check if we even need to do any load balancing
+ // HBASE-3681 check sloppiness first
+ float average = cs.getLoadAverage(); // for logging
+ int floor = (int) Math.floor(average * (1 - slop));
+ int ceiling = (int) Math.ceil(average * (1 + slop));
+ if (!(cs.getMaxLoad() > ceiling || cs.getMinLoad() < floor)) {
+ NavigableMap> serversByLoad = cs.getServersByLoad();
+ if (LOG.isTraceEnabled()) {
+ // If nothing to balance, then don't say anything unless trace-level logging.
+ LOG.trace("Skipping load balancing because balanced cluster; " + "servers=" +
+ cs.getNumServers() + " regions=" + cs.getNumRegions() + " average=" + average +
+ " mostloaded=" + serversByLoad.lastKey().getLoad() + " leastloaded=" +
+ serversByLoad.firstKey().getLoad());
+ }
+ return false;
+ }
+ return true;
+ }
+
/**
* Generate a global load balancing plan according to the specified map of
* server information to the most loaded regions of each server.
@@ -262,7 +304,7 @@ protected List balanceTable(TableName tableName,
// argument as defaults
BalancerClusterState c =
new BalancerClusterState(loadOfOneTable, null, this.regionFinder, this.rackManager);
- if (!this.needsBalance(tableName, c) && !this.overallNeedsBalance()) {
+ if (!needsBalance(c) && !this.overallNeedsBalance()) {
return null;
}
ClusterLoadState cs = new ClusterLoadState(loadOfOneTable);
diff --git a/hbase-balancer/src/test/java/org/apache/hadoop/hbase/master/balancer/TestSimpleLoadBalancer.java b/hbase-balancer/src/test/java/org/apache/hadoop/hbase/master/balancer/TestSimpleLoadBalancer.java
index a09e53391393..1fb02629255e 100644
--- a/hbase-balancer/src/test/java/org/apache/hadoop/hbase/master/balancer/TestSimpleLoadBalancer.java
+++ b/hbase-balancer/src/test/java/org/apache/hadoop/hbase/master/balancer/TestSimpleLoadBalancer.java
@@ -64,7 +64,8 @@ public static void beforeAllTests() throws Exception {
conf.setClass("hbase.util.ip.to.rack.determiner", MockMapping.class, DNSToSwitchMapping.class);
conf.set("hbase.regions.slop", "0");
loadBalancer = new SimpleLoadBalancer();
- loadBalancer.setConf(conf);
+ loadBalancer.setClusterInfoProvider(new DummyClusterInfoProvider(conf));
+ loadBalancer.initialize();
}
int[] mockUniformCluster = new int[] { 5, 5, 5, 5, 5, 0 };
diff --git a/hbase-server/src/main/java/org/apache/hadoop/hbase/favored/FavoredNodeLoadBalancer.java b/hbase-server/src/main/java/org/apache/hadoop/hbase/favored/FavoredNodeLoadBalancer.java
index cf356ad237e0..a3ab929de828 100644
--- a/hbase-server/src/main/java/org/apache/hadoop/hbase/favored/FavoredNodeLoadBalancer.java
+++ b/hbase-server/src/main/java/org/apache/hadoop/hbase/favored/FavoredNodeLoadBalancer.java
@@ -37,7 +37,6 @@
import org.apache.hadoop.hbase.client.RegionInfo;
import org.apache.hadoop.hbase.favored.FavoredNodesPlan.Position;
import org.apache.hadoop.hbase.master.MasterServices;
-import org.apache.hadoop.hbase.master.RackManager;
import org.apache.hadoop.hbase.master.RegionPlan;
import org.apache.hadoop.hbase.master.ServerManager;
import org.apache.hadoop.hbase.master.SnapshotOfRegionAssignmentFromMeta;
@@ -70,7 +69,6 @@ public class FavoredNodeLoadBalancer extends BaseLoadBalancer implements Favored
private static final Logger LOG = LoggerFactory.getLogger(FavoredNodeLoadBalancer.class);
private MasterServices services;
- private RackManager rackManager;
private FavoredNodesManager fnm;
public void setMasterServices(MasterServices services) {
@@ -78,10 +76,9 @@ public void setMasterServices(MasterServices services) {
}
@Override
- public synchronized void initialize() throws HBaseIOException {
+ public void initialize() {
super.initialize();
this.fnm = services.getFavoredNodesManager();
- this.rackManager = new RackManager(getConf());
}
@Override
@@ -324,7 +321,7 @@ private void addRegionToMap(Map> assignmentMapForFa
}
@Override
- public synchronized List getFavoredNodes(RegionInfo regionInfo) {
+ public List getFavoredNodes(RegionInfo regionInfo) {
return this.fnm.getFavoredNodes(regionInfo);
}
diff --git a/hbase-server/src/main/java/org/apache/hadoop/hbase/master/HMaster.java b/hbase-server/src/main/java/org/apache/hadoop/hbase/master/HMaster.java
index 8ca7370ebabe..02f4f7a61c25 100644
--- a/hbase-server/src/main/java/org/apache/hadoop/hbase/master/HMaster.java
+++ b/hbase-server/src/main/java/org/apache/hadoop/hbase/master/HMaster.java
@@ -928,8 +928,8 @@ private void finishActiveMasterInitialization(MonitoredTask status) throws IOExc
// initialize load balancer
this.balancer.setMasterServices(this);
- this.balancer.setClusterMetrics(getClusterMetricsWithoutCoprocessor());
this.balancer.initialize();
+ this.balancer.updateClusterMetrics(getClusterMetricsWithoutCoprocessor());
// start up all service threads.
status.setStatus("Initializing master service threads");
@@ -1011,7 +1011,7 @@ private void finishActiveMasterInitialization(MonitoredTask status) throws IOExc
}
// set cluster status again after user regions are assigned
- this.balancer.setClusterMetrics(getClusterMetricsWithoutCoprocessor());
+ this.balancer.updateClusterMetrics(getClusterMetricsWithoutCoprocessor());
// Start balancer and meta catalog janitor after meta and regions have been assigned.
status.setStatus("Starting balancer and catalog janitor");
@@ -1724,7 +1724,7 @@ public boolean balance(boolean force) throws IOException {
}
//Give the balancer the current cluster state.
- this.balancer.setClusterMetrics(getClusterMetricsWithoutCoprocessor());
+ this.balancer.updateClusterMetrics(getClusterMetricsWithoutCoprocessor());
List plans = this.balancer.balanceCluster(assignments);
diff --git a/hbase-server/src/main/java/org/apache/hadoop/hbase/master/balancer/ClusterStatusChore.java b/hbase-server/src/main/java/org/apache/hadoop/hbase/master/balancer/ClusterStatusChore.java
index c0383faf375a..04c0b9ba08eb 100644
--- a/hbase-server/src/main/java/org/apache/hadoop/hbase/master/balancer/ClusterStatusChore.java
+++ b/hbase-server/src/main/java/org/apache/hadoop/hbase/master/balancer/ClusterStatusChore.java
@@ -46,7 +46,7 @@ public ClusterStatusChore(HMaster master, LoadBalancer balancer) {
@Override
protected void chore() {
try {
- balancer.setClusterMetrics(master.getClusterMetricsWithoutCoprocessor());
+ balancer.updateClusterMetrics(master.getClusterMetricsWithoutCoprocessor());
} catch (InterruptedIOException e) {
LOG.warn("Ignoring interruption", e);
}
diff --git a/hbase-server/src/main/java/org/apache/hadoop/hbase/master/balancer/FavoredStochasticBalancer.java b/hbase-server/src/main/java/org/apache/hadoop/hbase/master/balancer/FavoredStochasticBalancer.java
index c6081e5acf53..72e65f24d923 100644
--- a/hbase-server/src/main/java/org/apache/hadoop/hbase/master/balancer/FavoredStochasticBalancer.java
+++ b/hbase-server/src/main/java/org/apache/hadoop/hbase/master/balancer/FavoredStochasticBalancer.java
@@ -86,16 +86,11 @@ public void setMasterServices(MasterServices services) {
}
@Override
- public void initialize() throws HBaseIOException {
- configureGenerators();
- super.initialize();
- }
-
- protected void configureGenerators() {
+ protected List createCandidateGenerators() {
List fnPickers = new ArrayList<>(2);
fnPickers.add(new FavoredNodeLoadPicker());
fnPickers.add(new FavoredNodeLocalityPicker());
- setCandidateGenerators(fnPickers);
+ return fnPickers;
}
/**
diff --git a/hbase-server/src/main/java/org/apache/hadoop/hbase/master/balancer/MaintenanceLoadBalancer.java b/hbase-server/src/main/java/org/apache/hadoop/hbase/master/balancer/MaintenanceLoadBalancer.java
index f9d06bacafa2..3dbd9431302a 100644
--- a/hbase-server/src/main/java/org/apache/hadoop/hbase/master/balancer/MaintenanceLoadBalancer.java
+++ b/hbase-server/src/main/java/org/apache/hadoop/hbase/master/balancer/MaintenanceLoadBalancer.java
@@ -51,7 +51,7 @@ public boolean isStopped() {
}
@Override
- public void setClusterMetrics(ClusterMetrics st) {
+ public void updateClusterMetrics(ClusterMetrics st) {
}
@Override
diff --git a/hbase-server/src/main/java/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.java b/hbase-server/src/main/java/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.java
index 74929b5d3fc3..70f77a1b837a 100644
--- a/hbase-server/src/main/java/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.java
+++ b/hbase-server/src/main/java/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.java
@@ -37,6 +37,7 @@
import org.apache.hadoop.hbase.client.BalancerDecision;
import org.apache.hadoop.hbase.client.BalancerRejection;
import org.apache.hadoop.hbase.client.RegionInfo;
+import org.apache.hadoop.hbase.master.RackManager;
import org.apache.hadoop.hbase.master.RegionPlan;
import org.apache.hadoop.hbase.namequeues.BalancerDecisionDetails;
import org.apache.hadoop.hbase.namequeues.BalancerRejectionDetails;
@@ -47,8 +48,6 @@
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
-import org.apache.hbase.thirdparty.com.google.common.collect.Lists;
-
/**
* This is a best effort load balancer. Given a Cost function F(C) => x It will
* randomly try and mutate the cluster to Cprime. If F(Cprime) < F(C) then the
@@ -100,8 +99,6 @@
* so that the balancer gets the full picture of all loads on the cluster.
*/
@InterfaceAudience.LimitedPrivate(HBaseInterfaceAudience.CONFIG)
-@edu.umd.cs.findbugs.annotations.SuppressWarnings(value="IS2_INCONSISTENT_SYNC",
- justification="Complaint is about costFunctions not being synchronized; not end of the world")
public class StochasticLoadBalancer extends BaseLoadBalancer {
private static final Logger LOG = LoggerFactory.getLogger(StochasticLoadBalancer.class);
@@ -164,14 +161,60 @@ public StochasticLoadBalancer() {
super(new MetricsStochasticBalancer());
}
+ private static CostFunction createCostFunction(Class extends CostFunction> clazz,
+ Configuration conf) {
+ try {
+ Constructor extends CostFunction> ctor = clazz.getDeclaredConstructor(Configuration.class);
+ return ReflectionUtils.instantiate(clazz.getName(), ctor, conf);
+ } catch (NoSuchMethodException e) {
+ // will try construct with no parameter
+ }
+ return ReflectionUtils.newInstance(clazz);
+ }
+
+ private void loadCustomCostFunctions(Configuration conf) {
+ String[] functionsNames = conf.getStrings(COST_FUNCTIONS_COST_FUNCTIONS_KEY);
+
+ if (null == functionsNames) {
+ return;
+ }
+ for (String className : functionsNames) {
+ Class extends CostFunction> clazz;
+ try {
+ clazz = Class.forName(className).asSubclass(CostFunction.class);
+ } catch (ClassNotFoundException e) {
+ LOG.warn("Cannot load class '{}': {}", className, e.getMessage());
+ continue;
+ }
+ CostFunction func = createCostFunction(clazz, conf);
+ LOG.info("Successfully loaded custom CostFunction '{}'", func.getClass().getSimpleName());
+ costFunctions.add(func);
+ }
+ }
+
+ @RestrictedApi(explanation = "Should only be called in tests", link = "",
+ allowedOnPath = ".*/src/test/.*")
+ List getCandidateGenerators() {
+ return this.candidateGenerators;
+ }
+
@Override
- public void onConfigurationChange(Configuration conf) {
- setConf(conf);
+ protected float getDefaultSlop() {
+ return 0.001f;
+ }
+
+ protected List createCandidateGenerators() {
+ List candidateGenerators = new ArrayList(4);
+ candidateGenerators.add(new RandomCandidateGenerator());
+ candidateGenerators.add(new LoadCandidateGenerator());
+ candidateGenerators.add(localityCandidateGenerator);
+ candidateGenerators.add(new RegionReplicaRackCandidateGenerator());
+ return candidateGenerators;
}
@Override
- protected synchronized void setConf(Configuration conf) {
- super.setConf(conf);
+ protected void loadConf(Configuration conf) {
+ super.loadConf(conf);
maxSteps = conf.getInt(MAX_STEPS_KEY, maxSteps);
stepsPerRegion = conf.getInt(STEPS_PER_REGION_KEY, stepsPerRegion);
maxRunningTime = conf.getLong(MAX_RUNNING_TIME_KEY, maxRunningTime);
@@ -185,20 +228,11 @@ protected synchronized void setConf(Configuration conf) {
localityCost = new ServerLocalityCostFunction(conf);
rackLocalityCost = new RackLocalityCostFunction(conf);
- if (this.candidateGenerators == null) {
- candidateGenerators = Lists.newArrayList();
- candidateGenerators.add(new RandomCandidateGenerator());
- candidateGenerators.add(new LoadCandidateGenerator());
- candidateGenerators.add(localityCandidateGenerator);
- candidateGenerators.add(new RegionReplicaRackCandidateGenerator());
- }
- regionLoadFunctions = new CostFromRegionLoadFunction[] {
- new ReadRequestCostFunction(conf),
- new CPRequestCostFunction(conf),
- new WriteRequestCostFunction(conf),
- new MemStoreSizeCostFunction(conf),
- new StoreFileCostFunction(conf)
- };
+ this.candidateGenerators = createCandidateGenerators();
+
+ regionLoadFunctions = new CostFromRegionLoadFunction[] { new ReadRequestCostFunction(conf),
+ new CPRequestCostFunction(conf), new WriteRequestCostFunction(conf),
+ new MemStoreSizeCostFunction(conf), new StoreFileCostFunction(conf) };
regionReplicaHostCostFunction = new RegionReplicaHostCostFunction(conf);
regionReplicaRackCostFunction = new RegionReplicaRackCostFunction(conf);
@@ -218,75 +252,28 @@ protected synchronized void setConf(Configuration conf) {
addCostFunction(regionLoadFunctions[4]);
loadCustomCostFunctions(conf);
- curFunctionCosts= new double[costFunctions.size()];
- tempFunctionCosts= new double[costFunctions.size()];
+ curFunctionCosts = new double[costFunctions.size()];
+ tempFunctionCosts = new double[costFunctions.size()];
- isBalancerDecisionRecording = conf
- .getBoolean(BaseLoadBalancer.BALANCER_DECISION_BUFFER_ENABLED,
- BaseLoadBalancer.DEFAULT_BALANCER_DECISION_BUFFER_ENABLED);
- isBalancerRejectionRecording = conf
- .getBoolean(BaseLoadBalancer.BALANCER_REJECTION_BUFFER_ENABLED,
+ isBalancerDecisionRecording = conf.getBoolean(BaseLoadBalancer.BALANCER_DECISION_BUFFER_ENABLED,
+ BaseLoadBalancer.DEFAULT_BALANCER_DECISION_BUFFER_ENABLED);
+ isBalancerRejectionRecording =
+ conf.getBoolean(BaseLoadBalancer.BALANCER_REJECTION_BUFFER_ENABLED,
BaseLoadBalancer.DEFAULT_BALANCER_REJECTION_BUFFER_ENABLED);
- if (this.namedQueueRecorder == null && (isBalancerDecisionRecording
- || isBalancerRejectionRecording)) {
+ if (this.namedQueueRecorder == null &&
+ (isBalancerDecisionRecording || isBalancerRejectionRecording)) {
this.namedQueueRecorder = NamedQueueRecorder.getInstance(conf);
}
LOG.info("Loaded config; maxSteps=" + maxSteps + ", stepsPerRegion=" + stepsPerRegion +
- ", maxRunningTime=" + maxRunningTime + ", isByTable=" + isByTable + ", CostFunctions=" +
- Arrays.toString(getCostFunctionNames()) + " etc.");
- }
-
- private static CostFunction createCostFunction(Class extends CostFunction> clazz,
- Configuration conf) {
- try {
- Constructor extends CostFunction> ctor = clazz.getDeclaredConstructor(Configuration.class);
- return ReflectionUtils.instantiate(clazz.getName(), ctor, conf);
- } catch (NoSuchMethodException e) {
- // will try construct with no parameter
- }
- return ReflectionUtils.newInstance(clazz);
- }
-
- private void loadCustomCostFunctions(Configuration conf) {
- String[] functionsNames = conf.getStrings(COST_FUNCTIONS_COST_FUNCTIONS_KEY);
-
- if (null == functionsNames) {
- return;
- }
- for (String className : functionsNames) {
- Class extends CostFunction> clazz;
- try {
- clazz = Class.forName(className).asSubclass(CostFunction.class);
- } catch (ClassNotFoundException e) {
- LOG.warn("Cannot load class '{}': {}", className, e.getMessage());
- continue;
- }
- CostFunction func = createCostFunction(clazz, conf);
- LOG.info("Successfully loaded custom CostFunction '{}'", func.getClass().getSimpleName());
- costFunctions.add(func);
- }
- }
-
- protected void setCandidateGenerators(List customCandidateGenerators) {
- this.candidateGenerators = customCandidateGenerators;
- }
-
- @RestrictedApi(explanation = "Should only be called in tests", link = "",
- allowedOnPath = ".*/src/test/.*")
- List getCandidateGenerators() {
- return this.candidateGenerators;
+ ", maxRunningTime=" + maxRunningTime + ", isByTable=" + isByTable + ", CostFunctions=" +
+ Arrays.toString(getCostFunctionNames()) + " etc.");
}
@Override
- protected void setSlop(Configuration conf) {
- this.slop = conf.getFloat("hbase.regions.slop", 0.001F);
- }
-
- @Override
- public synchronized void setClusterMetrics(ClusterMetrics st) {
- super.setClusterMetrics(st);
+ public void updateClusterMetrics(ClusterMetrics st) {
+ super.updateClusterMetrics(st);
updateRegionLoad();
for (CostFromRegionLoadFunction cost : regionLoadFunctions) {
cost.setClusterMetrics(st);
@@ -315,8 +302,7 @@ void updateMetricsSize(int size) {
}
}
- @Override
- protected synchronized boolean areSomeRegionReplicasColocated(BalancerClusterState c) {
+ private boolean areSomeRegionReplicasColocated(BalancerClusterState c) {
regionReplicaHostCostFunction.init(c);
if (regionReplicaHostCostFunction.cost() > 0) {
return true;
@@ -328,8 +314,9 @@ protected synchronized boolean areSomeRegionReplicasColocated(BalancerClusterSta
return false;
}
- @Override
- protected boolean needsBalance(TableName tableName, BalancerClusterState cluster) {
+ @RestrictedApi(explanation = "Should only be called in tests", link = "",
+ allowedOnPath = ".*(/src/test/.*|StochasticLoadBalancer).java")
+ boolean needsBalance(TableName tableName, BalancerClusterState cluster) {
ClusterLoadState cs = new ClusterLoadState(cluster.clusterState);
if (cs.getNumServers() < MIN_SERVER_BALANCE) {
if (LOG.isDebugEnabled()) {
@@ -400,6 +387,12 @@ BalanceAction nextAction(BalancerClusterState cluster) {
.generate(cluster);
}
+ @RestrictedApi(explanation = "Should only be called in tests", link = "",
+ allowedOnPath = ".*/src/test/.*")
+ void setRackManager(RackManager rackManager) {
+ this.rackManager = rackManager;
+ }
+
/**
* Given the cluster state this will try and approach an optimal balance. This
* should always approach the optimal state given enough steps.
@@ -649,7 +642,7 @@ private List createRegionPlans(BalancerClusterState cluster) {
/**
* Store the current region loads.
*/
- private synchronized void updateRegionLoad() {
+ private void updateRegionLoad() {
// We create a new hashmap so that regions that are no longer there are removed.
// However we temporarily need the old loads so we can use them to keep the rolling average.
Map> oldLoads = loads;
diff --git a/hbase-server/src/main/java/org/apache/hadoop/hbase/rsgroup/RSGroupBasedLoadBalancer.java b/hbase-server/src/main/java/org/apache/hadoop/hbase/rsgroup/RSGroupBasedLoadBalancer.java
index f3dc80b0cb43..c602705c0f49 100644
--- a/hbase-server/src/main/java/org/apache/hadoop/hbase/rsgroup/RSGroupBasedLoadBalancer.java
+++ b/hbase-server/src/main/java/org/apache/hadoop/hbase/rsgroup/RSGroupBasedLoadBalancer.java
@@ -73,7 +73,6 @@
public class RSGroupBasedLoadBalancer implements LoadBalancer {
private static final Logger LOG = LoggerFactory.getLogger(RSGroupBasedLoadBalancer.class);
- private ClusterMetrics clusterStatus;
private MasterServices masterServices;
private FavoredNodesManager favoredNodesManager;
private volatile RSGroupInfoManager rsGroupInfoManager;
@@ -96,12 +95,11 @@ public class RSGroupBasedLoadBalancer implements LoadBalancer {
@InterfaceAudience.Private
public RSGroupBasedLoadBalancer() {}
+ // must be called after calling initialize
@Override
- public void setClusterMetrics(ClusterMetrics sm) {
- this.clusterStatus = sm;
- if (internalBalancer != null) {
- internalBalancer.setClusterMetrics(sm);
- }
+ public synchronized void updateClusterMetrics(ClusterMetrics sm) {
+ assert internalBalancer != null;
+ internalBalancer.updateClusterMetrics(sm);
}
public void setMasterServices(MasterServices masterServices) {
@@ -112,7 +110,7 @@ public void setMasterServices(MasterServices masterServices) {
* Balance by RSGroup.
*/
@Override
- public List balanceCluster(
+ public synchronized List balanceCluster(
Map>> loadOfAllTable) throws IOException {
if (!isOnline()) {
throw new ConstraintException(
@@ -335,6 +333,7 @@ public void initialize() throws IOException {
// Create the balancer
Configuration conf = masterServices.getConfiguration();
Class extends LoadBalancer> balancerClass;
+ @SuppressWarnings("deprecation")
String balancerClassName = conf.get(HBASE_RSGROUP_LOADBALANCER_CLASS);
if (balancerClassName == null) {
balancerClass = conf.getClass(HConstants.HBASE_MASTER_LOADBALANCER_CLASS,
@@ -352,9 +351,6 @@ public void initialize() throws IOException {
}
internalBalancer = ReflectionUtils.newInstance(balancerClass);
internalBalancer.setClusterInfoProvider(new MasterClusterInfoProvider(masterServices));
- if(clusterStatus != null) {
- internalBalancer.setClusterMetrics(clusterStatus);
- }
// special handling for favor node balancers
if (internalBalancer instanceof FavoredNodesPromoter) {
favoredNodesManager = new FavoredNodesManager(masterServices);
@@ -365,8 +361,6 @@ public void initialize() throws IOException {
((FavoredStochasticBalancer) internalBalancer).setMasterServices(masterServices);
}
}
-
-
internalBalancer.initialize();
// init fallback groups
this.fallbackEnabled = conf.getBoolean(FALLBACK_GROUP_ENABLE_KEY, false);
@@ -393,7 +387,7 @@ public void regionOffline(RegionInfo regionInfo) {
}
@Override
- public void onConfigurationChange(Configuration conf) {
+ public synchronized void onConfigurationChange(Configuration conf) {
boolean newFallbackEnabled = conf.getBoolean(FALLBACK_GROUP_ENABLE_KEY, false);
if (fallbackEnabled != newFallbackEnabled) {
LOG.info("Changing the value of {} from {} to {}", FALLBACK_GROUP_ENABLE_KEY,
@@ -405,15 +399,12 @@ public void onConfigurationChange(Configuration conf) {
@Override
public void stop(String why) {
+ internalBalancer.stop(why);
}
@Override
public boolean isStopped() {
- return false;
- }
-
- public void setRsGroupInfoManager(RSGroupInfoManager rsGroupInfoManager) {
- this.rsGroupInfoManager = rsGroupInfoManager;
+ return internalBalancer.isStopped();
}
public LoadBalancer getInternalBalancer() {
@@ -425,7 +416,7 @@ public FavoredNodesManager getFavoredNodesManager() {
}
@Override
- public void postMasterStartupInitialize() {
+ public synchronized void postMasterStartupInitialize() {
this.internalBalancer.postMasterStartupInitialize();
}
diff --git a/hbase-server/src/test/java/org/apache/hadoop/hbase/master/balancer/LoadOnlyFavoredStochasticBalancer.java b/hbase-server/src/test/java/org/apache/hadoop/hbase/master/balancer/LoadOnlyFavoredStochasticBalancer.java
index 8aa65c196beb..f7521c9250ac 100644
--- a/hbase-server/src/test/java/org/apache/hadoop/hbase/master/balancer/LoadOnlyFavoredStochasticBalancer.java
+++ b/hbase-server/src/test/java/org/apache/hadoop/hbase/master/balancer/LoadOnlyFavoredStochasticBalancer.java
@@ -17,19 +17,18 @@
*/
package org.apache.hadoop.hbase.master.balancer;
+import java.util.ArrayList;
import java.util.List;
-import org.apache.hbase.thirdparty.com.google.common.collect.Lists;
-
/**
* Used for FavoredNode unit tests
*/
public class LoadOnlyFavoredStochasticBalancer extends FavoredStochasticBalancer {
@Override
- protected void configureGenerators() {
- List fnPickers = Lists.newArrayList();
+ protected List createCandidateGenerators() {
+ List fnPickers = new ArrayList<>(1);
fnPickers.add(new FavoredNodeLoadPicker());
- setCandidateGenerators(fnPickers);
+ return fnPickers;
}
}
diff --git a/hbase-server/src/test/java/org/apache/hadoop/hbase/master/balancer/RSGroupableBalancerTestBase.java b/hbase-server/src/test/java/org/apache/hadoop/hbase/master/balancer/RSGroupableBalancerTestBase.java
index d4d50adc8c7f..9ae3e80d881d 100644
--- a/hbase-server/src/test/java/org/apache/hadoop/hbase/master/balancer/RSGroupableBalancerTestBase.java
+++ b/hbase-server/src/test/java/org/apache/hadoop/hbase/master/balancer/RSGroupableBalancerTestBase.java
@@ -410,6 +410,8 @@ protected static MasterServices getMockedMaster() throws IOException {
AssignmentManager am = Mockito.mock(AssignmentManager.class);
Mockito.when(services.getAssignmentManager()).thenReturn(am);
Mockito.when(services.getConfiguration()).thenReturn(conf);
+ RSGroupInfoManager manager = getMockedGroupInfoManager();
+ Mockito.when(services.getRSGroupInfoManager()).thenReturn(manager);
return services;
}
diff --git a/hbase-server/src/test/java/org/apache/hadoop/hbase/master/balancer/StochasticBalancerTestBase.java b/hbase-server/src/test/java/org/apache/hadoop/hbase/master/balancer/StochasticBalancerTestBase.java
index 4f9e022630c6..7a64f7fbaf63 100644
--- a/hbase-server/src/test/java/org/apache/hadoop/hbase/master/balancer/StochasticBalancerTestBase.java
+++ b/hbase-server/src/test/java/org/apache/hadoop/hbase/master/balancer/StochasticBalancerTestBase.java
@@ -47,7 +47,8 @@ public static void beforeAllTests() throws Exception {
conf.setFloat("hbase.regions.slop", 0.0f);
conf.setFloat("hbase.master.balancer.stochastic.localityCost", 0);
loadBalancer = new StochasticLoadBalancer();
- loadBalancer.setConf(conf);
+ loadBalancer.setClusterInfoProvider(new DummyClusterInfoProvider(conf));
+ loadBalancer.initialize();
}
protected void testWithCluster(int numNodes, int numRegions, int numRegionsPerServer,
diff --git a/hbase-server/src/test/java/org/apache/hadoop/hbase/master/balancer/StochasticBalancerTestBase2.java b/hbase-server/src/test/java/org/apache/hadoop/hbase/master/balancer/StochasticBalancerTestBase2.java
index 55b9d0a59ec9..6f3c41abb59e 100644
--- a/hbase-server/src/test/java/org/apache/hadoop/hbase/master/balancer/StochasticBalancerTestBase2.java
+++ b/hbase-server/src/test/java/org/apache/hadoop/hbase/master/balancer/StochasticBalancerTestBase2.java
@@ -29,12 +29,12 @@ public void before() {
conf.setFloat("hbase.master.balancer.stochastic.localityCost", 0);
conf.setLong("hbase.master.balancer.stochastic.maxRunningTime", 90 * 1000); // 90 sec
conf.setFloat("hbase.master.balancer.stochastic.minCostNeedBalance", 0.05f);
- loadBalancer.setConf(conf);
+ loadBalancer.onConfigurationChange(conf);
}
@After
public void after() {
// reset config to make sure balancer run
- loadBalancer.setConf(conf);
+ loadBalancer.onConfigurationChange(conf);
}
}
diff --git a/hbase-server/src/test/java/org/apache/hadoop/hbase/master/balancer/TestBalancerDecision.java b/hbase-server/src/test/java/org/apache/hadoop/hbase/master/balancer/TestBalancerDecision.java
index 0beb8cc8c55f..5395fc30287f 100644
--- a/hbase-server/src/test/java/org/apache/hadoop/hbase/master/balancer/TestBalancerDecision.java
+++ b/hbase-server/src/test/java/org/apache/hadoop/hbase/master/balancer/TestBalancerDecision.java
@@ -21,7 +21,6 @@
import java.util.Arrays;
import java.util.List;
import java.util.Map;
-
import org.apache.hadoop.hbase.HBaseClassTestRule;
import org.apache.hadoop.hbase.HConstants;
import org.apache.hadoop.hbase.ServerName;
@@ -56,7 +55,7 @@ public class TestBalancerDecision extends StochasticBalancerTestBase {
@Test
public void testBalancerDecisions() {
conf.setBoolean("hbase.master.balancer.decision.buffer.enabled", true);
- loadBalancer.setConf(conf);
+ loadBalancer.onConfigurationChange(conf);
float minCost = conf.getFloat("hbase.master.balancer.stochastic.minCostNeedBalance", 0.05f);
conf.setFloat("hbase.master.balancer.stochastic.minCostNeedBalance", 1.0f);
try {
@@ -64,7 +63,7 @@ public void testBalancerDecisions() {
boolean[] perTableBalancerConfigs = {true, false};
for (boolean isByTable : perTableBalancerConfigs) {
conf.setBoolean(HConstants.HBASE_MASTER_LOADBALANCE_BYTABLE, isByTable);
- loadBalancer.setConf(conf);
+ loadBalancer.onConfigurationChange(conf);
for (int[] mockCluster : clusterStateMocks) {
Map> servers = mockClusterServers(mockCluster);
Map>> LoadOfAllTable =
@@ -93,7 +92,7 @@ public void testBalancerDecisions() {
// reset config
conf.unset(HConstants.HBASE_MASTER_LOADBALANCE_BYTABLE);
conf.setFloat("hbase.master.balancer.stochastic.minCostNeedBalance", minCost);
- loadBalancer.setConf(conf);
+ loadBalancer.onConfigurationChange(conf);
}
}
@@ -101,5 +100,4 @@ private static boolean needsBalanceIdleRegion(int[] cluster) {
return (Arrays.stream(cluster).anyMatch(x -> x > 1)) && (Arrays.stream(cluster)
.anyMatch(x -> x < 1));
}
-
}
diff --git a/hbase-server/src/test/java/org/apache/hadoop/hbase/master/balancer/TestBalancerRejection.java b/hbase-server/src/test/java/org/apache/hadoop/hbase/master/balancer/TestBalancerRejection.java
index 778da568c560..b659bf076fb1 100644
--- a/hbase-server/src/test/java/org/apache/hadoop/hbase/master/balancer/TestBalancerRejection.java
+++ b/hbase-server/src/test/java/org/apache/hadoop/hbase/master/balancer/TestBalancerRejection.java
@@ -82,7 +82,7 @@ public void testBalancerRejections() throws Exception{
//enabled balancer rejection recording
conf.setBoolean(BaseLoadBalancer.BALANCER_REJECTION_BUFFER_ENABLED, true);
conf.set(StochasticLoadBalancer.COST_FUNCTIONS_COST_FUNCTIONS_KEY, MockCostFunction.class.getName());
- loadBalancer.setConf(conf);
+ loadBalancer.onConfigurationChange(conf);
//Simulate 2 servers with 5 regions.
Map> servers = mockClusterServers(new int[] { 5, 5 });
Map>> LoadOfAllTable = (Map) mockClusterServersWithTables(servers);
@@ -95,7 +95,7 @@ public void testBalancerRejections() throws Exception{
//Reject case 2: Cost < minCostNeedBalance
MockCostFunction.mockCost = 1;
conf.setFloat("hbase.master.balancer.stochastic.minCostNeedBalance", Float.MAX_VALUE);
- loadBalancer.setConf(conf);
+ loadBalancer.onConfigurationChange(conf);
Assert.assertNull(loadBalancer.balanceCluster(LoadOfAllTable));
//NamedQueue is an async Producer-consumer Pattern, waiting here until it completed
@@ -113,7 +113,7 @@ public void testBalancerRejections() throws Exception{
}finally {
conf.unset(StochasticLoadBalancer.COST_FUNCTIONS_COST_FUNCTIONS_KEY);
conf.unset(BaseLoadBalancer.BALANCER_REJECTION_BUFFER_ENABLED);
- loadBalancer.setConf(conf);
+ loadBalancer.onConfigurationChange(conf);
}
}
diff --git a/hbase-server/src/test/java/org/apache/hadoop/hbase/master/balancer/TestRSGroupBasedLoadBalancer.java b/hbase-server/src/test/java/org/apache/hadoop/hbase/master/balancer/TestRSGroupBasedLoadBalancer.java
index 6e53d6d58df2..be19f2fca4fa 100644
--- a/hbase-server/src/test/java/org/apache/hadoop/hbase/master/balancer/TestRSGroupBasedLoadBalancer.java
+++ b/hbase-server/src/test/java/org/apache/hadoop/hbase/master/balancer/TestRSGroupBasedLoadBalancer.java
@@ -41,6 +41,7 @@
import org.apache.hadoop.hbase.rsgroup.RSGroupBasedLoadBalancer;
import org.apache.hadoop.hbase.rsgroup.RSGroupInfo;
import org.apache.hadoop.hbase.testclassification.LargeTests;
+import org.apache.hadoop.net.DNSToSwitchMapping;
import org.junit.BeforeClass;
import org.junit.ClassRule;
import org.junit.Test;
@@ -68,8 +69,8 @@ public static void beforeAllTests() throws Exception {
tableDescs = constructTableDesc(true);
conf.set("hbase.regions.slop", "0");
conf.set("hbase.rsgroup.grouploadbalancer.class", SimpleLoadBalancer.class.getCanonicalName());
+ conf.setClass("hbase.util.ip.to.rack.determiner", MockMapping.class, DNSToSwitchMapping.class);
loadBalancer = new RSGroupBasedLoadBalancer();
- loadBalancer.setRsGroupInfoManager(getMockedGroupInfoManager());
loadBalancer.setMasterServices(getMockedMaster());
loadBalancer.initialize();
}
diff --git a/hbase-server/src/test/java/org/apache/hadoop/hbase/master/balancer/TestRSGroupBasedLoadBalancerWithStochasticLoadBalancerAsInternal.java b/hbase-server/src/test/java/org/apache/hadoop/hbase/master/balancer/TestRSGroupBasedLoadBalancerWithStochasticLoadBalancerAsInternal.java
index 8db4ee2608e1..95e78477e195 100644
--- a/hbase-server/src/test/java/org/apache/hadoop/hbase/master/balancer/TestRSGroupBasedLoadBalancerWithStochasticLoadBalancerAsInternal.java
+++ b/hbase-server/src/test/java/org/apache/hadoop/hbase/master/balancer/TestRSGroupBasedLoadBalancerWithStochasticLoadBalancerAsInternal.java
@@ -38,10 +38,12 @@
import org.apache.hadoop.hbase.TableName;
import org.apache.hadoop.hbase.client.RegionInfo;
import org.apache.hadoop.hbase.master.RegionPlan;
+import org.apache.hadoop.hbase.master.balancer.BalancerTestBase.MockMapping;
import org.apache.hadoop.hbase.rsgroup.RSGroupBasedLoadBalancer;
import org.apache.hadoop.hbase.rsgroup.RSGroupInfo;
import org.apache.hadoop.hbase.testclassification.LargeTests;
import org.apache.hadoop.hbase.util.Bytes;
+import org.apache.hadoop.net.DNSToSwitchMapping;
import org.junit.BeforeClass;
import org.junit.ClassRule;
import org.junit.Test;
@@ -67,9 +69,9 @@ public static void beforeAllTests() throws Exception {
conf.set("hbase.regions.slop", "0");
conf.setFloat("hbase.master.balancer.stochastic.readRequestCost", 10000f);
conf.set("hbase.rsgroup.grouploadbalancer.class",
- StochasticLoadBalancer.class.getCanonicalName());
+ StochasticLoadBalancer.class.getCanonicalName());
+ conf.setClass("hbase.util.ip.to.rack.determiner", MockMapping.class, DNSToSwitchMapping.class);
loadBalancer = new RSGroupBasedLoadBalancer();
- loadBalancer.setRsGroupInfoManager(getMockedGroupInfoManager());
loadBalancer.setMasterServices(getMockedMaster());
loadBalancer.initialize();
}
@@ -114,7 +116,7 @@ public void testBalanceCluster() throws IOException {
serverMetricsMap.put(serverC, mockServerMetricsWithReadRequests(serverC, regionsOnServerC, 0));
ClusterMetrics clusterStatus = mock(ClusterMetrics.class);
when(clusterStatus.getLiveServerMetrics()).thenReturn(serverMetricsMap);
- loadBalancer.setClusterMetrics(clusterStatus);
+ loadBalancer.updateClusterMetrics(clusterStatus);
// ReadRequestCostFunction are Rate based, So doing setClusterMetrics again
// this time, regions on serverA with more readRequestCount load
@@ -129,7 +131,7 @@ public void testBalanceCluster() throws IOException {
serverMetricsMap.put(serverC, mockServerMetricsWithReadRequests(serverC, regionsOnServerC, 0));
clusterStatus = mock(ClusterMetrics.class);
when(clusterStatus.getLiveServerMetrics()).thenReturn(serverMetricsMap);
- loadBalancer.setClusterMetrics(clusterStatus);
+ loadBalancer.updateClusterMetrics(clusterStatus);
Map>> LoadOfAllTable =
(Map) mockClusterServersWithTables(clusterState);
diff --git a/hbase-server/src/test/java/org/apache/hadoop/hbase/master/balancer/TestStochasticBalancerJmxMetrics.java b/hbase-server/src/test/java/org/apache/hadoop/hbase/master/balancer/TestStochasticBalancerJmxMetrics.java
index 42a476817d38..99fbceef8982 100644
--- a/hbase-server/src/test/java/org/apache/hadoop/hbase/master/balancer/TestStochasticBalancerJmxMetrics.java
+++ b/hbase-server/src/test/java/org/apache/hadoop/hbase/master/balancer/TestStochasticBalancerJmxMetrics.java
@@ -133,7 +133,8 @@ public void testJmxMetrics_EnsembleMode() throws Exception {
loadBalancer = new StochasticLoadBalancer();
conf.setBoolean(HConstants.HBASE_MASTER_LOADBALANCE_BYTABLE, false);
- loadBalancer.setConf(conf);
+ loadBalancer.setClusterInfoProvider(new DummyClusterInfoProvider(conf));
+ loadBalancer.initialize();
TableName tableName = HConstants.ENSEMBLE_TABLE_NAME;
Map> clusterState = mockClusterServers(mockCluster_ensemble);
@@ -162,7 +163,8 @@ public void testJmxMetrics_PerTableMode() throws Exception {
loadBalancer = new StochasticLoadBalancer();
conf.setBoolean(HConstants.HBASE_MASTER_LOADBALANCE_BYTABLE, true);
- loadBalancer.setConf(conf);
+ loadBalancer.setClusterInfoProvider(new DummyClusterInfoProvider(conf));
+ loadBalancer.initialize();
// NOTE the size is normally set in setClusterMetrics, for test purpose, we set it manually
// Tables: hbase:namespace, table1, table2
diff --git a/hbase-server/src/test/java/org/apache/hadoop/hbase/master/balancer/TestStochasticLoadBalancer.java b/hbase-server/src/test/java/org/apache/hadoop/hbase/master/balancer/TestStochasticLoadBalancer.java
index ff866af5628e..d0093707ed83 100644
--- a/hbase-server/src/test/java/org/apache/hadoop/hbase/master/balancer/TestStochasticLoadBalancer.java
+++ b/hbase-server/src/test/java/org/apache/hadoop/hbase/master/balancer/TestStochasticLoadBalancer.java
@@ -144,7 +144,7 @@ private ServerMetrics mockServerMetricsWithCpRequests(ServerName server,
public void testCPRequestCost() {
// in order to pass needsBalance judgement
conf.setFloat("hbase.master.balancer.stochastic.cpRequestCost", 10000f);
- loadBalancer.setConf(conf);
+ loadBalancer.onConfigurationChange(conf);
// mock cluster State
Map> clusterState = new HashMap>();
ServerName serverA = randomServer(3).getServerName();
@@ -163,7 +163,7 @@ public void testCPRequestCost() {
serverMetricsMap.put(serverC, mockServerMetricsWithCpRequests(serverC, regionsOnServerC, 0));
ClusterMetrics clusterStatus = mock(ClusterMetrics.class);
when(clusterStatus.getLiveServerMetrics()).thenReturn(serverMetricsMap);
- loadBalancer.setClusterMetrics(clusterStatus);
+ loadBalancer.updateClusterMetrics(clusterStatus);
// CPRequestCostFunction are Rate based, So doing setClusterMetrics again
// this time, regions on serverA with more cpRequestCount load
@@ -177,7 +177,7 @@ public void testCPRequestCost() {
serverMetricsMap.put(serverC, mockServerMetricsWithCpRequests(serverC, regionsOnServerC, 0));
clusterStatus = mock(ClusterMetrics.class);
when(clusterStatus.getLiveServerMetrics()).thenReturn(serverMetricsMap);
- loadBalancer.setClusterMetrics(clusterStatus);
+ loadBalancer.updateClusterMetrics(clusterStatus);
List plans =
loadBalancer.balanceTable(HConstants.ENSEMBLE_TABLE_NAME, clusterState);
@@ -196,7 +196,7 @@ public void testCPRequestCost() {
assertNull(loadBalancer.namedQueueRecorder);
// reset config
conf.setFloat("hbase.master.balancer.stochastic.cpRequestCost", 5f);
- loadBalancer.setConf(conf);
+ loadBalancer.onConfigurationChange(conf);
}
@Test
@@ -223,7 +223,7 @@ public void testKeepRegionLoad() throws Exception {
when(clusterStatus.getLiveServerMetrics()).thenReturn(serverMetricsMap);
// when(clusterStatus.getLoad(sn)).thenReturn(sl);
- loadBalancer.setClusterMetrics(clusterStatus);
+ loadBalancer.updateClusterMetrics(clusterStatus);
}
String regionNameAsString = RegionInfo.getRegionNameAsString(Bytes.toBytes(REGION_KEY));
@@ -249,7 +249,7 @@ public void testNeedBalance() {
boolean[] perTableBalancerConfigs = {true, false};
for (boolean isByTable : perTableBalancerConfigs) {
conf.setBoolean(HConstants.HBASE_MASTER_LOADBALANCE_BYTABLE, isByTable);
- loadBalancer.setConf(conf);
+ loadBalancer.onConfigurationChange(conf);
for (int[] mockCluster : clusterStateMocks) {
Map> servers = mockClusterServers(mockCluster);
Map>> LoadOfAllTable =
@@ -263,7 +263,7 @@ public void testNeedBalance() {
// reset config
conf.unset(HConstants.HBASE_MASTER_LOADBALANCE_BYTABLE);
conf.setFloat("hbase.master.balancer.stochastic.minCostNeedBalance", minCost);
- loadBalancer.setConf(conf);
+ loadBalancer.onConfigurationChange(conf);
}
}
@@ -378,7 +378,7 @@ public void testSkewCost() {
@Test
public void testCostAfterUndoAction() {
final int runs = 10;
- loadBalancer.setConf(conf);
+ loadBalancer.onConfigurationChange(conf);
for (int[] mockCluster : clusterStateMocks) {
BalancerClusterState cluster = mockCluster(mockCluster);
loadBalancer.initCosts(cluster);
@@ -505,13 +505,13 @@ public void testAdditionalCostFunction() {
conf.set(StochasticLoadBalancer.COST_FUNCTIONS_COST_FUNCTIONS_KEY,
DummyCostFunction.class.getName());
- loadBalancer.setConf(conf);
+ loadBalancer.onConfigurationChange(conf);
assertTrue(Arrays.
asList(loadBalancer.getCostFunctionNames()).
contains(DummyCostFunction.class.getSimpleName()));
} finally {
conf.unset(StochasticLoadBalancer.COST_FUNCTIONS_COST_FUNCTIONS_KEY);
- loadBalancer.setConf(conf);
+ loadBalancer.onConfigurationChange(conf);
}
}
diff --git a/hbase-server/src/test/java/org/apache/hadoop/hbase/master/balancer/TestStochasticLoadBalancerBalanceCluster.java b/hbase-server/src/test/java/org/apache/hadoop/hbase/master/balancer/TestStochasticLoadBalancerBalanceCluster.java
index c000daea1cae..b7a201916f80 100644
--- a/hbase-server/src/test/java/org/apache/hadoop/hbase/master/balancer/TestStochasticLoadBalancerBalanceCluster.java
+++ b/hbase-server/src/test/java/org/apache/hadoop/hbase/master/balancer/TestStochasticLoadBalancerBalanceCluster.java
@@ -54,7 +54,7 @@ public void testBalanceCluster() throws Exception {
conf.setLong(StochasticLoadBalancer.MAX_STEPS_KEY, 2000000L);
conf.setLong("hbase.master.balancer.stochastic.maxRunningTime", 90 * 1000); // 90 sec
conf.setFloat("hbase.master.balancer.stochastic.maxMovePercent", 1.0f);
- loadBalancer.setConf(conf);
+ loadBalancer.onConfigurationChange(conf);
for (int[] mockCluster : clusterStateMocks) {
Map> servers = mockClusterServers(mockCluster);
List list = convertToList(servers);
diff --git a/hbase-server/src/test/java/org/apache/hadoop/hbase/master/balancer/TestStochasticLoadBalancerHeterogeneousCost.java b/hbase-server/src/test/java/org/apache/hadoop/hbase/master/balancer/TestStochasticLoadBalancerHeterogeneousCost.java
index c7342c3632ba..1e3a3043afec 100644
--- a/hbase-server/src/test/java/org/apache/hadoop/hbase/master/balancer/TestStochasticLoadBalancerHeterogeneousCost.java
+++ b/hbase-server/src/test/java/org/apache/hadoop/hbase/master/balancer/TestStochasticLoadBalancerHeterogeneousCost.java
@@ -75,7 +75,8 @@ public static void beforeAllTests() throws IOException {
HeterogeneousRegionCountCostFunction.HBASE_MASTER_BALANCER_HETEROGENEOUS_RULES_FILE,
RULES_FILE);
loadBalancer = new StochasticLoadBalancer();
- loadBalancer.setConf(BalancerTestBase.conf);
+ loadBalancer.setClusterInfoProvider(new DummyClusterInfoProvider(conf));
+ loadBalancer.initialize();
loadBalancer.getCandidateGenerators().add(new FairRandomCandidateGenerator());
}
diff --git a/hbase-server/src/test/java/org/apache/hadoop/hbase/master/balancer/TestStochasticLoadBalancerRegionReplicaHighReplication.java b/hbase-server/src/test/java/org/apache/hadoop/hbase/master/balancer/TestStochasticLoadBalancerRegionReplicaHighReplication.java
index d5e5d531e99b..a58b8e162968 100644
--- a/hbase-server/src/test/java/org/apache/hadoop/hbase/master/balancer/TestStochasticLoadBalancerRegionReplicaHighReplication.java
+++ b/hbase-server/src/test/java/org/apache/hadoop/hbase/master/balancer/TestStochasticLoadBalancerRegionReplicaHighReplication.java
@@ -36,7 +36,7 @@ public class TestStochasticLoadBalancerRegionReplicaHighReplication
public void testRegionReplicasOnMidClusterHighReplication() {
conf.setLong(StochasticLoadBalancer.MAX_STEPS_KEY, 4000000L);
conf.setLong("hbase.master.balancer.stochastic.maxRunningTime", 120 * 1000); // 120 sec
- loadBalancer.setConf(conf);
+ loadBalancer.onConfigurationChange(conf);
int numNodes = 40;
int numRegions = 6 * numNodes;
int replication = 40; // 40 replicas per region, one for each server
diff --git a/hbase-server/src/test/java/org/apache/hadoop/hbase/master/balancer/TestStochasticLoadBalancerRegionReplicaReplicationGreaterThanNumNodes.java b/hbase-server/src/test/java/org/apache/hadoop/hbase/master/balancer/TestStochasticLoadBalancerRegionReplicaReplicationGreaterThanNumNodes.java
index dd7e92c5f9a5..098b3d901935 100644
--- a/hbase-server/src/test/java/org/apache/hadoop/hbase/master/balancer/TestStochasticLoadBalancerRegionReplicaReplicationGreaterThanNumNodes.java
+++ b/hbase-server/src/test/java/org/apache/hadoop/hbase/master/balancer/TestStochasticLoadBalancerRegionReplicaReplicationGreaterThanNumNodes.java
@@ -35,7 +35,7 @@ public class TestStochasticLoadBalancerRegionReplicaReplicationGreaterThanNumNod
@Test
public void testRegionReplicationOnMidClusterReplicationGreaterThanNumNodes() {
conf.setLong("hbase.master.balancer.stochastic.maxRunningTime", 120 * 1000); // 120 sec
- loadBalancer.setConf(conf);
+ loadBalancer.onConfigurationChange(conf);
int numNodes = 40;
int numRegions = 6 * 50;
int replication = 50; // 50 replicas per region, more than numNodes
diff --git a/hbase-server/src/test/java/org/apache/hadoop/hbase/master/balancer/TestStochasticLoadBalancerRegionReplicaSameHosts.java b/hbase-server/src/test/java/org/apache/hadoop/hbase/master/balancer/TestStochasticLoadBalancerRegionReplicaSameHosts.java
index 621f584860f7..8a71443e7ba6 100644
--- a/hbase-server/src/test/java/org/apache/hadoop/hbase/master/balancer/TestStochasticLoadBalancerRegionReplicaSameHosts.java
+++ b/hbase-server/src/test/java/org/apache/hadoop/hbase/master/balancer/TestStochasticLoadBalancerRegionReplicaSameHosts.java
@@ -42,7 +42,7 @@ public void testRegionReplicationOnMidClusterSameHosts() {
conf.setLong(StochasticLoadBalancer.MAX_STEPS_KEY, 2000000L);
conf.setLong("hbase.master.balancer.stochastic.maxRunningTime", 90 * 1000); // 90 sec
conf.setFloat("hbase.master.balancer.stochastic.maxMovePercent", 1.0f);
- loadBalancer.setConf(conf);
+ loadBalancer.onConfigurationChange(conf);
int numHosts = 30;
int numRegions = 30 * 30;
int replication = 3; // 3 replicas per region
diff --git a/hbase-server/src/test/java/org/apache/hadoop/hbase/master/balancer/TestStochasticLoadBalancerRegionReplicaWithRacks.java b/hbase-server/src/test/java/org/apache/hadoop/hbase/master/balancer/TestStochasticLoadBalancerRegionReplicaWithRacks.java
index fddb9724f584..c48bda24ef3a 100644
--- a/hbase-server/src/test/java/org/apache/hadoop/hbase/master/balancer/TestStochasticLoadBalancerRegionReplicaWithRacks.java
+++ b/hbase-server/src/test/java/org/apache/hadoop/hbase/master/balancer/TestStochasticLoadBalancerRegionReplicaWithRacks.java
@@ -54,7 +54,7 @@ public void testRegionReplicationOnMidClusterWithRacks() {
conf.setLong(StochasticLoadBalancer.MAX_STEPS_KEY, 10000000L);
conf.setFloat("hbase.master.balancer.stochastic.maxMovePercent", 1.0f);
conf.setLong("hbase.master.balancer.stochastic.maxRunningTime", 120 * 1000); // 120 sec
- loadBalancer.setConf(conf);
+ loadBalancer.onConfigurationChange(conf);
int numNodes = 30;
int numRegions = numNodes * 30;
int replication = 3; // 3 replicas per region