summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRichard Maw <richard.maw@codethink.co.uk>2018-06-04 18:17:34 +0100
committerknownexus <phillip.smyth@codethink.co.uk>2018-07-31 17:32:35 +0100
commitd83122bb0106dad454c93f8a03600c1a0d8167da (patch)
treea43a1ed1058ea29b09940ebb2823e36edc480da9
parentd14d8ee29b5fcaadcfd05934de71b46221243fcd (diff)
downloadbuildstream-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.py35
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()