From 81a9d9d126a35b8d77423bc858c794aaf7081629 Mon Sep 17 00:00:00 2001 From: Wellington Chevreuil Date: Fri, 8 Feb 2019 12:20:47 +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: Ic68e789119976957723b9c212572584d0aa4fa2f --- .../org/apache/hadoop/hbase/wal/WALFactory.java | 17 ++++++++--------- .../apache/hadoop/hbase/wal/TestWALFactory.java | 14 +++++++++++++- 2 files changed, 21 insertions(+), 10 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 8bde6d2001..3250178488 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. @@ -262,15 +267,9 @@ public class WALFactory { } Class clz = null; if (conf.get(META_WAL_PROVIDER) == null) { - try { - clz = conf.getClass(WAL_PROVIDER, Providers.defaultProvider.clazz, WALProvider.class); - } catch (Throwable t) { - // the WAL provider should be an enum. Proceed - } - } - if (clz == null){ - clz = getProviderClass(META_WAL_PROVIDER, conf.get(WAL_PROVIDER, DEFAULT_WAL_PROVIDER)); + conf.set(META_WAL_PROVIDER, conf.get(WAL_PROVIDER, DEFAULT_WAL_PROVIDER)); } + clz = getProviderClass(META_WAL_PROVIDER, conf.get(WAL_PROVIDER, DEFAULT_WAL_PROVIDER)); provider = createProvider(clz); provider.init(this, conf, AbstractFSWALProvider.META_WAL_PROVIDER_ID); provider.addWALActionsListener(new MetricsWAL()); 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 8fbe09dd30..51169e11f3 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 @@ -704,7 +704,7 @@ public class TestWALFactory { assertEquals(SyncReplicationWALProvider.class, walFactory.getWALProvider().getClass()); // class of WALProvider and metaWALProvider are the same when metaWALProvider is not set assertEquals(WALFactory.Providers.multiwal.clazz, wrappedWALProvider.getClass()); - assertEquals(WALFactory.Providers.multiwal.clazz, walFactory.getMetaProvider().getClass()); + assertEquals(Providers.defaultProvider.clazz, walFactory.getMetaProvider().getClass()); } @Test @@ -766,4 +766,16 @@ public class TestWALFactory { WALProvider metaWALProvider = walFactory.getMetaProvider(); assertEquals(IOTestProvider.class, metaWALProvider.getClass()); } + + @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)