You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@hbase.apache.org by ji...@apache.org on 2008/10/11 21:01:55 UTC
svn commit: r703710 - in /hadoop/hbase/branches/0.18: CHANGES.txt
src/java/org/apache/hadoop/hbase/RegionHistorian.java
src/java/org/apache/hadoop/hbase/master/RegionManager.java
Author: jimk
Date: Sat Oct 11 12:01:54 2008
New Revision: 703710
URL: http://svn.apache.org/viewvc?rev=703710&view=rev
Log:
HBASE-918 Region balancing during startup makes cluster unstable
Modified:
hadoop/hbase/branches/0.18/CHANGES.txt
hadoop/hbase/branches/0.18/src/java/org/apache/hadoop/hbase/RegionHistorian.java
hadoop/hbase/branches/0.18/src/java/org/apache/hadoop/hbase/master/RegionManager.java
Modified: hadoop/hbase/branches/0.18/CHANGES.txt
URL: http://svn.apache.org/viewvc/hadoop/hbase/branches/0.18/CHANGES.txt?rev=703710&r1=703709&r2=703710&view=diff
==============================================================================
--- hadoop/hbase/branches/0.18/CHANGES.txt (original)
+++ hadoop/hbase/branches/0.18/CHANGES.txt Sat Oct 11 12:01:54 2008
@@ -6,6 +6,7 @@
HBASE-891 HRS.validateValuesLength throws IOE, gets caught in the retries
HBASE-906 [shell] Truncates output
HBASE-912 PE is broken when other tables exist
+ HBASE-918 Region balancing during startup makes cluster unstable
Release 0.18.0 - September 21st, 2008
Modified: hadoop/hbase/branches/0.18/src/java/org/apache/hadoop/hbase/RegionHistorian.java
URL: http://svn.apache.org/viewvc/hadoop/hbase/branches/0.18/src/java/org/apache/hadoop/hbase/RegionHistorian.java?rev=703710&r1=703709&r2=703710&view=diff
==============================================================================
--- hadoop/hbase/branches/0.18/src/java/org/apache/hadoop/hbase/RegionHistorian.java (original)
+++ hadoop/hbase/branches/0.18/src/java/org/apache/hadoop/hbase/RegionHistorian.java Sat Oct 11 12:01:54 2008
@@ -86,7 +86,7 @@
* Get the RegionHistorian Singleton instance.
* @return The region historian
*/
- public static RegionHistorian getInstance() {
+ public synchronized static RegionHistorian getInstance() {
if (historian == null) {
historian = new RegionHistorian();
}
Modified: hadoop/hbase/branches/0.18/src/java/org/apache/hadoop/hbase/master/RegionManager.java
URL: http://svn.apache.org/viewvc/hadoop/hbase/branches/0.18/src/java/org/apache/hadoop/hbase/master/RegionManager.java?rev=703710&r1=703709&r2=703710&view=diff
==============================================================================
--- hadoop/hbase/branches/0.18/src/java/org/apache/hadoop/hbase/master/RegionManager.java (original)
+++ hadoop/hbase/branches/0.18/src/java/org/apache/hadoop/hbase/master/RegionManager.java Sat Oct 11 12:01:54 2008
@@ -178,16 +178,19 @@
// worked on elsewhere.
Set<HRegionInfo> regionsToAssign = regionsAwaitingAssignment();
if (regionsToAssign.size() == 0) {
- // There are no regions waiting to be assigned. This is an opportunity
- // for us to check if this server is overloaded.
- double avgLoad = master.serverManager.getAverageLoad();
- if (avgLoad > 2.0 && thisServersLoad.getNumberOfRegions() > avgLoad) {
- if (LOG.isDebugEnabled()) {
- LOG.debug("Server " + serverName + " is overloaded. Server load: " +
- thisServersLoad.getNumberOfRegions() + " avg: " + avgLoad);
+ // There are no regions waiting to be assigned.
+ if (allRegionsAssigned()) {
+ // We only do load balancing once all regions are assigned.
+ // This prevents churn while the cluster is starting up.
+ double avgLoad = master.serverManager.getAverageLoad();
+ if (avgLoad > 2.0 && thisServersLoad.getNumberOfRegions() > avgLoad) {
+ if (LOG.isDebugEnabled()) {
+ LOG.debug("Server " + serverName + " is overloaded. Server load: " +
+ thisServersLoad.getNumberOfRegions() + " avg: " + avgLoad);
+ }
+ unassignSomeRegions(thisServersLoad, avgLoad, mostLoadedRegions,
+ returnMsgs);
}
- unassignSomeRegions(thisServersLoad, avgLoad, mostLoadedRegions,
- returnMsgs);
}
} else {
// if there's only one server, just give it all the regions
@@ -843,6 +846,15 @@
}
/**
+ * @return true if the initial meta scan is complete and there are no
+ * unassigned or pending regions
+ */
+ public boolean allRegionsAssigned() {
+ return isInitialMetaScanComplete() && unassignedRegions.size() == 0 &&
+ pendingRegions.size() == 0;
+ }
+
+ /**
* Get the root region location.
* @return HServerAddress describing root region server.
*/