Ah! I tell a lie, there is! Apologies for not spotting it earlier - sleep deprived with a month old baby ;)
*grovel* Thanks for your help! On Fri, Nov 11, 2011 at 9:57 PM, Matthew Painter <[email protected] > wrote: > Hi Jan, > > No, there's no synchronization on the continuation object in my code. > > I have been able to make it work by increasing the response buffer size, > so it is definitely linked - however this is clearly not a production fix :) > > Let me know if I can provide any further information. > > Thanks > > Matt > > > > > On Fri, Nov 11, 2011 at 9:44 PM, Jan Bartel <[email protected]> wrote: > >> Matthew, >> >> Does your code synchronize on the Continuation object at all? If so, >> don't use it >> as the gate for concurrent access, but rather an application object >> (see a thread >> on this list entitled "Asynchronous servlets - thread >> safety/synchronization & reusing objects"). >> >> If your code does not synchronize on the Continuation, then I'll dig >> further into the >> code, but on a pretty quick inspection (admittedly of trunk, not 7.5.1), I >> couldn't see where Thread-111 would lock the AsyncContinuation, hence >> my question. >> >> cheers >> Jan >> >> On 12 November 2011 05:10, Matthew Painter <[email protected]> >> wrote: >> > Sorry for the multiple emails :) >> > >> > It is a deadlock between the Selector thread, which >> owns SSLChannelEndpoint >> > and is waiting on AsyncContinuation, and the thread writing to the >> output >> > stream, which is waiting on SSLChannelEndpoint and owns >> AsyncContination. >> > Details below. All help appreciated - even if just to tell me to open a >> bug >> > report :) >> > Thanks >> > Matt >> > Thread [pool-1-thread-5 Selector0] (Suspended) >> > owns: SslSelectChannelEndPoint (id=338) >> > waiting for: AsyncContinuation (id=8895) >> > AsyncContinuation.isSuspended() line: 173 >> > >> SelectChannelConnector$SelectChannelHttpConnection(HttpConnection).isSuspended() >> > line: 653 >> > SslSelectChannelEndPoint(SelectChannelEndPoint).isReadyForDispatch() >> line: >> > 316 >> > SslSelectChannelEndPoint(SelectChannelEndPoint).schedule() line: 164 >> > SelectorManager$SelectSet.doSelect() line: 607 >> > SelectorManager$1.run() line: 283 >> > ThreadPoolExecutor.runWorker(ThreadPoolExecutor$Worker) line: 1110 >> > ThreadPoolExecutor$Worker.run() line: 603 >> > Thread.run() line: 722 >> > >> > Daemon Thread [Thread-111] (Suspended) >> > owns: AsyncContinuation (id=8895) >> > waiting for: SslSelectChannelEndPoint (id=338) >> > owned by: Thread [pool-1-thread-5 Selector0] (Suspended) >> > SslSelectChannelEndPoint(SelectChannelEndPoint).blockWritable(long) >> line: >> > 371 >> > HttpGenerator(AbstractGenerator).blockForOutput(long) line: 530 >> > HttpConnection$Output(HttpOutput).write(Buffer) line: 154 >> > HttpConnection$Output(HttpOutput).write(byte[], int, int) line: 96 >> > Utf8Generator._flushBuffer() line: 1437 >> > Utf8Generator.writeString(String) line: 465 >> > StdSerializers$StringSerializer.serialize(String, JsonGenerator, >> > SerializerProvider) line: 123 >> > StdSerializers$StringSerializer.serialize(Object, JsonGenerator, >> > SerializerProvider) line: 113 >> > MapSerializer.serializeFields(Map<?,?>, JsonGenerator, >> SerializerProvider) >> > line: 257 >> > MapSerializer.serialize(Map<?,?>, JsonGenerator, SerializerProvider) >> line: >> > 177 >> > MapSerializer.serialize(Object, JsonGenerator, SerializerProvider) >> line: 22 >> > BeanPropertyWriter.serializeAsField(Object, JsonGenerator, >> > SerializerProvider) line: 428 >> > BeanSerializer.serializeFields(Object, JsonGenerator, >> SerializerProvider) >> > line: 245 >> > BeanSerializer.serialize(Object, JsonGenerator, SerializerProvider) >> line: >> > 212 >> > ContainerSerializers$IndexedListSerializer.serializeContents(List<?>, >> > JsonGenerator, SerializerProvider) line: 291 >> > ContainerSerializers$IndexedListSerializer.serializeContents(Object, >> > JsonGenerator, SerializerProvider) line: 242 >> > >> ContainerSerializers$IndexedListSerializer(ContainerSerializers$AsArraySerializer<T>).serialize(T, >> > JsonGenerator, SerializerProvider) line: 130 >> > BeanPropertyWriter.serializeAsField(Object, JsonGenerator, >> > SerializerProvider) line: 428 >> > BeanSerializer.serializeFields(Object, JsonGenerator, >> SerializerProvider) >> > line: 245 >> > BeanSerializer.serialize(Object, JsonGenerator, SerializerProvider) >> line: >> > 212 >> > StdSerializerProvider._serializeValue(JsonGenerator, Object) line: 587 >> > StdSerializerProvider.serializeValue(SerializationConfig, JsonGenerator, >> > Object, SerializerFactory) line: 245 >> > >> JsonUtils$MyObjectMapper(ObjectMapper)._configAndWriteValue(JsonGenerator, >> > Object) line: 1993 >> > JsonUtils$MyObjectMapper(ObjectMapper).writeValue(OutputStream, Object) >> > line: 1563 >> > JsonUtils.toJson(Object, OutputStream) line: 340 >> > SearchServlet.writeResponse(ServletResponse, Object) line: 601 >> > SearchServlet.access$2(SearchServlet, ServletResponse, Object) line: 598 >> > SearchServlet$3.hasFinished(PartialSearchContinuation) line: 392 >> > SearchServlet$3.run() line: 414 >> > ThreadPoolExecutor.runWorker(ThreadPoolExecutor$Worker) line: 1110 >> > ThreadPoolExecutor$Worker.run() line: 603 >> > Thread.run() line: 722 >> > >> > On Fri, Nov 11, 2011 at 5:37 PM, Matthew Painter >> > <[email protected]> wrote: >> >> >> >> It would seem similar to this: >> >> >> >> >> http://www.servlets.com/archive/servlet/ReadMsg?msgId=559312&listName=jetty-support >> >> Although this was said to be fixed. >> >> >> >> >> >> On Fri, Nov 11, 2011 at 5:23 PM, Matthew Painter >> >> <[email protected]> wrote: >> >>> >> >>> Hi all, >> >>> I wonder if any of you bright sparks can shed some light on this >> problem >> >>> with Jetty 7.5.1? >> >>> I have a response that is bigger than the standard servlet buffer size >> >>> (32,768). >> >>> I am using the continuation suspend/complete pattern. >> >>> When writing to the response outputstream, 32768 bytes are written to >> the >> >>> client, and then the thread hangs forever on >> >>> SelectChannelEndpoint.blockWritable() - maybe deadlocked? >> >>> This is a huge issue for us, as it brings down the server as threads >> get >> >>> deadlocked. >> >>> Any information would be great - I can see a few similar bugs have >> been >> >>> raised, but none quite the same. >> >>> Thanks :) >> >>> Daemon Thread [Thread-111] (Suspended) >> >>> Object.wait(long) line: not available [native method] >> >>> SelectChannelEndPoint.blockWritable(long) line: 384 >> >>> HttpGenerator(AbstractGenerator).blockForOutput(long) line: 530 >> >>> HttpGenerator(AbstractGenerator).flush(long) line: 456 >> >>> HttpConnection$Output(HttpOutput).flush() line: 89 >> >>> HttpConnection$Output.flush() line: 995 >> >>> HttpConnection$Output(HttpOutput).write(Buffer) line: 172 >> >>> HttpConnection$Output(HttpOutput).write(byte[], int, int) line: 96 >> >>> Utf8Generator._flushBuffer() line: 1437 >> >>> Utf8Generator.writeString(String) line: 465 >> >>> StdSerializers$StringSerializer.serialize(String, JsonGenerator, >> >>> SerializerProvider) line: 123 >> >>> StdSerializers$StringSerializer.serialize(Object, JsonGenerator, >> >>> SerializerProvider) line: 113 >> >>> MapSerializer.serializeFields(Map<?,?>, JsonGenerator, >> >>> SerializerProvider) line: 257 >> >>> MapSerializer.serialize(Map<?,?>, JsonGenerator, SerializerProvider) >> >>> line: 177 >> >>> MapSerializer.serialize(Object, JsonGenerator, SerializerProvider) >> line: >> >>> 22 >> >>> ContainerSerializers$IndexedListSerializer.serializeContents(List<?>, >> >>> JsonGenerator, SerializerProvider) line: 291 >> >>> ContainerSerializers$IndexedListSerializer.serializeContents(Object, >> >>> JsonGenerator, SerializerProvider) line: 242 >> >>> >> >>> >> ContainerSerializers$IndexedListSerializer(ContainerSerializers$AsArraySerializer<T>).serialize(T, >> >>> JsonGenerator, SerializerProvider) line: 130 >> >>> MapSerializer.serializeFields(Map<?,?>, JsonGenerator, >> >>> SerializerProvider) line: 257 >> >>> MapSerializer.serialize(Map<?,?>, JsonGenerator, SerializerProvider) >> >>> line: 177 >> >>> MapSerializer.serialize(Object, JsonGenerator, SerializerProvider) >> line: >> >>> 22 >> >>> MapSerializer.serializeFields(Map<?,?>, JsonGenerator, >> >>> SerializerProvider) line: 257 >> >>> MapSerializer.serialize(Map<?,?>, JsonGenerator, SerializerProvider) >> >>> line: 177 >> >>> MapSerializer.serialize(Object, JsonGenerator, SerializerProvider) >> line: >> >>> 22 >> >>> MapSerializer.serializeFields(Map<?,?>, JsonGenerator, >> >>> SerializerProvider) line: 257 >> >>> MapSerializer.serialize(Map<?,?>, JsonGenerator, SerializerProvider) >> >>> line: 177 >> >>> MapSerializer.serialize(Object, JsonGenerator, SerializerProvider) >> line: >> >>> 22 >> >>> ContainerSerializers$IndexedListSerializer.serializeContents(List<?>, >> >>> JsonGenerator, SerializerProvider) line: 291 >> >>> ContainerSerializers$IndexedListSerializer.serializeContents(Object, >> >>> JsonGenerator, SerializerProvider) line: 242 >> >>> >> >>> >> ContainerSerializers$IndexedListSerializer(ContainerSerializers$AsArraySerializer<T>).serialize(T, >> >>> JsonGenerator, SerializerProvider) line: 130 >> >>> BeanPropertyWriter.serializeAsField(Object, JsonGenerator, >> >>> SerializerProvider) line: 428 >> >>> BeanSerializer.serializeFields(Object, JsonGenerator, >> SerializerProvider) >> >>> line: 245 >> >>> BeanSerializer.serialize(Object, JsonGenerator, SerializerProvider) >> line: >> >>> 212 >> >>> StdSerializerProvider._serializeValue(JsonGenerator, Object) line: 587 >> >>> StdSerializerProvider.serializeValue(SerializationConfig, >> JsonGenerator, >> >>> Object, SerializerFactory) line: 245 >> >>> ObjectMapper(ObjectMapper)._configAndWriteValue(JsonGenerator, Object) >> >>> line: 1993 >> >>> ObjectMapper(ObjectMapper).writeValue(OutputStream, Object) line: 1563 >> >>> ... >> >>> >> >>> >> >> >> > >> > >> > _______________________________________________ >> > jetty-users mailing list >> > [email protected] >> > https://dev.eclipse.org/mailman/listinfo/jetty-users >> > >> > >> _______________________________________________ >> jetty-users mailing list >> [email protected] >> https://dev.eclipse.org/mailman/listinfo/jetty-users >> > >
_______________________________________________ jetty-users mailing list [email protected] https://dev.eclipse.org/mailman/listinfo/jetty-users
