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 2009/09/30 06:42:54 UTC

svn commit: r820174 - /hadoop/hbase/branches/0.20/src/java/org/apache/hadoop/hbase/master/RegionManager.java

Author: stack
Date: Wed Sep 30 04:42:54 2009
New Revision: 820174

URL: http://svn.apache.org/viewvc?rev=820174&view=rev
Log:
HBASE-1868 Spew about rebalancing but none done....

Modified:
    hadoop/hbase/branches/0.20/src/java/org/apache/hadoop/hbase/master/RegionManager.java

Modified: hadoop/hbase/branches/0.20/src/java/org/apache/hadoop/hbase/master/RegionManager.java
URL: http://svn.apache.org/viewvc/hadoop/hbase/branches/0.20/src/java/org/apache/hadoop/hbase/master/RegionManager.java?rev=820174&r1=820173&r2=820174&view=diff
==============================================================================
--- hadoop/hbase/branches/0.20/src/java/org/apache/hadoop/hbase/master/RegionManager.java (original)
+++ hadoop/hbase/branches/0.20/src/java/org/apache/hadoop/hbase/master/RegionManager.java Wed Sep 30 04:42:54 2009
@@ -196,8 +196,8 @@
 
     // figure out what regions need to be assigned and aren't currently being
     // worked on elsewhere.
