org.apache.hadoop.hbase.util
Class CoprocessorClassLoader

java.lang.Object
  extended by java.lang.ClassLoader
      extended by java.security.SecureClassLoader
          extended by java.net.URLClassLoader
              extended by org.apache.hadoop.hbase.util.ClassLoaderBase
                  extended by org.apache.hadoop.hbase.util.CoprocessorClassLoader

@InterfaceAudience.Private
public class CoprocessorClassLoader
extends ClassLoaderBase

ClassLoader used to load classes for Coprocessor instances.

This ClassLoader always tries to load classes from the specified coprocessor jar first actually using URLClassLoader logic before delegating to the parent ClassLoader, thus avoiding dependency conflicts between HBase's classpath and classes in the coprocessor jar.

Certain classes are exempt from being loaded by this ClassLoader because it would prevent them from being cast to the equivalent classes in the region server. For example, the Coprocessor interface needs to be loaded by the region server's ClassLoader to prevent a ClassCastException when casting the coprocessor implementation.

A HDFS path can be used to specify the coprocessor jar. In this case, the jar will be copied to local at first under some folder under ${hbase.local.dir}/jars/tmp/. The local copy will be removed automatically when the HBase server instance is stopped.

This ClassLoader also handles resource loading. In most cases this ClassLoader will attempt to load resources from the coprocessor jar first before delegating to the parent. However, like in class loading, some resources need to be handled differently. For all of the Hadoop default configurations (e.g. hbase-default.xml) we will check the parent ClassLoader first to prevent issues such as failing the HBase default configuration version check.


Field Summary
 
Fields inherited from class org.apache.hadoop.hbase.util.ClassLoaderBase
DEFAULT_LOCAL_DIR, LOCAL_DIR_KEY, parent
 
Method Summary
static void clearCache()
           
static Collection<? extends ClassLoader> getAllCached()
           
static CoprocessorClassLoader getClassLoader(org.apache.hadoop.fs.Path path, ClassLoader parent, String pathPrefix, org.apache.hadoop.conf.Configuration conf)
          Get a CoprocessorClassLoader for a coprocessor jar path from cache.
static CoprocessorClassLoader getIfCached(org.apache.hadoop.fs.Path path)
           
 URL getResource(String name)
           
protected  boolean isClassExempt(String name)
          Determines whether the given class should be exempt from being loaded by this ClassLoader.
 Class<?> loadClass(String name)
           
protected  boolean loadResourceUsingParentFirst(String name)
          Determines whether we should attempt to load the given resource using the parent first before attempting to load the resource using this ClassLoader.
 
Methods inherited from class org.apache.hadoop.hbase.util.ClassLoaderBase
getClassLoadingLock
 
Methods inherited from class java.net.URLClassLoader
addURL, definePackage, findClass, findResource, findResources, getPermissions, getURLs, newInstance, newInstance
 
Methods inherited from class java.security.SecureClassLoader
defineClass, defineClass
 
Methods inherited from class java.lang.ClassLoader
clearAssertionStatus, defineClass, defineClass, defineClass, defineClass, definePackage, findLibrary, findLoadedClass, findSystemClass, getPackage, getPackages, getParent, getResourceAsStream, getResources, getSystemClassLoader, getSystemResource, getSystemResourceAsStream, getSystemResources, loadClass, resolveClass, setClassAssertionStatus, setDefaultAssertionStatus, setPackageAssertionStatus, setSigners
 
Methods inherited from class java.lang.Object
clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
 

Method Detail

getIfCached

public static CoprocessorClassLoader getIfCached(org.apache.hadoop.fs.Path path)

getAllCached

public static Collection<? extends ClassLoader> getAllCached()

clearCache

public static void clearCache()

getClassLoader

public static CoprocessorClassLoader getClassLoader(org.apache.hadoop.fs.Path path,
                                                    ClassLoader parent,
                                                    String pathPrefix,
                                                    org.apache.hadoop.conf.Configuration conf)
                                             throws IOException
Get a CoprocessorClassLoader for a coprocessor jar path from cache. If not in cache, create one.

Parameters:
path - the path to the coprocessor jar file to load classes from
parent - the parent class loader for exempted classes
pathPrefix - a prefix used in temp path name to store the jar file locally
conf - the configuration used to create the class loader, if needed
Returns:
a CoprocessorClassLoader for the coprocessor jar path
Throws:
IOException

loadClass

public Class<?> loadClass(String name)
                   throws ClassNotFoundException
Overrides:
loadClass in class ClassLoader
Throws:
ClassNotFoundException

getResource

public URL getResource(String name)
Overrides:
getResource in class ClassLoader

isClassExempt

protected boolean isClassExempt(String name)
Determines whether the given class should be exempt from being loaded by this ClassLoader.

Parameters:
name - the name of the class to test.
Returns:
true if the class should *not* be loaded by this ClassLoader; false otherwise.

loadResourceUsingParentFirst

protected boolean loadResourceUsingParentFirst(String name)
Determines whether we should attempt to load the given resource using the parent first before attempting to load the resource using this ClassLoader.

Parameters:
name - the name of the resource to test.
Returns:
true if we should attempt to load the resource using the parent first; false if we should attempt to load the resource using this ClassLoader first.


Copyright © 2015 The Apache Software Foundation. All Rights Reserved.