diff options
author | Harald Musum <musum@yahoo-inc.com> | 2016-07-07 19:05:13 +0200 |
---|---|---|
committer | Harald Musum <musum@yahoo-inc.com> | 2016-07-07 19:05:13 +0200 |
commit | 815c6dce4e5ed52fc1dd5eabce721ce1ae49ee89 (patch) | |
tree | ebda55263b54949604acd4f9bb1a87d613b12037 /container-core | |
parent | 17f497e0b727415ff92d309073c784bceb7597d7 (diff) |
Provide method for overriding timeout for handler
VESPA-3979
Diffstat (limited to 'container-core')
-rw-r--r-- | container-core/src/main/java/com/yahoo/container/jdisc/ThreadedRequestHandler.java | 14 | ||||
-rw-r--r-- | container-core/src/test/java/com/yahoo/container/jdisc/ThreadedRequestHandlerTestCase.java | 51 |
2 files changed, 57 insertions, 8 deletions
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 d54177a91e8..5cabe8a9ec6 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 @@ -15,6 +15,7 @@ import com.yahoo.jdisc.handler.ResponseDispatch; import com.yahoo.jdisc.handler.ResponseHandler; import com.yahoo.log.LogLevel; +import java.time.Duration; import java.util.Map; import java.util.concurrent.Executor; import java.util.concurrent.RejectedExecutionException; @@ -37,7 +38,7 @@ import javax.annotation.concurrent.GuardedBy; public abstract class ThreadedRequestHandler extends AbstractRequestHandler { private static final Logger log = Logger.getLogger(ThreadedRequestHandler.class.getName()); - private static final int TIMEOUT = Integer.parseInt(System.getProperty("ThreadedRequestHandler.timeout", "300")); + private static final Duration TIMEOUT = Duration.ofSeconds(Integer.parseInt(System.getProperty("ThreadedRequestHandler.timeout", "300"))); private final Executor executor; protected final Metric metric; private final boolean allowAsyncResponse; @@ -81,7 +82,12 @@ public abstract class ThreadedRequestHandler extends AbstractRequestHandler { */ @Override public final ContentChannel handleRequest(Request request, ResponseHandler responseHandler) { - request.setTimeout(TIMEOUT, TimeUnit.SECONDS); + if (request.getTimeout(TimeUnit.SECONDS) == null) { + Duration timeout = getTimeout(); + if (timeout != null) { + request.setTimeout(timeout.getSeconds(), TimeUnit.SECONDS); + } + } BufferedContentChannel content = new BufferedContentChannel(); final RequestTask command = new RequestTask(request, content, responseHandler); try { @@ -95,6 +101,10 @@ public abstract class ThreadedRequestHandler extends AbstractRequestHandler { return content; } + public Duration getTimeout() { + return TIMEOUT; + } + private void logRejectedRequests() { if (numRejectedRequests == 0) { return; diff --git a/container-core/src/test/java/com/yahoo/container/jdisc/ThreadedRequestHandlerTestCase.java b/container-core/src/test/java/com/yahoo/container/jdisc/ThreadedRequestHandlerTestCase.java index 400cb507620..ae76b5be697 100644 --- a/container-core/src/test/java/com/yahoo/container/jdisc/ThreadedRequestHandlerTestCase.java +++ b/container-core/src/test/java/com/yahoo/container/jdisc/ThreadedRequestHandlerTestCase.java @@ -6,10 +6,12 @@ import com.yahoo.jdisc.Response; import com.yahoo.jdisc.application.ContainerBuilder; import com.yahoo.jdisc.handler.*; import com.yahoo.jdisc.test.TestDriver; +import org.junit.Ignore; import org.junit.Test; import java.net.URI; import java.nio.ByteBuffer; +import java.time.Duration; import java.util.concurrent.CountDownLatch; import java.util.concurrent.Executor; import java.util.concurrent.Executors; @@ -62,6 +64,27 @@ public class ThreadedRequestHandlerTestCase { } @Test + public void requireThatOverriddenRequestTimeoutIsUsed() throws InterruptedException { + Executor executor = Executors.newSingleThreadExecutor(); + TestDriver driver = TestDriver.newSimpleApplicationInstanceWithoutOsgi(); + ContainerBuilder builder = driver.newContainerBuilder(); + MyRequestHandler requestHandler = MyRequestHandler.newWithTimeout(executor, Duration.ofSeconds(1)); + builder.serverBindings().bind("http://localhost/", requestHandler); + driver.activateContainer(builder); + + MyResponseHandler responseHandler = new MyResponseHandler(); + driver.dispatchRequest("http://localhost/", responseHandler); + + requestHandler.entryLatch.countDown(); + assertTrue(requestHandler.exitLatch.await(60, TimeUnit.SECONDS)); + assertEquals(1, (long)requestHandler.request.getTimeout(TimeUnit.SECONDS)); + + assertTrue(responseHandler.latch.await(60, TimeUnit.SECONDS)); + assertNull(responseHandler.content.read()); + assertTrue(driver.close()); + } + + @Test public void requireThatRequestAndResponseReachHandlers() throws InterruptedException { Executor executor = Executors.newSingleThreadExecutor(); TestDriver driver = TestDriver.newSimpleApplicationInstanceWithoutOsgi(); @@ -226,14 +249,20 @@ public class ThreadedRequestHandlerTestCase { final boolean consumeContent; final boolean createResponse; final boolean throwException; + final Duration timeout; Response response = null; Request request = null; - MyRequestHandler(Executor executor, boolean consumeContent, boolean createResponse, boolean throwException) { + MyRequestHandler(Executor executor, + boolean consumeContent, + boolean createResponse, + boolean throwException, + Duration timeout) { super(executor); this.consumeContent = consumeContent; this.createResponse = createResponse; this.throwException = throwException; + this.timeout = timeout; } @Override @@ -260,24 +289,34 @@ public class ThreadedRequestHandlerTestCase { } } + @Override + public Duration getTimeout() { + if (timeout == null) return super.getTimeout(); + return timeout; + } + static MyRequestHandler newInstance(Executor executor) { - return new MyRequestHandler(executor, true, true, false); + return new MyRequestHandler(executor, true, true, false, null); } static MyRequestHandler newThrowException(Executor executor) { - return new MyRequestHandler(executor, true, true, true); + return new MyRequestHandler(executor, true, true, true, null); } static MyRequestHandler newIgnoreContent(Executor executor) { - return new MyRequestHandler(executor, false, true, false); + return new MyRequestHandler(executor, false, true, false, null); } static MyRequestHandler newIgnoreResponse(Executor executor) { - return new MyRequestHandler(executor, true, false, false); + return new MyRequestHandler(executor, true, false, false, null); } static MyRequestHandler newIgnoreAll(Executor executor) { - return new MyRequestHandler(executor, false, false, false); + return new MyRequestHandler(executor, false, false, false, null); + } + + static MyRequestHandler newWithTimeout(Executor executor, Duration timeout) { + return new MyRequestHandler(executor, false, false, false, timeout); } } |