This is an automated email from the ASF dual-hosted git repository.

lzljs3620320 pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/paimon.git


The following commit(s) were added to refs/heads/master by this push:
     new 32d019106 [core] Filter data file while executing local orphan clean 
(#4287)
32d019106 is described below

commit 32d019106967840466940b6d2328c188b88b03da
Author: bknbkn <[email protected]>
AuthorDate: Wed Oct 9 23:11:33 2024 +0800

    [core] Filter data file while executing local orphan clean (#4287)
---
 .../paimon/operation/LocalOrphanFilesClean.java    | 26 ++++++++++++++--------
 1 file changed, 17 insertions(+), 9 deletions(-)

diff --git 
a/paimon-core/src/main/java/org/apache/paimon/operation/LocalOrphanFilesClean.java
 
b/paimon-core/src/main/java/org/apache/paimon/operation/LocalOrphanFilesClean.java
index a17434faa..74f9fbe00 100644
--- 
a/paimon-core/src/main/java/org/apache/paimon/operation/LocalOrphanFilesClean.java
+++ 
b/paimon-core/src/main/java/org/apache/paimon/operation/LocalOrphanFilesClean.java
@@ -65,6 +65,8 @@ public class LocalOrphanFilesClean extends OrphanFilesClean {
 
     private final List<Path> deleteFiles;
 
+    private Set<String> candidateDeletes;
+
     public LocalOrphanFilesClean(FileStoreTable table) {
         this(table, System.currentTimeMillis() - TimeUnit.DAYS.toMillis(1));
     }
@@ -93,6 +95,7 @@ public class LocalOrphanFilesClean extends OrphanFilesClean {
         if (candidates.isEmpty()) {
             return deleteFiles;
         }
+        candidateDeletes = new HashSet<>(candidates.keySet());
 
         // find used files
         Set<String> usedFiles =
@@ -101,10 +104,11 @@ public class LocalOrphanFilesClean extends 
OrphanFilesClean {
                         .collect(Collectors.toSet());
 
         // delete unused files
-        Set<String> deleted = new HashSet<>(candidates.keySet());
-        deleted.removeAll(usedFiles);
-        deleted.stream().map(candidates::get).forEach(fileCleaner);
-        
deleteFiles.addAll(deleted.stream().map(candidates::get).collect(Collectors.toList()));
+        candidateDeletes.removeAll(usedFiles);
+        candidateDeletes.stream().map(candidates::get).forEach(fileCleaner);
+        deleteFiles.addAll(
+                
candidateDeletes.stream().map(candidates::get).collect(Collectors.toList()));
+        candidateDeletes.clear();
 
         return deleteFiles;
     }
@@ -114,7 +118,7 @@ public class LocalOrphanFilesClean extends OrphanFilesClean 
{
         ManifestFile manifestFile =
                 
table.switchToBranch(branch).store().manifestFileFactory().create();
         try {
-            List<String> manifests = new ArrayList<>();
+            Set<String> manifests = new HashSet<>();
             collectWithoutDataFile(branch, usedFiles::add, manifests::add);
             usedFiles.addAll(retryReadingDataFiles(manifestFile, manifests));
         } catch (IOException e) {
@@ -144,8 +148,8 @@ public class LocalOrphanFilesClean extends OrphanFilesClean 
{
         return result;
     }
 
-    private List<String> retryReadingDataFiles(
-            ManifestFile manifestFile, List<String> manifestNames) throws 
IOException {
+    private List<String> retryReadingDataFiles(ManifestFile manifestFile, 
Set<String> manifestNames)
+            throws IOException {
         List<String> dataFiles = new ArrayList<>();
         for (String manifestName : manifestNames) {
             retryReadingFiles(
@@ -155,8 +159,12 @@ public class LocalOrphanFilesClean extends 
OrphanFilesClean {
                     .map(ManifestEntry::file)
                     .forEach(
                             f -> {
-                                dataFiles.add(f.fileName());
-                                dataFiles.addAll(f.extraFiles());
+                                if (candidateDeletes.contains(f.fileName())) {
+                                    dataFiles.add(f.fileName());
+                                }
+                                f.extraFiles().stream()
+                                        .filter(candidateDeletes::contains)
+                                        .forEach(dataFiles::add);
                             });
         }
         return dataFiles;

Reply via email to