This is an automated email from the ASF dual-hosted git repository. mblow pushed a commit to branch master in repository https://gitbox.apache.org/repos/asf/asterixdb.git
commit 11acb536a3078f2923b4569747908c546538c27c Author: Murtadha Hubail <[email protected]> AuthorDate: Mon Jun 14 03:41:31 2021 +0300 [NO ISSUE][OTH] Extensible QueryServiceServlet - user model changes: no - storage format changes: no - interface changes: no Details: - Set StatementProperties before attempting to execute the statements to have any changes reflected in case of statements execution failures. - Pass execution state when a request fails. Change-Id: Ic84aa2d7641a0f51c2d2ec13f2900066b225ec5b Reviewed-on: https://asterix-gerrit.ics.uci.edu/c/asterixdb/+/11923 Integration-Tests: Jenkins <[email protected]> Tested-by: Jenkins <[email protected]> Reviewed-by: Murtadha Hubail <[email protected]> Reviewed-by: Michael Blow <[email protected]> --- .../asterix/api/http/server/NCQueryServiceServlet.java | 5 +++-- .../asterix/api/http/server/QueryServiceServlet.java | 15 ++++++++------- .../app/message/ExecuteStatementRequestMessage.java | 5 ++--- .../apache/asterix/app/translator/QueryTranslator.java | 3 ++- 4 files changed, 15 insertions(+), 13 deletions(-) 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 d6ebdad..2189c17 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 @@ -48,6 +48,7 @@ import org.apache.hyracks.api.exceptions.Warning; import org.apache.hyracks.api.util.ExceptionUtils; import org.apache.hyracks.http.api.IChannelClosedHandler; import org.apache.hyracks.http.api.IServletRequest; +import org.apache.hyracks.http.api.IServletResponse; import org.apache.hyracks.http.server.HttpServer; import org.apache.hyracks.http.server.InterruptOnCloseHandler; import org.apache.hyracks.ipc.exceptions.IPCException; @@ -167,13 +168,13 @@ public class NCQueryServiceServlet extends QueryServiceServlet { @Override protected void handleExecuteStatementException(Throwable t, RequestExecutionState executionState, - QueryServiceRequestParameters param) { + QueryServiceRequestParameters param, IServletResponse response) { if (t instanceof TimeoutException // TODO(mblow): I don't think t can ever been an instance of TimeoutException || ExceptionUtils.matchingCause(t, candidate -> candidate instanceof IPCException)) { GlobalConfig.ASTERIX_LOGGER.log(Level.WARN, t.toString(), t); executionState.setStatus(ResultStatus.FAILED, HttpResponseStatus.SERVICE_UNAVAILABLE); } else { - super.handleExecuteStatementException(t, executionState, param); + super.handleExecuteStatementException(t, executionState, param, response); } } diff --git a/asterixdb/asterix-app/src/main/java/org/apache/asterix/api/http/server/QueryServiceServlet.java b/asterixdb/asterix-app/src/main/java/org/apache/asterix/api/http/server/QueryServiceServlet.java index a043050..abe9716 100644 --- a/asterixdb/asterix-app/src/main/java/org/apache/asterix/api/http/server/QueryServiceServlet.java +++ b/asterixdb/asterix-app/src/main/java/org/apache/asterix/api/http/server/QueryServiceServlet.java @@ -305,9 +305,9 @@ public class QueryServiceServlet extends AbstractQueryApiServlet { } errorCount = 0; } catch (Exception | org.apache.asterix.lang.sqlpp.parser.TokenMgrError e) { - handleExecuteStatementException(e, executionState, param); + handleExecuteStatementException(e, executionState, param, response); response.setStatus(executionState.getHttpStatus()); - requestFailed(e, responsePrinter); + requestFailed(e, responsePrinter, executionState); } finally { executionState.finish(); } @@ -419,7 +419,7 @@ public class QueryServiceServlet extends AbstractQueryApiServlet { } protected boolean handleIFormattedException(IError error, IFormattedException ex, - RequestExecutionState executionState, QueryServiceRequestParameters param) { + RequestExecutionState executionState, QueryServiceRequestParameters param, IServletResponse response) { if (error instanceof ErrorCode) { switch ((ErrorCode) error) { case INVALID_REQ_PARAM_VAL: @@ -451,7 +451,7 @@ public class QueryServiceServlet extends AbstractQueryApiServlet { } protected void handleExecuteStatementException(Throwable t, RequestExecutionState executionState, - QueryServiceRequestParameters param) { + QueryServiceRequestParameters param, IServletResponse response) { if (t instanceof org.apache.asterix.lang.sqlpp.parser.TokenMgrError || t instanceof AlgebricksException) { if (LOGGER.isDebugEnabled()) { LOGGER.debug("handleException: {}: {}", t.getMessage(), LogRedactionUtil.statement(param.toString()), @@ -465,8 +465,8 @@ public class QueryServiceServlet extends AbstractQueryApiServlet { } else if (t instanceof IFormattedException) { IFormattedException formattedEx = (IFormattedException) t; Optional<IError> maybeError = formattedEx.getError(); - if (maybeError.isPresent() - && handleIFormattedException(maybeError.get(), (IFormattedException) t, executionState, param)) { + if (maybeError.isPresent() && handleIFormattedException(maybeError.get(), (IFormattedException) t, + executionState, param, response)) { return; } } @@ -496,7 +496,8 @@ public class QueryServiceServlet extends AbstractQueryApiServlet { sessionConfig.set(SessionConfig.FORMAT_CSV_HEADER, param.isCSVWithHeader()); } - protected void requestFailed(Throwable throwable, ResponsePrinter responsePrinter) { + protected void requestFailed(Throwable throwable, ResponsePrinter responsePrinter, + RequestExecutionState executionState) { final ExecutionError executionError = ExecutionError.of(throwable); responsePrinter.addResultPrinter(new ErrorsPrinter(Collections.singletonList(executionError))); } 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 29ee76d..30b98ec 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 @@ -139,6 +139,8 @@ public class ExecuteStatementRequestMessage implements ICcAddressedMessage { IStorageComponentProvider storageComponentProvider = ccAppCtx.getStorageComponentProvider(); IStatementExecutorFactory statementExecutorFactory = ccApp.getStatementExecutorFactory(); ExecuteStatementResponseMessage responseMsg = new ExecuteStatementResponseMessage(requestMessageId); + final IStatementExecutor.StatementProperties statementProperties = new IStatementExecutor.StatementProperties(); + responseMsg.setStatementProperties(statementProperties); try { List<Warning> warnings = new ArrayList<>(); IParser parser = compilationProvider.getParserFactory().createParser(statementsText); @@ -160,8 +162,6 @@ public class ExecuteStatementRequestMessage implements ICcAddressedMessage { compilationProvider, storageComponentProvider, new ResponsePrinter(sessionOutput)); final IStatementExecutor.Stats stats = new IStatementExecutor.Stats(); stats.setProfileType(profileType); - final IStatementExecutor.StatementProperties statementProperties = - new IStatementExecutor.StatementProperties(); Map<String, IAObject> stmtParams = RequestParameters.deserializeParameterValues(statementParameters); final IRequestParameters requestParameters = new RequestParameters(requestReference, statementsText, null, resultProperties, stats, @@ -174,7 +174,6 @@ public class ExecuteStatementRequestMessage implements ICcAddressedMessage { responseMsg.setResult(outWriter.toString()); responseMsg.setMetadata(outMetadata); responseMsg.setStats(stats); - responseMsg.setStatementProperties(statementProperties); responseMsg.setExecutionPlans(translator.getExecutionPlans()); responseMsg.setWarnings(warnings); } catch (AlgebricksException | HyracksException | org.apache.asterix.lang.sqlpp.parser.TokenMgrError pe) { diff --git a/asterixdb/asterix-app/src/main/java/org/apache/asterix/app/translator/QueryTranslator.java b/asterixdb/asterix-app/src/main/java/org/apache/asterix/app/translator/QueryTranslator.java index 4b6f01d..38225d7 100644 --- a/asterixdb/asterix-app/src/main/java/org/apache/asterix/app/translator/QueryTranslator.java +++ b/asterixdb/asterix-app/src/main/java/org/apache/asterix/app/translator/QueryTranslator.java @@ -3930,7 +3930,8 @@ public class QueryTranslator extends AbstractLangTranslator implements IStatemen appCtx.getRequestTracker().track(clientRequest); } - protected void validateStatements(IRequestParameters requestParameters) throws CompilationException { + protected void validateStatements(IRequestParameters requestParameters) + throws CompilationException, HyracksDataException { validateStatements(statements, requestParameters.isMultiStatement(), requestParameters.getStatementCategoryRestrictionMask()); }
