This is an automated email from the ASF dual-hosted git repository. anmolnar pushed a commit to branch HBASE-29081 in repository https://gitbox.apache.org/repos/asf/hbase.git
commit 621b0cbbe13114e63d3c5556c359c0b30f099e2b Author: Kota-SH <[email protected]> AuthorDate: Thu May 7 10:49:22 2026 -0400 HBASE-30090: Table on replica cluster not refreshing after flipping read-only flag twice (#8196) --- .../apache/hadoop/hbase/regionserver/HRegion.java | 10 ++++++++++ .../hadoop/hbase/regionserver/StoreEngine.java | 4 ++++ .../storefiletracker/FileBasedStoreFileTracker.java | 8 ++++++++ .../storefiletracker/StoreFileListFile.java | 5 +++++ .../storefiletracker/StoreFileTracker.java | 4 ++++ .../storefiletracker/TestStoreFileListFile.java | 21 +++++++++++++++++++++ 6 files changed, 52 insertions(+) diff --git a/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/HRegion.java b/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/HRegion.java index 36527a6d934..f2a67df842c 100644 --- a/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/HRegion.java +++ b/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/HRegion.java @@ -178,6 +178,7 @@ import org.apache.hadoop.hbase.util.Bytes; import org.apache.hadoop.hbase.util.CancelableProgressable; import org.apache.hadoop.hbase.util.ClassSize; import org.apache.hadoop.hbase.util.CommonFSUtils; +import org.apache.hadoop.hbase.util.ConfigurationUtil; import org.apache.hadoop.hbase.util.CoprocessorConfigurationUtil; import org.apache.hadoop.hbase.util.EnvironmentEdgeManager; import org.apache.hadoop.hbase.util.FSUtils; @@ -8998,6 +8999,15 @@ public class HRegion implements HeapSize, PropagatingConfigurationObserver, Regi CoprocessorConfigurationUtil.updateCoprocessorListInConf(this.conf, conf, CoprocessorHost.REGION_COPROCESSOR_CONF_KEY); }); + + boolean newReadOnlyEnabled = ConfigurationUtil.isReadOnlyModeEnabledInConf(newConf); + + if (originalIsReadOnlyEnabled && !newReadOnlyEnabled) { + LOG.info("Cluster Read Only mode disabled"); + for (HStore store : stores.values()) { + store.getStoreEngine().getStoreFileTracker().onTransitionToActive(); + } + } } /** diff --git a/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/StoreEngine.java b/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/StoreEngine.java index e262abd9ea3..96a7ad856cd 100644 --- a/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/StoreEngine.java +++ b/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/StoreEngine.java @@ -579,4 +579,8 @@ public abstract class StoreEngine<SF extends StoreFlusher, CP extends Compaction public BloomFilterMetrics getBloomFilterMetrics() { return bloomFilterMetrics; } + + public StoreFileTracker getStoreFileTracker() { + return storeFileTracker; + } } diff --git a/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/storefiletracker/FileBasedStoreFileTracker.java b/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/storefiletracker/FileBasedStoreFileTracker.java index fae97b9dd93..140e9e35546 100644 --- a/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/storefiletracker/FileBasedStoreFileTracker.java +++ b/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/storefiletracker/FileBasedStoreFileTracker.java @@ -256,4 +256,12 @@ class FileBasedStoreFileTracker extends StoreFileTrackerBase { add(Collections.singleton(storeFileInfo)); return reference; } + + public void onTransitionToActive() { + if (backedFile != null) { + synchronized (storefiles) { + backedFile.resetWriteState(); + } + } + } } diff --git a/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/storefiletracker/StoreFileListFile.java b/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/storefiletracker/StoreFileListFile.java index fffd4ab499e..1137f1cf856 100644 --- a/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/storefiletracker/StoreFileListFile.java +++ b/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/storefiletracker/StoreFileListFile.java @@ -298,4 +298,9 @@ class StoreFileListFile { trackFiles[nextTrackFile], e); } } + + synchronized void resetWriteState() { + nextTrackFile = -1; + prevTimestamp = -1; + } } diff --git a/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/storefiletracker/StoreFileTracker.java b/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/storefiletracker/StoreFileTracker.java index c56a40997c1..29668142de0 100644 --- a/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/storefiletracker/StoreFileTracker.java +++ b/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/storefiletracker/StoreFileTracker.java @@ -176,4 +176,8 @@ public interface StoreFileTracker { * @return the store context. */ StoreContext getStoreContext(); + + default void onTransitionToActive() { + // no op by default + } } diff --git a/hbase-server/src/test/java/org/apache/hadoop/hbase/regionserver/storefiletracker/TestStoreFileListFile.java b/hbase-server/src/test/java/org/apache/hadoop/hbase/regionserver/storefiletracker/TestStoreFileListFile.java index 54db419ef89..6dd14e1792b 100644 --- a/hbase-server/src/test/java/org/apache/hadoop/hbase/regionserver/storefiletracker/TestStoreFileListFile.java +++ b/hbase-server/src/test/java/org/apache/hadoop/hbase/regionserver/storefiletracker/TestStoreFileListFile.java @@ -299,4 +299,25 @@ public class TestStoreFileListFile { logger.setLevel(oldLevel); } } + + @Test + public void testStoreFilesResetTracker() throws IOException { + storeFileListFile.update(StoreFileList.newBuilder() + .addStoreFile(StoreFileEntry.newBuilder().setName("h1").setSize(10).build())); + + StoreFileListFile writer2 = create(); + writer2.update(StoreFileList.newBuilder() + .addStoreFile(StoreFileEntry.newBuilder().setName("h1").setSize(10).build()) + .addStoreFile(StoreFileEntry.newBuilder().setName("h2").setSize(10).build())); + + storeFileListFile.resetWriteState(); + + storeFileListFile.update(StoreFileList.newBuilder() + .addStoreFile(StoreFileEntry.newBuilder().setName("h1").setSize(10).build()) + .addStoreFile(StoreFileEntry.newBuilder().setName("h2").setSize(10).build()) + .addStoreFile(StoreFileEntry.newBuilder().setName("h3").setSize(10).build())); + + StoreFileListFile reader = create(); + assertEquals(3, reader.load(true).getStoreFileCount()); + } }
