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.git
commit 2a276d0dcf5108a896eb44f2940baf98af2edbac Author: Guillaume Nodet <gno...@gmail.com> AuthorDate: Thu May 12 10:04:51 2022 +0200 [MNG-7487] Fix deadlock during forked lifecycle executions # Conflicts: # maven-core/src/main/java/org/apache/maven/lifecycle/internal/MojoExecutor.java # Conflicts: # maven-core/src/main/java/org/apache/maven/lifecycle/internal/MojoExecutor.java --- .../maven/lifecycle/internal/MojoExecutor.java | 37 ++++++++++++++-------- 1 file changed, 23 insertions(+), 14 deletions(-) diff --git a/maven-core/src/main/java/org/apache/maven/lifecycle/internal/MojoExecutor.java b/maven-core/src/main/java/org/apache/maven/lifecycle/internal/MojoExecutor.java index 6c089863c..bbd25389e 100644 --- a/maven-core/src/main/java/org/apache/maven/lifecycle/internal/MojoExecutor.java +++ b/maven-core/src/main/java/org/apache/maven/lifecycle/internal/MojoExecutor.java @@ -85,6 +85,8 @@ public class MojoExecutor private final Provider<MojosExecutionStrategy> mojosExecutionStrategy; + private final Map<Thread, MojoDescriptor> mojos = new ConcurrentHashMap<>(); + @Inject public MojoExecutor( BuildPluginManager pluginManager, @@ -223,10 +225,7 @@ public class MojoExecutor } } - try ( ProjectLock lock = new ProjectLock( session, mojoDescriptor, aggregatorLock ) ) - { - doExecute( session, mojoExecution, projectIndex, dependencyContext ); - } + doExecute( session, mojoExecution, projectIndex, dependencyContext ); } /** @@ -237,13 +236,14 @@ public class MojoExecutor * TODO: ideally, the builder should take care of the ordering in a smarter way * TODO: and concurrency issues fixed with MNG-7157 */ - private static class ProjectLock implements AutoCloseable + private class ProjectLock implements AutoCloseable { final Lock acquiredAggregatorLock; final Lock acquiredProjectLock; - ProjectLock( MavenSession session, MojoDescriptor mojoDescriptor, ReadWriteLock aggregatorLock ) + ProjectLock( MavenSession session, MojoDescriptor mojoDescriptor ) { + mojos.put( Thread.currentThread(), mojoDescriptor ); if ( session.getRequest().getDegreeOfConcurrency() > 1 ) { boolean aggregator = mojoDescriptor.isAggregator(); @@ -271,6 +271,7 @@ public class MojoExecutor { acquiredAggregatorLock.unlock(); } + mojos.remove( Thread.currentThread() ); } @SuppressWarnings( { "unchecked", "rawtypes" } ) @@ -302,8 +303,23 @@ public class MojoExecutor ensureDependenciesAreResolved( mojoDescriptor, session, dependencyContext ); - eventCatapult.fire( ExecutionEvent.Type.MojoStarted, session, mojoExecution ); + try ( ProjectLock lock = new ProjectLock( session, mojoDescriptor ) ) + { + doExecute2( session, mojoExecution ); + } + finally + { + for ( MavenProject forkedProject : forkedProjects ) + { + forkedProject.setExecutionProject( null ); + } + } + } + private void doExecute2( MavenSession session, MojoExecution mojoExecution ) + throws LifecycleExecutionException + { + eventCatapult.fire( ExecutionEvent.Type.MojoStarted, session, mojoExecution ); try { try @@ -324,13 +340,6 @@ public class MojoExecutor throw e; } - finally - { - for ( MavenProject forkedProject : forkedProjects ) - { - forkedProject.setExecutionProject( null ); - } - } } public void ensureDependenciesAreResolved( MojoDescriptor mojoDescriptor, MavenSession session,