Author: remm
Date: Mon Nov 2 15:20:44 2015
New Revision: 1712044
URL: http://svn.apache.org/viewvc?rev=1712044&view=rev
Log:
- Tentative patch for the elusive 57799: some blocking IO code uses
InputStream.available() (a useless call that has always been in the java.io
API). Following the introduction of non blocking, available() now causes real
IO to occur. While this should be mostly harmless for APR and NIO (which can
"read" 0 bytes), it would leave an async read pending with NIO2. The read IO
operation will now not occur unless a read listener has been set (in which case
available() is mostly equivalent to the newer isReady() method).
- Will wait until the fix is confirmed to work to port to 8, if not I will
rework this.
Modified:
tomcat/trunk/java/org/apache/catalina/connector/InputBuffer.java
tomcat/trunk/java/org/apache/catalina/connector/LocalStrings.properties
tomcat/trunk/java/org/apache/coyote/http11/Http11InputBuffer.java
tomcat/trunk/java/org/apache/coyote/http11/Http11Processor.java
Modified: tomcat/trunk/java/org/apache/catalina/connector/InputBuffer.java
URL:
http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/catalina/connector/InputBuffer.java?rev=1712044&r1=1712043&r2=1712044&view=diff
==============================================================================
--- tomcat/trunk/java/org/apache/catalina/connector/InputBuffer.java (original)
+++ tomcat/trunk/java/org/apache/catalina/connector/InputBuffer.java Mon Nov 2
15:20:44 2015
@@ -224,7 +224,7 @@ public class InputBuffer extends Reader
available = cb.getLength();
}
if (available == 0) {
- coyoteRequest.action(ActionCode.AVAILABLE, null);
+ coyoteRequest.action(ActionCode.AVAILABLE,
Boolean.valueOf(coyoteRequest.getReadListener() != null));
available = (coyoteRequest.getAvailable() > 0) ? 1 : 0;
}
return available;
@@ -269,7 +269,7 @@ public class InputBuffer extends Reader
public boolean isReady() {
if (coyoteRequest.getReadListener() == null) {
- throw new IllegalStateException("not in non blocking mode.");
+ throw new
IllegalStateException(sm.getString("inputBuffer.requiresNonBlocking"));
}
if (isFinished()) {
// If this is a non-container thread, need to trigger a read
Modified:
tomcat/trunk/java/org/apache/catalina/connector/LocalStrings.properties
URL:
http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/catalina/connector/LocalStrings.properties?rev=1712044&r1=1712043&r2=1712044&view=diff
==============================================================================
--- tomcat/trunk/java/org/apache/catalina/connector/LocalStrings.properties
(original)
+++ tomcat/trunk/java/org/apache/catalina/connector/LocalStrings.properties Mon
Nov 2 15:20:44 2015
@@ -64,6 +64,7 @@ coyoteResponse.sendRedirect.note=<html><
coyoteResponse.setBufferSize.ise=Cannot change buffer size after data has been
written
inputBuffer.streamClosed=Stream closed
+inputBuffer.requiresNonBlocking=Not available in non blocking mode
outputBuffer.writeNull=The String argument to write(String,int,int) may not be
null
Modified: tomcat/trunk/java/org/apache/coyote/http11/Http11InputBuffer.java
URL:
http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/coyote/http11/Http11InputBuffer.java?rev=1712044&r1=1712043&r2=1712044&view=diff
==============================================================================
--- tomcat/trunk/java/org/apache/coyote/http11/Http11InputBuffer.java (original)
+++ tomcat/trunk/java/org/apache/coyote/http11/Http11InputBuffer.java Mon Nov
2 15:20:44 2015
@@ -626,14 +626,14 @@ public class Http11InputBuffer implement
* Available bytes in the buffers (note that due to encoding, this may not
* correspond).
*/
- int available() {
+ int available(boolean read) {
int available = lastValid - pos;
if ((available == 0) && (lastActiveFilter >= 0)) {
for (int i = 0; (available == 0) && (i <= lastActiveFilter); i++) {
available = activeFilters[i].available();
}
}
- if (available > 0) {
+ if (available > 0 || !read) {
return available;
}
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=1712044&r1=1712043&r2=1712044&view=diff
==============================================================================
--- tomcat/trunk/java/org/apache/coyote/http11/Http11Processor.java (original)
+++ tomcat/trunk/java/org/apache/coyote/http11/Http11Processor.java Mon Nov 2
15:20:44 2015
@@ -758,7 +758,7 @@ public class Http11Processor extends Abs
break;
}
case AVAILABLE: {
- request.setAvailable(inputBuffer.available());
+ request.setAvailable(inputBuffer.available(param == Boolean.TRUE));
break;
}
case NB_WRITE_INTEREST: {
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]