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"));