James Baldassari created HBASE-6308:
---------------------------------------

             Summary: Coprocessors should be loaded in a custom ClassLoader to 
prevent dependency conflicts with HBase
                 Key: HBASE-6308
                 URL: https://issues.apache.org/jira/browse/HBASE-6308
             Project: HBase
          Issue Type: Improvement
          Components: coprocessors
    Affects Versions: 0.94.0, 0.92.1
            Reporter: James Baldassari


Currently each coprocessor is loaded with a URLClassLoader that puts the 
coprocessor's jar at the beginning of the classpath.  The URLClassLoader always 
tries to load classes from the parent ClassLoader first and only attempts to 
load from its own configured URLs if the class was not found by the parent.  
This class loading behavior can be problematic for coprocessors that have 
common dependencies with HBase but whose versions are incompatible.  For 
example, I have a coprocessor that depends on a different version of Avro than 
the version used by HBase.  The current class loading behavior results in 
NoSuchMethodErrors in my coprocessor because some Avro classes have already 
been loaded by HBase, and the ClassLoader for my coprocessor picks up HBase's 
loaded classes first.

My proposed solution to this problem is to use a custom ClassLoader when 
instantiating coprocessor instances.  This custom ClassLoader would always 
attempt to load classes from the coprocessor's jar first and would only 
delegate to the parent ClassLoader if the class were not found in the 
coprocessor jar.  However, certain classes would need to be exempt from this 
behavior.  As an example, if the Copcoessor interface were loaded by both the 
region server's ClassLoader and the coprocessor's custom ClassLoader, then the 
region server would get a ClassCastException when attempting to cast the 
coprocessor instance to the Coprocessor interface.  This problem can be avoided 
by defining a set of class name prefixes that would be exempt from loading by 
the custom ClassLoader.  When loading a class, if the class starts with any of 
these prefixes (e.g. "org.apache.hadoop"), then the ClassLoader would delegate 
immediately to the parent ClassLoader.

I've already implemented a patch to provide this functionality which I'll 
attach shortly.


--
This message is automatically generated by JIRA.
If you think it was sent incorrectly, please contact your JIRA administrators: 
https://issues.apache.org/jira/secure/ContactAdministrators!default.jspa
For more information on JIRA, see: http://www.atlassian.com/software/jira

        

Reply via email to