diff options
author | Richard Maw <richard.maw@codethink.co.uk> | 2018-06-04 18:17:34 +0100 |
---|---|---|
committer | knownexus <phillip.smyth@codethink.co.uk> | 2018-07-31 17:32:35 +0100 |
commit | d83122bb0106dad454c93f8a03600c1a0d8167da (patch) | |
tree | a43a1ed1058ea29b09940ebb2823e36edc480da9 | |
parent | d14d8ee29b5fcaadcfd05934de71b46221243fcd (diff) | |
download | buildstream-d83122bb0106dad454c93f8a03600c1a0d8167da.tar.gz |
_scheduler/queues/buildqueue.py: Skip rebuilding cached failures
This flags up a failure and if run in an interactive prompt
permits the user to attempt a rebuild.
-rw-r--r-- | buildstream/_scheduler/queues/buildqueue.py | 35 |
1 files changed, 35 insertions, 0 deletions
diff --git a/buildstream/_scheduler/queues/buildqueue.py b/buildstream/_scheduler/queues/buildqueue.py index 691b9ff80..272f19fd7 100644 --- a/buildstream/_scheduler/queues/buildqueue.py +++ b/buildstream/_scheduler/queues/buildqueue.py @@ -18,8 +18,12 @@ # Tristan Van Berkom <tristan.vanberkom@codethink.co.uk> # Jürg Billeter <juerg.billeter@codethink.co.uk> +from datetime import timedelta + from . import Queue, QueueStatus +from ..jobs import ElementJob from ..resources import ResourceType +from ..._message import MessageType # A queue which assembles elements @@ -30,6 +34,37 @@ class BuildQueue(Queue): complete_name = "Built" resources = [ResourceType.PROCESS] + def __init__(self, *args, **kwargs): + super().__init__(*args, **kwargs) + self._tried = set() + + def enqueue(self, elts): + to_queue = [] + + for element in elts: + if not element._cached_failure() or element in self._tried: + to_queue.append(element) + continue + + # Bypass queue processing entirely the first time it's tried. + self._tried.add(element) + _, description, detail = element._get_build_result() + logfile = element._get_build_log() + self._message(element, MessageType.FAIL, description, + detail=detail, action_name=self.action_name, + elapsed=timedelta(seconds=0), + logfile=logfile) + job = ElementJob(self._scheduler, self.action_name, + logfile, element=element, queue=self, + resources=self.resources, + action_cb=self.process, + complete_cb=self._job_done, + max_retries=self._max_retries) + self.failed_elements.append(element) + self._scheduler._job_complete_callback(job, False) + + return super().enqueue(to_queue) + def process(self, element): element._assemble() return element._get_unique_id() |