commit 203199884bd783ec51670b98a869a2938b884b15 Author: Yu Li Date: Sat Nov 19 23:41:27 2016 +0800 HBASE-17127 Locate region should fail fast if underlying Connection already closed diff --git a/hbase-client/src/main/java/org/apache/hadoop/hbase/client/ConnectionManager.java b/hbase-client/src/main/java/org/apache/hadoop/hbase/client/ConnectionManager.java index 4e9d208..cba441e 100644 --- a/hbase-client/src/main/java/org/apache/hadoop/hbase/client/ConnectionManager.java +++ b/hbase-client/src/main/java/org/apache/hadoop/hbase/client/ConnectionManager.java @@ -1171,7 +1171,7 @@ class ConnectionManager { public RegionLocations locateRegion(final TableName tableName, final byte [] row, boolean useCache, boolean retry, int replicaId) throws IOException { - if (this.closed) throw new IOException(toString() + " closed"); + if (this.closed) throw new DoNotRetryIOException(toString() + " closed"); if (tableName== null || tableName.getName().length == 0) { throw new IllegalArgumentException( "table name cannot be null or zero length"); diff --git a/hbase-client/src/test/java/org/apache/hadoop/hbase/client/TestClientNoCluster.java b/hbase-client/src/test/java/org/apache/hadoop/hbase/client/TestClientNoCluster.java index 2d50c1b..f6968bc 100644 --- a/hbase-client/src/test/java/org/apache/hadoop/hbase/client/TestClientNoCluster.java +++ b/hbase-client/src/test/java/org/apache/hadoop/hbase/client/TestClientNoCluster.java @@ -39,6 +39,7 @@ import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.apache.hadoop.conf.Configuration; import org.apache.hadoop.conf.Configured; +import org.apache.hadoop.hbase.DoNotRetryIOException; import org.apache.hadoop.hbase.HBaseConfiguration; import org.apache.hadoop.hbase.HConstants; import org.apache.hadoop.hbase.HRegionInfo; @@ -286,6 +287,32 @@ public class TestClientNoCluster extends Configured implements Tool { } } + @Test + public void testConnectionClosedOnRegionLocate() throws IOException { + Configuration testConf = new Configuration(this.conf); + testConf.setInt(HConstants.HBASE_CLIENT_RETRIES_NUMBER, 2); + // Go against meta else we will try to find first region for the table on construction which + // means we'll have to do a bunch more mocking. Tests that go against meta only should be + // good for a bit of testing. + Connection connection = ConnectionFactory.createConnection(testConf); + Table table = connection.getTable(TableName.META_TABLE_NAME); + connection.close(); + try { + Get get = new Get(Bytes.toBytes("dummyRow")); + table.get(get); + fail("Should have thrown DoNotRetryException but no exception thrown"); + } catch (Exception e) { + if (!(e instanceof DoNotRetryIOException)) { + String errMsg = + "Should have thrown DoNotRetryException but actually " + e.getClass().getSimpleName(); + LOG.error(errMsg, e); + fail(errMsg); + } + } finally { + table.close(); + } + } + /** * Override to shutdown going to zookeeper for cluster id and meta location. */