> On May 4, 2023, at 21:41, ma...@apache.org wrote:
> 
> This is an automated email from the ASF dual-hosted git repository.
> 
> markt pushed a commit to branch main
> in repository https://gitbox.apache.org/repos/asf/tomcat.git
> 
> commit 4b097bf2e9075e9e2949ec5aa410cba3c2b85374
> Author: Mark Thomas <ma...@apache.org>
> AuthorDate: Thu May 4 14:41:01 2023 +0100
> 
>    Move management of utility executor from init/destroy to start/stop
> ---
> java/org/apache/catalina/connector/Connector.java  | 13 +++++++---
> java/org/apache/catalina/core/ContainerBase.java   | 20 +++++++---------
> java/org/apache/catalina/core/StandardServer.java  | 28 +++++++++++-----------
> .../apache/catalina/ha/tcp/SimpleTcpCluster.java   |  5 +++-
> webapps/docs/changelog.xml                         |  5 ++++
> 5 files changed, 41 insertions(+), 30 deletions(-)
> 
> diff --git a/java/org/apache/catalina/connector/Connector.java 
> b/java/org/apache/catalina/connector/Connector.java
> index c9200e20ca..dac7fdd642 100644
> --- a/java/org/apache/catalina/connector/Connector.java
> +++ b/java/org/apache/catalina/connector/Connector.java
> @@ -992,9 +992,6 @@ public class Connector extends LifecycleMBeanBase {
>         // Initialize adapter
>         adapter = new CoyoteAdapter(this);
>         protocolHandler.setAdapter(adapter);
> -        if (service != null) {
> -            
> protocolHandler.setUtilityExecutor(service.getServer().getUtilityExecutor());
> -        }
> 
>         // Make sure parseBodyMethodsSet has a default
>         if (null == parseBodyMethodsSet) {
> @@ -1035,6 +1032,11 @@ public class Connector extends LifecycleMBeanBase {
> 
>         setState(LifecycleState.STARTING);
> 
> +        // Configure the utility executor before starting the protocol 
> handler
> +        if (service != null) {
> +            
> protocolHandler.setUtilityExecutor(service.getServer().getUtilityExecutor());

According to check logic at line 1027,  the protocalHandler may be null, so 
need NPE check.
> +        }
> +
>         try {
>             protocolHandler.start();
>         } catch (Exception e) {
> @@ -1060,6 +1062,11 @@ public class Connector extends LifecycleMBeanBase {
>         } catch (Exception e) {
>             throw new 
> LifecycleException(sm.getString("coyoteConnector.protocolHandlerStopFailed"), 
> e);
>         }
> +
> +        // Remove the utility executor once the protocol handler has been 
> stopped
> +        if (service != null) {
> +            protocolHandler.setUtilityExecutor(null);
Same as above.

Han
> +        }
>     }
> 
> 
> diff --git a/java/org/apache/catalina/core/ContainerBase.java 
> b/java/org/apache/catalina/core/ContainerBase.java
> index 784c9032ef..a7e7c69a4a 100644
> --- a/java/org/apache/catalina/core/ContainerBase.java
> +++ b/java/org/apache/catalina/core/ContainerBase.java
> @@ -787,13 +787,6 @@ public abstract class ContainerBase extends 
> LifecycleMBeanBase implements Contai
>     }
> 
> 
> -    @Override
> -    protected void initInternal() throws LifecycleException {
> -        reconfigureStartStopExecutor(getStartStopThreads());
> -        super.initInternal();
> -    }
> -
> -
>     private void reconfigureStartStopExecutor(int threads) {
>         if (threads == 1) {
>             // Use a fake executor
> @@ -819,6 +812,8 @@ public abstract class ContainerBase extends 
> LifecycleMBeanBase implements Contai
>     @Override
>     protected synchronized void startInternal() throws LifecycleException {
> 
> +        reconfigureStartStopExecutor(getStartStopThreads());
> +
>         // Start our subordinate components, if any
>         logger = null;
>         getLogger();
> @@ -925,6 +920,12 @@ public abstract class ContainerBase extends 
> LifecycleMBeanBase implements Contai
>         if (cluster instanceof Lifecycle) {
>             ((Lifecycle) cluster).stop();
>         }
> +
> +        // If init fails, this may be null
> +        if (startStopExecutor != null) {
> +            startStopExecutor.shutdownNow();
> +            startStopExecutor = null;
> +        }
>     }
> 
>     @Override
> @@ -954,11 +955,6 @@ public abstract class ContainerBase extends 
> LifecycleMBeanBase implements Contai
>             parent.removeChild(this);
>         }
> 
> -        // If init fails, this may be null
> -        if (startStopExecutor != null) {
> -            startStopExecutor.shutdownNow();
> -        }
> -
>         super.destroyInternal();
>     }
> 
> diff --git a/java/org/apache/catalina/core/StandardServer.java 
> b/java/org/apache/catalina/core/StandardServer.java
> index 80b5026fed..a4383f2503 100644
> --- a/java/org/apache/catalina/core/StandardServer.java
> +++ b/java/org/apache/catalina/core/StandardServer.java
> @@ -901,6 +901,12 @@ public final class StandardServer extends 
> LifecycleMBeanBase implements Server {
>         fireLifecycleEvent(CONFIGURE_START_EVENT, null);
>         setState(LifecycleState.STARTING);
> 
> +        // Initialize utility executor
> +        synchronized (utilityExecutorLock) {
> +            
> reconfigureUtilityExecutor(getUtilityThreadsInternal(utilityThreads));
> +            register(utilityExecutor, "type=UtilityExecutor");
> +        }
> +
>         globalNamingResources.start();
> 
>         // Start our defined Services
> @@ -961,6 +967,14 @@ public final class StandardServer extends 
> LifecycleMBeanBase implements Server {
>             service.stop();
>         }
> 
> +        synchronized (utilityExecutorLock) {
> +            if (utilityExecutor != null) {
> +                utilityExecutor.shutdownNow();
> +                unregister("type=UtilityExecutor");
> +                utilityExecutor = null;
> +            }
> +        }
> +
>         globalNamingResources.stop();
> 
>         stopAwait();
> @@ -975,12 +989,6 @@ public final class StandardServer extends 
> LifecycleMBeanBase implements Server {
> 
>         super.initInternal();
> 
> -        // Initialize utility executor
> -        synchronized (utilityExecutorLock) {
> -            
> reconfigureUtilityExecutor(getUtilityThreadsInternal(utilityThreads));
> -            register(utilityExecutor, "type=UtilityExecutor");
> -        }
> -
>         // Register global String cache
>         // Note although the cache is global, if there are multiple Servers
>         // present in the JVM (may happen when embedding) then the same cache
> @@ -1014,14 +1022,6 @@ public final class StandardServer extends 
> LifecycleMBeanBase implements Server {
> 
>         unregister(onameStringCache);
> 
> -        synchronized (utilityExecutorLock) {
> -            if (utilityExecutor != null) {
> -                utilityExecutor.shutdownNow();
> -                unregister("type=UtilityExecutor");
> -                utilityExecutor = null;
> -            }
> -        }
> -
>         super.destroyInternal();
>     }
> 
> diff --git a/java/org/apache/catalina/ha/tcp/SimpleTcpCluster.java 
> b/java/org/apache/catalina/ha/tcp/SimpleTcpCluster.java
> index 83b27bddac..3f01ebf0eb 100644
> --- a/java/org/apache/catalina/ha/tcp/SimpleTcpCluster.java
> +++ b/java/org/apache/catalina/ha/tcp/SimpleTcpCluster.java
> @@ -530,7 +530,6 @@ public class SimpleTcpCluster extends LifecycleMBeanBase
>             name.append(",component=Deployer");
>             onameClusterDeployer = register(clusterDeployer, name.toString());
>         }
> -        
> channel.setUtilityExecutor(Container.getService(getContainer()).getServer().getUtilityExecutor());
>     }
> 
> 
> @@ -548,6 +547,8 @@ public class SimpleTcpCluster extends LifecycleMBeanBase
>             log.info(sm.getString("simpleTcpCluster.start"));
>         }
> 
> +        
> channel.setUtilityExecutor(Container.getService(getContainer()).getServer().getUtilityExecutor());
> +
>         try {
>             checkDefaults();
>             registerClusterValve();
> @@ -655,6 +656,8 @@ public class SimpleTcpCluster extends LifecycleMBeanBase
>         } catch (Exception x) {
>             log.error(sm.getString("simpleTcpCluster.stopUnable"), x);
>         }
> +
> +        channel.setUtilityExecutor(null);
>     }
> 
> 
> diff --git a/webapps/docs/changelog.xml b/webapps/docs/changelog.xml
> index 131799a300..ebdac44cee 100644
> --- a/webapps/docs/changelog.xml
> +++ b/webapps/docs/changelog.xml
> @@ -134,6 +134,11 @@
>         file locking protection or the manager servlet. Submitted
>         by Jack Shirazi. (remm)
>       </fix>
> +      <scode>
> +        Move the management of the utility executor from the
> +        <code>init()</code>/<code>destroy()</code> methods of components to 
> the
> +        <code>start()</code>/<code>stop()</code> methods. (markt)
> +      </scode>
>     </changelog>
>   </subsection>
>   <subsection name="Coyote">
> 
> 
> ---------------------------------------------------------------------
> To unsubscribe, e-mail: dev-unsubscr...@tomcat.apache.org
> For additional commands, e-mail: dev-h...@tomcat.apache.org
> 


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

Reply via email to