From 628b8b7f650dc2053c2ddf8559d945817c25b894 Mon Sep 17 00:00:00 2001 From: GeorryHuang Date: Fri, 12 Nov 2021 11:10:38 +0800 Subject: [PATCH] =?UTF-8?q?HBASE-26450=20Server=20configuration=20will=20o?= =?UTF-8?q?verwrite=20HStore=20configuration=20=E2=80=A6=20(#3843)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * HBASE-26450 Server configuration will overwrite HStore configuration After using shell command 'updateConfiguration' --- .../hadoop/hbase/regionserver/HStore.java | 9 ++++---- .../hadoop/hbase/regionserver/TestHStore.java | 23 +++++++++++++++++++ 2 files changed, 27 insertions(+), 5 deletions(-) diff --git a/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/HStore.java b/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/HStore.java index 47cb795ec2ae..32693ab68511 100644 --- a/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/HStore.java +++ b/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/HStore.java @@ -59,7 +59,6 @@ import org.apache.hadoop.hbase.Cell; import org.apache.hadoop.hbase.CellComparator; import org.apache.hadoop.hbase.CellUtil; -import org.apache.hadoop.hbase.CompoundConfiguration; import org.apache.hadoop.hbase.HConstants; import org.apache.hadoop.hbase.MemoryCompactionPolicy; import org.apache.hadoop.hbase.TableName; @@ -67,7 +66,6 @@ import org.apache.hadoop.hbase.client.ColumnFamilyDescriptor; import org.apache.hadoop.hbase.client.RegionInfo; import org.apache.hadoop.hbase.client.Scan; -import org.apache.hadoop.hbase.client.TableDescriptor; import org.apache.hadoop.hbase.conf.ConfigurationManager; import org.apache.hadoop.hbase.conf.PropagatingConfigurationObserver; import org.apache.hadoop.hbase.coprocessor.ReadOnlyConfiguration; @@ -2522,10 +2520,11 @@ protected OffPeakHours getOffPeakHours() { @Override public void onConfigurationChange(Configuration conf) { - this.conf = StoreUtils.createStoreConfiguration(conf, region.getTableDescriptor(), + Configuration storeConf = StoreUtils.createStoreConfiguration(conf, region.getTableDescriptor(), getColumnFamilyDescriptor()); - this.storeEngine.compactionPolicy.setConf(conf); - this.offPeakHours = OffPeakHours.getInstance(conf); + this.conf = storeConf; + this.storeEngine.compactionPolicy.setConf(storeConf); + this.offPeakHours = OffPeakHours.getInstance(storeConf); } /** diff --git a/hbase-server/src/test/java/org/apache/hadoop/hbase/regionserver/TestHStore.java b/hbase-server/src/test/java/org/apache/hadoop/hbase/regionserver/TestHStore.java index 661874214a85..749106816413 100644 --- a/hbase-server/src/test/java/org/apache/hadoop/hbase/regionserver/TestHStore.java +++ b/hbase-server/src/test/java/org/apache/hadoop/hbase/regionserver/TestHStore.java @@ -2141,6 +2141,29 @@ public void testFlattenSnapshotWriteCompactingMemeStoreConcurrently() throws Exc } } + @Test + public void testOnConfigurationChange() throws IOException { + final int COMMON_MAX_FILES_TO_COMPACT = 10; + final int NEW_COMMON_MAX_FILES_TO_COMPACT = 8; + final int STORE_MAX_FILES_TO_COMPACT = 6; + + //Build a table that its maxFileToCompact different from common configuration. + Configuration conf = HBaseConfiguration.create(); + conf.setInt(CompactionConfiguration.HBASE_HSTORE_COMPACTION_MAX_KEY, + COMMON_MAX_FILES_TO_COMPACT); + ColumnFamilyDescriptor hcd = ColumnFamilyDescriptorBuilder.newBuilder(family) + .setConfiguration(CompactionConfiguration.HBASE_HSTORE_COMPACTION_MAX_KEY, + String.valueOf(STORE_MAX_FILES_TO_COMPACT)).build(); + init(this.name.getMethodName(), conf, hcd); + + //After updating common configuration, the conf in HStore itself must not be changed. + conf.setInt(CompactionConfiguration.HBASE_HSTORE_COMPACTION_MAX_KEY, + NEW_COMMON_MAX_FILES_TO_COMPACT); + this.store.onConfigurationChange(conf); + assertEquals(STORE_MAX_FILES_TO_COMPACT, + store.getStoreEngine().getCompactionPolicy().getConf().getMaxFilesToCompact()); + } + private HStoreFile mockStoreFileWithLength(long length) { HStoreFile sf = mock(HStoreFile.class); StoreFileReader sfr = mock(StoreFileReader.class);