Thanks. Will give it a try and let you know the result. Michael
On Mon, Apr 13, 2015 at 4:08 PM, Joakim Erdfelt <[email protected]> wrote: > Can you try again with at least 9.2.9? > > There's been a great deal of work (bug fixes and improvements) in the > state management of Async I/O with that release. > > Note that jetty 9.2.10 is also available. > > Also, more importantly, Jetty 9.2.7 is considered a vulnerable release, > security wise > <https://github.com/eclipse/jetty.project/blob/master/advisories/2015-02-24-httpparser-error-buffer-bleed.md> > . > > > -- > Joakim Erdfelt <[email protected]> > webtide.com <http://www.webtide.com/> - intalio.com/jetty > Expert advice, services and support from from the Jetty & CometD experts > eclipse.org/jetty - cometd.org > > On Mon, Apr 13, 2015 at 4:00 PM, Michael Aaron <[email protected]> > wrote: > >> Hello, >> >> I'm using Async IO feature of Jetty 9 (9.2.7.v20150116). I have some code >> to write a response, whose body is asynchronously generated. >> >> Here is how I got lost. In my code, ServletOutputStream.write() is called >> only if isReady() returns true. However, one of my test (server echoes back >> 1GB request which is also received using AsyncIO) failed for most of times >> due to IllegalStateException. Most likely it's because of "State=UNREADY"; >> very occasionally (I've only seen a few times), it would even fail with >> "State=READY", which makes me even more confused. The even trickier part is >> that if I ran another test before the failed test, it most likely would >> succeed... >> >> Can you enlighten me how what might be wrong?Any hint is appreciated. >> >> Thanks, >> Michael >> >> The code that does the write looks like this (_buffer is populated >> asynchrously, _os is ServletOutputStream): >> >> // To be called at onWritePossible() of WriteListener or when _buffer is >> populated asynchronously (i.e. previously we stopped write because _buffer >> is empty; _os.isReady() might still be true then) >> >> private void synchronized doWrite() throws IOException >> { >> _buffer.flip(); >> byte[] tmpBuf = new byte[4096]; >> while(_os.isReady() && _buffer.hasRemaining()) >> { >> int bytesNum = Math.min(tmpBuf.length, _buffer.remaining()); >> _buffer.get(tmpBuf, 0, bytesNum); >> // this is the only place we write to ServletOutputStream >> _os.write(tmpBuf, 0, bytesNum); >> } >> _buffer.compact(); >> } >> >> =========== Stack trace that failed with UNREADY state ========= >> >> 2015-04-13 14:30:05.665 HttpChannel [WARN] /echo >> java.lang.RuntimeException: >> at >> >> org.example.transport.http.server.AsyncIOResponseHandler.onError(AsyncIOResponseHandler.java:53) >> at org.eclipse.jetty.server.HttpOutput.run(HttpOutput.java:792) >> at >> org.eclipse.jetty.server.handler.ContextHandler.handle(ContextHandler.java:1175) >> at org.eclipse.jetty.server.HttpChannel.handle(HttpChannel.java:365) >> at org.eclipse.jetty.server.HttpChannel.run(HttpChannel.java:261) >> at >> org.eclipse.jetty.util.thread.QueuedThreadPool.runJob(QueuedThreadPool.java:635) >> at >> org.eclipse.jetty.util.thread.QueuedThreadPool$3.run(QueuedThreadPool.java:555) >> at java.lang.Thread.run(Thread.java:745) >> Caused by: java.lang.IllegalStateException: state=UNREADY >> at org.eclipse.jetty.server.HttpOutput.run(HttpOutput.java:822) >> ... 6 more >> >> 2015-04-13 14:30:05.665 SelectorManager [WARN] Could not process key for >> channel java.nio.channels.SocketChannel[connected local=/127.0.0.1:8099 >> remote=/127.0.0.1:58960] >> java.lang.IllegalStateException >> at >> org.eclipse.jetty.server.HttpOutput$AsyncICB.onCompleteSuccess(HttpOutput.java:858) >> at >> org.eclipse.jetty.server.HttpOutput$AsyncWrite.onCompleteSuccess(HttpOutput.java:988) >> at >> org.eclipse.jetty.util.IteratingCallback.processing(IteratingCallback.java:300) >> at >> org.eclipse.jetty.util.IteratingCallback.succeeded(IteratingCallback.java:367) >> at >> org.eclipse.jetty.server.HttpConnection$SendCallback.onCompleteSuccess(HttpConnection.java:716) >> at >> org.eclipse.jetty.util.IteratingCallback.processing(IteratingCallback.java:300 >> at >> org.eclipse.jetty.util.IteratingCallback.succeeded(IteratingCallback.java:367) >> at >> org.eclipse.jetty.io.WriteFlusher$PendingState.complete(WriteFlusher.java:270) >> at org.eclipse.jetty.io.WriteFlusher.completeWrite(WriteFlusher.java:383) >> at >> org.eclipse.jetty.io.SelectChannelEndPoint.onSelected(SelectChannelEndPoint.java:111) >> at >> org.eclipse.jetty.io.SelectorManager$ManagedSelector.processKey(SelectorManager.java:636 >> at >> org.eclipse.jetty.io.SelectorManager$ManagedSelector.select(SelectorManager.java:607) >> at >> org.eclipse.jetty.io.SelectorManager$ManagedSelector.run(SelectorManager.java:545) >> at >> org.eclipse.jetty.util.thread.NonBlockingThread.run(NonBlockingThread.java:52) >> at >> org.eclipse.jetty.util.thread.QueuedThreadPool.runJob(QueuedThreadPool.java:635) >> at >> org.eclipse.jetty.util.thread.QueuedThreadPool$3.run(QueuedThreadPool.java:555) >> at java.lang.Thread.run(Thread.java:745) >> >> >> =========== Stack trace that failed with UNREADY state ========= >> 2015-04-13 14:59:04.825 HttpChannel [WARN] /echo >> java.lang.RuntimeException: >> at >> org.example.transport.http.server.AsyncIOResponseHandler.onError(AsyncIOResponseHandler.java:53) >> at org.eclipse.jetty.server.HttpOutput.run(HttpOutput.java:792) >> at >> org.eclipse.jetty.server.handler.ContextHandler.handle(ContextHandler.java:1175) >> at org.eclipse.jetty.server.HttpChannel.handle(HttpChannel.java:365) >> at org.eclipse.jetty.server.HttpChannel.run(HttpChannel.java:261) >> at >> org.eclipse.jetty.util.thread.QueuedThreadPool.runJob(QueuedThreadPool.java:635) >> at >> org.eclipse.jetty.util.thread.QueuedThreadPool$3.run(QueuedThreadPool.java:555) >> at java.lang.Thread.run(Thread.java:745) >> Caused by: java.lang.IllegalStateException: state=READY >> at org.eclipse.jetty.server.HttpOutput.run(HttpOutput.java:822) >> >> ... 6 more >> >> _______________________________________________ >> jetty-users mailing list >> [email protected] >> To change your delivery options, retrieve your password, or unsubscribe >> from this list, visit >> https://dev.eclipse.org/mailman/listinfo/jetty-users >> > > > _______________________________________________ > jetty-users mailing list > [email protected] > To change your delivery options, retrieve your password, or unsubscribe > from this list, visit > https://dev.eclipse.org/mailman/listinfo/jetty-users >
_______________________________________________ jetty-users mailing list [email protected] To change your delivery options, retrieve your password, or unsubscribe from this list, visit https://dev.eclipse.org/mailman/listinfo/jetty-users
