You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@hbase.apache.org by la...@apache.org on 2013/04/05 01:31:14 UTC

svn commit: r1464790 - in /hbase/trunk/hbase-server/src/test/java/org/apache/hadoop/hbase: HBaseTestingUtility.java master/TestMasterFailover.java

Author: larsh
Date: Thu Apr  4 23:31:14 2013
New Revision: 1464790

URL: http://svn.apache.org/r1464790
Log:
HBASE-8169 TestMasterFailover#testMasterFailoverWithMockedRITOnDeadRS may fail due to regions randomly assigned to a RS (Jeffrey Zhong)

Modified:
    hbase/trunk/hbase-server/src/test/java/org/apache/hadoop/hbase/HBaseTestingUtility.java
    hbase/trunk/hbase-server/src/test/java/org/apache/hadoop/hbase/master/TestMasterFailover.java

Modified: hbase/trunk/hbase-server/src/test/java/org/apache/hadoop/hbase/HBaseTestingUtility.java
URL: http://svn.apache.org/viewvc/hbase/trunk/hbase-server/src/test/java/org/apache/hadoop/hbase/HBaseTestingUtility.java?rev=1464790&r1=1464789&r2=1464790&view=diff
==============================================================================
--- hbase/trunk/hbase-server/src/test/java/org/apache/hadoop/hbase/HBaseTestingUtility.java (original)
+++ hbase/trunk/hbase-server/src/test/java/org/apache/hadoop/hbase/HBaseTestingUtility.java Thu Apr  4 23:31:14 2013
@@ -2237,6 +2237,25 @@ public class HBaseTestingUtility extends
     scanner.close();
     return result;
   }
