Author: markt Date: Sun Feb 22 18:50:23 2015 New Revision: 1661526 URL: http://svn.apache.org/r1661526 Log: Limit concurrent read/write for HTTP upgrade to implementations that explicitly request it via a Tomcat specific interface. Note that the expectation is that concurrent read/writes will be replaced by these implementations having direct access to Tomcat's I/O layer.
Added: tomcat/trunk/java/org/apache/coyote/http11/upgrade/InternalHttpUpgradeHandler.java (with props) Modified: tomcat/trunk/java/org/apache/coyote/http11/upgrade/UpgradeProcessor.java tomcat/trunk/java/org/apache/tomcat/util/net/AprEndpoint.java tomcat/trunk/java/org/apache/tomcat/util/net/Nio2Endpoint.java tomcat/trunk/java/org/apache/tomcat/util/net/NioEndpoint.java tomcat/trunk/java/org/apache/tomcat/util/net/SocketWrapperBase.java tomcat/trunk/java/org/apache/tomcat/websocket/server/WsHttpUpgradeHandler.java tomcat/trunk/res/checkstyle/org-import-control.xml Added: tomcat/trunk/java/org/apache/coyote/http11/upgrade/InternalHttpUpgradeHandler.java URL: http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/coyote/http11/upgrade/InternalHttpUpgradeHandler.java?rev=1661526&view=auto ============================================================================== --- tomcat/trunk/java/org/apache/coyote/http11/upgrade/InternalHttpUpgradeHandler.java (added) +++ tomcat/trunk/java/org/apache/coyote/http11/upgrade/InternalHttpUpgradeHandler.java Sun Feb 22 18:50:23 2015 @@ -0,0 +1,32 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.coyote.http11.upgrade; + +import javax.servlet.http.HttpUpgradeHandler; + + +/** + * Currently just a marker interface to enable Tomcat to identify + * implementations that expect/require concurrent read/write support. + * + * Note that concurrent read/write support is being phased out and this + * interface is expected to evolve into an interface internal handlers use to + * gain direct access to Tomcat's I/O layer rather than going through the + * Servlet API. + */ +public interface InternalHttpUpgradeHandler extends HttpUpgradeHandler { +} \ No newline at end of file Propchange: tomcat/trunk/java/org/apache/coyote/http11/upgrade/InternalHttpUpgradeHandler.java ------------------------------------------------------------------------------ svn:eol-style = native Modified: tomcat/trunk/java/org/apache/coyote/http11/upgrade/UpgradeProcessor.java URL: http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/coyote/http11/upgrade/UpgradeProcessor.java?rev=1661526&r1=1661525&r2=1661526&view=diff ============================================================================== --- tomcat/trunk/java/org/apache/coyote/http11/upgrade/UpgradeProcessor.java (original) +++ tomcat/trunk/java/org/apache/coyote/http11/upgrade/UpgradeProcessor.java Sun Feb 22 18:50:23 2015 @@ -56,6 +56,10 @@ public class UpgradeProcessor implements wrapper.unRead(leftOverInput); wrapper.setReadTimeout(INFINITE_TIMEOUT); wrapper.setWriteTimeout(INFINITE_TIMEOUT); + + if (httpUpgradeHandler instanceof InternalHttpUpgradeHandler) { + wrapper.setInternalUpgrade(true); + } } Modified: tomcat/trunk/java/org/apache/tomcat/util/net/AprEndpoint.java URL: http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/tomcat/util/net/AprEndpoint.java?rev=1661526&r1=1661525&r2=1661526&view=diff ============================================================================== --- tomcat/trunk/java/org/apache/tomcat/util/net/AprEndpoint.java (original) +++ tomcat/trunk/java/org/apache/tomcat/util/net/AprEndpoint.java Sun Feb 22 18:50:23 2015 @@ -2326,11 +2326,9 @@ public class AprEndpoint extends Abstrac @Override public void run() { - - // Upgraded connections need to allow multiple threads to access the - // connection at the same time to enable blocking IO to be used when - // Servlet 3.1 NIO has been configured - if (socket.isUpgraded() && SocketStatus.OPEN_WRITE == status) { + // Upgraded connections using an internal upgrade handler are + // allowed concurrent read/writes + if (socket.isInternalUpgrade() && SocketStatus.OPEN_WRITE == status) { synchronized (socket.getWriteThreadLock()) { doRun(); } Modified: tomcat/trunk/java/org/apache/tomcat/util/net/Nio2Endpoint.java URL: http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/tomcat/util/net/Nio2Endpoint.java?rev=1661526&r1=1661525&r2=1661526&view=diff ============================================================================== --- tomcat/trunk/java/org/apache/tomcat/util/net/Nio2Endpoint.java (original) +++ tomcat/trunk/java/org/apache/tomcat/util/net/Nio2Endpoint.java Sun Feb 22 18:50:23 2015 @@ -1636,11 +1636,9 @@ public class Nio2Endpoint extends Abstra @Override public void run() { - // Upgraded connections need to allow multiple threads to access the - // connection at the same time to enable blocking IO to be used when - // NIO has been configured - if (socket.isUpgraded() && - SocketStatus.OPEN_WRITE == status) { + // Upgraded connections using an internal upgrade handler are + // allowed concurrent read/writes + if (socket.isInternalUpgrade() && SocketStatus.OPEN_WRITE == status) { synchronized (socket.getWriteThreadLock()) { doRun(); } Modified: tomcat/trunk/java/org/apache/tomcat/util/net/NioEndpoint.java URL: http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/tomcat/util/net/NioEndpoint.java?rev=1661526&r1=1661525&r2=1661526&view=diff ============================================================================== --- tomcat/trunk/java/org/apache/tomcat/util/net/NioEndpoint.java (original) +++ tomcat/trunk/java/org/apache/tomcat/util/net/NioEndpoint.java Sun Feb 22 18:50:23 2015 @@ -1685,10 +1685,9 @@ public class NioEndpoint extends Abstrac SelectionKey key = socket.getIOChannel().keyFor( socket.getPoller().getSelector()); - // Upgraded connections need to allow multiple threads to access the - // connection at the same time to enable blocking IO to be used when - // NIO has been configured - if (ka.isUpgraded() && SocketStatus.OPEN_WRITE == status) { + // Upgraded connections using an internal upgrade handler are + // allowed concurrent read/writes + if (ka.isInternalUpgrade() && SocketStatus.OPEN_WRITE == status) { synchronized (ka.getWriteThreadLock()) { doRun(key, ka); } Modified: tomcat/trunk/java/org/apache/tomcat/util/net/SocketWrapperBase.java URL: http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/tomcat/util/net/SocketWrapperBase.java?rev=1661526&r1=1661525&r2=1661526&view=diff ============================================================================== --- tomcat/trunk/java/org/apache/tomcat/util/net/SocketWrapperBase.java (original) +++ tomcat/trunk/java/org/apache/tomcat/util/net/SocketWrapperBase.java Sun Feb 22 18:50:23 2015 @@ -51,6 +51,7 @@ public abstract class SocketWrapperBase< private volatile boolean async = false; private boolean keptAlive = false; private volatile boolean upgraded = false; + private volatile boolean internalUpgrade = false; private boolean secure = false; /* * Following cached for speed / reduced GC @@ -152,6 +153,10 @@ public abstract class SocketWrapperBase< } public boolean isUpgraded() { return upgraded; } public void setUpgraded(boolean upgraded) { this.upgraded = upgraded; } + public boolean isInternalUpgrade() {return internalUpgrade; } + public void setInternalUpgrade(boolean internalUpgrade) { + this.internalUpgrade = internalUpgrade; + } public boolean isSecure() { return secure; } public void setSecure(boolean secure) { this.secure = secure; } @@ -345,6 +350,7 @@ public abstract class SocketWrapperBase< this.readTimeout = soTimeout; this.writeTimeout = soTimeout; upgraded = false; + internalUpgrade = false; resetSocketBufferHandler(socket); } Modified: tomcat/trunk/java/org/apache/tomcat/websocket/server/WsHttpUpgradeHandler.java URL: http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/tomcat/websocket/server/WsHttpUpgradeHandler.java?rev=1661526&r1=1661525&r2=1661526&view=diff ============================================================================== --- tomcat/trunk/java/org/apache/tomcat/websocket/server/WsHttpUpgradeHandler.java (original) +++ tomcat/trunk/java/org/apache/tomcat/websocket/server/WsHttpUpgradeHandler.java Sun Feb 22 18:50:23 2015 @@ -26,7 +26,6 @@ import javax.servlet.ServletInputStream; import javax.servlet.ServletOutputStream; import javax.servlet.WriteListener; import javax.servlet.http.HttpSession; -import javax.servlet.http.HttpUpgradeHandler; import javax.servlet.http.WebConnection; import javax.websocket.CloseReason; import javax.websocket.CloseReason.CloseCodes; @@ -35,6 +34,7 @@ import javax.websocket.Endpoint; import javax.websocket.EndpointConfig; import javax.websocket.Extension; +import org.apache.coyote.http11.upgrade.InternalHttpUpgradeHandler; import org.apache.juli.logging.Log; import org.apache.juli.logging.LogFactory; import org.apache.tomcat.util.res.StringManager; @@ -45,7 +45,7 @@ import org.apache.tomcat.websocket.WsSes /** * Servlet 3.1 HTTP upgrade handler for WebSocket connections. */ -public class WsHttpUpgradeHandler implements HttpUpgradeHandler { +public class WsHttpUpgradeHandler implements InternalHttpUpgradeHandler { private static final Log log = LogFactory.getLog(WsHttpUpgradeHandler.class); Modified: tomcat/trunk/res/checkstyle/org-import-control.xml URL: http://svn.apache.org/viewvc/tomcat/trunk/res/checkstyle/org-import-control.xml?rev=1661526&r1=1661525&r2=1661526&view=diff ============================================================================== --- tomcat/trunk/res/checkstyle/org-import-control.xml (original) +++ tomcat/trunk/res/checkstyle/org-import-control.xml Sun Feb 22 18:50:23 2015 @@ -174,6 +174,7 @@ </subpackage> <subpackage name="server"> <allow pkg="javax.servlet"/> + <allow pkg="org.apache.coyote.http11.upgrade"/> <allow pkg="org.apache.tomcat.websocket"/> </subpackage> </subpackage> --------------------------------------------------------------------- To unsubscribe, e-mail: dev-unsubscr...@tomcat.apache.org For additional commands, e-mail: dev-h...@tomcat.apache.org