The only direct calls to AprStatus.isAprAvailable() outside of the APRLifecycleListener itself are actually in Connector.java. Replacing those by calls to the listener seems to work for me:

diff --git a/java/org/apache/catalina/connector/Connector.java b/java/org/apache/catalina/connector/Connector.java
index 1cc15802eb..53a210e6b2 100644
--- a/java/org/apache/catalina/connector/Connector.java
+++ b/java/org/apache/catalina/connector/Connector.java
@@ -29,6 +29,7 @@ import org.apache.catalina.Globals;
 import org.apache.catalina.LifecycleException;
 import org.apache.catalina.LifecycleState;
 import org.apache.catalina.Service;
+import org.apache.catalina.core.AprLifecycleListener;
 import org.apache.catalina.core.AprStatus;
 import org.apache.catalina.util.LifecycleMBeanBase;
 import org.apache.coyote.AbstractProtocol;
@@ -80,7 +81,7 @@ public class Connector extends LifecycleMBeanBase  {


     public Connector(String protocol) {
-        boolean apr = AprStatus.isAprAvailable() &&
+        boolean apr = AprLifecycleListener.isAprAvailable() &&
             AprStatus.getUseAprConnector();
         ProtocolHandler p = null;
         try {
@@ -1020,11 +1021,11 @@ public class Connector extends LifecycleMBeanBase  {
throw new LifecycleException(sm.getString("coyoteConnector.protocolHandlerNoAprListener",
                     getProtocolHandlerClassName()));
         }
- if (protocolHandler.isAprRequired() && !AprStatus.isAprAvailable()) { + if (protocolHandler.isAprRequired() && !AprLifecycleListener.isAprAvailable()) { throw new LifecycleException(sm.getString("coyoteConnector.protocolHandlerNoAprLibrary",
                     getProtocolHandlerClassName()));
         }
-        if (AprStatus.isAprAvailable() && AprStatus.getUseOpenSSL() &&
+ if (AprLifecycleListener.isAprAvailable() && AprStatus.getUseOpenSSL() &&
                 protocolHandler instanceof AbstractHttp11JsseProtocol) {
             AbstractHttp11JsseProtocol<?> jsseProtocolHandler =
                     (AbstractHttp11JsseProtocol<?>) protocolHandler;

Feel free to apply.

Regards,

Rainer


Am 07.04.2021 um 14:32 schrieb Rainer Jung:
I think the reason is:

o.a.c.connector.Connector checks AprStatus.isAprAvailable(). It previously checked AprLifecycleListener.isAprAvailable(). The difference is, that the old AprLifecycleListener.isAprAvailable() triggers the init() of AprLifecycleListener, whereas AprStatus.isAprAvailable() does not.

I think isAprAvailable() is the only method with side effects that was moved from AprLifecycleListener to AprStatus. Since it is still available in AprLifecycleListener, I think it would be safest to typically not call it in AprStatus but instead in AprLifecycleListener.

Regards,

Rainer

Am 07.04.2021 um 14:02 schrieb Rainer Jung:
Maybe related to f4dac6846c548144799b1c3f33aba4eb320a3413.

Am 07.04.2021 um 13:53 schrieb Rainer Jung:
Hi there,

a colleague of mine observed a change in behavior starting with TC 9.0.38: until 9.0.37 the default server.xml with the connector protocol="HTTP/1.1", installed tcnative and attribute useAprConnector="true" for the AprLifecycleListener actually starts an APR connector as documented and expected:

INFO [main] org.apache.coyote.AbstractProtocol.init Initializing ProtocolHandler ["http-apr-8080"]

Same situation starting with 9.0.38 (and at least until 9.0.44):

INFO [main] org.apache.coyote.AbstractProtocol.init Initializing ProtocolHandler ["http-nio-8080"]

I increased log level for a coupe of packages to FINEST and see the following differences during startup:

FINE [main] org.apache.tomcat.util.IntrospectionUtils.setProperty IntrospectionUtils: setProperty(class org.apache.catalina.core.AprLifecycleListener SSLEngine=on) FINE [main] org.apache.tomcat.util.digester.SetPropertiesRule.begin [SetPropertiesRule]{Server/Listener} Setting property 'useAprConnector' to 'true' FINE [main] org.apache.tomcat.util.IntrospectionUtils.setProperty IntrospectionUtils: setProperty(class org.apache.catalina.core.AprLifecycleListener useAprConnector=true)
### ONLY ADDRESS DIFFERENCE
-FINE [main] org.apache.tomcat.util.digester.SetNextRule.end [SetNextRule]{Server/Listener} Call org.apache.catalina.core.StandardServer.addLifecycleListener(org.apache.catalina.core.AprLifecycleListener@383534aa) +FINE [main] org.apache.tomcat.util.digester.SetNextRule.end [SetNextRule]{Server/Listener} Call org.apache.catalina.core.StandardServer.addLifecycleListener(org.apache.catalina.core.AprLifecycleListener@136432db) FINE [main] org.apache.tomcat.util.IntrospectionUtils.callMethod1 IntrospectionUtils: callMethod1 org.apache.catalina.core.StandardServer org.apache.catalina.core.AprLifecycleListener org.apache.catalina.LifecycleListener FINE [main] org.apache.tomcat.util.digester.ObjectCreateRule.end [ObjectCreateRule]{Server/Listener} Pop org.apache.catalina.core.AprLifecycleListener
#### WRONG CLASS CHOSEN IN NEWER VERSIONS
-FINE [main] org.apache.tomcat.util.IntrospectionUtils.setProperty IntrospectionUtils: setProperty(class org.apache.coyote.http11.Http11AprProtocol port=8080) +FINE [main] org.apache.tomcat.util.IntrospectionUtils.setProperty IntrospectionUtils: setProperty(class org.apache.coyote.http11.Http11NioProtocol port=8080) FINE [main] org.apache.tomcat.util.digester.SetPropertiesRule.begin [SetPropertiesRule]{Server/Service/Connector} Setting property 'protocol' to 'HTTP/1.1'
...

and after these lines the logs use consistenly APR versus NIO in the two versions. Both startup logs show the same

INFO [main] org.apache.catalina.core.AprLifecycleListener.lifecycleEvent Loaded Apache Tomcat Native library [1.2.27] using APR version [1.7.0]. INFO [main] org.apache.catalina.core.AprLifecycleListener.lifecycleEvent APR capabilities: IPv6 [true], sendfile [true], accept filters [false], random [true]. INFO [main] org.apache.catalina.core.AprLifecycleListener.lifecycleEvent APR/OpenSSL configuration: useAprConnector [true], useOpenSSL [true] INFO [main] org.apache.catalina.core.AprLifecycleListener.initializeSSL OpenSSL successfully initialized [OpenSSL 1.1.1k  25 Mar 2021]

I didn't find an obvious reason in the changelog. Maybe an unwanted backport part from 10 or some startup order change.

I have not yet checked 8.5 etc.

Regards,

Rainer

---------------------------------------------------------------------
To unsubscribe, e-mail: dev-unsubscr...@tomcat.apache.org
For additional commands, e-mail: dev-h...@tomcat.apache.org


--
kippdata
informationstechnologie GmbH   Tel: 0228 98549 -0
Bornheimer Str. 33a            Fax: 0228 98549 -50
53111 Bonn                     www.kippdata.de

HRB 8018 Amtsgericht Bonn / USt.-IdNr. DE 196 457 417
Geschäftsführer: Dr. Thomas Höfer, Rainer Jung, Sven Maurmann

---------------------------------------------------------------------
To unsubscribe, e-mail: dev-unsubscr...@tomcat.apache.org
For additional commands, e-mail: dev-h...@tomcat.apache.org

Reply via email to