>From Ali Alsuliman <[email protected]>:

Ali Alsuliman has submitted this change. ( 
https://asterix-gerrit.ics.uci.edu/c/asterixdb/+/21275?usp=email )

Change subject: [ASTERIXDB-3649][HYR] Measure result expiry since job complete
......................................................................

[ASTERIXDB-3649][HYR] Measure result expiry since job complete

- user model changes: no
- storage format changes: no
- interface changes: yes

Details:
The result sweeper uses the job creation time to measure
job expiry. This patch changes it so that it measure
the job expiry since the job complete.

Ext-ref: MB-71997
Change-Id: I33eecf8f907e009da05482255e4f214a39e601c2
Reviewed-on: https://asterix-gerrit.ics.uci.edu/c/asterixdb/+/21275
Reviewed-by: Murtadha Hubail <[email protected]>
Reviewed-by: Ali Alsuliman <[email protected]>
Tested-by: Jenkins <[email protected]>
Integration-Tests: Jenkins <[email protected]>
---
A 
asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/api/result_ttl/result_ttl.1.query.sqlpp
A 
asterixdb/asterix-app/src/test/resources/runtimets/results/api/result_ttl/result_ttl.1.adm
M asterixdb/asterix-app/src/test/resources/runtimets/sqlpp_queries.xml
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/Joblet.java
M 
hyracks-fullstack/hyracks/hyracks-control/hyracks-control-nc/src/main/java/org/apache/hyracks/control/nc/result/ResultSetMap.java
9 files changed, 96 insertions(+), 10 deletions(-)

Approvals:
  Murtadha Hubail: Looks good to me, approved
  Jenkins: Verified; Verified
  Ali Alsuliman: Looks good to me, but someone else must approve

Objections:
  Anon. E. Moose #1000171: Violations found




diff --git 
a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/api/result_ttl/result_ttl.1.query.sqlpp
 
b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/api/result_ttl/result_ttl.1.query.sqlpp
new file mode 100644
index 0000000..97676f5
--- /dev/null
+++ 
b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/api/result_ttl/result_ttl.1.query.sqlpp
@@ -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.
+ */
+
+-- param result-ttl=5s
+
+SELECT x*0 FROM range(1, 10) AS t LET x = CASE WHEN t = 1 THEN 3 ELSE sleep(1, 
2000) END;
\ No newline at end of file
diff --git 
a/asterixdb/asterix-app/src/test/resources/runtimets/results/api/result_ttl/result_ttl.1.adm
 
b/asterixdb/asterix-app/src/test/resources/runtimets/results/api/result_ttl/result_ttl.1.adm
new file mode 100644
index 0000000..142559e
--- /dev/null
+++ 
b/asterixdb/asterix-app/src/test/resources/runtimets/results/api/result_ttl/result_ttl.1.adm
@@ -0,0 +1,10 @@
+{ "$1": 0 }
+{ "$1": 0 }
+{ "$1": 0 }
+{ "$1": 0 }
+{ "$1": 0 }
+{ "$1": 0 }
+{ "$1": 0 }
+{ "$1": 0 }
+{ "$1": 0 }
+{ "$1": 0 }
\ No newline at end of file
diff --git 
a/asterixdb/asterix-app/src/test/resources/runtimets/sqlpp_queries.xml 
b/asterixdb/asterix-app/src/test/resources/runtimets/sqlpp_queries.xml
index 4b39073..d4437c0 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/sqlpp_queries.xml
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/sqlpp_queries.xml
@@ -19,6 +19,11 @@
 <test-group name="sqlpp_queries">
   <test-group name="api">
     <test-case FilePath="api">
+      <compilation-unit name="result_ttl">
+        <output-dir compare="Text">result_ttl</output-dir>
+      </compilation-unit>
+    </test-case>
+    <test-case FilePath="api">
       <compilation-unit name="compileonly">
         <output-dir compare="Text">compileonly</output-dir>
       </compilation-unit>
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 7089c9e..752ff4f 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
@@ -19,10 +19,20 @@
 package org.apache.hyracks.api.result;

 public interface IResultStateRecord {
+
+    /**
+     * Returns the timestamp in nanoseconds when the record is created.
+     */
     long getTimestamp();

     /**
      * Returns the per-request result TTL in nanoseconds, or -1 if system 
default should be used.
      */
     long getResultTtlInNanos();
+
+    /**
+     * Returns the timestamp in nanoseconds when the record is completed, or 0 
if not completed yet.
+     */
+    long getCompleteTimestamp();
+
 }
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 0c57931..eae1ba0 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
@@ -85,7 +85,7 @@
     private final long resultTtlInNanos; // per-request TTL in nanoseconds, -1 
for system default
     private final String requestId;
     private long jobStartTime;
-    private long jobEndTime;
+    private volatile long jobEndTime;
     private final Status status;
     private ResultSetId rsId;
     private ResultSetMetaData resultSetMetaData;
@@ -113,8 +113,11 @@
         updateState(State.RUNNING);
     }

