summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorBjørn Christian Seime <bjorncs@verizonmedia.com>2021-06-01 15:45:49 +0200
committerGitHub <noreply@github.com>2021-06-01 15:45:49 +0200
commit6fedaa44713f77bb7a76b9ff3f97c9bd8844a5d8 (patch)
treea1049d84a81b8ae510063894d727e9151d41deac
parent057163619aee294eb53681776e23ee6822b5d35b (diff)
parent252bd2535934f279e069db95756f414b883da562 (diff)
Merge pull request #18072 from vespa-engine/bjorncs/handle-read-error-doc-v1
Bjorncs/handle read error doc v1
-rw-r--r--container-core/src/main/java/com/yahoo/jdisc/http/server/jetty/ServletRequestReader.java1
-rw-r--r--jdisc_core/src/main/java/com/yahoo/jdisc/handler/ContentChannel.java11
-rw-r--r--vespaclient-container-plugin/src/main/java/com/yahoo/document/restapi/resource/DocumentV1ApiHandler.java11
3 files changed, 22 insertions, 1 deletions
diff --git a/container-core/src/main/java/com/yahoo/jdisc/http/server/jetty/ServletRequestReader.java b/container-core/src/main/java/com/yahoo/jdisc/http/server/jetty/ServletRequestReader.java
index 26d74bdccb3..e2bf5711e15 100644
--- a/container-core/src/main/java/com/yahoo/jdisc/http/server/jetty/ServletRequestReader.java
+++ b/container-core/src/main/java/com/yahoo/jdisc/http/server/jetty/ServletRequestReader.java
@@ -251,6 +251,7 @@ class ServletRequestReader implements ReadListener {
@Override
public void onError(final Throwable t) {
finishedFuture.completeExceptionally(t);
+ requestContentChannel.onError(t);
doneReading();
}
diff --git a/jdisc_core/src/main/java/com/yahoo/jdisc/handler/ContentChannel.java b/jdisc_core/src/main/java/com/yahoo/jdisc/handler/ContentChannel.java
index a1a4503eff2..b8b2d123a13 100644
--- a/jdisc_core/src/main/java/com/yahoo/jdisc/handler/ContentChannel.java
+++ b/jdisc_core/src/main/java/com/yahoo/jdisc/handler/ContentChannel.java
@@ -47,4 +47,15 @@ public interface ContentChannel {
*/
void close(CompletionHandler handler);
+
+ /**
+ * Invoked when an error occurs during processing of request content. Signals that the caller was
+ * unable to write all data to this ContentChannel.
+ *
+ * This method can be invoked at any time after the content channel is created, but it's never invoked after {@link #close(CompletionHandler)}.
+ * {@link #close(CompletionHandler)} will be invoked immediately after this method returning
+ * (no intermediate calls to #{@link #write(ByteBuffer, CompletionHandler)}).
+ */
+ default void onError(Throwable error) {}
+
}
diff --git a/vespaclient-container-plugin/src/main/java/com/yahoo/document/restapi/resource/DocumentV1ApiHandler.java b/vespaclient-container-plugin/src/main/java/com/yahoo/document/restapi/resource/DocumentV1ApiHandler.java
index 8cb927b8989..58857d1d8e6 100644
--- a/vespaclient-container-plugin/src/main/java/com/yahoo/document/restapi/resource/DocumentV1ApiHandler.java
+++ b/vespaclient-container-plugin/src/main/java/com/yahoo/document/restapi/resource/DocumentV1ApiHandler.java
@@ -832,6 +832,7 @@ public class DocumentV1ApiHandler extends AbstractRequestHandler {
private final ReadableContentChannel delegate = new ReadableContentChannel();
private final Consumer<InputStream> reader;
+ private volatile boolean errorReported = false;
public ForwardingContentChannel(Consumer<InputStream> reader) {
this.reader = reader;
@@ -854,7 +855,9 @@ public class DocumentV1ApiHandler extends AbstractRequestHandler {
public void close(CompletionHandler handler) {
try {
delegate.close(logException);
- reader.accept(new UnsafeContentInputStream(delegate));
+ if (!errorReported) {
+ reader.accept(new UnsafeContentInputStream(delegate));
+ }
handler.completed();
}
catch (Exception e) {
@@ -862,6 +865,12 @@ public class DocumentV1ApiHandler extends AbstractRequestHandler {
}
}
+ @Override
+ public void onError(Throwable error) {
+ // Jdisc will automatically generate an error response in this scenario
+ log.log(FINE, error, () -> "ContentChannel.onError(): " + error.getMessage());
+ errorReported = true;
+ }
}
static class DocumentOperationParser {