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

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


The following commit(s) were added to refs/heads/branch-0.x by this push:
     new 3a4f58685a56 fix(HUDI-9288): Fixing HoodieFileGroup api related to 
uncommitted slices (#17847)
3a4f58685a56 is described below

commit 3a4f58685a56131dca55ac209757cab3bfcb2850
Author: Lin Liu <[email protected]>
AuthorDate: Thu Feb 5 19:16:49 2026 -0800

    fix(HUDI-9288): Fixing HoodieFileGroup api related to uncommitted slices 
(#17847)
    
    * [HUDI-9288] Fixing HoodieFileGroup api related to uncommitted slices
    
    ---------
    
    Co-authored-by: Tim Brown <[email protected]>
---
 .../apache/hudi/common/model/HoodieFileGroup.java  |  2 +-
 .../table/view/AbstractTableFileSystemView.java    |  5 +++-
 .../hudi/common/model/TestHoodieFileGroup.java     | 28 +++++++++++++++++++++-
 3 files changed, 32 insertions(+), 3 deletions(-)

diff --git 
a/hudi-common/src/main/java/org/apache/hudi/common/model/HoodieFileGroup.java 
b/hudi-common/src/main/java/org/apache/hudi/common/model/HoodieFileGroup.java
index 9b5e8c1dd6f0..1c042d051aa9 100644
--- 
a/hudi-common/src/main/java/org/apache/hudi/common/model/HoodieFileGroup.java
+++ 
b/hudi-common/src/main/java/org/apache/hudi/common/model/HoodieFileGroup.java
@@ -154,7 +154,7 @@ public class HoodieFileGroup implements Serializable {
   }
 
   public Stream<FileSlice> getAllFileSlicesBeforeOn(String maxInstantTime) {
-    return fileSlices.values().stream().filter(slice -> 
compareTimestamps(slice.getBaseInstantTime(), LESSER_THAN_OR_EQUALS, 
maxInstantTime));
+    return getAllFileSlices().filter(slice -> 
compareTimestamps(slice.getBaseInstantTime(), LESSER_THAN_OR_EQUALS, 
maxInstantTime));
   }
 
   /**
diff --git 
a/hudi-common/src/main/java/org/apache/hudi/common/table/view/AbstractTableFileSystemView.java
 
b/hudi-common/src/main/java/org/apache/hudi/common/table/view/AbstractTableFileSystemView.java
index f63c6bf3ddeb..6a301d0936f6 100644
--- 
a/hudi-common/src/main/java/org/apache/hudi/common/table/view/AbstractTableFileSystemView.java
+++ 
b/hudi-common/src/main/java/org/apache/hudi/common/table/view/AbstractTableFileSystemView.java
@@ -1452,7 +1452,10 @@ public abstract class AbstractTableFileSystemView 
implements SyncableFileSystemV
    * @param maxInstantTime The max instant time
    */
   private Option<FileSlice> fetchAllLogsMergedFileSlice(HoodieFileGroup 
fileGroup, String maxInstantTime) {
-    List<FileSlice> fileSlices = 
fileGroup.getAllFileSlicesBeforeOn(maxInstantTime).collect(Collectors.toList());
+    List<FileSlice> fileSlices = 
fileGroup.getAllRawFileSlices().collect(Collectors.toList());
+    fileSlices = fileSlices.stream()
+        .filter(slice -> 
HoodieTimeline.compareTimestamps(slice.getBaseInstantTime(), 
LESSER_THAN_OR_EQUALS, maxInstantTime))
+        .collect(Collectors.toList());
     if (fileSlices.size() == 0) {
       return Option.empty();
     }
diff --git 
a/hudi-hadoop-common/src/test/java/org/apache/hudi/common/model/TestHoodieFileGroup.java
 
b/hudi-hadoop-common/src/test/java/org/apache/hudi/common/model/TestHoodieFileGroup.java
index a7cdf22f8020..80c585dc710e 100644
--- 
a/hudi-hadoop-common/src/test/java/org/apache/hudi/common/model/TestHoodieFileGroup.java
+++ 
b/hudi-hadoop-common/src/test/java/org/apache/hudi/common/model/TestHoodieFileGroup.java
@@ -18,9 +18,11 @@
 
 package org.apache.hudi.common.model;
 
+import org.apache.hudi.common.fs.FSUtils;
 import org.apache.hudi.common.table.timeline.HoodieInstant;
 import org.apache.hudi.common.table.timeline.HoodieTimeline;
 import org.apache.hudi.common.testutils.MockHoodieTimeline;
+import org.apache.hudi.storage.StoragePath;
 
 import org.junit.jupiter.api.Test;
 
@@ -30,6 +32,7 @@ import java.util.stream.Collectors;
 import java.util.stream.Stream;
 
 import static org.junit.jupiter.api.Assertions.assertEquals;
+import static org.junit.jupiter.api.Assertions.assertFalse;
 import static org.junit.jupiter.api.Assertions.assertTrue;
 
 /**
@@ -50,7 +53,30 @@ public class TestHoodieFileGroup {
       fileGroup.addBaseFile(baseFile);
     }
     assertEquals(2, fileGroup.getAllFileSlices().count());
-    assertTrue(!fileGroup.getAllFileSlices().anyMatch(s -> 
s.getBaseInstantTime().equals("002")));
+    assertEquals(2, fileGroup.getAllFileSlicesBeforeOn("002").count());
+    assertFalse(fileGroup.getAllFileSlices().anyMatch(s -> 
s.getBaseInstantTime().equals("002")));
+    assertEquals(3, fileGroup.getAllFileSlicesIncludingInflight().count());
+    assertEquals("001", 
fileGroup.getLatestFileSlice().get().getBaseInstantTime());
+    assertEquals("001", (new 
HoodieFileGroup(fileGroup)).getLatestFileSlice().get().getBaseInstantTime());
+  }
+
+  @Test
+  public void testCommittedFileSlicesWithSavepoint() {
+    // "000" is archived
+    Stream<String> completed = Stream.of("001");
+    Stream<String> inflight = Stream.of("002");
+    MockHoodieTimeline activeTimeline = new MockHoodieTimeline(completed, 
inflight);
+    HoodieFileGroup fileGroup = new HoodieFileGroup("", "data",
+        activeTimeline.getCommitsTimeline().filterCompletedInstants());
+    for (int i = 0; i < 3; i++) {
+      HoodieBaseFile baseFile = new HoodieBaseFile("data_1_00" + i);
+      fileGroup.addBaseFile(baseFile);
+      fileGroup.addLogFile(new HoodieLogFile(new 
StoragePath(FSUtils.makeLogFileName(
+          "001", HoodieFileFormat.HOODIE_LOG.getFileExtension(), 
baseFile.getCommitTime(), i, "data"))));
+    }
+
+    assertEquals(2, fileGroup.getAllFileSlices().count());
+    assertFalse(fileGroup.getAllFileSlices().anyMatch(s -> 
s.getBaseInstantTime().equals("002")));
     assertEquals(3, fileGroup.getAllFileSlicesIncludingInflight().count());
     
assertTrue(fileGroup.getLatestFileSlice().get().getBaseInstantTime().equals("001"));
     assertTrue((new 
HoodieFileGroup(fileGroup)).getLatestFileSlice().get().getBaseInstantTime().equals("001"));

Reply via email to