summaryrefslogtreecommitdiffstats
path: root/bitbake
diff options
context:
space:
mode:
authorRichard Purdie <richard.purdie@linuxfoundation.org>2014-04-01 09:16:30 +0100
committerRichard Purdie <richard.purdie@linuxfoundation.org>2014-04-01 10:21:30 +0100
commitcd8541bbfc750d6e46b901a81bcc5636390f6122 (patch)
treed1d9a224da5deeb6b62a26a8fa203d456832a906 /bitbake
parentd67f25da2d1acb8f5c833dad7a2c1fc710261d6c (diff)
downloadpoky-cd8541bbfc750d6e46b901a81bcc5636390f6122.tar.gz
bitbake: runqueue: Address issues with incomplete sstate sets
The first part of the sstate code checks en-mass whether given checksums are available. The next part of the code then either triggers those setscene tasks either running them or skipping them if they've been covered by others. The problems was that this second part would always skip a task if it was unavailable in the first part, even if it would have otherwise been covered by other tasks. This mean the mere presence of an artefact (or lack of presence) could cause a different build failure. The issue reproduces if you run a build and populate an sstate feed, then run a second build off that feed, then run a third build off the sstate feed of the second build (which is reduced in size). The fix is rather than immediately skipping tasks if the checksum is unavailable, create a list of missing tasks, then, if that task cannot be covered by others we can skip it later. The deferral makes the behaviour the same even when the cache is "incomplete". [YOCTO #6081] (Bitbake rev: 5edb1a3e3f454ba6e65551174d86229db2f99636) Signed-off-by: Richard Purdie <richard.purdie@linuxfoundation.org>
Diffstat (limited to 'bitbake')
-rw-r--r--bitbake/lib/bb/runqueue.py6
1 files changed, 5 insertions, 1 deletions
diff --git a/bitbake/lib/bb/runqueue.py b/bitbake/lib/bb/runqueue.py
index 1a19677892..6372b65fd9 100644
--- a/bitbake/lib/bb/runqueue.py
+++ b/bitbake/lib/bb/runqueue.py
@@ -1779,6 +1779,7 @@ class RunQueueExecuteScenequeue(RunQueueExecute):
1779 if len(self.sq_revdeps[task]) == 0: 1779 if len(self.sq_revdeps[task]) == 0:
1780 self.runq_buildable[task] = 1 1780 self.runq_buildable[task] = 1
1781 1781
1782 self.outrightfail = []
1782 if self.rq.hashvalidate: 1783 if self.rq.hashvalidate:
1783 sq_hash = [] 1784 sq_hash = []
1784 sq_hashfn = [] 1785 sq_hashfn = []
@@ -1829,7 +1830,7 @@ class RunQueueExecuteScenequeue(RunQueueExecute):
1829 realtask = self.rqdata.runq_setscene[task] 1830 realtask = self.rqdata.runq_setscene[task]
1830 logger.debug(2, 'No package found, so skipping setscene task %s', 1831 logger.debug(2, 'No package found, so skipping setscene task %s',
1831 self.rqdata.get_user_idstring(realtask)) 1832 self.rqdata.get_user_idstring(realtask))
1832 self.task_failoutright(task) 1833 self.outrightfail.append(task)
1833 1834
1834 logger.info('Executing SetScene Tasks') 1835 logger.info('Executing SetScene Tasks')
1835 1836
@@ -1914,6 +1915,9 @@ class RunQueueExecuteScenequeue(RunQueueExecute):
1914 self.task_skip(nexttask) 1915 self.task_skip(nexttask)
1915 self.scenequeue_notneeded.add(nexttask) 1916 self.scenequeue_notneeded.add(nexttask)
1916 return True 1917 return True
1918 if nexttask in self.outrightfail:
1919 self.task_failoutright(nexttask)
1920 return True
1917 task = nexttask 1921 task = nexttask
1918 break 1922 break
1919 if task is not None: 1923 if task is not None: