Re: Mojo execution synchonization with forked lifecycles in parallel builds

2021-06-02 Thread Martin Kanters
Hi Guillaume,

[3] is definitely different from your original problem, but it should
explain (together with [2]) why [1] did not remove the second "compile" in
your problem case.
I wanted to understand why MNG-6566 didn't apply to it. I agree that if it
would have applied (removing 2nd compile in "compile -> clean -> compile"),
it would have failed the build even harder.

Anyhow, having said that, I believe that your idea of reordering parts of
the build would definitely be an improvement. I just think it is
ambitious and might be complex to build. I'm still not fully experienced in
those parts of Maven core though, so maybe I am incorrectly estimating this
complexity.

Looking forward to your locking mechanism!

Martin


Op di 1 jun. 2021 om 18:20 schreef Guillaume Nodet :

>
> Le sam. 29 mai 2021 à 10:13, Martin Kanters  a
> écrit :
>
>> So we took a look at this. First we wanted to know why the forked
>> goals were executed multiple times, while MNG-6566 [1] should have taken
>> care of that. But it seems that that only optimizes duplicate goals in the
>> context of one project. I attempted to explain that [2]. We created a
>> ticket for optimizing this for multi module projects [3], but we think that
>> it's not straightforward to fix this.
>>
>
> I still think [3] is slightly different from my original problem.  You
> seem to indicate that the forked lifecycle is executed after, while in my
> case, they were executed at  the very beginning of the build, so that the
> forked goals were executed before the  usual execution from their
> respective project. The effect is that for a given project, the following
> goals were executed:
>   compile -> clean -> compile
>
> The second problem is that the concurrent execution of the clean and
> compile goals lead to unpredictable results.
>
> It seems the issue only stresses a re-execution of the goal as a possible
> optimization... That may be just me not reading correctly though...
>
>
>> Back to the problem at hand. IIUC your suggestion is to pause
>> project builds halfway, resume them after the required child projects goals
>> have been executed (instead of forking), and finally finish the child
>> project builds afterwards. I think it's elegant that in this solution, no
>> duplicate goals will be executed, since no real forking has to be done. I
>> do have the feeling that it would become quite a drastic change. I am also
>> not sure whether we can assume that switching halfway through project
>> builds works fine in every scenario. For the user it would also become hard
>> to follow the build, I guess...
>>
>> Perhaps it would be easier to ensure projects can only be built once at
>> a time (e.g. using locks or something). It wouldn't be the most
>> efficient, but I guess it does not involve big changes to both the inner
>> workings and user perspective.
>
>
> I could try the second solution, though this could still leave an
> execution order:
>   compile -> clean -> compile
> which I think is really wrong.
>
> I think the first solution brings a few benefits : during parallel builds,
> more things  could be executed in parallel.  For example the ordering could
> be improved at the mojo execution level (or at least per group of mojos
> execution in the same phase) instead of a global per-project ordering.  In
> theory, we could even make the project resolution happen in parallel with
> some goals execution: compile time dependencies could be resolved during
> the clean / resource generation phases, and test dependencies during
> compilation, etc...  Also, dependencies between projects only really happen
> for the compilation (or test) phases, so the clean / resource generation
> phases can happen concurrently.
> For the output, I'm not so worried.  In the case of parallel builds, the
> output has to be reordered anyway to be understandable, as done in mvnd.
>
> I'll have a look at a simple per-project locking mechanism first though...
>
>
>> Martin
>>
>> [1] https://issues.apache.org/jira/browse/MNG-6566
>> [2]
>>
>> https://issues.apache.org/jira/browse/MNG-6566?focusedCommentId=17353384&page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel#comment-17353384
>> [3] https://issues.apache.org/jira/browse/MNG-7163
>>
>> Op di 18 mei 2021 om 21:45 schreef Martin Kanters <
>> martinkant...@apache.org
>> >:
>>
>> > Ah, too bad. I thought it was relevant. Perhaps I can take a look at
>> this
>> > with Maarten Mulders, but that will not be in the coming week at least.
>> >
>> > Op di 18 mei 2021 om 21:34 schreef Guillaume Nodet :
>> >
>> >> I just tried with master and the problem is the same.
>> >> The reason is that in my use case, the forked goals are executed before
>> >> the
>> >> standard executions, and not even in the same project.
>> >>
>> >> Le mar. 18 mai 2021 à 20:41, Martin Kanters 
>> a
>> >> écrit :
>> >>
>> >> > Not sure how I've missed this post. Have you tried this build with
>> the
>> >> > master build of Maven?
>> >> > MNG-6566

Re: Mojo execution synchonization with forked lifecycles in parallel builds

2021-06-01 Thread Guillaume Nodet
I implemented a simple locking mechanism which seems to work correctly for
parallel builds:
  https://github.com/apache/maven/pull/476/

Le mar. 1 juin 2021 à 18:19, Guillaume Nodet  a écrit :

