https://bz.apache.org/bugzilla/show_bug.cgi?id=62635

            Bug ID: 62635
           Summary: Async servlet over HTTP/2 response.flushBuffer()
                    intermittently fails
           Product: Tomcat 9
           Version: 9.0.x
          Hardware: PC
                OS: Linux
            Status: NEW
          Severity: normal
          Priority: P2
         Component: Servlet
          Assignee: dev@tomcat.apache.org
          Reporter: zdap...@google.com
  Target Milestone: -----

Sorry to bug you again. Now we were almost there, just had some failures
occasionally.

Test case:

import java.io.IOException;
import javax.servlet.AsyncContext;
import javax.servlet.ServletOutputStream;
import javax.servlet.WriteListener;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

@WebServlet(urlPatterns = {"/asyncflush"}, asyncSupported = true)
public class AsyncFlush extends HttpServlet {
  @Override
  protected void doGet(HttpServletRequest request, HttpServletResponse
response)
      throws IOException {
    final AsyncContext asyncContext = request.startAsync();

    response.setStatus(HttpServletResponse.SC_OK);
    response.setContentType("application/binary");

    final ServletOutputStream output = response.getOutputStream();
    output.setWriteListener(new WriteListener() {
      int j;
      byte[] bytes = new byte[1000];
      int expectedBytesSentOut;

      @Override
      public void onWritePossible() throws IOException {
        System.out.println("onWritePossible called");
        if (j > 2000) {
          System.out.println("complete");
          System.out.println("expected bytes sent out: " +
expectedBytesSentOut);
          asyncContext.complete();
          return;
        }

        while(output.isReady()) {
          if (j % 5 == 4) {
            System.out.println("start flush, j = " + j);
            response.flushBuffer();
            System.out.println("end flush, j = " + j);
          } else {
            System.out.println("start write, j = " + j);
            output.write(bytes);
            expectedBytesSentOut += 1000;
            System.out.println("end write, j = " + j);
          }
          j++;
        }

        System.out.println("output.isReady() = " + false);
      }

      @Override
      public void onError(Throwable t) {
        t.printStackTrace();
      }
    });
  }
}


Run the client command:
$ nghttp "http://0.0.0.0:8080/asyncflush"; -v


The flush operation hangs up.

-- 
You are receiving this mail because:
You are the assignee for the bug.
---------------------------------------------------------------------
To unsubscribe, e-mail: dev-unsubscr...@tomcat.apache.org
For additional commands, e-mail: dev-h...@tomcat.apache.org

Reply via email to