You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@hbase.apache.org by nd...@apache.org on 2021/01/19 15:54:26 UTC

[hbase] branch master updated: HBASE-25513 When the table is turned on normalize, the first region may not be merged even the size is 0 (#2887)

This is an automated email from the ASF dual-hosted git repository.

ndimiduk pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/hbase.git


The following commit(s) were added to refs/heads/master by this push:
     new bc4f5c2  HBASE-25513 When the table is turned on normalize, the first region may not be merged even the size is 0 (#2887)
bc4f5c2 is described below

commit bc4f5c2709a71c985cd352da6374565e809e75e0
Author: Baiqiang Zhao <zb...@gmail.com>
AuthorDate: Tue Jan 19 23:53:51 2021 +0800

    HBASE-25513 When the table is turned on normalize, the first region may not be merged even the size is 0 (#2887)
    
    Signed-off-by: Nick Dimiduk <nd...@apache.org>
---
 .../master/normalizer/SimpleRegionNormalizer.java  |  4 +++
 .../normalizer/TestSimpleRegionNormalizer.java     | 32 ++++++++++++++++++++++
 2 files changed, 36 insertions(+)

diff --git a/hbase-server/src/main/java/org/apache/hadoop/hbase/master/normalizer/SimpleRegionNormalizer.java b/hbase-server/src/main/java/org/apache/hadoop/hbase/master/normalizer/SimpleRegionNormalizer.java
index 6d7387b..08e529c 100644
--- a/hbase-server/src/main/java/org/apache/hadoop/hbase/master/normalizer/SimpleRegionNormalizer.java
+++ b/hbase-server/src/main/java/org/apache/hadoop/hbase/master/normalizer/SimpleRegionNormalizer.java
@@ -364,6 +364,10 @@ class SimpleRegionNormalizer implements RegionNormalizer, ConfigurationObserver
         if (rangeMembers.isEmpty() // when there are no range members, seed the range with whatever
                                    // we have. this way we're prepared in case the next region is
                                    // 0-size.
+          || (rangeMembers.size() == 1 && sumRangeMembersSizeMb == 0) // when there is only one
+                                                                      // region and the size is 0,
+                                                                      // seed the range with
+                                                                      // whatever we have.
           || regionSizeMb == 0 // always add an empty region to the current range.
           || (regionSizeMb + sumRangeMembersSizeMb <= avgRegionSizeMb)) { // add the current region
                                                                           // to the range when
diff --git a/hbase-server/src/test/java/org/apache/hadoop/hbase/master/normalizer/TestSimpleRegionNormalizer.java b/hbase-server/src/test/java/org/apache/hadoop/hbase/master/normalizer/TestSimpleRegionNormalizer.java
index 33b3297..70f5a87 100644
--- a/hbase-server/src/test/java/org/apache/hadoop/hbase/master/normalizer/TestSimpleRegionNormalizer.java
+++ b/hbase-server/src/test/java/org/apache/hadoop/hbase/master/normalizer/TestSimpleRegionNormalizer.java
@@ -449,6 +449,38 @@ public class TestSimpleRegionNormalizer {
   }
 
   @Test
+  public void testMergeEmptyRegions2() {
+    conf.setBoolean(SPLIT_ENABLED_KEY, false);
+    conf.setInt(MERGE_MIN_REGION_SIZE_MB_KEY, 0);
+    final TableName tableName = name.getTableName();
+    final List<RegionInfo> regionInfos = createRegionInfos(tableName, 8);
+    final Map<byte[], Integer> regionSizes =
+      createRegionSizesMap(regionInfos, 0, 10, 1, 0, 9, 0, 10, 0);
+    setupMocksForNormalizer(regionSizes, regionInfos);
+
+    assertFalse(normalizer.isSplitEnabled());
+    assertEquals(0, normalizer.getMergeMinRegionSizeMb());
+    List<NormalizationPlan> plans = normalizer.computePlansForTable(tableName);
+    assertThat(plans, contains(
+      new MergeNormalizationPlan.Builder()
+        .addTarget(regionInfos.get(0), 0)
+        .addTarget(regionInfos.get(1), 10)
+        .build(),
+      new MergeNormalizationPlan.Builder()
+        .addTarget(regionInfos.get(2), 1)
+        .addTarget(regionInfos.get(3), 0)
+        .build(),
+      new MergeNormalizationPlan.Builder()
+        .addTarget(regionInfos.get(4), 9)
+        .addTarget(regionInfos.get(5), 0)
+        .build(),
+      new MergeNormalizationPlan.Builder()
+        .addTarget(regionInfos.get(6), 10)
+        .addTarget(regionInfos.get(7), 0)
+        .build()));
+  }
+
+  @Test
   public void testSplitAndMultiMerge() {
     conf.setInt(MERGE_MIN_REGION_SIZE_MB_KEY, 0);
     final TableName tableName = name.getTableName();