diff mbox series

[RFC,3/3] runqueue: Hand each covered task's log to a single setscene task

Message ID 20261024-mathieu-debug-replay-v4-v1-3-3f7f52a3b8e6@bootlin.com
State New
Headers show
Series Preparatory work for sstate cache log replay | expand

Commit Message

Mathieu Dubois-Briand Oct. 24, 2026, 12:33 p.m. UTC
When a setscene task starts, hand it the covered tasks of the same recipe
which were not yet handed to another setscene task, and pass their names
to the task through BB_SETSCENE_REPLAY_TASKS. Several setscene tasks can
cover the same task (e.g. do_populate_sysroot and do_package both cover
do_compile), so this lets metadata replay the log of each covered task
exactly once when restoring it from the sstate cache.

AI-Generated: Uses opencode (DeepSeek V4 Flash)
Signed-off-by: Mathieu Dubois-Briand <mathieu.dubois-briand@bootlin.com>
---
 bin/bitbake-worker | 1 +
 lib/bb/runqueue.py | 9 +++++++++
 2 files changed, 10 insertions(+)
diff mbox series

Patch

diff --git a/bin/bitbake-worker b/bin/bitbake-worker
index 61484a5c2522..0a46eea3ccb5 100755
--- a/bin/bitbake-worker
+++ b/bin/bitbake-worker
@@ -266,6 +266,7 @@  def fork_off_task(cfg, data, databuilder, workerdata, extraconfigdata, runtask):
                 the_data = databuilder.mcdata[mc]
                 the_data.setVar("BB_WORKERCONTEXT", "1")
                 the_data.setVar("BB_TASKDEPDATA", taskdepdata)
+                the_data.setVar("BB_SETSCENE_REPLAY_TASKS", " ".join(runtask.get('replaytasks', [])))
                 the_data.setVar('BB_CURRENTTASK', taskname.replace("do_", ""))
                 if cfg.limited_deps:
                     the_data.setVar("BB_LIMITEDDEPS", "1")
diff --git a/lib/bb/runqueue.py b/lib/bb/runqueue.py
index ef95eb46bf95..8bb1cb1a6e72 100644
--- a/lib/bb/runqueue.py
+++ b/lib/bb/runqueue.py
@@ -1939,6 +1939,8 @@  class RunQueueExecute:
         self.scenequeue_notcovered = set()
         self.tasks_notcovered = set()
         self.scenequeue_notneeded = set()
+        # Covered tasks already handed to a setscene task for log replay
+        self.sq_replay_assigned = set()
 
         self.setscene_tids_generator = None
 
@@ -2297,6 +2299,12 @@  class RunQueueExecute:
             startevent = sceneQueueTaskStarted(task, self.stats, self.rq)
             bb.event.fire(startevent, self.cfgData)
 
+            # Each covered task of this recipe is assigned to exactly one
+            # setscene task, so its log is replayed only once.
+            replaytasks = {t for t in self.sqdata.sq_covered_tasks[task]
+                           if fn_from_tid(t) == taskfn} - self.sq_replay_assigned
+            self.sq_replay_assigned |= replaytasks
+
             taskdep = self.rqdata.dataCaches[mc].task_deps[taskfn]
             realfn = bb.cache.virtualfn2realfn(taskfn)[0]
             runtask = {
@@ -2305,6 +2313,7 @@  class RunQueueExecute:
                 'taskname' : taskname,
                 'taskhash' : self.rqdata.get_task_hash(task),
                 'unihash' : self.rqdata.get_task_unihash(task),
+                'replaytasks' : sorted(taskname_from_tid(t) for t in replaytasks),
                 'quieterrors' : True,
                 'appends' : self.cooker.collections[mc].get_file_appends(taskfn),
                 'layername' : self.cooker.collections[mc].calc_bbfile_priority(realfn)[2],