You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@hbase.apache.org by sy...@apache.org on 2016/10/10 19:00:47 UTC

[5/9] hbase git commit: HBASE-16794 TestDispatchMergingRegionsProcedure#testMergeRegionsConcurrently is flaky

HBASE-16794 TestDispatchMergingRegionsProcedure#testMergeRegionsConcurrently is flaky

Signed-off-by: Matteo Bertozzi <ma...@cloudera.com>


Project: http://git-wip-us.apache.org/repos/asf/hbase/repo
Commit: http://git-wip-us.apache.org/repos/asf/hbase/commit/8a8c6088
Tree: http://git-wip-us.apache.org/repos/asf/hbase/tree/8a8c6088
Diff: http://git-wip-us.apache.org/repos/asf/hbase/diff/8a8c6088

Branch: refs/heads/hbase-12439
Commit: 8a8c60889cf67b581d7adb4245e0bcc02cdfdc93
Parents: e06c367
Author: ChiaPing Tsai <ch...@gmail.com>
Authored: Sun Oct 9 16:52:54 2016 -0700
Committer: Matteo Bertozzi <ma...@cloudera.com>
Committed: Sun Oct 9 16:53:29 2016 -0700

----------------------------------------------------------------------
 .../hbase/regionserver/CompactSplitThread.java  |  5 +++
 .../TestDispatchMergingRegionsProcedure.java    | 45 +++++++++++++++++---
 2 files changed, 44 insertions(+), 6 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/hbase/blob/8a8c6088/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/CompactSplitThread.java
----------------------------------------------------------------------
diff --git a/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/CompactSplitThread.java b/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/CompactSplitThread.java
index c1f82b9..a454f0e 100644
--- a/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/CompactSplitThread.java
+++ b/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/CompactSplitThread.java
@@ -724,6 +724,11 @@ public class CompactSplitThread implements CompactionRequestor, PropagatingConfi
   }
 
   @VisibleForTesting
+  public long getCompletedMergeTaskCount() {
+    return mergePool.getCompletedTaskCount();
+  }
+
+  @VisibleForTesting
   /**
    * Shutdown the long compaction thread pool.
    * Should only be used in unit test to prevent long compaction thread pool from stealing job

http://git-wip-us.apache.org/repos/asf/hbase/blob/8a8c6088/hbase-server/src/test/java/org/apache/hadoop/hbase/master/procedure/TestDispatchMergingRegionsProcedure.java
----------------------------------------------------------------------
diff --git a/hbase-server/src/test/java/org/apache/hadoop/hbase/master/procedure/TestDispatchMergingRegionsProcedure.java b/hbase-server/src/test/java/org/apache/hadoop/hbase/master/procedure/TestDispatchMergingRegionsProcedure.java
index 601f22f..a7dd4a8 100644
--- a/hbase-server/src/test/java/org/apache/hadoop/hbase/master/procedure/TestDispatchMergingRegionsProcedure.java
+++ b/hbase-server/src/test/java/org/apache/hadoop/hbase/master/procedure/TestDispatchMergingRegionsProcedure.java
@@ -18,7 +18,9 @@
 
 package org.apache.hadoop.hbase.master.procedure;
 
+import java.io.IOException;
 import java.util.List;
+import java.util.concurrent.TimeUnit;
 
 import org.apache.commons.logging.Log;
 import org.apache.commons.logging.LogFactory;
@@ -36,6 +38,7 @@ import org.apache.hadoop.hbase.shaded.protobuf.generated.MasterProcedureProtos.D
 import org.apache.hadoop.hbase.testclassification.MasterTests;
 import org.apache.hadoop.hbase.testclassification.MediumTests;
 import org.apache.hadoop.hbase.util.Bytes;
+import org.apache.hadoop.hbase.util.JVMClusterUtil.RegionServerThread;
 import org.junit.After;
 import org.junit.AfterClass;
 import org.junit.Before;
@@ -125,20 +128,21 @@ public class TestDispatchMergingRegionsProcedure {
     regionsToMerge[0] = tableRegions.get(0);
     regionsToMerge[1] = tableRegions.get(1);
 
+    final int initCompletedTaskCount = countOfCompletedMergeTaskCount();
     long procId = procExec.submitProcedure(new DispatchMergingRegionsProcedure(
       procExec.getEnvironment(), tableName, regionsToMerge, true));
     ProcedureTestingUtility.waitProcedure(procExec, procId);
     ProcedureTestingUtility.assertProcNotFailed(procExec, procId);
 
-    assertRegionCount(tableName, 2);
+    assertRegionCount(tableName, 2, 1, initCompletedTaskCount);
   }
 
   /**
    * This tests two concurrent region merges
    */
