This is an automated email from the ASF dual-hosted git repository.
sivabalan 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 53ee07be3e03 fix(metadata-table): Fix failed deletes when updating MDT
with clean metadata (#18035)
53ee07be3e03 is described below
commit 53ee07be3e032c765d744c683a4813f6736a6d71
Author: Prashant Wason <[email protected]>
AuthorDate: Wed Feb 11 19:30:46 2026 -0800
fix(metadata-table): Fix failed deletes when updating MDT with clean
metadata (#18035)
Fix failed deletes when updating MDT with clean metadata
---------
Co-authored-by: Balajee Nagasubramaniam <[email protected]>
Co-authored-by: Claude Opus 4.5 <[email protected]>
---
.../org/apache/hudi/table/action/clean/CleanActionExecutor.java | 6 ++++--
.../java/org/apache/hudi/client/TestJavaHoodieBackedMetadata.java | 6 +++---
.../java/org/apache/hudi/functional/TestHoodieBackedMetadata.java | 6 +++---
3 files changed, 10 insertions(+), 8 deletions(-)
diff --git
a/hudi-client/hudi-client-common/src/main/java/org/apache/hudi/table/action/clean/CleanActionExecutor.java
b/hudi-client/hudi-client-common/src/main/java/org/apache/hudi/table/action/clean/CleanActionExecutor.java
index 0f662d94ee55..64262ab673a2 100644
---
a/hudi-client/hudi-client-common/src/main/java/org/apache/hudi/table/action/clean/CleanActionExecutor.java
+++
b/hudi-client/hudi-client-common/src/main/java/org/apache/hudi/table/action/clean/CleanActionExecutor.java
@@ -83,8 +83,10 @@ public class CleanActionExecutor<T, I, K, O> extends
BaseActionExecutor<T, I, K,
}
return deleteResult;
} catch (FileNotFoundException fio) {
- // With cleanPlan being used for retried cleaning operations, its
possible to clean a file twice
- return false;
+ // With cleanPlan being used for retried cleaning operations, its
possible to clean a file twice if a file to be
+ // deleted is not found, treat it as a success. In other words, there
is nothing else to be cleaned up on the
+ // FileSystem, except for updating the MDT. By returning success, we
would remove the entry from MDT.
+ return true;
} catch (IOException e) {
try {
if (storage.exists(deletePath)) {
diff --git
a/hudi-client/hudi-java-client/src/test/java/org/apache/hudi/client/TestJavaHoodieBackedMetadata.java
b/hudi-client/hudi-java-client/src/test/java/org/apache/hudi/client/TestJavaHoodieBackedMetadata.java
index 7d174414214a..e1917cc7cc35 100644
---
a/hudi-client/hudi-java-client/src/test/java/org/apache/hudi/client/TestJavaHoodieBackedMetadata.java
+++
b/hudi-client/hudi-java-client/src/test/java/org/apache/hudi/client/TestJavaHoodieBackedMetadata.java
@@ -2504,11 +2504,11 @@ public class TestJavaHoodieBackedMetadata extends
TestHoodieMetadataBase {
// 1 partition should be cleaned
assertEquals(cleanMetadata.getPartitionMetadata().size(), 1);
- // 1 file cleaned but was already deleted so will be a failed delete
+ // 1 file cleaned but was already deleted so will be counted as success
(file not found = nothing to delete = success)
assertEquals(
-
cleanMetadata.getPartitionMetadata().get(partition).getSuccessDeleteFiles().size(),
0);
+
cleanMetadata.getPartitionMetadata().get(partition).getSuccessDeleteFiles().size(),
1);
assertEquals(
-
cleanMetadata.getPartitionMetadata().get(partition).getFailedDeleteFiles().size(),
1);
+
cleanMetadata.getPartitionMetadata().get(partition).getFailedDeleteFiles().size(),
0);
assertEquals(
cleanMetadata.getPartitionMetadata().get(partition).getDeletePathPatterns().size(),
1);
diff --git
a/hudi-spark-datasource/hudi-spark/src/test/java/org/apache/hudi/functional/TestHoodieBackedMetadata.java
b/hudi-spark-datasource/hudi-spark/src/test/java/org/apache/hudi/functional/TestHoodieBackedMetadata.java
index 5e88aeb8d5e1..7268b3849308 100644
---
a/hudi-spark-datasource/hudi-spark/src/test/java/org/apache/hudi/functional/TestHoodieBackedMetadata.java
+++
b/hudi-spark-datasource/hudi-spark/src/test/java/org/apache/hudi/functional/TestHoodieBackedMetadata.java
@@ -3471,9 +3471,9 @@ public class TestHoodieBackedMetadata extends
TestHoodieMetadataBase {
// 1 partition should be cleaned
assertEquals(1, cleanMetadata.getPartitionMetadata().size());
- // 1 file cleaned but was already deleted so will be a failed delete
- assertEquals(0,
cleanMetadata.getPartitionMetadata().get(partition).getSuccessDeleteFiles().size());
- assertEquals(1,
cleanMetadata.getPartitionMetadata().get(partition).getFailedDeleteFiles().size());
+ // 1 file cleaned but was already deleted so will be counted as success
(file not found = nothing to delete = success)
+ assertEquals(1,
cleanMetadata.getPartitionMetadata().get(partition).getSuccessDeleteFiles().size());
+ assertEquals(0,
cleanMetadata.getPartitionMetadata().get(partition).getFailedDeleteFiles().size());
assertEquals(1,
cleanMetadata.getPartitionMetadata().get(partition).getDeletePathPatterns().size());
validateMetadata(client);