-    public void finish(JobStatus jobStatus) {
+    public void finish() {
         jobEndTime = System.nanoTime();
+    }
+
+    public void finishWithStatus(JobStatus jobStatus) {
         if (jobStatus != null && (status.state == State.RUNNING || 
status.state == State.IDLE)) {
             switch (jobStatus) {
                 case TERMINATED -> updateState(State.SUCCESS);
@@ -159,6 +162,11 @@
     }

     @Override
+    public long getCompleteTimestamp() {
+        return jobEndTime;
+    }
+
+    @Override
     public long getResultTtlInNanos() {
         return resultTtlInNanos;
     }
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 9217d82..d9d446f 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
@@ -104,15 +104,18 @@
     @Override
     public void notifyJobFinish(JobId jobId, JobSpecification spec, JobStatus 
jobStatus, List<Exception> exceptions)
             throws HyracksException {
+        ResultJobRecord resultJobRecord = getResultJobRecord(jobId);
         if (exceptions == null || exceptions.isEmpty()) {
-            final ResultJobRecord resultJobRecord = getResultJobRecord(jobId);
             if (resultJobRecord == null) {
                 return;
             }
-            resultJobRecord.finish(jobStatus);
+            resultJobRecord.finishWithStatus(jobStatus);
             jobResultCallback.completed(jobId, resultJobRecord);
         } else {
-            reportJobFailure(jobId, exceptions);
+            reportJobFailure(jobId, exceptions, resultJobRecord);
+        }
+        if (resultJobRecord != null) {
+            resultJobRecord.finish();
         }
     }

@@ -183,6 +186,10 @@
     @Override
     public synchronized void reportJobFailure(JobId jobId, List<Exception> 
exceptions) {
         ResultJobRecord rjr = getResultJobRecord(jobId);
+        reportJobFailure(jobId, exceptions, rjr);
+    }
+
+    private synchronized void reportJobFailure(JobId jobId, List<Exception> 
exceptions, ResultJobRecord rjr) {
         if (logFailure(rjr)) {
             LOGGER.debug("job {} failed and is being reported to {}", jobId, 
getClass().getSimpleName());
         }
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 76b9560..46e6f2d 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
@@ -30,8 +30,8 @@

     private final long nanoResultTTL;

-    protected AbstractResultManager(long resultTTL) {
-        this.nanoResultTTL = TimeUnit.MILLISECONDS.toNanos(resultTTL);
+    protected AbstractResultManager(long resultTTLMillis) {
+        this.nanoResultTTL = TimeUnit.MILLISECONDS.toNanos(resultTTLMillis);
     }

     @Override
@@ -50,8 +50,13 @@
     }

     private boolean hasExpired(IResultStateRecord state, long currentTime) {
+        long completeTimestamp = state.getCompleteTimestamp();
+        if (completeTimestamp <= 0) {
+            // Not completed yet, not expired
+            return false;
+        }
         // 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;
+        return currentTime - completeTimestamp - ttl > 0;
     }
 }
diff --git 
a/hyracks-fullstack/hyracks/hyracks-control/hyracks-control-nc/src/main/java/org/apache/hyracks/control/nc/Joblet.java
 
b/hyracks-fullstack/hyracks/hyracks-control/hyracks-control-nc/src/main/java/org/apache/hyracks/control/nc/Joblet.java
index 2e8ad27..35966e1 100644
--- 
a/hyracks-fullstack/hyracks/hyracks-control/hyracks-control-nc/src/main/java/org/apache/hyracks/control/nc/Joblet.java
+++ 
b/hyracks-fullstack/hyracks/hyracks-control/hyracks-control-nc/src/main/java/org/apache/hyracks/control/nc/Joblet.java
@@ -54,6 +54,8 @@
 import org.apache.hyracks.api.partitions.PartitionId;
 import org.apache.hyracks.api.resources.IDeallocatable;
 import org.apache.hyracks.api.resources.memory.IFrameProfiler;
+import org.apache.hyracks.api.result.IResultPartitionManager;
+import org.apache.hyracks.api.result.IResultStateRecord;
 import org.apache.hyracks.api.util.InvokeUtil;
 import org.apache.hyracks.control.common.deployment.DeploymentUtils;
 import org.apache.hyracks.control.common.job.PartitionRequest;
@@ -64,6 +66,7 @@
 import org.apache.hyracks.control.nc.io.WorkspaceFileFactory;
 import org.apache.hyracks.control.nc.resources.DefaultDeallocatableRegistry;
 import org.apache.hyracks.control.nc.resources.memory.FrameManager;
+import org.apache.hyracks.control.nc.result.ResultSetMap;
 import org.apache.logging.log4j.LogManager;
 import org.apache.logging.log4j.Logger;

@@ -273,8 +276,14 @@
         nodeController.getExecutor().execute(() -> {
             try {
                 InvokeUtil.tryWithCleanups(deallocatableRegistry::close, () -> 
{
+                    IResultPartitionManager resultPartitionManager = 
nodeController.getResultPartitionManager();
                     if (cleanupStatus != JobStatus.TERMINATED) {
-                        
nodeController.getResultPartitionManager().sweep(jobId);
+                        resultPartitionManager.sweep(jobId);
+                    } else {
+                        IResultStateRecord state = 
resultPartitionManager.getState(jobId);
+                        if (state instanceof ResultSetMap) {
+                            ((ResultSetMap) state).recordCompleteTimestamp();
+                        }
                     }
                 });
             } catch (Exception e) {
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 c47b53d..bb73f84 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
@@ -28,7 +28,7 @@
 import org.apache.logging.log4j.LogManager;
 import org.apache.logging.log4j.Logger;

-class ResultSetMap implements IResultStateRecord, Serializable {
+public class ResultSetMap implements IResultStateRecord, Serializable {
     private static final long serialVersionUID = 1L;

     private static final Logger LOGGER = LogManager.getLogger();
@@ -36,6 +36,7 @@
     private final long timestamp;
     private final long resultTtlInNanos;
     private final HashMap<ResultSetId, ResultState[]> resultStateMap;
+    private volatile long completeTimestamp;

     ResultSetMap(long resultTtlInNanos) {
         timestamp = System.nanoTime();
@@ -49,10 +50,19 @@
     }

     @Override
+    public long getCompleteTimestamp() {
+        return completeTimestamp;
+    }
+
+    @Override
     public long getResultTtlInNanos() {
         return resultTtlInNanos;
     }

+    public void recordCompleteTimestamp() {
+        completeTimestamp = System.nanoTime();
+    }
+
     ResultState[] getResultStates(ResultSetId rsId) {
         return resultStateMap.get(rsId);
     }

--
To view, visit https://asterix-gerrit.ics.uci.edu/c/asterixdb/+/21275?usp=email
To unsubscribe, or for help writing mail filters, visit 
https://asterix-gerrit.ics.uci.edu/settings?usp=email

Gerrit-MessageType: merged
Gerrit-Project: asterixdb
Gerrit-Branch: lumina
Gerrit-Change-Id: I33eecf8f907e009da05482255e4f214a39e601c2
Gerrit-Change-Number: 21275
Gerrit-PatchSet: 3
Gerrit-Owner: Ali Alsuliman <[email protected]>
Gerrit-Reviewer: Ali Alsuliman <[email protected]>
Gerrit-Reviewer: Anon. E. Moose #1000171
Gerrit-Reviewer: Hussain Towaileb <[email protected]>
Gerrit-Reviewer: Ian Maxon <[email protected]>
Gerrit-Reviewer: Jenkins <[email protected]>
Gerrit-Reviewer: Michael Blow <[email protected]>
Gerrit-Reviewer: Murtadha Hubail <[email protected]>

Reply via email to