[ https://issues.apache.org/jira/browse/HBASE-6656?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=13551013#comment-13551013 ]
Anoop Sam John commented on HBASE-6656: --------------------------------------- Is there a jar (which includes all the classes for your Endpoint) there in the Region Server process's classpath? > Cannot call a Coprocessor Endpoint from a RegionObserver > -------------------------------------------------------- > > Key: HBASE-6656 > URL: https://issues.apache.org/jira/browse/HBASE-6656 > Project: HBase > Issue Type: Bug > Components: Coprocessors > Affects Versions: 0.92.1 > Environment: CentOS5 > Reporter: Mauricio Morales > > I'm trying to call a Coprocessor Endpoint from within the preGet handler of a > RegionObserver, and it's throwing Class Loader issues. > The exact same Coprocessor Endpoint works perfectly from remote Java client, > however, fails from within the same Region Server. > For our particular test environment, only 1 Region Server is available, so I > guess it's a "local" call that fails, and perhaps a remote RegionServer > wouldn't fail, but that doesn't justify the issue :). > The Code within the RegionObserver is roughly (way reduced) as follows: > --- > @Override > public void preGet(ObserverContext<RegionCoprocessorEnvironment> e, Get > get, List<KeyValue> results) > throws IOException { > Map<byte[], Set<byte[]>> results; > // scan: for all regions > try { > > Batch.Call<PlatformStatsIndexEndpointProtocol,Set<byte[]>> batchCall = new > Batch.Call<PlatformStatsIndexEndpointProtocol,Set<byte[]>>() { > public Set<byte[]> > call(PlatformStatsIndexEndpointProtocol instance) throws IOException{ > return instance.getKeyTokenByPrefix(index, > match, additionalMatches); > } > }; > results = > indexTable.coprocessorExec(PlatformStatsIndexEndpointProtocol.class, null, > null, batchCall); > } catch (Throwable e1) { > e1.printStackTrace(); > throw new IOException(e1); > } > > Set<byte[]> finalResultSet = new HashSet<byte[]>(); > for (Map.Entry<byte[], Set<byte[]>> e : results.entrySet()) { > finalResultSet.addAll(e.getValue()); > } > } > --- > The Code for the Coprocessor Endpoint is irrelevant, as it never gets > executed. > This is the Exception I get on the Client side (Server side logged exception > below). > --- > Thu Aug 23 17:37:45 CST 2012, > org.apache.hadoop.hbase.client.HTable$5@26659db7,java.io.IOException: > java.io.IOException: java.io.IOException: java.lang.IllegalArgumentException: > interface com.company.hbase.platformstats.PlatformStatsIndexEndpointProtocol > is not visible from class loader > at > com.company.hbase.platformstats.IndexQueryRegionObserver.preGet(IndexQueryRegionObserver.java:100) > at > org.apache.hadoop.hbase.regionserver.RegionCoprocessorHost.preGet(RegionCoprocessorHost.java:553) > at org.apache.hadoop.hbase.regionserver.HRegion.get(HRegion.java:3737) > at org.apache.hadoop.hbase.regionserver.HRegion.get(HRegion.java:3639) > at > org.apache.hadoop.hbase.regionserver.HRegionServer.get(HRegionServer.java:1785) > at sun.reflect.GeneratedMethodAccessor53.invoke(Unknown Source) > at > sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25) > at java.lang.reflect.Method.invoke(Method.java:597) > at > org.apache.hadoop.hbase.ipc.WritableRpcEngine$Server.call(WritableRpcEngine.java:364) > at > org.apache.hadoop.hbase.ipc.HBaseServer$Handler.run(HBaseServer.java:1336) > Caused by: java.io.IOException: java.lang.IllegalArgumentException: interface > com.company.hbase.platformstats.PlatformStatsIndexEndpointProtocol is not > visible from class loader > at > com.company.hbase.platformstats.PlatformStatsIndexer.getKeyTokens(PlatformStatsIndexer.java:390) > at > com.company.hbase.platformstats.PlatformStatsIndexer.getKeyTokensBySubstring(PlatformStatsIndexer.java:348) > at > com.company.hbase.platformstats.IndexQueryRegionObserver.searchTokens(IndexQueryRegionObserver.java:148) > at > com.company.hbase.platformstats.IndexQueryRegionObserver.preGet(IndexQueryRegionObserver.java:97) > ... 9 more > Caused by: java.lang.IllegalArgumentException: interface > com.company.hbase.platformstats.PlatformStatsIndexEndpointProtocol is not > visible from class loader > at java.lang.reflect.Proxy.getProxyClass(Proxy.java:353) > at java.lang.reflect.Proxy.newProxyInstance(Proxy.java:581) > at > org.apache.hadoop.hbase.client.HConnectionManager$HConnectionImplementation$4.call(HConnectionManager.java:1451) > at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:303) > at java.util.concurrent.FutureTask.run(FutureTask.java:138) > at > java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:886) > at > java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:908) > at java.lang.Thread.run(Thread.java:662) > at > org.apache.hadoop.hbase.client.HConnectionManager$HConnectionImplementation.getRegionServerWithRetries(HConnectionManager.java:1345) > at org.apache.hadoop.hbase.client.HTable.get(HTable.java:657) > at Test.queryIndex(Test.java:109) > at Test.main(Test.java:42) > --- > This is the Server Side exception logged: > --- > 2012-08-23 19:37:44,705 ERROR > org.apache.hadoop.hbase.regionserver.HRegionServer: > java.io.IOException: java.io.IOException: java.lang.IllegalArgumentException: > interface com.company.hbase.platformstats.PlatformStatsIndexEndpointProtocol > is not > visible from class loader > at > com.company.hbase.platformstats.IndexQueryRegionObserver.preGet(IndexQueryRegionObserver.java:100) > at > org.apache.hadoop.hbase.regionserver.RegionCoprocessorHost.preGet(RegionCoprocessorHost.java:553) > at org.apache.hadoop.hbase.regionserver.HRegion.get(HRegion.java:3737) > at org.apache.hadoop.hbase.regionserver.HRegion.get(HRegion.java:3639) > at > org.apache.hadoop.hbase.regionserver.HRegionServer.get(HRegionServer.java:1785) > at sun.reflect.GeneratedMethodAccessor53.invoke(Unknown Source) > at > sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25) > at java.lang.reflect.Method.invoke(Method.java:597) > at > org.apache.hadoop.hbase.ipc.WritableRpcEngine$Server.call(WritableRpcEngine.java:364) > at > org.apache.hadoop.hbase.ipc.HBaseServer$Handler.run(HBaseServer.java:1336) > Caused by: java.io.IOException: java.lang.IllegalArgumentException: interface > com.company.hbase.platformstats.PlatformStatsIndexEndpointProtocol is not > visible from class loader > at > com.company.hbase.platformstats.PlatformStatsIndexer.getKeyTokens(PlatformStatsIndexer.java:390) > at > com.company.hbase.platformstats.PlatformStatsIndexer.getKeyTokensBySubstring(PlatformStatsIndexer.java:348) > at > com.company.hbase.platformstats.IndexQueryRegionObserver.searchTokens(IndexQueryRegionObserver.java:148) > at > com.company.hbase.platformstats.IndexQueryRegionObserver.preGet(IndexQueryRegionObserver.java:97) > ... 9 more > Caused by: java.lang.IllegalArgumentException: interface > com.company.hbase.platformstats.PlatformStatsIndexEndpointProtocol is not > visible from class loader > at java.lang.reflect.Proxy.getProxyClass(Proxy.java:353) > at java.lang.reflect.Proxy.newProxyInstance(Proxy.java:581) > at > org.apache.hadoop.hbase.client.HConnectionManager$HConnectionImplementation$4.call(HConnectionManager.java:1451) > at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:303) > at java.util.concurrent.FutureTask.run(FutureTask.java:138) > at > java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:886) > at > java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:908) > at java.lang.Thread.run(Thread.java:662) > --- > I'm not senior java developer, so this Class Loader visibility issue goes > beyond my reach. I have the theory that because it's a local call, the > ClassLoaders for the very same Protocol interface may be different (1 reads > from the .jar, another from the remote HTable client call); but I have not > been able to prove nor fix this behavior. -- 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