summaryrefslogtreecommitdiff
path: root/buildstream/_scheduler/queues/buildqueue.py
diff options
context:
space:
mode:
Diffstat (limited to 'buildstream/_scheduler/queues/buildqueue.py')
-rw-r--r--buildstream/_scheduler/queues/buildqueue.py38
1 files changed, 37 insertions, 1 deletions
diff --git a/buildstream/_scheduler/queues/buildqueue.py b/buildstream/_scheduler/queues/buildqueue.py
index 376ef5ae2..5967fbf76 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,38 @@ 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._done_queue.append(job)
+ 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()
@@ -43,7 +79,7 @@ class BuildQueue(Queue):
# Keep it in the queue.
return QueueStatus.WAIT
- if element._cached():
+ if element._cached_success():
return QueueStatus.SKIP
if not element._buildable():