You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@asterixdb.apache.org by mb...@apache.org on 2019/02/16 15:10:57 UTC
[asterixdb] 02/02: Merge commit '5543132' from
'stabilization-f69489' into 'master'
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);
}