From 5b37f4eacfa25e81545650f292c8ea0d00035512 Mon Sep 17 00:00:00 2001 From: Tamas Cservenak Date: Mon, 26 May 2025 19:07:59 +0200 Subject: [PATCH 1/2] [MNG-8396] Backport: add cache layer to the filtered dep graph Backport of 62f85a4233366064750079d50fd86ef25a97c6f3 --- https://issues.apache.org/jira/browse/MNG-8396 --- .../graph/FilteredProjectDependencyGraph.java | 35 +++++++++++++++++-- 1 file changed, 33 insertions(+), 2 deletions(-) diff --git a/maven-core/src/main/java/org/apache/maven/graph/FilteredProjectDependencyGraph.java b/maven-core/src/main/java/org/apache/maven/graph/FilteredProjectDependencyGraph.java index b05913c76f43..5d7c66fdbb70 100644 --- a/maven-core/src/main/java/org/apache/maven/graph/FilteredProjectDependencyGraph.java +++ b/maven-core/src/main/java/org/apache/maven/graph/FilteredProjectDependencyGraph.java @@ -24,6 +24,7 @@ import java.util.List; import java.util.Map; import java.util.Objects; +import java.util.concurrent.ConcurrentHashMap; import java.util.stream.Collectors; import org.apache.maven.execution.ProjectDependencyGraph; @@ -42,6 +43,20 @@ class FilteredProjectDependencyGraph implements ProjectDependencyGraph { private final List sortedProjects; + private final Map> cache = new ConcurrentHashMap<>(); + + private static class Key { + private final MavenProject project; + private final boolean transitive; + private final boolean upstream; + + private Key(MavenProject project, boolean transitive, boolean upstream) { + this.project = project; + this.transitive = transitive; + this.upstream = upstream; + } + } + /** * Creates a new project dependency graph from the specified graph. * @@ -76,12 +91,28 @@ public List getSortedProjects() { @Override public List getDownstreamProjects(MavenProject project, boolean transitive) { - return applyFilter(projectDependencyGraph.getDownstreamProjects(project, transitive), transitive, false); + Key key = new Key(project, transitive, false); + // Do not use computeIfAbsent here, as the computation is recursive + // and this is not supported by computeIfAbsent. + List list = cache.get(key); + if (list == null) { + list = applyFilter(projectDependencyGraph.getDownstreamProjects(project, transitive), transitive, false); + cache.put(key, list); + } + return list; } @Override public List getUpstreamProjects(MavenProject project, boolean transitive) { - return applyFilter(projectDependencyGraph.getUpstreamProjects(project, transitive), transitive, true); + Key key = new Key(project, transitive, true); + // Do not use computeIfAbsent here, as the computation is recursive + // and this is not supported by computeIfAbsent. + List list = cache.get(key); + if (list == null) { + list = applyFilter(projectDependencyGraph.getUpstreamProjects(project, transitive), transitive, true); + cache.put(key, list); + } + return list; } /** From 2a12d7ed98ae4e3cb9865727c7cf37d211cf5c03 Mon Sep 17 00:00:00 2001 From: Tamas Cservenak Date: Mon, 26 May 2025 19:19:20 +0200 Subject: [PATCH 2/2] Needs more; key needs to be proper key --- .../graph/FilteredProjectDependencyGraph.java | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/maven-core/src/main/java/org/apache/maven/graph/FilteredProjectDependencyGraph.java b/maven-core/src/main/java/org/apache/maven/graph/FilteredProjectDependencyGraph.java index 5d7c66fdbb70..768bdafe8691 100644 --- a/maven-core/src/main/java/org/apache/maven/graph/FilteredProjectDependencyGraph.java +++ b/maven-core/src/main/java/org/apache/maven/graph/FilteredProjectDependencyGraph.java @@ -55,6 +55,20 @@ private Key(MavenProject project, boolean transitive, boolean upstream) { this.transitive = transitive; this.upstream = upstream; } + + @Override + public boolean equals(Object o) { + if (o == null || getClass() != o.getClass()) { + return false; + } + Key key = (Key) o; + return Objects.equals(project, key.project) && transitive == key.transitive && upstream == key.upstream; + } + + @Override + public int hashCode() { + return Objects.hash(project, transitive, upstream); + } } /**