You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@maven.apache.org by ti...@apache.org on 2019/07/14 08:44:46 UTC

[maven-resolver] 01/01: temporal fix for hanging Maven builds

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

tibordigana pushed a commit to branch buildfix
in repository https://gitbox.apache.org/repos/asf/maven-resolver.git

commit f5fa57ca558bee21ef29ca91758bf59bcbfd4820
Author: tibordigana <ti...@apache.org>
AuthorDate: Sun Jul 14 10:44:34 2019 +0200

    temporal fix for hanging Maven builds
---
 .../src/it/resolve-artifact/invoker.properties     | 19 +++++++
 .../eclipse/aether/internal/impl/collect/Args.java |  4 +-
 .../aether/internal/impl/collect/DataPool.java     | 62 +++++++++++++---------
 .../impl/collect/DefaultDependencyCollector.java   | 10 ++--
 4 files changed, 61 insertions(+), 34 deletions(-)

diff --git a/maven-resolver-demos/maven-resolver-demo-maven-plugin/src/it/resolve-artifact/invoker.properties b/maven-resolver-demos/maven-resolver-demo-maven-plugin/src/it/resolve-artifact/invoker.properties
new file mode 100644
index 0000000..c256d0f
--- /dev/null
+++ b/maven-resolver-demos/maven-resolver-demo-maven-plugin/src/it/resolve-artifact/invoker.properties
@@ -0,0 +1,19 @@
+#
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements.  See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership.  The ASF licenses this file
+# to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance
+# with the License.  You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing,
+# software distributed under the License is distributed on an
+# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+# KIND, either express or implied.  See the License for the
+# specific language governing permissions and limitations
+# under the License.
+#
+invoker.maven.version=3.5.0+
diff --git a/maven-resolver-impl/src/main/java/org/eclipse/aether/internal/impl/collect/Args.java b/maven-resolver-impl/src/main/java/org/eclipse/aether/internal/impl/collect/Args.java
index e2c1229..56f7250 100644
--- a/maven-resolver-impl/src/main/java/org/eclipse/aether/internal/impl/collect/Args.java
+++ b/maven-resolver-impl/src/main/java/org/eclipse/aether/internal/impl/collect/Args.java
@@ -27,7 +27,7 @@ import org.eclipse.aether.collection.CollectRequest;
 import org.eclipse.aether.util.ConfigUtils;
 import org.eclipse.aether.util.graph.manager.DependencyManagerUtils;
 
-class Args
+final class Args
 {
 
     final RepositorySystemSession session;
@@ -42,7 +42,7 @@ class Args
 
     final NodeStack nodes;
 
-    final DefaultDependencyCollectionContext collectionContext;
+    final DefaultDependencyCollectionContext collectionContext; // unused ???
 
     final DefaultVersionFilterContext versionContext;
 
diff --git a/maven-resolver-impl/src/main/java/org/eclipse/aether/internal/impl/collect/DataPool.java b/maven-resolver-impl/src/main/java/org/eclipse/aether/internal/impl/collect/DataPool.java
index 10e9ab6..fedcc3a 100644
--- a/maven-resolver-impl/src/main/java/org/eclipse/aether/internal/impl/collect/DataPool.java
+++ b/maven-resolver-impl/src/main/java/org/eclipse/aether/internal/impl/collect/DataPool.java
@@ -20,11 +20,11 @@ package org.eclipse.aether.internal.impl.collect;
  */
 
 import java.util.Collections;
-import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
 import java.util.Objects;
 import java.util.WeakHashMap;
+import java.util.concurrent.ConcurrentHashMap;
 import java.util.concurrent.ExecutionException;
 import java.util.concurrent.Future;
 import java.util.concurrent.TimeUnit;
@@ -61,24 +61,28 @@ final class DataPool
 
     private static final String DESCRIPTORS = DataPool.class.getName() + "$Descriptors";
 
-    public static final Future<ArtifactDescriptorResult> NO_DESCRIPTOR =
+    static final Future<ArtifactDescriptorResult> NO_DESCRIPTOR =
         new FutureResult<>( new ArtifactDescriptorResult( new ArtifactDescriptorRequest() ) );
 
-    private ObjectPool<Artifact> artifacts;
+    private final ObjectPool<Artifact> artifacts;
 
-    private ObjectPool<Dependency> dependencies;
+    private final ObjectPool<Dependency> dependencies;
 
-    private Map<Object, Descriptor> descriptors;
+    private final Map<Object, Descriptor> descriptors;
 
-    private Map<Object, Constraint> constraints = new HashMap<>();
+    private final Map<Object, Constraint> constraints = new ConcurrentHashMap<>();
 
-    private Map<Object, List<DependencyNode>> nodes = new HashMap<>( 256 );
+    private final Map<Object, List<DependencyNode>> nodes = new ConcurrentHashMap<>( 256 );
 
     @SuppressWarnings( "unchecked" )
     DataPool( RepositorySystemSession session )
     {
         RepositoryCache cache = session.getCache();
 
+        ObjectPool<Artifact> artifacts = null;
+        ObjectPool<Dependency> dependencies = null;
+        Map<Object, Descriptor> descriptors = null;
+
         if ( cache != null )
         {
             artifacts = (ObjectPool<Artifact>) cache.get( session, ARTIFACT_POOL );
@@ -95,6 +99,8 @@ final class DataPool
             }
         }
 
+        this.artifacts = artifacts;
+
         if ( dependencies == null )
         {
             dependencies = new ObjectPool<>();
@@ -104,6 +110,8 @@ final class DataPool
             }
         }
 
