diff options
2 files changed, 37 insertions, 60 deletions
diff --git a/container-core/src/main/java/com/yahoo/jdisc/http/server/jetty/AsyncCompleteListener.java b/container-core/src/main/java/com/yahoo/jdisc/http/server/jetty/AsyncCompleteListener.java deleted file mode 100644 index 7dba217e01c..00000000000 --- a/container-core/src/main/java/com/yahoo/jdisc/http/server/jetty/AsyncCompleteListener.java +++ /dev/null @@ -1,22 +0,0 @@ -// Copyright 2017 Yahoo Holdings. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root. -package com.yahoo.jdisc.http.server.jetty; - -import javax.servlet.AsyncEvent; -import javax.servlet.AsyncListener; -import java.io.IOException; - -/** - * Interface for async listeners only interested in onComplete. - * @author Tony Vaagenes - */ -@FunctionalInterface -interface AsyncCompleteListener extends AsyncListener { - @Override - default void onTimeout(AsyncEvent event) throws IOException {} - - @Override - default void onError(AsyncEvent event) throws IOException {} - - @Override - default void onStartAsync(AsyncEvent event) throws IOException {} -} 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 0b7e27b9598..512d78d4537 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 @@ -59,6 +59,8 @@ class HttpRequestDispatch { private final ServletResponseController servletResponseController; private final RequestHandler requestHandler; private final RequestMetricReporter metricReporter; + private final BiConsumer<Void, Throwable> completeRequestCallback; + private final AtomicBoolean completeRequestCalled = new AtomicBoolean(false); public HttpRequestDispatch(JDiscContext jDiscContext, AccessLogEntry accessLogEntry, @@ -80,6 +82,7 @@ class HttpRequestDispatch { this.async = servletRequest.startAsync(); async.setTimeout(0); metricReporter.uriLength(jettyRequest.getOriginalURI().length()); + completeRequestCallback = this::handleCompleteRequestCallback; } public void dispatch() throws IOException { @@ -103,48 +106,44 @@ class HttpRequestDispatch { } } - private final BiConsumer<Void, Throwable> completeRequestCallback; + + private void handleCompleteRequestCallback(Void result, Throwable error) { - AtomicBoolean completeRequestCalled = new AtomicBoolean(false); - HttpRequestDispatch parent = this; //used to avoid binding uninitialized variables - - completeRequestCallback = (result, error) -> { - boolean alreadyCalled = completeRequestCalled.getAndSet(true); - if (alreadyCalled) { - AssertionError e = new AssertionError("completeRequest called more than once"); - log.log(Level.WARNING, "Assertion failed.", e); - throw e; - } + boolean alreadyCalled = completeRequestCalled.getAndSet(true); + if (alreadyCalled) { + AssertionError e = new AssertionError("completeRequest called more than once"); + log.log(Level.WARNING, "Assertion failed.", e); + throw e; + } - boolean reportedError = false; - - if (error != null) { - if (isErrorOfType(error, EofException.class, IOException.class)) { - log.log(Level.FINE, - error, - () -> "Network connection was unexpectedly terminated: " + parent.jettyRequest.getRequestURI()); - parent.metricReporter.prematurelyClosed(); - } else if (isErrorOfType(error, TimeoutException.class)) { - log.log(Level.FINE, - error, - () -> "Request/stream was timed out by Jetty: " + parent.jettyRequest.getRequestURI()); - } else if (!isErrorOfType(error, OverloadException.class, BindingNotFoundException.class, RequestException.class)) { - log.log(Level.WARNING, "Request failed: " + parent.jettyRequest.getRequestURI(), error); - } - reportedError = true; - parent.metricReporter.failedResponse(); - } else { - parent.metricReporter.successfulResponse(); + boolean reportedError = false; + + if (error != null) { + if (isErrorOfType(error, EofException.class, IOException.class)) { + log.log(Level.FINE, + error, + () -> "Network connection was unexpectedly terminated: " + jettyRequest.getRequestURI()); + metricReporter.prematurelyClosed(); + } else if (isErrorOfType(error, TimeoutException.class)) { + log.log(Level.FINE, + error, + () -> "Request/stream was timed out by Jetty: " + jettyRequest.getRequestURI()); + } else if (!isErrorOfType(error, OverloadException.class, BindingNotFoundException.class, RequestException.class)) { + log.log(Level.WARNING, "Request failed: " + jettyRequest.getRequestURI(), error); } + reportedError = true; + metricReporter.failedResponse(); + } else { + metricReporter.successfulResponse(); + } - try { - parent.async.complete(); - log.finest(() -> "Request completed successfully: " + parent.jettyRequest.getRequestURI()); - } catch (Throwable throwable) { - Level level = reportedError ? Level.FINE: Level.WARNING; - log.log(level, "Async.complete failed", throwable); - } - }; + try { + async.complete(); + log.finest(() -> "Request completed successfully: " + jettyRequest.getRequestURI()); + } catch (Throwable throwable) { + Level level = reportedError ? Level.FINE: Level.WARNING; + log.log(level, "Async.complete failed", throwable); + } } private static void shutdownConnectionGracefullyIfThresholdReached(Request request) { |