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]