>
> Le sam. 29 mai 2021 à 10:13, Martin Kanters  a
> écrit :
>
>> So we took a look at this. First we wanted to know why the forked
>> goals were executed multiple times, while MNG-6566 [1] should have taken
>> care of that. But it seems that that only optimizes duplicate goals in the
>> context of one project. I attempted to explain that [2]. We created a
>> ticket for optimizing this for multi module projects [3], but we think that
>> it's not straightforward to fix this.
>>
>
> I still think [3] is slightly different from my original problem.  You
> seem to indicate that the forked lifecycle is executed after, while in my
> case, they were executed at  the very beginning of the build, so that the
> forked goals were executed before the  usual execution from their
> respective project. The effect is that for a given project, the following
> goals were executed:
>   compile -> clean -> compile
>
> The second problem is that the concurrent execution of the clean and
> compile goals lead to unpredictable results.
>
> It seems the issue only stresses a re-execution of the goal as a possible
> optimization... That may be just me not reading correctly though...
>
>
>> Back to the problem at hand. IIUC your suggestion is to pause
>> project builds halfway, resume them after the required child projects goals
>> have been executed (instead of forking), and finally finish the child
>> project builds afterwards. I think it's elegant that in this solution, no
>> duplicate goals will be executed, since no real forking has to be done. I
>> do have the feeling that it would become quite a drastic change. I am also
>> not sure whether we can assume that switching halfway through project
>> builds works fine in every scenario. For the user it would also become hard
>> to follow the build, I guess...
>>
>> Perhaps it would be easier to ensure projects can only be built once at
>> a time (e.g. using locks or something). It wouldn't be the most
>> efficient, but I guess it does not involve big changes to both the inner
>> workings and user perspective.
>
>
> I could try the second solution, though this could still leave an
> execution order:
>   compile -> clean -> compile
> which I think is really wrong.
>
> I think the first solution brings a few benefits : during parallel builds,
> more things  could be executed in parallel.  For example the ordering could
> be improved at the mojo execution level (or at least per group of mojos
> execution in the same phase) instead of a global per-project ordering.  In
> theory, we could even make the project resolution happen in parallel with
> some goals execution: compile time dependencies could be resolved during
> the clean / resource generation phases, and test dependencies during
> compilation, etc...  Also, dependencies between projects only really happen
> for the compilation (or test) phases, so the clean / resource generation
> phases can happen concurrently.
> For the output, I'm not so worried.  In the case of parallel builds, the
> output has to be reordered anyway to be understandable, as done in mvnd.
>
> I'll have a look at a simple per-project locking mechanism first though...
>
>
>> Martin
>>
>> [1] https://issues.apache.org/jira/browse/MNG-6566
>> [2]
>>
>> https://issues.apache.org/jira/browse/MNG-6566?focusedCommentId=17353384&page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel#comment-17353384
>> [3] https://issues.apache.org/jira/browse/MNG-7163
>>
>> Op di 18 mei 2021 om 21:45 schreef Martin Kanters <
>> martinkant...@apache.org
>> >:
>>
>> > Ah, too bad. I thought it was relevant. Perhaps I can take a look at
>> this
>> > with Maarten Mulders, but that will not be in the coming week at least.
>> >
>> > Op di 18 mei 2021 om 21:34 schreef Guillaume Nodet :
>> >
>> >> I just tried with master and the problem is the same.
>> >> The reason is that in my use case, the forked goals are executed before
>> >> the
>> >> standard executions, and not even in the same project.
>> >>
>> >> Le mar. 18 mai 2021 à 20:41, Martin Kanters 
>> a
>> >> écrit :
>> >>
>> >> > Not sure how I've missed this post. Have you tried this build with
>> the
>> >> > master build of Maven?
>> >> > MNG-6566 [1] should prevent any unnecessary double executions, thus
>> >> > optimizing the buildplan.
>> >> > I'm interested if this will solve the problem at hand.
>> >> >
>> >> > Martin
>> >> >
>> >> > [1] https://issues.apache.org/jira/browse/MNG-6566
>> >> >
>> >> > Op di 18 mei 2021 om 14:57 schreef Guillaume Nodet <
>> gno...@apache.org>:
>> >> >
>> >> > > I'm looking a bit at aggregator goals.
>> >> > > At first glance, it seems most of the problem comes from the fact
>> that
>> >> > the
>> >> > > build ordering is done mostly per-project.  This causes obvious
>> >> problems
>> >> > > f

Re: Mojo execution synchonization with forked lifecycles in parallel builds

2021-06-01 Thread Guillaume Nodet
Le sam. 29 mai 2021 à 10:13, Martin Kanters  a
écrit :

> So we took a look at this. First we wanted to know why the forked
> goals were executed multiple times, while MNG-6566 [1] should have taken
> care of that. But it seems that that only optimizes duplicate goals in the
> context of one project. I attempted to explain that [2]. We created a
> ticket for optimizing this for multi module projects [3], but we think that
> it's not straightforward to fix this.
>

I still think [3] is slightly different from my original problem.  You seem
to indicate that the forked lifecycle is executed after, while in my case,
they were executed at  the very beginning of the build, so that the forked
goals were executed before the  usual execution from their respective
project. The effect is that for a given project, the following goals were
executed:
  compile -> clean -> compile

The second problem is that the concurrent execution of the clean and
compile goals lead to unpredictable results.

It seems the issue only stresses a re-execution of the goal as a possible
optimization... That may be just me not reading correctly though...


> Back to the problem at hand. IIUC your suggestion is to pause
> project builds halfway, resume them after the required child projects goals
> have been executed (instead of forking), and finally finish the child
> project builds afterwards. I think it's elegant that in this solution, no
> duplicate goals will be executed, since no real forking has to be done. I
> do have the feeling that it would become quite a drastic change. I am also
> not sure whether we can assume that switching halfway through project
> builds works fine in every scenario. For the user it would also become hard
> to follow the build, I guess...
>
> Perhaps it would be easier to ensure projects can only be built once at
> a time (e.g. using locks or something). It wouldn't be the most
> efficient, but I guess it does not involve big changes to both the inner
> workings and user perspective.


