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

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


The following commit(s) were added to refs/heads/master by this push:
     new e731755b990 [HUDI-7030] Update containsInstant without 
containsOrBeforeTimelineStarts to fix data lost (#9982)
e731755b990 is described below

commit e731755b99057dc916378f1f7e95c73642ff96e8
Author: xoln ann <[email protected]>
AuthorDate: Wed Nov 8 14:39:32 2023 +0800

    [HUDI-7030] Update containsInstant without containsOrBeforeTimelineStarts 
to fix data lost (#9982)
---
 .../hudi/client/functional/TestHoodieIndex.java     | 21 +++++++++++++++++++++
 .../table/timeline/HoodieDefaultTimeline.java       |  2 +-
 2 files changed, 22 insertions(+), 1 deletion(-)

diff --git 
a/hudi-client/hudi-spark-client/src/test/java/org/apache/hudi/client/functional/TestHoodieIndex.java
 
b/hudi-client/hudi-spark-client/src/test/java/org/apache/hudi/client/functional/TestHoodieIndex.java
index 4518b909813..37199c783bb 100644
--- 
a/hudi-client/hudi-spark-client/src/test/java/org/apache/hudi/client/functional/TestHoodieIndex.java
+++ 
b/hudi-client/hudi-spark-client/src/test/java/org/apache/hudi/client/functional/TestHoodieIndex.java
@@ -553,6 +553,27 @@ public class TestHoodieIndex extends 
TestHoodieMetadataBase {
     assertFalse(timeline.empty());
     assertFalse(HoodieIndexUtils.checkIfValidCommit(timeline, 
instantTimestamp));
     assertFalse(HoodieIndexUtils.checkIfValidCommit(timeline, 
instantTimestampSec));
+
+    // Check the completed delta commit instant which is end with 
DEFAULT_MILLIS_EXT timestamp
+    // Timestamp not contain in inflight timeline, checkContainsInstant() 
should return false
+    // Timestamp contain in inflight timeline, checkContainsInstant() should 
return true
+    String checkInstantTimestampSec = instantTimestamp.substring(0, 
instantTimestamp.length() - 
HoodieInstantTimeGenerator.DEFAULT_MILLIS_EXT.length());
+    String checkInstantTimestamp = checkInstantTimestampSec + 
HoodieInstantTimeGenerator.DEFAULT_MILLIS_EXT;
+    Thread.sleep(2000); // sleep required so that new timestamp differs in the 
seconds rather than msec
+    String newTimestamp = writeClient.createNewInstantTime();
+    String newTimestampSec = newTimestamp.substring(0, newTimestamp.length() - 
HoodieInstantTimeGenerator.DEFAULT_MILLIS_EXT.length());
+    final HoodieInstant instant5 = new HoodieInstant(true, 
HoodieTimeline.DELTA_COMMIT_ACTION, newTimestamp);
+    timeline = new HoodieDefaultTimeline(Stream.of(instant5), 
metaClient.getActiveTimeline()::getInstantDetails);
+    assertFalse(timeline.empty());
+    assertFalse(timeline.containsInstant(checkInstantTimestamp));
+    assertFalse(timeline.containsInstant(checkInstantTimestampSec));
+
+    final HoodieInstant instant6 = new HoodieInstant(true, 
HoodieTimeline.DELTA_COMMIT_ACTION, newTimestampSec + 
HoodieInstantTimeGenerator.DEFAULT_MILLIS_EXT);
+    timeline = new HoodieDefaultTimeline(Stream.of(instant6), 
metaClient.getActiveTimeline()::getInstantDetails);
+    assertFalse(timeline.empty());
+    assertFalse(timeline.containsInstant(newTimestamp));
+    assertFalse(timeline.containsInstant(checkInstantTimestamp));
+    assertTrue(timeline.containsInstant(instant6.getTimestamp()));
   }
 
   @Test
diff --git 
a/hudi-common/src/main/java/org/apache/hudi/common/table/timeline/HoodieDefaultTimeline.java
 
b/hudi-common/src/main/java/org/apache/hudi/common/table/timeline/HoodieDefaultTimeline.java
index ec7c9633576..ecf7c938b01 100644
--- 
a/hudi-common/src/main/java/org/apache/hudi/common/table/timeline/HoodieDefaultTimeline.java
+++ 
b/hudi-common/src/main/java/org/apache/hudi/common/table/timeline/HoodieDefaultTimeline.java
@@ -440,7 +440,7 @@ public class HoodieDefaultTimeline implements 
HoodieTimeline {
     // Check for older timestamp which have sec granularity and an extension 
of DEFAULT_MILLIS_EXT may have been added via Timeline operations
     if (ts.length() == 
HoodieInstantTimeGenerator.MILLIS_INSTANT_TIMESTAMP_FORMAT_LENGTH && 
ts.endsWith(HoodieInstantTimeGenerator.DEFAULT_MILLIS_EXT)) {
       final String actualOlderFormatTs = ts.substring(0, ts.length() - 
HoodieInstantTimeGenerator.DEFAULT_MILLIS_EXT.length());
-      return containsOrBeforeTimelineStarts(actualOlderFormatTs);
+      return containsInstant(actualOlderFormatTs);
     }
 
     return false;

Reply via email to