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

gavinchou pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/doris.git


The following commit(s) were added to refs/heads/master by this push:
     new 6d2417b0b7f [fix](fe) Show warm-up timestamps with date (#64606)
6d2417b0b7f is described below

commit 6d2417b0b7f7a651448dd5a46cbc2c0d7e6bebc1
Author: bobhan1 <[email protected]>
AuthorDate: Mon Jun 22 14:11:09 2026 +0800

    [fix](fe) Show warm-up timestamps with date (#64606)
    
    Problem Summary: Event-driven warm-up detailed SyncStats serialized
    last_trigger_ts, last_finish_ts, and progress_trigger_ts with only
    HH:mm:ss. When a job spans dates, the output cannot identify which day
    the event happened. BE reports these values as epoch milliseconds, so FE
    can render them directly as yyyy-MM-dd HH:mm:ss while preserving empty
    strings for unset timestamps.
---
 .../org/apache/doris/cloud/JobWarmUpStats.java     |  4 +--
 .../doris/cloud/CloudWarmUpJobTableFilterTest.java |  5 ++++
 .../org/apache/doris/cloud/WarmUpStatsTest.java    | 33 ++++++++++++++++++++++
 3 files changed, 40 insertions(+), 2 deletions(-)

diff --git 
a/fe/fe-core/src/main/java/org/apache/doris/cloud/JobWarmUpStats.java 
b/fe/fe-core/src/main/java/org/apache/doris/cloud/JobWarmUpStats.java
index cdb293216a1..6d44b904741 100644
--- a/fe/fe-core/src/main/java/org/apache/doris/cloud/JobWarmUpStats.java
+++ b/fe/fe-core/src/main/java/org/apache/doris/cloud/JobWarmUpStats.java
@@ -32,7 +32,7 @@ import java.time.format.DateTimeFormatter;
  * across all matched tables, then computes gap = requested - finished.
  */
 public class JobWarmUpStats {
-    private static final DateTimeFormatter TIME_FMT = 
DateTimeFormatter.ofPattern("HH:mm:ss");
+    private static final DateTimeFormatter DATETIME_FMT = 
DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
 
     // Aggregated requested
     public long requestedSegmentNum5m;
@@ -277,7 +277,7 @@ public class JobWarmUpStats {
         }
         try {
             return LocalDateTime.ofInstant(Instant.ofEpochMilli(epochMs), 
ZoneId.systemDefault())
-                    .format(TIME_FMT);
+                    .format(DATETIME_FMT);
         } catch (Exception e) {
             return "";
         }
diff --git 
a/fe/fe-core/src/test/java/org/apache/doris/cloud/CloudWarmUpJobTableFilterTest.java
 
b/fe/fe-core/src/test/java/org/apache/doris/cloud/CloudWarmUpJobTableFilterTest.java
index 1af6bf284db..44e3771eba9 100644
--- 
a/fe/fe-core/src/test/java/org/apache/doris/cloud/CloudWarmUpJobTableFilterTest.java
+++ 
b/fe/fe-core/src/test/java/org/apache/doris/cloud/CloudWarmUpJobTableFilterTest.java
@@ -365,6 +365,7 @@ public class CloudWarmUpJobTableFilterTest {
         stats.finishIndexSize30m = 512;
         stats.failSegmentNum30m = 1;
         stats.lastTriggerTs = 5000;
+        stats.lastFinishTs = 4800;
         stats.progressTriggerTs = 4200;
         stats.computeGap();
 
@@ -380,6 +381,10 @@ public class CloudWarmUpJobTableFilterTest {
         Assertions.assertEquals(4, segNum.get("finish_30m").getAsLong());
         Assertions.assertEquals(2, segNum.get("gap_30m").getAsLong());
         Assertions.assertEquals(800, 
detailStats.get("trigger_gap_ms").getAsLong());
+        String dateTimePattern = "\\d{4}-\\d{2}-\\d{2} \\d{2}:\\d{2}:\\d{2}";
+        
Assertions.assertTrue(detailStats.get("last_trigger_ts").getAsString().matches(dateTimePattern));
+        
Assertions.assertTrue(detailStats.get("last_finish_ts").getAsString().matches(dateTimePattern));
+        
Assertions.assertTrue(detailStats.get("progress_trigger_ts").getAsString().matches(dateTimePattern));
         Assertions.assertFalse(detailStats.has("window"));
 
         List<String> summary = job.getJobInfo(stats, false);
diff --git 
a/fe/fe-core/src/test/java/org/apache/doris/cloud/WarmUpStatsTest.java 
b/fe/fe-core/src/test/java/org/apache/doris/cloud/WarmUpStatsTest.java
index 2f8c35f7394..573bd115b83 100644
--- a/fe/fe-core/src/test/java/org/apache/doris/cloud/WarmUpStatsTest.java
+++ b/fe/fe-core/src/test/java/org/apache/doris/cloud/WarmUpStatsTest.java
@@ -22,6 +22,10 @@ import com.google.gson.JsonParser;
 import org.junit.jupiter.api.Assertions;
 import org.junit.jupiter.api.Test;
 
+import java.time.Instant;
+import java.time.LocalDateTime;
+import java.time.ZoneId;
+import java.time.format.DateTimeFormatter;
 import java.util.HashMap;
 import java.util.Map;
 
@@ -31,6 +35,7 @@ import java.util.Map;
  * - JobWarmUpStats: aggregate requested/finished, compute gap, serialize
  */
 public class WarmUpStatsTest {
+    private static final DateTimeFormatter DATETIME_FMT = 
DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
 
     // ==================== TableWarmUpWindowedStats ====================
 
@@ -313,6 +318,29 @@ public class WarmUpStatsTest {
         Assertions.assertEquals(0, segNum.get("gap_5m").getAsLong());
     }
 
+    @Test
+    public void testToJsonStringFormatsTimestampsWithDate() {
+        long lastTriggerTs = 1700000000000L;
+        long lastFinishTs = 1700000001000L;
+        long progressTriggerTs = 1699999999000L;
+
+        JobWarmUpStats job = new JobWarmUpStats();
+        job.lastTriggerTs = lastTriggerTs;
+        job.lastFinishTs = lastFinishTs;
+        job.progressTriggerTs = progressTriggerTs;
+
+        JsonObject root = 
JsonParser.parseString(job.toJsonString()).getAsJsonObject();
+
+        Assertions.assertEquals(formatExpectedDateTime(lastTriggerTs),
+                root.get("last_trigger_ts").getAsString());
+        Assertions.assertEquals(formatExpectedDateTime(lastFinishTs),
+                root.get("last_finish_ts").getAsString());
+        Assertions.assertEquals(formatExpectedDateTime(progressTriggerTs),
+                root.get("progress_trigger_ts").getAsString());
+        Assertions.assertTrue(root.get("last_trigger_ts").getAsString()
+                .matches("\\d{4}-\\d{2}-\\d{2} \\d{2}:\\d{2}:\\d{2}"));
+    }
+
     @Test
     public void testToSummaryJsonStringMergesDataAndIndexSize() {
         JobWarmUpStats job = new JobWarmUpStats();
@@ -494,4 +522,9 @@ public class WarmUpStatsTest {
         Assertions.assertEquals(1000, stats.lastTriggerTs);
         Assertions.assertEquals(1200, stats.lastFinishTs);
     }
+
+    private static String formatExpectedDateTime(long epochMs) {
+        return LocalDateTime.ofInstant(Instant.ofEpochMilli(epochMs), 
ZoneId.systemDefault())
+                .format(DATETIME_FMT);
+    }
 }


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

Reply via email to