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!");
+ }
}
// ==