You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@hbase.apache.org by te...@apache.org on 2016/04/28 18:19:30 UTC

hbase git commit: HBASE-15686 Add override mechanism for the exempt classes when dynamically loading table coprocessor

Repository: hbase
Updated Branches:
  refs/heads/master 889d89a74 -> 8a28c2343


HBASE-15686 Add override mechanism for the exempt classes when dynamically loading table coprocessor


Project: http://git-wip-us.apache.org/repos/asf/hbase/repo
Commit: http://git-wip-us.apache.org/repos/asf/hbase/commit/8a28c234
Tree: http://git-wip-us.apache.org/repos/asf/hbase/tree/8a28c234
Diff: http://git-wip-us.apache.org/repos/asf/hbase/diff/8a28c234

Branch: refs/heads/master
Commit: 8a28c234318f86afb017f163375c9b05340f1aea
Parents: 889d89a
Author: tedyu <yu...@gmail.com>
Authored: Thu Apr 28 09:19:12 2016 -0700
Committer: tedyu <yu...@gmail.com>
Committed: Thu Apr 28 09:19:12 2016 -0700

----------------------------------------------------------------------
 .../org/apache/hadoop/hbase/HConstants.java     |  2 ++
 .../hbase/util/CoprocessorClassLoader.java      | 16 ++++++++++++--
 .../hbase/coprocessor/CoprocessorHost.java      | 22 +++++++++++++++++++-
 3 files changed, 37 insertions(+), 3 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/hbase/blob/8a28c234/hbase-common/src/main/java/org/apache/hadoop/hbase/HConstants.java
----------------------------------------------------------------------
diff --git a/hbase-common/src/main/java/org/apache/hadoop/hbase/HConstants.java b/hbase-common/src/main/java/org/apache/hadoop/hbase/HConstants.java
index 88cfa9a..45d7c34 100644
--- a/hbase-common/src/main/java/org/apache/hadoop/hbase/HConstants.java
+++ b/hbase-common/src/main/java/org/apache/hadoop/hbase/HConstants.java
@@ -908,6 +908,8 @@ public final class HConstants {
   public static final Pattern CP_HTD_ATTR_VALUE_PARAM_PATTERN = Pattern.compile(
       "(" + CP_HTD_ATTR_VALUE_PARAM_KEY_PATTERN + ")=(" +
       CP_HTD_ATTR_VALUE_PARAM_VALUE_PATTERN + "),?");
+  public static final String CP_HTD_ATTR_INCLUSION_KEY =
+      "hbase.coprocessor.classloader.included.classes";
 
   /** The delay when re-trying a socket operation in a loop (HBASE-4712) */
   public static final int SOCKET_RETRY_WAIT_MS = 200;

http://git-wip-us.apache.org/repos/asf/hbase/blob/8a28c234/hbase-common/src/main/java/org/apache/hadoop/hbase/util/CoprocessorClassLoader.java
----------------------------------------------------------------------
diff --git a/hbase-common/src/main/java/org/apache/hadoop/hbase/util/CoprocessorClassLoader.java b/hbase-common/src/main/java/org/apache/hadoop/hbase/util/CoprocessorClassLoader.java
index e586930..78ecc7e 100644
--- a/hbase-common/src/main/java/org/apache/hadoop/hbase/util/CoprocessorClassLoader.java
+++ b/hbase-common/src/main/java/org/apache/hadoop/hbase/util/CoprocessorClassLoader.java
@@ -264,8 +264,13 @@ public class CoprocessorClassLoader extends ClassLoaderBase {
   @Override
   public Class<?> loadClass(String name)
       throws ClassNotFoundException {
+    return loadClass(name, null);
+  }
+
+  public Class<?> loadClass(String name, String[] includedClassPrefixes)
+      throws ClassNotFoundException {
     // Delegate to the parent immediately if this class is exempt
-    if (isClassExempt(name)) {
+    if (isClassExempt(name, includedClassPrefixes)) {
       if (LOG.isDebugEnabled()) {
         LOG.debug("Skipping exempt class " + name +
             " - delegating directly to parent");
@@ -344,7 +349,14 @@ public class CoprocessorClassLoader extends ClassLoaderBase {
    * @return true if the class should *not* be loaded by this ClassLoader;
    * false otherwise.
    */
-  protected boolean isClassExempt(String name) {
+  protected boolean isClassExempt(String name, String[] includedClassPrefixes) {
+    if (includedClassPrefixes != null) {
+      for (String clsName : includedClassPrefixes) {
+        if (name.startsWith(clsName)) {
+          return false;
+        }
+      }
+    }
     for (String exemptPrefix : CLASS_PREFIX_EXEMPTIONS) {
       if (name.startsWith(exemptPrefix)) {
         return true;

http://git-wip-us.apache.org/repos/asf/hbase/blob/8a28c234/hbase-server/src/main/java/org/apache/hadoop/hbase/coprocessor/CoprocessorHost.java
----------------------------------------------------------------------
diff --git a/hbase-server/src/main/java/org/apache/hadoop/hbase/coprocessor/CoprocessorHost.java b/hbase-server/src/main/java/org/apache/hadoop/hbase/coprocessor/CoprocessorHost.java
index dbeb122..da0e8b1 100644
--- a/hbase-server/src/main/java/org/apache/hadoop/hbase/coprocessor/CoprocessorHost.java
+++ b/hbase-server/src/main/java/org/apache/hadoop/hbase/coprocessor/CoprocessorHost.java
@@ -43,6 +43,7 @@ import org.apache.hadoop.hbase.Coprocessor;
 import org.apache.hadoop.hbase.CoprocessorEnvironment;
 import org.apache.hadoop.hbase.DoNotRetryIOException;
 import org.apache.hadoop.hbase.HBaseInterfaceAudience;
+import org.apache.hadoop.hbase.HConstants;
 import org.apache.hadoop.hbase.TableName;
 import org.apache.hadoop.hbase.client.HTable;
 import org.apache.hadoop.hbase.client.HTableWrapper;
@@ -177,6 +178,25 @@ public abstract class CoprocessorHost<E extends CoprocessorEnvironment> {
    */
   public E load(Path path, String className, int priority,
       Configuration conf) throws IOException {
+    String[] includedClassPrefixes = null;
+    if (conf.get(HConstants.CP_HTD_ATTR_INCLUSION_KEY) != null){
+      String prefixes = conf.get(HConstants.CP_HTD_ATTR_INCLUSION_KEY);
+      includedClassPrefixes = prefixes.split(";");
+    }
+    return load(path, className, priority, conf, includedClassPrefixes);
+  }
+
+  /**
+   * Load a coprocessor implementation into the host
+   * @param path path to implementation jar
+   * @param className the main class name
+   * @param priority chaining priority
+   * @param conf configuration for coprocessor
+   * @param includedClassPrefixes class name prefixes to include
+   * @throws java.io.IOException Exception
+   */
+  public E load(Path path, String className, int priority,
+      Configuration conf, String[] includedClassPrefixes) throws IOException {
     Class<?> implClass = null;
     LOG.debug("Loading coprocessor class " + className + " with path " +
         path + " and priority " + priority);
@@ -192,7 +212,7 @@ public abstract class CoprocessorHost<E extends CoprocessorEnvironment> {
       cl = CoprocessorClassLoader.getClassLoader(
         path, getClass().getClassLoader(), pathPrefix, conf);
       try {
-        implClass = cl.loadClass(className);
+        implClass = ((CoprocessorClassLoader)cl).loadClass(className, includedClassPrefixes);
       } catch (ClassNotFoundException e) {
         throw new IOException("Cannot load external coprocessor class " + className, e);
       }