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