You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@hbase.apache.org by st...@apache.org on 2008/04/02 00:12:29 UTC
svn commit: r643621 - in /hadoop/hbase: branches/0.1/
branches/0.1/src/java/org/apache/hadoop/hbase/ trunk/
trunk/src/java/org/apache/hadoop/hbase/master/
trunk/src/java/org/apache/hadoop/hbase/regionserver/
trunk/src/java/org/apache/hadoop/hbase/util/
Author: stack
Date: Tue Apr 1 15:12:23 2008
New Revision: 643621
URL: http://svn.apache.org/viewvc?rev=643621&view=rev
Log: (empty)
Modified:
hadoop/hbase/branches/0.1/CHANGES.txt
hadoop/hbase/branches/0.1/src/java/org/apache/hadoop/hbase/HMaster.java
hadoop/hbase/branches/0.1/src/java/org/apache/hadoop/hbase/HRegionServer.java
hadoop/hbase/trunk/CHANGES.txt
hadoop/hbase/trunk/src/java/org/apache/hadoop/hbase/master/RegionManager.java
hadoop/hbase/trunk/src/java/org/apache/hadoop/hbase/regionserver/HRegionServer.java
hadoop/hbase/trunk/src/java/org/apache/hadoop/hbase/util/MetaUtils.java
Modified: hadoop/hbase/branches/0.1/CHANGES.txt
URL: http://svn.apache.org/viewvc/hadoop/hbase/branches/0.1/CHANGES.txt?rev=643621&r1=643620&r2=643621&view=diff
==============================================================================
--- hadoop/hbase/branches/0.1/CHANGES.txt (original)
+++ hadoop/hbase/branches/0.1/CHANGES.txt Tue Apr 1 15:12:23 2008
@@ -8,6 +8,8 @@
server reports that it is processing the open request
HBASE-552 Fix bloom filter bugs (Andrzej Bialecki via Jim Kellerman)
HBASE-507 Add sleep between retries
+ HBASE-555 Only one Worker in HRS; on startup, if assigned tens of regions,
+ havoc of reassignments because open processing is done in series
NEW FEATURES
HBASE-548 Tool to online single region
Modified: hadoop/hbase/branches/0.1/src/java/org/apache/hadoop/hbase/HMaster.java
URL: http://svn.apache.org/viewvc/hadoop/hbase/branches/0.1/src/java/org/apache/hadoop/hbase/HMaster.java?rev=643621&r1=643620&r2=643621&view=diff
==============================================================================
--- hadoop/hbase/branches/0.1/src/java/org/apache/hadoop/hbase/HMaster.java (original)
+++ hadoop/hbase/branches/0.1/src/java/org/apache/hadoop/hbase/HMaster.java Tue Apr 1 15:12:23 2008
@@ -105,6 +105,9 @@
final int threadWakeFrequency;
final int numRetries;
final long maxRegionOpenTime;
+
+ // How many regions to assign a server at a time.
+ private final int maxAssignInOneGo;
volatile DelayQueue<RegionServerOperation> delayedToDoQueue =
new DelayQueue<RegionServerOperation>();
@@ -967,6 +970,9 @@
this.sleeper = new Sleeper(this.threadWakeFrequency, this.closed);
+ this.maxAssignInOneGo =
+ this.conf.getInt("hbase.master.regions.percheckin", 10);
+
// We're almost open for business
this.closed.set(false);
LOG.info("HMaster initialized on " + this.address.toString());
@@ -1847,6 +1853,9 @@
nregions = nRegionsToAssign;
}
+ if (nregions > this.maxAssignInOneGo) {
+ nregions = this.maxAssignInOneGo;
+ }
now = System.currentTimeMillis();
for (HRegionInfo regionInfo: regionsToAssign) {
LOG.info("assigning region " + regionInfo.getRegionName() +
@@ -1903,11 +1912,15 @@
private void assignRegionsToOneServer(final Set<HRegionInfo> regionsToAssign,
final String serverName, final ArrayList<HMsg> returnMsgs) {
long now = System.currentTimeMillis();
+ int count = 0;
for (HRegionInfo regionInfo: regionsToAssign) {
LOG.info("assigning region " + regionInfo.getRegionName() +
" to the only server " + serverName);
this.unassignedRegions.put(regionInfo, Long.valueOf(now));
returnMsgs.add(new HMsg(HMsg.MSG_REGION_OPEN, regionInfo));
+ if (count++ >= this.maxAssignInOneGo) {
+ break;
+ }
}
}
Modified: hadoop/hbase/branches/0.1/src/java/org/apache/hadoop/hbase/HRegionServer.java
URL: http://svn.apache.org/viewvc/hadoop/hbase/branches/0.1/src/java/org/apache/hadoop/hbase/HRegionServer.java?rev=643621&r1=643620&r2=643621&view=diff
==============================================================================
--- hadoop/hbase/branches/0.1/src/java/org/apache/hadoop/hbase/HRegionServer.java (original)
+++ hadoop/hbase/branches/0.1/src/java/org/apache/hadoop/hbase/HRegionServer.java Tue Apr 1 15:12:23 2008
@@ -672,7 +672,7 @@
// Queue up the HMaster's instruction stream for processing
boolean restart = false;
for(int i = 0; i < msgs.length && !stopRequested.get() &&
- !restart; i++) {
+ !restart; i++) {
switch(msgs[i].getMsg()) {
case HMsg.MSG_CALL_SERVER_STARTUP:
@@ -686,7 +686,6 @@
synchronized (logRollerLock) {
try {
log.closeAndDelete();
-
} catch (Exception e) {
LOG.error("error closing and deleting HLog", e);
}
@@ -735,10 +734,6 @@
throw new RuntimeException("Putting into msgQueue was " +
"interrupted.", e);
}
- if (msgs[i].getMsg() == HMsg.MSG_REGION_OPEN) {
- this.outboundMsgs.add(new HMsg(HMsg.MSG_REPORT_PROCESS_OPEN,
- msgs[i].getRegionInfo()));
- }
}
}
}
@@ -765,6 +760,8 @@
}
}
}
+ // Do some housekeeping before going to sleep
+ housekeeping();
sleeper.sleep(lastMsg);
} // for
} catch (Throwable t) {
@@ -939,6 +936,25 @@
serverInfo.getServerAddress().toString());
}
+ /* Run some housekeeping tasks before we go into 'hibernation' sleeping at
+ * the end of the main HRegionServer run loop.
+ */
+ private void housekeeping() {
+ // If the todo list has > 0 messages, iterate looking for open region
+ // messages. Send the master a message that we're working on its
+ // processing so it doesn't assign the region elsewhere.
+ if (this.toDo.size() <= 0) {
+ return;
+ }
+ // This iterator is 'safe'. We are guaranteed a view on state of the
+ // queue at time iterator was taken out. Apparently goes from oldest.
+ for (ToDoEntry e: this.toDo) {
+ if (e.msg.getMsg() == HMsg.MSG_REGION_OPEN) {
+ addProcessingMessage(e.msg.getRegionInfo());
+ }
+ }
+ }
+
/** @return the HLog */
HLog getLog() {
return this.log;
@@ -1072,7 +1088,8 @@
this.msg = msg;
}
}
- BlockingQueue<ToDoEntry> toDo = new LinkedBlockingQueue<ToDoEntry>();
+
+ final BlockingQueue<ToDoEntry> toDo = new LinkedBlockingQueue<ToDoEntry>();
private Worker worker;
private Thread workerThread;
@@ -1164,8 +1181,7 @@
this.log, this.fs, conf, regionInfo, null, this.cacheFlusher,
new Progressable() {
public void progress() {
- getOutboundMsgs().add(new HMsg(HMsg.MSG_REPORT_PROCESS_OPEN,
- regionInfo));
+ addProcessingMessage(regionInfo);
}
}
);
@@ -1189,6 +1205,17 @@
}
reportOpen(regionInfo);
}
+ }
+
+ /*
+ * Add a MSG_REPORT_PROCESS_OPEN to the outbound queue.
+ * This method is called while region is in the queue of regions to process
+ * and then while the region is being opened, it is called from the Worker
+ * thread that is running the region open.
+ * @param hri Region to add the message for
+ */
+ protected void addProcessingMessage(final HRegionInfo hri) {
+ getOutboundMsgs().add(new HMsg(HMsg.MSG_REPORT_PROCESS_OPEN, hri));
}
void closeRegion(final HRegionInfo hri, final boolean reportWhenCompleted)
Modified: hadoop/hbase/trunk/CHANGES.txt
URL: http://svn.apache.org/viewvc/hadoop/hbase/trunk/CHANGES.txt?rev=643621&r1=643620&r2=643621&view=diff
==============================================================================
--- hadoop/hbase/trunk/CHANGES.txt (original)
+++ hadoop/hbase/trunk/CHANGES.txt Tue Apr 1 15:12:23 2008
@@ -6,6 +6,8 @@
iteration, edits are aggregated up into the millions
HBASE-505 Region assignments should never time out so long as the region
server reports that it is processing the open request
+ HBASE-555 Only one Worker in HRS; on startup, if assigned tens of regions,
+ havoc of reassignments because open processing is done in series
NEW FEATURES
HBASE-548 Tool to online single region
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=643621&r1=643620&r2=643621&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 Tue Apr 1 15:12:23 2008
@@ -114,11 +114,18 @@
*/
private final Set<Text> regionsToDelete =
Collections.synchronizedSet(new HashSet<Text>());
+
+
+ // How many regions to assign a server at a time.
+ private final int maxAssignInOneGo;
private HMaster master;
RegionManager(HMaster master) {
this.master = master;
+
+ this.maxAssignInOneGo = this.master.conf.
+ getInt("hbase.regions.percheckin", 10);
// The root region
rootScannerThread = new RootScanner(master, this);
@@ -258,6 +265,9 @@
nregions = nRegionsToAssign;
}
+ if (nregions > this.maxAssignInOneGo) {
+ nregions = this.maxAssignInOneGo;
+ }
now = System.currentTimeMillis();
for (HRegionInfo regionInfo: regionsToAssign) {
LOG.info("assigning region " + regionInfo.getRegionName() +
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=643621&r1=643620&r2=643621&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 Tue Apr 1 15:12:23 2008
@@ -301,7 +301,7 @@
// Queue up the HMaster's instruction stream for processing
boolean restart = false;
for(int i = 0; i < msgs.length && !stopRequested.get() &&
- !restart; i++) {
+ !restart; i++) {
switch(msgs[i].getMsg()) {
case HMsg.MSG_CALL_SERVER_STARTUP:
@@ -315,7 +315,6 @@
synchronized (logRollerLock) {
try {
log.closeAndDelete();
-
} catch (Exception e) {
LOG.error("error closing and deleting HLog", e);
}
@@ -364,10 +363,6 @@
throw new RuntimeException("Putting into msgQueue was " +
"interrupted.", e);
}
- if (msgs[i].getMsg() == HMsg.MSG_REGION_OPEN) {
- this.outboundMsgs.add(new HMsg(HMsg.MSG_REPORT_PROCESS_OPEN,
- msgs[i].getRegionInfo()));
- }
}
}
}
@@ -394,6 +389,8 @@
}
}
}
+ // Do some housekeeping before going to sleep
+ housekeeping();
sleeper.sleep(lastMsg);
} // for
} catch (Throwable t) {
@@ -564,6 +561,25 @@
serverInfo.getServerAddress().toString());
}
+ /* Run some housekeeping tasks before we go into 'hibernation' sleeping at
+ * the end of the main HRegionServer run loop.
+ */
+ private void housekeeping() {
+ // If the todo list has > 0 messages, iterate looking for open region
+ // messages. Send the master a message that we're working on its
+ // processing so it doesn't assign the region elsewhere.
+ if (this.toDo.size() <= 0) {
+ return;
+ }
+ // This iterator is 'safe'. We are guaranteed a view on state of the
+ // queue at time iterator was taken out. Apparently goes from oldest.
+ for (ToDoEntry e: this.toDo) {
+ if (e.msg.getMsg() == HMsg.MSG_REGION_OPEN) {
+ addProcessingMessage(e.msg.getRegionInfo());
+ }
+ }
+ }
+
/** @return the HLog */
HLog getLog() {
return this.log;
@@ -697,7 +713,8 @@
this.msg = msg;
}
}
- BlockingQueue<ToDoEntry> toDo = new LinkedBlockingQueue<ToDoEntry>();
+
+ final BlockingQueue<ToDoEntry> toDo = new LinkedBlockingQueue<ToDoEntry>();
private Worker worker;
private Thread workerThread;
@@ -789,8 +806,7 @@
this.log, this.fs, conf, regionInfo, null, this.cacheFlusher,
new Progressable() {
public void progress() {
- getOutboundMsgs().add(new HMsg(HMsg.MSG_REPORT_PROCESS_OPEN,
- regionInfo));
+ addProcessingMessage(regionInfo);
}
}
);
@@ -814,6 +830,17 @@
}
reportOpen(regionInfo);
}
+ }
+
+ /*
+ * Add a MSG_REPORT_PROCESS_OPEN to the outbound queue.
+ * This method is called while region is in the queue of regions to process
+ * and then while the region is being opened, it is called from the Worker
+ * thread that is running the region open.
+ * @param hri Region to add the message for
+ */
+ protected void addProcessingMessage(final HRegionInfo hri) {
+ getOutboundMsgs().add(new HMsg(HMsg.MSG_REPORT_PROCESS_OPEN, hri));
}
void closeRegion(final HRegionInfo hri, final boolean reportWhenCompleted)
Modified: hadoop/hbase/trunk/src/java/org/apache/hadoop/hbase/util/MetaUtils.java
URL: http://svn.apache.org/viewvc/hadoop/hbase/trunk/src/java/org/apache/hadoop/hbase/util/MetaUtils.java?rev=643621&r1=643620&r2=643621&view=diff
==============================================================================
--- hadoop/hbase/trunk/src/java/org/apache/hadoop/hbase/util/MetaUtils.java (original)
+++ hadoop/hbase/trunk/src/java/org/apache/hadoop/hbase/util/MetaUtils.java Tue Apr 1 15:12:23 2008
@@ -40,7 +40,8 @@
import org.apache.hadoop.hbase.HRegionInfo;
import org.apache.hadoop.hbase.HScannerInterface;
import org.apache.hadoop.hbase.HStoreKey;
-import org.apache.hadoop.hbase.HTable;
+import org.apache.hadoop.hbase.io.Cell;
+import org.apache.hadoop.hbase.client.HTable;
/**
* Contains utility methods for manipulating HBase meta tables
@@ -314,7 +315,7 @@
final Text row, final boolean onlineOffline)
throws IOException {
HTable t = new HTable(c, HConstants.META_TABLE_NAME);
- byte [] cell = t.get(row, HConstants.COL_REGIONINFO);
+ Cell cell = t.get(row, HConstants.COL_REGIONINFO);
// Throws exception if null.
HRegionInfo info = Writables.getHRegionInfo(cell);
long id = t.startUpdate(row);
@@ -324,4 +325,4 @@
t.delete(id, HConstants.COL_STARTCODE);
t.commit(id);
}
-}
\ No newline at end of file
+}