I could try the second solution, though this could still leave an execution
order:
  compile -> clean -> compile
which I think is really wrong.

I think the first solution brings a few benefits : during parallel builds,
more things  could be executed in parallel.  For example the ordering could
be improved at the mojo execution level (or at least per group of mojos
execution in the same phase) instead of a global per-project ordering.  In
theory, we could even make the project resolution happen in parallel with
some goals execution: compile time dependencies could be resolved during
the clean / resource generation phases, and test dependencies during
compilation, etc...  Also, dependencies between projects only really happen
for the compilation (or test) phases, so the clean / resource generation
phases can happen concurrently.
For the output, I'm not so worried.  In the case of parallel builds, the
output has to be reordered anyway to be understandable, as done in mvnd.

I'll have a look at a simple per-project locking mechanism first though...


> Martin
>
> [1] https://issues.apache.org/jira/browse/MNG-6566
> [2]
>
> https://issues.apache.org/jira/browse/MNG-6566?focusedCommentId=17353384&page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel#comment-17353384
> [3] https://issues.apache.org/jira/browse/MNG-7163
>
> Op di 18 mei 2021 om 21:45 schreef Martin Kanters <
> martinkant...@apache.org
> >:
>
> > Ah, too bad. I thought it was relevant. Perhaps I can take a look at this
> > with Maarten Mulders, but that will not be in the coming week at least.
> >
> > Op di 18 mei 2021 om 21:34 schreef Guillaume Nodet :
> >
> >> I just tried with master and the problem is the same.
> >> The reason is that in my use case, the forked goals are executed before
> >> the
> >> standard executions, and not even in the same project.
> >>
> >> Le mar. 18 mai 2021 à 20:41, Martin Kanters 
> a
> >> écrit :
> >>
> >> > Not sure how I've missed this post. Have you tried this build with the
> >> > master build of Maven?
> >> > MNG-6566 [1] should prevent any unnecessary double executions, thus
> >> > optimizing the buildplan.
> >> > I'm interested if this will solve the problem at hand.
> >> >
> >> > Martin
> >> >
> >> > [1] https://issues.apache.org/jira/browse/MNG-6566
> >> >
> >> > Op di 18 mei 2021 om 14:57 schreef Guillaume Nodet  >:
> >> >
> >> > > I'm looking a bit at aggregator goals.
> >> > > At first glance, it seems most of the problem comes from the fact
> that
> >> > the
> >> > > build ordering is done mostly per-project.  This causes obvious
> >> problems
> >> > > for aggregators when a mojo needs a given phase to be executed for
> all
> >> > > children before it can run (for example the compilation phase before
> >> > > creating the javadoc).  Another problem comes from the clean task
> >> which
> >> > has
> >> > > obvious side effects.  Calling clean with an aggregator goal
> involved
> >> in
> >> > > the build seems 

Re: Mojo execution synchonization with forked lifecycles in parallel builds

2021-05-29 Thread Martin Kanters
So we took a look at this. First we wanted to know why the forked goals
were executed multiple times, while MNG-6566 [1] should have taken care of
that. But it seems that that only optimizes duplicate goals in the context
of one project. I attempted to explain that [2]. We created a ticket for
optimizing this for multi module projects [3], but we think that it's not
straightforward to fix this.

Back to the problem at hand. IIUC your suggestion is to pause project
builds halfway, resume them after the required child projects goals have
been executed (instead of forking), and finally finish the child project
builds afterwards. I think it's elegant that in this solution, no duplicate
goals will be executed, since no real forking has to be done. I do have the
feeling that it would become quite a drastic change. I am also not sure
whether we can assume that switching halfway through project builds works
fine in every scenario. For the user it would also become hard to follow
the build, I guess...

Perhaps it would be easier to ensure projects can only be built once at a
time (e.g. using locks or something). It wouldn't be the most efficient,
but I guess it does not involve big changes to both the inner workings and
user perspective.

Martin

[1] https://issues.apache.org/jira/browse/MNG-6566
[2]
https://issues.apache.org/jira/browse/MNG-6566?focusedCommentId=17353384&page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel#comment-17353384
[3] https://issues.apache.org/jira/browse/MNG-7163

Op di 18 mei 2021 om 21:45 schreef Martin Kanters :

