>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]>

Reply via email to