summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSam Thursfield <sam.thursfield@codethink.co.uk>2015-04-01 10:46:43 +0000
committerBaserock Gerrit <gerrit@baserock.org>2015-04-02 11:43:22 +0000
commit134d8198ab4f1496f5986d52bad00b8a4ff1d10c (patch)
treeec351fbf76ea613f2ebc2e972e99aaf541fecc09
parentdbc9851ac865c6201dad6489bbd97f546495ae73 (diff)
downloadmorph-134d8198ab4f1496f5986d52bad00b8a4ff1d10c.tar.gz
distbuild: Fix issues in build cancellation
A cancel during the 'graphing' or 'annotating' stages would be ignored as the BuildController was listening for the InitiatorDisconnect message from the wrong event source. In 'building' state the actual build would be stopped, but the BuildController instance would stick around due to sending the message class instead of an instance of the message. Change-Id: I222a8aa39bf7fffab4d89e12997ffd18cd1b54fc
-rw-r--r--distbuild/build_controller.py21
1 files changed, 13 insertions, 8 deletions
diff --git a/distbuild/build_controller.py b/distbuild/build_controller.py
index 5b55dff3..6058862c 100644
--- a/distbuild/build_controller.py
+++ b/distbuild/build_controller.py
@@ -186,8 +186,10 @@ class BuildController(distbuild.StateMachine):
spec = [
# state, source, event_class, new_state, callback
('init', self, _Start, 'graphing', self._start_graphing),
- ('init', self._initiator_connection,
- distbuild.InitiatorDisconnect, None, None),
+ ('init', distbuild.InitiatorConnection,
+ distbuild.InitiatorDisconnect, 'init',
+ self._maybe_notify_initiator_disconnected),
+ ('init', self, _Abort, None, None),
('graphing', distbuild.HelperRouter, distbuild.HelperOutput,
'graphing', self._maybe_collect_graph),
@@ -196,16 +198,20 @@ class BuildController(distbuild.StateMachine):
('graphing', self, _GotGraph,
'annotating', self._start_annotating),
('graphing', self, BuildFailed, None, None),
- ('graphing', self._initiator_connection,
- distbuild.InitiatorDisconnect, None, None),
+ ('graphing', distbuild.InitiatorConnection,
+ distbuild.InitiatorDisconnect, 'graphing',
+ self._maybe_notify_initiator_disconnected),
+ ('graphing', self, _Abort, None, None),
('annotating', distbuild.HelperRouter, distbuild.HelperResult,
'annotating', self._maybe_handle_cache_response),
('annotating', self, BuildFailed, None, None),
('annotating', self, _Annotated, 'building',
self._queue_worker_builds),
- ('annotating', self._initiator_connection,
- distbuild.InitiatorDisconnect, None, None),
+ ('annotating', distbuild.InitiatorConnection,
+ distbuild.InitiatorDisconnect, 'annotating',
+ self._maybe_notify_initiator_disconnected),
+ ('annotating', self, _Abort, None, None),
# The exact WorkerConnection that is doing our building changes
# from build to build. We must listen to all messages from all
@@ -475,7 +481,6 @@ class BuildController(distbuild.StateMachine):
if a.source == artifact.source:
a.state = BUILDING
-
def _maybe_notify_initiator_disconnected(self, event_source, event):
if event.id != self._request['id']:
logging.debug('Heard initiator disconnect with event id %d '
@@ -492,7 +497,7 @@ class BuildController(distbuild.StateMachine):
cancel = BuildCancel(event.id)
self.mainloop.queue_event(BuildController, cancel)
- self.mainloop.queue_event(self, _Abort)
+ self.mainloop.queue_event(self, _Abort())
def _maybe_relay_build_waiting_for_worker(self, event_source, event):
if event.initiator_id != self._request['id']: