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
+}