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;

Reply via email to