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 2010/07/13 21:36:53 UTC

svn commit: r963831 - in /hbase/branches/0.20: CHANGES.txt src/java/org/apache/hadoop/hbase/master/RegionManager.java

Author: stack
Date: Tue Jul 13 19:36:52 2010
New Revision: 963831

URL: http://svn.apache.org/viewvc?rev=963831&view=rev
Log:
HBASE-2802 Stop daughter regions both being assigned same server

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

Modified: hbase/branches/0.20/CHANGES.txt
URL: http://svn.apache.org/viewvc/hbase/branches/0.20/CHANGES.txt?rev=963831&r1=963830&r2=963831&view=diff
==============================================================================
--- hbase/branches/0.20/CHANGES.txt (original)
+++ hbase/branches/0.20/CHANGES.txt Tue Jul 13 19:36:52 2010
@@ -6,6 +6,7 @@ Release 0.20.6 - Unreleased
    HBASE-2786  TestHLog.testSplit hangs
    HBASE-2797  Another NPE in ReadWriteConsistencyControl
    HBASE-2796  Backport of 2707 to 0.20 branch
+   HBASE-2802  Stop daughter regions both being assigned same server
 
 Release 0.20.5 - Jun 24, 2010
 

Modified: hbase/branches/0.20/src/java/org/apache/hadoop/hbase/master/RegionManager.java
URL: http://svn.apache.org/viewvc/hbase/branches/0.20/src/java/org/apache/hadoop/hbase/master/RegionManager.java?rev=963831&r1=963830&r2=963831&view=diff
==============================================================================
--- hbase/branches/0.20/src/java/org/apache/hadoop/hbase/master/RegionManager.java (original)
+++ hbase/branches/0.20/src/java/org/apache/hadoop/hbase/master/RegionManager.java Tue Jul 13 19:36:52 2010
@@ -28,9 +28,11 @@ import java.util.Iterator;
 import java.util.List;
 import java.util.Map;
 import java.util.NavigableMap;
+import java.util.NavigableSet;
 import java.util.Set;
 import java.util.SortedMap;
 import java.util.TreeMap;
+import java.util.TreeSet;
 import java.util.concurrent.ConcurrentSkipListMap;
 import java.util.concurrent.atomic.AtomicInteger;
 import java.util.concurrent.atomic.AtomicReference;
@@ -190,7 +192,7 @@ class RegionManager implements HConstant
 
     // figure out what regions need to be assigned and aren't currently being
     // worked on elsewhere.
-    Set<RegionState> regionsToAssign =
+    NavigableSet<RegionState> regionsToAssign =
       regionsAwaitingAssignment(info.getServerAddress(), isSingleServer);
     if (regionsToAssign.size() == 0) {
       // There are no regions waiting to be assigned.
@@ -226,7 +228,7 @@ class RegionManager implements HConstant
    * @param returnMsgs
    */
   private void assignRegionsToMultipleServers(final HServerLoad thisServersLoad,
-    final Set<RegionState> regionsToAssign, final HServerInfo info, 
+    final NavigableSet<RegionState> regionsToAssign, final HServerInfo info, 
     final ArrayList<HMsg> returnMsgs) {
     boolean isMetaAssign = false;
     for (RegionState s : regionsToAssign) {
@@ -289,7 +291,19 @@ class RegionManager implements HConstant
     if (count > this.maxAssignInOneGo) {
       count = this.maxAssignInOneGo;
     }
+    HRegionInfo previous = null;
     for (RegionState s: regionsToAssign) {
+      if (previous != null && previous.getEndKey() != null &&
+            Bytes.equals(previous.getEndKey(), s.getRegionInfo().getStartKey())) {
+        // If contiguous regions, do not assign adjacent regions in this
+        // one assignment session.  We do this to break daughters of splits so
+        // its more likely they endup on different clusters on the cluster.
+        LOG.info("Passing on " + s.getRegionInfo().getRegionNameAsString() +
+         " because contiguous with " + previous.getRegionNameAsString() +
+         " (will assign next server that checks in)");
+        continue;
+      }
+      previous = s.getRegionInfo();
       doRegionAssignment(s, info, returnMsgs);
       if (--count <= 0) {
         break;
@@ -308,7 +322,7 @@ class RegionManager implements HConstant
    * @param serverName
    * @param returnMsgs
    */
-  private void assignRegionsToOneServer(final Set<RegionState> regionsToAssign,
+  private void assignRegionsToOneServer(final NavigableSet<RegionState> regionsToAssign,
       final HServerInfo info, final ArrayList<HMsg> returnMsgs) {
     for (RegionState s: regionsToAssign) {
       doRegionAssignment(s, info, returnMsgs);
@@ -377,10 +391,10 @@ class RegionManager implements HConstant
    * only caller (assignRegions, whose caller is ServerManager.processMsgs) owns
    * the monitor for RegionManager
    */ 
-  private Set<RegionState> regionsAwaitingAssignment(HServerAddress addr,
+  private NavigableSet<RegionState> regionsAwaitingAssignment(HServerAddress addr,
                                                      boolean isSingleServer) {
     // set of regions we want to assign to this server
-    Set<RegionState> regionsToAssign = new HashSet<RegionState>();
+    NavigableSet<RegionState> regionsToAssign = new TreeSet<RegionState>();
     boolean isMetaServer = isMetaServer(addr);
     RegionState rootState = null;
     synchronized (this.regionsInTransition) {