You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@hbase.apache.org by ra...@apache.org on 2018/09/04 11:10:11 UTC

hbase git commit: HBASE-20741 - Split of a region with replicas creates all daughter regions and its replica in same server (Addendum for duo's comments in RB)

Repository: hbase
Updated Branches:
  refs/heads/master f504c4d79 -> c6a65ba63


HBASE-20741 - Split of a region with replicas creates all daughter regions
and its replica in same server (Addendum for duo's comments in RB)


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

Branch: refs/heads/master
Commit: c6a65ba63fce85ac7c4b62b96ef2bbe6c35d2f00
Parents: f504c4d
Author: Vasudevan <ra...@intel.com>
Authored: Tue Sep 4 16:38:09 2018 +0530
Committer: Vasudevan <ra...@intel.com>
Committed: Tue Sep 4 16:38:09 2018 +0530

----------------------------------------------------------------------
 .../assignment/AssignmentManagerUtil.java       |   6 +-
 .../assignment/TestRegionReplicaSplit.java      | 100 +++++++++----------
 2 files changed, 51 insertions(+), 55 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/hbase/blob/c6a65ba6/hbase-server/src/main/java/org/apache/hadoop/hbase/master/assignment/AssignmentManagerUtil.java
----------------------------------------------------------------------
diff --git a/hbase-server/src/main/java/org/apache/hadoop/hbase/master/assignment/AssignmentManagerUtil.java b/hbase-server/src/main/java/org/apache/hadoop/hbase/master/assignment/AssignmentManagerUtil.java
index 77e3a97..7f2d11a 100644
--- a/hbase-server/src/main/java/org/apache/hadoop/hbase/master/assignment/AssignmentManagerUtil.java
+++ b/hbase-server/src/main/java/org/apache/hadoop/hbase/master/assignment/AssignmentManagerUtil.java
@@ -50,6 +50,8 @@ import org.apache.hadoop.hbase.shaded.protobuf.generated.AdminProtos.GetRegionIn
  */
 @InterfaceAudience.Private
 final class AssignmentManagerUtil {
+  private static final int DEFAULT_REGION_REPLICA = 1;
+
   private AssignmentManagerUtil() {
   }
 
@@ -142,8 +144,6 @@ final class AssignmentManagerUtil {
       List<RegionInfo> regions, int regionReplication, ServerName targetServer) {
     // create the assign procs only for the primary region using the targetServer
     TransitRegionStateProcedure[] primaryRegionProcs = regions.stream()
-        .flatMap(hri -> IntStream.range(0, 1) // yes, only the primary
-            .mapToObj(i -> RegionReplicaUtil.getRegionInfoForReplica(hri, i)))
         .map(env.getAssignmentManager().getRegionStates()::getOrCreateRegionStateNode)
         .map(regionNode -> {
           TransitRegionStateProcedure proc =
@@ -160,7 +160,7 @@ final class AssignmentManagerUtil {
           }
           return proc;
         }).toArray(TransitRegionStateProcedure[]::new);
-    if (regionReplication == 1) {
+    if (regionReplication == DEFAULT_REGION_REPLICA) {
       // this is the default case
       return primaryRegionProcs;
     }

http://git-wip-us.apache.org/repos/asf/hbase/blob/c6a65ba6/hbase-server/src/test/java/org/apache/hadoop/hbase/master/assignment/TestRegionReplicaSplit.java
----------------------------------------------------------------------
diff --git a/hbase-server/src/test/java/org/apache/hadoop/hbase/master/assignment/TestRegionReplicaSplit.java b/hbase-server/src/test/java/org/apache/hadoop/hbase/master/assignment/TestRegionReplicaSplit.java
index 315ef83..120f36d 100644
--- a/hbase-server/src/test/java/org/apache/hadoop/hbase/master/assignment/TestRegionReplicaSplit.java
+++ b/hbase-server/src/test/java/org/apache/hadoop/hbase/master/assignment/TestRegionReplicaSplit.java
@@ -35,6 +35,8 @@ import org.apache.hadoop.hbase.TableName;
 import org.apache.hadoop.hbase.client.RegionInfo;
 import org.apache.hadoop.hbase.client.RegionReplicaUtil;
 import org.apache.hadoop.hbase.client.Table;
+import org.apache.hadoop.hbase.client.TableDescriptor;
+import org.apache.hadoop.hbase.client.TableDescriptorBuilder;
 import org.apache.hadoop.hbase.regionserver.HRegionServer;
 import org.apache.hadoop.hbase.regionserver.Region;
 import org.apache.hadoop.hbase.testclassification.LargeTests;
@@ -66,24 +68,24 @@ public class TestRegionReplicaSplit {
   private static final byte[] f = HConstants.CATALOG_FAMILY;
 
   @BeforeClass
-  public static void before() throws Exception {
+  public static void beforeClass() throws Exception {
     HTU.getConfiguration().setInt("hbase.master.wait.on.regionservers.mintostart", 3);
     HTU.startMiniCluster(NB_SERVERS);
     final TableName tableName = TableName.valueOf(TestRegionReplicaSplit.class.getSimpleName());
 
     // Create table then get the single region for our new table.
-    createTableDirectlyFromHTD(tableName);
+    createTable(tableName);
   }
 
   @Rule
   public TestName name = new TestName();
 
-  private static void createTableDirectlyFromHTD(final TableName tableName) throws IOException {
-    HTableDescriptor htd = new HTableDescriptor(tableName);
-    htd.setRegionReplication(3);
+  private static void createTable(final TableName tableName) throws IOException {
+    TableDescriptorBuilder builder = TableDescriptorBuilder.newBuilder(tableName);
+    builder.setRegionReplication(3);
     // create a table with 3 replication
 
-    table = HTU.createTable(htd, new byte[][] { f }, getSplits(2),
+    table = HTU.createTable(builder.build(), new byte[][] { f }, getSplits(2),
       new Configuration(HTU.getConfiguration()));
   }
 
@@ -101,63 +103,57 @@ public class TestRegionReplicaSplit {
     HTU.shutdownMiniCluster();
   }
 
-  @Test(timeout = 60000)
   public void testRegionReplicaSplitRegionAssignment() throws Exception {
-    try {
-      HTU.loadNumericRows(table, f, 0, 3);
-      // split the table
-      List<RegionInfo> regions = new ArrayList<RegionInfo>();
+    HTU.loadNumericRows(table, f, 0, 3);
+    // split the table
+    List<RegionInfo> regions = new ArrayList<RegionInfo>();
+    for (RegionServerThread rs : HTU.getMiniHBaseCluster().getRegionServerThreads()) {
+      for (Region r : rs.getRegionServer().getRegions(table.getName())) {
+        System.out.println("the region before split is is " + r.getRegionInfo()
+            + rs.getRegionServer().getServerName());
+        regions.add(r.getRegionInfo());
+      }
+    }
+    HTU.getAdmin().split(table.getName(), Bytes.toBytes(1));
+    int count = 0;
+    while (true) {
       for (RegionServerThread rs : HTU.getMiniHBaseCluster().getRegionServerThreads()) {
         for (Region r : rs.getRegionServer().getRegions(table.getName())) {
-          System.out.println("the region before split is is " + r.getRegionInfo()
-              + rs.getRegionServer().getServerName());
-          regions.add(r.getRegionInfo());
+          count++;
         }
       }
-      HTU.getAdmin().split(table.getName(), Bytes.toBytes(1));
-      int count = 0;
-      while (true) {
-        for (RegionServerThread rs : HTU.getMiniHBaseCluster().getRegionServerThreads()) {
-          for (Region r : rs.getRegionServer().getRegions(table.getName())) {
-            count++;
-          }
-        }
-        if (count >= 9) {
-          break;
-        }
-        count = 0;
+      if (count >= 9) {
+        break;
       }
-      List<ServerName> newRegionLocations = new ArrayList<ServerName>();
-      for (RegionServerThread rs : HTU.getMiniHBaseCluster().getRegionServerThreads()) {
-        RegionInfo prevInfo = null;
-        for (Region r : rs.getRegionServer().getRegions(table.getName())) {
-          if (!regions.contains(r.getRegionInfo())
-              && !RegionReplicaUtil.isDefaultReplica(r.getRegionInfo())) {
-            LOG.info("The region is " + r.getRegionInfo() + " the location is "
-                + rs.getRegionServer().getServerName());
+      count = 0;
+    }
+    List<ServerName> newRegionLocations = new ArrayList<ServerName>();
+    for (RegionServerThread rs : HTU.getMiniHBaseCluster().getRegionServerThreads()) {
+      RegionInfo prevInfo = null;
+      for (Region r : rs.getRegionServer().getRegions(table.getName())) {
+        if (!regions.contains(r.getRegionInfo())
+            && !RegionReplicaUtil.isDefaultReplica(r.getRegionInfo())) {
+          LOG.info("The region is " + r.getRegionInfo() + " the location is "
+              + rs.getRegionServer().getServerName());
+          if (!RegionReplicaUtil.isDefaultReplica(r.getRegionInfo())
+              && newRegionLocations.contains(rs.getRegionServer().getServerName())
+              && prevInfo != null
+              && Bytes.equals(prevInfo.getStartKey(), r.getRegionInfo().getStartKey())
+              && Bytes.equals(prevInfo.getEndKey(), r.getRegionInfo().getEndKey())) {
+            fail("Splitted regions should not be assigned to same region server");
+          } else {
+            prevInfo = r.getRegionInfo();
             if (!RegionReplicaUtil.isDefaultReplica(r.getRegionInfo())
-                && newRegionLocations.contains(rs.getRegionServer().getServerName())
-                && prevInfo != null
-                && Bytes.equals(prevInfo.getStartKey(), r.getRegionInfo().getStartKey())
-                && Bytes.equals(prevInfo.getEndKey(), r.getRegionInfo().getEndKey())) {
-              fail("Splitted regions should not be assigned to same region server");
-            } else {
-              prevInfo = r.getRegionInfo();
-              if (!RegionReplicaUtil.isDefaultReplica(r.getRegionInfo())
-                  && !newRegionLocations.contains(rs.getRegionServer().getServerName())) {
-                newRegionLocations.add(rs.getRegionServer().getServerName());
-              }
+                && !newRegionLocations.contains(rs.getRegionServer().getServerName())) {
+              newRegionLocations.add(rs.getRegionServer().getServerName());
             }
           }
         }
       }
-      // since we assign the daughter regions in round robin fashion, both the daugther region
-      // replicas will be assigned to two unique servers.
-      assertEquals("The new regions should be assigned to 3 unique servers ", 3,
-        newRegionLocations.size());
-    } finally {
-      HTU.getAdmin().disableTable(table.getName());
-      HTU.getAdmin().deleteTable(table.getName());
     }
+    // since we assign the daughter regions in round robin fashion, both the daugther region
+    // replicas will be assigned to two unique servers.
+    assertEquals("The new regions should be assigned to 3 unique servers ", 3,
+      newRegionLocations.size());
   }
 }