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