Bug 67934 - APR connectors will fail to load when tcnative-1 and tcnative-2 are installed in parallel
Summary: APR connectors will fail to load when tcnative-1 and tcnative-2 are installed...
Status: RESOLVED FIXED
Alias: None
Product: Tomcat 9
Classification: Unclassified
Component: Connectors (show other bugs)
Version: 9.0.x
Hardware: All All
: P2 normal (vote)
Target Milestone: -----
Assignee: Tomcat Developers Mailing List
URL:
Keywords:
Depends on:
Blocks:
 
Reported: 2023-10-27 11:19 UTC by Michael Osipov
Modified: 2023-11-03 14:15 UTC (History)
1 user (show)



Attachments

Note You need to log in before you can comment on or make changes to this bug.
Description Michael Osipov 2023-10-27 11:19:56 UTC
Note: This applies to both 8.5.x and 9.0.x.

Since tcnative 1.x and 2.x can be installed side by side:
> root@deblndw011x:/tmp/local/lib
> # ll
> total 19576
> drwxr-xr-x  2 osipovmi  wheel      512 2023-10-12 17:24 engines-3/
> -rw-r--r--  1 osipovmi  wheel  8917782 2023-10-12 17:24 libcrypto.a
> lrwxr-xr-x  1 osipovmi  wheel       14 2023-10-12 17:24 libcrypto.so@ -> libcrypto.so.3
> -rwxr-xr-x  1 osipovmi  wheel  5050168 2023-10-12 17:24 libcrypto.so.3*
> -rw-r--r--  1 osipovmi  wheel  1328044 2023-10-12 17:24 libssl.a
> lrwxr-xr-x  1 osipovmi  wheel       11 2023-10-12 17:24 libssl.so@ -> libssl.so.3
> -rwxr-xr-x  1 osipovmi  wheel   783496 2023-10-12 17:24 libssl.so.3*
> -rw-r--r--  1 osipovmi  wheel  1701660 2023-10-27 12:57 libtcnative-1.a
> -rwxr-xr-x  1 osipovmi  wheel     1052 2023-10-27 12:57 libtcnative-1.la*
> lrwxr-xr-x  1 osipovmi  wheel       23 2023-10-27 12:57 libtcnative-1.so@ -> libtcnative-1.so.0.2.40
> lrwxr-xr-x  1 osipovmi  wheel       23 2023-10-27 12:57 libtcnative-1.so.0@ -> libtcnative-1.so.0.2.40
> -rwxr-xr-x  1 osipovmi  wheel   975800 2023-10-27 12:57 libtcnative-1.so.0.2.40*
> -rw-r--r--  1 osipovmi  wheel   567160 2023-10-27 10:39 libtcnative-2.a
> -rwxr-xr-x  1 osipovmi  wheel     1050 2023-10-27 10:39 libtcnative-2.la*
> lrwxr-xr-x  1 osipovmi  wheel       22 2023-10-27 10:39 libtcnative-2.so@ -> libtcnative-2.so.0.0.7
> lrwxr-xr-x  1 osipovmi  wheel       22 2023-10-27 10:39 libtcnative-2.so.0@ -> libtcnative-2.so.0.0.7
> -rwxr-xr-x  1 osipovmi  wheel   361312 2023-10-27 10:39 libtcnative-2.so.0.0.7*
> drwxr-xr-x  2 osipovmi  wheel      512 2023-10-12 17:24 ossl-modules/
> drwxr-xr-x  2 osipovmi  wheel      512 2023-10-12 17:24 pkgconfig/
or on Windows:
> PS C:\Temp\apache-tomcat-9.0.83-dev\bin> gci -include *.dll
> PS C:\Temp\apache-tomcat-9.0.83-dev\bin> gci -Path *.dll
> 
>     Directory: C:\Temp\apache-tomcat-9.0.83-dev\bin
> 
> Mode                 LastWriteTime         Length Name
> ----                 -------------         ------ ----
> -a---          2023-09-28    14:25        3577344 tcnative-1.dll
> -a---          2023-09-27    16:24        3424256 tcnative-2.dll

Now let's start Tomcat 9 with APR connector configured. Library.java will use:
> private static final String [] NAMES = {"tcnative-2", "libtcnative-2", "tcnative-1", "libtcnative-1"};

