Author: remm Date: Fri Jun 29 15:42:53 2018 New Revision: 1834689 URL: http://svn.apache.org/viewvc?rev=1834689&view=rev Log: 60560: Add support for using an inherited channel to the NIO connector. Based on a patch submitted by Thomas Meyer with testing and suggestions by Coty Sutherland.
Modified: tomcat/trunk/java/org/apache/tomcat/util/net/LocalStrings.properties tomcat/trunk/java/org/apache/tomcat/util/net/NioEndpoint.java tomcat/trunk/webapps/docs/changelog.xml tomcat/trunk/webapps/docs/config/http.xml Modified: tomcat/trunk/java/org/apache/tomcat/util/net/LocalStrings.properties URL: http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/tomcat/util/net/LocalStrings.properties?rev=1834689&r1=1834688&r2=1834689&view=diff ============================================================================== --- tomcat/trunk/java/org/apache/tomcat/util/net/LocalStrings.properties (original) +++ tomcat/trunk/java/org/apache/tomcat/util/net/LocalStrings.properties Fri Jun 29 15:42:53 2018 @@ -47,6 +47,7 @@ endpoint.duplicateSslHostName=Multiple S endpoint.executor.fail=Executor rejected socket [{0}] for processing endpoint.getAttribute=[{0}] is [{1}] endpoint.init.bind=Socket bind failed: [{0}] [{1}] +endpoint.init.bind.inherited=No inherited channel while the connector was configured to use one endpoint.init.listen=Socket listen failed: [{0}] [{1}] endpoint.init.notavail=APR not available endpoint.invalidJmxNameSslHost=Unable to generate a valid JMX object name for the SSLHostConfig associated with host [{0}] 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=1834689&r1=1834688&r2=1834689&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 29 15:42:53 2018 @@ -26,6 +26,7 @@ import java.net.Socket; import java.net.SocketTimeoutException; import java.nio.ByteBuffer; import java.nio.channels.CancelledKeyException; +import java.nio.channels.Channel; import java.nio.channels.FileChannel; import java.nio.channels.NetworkChannel; import java.nio.channels.SelectionKey; @@ -125,6 +126,13 @@ public class NioEndpoint extends Abstrac /** + * Use System.inheritableChannel to obtain channel from stdin/stdout. + */ + private boolean useInheritedChannel = false; + public void setUseInheritedChannel(boolean useInheritedChannel) { this.useInheritedChannel = useInheritedChannel; } + public boolean getUseInheritedChannel() { return useInheritedChannel; } + + /** * Priority of the poller threads. */ private int pollerThreadPriority = Thread.NORM_PRIORITY; @@ -221,10 +229,21 @@ public class NioEndpoint extends Abstrac // Separated out to make it easier for folks that extend NioEndpoint to // implement custom [server]sockets protected void initServerSocket() throws Exception { - serverSock = ServerSocketChannel.open(); - socketProperties.setProperties(serverSock.socket()); - InetSocketAddress addr = (getAddress()!=null?new InetSocketAddress(getAddress(),getPort()):new InetSocketAddress(getPort())); - serverSock.socket().bind(addr,getAcceptCount()); + if (!getUseInheritedChannel()) { + serverSock = ServerSocketChannel.open(); + socketProperties.setProperties(serverSock.socket()); + InetSocketAddress addr = (getAddress()!=null?new InetSocketAddress(getAddress(),getPort()):new InetSocketAddress(getPort())); + serverSock.socket().bind(addr,getAcceptCount()); + } else { + // Retrieve the channel provided by the OS + Channel ic = System.inheritedChannel(); + if (ic instanceof ServerSocketChannel) { + serverSock = (ServerSocketChannel) ic; + } + if (serverSock == null) { + throw new IllegalArgumentException(sm.getString("endpoint.init.bind.inherited")); + } + } serverSock.configureBlocking(true); //mimic APR behavior } @@ -309,9 +328,11 @@ public class NioEndpoint extends Abstrac if (running) { stop(); } - // Close server socket - serverSock.socket().close(); - serverSock.close(); + if (!getUseInheritedChannel()) { + // Close server socket + serverSock.socket().close(); + serverSock.close(); + } serverSock = null; destroySsl(); super.unbind(); Modified: tomcat/trunk/webapps/docs/changelog.xml URL: http://svn.apache.org/viewvc/tomcat/trunk/webapps/docs/changelog.xml?rev=1834689&r1=1834688&r2=1834689&view=diff ============================================================================== --- tomcat/trunk/webapps/docs/changelog.xml (original) +++ tomcat/trunk/webapps/docs/changelog.xml Fri Jun 29 15:42:53 2018 @@ -74,6 +74,11 @@ <bug>56676</bug>: Add a default location for the native library, as ${catalina.home}/bin, which the testsuite already uses. (remm) </fix> + <update> + <bug>60560</bug>: Add support for using an inherited channel to + the NIO connector. Based on a patch submitted by Thomas Meyer with + testing and suggestions by Coty Sutherland. (remm) + </update> </changelog> </subsection> <subsection name="Other"> Modified: tomcat/trunk/webapps/docs/config/http.xml URL: http://svn.apache.org/viewvc/tomcat/trunk/webapps/docs/config/http.xml?rev=1834689&r1=1834688&r2=1834689&view=diff ============================================================================== --- tomcat/trunk/webapps/docs/config/http.xml (original) +++ tomcat/trunk/webapps/docs/config/http.xml Fri Jun 29 15:42:53 2018 @@ -870,6 +870,16 @@ value is set to false. Default value is <code>-1</code> (unlimited).</p> </attribute> + <attribute name="useInheritedChannel" required="false"> + <p>(bool)Defines if this connector should inherit an inetd/systemd network socket. + Only one connector can inherit a network socket. This can option can be + used to automatcially start Tomcat once a connection request is made to + the systemd super daemon's port. + The default value is <code>false</code>. See the JavaDoc + for the <code>java.nio.channels.spi.SelectorProvider</code> class for + more details.</p> + </attribute> + <attribute name="command-line-options" required="false"> <p>The following command line options are available for the NIO connector:<br/> --------------------------------------------------------------------- To unsubscribe, e-mail: dev-unsubscr...@tomcat.apache.org For additional commands, e-mail: dev-h...@tomcat.apache.org