You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@maven.apache.org by sl...@apache.org on 2026/09/25 21:51:50 UTC

(maven-indexer) 01/01: Stop DefaultIteratorResultSet.finalize() writing to stderr

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

slachiewicz pushed a commit to branch agent/iterator-leak
in repository https://gitbox.apache.org/repos/asf/maven-indexer.git

commit bc1d1dfdddc4fb37f47a8eb418aa9205e7c08b6d
Author: Sylwester Lachiewicz <sl...@apache.org>
AuthorDate: Fri Sep 25 23:51:39 2026 +0200

    Stop DefaultIteratorResultSet.finalize() writing to stderr
    
    A result set whose constructor throws was never marked cleaned up, so its finalizer warned about a leak that DefaultSearchEngine had already released.
---
 .../maven/index/DefaultIteratorResultSet.java      | 15 ++++++--
 .../org/apache/maven/index/NexusIndexerTest.java   | 12 +++---
 .../maven/index/UniqueArtifactFilterTest.java      | 44 +++++++++++-----------
 3 files changed, 40 insertions(+), 31 deletions(-)

diff --git a/indexer-core/src/main/java/org/apache/maven/index/DefaultIteratorResultSet.java b/indexer-core/src/main/java/org/apache/maven/index/DefaultIteratorResultSet.java
index 5ca4b42..9e1e537 100644
--- a/indexer-core/src/main/java/org/apache/maven/index/DefaultIteratorResultSet.java
+++ b/indexer-core/src/main/java/org/apache/maven/index/DefaultIteratorResultSet.java
@@ -42,6 +42,8 @@ import org.apache.maven.index.context.IndexUtils;
 import org.apache.maven.index.context.IndexingContext;
 import org.apache.maven.index.context.NexusIndexMultiSearcher;
 import org.apache.maven.index.creator.JarFileContentsIndexCreator;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
 
 /**
  * Default implementation of IteratorResultSet. TODO: there is too much of logic, refactor this!
@@ -49,6 +51,8 @@ import org.apache.maven.index.creator.JarFileContentsIndexCreator;
  * @author cstamas
  */
 public class DefaultIteratorResultSet implements IteratorResultSet {
+    private static final Logger LOGGER = LoggerFactory.getLogger(DefaultIteratorResultSet.class);
+
     private final IteratorSearchRequest searchRequest;
 
     private final NexusIndexMultiSearcher indexSearcher;
@@ -129,7 +133,13 @@ public class DefaultIteratorResultSet implements IteratorResultSet {
 
         this.maxRecPointer = from + count;
 
-        ai = createNextAi();
+        try {
+            ai = createNextAi();
+        } catch (IOException | RuntimeException e) {
+            // the caller releases the searcher when construction fails
+            this.cleanedUp = true;
+            throw e;
+        }
 
         if (ai == null) {
             cleanUp();
@@ -180,8 +190,7 @@ public class DefaultIteratorResultSet implements IteratorResultSet {
         super.finalize();
 
         if (!cleanedUp) {
-            System.err.println("#WARNING: Lock leaking from " + getClass().getName() + " for query "
-                    + searchRequest.getQuery().toString());
+            LOGGER.warn("Lock leaking from {} for query {}", getClass().getName(), searchRequest.getQuery());
 
             cleanUp();
         }
diff --git a/indexer-core/src/test/java/org/apache/maven/index/NexusIndexerTest.java b/indexer-core/src/test/java/org/apache/maven/index/NexusIndexerTest.java
index f5ab55d..075d39e 100644
--- a/indexer-core/src/test/java/org/apache/maven/index/NexusIndexerTest.java
+++ b/indexer-core/src/test/java/org/apache/maven/index/NexusIndexerTest.java
@@ -375,15 +375,15 @@ public class NexusIndexerTest extends AbstractIndexCreatorHelper {
                         // we reject version "1.5" for fun
                         !StringUtils.equals(ai.getVersion(), "1.5"));
 
-        IteratorSearchResponse response = indexer.searchIterator(request);
-
-        assertEquals(2, response.getTotalHits());
+        try (IteratorSearchResponse response = indexer.searchIterator(request)) {
+            assertEquals(2, response.getTotalHits());
 
-        assertTrue(response.getResults().hasNext(), "Iterator has to have next (2 found, 1 filtered out)");
+            assertTrue(response.getResults().hasNext(), "Iterator has to have next (2 found, 1 filtered out)");
 
-        ArtifactInfo ai = response.getResults().next();
+            ArtifactInfo ai = response.getResults().next();
 
-        assertEquals("1.6.1", ai.getVersion(), "1.5 is filtered out, so 1.6.1 must appear here!");
+            assertEquals("1.6.1", ai.getVersion(), "1.5 is filtered out, so 1.6.1 must appear here!");
+        }
     }
 
     @Test
diff --git a/indexer-core/src/test/java/org/apache/maven/index/UniqueArtifactFilterTest.java b/indexer-core/src/test/java/org/apache/maven/index/UniqueArtifactFilterTest.java
index 02613ff..a0e34f7 100644
--- a/indexer-core/src/test/java/org/apache/maven/index/UniqueArtifactFilterTest.java
+++ b/indexer-core/src/test/java/org/apache/maven/index/UniqueArtifactFilterTest.java
@@ -62,28 +62,28 @@ public class UniqueArtifactFilterTest extends AbstractIndexCreatorHelper {
 
         IteratorSearchRequest request = new IteratorSearchRequest(q, filter);
 
-        IteratorSearchResponse response = indexer.searchIterator(request);
-
-        assertEquals(15, response.getTotalHits(), "15 total hits (before filtering!)");
-
-        ArtifactInfo ai = response.getResults().next();
-        assertTrue(ai != null, "Iterator has to have next (2 should be returned)");
-
-        ai = response.getResults().next();
-        assertTrue(ai != null, "Iterator has to have next (2 should be returned)");
-
-        assertEquals(
-                UniqueArtifactFilterPostprocessor.COLLAPSED,
-                ai.getVersion(),
-                "Property that is not unique has to have \"COLLAPSED\" value!");
-        assertEquals(
-                UniqueArtifactFilterPostprocessor.COLLAPSED,
-                ai.getPackaging(),
-                "Property that is not unique has to have \"COLLAPSED\" value!");
-        assertEquals(
-                UniqueArtifactFilterPostprocessor.COLLAPSED,
-                ai.getClassifier(),
-                "Property that is not unique has to have \"COLLAPSED\" value!");
+        try (IteratorSearchResponse response = indexer.searchIterator(request)) {
+            assertEquals(15, response.getTotalHits(), "15 total hits (before filtering!)");
+
+            ArtifactInfo ai = response.getResults().next();
+            assertTrue(ai != null, "Iterator has to have next (2 should be returned)");
+
+            ai = response.getResults().next();
+            assertTrue(ai != null, "Iterator has to have next (2 should be returned)");
+
+            assertEquals(
+                    UniqueArtifactFilterPostprocessor.COLLAPSED,
+                    ai.getVersion(),
+                    "Property that is not unique has to have \"COLLAPSED\" value!");
+            assertEquals(
+                    UniqueArtifactFilterPostprocessor.COLLAPSED,
+                    ai.getPackaging(),
+                    "Property that is not unique has to have \"COLLAPSED\" value!");
+            assertEquals(
+                    UniqueArtifactFilterPostprocessor.COLLAPSED,
+                    ai.getClassifier(),
+                    "Property that is not unique has to have \"COLLAPSED\" value!");
+        }
     }
 
     // ==