From 01472bef70e251de8a3ea8076144bfeb1f8cb265 Mon Sep 17 00:00:00 2001 From: Toshihiro Suzuki Date: Tue, 20 Mar 2018 17:52:06 +0900 Subject: [PATCH] HBASE-20229 ConnectionImplementation.locateRegions() doesn't work correctly when region replication is on --- .../hbase/client/ConnectionImplementation.java | 3 +++ .../hbase/client/TestConnectionImplementation.java | 20 ++++++++++++++++++++ 2 files changed, 23 insertions(+) diff --git a/hbase-client/src/main/java/org/apache/hadoop/hbase/client/ConnectionImplementation.java b/hbase-client/src/main/java/org/apache/hadoop/hbase/client/ConnectionImplementation.java index 6408044..7723161 100644 --- a/hbase-client/src/main/java/org/apache/hadoop/hbase/client/ConnectionImplementation.java +++ b/hbase-client/src/main/java/org/apache/hadoop/hbase/client/ConnectionImplementation.java @@ -672,6 +672,9 @@ class ConnectionImplementation implements ClusterConnection, Closeable { } List locations = new ArrayList<>(); for (RegionInfo regionInfo : regions) { + if (!RegionReplicaUtil.isDefaultReplica(regionInfo)) { + continue; + } RegionLocations list = locateRegion(tableName, regionInfo.getStartKey(), useCache, true); if (list != null) { for (HRegionLocation loc : list.getRegionLocations()) { diff --git a/hbase-server/src/test/java/org/apache/hadoop/hbase/client/TestConnectionImplementation.java b/hbase-server/src/test/java/org/apache/hadoop/hbase/client/TestConnectionImplementation.java index 521317d..1376bc5 100644 --- a/hbase-server/src/test/java/org/apache/hadoop/hbase/client/TestConnectionImplementation.java +++ b/hbase-server/src/test/java/org/apache/hadoop/hbase/client/TestConnectionImplementation.java @@ -1044,4 +1044,24 @@ public class TestConnectionImplementation { table.close(); connection.close(); } + + @Test + public void testLocateRegionsWithRegionReplicas() throws IOException { + int regionReplication = 3; + byte[] family = Bytes.toBytes("cf"); + TableName tableName = TableName.valueOf(name.getMethodName()); + + // Create a table with region replicas + TableDescriptorBuilder builder = TableDescriptorBuilder + .newBuilder(tableName) + .setRegionReplication(regionReplication) + .setColumnFamily(ColumnFamilyDescriptorBuilder.of(family)); + TEST_UTIL.getAdmin().createTable(builder.build()); + + ConnectionImplementation con = (ConnectionImplementation) ConnectionFactory. + createConnection(TEST_UTIL.getConfiguration()); + + List locations = con.locateRegions(tableName, false, false); + assertEquals(regionReplication, locations.size()); + } } -- 2.10.1 (Apple Git-78)