This is an automated email from the ASF dual-hosted git repository. gnodet pushed a commit to branch maven-3.9.x in repository https://gitbox.apache.org/repos/asf/maven.git
commit 0b0a96782e0298dfb1c7eeaebccf6ed917aaeaac 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 --- .../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 2980e8858..408d09ac8 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 @@ -92,6 +92,8 @@ public class MojoExecutor @Requirement private PlexusContainer container; + private final Map<Thread, MojoDescriptor> mojos = new ConcurrentHashMap<>(); + public MojoExecutor() { } @@ -228,10 +230,7 @@ public class MojoExecutor } } - try ( ProjectLock lock = new ProjectLock( session, mojoDescriptor, aggregatorLock ) ) - { - doExecute( session, mojoExecution, projectIndex, dependencyContext ); - } + doExecute( session, mojoExecution, projectIndex, dependencyContext ); } /** @@ -242,13 +241,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(); @@ -276,6 +276,7 @@ public class MojoExecutor { acquiredAggregatorLock.unlock(); } + mojos.remove( Thread.currentThread() ); } @SuppressWarnings( { "unchecked", "rawtypes" } ) @@ -314,8 +315,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 @@ -336,13 +352,6 @@ public class MojoExecutor throw e; } - finally - { - for ( MavenProject forkedProject : forkedProjects ) - { - forkedProject.setExecutionProject( null ); - } - } } public void ensureDependenciesAreResolved( MojoDescriptor mojoDescriptor, MavenSession session,