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

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


The following commit(s) were added to refs/heads/master by this push:
     new 5313608fb [AMORO-4147] [Improvement]: Resource leak in 
CombinedDeleteFilter and MixedDeleteFilter position delete iterators. (#4148)
5313608fb is described below

commit 5313608fb9e66e6fb83b69885148dfb8aeab8ac2
Author: slfan1989 <[email protected]>
AuthorDate: Mon Mar 30 10:44:55 2026 +0800

    [AMORO-4147] [Improvement]: Resource leak in CombinedDeleteFilter and 
MixedDeleteFilter position delete iterators. (#4148)
---
 .../amoro/io/reader/CombinedDeleteFilter.java      | 19 ++++++++-------
 .../apache/amoro/io/reader/MixedDeleteFilter.java  | 27 ++++++++++++----------
 2 files changed, 26 insertions(+), 20 deletions(-)

diff --git 
a/amoro-format-iceberg/src/main/java/org/apache/amoro/io/reader/CombinedDeleteFilter.java
 
b/amoro-format-iceberg/src/main/java/org/apache/amoro/io/reader/CombinedDeleteFilter.java
index 66a92fcb8..d184ffcde 100644
--- 
a/amoro-format-iceberg/src/main/java/org/apache/amoro/io/reader/CombinedDeleteFilter.java
+++ 
b/amoro-format-iceberg/src/main/java/org/apache/amoro/io/reader/CombinedDeleteFilter.java
@@ -397,15 +397,18 @@ public abstract class CombinedDeleteFilter<T extends 
StructLike> {
     if (positionMap == null) {
       positionMap = new HashMap<>();
       List<CloseableIterable<Record>> deletes = Lists.transform(posDeletes, 
this::openPosDeletes);
-      CloseableIterator<Record> iterator = 
CloseableIterable.concat(deletes).iterator();
-      while (iterator.hasNext()) {
-        Record deleteRecord = iterator.next();
-        String path = FILENAME_ACCESSOR.get(deleteRecord).toString();
-        if (positionPathSets != null && !positionPathSets.contains(path)) {
-          continue;
+      try (CloseableIterator<Record> iterator = 
CloseableIterable.concat(deletes).iterator()) {
+        while (iterator.hasNext()) {
+          Record deleteRecord = iterator.next();
+          String path = FILENAME_ACCESSOR.get(deleteRecord).toString();
+          if (positionPathSets != null && !positionPathSets.contains(path)) {
+            continue;
+          }
+          Roaring64Bitmap posBitMap = positionMap.computeIfAbsent(path, k -> 
new Roaring64Bitmap());
+          posBitMap.add((Long) POSITION_ACCESSOR.get(deleteRecord));
         }
-        Roaring64Bitmap posBitMap = positionMap.computeIfAbsent(path, k -> new 
Roaring64Bitmap());
-        posBitMap.add((Long) POSITION_ACCESSOR.get(deleteRecord));
+      } catch (IOException e) {
+        throw new RuntimeException("Failed to close position delete iterator", 
e);
       }
     }
 
diff --git 
a/amoro-format-iceberg/src/main/java/org/apache/amoro/io/reader/MixedDeleteFilter.java
 
b/amoro-format-iceberg/src/main/java/org/apache/amoro/io/reader/MixedDeleteFilter.java
index 8aebbcb4e..1d61701e5 100644
--- 
a/amoro-format-iceberg/src/main/java/org/apache/amoro/io/reader/MixedDeleteFilter.java
+++ 
b/amoro-format-iceberg/src/main/java/org/apache/amoro/io/reader/MixedDeleteFilter.java
@@ -369,19 +369,22 @@ public abstract class MixedDeleteFilter<T> {
     if (positionMap == null) {
       positionMap = new HashMap<>();
       List<CloseableIterable<Record>> deletes = Lists.transform(posDeletes, 
this::openPosDeletes);
-      CloseableIterator<Record> iterator = 
CloseableIterable.concat(deletes).iterator();
-      while (iterator.hasNext()) {
-        Record deleteRecord = iterator.next();
-        String path = FILENAME_ACCESSOR.get(deleteRecord).toString();
-        if (!pathSets.contains(path)) {
-          continue;
-        }
-        Set<Long> posSet = positionMap.get(path);
-        if (posSet == null) {
-          posSet = new HashSet<>();
-          positionMap.put(path, posSet);
+      try (CloseableIterator<Record> iterator = 
CloseableIterable.concat(deletes).iterator()) {
+        while (iterator.hasNext()) {
+          Record deleteRecord = iterator.next();
+          String path = FILENAME_ACCESSOR.get(deleteRecord).toString();
+          if (!pathSets.contains(path)) {
+            continue;
+          }
+          Set<Long> posSet = positionMap.get(path);
+          if (posSet == null) {
+            posSet = new HashSet<>();
+            positionMap.put(path, posSet);
+          }
+          posSet.add((Long) POSITION_ACCESSOR.get(deleteRecord));
         }
-        posSet.add((Long) POSITION_ACCESSOR.get(deleteRecord));
+      } catch (IOException e) {
+        throw new RuntimeException("Failed to close position delete iterator", 
e);
       }
     }
 

Reply via email to