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