From 90381bc804de4084ff7fe9f7b3b73ea5019dae3a Mon Sep 17 00:00:00 2001 From: yujun Date: Wed, 29 Jul 2026 17:18:33 +0800 Subject: [PATCH] [fix](fe) Record task finish time on execution failure Record the finish time when a task enters FAILED through the execution exception path, so MTMV failures expose complete terminal metadata and a usable duration. Key changes: - Set finishTimeMs in AbstractTask.onFail(). - Cover runTask() exception handling in AbstractJobStatusTest. Unit Test: - AbstractJobStatusTest: 13 tests passed. --- .../apache/doris/job/task/AbstractTask.java | 1 + .../doris/job/base/AbstractJobStatusTest.java | 23 +++++++++++++++++++ 2 files changed, 24 insertions(+) diff --git a/fe/fe-core/src/main/java/org/apache/doris/job/task/AbstractTask.java b/fe/fe-core/src/main/java/org/apache/doris/job/task/AbstractTask.java index 4e2ac653cf700f..9cf70edb6556f8 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/job/task/AbstractTask.java +++ b/fe/fe-core/src/main/java/org/apache/doris/job/task/AbstractTask.java @@ -71,6 +71,7 @@ public boolean onFail() throws JobException { return false; } status = TaskStatus.FAILED; + setFinishTimeMs(System.currentTimeMillis()); if (!isCallable()) { return false; } diff --git a/fe/fe-core/src/test/java/org/apache/doris/job/base/AbstractJobStatusTest.java b/fe/fe-core/src/test/java/org/apache/doris/job/base/AbstractJobStatusTest.java index faf39164fc3800..588aae4c0ca9af 100644 --- a/fe/fe-core/src/test/java/org/apache/doris/job/base/AbstractJobStatusTest.java +++ b/fe/fe-core/src/test/java/org/apache/doris/job/base/AbstractJobStatusTest.java @@ -66,6 +66,18 @@ boolean cancelLogicCalled() { } } + private static class FailingTask extends DummyTask { + FailingTask(long taskId) { + super(taskId); + setJobId(1L); + } + + @Override + public void run() throws JobException { + throw new JobException("task failed"); + } + } + private static class DummyJob extends AbstractJob { private final List history = new ArrayList<>(); @@ -131,6 +143,17 @@ void testPendingFromPaused() throws Exception { Assertions.assertEquals(JobStatus.PENDING, job.getJobStatus()); } + @Test + void testTaskFailureSetsFinishTime() throws Exception { + FailingTask task = new FailingTask(100L); + + task.runTask(); + + Assertions.assertEquals(TaskStatus.FAILED, task.getStatus()); + Assertions.assertNotNull(task.getFinishTimeMs()); + Assertions.assertEquals("task failed", task.getErrMsg()); + } + @Test void testPendingFromRunning() throws Exception { DummyJob job = new DummyJob(JobStatus.RUNNING);