diff --git a/hbase-client/src/main/java/org/apache/hadoop/hbase/client/ClusterConnection.java b/hbase-client/src/main/java/org/apache/hadoop/hbase/client/ClusterConnection.java
index 8b576d8..a6db04a 100644
--- a/hbase-client/src/main/java/org/apache/hadoop/hbase/client/ClusterConnection.java
+++ b/hbase-client/src/main/java/org/apache/hadoop/hbase/client/ClusterConnection.java
@@ -113,11 +113,11 @@ public interface ClusterConnection extends HConnection {
* @param tableName name of the table row is in
* @param row row key you're trying to find the region of
* @param replicaId the replicaId of the region
- * @return HRegionLocation that describes where to find the region in
+ * @return RegionLocations that describe where to find the region in
* question
* @throws IOException if a remote or network exception occurs
*/
- HRegionLocation relocateRegion(final TableName tableName,
+ RegionLocations relocateRegion(final TableName tableName,
final byte [] row, int replicaId) throws IOException;
/**
diff --git a/hbase-client/src/main/java/org/apache/hadoop/hbase/client/ConnectionAdapter.java b/hbase-client/src/main/java/org/apache/hadoop/hbase/client/ConnectionAdapter.java
index 5b4f7c7..61b3acd 100644
--- a/hbase-client/src/main/java/org/apache/hadoop/hbase/client/ConnectionAdapter.java
+++ b/hbase-client/src/main/java/org/apache/hadoop/hbase/client/ConnectionAdapter.java
@@ -305,7 +305,7 @@ class ConnectionAdapter implements ClusterConnection {
}
@Override
- public HRegionLocation relocateRegion(TableName tableName, byte[] row, int replicaId)
+ public RegionLocations relocateRegion(TableName tableName, byte[] row, int replicaId)
throws IOException {
return wrappedConnection.relocateRegion(tableName, row, replicaId);
}
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 bbf180e..d072695 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
@@ -1063,11 +1063,14 @@ class ConnectionManager {
@Override
public HRegionLocation relocateRegion(final TableName tableName,
final byte [] row) throws IOException{
- return relocateRegion(tableName, row, RegionReplicaUtil.DEFAULT_REPLICA_ID);
+ RegionLocations locations = relocateRegion(tableName, row,
+ RegionReplicaUtil.DEFAULT_REPLICA_ID);
+ return locations == null ? null :
+ locations.getRegionLocation(RegionReplicaUtil.DEFAULT_REPLICA_ID);
}
@Override
- public HRegionLocation relocateRegion(final TableName tableName,
+ public RegionLocations relocateRegion(final TableName tableName,
final byte [] row, int replicaId) throws IOException{
// Since this is an explicit request not to use any caching, finding
// disabled tables should not be desirable. This will ensure that an exception is thrown when
@@ -1076,8 +1079,7 @@ class ConnectionManager {
throw new TableNotEnabledException(tableName.getNameAsString() + " is disabled.");
}
- RegionLocations locations = locateRegion(tableName, row, false, true, replicaId);
- return locations == null ? null : locations.getRegionLocation(replicaId);
+ return locateRegion(tableName, row, false, true, replicaId);
}
@Override
diff --git a/hbase-client/src/main/java/org/apache/hadoop/hbase/client/RegionServerCallable.java b/hbase-client/src/main/java/org/apache/hadoop/hbase/client/RegionServerCallable.java
index 1cefb7f..e8c974b 100644
--- a/hbase-client/src/main/java/org/apache/hadoop/hbase/client/RegionServerCallable.java
+++ b/hbase-client/src/main/java/org/apache/hadoop/hbase/client/RegionServerCallable.java
@@ -75,7 +75,11 @@ public abstract class RegionServerCallable implements RetryingCallable {
*/
@Override
public void prepare(final boolean reload) throws IOException {
- this.location = connection.getRegionLocation(tableName, row, reload);
+ if (reload && !tableName.equals(TableName.META_TABLE_NAME)) {
+ this.location = connection.getRegionLocation(tableName, row, reload);
+ } else {
+ this.location = connection.locateRegion(tableName, row);
+ }
if (this.location == null) {
throw new IOException("Failed to find location, tableName=" + tableName +
", row=" + Bytes.toString(row) + ", reload=" + reload);
diff --git a/hbase-client/src/main/java/org/apache/hadoop/hbase/client/RpcRetryingCallerWithReadReplicas.java b/hbase-client/src/main/java/org/apache/hadoop/hbase/client/RpcRetryingCallerWithReadReplicas.java
index f15ad02..dbe0d38 100644
--- a/hbase-client/src/main/java/org/apache/hadoop/hbase/client/RpcRetryingCallerWithReadReplicas.java
+++ b/hbase-client/src/main/java/org/apache/hadoop/hbase/client/RpcRetryingCallerWithReadReplicas.java
@@ -283,7 +283,11 @@ public class RpcRetryingCallerWithReadReplicas {
RegionLocations rl;
try {
- rl = cConnection.locateRegion(tableName, row, useCache, true, replicaId);
+ if (!useCache && !tableName.equals(TableName.META_TABLE_NAME)) {
+ rl = cConnection.relocateRegion(tableName, row, replicaId);
+ } else {
+ rl = cConnection.locateRegion(tableName, row, useCache, true, replicaId);
+ }
} catch (DoNotRetryIOException e) {
throw e;
} catch (RetriesExhaustedException e) {
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 6fe6ede..5e4416f 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
@@ -264,7 +264,19 @@ public class TestAdmin {
boolean ok = false;
try {
ht.get(get);
- } catch (org.apache.hadoop.hbase.DoNotRetryIOException e) {
+ } catch (TableNotEnabledException e) {
+ ok = true;
+ }
+ ok = false;
+ // verify that scan encounters correct exception
+ Scan scan = new Scan();
+ try {
+ ResultScanner scanner = ht.getScanner(scan);
+ Result res = null;
+ do {
+ res = scanner.next();
+ } while (res != null);
+ } catch (TableNotEnabledException e) {
ok = true;
}
assertTrue(ok);