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 af4e4b6450
commit ec9c9e201a
2 changed files with 28 additions and 2 deletions

View File

@ -652,7 +652,7 @@ class ConnectionImplementation implements ClusterConnection, Closeable {
final byte [] row, boolean useCache, boolean retry, int replicaId) final byte [] row, boolean useCache, boolean retry, int replicaId)
throws IOException { throws IOException {
if (this.closed) { if (this.closed) {
throw new IOException(toString() + " closed"); throw new DoNotRetryIOException(toString() + " closed");
} }
if (tableName== null || tableName.getName().length == 0) { if (tableName== null || tableName.getName().length == 0) {
throw new IllegalArgumentException( throw new IllegalArgumentException(

View File

@ -33,7 +33,7 @@ import java.util.concurrent.Executors;
import java.util.concurrent.atomic.AtomicInteger; import java.util.concurrent.atomic.AtomicInteger;
import java.util.concurrent.atomic.AtomicLong; import java.util.concurrent.atomic.AtomicLong;
import org.apache.hadoop.hbase.CellComparator; import org.apache.hadoop.hbase.CellComparator;
import org.apache.hadoop.hbase.DoNotRetryIOException;
import org.apache.commons.lang.NotImplementedException; import org.apache.commons.lang.NotImplementedException;
import org.apache.commons.logging.Log; import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory; import org.apache.commons.logging.LogFactory;
@ -263,6 +263,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. * Override to shutdown going to zookeeper for cluster id and meta location.
*/ */