> Ah, too bad. I thought it was relevant. Perhaps I can take a look at this
> with Maarten Mulders, but that will not be in the coming week at least.
>
> Op di 18 mei 2021 om 21:34 schreef Guillaume Nodet :
>
>> I just tried with master and the problem is the same.
>> The reason is that in my use case, the forked goals are executed before
>> the
>> standard executions, and not even in the same project.
>>
>> Le mar. 18 mai 2021 à 20:41, Martin Kanters  a
>> écrit :
>>
>> > Not sure how I've missed this post. Have you tried this build with the
>> > master build of Maven?
>> > MNG-6566 [1] should prevent any unnecessary double executions, thus
>> > optimizing the buildplan.
>> > I'm interested if this will solve the problem at hand.
>> >
>> > Martin
>> >
>> > [1] https://issues.apache.org/jira/browse/MNG-6566
>> >
>> > Op di 18 mei 2021 om 14:57 schreef Guillaume Nodet :
>> >
>> > > I'm looking a bit at aggregator goals.
>> > > At first glance, it seems most of the problem comes from the fact that
>> > the
>> > > build ordering is done mostly per-project.  This causes obvious
>> problems
>> > > for aggregators when a mojo needs a given phase to be executed for all
>> > > children before it can run (for example the compilation phase before
>> > > creating the javadoc).  Another problem comes from the clean task
>> which
>> > has
>> > > obvious side effects.  Calling clean with an aggregator goal involved
>> in
>> > > the build seems like a recipe for problems...
>> > >
>> > > Would you see bad side effects to split the build in smaller chunks
>> > > (basically down to a mojo execution) so that ordering can be changed
>> in a
>> > > more meaningful way ? For example when running an aggregate javadoc,
>> the
>> > > top level project would be built first until before the javadoc
>> aggregate
>> > > goal.  The build would then go to all other projects (like the forked
>> > > lifecycle) until all required goals have been run, then resume from
>> the
>> > > javadoc goal.
>> > > Note that with the current behavior, when you run "clean verify", the
>> > > execution is the following
>> > >
>> > > [INFO] Scanning for projects...
>> > > [INFO]
>> > >
>> 
>> > > [INFO] Reactor Build Order:
>> > > [INFO]
>> > > [INFO] forked
>> > > [pom]
>> > > [INFO] forked-mod1
>> > >  [jar]
>> > > [INFO] forked-mod2
>> > >  [jar]
>> > > [INFO]
>> > > [INFO] ---< org.mvndaemon.mvnd.test.forked:forked
>> > > >
>> > > [INFO] Building forked 0.0.1-SNAPSHOT
>> > > [1/3]
>> > > [INFO] [ pom
>> > > ]-
>> > > [INFO]
>> > > [INFO] --- maven-clean-plugin:2.5:clean (default-clean) @ forked ---
>> > > [INFO] >>> maven-javadoc-plugin:3.2.0:aggregate-jar (aggregate-jar) >
>> > > compile @ forked >>>
>> > > [INFO]
>> > >
>> 
>> > > [INFO] Forking forked-mod1 0.0.1-SNAPSHOT
>> > > [INFO]
>> > >
>> 
>> > > [INFO] --- maven-resources-plugin:2.6:resources (default-resources) @
>> > > forked-mod1 ---
>> > > [INFO] --- maven-compiler-plugin:3.8.0:compile (default-compile) @
>> > > forked-mod1 ---
>> > > [INFO]
>> > >
>> 
>> > > [INFO] F

Re: Mojo execution synchonization with forked lifecycles in parallel builds

2021-05-18 Thread Martin Kanters
Ah, too bad. I thought it was relevant. Perhaps I can take a look at this
with Maarten Mulders, but that will not be in the coming week at least.

Op di 18 mei 2021 om 21:34 schreef Guillaume Nodet :

> I just tried with master and the problem is the same.
> The reason is that in my use case, the forked goals are executed before the
> standard executions, and not even in the same project.
>
> Le mar. 18 mai 2021 à 20:41, Martin Kanters  a
> écrit :
>
> > Not sure how I've missed this post. Have you tried this build with the
> > master build of Maven?
> > MNG-6566 [1] should prevent any unnecessary double executions, thus
> > optimizing the buildplan.
> > I'm interested if this will solve the problem at hand.
> >
> > Martin
> >
> > [1] https://issues.apache.org/jira/browse/MNG-6566
> >
> > Op di 18 mei 2021 om 14:57 schreef Guillaume Nodet :
> >
> > > I'm looking a bit at aggregator goals.
> > > At first glance, it seems most of the problem comes from the fact that
> > the
> > > build ordering is done mostly per-project.  This causes obvious
> problems
> > > for aggregators when a mojo needs a given phase to be executed for all
> > > children before it can run (for example the compilation phase before
> > > creating the javadoc).  Another problem comes from the clean task which
> > has
> > > obvious side effects.  Calling clean with an aggregator goal involved
> in
> > > the build seems like a recipe for problems...
> > >
> > > Would you see bad side effects to split the build in smaller chunks
> > > (basically down to a mojo execution) so that ordering can be changed
> in a
> > > more meaningful way ? For example when running an aggregate javadoc,
> the
> > > top level project would be built first until before the javadoc
> aggregate
> > > goal.  The build would then go to all other projects (like the forked
> > > lifecycle) until all required goals have been run, then resume from the
> > > javadoc goal.
> > > Note that with the current behavior, when you run "clean verify", the
> > > execution is the following
> > >
> > > [INFO] Scanning for projects...
> > > [INFO]
> > >
> 
> > > [INFO] Reactor Build Order:
> > > [INFO]
> > > [INFO] forked
> > > [pom]
> > > [INFO] forked-mod1
> > >  [jar]
> > > [INFO] forked-mod2
> > >  [jar]
> > > [INFO]
> > > [INFO] ---< org.mvndaemon.mvnd.test.forked:forked
> > > >
> > > [INFO] Building forked 0.0.1-SNAPSHOT
> > > [1/3]
> > > [INFO] [ pom
> > > ]-
> > > [INFO]
> > > [INFO] --- maven-clean-plugin:2.5:clean (default-clean) @ forked ---
> > > [INFO] >>> maven-javadoc-plugin:3.2.0:aggregate-jar (aggregate-jar) >
> > > compile @ forked >>>
> > > [INFO]
> > >
> 
> > > [INFO] Forking forked-mod1 0.0.1-SNAPSHOT
> > > [INFO]
> > >
> 
> > > [INFO] --- maven-resources-plugin:2.6:resources (default-resources) @
> > > forked-mod1 ---
> > > [INFO] --- maven-compiler-plugin:3.8.0:compile (default-compile) @
> > > forked-mod1 ---
> > > [INFO]
> > >
> 
> > > [INFO] Forking forked-mod2 0.0.1-SNAPSHOT
> > > [INFO]
> > >
> 
> > > [INFO] --- maven-resources-plugin:2.6:resources (default-resources) @
> > > forked-mod2 ---
> > > [INFO] --- maven-compiler-plugin:3.8.0:compile (default-compile) @
> > > forked-mod2 ---
> > > [INFO] <<< maven-javadoc-plugin:3.2.0:aggregate-jar (aggregate-jar) <
> > > compile @ forked <<<
> > > [INFO] --- maven-javadoc-plugin:3.2.0:aggregate-jar (aggregate-jar) @
> > > forked ---
> > > [INFO]
> > > [INFO] -< org.mvndaemon.mvnd.test.forked:forked-mod1
> > > >-
> > > [INFO] Building forked-mod1 0.0.1-SNAPSHOT
> > >  [2/3]
> > > [INFO] [ jar
> > > ]-
> > > [INFO]
> > > [INFO] --- maven-clean-plugin:2.5:clean (default-clean) @ forked-mod1
> ---
> > > [INFO] --- maven-resources-plugin:2.6:resources (default-resources) @
> > > forked-mod1 ---
> > > [INFO] --- maven-compiler-plugin:3.8.0:compile (default-compile) @
> > > forked-mod1 ---
> > > [INFO] --- maven-resources-plugin:2.6:testResources
> > (default-testResources)
> > > @ forked-mod1 ---
> > > [INFO] --- maven-compiler-plugin:3.8.0:testCompile
> (default-testCompile)
> > @
> > > forked-mod1 ---
> > > [INFO] --- maven-surefire-plugin:2.22.2:test (default-test) @
> forked-mod1
> > > ---
> > > [INFO] --- maven-jar-plugin:2.4:jar (default-jar) @ forked-mod1 ---
> > > [INFO]
> > > [INFO] -< org.mvndaemon.mvnd.test.forked:forked-mod2
> > > >-
> > > [INFO] Building forked-mod2 0.0.1-SNAPSHOT
> > >  [3/3]
> > > [INFO] [ jar
> > > ]

