diff options
-rw-r--r-- | container-core/abi-spec.json | 3 | ||||
-rw-r--r-- | container-core/src/main/java/com/yahoo/container/jdisc/ThreadedRequestHandler.java | 17 |
2 files changed, 14 insertions, 6 deletions
diff --git a/container-core/abi-spec.json b/container-core/abi-spec.json index 244087e0271..4f0b0f2ff12 100644 --- a/container-core/abi-spec.json +++ b/container-core/abi-spec.json @@ -631,7 +631,8 @@ "protected void <init>(java.util.concurrent.Executor, com.yahoo.jdisc.Metric, boolean)", "public final com.yahoo.jdisc.handler.ContentChannel handleRequest(com.yahoo.jdisc.Request, com.yahoo.jdisc.handler.ResponseHandler)", "public java.time.Duration getTimeout()", - "protected abstract void handleRequest(com.yahoo.jdisc.Request, com.yahoo.jdisc.handler.BufferedContentChannel, com.yahoo.jdisc.handler.ResponseHandler)" + "protected abstract void handleRequest(com.yahoo.jdisc.Request, com.yahoo.jdisc.handler.BufferedContentChannel, com.yahoo.jdisc.handler.ResponseHandler)", + "protected void writeErrorResponseWhenOverloadedWorkerPool(com.yahoo.jdisc.Request, com.yahoo.jdisc.handler.ResponseHandler)" ], "fields": [ "protected final com.yahoo.jdisc.Metric metric" diff --git a/container-core/src/main/java/com/yahoo/container/jdisc/ThreadedRequestHandler.java b/container-core/src/main/java/com/yahoo/container/jdisc/ThreadedRequestHandler.java index c198e0e8b32..0e8865538ee 100644 --- a/container-core/src/main/java/com/yahoo/container/jdisc/ThreadedRequestHandler.java +++ b/container-core/src/main/java/com/yahoo/container/jdisc/ThreadedRequestHandler.java @@ -16,13 +16,11 @@ import com.yahoo.jdisc.handler.ReadableContentChannel; import com.yahoo.jdisc.handler.ResponseDispatch; import com.yahoo.jdisc.handler.ResponseHandler; -import java.util.Objects; -import java.util.logging.Level; - import java.net.URI; import java.time.Duration; import java.util.HashMap; import java.util.Map; +import java.util.Objects; import java.util.concurrent.Executor; import java.util.concurrent.RejectedExecutionException; import java.util.concurrent.TimeUnit; @@ -163,6 +161,14 @@ public abstract class ThreadedRequestHandler extends AbstractRequestHandler { protected abstract void handleRequest(Request request, BufferedContentChannel requestContent, ResponseHandler responseHandler); + /** + * Invoked to write an error response when the worker pool is overloaded. + * A subclass may override this method to define a custom response. + */ + protected void writeErrorResponseOnOverload(Request request, ResponseHandler responseHandler) { + ResponseDispatch.newInstance(Response.Status.SERVICE_UNAVAILABLE).dispatch(responseHandler); + } + private class RequestTask implements ResponseHandler, Runnable { final Request request; @@ -237,14 +243,15 @@ public abstract class ThreadedRequestHandler extends AbstractRequestHandler { } } + /** * Clean up when the task can not be executed because no worker thread is available. */ - public void failOnOverload() { + void failOnOverload() { try (ResourceReference reference = requestReference) { incrementRejectedRequests(); logRejectedRequests(); - ResponseDispatch.newInstance(Response.Status.SERVICE_UNAVAILABLE).dispatch(responseHandler); + writeErrorResponseOnOverload(request, responseHandler); } } } |