Broken Pipe Error

After porting a project to Vaadin 7 I am getting a strange error. It is not systematic, it happens from time to time,
here is the stack trace. Any idea of what can be causing it?

Apparently Vaadin is trying to write something once the connection is closed. Here is the stack trace.


19:41:22,533 ERROR (HibernateSessionRequestFilter.java:62) - Commit error for session D62C447FC3D047D23F9BEC3B9618FF7A
javax.servlet.ServletException: com.vaadin.server.ServiceException: ClientAbortException:  java.net.SocketException: Connection reset
	at com.vaadin.server.VaadinServlet.service(VaadinServlet.java:240)
	at javax.servlet.http.HttpServlet.service(HttpServlet.java:722)
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:305)
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210)
	at net.cbsolution.scc.hbn.HibernateSessionRequestFilter.doFilter(HibernateSessionRequestFilter.java:39)
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:243)
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210)
	at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:225)
	at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:123)
	at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:472)
	at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:168)
	at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:98)
	at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:927)
	at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:118)
	at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:407)
	at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1001)
	at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:585)
	at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:312)
	at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145)
	at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)
	at java.lang.Thread.run(Thread.java:722)
Caused by: com.vaadin.server.ServiceException: ClientAbortException:  java.net.SocketException: Connection reset
	at com.vaadin.server.VaadinService.handleExceptionDuringRequest(VaadinService.java:1410)
	at com.vaadin.server.VaadinService.handleRequest(VaadinService.java:1364)
	at com.vaadin.server.VaadinServlet.service(VaadinServlet.java:238)
	... 20 more
Caused by: ClientAbortException:  java.net.SocketException: Connection reset
	at org.apache.catalina.connector.OutputBuffer.realWriteBytes(OutputBuffer.java:388)
	at org.apache.tomcat.util.buf.ByteChunk.append(ByteChunk.java:371)
	at org.apache.catalina.connector.OutputBuffer.writeBytes(OutputBuffer.java:413)
	at org.apache.catalina.connector.OutputBuffer.write(OutputBuffer.java:401)
	at org.apache.catalina.connector.CoyoteOutputStream.write(CoyoteOutputStream.java:91)
	at com.vaadin.server.DownloadStream.writeResponse(DownloadStream.java:305)
	at com.vaadin.ui.AbstractMedia.handleConnectorRequest(AbstractMedia.java:114)
	at com.vaadin.server.ConnectorResourceHandler.handleRequest(ConnectorResourceHandler.java:83)
	at com.vaadin.server.VaadinService.handleRequest(VaadinService.java:1352)
	... 21 more
Caused by: java.net.SocketException: Connection reset
	at java.net.SocketOutputStream.socketWrite(SocketOutputStream.java:113)
	at java.net.SocketOutputStream.write(SocketOutputStream.java:153)
	at org.apache.coyote.http11.InternalOutputBuffer.realWriteBytes(InternalOutputBuffer.java:215)
	at org.apache.tomcat.util.buf.ByteChunk.flushBuffer(ByteChunk.java:462)
	at org.apache.tomcat.util.buf.ByteChunk.append(ByteChunk.java:366)
	at org.apache.coyote.http11.InternalOutputBuffer$OutputStreamOutputBuffer.doWrite(InternalOutputBuffer.java:240)
	at org.apache.coyote.http11.filters.IdentityOutputFilter.doWrite(IdentityOutputFilter.java:84)
	at org.apache.coyote.http11.AbstractOutputBuffer.doWrite(AbstractOutputBuffer.java:192)
	at org.apache.coyote.Response.doWrite(Response.java:504)
	at org.apache.catalina.connector.OutputBuffer.realWriteBytes(OutputBuffer.java:383)
	... 29 more
19:41:22,534 ERROR (HibernateSessionRequestFilter.java:62) - Commit error for session D62C447FC3D047D23F9BEC3B9618FF7A
javax.servlet.ServletException: com.vaadin.server.ServiceException: ClientAbortException:  java.net.SocketException: Connection reset
	at com.vaadin.server.VaadinServlet.service(VaadinServlet.java:240)
	at javax.servlet.http.HttpServlet.service(HttpServlet.java:722)
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:305)
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210)
	at net.cbsolution.scc.hbn.HibernateSessionRequestFilter.doFilter(HibernateSessionRequestFilter.java:39)
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:243)
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210)
	at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:225)
	at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:123)
	at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:472)
	at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:168)
	at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:98)
	at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:927)
	at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:118)
	at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:407)
	at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1001)
	at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:585)
	at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:312)
	at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145)
	at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)
	at java.lang.Thread.run(Thread.java:722)
