Author: markt
Date: Fri Oct 4 11:44:03 2013
New Revision: 1529134
URL: http://svn.apache.org/r1529134
Log:
Fix intermittent issue observed in unit test on CI system.
Container is responsible for first call on onWritePossible() / onDataAvailable()
Modified:
tomcat/trunk/java/org/apache/catalina/core/AsyncContextImpl.java
tomcat/trunk/java/org/apache/coyote/ActionCode.java
tomcat/trunk/java/org/apache/coyote/http11/AbstractHttp11Processor.java
tomcat/trunk/java/org/apache/tomcat/util/net/AbstractEndpoint.java
tomcat/trunk/test/org/apache/catalina/connector/TestCoyoteOutputStream.java
Modified: tomcat/trunk/java/org/apache/catalina/core/AsyncContextImpl.java
URL:
http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/catalina/core/AsyncContextImpl.java?rev=1529134&r1=1529133&r2=1529134&view=diff
==============================================================================
--- tomcat/trunk/java/org/apache/catalina/core/AsyncContextImpl.java (original)
+++ tomcat/trunk/java/org/apache/catalina/core/AsyncContextImpl.java Fri Oct 4
11:44:03 2013
@@ -261,7 +261,7 @@ public class AsyncContextImpl implements
logDebug("start ");
}
check();
- Runnable wrapper = new RunnableWrapper(run, context);
+ Runnable wrapper = new RunnableWrapper(run, context,
this.request.getCoyoteRequest());
this.request.getCoyoteRequest().action(ActionCode.ASYNC_RUN, wrapper);
}
@@ -539,12 +539,15 @@ public class AsyncContextImpl implements
private static class RunnableWrapper implements Runnable {
- private Runnable wrapped = null;
- private Context context = null;
+ private final Runnable wrapped;
+ private final Context context;
+ private final org.apache.coyote.Request coyoteRequest;
- public RunnableWrapper(Runnable wrapped, Context ctxt) {
+ public RunnableWrapper(Runnable wrapped, Context ctxt,
+ org.apache.coyote.Request coyoteRequest) {
this.wrapped = wrapped;
this.context = ctxt;
+ this.coyoteRequest = coyoteRequest;
}
@Override
@@ -576,8 +579,12 @@ public class AsyncContextImpl implements
Thread.currentThread().setContextClassLoader(oldCL);
}
}
- }
+ // Since this runnable is not executing as a result of a socket
+ // event, we need to ensure that any registered dispatches are
+ // executed.
+ coyoteRequest.action(ActionCode.DISPATCH_EXECUTE, null);
+ }
}
Modified: tomcat/trunk/java/org/apache/coyote/ActionCode.java
URL:
http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/coyote/ActionCode.java?rev=1529134&r1=1529133&r2=1529134&view=diff
==============================================================================
--- tomcat/trunk/java/org/apache/coyote/ActionCode.java (original)
+++ tomcat/trunk/java/org/apache/coyote/ActionCode.java Fri Oct 4 11:44:03 2013
@@ -221,5 +221,13 @@ public enum ActionCode {
* Indicates that the container needs to trigger a call to
onWritePossible()
* for the registered non-blocking write listener.
*/
- DISPATCH_WRITE
+ DISPATCH_WRITE,
+
+ /**
+ * Execute any non-blocking dispatches that have been registered via
+ * {@link #DISPATCH_READ} or {@link #DISPATCH_WRITE}. Typically required
+ * when the non-blocking listeners are configured on a thread where the
+ * processing wasn't triggered by a read or write event on the socket.
+ */
+ DISPATCH_EXECUTE
}
Modified:
tomcat/trunk/java/org/apache/coyote/http11/AbstractHttp11Processor.java
URL:
http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/coyote/http11/AbstractHttp11Processor.java?rev=1529134&r1=1529133&r2=1529134&view=diff
==============================================================================
--- tomcat/trunk/java/org/apache/coyote/http11/AbstractHttp11Processor.java
(original)
+++ tomcat/trunk/java/org/apache/coyote/http11/AbstractHttp11Processor.java Fri
Oct 4 11:44:03 2013
@@ -834,6 +834,8 @@ public abstract class AbstractHttp11Proc
socketWrapper.addDispatch(DispatchType.NON_BLOCKING_READ);
} else if (actionCode == ActionCode.DISPATCH_WRITE) {
socketWrapper.addDispatch(DispatchType.NON_BLOCKING_WRITE);
+ } else if (actionCode == ActionCode.DISPATCH_EXECUTE) {
+ getEndpoint().executeNonBlockingDispatches(socketWrapper);
} else {
actionInternal(actionCode, param);
}
Modified: tomcat/trunk/java/org/apache/tomcat/util/net/AbstractEndpoint.java
URL:
http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/tomcat/util/net/AbstractEndpoint.java?rev=1529134&r1=1529133&r2=1529134&view=diff
==============================================================================
--- tomcat/trunk/java/org/apache/tomcat/util/net/AbstractEndpoint.java
(original)
+++ tomcat/trunk/java/org/apache/tomcat/util/net/AbstractEndpoint.java Fri Oct
4 11:44:03 2013
@@ -635,6 +635,17 @@ public abstract class AbstractEndpoint<S
SocketStatus socketStatus, boolean dispatch);
+ public void executeNonBlockingDispatches(SocketWrapper<S> socketWrapper) {
+ // Synchronise on the socket wrapper to ensure no other threads are
+ // working with the socket
+ synchronized (socketWrapper) {
+ while (socketWrapper.hasNextDispatch()) {
+ DispatchType dispatchType = socketWrapper.getNextDispatch();
+ processSocket(socketWrapper, dispatchType.getSocketStatus(),
false);
+ }
+ }
+ }
+
// ------------------------------------------------------- Lifecycle
methods
/*
Modified:
tomcat/trunk/test/org/apache/catalina/connector/TestCoyoteOutputStream.java
URL:
http://svn.apache.org/viewvc/tomcat/trunk/test/org/apache/catalina/connector/TestCoyoteOutputStream.java?rev=1529134&r1=1529133&r2=1529134&view=diff
==============================================================================
--- tomcat/trunk/test/org/apache/catalina/connector/TestCoyoteOutputStream.java
(original)
+++ tomcat/trunk/test/org/apache/catalina/connector/TestCoyoteOutputStream.java
Fri Oct 4 11:44:03 2013
@@ -159,11 +159,6 @@ public class TestCoyoteOutputStream exte
@Override
public void run() {
sos.setWriteListener(new MyWriteListener(asyncCtxt, sos));
- try {
- doAsyncWrite(asyncCtxt, sos);
- } catch (IOException ioe) {
- throw new RuntimeException(ioe);
- }
}
}
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]