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

Reply via email to