diff --git a/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/HRegionServer.java b/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/HRegionServer.java index f54e2209eb5..e801d84edf5 100644 --- a/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/HRegionServer.java +++ b/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/HRegionServer.java @@ -2893,7 +2893,7 @@ public class HRegionServer extends HasThread implements /** * @return Return the walFs. */ - protected FileSystem getWALFileSystem() { + public FileSystem getWALFileSystem() { return walFs; } diff --git a/hbase-server/src/main/java/org/apache/hadoop/hbase/wal/RegionGroupingProvider.java b/hbase-server/src/main/java/org/apache/hadoop/hbase/wal/RegionGroupingProvider.java index 28817e9cc37..b3ee56c91f6 100644 --- a/hbase-server/src/main/java/org/apache/hadoop/hbase/wal/RegionGroupingProvider.java +++ b/hbase-server/src/main/java/org/apache/hadoop/hbase/wal/RegionGroupingProvider.java @@ -142,15 +142,21 @@ public class RegionGroupingProvider implements WALProvider { throw new IllegalStateException("WALProvider.init should only be called once."); } this.factory = factory; - StringBuilder sb = new StringBuilder().append(factory.factoryId); - if (providerId != null) { - if (providerId.startsWith(WAL_FILE_NAME_DELIMITER)) { - sb.append(providerId); - } else { - sb.append(WAL_FILE_NAME_DELIMITER).append(providerId); + + if (META_WAL_PROVIDER_ID.equals(providerId)) { + // do not change the provider id if it is for meta + this.providerId = providerId; + } else { + StringBuilder sb = new StringBuilder().append(factory.factoryId); + if (providerId != null) { + if (providerId.startsWith(WAL_FILE_NAME_DELIMITER)) { + sb.append(providerId); + } else { + sb.append(WAL_FILE_NAME_DELIMITER).append(providerId); + } } + this.providerId = sb.toString(); } - this.providerId = sb.toString(); this.strategy = getStrategy(conf, REGION_GROUPING_STRATEGY, DEFAULT_REGION_GROUPING_STRATEGY); this.providerClass = factory.getProviderClass(DELEGATE_PROVIDER, DEFAULT_DELEGATE_PROVIDER); } diff --git a/hbase-server/src/test/java/org/apache/hadoop/hbase/wal/TestWrongMetaWALFileName.java b/hbase-server/src/test/java/org/apache/hadoop/hbase/wal/TestWrongMetaWALFileName.java new file mode 100644 index 00000000000..f16d2215a07 --- /dev/null +++ b/hbase-server/src/test/java/org/apache/hadoop/hbase/wal/TestWrongMetaWALFileName.java @@ -0,0 +1,73 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.hadoop.hbase.wal; + +import static org.junit.Assert.assertTrue; + +import org.apache.hadoop.fs.Path; +import org.apache.hadoop.hbase.HBaseClassTestRule; +import org.apache.hadoop.hbase.HBaseTestingUtility; +import org.apache.hadoop.hbase.TableName; +import org.apache.hadoop.hbase.regionserver.HRegionServer; +import org.apache.hadoop.hbase.testclassification.MediumTests; +import org.apache.hadoop.hbase.testclassification.RegionServerTests; +import org.apache.hadoop.hbase.util.Bytes; +import org.junit.AfterClass; +import org.junit.BeforeClass; +import org.junit.ClassRule; +import org.junit.Test; +import org.junit.experimental.categories.Category; + +/** + * Testcase for HBASE-21843. Used to confirm that we use the correct name for meta wal file when + * using {@link RegionGroupingProvider}. + */ +@Category({ RegionServerTests.class, MediumTests.class }) +public class TestWrongMetaWALFileName { + + @ClassRule + public static final HBaseClassTestRule CLASS_RULE = + HBaseClassTestRule.forClass(TestWrongMetaWALFileName.class); + + private static final HBaseTestingUtility UTIL = new HBaseTestingUtility(); + + @BeforeClass + public static void setUp() throws Exception { + UTIL.getConfiguration().set(WALFactory.WAL_PROVIDER, WALFactory.Providers.multiwal.name()); + UTIL.startMiniCluster(1); + } + + @AfterClass + public static void tearDown() throws Exception { + UTIL.shutdownMiniCluster(); + } + + @Test + public void test() throws Exception { + // create a table so that we will write some edits to meta + TableName tableName = TableName.valueOf("whatever"); + UTIL.createTable(tableName, Bytes.toBytes("family")); + UTIL.waitTableAvailable(tableName); + HRegionServer rs = UTIL.getMiniHBaseCluster().getRegionServer(0); + Path walDir = new Path(rs.getWALRootDir(), + AbstractFSWALProvider.getWALDirectoryName(rs.getServerName().toString())); + // we should have meta wal files. + assertTrue( + rs.getWALFileSystem().listStatus(walDir, AbstractFSWALProvider::isMetaFile).length > 0); + } +}