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