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/01/14 19:56:39 UTC

svn commit: r734482 - in /hadoop/hbase/trunk: CHANGES.txt src/java/org/apache/hadoop/hbase/master/RegionManager.java src/java/org/apache/hadoop/hbase/master/ServerManager.java

Author: stack
Date: Wed Jan 14 10:56:39 2009
New Revision: 734482

URL: http://svn.apache.org/viewvc?rev=734482&view=rev
Log:
HBASE-1124 Balancer kicks in way too early

Modified:
    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/master/ServerManager.java

Modified: hadoop/hbase/trunk/CHANGES.txt
URL: http://svn.apache.org/viewvc/hadoop/hbase/trunk/CHANGES.txt?rev=734482&r1=734481&r2=734482&view=diff
==============================================================================
--- hadoop/hbase/trunk/CHANGES.txt (original)
+++ hadoop/hbase/trunk/CHANGES.txt Wed Jan 14 10:56:39 2009
@@ -142,6 +142,7 @@
    HBASE-1121  Cluster confused about where -ROOT- is
    HBASE-1125  IllegalStateException: Cannot set a region to be closed if it was
                not already marked as pending close
+   HBASE-1124  Balancer kicks in way too early
 
   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/master/RegionManager.java
URL: http://svn.apache.org/viewvc/hadoop/hbase/trunk/src/java/org/apache/hadoop/hbase/master/RegionManager.java?rev=734482&r1=734481&r2=734482&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 Wed Jan 14 10:56:39 2009
@@ -167,9 +167,7 @@
   
   /*
    * Assigns regions to region servers attempting to balance the load across
-   * all region servers
-   *
-   * Note that no synchronization is necessary as the caller 
+   * all region servers. Note that no synchronization is necessary as the caller 
    * (ServerManager.processMsgs) already owns the monitor for the RegionManager.
    * 
    * @param info

Modified: hadoop/hbase/trunk/src/java/org/apache/hadoop/hbase/master/ServerManager.java
URL: http://svn.apache.org/viewvc/hadoop/hbase/trunk/src/java/org/apache/hadoop/hbase/master/ServerManager.java?rev=734482&r1=734481&r2=734482&view=diff
==============================================================================
--- hadoop/hbase/trunk/src/java/org/apache/hadoop/hbase/master/ServerManager.java (original)
+++ hadoop/hbase/trunk/src/java/org/apache/hadoop/hbase/master/ServerManager.java Wed Jan 14 10:56:39 2009
@@ -81,6 +81,11 @@
   // Last time we logged average load.
   private volatile long lastLogOfAverageLaod = 0;
   private final long loggingPeriodForAverageLoad;
+  
+  /* The regionserver will not be assigned or asked close regions if it
+   * is currently opening >= this many regions.
+   */
+  private final int nobalancingCount;
 
   /**
    * @param master
@@ -92,6 +97,8 @@
         15 * 1000));
     this.loggingPeriodForAverageLoad = master.getConfiguration().
       getLong("hbase.master.avgload.logging.period", 60000);
+    this.nobalancingCount = master.getConfiguration().
+      getInt("hbase.regions.nobalancing.count", 4);
   }
  
   /*
@@ -330,7 +337,14 @@
     }    
   }
 
-  /** RegionServer is checking in, no exceptional circumstances */
+  /* RegionServer is checking in, no exceptional circumstances
+   * @param serverName
+   * @param serverInfo
+   * @param mostLoadedRegions
+   * @param msgs
+   * @return
+   * @throws IOException
+   */
   private HMsg[] processRegionServerAllsWell(String serverName, 
     HServerInfo serverInfo, HRegionInfo[] mostLoadedRegions, HMsg[] msgs)
   throws IOException {
@@ -350,7 +364,6 @@
         // and the load on this server has changed
         synchronized (loadToServers) {
           Set<String> servers = loadToServers.get(load);
-
           // Note that servers should never be null because loadToServers
           // and serversToLoad are manipulated in pairs
           servers.remove(serverName);
@@ -370,6 +383,7 @@
       servers.add(serverName);
       loadToServers.put(load, servers);
     }
+
     // Next, process messages for this server
     return processMsgs(serverName, serverInfo, mostLoadedRegions, msgs);
   }
@@ -389,11 +403,13 @@
         "hbase-958 debugging");
     }
     // Get reports on what the RegionServer did.
+    int openingCount = 0;
     for (int i = 0; i < incomingMsgs.length; i++) {
       HRegionInfo region = incomingMsgs[i].getRegionInfo();
       LOG.info("Received " + incomingMsgs[i] + " from " + serverName);
       switch (incomingMsgs[i].getType()) {
         case MSG_REPORT_PROCESS_OPEN:
+          openingCount++;
           break;
         
         case MSG_REPORT_OPEN:
@@ -425,11 +441,15 @@
       }
 
       // Figure out what the RegionServer ought to do, and write back.
-      master.regionManager.assignRegions(serverInfo, serverName, 
+      
+      // Should we tell it close regions because its overloaded?  If its
+      // currently opening regions, leave it alone till all are open.
+      if (openingCount < this.nobalancingCount) {
+        this.master.regionManager.assignRegions(serverInfo, serverName, 
           mostLoadedRegions, returnMsgs);
-
+      }
       // Send any pending table actions.
-      master.regionManager.applyActions(serverInfo, returnMsgs);
+      this.master.regionManager.applyActions(serverInfo, returnMsgs);
     }
     return returnMsgs.toArray(new HMsg[returnMsgs.size()]);
   }