Return-Path: X-Original-To: apmail-hbase-issues-archive@www.apache.org Delivered-To: apmail-hbase-issues-archive@www.apache.org Received: from mail.apache.org (hermes.apache.org [140.211.11.3]) by minotaur.apache.org (Postfix) with SMTP id 8757610F30 for ; Wed, 27 Nov 2013 17:36:25 +0000 (UTC) Received: (qmail 81533 invoked by uid 500); 27 Nov 2013 17:35:25 -0000 Delivered-To: apmail-hbase-issues-archive@hbase.apache.org Received: (qmail 81025 invoked by uid 500); 27 Nov 2013 17:35:05 -0000 Mailing-List: contact issues-help@hbase.apache.org; run by ezmlm Precedence: bulk List-Help: List-Unsubscribe: List-Post: List-Id: Delivered-To: mailing list issues@hbase.apache.org Received: (qmail 80357 invoked by uid 99); 27 Nov 2013 17:34:41 -0000 Received: from arcas.apache.org (HELO arcas.apache.org) (140.211.11.28) by apache.org (qpsmtpd/0.29) with ESMTP; Wed, 27 Nov 2013 17:34:41 +0000 Date: Wed, 27 Nov 2013 17:34:41 +0000 (UTC) From: "Andrew Purtell (JIRA)" To: issues@hbase.apache.org Message-ID: In-Reply-To: References: Subject: [jira] [Resolved] (HBASE-6656) Cannot call a Coprocessor Endpoint from a RegionObserver MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: 7bit X-JIRA-FingerPrint: 30527f35849b9dde25b450d4833f0394 [ https://issues.apache.org/jira/browse/HBASE-6656?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel ] Andrew Purtell resolved HBASE-6656. ----------------------------------- Resolution: Not A Problem > 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 e, Get get, List results) > throws IOException { > Map> results; > // scan: for all regions > try { > Batch.Call> batchCall = new Batch.Call>() { > public Set 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 finalResultSet = new HashSet(); > for (Map.Entry> 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 was sent by Atlassian JIRA (v6.1#6144)