From e55af994f78f9356f3004bc2324900a78d41e607 Mon Sep 17 00:00:00 2001 From: liuxiaocs7 Date: Thu, 26 Feb 2026 21:40:06 +0800 Subject: [PATCH 1/3] HBASE-29809 Unify region reopening methods to use throttled implementation --- .../apache/hadoop/hbase/master/HMaster.java | 1 + .../hbase/master/RegionsRecoveryChore.java | 11 ++++---- .../ReopenTableRegionsProcedure.java | 6 +++-- .../master/TestRegionsRecoveryChore.java | 27 ++++++++----------- 4 files changed, 21 insertions(+), 24 deletions(-) diff --git a/hbase-server/src/main/java/org/apache/hadoop/hbase/master/HMaster.java b/hbase-server/src/main/java/org/apache/hadoop/hbase/master/HMaster.java index c997f1c6e822..e3dbaa51b78f 100644 --- a/hbase-server/src/main/java/org/apache/hadoop/hbase/master/HMaster.java +++ b/hbase-server/src/main/java/org/apache/hadoop/hbase/master/HMaster.java @@ -4246,6 +4246,7 @@ public void remoteProcedureFailed(long procId, RemoteProcedureException error) { * @return procedure Id * @throws IOException if reopening region fails while running procedure */ + @Deprecated long reopenRegions(final TableName tableName, final List regionNames, final long nonceGroup, final long nonce) throws IOException { diff --git a/hbase-server/src/main/java/org/apache/hadoop/hbase/master/RegionsRecoveryChore.java b/hbase-server/src/main/java/org/apache/hadoop/hbase/master/RegionsRecoveryChore.java index c88516f2ffe4..8fca26698d89 100644 --- a/hbase-server/src/main/java/org/apache/hadoop/hbase/master/RegionsRecoveryChore.java +++ b/hbase-server/src/main/java/org/apache/hadoop/hbase/master/RegionsRecoveryChore.java @@ -50,8 +50,8 @@ public class RegionsRecoveryChore extends ScheduledChore { private static final String REGIONS_RECOVERY_CHORE_NAME = "RegionsRecoveryChore"; - private static final String ERROR_REOPEN_REIONS_MSG = - "Error reopening regions with high storeRefCount. "; + private static final String ERROR_REOPEN_REGIONS_MSG = + "Error reopening regions with high storeRefCount."; private final HMaster hMaster; private final int storeFileRefCountThreshold; @@ -73,7 +73,6 @@ public class RegionsRecoveryChore extends ScheduledChore { this.hMaster = hMaster; this.storeFileRefCountThreshold = configuration.getInt( HConstants.STORE_FILE_REF_COUNT_THRESHOLD, HConstants.DEFAULT_STORE_FILE_REF_COUNT_THRESHOLD); - } @Override @@ -94,11 +93,11 @@ protected void chore() { tableToReopenRegionsMap.forEach((tableName, regionNames) -> { try { LOG.warn("Reopening regions due to high storeFileRefCount. " - + "TableName: {} , noOfRegions: {}", tableName, regionNames.size()); - hMaster.reopenRegions(tableName, regionNames, NONCE_GENERATOR.getNonceGroup(), + + "TableName: {}, numOfRegions: {}", tableName, regionNames.size()); + hMaster.reopenRegionsThrottled(tableName, regionNames, NONCE_GENERATOR.getNonceGroup(), NONCE_GENERATOR.newNonce()); } catch (IOException e) { - LOG.error("{} tableName: {}, regionNames: {}", ERROR_REOPEN_REIONS_MSG, tableName, + LOG.error("{} tableName: {}, regionNames: {}", ERROR_REOPEN_REGIONS_MSG, tableName, regionNames, e); } }); diff --git a/hbase-server/src/main/java/org/apache/hadoop/hbase/master/procedure/ReopenTableRegionsProcedure.java b/hbase-server/src/main/java/org/apache/hadoop/hbase/master/procedure/ReopenTableRegionsProcedure.java index 00d1b1ad29b6..ca75b95d3b91 100644 --- a/hbase-server/src/main/java/org/apache/hadoop/hbase/master/procedure/ReopenTableRegionsProcedure.java +++ b/hbase-server/src/main/java/org/apache/hadoop/hbase/master/procedure/ReopenTableRegionsProcedure.java @@ -1,3 +1,4 @@ + /* * Licensed to the Apache Software Foundation (ASF) under one * or more contributor license agreements. See the NOTICE file @@ -31,6 +32,7 @@ import org.apache.hadoop.hbase.UnknownRegionException; import org.apache.hadoop.hbase.client.TableDescriptor; import org.apache.hadoop.hbase.conf.ConfigKey; +import org.apache.hadoop.hbase.master.HMaster; import org.apache.hadoop.hbase.master.assignment.RegionStateNode; import org.apache.hadoop.hbase.master.assignment.TransitRegionStateProcedure; import org.apache.hadoop.hbase.procedure2.ProcedureStateSerializer; @@ -91,7 +93,7 @@ public class ReopenTableRegionsProcedure /** * Create a new ReopenTableRegionsProcedure respecting the throttling configuration for the table. * First check the table descriptor, then fall back to the global configuration. Only used in - * ModifyTableProcedure and in {@link HMaster#reopenRegionsThrottled}. + * ModifyTableProcedure and in {@link HMaster}#reopenRegionsThrottled. */ public static ReopenTableRegionsProcedure throttled(final Configuration conf, final TableDescriptor desc) { @@ -108,7 +110,7 @@ public static ReopenTableRegionsProcedure throttled(final Configuration conf, /** * Create a new ReopenTableRegionsProcedure for specific regions, respecting the throttling * configuration for the table. First check the table descriptor, then fall back to the global - * configuration. Only used in {@link HMaster#reopenRegionsThrottled}. + * configuration. Only used in {@link HMaster}#reopenRegionsThrottled. */ public static ReopenTableRegionsProcedure throttled(final Configuration conf, final TableDescriptor desc, final List regionNames) { diff --git a/hbase-server/src/test/java/org/apache/hadoop/hbase/master/TestRegionsRecoveryChore.java b/hbase-server/src/test/java/org/apache/hadoop/hbase/master/TestRegionsRecoveryChore.java index 31fcf9fd47f5..32c7f783a990 100644 --- a/hbase-server/src/test/java/org/apache/hadoop/hbase/master/TestRegionsRecoveryChore.java +++ b/hbase-server/src/test/java/org/apache/hadoop/hbase/master/TestRegionsRecoveryChore.java @@ -26,7 +26,6 @@ import java.util.Set; import org.apache.hadoop.conf.Configuration; import org.apache.hadoop.hbase.ClusterMetrics; -import org.apache.hadoop.hbase.HBaseClassTestRule; import org.apache.hadoop.hbase.HBaseTestingUtil; import org.apache.hadoop.hbase.RegionMetrics; import org.apache.hadoop.hbase.ServerMetrics; @@ -45,11 +44,10 @@ import org.apache.hadoop.hbase.testclassification.MasterTests; import org.apache.hadoop.hbase.testclassification.SmallTests; import org.apache.hadoop.hbase.util.Bytes; -import org.junit.After; -import org.junit.Before; -import org.junit.ClassRule; -import org.junit.Test; -import org.junit.experimental.categories.Category; +import org.junit.jupiter.api.AfterEach; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Tag; +import org.junit.jupiter.api.Test; import org.mockito.Mockito; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -57,13 +55,10 @@ /** * Test for RegionsRecoveryChore */ -@Category({ MasterTests.class, SmallTests.class }) +@Tag(MasterTests.TAG) +@Tag(SmallTests.TAG) public class TestRegionsRecoveryChore { - @ClassRule - public static final HBaseClassTestRule CLASS_RULE = - HBaseClassTestRule.forClass(TestRegionsRecoveryChore.class); - private static final Logger LOG = LoggerFactory.getLogger(TestRegionsRecoveryChore.class); private static final HBaseTestingUtil HBASE_TESTING_UTILITY = new HBaseTestingUtil(); @@ -96,13 +91,13 @@ private Configuration getCustomConf() { return conf; } - @Before + @BeforeEach public void setUp() throws Exception { this.hMaster = Mockito.mock(HMaster.class); this.assignmentManager = Mockito.mock(AssignmentManager.class); } - @After + @AfterEach public void tearDown() throws Exception { Mockito.verifyNoMoreInteractions(this.hMaster); Mockito.verifyNoMoreInteractions(this.assignmentManager); @@ -134,7 +129,7 @@ public void testRegionReopensWithStoreRefConfig() throws Exception { regionsRecoveryChore.chore(); // Verify that we need to reopen regions of 2 tables - Mockito.verify(hMaster, Mockito.times(2)).reopenRegions(Mockito.any(), Mockito.anyList(), + Mockito.verify(hMaster, Mockito.times(2)).reopenRegionsThrottled(Mockito.any(), Mockito.anyList(), Mockito.anyLong(), Mockito.anyLong()); Mockito.verify(hMaster, Mockito.times(1)).getClusterMetrics(); @@ -169,7 +164,7 @@ public void testRegionReopensWithLessThreshold() throws Exception { regionsRecoveryChore.chore(); // Verify that we need to reopen regions of only 1 table - Mockito.verify(hMaster, Mockito.times(1)).reopenRegions(Mockito.any(), Mockito.anyList(), + Mockito.verify(hMaster, Mockito.times(1)).reopenRegionsThrottled(Mockito.any(), Mockito.anyList(), Mockito.anyLong(), Mockito.anyLong()); Mockito.verify(hMaster, Mockito.times(1)).getClusterMetrics(); @@ -205,7 +200,7 @@ public void testRegionReopensWithoutStoreRefConfig() throws Exception { // Verify that by default the feature is turned off so no regions // should be reopened - Mockito.verify(hMaster, Mockito.times(0)).reopenRegions(Mockito.any(), Mockito.anyList(), + Mockito.verify(hMaster, Mockito.times(0)).reopenRegionsThrottled(Mockito.any(), Mockito.anyList(), Mockito.anyLong(), Mockito.anyLong()); // default maxCompactedStoreFileRefCount is -1 (no regions to be reopened using AM) From 2c1cb8bc0b4dd5d40071db230fefe62e9964bc23 Mon Sep 17 00:00:00 2001 From: liuxiaocs7 Date: Sat, 28 Feb 2026 01:51:44 +0800 Subject: [PATCH 2/3] spotless --- .../hadoop/hbase/master/RegionsRecoveryChore.java | 4 ++-- .../procedure/ReopenTableRegionsProcedure.java | 1 - .../hbase/master/TestRegionsRecoveryChore.java | 12 ++++++------ 3 files changed, 8 insertions(+), 9 deletions(-) diff --git a/hbase-server/src/main/java/org/apache/hadoop/hbase/master/RegionsRecoveryChore.java b/hbase-server/src/main/java/org/apache/hadoop/hbase/master/RegionsRecoveryChore.java index 8fca26698d89..122ad575df07 100644 --- a/hbase-server/src/main/java/org/apache/hadoop/hbase/master/RegionsRecoveryChore.java +++ b/hbase-server/src/main/java/org/apache/hadoop/hbase/master/RegionsRecoveryChore.java @@ -94,8 +94,8 @@ protected void chore() { try { LOG.warn("Reopening regions due to high storeFileRefCount. " + "TableName: {}, numOfRegions: {}", tableName, regionNames.size()); - hMaster.reopenRegionsThrottled(tableName, regionNames, NONCE_GENERATOR.getNonceGroup(), - NONCE_GENERATOR.newNonce()); + hMaster.reopenRegionsThrottled(tableName, regionNames, + NONCE_GENERATOR.getNonceGroup(), NONCE_GENERATOR.newNonce()); } catch (IOException e) { LOG.error("{} tableName: {}, regionNames: {}", ERROR_REOPEN_REGIONS_MSG, tableName, regionNames, e); diff --git a/hbase-server/src/main/java/org/apache/hadoop/hbase/master/procedure/ReopenTableRegionsProcedure.java b/hbase-server/src/main/java/org/apache/hadoop/hbase/master/procedure/ReopenTableRegionsProcedure.java index ca75b95d3b91..01b3b83b4672 100644 --- a/hbase-server/src/main/java/org/apache/hadoop/hbase/master/procedure/ReopenTableRegionsProcedure.java +++ b/hbase-server/src/main/java/org/apache/hadoop/hbase/master/procedure/ReopenTableRegionsProcedure.java @@ -1,4 +1,3 @@ - /* * Licensed to the Apache Software Foundation (ASF) under one * or more contributor license agreements. See the NOTICE file diff --git a/hbase-server/src/test/java/org/apache/hadoop/hbase/master/TestRegionsRecoveryChore.java b/hbase-server/src/test/java/org/apache/hadoop/hbase/master/TestRegionsRecoveryChore.java index 32c7f783a990..4486dfbd5df2 100644 --- a/hbase-server/src/test/java/org/apache/hadoop/hbase/master/TestRegionsRecoveryChore.java +++ b/hbase-server/src/test/java/org/apache/hadoop/hbase/master/TestRegionsRecoveryChore.java @@ -129,8 +129,8 @@ public void testRegionReopensWithStoreRefConfig() throws Exception { regionsRecoveryChore.chore(); // Verify that we need to reopen regions of 2 tables - Mockito.verify(hMaster, Mockito.times(2)).reopenRegionsThrottled(Mockito.any(), Mockito.anyList(), - Mockito.anyLong(), Mockito.anyLong()); + Mockito.verify(hMaster, Mockito.times(2)).reopenRegionsThrottled(Mockito.any(), + Mockito.anyList(), Mockito.anyLong(), Mockito.anyLong()); Mockito.verify(hMaster, Mockito.times(1)).getClusterMetrics(); // Verify that we need to reopen total 3 regions that have refCount > 300 @@ -164,8 +164,8 @@ public void testRegionReopensWithLessThreshold() throws Exception { regionsRecoveryChore.chore(); // Verify that we need to reopen regions of only 1 table - Mockito.verify(hMaster, Mockito.times(1)).reopenRegionsThrottled(Mockito.any(), Mockito.anyList(), - Mockito.anyLong(), Mockito.anyLong()); + Mockito.verify(hMaster, Mockito.times(1)).reopenRegionsThrottled(Mockito.any(), + Mockito.anyList(), Mockito.anyLong(), Mockito.anyLong()); Mockito.verify(hMaster, Mockito.times(1)).getClusterMetrics(); // Verify that we need to reopen only 1 region with refCount > 400 @@ -200,8 +200,8 @@ public void testRegionReopensWithoutStoreRefConfig() throws Exception { // Verify that by default the feature is turned off so no regions // should be reopened - Mockito.verify(hMaster, Mockito.times(0)).reopenRegionsThrottled(Mockito.any(), Mockito.anyList(), - Mockito.anyLong(), Mockito.anyLong()); + Mockito.verify(hMaster, Mockito.times(0)).reopenRegionsThrottled(Mockito.any(), + Mockito.anyList(), Mockito.anyLong(), Mockito.anyLong()); // default maxCompactedStoreFileRefCount is -1 (no regions to be reopened using AM) Mockito.verify(hMaster, Mockito.times(0)).getAssignmentManager(); From bcb94a5e2851fd9596bef5f4df92d00eeb259b2b Mon Sep 17 00:00:00 2001 From: liuxiaocs7 Date: Tue, 3 Mar 2026 01:08:29 +0800 Subject: [PATCH 3/3] update java doc --- .../hbase/master/procedure/ReopenTableRegionsProcedure.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/hbase-server/src/main/java/org/apache/hadoop/hbase/master/procedure/ReopenTableRegionsProcedure.java b/hbase-server/src/main/java/org/apache/hadoop/hbase/master/procedure/ReopenTableRegionsProcedure.java index 01b3b83b4672..f693e25e8baf 100644 --- a/hbase-server/src/main/java/org/apache/hadoop/hbase/master/procedure/ReopenTableRegionsProcedure.java +++ b/hbase-server/src/main/java/org/apache/hadoop/hbase/master/procedure/ReopenTableRegionsProcedure.java @@ -92,7 +92,7 @@ public class ReopenTableRegionsProcedure /** * Create a new ReopenTableRegionsProcedure respecting the throttling configuration for the table. * First check the table descriptor, then fall back to the global configuration. Only used in - * ModifyTableProcedure and in {@link HMaster}#reopenRegionsThrottled. + * ModifyTableProcedure and in {@link HMaster#reopenRegionsThrottled}. */ public static ReopenTableRegionsProcedure throttled(final Configuration conf, final TableDescriptor desc) { @@ -109,7 +109,7 @@ public static ReopenTableRegionsProcedure throttled(final Configuration conf, /** * Create a new ReopenTableRegionsProcedure for specific regions, respecting the throttling * configuration for the table. First check the table descriptor, then fall back to the global - * configuration. Only used in {@link HMaster}#reopenRegionsThrottled. + * configuration. Only used in {@link HMaster#reopenRegionsThrottled}. */ public static ReopenTableRegionsProcedure throttled(final Configuration conf, final TableDescriptor desc, final List regionNames) {