Author: remm Date: Thu Oct 29 17:01:31 2015 New Revision: 1711303 URL: http://svn.apache.org/viewvc?rev=1711303&view=rev Log: After a timeout using a future, the operation that caused the timeout should be cancelled, otherwise it will still be pending. Found it investigating 58565, and could be "causing" 57799 (which would be a timeout on a read being swallowed and then disguised as a pending exception after trying to read again).
Modified: tomcat/trunk/java/org/apache/tomcat/util/net/Nio2Endpoint.java 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=1711303&r1=1711302&r2=1711303&view=diff ============================================================================== --- tomcat/trunk/java/org/apache/tomcat/util/net/Nio2Endpoint.java (original) +++ tomcat/trunk/java/org/apache/tomcat/util/net/Nio2Endpoint.java Thu Oct 29 17:01:31 2015 @@ -37,6 +37,7 @@ import java.util.ArrayList; import java.util.concurrent.ExecutionException; import java.util.concurrent.Executor; import java.util.concurrent.ExecutorService; +import java.util.concurrent.Future; import java.util.concurrent.RejectedExecutionException; import java.util.concurrent.Semaphore; import java.util.concurrent.TimeUnit; @@ -1151,10 +1152,11 @@ public class Nio2Endpoint extends Abstra private int fillReadBuffer(boolean block) throws IOException { socketBufferHandler.configureReadBufferForWrite(); int nRead = 0; + Future<Integer> integer = null; if (block) { try { - nRead = getSocket().read(socketBufferHandler.getReadBuffer()).get( - getNio2ReadTimeout(), TimeUnit.MILLISECONDS).intValue(); + integer = getSocket().read(socketBufferHandler.getReadBuffer()); + nRead = integer.get(getNio2ReadTimeout(), TimeUnit.MILLISECONDS).intValue(); // Blocking read so need to release here since there will // not be a callback to a completion handler. readPending.release(); @@ -1167,8 +1169,10 @@ public class Nio2Endpoint extends Abstra } catch (InterruptedException e) { throw new IOException(e); } catch (TimeoutException e) { - SocketTimeoutException ex = new SocketTimeoutException(); - throw ex; + if (integer != null) { + integer.cancel(true); + } + throw new SocketTimeoutException(); } } else { Nio2Endpoint.startInline(); @@ -1226,11 +1230,12 @@ public class Nio2Endpoint extends Abstra */ @Override protected void doWriteInternal(boolean block) throws IOException { + Future<Integer> integer = null; try { socketBufferHandler.configureWriteBufferForRead(); do { - if (getSocket().write(socketBufferHandler.getWriteBuffer()).get( - getNio2WriteTimeout(), TimeUnit.MILLISECONDS).intValue() < 0) { + integer = getSocket().write(socketBufferHandler.getWriteBuffer()); + if (integer.get(getNio2WriteTimeout(), TimeUnit.MILLISECONDS).intValue() < 0) { throw new EOFException(sm.getString("iob.failedwrite")); } } while (socketBufferHandler.getWriteBuffer().hasRemaining()); @@ -1243,6 +1248,9 @@ public class Nio2Endpoint extends Abstra } catch (InterruptedException e) { throw new IOException(e); } catch (TimeoutException e) { + if (integer != null) { + integer.cancel(true); + } throw new SocketTimeoutException(); } } @@ -1254,7 +1262,6 @@ public class Nio2Endpoint extends Abstra throw getError(); } - // Before doing a blocking flush, make sure that any pending non // blocking write has completed. try { --------------------------------------------------------------------- To unsubscribe, e-mail: dev-unsubscr...@tomcat.apache.org For additional commands, e-mail: dev-h...@tomcat.apache.org