From 16272e382f10106e16b2b0f8bf3f0f76fea0a7be Mon Sep 17 00:00:00 2001 From: Wellington Chevreuil Date: Sun, 10 Feb 2019 09:48:11 +0000 Subject: [PATCH] HBASE-21860 - WALFactory should switch to default provider if multiwal provider is defined for meta wal (Per suggestions on HBASE-21843) Change-Id: I7f5abb92b9f79bf7f37443ea6cb343ecf6ef97a5 --- .../org/apache/hadoop/hbase/wal/WALFactory.java | 7 ++++++- .../apache/hadoop/hbase/wal/TestWALFactory.java | 14 +++++++++++++- 2 files changed, 19 insertions(+), 2 deletions(-) diff --git a/hbase-server/src/main/java/org/apache/hadoop/hbase/wal/WALFactory.java b/hbase-server/src/main/java/org/apache/hadoop/hbase/wal/WALFactory.java index 4f3f056cb3..104f8669a5 100644 --- a/hbase-server/src/main/java/org/apache/hadoop/hbase/wal/WALFactory.java +++ b/hbase-server/src/main/java/org/apache/hadoop/hbase/wal/WALFactory.java @@ -128,7 +128,12 @@ public class WALFactory { public Class getProviderClass(String key, String defaultValue) { try { Providers provider = Providers.valueOf(conf.get(key, defaultValue)); - + //MultiWAL shouldn't be used for meta wals. See discusssions on HBASE-21843. + if (key.equals(META_WAL_PROVIDER) && provider.clazz == RegionGroupingProvider.class){ + provider = getDefaultProvider(); + LOG.warn("Meta WAL shouldn't use MultiWAL Provider. Replaced Meta WAL provider to: {}", + provider.clazz.getName()); + } // AsyncFSWALProvider is not guaranteed to work on all Hadoop versions, when it's chosen as // the default and we can't use it, we want to fall back to FSHLog which we know works on // all versions. diff --git a/hbase-server/src/test/java/org/apache/hadoop/hbase/wal/TestWALFactory.java b/hbase-server/src/test/java/org/apache/hadoop/hbase/wal/TestWALFactory.java index f96a1d64cc..5dab48959c 100644 --- a/hbase-server/src/test/java/org/apache/hadoop/hbase/wal/TestWALFactory.java +++ b/hbase-server/src/test/java/org/apache/hadoop/hbase/wal/TestWALFactory.java @@ -689,7 +689,7 @@ public class TestWALFactory { WALFactory walFactory = new WALFactory(conf, this.currentServername.toString()); assertEquals(WALFactory.Providers.multiwal.clazz, walFactory.getWALProvider().getClass()); - assertEquals(WALFactory.Providers.multiwal.clazz, walFactory.getMetaProvider().getClass()); + assertEquals(Providers.defaultProvider.clazz, walFactory.getMetaProvider().getClass()); } @Test @@ -725,4 +725,16 @@ public class TestWALFactory { WALFactory.WAL_PROVIDER, Providers.multiwal.name()); assertEquals(Providers.multiwal.clazz, multiwalProviderClass); } + + @Test + public void testSetMetaToMultiWALProviderGetsReplacedToDefault() throws IOException { + final Configuration config = new Configuration(); + config.set(WALFactory.META_WAL_PROVIDER, Providers.multiwal.name()); + final WALFactory walFactory = new WALFactory(config, this.currentServername.toString()); + Class walProvider = walFactory.getProviderClass( + WALFactory.WAL_PROVIDER, Providers.filesystem.name()); + assertEquals(Providers.filesystem.clazz, walProvider); + WALProvider metaWALProvider = walFactory.getMetaProvider(); + assertEquals(Providers.defaultProvider.clazz, metaWALProvider.getClass()); + } } -- 2.17.2 (Apple Git-113)