Handle error conditions in the /query/status API
Change-Id: I30176c5c70dcc5f7f6605ad79dd0e41967373d9c
Reviewed-on: https://asterix-gerrit.ics.uci.edu/1522
Tested-by: Jenkins <jenkins@fulliautomatix.ics.uci.edu>
Reviewed-by: Yingyi Bu <buyingyi@gmail.com>
Integration-Tests: Jenkins <jenkins@fulliautomatix.ics.uci.edu>
diff --git a/asterixdb/asterix-app/src/main/java/org/apache/asterix/api/http/server/QueryStatusApiServlet.java b/asterixdb/asterix-app/src/main/java/org/apache/asterix/api/http/server/QueryStatusApiServlet.java
index 5a62eaa..1c3f4c7 100644
--- a/asterixdb/asterix-app/src/main/java/org/apache/asterix/api/http/server/QueryStatusApiServlet.java
+++ b/asterixdb/asterix-app/src/main/java/org/apache/asterix/api/http/server/QueryStatusApiServlet.java
@@ -29,6 +29,7 @@
import org.apache.asterix.app.result.ResultReader;
import org.apache.hyracks.api.client.IHyracksClientConnection;
+import org.apache.hyracks.api.dataset.DatasetJobRecord;
import org.apache.hyracks.api.dataset.IHyracksDataset;
import org.apache.hyracks.api.dataset.ResultSetId;
import org.apache.hyracks.api.job.JobId;
@@ -38,11 +39,11 @@
import org.apache.hyracks.http.server.AbstractServlet;
import org.apache.hyracks.http.server.utils.HttpUtil;
+import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.node.ObjectNode;
-import io.netty.handler.codec.http.HttpMethod;
import io.netty.handler.codec.http.HttpResponseStatus;
public class QueryStatusApiServlet extends AbstractServlet {
@@ -56,7 +57,7 @@
protected void get(IServletRequest request, IServletResponse response) {
response.setStatus(HttpResponseStatus.OK);
try {
- HttpUtil.setContentType(response, HttpUtil.ContentType.TEXT_HTML, HttpUtil.Encoding.UTF8);
+ HttpUtil.setContentType(response, HttpUtil.ContentType.TEXT_PLAIN, HttpUtil.Encoding.UTF8);
} catch (IOException e) {
LOGGER.log(Level.WARNING, "Failure setting content type", e);
response.setStatus(HttpResponseStatus.INTERNAL_SERVER_ERROR);
@@ -65,6 +66,15 @@
String strHandle = request.getParameter("handle");
PrintWriter out = response.writer();
try {
+ ObjectMapper om = new ObjectMapper();
+ JsonNode handle = parseHandle(om, strHandle, LOGGER);
+ if (handle == null) {
+ response.setStatus(HttpResponseStatus.BAD_REQUEST);
+ return;
+ }
+ JobId jobId = new JobId(handle.get(0).asLong());
+ ResultSetId rsId = new ResultSetId(handle.get(1).asLong());
+
IHyracksDataset hds = (IHyracksDataset) ctx.get(HYRACKS_DATASET_ATTR);
if (hds == null) {
synchronized (ctx) {
@@ -76,12 +86,6 @@
}
}
}
- ObjectMapper om = new ObjectMapper();
- JsonNode handleObj = om.readTree(strHandle);
- JsonNode handle = handleObj.get("handle");
- JobId jobId = new JobId(handle.get(0).asLong());
- ResultSetId rsId = new ResultSetId(handle.get(1).asLong());
-
/* TODO(madhusudancs): We need to find a way to LOSSLESS_JSON serialize default format obtained from
* metadataProvider in the AQLTranslator and store it as part of the result handle.
*/
@@ -89,14 +93,32 @@
resultReader.open(jobId, rsId);
ObjectNode jsonResponse = om.createObjectNode();
- jsonResponse.put("status", resultReader.getStatus().name());
+ final DatasetJobRecord.Status status = resultReader.getStatus();
+ if (status == null) {
+ LOGGER.log(Level.INFO, "No results for: \"" + strHandle + "\"");
+ response.setStatus(HttpResponseStatus.NOT_FOUND);
+ return;
+ }
+ jsonResponse.put("status", status.name());
out.write(jsonResponse.toString());
} catch (Exception e) {
LOGGER.log(Level.SEVERE, "Failure handling a request", e);
out.println(e.getMessage());
- e.printStackTrace(out);
}
}
+ static JsonNode parseHandle(ObjectMapper om, String strHandle, Logger logger) throws IOException {
+ if (strHandle == null) {
+ logger.log(Level.WARNING, "No handle provided");
+ } else {
+ try {
+ JsonNode handleObj = om.readTree(strHandle);
+ return handleObj.get("handle");
+ } catch (JsonProcessingException e) {
+ logger.log(Level.WARNING, "Invalid handle: \"" + strHandle + "\"");
+ }
+ }
+ return null;
+ }
}
diff --git a/asterixdb/asterix-app/src/test/java/org/apache/asterix/test/runtime/ClusterStateExecutionTest.java b/asterixdb/asterix-app/src/test/java/org/apache/asterix/test/runtime/APIExecutionTest.java
similarity index 87%
rename from asterixdb/asterix-app/src/test/java/org/apache/asterix/test/runtime/ClusterStateExecutionTest.java
rename to asterixdb/asterix-app/src/test/java/org/apache/asterix/test/runtime/APIExecutionTest.java
index 4d19cbf..82f90ec 100644
--- a/asterixdb/asterix-app/src/test/java/org/apache/asterix/test/runtime/ClusterStateExecutionTest.java
+++ b/asterixdb/asterix-app/src/test/java/org/apache/asterix/test/runtime/APIExecutionTest.java
@@ -33,7 +33,7 @@
* Runs the cluster state runtime tests with the storage parallelism.
*/
@RunWith(Parameterized.class)
-public class ClusterStateExecutionTest {
+public class APIExecutionTest {
protected static final String TEST_CONFIG_FILE_NAME = "asterix-build-configuration.xml";
@BeforeClass
@@ -46,14 +46,14 @@
LangExecutionUtil.tearDown();
}
- @Parameters(name = "ClusterStateExecutionTest {index}: {0}")
+ @Parameters(name = "APIExecutionTest {index}: {0}")
public static Collection<Object[]> tests() throws Exception {
- return LangExecutionUtil.tests("only_cluster_state.xml", "cluster_state.xml");
+ return LangExecutionUtil.tests("only_api.xml", "api.xml");
}
protected TestCaseContext tcCtx;
- public ClusterStateExecutionTest(TestCaseContext tcCtx) {
+ public APIExecutionTest(TestCaseContext tcCtx) {
this.tcCtx = tcCtx;
}
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/api.xml b/asterixdb/asterix-app/src/test/resources/runtimets/api.xml
new file mode 100644
index 0000000..6e97c0e
--- /dev/null
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/api.xml
@@ -0,0 +1,98 @@
+<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
+<!--
+ ! Licensed to the Apache Software Foundation (ASF) under one
+ ! or more contributor license agreements. See the NOTICE file
+ ! distributed with this work for additional information
+ ! regarding copyright ownership. The ASF licenses this file
+ ! to you under the Apache License, Version 2.0 (the
+ ! "License"); you may not use this file except in compliance
+ ! with the License. You may obtain a copy of the License at
+ !
+ ! http://www.apache.org/licenses/LICENSE-2.0
+ !
+ ! Unless required by applicable law or agreed to in writing,
+ ! software distributed under the License is distributed on an
+ ! "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ ! KIND, either express or implied. See the License for the
+ ! specific language governing permissions and limitations
+ ! under the License.
+ !-->
+<test-suite xmlns="urn:xml.testframework.asterix.apache.org" ResultOffsetPath="results" QueryOffsetPath="queries">
+ <test-group name="api">
+ <test-case FilePath="api">
+ <compilation-unit name="cluster_state_1">
+ <output-dir compare="Text">cluster_state_1</output-dir>
+ </compilation-unit>
+ </test-case>
+ <test-case FilePath="api">
+ <compilation-unit name="cluster_state_2">
+ <output-dir compare="Text">cluster_state_2</output-dir>
+ <expected-error>HTTP/1.1 404 Not Found</expected-error>
+ </compilation-unit>
+ </test-case>
+ <test-case FilePath="api">
+ <compilation-unit name="cluster_state_3">
+ <output-dir compare="Text">cluster_state_3</output-dir>
+ </compilation-unit>
+ </test-case>
+ <test-case FilePath="api">
+ <compilation-unit name="cluster_state_4">
+ <output-dir compare="Text">cluster_state_4</output-dir>
+ </compilation-unit>
+ </test-case>
+ <test-case FilePath="api">
+ <compilation-unit name="cluster_state_cc_1">
+ <output-dir compare="Text">cluster_state_cc_1</output-dir>
+ </compilation-unit>
+ </test-case>
+ <test-case FilePath="api">
+ <compilation-unit name="cluster_state_cc_stats_1">
+ <output-dir compare="Text">cluster_state_cc_stats_1</output-dir>
+ </compilation-unit>
+ </test-case>
+ <test-case FilePath="api">
+ <compilation-unit name="cluster_state_nc_threaddump_1">
+ <output-dir compare="Text">cluster_state_nc_threaddump_1</output-dir>
+ </compilation-unit>
+ </test-case>
+ <test-case FilePath="api">
+ <compilation-unit name="version_1">
+ <output-dir compare="Text">version_1</output-dir>
+ </compilation-unit>
+ </test-case>
+ <test-case FilePath="api">
+ <compilation-unit name="diagnostics_1">
+ <output-dir compare="Text">diagnostics_1</output-dir>
+ </compilation-unit>
+ </test-case>
+ <test-case FilePath="api">
+ <compilation-unit name="replication">
+ <output-dir compare="Text">replication</output-dir>
+ </compilation-unit>
+ </test-case>
+ <test-case FilePath="api">
+ <compilation-unit name="query_status_1">
+ <output-dir compare="Text">query_status_1</output-dir>
+ <expected-error>HTTP/1.1 404 Not Found</expected-error>
+ </compilation-unit>
+ </test-case>
+ <test-case FilePath="api">
+ <compilation-unit name="query_status_2">
+ <output-dir compare="Text">query_status_2</output-dir>
+ <expected-error>HTTP/1.1 400 Bad Request</expected-error>
+ </compilation-unit>
+ </test-case>
+ <test-case FilePath="api">
+ <compilation-unit name="query_status_3">
+ <output-dir compare="Text">query_status_3</output-dir>
+ <expected-error>HTTP/1.1 400 Bad Request</expected-error>
+ </compilation-unit>
+ </test-case>
+ <test-case FilePath="api">
+ <compilation-unit name="query_status_4">
+ <output-dir compare="Text">query_status_4</output-dir>
+ <expected-error>HTTP/1.1 400 Bad Request</expected-error>
+ </compilation-unit>
+ </test-case>
+ </test-group>
+</test-suite>
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/only_api.xml b/asterixdb/asterix-app/src/test/resources/runtimets/only_api.xml
new file mode 100644
index 0000000..eea32a7
--- /dev/null
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/only_api.xml
@@ -0,0 +1,25 @@
+<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
+<!--
+ ~ /*
+ ~ * Licensed to the Apache Software Foundation (ASF) under one
+ ~ * or more contributor license agreements. See the NOTICE file
+ ~ * distributed with this work for additional information
+ ~ * regarding copyright ownership. The ASF licenses this file
+ ~ * to you under the Apache License, Version 2.0 (the
+ ~ * "License"); you may not use this file except in compliance
+ ~ * with the License. You may obtain a copy of the License at
+ ~ *
+ ~ * http://www.apache.org/licenses/LICENSE-2.0
+ ~ *
+ ~ * Unless required by applicable law or agreed to in writing,
+ ~ * software distributed under the License is distributed on an
+ ~ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ ~ * KIND, either express or implied. See the License for the
+ ~ * specific language governing permissions and limitations
+ ~ * under the License.
+ ~ */
+ -->
+<test-suite xmlns="urn:xml.testframework.asterix.apache.org" ResultOffsetPath="results" QueryOffsetPath="queries">
+ <test-group name="failed">
+ </test-group>
+</test-suite>
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries/api/APIQueries.xml b/asterixdb/asterix-app/src/test/resources/runtimets/queries/api/APIQueries.xml
deleted file mode 100644
index eb505f1..0000000
--- a/asterixdb/asterix-app/src/test/resources/runtimets/queries/api/APIQueries.xml
+++ /dev/null
@@ -1,66 +0,0 @@
-<!--
- ! Licensed to the Apache Software Foundation (ASF) under one
- ! or more contributor license agreements. See the NOTICE file
- ! distributed with this work for additional information
- ! regarding copyright ownership. The ASF licenses this file
- ! to you under the Apache License, Version 2.0 (the
- ! "License"); you may not use this file except in compliance
- ! with the License. You may obtain a copy of the License at
- !
- ! http://www.apache.org/licenses/LICENSE-2.0
- !
- ! Unless required by applicable law or agreed to in writing,
- ! software distributed under the License is distributed on an
- ! "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- ! KIND, either express or implied. See the License for the
- ! specific language governing permissions and limitations
- ! under the License.
- !-->
-<test-group name="api">
- <test-case FilePath="api">
- <compilation-unit name="cluster_state_2">
- <output-dir compare="Text">cluster_state_2</output-dir>
- <expected-error>HTTP/1.1 404 Not Found</expected-error>
- </compilation-unit>
- </test-case>
- <test-case FilePath="api">
- <compilation-unit name="cluster_state_3">
- <output-dir compare="Text">cluster_state_3</output-dir>
- </compilation-unit>
- </test-case>
- <test-case FilePath="api">
- <compilation-unit name="cluster_state_4">
- <output-dir compare="Text">cluster_state_4</output-dir>
- </compilation-unit>
- </test-case>
- <test-case FilePath="api">
- <compilation-unit name="cluster_state_cc_1">
- <output-dir compare="Text">cluster_state_cc_1</output-dir>
- </compilation-unit>
- </test-case>
- <test-case FilePath="api">
- <compilation-unit name="cluster_state_cc_stats_1">
- <output-dir compare="Text">cluster_state_cc_stats_1</output-dir>
- </compilation-unit>
- </test-case>
- <test-case FilePath="api">
- <compilation-unit name="cluster_state_nc_threaddump_1">
- <output-dir compare="Text">cluster_state_nc_threaddump_1</output-dir>
- </compilation-unit>
- </test-case>
- <test-case FilePath="api">
- <compilation-unit name="version_1">
- <output-dir compare="Text">version_1</output-dir>
- </compilation-unit>
- </test-case>
- <test-case FilePath="api">
- <compilation-unit name="diagnostics_1">
- <output-dir compare="Text">diagnostics_1</output-dir>
- </compilation-unit>
- </test-case>
- <test-case FilePath="api">
- <compilation-unit name="replication">
- <output-dir compare="Text">replication</output-dir>
- </compilation-unit>
- </test-case>
-</test-group>
\ No newline at end of file
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries/api/query_status_1/query_status_1.1.get.http b/asterixdb/asterix-app/src/test/resources/runtimets/queries/api/query_status_1/query_status_1.1.get.http
new file mode 100644
index 0000000..c18a55b
--- /dev/null
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/queries/api/query_status_1/query_status_1.1.get.http
@@ -0,0 +1,25 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+/*
+ * Test case Name : query_status_1
+ * Description : test query status for non-existent result
+ * Expected Result : Negative
+ * Date : 7th September 2016
+ */
+/query/status?handle={"handle":[18,0]}
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries/api/query_status_2/query_status_2.1.get.http b/asterixdb/asterix-app/src/test/resources/runtimets/queries/api/query_status_2/query_status_2.1.get.http
new file mode 100644
index 0000000..d7ece4c
--- /dev/null
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/queries/api/query_status_2/query_status_2.1.get.http
@@ -0,0 +1,25 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+/*
+ * Test case Name : query_status_2
+ * Description : test query status for incorrect handle
+ * Expected Result : Negative
+ * Date : 7th September 2016
+ */
+/query/status?handle={"handle":[18,0]
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries/api/query_status_3/query_status_3.1.get.http b/asterixdb/asterix-app/src/test/resources/runtimets/queries/api/query_status_3/query_status_3.1.get.http
new file mode 100644
index 0000000..a7ff551
--- /dev/null
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/queries/api/query_status_3/query_status_3.1.get.http
@@ -0,0 +1,25 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+/*
+ * Test case Name : query_status_3
+ * Description : test query status for empty handle
+ * Expected Result : Negative
+ * Date : 7th September 2016
+ */
+/query/status?handle
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries/api/query_status_4/query_status_4.1.get.http b/asterixdb/asterix-app/src/test/resources/runtimets/queries/api/query_status_4/query_status_4.1.get.http
new file mode 100644
index 0000000..5831686
--- /dev/null
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/queries/api/query_status_4/query_status_4.1.get.http
@@ -0,0 +1,25 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+/*
+ * Test case Name : query_status_4
+ * Description : test query status for non-existent handle
+ * Expected Result : Negative
+ * Date : 7th September 2016
+ */
+/query/status?handl={"handle":[18,0]}
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/testsuite.xml b/asterixdb/asterix-app/src/test/resources/runtimets/testsuite.xml
index f9242f6..a4bd36f 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/testsuite.xml
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/testsuite.xml
@@ -19,7 +19,6 @@
<!-- Keep test-suite list in Alphabetical order. -->
<!DOCTYPE test-suite [
- <!ENTITY APIQueries SYSTEM "queries/api/APIQueries.xml">
<!ENTITY ComparisonQueries SYSTEM "queries/comparison/ComparisonQueries.xml">
<!ENTITY DeepEqualQueries SYSTEM "queries/comparison/deep_equal/DeepEqualQueries.xml">
<!ENTITY RecordsQueries SYSTEM "queries/objects/ObjectsQueries.xml">
@@ -32,7 +31,6 @@
ResultOffsetPath="results"
QueryOffsetPath="queries"
QueryFileExtension=".aql">
- &APIQueries;
<test-group name="external-library">
<test-case FilePath="external-library">
<compilation-unit name="typed_adapter">
diff --git a/hyracks-fullstack/hyracks/hyracks-api/src/main/java/org/apache/hyracks/api/exceptions/ErrorCode.java b/hyracks-fullstack/hyracks/hyracks-api/src/main/java/org/apache/hyracks/api/exceptions/ErrorCode.java
index b5bd1a9..1b97a60 100644
--- a/hyracks-fullstack/hyracks/hyracks-api/src/main/java/org/apache/hyracks/api/exceptions/ErrorCode.java
+++ b/hyracks-fullstack/hyracks/hyracks-api/src/main/java/org/apache/hyracks/api/exceptions/ErrorCode.java
@@ -58,6 +58,7 @@
public static final int ERROR_FINDING_DISTRIBUTED_JOB = 21;
public static final int DUPLICATE_DISTRIBUTED_JOB = 22;
public static final int DISTRIBUTED_JOB_FAILURE = 23;
+ public static final int NO_RESULTSET = 24;
// Compilation error codes.
public static final int RULECOLLECTION_NOT_INSTANCE_OF_LIST = 10001;
diff --git a/hyracks-fullstack/hyracks/hyracks-api/src/main/resources/errormsg/en.properties b/hyracks-fullstack/hyracks/hyracks-api/src/main/resources/errormsg/en.properties
index f536d3e..3711e48 100644
--- a/hyracks-fullstack/hyracks/hyracks-api/src/main/resources/errormsg/en.properties
+++ b/hyracks-fullstack/hyracks/hyracks-api/src/main/resources/errormsg/en.properties
@@ -42,5 +42,6 @@
21 = The distributed job %1$s was not found
22 = The distributed job %1$s already exists
23 = The distributed work failed for %1$s at %2$s
+24 = No result set %1$s for job %2$s
10000 = The given rule collection %1$s is not an instance of the List class.
diff --git a/hyracks-fullstack/hyracks/hyracks-client/src/main/java/org/apache/hyracks/client/dataset/HyracksDatasetReader.java b/hyracks-fullstack/hyracks/hyracks-client/src/main/java/org/apache/hyracks/client/dataset/HyracksDatasetReader.java
index f6f05d2..e47d822 100644
--- a/hyracks-fullstack/hyracks/hyracks-client/src/main/java/org/apache/hyracks/client/dataset/HyracksDatasetReader.java
+++ b/hyracks-fullstack/hyracks/hyracks-client/src/main/java/org/apache/hyracks/client/dataset/HyracksDatasetReader.java
@@ -25,6 +25,7 @@
import java.nio.ByteBuffer;
import java.util.concurrent.atomic.AtomicBoolean;
import java.util.concurrent.atomic.AtomicInteger;
+import java.util.logging.Level;
import java.util.logging.Logger;
import org.apache.hyracks.api.channels.IInputChannel;
@@ -37,6 +38,7 @@
import org.apache.hyracks.api.dataset.IHyracksDatasetDirectoryServiceConnection;
import org.apache.hyracks.api.dataset.IHyracksDatasetReader;
import org.apache.hyracks.api.dataset.ResultSetId;
+import org.apache.hyracks.api.exceptions.ErrorCode;
import org.apache.hyracks.api.exceptions.HyracksDataException;
import org.apache.hyracks.api.exceptions.HyracksException;
import org.apache.hyracks.api.job.JobId;
@@ -87,13 +89,16 @@
@Override
public Status getResultStatus() {
- Status status = null;
try {
- status = datasetDirectoryServiceConnection.getDatasetResultStatus(jobId, resultSetId);
+ return datasetDirectoryServiceConnection.getDatasetResultStatus(jobId, resultSetId);
+ } catch (HyracksDataException e) {
+ if (e.getErrorCode() != ErrorCode.NO_RESULTSET) {
+ LOGGER.log(Level.WARNING, "Exception retrieving result set for job " + jobId, e);
+ }
} catch (Exception e) {
- // TODO(madhusudancs): Decide what to do in case of error
+ LOGGER.log(Level.WARNING, "Exception retrieving result set for job " + jobId, e);
}
- return status;
+ return null;
}
private DatasetDirectoryRecord getRecord(int partition) throws Exception {
diff --git a/hyracks-fullstack/hyracks/hyracks-control/hyracks-control-cc/src/main/java/org/apache/hyracks/control/cc/dataset/DatasetDirectoryService.java b/hyracks-fullstack/hyracks/hyracks-control/hyracks-control-cc/src/main/java/org/apache/hyracks/control/cc/dataset/DatasetDirectoryService.java
index c4cf38d..ceeb9fa 100644
--- a/hyracks-fullstack/hyracks/hyracks-control/hyracks-control-cc/src/main/java/org/apache/hyracks/control/cc/dataset/DatasetDirectoryService.java
+++ b/hyracks-fullstack/hyracks/hyracks-control/hyracks-control-cc/src/main/java/org/apache/hyracks/control/cc/dataset/DatasetDirectoryService.java
@@ -162,13 +162,9 @@
@Override
public synchronized Status getResultStatus(JobId jobId, ResultSetId rsId) throws HyracksDataException {
- DatasetJobRecord djr;
- while ((djr = getDatasetJobRecord(jobId)) == null) {
- try {
- wait();
- } catch (InterruptedException e) {
- throw new HyracksDataException(e);
- }
+ DatasetJobRecord djr = getDatasetJobRecord(jobId);
+ if (djr == null) {
+ throw HyracksDataException.create(ErrorCode.NO_RESULTSET, rsId, jobId);
}
return djr.getStatus();
}
diff --git a/hyracks-fullstack/hyracks/hyracks-ipc/src/main/java/org/apache/hyracks/ipc/impl/IPCSystem.java b/hyracks-fullstack/hyracks/hyracks-ipc/src/main/java/org/apache/hyracks/ipc/impl/IPCSystem.java
index 62be1b0..0997e57 100644
--- a/hyracks-fullstack/hyracks/hyracks-ipc/src/main/java/org/apache/hyracks/ipc/impl/IPCSystem.java
+++ b/hyracks-fullstack/hyracks/hyracks-ipc/src/main/java/org/apache/hyracks/ipc/impl/IPCSystem.java
@@ -21,6 +21,8 @@
import java.io.IOException;
import java.net.InetSocketAddress;
import java.util.concurrent.atomic.AtomicLong;
+import java.util.logging.Level;
+import java.util.logging.Logger;
import org.apache.hyracks.ipc.api.IIPCHandle;
import org.apache.hyracks.ipc.api.IIPCI;
@@ -29,6 +31,8 @@
import org.apache.hyracks.ipc.exceptions.IPCException;
public class IPCSystem {
+ private static final Logger LOGGER = Logger.getLogger(IPCSystem.class.getName());
+
private final IPCConnectionManager cMgr;
private final IIPCI ipci;
@@ -88,7 +92,7 @@
Exception exception = null;
if (message.getFlag() == Message.ERROR) {
exception = (Exception) message.getPayload();
- exception.printStackTrace();
+ LOGGER.log(Level.INFO, "Exception in message " + message.toString());
} else {
payload = message.getPayload();
}