This is an automated email from the ASF dual-hosted git repository. gnodet pushed a commit to branch master in repository https://gitbox.apache.org/repos/asf/maven-resolver.git
commit 329c4f242aa1c6a8be1b64b0edb28c550ba3346f Author: Guillaume Nodet <[email protected]> AuthorDate: Sun Jun 7 06:31:50 2026 +0000 Fix DataPool cache initialization race — use computeIfAbsent F-08: Replace get-then-put pattern with cache.computeIfAbsent() for all four intern pools, preventing concurrent DataPool constructors from creating and using detached pool instances. --- .../aether/internal/impl/collect/DataPool.java | 71 ++++++++-------------- 1 file changed, 26 insertions(+), 45 deletions(-) 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 e1ed28b73..46c217952 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 @@ -180,53 +180,34 @@ public final class DataPool { internArtifactDescriptorManagedDependencies = ConfigUtils.getBoolean( session, true, CONFIG_PROP_COLLECTOR_POOL_INTERN_ARTIFACT_DESCRIPTOR_MANAGED_DEPENDENCIES); - InternPool<Artifact, Artifact> artifactsPool = null; - InternPool<Dependency, Dependency> dependenciesPool = null; - InternPool<DescriptorKey, Descriptor> descriptorsPool = null; - InternPool<List<Dependency>, List<Dependency>> dependencyListsPool = null; + InternPool<Artifact, Artifact> artifactsPool; + InternPool<Dependency, Dependency> dependenciesPool; + InternPool<DescriptorKey, Descriptor> descriptorsPool; + InternPool<List<Dependency>, List<Dependency>> dependencyListsPool; if (cache != null) { - artifactsPool = (InternPool<Artifact, Artifact>) cache.get(session, ARTIFACT_POOL); - dependenciesPool = (InternPool<Dependency, Dependency>) cache.get(session, DEPENDENCY_POOL); - descriptorsPool = (InternPool<DescriptorKey, Descriptor>) cache.get(session, DESCRIPTORS); + artifactsPool = (InternPool<Artifact, Artifact>) cache.computeIfAbsent( + session, + ARTIFACT_POOL, + () -> createPool(ConfigUtils.getString(session, WEAK, CONFIG_PROP_COLLECTOR_POOL_ARTIFACT))); + dependenciesPool = (InternPool<Dependency, Dependency>) cache.computeIfAbsent( + session, + DEPENDENCY_POOL, + () -> createPool(ConfigUtils.getString(session, WEAK, CONFIG_PROP_COLLECTOR_POOL_DEPENDENCY))); + descriptorsPool = (InternPool<DescriptorKey, Descriptor>) cache.computeIfAbsent( + session, + DESCRIPTORS, + () -> createPool(ConfigUtils.getString(session, HARD, CONFIG_PROP_COLLECTOR_POOL_DESCRIPTOR))); + dependencyListsPool = (InternPool<List<Dependency>, List<Dependency>>) cache.computeIfAbsent( + session, + DEPENDENCY_LISTS_POOL, + () -> createPool( + ConfigUtils.getString(session, HARD, CONFIG_PROP_COLLECTOR_POOL_DEPENDENCY_LISTS))); + } else { + artifactsPool = createPool(ConfigUtils.getString(session, WEAK, CONFIG_PROP_COLLECTOR_POOL_ARTIFACT)); + dependenciesPool = createPool(ConfigUtils.getString(session, WEAK, CONFIG_PROP_COLLECTOR_POOL_DEPENDENCY)); + descriptorsPool = createPool(ConfigUtils.getString(session, HARD, CONFIG_PROP_COLLECTOR_POOL_DESCRIPTOR)); dependencyListsPool = - (InternPool<List<Dependency>, List<Dependency>>) cache.get(session, DEPENDENCY_LISTS_POOL); - } - - if (artifactsPool == null) { - String artifactPoolType = ConfigUtils.getString(session, WEAK, CONFIG_PROP_COLLECTOR_POOL_ARTIFACT); - - artifactsPool = createPool(artifactPoolType); - if (cache != null) { - cache.put(session, ARTIFACT_POOL, artifactsPool); - } - } - - if (dependenciesPool == null) { - String dependencyPoolType = ConfigUtils.getString(session, WEAK, CONFIG_PROP_COLLECTOR_POOL_DEPENDENCY); - - dependenciesPool = createPool(dependencyPoolType); - if (cache != null) { - cache.put(session, DEPENDENCY_POOL, dependenciesPool); - } - } - - if (descriptorsPool == null) { - String descriptorPoolType = ConfigUtils.getString(session, HARD, CONFIG_PROP_COLLECTOR_POOL_DESCRIPTOR); - - descriptorsPool = createPool(descriptorPoolType); - if (cache != null) { - cache.put(session, DESCRIPTORS, descriptorsPool); - } - } - - if (dependencyListsPool == null) { - String dependencyListsPoolType = - ConfigUtils.getString(session, HARD, CONFIG_PROP_COLLECTOR_POOL_DEPENDENCY_LISTS); - - dependencyListsPool = createPool(dependencyListsPoolType); - if (cache != null) { - cache.put(session, DEPENDENCY_LISTS_POOL, dependencyListsPool); - } + createPool(ConfigUtils.getString(session, HARD, CONFIG_PROP_COLLECTOR_POOL_DEPENDENCY_LISTS)); } this.artifacts = artifactsPool;
