Skip to content

Commit 0b79a9e

Browse files
committed
[MNG-7487] Fix deadlock during forked lifecycle executions
1 parent 88a03f8 commit 0b79a9e

File tree

1 file changed

+23
-14
lines changed

1 file changed

+23
-14
lines changed

maven-core/src/main/java/org/apache/maven/lifecycle/internal/MojoExecutor.java

Lines changed: 23 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -85,6 +85,8 @@ public class MojoExecutor
8585

8686
private final ReadWriteLock aggregatorLock = new ReentrantReadWriteLock();
8787

88+
private final Map<Thread, MojoDescriptor> mojos = new ConcurrentHashMap<>();
89+
8890
public MojoExecutor()
8991
{
9092
}
@@ -206,10 +208,7 @@ private void execute( MavenSession session, MojoExecution mojoExecution, Project
206208
}
207209
}
208210

209-
try ( ProjectLock lock = new ProjectLock( session, mojoDescriptor, aggregatorLock ) )
210-
{
211-
doExecute( session, mojoExecution, projectIndex, dependencyContext );
212-
}
211+
doExecute( session, mojoExecution, projectIndex, dependencyContext );
213212
}
214213

215214
/**
@@ -220,13 +219,14 @@ private void execute( MavenSession session, MojoExecution mojoExecution, Project
220219
* TODO: ideally, the builder should take care of the ordering in a smarter way
221220
* TODO: and concurrency issues fixed with MNG-7157
222221
*/
223-
private static class ProjectLock implements AutoCloseable
222+
private class ProjectLock implements AutoCloseable
224223
{
225224
final Lock acquiredAggregatorLock;
226225
final Lock acquiredProjectLock;
227226

228-
ProjectLock( MavenSession session, MojoDescriptor mojoDescriptor, ReadWriteLock aggregatorLock )
227+
ProjectLock( MavenSession session, MojoDescriptor mojoDescriptor )
229228
{
229+
mojos.put( Thread.currentThread(), mojoDescriptor );
230230
if ( session.getRequest().getDegreeOfConcurrency() > 1 )
231231
{
232232
boolean aggregator = mojoDescriptor.isAggregator();
@@ -254,6 +254,7 @@ public void close()
254254
{
255255
acquiredAggregatorLock.unlock();
256256
}
257+
mojos.remove( Thread.currentThread() );
257258
}
258259

259260
@SuppressWarnings( { "unchecked", "rawtypes" } )
@@ -292,8 +293,23 @@ private void doExecute( MavenSession session, MojoExecution mojoExecution, Proje
292293

293294
ensureDependenciesAreResolved( mojoDescriptor, session, dependencyContext );
294295

295-
eventCatapult.fire( ExecutionEvent.Type.MojoStarted, session, mojoExecution );
296+
try ( ProjectLock lock = new ProjectLock( session, mojoDescriptor ) )
297+
{
298+
doExecute2( session, mojoExecution );
299+
}
300+
finally
301+
{
302+
for ( MavenProject forkedProject : forkedProjects )
303+
{
304+
forkedProject.setExecutionProject( null );
305+
}
306+
}
307+
}
296308

309+
private void doExecute2( MavenSession session, MojoExecution mojoExecution )
310+
throws LifecycleExecutionException
311+
{
312+
eventCatapult.fire( ExecutionEvent.Type.MojoStarted, session, mojoExecution );
297313
try
298314
{
299315
try
@@ -314,13 +330,6 @@ private void doExecute( MavenSession session, MojoExecution mojoExecution, Proje
314330

315331
throw e;
316332
}
317-
finally
318-
{
319-
for ( MavenProject forkedProject : forkedProjects )
320-
{
321-
forkedProject.setExecutionProject( null );
322-
}
323-
}
324333
}
325334

326335
public void ensureDependenciesAreResolved( MojoDescriptor mojoDescriptor, MavenSession session,

0 commit comments

Comments
 (0)