2017-11-16 16:30 GMT+03:00 <[email protected]>:
> 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);
I think that the above line can be removed,
or call size() once and save it in a local variable.
org.apache.tomcat.util.collections.SynchronizedQueue.size() is a
"synchronized" method. It is better to avoid duplicate calls to it.
Further, the returned value is not used by the caller of this events() method.
> - 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: [email protected]
For additional commands, e-mail: [email protected]