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 0e6e365..33ac826 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 @@ -149,7 +149,11 @@ public class WALFactory { // Fall back to them specifying a class name // Note that the passed default class shouldn't actually be used, since the above only fails // when there is a config value present. - return conf.getClass(key, Providers.defaultProvider.clazz, WALProvider.class); + // If meta WAL provider is not specified, use provider class of ordinary WAL + return conf.getClass(key, key.equals(META_WAL_PROVIDER) && conf.get(META_WAL_PROVIDER)==null ? + conf.getClass(WAL_PROVIDER, Providers.defaultProvider.clazz, WALProvider.class) : + Providers.defaultProvider.clazz, + WALProvider.class); } } 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 453b742..d062c77 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 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; 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 a20a071..8fbe09d 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 @@ -742,4 +742,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 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 walProvider = walFactory.getProviderClass( + WALFactory.WAL_PROVIDER, Providers.filesystem.name()); + assertEquals(Providers.filesystem.clazz, walProvider); + WALProvider metaWALProvider = walFactory.getMetaProvider(); + assertEquals(IOTestProvider.class, metaWALProvider.getClass()); + } }