From c8cdcbb70740f3c71da83587c1368b7c4b03b330 Mon Sep 17 00:00:00 2001 From: Richard Ipsum Date: Mon, 5 May 2014 21:18:42 +0100 Subject: Add _ExecFailed event To cancel jobs cleanly we need to know when a job has failed. --- distbuild/worker_build_scheduler.py | 28 ++++++++++++++++++++++++---- 1 file changed, 24 insertions(+), 4 deletions(-) (limited to 'distbuild') diff --git a/distbuild/worker_build_scheduler.py b/distbuild/worker_build_scheduler.py index 7f813251..48ef4a7f 100644 --- a/distbuild/worker_build_scheduler.py +++ b/distbuild/worker_build_scheduler.py @@ -101,6 +101,7 @@ class Job(object): self.initiators = [initiator_id] self.who = None # we don't know who's going to do this yet self.is_building = False + self.failed = False class Jobs(object): @@ -177,7 +178,12 @@ class _ExecEnded(object): def __init__(self, job): self.job = job - + + +class _ExecFailed(object): + + def __init__(self, job): + self.job = job class WorkerBuildQueuer(distbuild.StateMachine): @@ -213,17 +219,30 @@ class WorkerBuildQueuer(distbuild.StateMachine): self._set_exec_started), ('idle', WorkerConnection, _ExecEnded, 'idle', self._set_exec_ended), + ('idle', WorkerConnection, _ExecFailed, 'idle', + self._set_exec_failed) ] self.add_transitions(spec) def _set_exec_started(self, event_source, event): - logging.debug('Setting job state: Job is building') + logging.debug('Setting job state for job %s with id %s: ' + 'Job is building', + event.job.artifact.basename(), event.job.id) + event.job.is_building = True def _set_exec_ended(self, event_source, event): - logging.debug('Setting job state: Job is NOT building') + logging.debug('Setting job state for job %s with id %s: ' + 'Job is NOT building', + event.job.artifact.basename(), event.job.id) + event.job.is_building = False + def _set_exec_failed(self, event_source, event): + logging.debug('Job %s with id %s failed', + event.job.artifact.basename(), event.job.id) + event.job.failed = True + def _handle_request(self, event_source, event): distbuild.crash_point() @@ -276,7 +295,7 @@ class WorkerBuildQueuer(distbuild.StateMachine): name, job_id) if len(job.initiators) == 1: - if job.is_building: + if job.is_building or job.failed: logging.debug('NOT removing running job %s with job id %s ' '(WorkerConnection will cancel job)', name, job_id) @@ -504,6 +523,7 @@ class WorkerConnection(distbuild.StateMachine): # Build failed. new_event = WorkerBuildFailed(new, self._job.artifact.cache_key) self.mainloop.queue_event(WorkerConnection, new_event) + self.mainloop.queue_event(WorkerConnection, _ExecFailed(self._job)) self.mainloop.queue_event(self, _BuildFailed()) else: # Build succeeded. We have more work to do: caching the result. -- cgit v1.2.1