HBASE-17127 Locate region should fail fast if underlying Connection already closed

This commit is contained in:
Yu Li 2016-11-19 23:41:27 +08:00
parent 3c45ff08d9
commit e30329e372
2 changed files with 28 additions and 1 deletions

View File

@ -1175,7 +1175,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");

View File

@ -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.
*/