Caused by: com.vaadin.server.ServiceException: ClientAbortException:  java.net.SocketException: Connection reset
	at com.vaadin.server.VaadinService.handleExceptionDuringRequest(VaadinService.java:1410)
	at com.vaadin.server.VaadinService.handleRequest(VaadinService.java:1364)
	at com.vaadin.server.VaadinServlet.service(VaadinServlet.java:238)
	... 20 more
Caused by: ClientAbortException:  java.net.SocketException: Connection reset
	at org.apache.catalina.connector.OutputBuffer.realWriteBytes(OutputBuffer.java:388)
	at org.apache.tomcat.util.buf.ByteChunk.flushBuffer(ByteChunk.java:462)
	at org.apache.catalina.connector.OutputBuffer.doFlush(OutputBuffer.java:334)
	at org.apache.catalina.connector.OutputBuffer.flush(OutputBuffer.java:306)
	at org.apache.catalina.connector.CoyoteOutputStream.flush(CoyoteOutputStream.java:101)
	at com.vaadin.server.DownloadStream.writeResponse(DownloadStream.java:310)
	at com.vaadin.ui.AbstractMedia.handleConnectorRequest(AbstractMedia.java:114)
	at com.vaadin.server.ConnectorResourceHandler.handleRequest(ConnectorResourceHandler.java:83)
	at com.vaadin.server.VaadinService.handleRequest(VaadinService.java:1352)
	... 21 more
Caused by: java.net.SocketException: Connection reset
	at java.net.SocketOutputStream.socketWrite(SocketOutputStream.java:113)
	at java.net.SocketOutputStream.write(SocketOutputStream.java:153)
	at org.apache.coyote.http11.InternalOutputBuffer.realWriteBytes(InternalOutputBuffer.java:215)
	at org.apache.tomcat.util.buf.ByteChunk.flushBuffer(ByteChunk.java:462)
	at org.apache.tomcat.util.buf.ByteChunk.append(ByteChunk.java:366)
	at org.apache.coyote.http11.InternalOutputBuffer$OutputStreamOutputBuffer.doWrite(InternalOutputBuffer.java:240)
	at org.apache.coyote.http11.filters.IdentityOutputFilter.doWrite(IdentityOutputFilter.java:84)
	at org.apache.coyote.http11.AbstractOutputBuffer.doWrite(AbstractOutputBuffer.java:192)
	at org.apache.coyote.Response.doWrite(Response.java:504)
	at org.apache.catalina.connector.OutputBuffer.realWriteBytes(OutputBuffer.java:383)
	... 29 more

… Here some additional notes:

  1. Apparently the error occurs only when an output table is large, possibly the browser closed sockets? And only with
    Chrome
    browser.
  2. But if this is the case why this is not ignored: I see the code in Vaadin DefaultErrorHandler:

       if (t instanceof SocketException) {
            // Most likely client browser closed socket
            getLogger().info(
                    "SocketException in CommunicationManager."
                            + " Most likely client (browser) closed socket.");
            return;
        }

And what i still more strange is that I have defined my own error handlers but the message is still thrown by the vaadin error handler.

  1. The application seems to work normally, but the log is cluttered and I get a lot of alerts.

I have identified the offending component: It is a Vaadin Video (I have traced the request):


PATH INFO: /APP/connector/0/258/0/Quotty-SimpleQuotation.mp4

Curiously the above request comes few seconds after the page has already been delivered, thus the connection is closed.

Also seems that the error is NOT handled by my error handler but by Vaadin default error handler, on the other side my error handler works for other kind of errors. Strange too.

Vaadin servlet is called from a filter, but I would not expect that could change things.

I will possibly avoid the problem by removing the video component.

I got the solution. I record it here since can be useful to other developers.

What happens:


  1. chrome sends byte-range requests
    to video URL, differently from Firefox. I Don’t know why it does that since I have not pressed the play button, but probably to start caching the video (and make me spend some bandwith).

  2. I have used a Vaadin file resource to serve the video, this resource does not serve byte range requests.

What I did:

I added a Servlet to support resume and caching and GZIP. I got the code here:

http://balusc.blogspot.com/2009/02/fileservlet-supporting-resume-and.html

And made the .mp4 file served by this servlet (ExternalResource(“/…/myvideo.mp4”, “video/mp4”)).

