From dcfb2d98e334e785e604afc56ec82f67e0f413a9 Mon Sep 17 00:00:00 2001 From: "mergify[bot]" <37929162+mergify[bot]@users.noreply.github.com> Date: Thu, 24 Oct 2024 22:49:46 +0800 Subject: [PATCH] [BugFix] informationschema.task_runs timezone fix (backport #52123) (#52264) Co-authored-by: Rohit Satardekar --- .../information/TaskRunsSystemTable.java | 3 ++- .../com/starrocks/common/util/DateUtils.java | 5 ++-- .../starrocks/load/pipe/PipeFileRecord.java | 3 ++- .../InformationSchemaDataSourceTest.java | 25 ++++++++++++++----- 4 files changed, 25 insertions(+), 11 deletions(-) diff --git a/fe/fe-core/src/main/java/com/starrocks/catalog/system/information/TaskRunsSystemTable.java b/fe/fe-core/src/main/java/com/starrocks/catalog/system/information/TaskRunsSystemTable.java index 2bb4b9699f35b..7ead1ff5dc7f9 100644 --- a/fe/fe-core/src/main/java/com/starrocks/catalog/system/information/TaskRunsSystemTable.java +++ b/fe/fe-core/src/main/java/com/starrocks/catalog/system/information/TaskRunsSystemTable.java @@ -51,6 +51,7 @@ import org.apache.thrift.meta_data.FieldValueMetaData; import org.apache.thrift.protocol.TType; +import java.time.ZoneId; import java.util.List; import java.util.stream.Collectors; @@ -162,7 +163,7 @@ private static ConstantOperator mayCast(ConstantOperator value, Type schemaType) } // From timestamp to DATETIME if (value.getType().isBigint() && schemaType.isDatetime()) { - return ConstantOperator.createDatetime(DateUtils.fromEpochMillis(value.getBigint() * 1000)); + return ConstantOperator.createDatetime(DateUtils.fromEpochMillis(value.getBigint() * 1000, ZoneId.systemDefault())); } return value.castTo(schemaType) .orElseThrow(() -> new NotImplementedException(String.format("unsupported type cast from %s to %s", diff --git a/fe/fe-core/src/main/java/com/starrocks/common/util/DateUtils.java b/fe/fe-core/src/main/java/com/starrocks/common/util/DateUtils.java index 46a44676ec043..7ca3605251d7e 100644 --- a/fe/fe-core/src/main/java/com/starrocks/common/util/DateUtils.java +++ b/fe/fe-core/src/main/java/com/starrocks/common/util/DateUtils.java @@ -28,7 +28,6 @@ import java.time.LocalTime; import java.time.OffsetDateTime; import java.time.ZoneId; -import java.time.ZoneOffset; import java.time.ZonedDateTime; import java.time.format.DateTimeFormatter; import java.time.format.DateTimeFormatterBuilder; @@ -118,8 +117,8 @@ public static String formatDateTimeUnix(LocalDateTime dateTime) { return dateTime.format(DATE_TIME_FORMATTER_UNIX); } - public static LocalDateTime fromEpochMillis(long epochMilli) { - return LocalDateTime.ofInstant(Instant.ofEpochMilli(epochMilli), ZoneOffset.UTC); + public static LocalDateTime fromEpochMillis(long epochMilli, ZoneId zoneId) { + return LocalDateTime.ofInstant(Instant.ofEpochMilli(epochMilli), zoneId); } public static LocalDateTime parseUnixDateTime(String str) { diff --git a/fe/fe-core/src/main/java/com/starrocks/load/pipe/PipeFileRecord.java b/fe/fe-core/src/main/java/com/starrocks/load/pipe/PipeFileRecord.java index ce8476513b3aa..39ac0ff0978a3 100644 --- a/fe/fe-core/src/main/java/com/starrocks/load/pipe/PipeFileRecord.java +++ b/fe/fe-core/src/main/java/com/starrocks/load/pipe/PipeFileRecord.java @@ -34,6 +34,7 @@ import java.nio.ByteBuffer; import java.nio.charset.Charset; import java.time.LocalDateTime; +import java.time.ZoneOffset; import java.util.ArrayList; import java.util.List; import java.util.Objects; @@ -96,7 +97,7 @@ public static PipeFileRecord fromHdfsFile(FileStatus file) { } else { record.fileVersion = String.valueOf(file.getModificationTime()); } - record.lastModified = DateUtils.fromEpochMillis(file.getModificationTime()); + record.lastModified = DateUtils.fromEpochMillis(file.getModificationTime(), ZoneOffset.UTC); record.stagedTime = LocalDateTime.now(); record.loadState = FileListRepo.PipeFileState.UNLOADED; return record; diff --git a/fe/fe-core/src/test/java/com/starrocks/service/InformationSchemaDataSourceTest.java b/fe/fe-core/src/test/java/com/starrocks/service/InformationSchemaDataSourceTest.java index 12e628e20ed85..04da65dd60f2e 100644 --- a/fe/fe-core/src/test/java/com/starrocks/service/InformationSchemaDataSourceTest.java +++ b/fe/fe-core/src/test/java/com/starrocks/service/InformationSchemaDataSourceTest.java @@ -42,10 +42,13 @@ import org.junit.Assert; import org.junit.BeforeClass; import org.junit.Test; - + +import java.time.ZoneId; import java.time.ZoneOffset; import java.util.List; import java.util.Map; +import java.util.TimeZone; +import java.util.concurrent.TimeUnit; public class InformationSchemaDataSourceTest { @@ -296,6 +299,14 @@ public void testDynamicPartition() throws Exception { Assert.assertEquals("1", props.get("replication_num")); } + public static ZoneOffset offset(ZoneId id) { + return ZoneOffset.ofTotalSeconds((int) + TimeUnit.MILLISECONDS.toSeconds( + TimeZone.getTimeZone(id).getRawOffset() // Returns offset in milliseconds + ) + ); + } + @Test public void testTaskRunsEvaluation() throws Exception { starRocksAssert.withDatabase("d1").useDatabase("d1"); @@ -306,10 +317,12 @@ public void testTaskRunsEvaluation() throws Exception { taskRun.setTaskName("t_1024"); taskRun.setState(Constants.TaskRunState.SUCCESS); taskRun.setDbName("d1"); - taskRun.setCreateTime(DateUtils.parseDatTimeString("2024-01-02 03:04:05").toEpochSecond(ZoneOffset.UTC) * 1000); - taskRun.setProcessStartTime( - DateUtils.parseDatTimeString("2024-01-02 03:04:05").toEpochSecond(ZoneOffset.UTC) * 1000); - taskRun.setFinishTime(DateUtils.parseDatTimeString("2024-01-02 03:04:05").toEpochSecond(ZoneOffset.UTC) * 1000); + taskRun.setCreateTime(DateUtils.parseDatTimeString("2024-01-02 03:04:05") + .toEpochSecond(offset(ZoneId.systemDefault())) * 1000); + taskRun.setFinishTime(DateUtils.parseDatTimeString("2024-01-02 03:04:05") + .toEpochSecond(offset(ZoneId.systemDefault())) * 1000); + taskRun.setExpireTime(DateUtils.parseDatTimeString("2024-01-02 03:04:05") + .toEpochSecond(offset(ZoneId.systemDefault())) * 1000); new MockUp() { @Mock public List getMatchedTaskRunStatus(TGetTasksParams params) { @@ -320,7 +333,7 @@ public List getMatchedTaskRunStatus(TGetTasksParams params) { starRocksAssert.query("select * from information_schema.task_runs where task_name = 't_1024' ") .explainContains(" constant exprs: ", "NULL | 't_1024' | '2024-01-02 03:04:05' | '2024-01-02 03:04:05' | 'SUCCESS' | " + - "NULL | 'd1' | 'insert into t1 select * from t1' | '1970-01-01 00:00:00' | 0 | " + + "NULL | 'd1' | 'insert into t1 select * from t1' | '2024-01-02 03:04:05' | 0 | " + "NULL | '0%' | '' | NULL"); starRocksAssert.query("select state, error_message" + " from information_schema.task_runs where task_name = 't_1024' ")