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

sjaranowski pushed a commit to branch maven-3.9.x
in repository https://gitbox.apache.org/repos/asf/maven.git


The following commit(s) were added to refs/heads/maven-3.9.x by this push:
     new 6559599a56 [MNG-8711] Fix concurrent cache access
6559599a56 is described below

commit 6559599a56d4e12f2da18b0e64eb00359a39654d
Author: Guillaume Nodet <gno...@gmail.com>
AuthorDate: Thu Feb 29 00:31:49 2024 +0100

    [MNG-8711] Fix concurrent cache access
    
    (cherry picked from commit ce151933949ab39eca78b8374531d39bc8c76b0f) with 
simple conflict resolving
---
 .../internal/LifecycleDependencyResolver.java      | 27 ++++++++++---------
 .../maven/plugin/DefaultPluginDescriptorCache.java | 31 +++++++++-------------
 .../artifact/DefaultProjectArtifactsCache.java     |  4 ++-
 3 files changed, 31 insertions(+), 31 deletions(-)

diff --git 
a/maven-core/src/main/java/org/apache/maven/lifecycle/internal/LifecycleDependencyResolver.java
 
b/maven-core/src/main/java/org/apache/maven/lifecycle/internal/LifecycleDependencyResolver.java
index 9e0dde1127..e1251c2d28 100644
--- 
a/maven-core/src/main/java/org/apache/maven/lifecycle/internal/LifecycleDependencyResolver.java
+++ 
b/maven-core/src/main/java/org/apache/maven/lifecycle/internal/LifecycleDependencyResolver.java
@@ -123,26 +123,29 @@ public void resolveProjectDependencies(
                 }
             }
 
-            Set<Artifact> resolvedArtifacts;
             ProjectArtifactsCache.Key cacheKey = 
projectArtifactsCache.createKey(
                     project, scopesToCollect, scopesToResolve, aggregating, 
session.getRepositorySession());
             ProjectArtifactsCache.CacheRecord recordArtifacts;
             recordArtifacts = projectArtifactsCache.get(cacheKey);
 
