Easyupload multi upload triggers SocketTimeoutException on reading big file

Hi,

We are using EasyUpload component to support multi files upload. Everthing works great until we encounter SocketTimeoutException the other day. Upon investigation, it seems caused by uploading a large file. e.g. 3GB.

I tested both on Tomcat 8.5.x and 7.0.x versions and it always cause SocketTimeoutException if the upload is performed from Easyupload’s org.vaadin.easyuploads.MultiUpload component instead of com.vaadin.ui.Upload component. Standard Upload component works fine.

To replicate:

  1. Use MultiUpload in one of the layout
  2. Choose a large file (e.g. 3GB) using the file select dialog
  3. After few seconds SocketTimeoutException will be thrown on socket read

I tried to tweak Tomcat’s socket timeout and seems like it had no effect. Is there specific knowledge based on similar issue seems like this affects request performed on XMLHttpRequest. As far as I understand Upload component use form data. Or maybe someone can point out if I used it in wrong way.

I just send this to the forum since I remembered we had issue with uploading file > 2GB and was forced to upgrade to Vaadin 7.2.x . (upgrade is on the schedule, but not now)

Exception

java.net.SocketTimeoutException
	at org.apache.tomcat.util.net.NioBlockingSelector.read(NioBlockingSelector.java:201)
	at org.apache.tomcat.util.net.NioSelectorPool.read(NioSelectorPool.java:235)
	at org.apache.tomcat.util.net.NioSelectorPool.read(NioSelectorPool.java:216)
	at org.apache.tomcat.util.net.NioEndpoint$NioSocketWrapper.fillReadBuffer(NioEndpoint.java:1212)
	at org.apache.tomcat.util.net.NioEndpoint$NioSocketWrapper.read(NioEndpoint.java:1161)
	at org.apache.coyote.http11.Http11InputBuffer.fill(Http11InputBuffer.java:712)
	at org.apache.coyote.http11.Http11InputBuffer.access$300(Http11InputBuffer.java:40)
	at org.apache.coyote.http11.Http11InputBuffer$SocketInputBuffer.doRead(Http11InputBuffer.java:1061)
	at org.apache.coyote.http11.filters.IdentityInputFilter.doRead(IdentityInputFilter.java:139)
	at org.apache.coyote.http11.Http11InputBuffer.doRead(Http11InputBuffer.java:256)
	at org.apache.coyote.Request.doRead(Request.java:540)
	at org.apache.catalina.connector.InputBuffer.realReadBytes(InputBuffer.java:319)
	at org.apache.catalina.connector.InputBuffer.checkByteBufferEof(InputBuffer.java:627)
	at org.apache.catalina.connector.InputBuffer.read(InputBuffer.java:342)
	at org.apache.catalina.connector.CoyoteInputStream.read(CoyoteInputStream.java:152)
	at com.vaadin.server.communication.FileUploadHandler.streamToReceiver(FileUploadHandler.java:558)
	at com.vaadin.server.communication.FileUploadHandler.handleFileUploadValidationAndData(FileUploadHandler.java:447)
	at com.vaadin.server.communication.FileUploadHandler.doHandleXhrFilePost(FileUploadHandler.java:501)
	at com.vaadin.server.communication.FileUploadHandler.handleRequest(FileUploadHandler.java:288)
	at com.vaadin.server.VaadinService.handleRequest(VaadinService.java:1401)
	at com.vaadin.server.VaadinServlet.service(VaadinServlet.java:237)
	at javax.servlet.http.HttpServlet.service(HttpServlet.java:729)

Example to add MultiUpload component

MultiUpload ml = new MultiUpload();
ml.setButtonCaption("Upload");
ml.setHandler(new MultiUploadHandler()
{
    @Override
    public void streamingStarted(StreamVariable.StreamingStartEvent event)
    {
        System.out.println("Streaming started for " + event.getFileName());
    }

    @Override
    public void streamingFinished(StreamVariable.StreamingEndEvent event)
    {
        System.out.println("Streaming finish for " + event.getFileName());
    }

    @Override
    public OutputStream getOutputStream()
    {
        try
        {
            File tmp = File.createTempFile("upl", "tmp");
            return new BufferedOutputStream(new FileOutputStream(tmp));
        }
        catch (Exception e)
        {
            System.err.println("Fail getting output stream");
        }
        return null;
    }

    @Override
    public void streamingFailed(StreamVariable.StreamingErrorEvent event)
    {
        System.out.println("Streaming failed for " + event.getFileName());
    }

    @Override
    public void onProgress(StreamVariable.StreamingProgressEvent event)
    {
        System.out.println("Streaming progress for " + event.getFileName() + event.getBytesReceived()
                + " of " + event.getContentLength());
    }

    @Override
    public void filesQueued(Collection<MultiUpload.FileDetail> pendingFileNames)
    {
    }

    @Override
    public boolean isInterrupted()
    {
        return false;
    }
});

A_LAYOUT.addComponent(ml);

Easyupload version: 7.4.6 (https://vaadin.com/directory/component/easyuploads)
Vaadin version: 7.2.7