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 fd008dae7347 feat: introduce timeline manifest retained version conf 
(#17996)
fd008dae7347 is described below

commit fd008dae73470721edf378f22c158ef8115ef7ab
Author: chaoyang <[email protected]>
AuthorDate: Tue Jan 27 12:57:12 2026 +0800

    feat: introduce timeline manifest retained version conf (#17996)
---
 .../hudi/client/timeline/versioning/v2/LSMTimelineWriter.java      | 6 ++++--
 .../src/main/java/org/apache/hudi/config/HoodieArchivalConfig.java | 7 +++++++
 .../src/main/java/org/apache/hudi/config/HoodieWriteConfig.java    | 4 ++++
 3 files changed, 15 insertions(+), 2 deletions(-)

diff --git 
a/hudi-client/hudi-client-common/src/main/java/org/apache/hudi/client/timeline/versioning/v2/LSMTimelineWriter.java
 
b/hudi-client/hudi-client-common/src/main/java/org/apache/hudi/client/timeline/versioning/v2/LSMTimelineWriter.java
index 3ce2078fc46f..b555a0646183 100644
--- 
a/hudi-client/hudi-client-common/src/main/java/org/apache/hudi/client/timeline/versioning/v2/LSMTimelineWriter.java
+++ 
b/hudi-client/hudi-client-common/src/main/java/org/apache/hudi/client/timeline/versioning/v2/LSMTimelineWriter.java
@@ -329,9 +329,11 @@ public class LSMTimelineWriter {
    * @param context HoodieEngineContext used for parallelize to delete 
obsolete files if necessary.
    */
   public void clean(HoodieEngineContext context, int compactedVersions) throws 
IOException {
-    // if there are more than 3 version of snapshots, clean the oldest files.
+    int versionRetained = config.getTimelineManifestRetainedVersions();
+    log.info("Starting cleaning obsolete files, retaining latest ({} + {}) 
manifest versions.", versionRetained, compactedVersions);
+    // if there are more than versionRetained version of snapshots, clean the 
oldest files.
     List<Integer> allSnapshotVersions = 
LSMTimeline.allSnapshotVersions(metaClient, archivePath);
-    int numVersionsToKeep = 3 + compactedVersions; // should make the 
threshold configurable.
+    int numVersionsToKeep = versionRetained + compactedVersions;
     if (allSnapshotVersions.size() > numVersionsToKeep) {
       allSnapshotVersions.sort((v1, v2) -> v2 - v1);
       List<Integer> versionsToKeep = allSnapshotVersions.subList(0, 
numVersionsToKeep);
diff --git 
a/hudi-client/hudi-client-common/src/main/java/org/apache/hudi/config/HoodieArchivalConfig.java
 
b/hudi-client/hudi-client-common/src/main/java/org/apache/hudi/config/HoodieArchivalConfig.java
index 8c27a3949929..1b1e3ba5c391 100644
--- 
a/hudi-client/hudi-client-common/src/main/java/org/apache/hudi/config/HoodieArchivalConfig.java
+++ 
b/hudi-client/hudi-client-common/src/main/java/org/apache/hudi/config/HoodieArchivalConfig.java
@@ -107,6 +107,13 @@ public class HoodieArchivalConfig extends HoodieConfig {
         .defaultValue(1000L * 1024 * 1024)
         .markAdvanced()
         .withDocumentation("Max size (in bytes) for each archived timeline 
file.");
+
+  public static final ConfigProperty<Integer> 
TIMELINE_MANIFEST_RETAINED_VERSIONS = ConfigProperty
+      .key("hoodie.timeline.manifest.retained.versions")
+      .defaultValue(3)
+      .markAdvanced()
+      .withDocumentation("Number of timeline manifest versions to retain.");
+
   /**
    * @deprecated Use {@link #MAX_COMMITS_TO_KEEP} and its methods instead
    */
diff --git 
a/hudi-client/hudi-client-common/src/main/java/org/apache/hudi/config/HoodieWriteConfig.java
 
b/hudi-client/hudi-client-common/src/main/java/org/apache/hudi/config/HoodieWriteConfig.java
index 047aa169a644..0310b850a543 100644
--- 
a/hudi-client/hudi-client-common/src/main/java/org/apache/hudi/config/HoodieWriteConfig.java
+++ 
b/hudi-client/hudi-client-common/src/main/java/org/apache/hudi/config/HoodieWriteConfig.java
@@ -1743,6 +1743,10 @@ public class HoodieWriteConfig extends HoodieConfig {
     return 
getLong(HoodieArchivalConfig.TIMELINE_COMPACTION_TARGET_FILE_MAX_BYTES);
   }
 
+  public int getTimelineManifestRetainedVersions() {
+    return getInt(HoodieArchivalConfig.TIMELINE_MANIFEST_RETAINED_VERSIONS);
+  }
+
   public int getParquetSmallFileLimit() {
     return getInt(HoodieCompactionConfig.PARQUET_SMALL_FILE_LIMIT);
   }

Reply via email to