diff options
author | Bjørn Christian Seime <bjorncs@verizonmedia.com> | 2021-06-01 15:45:49 +0200 |
---|---|---|
committer | GitHub <noreply@github.com> | 2021-06-01 15:45:49 +0200 |
commit | 6fedaa44713f77bb7a76b9ff3f97c9bd8844a5d8 (patch) | |
tree | a1049d84a81b8ae510063894d727e9151d41deac | |
parent | 057163619aee294eb53681776e23ee6822b5d35b (diff) | |
parent | 252bd2535934f279e069db95756f414b883da562 (diff) |
Merge pull request #18072 from vespa-engine/bjorncs/handle-read-error-doc-v1
Bjorncs/handle read error doc v1
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 { |