This is an automated email from the ASF dual-hosted git repository. yihua pushed a commit to branch branch-0.x in repository https://gitbox.apache.org/repos/asf/hudi.git
commit 80990d4232577a6e7dbf79fde2e312fda6d9ddcc Author: wuzhenhua <[email protected]> AuthorDate: Sun Mar 10 04:49:54 2024 +0800 [HUDI-7163] Fix not parsable text DateTimeParseException when compact (#10220) --- .../compact/ScheduleCompactionActionExecutor.java | 9 ++--- .../java/org/apache/hudi/util/StreamerUtil.java | 39 ++++++++++------------ 2 files changed, 19 insertions(+), 29 deletions(-) diff --git a/hudi-client/hudi-client-common/src/main/java/org/apache/hudi/table/action/compact/ScheduleCompactionActionExecutor.java b/hudi-client/hudi-client-common/src/main/java/org/apache/hudi/table/action/compact/ScheduleCompactionActionExecutor.java index f529285e29d..e7d1138fd77 100644 --- a/hudi-client/hudi-client-common/src/main/java/org/apache/hudi/table/action/compact/ScheduleCompactionActionExecutor.java +++ b/hudi-client/hudi-client-common/src/main/java/org/apache/hudi/table/action/compact/ScheduleCompactionActionExecutor.java @@ -236,12 +236,7 @@ public class ScheduleCompactionActionExecutor<T, I, K, O> extends BaseActionExec } private Long parsedToSeconds(String time) { - long timestamp; - try { - timestamp = HoodieActiveTimeline.parseDateFromInstantTime(time).getTime() / 1000; - } catch (ParseException e) { - throw new HoodieCompactionException(e.getMessage(), e); - } - return timestamp; + return HoodieActiveTimeline.parseDateFromInstantTimeSafely(time).orElseThrow(() -> new HoodieCompactionException("Failed to parse timestamp " + time)) + .getTime() / 1000; } } diff --git a/hudi-flink-datasource/hudi-flink/src/main/java/org/apache/hudi/util/StreamerUtil.java b/hudi-flink-datasource/hudi-flink/src/main/java/org/apache/hudi/util/StreamerUtil.java index 40519ae4ed7..176ba61b2b1 100644 --- a/hudi-flink-datasource/hudi-flink/src/main/java/org/apache/hudi/util/StreamerUtil.java +++ b/hudi-flink-datasource/hudi-flink/src/main/java/org/apache/hudi/util/StreamerUtil.java @@ -65,7 +65,6 @@ import org.slf4j.LoggerFactory; import java.io.BufferedReader; import java.io.IOException; import java.io.StringReader; -import java.text.ParseException; import java.util.ArrayList; import java.util.Collections; import java.util.Date; @@ -328,34 +327,30 @@ public class StreamerUtil { * Returns the median instant time between the given two instant time. */ public static Option<String> medianInstantTime(String highVal, String lowVal) { - try { - long high = HoodieActiveTimeline.parseDateFromInstantTime(highVal).getTime(); - long low = HoodieActiveTimeline.parseDateFromInstantTime(lowVal).getTime(); - ValidationUtils.checkArgument(high > low, - "Instant [" + highVal + "] should have newer timestamp than instant [" + lowVal + "]"); - long median = low + (high - low) / 2; - final String instantTime = HoodieActiveTimeline.formatDate(new Date(median)); - if (HoodieTimeline.compareTimestamps(lowVal, HoodieTimeline.GREATER_THAN_OR_EQUALS, instantTime) - || HoodieTimeline.compareTimestamps(highVal, HoodieTimeline.LESSER_THAN_OR_EQUALS, instantTime)) { - return Option.empty(); - } - return Option.of(instantTime); - } catch (ParseException e) { - throw new HoodieException("Get median instant time with interval [" + lowVal + ", " + highVal + "] error", e); + long high = HoodieActiveTimeline.parseDateFromInstantTimeSafely(highVal) + .orElseThrow(() -> new HoodieException("Get instant time diff with interval [" + highVal + "] error")).getTime(); + long low = HoodieActiveTimeline.parseDateFromInstantTimeSafely(lowVal) + .orElseThrow(() -> new HoodieException("Get instant time diff with interval [" + lowVal + "] error")).getTime(); + ValidationUtils.checkArgument(high > low, + "Instant [" + highVal + "] should have newer timestamp than instant [" + lowVal + "]"); + long median = low + (high - low) / 2; + final String instantTime = HoodieActiveTimeline.formatDate(new Date(median)); + if (HoodieTimeline.compareTimestamps(lowVal, HoodieTimeline.GREATER_THAN_OR_EQUALS, instantTime) + || HoodieTimeline.compareTimestamps(highVal, HoodieTimeline.LESSER_THAN_OR_EQUALS, instantTime)) { + return Option.empty(); } + return Option.of(instantTime); } /** * Returns the time interval in seconds between the given instant time. */ public static long instantTimeDiffSeconds(String newInstantTime, String oldInstantTime) { - try { - long newTimestamp = HoodieActiveTimeline.parseDateFromInstantTime(newInstantTime).getTime(); - long oldTimestamp = HoodieActiveTimeline.parseDateFromInstantTime(oldInstantTime).getTime(); - return (newTimestamp - oldTimestamp) / 1000; - } catch (ParseException e) { - throw new HoodieException("Get instant time diff with interval [" + oldInstantTime + ", " + newInstantTime + "] error", e); - } + long newTimestamp = HoodieActiveTimeline.parseDateFromInstantTimeSafely(newInstantTime) + .orElseThrow(() -> new HoodieException("Get instant time diff with interval [" + oldInstantTime + ", " + newInstantTime + "] error")).getTime(); + long oldTimestamp = HoodieActiveTimeline.parseDateFromInstantTimeSafely(oldInstantTime) + .orElseThrow(() -> new HoodieException("Get instant time diff with interval [" + oldInstantTime + ", " + newInstantTime + "] error")).getTime(); + return (newTimestamp - oldTimestamp) / 1000; } public static Option<Transformer> createTransformer(List<String> classNames) throws IOException {
