Author: markt Date: Sat Apr 7 08:46:31 2012 New Revision: 1310702 URL: http://svn.apache.org/viewvc?rev=1310702&view=rev Log: Fix potential bottleneck on accepting new WebSocket connections
Modified: tomcat/tc7.0.x/trunk/ (props changed) tomcat/tc7.0.x/trunk/java/org/apache/catalina/websocket/WebSocketServlet.java Propchange: tomcat/tc7.0.x/trunk/ ------------------------------------------------------------------------------ Merged /tomcat/trunk:r1310701 Modified: tomcat/tc7.0.x/trunk/java/org/apache/catalina/websocket/WebSocketServlet.java URL: http://svn.apache.org/viewvc/tomcat/tc7.0.x/trunk/java/org/apache/catalina/websocket/WebSocketServlet.java?rev=1310702&r1=1310701&r2=1310702&view=diff ============================================================================== --- tomcat/tc7.0.x/trunk/java/org/apache/catalina/websocket/WebSocketServlet.java (original) +++ tomcat/tc7.0.x/trunk/java/org/apache/catalina/websocket/WebSocketServlet.java Sat Apr 7 08:46:31 2012 @@ -23,6 +23,8 @@ import java.util.ArrayList; import java.util.Collections; import java.util.Enumeration; import java.util.List; +import java.util.Queue; +import java.util.concurrent.ConcurrentLinkedQueue; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; @@ -45,19 +47,8 @@ public abstract class WebSocketServlet e "258EAFA5-E914-47DA-95CA-C5AB0DC85B11".getBytes( B2CConverter.ISO_8859_1); - private MessageDigest sha1Helper; - - - @Override - public void init() throws ServletException { - super.init(); - - try { - sha1Helper = MessageDigest.getInstance("SHA1"); - } catch (NoSuchAlgorithmException e) { - throw new ServletException(e); - } - } + private Queue<MessageDigest> sha1Helpers = + new ConcurrentLinkedQueue<MessageDigest>(); @Override @@ -167,12 +158,24 @@ public abstract class WebSocketServlet e } // ToDo: Use ThreadLocal pool sha1Helper - private String getWebSocketAccept(String key) { - synchronized (sha1Helper) { - sha1Helper.reset(); - sha1Helper.update(key.getBytes(B2CConverter.ISO_8859_1)); - return Base64.encode(sha1Helper.digest(WS_ACCEPT)); + private String getWebSocketAccept(String key) throws ServletException { + + MessageDigest sha1Helper = sha1Helpers.poll(); + if (sha1Helper == null) { + try { + sha1Helper = MessageDigest.getInstance("SHA1"); + } catch (NoSuchAlgorithmException e) { + throw new ServletException(e); + } } + + sha1Helper.reset(); + sha1Helper.update(key.getBytes(B2CConverter.ISO_8859_1)); + String result = Base64.encode(sha1Helper.digest(WS_ACCEPT)); + + sha1Helpers.add(sha1Helper); + + return result; } --------------------------------------------------------------------- To unsubscribe, e-mail: dev-unsubscr...@tomcat.apache.org For additional commands, e-mail: dev-h...@tomcat.apache.org