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 d8da7b7edda15885e8aa0cd8e4b479e872b05cd8 Merge: 093e842 5543132 Author: Michael Blow <mb...@apache.org> AuthorDate: Fri Feb 15 20:44:21 2019 -0500 Merge commit '5543132' from 'stabilization-f69489' into 'master' Change-Id: Ic0e77df94ecea518e19b55edb90a2fe8157cac21 asterixdb/asterix-app/pom.xml | 1 - .../api/http/server/QueryResultApiServlet.java | 82 ++++++- .../api/http/server/QueryServiceServlet.java | 90 +++++--- .../asterix/api/http/server/RestApiServlet.java | 251 -------------------- .../api/common/AsterixHyracksIntegrationUtil.java | 12 + .../asterix/app/result/ResultPrinterTest.java | 3 +- .../org/apache/asterix/common/TestDataUtil.java | 3 +- .../apache/asterix/runtime/ParseDurationTest.java | 1 + .../test/common/CancellationTestExecutor.java | 5 +- .../asterix/test/common/ResultExtractor.java | 21 +- .../apache/asterix/test/common/TestExecutor.java | 257 +++++++++++++-------- .../asterix/test/runtime/ExecutionTestUtil.java | 9 - .../asterix/test/sqlpp/ParserTestExecutor.java | 4 +- .../org/apache/asterix/common/api/Duration.java | 16 +- .../apache/asterix/test/server/RSSFeedServlet.java | 5 +- .../src/main/opt/local/bin/start-sample-cluster.sh | 2 +- .../src/main/opt/local/bin/stop-sample-cluster.sh | 11 +- .../asterix/test/server/SampleLocalClusterIT.java | 3 +- asterixdb/pom.xml | 6 + hyracks-fullstack/hyracks/hyracks-http/pom.xml | 6 + .../hyracks/http/server/ChunkedResponse.java | 2 +- .../apache/hyracks/http/server/FullResponse.java | 4 +- .../apache/hyracks/http/server/utils/HttpUtil.java | 30 ++- .../hyracks/test/http/HttpAcceptCharsetTest.java | 4 +- .../hyracks/test/http/HttpServerEncodingTest.java | 21 +- .../apache/hyracks/test/string/EncodingUtils.java | 65 ++++++ 26 files changed, 452 insertions(+), 462 deletions(-) diff --cc asterixdb/asterix-app/src/main/java/org/apache/asterix/api/http/server/QueryServiceServlet.java index 31b784f,79401b8..ffbb614 --- 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 @@@ -346,16 -369,33 +349,33 @@@ public class QueryServiceServlet extend pw.print("\t}\n"); } - private String getOptText(JsonNode node, Parameter parameter) { ++ protected String getOptText(JsonNode node, Parameter parameter) { + return getOptText(node, parameter.str()); + } + - private String getOptText(JsonNode node, String fieldName) { + protected String getOptText(JsonNode node, String fieldName) { final JsonNode value = node.get(fieldName); return value != null ? value.asText() : null; } - private boolean getOptBoolean(JsonNode node, String fieldName, boolean defaultValue) { - private boolean getOptBoolean(JsonNode node, Parameter parameter, boolean defaultValue) { ++ protected boolean getOptBoolean(JsonNode node, Parameter parameter, boolean defaultValue) { + return getOptBoolean(node, parameter.str(), defaultValue); + } + - private boolean getOptBoolean(JsonNode node, String fieldName, boolean defaultValue) { ++ protected boolean getOptBoolean(JsonNode node, String fieldName, boolean defaultValue) { final JsonNode value = node.get(fieldName); return value != null ? value.asBoolean() : defaultValue; } - private String getParameter(IServletRequest request, Parameter parameter) { ++ protected String getParameter(IServletRequest request, Parameter parameter) { + return request.getParameter(parameter.str()); + } + - private boolean getOptBoolean(IServletRequest request, Parameter parameter, boolean defaultValue) { ++ protected boolean getOptBoolean(IServletRequest request, Parameter parameter, boolean defaultValue) { + String value = request.getParameter(parameter.str()); + return value == null ? defaultValue : Boolean.parseBoolean(value); + } + @FunctionalInterface interface CheckedFunction<I, O> { O apply(I requestParamValue) throws IOException; @@@ -404,70 -462,26 +424,66 @@@ GlobalConfig.ASTERIX_LOGGER.log(Level.ERROR, e.getMessage(), e); } } else { - param.setStatement(getParameter(request, Parameter.STATEMENT)); - if (param.getStatement() == null) { - param.setStatement(HttpUtil.getRequestBody(request)); - } - param.setFormat(toLower(getParameter(request, Parameter.FORMAT))); - param.setPretty(Boolean.parseBoolean(getParameter(request, Parameter.PRETTY))); - param.setMode(toLower(getParameter(request, Parameter.MODE))); - param.setClientContextID(getParameter(request, Parameter.CLIENT_ID)); - param.setTimeout(getParameter(request, Parameter.TIMEOUT)); - param.setMaxResultReads(getParameter(request, Parameter.MAX_RESULT_READS)); - param.setPlanFormat(getParameter(request, Parameter.PLAN_FORMAT)); - param.setMultiStatement(getOptBoolean(request, Parameter.MULTI_STATEMENT, true)); - try { - param.setStatementParams(getOptStatementParameters(request, request.getParameterNames().iterator(), - IServletRequest::getParameter, OBJECT_MAPPER::readTree)); - } catch (JsonParseException | JsonMappingException e) { - GlobalConfig.ASTERIX_LOGGER.log(Level.ERROR, e.getMessage(), e); - } + setParamFromRequest(request, param); + } + } + + private void setParamFromJSON(IServletRequest request, QueryServiceRequestParameters param, + Map<String, String> optionalParameters) throws IOException { + JsonNode jsonRequest = OBJECT_MAPPER.readTree(HttpUtil.getRequestBody(request)); - param.setFormat(toLower(getOptText(jsonRequest, Parameter.FORMAT.str()))); - param.setPretty(getOptBoolean(jsonRequest, Parameter.PRETTY.str(), false)); - param.setMode(toLower(getOptText(jsonRequest, Parameter.MODE.str()))); - param.setClientContextID(getOptText(jsonRequest, Parameter.CLIENT_ID.str())); - param.setTimeout(getOptText(jsonRequest, Parameter.TIMEOUT.str())); - param.setMaxResultReads(getOptText(jsonRequest, Parameter.MAX_RESULT_READS.str())); - param.setPlanFormat(getOptText(jsonRequest, Parameter.PLAN_FORMAT.str())); - param.setExpressionTree(getOptBoolean(jsonRequest, Parameter.EXPRESSION_TREE.str(), false)); - param.setRewrittenExpressionTree(getOptBoolean(jsonRequest, Parameter.REWRITTEN_EXPRESSION_TREE.str(), false)); - param.setLogicalPlan(getOptBoolean(jsonRequest, Parameter.LOGICAL_PLAN.str(), false)); - param.setParseOnly(getOptBoolean(jsonRequest, Parameter.PARSE_ONLY.str(), false)); - param.setOptimizedLogicalPlan(getOptBoolean(jsonRequest, Parameter.OPTIMIZED_LOGICAL_PLAN.str(), false)); - param.setJob(getOptBoolean(jsonRequest, Parameter.JOB.str(), false)); - param.setSignature(getOptBoolean(jsonRequest, Parameter.SIGNATURE.str(), true)); ++ param.setStatement(getOptText(jsonRequest, Parameter.STATEMENT)); ++ param.setFormat(toLower(getOptText(jsonRequest, Parameter.FORMAT))); ++ param.setPretty(getOptBoolean(jsonRequest, Parameter.PRETTY, false)); ++ param.setMode(toLower(getOptText(jsonRequest, Parameter.MODE))); ++ param.setClientContextID(getOptText(jsonRequest, Parameter.CLIENT_ID)); ++ param.setTimeout(getOptText(jsonRequest, Parameter.TIMEOUT)); ++ param.setMaxResultReads(getOptText(jsonRequest, Parameter.MAX_RESULT_READS)); ++ param.setPlanFormat(getOptText(jsonRequest, Parameter.PLAN_FORMAT)); ++ param.setExpressionTree(getOptBoolean(jsonRequest, Parameter.EXPRESSION_TREE, false)); ++ param.setRewrittenExpressionTree(getOptBoolean(jsonRequest, Parameter.REWRITTEN_EXPRESSION_TREE, false)); ++ param.setLogicalPlan(getOptBoolean(jsonRequest, Parameter.LOGICAL_PLAN, false)); ++ param.setParseOnly(getOptBoolean(jsonRequest, Parameter.PARSE_ONLY, false)); ++ param.setOptimizedLogicalPlan(getOptBoolean(jsonRequest, Parameter.OPTIMIZED_LOGICAL_PLAN, false)); ++ param.setJob(getOptBoolean(jsonRequest, Parameter.JOB, false)); ++ param.setSignature(getOptBoolean(jsonRequest, Parameter.SIGNATURE, true)); + param.setStatementParams( + getOptStatementParameters(jsonRequest, jsonRequest.fieldNames(), JsonNode::get, v -> v)); - param.setMultiStatement(getOptBoolean(jsonRequest, Parameter.MULTI_STATEMENT.str(), true)); - String statementParam = Parameter.STATEMENT.str(); - if (jsonRequest.has(statementParam)) { - param.setStatement(jsonRequest.get(statementParam).asText()); - } ++ param.setMultiStatement(getOptBoolean(jsonRequest, Parameter.MULTI_STATEMENT, true)); + setJsonOptionalParameters(jsonRequest, optionalParameters); + } + + protected void setJsonOptionalParameters(JsonNode jsonRequest, Map<String, String> optionalParameters) { + // allows extensions to set extra parameters + } + + private void setParamFromRequest(IServletRequest request, QueryServiceRequestParameters param) throws IOException { - param.setStatement(request.getParameter(Parameter.STATEMENT.str())); ++ param.setStatement(getParameter(request, Parameter.STATEMENT)); + if (param.getStatement() == null) { + param.setStatement(HttpUtil.getRequestBody(request)); + } - param.setFormat(toLower(request.getParameter(Parameter.FORMAT.str()))); - param.setPretty(Boolean.parseBoolean(request.getParameter(Parameter.PRETTY.str()))); - param.setMode(toLower(request.getParameter(Parameter.MODE.str()))); - param.setClientContextID(request.getParameter(Parameter.CLIENT_ID.str())); - param.setTimeout(request.getParameter(Parameter.TIMEOUT.str())); - param.setMaxResultReads(request.getParameter(Parameter.MAX_RESULT_READS.str())); - param.setPlanFormat(request.getParameter(Parameter.PLAN_FORMAT.str())); - param.setParseOnly(Boolean.parseBoolean(request.getParameter(Parameter.PARSE_ONLY.str()))); - final String multiStatementParam = request.getParameter(Parameter.MULTI_STATEMENT.str()); - param.setMultiStatement(multiStatementParam == null || Boolean.parseBoolean(multiStatementParam)); ++ param.setFormat(toLower(getParameter(request, Parameter.FORMAT))); ++ param.setPretty(Boolean.parseBoolean(getParameter(request, Parameter.PRETTY))); ++ param.setMode(toLower(getParameter(request, Parameter.MODE))); ++ param.setClientContextID(getParameter(request, Parameter.CLIENT_ID)); ++ param.setTimeout(getParameter(request, Parameter.TIMEOUT)); ++ param.setMaxResultReads(getParameter(request, Parameter.MAX_RESULT_READS)); ++ param.setPlanFormat(getParameter(request, Parameter.PLAN_FORMAT)); ++ param.setParseOnly(getOptBoolean(request, Parameter.PARSE_ONLY, false)); ++ param.setMultiStatement(getOptBoolean(request, Parameter.MULTI_STATEMENT, true)); + try { + param.setStatementParams(getOptStatementParameters(request, request.getParameterNames().iterator(), + IServletRequest::getParameter, OBJECT_MAPPER::readTree)); + } catch (JsonParseException | JsonMappingException e) { + GlobalConfig.ASTERIX_LOGGER.log(Level.ERROR, e.getMessage(), e); } - return param; + } + + private void setAccessControlHeaders(IServletRequest request, IServletResponse response) throws IOException { + //CORS + if (request.getHeader("Origin") != null) { + response.setHeader("Access-Control-Allow-Origin", request.getHeader("Origin")); + } + response.setHeader("Access-Control-Allow-Headers", "Origin, X-Requested-With, Content-Type, Accept"); } private static ResultDelivery parseResultDelivery(String mode) { @@@ -510,20 -524,38 +526,20 @@@ } private void handleRequest(IServletRequest request, IServletResponse response) throws IOException { - QueryServiceRequestParameters param = getRequestParameters(request); - LOGGER.info("handleRequest: {}", param); + final IRequestReference requestRef = receptionist.welcome(request); long elapsedStart = System.nanoTime(); - Charset resultCharset = HttpUtil.setContentType(response, HttpUtil.ContentType.APPLICATION_JSON, request); - final PrintWriter httpWriter = response.writer(); - - ResultDelivery delivery = parseResultDelivery(param.getMode()); - - final ResultProperties resultProperties = param.getMaxResultReads() == null ? new ResultProperties(delivery) - : new ResultProperties(delivery, Long.parseLong(param.getMaxResultReads())); - - String handleUrl = getHandleUrl(param.getHost(), param.getPath(), delivery); - SessionOutput sessionOutput = createSessionOutput(param, handleUrl, httpWriter); - SessionConfig sessionConfig = sessionOutput.config(); - + long errorCount = 1; Stats stats = new Stats(); RequestExecutionState execution = new RequestExecutionState(); - - // buffer the output until we are ready to set the status of the response message correctly - sessionOutput.hold(); - sessionOutput.out().print("{\n"); - printRequestId(sessionOutput.out()); - printClientContextID(sessionOutput.out(), param); - printSignature(sessionOutput.out(), param); - printType(sessionOutput.out(), sessionConfig); - long errorCount = 1; // so far we just return 1 error - List<ExecutionWarning> warnings = Collections.emptyList(); // we don't have any warnings yet + List<ExecutionWarning> warnings = Collections.emptyList(); - HttpUtil.setContentType(response, HttpUtil.ContentType.APPLICATION_JSON, request); ++ Charset resultCharset = HttpUtil.setContentType(response, HttpUtil.ContentType.APPLICATION_JSON, request); + PrintWriter httpWriter = response.writer(); + SessionOutput sessionOutput = createSessionOutput(httpWriter); + QueryServiceRequestParameters param = new QueryServiceRequestParameters(); try { - if (param.getStatement() == null || param.getStatement().isEmpty()) { - throw new RuntimeDataException(ErrorCode.NO_STATEMENT_PROVIDED); - } - String statementsText = param.getStatement() + ";"; + // buffer the output until we are ready to set the status of the response message correctly + sessionOutput.hold(); + sessionOutput.out().print("{\n"); Map<String, String> optionalParams = null; if (optionalParamProvider != null) { optionalParams = optionalParamProvider.apply(request); diff --cc asterixdb/asterix-app/src/test/java/org/apache/asterix/api/common/AsterixHyracksIntegrationUtil.java index 9c24821,ae13e42..6eac23b --- a/asterixdb/asterix-app/src/test/java/org/apache/asterix/api/common/AsterixHyracksIntegrationUtil.java +++ b/asterixdb/asterix-app/src/test/java/org/apache/asterix/api/common/AsterixHyracksIntegrationUtil.java @@@ -117,6 -117,6 +117,8 @@@ public class AsterixHyracksIntegrationU } public void init(boolean deleteOldInstanceData, String confFile) throws Exception { //NOSONAR ++ configureExternalLibDir(); ++ final ICCApplication ccApplication = createCCApplication(); if (confFile == null) { configManager = new ConfigManager(); @@@ -184,6 -180,6 +186,16 @@@ setTestPersistedResourceRegistry(); } ++ private void configureExternalLibDir() { ++ // hack to ensure we have a unique location for external libraries in our tests (asterix cluster has a shared ++ // home directory)-- TODO: rework this once the external lib dir can be configured explicitly ++ String appHome = joinPath(System.getProperty("app.home", System.getProperty("user.home")), ++ "appHome" + (int) (Math.random() * Integer.MAX_VALUE)); ++ LOGGER.info("setting app.home to {}", appHome); ++ System.setProperty("app.home", appHome); ++ new File(appHome).deleteOnExit(); ++ } ++ public void init(boolean deleteOldInstanceData, String externalLibPath, String confDir) throws Exception { List<ILibraryManager> libraryManagers = new ArrayList<>(); ExternalUDFLibrarian librarian = new ExternalUDFLibrarian(libraryManagers); diff --cc asterixdb/asterix-app/src/test/java/org/apache/asterix/test/common/CancellationTestExecutor.java index 242c0dd,969d23d..564672a --- a/asterixdb/asterix-app/src/test/java/org/apache/asterix/test/common/CancellationTestExecutor.java +++ b/asterixdb/asterix-app/src/test/java/org/apache/asterix/test/common/CancellationTestExecutor.java @@@ -49,9 -50,8 +50,9 @@@ public class CancellationTestExecutor e @Override public InputStream executeQueryService(String str, TestCaseContext.OutputFormat fmt, URI uri, - List<TestCase.CompilationUnit.Parameter> params, boolean jsonEncoded, + List<TestCase.CompilationUnit.Parameter> params, boolean jsonEncoded, Charset responseCharset, Predicate<Integer> responseCodeValidator, boolean cancellable) throws Exception { + cancellable = cancellable && !containsClientContextID(str); String clientContextId = UUID.randomUUID().toString(); final List<TestCase.CompilationUnit.Parameter> newParams = cancellable ? upsertParam(params, "client_context_id", ParameterTypeEnum.STRING, clientContextId) : params; diff --cc asterixdb/asterix-app/src/test/java/org/apache/asterix/test/common/ResultExtractor.java index 705624a,de7dac2..c503579 --- a/asterixdb/asterix-app/src/test/java/org/apache/asterix/test/common/ResultExtractor.java +++ b/asterixdb/asterix-app/src/test/java/org/apache/asterix/test/common/ResultExtractor.java @@@ -19,7 -19,8 +19,7 @@@ package org.apache.asterix.test.common; import java.io.InputStream; - import java.nio.charset.StandardCharsets; + import java.nio.charset.Charset; -import java.nio.charset.StandardCharsets; import java.util.EnumSet; import java.util.HashMap; import java.util.Iterator; diff --cc asterixdb/asterix-app/src/test/java/org/apache/asterix/test/common/TestExecutor.java index aed65e6,683d5c8..f621d34 --- a/asterixdb/asterix-app/src/test/java/org/apache/asterix/test/common/TestExecutor.java +++ b/asterixdb/asterix-app/src/test/java/org/apache/asterix/test/common/TestExecutor.java @@@ -36,9 -37,10 +38,11 @@@ import java.net.InetSocketAddress import java.net.Socket; import java.net.URI; import java.net.URISyntaxException; - import java.nio.charset.StandardCharsets; + import java.nio.CharBuffer; + import java.nio.charset.Charset; import java.util.ArrayList; import java.util.Arrays; ++import java.util.Collection; import java.util.Collections; import java.util.HashMap; import java.util.HashSet; @@@ -159,6 -156,8 +161,9 @@@ public class TestExecutor private static Map<String, InetSocketAddress> ncEndPoints; private static Map<String, InetSocketAddress> replicationAddress; - private static final List<Charset> charsetsRemaining = new ArrayList<>(); ++ private final List<Charset> allCharsets; ++ private final List<Charset> charsetsRemaining = new ArrayList<>(); + /* * Instance members */ @@@ -182,6 -181,6 +187,8 @@@ public TestExecutor(List<InetSocketAddress> endpoints) { this.endpoints = endpoints; ++ this.allCharsets = Charset.availableCharsets().values().stream() ++ .filter(c -> canEncodeDecode(c, "\n\t\\[]{}'\"")).collect(Collectors.toList()); } public void setLibrarian(IExternalUDFLibrarian librarian) { @@@ -229,22 -227,11 +235,22 @@@ } return; } else if (actualFile.toString().endsWith(".regex")) { - runScriptAndCompareWithResultRegex(scriptFile, expectedFile, actualFile); + runScriptAndCompareWithResultRegex(scriptFile, readerExpected, readerActual); return; } else if (actualFile.toString().endsWith(".regexadm")) { - runScriptAndCompareWithResultRegexAdm(scriptFile, expectedFile, actualFile); + runScriptAndCompareWithResultRegexAdm(scriptFile, readerExpected, readerActual); return; + } else if (actualFile.toString().endsWith(".regexjson")) { + ObjectMapper OM = new ObjectMapper(); + JsonNode expectedJson = OM.readTree(readerExpected); + JsonNode actualJson = OM.readTree(readerActual); + if (expectedJson == null || actualJson == null) { + throw new NullPointerException("Error parsing expected or actual result file for " + scriptFile); + } + if (!TestHelper.equalJson(expectedJson, actualJson)) { + throw new ComparisonException("Result for " + scriptFile + " didn't match the expected JSON"); + } + return; } String lineExpected, lineActual; int num = 1; @@@ -629,6 -612,49 +636,55 @@@ return response.getEntity().getContent(); } + private Charset selectCharset(File result) throws IOException { + // choose an encoding that works for this input + return selectCharset(FileUtils.readFileToString(result, UTF_8)); + } + + private Charset selectCharset(String payload) { + // choose an encoding that works for this input + return nextCharset(charset -> canEncodeDecode(charset, payload)); + } + - public static Charset nextCharset(Predicate<Charset> test) { - synchronized (charsetsRemaining) { ++ public void setAvailableCharsets(Collection<Charset> charsets) { ++ synchronized (allCharsets) { ++ allCharsets.clear(); ++ allCharsets.addAll(charsets); ++ charsetsRemaining.clear(); ++ } ++ } ++ ++ public Charset nextCharset(Predicate<Charset> test) { ++ synchronized (allCharsets) { + while (true) { + for (Iterator<Charset> iter = charsetsRemaining.iterator(); iter.hasNext();) { + Charset next = iter.next(); + if (test.test(next)) { + iter.remove(); + return next; + } + } - List<Charset> allCharsets = Charset.availableCharsets().values().stream() - .filter(c -> canEncodeDecode(c, "\n\t\\[]{}'\"")).collect(Collectors.toList()); + Collections.shuffle(allCharsets); + charsetsRemaining.addAll(allCharsets); + } + } + } + + // duplicated from hyracks-test-support as transitive dependencies on test-jars are not handled correctly + private static boolean canEncodeDecode(Charset charset, String input) { + try { + if (input.equals(new String(input.getBytes(charset), charset))) { + // workaround for https://bugs.openjdk.java.net/browse/JDK-6392670 and similar + if (input.equals(charset.decode(charset.encode(CharBuffer.wrap(input))).toString())) { + return true; + } + } + } catch (Exception e) { + LOGGER.debug("cannot encode / decode {} with {} due to exception", input, charset.displayName(), e); + } + return false; + } + protected List<Parameter> upsertParam(List<Parameter> params, String name, ParameterTypeEnum type, String value) { boolean replaced = false; List<Parameter> result = new ArrayList<>(); @@@ -1228,18 -1251,14 +1282,19 @@@ URI uri = testFile.getName().endsWith("aql") ? getEndpoint(Servlets.QUERY_AQL) : getEndpoint(Servlets.QUERY_SERVICE); boolean isJsonEncoded = isJsonEncoded(extractHttpRequestType(statement)); + Charset responseCharset = expectedResultFile == null ? UTF_8 : selectCharset(expectedResultFile); InputStream resultStream; if (DELIVERY_IMMEDIATE.equals(delivery)) { - resultStream = - executeQueryService(statement, fmt, uri, params, isJsonEncoded, null, isCancellable(reqType)); + resultStream = executeQueryService(statement, fmt, uri, params, isJsonEncoded, responseCharset, null, + isCancellable(reqType)); - resultStream = - METRICS_QUERY_TYPE.equals(reqType) ? ResultExtractor.extractMetrics(resultStream, responseCharset) - : ResultExtractor.extract(resultStream, responseCharset); + switch (reqType) { + case METRICS_QUERY_TYPE: - resultStream = ResultExtractor.extractMetrics(resultStream); ++ resultStream = ResultExtractor.extractMetrics(resultStream, responseCharset); + break; + default: - resultStream = ResultExtractor.extract(resultStream); ++ resultStream = ResultExtractor.extract(resultStream, responseCharset); + break; + } } else { String handleVar = getHandleVariable(statement); resultStream = executeQueryService(statement, fmt, uri, @@@ -1805,8 -1806,20 +1859,8 @@@ ArrayList<String> toBeDropped = new ArrayList<>(); InputStream resultStream = executeQueryService( "select dv.DataverseName from Metadata.`Dataverse` as dv order by dv.DataverseName;", - getEndpoint(Servlets.QUERY_SERVICE), OutputFormat.CLEAN_JSON, UTF_8); - String out = IOUtils.toString(resultStream, UTF_8); - ObjectMapper om = new ObjectMapper(); - om.setConfig(om.getDeserializationConfig().with(DeserializationFeature.ACCEPT_EMPTY_STRING_AS_NULL_OBJECT)); - JsonNode result; - try { - result = om.readValue(out, ObjectNode.class).get("results"); - } catch (JsonMappingException e) { - LOGGER.warn("error mapping response '{}' to json", out, e); - result = null; - } - if (result == null) { - return; - } + getEndpoint(Servlets.QUERY_SERVICE), OutputFormat.CLEAN_JSON); - JsonNode result = extractResult(IOUtils.toString(resultStream, StandardCharsets.UTF_8)); ++ JsonNode result = extractResult(IOUtils.toString(resultStream, UTF_8)); for (int i = 0; i < result.size(); i++) { JsonNode json = result.get(i); if (json != null) { diff --cc asterixdb/asterix-app/src/test/java/org/apache/asterix/test/runtime/ExecutionTestUtil.java index b4c5b26,b4c5b26..05a301c --- a/asterixdb/asterix-app/src/test/java/org/apache/asterix/test/runtime/ExecutionTestUtil.java +++ b/asterixdb/asterix-app/src/test/java/org/apache/asterix/test/runtime/ExecutionTestUtil.java @@@ -43,15 -43,15 +43,6 @@@ public class ExecutionTestUtil protected static final Logger LOGGER = LogManager.getLogger(); -- static { -- // hack to ensure we have a unique location for external libraries in our tests (asterix cluster has a shared home directory) -- String appHome = joinPath(System.getProperty("app.home", System.getProperty("user.home")), -- "appHome" + (int) (Math.random() * Integer.MAX_VALUE)); -- LOGGER.info("setting app.home to {}", appHome); -- System.setProperty("app.home", appHome); -- new File(appHome).deleteOnExit(); -- } -- protected static final String PATH_ACTUAL = "rttest" + File.separator; public static TestGroup FailedGroup; diff --cc hyracks-fullstack/hyracks/hyracks-http/src/main/java/org/apache/hyracks/http/server/FullResponse.java index f1ff92c,b42db39..417d082 --- a/hyracks-fullstack/hyracks/hyracks-http/src/main/java/org/apache/hyracks/http/server/FullResponse.java +++ b/hyracks-fullstack/hyracks/hyracks-http/src/main/java/org/apache/hyracks/http/server/FullResponse.java @@@ -49,12 -50,14 +49,12 @@@ public class FullResponse implements IS private PrintWriter writer; private ChannelFuture future; - public FullResponse(ChannelHandlerContext ctx, FullHttpRequest request) { + public FullResponse(HttpServerHandler<?> handler, ChannelHandlerContext ctx, FullHttpRequest request) { + this.handler = handler; this.ctx = ctx; - baos = new ByteArrayOutputStream(); + baos = new ByteArrayOutputStream(4096); response = new DefaultFullHttpResponse(HttpVersion.HTTP_1_1, HttpResponseStatus.INTERNAL_SERVER_ERROR); - keepAlive = HttpUtil.isKeepAlive(request); - if (keepAlive) { - response.headers().set(HttpHeaderNames.CONNECTION, HttpHeaderValues.KEEP_ALIVE); - } + HttpUtil.setConnectionHeader(request, response); } @Override diff --cc hyracks-fullstack/hyracks/hyracks-http/src/main/java/org/apache/hyracks/http/server/utils/HttpUtil.java index 1a51318,6e4a273..78b5096 --- a/hyracks-fullstack/hyracks/hyracks-http/src/main/java/org/apache/hyracks/http/server/utils/HttpUtil.java +++ b/hyracks-fullstack/hyracks/hyracks-http/src/main/java/org/apache/hyracks/http/server/utils/HttpUtil.java @@@ -174,13 -174,7 +179,13 @@@ public class HttpUtil return clusterURL; } + public static void setConnectionHeader(HttpRequest request, DefaultHttpResponse response) { + final boolean keepAlive = io.netty.handler.codec.http.HttpUtil.isKeepAlive(request); + final AsciiString connectionHeaderValue = keepAlive ? HttpHeaderValues.KEEP_ALIVE : HttpHeaderValues.CLOSE; + response.headers().set(HttpHeaderNames.CONNECTION, connectionHeaderValue); + } + - public static String getPreferredCharset(IServletRequest request) { + public static Charset getPreferredCharset(IServletRequest request) { return getPreferredCharset(request, DEFAULT_RESPONSE_CHARSET); }