+        this.dependencies = dependencies;
+
         if ( descriptors == null )
         {
             descriptors = Collections.synchronizedMap( new WeakHashMap<Object, Descriptor>( 256 ) );
@@ -112,24 +120,26 @@ final class DataPool
                 cache.put( session, DESCRIPTORS, descriptors );
             }
         }
+
+        this.descriptors = descriptors;
     }
 
-    public Artifact intern( Artifact artifact )
+    Artifact intern( Artifact artifact )
     {
         return artifacts.intern( artifact );
     }
 
-    public Dependency intern( Dependency dependency )
+    Dependency intern( Dependency dependency )
     {
         return dependencies.intern( dependency );
     }
 
-    public Object toKey( ArtifactDescriptorRequest request )
+    Object toKey( ArtifactDescriptorRequest request )
     {
         return request.getArtifact();
     }
 
-    public Future<ArtifactDescriptorResult> getDescriptor( Object key, ArtifactDescriptorRequest request )
+    Future<ArtifactDescriptorResult> getDescriptor( Object key, ArtifactDescriptorRequest request )
     {
         Descriptor descriptor = descriptors.get( key );
         if ( descriptor != null )
@@ -139,22 +149,22 @@ final class DataPool
         return null;
     }
 
-    public void putDescriptor( Object key, Future<ArtifactDescriptorResult> futureResult )
+    void putDescriptor( Object key, Future<ArtifactDescriptorResult> futureResult )
     {
         descriptors.put( key, new GoodDescriptor( futureResult ) );
     }
 
-    public void putDescriptor( Object key, ArtifactDescriptorException exception )
+    void putDescriptor( Object key, ArtifactDescriptorException exception ) // unused param ???, type better method name
     {
         descriptors.put( key, BadDescriptor.INSTANCE );
     }
 
-    public Object toKey( VersionRangeRequest request )
+    Object toKey( VersionRangeRequest request )
     {
         return new ConstraintKey( request );
     }
 
-    public VersionRangeResult getConstraint( Object key, VersionRangeRequest request )
+    VersionRangeResult getConstraint( Object key, VersionRangeRequest request )
     {
         Constraint constraint = constraints.get( key );
         if ( constraint != null )
@@ -164,33 +174,33 @@ final class DataPool
         return null;
     }
 
-    public void putConstraint( Object key, VersionRangeResult result )
+    void putConstraint( Object key, VersionRangeResult result )
     {
         constraints.put( key, new Constraint( result ) );
     }
 
-    public Object toKey( Artifact artifact, DefaultDependencyCollectionContext context )
+    Object toKey( Artifact artifact, DefaultDependencyCollectionContext context )
     {
         return new GraphKey( artifact, context.getRepositories(), context.getDepSelector(),
                              context.getDepManager(), context.getDepTraverser(), context.getVerFilter() );
     }
 
