[ https://issues.apache.org/jira/browse/HBASE-7205?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=13527317#comment-13527317 ]
Adrian Muraru commented on HBASE-7205: -------------------------------------- Right, classloading java is tough, I agree Regarding your comments: {quote} The reason why the above assertion failed was that the classloader for jarFileOnHDFS2 was removed from classLoadersCache in the middle of the test because of attempt of loading cpNameInvalid class. {quote} True, *cpNameInvalid* fails to load (no such class in cp jar) however the same jar (i.e. its associated classloader) manages to successfully loads *another coprocessor: cpName2* Take a closer look on how the *test* table is created in {{TestClassLoading#testClassLoadingFromHDFS}}: {code:java} htd.addFamily(new HColumnDescriptor("test")); // without configuration values htd.setValue("COPROCESSOR$1", jarFileOnHDFS1.toString() + "|" + cpName1 + "|" + Coprocessor.PRIORITY_USER); // with configuration values htd.setValue("COPROCESSOR$2", jarFileOnHDFS2.toString() + "|" + cpName2 + "|" + Coprocessor.PRIORITY_USER + "|k1=v1,k2=v2,k3=v3"); // invalid class name (should fail to load this class) htd.setValue("COPROCESSOR$3", jarFileOnHDFS2.toString() + "|" + cpNameInvalid + "|" + Coprocessor.PRIORITY_USER); {code} See, the same jar file {{jarFileOnHDFS2}} is used to load two different coprocessor classes (one is successfully loaded, the other not). What should we do in this case? My take is to keep the classloader in cache and allow other regions to re-use it. That's the reason I removed classloaderCache.remove() and I strongly go for it. Now, the fundamental question : *Should we silently ignore failures in CP loading (excepting the warn message in log) ?* I think we should be more restrictive, propagate the failures upstream to the table handler and fail to bring the HRegion online in this case. What do you think? {quote} I think the above assertion places extra limit on how CoprocessorHost.load() handles ClassNotFoundException. It assumes that the classloader corresponding to attempt of loading invalid classname (more strictly, classname and jar file mismatch) would be retained in cache. {quote} No, that's not true: The assertion is checking that *all region active-classloaders (i.e. those that managed to successfully load at least one CP) are all cached* > Coprocessor classloader is replicated for all regions in the HRegionServer > -------------------------------------------------------------------------- > > Key: HBASE-7205 > URL: https://issues.apache.org/jira/browse/HBASE-7205 > Project: HBase > Issue Type: Bug > Components: Coprocessors > Affects Versions: 0.92.2, 0.94.2 > Reporter: Adrian Muraru > Assignee: Ted Yu > Priority: Critical > Fix For: 0.96.0, 0.94.4 > > Attachments: 7205-v1.txt, 7205-v3.txt, 7205-v4.txt, 7205-v5.txt, > 7205-v6.txt, 7205-v7.txt, 7205-v8.txt, HBASE-7205_v2.patch > > > HBASE-6308 introduced a new custom CoprocessorClassLoader to load the > coprocessor classes and a new instance of this CL is created for each single > HRegion opened. This leads to OOME-PermGen when the number of regions go > above hundres / region server. > Having the table coprocessor jailed in a separate classloader is good however > we should create only one for all regions of a table in each HRS. -- This message is automatically generated by JIRA. If you think it was sent incorrectly, please contact your JIRA administrators For more information on JIRA, see: http://www.atlassian.com/software/jira