[
https://issues.apache.org/jira/browse/MNG-7476?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=17537690#comment-17537690
]
ASF GitHub Bot commented on MNG-7476:
-------------------------------------
michael-o commented on code in PR #736:
URL: https://github.com/apache/maven/pull/736#discussion_r873995380
##########
maven-core/src/main/java/org/apache/maven/lifecycle/internal/MojoExecutor.java:
##########
@@ -220,20 +223,43 @@ private void execute( MavenSession session, MojoExecution
mojoExecution, Project
* 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;
+ final OwnerReentrantLock 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();
- acquiredAggregatorLock = aggregator ?
aggregatorLock.writeLock() : aggregatorLock.readLock();
+ acquiredAggregatorLock = mojoDescriptor.isAggregator()
+ ? aggregatorLock.writeLock() :
aggregatorLock.readLock();
+ if ( !acquiredAggregatorLock.tryLock() )
+ {
+ Thread owner = aggregatorLock.getOwner();
+ MojoDescriptor ownerMojo = owner != null ? mojos.get(
owner ) : null;
+ String str = ownerMojo != null ? " The " +
ownerMojo.getId() : "An ";
+ String msg = str + " aggregator mojo is already being
executed "
+ + "in this parallel build, those kind of mojos
require exclusive access to "
+ + "reactor to prevent race conditions. This mojo
execution will be blocked "
+ + "until the aggregator mojo is done.";
+ warn( msg );
+ acquiredAggregatorLock.lock();
+ }
acquiredProjectLock = getProjectLock( session );
- acquiredAggregatorLock.lock();
- acquiredProjectLock.lock();
+ if ( !acquiredProjectLock.tryLock() )
+ {
+ Thread owner = acquiredProjectLock.getOwner();
+ MojoDescriptor ownerMojo = owner != null ? mojos.get(
owner ) : null;
+ String str = ownerMojo != null ? " The " +
ownerMojo.getId() : "An ";
+ String msg = str + " mojo is already being executed "
+ + "on the project " +
session.getCurrentProject().toString() + ". "
Review Comment:
toString() is redundant. It will be called by Java automatically.
##########
maven-core/src/main/java/org/apache/maven/lifecycle/internal/MojoExecutor.java:
##########
@@ -282,6 +308,32 @@ private Lock getProjectLock( MavenSession session )
}
}
+ static class OwnerReentrantLock extends ReentrantLock
+ {
+ @Override
+ public Thread getOwner()
+ {
+ return super.getOwner();
+ }
+ }
+
+ static class OwnerReentrantReadWriteLock extends ReentrantReadWriteLock
+ {
+ @Override
+ public Thread getOwner()
+ {
+ return super.getOwner();
+ }
+ }
+
+ private static void warn( String msg )
+ {
+ for ( String s : MessageHelper.formatWarning( msg ) )
+ {
+ LOGGER.warn( s );
+ }
Review Comment:
In a concurrent build may it happen that interleaving threads might break
this message as a whole?
> Display a warning when an aggregator mojo is locking other mojo executions
> --------------------------------------------------------------------------
>
> Key: MNG-7476
> URL: https://issues.apache.org/jira/browse/MNG-7476
> Project: Maven
> Issue Type: Improvement
> Affects Versions: 3.8.5
> Reporter: Guillaume Nodet
> Assignee: Guillaume Nodet
> Priority: Major
> Fix For: 3.8.6, 3.9.0, 4.0.0-alpha-1, 4.0.0
>
>
--
This message was sent by Atlassian Jira
(v8.20.7#820007)