camel-issues mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From Mart Kartašev (JIRA) <j...@apache.org>
Subject [jira] [Commented] (CAMEL-11623) LevelDB Java implementation wont be tried on Errors
Date Thu, 03 Aug 2017 08:56:00 GMT

    [ https://issues.apache.org/jira/browse/CAMEL-11623?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=16112434#comment-16112434
] 

Mart Kartašev commented on CAMEL-11623:
---------------------------------------

I am not sure if ClassCircularity is something we want to catch here but many other subclasses
of Linkage Error seem relevant though.


> LevelDB Java implementation wont be tried on Errors
> ---------------------------------------------------
>
>                 Key: CAMEL-11623
>                 URL: https://issues.apache.org/jira/browse/CAMEL-11623
>             Project: Camel
>          Issue Type: Bug
>          Components: camel-leveldb
>    Affects Versions: 2.19.2
>            Reporter: Mart Kartašev
>             Fix For: 2.18.5, 2.20.0, 2.19.3
>
>
> For a bit of background, we have been running into a problem with the LevelDB JNI drivers
for AggregationRepositories, which prevents startup when using routes for which we require
persistent aggregation. This, however, is not the main topic of this issue.
> In the latest version (2.19.2) the following issue has implemented a Java specific leveldb
factory:
>  https://issues.apache.org/jira/browse/CAMEL-11427
> The relevant part of the Error on startup is as follows: 
> java.lang.UnsatisfiedLinkError: Could not load library. Reasons: [no leveldbjni64-1.8
in java.library.path, no leveldbjni-1.8 in java.library.path, no leveldbjni in java.library.path,
C:\Users\atos\AppData\Local\Temp\leveldbjni-64-1-794362262645531032.8: Can't find dependent
libraries] 
> at org.fusesource.hawtjni.runtime.Library.doLoad(Library.java:182) 
> at org.fusesource.hawtjni.runtime.Library.load(Library.java:140) 
> at org.fusesource.leveldbjni.JniDBFactory.(JniDBFactory.java:48) 
> at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method) 
> at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62)

> at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)

> at java.lang.reflect.Constructor.newInstance(Constructor.java:423) 
> at java.lang.Class.newInstance(Class.java:442) 
> at org.apache.camel.component.leveldb.LevelDBFile.getFactory(LevelDBFile.java:189) 
> at org.apache.camel.component.leveldb.LevelDBFile.start(LevelDBFile.java:174) 
> The way that I understand the code added in issue 11427, is that the LevelDBFile class
getFactory() method (line 181) will first try to initiate with the JNI drivers and if that
fails, will turn to the pure Java implementation. This is done by catching an Exception which
is then ignored incase the JNI driver fails.
> However, when we look at the code we see that UnstatisfiedLinkError does not extend Exception,
it extends Error.
> This Error is therefore not caught by the application and thus the Java implementation
for LevelDB is never even attempted to be initialized as the method execution ends exceptionally
at that point.
> So the main two questions are: 
> 1) Was the code intended to catch this UnsatisfiedLinkageError (I know Errors are often
considered a bad thing to catch) as a means to substitute the JNI driver, incase it fails?
> 2) If it is not supposed to catch this error, how can I use the pure Java implementation
in this case? I expect that trying to exclude relevant packages also wont work as it will
directly try to initiate the the JNI implementation by its name, which would fail also with
an Error.
> So, in summary:
> Is line 194 in class LevelDBFile in the camel-leveldb component supposed to catch an
Error or more generally a Throwable instead of Exception?



--
This message was sent by Atlassian JIRA
(v6.4.14#64029)

Mime
View raw message