You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@tomcat.apache.org by ma...@apache.org on 2014/09/03 15:41:06 UTC

svn commit: r1622253 - in /tomcat/tc7.0.x/trunk: ./ java/org/apache/tomcat/websocket/server/LocalStrings.properties java/org/apache/tomcat/websocket/server/WsServerContainer.java webapps/docs/changelog.xml

Author: markt
Date: Wed Sep  3 13:41:05 2014
New Revision: 1622253

URL: http://svn.apache.org/r1622253
Log:
Fix https://issues.apache.org/bugzilla/show_bug.cgi?id=56905
Make destruction on web application stop of thread group used for WebSocket connections more robust.
Patch by kkolinko with minor tweaks

Modified:
    tomcat/tc7.0.x/trunk/   (props changed)
    tomcat/tc7.0.x/trunk/java/org/apache/tomcat/websocket/server/LocalStrings.properties
    tomcat/tc7.0.x/trunk/java/org/apache/tomcat/websocket/server/WsServerContainer.java
    tomcat/tc7.0.x/trunk/webapps/docs/changelog.xml

Propchange: tomcat/tc7.0.x/trunk/
------------------------------------------------------------------------------
  Merged /tomcat/trunk:r1622251

Modified: tomcat/tc7.0.x/trunk/java/org/apache/tomcat/websocket/server/LocalStrings.properties
URL: http://svn.apache.org/viewvc/tomcat/tc7.0.x/trunk/java/org/apache/tomcat/websocket/server/LocalStrings.properties?rev=1622253&r1=1622252&r2=1622253&view=diff
==============================================================================
--- tomcat/tc7.0.x/trunk/java/org/apache/tomcat/websocket/server/LocalStrings.properties (original)
+++ tomcat/tc7.0.x/trunk/java/org/apache/tomcat/websocket/server/LocalStrings.properties Wed Sep  3 13:41:05 2014
@@ -24,7 +24,7 @@ serverContainer.missingEndpoint=An Endpo
 serverContainer.pojoDeploy=POJO class [{0}] deploying to path [{1}] in ServletContext [{2}]
 serverContainer.servletContextMismatch=Attempted to register a POJO annotated for WebSocket at path [{0}] in the ServletContext with context path [{1}] when the WebSocket ServerContainer is allocated to the ServletContext with context path [{2}]
 serverContainer.servletContextMissing=No ServletContext was specified
-serverContainer.threadGroupNotDestroyed=Unable to destroy WebSocket thread group [{0}] as some threads were still running when the web application was stopped
+serverContainer.threadGroupNotDestroyed=Unable to destroy WebSocket thread group [{0}] as [{1}] threads were still running when the web application was stopped. The thread group will be destroyed once the threads terminate.
 
 uriTemplate.duplicateParameter=The parameter [{0}] appears more than once in the path which is not permitted
 uriTemplate.emptySegment=The path [{0}] contains one or more empty segments which are is not permitted

Modified: tomcat/tc7.0.x/trunk/java/org/apache/tomcat/websocket/server/WsServerContainer.java
URL: http://svn.apache.org/viewvc/tomcat/tc7.0.x/trunk/java/org/apache/tomcat/websocket/server/WsServerContainer.java?rev=1622253&r1=1622252&r2=1622253&view=diff
==============================================================================
--- tomcat/tc7.0.x/trunk/java/org/apache/tomcat/websocket/server/WsServerContainer.java (original)
+++ tomcat/tc7.0.x/trunk/java/org/apache/tomcat/websocket/server/WsServerContainer.java Wed Sep  3 13:41:05 2014
@@ -276,14 +276,42 @@ public class WsServerContainer extends W
     public void destroy() {
         shutdownExecutor();
         super.destroy();
+        // If the executor hasn't fully shutdown it won't be possible to
+        // destroy this thread group as there will still be threads running.
+        // Mark the thread group as daemon one, so that it destroys itself
+        // when thread count reaches zero.
+        // Synchronization on threadGroup is needed, as there is a race between
+        // destroy() call from termination of the last thread in thread group
+        // marked as daemon versus the explicit destroy() call.
+        int threadCount = threadGroup.activeCount();
+        boolean success = false;
         try {
-            threadGroup.destroy();
-        } catch (IllegalThreadStateException itse) {
-            // If the executor hasn't fully shutdown it won't be possible to
-            // destroy this thread group as there will still be threads running
-            log.warn(sm.getString("serverContainer.threadGroupNotDestroyed",
-                    threadGroup.getName()));
+            while (true) {
+                int oldThreadCount = threadCount;
+                synchronized (threadGroup) {
+                    if (threadCount > 0) {
+                        Thread.yield();
+                        threadCount = threadGroup.activeCount();
+                    }
+                    if (threadCount > 0 && threadCount != oldThreadCount) {
+                        // Value not stabilized. Retry.
+                        continue;
+                    }
+                    if (threadCount > 0) {
+                        threadGroup.setDaemon(true);
+                    } else {
+                        threadGroup.destroy();
+                        success = true;
+                    }
+                    break;
+                }
+            }
+        } catch (IllegalThreadStateException exception) {
+            // Fall-through
         }
+        if (!success) {
+            log.warn(sm.getString("serverContainer.threadGroupNotDestroyed",
+                    threadGroup.getName(), Integer.valueOf(threadCount)));        }
     }
 
 

Modified: tomcat/tc7.0.x/trunk/webapps/docs/changelog.xml
URL: http://svn.apache.org/viewvc/tomcat/tc7.0.x/trunk/webapps/docs/changelog.xml?rev=1622253&r1=1622252&r2=1622253&view=diff
==============================================================================
--- tomcat/tc7.0.x/trunk/webapps/docs/changelog.xml (original)
+++ tomcat/tc7.0.x/trunk/webapps/docs/changelog.xml Wed Sep  3 13:41:05 2014
@@ -169,6 +169,10 @@
         application. (markt) 
       </fix>
       <fix>
+        <bug>56905</bug>: Make destruction on web application stop of thread
+        group used for WebSocket connections more robust. (kkolinko/markt)
+      </fix>
+      <fix>
         <bug>56907</bug>: Ensure that client IO threads are stopped if a secure
         WebSocket client connection fails. (markt)
       </fix>



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