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/11/10 20:03:03 UTC
svn commit: r712722 - in /hadoop/hbase/trunk: ./
src/java/org/apache/hadoop/hbase/client/
src/java/org/apache/hadoop/hbase/master/
src/java/org/apache/hadoop/hbase/regionserver/
Author: jimk
Date: Mon Nov 10 11:03:01 2008
New Revision: 712722
URL: http://svn.apache.org/viewvc?rev=712722&view=rev
Log:
HBASE-964, HBASE-678 provide for safe-mode without locking up HBase "waiting for root region"
Modified:
hadoop/hbase/trunk/CHANGES.txt
hadoop/hbase/trunk/src/java/org/apache/hadoop/hbase/client/HConnectionManager.java
hadoop/hbase/trunk/src/java/org/apache/hadoop/hbase/master/HMaster.java
hadoop/hbase/trunk/src/java/org/apache/hadoop/hbase/master/RegionManager.java
hadoop/hbase/trunk/src/java/org/apache/hadoop/hbase/regionserver/HRegionServer.java
Modified: hadoop/hbase/trunk/CHANGES.txt
URL: http://svn.apache.org/viewvc/hadoop/hbase/trunk/CHANGES.txt?rev=712722&r1=712721&r2=712722&view=diff
==============================================================================
--- hadoop/hbase/trunk/CHANGES.txt (original)
+++ hadoop/hbase/trunk/CHANGES.txt Mon Nov 10 11:03:01 2008
@@ -66,7 +66,8 @@
HBASE-984 Fix javadoc warnings
HBASE-985 Fix javadoc warnings
HBASE-951 Either shut down master or let it finish cleanup
- HBASE-964 Startup stuck "waiting for root region"
+ HBASE-964, HBASE-678 provide for safe-mode without locking up HBase "waiting
+ for root region"
IMPROVEMENTS
HBASE-901 Add a limit to key length, check key and value length on client side
Modified: hadoop/hbase/trunk/src/java/org/apache/hadoop/hbase/client/HConnectionManager.java
URL: http://svn.apache.org/viewvc/hadoop/hbase/trunk/src/java/org/apache/hadoop/hbase/client/HConnectionManager.java?rev=712722&r1=712721&r2=712722&view=diff
==============================================================================
--- hadoop/hbase/trunk/src/java/org/apache/hadoop/hbase/client/HConnectionManager.java (original)
+++ hadoop/hbase/trunk/src/java/org/apache/hadoop/hbase/client/HConnectionManager.java Mon Nov 10 11:03:01 2008
@@ -132,7 +132,7 @@
private final Map<String, HRegionInterface> servers =
new ConcurrentHashMap<String, HRegionInterface>();
- private HRegionLocation rootRegionLocation;
+ private volatile HRegionLocation rootRegionLocation;
private final Map<Integer, SoftValueSortedMap<byte [], HRegionLocation>>
cachedRegionLocations = Collections.synchronizedMap(
Modified: hadoop/hbase/trunk/src/java/org/apache/hadoop/hbase/master/HMaster.java
URL: http://svn.apache.org/viewvc/hadoop/hbase/trunk/src/java/org/apache/hadoop/hbase/master/HMaster.java?rev=712722&r1=712721&r2=712722&view=diff
==============================================================================
--- hadoop/hbase/trunk/src/java/org/apache/hadoop/hbase/master/HMaster.java (original)
+++ hadoop/hbase/trunk/src/java/org/apache/hadoop/hbase/master/HMaster.java Mon Nov 10 11:03:01 2008
@@ -800,7 +800,7 @@
public HServerAddress findRootRegion() {
HServerAddress rootServer = null;
- if (regionManager.isInitialMetaScanComplete()) {
+ if (!regionManager.inSafeMode()) {
rootServer = regionManager.getRootRegionLocation();
}
return rootServer;
Modified: hadoop/hbase/trunk/src/java/org/apache/hadoop/hbase/master/RegionManager.java
URL: http://svn.apache.org/viewvc/hadoop/hbase/trunk/src/java/org/apache/hadoop/hbase/master/RegionManager.java?rev=712722&r1=712721&r2=712722&view=diff
==============================================================================
--- hadoop/hbase/trunk/src/java/org/apache/hadoop/hbase/master/RegionManager.java (original)
+++ hadoop/hbase/trunk/src/java/org/apache/hadoop/hbase/master/RegionManager.java Mon Nov 10 11:03:01 2008
@@ -62,6 +62,8 @@
private volatile AtomicReference<HServerAddress> rootRegionLocation =
new AtomicReference<HServerAddress>(null);
+ private volatile boolean safeMode = true;
+
final Lock splitLogLock = new ReentrantLock();
private final RootScanner rootScannerThread;
@@ -190,7 +192,7 @@
Set<HRegionInfo> regionsToAssign = regionsAwaitingAssignment();
if (regionsToAssign.size() == 0) {
// There are no regions waiting to be assigned.
- if (allRegionsAssigned()) {
+ if (!inSafeMode()) {
// We only do load balancing once all regions are assigned.
// This prevents churn while the cluster is starting up.
double avgLoad = master.serverManager.getAverageLoad();
@@ -860,9 +862,17 @@
* @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;
+ public boolean inSafeMode() {
+ if (safeMode) {
+ if(isInitialMetaScanComplete() && unassignedRegions.size() == 0 &&
+ pendingRegions.size() == 0) {
+ safeMode = false;
+ LOG.info("exiting safe mode");
+ } else {
+ LOG.info("in safe mode");
+ }
+ }
+ return safeMode;
}
/**
Modified: hadoop/hbase/trunk/src/java/org/apache/hadoop/hbase/regionserver/HRegionServer.java
URL: http://svn.apache.org/viewvc/hadoop/hbase/trunk/src/java/org/apache/hadoop/hbase/regionserver/HRegionServer.java?rev=712722&r1=712721&r2=712722&view=diff
==============================================================================
--- hadoop/hbase/trunk/src/java/org/apache/hadoop/hbase/regionserver/HRegionServer.java (original)
+++ hadoop/hbase/trunk/src/java/org/apache/hadoop/hbase/regionserver/HRegionServer.java Mon Nov 10 11:03:01 2008
@@ -123,6 +123,7 @@
protected final HBaseConfiguration conf;
private final ServerConnection connection;
+ private final AtomicBoolean haveRootRegion = new AtomicBoolean(false);
private FileSystem fs;
private Path rootDir;
private final Random rand = new Random();
@@ -303,23 +304,22 @@
boolean quiesceRequested = false;
// A sleeper that sleeps for msgInterval.
Sleeper sleeper = new Sleeper(this.msgInterval, this.stopRequested);
- boolean haveRootRegion = false;
try {
init(reportForDuty(sleeper));
- // Try to get the root region location from the master.
- if (!haveRootRegion) {
- HServerAddress rootServer = hbaseMaster.getRootRegionLocation();
- if (rootServer != null) {
- // By setting the root region location, we bypass the wait imposed on
- // HTable for all regions being assigned.
- this.connection.setRootRegionLocation(
- new HRegionLocation(HRegionInfo.ROOT_REGIONINFO, rootServer));
- haveRootRegion = true;
- }
- }
long lastMsg = 0;
// Now ask master what it wants us to do and tell it what we have done
for (int tries = 0; !stopRequested.get() && isHealthy();) {
+ // Try to get the root region location from the master.
+ if (!haveRootRegion.get()) {
+ HServerAddress rootServer = hbaseMaster.getRootRegionLocation();
+ if (rootServer != null) {
+ // By setting the root region location, we bypass the wait imposed on
+ // HTable for all regions being assigned.
+ this.connection.setRootRegionLocation(
+ new HRegionLocation(HRegionInfo.ROOT_REGIONINFO, rootServer));
+ haveRootRegion.set(true);
+ }
+ }
long now = System.currentTimeMillis();
if (lastMsg != 0 && (now - lastMsg) >= serverLeaseTimeout) {
// It has been way too long since we last reported to the master.
@@ -890,6 +890,7 @@
continue;
}
LOG.info(e.msg);
+ HRegionInfo info = e.msg.getRegionInfo();
switch(e.msg.getType()) {
case MSG_REGIONSERVER_QUIESCE:
@@ -898,7 +899,18 @@
case MSG_REGION_OPEN:
// Open a region
- openRegion(e.msg.getRegionInfo());
+ if (!haveRootRegion.get() && !info.isRootRegion()) {
+ // root region is not online yet. requeue this task
+ LOG.info("putting region open request back into queue because" +
+ " root region is not yet available");
+ try {
+ toDo.put(e);
+ } catch (InterruptedException ex) {
+ LOG.warn("insertion into toDo queue was interrupted", ex);
+ break;
+ }
+ }
+ openRegion(info);
break;
case MSG_REGION_CLOSE:
@@ -912,7 +924,6 @@
break;
case MSG_REGION_SPLIT: {
- HRegionInfo info = e.msg.getRegionInfo();
// Force split a region
HRegion region = getRegion(info.getRegionName());
region.regionInfo.shouldSplit(true);
@@ -921,7 +932,6 @@
case MSG_REGION_COMPACT: {
// Compact a region
- HRegionInfo info = e.msg.getRegionInfo();
HRegion region = getRegion(info.getRegionName());
compactSplitThread.compactionRequested(region);
} break;