Hi,

after commenting out those IOUtils.closeQuietly the problem is not showing
up (probably not 100% correct - should close the InputStream in getData in
case of ByteArrayInputStream).
I am trying to stress the server with some requests (hundreds), but I am
not getting any exception yet.

regards
Andrea

2013/1/21 Andrea Di Menna <[email protected]>

> Hi Rupert,
>
> I have been trying to debug the problem a bit.
> From what I can see the servlet container is recycling the InputStream
> between requests.
> To me the problem is in the StreamSource#finalize method and in the
> StreamSource#getData method.
> I don't think the stream should be closed since this is a reference to the
> InputStream provided by the servlet container in ContentItemReader.
>
> As per the MessageBodyReader#readFrom contract:
>
> entityStream - the InputStream of the HTTP entity. The caller is
> responsible for ensuring that the input stream ends when the entity has
> been consumed. The implementation should not close the input stream.
>
> When the JVM triggers a GC for an old StreamSource object the InputStream
> is closed while it is potentially used in another StreamSource object.
>
> What do you think?
>
> Regards
> Andrea
>
> 2013/1/21 Rupert Westenthaler <[email protected]>
>
>> Hi,
>>
>> Same here. I only got those when running Stanbol in Tomcat7 (together
>> with the LMF [1] in my case). Never had such exception when running
>> the standalone version that uses Jetty (even with the bugs mentioned
>> above). However I was never able to reproduce this with curl. But if
>> this is possible it would be great (for debugging). Maybe a Bug in
>> Jersey with very short  texts? I will need to try this myself.
>>
>> best
>> Rupert
>>
>> On Mon, Jan 21, 2013 at 12:48 PM, Andrea Di Menna <[email protected]>
>> wrote:
>> > Hi Rupert,
>> >
>> > thank you very much for your response.
>> >
>> > The problem is I am also able to reproduce the error using curl.
>> > Usually some of those requests fail and then some succeed.
>> >
>> > Have you ever reproduced this with Jetty using curl, i.e. not using any
>> > intermediate client?
>> >
>> >> curl -X POST -H "Content-type: text/plain" --data "Paris "
>> > http://localhost:8080/stanbol/enhancer/chain/dbpedia-keyword
>> >
>> > <html><head><title>Apache Tomcat/7.0.21 - Error
>> report</title><style><!--H1
>> >
>> {font-family:Tahoma,Arial,sans-serif;color:white;background-color:#525D76;font-size:22px;}
>> > H2
>> >
>> {font-family:Tahoma,Arial,sans-serif;color:white;background-color:#525D76;font-size:16px;}
>> > H3
>> >
>> {font-family:Tahoma,Arial,sans-serif;color:white;background-color:#525D76;font-size:14px;}
>> > BODY
>> >
>> {font-family:Tahoma,Arial,sans-serif;color:black;background-color:white;} B
>> >
>> {font-family:Tahoma,Arial,sans-serif;color:white;background-color:#525D76;}
>> > P
>> >
>> {font-family:Tahoma,Arial,sans-serif;background:white;color:black;font-size:12px;}A
>> > {color : black;}A.name {color : black;}HR {color : #525D76;}--></style>
>> > </head><body><h1>HTTP Status 500 - </h1><HR size="1"
>> > noshade="noshade"><p><b>type</b> Exception report</p><p><b>message</b>
>> > <u></u></p><p><b>description</b> <u>The server encountered an internal
>> > error () that prevented it from fulfilling this
>> > request.</u></p><p><b>exception</b> <pre>javax.servlet.ServletException:
>> > java.io.IOException: Stream closed
>> >
>> com.sun.jersey.spi.container.servlet.WebComponent.service(WebComponent.java:418)
>> >
>> com.sun.jersey.spi.container.servlet.ServletContainer.service(ServletContainer.java:537)
>> >
>> com.sun.jersey.spi.container.servlet.ServletContainer.service(ServletContainer.java:708)
>> > javax.servlet.http.HttpServlet.service(HttpServlet.java:722)
>> >
>> org.apache.felix.http.base.internal.handler.ServletHandler.doHandle(ServletHandler.java:96)
>> >
>> org.apache.felix.http.base.internal.handler.ServletHandler.handle(ServletHandler.java:79)
>> >
>> org.apache.felix.http.base.internal.dispatch.ServletPipeline.handle(ServletPipeline.java:42)
>> >
>> org.apache.felix.http.base.internal.dispatch.InvocationFilterChain.doFilter(InvocationFilterChain.java:49)
>> >
>> org.apache.felix.http.base.internal.dispatch.HttpFilterChain.doFilter(HttpFilterChain.java:33)
>> >
>> org.apache.stanbol.commons.security.auth.AuthenticatingFilter$1.run(AuthenticatingFilter.java:159)
>> > java.security.AccessController.doPrivileged(Native Method)
>> > javax.security.auth.Subject.doAsPrivileged(Subject.java:536)
>> >
>> org.apache.stanbol.commons.security.auth.AuthenticatingFilter.doFilter(AuthenticatingFilter.java:155)
>> >
>> org.apache.felix.http.base.internal.handler.FilterHandler.doHandle(FilterHandler.java:88)
>> >
>> org.apache.felix.http.base.internal.handler.FilterHandler.handle(FilterHandler.java:76)
>> >
>> org.apache.felix.http.base.internal.dispatch.InvocationFilterChain.doFilter(InvocationFilterChain.java:47)
>> >
>> org.apache.felix.http.base.internal.dispatch.HttpFilterChain.doFilter(HttpFilterChain.java:33)
>> >
>> org.apache.stanbol.commons.httpqueryheaders.impl.QueryHeadersFilter.doFilter(QueryHeadersFilter.java:75)
>> >
>> org.apache.felix.http.base.internal.handler.FilterHandler.doHandle(FilterHandler.java:88)
>> >
>> org.apache.felix.http.base.internal.handler.FilterHandler.handle(FilterHandler.java:76)
>> >
>> org.apache.felix.http.base.internal.dispatch.InvocationFilterChain.doFilter(InvocationFilterChain.java:47)
>> >
>> org.apache.felix.http.base.internal.dispatch.HttpFilterChain.doFilter(HttpFilterChain.java:33)
>> >
>> org.apache.felix.http.base.internal.handler.FilterHandler.handle(FilterHandler.java:78)
>> >
>> org.apache.felix.http.base.internal.dispatch.InvocationFilterChain.doFilter(InvocationFilterChain.java:47)
>> >
>> org.apache.felix.http.base.internal.dispatch.HttpFilterChain.doFilter(HttpFilterChain.java:33)
>> >
>> org.apache.felix.http.base.internal.dispatch.FilterPipeline.dispatch(FilterPipeline.java:48)
>> >
>> org.apache.felix.http.base.internal.dispatch.Dispatcher.dispatch(Dispatcher.java:39)
>> >
>> org.apache.felix.http.base.internal.DispatcherServlet.service(DispatcherServlet.java:67)
>> > javax.servlet.http.HttpServlet.service(HttpServlet.java:722)
>> > org.apache.felix.http.proxy.ProxyServlet.service(ProxyServlet.java:60)
>> > javax.servlet.http.HttpServlet.service(HttpServlet.java:722)
>> >
>> org.apache.sling.launchpad.base.webapp.SlingServletDelegate.service(SlingServletDelegate.java:278)
>> >
>> org.apache.sling.launchpad.webapp.SlingServlet.service(SlingServlet.java:174)
>> > </pre></p><p><b>root cause</b> <pre>java.io.IOException: Stream closed
>> > org.apache.catalina.connector.InputBuffer.read(InputBuffer.java:308)
>> >
>> org.apache.catalina.connector.CoyoteInputStream.read(CoyoteInputStream.java:169)
>> > org.apache.commons.io.IOUtils.copyLarge(IOUtils.java:1025)
>> > org.apache.commons.io.IOUtils.copy(IOUtils.java:999)
>> > org.apache.commons.io.IOUtils.toByteArray(IOUtils.java:218)
>> >
>> org.apache.stanbol.enhancer.servicesapi.impl.StreamSource.getData(StreamSource.java:136)
>> >
>> org.apache.stanbol.enhancer.contentitem.inmemory.InMemoryContentItemFactory.createBlob(InMemoryContentItemFactory.java:80)
>> >
>> org.apache.stanbol.enhancer.servicesapi.impl.AbstractContentItemFactory.createContentItem(AbstractContentItemFactory.java:121)
>> >
>> org.apache.stanbol.enhancer.servicesapi.impl.AbstractContentItemFactory.createContentItem(AbstractContentItemFactory.java:90)
>> >
>> org.apache.stanbol.enhancer.jersey.reader.ContentItemReader.readFrom(ContentItemReader.java:261)
>> >
>> org.apache.stanbol.enhancer.jersey.reader.ContentItemReader.readFrom(ContentItemReader.java:69)
>> >
>> com.sun.jersey.spi.container.ContainerRequest.getEntity(ContainerRequest.java:474)
>> >
>> >
>> > 2013/1/21 Rupert Westenthaler <[email protected]>
>> >
>> >> Hi,
>> >>
>> >> I think the stacktrace originates from an Stanbol Enhancer request. I
>> >> know this trace very well, as I have seen it several times. However in
>> >> all those cases the exceptions where caused by problems with the
>> >> client side application. Once this was caused by bad Exception
>> >> Handling on the client side causing the Apache HttpClient to re-use
>> >> still referenced connections of the ConnectionPool. An other time it
>> >> was because of wrong "Content-Length" header information causing the
>> >> server to close the stream early (e.g. if the Bytes written by
>> >> Charset1 are not the one sent by the client because he uses Charset2).
>> >> In addition such exceptions might also happen if the client simple
>> >> cancels the request before all data where sent.
>> >>
>> >> This does not mean that there is no problem with Stanbol, but it is
>> >> very unlikely, as the only think that Stanbol does up to the point
>> >> where the Exception is thrown is to call 'IOUtils.toByteArray(in)' on
>> >> the InputStream prased by the JAX-RS MessageBodyReader#readFrom(..)
>> >> method.
>> >>
>> >> best
>> >> Rupert
>> >>
>> >>
>> >> On Mon, Jan 21, 2013 at 11:52 AM, Andrea Di Menna <[email protected]>
>> >> wrote:
>> >> > Hi all,
>> >> >
>> >> > I have an issue with the enhancer engine on Tomcat7.
>> >> > Trying to access a dbpedia entityhub I randomly get error 500 from a
>> >> > Stanbol instance.
>> >> >
>> >> > The tomcat7 error log reports:
>> >> >
>> >> > java.io.IOException: Stream closed
>> >> > at
>> org.apache.catalina.connector.InputBuffer.read(InputBuffer.java:308)
>> >> > at
>> >> >
>> >>
>> org.apache.catalina.connector.CoyoteInputStream.read(CoyoteInputStream.java:169)
>> >> > at org.apache.commons.io.IOUtils.copyLarge(IOUtils.java:1025)
>> >> > at org.apache.commons.io.IOUtils.copy(IOUtils.java:999)
>> >> > at org.apache.commons.io.IOUtils.toByteArray(IOUtils.java:218)
>> >> > at
>> >> >
>> >>
>> org.apache.stanbol.enhancer.servicesapi.impl.StreamSource.getData(StreamSource.java:136)
>> >> > at
>> >> >
>> >>
>> org.apache.stanbol.enhancer.contentitem.inmemory.InMemoryContentItemFactory.createBlob(InMemoryContentItemFactory.java:80)
>> >> > at
>> >> >
>> >>
>> org.apache.stanbol.enhancer.servicesapi.impl.AbstractContentItemFactory.createContentItem(AbstractContentItemFactory.java:121)
>> >> > at
>> >> >
>> >>
>> org.apache.stanbol.enhancer.servicesapi.impl.AbstractContentItemFactory.createContentItem(AbstractContentItemFactory.java:90)
>> >> > at
>> >> >
>> >>
>> org.apache.stanbol.enhancer.jersey.reader.ContentItemReader.readFrom(ContentItemReader.java:261)
>> >> > at
>> >> >
>> >>
>> org.apache.stanbol.enhancer.jersey.reader.ContentItemReader.readFrom(ContentItemReader.java:69)
>> >> > at
>> >> >
>> >>
>> com.sun.jersey.spi.container.ContainerRequest.getEntity(ContainerRequest.java:474)
>> >> >
>> >> > It looks like the InputStream gets closed when Stanbol is trying to
>> >> create
>> >> > the ContentItem from the request.
>> >> > The input text is a very short string.
>> >> >
>> >> > My feeling is that the request's InputStream is closed when the
>> >> > ContentItemFactory is reading it.
>> >> >
>> >> > Any suggestion?
>> >> >
>> >> > Regards
>> >> > Andrea
>> >>
>> >>
>> >>
>> >> --
>> >> | Rupert Westenthaler             [email protected]
>> >> | Bodenlehenstraße 11                             ++43-699-11108907
>> >> | A-5500 Bischofshofen
>> >>
>>
>>
>>
>> --
>> | Rupert Westenthaler             [email protected]
>> | Bodenlehenstraße 11                             ++43-699-11108907
>> | A-5500 Bischofshofen
>>
>
>

Reply via email to