diff --git hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/CompactSplitThread.java hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/CompactSplitThread.java index c1f82b9..a454f0e 100644 --- hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/CompactSplitThread.java +++ 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 diff --git hbase-server/src/test/java/org/apache/hadoop/hbase/master/procedure/TestDispatchMergingRegionsProcedure.java hbase-server/src/test/java/org/apache/hadoop/hbase/master/procedure/TestDispatchMergingRegionsProcedure.java index 601f22f..91bafc4 100644 --- hbase-server/src/test/java/org/apache/hadoop/hbase/master/procedure/TestDispatchMergingRegionsProcedure.java +++ hbase-server/src/test/java/org/apache/hadoop/hbase/master/procedure/TestDispatchMergingRegionsProcedure.java @@ -19,6 +19,7 @@ package org.apache.hadoop.hbase.master.procedure; import java.util.List; +import java.util.concurrent.TimeUnit; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; @@ -36,6 +37,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; @@ -136,7 +138,7 @@ public class TestDispatchMergingRegionsProcedure { /** * This tests two concurrent region merges */ - @Test(timeout=90000) + @Test(timeout=60000) public void testMergeRegionsConcurrently() throws Exception { final TableName tableName = TableName.valueOf("testMergeTwoRegions"); final ProcedureExecutor procExec = getMasterProcedureExecutor(); @@ -150,6 +152,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,10 +161,25 @@ public class TestDispatchMergingRegionsProcedure { ProcedureTestingUtility.waitProcedure(procExec, procId2); ProcedureTestingUtility.assertProcNotFailed(procExec, procId1); ProcedureTestingUtility.assertProcNotFailed(procExec, procId2); - - assertRegionCount(tableName, 2); + while (true) { + List regions = admin.getTableRegions(tableName); + int size = regions.size(); + if (size != 2) { + long currentCompletedTaskCount = countOfCompletedMergeTaskCount() - initCompletedTaskCount; + LOG.info("There are " + (2 - currentCompletedTaskCount) + " merge requests are not completed, wait 100 ms"); + TimeUnit.MILLISECONDS.sleep(100); + } else { + break; + } + } + } + private static int countOfCompletedMergeTaskCount() { + int completedTaskCount = 0; + for (RegionServerThread server : UTIL.getMiniHBaseCluster().getRegionServerThreads()) { + completedTaskCount += server.getRegionServer().getCompactSplitThread().getCompletedMergeTaskCount(); + } + return completedTaskCount; } - @Test(timeout=60000) public void testMergeRegionsTwiceWithSameNonce() throws Exception { final TableName tableName = TableName.valueOf("testMergeRegionsTwiceWithSameNonce");