Repository: asterixdb Updated Branches: refs/heads/master 88b154dfd -> fd9c6020d
[NO ISSUE] Wait for cancels on timeout to prevent DoS - Interrupted queries (i.e. node shutdown) will not wait for cancels to complete before propagating the interrupt Change-Id: I9f92c65a8adf7bc0dc30e222e396870dda15ea4d Reviewed-on: https://asterix-gerrit.ics.uci.edu/2028 Reviewed-by: abdullah alamoudi <[email protected]> Sonar-Qube: Jenkins <[email protected]> Integration-Tests: Jenkins <[email protected]> Tested-by: Jenkins <[email protected]> Contrib: Jenkins <[email protected]> Project: http://git-wip-us.apache.org/repos/asf/asterixdb/repo Commit: http://git-wip-us.apache.org/repos/asf/asterixdb/commit/fd9c6020 Tree: http://git-wip-us.apache.org/repos/asf/asterixdb/tree/fd9c6020 Diff: http://git-wip-us.apache.org/repos/asf/asterixdb/diff/fd9c6020 Branch: refs/heads/master Commit: fd9c6020da2c02328c1db1aee5359b02c6311b1f Parents: 88b154d Author: Michael Blow <[email protected]> Authored: Mon Sep 25 13:29:07 2017 -0400 Committer: Michael Blow <[email protected]> Committed: Mon Sep 25 12:37:43 2017 -0700 ---------------------------------------------------------------------- .../api/http/server/NCQueryServiceServlet.java | 21 +++++++++++--------- .../message/ExecuteStatementRequestMessage.java | 2 +- 2 files changed, 13 insertions(+), 10 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/asterixdb/blob/fd9c6020/asterixdb/asterix-app/src/main/java/org/apache/asterix/api/http/server/NCQueryServiceServlet.java ---------------------------------------------------------------------- diff --git a/asterixdb/asterix-app/src/main/java/org/apache/asterix/api/http/server/NCQueryServiceServlet.java b/asterixdb/asterix-app/src/main/java/org/apache/asterix/api/http/server/NCQueryServiceServlet.java index 254b6f0..f4c3949 100644 --- a/asterixdb/asterix-app/src/main/java/org/apache/asterix/api/http/server/NCQueryServiceServlet.java +++ b/asterixdb/asterix-app/src/main/java/org/apache/asterix/api/http/server/NCQueryServiceServlet.java @@ -81,8 +81,7 @@ public class NCQueryServiceServlet extends QueryServiceServlet { } long timeout = ExecuteStatementRequestMessage.DEFAULT_NC_TIMEOUT_MILLIS; if (param.timeout != null) { - timeout = java.util.concurrent.TimeUnit.NANOSECONDS - .toMillis(Duration.parseDurationStringToNanos(param.timeout)); + timeout = TimeUnit.NANOSECONDS.toMillis(Duration.parseDurationStringToNanos(param.timeout)); } ExecuteStatementRequestMessage requestMsg = new ExecuteStatementRequestMessage(ncCtx.getNodeId(), responseFuture.getFutureId(), queryLanguage, @@ -91,12 +90,14 @@ public class NCQueryServiceServlet extends QueryServiceServlet { outExecStartEnd[0] = System.nanoTime(); ncMb.sendMessageToCC(requestMsg); try { - responseMsg = (ExecuteStatementResponseMessage) responseFuture.get(timeout, - java.util.concurrent.TimeUnit.MILLISECONDS); - } catch (InterruptedException | TimeoutException exception) { + responseMsg = (ExecuteStatementResponseMessage) responseFuture.get(timeout, TimeUnit.MILLISECONDS); + } catch (InterruptedException e) { + cancelQuery(ncMb, ncCtx.getNodeId(), param.clientContextID, e, false); + throw e; + } catch (TimeoutException exception) { RuntimeDataException hde = new RuntimeDataException(ErrorCode.QUERY_TIMEOUT, exception); // cancel query - cancelQuery(ncMb, ncCtx.getNodeId(), param.clientContextID, hde); + cancelQuery(ncMb, ncCtx.getNodeId(), param.clientContextID, hde, true); throw hde; } outExecStartEnd[1] = System.nanoTime(); @@ -127,14 +128,16 @@ public class NCQueryServiceServlet extends QueryServiceServlet { } private void cancelQuery(INCMessageBroker messageBroker, String nodeId, String clientContextID, - Exception exception) { + Exception exception, boolean wait) { MessageFuture cancelQueryFuture = messageBroker.registerMessageFuture(); try { CancelQueryRequest cancelQueryMessage = new CancelQueryRequest(nodeId, cancelQueryFuture.getFutureId(), clientContextID); messageBroker.sendMessageToCC(cancelQueryMessage); - cancelQueryFuture.get(ExecuteStatementRequestMessage.DEFAULT_QUERY_CANCELLATION_WAIT_MILLIS, - TimeUnit.MILLISECONDS); + if (wait) { + cancelQueryFuture.get(ExecuteStatementRequestMessage.DEFAULT_QUERY_CANCELLATION_WAIT_MILLIS, + TimeUnit.MILLISECONDS); + } } catch (Exception e) { exception.addSuppressed(e); } finally { http://git-wip-us.apache.org/repos/asf/asterixdb/blob/fd9c6020/asterixdb/asterix-app/src/main/java/org/apache/asterix/app/message/ExecuteStatementRequestMessage.java ---------------------------------------------------------------------- diff --git a/asterixdb/asterix-app/src/main/java/org/apache/asterix/app/message/ExecuteStatementRequestMessage.java b/asterixdb/asterix-app/src/main/java/org/apache/asterix/app/message/ExecuteStatementRequestMessage.java index 28e55a6..27cdb66 100644 --- a/asterixdb/asterix-app/src/main/java/org/apache/asterix/app/message/ExecuteStatementRequestMessage.java +++ b/asterixdb/asterix-app/src/main/java/org/apache/asterix/app/message/ExecuteStatementRequestMessage.java @@ -62,7 +62,7 @@ public final class ExecuteStatementRequestMessage implements ICcAddressedMessage //TODO: Make configurable: https://issues.apache.org/jira/browse/ASTERIXDB-2062 public static final long DEFAULT_NC_TIMEOUT_MILLIS = TimeUnit.MINUTES.toMillis(5); //TODO: Make configurable: https://issues.apache.org/jira/browse/ASTERIXDB-2063 - public static final long DEFAULT_QUERY_CANCELLATION_WAIT_MILLIS = TimeUnit.MINUTES.toMillis(0); + public static final long DEFAULT_QUERY_CANCELLATION_WAIT_MILLIS = TimeUnit.MINUTES.toMillis(1); private final String requestNodeId; private final long requestMessageId; private final ILangExtension.Language lang;
