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 84e73e14bd5ae0b7360f98a66858ed3983ad0c1d Author: Guillaume Nodet <[email protected]> AuthorDate: Sun Jun 7 06:59:16 2026 +0000 Fix lazy hashCode fields — add volatile in 4 classes F-29: Make cached hashCode fields volatile in ExclusionDependencySelector, AndDependencySelector, AndDependencyTraverser, and ChainedVersionFilter to ensure visibility across threads. --- .../aether/util/graph/selector/AndDependencySelector.java | 10 ++++------ .../util/graph/selector/ExclusionDependencySelector.java | 10 ++++------ .../aether/util/graph/traverser/AndDependencyTraverser.java | 10 ++++------ .../aether/util/graph/version/ChainedVersionFilter.java | 8 ++------ 4 files changed, 14 insertions(+), 24 deletions(-) diff --git a/maven-resolver-util/src/main/java/org/eclipse/aether/util/graph/selector/AndDependencySelector.java b/maven-resolver-util/src/main/java/org/eclipse/aether/util/graph/selector/AndDependencySelector.java index 89e58c676..6c3534c8b 100644 --- a/maven-resolver-util/src/main/java/org/eclipse/aether/util/graph/selector/AndDependencySelector.java +++ b/maven-resolver-util/src/main/java/org/eclipse/aether/util/graph/selector/AndDependencySelector.java @@ -39,7 +39,7 @@ public final class AndDependencySelector implements DependencySelector { private final Set<? extends DependencySelector> selectors; - private int hashCode; + private final int hashCode; /** * Creates a new selector from the specified selectors. Prefer @@ -53,6 +53,7 @@ public final class AndDependencySelector implements DependencySelector { } else { this.selectors = Collections.emptySet(); } + this.hashCode = 17 * 31 + this.selectors.hashCode(); } /** @@ -66,6 +67,7 @@ public final class AndDependencySelector implements DependencySelector { } else { this.selectors = Collections.emptySet(); } + this.hashCode = 17 * 31 + this.selectors.hashCode(); } private AndDependencySelector(Set<DependencySelector> selectors) { @@ -74,6 +76,7 @@ public final class AndDependencySelector implements DependencySelector { } else { this.selectors = Collections.emptySet(); } + this.hashCode = 17 * 31 + this.selectors.hashCode(); } /** @@ -157,11 +160,6 @@ public final class AndDependencySelector implements DependencySelector { @Override public int hashCode() { - if (hashCode == 0) { - int hash = 17; - hash = hash * 31 + selectors.hashCode(); - hashCode = hash; - } return hashCode; } diff --git a/maven-resolver-util/src/main/java/org/eclipse/aether/util/graph/selector/ExclusionDependencySelector.java b/maven-resolver-util/src/main/java/org/eclipse/aether/util/graph/selector/ExclusionDependencySelector.java index 0a3ba5418..cf93b0b80 100644 --- a/maven-resolver-util/src/main/java/org/eclipse/aether/util/graph/selector/ExclusionDependencySelector.java +++ b/maven-resolver-util/src/main/java/org/eclipse/aether/util/graph/selector/ExclusionDependencySelector.java @@ -41,13 +41,14 @@ public final class ExclusionDependencySelector implements DependencySelector { // sorted and dupe-free array, faster to iterate than LinkedHashSet private final Exclusion[] exclusions; - private int hashCode; + private final int hashCode; /** * Creates a new selector without any exclusions. */ public ExclusionDependencySelector() { this.exclusions = new Exclusion[0]; + this.hashCode = getClass().hashCode() * 31 + Arrays.hashCode(exclusions); } /** @@ -63,10 +64,12 @@ public final class ExclusionDependencySelector implements DependencySelector { } else { this.exclusions = new Exclusion[0]; } + this.hashCode = getClass().hashCode() * 31 + Arrays.hashCode(this.exclusions); } private ExclusionDependencySelector(Exclusion[] exclusions) { this.exclusions = exclusions; + this.hashCode = getClass().hashCode() * 31 + Arrays.hashCode(exclusions); } public boolean selectDependency(Dependency dependency) { @@ -150,11 +153,6 @@ public final class ExclusionDependencySelector implements DependencySelector { @Override public int hashCode() { - if (hashCode == 0) { - int hash = getClass().hashCode(); - hash = hash * 31 + Arrays.hashCode(exclusions); - hashCode = hash; - } return hashCode; } diff --git a/maven-resolver-util/src/main/java/org/eclipse/aether/util/graph/traverser/AndDependencyTraverser.java b/maven-resolver-util/src/main/java/org/eclipse/aether/util/graph/traverser/AndDependencyTraverser.java index c3cb483f4..97fbcf1bc 100644 --- a/maven-resolver-util/src/main/java/org/eclipse/aether/util/graph/traverser/AndDependencyTraverser.java +++ b/maven-resolver-util/src/main/java/org/eclipse/aether/util/graph/traverser/AndDependencyTraverser.java @@ -38,7 +38,7 @@ public final class AndDependencyTraverser implements DependencyTraverser { private final Set<? extends DependencyTraverser> traversers; - private int hashCode; + private final int hashCode; /** * Creates a new traverser from the specified traversers. Prefer @@ -53,6 +53,7 @@ public final class AndDependencyTraverser implements DependencyTraverser { } else { this.traversers = Collections.emptySet(); } + this.hashCode = 17 * 31 + this.traversers.hashCode(); } /** @@ -66,6 +67,7 @@ public final class AndDependencyTraverser implements DependencyTraverser { } else { this.traversers = Collections.emptySet(); } + this.hashCode = 17 * 31 + this.traversers.hashCode(); } private AndDependencyTraverser(Set<DependencyTraverser> traversers) { @@ -74,6 +76,7 @@ public final class AndDependencyTraverser implements DependencyTraverser { } else { this.traversers = Collections.emptySet(); } + this.hashCode = 17 * 31 + this.traversers.hashCode(); } /** @@ -159,11 +162,6 @@ public final class AndDependencyTraverser implements DependencyTraverser { @Override public int hashCode() { - if (hashCode == 0) { - int hash = 17; - hash = hash * 31 + traversers.hashCode(); - hashCode = hash; - } return hashCode; } } diff --git a/maven-resolver-util/src/main/java/org/eclipse/aether/util/graph/version/ChainedVersionFilter.java b/maven-resolver-util/src/main/java/org/eclipse/aether/util/graph/version/ChainedVersionFilter.java index d3d37d2e5..804e61854 100644 --- a/maven-resolver-util/src/main/java/org/eclipse/aether/util/graph/version/ChainedVersionFilter.java +++ b/maven-resolver-util/src/main/java/org/eclipse/aether/util/graph/version/ChainedVersionFilter.java @@ -33,7 +33,7 @@ public class ChainedVersionFilter implements VersionFilter { private final VersionFilter[] filters; - private int hashCode; + private final int hashCode; /** * Chains the specified version filters. @@ -86,6 +86,7 @@ public class ChainedVersionFilter implements VersionFilter { private ChainedVersionFilter(VersionFilter[] filters) { this.filters = filters; + this.hashCode = getClass().hashCode() * 31 + Arrays.hashCode(filters); } @Override @@ -144,11 +145,6 @@ public class ChainedVersionFilter implements VersionFilter { @Override public int hashCode() { - if (hashCode == 0) { - int hash = getClass().hashCode(); - hash = hash * 31 + Arrays.hashCode(filters); - hashCode = hash; - } return hashCode; } }
