diff --git a/hbase-server/src/test/java/org/apache/hadoop/hbase/HBaseTestingUtility.java b/hbase-server/src/test/java/org/apache/hadoop/hbase/HBaseTestingUtility.java index 438f143..aa5db64 100644 --- a/hbase-server/src/test/java/org/apache/hadoop/hbase/HBaseTestingUtility.java +++ b/hbase-server/src/test/java/org/apache/hadoop/hbase/HBaseTestingUtility.java @@ -44,6 +44,7 @@ import java.util.NavigableSet; import java.util.Random; import java.util.Set; import java.util.UUID; +import java.util.concurrent.TimeUnit; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; @@ -92,6 +93,7 @@ import org.apache.hadoop.hbase.util.FSUtils; import org.apache.hadoop.hbase.util.JVMClusterUtil; import org.apache.hadoop.hbase.util.JVMClusterUtil.MasterThread; import org.apache.hadoop.hbase.util.RegionSplitter; +import org.apache.hadoop.hbase.util.RetryCounter; import org.apache.hadoop.hbase.util.Threads; import org.apache.hadoop.hbase.zookeeper.EmptyWatcher; import org.apache.hadoop.hbase.zookeeper.MiniZooKeeperCluster; @@ -1634,9 +1636,10 @@ public class HBaseTestingUtility extends HBaseCommonTestingUtility { * @param tableName user table to lookup in .META. * @return region server that holds it, null if the row doesn't exist * @throws IOException + * @throws InterruptedException */ public HRegionServer getRSForFirstRegionInTable(byte[] tableName) - throws IOException { + throws IOException, InterruptedException { List metaRows = getMetaTableRows(tableName); if (metaRows == null || metaRows.isEmpty()) { return null; @@ -1645,8 +1648,20 @@ public class HBaseTestingUtility extends HBaseCommonTestingUtility { Bytes.toString(tableName)); byte [] firstrow = metaRows.get(0); LOG.debug("FirstRow=" + Bytes.toString(firstrow)); - int index = getMiniHBaseCluster().getServerWith(firstrow); - return getMiniHBaseCluster().getRegionServerThreads().get(index).getRegionServer(); + long pause = getConfiguration().getLong(HConstants.HBASE_CLIENT_PAUSE, + HConstants.DEFAULT_HBASE_CLIENT_PAUSE); + int numRetries = getConfiguration().getInt(HConstants.HBASE_CLIENT_RETRIES_NUMBER, + HConstants.DEFAULT_HBASE_CLIENT_RETRIES_NUMBER); + RetryCounter retrier = new RetryCounter(numRetries, (int)pause, TimeUnit.MICROSECONDS); + while(retrier.shouldRetry()) { + int index = getMiniHBaseCluster().getServerWith(firstrow); + if (index != -1) { + return getMiniHBaseCluster().getRegionServerThreads().get(index).getRegionServer(); + } + // Came back -1. Region may not be online yet. Sleep a while. + retrier.sleepUntilNextRetry(); + } + return null; } /** diff --git a/hbase-server/src/test/java/org/apache/hadoop/hbase/client/TestAdmin.java b/hbase-server/src/test/java/org/apache/hadoop/hbase/client/TestAdmin.java index 5670451..4e1efdf 100644 --- a/hbase-server/src/test/java/org/apache/hadoop/hbase/client/TestAdmin.java +++ b/hbase-server/src/test/java/org/apache/hadoop/hbase/client/TestAdmin.java @@ -1582,7 +1582,7 @@ public class TestAdmin { } private HRegionServer startAndWriteData(String tableName, byte[] value) - throws IOException { + throws IOException, InterruptedException { // When the META table can be opened, the region servers are running new HTable( TEST_UTIL.getConfiguration(), HConstants.META_TABLE_NAME).close(); diff --git a/hbase-server/src/test/java/org/apache/hadoop/hbase/coprocessor/TestRegionServerCoprocessorExceptionWithAbort.java b/hbase-server/src/test/java/org/apache/hadoop/hbase/coprocessor/TestRegionServerCoprocessorExceptionWithAbort.java index fd54d47..5962ef4 100644 --- a/hbase-server/src/test/java/org/apache/hadoop/hbase/coprocessor/TestRegionServerCoprocessorExceptionWithAbort.java +++ b/hbase-server/src/test/java/org/apache/hadoop/hbase/coprocessor/TestRegionServerCoprocessorExceptionWithAbort.java @@ -68,7 +68,7 @@ public class TestRegionServerCoprocessorExceptionWithAbort { @Test public void testExceptionFromCoprocessorDuringPut() - throws IOException { + throws IOException, InterruptedException { // When we try to write to TEST_TABLE, the buggy coprocessor will // cause a NullPointerException, which will cause the regionserver (which // hosts the region we attempted to write to) to abort. diff --git a/hbase-server/src/test/java/org/apache/hadoop/hbase/coprocessor/TestRegionServerCoprocessorExceptionWithRemove.java b/hbase-server/src/test/java/org/apache/hadoop/hbase/coprocessor/TestRegionServerCoprocessorExceptionWithRemove.java index 680ced9..69b9bab 100644 --- a/hbase-server/src/test/java/org/apache/hadoop/hbase/coprocessor/TestRegionServerCoprocessorExceptionWithRemove.java +++ b/hbase-server/src/test/java/org/apache/hadoop/hbase/coprocessor/TestRegionServerCoprocessorExceptionWithRemove.java @@ -79,7 +79,7 @@ public class TestRegionServerCoprocessorExceptionWithRemove { @Test(timeout=30000) public void testExceptionFromCoprocessorDuringPut() - throws IOException { + throws IOException, InterruptedException { // Set watches on the zookeeper nodes for all of the regionservers in the // cluster. When we try to write to TEST_TABLE, the buggy coprocessor will // cause a NullPointerException, which will cause the regionserver (which diff --git a/hbase-server/src/test/java/org/apache/hadoop/hbase/regionserver/wal/HLogUtilsForTests.java b/hbase-server/src/test/java/org/apache/hadoop/hbase/regionserver/wal/HLogUtilsForTests.java index 64cd380..c0d031e 100644 --- a/hbase-server/src/test/java/org/apache/hadoop/hbase/regionserver/wal/HLogUtilsForTests.java +++ b/hbase-server/src/test/java/org/apache/hadoop/hbase/regionserver/wal/HLogUtilsForTests.java @@ -18,8 +18,6 @@ */ package org.apache.hadoop.hbase.regionserver.wal; -import org.apache.hadoop.hbase.HBaseTestingUtility; -import org.apache.hadoop.hbase.HConstants; /** * An Utility testcase that returns the number of log files that diff --git a/hbase-server/src/test/java/org/apache/hadoop/hbase/regionserver/wal/TestLogRolling.java b/hbase-server/src/test/java/org/apache/hadoop/hbase/regionserver/wal/TestLogRolling.java index 9d54790..05e100c 100644 --- a/hbase-server/src/test/java/org/apache/hadoop/hbase/regionserver/wal/TestLogRolling.java +++ b/hbase-server/src/test/java/org/apache/hadoop/hbase/regionserver/wal/TestLogRolling.java @@ -189,7 +189,7 @@ public class TestLogRolling { TEST_UTIL.shutdownMiniCluster(); } - private void startAndWriteData() throws IOException { + private void startAndWriteData() throws IOException, InterruptedException { // When the META table can be opened, the region servers are running new HTable(TEST_UTIL.getConfiguration(), HConstants.META_TABLE_NAME); this.server = cluster.getRegionServerThreads().get(0).getRegionServer(); diff --git a/hbase-server/src/test/java/org/apache/hadoop/hbase/snapshot/TestFlushSnapshotFromClient.java b/hbase-server/src/test/java/org/apache/hadoop/hbase/snapshot/TestFlushSnapshotFromClient.java index 430022e..ddc7f82 100644 --- a/hbase-server/src/test/java/org/apache/hadoop/hbase/snapshot/TestFlushSnapshotFromClient.java +++ b/hbase-server/src/test/java/org/apache/hadoop/hbase/snapshot/TestFlushSnapshotFromClient.java @@ -427,7 +427,8 @@ public class TestFlushSnapshotFromClient { FSUtils.logFileSystemState(UTIL.getDFSCluster().getFileSystem(), root, LOG); } - private void waitForTableToBeOnline(final byte[] tableName) throws IOException { + private void waitForTableToBeOnline(final byte[] tableName) + throws IOException, InterruptedException { HRegionServer rs = UTIL.getRSForFirstRegionInTable(tableName); List onlineRegions = rs.getOnlineRegions(tableName); for (HRegion region : onlineRegions) {