Author: markt Date: Thu Nov 16 13:30:26 2017 New Revision: 1815451 URL: http://svn.apache.org/viewvc?rev=1815451&view=rev Log: Fix https://bz.apache.org/bugzilla/show_bug.cgi?id=61736 Improve performance of NIO connector when clients leave large time gaps between network packets. Patch provided by Zilong Song. This closes #81
Modified: tomcat/trunk/java/org/apache/tomcat/util/net/NioBlockingSelector.java tomcat/trunk/java/org/apache/tomcat/util/net/NioEndpoint.java tomcat/trunk/webapps/docs/changelog.xml Modified: tomcat/trunk/java/org/apache/tomcat/util/net/NioBlockingSelector.java URL: http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/tomcat/util/net/NioBlockingSelector.java?rev=1815451&r1=1815450&r2=1815451&view=diff ============================================================================== --- tomcat/trunk/java/org/apache/tomcat/util/net/NioBlockingSelector.java (original) +++ tomcat/trunk/java/org/apache/tomcat/util/net/NioBlockingSelector.java Thu Nov 16 13:30:26 2017 @@ -263,10 +263,25 @@ public class NioBlockingSelector { boolean result = false; Runnable r = null; result = (events.size() > 0); - while ( (r = events.poll()) != null ) { + + /* We only poll and run the runnable events when we start this + * method. Further events added to the queue later will be delayed + * to the next execution of this method. + * + * We do in this way, because running event from the events queue + * may lead the working thread to add more events to the queue (for + * example, the worker thread may add another RunnableAdd event when + * waken up by a previous RunnableAdd event who got an invalid + * SelectionKey). Trying to consume all the events in an increasing + * queue till it's empty, will make the loop hard to be terminated, + * which will kill a lot of time, and greatly affect performance of + * the poller loop. + */ + for (int i = 0, size = events.size(); i < size && (r = events.poll()) != null; i++) { r.run(); result = true; } + return result; } 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=1815451&r1=1815450&r2=1815451&view=diff ============================================================================== --- tomcat/trunk/java/org/apache/tomcat/util/net/NioEndpoint.java (original) +++ tomcat/trunk/java/org/apache/tomcat/util/net/NioEndpoint.java Thu Nov 16 13:30:26 2017 @@ -595,7 +595,7 @@ public class NioEndpoint extends Abstrac boolean result = false; PollerEvent pe = null; - while ( (pe = events.poll()) != null ) { + for (int i = 0, size = events.size(); i < size && (pe = events.poll()) != null; i++ ) { result = true; try { pe.run(); Modified: tomcat/trunk/webapps/docs/changelog.xml URL: http://svn.apache.org/viewvc/tomcat/trunk/webapps/docs/changelog.xml?rev=1815451&r1=1815450&r2=1815451&view=diff ============================================================================== --- tomcat/trunk/webapps/docs/changelog.xml (original) +++ tomcat/trunk/webapps/docs/changelog.xml Thu Nov 16 13:30:26 2017 @@ -111,6 +111,11 @@ InputStream.setReadListener with HTTP/2. (remm) </fix> <fix> + <bug>61736</bug>: Improve performance of NIO connector when clients + leave large time gaps between network packets. Patch provided by Zilong + Song. (markt) + </fix> + <fix> <bug>61740</bug>: Correct an off-by-one error in the Hpack header index validation that caused intermittent request failures when using HTTP/2. (markt) --------------------------------------------------------------------- To unsubscribe, e-mail: dev-unsubscr...@tomcat.apache.org For additional commands, e-mail: dev-h...@tomcat.apache.org