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

yihua 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 3b205d1e2aa [HUDI-9059] Fix ordering of getInstantTimes in 
CompletionTimeQueryViewV2 (#12858)
3b205d1e2aa is described below

commit 3b205d1e2aaf415cbc60f8b8328aab31bf21727e
Author: Tim Brown <[email protected]>
AuthorDate: Thu Feb 20 19:58:26 2025 -0600

    [HUDI-9059] Fix ordering of getInstantTimes in CompletionTimeQueryViewV2 
(#12858)
---
 .../timeline/TestCompletionTimeQueryView.java      | 22 ++++++++++++++++++++++
 .../versioning/v2/CompletionTimeQueryViewV2.java   |  3 +--
 2 files changed, 23 insertions(+), 2 deletions(-)

diff --git 
a/hudi-client/hudi-client-common/src/test/java/org/apache/hudi/client/timeline/TestCompletionTimeQueryView.java
 
b/hudi-client/hudi-client-common/src/test/java/org/apache/hudi/client/timeline/TestCompletionTimeQueryView.java
index 72c25634a86..db5a112f41c 100644
--- 
a/hudi-client/hudi-client-common/src/test/java/org/apache/hudi/client/timeline/TestCompletionTimeQueryView.java
+++ 
b/hudi-client/hudi-client-common/src/test/java/org/apache/hudi/client/timeline/TestCompletionTimeQueryView.java
@@ -25,6 +25,7 @@ import org.apache.hudi.common.model.HoodieCommitMetadata;
 import org.apache.hudi.common.model.HoodieTableType;
 import org.apache.hudi.common.model.WriteOperationType;
 import org.apache.hudi.common.table.HoodieTableMetaClient;
+import org.apache.hudi.common.table.log.InstantRange;
 import org.apache.hudi.common.table.timeline.ActiveAction;
 import org.apache.hudi.common.table.timeline.CompletionTimeQueryView;
 import org.apache.hudi.common.table.timeline.HoodieInstant;
@@ -45,6 +46,7 @@ import org.junit.jupiter.api.io.TempDir;
 import java.io.File;
 import java.util.ArrayList;
 import java.util.Arrays;
+import java.util.Collections;
 import java.util.List;
 import java.util.stream.Collectors;
 
@@ -54,6 +56,7 @@ import static 
org.apache.hudi.common.testutils.HoodieTestUtils.INSTANT_FILE_NAME
 import static 
org.apache.hudi.common.testutils.HoodieTestUtils.TIMELINE_FACTORY;
 import static org.hamcrest.CoreMatchers.is;
 import static org.hamcrest.MatcherAssert.assertThat;
+import static org.junit.jupiter.api.Assertions.assertEquals;
 import static org.junit.jupiter.api.Assertions.assertFalse;
 import static org.junit.jupiter.api.Assertions.assertTrue;
 import static org.mockito.Mockito.mock;
@@ -120,6 +123,25 @@ public class TestCompletionTimeQueryView {
     }
   }
 
+  @Test
+  void testGetInstantTimesWithOnlyEndCompletionTime() throws Exception {
+    String tableName = "testTable";
+    String tablePath = tempFile.getAbsolutePath() + StoragePath.SEPARATOR + 
tableName;
+    HoodieTableMetaClient metaClient = HoodieTestUtils.init(
+        HoodieTestUtils.getDefaultStorageConf(), tablePath, 
HoodieTableType.COPY_ON_WRITE, tableName);
+    prepareTimeline(tablePath, metaClient);
+    try (CompletionTimeQueryView view =
+             
metaClient.getTimelineLayout().getTimelineFactory().createCompletionTimeQueryView(metaClient,
 String.format("%08d", 3))) {
+      // Fetch instant matching the completion time provided
+      assertEquals(Collections.singletonList("00000009"), 
view.getInstantTimes(metaClient.getActiveTimeline(), Option.empty(), 
Option.of("00001009"), InstantRange.RangeType.CLOSED_CLOSED));
+      // Fetch instant just before the completion time provided
+      assertEquals(Collections.singletonList("00000010"), 
view.getInstantTimes(metaClient.getActiveTimeline(), Option.empty(), 
Option.of("00001011"), InstantRange.RangeType.CLOSED_CLOSED));
+      // Fall back case where only archive instants are before the completion 
time provided
+      assertEquals(Arrays.asList("00000001", "00000002", "00000003", 
"00000004", "00000005"),
+          view.getInstantTimes(metaClient.getActiveTimeline(), Option.empty(), 
Option.of("00001005"), InstantRange.RangeType.CLOSED_CLOSED));
+    }
+  }
+
   private String getInstantTimeSetFormattedString(CompletionTimeQueryView 
view, int completionTime1, int completionTime2) {
     return view.getInstantTimes(String.format("%08d", completionTime1), 
String.format("%08d", completionTime2),
             s -> String.format("%08d", Integer.parseInt(s) - 1000))
diff --git 
a/hudi-common/src/main/java/org/apache/hudi/common/table/timeline/versioning/v2/CompletionTimeQueryViewV2.java
 
b/hudi-common/src/main/java/org/apache/hudi/common/table/timeline/versioning/v2/CompletionTimeQueryViewV2.java
index 939613092e1..8005614c6fd 100644
--- 
a/hudi-common/src/main/java/org/apache/hudi/common/table/timeline/versioning/v2/CompletionTimeQueryViewV2.java
+++ 
b/hudi-common/src/main/java/org/apache/hudi/common/table/timeline/versioning/v2/CompletionTimeQueryViewV2.java
@@ -191,7 +191,6 @@ public class CompletionTimeQueryViewV2 implements 
CompletionTimeQueryView, Seria
   }
 
   @Override
-
   public List<String> getInstantTimes(
       HoodieTimeline timeline,
       Option<String> startCompletionTime,
@@ -256,7 +255,7 @@ public class CompletionTimeQueryViewV2 implements 
CompletionTimeQueryView, Seria
       // fallback to archived timeline
       return this.instantTimeToCompletionTimeMap.entrySet().stream()
           .filter(entry -> 
InstantComparison.compareTimestamps(entry.getValue(), LESSER_THAN_OR_EQUALS, 
endCompletionTime.get()))
-          .map(Map.Entry::getKey).collect(Collectors.toList());
+          .map(Map.Entry::getKey).sorted().collect(Collectors.toList());
     }
 
     if (startFromEarliest) {

Reply via email to