>From Peeyush Gupta <[email protected]>:
Peeyush Gupta has uploaded this change for review. (
https://asterix-gerrit.ics.uci.edu/c/asterixdb/+/20802?usp=email )
Change subject: WIP: Add request level result_ttl
......................................................................
WIP: Add request level result_ttl
Change-Id: Idb5597cf401490d4d074580135cdd37674b036a2
---
M
asterixdb/asterix-algebra/src/main/java/org/apache/asterix/translator/ResultProperties.java
M
asterixdb/asterix-app/src/main/java/org/apache/asterix/api/http/server/QueryServiceRequestParameters.java
M
asterixdb/asterix-app/src/main/java/org/apache/asterix/api/http/server/QueryServiceServlet.java
M
asterixdb/asterix-app/src/main/java/org/apache/asterix/app/translator/QueryTranslator.java
A
asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/async-deferred-improved/async-result-ttl-basic/async-result-ttl-basic.1.async.sqlpp
A
asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/async-deferred-improved/async-result-ttl-basic/async-result-ttl-basic.2.pollget.http
A
asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/async-deferred-improved/async-result-ttl-basic/async-result-ttl-basic.3.get.http
A
asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/async-deferred-improved/async-result-ttl/async-result-ttl.1.async.sqlpp
A
asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/async-deferred-improved/async-result-ttl/async-result-ttl.2.pollget.http
A
asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/async-deferred-improved/async-result-ttl/async-result-ttl.3.get.http
A
asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/async-deferred-improved/async-result-ttl/async-result-ttl.4.sleep.sqlpp
A
asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/async-deferred-improved/async-result-ttl/async-result-ttl.5.get.http
M
asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/async-deferred/AsyncDeferredQueries.xml
A
asterixdb/asterix-app/src/test/resources/runtimets/results/async-deferred-improved/async-result-ttl-basic/async-result-ttl-basic.1.ignore
A
asterixdb/asterix-app/src/test/resources/runtimets/results/async-deferred-improved/async-result-ttl-basic/async-result-ttl-basic.2.regexjson
A
asterixdb/asterix-app/src/test/resources/runtimets/results/async-deferred-improved/async-result-ttl-basic/async-result-ttl-basic.3.regexjson
A
asterixdb/asterix-app/src/test/resources/runtimets/results/async-deferred-improved/async-result-ttl/async-result-ttl.1.ignore
A
asterixdb/asterix-app/src/test/resources/runtimets/results/async-deferred-improved/async-result-ttl/async-result-ttl.2.regexjson
A
asterixdb/asterix-app/src/test/resources/runtimets/results/async-deferred-improved/async-result-ttl/async-result-ttl.3.regexjson
A
asterixdb/asterix-app/src/test/resources/runtimets/results/async-deferred-improved/async-result-ttl/async-result-ttl.4.ignore
M asterixdb/asterix-doc/src/site/markdown/api.md
M
hyracks-fullstack/hyracks/hyracks-api/src/main/java/org/apache/hyracks/api/job/HyracksJobProperty.java
M
hyracks-fullstack/hyracks/hyracks-api/src/main/java/org/apache/hyracks/api/result/IResultStateRecord.java
M
hyracks-fullstack/hyracks/hyracks-api/src/main/java/org/apache/hyracks/api/result/ResultJobRecord.java
M
hyracks-fullstack/hyracks/hyracks-control/hyracks-control-cc/src/main/java/org/apache/hyracks/control/cc/result/ResultDirectoryService.java
M
hyracks-fullstack/hyracks/hyracks-control/hyracks-control-common/src/main/java/org/apache/hyracks/control/common/result/AbstractResultManager.java
M
hyracks-fullstack/hyracks/hyracks-control/hyracks-control-nc/src/main/java/org/apache/hyracks/control/nc/result/ResultSetMap.java
27 files changed, 295 insertions(+), 11 deletions(-)
git pull ssh://asterix-gerrit.ics.uci.edu:29418/asterixdb
refs/changes/02/20802/1
diff --git
a/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/translator/ResultProperties.java
b/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/translator/ResultProperties.java
index 84d3885..21322d4 100644
---
a/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/translator/ResultProperties.java
+++
b/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/translator/ResultProperties.java
@@ -21,19 +21,26 @@
import java.io.Serializable;
public class ResultProperties implements Serializable {
- private static final long serialVersionUID = -4741260459407538016L;
+ private static final long serialVersionUID = -4741260459407538017L;
public static final long DEFAULT_MAX_READS = 1;
+ public static final long DEFAULT_RESULT_TTL = -1L; // -1 means use system
default
private final IStatementExecutor.ResultDelivery delivery;
private final long maxReads;
+ private final long resultTtlInMillis;
public ResultProperties(IStatementExecutor.ResultDelivery delivery) {
- this(delivery, DEFAULT_MAX_READS);
+ this(delivery, DEFAULT_MAX_READS, DEFAULT_RESULT_TTL);
}
public ResultProperties(IStatementExecutor.ResultDelivery delivery, long
maxReads) {
+ this(delivery, maxReads, DEFAULT_RESULT_TTL);
+ }
+
+ public ResultProperties(IStatementExecutor.ResultDelivery delivery, long
maxReads, long resultTtlInMillis) {
this.delivery = delivery;
this.maxReads = maxReads;
+ this.resultTtlInMillis = resultTtlInMillis;
}
public IStatementExecutor.ResultDelivery getDelivery() {
@@ -44,11 +51,15 @@
return maxReads;
}
+ public long getResultTtlInMillis() {
+ return resultTtlInMillis;
+ }
+
public ResultProperties getNcToCcResultProperties() {
if (delivery != IStatementExecutor.ResultDelivery.IMMEDIATE) {
return this;
}
// switch IMMEDIATE to DEFERRED since the result will be severed by
the NC
- return new
ResultProperties(IStatementExecutor.ResultDelivery.DEFERRED, maxReads);
+ return new
ResultProperties(IStatementExecutor.ResultDelivery.DEFERRED, maxReads,
resultTtlInMillis);
}
}
diff --git
a/asterixdb/asterix-app/src/main/java/org/apache/asterix/api/http/server/QueryServiceRequestParameters.java
b/asterixdb/asterix-app/src/main/java/org/apache/asterix/api/http/server/QueryServiceRequestParameters.java
index 8b48405..70fe6d7 100644
---
a/asterixdb/asterix-app/src/main/java/org/apache/asterix/api/http/server/QueryServiceRequestParameters.java
+++
b/asterixdb/asterix-app/src/main/java/org/apache/asterix/api/http/server/QueryServiceRequestParameters.java
@@ -85,7 +85,8 @@
MAX_WARNINGS("max-warnings"),
SQL_COMPAT("sql-compat"),
SOURCE("source"),
- INCLUDE_HOST("include-host");
+ INCLUDE_HOST("include-host"),
+ RESULT_TTL("result-ttl");
private final String str;
@@ -157,6 +158,7 @@
private long timeout = TimeUnit.MILLISECONDS.toMillis(Long.MAX_VALUE);
private long maxResultReads = 1L;
private long maxWarnings = 0L;
+ private long resultTtlInMillis = -1L; // -1 means use system default
private boolean includeHost = false;
public String getHost() {
@@ -412,6 +414,14 @@
return maxWarnings;
}
+ public long getResultTtlInMillis() {
+ return resultTtlInMillis;
+ }
+
+ public void setResultTtlInMillis(long resultTtlInMillis) {
+ this.resultTtlInMillis = resultTtlInMillis;
+ }
+
public void setRequestId(String requestId) {
this.requestId = requestId;
}
@@ -446,6 +456,7 @@
object.put("parseOnly", parseOnly);
object.put("readOnly", readOnly);
object.put("maxWarnings", maxWarnings);
+ object.put("resultTtl", resultTtlInMillis);
object.put("sqlCompat", sqlCompatMode);
object.put("source", source);
if (statementParams != null) {
@@ -525,6 +536,7 @@
setTimeout(parseTime(req, Parameter.TIMEOUT.str(), valGetter,
getTimeout()));
setMaxResultReads(parseLong(req, Parameter.MAX_RESULT_READS.str(),
valGetter, getMaxResultReads()));
setMaxWarnings(parseLong(req, Parameter.MAX_WARNINGS.str(), valGetter,
getMaxWarnings()));
+ setResultTtlInMillis(parseTime(req, Parameter.RESULT_TTL.str(),
valGetter, getResultTtlInMillis()));
setPretty(parseBoolean(req, Parameter.PRETTY.str(), valGetter,
isPretty()));
setExpressionTree(parseBoolean(req, Parameter.EXPRESSION_TREE.str(),
valGetter, isExpressionTree()));
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 d4b6239..3be4d84 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
@@ -237,7 +237,8 @@
}
delivery = param.getMode();
setSessionConfig(sessionOutput, param, delivery);
- final ResultProperties resultProperties = new
ResultProperties(delivery, param.getMaxResultReads());
+ final ResultProperties resultProperties =
+ new ResultProperties(delivery, param.getMaxResultReads(),
param.getResultTtlInMillis());
buildResponseHeaders(requestRef, sessionOutput, param,
responsePrinter, delivery);
responsePrinter.printHeaders();
validateStatement(statement);
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 0c5cd98..37ca303 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
@@ -23,6 +23,7 @@
import static org.apache.asterix.common.utils.IdentifierUtil.dataverse;
import static
org.apache.asterix.lang.common.statement.CreateFullTextFilterStatement.FIELD_TYPE_STOPWORDS;
import static org.apache.hyracks.api.job.HyracksJobProperty.JOB_KIND;
+import static org.apache.hyracks.api.job.HyracksJobProperty.RESULT_TTL;
import static org.apache.hyracks.control.nc.result.ResultState.UNLIMITED_READS;
import java.io.FileInputStream;
@@ -5825,6 +5826,11 @@
}
}
+ // Set per-request result TTL if specified (for async/deferred
queries)
+ long resultTtl =
requestParameters.getResultProperties().getResultTtlInMillis();
+ if (resultTtl > 0) {
+ jobSpec.setProperty(RESULT_TTL,
TimeUnit.MILLISECONDS.toNanos(resultTtl));
+ }
jobId = runTrackJob(hcc, jobSpec, jobFlags, reqId,
requestParameters.getClientContextId(), clientRequest,
jobKind);
if (jId != null) {
diff --git
a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/async-deferred-improved/async-result-ttl-basic/async-result-ttl-basic.1.async.sqlpp
b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/async-deferred-improved/async-result-ttl-basic/async-result-ttl-basic.1.async.sqlpp
new file mode 100644
index 0000000..a2a833e
--- /dev/null
+++
b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/async-deferred-improved/async-result-ttl-basic/async-result-ttl-basic.1.async.sqlpp
@@ -0,0 +1,24 @@
+/*
+ * 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 that result-ttl parameter is accepted and result can be fetched within
the TTL
+-- handlevariable=status
+-- param result-ttl=60s
+-- param include-host=false
+select i, i * i as i2 from range(1, 3) i;
diff --git
a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/async-deferred-improved/async-result-ttl-basic/async-result-ttl-basic.2.pollget.http
b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/async-deferred-improved/async-result-ttl-basic/async-result-ttl-basic.2.pollget.http
new file mode 100644
index 0000000..614e9e0
--- /dev/null
+++
b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/async-deferred-improved/async-result-ttl-basic/async-result-ttl-basic.2.pollget.http
@@ -0,0 +1,22 @@
+/*
+ * 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.
+ */
+
+-- polltimeoutsecs=20
+-- handlevariable=result
+$status
diff --git
a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/async-deferred-improved/async-result-ttl-basic/async-result-ttl-basic.3.get.http
b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/async-deferred-improved/async-result-ttl-basic/async-result-ttl-basic.3.get.http
new file mode 100644
index 0000000..b613531
--- /dev/null
+++
b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/async-deferred-improved/async-result-ttl-basic/async-result-ttl-basic.3.get.http
@@ -0,0 +1,20 @@
+/*
+ * 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.
+ */
+
+$result
diff --git
a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/async-deferred-improved/async-result-ttl/async-result-ttl.1.async.sqlpp
b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/async-deferred-improved/async-result-ttl/async-result-ttl.1.async.sqlpp
new file mode 100644
index 0000000..8f63ec3
--- /dev/null
+++
b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/async-deferred-improved/async-result-ttl/async-result-ttl.1.async.sqlpp
@@ -0,0 +1,23 @@
+/*
+ * 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.
+ */
+
+-- handlevariable=status
+-- param result-ttl=2s
+-- param include-host=false
+select i, i * i as i2 from range(1, 5) i;
diff --git
a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/async-deferred-improved/async-result-ttl/async-result-ttl.2.pollget.http
b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/async-deferred-improved/async-result-ttl/async-result-ttl.2.pollget.http
new file mode 100644
index 0000000..614e9e0
--- /dev/null
+++
b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/async-deferred-improved/async-result-ttl/async-result-ttl.2.pollget.http
@@ -0,0 +1,22 @@
+/*
+ * 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.
+ */
+
+-- polltimeoutsecs=20
+-- handlevariable=result
+$status
diff --git
a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/async-deferred-improved/async-result-ttl/async-result-ttl.3.get.http
b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/async-deferred-improved/async-result-ttl/async-result-ttl.3.get.http
new file mode 100644
index 0000000..b613531
--- /dev/null
+++
b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/async-deferred-improved/async-result-ttl/async-result-ttl.3.get.http
@@ -0,0 +1,20 @@
+/*
+ * 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.
+ */
+
+$result
diff --git
a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/async-deferred-improved/async-result-ttl/async-result-ttl.4.sleep.sqlpp
b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/async-deferred-improved/async-result-ttl/async-result-ttl.4.sleep.sqlpp
new file mode 100644
index 0000000..06b0230
--- /dev/null
+++
b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/async-deferred-improved/async-result-ttl/async-result-ttl.4.sleep.sqlpp
@@ -0,0 +1,21 @@
+/*
+ * 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.
+ */
+
+-- Sleep for 5 seconds to allow result TTL (2s) to expire and sweeper (1s
interval) to run
+5000
diff --git
a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/async-deferred-improved/async-result-ttl/async-result-ttl.5.get.http
b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/async-deferred-improved/async-result-ttl/async-result-ttl.5.get.http
new file mode 100644
index 0000000..cce1a89
--- /dev/null
+++
b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/async-deferred-improved/async-result-ttl/async-result-ttl.5.get.http
@@ -0,0 +1,21 @@
+/*
+ * 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.
+ */
+
+-- This request should fail with 404 because the result TTL has expired
+$result
diff --git
a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/async-deferred/AsyncDeferredQueries.xml
b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/async-deferred/AsyncDeferredQueries.xml
index f741692..f8155ef 100644
---
a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/async-deferred/AsyncDeferredQueries.xml
+++
b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/async-deferred/AsyncDeferredQueries.xml
@@ -121,4 +121,18 @@
<output-dir compare="Clean-JSON">async-json</output-dir>
</compilation-unit>
</test-case>
+ <test-case FilePath="async-deferred-improved">
+ <compilation-unit name="async-result-ttl">
+ <output-dir compare="Clean-JSON">async-result-ttl</output-dir>
+ <parameter name="profile" value="timings" type="string"/>
+ <expected-error>HTTP/1.1 404 Not Found</expected-error>
+ <source-location>false</source-location>
+ </compilation-unit>
+ </test-case>
+ <test-case FilePath="async-deferred-improved">
+ <compilation-unit name="async-result-ttl-basic">
+ <output-dir
compare="Clean-JSON">async-result-ttl-basic</output-dir>
+ <parameter name="profile" value="timings" type="string"/>
+ </compilation-unit>
+ </test-case>
</test-group>
diff --git
a/asterixdb/asterix-app/src/test/resources/runtimets/results/async-deferred-improved/async-result-ttl-basic/async-result-ttl-basic.1.ignore
b/asterixdb/asterix-app/src/test/resources/runtimets/results/async-deferred-improved/async-result-ttl-basic/async-result-ttl-basic.1.ignore
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++
b/asterixdb/asterix-app/src/test/resources/runtimets/results/async-deferred-improved/async-result-ttl-basic/async-result-ttl-basic.1.ignore
diff --git
a/asterixdb/asterix-app/src/test/resources/runtimets/results/async-deferred-improved/async-result-ttl-basic/async-result-ttl-basic.2.regexjson
b/asterixdb/asterix-app/src/test/resources/runtimets/results/async-deferred-improved/async-result-ttl-basic/async-result-ttl-basic.2.regexjson
new file mode 100644
index 0000000..ca9a58a
--- /dev/null
+++
b/asterixdb/asterix-app/src/test/resources/runtimets/results/async-deferred-improved/async-result-ttl-basic/async-result-ttl-basic.2.regexjson
@@ -0,0 +1,9 @@
+{
+ "status":"success",
+ "handle": "R{.*}",
+ "resultCount": 3,
+ "partitions": "R{.*}",
+ "resultSetOrdered": false,
+ "metrics": "R{.*}",
+ "createdAt": "R{.*}"
+}
\ No newline at end of file
diff --git
a/asterixdb/asterix-app/src/test/resources/runtimets/results/async-deferred-improved/async-result-ttl-basic/async-result-ttl-basic.3.regexjson
b/asterixdb/asterix-app/src/test/resources/runtimets/results/async-deferred-improved/async-result-ttl-basic/async-result-ttl-basic.3.regexjson
new file mode 100644
index 0000000..326c5b8
--- /dev/null
+++
b/asterixdb/asterix-app/src/test/resources/runtimets/results/async-deferred-improved/async-result-ttl-basic/async-result-ttl-basic.3.regexjson
@@ -0,0 +1,10 @@
+{
+ "results": [
+ { "i": 1, "i2": 1 },
+ { "i": 2, "i2": 4 },
+ { "i": 3, "i2": 9 }
+ ],
+ "metrics": "R{.*}",
+ "profile": "R{.*}",
+ "createdAt": "R{.*}"
+}
\ No newline at end of file
diff --git
a/asterixdb/asterix-app/src/test/resources/runtimets/results/async-deferred-improved/async-result-ttl/async-result-ttl.1.ignore
b/asterixdb/asterix-app/src/test/resources/runtimets/results/async-deferred-improved/async-result-ttl/async-result-ttl.1.ignore
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++
b/asterixdb/asterix-app/src/test/resources/runtimets/results/async-deferred-improved/async-result-ttl/async-result-ttl.1.ignore
diff --git
a/asterixdb/asterix-app/src/test/resources/runtimets/results/async-deferred-improved/async-result-ttl/async-result-ttl.2.regexjson
b/asterixdb/asterix-app/src/test/resources/runtimets/results/async-deferred-improved/async-result-ttl/async-result-ttl.2.regexjson
new file mode 100644
index 0000000..a967c36
--- /dev/null
+++
b/asterixdb/asterix-app/src/test/resources/runtimets/results/async-deferred-improved/async-result-ttl/async-result-ttl.2.regexjson
@@ -0,0 +1,9 @@
+{
+ "status":"success",
+ "handle": "R{.*}",
+ "resultCount": 5,
+ "partitions": "R{.*}",
+ "resultSetOrdered": false,
+ "metrics": "R{.*}",
+ "createdAt": "R{.*}"
+}
\ No newline at end of file
diff --git
a/asterixdb/asterix-app/src/test/resources/runtimets/results/async-deferred-improved/async-result-ttl/async-result-ttl.3.regexjson
b/asterixdb/asterix-app/src/test/resources/runtimets/results/async-deferred-improved/async-result-ttl/async-result-ttl.3.regexjson
new file mode 100644
index 0000000..4b0c513
--- /dev/null
+++
b/asterixdb/asterix-app/src/test/resources/runtimets/results/async-deferred-improved/async-result-ttl/async-result-ttl.3.regexjson
@@ -0,0 +1,12 @@
+{
+ "results": [
+ { "i": 1, "i2": 1 },
+ { "i": 2, "i2": 4 },
+ { "i": 3, "i2": 9 },
+ { "i": 4, "i2": 16 },
+ { "i": 5, "i2": 25 }
+ ],
+ "metrics": "R{.*}",
+ "profile": "R{.*}",
+ "createdAt": "R{.*}"
+}
\ No newline at end of file
diff --git
a/asterixdb/asterix-app/src/test/resources/runtimets/results/async-deferred-improved/async-result-ttl/async-result-ttl.4.ignore
b/asterixdb/asterix-app/src/test/resources/runtimets/results/async-deferred-improved/async-result-ttl/async-result-ttl.4.ignore
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++
b/asterixdb/asterix-app/src/test/resources/runtimets/results/async-deferred-improved/async-result-ttl/async-result-ttl.4.ignore
diff --git a/asterixdb/asterix-doc/src/site/markdown/api.md
b/asterixdb/asterix-doc/src/site/markdown/api.md
index 81f0e3b..584c424 100644
--- a/asterixdb/asterix-doc/src/site/markdown/api.md
+++ b/asterixdb/asterix-doc/src/site/markdown/api.md
@@ -49,6 +49,9 @@
[DECLARE FUNCTION](sqlpp/manual.html#Declarations), and
[SET](sqlpp/manual.html#Performance_tuning)
* `args` - (SQL++ only) A JSON array where each item is a value of a
[positional query parameter](sqlpp/manual.html#Parameter_references)
* `$parameter_name` - (SQL++ only) a JSON value of a [named query
parameter](sqlpp/manual.html#Parameter_references).
+* `result-ttl` - Specifies how long the result set should be retained for
`async` or `deferred` queries before being
+ automatically discarded. The value can be specified as a duration string
(e.g., `30m`, `1h`, `2d`) or as milliseconds.
+ If not specified, the system default `result.ttl` configuration is used.
This parameter is ignored for `immediate` mode.
__Command (immediate result delivery)__
diff --git
a/hyracks-fullstack/hyracks/hyracks-api/src/main/java/org/apache/hyracks/api/job/HyracksJobProperty.java
b/hyracks-fullstack/hyracks/hyracks-api/src/main/java/org/apache/hyracks/api/job/HyracksJobProperty.java
index 5d6075f..585031e 100644
---
a/hyracks-fullstack/hyracks/hyracks-api/src/main/java/org/apache/hyracks/api/job/HyracksJobProperty.java
+++
b/hyracks-fullstack/hyracks/hyracks-api/src/main/java/org/apache/hyracks/api/job/HyracksJobProperty.java
@@ -20,5 +20,6 @@
public enum HyracksJobProperty implements IJobProperty {
JOB_KIND,
- RESULT_SET_ORDERED
+ RESULT_SET_ORDERED,
+ RESULT_TTL
}
diff --git
a/hyracks-fullstack/hyracks/hyracks-api/src/main/java/org/apache/hyracks/api/result/IResultStateRecord.java
b/hyracks-fullstack/hyracks/hyracks-api/src/main/java/org/apache/hyracks/api/result/IResultStateRecord.java
index fe6bc15..7089c9e 100644
---
a/hyracks-fullstack/hyracks/hyracks-api/src/main/java/org/apache/hyracks/api/result/IResultStateRecord.java
+++
b/hyracks-fullstack/hyracks/hyracks-api/src/main/java/org/apache/hyracks/api/result/IResultStateRecord.java
@@ -20,4 +20,9 @@
public interface IResultStateRecord {
long getTimestamp();
+
+ /**
+ * Returns the per-request result TTL in nanoseconds, or -1 if system
default should be used.
+ */
+ long getResultTtlInNanos();
}
diff --git
a/hyracks-fullstack/hyracks/hyracks-api/src/main/java/org/apache/hyracks/api/result/ResultJobRecord.java
b/hyracks-fullstack/hyracks/hyracks-api/src/main/java/org/apache/hyracks/api/result/ResultJobRecord.java
index dd568d0..73440b1 100644
---
a/hyracks-fullstack/hyracks/hyracks-api/src/main/java/org/apache/hyracks/api/result/ResultJobRecord.java
+++
b/hyracks-fullstack/hyracks/hyracks-api/src/main/java/org/apache/hyracks/api/result/ResultJobRecord.java
@@ -78,9 +78,10 @@
}
}
- private static final long serialVersionUID = 1L;
+ private static final long serialVersionUID = 2L;
private static final Logger LOGGER = LogManager.getLogger();
private final long timestamp;
+ private final long resultTtlInNanos; // per-request TTL in nanoseconds, -1
for system default
private long jobStartTime;
private long jobEndTime;
private Status status;
@@ -89,8 +90,9 @@
private long resultCount;
private boolean resultSetOrdered;
- public ResultJobRecord(boolean resultSetOrdered) {
+ public ResultJobRecord(boolean resultSetOrdered, long resultTtlInNanos) {
this.timestamp = System.nanoTime();
+ this.resultTtlInNanos = resultTtlInNanos;
this.status = new Status();
this.resultCount = 0;
this.resultSetOrdered = resultSetOrdered;
@@ -147,6 +149,11 @@
return timestamp;
}
+ @Override
+ public long getResultTtlInNanos() {
+ return resultTtlInNanos;
+ }
+
public Status getStatus() {
return status;
}
diff --git
a/hyracks-fullstack/hyracks/hyracks-control/hyracks-control-cc/src/main/java/org/apache/hyracks/control/cc/result/ResultDirectoryService.java
b/hyracks-fullstack/hyracks/hyracks-control/hyracks-control-cc/src/main/java/org/apache/hyracks/control/cc/result/ResultDirectoryService.java
index 5111cea..049f1c3 100644
---
a/hyracks-fullstack/hyracks/hyracks-control/hyracks-control-cc/src/main/java/org/apache/hyracks/control/cc/result/ResultDirectoryService.java
+++
b/hyracks-fullstack/hyracks/hyracks-control/hyracks-control-cc/src/main/java/org/apache/hyracks/control/cc/result/ResultDirectoryService.java
@@ -88,7 +88,11 @@
if (partitionsOrdered == null) {
partitionsOrdered = false;
}
- jobResultLocations.put(jobId, new JobResultInfo(new
ResultJobRecord(partitionsOrdered), null));
+ Long resultTtl = (Long)
spec.getProperty(HyracksJobProperty.RESULT_TTL);
+ if (resultTtl == null) {
+ resultTtl = -1L;
+ }
+ jobResultLocations.put(jobId, new JobResultInfo(new
ResultJobRecord(partitionsOrdered, resultTtl), null));
}
@Override
diff --git
a/hyracks-fullstack/hyracks/hyracks-control/hyracks-control-common/src/main/java/org/apache/hyracks/control/common/result/AbstractResultManager.java
b/hyracks-fullstack/hyracks/hyracks-control/hyracks-control-common/src/main/java/org/apache/hyracks/control/common/result/AbstractResultManager.java
index a9dfc12..76b9560 100644
---
a/hyracks-fullstack/hyracks/hyracks-control/hyracks-control-common/src/main/java/org/apache/hyracks/control/common/result/AbstractResultManager.java
+++
b/hyracks-fullstack/hyracks/hyracks-control/hyracks-control-common/src/main/java/org/apache/hyracks/control/common/result/AbstractResultManager.java
@@ -40,7 +40,7 @@
final long sweepTime = System.nanoTime();
for (JobId jobId : getJobIds()) {
final IResultStateRecord state = getState(jobId);
- if (state != null && hasExpired(state, sweepTime, nanoResultTTL)) {
+ if (state != null && hasExpired(state, sweepTime)) {
expiredResultSets.add(jobId);
}
}
@@ -49,7 +49,9 @@
}
}
- private static boolean hasExpired(IResultStateRecord state, long
currentTime, long ttl) {
+ private boolean hasExpired(IResultStateRecord state, long currentTime) {
+ // Use per-request TTL if set (> 0), otherwise use system default
+ long ttl = state.getResultTtlInNanos() > 0 ?
state.getResultTtlInNanos() : nanoResultTTL;
return currentTime - state.getTimestamp() - ttl > 0;
}
}
diff --git
a/hyracks-fullstack/hyracks/hyracks-control/hyracks-control-nc/src/main/java/org/apache/hyracks/control/nc/result/ResultSetMap.java
b/hyracks-fullstack/hyracks/hyracks-control/hyracks-control-nc/src/main/java/org/apache/hyracks/control/nc/result/ResultSetMap.java
index 518dc48..77560ec 100644
---
a/hyracks-fullstack/hyracks/hyracks-control/hyracks-control-nc/src/main/java/org/apache/hyracks/control/nc/result/ResultSetMap.java
+++
b/hyracks-fullstack/hyracks/hyracks-control/hyracks-control-nc/src/main/java/org/apache/hyracks/control/nc/result/ResultSetMap.java
@@ -46,6 +46,11 @@
return timestamp;
}
+ @Override
+ public long getResultTtlInNanos() {
+ return -1L;
+ }
+
ResultState[] getResultStates(ResultSetId rsId) {
return resultStateMap.get(rsId);
}
--
To view, visit https://asterix-gerrit.ics.uci.edu/c/asterixdb/+/20802?usp=email
To unsubscribe, or for help writing mail filters, visit
https://asterix-gerrit.ics.uci.edu/settings?usp=email
Gerrit-MessageType: newchange
Gerrit-Project: asterixdb
Gerrit-Branch: master
Gerrit-Change-Id: Idb5597cf401490d4d074580135cdd37674b036a2
Gerrit-Change-Number: 20802
Gerrit-PatchSet: 1
Gerrit-Owner: Peeyush Gupta <[email protected]>