Author: markt Date: Fri Jun 26 19:17:16 2015 New Revision: 1687840 URL: http://svn.apache.org/r1687840 Log: Expose the calling of pause() on the endpoint to the HTTP/2 upgrade processor so it can stop accepting additional streams. This commit is just the plumbing to make this possible. The implementation that prevents new streams from being accepted will follow in a subsequent commit.
Modified: tomcat/trunk/java/org/apache/coyote/AbstractProtocol.java tomcat/trunk/java/org/apache/coyote/Processor.java tomcat/trunk/java/org/apache/coyote/ajp/AjpProcessor.java tomcat/trunk/java/org/apache/coyote/http11/Http11Processor.java tomcat/trunk/java/org/apache/coyote/http11/upgrade/InternalHttpUpgradeHandler.java tomcat/trunk/java/org/apache/coyote/http11/upgrade/UpgradeProcessorExternal.java tomcat/trunk/java/org/apache/coyote/http11/upgrade/UpgradeProcessorInternal.java tomcat/trunk/java/org/apache/coyote/http2/Http2UpgradeHandler.java tomcat/trunk/java/org/apache/coyote/http2/LocalStrings.properties tomcat/trunk/java/org/apache/coyote/http2/StreamProcessor.java tomcat/trunk/java/org/apache/tomcat/util/net/AbstractEndpoint.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/websocket/server/WsHttpUpgradeHandler.java tomcat/trunk/test/org/apache/coyote/http11/upgrade/TestUpgradeInternalHandler.java Modified: tomcat/trunk/java/org/apache/coyote/AbstractProtocol.java URL: http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/coyote/AbstractProtocol.java?rev=1687840&r1=1687839&r2=1687840&view=diff ============================================================================== --- tomcat/trunk/java/org/apache/coyote/AbstractProtocol.java (original) +++ tomcat/trunk/java/org/apache/coyote/AbstractProtocol.java Fri Jun 26 19:17:16 2015 @@ -945,6 +945,22 @@ public abstract class AbstractProtocol<S } } } + + @Override + public final void pause() { + /* + * Inform all the processors associated with current connections + * that the endpoint is being paused. Most won't care. Those + * processing multiplexed streams may wish to take action. For + * example, HTTP/2 may wish to stop accepting new streams. + * + * Note that even if the endpoint is resumed, there is (currently) + * no API to inform the Processors of this. + */ + for (Processor processor : connections.values()) { + processor.pause(); + } + } } protected static class RecycledProcessors<P extends Processor, S> Modified: tomcat/trunk/java/org/apache/coyote/Processor.java URL: http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/coyote/Processor.java?rev=1687840&r1=1687839&r2=1687840&view=diff ============================================================================== --- tomcat/trunk/java/org/apache/coyote/Processor.java (original) +++ tomcat/trunk/java/org/apache/coyote/Processor.java Fri Jun 26 19:17:16 2015 @@ -76,4 +76,12 @@ public interface Processor { * @return leftover bytes */ ByteBuffer getLeftoverInput(); + + /** + * Informs the processor that the underlying I/O layer has stopped accepting + * new connections. This is primarily intended to enable processors that + * use multiplexed connections to prevent further 'streams' being added to + * an existing multiplexed connection. + */ + void pause(); } Modified: tomcat/trunk/java/org/apache/coyote/ajp/AjpProcessor.java URL: http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/coyote/ajp/AjpProcessor.java?rev=1687840&r1=1687839&r2=1687840&view=diff ============================================================================== --- tomcat/trunk/java/org/apache/coyote/ajp/AjpProcessor.java (original) +++ tomcat/trunk/java/org/apache/coyote/ajp/AjpProcessor.java Fri Jun 26 19:17:16 2015 @@ -888,6 +888,12 @@ public class AjpProcessor extends Abstra } + @Override + public void pause() { + // NOOP for AJP + } + + // ------------------------------------------------------ Protected Methods // Methods used by SocketInputBuffer Modified: tomcat/trunk/java/org/apache/coyote/http11/Http11Processor.java URL: http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/coyote/http11/Http11Processor.java?rev=1687840&r1=1687839&r2=1687840&view=diff ============================================================================== --- tomcat/trunk/java/org/apache/coyote/http11/Http11Processor.java (original) +++ tomcat/trunk/java/org/apache/coyote/http11/Http11Processor.java Fri Jun 26 19:17:16 2015 @@ -1887,4 +1887,10 @@ public class Http11Processor extends Abs return inputBuffer.getLeftover(); } + + @Override + public void pause() { + // NOOP for HTTP + } + } Modified: 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=1687840&r1=1687839&r2=1687840&view=diff ============================================================================== --- tomcat/trunk/java/org/apache/coyote/http11/upgrade/InternalHttpUpgradeHandler.java (original) +++ tomcat/trunk/java/org/apache/coyote/http11/upgrade/InternalHttpUpgradeHandler.java Fri Jun 26 19:17:16 2015 @@ -35,4 +35,6 @@ public interface InternalHttpUpgradeHand void setSocketWrapper(SocketWrapperBase<?> wrapper); void setSslSupport(SSLSupport sslSupport); + + void pause(); } \ No newline at end of file Modified: tomcat/trunk/java/org/apache/coyote/http11/upgrade/UpgradeProcessorExternal.java URL: http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/coyote/http11/upgrade/UpgradeProcessorExternal.java?rev=1687840&r1=1687839&r2=1687840&view=diff ============================================================================== --- tomcat/trunk/java/org/apache/coyote/http11/upgrade/UpgradeProcessorExternal.java (original) +++ tomcat/trunk/java/org/apache/coyote/http11/upgrade/UpgradeProcessorExternal.java Fri Jun 26 19:17:16 2015 @@ -126,4 +126,10 @@ public class UpgradeProcessorExternal ex public final void setSslSupport(SSLSupport sslSupport) { // NO-OP } + + + @Override + public void pause() { + // NOOP for AJP + } } Modified: tomcat/trunk/java/org/apache/coyote/http11/upgrade/UpgradeProcessorInternal.java URL: http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/coyote/http11/upgrade/UpgradeProcessorInternal.java?rev=1687840&r1=1687839&r2=1687840&view=diff ============================================================================== --- tomcat/trunk/java/org/apache/coyote/http11/upgrade/UpgradeProcessorInternal.java (original) +++ tomcat/trunk/java/org/apache/coyote/http11/upgrade/UpgradeProcessorInternal.java Fri Jun 26 19:17:16 2015 @@ -57,6 +57,12 @@ public class UpgradeProcessorInternal ex } + @Override + public void pause() { + internalHttpUpgradeHandler.pause(); + } + + // --------------------------------------------------- AutoCloseable methods @Override Modified: tomcat/trunk/java/org/apache/coyote/http2/Http2UpgradeHandler.java URL: http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/coyote/http2/Http2UpgradeHandler.java?rev=1687840&r1=1687839&r2=1687840&view=diff ============================================================================== --- tomcat/trunk/java/org/apache/coyote/http2/Http2UpgradeHandler.java (original) +++ tomcat/trunk/java/org/apache/coyote/http2/Http2UpgradeHandler.java Fri Jun 26 19:17:16 2015 @@ -319,6 +319,15 @@ public class Http2UpgradeHandler extends @Override + public void pause() { + if (log.isDebugEnabled()) { + log.debug(sm.getString("upgradeHandler.pause.entry", connectionId)); + } + // TODO: Stop accepting new streams + } + + + @Override public void destroy() { // NO-OP } Modified: tomcat/trunk/java/org/apache/coyote/http2/LocalStrings.properties URL: http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/coyote/http2/LocalStrings.properties?rev=1687840&r1=1687839&r2=1687840&view=diff ============================================================================== --- tomcat/trunk/java/org/apache/coyote/http2/LocalStrings.properties (original) +++ tomcat/trunk/java/org/apache/coyote/http2/LocalStrings.properties Fri Jun 26 19:17:16 2015 @@ -79,6 +79,7 @@ upgradeHandler.rst.debug=Connection [{0} upgradeHandler.goaway.debug=Connection [{0}], Goaway, Last stream [{1}], Error code [{2}], Debug data [{3}] upgradeHandler.init=Connection [{0}] upgradeHandler.ioerror=Connection [{0}] +upgradeHandler.pause.entry=Connection [{0}] Pausing upgradeHandler.sendPrefaceFail=Failed to send preface to client upgradeHandler.socketCloseFailed=Error closing socket upgradeHandler.stream.closed=Stream [{0}] has been closed for some time Modified: tomcat/trunk/java/org/apache/coyote/http2/StreamProcessor.java URL: http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/coyote/http2/StreamProcessor.java?rev=1687840&r1=1687839&r2=1687840&view=diff ============================================================================== --- tomcat/trunk/java/org/apache/coyote/http2/StreamProcessor.java (original) +++ tomcat/trunk/java/org/apache/coyote/http2/StreamProcessor.java Fri Jun 26 19:17:16 2015 @@ -136,6 +136,12 @@ public class StreamProcessor extends Abs @Override + public void pause() { + // NO-OP. Handled by the Http2UpgradeHandler + } + + + @Override public SocketState process(SocketWrapperBase<?> socket) throws IOException { // Should never happen throw new IllegalStateException(sm.getString("streamProcessor.httpupgrade.notsupported")); Modified: tomcat/trunk/java/org/apache/tomcat/util/net/AbstractEndpoint.java URL: http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/tomcat/util/net/AbstractEndpoint.java?rev=1687840&r1=1687839&r2=1687840&view=diff ============================================================================== --- tomcat/trunk/java/org/apache/tomcat/util/net/AbstractEndpoint.java (original) +++ tomcat/trunk/java/org/apache/tomcat/util/net/AbstractEndpoint.java Fri Jun 26 19:17:16 2015 @@ -94,6 +94,15 @@ public abstract class AbstractEndpoint<S /** + * Inform the handler that the endpoint has stopped accepting any new + * connections. Typically, the endpoint will be stopped shortly + * afterwards but it is possible that the endpoint will be resumed so + * the handler should not assume that a stop will follow. + */ + public void pause(); + + + /** * Recycle resources associated with the handler. */ public void recycle(); @@ -877,6 +886,7 @@ public abstract class AbstractEndpoint<S if (running && !paused) { paused = true; unlockAccept(); + getHandler().pause(); } } @@ -906,6 +916,8 @@ public abstract class AbstractEndpoint<S } + protected abstract Handler<S> getHandler(); + protected abstract Log getLog(); protected LimitLatch initializeConnectionLatch() { 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=1687840&r1=1687839&r2=1687840&view=diff ============================================================================== --- tomcat/trunk/java/org/apache/tomcat/util/net/AprEndpoint.java (original) +++ tomcat/trunk/java/org/apache/tomcat/util/net/AprEndpoint.java Fri Jun 26 19:17:16 2015 @@ -144,6 +144,7 @@ public class AprEndpoint extends Abstrac */ protected Handler<Long> handler = null; public void setHandler(Handler<Long> handler ) { this.handler = handler; } + @Override public Handler<Long> getHandler() { return handler; } 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=1687840&r1=1687839&r2=1687840&view=diff ============================================================================== --- tomcat/trunk/java/org/apache/tomcat/util/net/Nio2Endpoint.java (original) +++ tomcat/trunk/java/org/apache/tomcat/util/net/Nio2Endpoint.java Fri Jun 26 19:17:16 2015 @@ -104,6 +104,7 @@ public class Nio2Endpoint extends Abstra */ private Handler handler = null; public void setHandler(Handler handler ) { this.handler = handler; } + @Override public Handler getHandler() { return handler; } 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=1687840&r1=1687839&r2=1687840&view=diff ============================================================================== --- tomcat/trunk/java/org/apache/tomcat/util/net/NioEndpoint.java (original) +++ tomcat/trunk/java/org/apache/tomcat/util/net/NioEndpoint.java Fri Jun 26 19:17:16 2015 @@ -144,6 +144,7 @@ public class NioEndpoint extends Abstrac */ private Handler handler = null; public void setHandler(Handler handler ) { this.handler = handler; } + @Override public Handler getHandler() { return handler; } 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=1687840&r1=1687839&r2=1687840&view=diff ============================================================================== --- tomcat/trunk/java/org/apache/tomcat/websocket/server/WsHttpUpgradeHandler.java (original) +++ tomcat/trunk/java/org/apache/tomcat/websocket/server/WsHttpUpgradeHandler.java Fri Jun 26 19:17:16 2015 @@ -188,6 +188,12 @@ public class WsHttpUpgradeHandler implem @Override + public void pause() { + // NO-OP + } + + + @Override public void destroy() { if (connection != null) { try { Modified: tomcat/trunk/test/org/apache/coyote/http11/upgrade/TestUpgradeInternalHandler.java URL: http://svn.apache.org/viewvc/tomcat/trunk/test/org/apache/coyote/http11/upgrade/TestUpgradeInternalHandler.java?rev=1687840&r1=1687839&r2=1687840&view=diff ============================================================================== --- tomcat/trunk/test/org/apache/coyote/http11/upgrade/TestUpgradeInternalHandler.java (original) +++ tomcat/trunk/test/org/apache/coyote/http11/upgrade/TestUpgradeInternalHandler.java Fri Jun 26 19:17:16 2015 @@ -227,6 +227,11 @@ public class TestUpgradeInternalHandler } @Override + public void pause() { + // NO-OP + } + + @Override public void destroy() { // NO-OP } --------------------------------------------------------------------- To unsubscribe, e-mail: dev-unsubscr...@tomcat.apache.org For additional commands, e-mail: dev-h...@tomcat.apache.org