Repository: hbase Updated Branches: refs/heads/branch-2 5d44757b9 -> 399fbb2aa
HBASE-21247 Custom Meta WAL Provider doesn't default to custom WAL Provider whose configuration value is outside the enums in Providers Project: http://git-wip-us.apache.org/repos/asf/hbase/repo Commit: http://git-wip-us.apache.org/repos/asf/hbase/commit/399fbb2a Tree: http://git-wip-us.apache.org/repos/asf/hbase/tree/399fbb2a Diff: http://git-wip-us.apache.org/repos/asf/hbase/diff/399fbb2a Branch: refs/heads/branch-2 Commit: 399fbb2aa60819d8a892b7a85121a7dd4f9fec44 Parents: 5d44757 Author: tedyu <yuzhih...@gmail.com> Authored: Tue Nov 6 12:35:31 2018 -0800 Committer: tedyu <yuzhih...@gmail.com> Committed: Tue Nov 6 12:35:31 2018 -0800 ---------------------------------------------------------------------- .../org/apache/hadoop/hbase/wal/WALFactory.java | 14 ++++++++++-- .../apache/hadoop/hbase/wal/IOTestProvider.java | 5 +++- .../apache/hadoop/hbase/wal/TestWALFactory.java | 24 ++++++++++++++++++++ 3 files changed, 40 insertions(+), 3 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/hbase/blob/399fbb2a/hbase-server/src/main/java/org/apache/hadoop/hbase/wal/WALFactory.java ---------------------------------------------------------------------- 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 4f3f056..89cf984 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 @@ -253,8 +253,18 @@ public class WALFactory { if (provider != null) { return provider; } - provider = getProvider(META_WAL_PROVIDER, conf.get(WAL_PROVIDER, DEFAULT_WAL_PROVIDER), - AbstractFSWALProvider.META_WAL_PROVIDER_ID); + Class<? extends WALProvider> 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)); + } + provider = createProvider(clz, AbstractFSWALProvider.META_WAL_PROVIDER_ID); if (metaProvider.compareAndSet(null, provider)) { return provider; } else { http://git-wip-us.apache.org/repos/asf/hbase/blob/399fbb2a/hbase-server/src/test/java/org/apache/hadoop/hbase/wal/IOTestProvider.java ---------------------------------------------------------------------- diff --git a/hbase-server/src/test/java/org/apache/hadoop/hbase/wal/IOTestProvider.java b/hbase-server/src/test/java/org/apache/hadoop/hbase/wal/IOTestProvider.java index 506674f..384a293 100644 --- a/hbase-server/src/test/java/org/apache/hadoop/hbase/wal/IOTestProvider.java +++ b/hbase-server/src/test/java/org/apache/hadoop/hbase/wal/IOTestProvider.java @@ -27,6 +27,8 @@ import java.util.ArrayList; import java.util.Collection; import java.util.Collections; import java.util.List; +import java.util.concurrent.atomic.AtomicBoolean; + import org.apache.hadoop.conf.Configuration; import org.apache.hadoop.fs.FileSystem; import org.apache.hadoop.fs.Path; @@ -87,6 +89,7 @@ public class IOTestProvider implements WALProvider { private volatile FSHLog log; private String providerId; + protected AtomicBoolean initialized = new AtomicBoolean(false); private List<WALActionsListener> listeners = new ArrayList<>(); /** @@ -97,7 +100,7 @@ public class IOTestProvider implements WALProvider { */ @Override public void init(WALFactory factory, Configuration conf, String providerId) throws IOException { - if (factory != null) { + if (!initialized.compareAndSet(false, true)) { throw new IllegalStateException("WALProvider.init should only be called once."); } this.factory = factory; http://git-wip-us.apache.org/repos/asf/hbase/blob/399fbb2a/hbase-server/src/test/java/org/apache/hadoop/hbase/wal/TestWALFactory.java ---------------------------------------------------------------------- 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 fe2626d..7add2d0 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 @@ -727,4 +727,28 @@ public class TestWALFactory { WALFactory.WAL_PROVIDER, Providers.multiwal.name()); assertEquals(Providers.multiwal.clazz, multiwalProviderClass); } + + @Test + public void testCustomProvider() throws IOException { + final Configuration config = new Configuration(); + config.set(WALFactory.WAL_PROVIDER, IOTestProvider.class.getName()); + final WALFactory walFactory = new WALFactory(config, this.currentServername.toString()); + Class<? extends WALProvider> walProvider = walFactory.getProviderClass( + WALFactory.WAL_PROVIDER, Providers.filesystem.name()); + assertEquals(IOTestProvider.class, walProvider); + WALProvider metaWALProvider = walFactory.getMetaProvider(); + assertEquals(IOTestProvider.class, metaWALProvider.getClass()); + } + + @Test + public void testCustomMetaProvider() throws IOException { + final Configuration config = new Configuration(); + config.set(WALFactory.META_WAL_PROVIDER, IOTestProvider.class.getName()); + final WALFactory walFactory = new WALFactory(config, this.currentServername.toString()); + Class<? extends WALProvider> walProvider = walFactory.getProviderClass( + WALFactory.WAL_PROVIDER, Providers.filesystem.name()); + assertEquals(Providers.filesystem.clazz, walProvider); + WALProvider metaWALProvider = walFactory.getMetaProvider(); + assertEquals(IOTestProvider.class, metaWALProvider.getClass()); + } }