From cefb8257a743ffdeefe368729b04196e0c2fe582 Mon Sep 17 00:00:00 2001 From: Tamas Cservenak Date: Tue, 18 Nov 2025 19:20:40 +0100 Subject: [PATCH 1/3] [1.9.x] Remove hack from Basic connector There was an issue https://github.com/apache/maven-resolver/issues/996 that is still open and points to `MavenITmng4470AuthenticatedDeploymentToProxyTest` IT, so lets trigger it and lets fix it. --- .../basic/BasicRepositoryConnector.java | 34 ++++--------------- 1 file changed, 6 insertions(+), 28 deletions(-) diff --git a/maven-resolver-connector-basic/src/main/java/org/eclipse/aether/connector/basic/BasicRepositoryConnector.java b/maven-resolver-connector-basic/src/main/java/org/eclipse/aether/connector/basic/BasicRepositoryConnector.java index 11e9a9133..e39a5f5a1 100644 --- a/maven-resolver-connector-basic/src/main/java/org/eclipse/aether/connector/basic/BasicRepositoryConnector.java +++ b/maven-resolver-connector-basic/src/main/java/org/eclipse/aether/connector/basic/BasicRepositoryConnector.java @@ -188,8 +188,6 @@ public void get( RunnableErrorForwarder errorForwarder = new RunnableErrorForwarder(); List checksumAlgorithmFactories = layout.getChecksumAlgorithmFactories(); - boolean first = true; - for (MetadataDownload transfer : safeMetadataDownloads) { URI location = layout.getLocation(transfer.getMetadata(), false); @@ -211,12 +209,7 @@ public void get( checksumLocations, null, listener); - if (first) { - task.run(); - first = false; - } else { - executor.execute(errorForwarder.wrap(task)); - } + executor.execute(errorForwarder.wrap(task)); } for (ArtifactDownload transfer : safeArtifactDownloads) { @@ -256,12 +249,7 @@ public void get( providedChecksums, listener); } - if (first) { - task.run(); - first = false; - } else { - executor.execute(errorForwarder.wrap(task)); - } + executor.execute(errorForwarder.wrap(task)); } errorForwarder.await(); @@ -279,8 +267,6 @@ public void put( Executor executor = getExecutor(parallelPut ? safeArtifactUploads.size() + safeMetadataUploads.size() : 1); RunnableErrorForwarder errorForwarder = new RunnableErrorForwarder(); - boolean first = true; - for (ArtifactUpload transfer : safeArtifactUploads) { URI location = layout.getLocation(transfer.getArtifact(), true); @@ -293,12 +279,8 @@ public void put( Runnable task = new PutTaskRunner( location, transfer.getFile(), transfer.getFileTransformer(), checksumLocations, listener); - if (first) { - task.run(); - first = false; - } else { - executor.execute(errorForwarder.wrap(task)); - } + + executor.execute(errorForwarder.wrap(task)); } errorForwarder.await(); // make sure all artifacts are PUT before we go with Metadata @@ -315,12 +297,8 @@ public void put( layout.getChecksumLocations(transfer.getMetadata(), true, location); Runnable task = new PutTaskRunner(location, transfer.getFile(), checksumLocations, listener); - if (first) { - task.run(); - first = false; - } else { - executor.execute(errorForwarder.wrap(task)); - } + + executor.execute(errorForwarder.wrap(task)); } errorForwarder.await(); // make sure each group is done before starting next group From 1fa9e9ebcf20eb27588ea855eb2eda7835d4c718 Mon Sep 17 00:00:00 2001 From: Tamas Cservenak Date: Tue, 18 Nov 2025 19:30:54 +0100 Subject: [PATCH 2/3] Fix Reproducer --- .../examples/ResolveTransitiveDependenciesParallel.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/maven-resolver-demos/maven-resolver-demo-snippets/src/main/java/org/apache/maven/resolver/examples/ResolveTransitiveDependenciesParallel.java b/maven-resolver-demos/maven-resolver-demo-snippets/src/main/java/org/apache/maven/resolver/examples/ResolveTransitiveDependenciesParallel.java index c5825b6a1..6a5de0b86 100644 --- a/maven-resolver-demos/maven-resolver-demo-snippets/src/main/java/org/apache/maven/resolver/examples/ResolveTransitiveDependenciesParallel.java +++ b/maven-resolver-demos/maven-resolver-demo-snippets/src/main/java/org/apache/maven/resolver/examples/ResolveTransitiveDependenciesParallel.java @@ -216,7 +216,7 @@ private static Runnable resolveWithDependencies( DependencyRequest dependencyRequest = new DependencyRequest(collectRequest, null); List artifactResults = system.resolveDependencies(session, dependencyRequest).getArtifactResults(); - int resolved = 9; + int resolved = 0; int fails = 0; for (ArtifactResult artifactResult : artifactResults) { if (artifactResult.isResolved()) { From 7aff52ea503509c02e854de8c24c3c3182042d76 Mon Sep 17 00:00:00 2001 From: Tamas Cservenak Date: Wed, 19 Nov 2025 11:26:26 +0100 Subject: [PATCH 3/3] Use concurrent maps --- .../http/DeferredCredentialsProvider.java | 6 +++--- .../aether/transport/http/SharingAuthCache.java | 15 +++++++++------ 2 files changed, 12 insertions(+), 9 deletions(-) diff --git a/maven-resolver-transport-http/src/main/java/org/eclipse/aether/transport/http/DeferredCredentialsProvider.java b/maven-resolver-transport-http/src/main/java/org/eclipse/aether/transport/http/DeferredCredentialsProvider.java index 664e8fb06..c38d9e5ef 100644 --- a/maven-resolver-transport-http/src/main/java/org/eclipse/aether/transport/http/DeferredCredentialsProvider.java +++ b/maven-resolver-transport-http/src/main/java/org/eclipse/aether/transport/http/DeferredCredentialsProvider.java @@ -20,9 +20,9 @@ import java.net.InetAddress; import java.net.UnknownHostException; -import java.util.HashMap; import java.util.Iterator; import java.util.Map; +import java.util.concurrent.ConcurrentHashMap; import org.apache.http.auth.AuthScope; import org.apache.http.auth.Credentials; @@ -39,11 +39,11 @@ final class DeferredCredentialsProvider implements CredentialsProvider { private final CredentialsProvider delegate; - private final Map factories; + private final ConcurrentHashMap factories; DeferredCredentialsProvider() { delegate = new BasicCredentialsProvider(); - factories = new HashMap<>(); + factories = new ConcurrentHashMap<>(); } public void setCredentials(AuthScope authScope, Factory factory) { diff --git a/maven-resolver-transport-http/src/main/java/org/eclipse/aether/transport/http/SharingAuthCache.java b/maven-resolver-transport-http/src/main/java/org/eclipse/aether/transport/http/SharingAuthCache.java index f55b822ac..d7ed9c591 100644 --- a/maven-resolver-transport-http/src/main/java/org/eclipse/aether/transport/http/SharingAuthCache.java +++ b/maven-resolver-transport-http/src/main/java/org/eclipse/aether/transport/http/SharingAuthCache.java @@ -18,8 +18,8 @@ */ package org.eclipse.aether.transport.http; -import java.util.HashMap; import java.util.Map; +import java.util.concurrent.ConcurrentHashMap; import org.apache.http.HttpHost; import org.apache.http.auth.AuthScheme; @@ -33,11 +33,11 @@ final class SharingAuthCache implements AuthCache { private final LocalState state; - private final Map authSchemes; + private final ConcurrentHashMap authSchemes; SharingAuthCache(LocalState state) { this.state = state; - authSchemes = new HashMap<>(); + authSchemes = new ConcurrentHashMap<>(); } private static HttpHost toKey(HttpHost host) { @@ -54,17 +54,20 @@ public AuthScheme get(HttpHost host) { AuthScheme authScheme = authSchemes.get(host); if (authScheme == null) { authScheme = state.getAuthScheme(host); - authSchemes.put(host, authScheme); + if (authScheme != null) { + authSchemes.put(host, authScheme); + } } return authScheme; } @Override public void put(HttpHost host, AuthScheme authScheme) { + host = toKey(host); if (authScheme != null) { - authSchemes.put(toKey(host), authScheme); + authSchemes.put(host, authScheme); } else { - remove(host); + authSchemes.remove(host); } }