[ https://issues.apache.org/jira/browse/HBASE-6308?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=13431936#comment-13431936 ]
Andrew Purtell commented on HBASE-6308: --------------------------------------- I'll take this. Will add a simple test and commit. > 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.92.1, 0.94.0 > Reporter: James Baldassari > Assignee: Andrew Purtell > Fix For: 0.96.0 > > Attachments: 6308-v2.txt, HBASE-6308-0.92.patch, > HBASE-6308-trunk.patch > > > 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