You are viewing a plain text version of this content. The canonical link for it is here.
Posted to issues@hbase.apache.org by "Anoop Sam John (JIRA)" <ji...@apache.org> on 2013/01/11 10:48:13 UTC
[jira] [Commented] (HBASE-6656) Cannot call a Coprocessor Endpoint
from a RegionObserver
[ 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