diff options
| author | Chris Laplante <chris.laplante@agilent.com> | 2025-08-06 10:53:08 -0400 |
|---|---|---|
| committer | Richard Purdie <richard.purdie@linuxfoundation.org> | 2025-08-12 10:05:11 +0100 |
| commit | 6083700993c70f89f6fe66f84c9ad373085a6b53 (patch) | |
| tree | 73f4a50e5722003b362d1ea315b8eb9762388b67 /bitbake/lib | |
| parent | f4a8ddd6c80ff13cf5715d632e01fdc148e6b9e2 (diff) | |
| download | poky-6083700993c70f89f6fe66f84c9ad373085a6b53.tar.gz | |
bitbake: runqueue: use enum to represent runQueue state to improve readability
(Bitbake rev: e61265570f5415d647666891d806836437330219)
Signed-off-by: Chris Laplante <chris.laplante@agilent.com>
Signed-off-by: Richard Purdie <richard.purdie@linuxfoundation.org>
Diffstat (limited to 'bitbake/lib')
| -rw-r--r-- | bitbake/lib/bb/runqueue.py | 90 |
1 files changed, 46 insertions, 44 deletions
diff --git a/bitbake/lib/bb/runqueue.py b/bitbake/lib/bb/runqueue.py index f37a0a7062..63d4edd892 100644 --- a/bitbake/lib/bb/runqueue.py +++ b/bitbake/lib/bb/runqueue.py | |||
| @@ -10,6 +10,7 @@ Handles preparation and execution of a queue of tasks | |||
| 10 | # | 10 | # |
| 11 | 11 | ||
| 12 | import copy | 12 | import copy |
| 13 | import enum | ||
| 13 | import os | 14 | import os |
| 14 | import sys | 15 | import sys |
| 15 | import stat | 16 | import stat |
| @@ -125,15 +126,16 @@ class RunQueueStats: | |||
| 125 | def updateActiveSetscene(self, active): | 126 | def updateActiveSetscene(self, active): |
| 126 | self.setscene_active = active | 127 | self.setscene_active = active |
| 127 | 128 | ||
| 128 | # These values indicate the next step due to be run in the | 129 | |
| 129 | # runQueue state machine | 130 | # Indicates the next step due to run in the runQueue state machine |
| 130 | runQueuePrepare = 2 | 131 | class RunQueueState(enum.Enum): |
| 131 | runQueueSceneInit = 3 | 132 | PREPARE = 0 |
| 132 | runQueueDumpSigs = 4 | 133 | SCENE_INIT = 1 |
| 133 | runQueueRunning = 6 | 134 | DUMP_SIGS = 2 |
| 134 | runQueueFailed = 7 | 135 | RUNNING = 3 |
| 135 | runQueueCleanUp = 8 | 136 | FAILED = 4 |
| 136 | runQueueComplete = 9 | 137 | CLEAN_UP = 5 |
| 138 | COMPLETE = 6 | ||
| 137 | 139 | ||
| 138 | class RunQueueScheduler(object): | 140 | class RunQueueScheduler(object): |
| 139 | """ | 141 | """ |
| @@ -1337,13 +1339,13 @@ class RunQueue: | |||
| 1337 | self.hashvalidate = cfgData.getVar("BB_HASHCHECK_FUNCTION") or None | 1339 | self.hashvalidate = cfgData.getVar("BB_HASHCHECK_FUNCTION") or None |
| 1338 | self.depvalidate = cfgData.getVar("BB_SETSCENE_DEPVALID") or None | 1340 | self.depvalidate = cfgData.getVar("BB_SETSCENE_DEPVALID") or None |
| 1339 | 1341 | ||
| 1340 | self.state = runQueuePrepare | 1342 | self.state = RunQueueState.PREPARE |
| 1341 | 1343 | ||
| 1342 | # For disk space monitor | 1344 | # For disk space monitor |
| 1343 | # Invoked at regular time intervals via the bitbake heartbeat event | 1345 | # Invoked at regular time intervals via the bitbake heartbeat event |
| 1344 | # while the build is running. We generate a unique name for the handler | 1346 | # while the build is running. We generate a unique name for the handler |
| 1345 | # here, just in case that there ever is more than one RunQueue instance, | 1347 | # here, just in case that there ever is more than one RunQueue instance, |
| 1346 | # start the handler when reaching runQueueSceneInit, and stop it when | 1348 | # start the handler when reaching RunQueueState.SCENE_INIT, and stop it when |
| 1347 | # done with the build. | 1349 | # done with the build. |
| 1348 | self.dm = monitordisk.diskMonitor(cfgData) | 1350 | self.dm = monitordisk.diskMonitor(cfgData) |
| 1349 | self.dm_event_handler_name = '_bb_diskmonitor_' + str(id(self)) | 1351 | self.dm_event_handler_name = '_bb_diskmonitor_' + str(id(self)) |
| @@ -1557,7 +1559,7 @@ class RunQueue: | |||
| 1557 | retval = True | 1559 | retval = True |
| 1558 | bb.event.check_for_interrupts() | 1560 | bb.event.check_for_interrupts() |
| 1559 | 1561 | ||
| 1560 | if self.state is runQueuePrepare: | 1562 | if self.state == RunQueueState.PREPARE: |
| 1561 | # NOTE: if you add, remove or significantly refactor the stages of this | 1563 | # NOTE: if you add, remove or significantly refactor the stages of this |
| 1562 | # process then you should recalculate the weightings here. This is quite | 1564 | # process then you should recalculate the weightings here. This is quite |
| 1563 | # easy to do - just change the next line temporarily to pass debug=True as | 1565 | # easy to do - just change the next line temporarily to pass debug=True as |
| @@ -1568,12 +1570,12 @@ class RunQueue: | |||
| 1568 | "Initialising tasks", | 1570 | "Initialising tasks", |
| 1569 | [43, 967, 4, 3, 1, 5, 3, 7, 13, 1, 2, 1, 1, 246, 35, 1, 38, 1, 35, 2, 338, 204, 142, 3, 3, 37, 244]) | 1571 | [43, 967, 4, 3, 1, 5, 3, 7, 13, 1, 2, 1, 1, 246, 35, 1, 38, 1, 35, 2, 338, 204, 142, 3, 3, 37, 244]) |
| 1570 | if self.rqdata.prepare() == 0: | 1572 | if self.rqdata.prepare() == 0: |
| 1571 | self.state = runQueueComplete | 1573 | self.state = RunQueueState.COMPLETE |
| 1572 | else: | 1574 | else: |
| 1573 | self.state = runQueueSceneInit | 1575 | self.state = RunQueueState.SCENE_INIT |
| 1574 | bb.parse.siggen.save_unitaskhashes() | 1576 | bb.parse.siggen.save_unitaskhashes() |
| 1575 | 1577 | ||
| 1576 | if self.state is runQueueSceneInit: | 1578 | if self.state == RunQueueState.SCENE_INIT: |
| 1577 | self.rqdata.init_progress_reporter.next_stage() | 1579 | self.rqdata.init_progress_reporter.next_stage() |
| 1578 | 1580 | ||
| 1579 | # we are ready to run, emit dependency info to any UI or class which | 1581 | # we are ready to run, emit dependency info to any UI or class which |
| @@ -1584,7 +1586,7 @@ class RunQueue: | |||
| 1584 | 1586 | ||
| 1585 | if not self.dm_event_handler_registered: | 1587 | if not self.dm_event_handler_registered: |
| 1586 | res = bb.event.register(self.dm_event_handler_name, | 1588 | res = bb.event.register(self.dm_event_handler_name, |
| 1587 | lambda x, y: self.dm.check(self) if self.state in [runQueueRunning, runQueueCleanUp] else False, | 1589 | lambda x, y: self.dm.check(self) if self.state in [RunQueueState.RUNNING, RunQueueState.CLEAN_UP] else False, |
| 1588 | ('bb.event.HeartbeatEvent',), data=self.cfgData) | 1590 | ('bb.event.HeartbeatEvent',), data=self.cfgData) |
| 1589 | self.dm_event_handler_registered = True | 1591 | self.dm_event_handler_registered = True |
| 1590 | 1592 | ||
| @@ -1596,17 +1598,17 @@ class RunQueue: | |||
| 1596 | self.rqdata.init_progress_reporter.finish() | 1598 | self.rqdata.init_progress_reporter.finish() |
| 1597 | if 'printdiff' in dumpsigs: | 1599 | if 'printdiff' in dumpsigs: |
| 1598 | self.invalidtasks_dump = self.print_diffscenetasks() | 1600 | self.invalidtasks_dump = self.print_diffscenetasks() |
| 1599 | self.state = runQueueDumpSigs | 1601 | self.state = RunQueueState.DUMP_SIGS |
| 1600 | 1602 | ||
| 1601 | if self.state is runQueueDumpSigs: | 1603 | if self.state == RunQueueState.DUMP_SIGS: |
| 1602 | dumpsigs = self.cooker.configuration.dump_signatures | 1604 | dumpsigs = self.cooker.configuration.dump_signatures |
| 1603 | retval = self.dump_signatures(dumpsigs) | 1605 | retval = self.dump_signatures(dumpsigs) |
| 1604 | if retval is False: | 1606 | if retval is False: |
| 1605 | if 'printdiff' in dumpsigs: | 1607 | if 'printdiff' in dumpsigs: |
| 1606 | self.write_diffscenetasks(self.invalidtasks_dump) | 1608 | self.write_diffscenetasks(self.invalidtasks_dump) |
| 1607 | self.state = runQueueComplete | 1609 | self.state = RunQueueState.COMPLETE |
| 1608 | 1610 | ||
| 1609 | if self.state is runQueueSceneInit: | 1611 | if self.state == RunQueueState.SCENE_INIT: |
| 1610 | self.start_worker(self.rqexe) | 1612 | self.start_worker(self.rqexe) |
| 1611 | self.rqdata.init_progress_reporter.finish() | 1613 | self.rqdata.init_progress_reporter.finish() |
| 1612 | 1614 | ||
| @@ -1619,15 +1621,15 @@ class RunQueue: | |||
| 1619 | self.rqexe.tasks_notcovered.add(tid) | 1621 | self.rqexe.tasks_notcovered.add(tid) |
| 1620 | self.rqexe.sqdone = True | 1622 | self.rqexe.sqdone = True |
| 1621 | logger.info('Executing Tasks') | 1623 | logger.info('Executing Tasks') |
| 1622 | self.state = runQueueRunning | 1624 | self.state = RunQueueState.RUNNING |
| 1623 | 1625 | ||
| 1624 | if self.state is runQueueRunning: | 1626 | if self.state == RunQueueState.RUNNING: |
| 1625 | retval = self.rqexe.execute() | 1627 | retval = self.rqexe.execute() |
| 1626 | 1628 | ||
| 1627 | if self.state is runQueueCleanUp: | 1629 | if self.state == RunQueueState.CLEAN_UP: |
| 1628 | retval = self.rqexe.finish() | 1630 | retval = self.rqexe.finish() |
| 1629 | 1631 | ||
| 1630 | build_done = self.state is runQueueComplete or self.state is runQueueFailed | 1632 | build_done = self.state in [RunQueueState.COMPLETE, RunQueueState.FAILED] |
| 1631 | 1633 | ||
| 1632 | if build_done and self.dm_event_handler_registered: | 1634 | if build_done and self.dm_event_handler_registered: |
| 1633 | bb.event.remove(self.dm_event_handler_name, None, data=self.cfgData) | 1635 | bb.event.remove(self.dm_event_handler_name, None, data=self.cfgData) |
| @@ -1643,10 +1645,10 @@ class RunQueue: | |||
| 1643 | # Let's avoid the word "failed" if nothing actually did | 1645 | # Let's avoid the word "failed" if nothing actually did |
| 1644 | logger.info("Tasks Summary: Attempted %d tasks of which %d didn't need to be rerun and all succeeded.", self.rqexe.stats.completed, self.rqexe.stats.skipped) | 1646 | logger.info("Tasks Summary: Attempted %d tasks of which %d didn't need to be rerun and all succeeded.", self.rqexe.stats.completed, self.rqexe.stats.skipped) |
| 1645 | 1647 | ||
| 1646 | if self.state is runQueueFailed: | 1648 | if self.state == RunQueueState.FAILED: |
| 1647 | raise bb.runqueue.TaskFailure(self.rqexe.failed_tids) | 1649 | raise bb.runqueue.TaskFailure(self.rqexe.failed_tids) |
| 1648 | 1650 | ||
| 1649 | if self.state is runQueueComplete: | 1651 | if self.state == RunQueueState.COMPLETE: |
| 1650 | # All done | 1652 | # All done |
| 1651 | return False | 1653 | return False |
| 1652 | 1654 | ||
| @@ -1666,7 +1668,7 @@ class RunQueue: | |||
| 1666 | self.teardown_workers() | 1668 | self.teardown_workers() |
| 1667 | except: | 1669 | except: |
| 1668 | pass | 1670 | pass |
| 1669 | self.state = runQueueComplete | 1671 | self.state = RunQueueState.COMPLETE |
| 1670 | raise | 1672 | raise |
| 1671 | except Exception as err: | 1673 | except Exception as err: |
| 1672 | logger.exception("An uncaught exception occurred in runqueue") | 1674 | logger.exception("An uncaught exception occurred in runqueue") |
| @@ -1674,12 +1676,12 @@ class RunQueue: | |||
| 1674 | self.teardown_workers() | 1676 | self.teardown_workers() |
| 1675 | except: | 1677 | except: |
| 1676 | pass | 1678 | pass |
| 1677 | self.state = runQueueComplete | 1679 | self.state = RunQueueState.COMPLETE |
| 1678 | raise | 1680 | raise |
| 1679 | 1681 | ||
| 1680 | def finish_runqueue(self, now = False): | 1682 | def finish_runqueue(self, now = False): |
| 1681 | if not self.rqexe: | 1683 | if not self.rqexe: |
| 1682 | self.state = runQueueComplete | 1684 | self.state = RunQueueState.COMPLETE |
| 1683 | return | 1685 | return |
| 1684 | 1686 | ||
| 1685 | if now: | 1687 | if now: |
| @@ -2002,14 +2004,14 @@ class RunQueueExecute: | |||
| 2002 | pass | 2004 | pass |
| 2003 | 2005 | ||
| 2004 | if self.failed_tids: | 2006 | if self.failed_tids: |
| 2005 | self.rq.state = runQueueFailed | 2007 | self.rq.state = RunQueueState.FAILED |
| 2006 | return | 2008 | return |
| 2007 | 2009 | ||
| 2008 | self.rq.state = runQueueComplete | 2010 | self.rq.state = RunQueueState.COMPLETE |
| 2009 | return | 2011 | return |
| 2010 | 2012 | ||
| 2011 | def finish(self): | 2013 | def finish(self): |
| 2012 | self.rq.state = runQueueCleanUp | 2014 | self.rq.state = RunQueueState.CLEAN_UP |
| 2013 | 2015 | ||
| 2014 | active = self.stats.active + len(self.sq_live) | 2016 | active = self.stats.active + len(self.sq_live) |
| 2015 | if active > 0: | 2017 | if active > 0: |
| @@ -2018,10 +2020,10 @@ class RunQueueExecute: | |||
| 2018 | return self.rq.active_fds() | 2020 | return self.rq.active_fds() |
| 2019 | 2021 | ||
| 2020 | if self.failed_tids: | 2022 | if self.failed_tids: |
| 2021 | self.rq.state = runQueueFailed | 2023 | self.rq.state = RunQueueState.FAILED |
| 2022 | return True | 2024 | return True |
| 2023 | 2025 | ||
| 2024 | self.rq.state = runQueueComplete | 2026 | self.rq.state = RunQueueState.COMPLETE |
| 2025 | return True | 2027 | return True |
| 2026 | 2028 | ||
| 2027 | # Used by setscene only | 2029 | # Used by setscene only |
| @@ -2140,7 +2142,7 @@ class RunQueueExecute: | |||
| 2140 | bb.event.fire(runQueueTaskFailed(task, self.stats, exitcode, self.rq, fakeroot_log=("".join(fakeroot_log) or None)), self.cfgData) | 2142 | bb.event.fire(runQueueTaskFailed(task, self.stats, exitcode, self.rq, fakeroot_log=("".join(fakeroot_log) or None)), self.cfgData) |
| 2141 | 2143 | ||
| 2142 | if self.rqdata.taskData[''].halt: | 2144 | if self.rqdata.taskData[''].halt: |
| 2143 | self.rq.state = runQueueCleanUp | 2145 | self.rq.state = RunQueueState.CLEAN_UP |
| 2144 | 2146 | ||
| 2145 | def task_skip(self, task, reason): | 2147 | def task_skip(self, task, reason): |
| 2146 | self.runq_running.add(task) | 2148 | self.runq_running.add(task) |
| @@ -2334,17 +2336,17 @@ class RunQueueExecute: | |||
| 2334 | 2336 | ||
| 2335 | err = self.summarise_scenequeue_errors() | 2337 | err = self.summarise_scenequeue_errors() |
| 2336 | if err: | 2338 | if err: |
| 2337 | self.rq.state = runQueueFailed | 2339 | self.rq.state = RunQueueState.FAILED |
| 2338 | return True | 2340 | return True |
| 2339 | 2341 | ||
| 2340 | if self.cooker.configuration.setsceneonly: | 2342 | if self.cooker.configuration.setsceneonly: |
| 2341 | self.rq.state = runQueueComplete | 2343 | self.rq.state = RunQueueState.COMPLETE |
| 2342 | return True | 2344 | return True |
| 2343 | self.sqdone = True | 2345 | self.sqdone = True |
| 2344 | 2346 | ||
| 2345 | if self.stats.total == 0: | 2347 | if self.stats.total == 0: |
| 2346 | # nothing to do | 2348 | # nothing to do |
| 2347 | self.rq.state = runQueueComplete | 2349 | self.rq.state = RunQueueState.COMPLETE |
| 2348 | return True | 2350 | return True |
| 2349 | 2351 | ||
| 2350 | if self.cooker.configuration.setsceneonly: | 2352 | if self.cooker.configuration.setsceneonly: |
| @@ -2411,7 +2413,7 @@ class RunQueueExecute: | |||
| 2411 | self.rq.start_fakeworker(self, mc) | 2413 | self.rq.start_fakeworker(self, mc) |
| 2412 | except OSError as exc: | 2414 | except OSError as exc: |
| 2413 | logger.critical("Failed to spawn fakeroot worker to run %s: %s" % (task, str(exc))) | 2415 | logger.critical("Failed to spawn fakeroot worker to run %s: %s" % (task, str(exc))) |
| 2414 | self.rq.state = runQueueFailed | 2416 | self.rq.state = RunQueueState.FAILED |
| 2415 | self.stats.taskFailed() | 2417 | self.stats.taskFailed() |
| 2416 | return True | 2418 | return True |
| 2417 | RunQueue.send_pickled_data(self.rq.fakeworker[mc].process, runtask, "runtask") | 2419 | RunQueue.send_pickled_data(self.rq.fakeworker[mc].process, runtask, "runtask") |
| @@ -2439,7 +2441,7 @@ class RunQueueExecute: | |||
| 2439 | return True | 2441 | return True |
| 2440 | 2442 | ||
| 2441 | if self.failed_tids: | 2443 | if self.failed_tids: |
| 2442 | self.rq.state = runQueueFailed | 2444 | self.rq.state = RunQueueState.FAILED |
| 2443 | return True | 2445 | return True |
| 2444 | 2446 | ||
| 2445 | # Sanity Checks | 2447 | # Sanity Checks |
| @@ -2456,9 +2458,9 @@ class RunQueueExecute: | |||
| 2456 | err = True | 2458 | err = True |
| 2457 | 2459 | ||
| 2458 | if err: | 2460 | if err: |
| 2459 | self.rq.state = runQueueFailed | 2461 | self.rq.state = RunQueueState.FAILED |
| 2460 | else: | 2462 | else: |
| 2461 | self.rq.state = runQueueComplete | 2463 | self.rq.state = RunQueueState.COMPLETE |
| 2462 | 2464 | ||
| 2463 | return True | 2465 | return True |
| 2464 | 2466 | ||
| @@ -2688,7 +2690,7 @@ class RunQueueExecute: | |||
| 2688 | if dep in self.runq_complete and dep not in self.runq_tasksrun: | 2690 | if dep in self.runq_complete and dep not in self.runq_tasksrun: |
| 2689 | bb.error("Task %s marked as completed but now needing to rerun? Halting build." % dep) | 2691 | bb.error("Task %s marked as completed but now needing to rerun? Halting build." % dep) |
| 2690 | self.failed_tids.append(tid) | 2692 | self.failed_tids.append(tid) |
| 2691 | self.rq.state = runQueueCleanUp | 2693 | self.rq.state = RunQueueState.CLEAN_UP |
| 2692 | return | 2694 | return |
| 2693 | 2695 | ||
| 2694 | if dep not in self.runq_complete: | 2696 | if dep not in self.runq_complete: |
| @@ -2823,7 +2825,7 @@ class RunQueueExecute: | |||
| 2823 | pn = self.rqdata.dataCaches[mc].pkg_fn[taskfn] | 2825 | pn = self.rqdata.dataCaches[mc].pkg_fn[taskfn] |
| 2824 | if not check_setscene_enforce_ignore_tasks(pn, taskname, self.rqdata.setscene_ignore_tasks): | 2826 | if not check_setscene_enforce_ignore_tasks(pn, taskname, self.rqdata.setscene_ignore_tasks): |
| 2825 | logger.error('Task %s.%s failed' % (pn, taskname + "_setscene")) | 2827 | logger.error('Task %s.%s failed' % (pn, taskname + "_setscene")) |
| 2826 | self.rq.state = runQueueCleanUp | 2828 | self.rq.state = RunQueueState.CLEAN_UP |
| 2827 | 2829 | ||
| 2828 | def sq_task_complete(self, task): | 2830 | def sq_task_complete(self, task): |
| 2829 | bb.event.fire(sceneQueueTaskCompleted(task, self.stats, self.rq), self.cfgData) | 2831 | bb.event.fire(sceneQueueTaskCompleted(task, self.stats, self.rq), self.cfgData) |
