From e14c936124137ecd0b0bdef710f7adafdf066f31 Mon Sep 17 00:00:00 2001 From: Abderrahim Kitouni Date: Fri, 6 Feb 2026 12:10:15 +0000 Subject: [PATCH] Correctly track session elements in dynamic build plan When using a dynamic build plan, all elements are passed to the queue to be enqueued, but are only actually enqueued when they become required. This moves the tracking of session elements to the first queue rather than just take everything that we pass to the queue (which would be all elements). This also makes session_elements a set rather than a list since an element can be enqueued more than once (e.g. if it is retried). This is only used in the UI, and doesn't actually affect the build. --- src/buildstream/_scheduler/queues/queue.py | 15 +++++++++++++++ src/buildstream/_stream.py | 8 +++++--- 2 files changed, 20 insertions(+), 3 deletions(-) diff --git a/src/buildstream/_scheduler/queues/queue.py b/src/buildstream/_scheduler/queues/queue.py index badb5399d..108786955 100644 --- a/src/buildstream/_scheduler/queues/queue.py +++ b/src/buildstream/_scheduler/queues/queue.py @@ -62,6 +62,7 @@ class Queue: # Resources this queues' jobs want resources = [] # type: List[int] log_to_file = True + session_elements = None def __init__(self, scheduler, *, imperative=False): @@ -256,6 +257,17 @@ def harvest_jobs(self): def set_required_element_check(self): self._required_element_check = True + # set_session_elements() + # + # This passes a reference to a set used to keep track of the + # elements enqued. This is used in the first queue to determine + # which elements are actually considered in the current session. + # + # Args: + # session_elements (set): a set to put session elements + def set_session_elements(self, session_elements): + self.session_elements = session_elements + # any_failed_elements() # # Returns whether any elements in this queue have failed their jobs @@ -381,6 +393,9 @@ def _element_log_path(self, element): # element (Element): The Element to enqueue # def _enqueue_element(self, element): + if self.session_elements is not None: + self.session_elements.add(element) + status = self.status(element) if status == QueueStatus.SKIP: diff --git a/src/buildstream/_stream.py b/src/buildstream/_stream.py index 91971073f..d326b9532 100644 --- a/src/buildstream/_stream.py +++ b/src/buildstream/_stream.py @@ -72,7 +72,7 @@ def __init__( # Public members # self.targets = [] # Resolved target elements - self.session_elements = [] # List of elements being processed this session + self.session_elements = set() # Set of elements being processed this session self.total_elements = [] # Total list of elements based on targets self.queues = [] # Queue objects @@ -1802,7 +1802,7 @@ def _load( # def _reset(self): self._scheduler.clear_queues() - self.session_elements = [] + self.session_elements = set() self.total_elements = [] # _add_queue() @@ -1817,6 +1817,9 @@ def _add_queue(self, queue, *, track=False): # First non-track queue queue.set_required_element_check() + if not self.queues: + queue.set_session_elements(self.session_elements) + self.queues.append(queue) # _enqueue_plan() @@ -1830,7 +1833,6 @@ def _add_queue(self, queue, *, track=False): def _enqueue_plan(self, plan, *, queue=None): queue = queue or self.queues[0] queue.enqueue(plan) - self.session_elements += plan # _run() #