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 2024/07/15 03:53:14 UTC

(hbase) 02/02: HBASE-28727 SteppingSplitPolicy may not work when table enables region replication (#6077)

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

zhangduo pushed a commit to branch branch-3
in repository https://gitbox.apache.org/repos/asf/hbase.git

commit f553ed353c4b1ae01fae67ef397656e1667ecb7f
Author: lupeng <lu...@qq.com>
AuthorDate: Mon Jul 15 11:45:49 2024 +0800

    HBASE-28727 SteppingSplitPolicy may not work when table enables region replication (#6077)
    
    Signed-off-by: Duo Zhang <zh...@apache.org>
    (cherry picked from commit 386ecea0a9ceb2f7f455be4f1184e156ecac6431)
---
 .../IncreasingToUpperBoundRegionSplitPolicy.java   |  6 +++-
 .../hbase/regionserver/TestRegionSplitPolicy.java  | 40 ++++++++++++++++++++++
 2 files changed, 45 insertions(+), 1 deletion(-)

diff --git a/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/IncreasingToUpperBoundRegionSplitPolicy.java b/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/IncreasingToUpperBoundRegionSplitPolicy.java
index 7a0393fc0ae..0386bf8245e 100644
--- a/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/IncreasingToUpperBoundRegionSplitPolicy.java
+++ b/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/IncreasingToUpperBoundRegionSplitPolicy.java
@@ -22,6 +22,7 @@ import java.util.List;
 import org.apache.hadoop.conf.Configuration;
 import org.apache.hadoop.hbase.HConstants;
 import org.apache.hadoop.hbase.TableName;
+import org.apache.hadoop.hbase.client.RegionInfo;
 import org.apache.hadoop.hbase.client.TableDescriptor;
 import org.apache.hadoop.hbase.client.TableDescriptorBuilder;
 import org.apache.yetus.audience.InterfaceAudience;
@@ -97,7 +98,10 @@ public class IncreasingToUpperBoundRegionSplitPolicy extends ConstantSizeRegionS
     int tableRegionsCount = 0;
     try {
       List<? extends Region> hri = rss.getRegions(tablename);
-      tableRegionsCount = hri == null || hri.isEmpty() ? 0 : hri.size();
+      if (hri != null && !hri.isEmpty()) {
+        tableRegionsCount = (int) hri.stream()
+          .filter(r -> r.getRegionInfo().getReplicaId() == RegionInfo.DEFAULT_REPLICA_ID).count();
+      }
     } catch (IOException e) {
       LOG.debug("Failed getOnlineRegions " + tablename, e);
     }
diff --git a/hbase-server/src/test/java/org/apache/hadoop/hbase/regionserver/TestRegionSplitPolicy.java b/hbase-server/src/test/java/org/apache/hadoop/hbase/regionserver/TestRegionSplitPolicy.java
index 0c14c9aa812..404935d3e94 100644
--- a/hbase-server/src/test/java/org/apache/hadoop/hbase/regionserver/TestRegionSplitPolicy.java
+++ b/hbase-server/src/test/java/org/apache/hadoop/hbase/regionserver/TestRegionSplitPolicy.java
@@ -154,6 +154,46 @@ public class TestRegionSplitPolicy {
     assertWithinJitter(maxSplitSize, policy.getSizeToCheck(0));
   }
 
+  @Test
+  public void testSteppingSplitPolicyWithRegionReplication() throws IOException {
+    conf.set(HConstants.HBASE_REGION_SPLIT_POLICY_KEY, SteppingSplitPolicy.class.getName());
+
+    RegionServerServices rss = mock(RegionServerServices.class);
+    doReturn(rss).when(mockRegion).getRegionServerServices();
+
+    long maxFileSize = HConstants.DEFAULT_MAX_FILE_SIZE;
+    TableDescriptor td =
+      TableDescriptorBuilder.newBuilder(TABLENAME).setMaxFileSize(maxFileSize).build();
+    doReturn(td).when(mockRegion).getTableDescriptor();
+    assertEquals(td.getMaxFileSize(), maxFileSize);
+
+    List<HStore> storefiles = new ArrayList<>();
+    HStore mockStore = mock(HStore.class);
+    long flushSize = conf.getLong(HConstants.HREGION_MEMSTORE_FLUSH_SIZE,
+      TableDescriptorBuilder.DEFAULT_MEMSTORE_FLUSH_SIZE);
+    long exceedSize = flushSize * 2 + 1;
+    doReturn(exceedSize).when(mockStore).getSize();
+    doReturn(true).when(mockStore).canSplit();
+    storefiles.add(mockStore);
+    doReturn(storefiles).when(mockRegion).getStores();
+
+    List<HRegion> regions = new ArrayList<>();
+    HRegion r1 = mock(HRegion.class);
+    RegionInfo regionInfo1 = mock(RegionInfo.class);
+    doReturn(regionInfo1).when(r1).getRegionInfo();
+    doReturn(RegionInfo.DEFAULT_REPLICA_ID).when(regionInfo1).getReplicaId();
+    HRegion r2 = mock(HRegion.class);
+    RegionInfo regionInfo2 = mock(RegionInfo.class);
+    doReturn(regionInfo2).when(r2).getRegionInfo();
+    doReturn(1).when(regionInfo2).getReplicaId();
+    regions.add(r1);
+    regions.add(r2);
+    doReturn(regions).when(rss).getRegions(td.getTableName());
+
+    SteppingSplitPolicy policy = (SteppingSplitPolicy) RegionSplitPolicy.create(mockRegion, conf);
+    assertTrue(policy.shouldSplit());
+  }
+
   @Test
   public void testIsExceedSize() throws IOException {
     // Configure SteppingAllStoresSizeSplitPolicy as our split policy