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());
+  }
 }

Reply via email to