This is an automated email from the ASF dual-hosted git repository.

morningman pushed a commit to branch branch-2.0
in repository https://gitbox.apache.org/repos/asf/doris.git


The following commit(s) were added to refs/heads/branch-2.0 by this push:
     new 854ef338e3e [Fix](statistics)Fix auto job start time incorrect bug  
#27402 (#27413)
854ef338e3e is described below

commit 854ef338e3ebf601efea1eecb5070c867ccf1867
Author: Jibing-Li <[email protected]>
AuthorDate: Wed Nov 22 21:48:59 2023 +0800

    [Fix](statistics)Fix auto job start time incorrect bug  #27402 (#27413)
    
    backport #27402
---
 .../java/org/apache/doris/qe/ShowExecutor.java     |  2 +-
 .../org/apache/doris/statistics/AnalysisInfo.java  |  7 +++
 .../apache/doris/statistics/AnalysisManager.java   |  9 +++-
 .../doris/statistics/AnalysisManagerTest.java      | 51 ++++++++++++++++++++++
 4 files changed, 67 insertions(+), 2 deletions(-)

diff --git a/fe/fe-core/src/main/java/org/apache/doris/qe/ShowExecutor.java 
b/fe/fe-core/src/main/java/org/apache/doris/qe/ShowExecutor.java
index 575d1ed6270..ecdc12b8f67 100644
--- a/fe/fe-core/src/main/java/org/apache/doris/qe/ShowExecutor.java
+++ b/fe/fe-core/src/main/java/org/apache/doris/qe/ShowExecutor.java
@@ -2613,7 +2613,7 @@ public class ShowExecutor {
             
row.add(Env.getCurrentEnv().getAnalysisManager().getJobProgress(analysisInfo.jobId));
             row.add(analysisInfo.scheduleType.toString());
             LocalDateTime startTime =
-                    
LocalDateTime.ofInstant(Instant.ofEpochMilli(analysisInfo.createTime),
+                    
LocalDateTime.ofInstant(Instant.ofEpochMilli(analysisInfo.startTime),
                             java.time.ZoneId.systemDefault());
             LocalDateTime endTime =
                     
LocalDateTime.ofInstant(Instant.ofEpochMilli(analysisInfo.endTime),
diff --git 
a/fe/fe-core/src/main/java/org/apache/doris/statistics/AnalysisInfo.java 
b/fe/fe-core/src/main/java/org/apache/doris/statistics/AnalysisInfo.java
index 248714b27f7..88d69e1f2ab 100644
--- a/fe/fe-core/src/main/java/org/apache/doris/statistics/AnalysisInfo.java
+++ b/fe/fe-core/src/main/java/org/apache/doris/statistics/AnalysisInfo.java
@@ -190,6 +190,9 @@ public class AnalysisInfo implements Writable {
     @SerializedName("createTime")
     public final long createTime = System.currentTimeMillis();
 
+    @SerializedName("startTime")
+    public long startTime;
+
     @SerializedName("endTime")
     public long endTime;
 
@@ -329,6 +332,10 @@ public class AnalysisInfo implements Writable {
         return analysisInfo;
     }
 
+    public void markStartTime(long startTime) {
+        this.startTime = startTime;
+    }
+
     public void markFinished() {
         state = AnalysisState.FINISHED;
         endTime = System.currentTimeMillis();
diff --git 
a/fe/fe-core/src/main/java/org/apache/doris/statistics/AnalysisManager.java 
b/fe/fe-core/src/main/java/org/apache/doris/statistics/AnalysisManager.java
index ff0ae2acd96..08c2eccc246 100644
--- a/fe/fe-core/src/main/java/org/apache/doris/statistics/AnalysisManager.java
+++ b/fe/fe-core/src/main/java/org/apache/doris/statistics/AnalysisManager.java
@@ -158,6 +158,7 @@ public class AnalysisManager implements Writable {
             // Set the job state to RUNNING when its first task becomes 
RUNNING.
             if (info.state.equals(AnalysisState.RUNNING) && 
job.state.equals(AnalysisState.PENDING)) {
                 job.state = AnalysisState.RUNNING;
+                job.markStartTime(System.currentTimeMillis());
                 replayCreateAnalysisJob(job);
             }
             boolean allFinished = true;
@@ -200,6 +201,13 @@ public class AnalysisManager implements Writable {
         if (job == null) {
             return null;
         }
+        synchronized (job) {
+            // Set the job state to RUNNING when its first task becomes 
RUNNING.
+            if (info.state.equals(AnalysisState.RUNNING) && 
job.state.equals(AnalysisState.PENDING)) {
+                job.state = AnalysisState.RUNNING;
+                job.markStartTime(System.currentTimeMillis());
+            }
+        }
         int failedCount = 0;
         StringJoiner reason = new StringJoiner(", ");
         Map<Long, BaseAnalysisTask> taskMap = 
analysisJobIdToTaskMap.get(info.jobId);
@@ -1000,7 +1008,6 @@ public class AnalysisManager implements Writable {
     }
 
     public void registerSysJob(AnalysisInfo jobInfo, Map<Long, 
BaseAnalysisTask> taskInfos) {
-        jobInfo.state = AnalysisState.RUNNING;
         systemJobInfoMap.put(jobInfo.jobId, jobInfo);
         analysisJobIdToTaskMap.put(jobInfo.jobId, taskInfos);
     }
diff --git 
a/fe/fe-core/src/test/java/org/apache/doris/statistics/AnalysisManagerTest.java 
b/fe/fe-core/src/test/java/org/apache/doris/statistics/AnalysisManagerTest.java
index f33a16f9b78..b55114ba9b9 100644
--- 
a/fe/fe-core/src/test/java/org/apache/doris/statistics/AnalysisManagerTest.java
+++ 
b/fe/fe-core/src/test/java/org/apache/doris/statistics/AnalysisManagerTest.java
@@ -322,6 +322,57 @@ public class AnalysisManagerTest {
         Assertions.assertTrue(analysisManager.systemJobInfoMap.isEmpty());
     }
 
+    @Test
+    public void testSystemJobStartTime() {
+        new MockUp<BaseAnalysisTask>() {
+
+            @Mock
+            protected void init(AnalysisInfo info) {
+
+            }
+        };
+
+        new MockUp<AnalysisManager>() {
+            @Mock
+            public void updateTableStats(AnalysisInfo jobInfo) {
+            }
+
+            @Mock
+            protected void logAutoJob(AnalysisInfo autoJob) {
+
+            }
+        };
+
+        AnalysisManager analysisManager = new AnalysisManager();
+        AnalysisInfo job = new AnalysisInfoBuilder()
+            .setJobId(0)
+            .setColName("col1, col2").build();
+        analysisManager.systemJobInfoMap.put(job.jobId, job);
+        AnalysisInfo task1 = new AnalysisInfoBuilder()
+            .setJobId(0)
+            .setTaskId(1)
+            .setState(AnalysisState.PENDING)
+            .setColName("col1").build();
+        AnalysisInfo task2 = new AnalysisInfoBuilder()
+            .setJobId(0)
+            .setTaskId(1)
+            .setState(AnalysisState.PENDING)
+            .setColName("col2").build();
+        OlapAnalysisTask ot1 = new OlapAnalysisTask(task1);
+        OlapAnalysisTask ot2 = new OlapAnalysisTask(task2);
+        Map<Long, BaseAnalysisTask> taskMap = new HashMap<>();
+        taskMap.put(ot1.info.taskId, ot1);
+        taskMap.put(ot2.info.taskId, ot2);
+        analysisManager.analysisJobIdToTaskMap.put(job.jobId, taskMap);
+
+        job.state = AnalysisState.PENDING;
+        long l = System.currentTimeMillis();
+        analysisManager.systemJobInfoMap.put(job.jobId, job);
+        analysisManager.systemJobStatusUpdater.apply(new 
TaskStatusWrapper(task1,
+            AnalysisState.RUNNING, "", 0));
+        Assertions.assertTrue(job.startTime >= l);
+    }
+
     @Test
     public void testReAnalyze() {
         new MockUp<OlapTable>() {


---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to