Hi, 2017-06-12 21:43 GMT+03:00 Mark Thomas <ma...@apache.org>: > > On 09/06/17 16:26, Violeta Georgieva wrote: > > 2017-06-09 17:25 GMT+03:00 Mark Thomas <ma...@apache.org>: > > <snip/> > > >> I've spent some time working through the various possible combinations > >> of events and have concluded it is impossible to completely fix this > >> without imposing additional requirements on applications that the > >> specification doesn't mention. > >> > >> However, I believe that we can do better than the current > >> implementation. What I have on mind would: > >> > >> - always trigger AsyncListener.onError() for all listeners > >> - generally, process the complete() dispatch() call from the > >> AsyncListener rather than any from the non-container thread > >> - generally, throw an ISE if complete() or dispatch() is called > >> from the non-container thread after that thread experiences an I/O > >> error > >> - leave a small timing window where it was possible that the complete() > >> or dispatch() from the non-container thread would be used rather than > >> from the AsyncListener. In that case the AsyncListener would see the > >> ISE but any remaining AsyncListener instances would still be called > >> > >> I don't see a way of doing better than this without spec changes / > >> clarifications. > >> > >> WDYT? > > > > +1 > > I'm able to test the new behavior with my real web app. > > Excellent. I've committed my proposed fix. The async unit tests pass > which is generally a good sign. If this works better with your real web > application then we can look to back-port this.
I'm seeing now the following exceptions: java.lang.IllegalStateException: Calling [asyncComplete()] is not valid for a request with Async state [MUST_DISPATCH] at org.apache.coyote.AsyncStateMachine.doComplete(AsyncStateMachine.java:317) ~[tomcat-embed-core.jar!/:8.5.16-dev] at org.apache.coyote.AsyncStateMachine.asyncComplete(AsyncStateMachine.java:301) ~[tomcat-embed-core.jar!/:8.5.16-dev] at org.apache.coyote.AbstractProcessor.action(AbstractProcessor.java:377) [tomcat-embed-core.jar!/:8.5.16-dev] at org.apache.coyote.Request.action(Request.java:424) ~[tomcat-embed-core.jar!/:8.5.16-dev] at org.apache.catalina.core.AsyncContextImpl.complete(AsyncContextImpl.java:96) ~[tomcat-embed-core.jar!/:8.5.16-dev] at org.apache.catalina.core.AsyncContextImpl.setErrorState(AsyncContextImpl.java:427) ~[tomcat-embed-core.jar!/:8.5.16-dev] at org.apache.catalina.connector.CoyoteAdapter.asyncDispatch(CoyoteAdapter.java:176) ~[tomcat-embed-core.jar!/:8.5.16-dev] at org.apache.coyote.AbstractProcessor.dispatch(AbstractProcessor.java:225) [tomcat-embed-core.jar!/:8.5.16-dev] at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:53) [tomcat-embed-core.jar!/:8.5.16-dev] at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:861) [tomcat-embed-core.jar!/:8.5.16-dev] at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1455) [tomcat-embed-core.jar!/:8.5.16-dev] at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49) [tomcat-embed-core.jar!/:8.5.16-dev] at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142) [na:1.8.0_102] at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617) [na:1.8.0_102] at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61) [tomcat-embed-core.jar!/:8.5.16-dev] at java.lang.Thread.run(Thread.java:745) [na:1.8.0_102] ================== java.lang.NullPointerException: null at org.apache.catalina.core.AsyncContextImpl.setErrorState(AsyncContextImpl.java:411) ~[tomcat-embed-core.jar!/:8.5.16-dev] at org.apache.catalina.connector.CoyoteAdapter.asyncDispatch(CoyoteAdapter.java:176) ~[tomcat-embed-core.jar!/:8.5.16-dev] at org.apache.coyote.AbstractProcessor.dispatch(AbstractProcessor.java:225) [tomcat-embed-core.jar!/:8.5.16-dev] at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:53) [tomcat-embed-core.jar!/:8.5.16-dev] at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:861) [tomcat-embed-core.jar!/:8.5.16-dev] at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1455) [tomcat-embed-core.jar!/:8.5.16-dev] at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49) [tomcat-embed-core.jar!/:8.5.16-dev] at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142) [na:1.8.0_102] at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617) [na:1.8.0_102] at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61) [tomcat-embed-core.jar!/:8.5.16-dev] at java.lang.Thread.run(Thread.java:745) [na:1.8.0_102] Thanks, Violeta > > Mark > > --------------------------------------------------------------------- > To unsubscribe, e-mail: dev-unsubscr...@tomcat.apache.org > For additional commands, e-mail: dev-h...@tomcat.apache.org >