You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@maven.apache.org by gn...@apache.org on 2022/05/30 11:08:37 UTC
[maven] 01/02: [MNG-7487] Fix deadlock during forked lifecycle executions
This is an automated email from the ASF dual-hosted git repository.
gnodet pushed a commit to branch maven-3.8.x
in repository https://gitbox.apache.org/repos/asf/maven.git
commit 0b79a9e64325f21659923fd01606b26d4c993b63
Author: Guillaume Nodet <gn...@gmail.com>
AuthorDate: Thu May 12 10:04:51 2022 +0200
[MNG-7487] Fix deadlock during forked lifecycle executions
---
.../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 cf97c8cab..beca2eff0 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 ReadWriteLock aggregatorLock = new ReentrantReadWriteLock();
+ private final Map<Thread, MojoDescriptor> mojos = new ConcurrentHashMap<>();
+
public MojoExecutor()
{
}
@@ -206,10 +208,7 @@ public class MojoExecutor
}
}
- try ( ProjectLock lock = new ProjectLock( session, mojoDescriptor, aggregatorLock ) )
- {
- doExecute( session, mojoExecution, projectIndex, dependencyContext );
- }
+ doExecute( session, mojoExecution, projectIndex, dependencyContext );
}
/**
@@ -220,13 +219,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();
@@ -254,6 +254,7 @@ public class MojoExecutor
{
acquiredAggregatorLock.unlock();
}
+ mojos.remove( Thread.currentThread() );
}
@SuppressWarnings( { "unchecked", "rawtypes" } )
@@ -292,8 +293,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
@@ -314,13 +330,6 @@ public class MojoExecutor
throw e;
}
- finally
- {
- for ( MavenProject forkedProject : forkedProjects )
- {
- forkedProject.setExecutionProject( null );
- }
- }
}
public void ensureDependenciesAreResolved( MojoDescriptor mojoDescriptor, MavenSession session,