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