I think I have some ideas for a way to avoid the startup costs but still fork the build. I will investigate this in our current GUI runner.

Please consider our request for a cancellation mechanism on hold. Thanks for taking the time to discuss this enough to prompt me towards a better solution.

Hans Dockter wrote:

On Jul 24, 2009, at 12:41 AM, Steve Appling wrote:



Adam Murdoch wrote:
Hans Dockter wrote:
Hi,

I'm thinking about the best way to implement stopping a Gradle build.

One way to do it would be to add a type BuildController. A instance of this can be optionally passed to the Gradle.run method. The TaskExecuter and the Task will be associated with an instance of BuildController. If the state of the build controller is changed to stop, the TaskExecuter, Task, etc can react upon this and will throw eventually a BuildInterruptedException. This is a pretty intrusive approach. It has the additional draw back, that every task needs to be smart about this to make it work well. For example a task that delegates to an Ant task must wait with stopping the build until the Ant task has finished.

Another way of doing this is to still add a type BuildController. You can send a StopEvent to the BuildController. We have a separate Thread that receives this StopEvent. If it is received, the Thread running the Gradle build will be stopped.

Thoughts?
Any solution to this problem absolutely must be non-invasive to be worth the cost. If not, you're effectively making everyone who writes Gradle code (build scripts included) pay a price to make their code cancellable, whether or not they or anybody else ever want to cancel it. What's the problem with using ctrl-c or System.exit() or Process.destroy() ? That is, if you want to be able to cancel a build, you need to run it in forked mode.

The point of this was to provide a cancel mechanism when using Gradle embedded inside another application (in this case for the IDEA plugin). We originally were not forking the execution of Gradle because we thought we would be able to run the configuration phase once and re-use some Gradle object to execute the tasks. This turned out to not be possible, so we could look into forking again. I do think we are getting significant startup time savings from running this without forking, but we could test this to be sure.

The relevant startup time cost here is the Groovy startup time. It would be nice to get around this.


I don't think that everyone writing a DefaultTask in a build script would need to be concerned with this. There are a few more typically long running built in tasks (like test) that might need to know about this, but for the most part we would be happy with just stoping the TaskExecutor from picking up the next task in the chain.

Look for example at the ftp task of the Gradle build which uploads the Javadoc. It takes many minutes to finish. It simply uses the Ant FTP task, so it would ignore any StopEvent until it is finished. But a UI runner should be able to stop such a task more or less immediately.

- Hans

--
Hans Dockter
Gradle Project Manager
http://www.gradle.org


---------------------------------------------------------------------
To unsubscribe from this list, please visit:

   http://xircles.codehaus.org/manage_email




--
Steve Appling
Automated Logic Research Team

---------------------------------------------------------------------
To unsubscribe from this list, please visit:

   http://xircles.codehaus.org/manage_email


Reply via email to