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 <[email protected]>
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