Re: Mojo execution synchonization with forked lifecycles in parallel builds

2021-05-18 Thread Guillaume Nodet
I just tried with master and the problem is the same.
The reason is that in my use case, the forked goals are executed before the
standard executions, and not even in the same project.

Le mar. 18 mai 2021 à 20:41, Martin Kanters  a
écrit :

> Not sure how I've missed this post. Have you tried this build with the
> master build of Maven?
> MNG-6566 [1] should prevent any unnecessary double executions, thus
> optimizing the buildplan.
> I'm interested if this will solve the problem at hand.
>
> Martin
>
> [1] https://issues.apache.org/jira/browse/MNG-6566
>
> Op di 18 mei 2021 om 14:57 schreef Guillaume Nodet :
>
> > I'm looking a bit at aggregator goals.
> > At first glance, it seems most of the problem comes from the fact that
> the
> > build ordering is done mostly per-project.  This causes obvious problems
> > for aggregators when a mojo needs a given phase to be executed for all
> > children before it can run (for example the compilation phase before
> > creating the javadoc).  Another problem comes from the clean task which
> has
> > obvious side effects.  Calling clean with an aggregator goal involved in
> > the build seems like a recipe for problems...
> >
> > Would you see bad side effects to split the build in smaller chunks
> > (basically down to a mojo execution) so that ordering can be changed in a
> > more meaningful way ? For example when running an aggregate javadoc, the
> > top level project would be built first until before the javadoc aggregate
> > goal.  The build would then go to all other projects (like the forked
> > lifecycle) until all required goals have been run, then resume from the
> > javadoc goal.
> > Note that with the current behavior, when you run "clean verify", the
> > execution is the following
> >
> > [INFO] Scanning for projects...
> > [INFO]
> > 
> > [INFO] Reactor Build Order:
> > [INFO]
> > [INFO] forked
> > [pom]
> > [INFO] forked-mod1
> >  [jar]
> > [INFO] forked-mod2
> >  [jar]
> > [INFO]
> > [INFO] ---< org.mvndaemon.mvnd.test.forked:forked
> > >
> > [INFO] Building forked 0.0.1-SNAPSHOT
> > [1/3]
> > [INFO] [ pom
> > ]-
> > [INFO]
> > [INFO] --- maven-clean-plugin:2.5:clean (default-clean) @ forked ---
> > [INFO] >>> maven-javadoc-plugin:3.2.0:aggregate-jar (aggregate-jar) >
> > compile @ forked >>>
> > [INFO]
> > 
> > [INFO] Forking forked-mod1 0.0.1-SNAPSHOT
> > [INFO]
> > 
> > [INFO] --- maven-resources-plugin:2.6:resources (default-resources) @
> > forked-mod1 ---
> > [INFO] --- maven-compiler-plugin:3.8.0:compile (default-compile) @
> > forked-mod1 ---
> > [INFO]
> > 
> > [INFO] Forking forked-mod2 0.0.1-SNAPSHOT
> > [INFO]
> > 
> > [INFO] --- maven-resources-plugin:2.6:resources (default-resources) @
> > forked-mod2 ---
> > [INFO] --- maven-compiler-plugin:3.8.0:compile (default-compile) @
> > forked-mod2 ---
> > [INFO] <<< maven-javadoc-plugin:3.2.0:aggregate-jar (aggregate-jar) <
> > compile @ forked <<<
> > [INFO] --- maven-javadoc-plugin:3.2.0:aggregate-jar (aggregate-jar) @
> > forked ---
> > [INFO]
> > [INFO] -< org.mvndaemon.mvnd.test.forked:forked-mod1
> > >-
> > [INFO] Building forked-mod1 0.0.1-SNAPSHOT
> >  [2/3]
> > [INFO] [ jar
> > ]-
> > [INFO]
> > [INFO] --- maven-clean-plugin:2.5:clean (default-clean) @ forked-mod1 ---
> > [INFO] --- maven-resources-plugin:2.6:resources (default-resources) @
> > forked-mod1 ---
> > [INFO] --- maven-compiler-plugin:3.8.0:compile (default-compile) @
> > forked-mod1 ---
> > [INFO] --- maven-resources-plugin:2.6:testResources
> (default-testResources)
> > @ forked-mod1 ---
> > [INFO] --- maven-compiler-plugin:3.8.0:testCompile (default-testCompile)
> @
> > forked-mod1 ---
> > [INFO] --- maven-surefire-plugin:2.22.2:test (default-test) @ forked-mod1
> > ---
> > [INFO] --- maven-jar-plugin:2.4:jar (default-jar) @ forked-mod1 ---
> > [INFO]
> > [INFO] -< org.mvndaemon.mvnd.test.forked:forked-mod2
> > >-
> > [INFO] Building forked-mod2 0.0.1-SNAPSHOT
> >  [3/3]
> > [INFO] [ jar
> > ]-
> > [INFO]
> > [INFO] --- maven-clean-plugin:2.5:clean (default-clean) @ forked-mod2 ---
> > [INFO] --- maven-resources-plugin:2.6:resources (default-resources) @
> > forked-mod2 ---
> > [INFO] --- maven-compiler-plugin:3.8.0:compile (default-compile) @
> > forked-mod2 ---
> > [INFO] --- maven-resources-plugin:2.6:testResources
> (default-testResources)
> > @ forked-mod2 ---
> > [INFO] --- maven-compiler-plugin:3.8.0:

