From 28bd83e8c7629a0558ca092424fbe8deda879728 Mon Sep 17 00:00:00 2001 From: jonmv Date: Mon, 2 Oct 2023 14:31:09 +0200 Subject: Check query timeout in SearchHandler --- .../main/java/com/yahoo/search/handler/SearchHandler.java | 3 +++ .../main/java/com/yahoo/search/result/ErrorMessage.java | 2 +- .../java/com/yahoo/search/handler/SearchHandlerTest.java | 14 +++++++++++++- 3 files changed, 17 insertions(+), 2 deletions(-) (limited to 'container-search') diff --git a/container-search/src/main/java/com/yahoo/search/handler/SearchHandler.java b/container-search/src/main/java/com/yahoo/search/handler/SearchHandler.java index ecce5ddd740..9e60a720020 100644 --- a/container-search/src/main/java/com/yahoo/search/handler/SearchHandler.java +++ b/container-search/src/main/java/com/yahoo/search/handler/SearchHandler.java @@ -261,6 +261,9 @@ public class SearchHandler extends LoggingRequestHandler { } else if (searchChain == null) { result = new Result(query, ErrorMessage.createInvalidQueryParameter("No search chain named '" + searchChainName + "' was found")); + } else if (query.getTimeLeft() <= 0) { + result = new Result(query, + ErrorMessage.createTimeout("No time left after waiting for " + query.getDurationTime() + "ms to execute query")); } else { String pathAndQuery = UriTools.rawRequest(request.getUri()); result = search(pathAndQuery, query, searchChain); diff --git a/container-search/src/main/java/com/yahoo/search/result/ErrorMessage.java b/container-search/src/main/java/com/yahoo/search/result/ErrorMessage.java index b7f7150f209..10b191cc20f 100644 --- a/container-search/src/main/java/com/yahoo/search/result/ErrorMessage.java +++ b/container-search/src/main/java/com/yahoo/search/result/ErrorMessage.java @@ -114,7 +114,7 @@ public class ErrorMessage extends com.yahoo.processing.request.ErrorMessage { public static final int timeoutCode = Error.TIMEOUT.code; /** Creates an error indicating that a request to a backend timed out. */ public static ErrorMessage createTimeout(String detailedMessage) { - return new ErrorMessage(timeoutCode, "Timed out",detailedMessage); + return new ErrorMessage(timeoutCode, "Timed out", detailedMessage); } public static final int emptyDocsumsCode = Error.EMPTY_DOCUMENTS.code; diff --git a/container-search/src/test/java/com/yahoo/search/handler/SearchHandlerTest.java b/container-search/src/test/java/com/yahoo/search/handler/SearchHandlerTest.java index eb461d6211f..9d45e75f333 100644 --- a/container-search/src/test/java/com/yahoo/search/handler/SearchHandlerTest.java +++ b/container-search/src/test/java/com/yahoo/search/handler/SearchHandlerTest.java @@ -36,7 +36,13 @@ import java.net.URI; import java.util.concurrent.Executors; import static com.yahoo.yolean.Exceptions.uncheckInterrupted; -import static org.junit.jupiter.api.Assertions.*; +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertNotNull; +import static org.junit.jupiter.api.Assertions.assertNotSame; +import static org.junit.jupiter.api.Assertions.assertNull; +import static org.junit.jupiter.api.Assertions.assertSame; +import static org.junit.jupiter.api.Assertions.assertTrue; +import static org.junit.jupiter.api.Assertions.fail; /** * @author bratseth @@ -108,6 +114,12 @@ public class SearchHandlerTest { assertTrue(driver.sendRequest("http://localhost?query=test&searchChain=classLoadingError").readAll().contains("NoClassDefFoundError")); } + @Test + void testTimeout() { + // 1µs is truncated to 0ms, so this will always time out. + assertTrue(driver.sendRequest("http://localhost?query=test&timeout=1µs").readAll().contains("Timed out")); + } + @Test synchronized void testPluginError() { assertTrue(driver.sendRequest("http://localhost?query=test&searchChain=exceptionInPlugin").readAll().contains("NullPointerException")); -- cgit v1.2.3