-    public List<DependencyNode> getChildren( Object key )
+    List<DependencyNode> getChildren( Object key )
     {
         return nodes.get( key );
     }
 
-    public void putChildren( Object key, List<DependencyNode> children )
+    void putChildren( Object key, List<DependencyNode> children )
     {
         nodes.put( key, children );
     }
 
-    abstract static class Descriptor
+    private abstract static class Descriptor
     {
         public abstract Future<ArtifactDescriptorResult> toResult( ArtifactDescriptorRequest request );
     }
 
-    static final class GoodDescriptor
+    private static final class GoodDescriptor
         extends Descriptor
     {
         Future<ArtifactDescriptorResult> futureResult;
@@ -247,7 +257,7 @@ final class DataPool
         }
     }
 
-    static final class BadDescriptor
+    private static final class BadDescriptor
         extends Descriptor
     {
         static final BadDescriptor INSTANCE = new BadDescriptor();
@@ -258,7 +268,7 @@ final class DataPool
         }
     }
 
-    static final class Constraint
+    private static final class Constraint
     {
         final VersionRepo[] repositories;
 
@@ -276,7 +286,7 @@ final class DataPool
             }
         }
 
-        public VersionRangeResult toResult( VersionRangeRequest request )
+        VersionRangeResult toResult( VersionRangeRequest request )
         {
             VersionRangeResult result = new VersionRangeResult( request );
             for ( VersionRepo vr : repositories )
@@ -302,7 +312,7 @@ final class DataPool
         }
     }
 
-    static final class ConstraintKey
+    private static final class ConstraintKey
     {
         private final Artifact artifact;
 
@@ -376,7 +386,7 @@ final class DataPool
         }
     }
 
-    static final class GraphKey
+    private static final class GraphKey
     {
         private final Artifact artifact;
 
diff --git a/maven-resolver-impl/src/main/java/org/eclipse/aether/internal/impl/collect/DefaultDependencyCollector.java b/maven-resolver-impl/src/main/java/org/eclipse/aether/internal/impl/collect/DefaultDependencyCollector.java
index 9d37435..d4647e4 100644
--- a/maven-resolver-impl/src/main/java/org/eclipse/aether/internal/impl/collect/DefaultDependencyCollector.java
+++ b/maven-resolver-impl/src/main/java/org/eclipse/aether/internal/impl/collect/DefaultDependencyCollector.java
@@ -36,10 +36,9 @@ import static java.util.Objects.requireNonNull;
 import java.util.concurrent.Callable;
 import java.util.concurrent.ExecutionException;
 import java.util.concurrent.ExecutorService;
+import java.util.concurrent.Executors;
 import java.util.concurrent.Future;
-import java.util.concurrent.LinkedBlockingQueue;
 import java.util.concurrent.ThreadPoolExecutor;
-import java.util.concurrent.TimeUnit;
 
 import javax.inject.Inject;
 import javax.inject.Named;
@@ -147,9 +146,8 @@ public class DefaultDependencyCollector
     {
         int numThreads = ConfigUtils.getInteger( session, DEFAULT_THREADS, CONFIG_PROP_THREADS );
         LOGGER.debug( "{} = {} ", CONFIG_PROP_THREADS, numThreads );
-        ThreadPoolExecutor executor = new ThreadPoolExecutor(
-                numThreads, numThreads, 3L, TimeUnit.SECONDS,
-                new LinkedBlockingQueue<Runnable>(), new WorkerThreadFactory( "artifact-descriptor-resolver" ) );
+        ThreadPoolExecutor executor = (ThreadPoolExecutor) Executors.newCachedThreadPool(
+                new WorkerThreadFactory( "artifact-descriptor-resolver" ) );
         try
         {
             return collectDependenciesWithExecutor( session, request, executor );
@@ -517,7 +515,7 @@ public class DefaultDependencyCollector
         }
     }
 
-    private boolean processDependencyVersion( DependencyContext dc )
+    private boolean processDependencyVersion( DependencyContext dc ) // warning - returned value is never used !!!
     {
         Args args = dc.context.getArgs();
         Results results = dc.context.getResults();