Now everything works fine.

I created
enhancement request #12313
to consider supporting this directly in VaadinServlet.

Connector resource request handling (such as the video download in this case) currently leaks exceptions to VaadinServlet which handles them by calling VaadinSession’s error handler. So, you can customize it, but it would be more useful to invoke the error handler of the connector itself.
Here’s
a ticket about it.

It is still the same error with Video component (see log). I’ve tested in IE, Mozilla FF, Chrome with Vaadin 7.1.6 and 7.6.1
But this error appears not always, depend on mp4 file (local video file set as FileResource). Some files are ok, some not.
And this Video component does not play AVI files at all without any error output in logs. The same file is played ok if if I just rename avi to mp4.
How is it possible to avoid these errors and make this component usable?
Actually, I need to get remote some users the possibility to play video files located on my server. May be there is another solution without Video component?

Jan 25, 2016 1:22:25 PM com.vaadin.server.DefaultErrorHandler doDefault
SEVERE:
org.apache.catalina.connector.ClientAbortException: java.io.IOException: Broken pipe
        at org.apache.catalina.connector.OutputBuffer.realWriteBytes(OutputBuffer.java:393)
        at org.apache.tomcat.util.buf.ByteChunk.flushBuffer(ByteChunk.java:426)
        at org.apache.catalina.connector.OutputBuffer.doFlush(OutputBuffer.java:342)
        at org.apache.catalina.connector.OutputBuffer.flush(OutputBuffer.java:317)
        at org.apache.catalina.connector.CoyoteOutputStream.flush(CoyoteOutputStream.java:110)
        at com.vaadin.server.DownloadStream.writeResponse(DownloadStream.java:311)
        at com.vaadin.ui.AbstractMedia.handleConnectorRequest(AbstractMedia.java:128)
        at com.vaadin.server.ConnectorResourceHandler.handleRequest(ConnectorResourceHandler.java:90)
        at com.vaadin.server.VaadinService.handleRequest(VaadinService.java:1409)
        at com.vaadin.server.VaadinServlet.service(VaadinServlet.java:364)
        at javax.servlet.http.HttpServlet.service(HttpServlet.java:729)
        at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:291)
        at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
        at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52)
        at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:239)
        at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
        at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:212)
        at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:106)
        at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:502)
        at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:141)
        at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:79)
        at org.apache.catalina.valves.AbstractAccessLogValve.invoke(AbstractAccessLogValve.java:616)
        at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:88)
        at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:521)
        at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1096)
        at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:674)
        at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1500)
        at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.run(NioEndpoint.java:1456)
        at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
        at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
        at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)
        at java.lang.Thread.run(Thread.java:745)
Caused by: java.io.IOException: Broken pipe
        at sun.nio.ch.FileDispatcherImpl.write0(Native Method)
        at sun.nio.ch.SocketDispatcher.write(SocketDispatcher.java:47)
        at sun.nio.ch.IOUtil.writeFromNativeBuffer(IOUtil.java:93)
        at sun.nio.ch.IOUtil.write(IOUtil.java:65)
        at sun.nio.ch.SocketChannelImpl.write(SocketChannelImpl.java:471)
        at org.apache.tomcat.util.net.NioChannel.write(NioChannel.java:124)
        at org.apache.tomcat.util.net.NioBlockingSelector.write(NioBlockingSelector.java:101)
        at org.apache.tomcat.util.net.NioSelectorPool.write(NioSelectorPool.java:172)
        at org.apache.coyote.http11.InternalNioOutputBuffer.writeToSocket(InternalNioOutputBuffer.java:139)
        at org.apache.coyote.http11.InternalNioOutputBuffer.addToBB(InternalNioOutputBuffer.java:197)
        at org.apache.coyote.http11.InternalNioOutputBuffer.access$000(InternalNioOutputBuffer.java:41)
        at org.apache.coyote.http11.InternalNioOutputBuffer$SocketOutputBuffer.doWrite(InternalNioOutputBuffer.java:320)
        at org.apache.coyote.http11.filters.IdentityOutputFilter.doWrite(IdentityOutputFilter.java:84)
        at org.apache.coyote.http11.AbstractOutputBuffer.doWrite(AbstractOutputBuffer.java:256)
        at org.apache.coyote.Response.doWrite(Response.java:501)
        at org.apache.catalina.connector.OutputBuffer.realWriteBytes(OutputBuffer.java:388)
        ... 31 more