You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@tomcat.apache.org by Rainer Jung <ra...@kippdata.de> on 2021/04/07 11:53:18 UTC

AprLifecycleListener broken since 9.0.38?

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-unsubscribe@tomcat.apache.org
For additional commands, e-mail: dev-help@tomcat.apache.org


Re: AprLifecycleListener broken since 9.0.38?

Posted by Rémy Maucherat <re...@apache.org>.
On Wed, Apr 7, 2021 at 2:42 PM Rainer Jung <ra...@kippdata.de> wrote:

> 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:
>

I get the idea. So I think the purpose of the change was to avoid APR and
it worked out great for that. Normally the AprStatus.isInstanceCreated
should be enough to achieve what was originally needed and it is possible
to check AprLifecycleListener.isAprAvailable, since as you correctly
noticed AprStatus.isAprAvailable does nothing. I´m still a bit worried I
could be causing problems.

OTOH, it could be a good move to stop using this since it is removed in
Tomcat 10 and use the APR connector classname instead.

Rémy


>
> 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-unsubscribe@tomcat.apache.org
> > For additional commands, e-mail: dev-help@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-unsubscribe@tomcat.apache.org
> For additional commands, e-mail: dev-help@tomcat.apache.org
>
>

Re: AprLifecycleListener broken since 9.0.38?

Posted by Rémy Maucherat <re...@apache.org>.
On Thu, Apr 8, 2021 at 1:01 PM Rainer Jung <ra...@kippdata.de> wrote:

> Hi Remy,
>
> Filip wrote in the git commit message "Avoid having to load APR classes
> in the Connector". If this is an important goal for TC 9, we would need
> some other place during TC startup that loads the APR classes before the
> connector gets instantiated. I don't know, what a good place would be.
> Currently it seems, the connector gets instantiated while the digester
> processes server.xml, and the Lifecycle events that would init the
> AprLifecycleListener start after that phase, so too late for the
> connector. Not sure whether it would be feasible to use a digester end
> method in a rule for the AprLifecycleListener to call its static init()
> after it has configured the class.
>
> My patch simply reverts the part of Filip's change in the Connector
> class related to isAprAvailable() back to the 9.0.37 situation.
>

I think it should be fine now since AprStatus allows avoiding using
AprLIfecycleListener if it is not configured.


>
> Using explicit className surely is possible, but I think we shouldn't
> break the well known and documented auto-behavior in TC up until 9. For
> example our Windows binary distribution contains tcnative, so each TC 9
> installed with that download and having edited server.xml with
> useAprConnector="true" automatically switches to the APR connectoer, If
> people update after 9.0.37, it will no longer use APR without being made
> aware.
>
> Concerning the three places in Connector, I agree, that only the first
> is needed.
>

All good then.

Rémy

>
> Regards,
>
> Rainer
>
> Am 08.04.2021 um 09:29 schrieb Rémy Maucherat:
> > On Wed, Apr 7, 2021 at 2:42 PM Rainer Jung <ra...@kippdata.de>
> wrote:
> >
> >> 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() &&
> >>
> >
> > Ok, so I thought only the first change was significant, the others occur
> > after AprLifecycleListener runs its init so it should work just fine.
> >
> > Rémy
> >
> >
> >>                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-unsubscribe@tomcat.apache.org
> For additional commands, e-mail: dev-help@tomcat.apache.org
>
>

Re: AprLifecycleListener broken since 9.0.38?

Posted by Rainer Jung <ra...@kippdata.de>.
Hi Remy,

Filip wrote in the git commit message "Avoid having to load APR classes 
in the Connector". If this is an important goal for TC 9, we would need 
some other place during TC startup that loads the APR classes before the 
connector gets instantiated. I don't know, what a good place would be. 
Currently it seems, the connector gets instantiated while the digester 
processes server.xml, and the Lifecycle events that would init the 
AprLifecycleListener start after that phase, so too late for the 
connector. Not sure whether it would be feasible to use a digester end 
method in a rule for the AprLifecycleListener to call its static init() 
after it has configured the class.

My patch simply reverts the part of Filip's change in the Connector 
class related to isAprAvailable() back to the 9.0.37 situation.

Using explicit className surely is possible, but I think we shouldn't 
break the well known and documented auto-behavior in TC up until 9. For 
example our Windows binary distribution contains tcnative, so each TC 9 
installed with that download and having edited server.xml with 
useAprConnector="true" automatically switches to the APR connectoer, If 
people update after 9.0.37, it will no longer use APR without being made 
aware.

Concerning the three places in Connector, I agree, that only the first 
is needed.

Regards,

Rainer

Am 08.04.2021 um 09:29 schrieb Rémy Maucherat:
> On Wed, Apr 7, 2021 at 2:42 PM Rainer Jung <ra...@kippdata.de> wrote:
> 
>> 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() &&
>>
> 
> Ok, so I thought only the first change was significant, the others occur
> after AprLifecycleListener runs its init so it should work just fine.
> 
> Rémy
> 
> 
>>                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-unsubscribe@tomcat.apache.org
For additional commands, e-mail: dev-help@tomcat.apache.org


Re: AprLifecycleListener broken since 9.0.38?

Posted by Rémy Maucherat <re...@apache.org>.
On Wed, Apr 7, 2021 at 2:42 PM Rainer Jung <ra...@kippdata.de> wrote:

> 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() &&
>

Ok, so I thought only the first change was significant, the others occur
after AprLifecycleListener runs its init so it should work just fine.

Rémy


>               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-unsubscribe@tomcat.apache.org
> > For additional commands, e-mail: dev-help@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-unsubscribe@tomcat.apache.org
> For additional commands, e-mail: dev-help@tomcat.apache.org
>
>

Re: AprLifecycleListener broken since 9.0.38?

Posted by Rainer Jung <ra...@kippdata.de>.
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-unsubscribe@tomcat.apache.org
> For additional commands, e-mail: dev-help@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-unsubscribe@tomcat.apache.org
For additional commands, e-mail: dev-help@tomcat.apache.org


Re: AprLifecycleListener broken since 9.0.38?

Posted by Rainer Jung <ra...@kippdata.de>.
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-unsubscribe@tomcat.apache.org
For additional commands, e-mail: dev-help@tomcat.apache.org


Re: AprLifecycleListener broken since 9.0.38?

Posted by Rainer Jung <ra...@kippdata.de>.
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-unsubscribe@tomcat.apache.org
For additional commands, e-mail: dev-help@tomcat.apache.org