You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@hbase.apache.org by zh...@apache.org on 2018/03/27 10:21:17 UTC

[31/50] [abbrv] hbase git commit: HBASE-20229 ConnectionImplementation.locateRegions() returns duplicated entries when region replication is on

HBASE-20229 ConnectionImplementation.locateRegions() returns duplicated entries when region replication is on


Project: http://git-wip-us.apache.org/repos/asf/hbase/repo
Commit: http://git-wip-us.apache.org/repos/asf/hbase/commit/ff5250ca
Tree: http://git-wip-us.apache.org/repos/asf/hbase/tree/ff5250ca
Diff: http://git-wip-us.apache.org/repos/asf/hbase/diff/ff5250ca

Branch: refs/heads/HBASE-19064
Commit: ff5250ca2b9367d9011ae74ce127bc6de579c6bd
Parents: 5b2d2de
Author: Toshihiro Suzuki <br...@gmail.com>
Authored: Mon Mar 26 15:03:45 2018 -0700
Committer: Huaxiang Sun <hs...@cloudera.com>
Committed: Mon Mar 26 15:09:20 2018 -0700

----------------------------------------------------------------------
 .../hbase/client/ConnectionImplementation.java  |  3 ++
 .../client/TestConnectionImplementation.java    | 36 ++++++++++++++++++++
 2 files changed, 39 insertions(+)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/hbase/blob/ff5250ca/hbase-client/src/main/java/org/apache/hadoop/hbase/client/ConnectionImplementation.java
----------------------------------------------------------------------
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<HRegionLocation> 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()) {

http://git-wip-us.apache.org/repos/asf/hbase/blob/ff5250ca/hbase-server/src/test/java/org/apache/hadoop/hbase/client/TestConnectionImplementation.java
----------------------------------------------------------------------
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..4d9f39b 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
@@ -29,6 +29,7 @@ import java.lang.reflect.Modifier;
 import java.net.SocketTimeoutException;
 import java.util.ArrayList;
 import java.util.List;
+import java.util.Set;
 import java.util.concurrent.ExecutorService;
 import java.util.concurrent.SynchronousQueue;
 import java.util.concurrent.ThreadLocalRandom;
@@ -37,6 +38,9 @@ import java.util.concurrent.TimeUnit;
 import java.util.concurrent.atomic.AtomicBoolean;
 import java.util.concurrent.atomic.AtomicInteger;
 import java.util.concurrent.atomic.AtomicReference;
+import java.util.stream.Collectors;
+import java.util.stream.IntStream;
+
 import org.apache.hadoop.conf.Configuration;
 import org.apache.hadoop.hbase.Cell;
 import org.apache.hadoop.hbase.HBaseClassTestRule;
@@ -1044,4 +1048,36 @@ 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());
+
+    try (ConnectionImplementation con = (ConnectionImplementation) ConnectionFactory.
+      createConnection(TEST_UTIL.getConfiguration())) {
+      // Get locations of the regions of the table
+      List<HRegionLocation> locations = con.locateRegions(tableName, false, false);
+
+      // The size of the returned locations should be 3
+      assertEquals(regionReplication, locations.size());
+
+      // The replicaIds of the returned locations should be 0, 1 and 2
+      Set<Integer> expectedReplicaIds = IntStream.range(0, regionReplication).
+        boxed().collect(Collectors.toSet());
+      for (HRegionLocation location : locations) {
+        assertTrue(expectedReplicaIds.remove(location.getRegion().getReplicaId()));
+      }
+    } finally {
+      TEST_UTIL.deleteTable(tableName);
+    }
+  }
 }