aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-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);
}
}
}