diff --git a/hudi-client/hudi-client-common/src/main/java/org/apache/hudi/client/HoodieTimelineArchiver.java b/hudi-client/hudi-client-common/src/main/java/org/apache/hudi/client/HoodieTimelineArchiver.java index 74e0a2565f827..ac2c5042f74c7 100644 --- a/hudi-client/hudi-client-common/src/main/java/org/apache/hudi/client/HoodieTimelineArchiver.java +++ b/hudi-client/hudi-client-common/src/main/java/org/apache/hudi/client/HoodieTimelineArchiver.java @@ -77,7 +77,6 @@ import java.io.IOException; import java.text.ParseException; import java.time.Instant; -import java.time.ZoneId; import java.time.ZonedDateTime; import java.util.ArrayList; import java.util.Arrays; @@ -491,7 +490,7 @@ private Stream getCommitInstantsToArchive() throws IOException { String latestCommitToArchive = instantsToArchive.get(instantsToArchive.size() - 1).getTimestamp(); try { Instant latestCommitInstant = HoodieActiveTimeline.parseDateFromInstantTime(commitTimeline.lastInstant().get().getTimestamp()).toInstant(); - ZonedDateTime currentDateTime = ZonedDateTime.ofInstant(latestCommitInstant, ZoneId.systemDefault()); + ZonedDateTime currentDateTime = ZonedDateTime.ofInstant(latestCommitInstant, metaClient.getTableConfig().getTimelineTimezone().getZoneId()); String earliestTimeToRetain = HoodieActiveTimeline.formatDate(Date.from(currentDateTime.minusHours(config.getCleanerHoursRetained()).toInstant())); if (HoodieTimeline.compareTimestamps(latestCommitToArchive, GREATER_THAN_OR_EQUALS, earliestTimeToRetain)) { throw new HoodieIOException("Please align your archival configs based on cleaner configs. 'hoodie.keep.min.commits' : " diff --git a/hudi-client/hudi-client-common/src/main/java/org/apache/hudi/table/action/clean/CleanPlanner.java b/hudi-client/hudi-client-common/src/main/java/org/apache/hudi/table/action/clean/CleanPlanner.java index ae183b678e69a..005e3f1dc344b 100644 --- a/hudi-client/hudi-client-common/src/main/java/org/apache/hudi/table/action/clean/CleanPlanner.java +++ b/hudi-client/hudi-client-common/src/main/java/org/apache/hudi/table/action/clean/CleanPlanner.java @@ -53,7 +53,6 @@ import java.io.IOException; import java.io.Serializable; import java.time.Instant; -import java.time.ZoneId; import java.time.ZonedDateTime; import java.util.ArrayList; import java.util.Collections; @@ -510,7 +509,7 @@ public Option getEarliestCommitToRetain() { } } else if (config.getCleanerPolicy() == HoodieCleaningPolicy.KEEP_LATEST_BY_HOURS) { Instant instant = Instant.now(); - ZonedDateTime currentDateTime = ZonedDateTime.ofInstant(instant, ZoneId.systemDefault()); + ZonedDateTime currentDateTime = ZonedDateTime.ofInstant(instant, hoodieTable.getMetaClient().getTableConfig().getTimelineTimezone().getZoneId()); String earliestTimeToRetain = HoodieActiveTimeline.formatDate(Date.from(currentDateTime.minusHours(hoursRetained).toInstant())); earliestCommitToRetain = Option.fromJavaOptional(commitTimeline.getInstantsAsStream().filter(i -> HoodieTimeline.compareTimestamps(i.getTimestamp(), HoodieTimeline.GREATER_THAN_OR_EQUALS, earliestTimeToRetain)).findFirst()); diff --git a/hudi-common/src/main/java/org/apache/hudi/common/model/HoodieTimelineTimeZone.java b/hudi-common/src/main/java/org/apache/hudi/common/model/HoodieTimelineTimeZone.java index 9b1c695d491ea..29e158812f485 100644 --- a/hudi-common/src/main/java/org/apache/hudi/common/model/HoodieTimelineTimeZone.java +++ b/hudi-common/src/main/java/org/apache/hudi/common/model/HoodieTimelineTimeZone.java @@ -18,20 +18,29 @@ package org.apache.hudi.common.model; +import java.time.ZoneId; +import java.util.TimeZone; + /** * Hoodie TimelineZone. */ public enum HoodieTimelineTimeZone { - LOCAL("local"), - UTC("utc"); + LOCAL("local", ZoneId.systemDefault()), + UTC("utc", TimeZone.getTimeZone("UTC").toZoneId()); private final String timeZone; + private final ZoneId zoneId; - HoodieTimelineTimeZone(String timeZone) { + HoodieTimelineTimeZone(String timeZone, ZoneId zoneId) { this.timeZone = timeZone; + this.zoneId = zoneId; } public String getTimeZone() { return timeZone; } + + public ZoneId getZoneId() { + return zoneId; + } } diff --git a/hudi-common/src/main/java/org/apache/hudi/common/table/HoodieTableConfig.java b/hudi-common/src/main/java/org/apache/hudi/common/table/HoodieTableConfig.java index f4471e89a58f6..22ba46a0956be 100644 --- a/hudi-common/src/main/java/org/apache/hudi/common/table/HoodieTableConfig.java +++ b/hudi-common/src/main/java/org/apache/hudi/common/table/HoodieTableConfig.java @@ -651,6 +651,10 @@ public String getKeyGeneratorClassName() { return getString(KEY_GENERATOR_CLASS_NAME); } + public HoodieTimelineTimeZone getTimelineTimezone() { + return HoodieTimelineTimeZone.valueOf(getStringOrDefault(TIMELINE_TIMEZONE)); + } + public String getHiveStylePartitioningEnable() { return getStringOrDefault(HIVE_STYLE_PARTITIONING_ENABLE); } diff --git a/hudi-common/src/test/java/org/apache/hudi/common/table/timeline/TestHoodieInstant.java b/hudi-common/src/test/java/org/apache/hudi/common/table/timeline/TestHoodieInstant.java index c4a1d00e90d06..39d4040c93abf 100644 --- a/hudi-common/src/test/java/org/apache/hudi/common/table/timeline/TestHoodieInstant.java +++ b/hudi-common/src/test/java/org/apache/hudi/common/table/timeline/TestHoodieInstant.java @@ -18,6 +18,7 @@ package org.apache.hudi.common.table.timeline; +import org.apache.hudi.common.model.HoodieTimelineTimeZone; import org.apache.hudi.common.testutils.HoodieCommonTestHarness; import org.apache.hudi.common.util.Option; import org.junit.jupiter.api.Test; @@ -27,6 +28,7 @@ import static org.apache.hudi.common.testutils.Assertions.assertStreamEquals; import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertNotNull; public class TestHoodieInstant extends HoodieCommonTestHarness { @@ -76,4 +78,11 @@ public void testCreateHoodieInstantByFileStatus() throws IOException { cleanMetaClient(); } } + + @Test + public void testHoodieTimelineTimeZone() { + for (HoodieTimelineTimeZone timeZone : HoodieTimelineTimeZone.values()) { + assertNotNull(timeZone.getZoneId()); + } + } }