Re: Mojo execution synchonization with forked lifecycles in parallel builds

2021-05-18 Thread Martin Kanters
Not sure how I've missed this post. Have you tried this build with the
master build of Maven?
MNG-6566 [1] should prevent any unnecessary double executions, thus
optimizing the buildplan.
I'm interested if this will solve the problem at hand.

Martin

[1] https://issues.apache.org/jira/browse/MNG-6566

Op di 18 mei 2021 om 14:57 schreef Guillaume Nodet :

> I'm looking a bit at aggregator goals.
> At first glance, it seems most of the problem comes from the fact that the
> build ordering is done mostly per-project.  This causes obvious problems
> for aggregators when a mojo needs a given phase to be executed for all
> children before it can run (for example the compilation phase before
> creating the javadoc).  Another problem comes from the clean task which has
> obvious side effects.  Calling clean with an aggregator goal involved in
> the build seems like a recipe for problems...
>
> Would you see bad side effects to split the build in smaller chunks
> (basically down to a mojo execution) so that ordering can be changed in a
> more meaningful way ? For example when running an aggregate javadoc, the
> top level project would be built first until before the javadoc aggregate
> goal.  The build would then go to all other projects (like the forked
> lifecycle) until all required goals have been run, then resume from the
> javadoc goal.
> Note that with the current behavior, when you run "clean verify", the
> execution is the following
>
> [INFO] Scanning for projects...
> [INFO]
> 
> [INFO] Reactor Build Order:
> [INFO]
> [INFO] forked
> [pom]
> [INFO] forked-mod1
>  [jar]
> [INFO] forked-mod2
>  [jar]
> [INFO]
> [INFO] ---< org.mvndaemon.mvnd.test.forked:forked
> >
> [INFO] Building forked 0.0.1-SNAPSHOT
> [1/3]
> [INFO] [ pom
> ]-
> [INFO]
> [INFO] --- maven-clean-plugin:2.5:clean (default-clean) @ forked ---
> [INFO] >>> maven-javadoc-plugin:3.2.0:aggregate-jar (aggregate-jar) >
> compile @ forked >>>
> [INFO]
> 
> [INFO] Forking forked-mod1 0.0.1-SNAPSHOT
> [INFO]
> 
> [INFO] --- maven-resources-plugin:2.6:resources (default-resources) @
> forked-mod1 ---
> [INFO] --- maven-compiler-plugin:3.8.0:compile (default-compile) @
> forked-mod1 ---
> [INFO]
> 
> [INFO] Forking forked-mod2 0.0.1-SNAPSHOT
> [INFO]
> 
> [INFO] --- maven-resources-plugin:2.6:resources (default-resources) @
> forked-mod2 ---
> [INFO] --- maven-compiler-plugin:3.8.0:compile (default-compile) @
> forked-mod2 ---
> [INFO] <<< maven-javadoc-plugin:3.2.0:aggregate-jar (aggregate-jar) <
> compile @ forked <<<
> [INFO] --- maven-javadoc-plugin:3.2.0:aggregate-jar (aggregate-jar) @
> forked ---
> [INFO]
> [INFO] -< org.mvndaemon.mvnd.test.forked:forked-mod1
> >-
> [INFO] Building forked-mod1 0.0.1-SNAPSHOT
>  [2/3]
> [INFO] [ jar
> ]-
> [INFO]
> [INFO] --- maven-clean-plugin:2.5:clean (default-clean) @ forked-mod1 ---
> [INFO] --- maven-resources-plugin:2.6:resources (default-resources) @
> forked-mod1 ---
> [INFO] --- maven-compiler-plugin:3.8.0:compile (default-compile) @
> forked-mod1 ---
> [INFO] --- maven-resources-plugin:2.6:testResources (default-testResources)
> @ forked-mod1 ---
> [INFO] --- maven-compiler-plugin:3.8.0:testCompile (default-testCompile) @
> forked-mod1 ---
> [INFO] --- maven-surefire-plugin:2.22.2:test (default-test) @ forked-mod1
> ---
> [INFO] --- maven-jar-plugin:2.4:jar (default-jar) @ forked-mod1 ---
> [INFO]
> [INFO] -< org.mvndaemon.mvnd.test.forked:forked-mod2
> >-
> [INFO] Building forked-mod2 0.0.1-SNAPSHOT
>  [3/3]
> [INFO] [ jar
> ]-
> [INFO]
> [INFO] --- maven-clean-plugin:2.5:clean (default-clean) @ forked-mod2 ---
> [INFO] --- maven-resources-plugin:2.6:resources (default-resources) @
> forked-mod2 ---
> [INFO] --- maven-compiler-plugin:3.8.0:compile (default-compile) @
> forked-mod2 ---
> [INFO] --- maven-resources-plugin:2.6:testResources (default-testResources)
> @ forked-mod2 ---
> [INFO] --- maven-compiler-plugin:3.8.0:testCompile (default-testCompile) @
> forked-mod2 ---
> [INFO] --- maven-surefire-plugin:2.22.2:test (default-test) @ forked-mod2
> ---
> [INFO] --- maven-jar-plugin:2.4:jar (default-jar) @ forked-mod2 ---
> [INFO]
> 
> [INFO] Reactor Summary for forked 0.0.1-SNAPSHOT:
> [INFO]
> [INFO] forked . SUCCESS [
>  1.921 s]
> [INFO] forked-mod1 ..

