diff options
author | Bjørn Christian Seime <bjorncs@yahooinc.com> | 2023-06-08 14:55:32 +0200 |
---|---|---|
committer | Bjørn Christian Seime <bjorncs@yahooinc.com> | 2023-06-08 14:55:32 +0200 |
commit | 6d2740288679db4c6310dada934cceef31590e31 (patch) | |
tree | d967111398f2567f5f9ee50db92501978b9fcad5 | |
parent | c3d8c532e0f5b1db896d8693409098e8c2980da1 (diff) |
Add workaround for stale requests
2 files changed, 15 insertions, 4 deletions
diff --git a/container-core/src/main/java/com/yahoo/jdisc/http/server/jetty/HttpRequestDispatch.java b/container-core/src/main/java/com/yahoo/jdisc/http/server/jetty/HttpRequestDispatch.java index b92a723fac8..6fdcc96bdc9 100644 --- a/container-core/src/main/java/com/yahoo/jdisc/http/server/jetty/HttpRequestDispatch.java +++ b/container-core/src/main/java/com/yahoo/jdisc/http/server/jetty/HttpRequestDispatch.java @@ -85,13 +85,13 @@ class HttpRequestDispatch { return; } - servletRequestReader.finishedFuture().whenComplete((__, t) -> { + var readCompleted = servletRequestReader.finishedFuture().whenComplete((__, t) -> { if (t != null) servletResponseController.trySendErrorResponse(t); }); - servletResponseController.finishedFuture().whenComplete((__, t) -> { + var writeCompleted = servletResponseController.finishedFuture().whenComplete((__, t) -> { if (t != null) servletRequestReader.fail(t); }); - CompletableFuture.allOf(servletRequestReader.finishedFuture(), servletResponseController.finishedFuture()) + CompletableFuture.allOf(readCompleted, writeCompleted) .whenComplete((r, t) -> { if (t != null) requestCompletion.completeExceptionally(t); else requestCompletion.complete(null); diff --git a/container-core/src/main/java/com/yahoo/jdisc/http/server/jetty/ServletOutputStreamWriter.java b/container-core/src/main/java/com/yahoo/jdisc/http/server/jetty/ServletOutputStreamWriter.java index d853282a5f5..97aea01b6ab 100644 --- a/container-core/src/main/java/com/yahoo/jdisc/http/server/jetty/ServletOutputStreamWriter.java +++ b/container-core/src/main/java/com/yahoo/jdisc/http/server/jetty/ServletOutputStreamWriter.java @@ -4,6 +4,9 @@ package com.yahoo.jdisc.http.server.jetty; import com.yahoo.jdisc.handler.CompletionHandler; import jakarta.servlet.ServletOutputStream; import jakarta.servlet.WriteListener; +import org.eclipse.jetty.http2.server.HTTP2ServerConnection; +import org.eclipse.jetty.http2.server.HTTP2ServerSession; +import org.eclipse.jetty.server.HttpOutput; import java.io.IOException; import java.nio.ByteBuffer; @@ -87,7 +90,15 @@ class ServletOutputStreamWriter { switch (state) { case NOT_STARTED: try { - outputStream.setWriteListener(writeListener); + // Experimental workaround for write listener not being invoked when the connection is closed + if (outputStream instanceof HttpOutput out + && out.getHttpChannel().getConnection() instanceof HTTP2ServerConnection conn + && conn.getSession() instanceof HTTP2ServerSession session + && (session.isStopping() || session.isStopped())) { + throw new IOException("HTTP/2 session has stopped"); + } else { + outputStream.setWriteListener(writeListener); + } state = State.WAITING_FOR_WRITE_POSSIBLE_CALLBACK; } catch (Throwable t) { registrationFailure = t; |