summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorHenning Baldersheim <balder@yahoo-inc.com>2021-11-16 17:11:38 +0100
committerGitHub <noreply@github.com>2021-11-16 17:11:38 +0100
commitd15f16f7aec9a7478a67331b25d2557ba0a3ea53 (patch)
treeb77e4c0968d885bdc03d07da21488d4057435851
parent64eeebf13aac84641830bbda59f039411bcda495 (diff)
parent42158d9232b293c7315583b2633c55d2a914069f (diff)
Merge pull request #20048 from vespa-engine/bjorncs/write-listener-exception
Fail response writing if unable to register listener
-rw-r--r--container-core/src/main/java/com/yahoo/jdisc/http/server/jetty/ServletOutputStreamWriter.java12
1 files changed, 10 insertions, 2 deletions
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 44daec42b88..4b66715fcf7 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
@@ -76,6 +76,7 @@ class ServletOutputStreamWriter {
void writeBuffer(ByteBuffer buf, CompletionHandler handler) {
boolean thisThreadShouldWrite = false;
+ Throwable registrationFailure = null;
synchronized (monitor) {
if (state == State.FINISHED_OR_ERROR) {
@@ -85,8 +86,12 @@ class ServletOutputStreamWriter {
responseContentQueue.addLast(new ResponseContentPart(buf, handler));
switch (state) {
case NOT_STARTED:
- state = State.WAITING_FOR_WRITE_POSSIBLE_CALLBACK;
- outputStream.setWriteListener(writeListener);
+ try {
+ outputStream.setWriteListener(writeListener);
+ state = State.WAITING_FOR_WRITE_POSSIBLE_CALLBACK;
+ } catch (Throwable t) {
+ registrationFailure = t;
+ }
break;
case WAITING_FOR_WRITE_POSSIBLE_CALLBACK:
case WRITING_BUFFERS:
@@ -99,6 +104,9 @@ class ServletOutputStreamWriter {
throw new IllegalStateException("Invalid state " + state);
}
}
+ if (registrationFailure != null) {
+ setFinished(registrationFailure);
+ }
if (thisThreadShouldWrite) {
writeBuffersInQueueToOutputStream();