Re: Mojo execution synchonization with forked lifecycles in parallel builds

2021-05-18 Thread Guillaume Nodet
I'm looking a bit at aggregator goals.
At first glance, it seems most of the problem comes from the fact that the
build ordering is done mostly per-project.  This causes obvious problems
for aggregators when a mojo needs a given phase to be executed for all
children before it can run (for example the compilation phase before
creating the javadoc).  Another problem comes from the clean task which has
obvious side effects.  Calling clean with an aggregator goal involved in
the build seems like a recipe for problems...

Would you see bad side effects to split the build in smaller chunks
(basically down to a mojo execution) so that ordering can be changed in a
more meaningful way ? For example when running an aggregate javadoc, the
top level project would be built first until before the javadoc aggregate
goal.  The build would then go to all other projects (like the forked
lifecycle) until all required goals have been run, then resume from the
javadoc goal.
Note that with the current behavior, when you run "clean verify", the
execution is the following

[INFO] Scanning for projects...
[INFO]

[INFO] Reactor Build Order:
[INFO]
[INFO] forked
[pom]
[INFO] forked-mod1
 [jar]
[INFO] forked-mod2
 [jar]
[INFO]
[INFO] ---< org.mvndaemon.mvnd.test.forked:forked
>
[INFO] Building forked 0.0.1-SNAPSHOT
[1/3]
[INFO] [ pom
]-
[INFO]
[INFO] --- maven-clean-plugin:2.5:clean (default-clean) @ forked ---
[INFO] >>> maven-javadoc-plugin:3.2.0:aggregate-jar (aggregate-jar) >
compile @ forked >>>
[INFO]

[INFO] Forking forked-mod1 0.0.1-SNAPSHOT
[INFO]

[INFO] --- maven-resources-plugin:2.6:resources (default-resources) @
forked-mod1 ---
[INFO] --- maven-compiler-plugin:3.8.0:compile (default-compile) @
forked-mod1 ---
[INFO]

[INFO] Forking forked-mod2 0.0.1-SNAPSHOT
[INFO]

[INFO] --- maven-resources-plugin:2.6:resources (default-resources) @
forked-mod2 ---
[INFO] --- maven-compiler-plugin:3.8.0:compile (default-compile) @
forked-mod2 ---
[INFO] <<< maven-javadoc-plugin:3.2.0:aggregate-jar (aggregate-jar) <
compile @ forked <<<
[INFO] --- maven-javadoc-plugin:3.2.0:aggregate-jar (aggregate-jar) @
forked ---
[INFO]
[INFO] -< org.mvndaemon.mvnd.test.forked:forked-mod1
>-
[INFO] Building forked-mod1 0.0.1-SNAPSHOT
 [2/3]
[INFO] [ jar
]-
[INFO]
[INFO] --- maven-clean-plugin:2.5:clean (default-clean) @ forked-mod1 ---
[INFO] --- maven-resources-plugin:2.6:resources (default-resources) @
forked-mod1 ---
[INFO] --- maven-compiler-plugin:3.8.0:compile (default-compile) @
forked-mod1 ---
[INFO] --- maven-resources-plugin:2.6:testResources (default-testResources)
@ forked-mod1 ---
[INFO] --- maven-compiler-plugin:3.8.0:testCompile (default-testCompile) @
forked-mod1 ---
[INFO] --- maven-surefire-plugin:2.22.2:test (default-test) @ forked-mod1
---
[INFO] --- maven-jar-plugin:2.4:jar (default-jar) @ forked-mod1 ---
[INFO]
[INFO] -< org.mvndaemon.mvnd.test.forked:forked-mod2
>-
[INFO] Building forked-mod2 0.0.1-SNAPSHOT
 [3/3]
