On 14/09/2015 11:42, Konstantin Kolinko wrote:
> 2015-09-14 12:47 GMT+03:00  <ma...@apache.org>:
>> Author: markt
>> Date: Mon Sep 14 09:47:50 2015
>> New Revision: 1702887
>>
>> URL: http://svn.apache.org/r1702887
>> Log:
>> Fix https://bz.apache.org/bugzilla/show_bug.cgi?id=58370
>> Fix data races when executor is being shut down
>>
>> Modified:
>>     tomcat/tc8.0.x/trunk/   (props changed)
>>     
>> tomcat/tc8.0.x/trunk/java/org/apache/tomcat/util/net/AbstractEndpoint.java
>>     tomcat/tc8.0.x/trunk/webapps/docs/changelog.xml
>>
> 
>> Modified: 
>> tomcat/tc8.0.x/trunk/java/org/apache/tomcat/util/net/AbstractEndpoint.java
>> URL: 
>> http://svn.apache.org/viewvc/tomcat/tc8.0.x/trunk/java/org/apache/tomcat/util/net/AbstractEndpoint.java?rev=1702887&r1=1702886&r2=1702887&view=diff
>> ==============================================================================
>> --- 
>> tomcat/tc8.0.x/trunk/java/org/apache/tomcat/util/net/AbstractEndpoint.java 
>> (original)
>> +++ 
>> tomcat/tc8.0.x/trunk/java/org/apache/tomcat/util/net/AbstractEndpoint.java 
>> Mon Sep 14 09:47:50 2015
> 
> 
>> @@ -576,8 +581,10 @@ public abstract class AbstractEndpoint<S
>>      }
>>
>>      public void shutdownExecutor() {
>> -        if ( executor!=null && internalExecutor ) {
>> -            if ( executor instanceof ThreadPoolExecutor ) {
>> +        Executor executor = this.executor;
>> +        this.executor = null;
>> +        if (executor != null && internalExecutor) {
>> +            if (executor instanceof ThreadPoolExecutor) {
>>                  //this is our internal one, so we need to shut it down
>>                  ThreadPoolExecutor tpe = (ThreadPoolExecutor) executor;
>>                  tpe.shutdownNow();
>> @@ -595,7 +602,6 @@ public abstract class AbstractEndpoint<S
>>                  TaskQueue queue = (TaskQueue) tpe.getQueue();
>>                  queue.setParent(null);
>>              }
>> -            executor = null;
>>          }
>>      }
>>
> 
> 
> In the old implementation of shutdownExecutor() the "executor = null;"
> assignment is conditioned by internalExecutor flag.  In the new
> implementation it is assigned unconditionally.
> 
> I think this change in behaviour is wrong.  If it is an external
> executor (internalExecutor flag is false), this reference should not
> be nulled.   shutdownExecutor() is called from stopInternal() of
> NioEndpoint etc., so in theory it is possible to call start() on
> endpoint if it has not been destroy()ed yet. Nulling the reference
> changes behaviour of such start().

Yep. Good catch. I'll get that fixed.

Mark


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

Reply via email to