-            if (recordArtifacts != null) {
-                resolvedArtifacts = recordArtifacts.getArtifacts();
-            } else {
-                try {
-                    resolvedArtifacts = getDependencies(
-                            project, scopesToCollect, scopesToResolve, 
session, aggregating, projectArtifacts);
-                    recordArtifacts = projectArtifactsCache.put(cacheKey, 
resolvedArtifacts);
-                } catch (LifecycleExecutionException e) {
-                    projectArtifactsCache.put(cacheKey, e);
-                    projectArtifactsCache.register(project, cacheKey, 
recordArtifacts);
-                    throw e;
+            if (recordArtifacts == null) {
+                synchronized (cacheKey) {
+                    recordArtifacts = projectArtifactsCache.get(cacheKey);
+                    if (recordArtifacts == null) {
+                        try {
+                            Set<Artifact> resolvedArtifacts = getDependencies(
+                                    project, scopesToCollect, scopesToResolve, 
session, aggregating, projectArtifacts);
+                            recordArtifacts = 
projectArtifactsCache.put(cacheKey, resolvedArtifacts);
+                        } catch (LifecycleExecutionException e) {
+                            projectArtifactsCache.put(cacheKey, e);
+                            projectArtifactsCache.register(project, cacheKey, 
recordArtifacts);
+                            throw e;
+                        }
+                    }
                 }
             }
             projectArtifactsCache.register(project, cacheKey, recordArtifacts);
+            Set<Artifact> resolvedArtifacts = recordArtifacts.getArtifacts();
 
             Map<Artifact, File> reactorProjects =
                     new HashMap<>(session.getProjects().size());
diff --git 
a/maven-core/src/main/java/org/apache/maven/plugin/DefaultPluginDescriptorCache.java
 
b/maven-core/src/main/java/org/apache/maven/plugin/DefaultPluginDescriptorCache.java
index 8278cba9ed..25dbf929e8 100644
--- 
a/maven-core/src/main/java/org/apache/maven/plugin/DefaultPluginDescriptorCache.java
+++ 
b/maven-core/src/main/java/org/apache/maven/plugin/DefaultPluginDescriptorCache.java
@@ -50,13 +50,14 @@
 public class DefaultPluginDescriptorCache implements PluginDescriptorCache {
 
     private Map<Key, PluginDescriptor> descriptors = new 
ConcurrentHashMap<>(128);
+    private Map<Key, Key> keys = new ConcurrentHashMap<>();
 
     public void flush() {
         descriptors.clear();
     }
 
     public Key createKey(Plugin plugin, List<RemoteRepository> repositories, 
RepositorySystemSession session) {
-        return new CacheKey(plugin, repositories, session);
+        return keys.computeIfAbsent(new CacheKey(plugin, repositories, 
session), k -> k);
     }
 
     public PluginDescriptor get(Key cacheKey) {
@@ -66,26 +67,20 @@ public PluginDescriptor get(Key cacheKey) {
     @Override
     public PluginDescriptor get(Key key, PluginDescriptorSupplier supplier)
             throws PluginDescriptorParsingException, 
PluginResolutionException, InvalidPluginDescriptorException {
+
         try {
-            return clone(descriptors.computeIfAbsent(key, k -> {
-                try {
-                    return clone(supplier.load());
-                } catch (PluginDescriptorParsingException
-                        | PluginResolutionException
-                        | InvalidPluginDescriptorException e) {
-                    throw new RuntimeException(e);
+            PluginDescriptor desc = descriptors.get(key);
+            if (desc == null) {
+                synchronized (key) {
+                    desc = descriptors.get(key);
+                    if (desc == null) {
+                        desc = supplier.load();
+                        descriptors.putIfAbsent(key, clone(desc));
+                    }
                 }
-            }));
-        } catch (RuntimeException e) {
-            if (e.getCause() instanceof PluginDescriptorParsingException) {
-                throw (PluginDescriptorParsingException) e.getCause();
-            }
-            if (e.getCause() instanceof PluginResolutionException) {
-                throw (PluginResolutionException) e.getCause();
-            }
-            if (e.getCause() instanceof InvalidPluginDescriptorException) {
-                throw (InvalidPluginDescriptorException) e.getCause();
             }
+            return clone(desc);
+        } catch (PluginDescriptorParsingException | PluginResolutionException 
| InvalidPluginDescriptorException e) {
             throw e;
         }
     }
diff --git 
a/maven-core/src/main/java/org/apache/maven/project/artifact/DefaultProjectArtifactsCache.java
 
b/maven-core/src/main/java/org/apache/maven/project/artifact/DefaultProjectArtifactsCache.java
index c45128530a..0e59582e81 100644
--- 
a/maven-core/src/main/java/org/apache/maven/project/artifact/DefaultProjectArtifactsCache.java
+++ 
b/maven-core/src/main/java/org/apache/maven/project/artifact/DefaultProjectArtifactsCache.java
@@ -161,6 +161,7 @@ public boolean equals(Object o) {
     }
 
     protected final Map<Key, CacheRecord> cache = new ConcurrentHashMap<>();
+    protected final Map<Key, Key> keys = new ConcurrentHashMap<>();
 
     @Override
     public Key createKey(
@@ -169,13 +170,14 @@ public Key createKey(
             Collection<String> scopesToResolve,
             boolean aggregating,
             RepositorySystemSession session) {
-        return new CacheKey(
+        Key key = new CacheKey(
                 project,
                 project.getRemoteProjectRepositories(),
                 scopesToCollect,
                 scopesToResolve,
                 aggregating,
                 session);
+        return keys.computeIfAbsent(key, k -> k);
     }
 
     @Override

Reply via email to