-    Set<RegionState> regionsToAssign = regionsAwaitingAssignment(info.getServerAddress(),
-        isSingleServer);
+    Set<RegionState> regionsToAssign =
+      regionsAwaitingAssignment(info.getServerAddress(), isSingleServer);
     if (regionsToAssign.size() == 0) {
       // There are no regions waiting to be assigned.
       if (!inSafeMode()) {
@@ -224,69 +224,88 @@
    * Note that no synchronization is needed while we iterate over
    * regionsInTransition because this method is only called by assignRegions
    * whose caller owns the monitor for RegionManager
-   */ 
+   * 
+   * TODO: This code is unintelligible.  REWRITE. Add TESTS! St.Ack 09/30/2009
+   * @param thisServersLoad
+   * @param regionsToAssign
+   * @param info
+   * @param returnMsgs
+   */
   private void assignRegionsToMultipleServers(final HServerLoad thisServersLoad,
     final Set<RegionState> regionsToAssign, final HServerInfo info, 
     final ArrayList<HMsg> returnMsgs) {
-
     boolean isMetaAssign = false;
     for (RegionState s : regionsToAssign) {
       if (s.getRegionInfo().isMetaRegion())
         isMetaAssign = true;
     }
-
     int nRegionsToAssign = regionsToAssign.size();
+    // Now many regions to assign this server.
     int nregions = regionsPerServer(nRegionsToAssign, thisServersLoad);
     LOG.debug("Assigning for " + info + ": total nregions to assign=" +
       nRegionsToAssign + ", nregions to reach balance=" + nregions +
       ", isMetaAssign=" + isMetaAssign);
-    nRegionsToAssign -= nregions;
-    if (nRegionsToAssign > 0 || isMetaAssign) {
-      // We still have more regions to assign. See how many we can assign
-      // before this server becomes more heavily loaded than the next
-      // most heavily loaded server.
-      HServerLoad heavierLoad = new HServerLoad();
-      int nservers = computeNextHeaviestLoad(thisServersLoad, heavierLoad);
-
-      nregions = 0;
-      
-      // Advance past any less-loaded servers
-      for (HServerLoad load = new HServerLoad(thisServersLoad);
+    if (nRegionsToAssign <= nregions) {
+      // I do not know whats supposed to happen in this case.  Assign one.
+      LOG.debug("Assigning one region only (playing it safe..)");
+      assignRegions(regionsToAssign, 1, info, returnMsgs);
+    } else {
+      nRegionsToAssign -= nregions;
+      if (nRegionsToAssign > 0 || isMetaAssign) {
+        // We still have more regions to assign. See how many we can assign
+        // before this server becomes more heavily loaded than the next
+        // most heavily loaded server.
+        HServerLoad heavierLoad = new HServerLoad();
+        int nservers = computeNextHeaviestLoad(thisServersLoad, heavierLoad);
+        nregions = 0;
+        // Advance past any less-loaded servers
+        for (HServerLoad load = new HServerLoad(thisServersLoad);
         load.compareTo(heavierLoad) <= 0 && nregions < nRegionsToAssign;
         load.setNumberOfRegions(load.getNumberOfRegions() + 1), nregions++) {
-        // continue;
-      }
-
-      LOG.debug("Doing for " + info + " nregions: " + nregions +
-      " and nRegionsToAssign: " + nRegionsToAssign);
-      if (nregions < nRegionsToAssign) {
-        // There are some more heavily loaded servers
-        // but we can't assign all the regions to this server.
-        if (nservers > 0) {
-          // There are other servers that can share the load.
-          // Split regions that need assignment across the servers.
-          nregions = (int) Math.ceil((1.0 * nRegionsToAssign)
-              / (1.0 * nservers));
+          // continue;
+        }
+        LOG.debug("Doing for " + info + " nregions: " + nregions +
+            " and nRegionsToAssign: " + nRegionsToAssign);
+        if (nregions < nRegionsToAssign) {
+          // There are some more heavily loaded servers
+          // but we can't assign all the regions to this server.
+          if (nservers > 0) {
+            // There are other servers that can share the load.
+            // Split regions that need assignment across the servers.
+            nregions = (int) Math.ceil((1.0 * nRegionsToAssign)/(1.0 * nservers));
+          } else {
+            // No other servers with same load.
+            // Split regions over all available servers
+            nregions = (int) Math.ceil((1.0 * nRegionsToAssign)/
+                (1.0 * master.serverManager.numServers()));
+          }
         } else {
-          // No other servers with same load.
-          // Split regions over all available servers
-          nregions = (int) Math.ceil((1.0 * nRegionsToAssign)
-              / (1.0 * master.serverManager.numServers()));
+          // Assign all regions to this server
+          nregions = nRegionsToAssign;
         }
-      } else {
-        // Assign all regions to this server
-        nregions = nRegionsToAssign;
+        assignRegions(regionsToAssign, nregions, info, returnMsgs);
       }
+    }
+  }
 
-      if (nregions > this.maxAssignInOneGo) {
-        nregions = this.maxAssignInOneGo;
-      }
-      
-      for (RegionState s: regionsToAssign) {
-        doRegionAssignment(s, info, returnMsgs);
-        if (--nregions <= 0) {
-          break;
-        }
+  /*
+   * Assign <code>nregions</code> regions.
+   * @param regionsToAssign
+   * @param nregions
+   * @param info
+   * @param returnMsgs
+   */
+  private void assignRegions(final Set<RegionState> regionsToAssign,
+      final int nregions, final HServerInfo info,
+      final ArrayList<HMsg> returnMsgs) {
+    int count = nregions;
+    if (count > this.maxAssignInOneGo) {
+      count = this.maxAssignInOneGo;
+    }
+    for (RegionState s: regionsToAssign) {
+      doRegionAssignment(s, info, returnMsgs);
+      if (--count <= 0) {
+        break;
       }
     }
   }
@@ -332,7 +351,6 @@
    */
   private int regionsPerServer(final int numUnassignedRegions,
     final HServerLoad thisServersLoad) {
-    
     SortedMap<HServerLoad, Set<String>> lightServers =
       new TreeMap<HServerLoad, Set<String>>();
 
@@ -346,14 +364,13 @@
     // until they reach load equal with ours. Then, see how many regions are left
     // unassigned. That is how many regions we should assign to this server.
     int nRegions = 0;
-    for (Map.Entry<HServerLoad, Set<String>> e : lightServers.entrySet()) {
+    for (Map.Entry<HServerLoad, Set<String>> e: lightServers.entrySet()) {
       HServerLoad lightLoad = new HServerLoad(e.getKey());
       do {
         lightLoad.setNumberOfRegions(lightLoad.getNumberOfRegions() + 1);
         nRegions += 1;
       } while (lightLoad.compareTo(thisServersLoad) <= 0
           && nRegions < numUnassignedRegions);
-
       nRegions *= e.getValue().size();
       if (nRegions >= numUnassignedRegions) {
         break;
@@ -361,7 +378,7 @@
     }
     return nRegions;
   }
-  
+
   /*
    * Get the set of regions that should be assignable in this pass.
    *