Result:
> 27-Oct-2023 13:11:18.029 INFORMATION [main] org.apache.coyote.AbstractProtocol.init Initializing ProtocolHandler ["https-openssl-apr-30001"]
> 27-Oct-2023 13:11:18.033 SCHWERWIEGEND [main] org.apache.catalina.util.LifecycleBase.handleSubClassException Failed to initialize component [Connector["https-openssl-apr-30001"]]
>         java.lang.UnsatisfiedLinkError: org.apache.tomcat.jni.Address.info(Ljava/lang/String;IIIJ)J
>                 at org.apache.tomcat.jni.Address.info(Native Method)
>                 at org.apache.tomcat.util.net.AprEndpoint.bind(AprEndpoint.java:361)
>                 at org.apache.tomcat.util.net.AbstractEndpoint.bindWithCleanup(AbstractEndpoint.java:1326)
>                 at org.apache.tomcat.util.net.AbstractEndpoint.init(AbstractEndpoint.java:1339)
>                 at org.apache.coyote.AbstractProtocol.init(AbstractProtocol.java:654)
>                 at org.apache.coyote.http11.AbstractHttp11Protocol.init(AbstractHttp11Protocol.java:75)
>                 at org.apache.catalina.connector.Connector.initInternal(Connector.java:1009)
>                 at org.apache.catalina.util.LifecycleBase.init(LifecycleBase.java:127)
>                 at org.apache.catalina.core.StandardService.initInternal(StandardService.java:554)
>                 at org.apache.catalina.util.LifecycleBase.init(LifecycleBase.java:127)
>                 at org.apache.catalina.core.StandardServer.initInternal(StandardServer.java:1039)
>                 at org.apache.catalina.util.LifecycleBase.init(LifecycleBase.java:127)
>                 at org.apache.catalina.startup.Catalina.load(Catalina.java:724)
>                 at org.apache.catalina.startup.Catalina.load(Catalina.java:746)
>                 at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
>                 at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
>                 at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
>                 at java.lang.reflect.Method.invoke(Method.java:498)
>                 at org.apache.catalina.startup.Bootstrap.load(Bootstrap.java:307)
>                 at org.apache.catalina.startup.Bootstrap.main(Bootstrap.java:477)
> 27-Oct-2023 13:11:18.041 INFORMATION [main] org.apache.coyote.AbstractProtocol.init Initializing ProtocolHandler ["https-openssl-apr-30002"]
> 27-Oct-2023 13:11:18.042 SCHWERWIEGEND [main] org.apache.catalina.util.LifecycleBase.handleSubClassException Failed to initialize component [Connector["https-openssl-apr-30002"]]
>         java.lang.UnsatisfiedLinkError: org.apache.tomcat.jni.Address.info(Ljava/lang/String;IIIJ)J
>                 at org.apache.tomcat.jni.Address.info(Native Method)
>                 at org.apache.tomcat.util.net.AprEndpoint.bind(AprEndpoint.java:361)
>                 at org.apache.tomcat.util.net.AbstractEndpoint.bindWithCleanup(AbstractEndpoint.java:1326)
>                 at org.apache.tomcat.util.net.AbstractEndpoint.init(AbstractEndpoint.java:1339)
>                 at org.apache.coyote.AbstractProtocol.init(AbstractProtocol.java:654)
>                 at org.apache.coyote.http11.AbstractHttp11Protocol.init(AbstractHttp11Protocol.java:75)
>                 at org.apache.catalina.connector.Connector.initInternal(Connector.java:1009)
>                 at org.apache.catalina.util.LifecycleBase.init(LifecycleBase.java:127)
>                 at org.apache.catalina.core.StandardService.initInternal(StandardService.java:554)
>                 at org.apache.catalina.util.LifecycleBase.init(LifecycleBase.java:127)
>                 at org.apache.catalina.core.StandardServer.initInternal(StandardServer.java:1039)
>                 at org.apache.catalina.util.LifecycleBase.init(LifecycleBase.java:127)
>                 at org.apache.catalina.startup.Catalina.load(Catalina.java:724)
>                 at org.apache.catalina.startup.Catalina.load(Catalina.java:746)
>                 at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
>                 at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
>                 at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
>                 at java.lang.reflect.Method.invoke(Method.java:498)
>                 at org.apache.catalina.startup.Bootstrap.load(Bootstrap.java:307)
>                 at org.apache.catalina.startup.Bootstrap.main(Bootstrap.java:477)

So if we assume that both 1.x and 2.x are functionally identical, but for APR the line in Library should eiher read:
> private static final String [] NAMES = {"tcnative-1", "libtcnative-1"};
or
> private static final String [] NAMES = {"tcnative-1", "libtcnative-1", "tcnative-2", "libtcnative-2"};
or maybe something else?
Comment 1 Mark Thomas 2023-11-03 14:15:30 UTC
For 9.0.x and 8.5.x I think it makes sense to use 1.x in preference to 2.x since 1.x supports the APR/Native connector. 10.1.x onwards are fine preferring 2.x.

Fixed in:
-  9.0.x for  9.0.83 onwards
-  8.5.x for  8.5.96 onwards