summaryrefslogtreecommitdiffstats
path: root/container-core
diff options
context:
space:
mode:
authorBjørn Christian Seime <bjorncs@verizonmedia.com>2020-09-21 14:53:47 +0200
committerBjørn Christian Seime <bjorncs@verizonmedia.com>2020-09-21 14:53:47 +0200
commit92943d8b47a907c4a5c3058ee8e6ca52b2c7ac0e (patch)
treefd1a4688dd2efbd3ba02ee946feb23fc53f2a055 /container-core
parent37028564a00ed82c3ae2a90f005fcbbf19066a08 (diff)
Allow error response for worker pool overload to be customized by handler
Diffstat (limited to 'container-core')
-rw-r--r--container-core/abi-spec.json3
-rw-r--r--container-core/src/main/java/com/yahoo/container/jdisc/ThreadedRequestHandler.java17
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);
}
}
}