[INFO] [ jar
]-
[INFO]
[INFO] --- maven-clean-plugin:2.5:clean (default-clean) @ forked-mod2 ---
[INFO] --- maven-resources-plugin:2.6:resources (default-resources) @
forked-mod2 ---
[INFO] --- maven-compiler-plugin:3.8.0:compile (default-compile) @
forked-mod2 ---
[INFO] --- maven-resources-plugin:2.6:testResources (default-testResources)
@ forked-mod2 ---
[INFO] --- maven-compiler-plugin:3.8.0:testCompile (default-testCompile) @
forked-mod2 ---
[INFO] --- maven-surefire-plugin:2.22.2:test (default-test) @ forked-mod2
---
[INFO] --- maven-jar-plugin:2.4:jar (default-jar) @ forked-mod2 ---
[INFO]

[INFO] Reactor Summary for forked 0.0.1-SNAPSHOT:
[INFO]
[INFO] forked . SUCCESS [
 1.921 s]
[INFO] forked-mod1  SUCCESS [
 0.498 s]
[INFO] forked-mod2  SUCCESS [
 0.046 s]
[INFO]

[INFO] BUILD SUCCESS
[INFO]

[INFO] Total time:  2.535 s
[INFO] Finished at: 2021-05-18T14:32:09+02:00
[INFO]


  As you can see, the resources and compile goals are run twice for each
project.  Furthermore, given the clean g

Re: Mojo execution synchonization with forked lifecycles in parallel builds

2021-05-17 Thread Guillaume Nodet
I've raised https://issues.apache.org/jira/browse/MNG-7156

Le mer. 12 mai 2021 à 17:57, Falko Modler  a écrit :

> Hi Guillaume,
>
> aggregation goals and parallel builds in combination are a bit of a
> mess, e.g.:
>
> - https://issues.apache.org/jira/browse/MNG-6843
> - https://github.com/apache/maven/pull/413
> - https://www.mail-archive.com/dev@maven.apache.org/msg123439.html
>
> Cheers,
>
> Falko
>
> Am 12.05.2021 um 17:25 schrieb Guillaume Nodet:
> > Hi
> >
> > I've analyzed a bug reported on mvnd this afternoon (
> > https://github.com/mvndaemon/mvnd/issues/408).  It appears that the
> parent
> > pom executes the javadoc aggregate goal, which forks the lifecycle of the
> > children modules in order to compile the sources.  In a traditional
> build,
> > this does not cause any real problem, but in a parallel build, a  clean
> > verify can definitely cause issues if the forked lifecycle and the normal
> > project build (and especially the clean) are run concurrently.
> > This definitely looks like an issue to me.  Any idea where I should look
> at
> > how to solve the problem ?  I wonder if the MojoExecutor should somehow
> > delegate to the Builder which is responsible for synchronizing the
> > executions in the case of a multithreaded build...
> > Thoughts ?
> >
>
>
> -
> To unsubscribe, e-mail: dev-unsubscr...@maven.apache.org
> For additional commands, e-mail: dev-h...@maven.apache.org
>
>

-- 

Guillaume Nodet


Re: Mojo execution synchonization with forked lifecycles in parallel builds

2021-05-12 Thread Falko Modler

Hi Guillaume,

aggregation goals and parallel builds in combination are a bit of a
mess, e.g.:

- https://issues.apache.org/jira/browse/MNG-6843
- https://github.com/apache/maven/pull/413
- https://www.mail-archive.com/dev@maven.apache.org/msg123439.html

Cheers,

Falko

Am 12.05.2021 um 17:25 schrieb Guillaume Nodet:

Hi

I've analyzed a bug reported on mvnd this afternoon (
https://github.com/mvndaemon/mvnd/issues/408).  It appears that the parent
pom executes the javadoc aggregate goal, which forks the lifecycle of the
children modules in order to compile the sources.  In a traditional build,
this does not cause any real problem, but in a parallel build, a  clean
verify can definitely cause issues if the forked lifecycle and the normal
project build (and especially the clean) are run concurrently.
This definitely looks like an issue to me.  Any idea where I should look at
how to solve the problem ?  I wonder if the MojoExecutor should somehow
delegate to the Builder which is responsible for synchronizing the
executions in the case of a multithreaded build...
Thoughts ?




-
To unsubscribe, e-mail: dev-unsubscr...@maven.apache.org
For additional commands, e-mail: dev-h...@maven.apache.org



Mojo execution synchonization with forked lifecycles in parallel builds

2021-05-12 Thread Guillaume Nodet
Hi

I've analyzed a bug reported on mvnd this afternoon (
https://github.com/mvndaemon/mvnd/issues/408).  It appears that the parent
pom executes the javadoc aggregate goal, which forks the lifecycle of the
children modules in order to compile the sources.  In a traditional build,
this does not cause any real problem, but in a parallel build, a  clean
verify can definitely cause issues if the forked lifecycle and the normal
project build (and especially the clean) are run concurrently.
This definitely looks like an issue to me.  Any idea where I should look at
how to solve the problem ?  I wonder if the MojoExecutor should somehow
delegate to the Builder which is responsible for synchronizing the
executions in the case of a multithreaded build...
Thoughts ?

-- 

Guillaume Nodet