+  
+  /**
+   * Create region split keys between startkey and endKey
+   * 
+   * @param startKey
+   * @param endKey
+   * @param numRegions the number of regions to be created. it has to be greater than 3.
+   * @return
+   */
+  public byte[][] getRegionSplitStartKeys(byte[] startKey, byte[] endKey, int numRegions){
+    assertTrue(numRegions>3);
+    byte [][] tmpSplitKeys = Bytes.split(startKey, endKey, numRegions - 3);
+    byte [][] result = new byte[tmpSplitKeys.length+1][];
+    for (int i=0;i<tmpSplitKeys.length;i++) {
+      result[i+1] = tmpSplitKeys[i];
+    }
+    result[0] = HConstants.EMPTY_BYTE_ARRAY;
+    return result;
+  }
 
   /**
    * Do a small get/scan against one store. This is required because store

Modified: hbase/trunk/hbase-server/src/test/java/org/apache/hadoop/hbase/master/TestMasterFailover.java
URL: http://svn.apache.org/viewvc/hbase/trunk/hbase-server/src/test/java/org/apache/hadoop/hbase/master/TestMasterFailover.java?rev=1464790&r1=1464789&r2=1464790&view=diff
==============================================================================
--- hbase/trunk/hbase-server/src/test/java/org/apache/hadoop/hbase/master/TestMasterFailover.java (original)
+++ hbase/trunk/hbase-server/src/test/java/org/apache/hadoop/hbase/master/TestMasterFailover.java Thu Apr  4 23:31:14 2013
@@ -25,6 +25,8 @@ import static org.junit.Assert.assertTru
 
 import java.io.IOException;
 import java.util.ArrayList;
+import java.util.HashSet;
+import java.util.Iterator;
 import java.util.List;
 import java.util.Set;
 import java.util.TreeSet;
@@ -485,14 +487,10 @@ public class TestMasterFailover {
     // disable load balancing on this master
     master.balanceSwitch(false);
 
-    // create two tables in META, each with 10 regions
+    // create two tables in META, each with 30 regions
     byte [] FAMILY = Bytes.toBytes("family");
-    byte [][] SPLIT_KEYS = new byte [][] {
-        new byte[0], Bytes.toBytes("aaa"), Bytes.toBytes("bbb"),
-        Bytes.toBytes("ccc"), Bytes.toBytes("ddd"), Bytes.toBytes("eee"),
-        Bytes.toBytes("fff"), Bytes.toBytes("ggg"), Bytes.toBytes("hhh"),
-        Bytes.toBytes("iii"), Bytes.toBytes("jjj")
-    };
+    byte[][] SPLIT_KEYS =
+        TEST_UTIL.getRegionSplitStartKeys(Bytes.toBytes("aaa"), Bytes.toBytes("zzz"), 30);
 
     byte [] enabledTable = Bytes.toBytes("enabledTable");
     HTableDescriptor htdEnabled = new HTableDescriptor(enabledTable);
@@ -536,11 +534,11 @@ public class TestMasterFailover {
 
     // we'll need some regions to already be assigned out properly on live RS
     List<HRegionInfo> enabledAndAssignedRegions = new ArrayList<HRegionInfo>();
-    enabledAndAssignedRegions.add(enabledRegions.remove(0));
-    enabledAndAssignedRegions.add(enabledRegions.remove(0));
+    enabledAndAssignedRegions.addAll(enabledRegions.subList(0, 6));
+    enabledRegions.removeAll(enabledAndAssignedRegions);
     List<HRegionInfo> disabledAndAssignedRegions = new ArrayList<HRegionInfo>();
-    disabledAndAssignedRegions.add(disabledRegions.remove(0));
-    disabledAndAssignedRegions.add(disabledRegions.remove(0));
+    disabledAndAssignedRegions.addAll(disabledRegions.subList(0, 6));
+    disabledRegions.removeAll(disabledAndAssignedRegions);
 
     // now actually assign them
     for (HRegionInfo hri : enabledAndAssignedRegions) {
@@ -554,15 +552,20 @@ public class TestMasterFailover {
       master.assignRegion(hri);
     }
 
+    log("Waiting for assignment to finish");
+    ZKAssign.blockUntilNoRIT(zkw);
+    master.assignmentManager.waitUntilNoRegionsInTransition(60000);
+    log("Assignment completed");
+
     assertTrue(" Table must be enabled.", master.getAssignmentManager()
         .getZKTable().isEnabledTable("enabledTable"));
     // we also need regions assigned out on the dead server
     List<HRegionInfo> enabledAndOnDeadRegions = new ArrayList<HRegionInfo>();
-    enabledAndOnDeadRegions.add(enabledRegions.remove(0));
-    enabledAndOnDeadRegions.add(enabledRegions.remove(0));
+    enabledAndOnDeadRegions.addAll(enabledRegions.subList(0, 6));
+    enabledRegions.removeAll(enabledAndOnDeadRegions);
     List<HRegionInfo> disabledAndOnDeadRegions = new ArrayList<HRegionInfo>();
-    disabledAndOnDeadRegions.add(disabledRegions.remove(0));
-    disabledAndOnDeadRegions.add(disabledRegions.remove(0));
+    disabledAndOnDeadRegions.addAll(disabledRegions.subList(0, 6));
+    disabledRegions.removeAll(disabledAndOnDeadRegions);
 
     // set region plan to server to be killed and trigger assign
     for (HRegionInfo hri : enabledAndOnDeadRegions) {
@@ -579,8 +582,25 @@ public class TestMasterFailover {
     // wait for no more RIT
     log("Waiting for assignment to finish");
     ZKAssign.blockUntilNoRIT(zkw);
+    master.assignmentManager.waitUntilNoRegionsInTransition(60000);
     log("Assignment completed");
 
+    // Due to master.assignRegion(hri) could fail to assign a region to a specified RS
+    // therefore, we need make sure that regions are in the expected RS
+    verifyRegionLocation(hrs, enabledAndAssignedRegions);
+    verifyRegionLocation(hrs, disabledAndAssignedRegions);
+    verifyRegionLocation(hrsDead, enabledAndOnDeadRegions);
+    verifyRegionLocation(hrsDead, disabledAndOnDeadRegions);
+
+    assertTrue(" Didn't get enough regions of enabledTalbe on live rs.",
+      enabledAndAssignedRegions.size() >= 2);
+    assertTrue(" Didn't get enough regions of disalbedTable on live rs.",
+      disabledAndAssignedRegions.size() >= 2);
+    assertTrue(" Didn't get enough regions of enabledTalbe on dead rs.",
+      enabledAndOnDeadRegions.size() >= 2);
+    assertTrue(" Didn't get enough regions of disalbedTable on dead rs.",
+      disabledAndOnDeadRegions.size() >= 2);
+
     // Stop the master
     log("Aborting master");
     cluster.abortMaster(0);
@@ -802,6 +822,21 @@ public class TestMasterFailover {
     TEST_UTIL.shutdownMiniCluster();
   }
 
+  /**
+   * Verify regions are on the expected region server
+   */
+  private void verifyRegionLocation(HRegionServer hrs, List<HRegionInfo> regions)
+      throws IOException {
+    List<HRegionInfo> tmpOnlineRegions = ProtobufUtil.getOnlineRegions(hrs);
+    Iterator<HRegionInfo> itr = regions.iterator();
+    while (itr.hasNext()) {
+      HRegionInfo tmp = itr.next();
+      if (!tmpOnlineRegions.contains(tmp)) {
+        itr.remove();
+      }
+    }
+  }
+
   HRegion createRegion(final HRegionInfo  hri, final Path rootdir, final Configuration c,
       final HTableDescriptor htd)
   throws IOException {