-  @Test(timeout=90000)
+  @Test(timeout=60000)
   public void testMergeRegionsConcurrently() throws Exception {
-    final TableName tableName = TableName.valueOf("testMergeTwoRegions");
+    final TableName tableName = TableName.valueOf("testMergeRegionsConcurrently");
     final ProcedureExecutor<MasterProcedureEnv> procExec = getMasterProcedureExecutor();
 
     List<HRegionInfo> tableRegions = createTable(tableName, 4);
@@ -150,6 +154,7 @@ public class TestDispatchMergingRegionsProcedure {
     regionsToMerge2[0] = tableRegions.get(2);
     regionsToMerge2[1] = tableRegions.get(3);
 
+    final int initCompletedTaskCount = countOfCompletedMergeTaskCount();
     long procId1 = procExec.submitProcedure(new DispatchMergingRegionsProcedure(
       procExec.getEnvironment(), tableName, regionsToMerge1, true));
     long procId2 = procExec.submitProcedure(new DispatchMergingRegionsProcedure(
@@ -158,8 +163,28 @@ public class TestDispatchMergingRegionsProcedure {
     ProcedureTestingUtility.waitProcedure(procExec, procId2);
     ProcedureTestingUtility.assertProcNotFailed(procExec, procId1);
     ProcedureTestingUtility.assertProcNotFailed(procExec, procId2);
+    assertRegionCount(tableName, 2, 2, initCompletedTaskCount);
+  }
+
+  private void waitForCompletedMergeTask(int expectedTaskCount, int initCompletedTaskCount)
+      throws IOException, InterruptedException {
+    while (true) {
+      long currentCompletedTaskCount = countOfCompletedMergeTaskCount() - initCompletedTaskCount;
+      if (currentCompletedTaskCount == expectedTaskCount) {
+        return;
+      }
+      LOG.info("There are " + (expectedTaskCount - currentCompletedTaskCount) +
+        " merge requests are not completed, wait 100 ms");
+      TimeUnit.MILLISECONDS.sleep(100);
+    }
+  }
 
-    assertRegionCount(tableName, 2);
+  private static int countOfCompletedMergeTaskCount() {
+    int completedTaskCount = 0;
+    for (RegionServerThread server : UTIL.getMiniHBaseCluster().getRegionServerThreads()) {
+      completedTaskCount += server.getRegionServer().getCompactSplitThread().getCompletedMergeTaskCount();
+    }
+    return completedTaskCount;
   }
 
   @Test(timeout=60000)
@@ -173,6 +198,7 @@ public class TestDispatchMergingRegionsProcedure {
     regionsToMerge[0] = tableRegions.get(0);
     regionsToMerge[1] = tableRegions.get(1);
 
+    final int initCompletedTaskCount = countOfCompletedMergeTaskCount();
     long procId1 = procExec.submitProcedure(new DispatchMergingRegionsProcedure(
       procExec.getEnvironment(), tableName, regionsToMerge, true), nonceGroup, nonce);
     long procId2 = procExec.submitProcedure(new DispatchMergingRegionsProcedure(
@@ -185,7 +211,7 @@ public class TestDispatchMergingRegionsProcedure {
     ProcedureTestingUtility.waitProcedure(procExec, procId2);
     ProcedureTestingUtility.assertProcNotFailed(procExec, procId2);
 
-    assertRegionCount(tableName, 2);
+    assertRegionCount(tableName, 2, 1, initCompletedTaskCount);
   }
 
   @Test(timeout=60000)
@@ -202,6 +228,7 @@ public class TestDispatchMergingRegionsProcedure {
     regionsToMerge[0] = tableRegions.get(0);
     regionsToMerge[1] = tableRegions.get(1);
 
+    final int initCompletedTaskCount = countOfCompletedMergeTaskCount();
     long procId = procExec.submitProcedure(
       new DispatchMergingRegionsProcedure(
         procExec.getEnvironment(), tableName, regionsToMerge, true));
@@ -211,7 +238,7 @@ public class TestDispatchMergingRegionsProcedure {
     MasterProcedureTestingUtility.testRecoveryAndDoubleExecution(procExec, procId, numberOfSteps);
     ProcedureTestingUtility.assertProcNotFailed(procExec, procId);
 
-    assertRegionCount(tableName, 2);
+    assertRegionCount(tableName, 2, 1, initCompletedTaskCount);
   }
 
   @Test(timeout = 60000)
@@ -256,6 +283,12 @@ public class TestDispatchMergingRegionsProcedure {
     return tableRegions;
   }
 
+  public List<HRegionInfo> assertRegionCount(final TableName tableName, final int nregions,
+      int expectedTaskCount, int initCompletedTaskCount) throws Exception {
+    waitForCompletedMergeTask(expectedTaskCount, initCompletedTaskCount);
+    return assertRegionCount(tableName, nregions);
+  }
+
   private ProcedureExecutor<MasterProcedureEnv> getMasterProcedureExecutor() {
     return UTIL.getHBaseCluster().getMaster().getMasterProcedureExecutor();
   }