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);