* [PATCH 1/7] bitbake/runqueue: rework 'bitbake -S printdiff' logic
@ 2023-12-18 8:43 Alexander Kanavin
2023-12-18 8:43 ` [PATCH 2/7] selftest/sstatetests: fix up printdiff test to match rework of printdiff logic Alexander Kanavin
` (5 more replies)
0 siblings, 6 replies; 13+ messages in thread
From: Alexander Kanavin @ 2023-12-18 8:43 UTC (permalink / raw)
To: openembedded-core; +Cc: Alexander Kanavin
Previously printdiff code would iterate over tasks that were reported as invalid or absent,
trying to follow dependency chains that would reach the most basic invalid items in the tree.
While this works in tightly controlled local builds, it can lead to bizarre reports
against industrial-sized sstate caches, as the code would not consider whether the
overall target can be fulfilled from valid sstate objects, and instead report
missing sstate signature files that perhaps were never even created due to hash
equivalency providing shortcuts in builds.
This commit reworks the logic in two ways:
- start the iteration over final targets rather than missing objects
and try to recursively arrive at the root of the invalid object dependency.
A previous version of this patch relied relies on finding the most 'recent'
signature in stamps or sstate in a different function later, and recursively
comparing that to the current signature, which is unreliable on real world caches.
- if a given object can be fulfilled from sstate, recurse only into
its setscene dependencies; bitbake wouldn't care if dependencies
for the actual task are absent, and neither should printdiff
I wrote a recursive function for following dependencies, as
doing recursive algorithms non-recursively can result in write-only
code, as was the case here.
[YOCTO #15289]
Signed-off-by: Alexander Kanavin <alex@linutronix.de>
---
bitbake/lib/bb/runqueue.py | 41 ++++++++++++++++++++++++--------------
1 file changed, 26 insertions(+), 15 deletions(-)
diff --git a/bitbake/lib/bb/runqueue.py b/bitbake/lib/bb/runqueue.py
index 24497c5c173..f54d9b85541 100644
--- a/bitbake/lib/bb/runqueue.py
+++ b/bitbake/lib/bb/runqueue.py
@@ -1685,6 +1685,17 @@ class RunQueue:
return
def print_diffscenetasks(self):
+ def get_root_invalid_tasks(task, taskdepends, valid, noexec, visited_invalid):
+ invalidtasks = []
+ for t in taskdepends[task].depends:
+ if t not in valid and t not in visited_invalid:
+ invalidtasks.extend(get_root_invalid_tasks(t, taskdepends, valid, noexec, visited_invalid))
+ visited_invalid.add(t)
+
+ direct_invalid = [t for t in taskdepends[task].depends if t not in valid]
+ if not direct_invalid and task not in noexec:
+ invalidtasks = [task]
+ return invalidtasks
noexec = []
tocheck = set()
@@ -1718,35 +1729,35 @@ class RunQueue:
valid_new.add(dep)
invalidtasks = set()
- for tid in self.rqdata.runtaskentries:
- if tid not in valid_new and tid not in noexec:
- invalidtasks.add(tid)
- found = set()
- processed = set()
- for tid in invalidtasks:
+ toptasks = set(["{}:{}".format(t[3], t[2]) for t in self.rqdata.targets])
+ for tid in toptasks:
toprocess = set([tid])
while toprocess:
next = set()
+ visited_invalid = set()
for t in toprocess:
- for dep in self.rqdata.runtaskentries[t].depends:
- if dep in invalidtasks:
- found.add(tid)
- if dep not in processed:
- processed.add(dep)
+ if t not in valid_new and t not in noexec:
+ invalidtasks.update(get_root_invalid_tasks(t, self.rqdata.runtaskentries, valid_new, noexec, visited_invalid))
+ continue
+ if t in self.rqdata.runq_setscene_tids:
+ for dep in self.rqexe.sqdata.sq_deps[t]:
next.add(dep)
+ continue
+
+ for dep in self.rqdata.runtaskentries[t].depends:
+ next.add(dep)
+
toprocess = next
- if tid in found:
- toprocess = set()
tasklist = []
- for tid in invalidtasks.difference(found):
+ for tid in invalidtasks:
tasklist.append(tid)
if tasklist:
bb.plain("The differences between the current build and any cached tasks start at the following tasks:\n" + "\n".join(tasklist))
- return invalidtasks.difference(found)
+ return invalidtasks
def write_diffscenetasks(self, invalidtasks):
--
2.39.2
^ permalink raw reply related [flat|nested] 13+ messages in thread
* [PATCH 2/7] selftest/sstatetests: fix up printdiff test to match rework of printdiff logic
2023-12-18 8:43 [PATCH 1/7] bitbake/runqueue: rework 'bitbake -S printdiff' logic Alexander Kanavin
@ 2023-12-18 8:43 ` Alexander Kanavin
2024-01-01 13:00 ` [OE-core] " Alexandre Belloni
2023-12-18 8:43 ` [PATCH 3/7] sstatesig/find_siginfo: unify a disjointed API Alexander Kanavin
` (4 subsequent siblings)
5 siblings, 1 reply; 13+ messages in thread
From: Alexander Kanavin @ 2023-12-18 8:43 UTC (permalink / raw)
To: openembedded-core; +Cc: Alexander Kanavin
Other than the formatting changes, there are two functional ones:
- use perlcross instead of quilt, as quilt is special in the sense
of being excluded from task hash calculcations. perlcross is a full
participant.
- run the full test (local + sstate) for gcc do_preconfiure change
as the necessary fix has been implemented
(sstatesig/find_siginfo: special-case gcc-source when looking in sstate caches)
Note that when several tasks are found to have changed (as is the case
when base do_configure is adjusted), find_siginfo() runs
glob.glob("*/*/*taskname*") against autobuilder sstate cache for each
of those tasks (six or seven times). This is an expensive operation
taking several minutes. I left it in for now, but if it's proven too slow
the test would have to be reduced to checking a specific base recipe
(e.g. zstd-native) rather than a distant image target.
[YOCTO #15289]
Signed-off-by: Alexander Kanavin <alex@linutronix.de>
---
.../perlcross_%.bbappend} | 0
meta/lib/oeqa/selftest/cases/sstatetests.py | 22 +++++++++++--------
2 files changed, 13 insertions(+), 9 deletions(-)
rename meta-selftest/recipes-test/{quilt-native/quilt-native_%.bbappend => perlcross/perlcross_%.bbappend} (100%)
diff --git a/meta-selftest/recipes-test/quilt-native/quilt-native_%.bbappend b/meta-selftest/recipes-test/perlcross/perlcross_%.bbappend
similarity index 100%
rename from meta-selftest/recipes-test/quilt-native/quilt-native_%.bbappend
rename to meta-selftest/recipes-test/perlcross/perlcross_%.bbappend
diff --git a/meta/lib/oeqa/selftest/cases/sstatetests.py b/meta/lib/oeqa/selftest/cases/sstatetests.py
index f827615ba1b..6af3c8f2178 100644
--- a/meta/lib/oeqa/selftest/cases/sstatetests.py
+++ b/meta/lib/oeqa/selftest/cases/sstatetests.py
@@ -824,14 +824,16 @@ TMPDIR = "${{TOPDIR}}/tmp-sstateprintdiff-difftmp-{}"
# Check if printdiff walks the full dependency chain from the image target to where the change is in a specific recipe
- def test_image_minimal_vs_quilt(self):
- expected_output = ("Task quilt-native:do_install couldn't be used from the cache because:",
+ def test_image_minimal_vs_perlcross(self):
+ expected_output = ("Task perlcross-native:do_install couldn't be used from the cache because:",
"We need hash",
"most recent matching task was")
- expected_sametmp_output = expected_output + ("Variable do_install value changed",'+ echo "this changes the task signature"')
+ expected_sametmp_output = expected_output + (
+"Variable do_install value changed",
+'+ echo "this changes the task signature"')
expected_difftmp_output = expected_output
- self.run_test_printdiff_changerecipe("core-image-minimal", "quilt-native", "-c do_install quilt-native",
+ self.run_test_printdiff_changerecipe("core-image-minimal", "perlcross", "-c do_install perlcross-native",
"""
do_install:append() {
echo "this changes the task signature"
@@ -846,10 +848,10 @@ expected_sametmp_output, expected_difftmp_output)
expected_output = ("Task {}:do_preconfigure couldn't be used from the cache because:".format(gcc_source_pn),
"We need hash",
"most recent matching task was")
- expected_sametmp_output = expected_output + ("Variable do_preconfigure value changed",'+ print("this changes the task signature")')
- #FIXME: printdiff is supposed to find at least one preconfigure task signature in the sstate cache, but isn't able to
- #expected_difftmp_output = expected_output
- expected_difftmp_output = ()
+ expected_sametmp_output = expected_output + (
+"Variable do_preconfigure value changed",
+'+ print("this changes the task signature")')
+ expected_difftmp_output = expected_output
self.run_test_printdiff_changerecipe("gcc-runtime", "gcc-source", "-c do_preconfigure {}".format(gcc_source_pn),
"""
@@ -873,7 +875,9 @@ expected_sametmp_output, expected_difftmp_output)
"Task gnu-config-native:do_configure couldn't be used from the cache because:",
"We need hash",
"most recent matching task was")
- expected_sametmp_output = expected_output + ("Variable base_do_configure value changed",'+ echo "this changes base_do_configure() definiton "')
+ expected_sametmp_output = expected_output + (
+"Variable base_do_configure value changed",
+'+ echo "this changes base_do_configure() definiton "')
expected_difftmp_output = expected_output
self.run_test_printdiff_changeconfig("core-image-minimal",
--
2.39.2
^ permalink raw reply related [flat|nested] 13+ messages in thread
* [PATCH 3/7] sstatesig/find_siginfo: unify a disjointed API
2023-12-18 8:43 [PATCH 1/7] bitbake/runqueue: rework 'bitbake -S printdiff' logic Alexander Kanavin
2023-12-18 8:43 ` [PATCH 2/7] selftest/sstatetests: fix up printdiff test to match rework of printdiff logic Alexander Kanavin
@ 2023-12-18 8:43 ` Alexander Kanavin
2024-01-05 11:22 ` [OE-core] " Richard Purdie
2023-12-18 8:44 ` [PATCH 4/7] bitbake-diffsigs/runqueue: adapt to reworked find_siginfo() Alexander Kanavin
` (3 subsequent siblings)
5 siblings, 1 reply; 13+ messages in thread
From: Alexander Kanavin @ 2023-12-18 8:43 UTC (permalink / raw)
To: openembedded-core; +Cc: Alexander Kanavin
find_siginfo() returns two different data structures depending
on whether its third argument (list of hashes to find) is empty or
not:
- a dict of timestamps keyed by path
- a dict of paths keyed by hash
This is not a good API design; it's much better to return
a dict of dicts that include both timestamp and path, keyed by
hash. Then the API consumer can decide how they want to use these
fields, particularly for additional diagnostics or informational
output.
I also took the opportunity to add a binary field that
tells if the match came from sstate or local stamps dir, which
will help prioritize local stamps when looking up most
recent task signatures.
Signed-off-by: Alexander Kanavin <alex@linutronix.de>
---
meta/lib/oe/buildhistory_analysis.py | 2 +-
meta/lib/oe/sstatesig.py | 31 +++++++++------------
meta/lib/oeqa/selftest/cases/sstatetests.py | 10 +++----
3 files changed, 19 insertions(+), 24 deletions(-)
diff --git a/meta/lib/oe/buildhistory_analysis.py b/meta/lib/oe/buildhistory_analysis.py
index b1856846b6a..4edad01580c 100644
--- a/meta/lib/oe/buildhistory_analysis.py
+++ b/meta/lib/oe/buildhistory_analysis.py
@@ -562,7 +562,7 @@ def compare_siglists(a_blob, b_blob, taskdiff=False):
elif not hash2 in hashfiles:
out.append("Unable to find matching sigdata for %s with hash %s" % (desc, hash2))
else:
- out2 = bb.siggen.compare_sigfiles(hashfiles[hash1], hashfiles[hash2], recursecb, collapsed=True)
+ out2 = bb.siggen.compare_sigfiles(hashfiles[hash1]['path'], hashfiles[hash2]['path'], recursecb, collapsed=True)
for line in out2:
m = hashlib.sha256()
m.update(line.encode('utf-8'))
diff --git a/meta/lib/oe/sstatesig.py b/meta/lib/oe/sstatesig.py
index 8a97fb0c04b..0342bcdc87a 100644
--- a/meta/lib/oe/sstatesig.py
+++ b/meta/lib/oe/sstatesig.py
@@ -349,7 +349,6 @@ def find_siginfo(pn, taskname, taskhashlist, d):
pn, taskname = key.split(':', 1)
hashfiles = {}
- filedates = {}
def get_hashval(siginfo):
if siginfo.endswith('.siginfo'):
@@ -357,6 +356,12 @@ def find_siginfo(pn, taskname, taskhashlist, d):
else:
return siginfo.rpartition('.')[2]
+ def get_time(fullpath):
+ try:
+ return os.stat(fullpath).st_mtime
+ except OSError:
+ return None
+
# First search in stamps dir
localdata = d.createCopy()
localdata.setVar('MULTIMACH_TARGET_SYS', '*')
@@ -372,24 +377,21 @@ def find_siginfo(pn, taskname, taskhashlist, d):
filespec = '%s.%s.sigdata.*' % (stamp, taskname)
foundall = False
import glob
+ bb.debug(1, "Calling glob.glob on {}".format(filespec))
for fullpath in glob.glob(filespec):
match = False
if taskhashlist:
for taskhash in taskhashlist:
if fullpath.endswith('.%s' % taskhash):
- hashfiles[taskhash] = fullpath
+ hashfiles[taskhash] = {'path':fullpath, 'sstate':False, 'time':get_time(fullpath)}
if len(hashfiles) == len(taskhashlist):
foundall = True
break
else:
- try:
- filedates[fullpath] = os.stat(fullpath).st_mtime
- except OSError:
- continue
hashval = get_hashval(fullpath)
- hashfiles[hashval] = fullpath
+ hashfiles[hashval] = {'path':fullpath, 'sstate':False, 'time':get_time(fullpath)}
- if not taskhashlist or (len(filedates) < 2 and not foundall):
+ if not taskhashlist or (len(hashfiles) < 2 and not foundall):
# That didn't work, look in sstate-cache
hashes = taskhashlist or ['?' * 64]
localdata = bb.data.createCopy(d)
@@ -412,22 +414,15 @@ def find_siginfo(pn, taskname, taskhashlist, d):
localdata.setVar('SSTATE_EXTRAPATH', "${NATIVELSBSTRING}/")
filespec = '%s.siginfo' % localdata.getVar('SSTATE_PKG')
+ bb.debug(1, "Calling glob.glob on {}".format(filespec))
matchedfiles = glob.glob(filespec)
for fullpath in matchedfiles:
actual_hashval = get_hashval(fullpath)
if actual_hashval in hashfiles:
continue
- hashfiles[hashval] = fullpath
- if not taskhashlist:
- try:
- filedates[fullpath] = os.stat(fullpath).st_mtime
- except:
- continue
+ hashfiles[actual_hashval] = {'path':fullpath, 'sstate':True, 'time':get_time(fullpath)}
- if taskhashlist:
- return hashfiles
- else:
- return filedates
+ return hashfiles
bb.siggen.find_siginfo = find_siginfo
diff --git a/meta/lib/oeqa/selftest/cases/sstatetests.py b/meta/lib/oeqa/selftest/cases/sstatetests.py
index 6af3c8f2178..6da3ef3ca77 100644
--- a/meta/lib/oeqa/selftest/cases/sstatetests.py
+++ b/meta/lib/oeqa/selftest/cases/sstatetests.py
@@ -765,14 +765,14 @@ addtask tmptask2 before do_tmptask1
hashes = [hash1, hash2]
hashfiles = find_siginfo(key, None, hashes)
self.assertCountEqual(hashes, hashfiles)
- bb.siggen.compare_sigfiles(hashfiles[hash1], hashfiles[hash2], recursecb)
+ bb.siggen.compare_sigfiles(hashfiles[hash1]['path'], hashfiles[hash2]['path'], recursecb)
for pn in pns:
recursecb_count = 0
- filedates = find_siginfo(pn, "do_tmptask1")
- self.assertGreaterEqual(len(filedates), 2)
- latestfiles = sorted(filedates.keys(), key=lambda f: filedates[f])[-2:]
- bb.siggen.compare_sigfiles(latestfiles[-2], latestfiles[-1], recursecb)
+ matches = find_siginfo(pn, "do_tmptask1")
+ self.assertGreaterEqual(len(matches), 2)
+ latesthashes = sorted(matches.keys(), key=lambda h: matches[h]['time'])[-2:]
+ bb.siggen.compare_sigfiles(matches[latesthashes[-2]]['path'], matches[latesthashes[-1]]['path'], recursecb)
self.assertEqual(recursecb_count,1)
class SStatePrintdiff(SStateBase):
--
2.39.2
^ permalink raw reply related [flat|nested] 13+ messages in thread
* [PATCH 4/7] bitbake-diffsigs/runqueue: adapt to reworked find_siginfo()
2023-12-18 8:43 [PATCH 1/7] bitbake/runqueue: rework 'bitbake -S printdiff' logic Alexander Kanavin
2023-12-18 8:43 ` [PATCH 2/7] selftest/sstatetests: fix up printdiff test to match rework of printdiff logic Alexander Kanavin
2023-12-18 8:43 ` [PATCH 3/7] sstatesig/find_siginfo: unify a disjointed API Alexander Kanavin
@ 2023-12-18 8:44 ` Alexander Kanavin
2023-12-18 8:44 ` [PATCH 5/7] bitbake/runqueue: prioritize local stamps over sstate signatures in printdiff Alexander Kanavin
` (2 subsequent siblings)
5 siblings, 0 replies; 13+ messages in thread
From: Alexander Kanavin @ 2023-12-18 8:44 UTC (permalink / raw)
To: openembedded-core; +Cc: Alexander Kanavin
In particular having 'time' explicitly used as a sorting key should make it
more clear how the entries are being sorted.
Signed-off-by: Alexander Kanavin <alex@linutronix.de>
---
bitbake/bin/bitbake-diffsigs | 11 +++++++----
bitbake/lib/bb/runqueue.py | 10 +++++-----
2 files changed, 12 insertions(+), 9 deletions(-)
diff --git a/bitbake/bin/bitbake-diffsigs b/bitbake/bin/bitbake-diffsigs
index fe0f33eea17..a8f49191b0c 100755
--- a/bitbake/bin/bitbake-diffsigs
+++ b/bitbake/bin/bitbake-diffsigs
@@ -72,13 +72,16 @@ def find_siginfo_task(bbhandler, pn, taskname, sig1=None, sig2=None):
elif sig2 not in sigfiles:
logger.error('No sigdata files found matching %s %s with signature %s' % (pn, taskname, sig2))
sys.exit(1)
- latestfiles = [sigfiles[sig1], sigfiles[sig2]]
else:
- filedates = find_siginfo(bbhandler, pn, taskname)
- latestfiles = sorted(filedates.keys(), key=lambda f: filedates[f])[-2:]
- if not latestfiles:
+ sigfiles = find_siginfo(bbhandler, pn, taskname)
+ latestsigs = sorted(sigfiles.keys(), key=lambda h: sigfiles[h]['time'])[-2:]
+ if not latestsigs:
logger.error('No sigdata files found matching %s %s' % (pn, taskname))
sys.exit(1)
+ sig1 = latestsigs[0]
+ sig2 = latestsigs[1]
+
+ latestfiles = [sigfiles[sig1]['path'], sigfiles[sig2]['path']]
return latestfiles
diff --git a/bitbake/lib/bb/runqueue.py b/bitbake/lib/bb/runqueue.py
index f54d9b85541..72d2feab27a 100644
--- a/bitbake/lib/bb/runqueue.py
+++ b/bitbake/lib/bb/runqueue.py
@@ -1768,7 +1768,7 @@ class RunQueue:
recout = []
if len(hashfiles) == 2:
- out2 = bb.siggen.compare_sigfiles(hashfiles[hash1], hashfiles[hash2], recursecb)
+ out2 = bb.siggen.compare_sigfiles(hashfiles[hash1]['path'], hashfiles[hash2]['path'], recursecb)
recout.extend(list(' ' + l for l in out2))
else:
recout.append("Unable to find matching sigdata for %s with hashes %s or %s" % (key, hash1, hash2))
@@ -1782,14 +1782,14 @@ class RunQueue:
h = self.rqdata.runtaskentries[tid].unihash
matches = bb.siggen.find_siginfo(pn, taskname, [], self.cooker.databuilder.mcdata[mc])
match = None
- for m in matches:
- if h in m:
- match = m
+ for m in matches.values():
+ if h in m['path']:
+ match = m['path']
if match is None:
bb.fatal("Can't find a task we're supposed to have written out? (hash: %s tid: %s)?" % (h, tid))
matches = {k : v for k, v in iter(matches.items()) if h not in k}
if matches:
- latestmatch = sorted(matches.keys(), key=lambda f: matches[f])[-1]
+ latestmatch = matches[sorted(matches.keys(), key=lambda h: matches[h]['time'])[-1]]['path']
prevh = __find_sha256__.search(latestmatch).group(0)
output = bb.siggen.compare_sigfiles(latestmatch, match, recursecb)
bb.plain("\nTask %s:%s couldn't be used from the cache because:\n We need hash %s, most recent matching task was %s\n " % (pn, taskname, h, prevh) + '\n '.join(output))
--
2.39.2
^ permalink raw reply related [flat|nested] 13+ messages in thread
* [PATCH 5/7] bitbake/runqueue: prioritize local stamps over sstate signatures in printdiff
2023-12-18 8:43 [PATCH 1/7] bitbake/runqueue: rework 'bitbake -S printdiff' logic Alexander Kanavin
` (2 preceding siblings ...)
2023-12-18 8:44 ` [PATCH 4/7] bitbake-diffsigs/runqueue: adapt to reworked find_siginfo() Alexander Kanavin
@ 2023-12-18 8:44 ` Alexander Kanavin
2023-12-18 8:44 ` [PATCH 6/7] bitbake/runqueue: add debugging for find_siginfo() calls Alexander Kanavin
2023-12-18 8:44 ` [PATCH 7/7] selftest/sstatetest: re-enable gcc printdiff test Alexander Kanavin
5 siblings, 0 replies; 13+ messages in thread
From: Alexander Kanavin @ 2023-12-18 8:44 UTC (permalink / raw)
To: openembedded-core; +Cc: Alexander Kanavin
Even with the reworked printdiff code, sstate which is heavily used in parallel
can throw races at the tests: if a new matching, but otherwise unrelated
sstate signature appears between writing out local stamps and listing
matching sstate files, then that signature will be deemed 'the latest'
and the actual local stamp will be discarded. This change ensures
the scenario does not happen.
It also makes use of the reworked find_siginfo(), particularly the 'sstate'
entry in returned results.
Signed-off-by: Alexander Kanavin <alex@linutronix.de>
---
bitbake/lib/bb/runqueue.py | 3 +++
1 file changed, 3 insertions(+)
diff --git a/bitbake/lib/bb/runqueue.py b/bitbake/lib/bb/runqueue.py
index 72d2feab27a..0fc26ccdf88 100644
--- a/bitbake/lib/bb/runqueue.py
+++ b/bitbake/lib/bb/runqueue.py
@@ -1788,6 +1788,9 @@ class RunQueue:
if match is None:
bb.fatal("Can't find a task we're supposed to have written out? (hash: %s tid: %s)?" % (h, tid))
matches = {k : v for k, v in iter(matches.items()) if h not in k}
+ matches_local = {k : v for k, v in iter(matches.items()) if h not in k and not v['sstate']}
+ if matches_local:
+ matches = matches_local
if matches:
latestmatch = matches[sorted(matches.keys(), key=lambda h: matches[h]['time'])[-1]]['path']
prevh = __find_sha256__.search(latestmatch).group(0)
--
2.39.2
^ permalink raw reply related [flat|nested] 13+ messages in thread
* [PATCH 6/7] bitbake/runqueue: add debugging for find_siginfo() calls
2023-12-18 8:43 [PATCH 1/7] bitbake/runqueue: rework 'bitbake -S printdiff' logic Alexander Kanavin
` (3 preceding siblings ...)
2023-12-18 8:44 ` [PATCH 5/7] bitbake/runqueue: prioritize local stamps over sstate signatures in printdiff Alexander Kanavin
@ 2023-12-18 8:44 ` Alexander Kanavin
2023-12-18 8:44 ` [PATCH 7/7] selftest/sstatetest: re-enable gcc printdiff test Alexander Kanavin
5 siblings, 0 replies; 13+ messages in thread
From: Alexander Kanavin @ 2023-12-18 8:44 UTC (permalink / raw)
To: openembedded-core; +Cc: Alexander Kanavin
Signed-off-by: Alexander Kanavin <alex@linutronix.de>
---
bitbake/lib/bb/runqueue.py | 4 ++++
1 file changed, 4 insertions(+)
diff --git a/bitbake/lib/bb/runqueue.py b/bitbake/lib/bb/runqueue.py
index 0fc26ccdf88..51959231b72 100644
--- a/bitbake/lib/bb/runqueue.py
+++ b/bitbake/lib/bb/runqueue.py
@@ -1764,7 +1764,9 @@ class RunQueue:
# Define recursion callback
def recursecb(key, hash1, hash2):
hashes = [hash1, hash2]
+ bb.debug(1, "Recursively looking for recipe {} hashes {}".format(key, hashes))
hashfiles = bb.siggen.find_siginfo(key, None, hashes, self.cfgData)
+ bb.debug(1, "Found hashfiles:\n{}".format(hashfiles))
recout = []
if len(hashfiles) == 2:
@@ -1780,7 +1782,9 @@ class RunQueue:
(mc, fn, taskname, taskfn) = split_tid_mcfn(tid)
pn = self.rqdata.dataCaches[mc].pkg_fn[taskfn]
h = self.rqdata.runtaskentries[tid].unihash
+ bb.debug(1, "Looking for recipe {} task {}".format(pn, taskname))
matches = bb.siggen.find_siginfo(pn, taskname, [], self.cooker.databuilder.mcdata[mc])
+ bb.debug(1, "Found hashfiles:\n{}".format(matches))
match = None
for m in matches.values():
if h in m['path']:
--
2.39.2
^ permalink raw reply related [flat|nested] 13+ messages in thread
* [PATCH 7/7] selftest/sstatetest: re-enable gcc printdiff test
2023-12-18 8:43 [PATCH 1/7] bitbake/runqueue: rework 'bitbake -S printdiff' logic Alexander Kanavin
` (4 preceding siblings ...)
2023-12-18 8:44 ` [PATCH 6/7] bitbake/runqueue: add debugging for find_siginfo() calls Alexander Kanavin
@ 2023-12-18 8:44 ` Alexander Kanavin
5 siblings, 0 replies; 13+ messages in thread
From: Alexander Kanavin @ 2023-12-18 8:44 UTC (permalink / raw)
To: openembedded-core; +Cc: Alexander Kanavin
Signed-off-by: Alexander Kanavin <alex@linutronix.de>
---
meta/lib/oeqa/selftest/cases/sstatetests.py | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/meta/lib/oeqa/selftest/cases/sstatetests.py b/meta/lib/oeqa/selftest/cases/sstatetests.py
index 6da3ef3ca77..62b7a79bbb6 100644
--- a/meta/lib/oeqa/selftest/cases/sstatetests.py
+++ b/meta/lib/oeqa/selftest/cases/sstatetests.py
@@ -842,7 +842,7 @@ do_install:append() {
expected_sametmp_output, expected_difftmp_output)
# Check if changes to gcc-source (which uses tmp/work-shared) are correctly discovered
- def _test_gcc_runtime_vs_gcc_source(self):
+ def test_gcc_runtime_vs_gcc_source(self):
gcc_source_pn = 'gcc-source-%s' % get_bb_vars(['PV'], 'gcc')['PV']
expected_output = ("Task {}:do_preconfigure couldn't be used from the cache because:".format(gcc_source_pn),
--
2.39.2
^ permalink raw reply related [flat|nested] 13+ messages in thread
* Re: [OE-core] [PATCH 2/7] selftest/sstatetests: fix up printdiff test to match rework of printdiff logic
2023-12-18 8:43 ` [PATCH 2/7] selftest/sstatetests: fix up printdiff test to match rework of printdiff logic Alexander Kanavin
@ 2024-01-01 13:00 ` Alexandre Belloni
2024-01-01 18:27 ` Alexander Kanavin
[not found] ` <17A64C894AA0CBF1.19767@lists.openembedded.org>
0 siblings, 2 replies; 13+ messages in thread
From: Alexandre Belloni @ 2024-01-01 13:00 UTC (permalink / raw)
To: Alexander Kanavin; +Cc: openembedded-core, Alexander Kanavin
Hello,
I've been carrying the series for a while without any issue but got this
yesterday:
https://autobuilder.yoctoproject.org/typhoon/#/builders/87/builds/6262/steps/14/logs/stdio
On 18/12/2023 09:43:58+0100, Alexander Kanavin wrote:
> Other than the formatting changes, there are two functional ones:
>
> - use perlcross instead of quilt, as quilt is special in the sense
> of being excluded from task hash calculcations. perlcross is a full
> participant.
>
> - run the full test (local + sstate) for gcc do_preconfiure change
> as the necessary fix has been implemented
> (sstatesig/find_siginfo: special-case gcc-source when looking in sstate caches)
>
> Note that when several tasks are found to have changed (as is the case
> when base do_configure is adjusted), find_siginfo() runs
> glob.glob("*/*/*taskname*") against autobuilder sstate cache for each
> of those tasks (six or seven times). This is an expensive operation
> taking several minutes. I left it in for now, but if it's proven too slow
> the test would have to be reduced to checking a specific base recipe
> (e.g. zstd-native) rather than a distant image target.
>
> [YOCTO #15289]
>
> Signed-off-by: Alexander Kanavin <alex@linutronix.de>
> ---
> .../perlcross_%.bbappend} | 0
> meta/lib/oeqa/selftest/cases/sstatetests.py | 22 +++++++++++--------
> 2 files changed, 13 insertions(+), 9 deletions(-)
> rename meta-selftest/recipes-test/{quilt-native/quilt-native_%.bbappend => perlcross/perlcross_%.bbappend} (100%)
>
> diff --git a/meta-selftest/recipes-test/quilt-native/quilt-native_%.bbappend b/meta-selftest/recipes-test/perlcross/perlcross_%.bbappend
> similarity index 100%
> rename from meta-selftest/recipes-test/quilt-native/quilt-native_%.bbappend
> rename to meta-selftest/recipes-test/perlcross/perlcross_%.bbappend
> diff --git a/meta/lib/oeqa/selftest/cases/sstatetests.py b/meta/lib/oeqa/selftest/cases/sstatetests.py
> index f827615ba1b..6af3c8f2178 100644
> --- a/meta/lib/oeqa/selftest/cases/sstatetests.py
> +++ b/meta/lib/oeqa/selftest/cases/sstatetests.py
> @@ -824,14 +824,16 @@ TMPDIR = "${{TOPDIR}}/tmp-sstateprintdiff-difftmp-{}"
>
>
> # Check if printdiff walks the full dependency chain from the image target to where the change is in a specific recipe
> - def test_image_minimal_vs_quilt(self):
> - expected_output = ("Task quilt-native:do_install couldn't be used from the cache because:",
> + def test_image_minimal_vs_perlcross(self):
> + expected_output = ("Task perlcross-native:do_install couldn't be used from the cache because:",
> "We need hash",
> "most recent matching task was")
> - expected_sametmp_output = expected_output + ("Variable do_install value changed",'+ echo "this changes the task signature"')
> + expected_sametmp_output = expected_output + (
> +"Variable do_install value changed",
> +'+ echo "this changes the task signature"')
> expected_difftmp_output = expected_output
>
> - self.run_test_printdiff_changerecipe("core-image-minimal", "quilt-native", "-c do_install quilt-native",
> + self.run_test_printdiff_changerecipe("core-image-minimal", "perlcross", "-c do_install perlcross-native",
> """
> do_install:append() {
> echo "this changes the task signature"
> @@ -846,10 +848,10 @@ expected_sametmp_output, expected_difftmp_output)
> expected_output = ("Task {}:do_preconfigure couldn't be used from the cache because:".format(gcc_source_pn),
> "We need hash",
> "most recent matching task was")
> - expected_sametmp_output = expected_output + ("Variable do_preconfigure value changed",'+ print("this changes the task signature")')
> - #FIXME: printdiff is supposed to find at least one preconfigure task signature in the sstate cache, but isn't able to
> - #expected_difftmp_output = expected_output
> - expected_difftmp_output = ()
> + expected_sametmp_output = expected_output + (
> +"Variable do_preconfigure value changed",
> +'+ print("this changes the task signature")')
> + expected_difftmp_output = expected_output
>
> self.run_test_printdiff_changerecipe("gcc-runtime", "gcc-source", "-c do_preconfigure {}".format(gcc_source_pn),
> """
> @@ -873,7 +875,9 @@ expected_sametmp_output, expected_difftmp_output)
> "Task gnu-config-native:do_configure couldn't be used from the cache because:",
> "We need hash",
> "most recent matching task was")
> - expected_sametmp_output = expected_output + ("Variable base_do_configure value changed",'+ echo "this changes base_do_configure() definiton "')
> + expected_sametmp_output = expected_output + (
> +"Variable base_do_configure value changed",
> +'+ echo "this changes base_do_configure() definiton "')
> expected_difftmp_output = expected_output
>
> self.run_test_printdiff_changeconfig("core-image-minimal",
> --
> 2.39.2
>
>
> -=-=-=-=-=-=-=-=-=-=-=-
> Links: You receive all messages sent to this group.
> View/Reply Online (#192613): https://lists.openembedded.org/g/openembedded-core/message/192613
> Mute This Topic: https://lists.openembedded.org/mt/103239347/3617179
> Group Owner: openembedded-core+owner@lists.openembedded.org
> Unsubscribe: https://lists.openembedded.org/g/openembedded-core/unsub [alexandre.belloni@bootlin.com]
> -=-=-=-=-=-=-=-=-=-=-=-
>
--
Alexandre Belloni, co-owner and COO, Bootlin
Embedded Linux and Kernel engineering
https://bootlin.com
^ permalink raw reply [flat|nested] 13+ messages in thread
* Re: [OE-core] [PATCH 2/7] selftest/sstatetests: fix up printdiff test to match rework of printdiff logic
2024-01-01 13:00 ` [OE-core] " Alexandre Belloni
@ 2024-01-01 18:27 ` Alexander Kanavin
[not found] ` <17A64C894AA0CBF1.19767@lists.openembedded.org>
1 sibling, 0 replies; 13+ messages in thread
From: Alexander Kanavin @ 2024-01-01 18:27 UTC (permalink / raw)
To: Alexandre Belloni; +Cc: openembedded-core, Alexander Kanavin
RP has reported the same issue elsewhere:
https://autobuilder.yoctoproject.org/typhoon/#/builders/86/builds/6254/steps/14/logs/stdio
File "/home/pokybuild/yocto-worker/oe-selftest-ubuntu/build/bitbake/lib/bb/runqueue.py",
line 1799, in RunQueue.write_diffscenetasks(invalidtasks={'/home/pokybuild/yocto-worker/oe-selftest-ubuntu/build/meta/recipes-core/gettext/gettext-minimal-native_0.22.4.bb:do_configure',
'virtual:native:/home/pokybuild/yocto-worker/oe-selftest-ubuntu/build/meta/recipes-devtools/gnu-config/gnu-config_git.bb:do_configure',
'virtual:native:/home/pokybuild/yocto-worker/oe-selftest-ubuntu/build/meta/recipes-extended/zstd/zstd_1.5.5.bb:do_configure',
'/home/pokybuild/yocto-worker/oe-selftest-ubuntu/build/meta/recipes-core/glibc/ldconfig-native_2.12.1.bb:do_configure',
'virtual:native:/home/pokybuild/yocto-worker/oe-selftest-ubuntu/build/meta/recipes-extended/unzip/unzip_6.0.bb:do_configure',
'/home/pokybuild/yocto-worker/oe-selftest-ubuntu/build/meta/recipes-extended/texinfo-dummy-native/texinfo-dummy-native.bb:do_configure',
'virtual:native:/home/pokybuild/yocto-worker/oe-selftest-ubuntu/build/meta/recipes-core/update-rc.d/update-rc.d_0.8.bb:do_configure',
'virtual:native:/home/pokybuild/yocto-worker/oe-selftest-ubuntu/build/meta/recipes-extended/pigz/pigz_2.8.bb:do_configure',
'virtual:native:/home/pokybuild/yocto-worker/oe-selftest-ubuntu/build/meta/recipes-devtools/makedevs/makedevs_1.0.1.bb:do_configure',
'/home/pokybuild/yocto-worker/oe-selftest-ubuntu/build/meta/recipes-extended/timezone/tzcode-native.bb:do_configure'}):
if matches:
> latestmatch = matches[sorted(matches.keys(),
key=lambda h: matches[h]['time'])[-1]]['path']
prevh = __find_sha256__.search(latestmatch).group(0)
TypeError: '<' not supported between instances of 'NoneType' and 'float'
It seems as though some of the entries lack timestamp information,
probably because obtaining it from the filesystem had failed and the
code placed 'None' into the data structure instead. I'll take a look
at why that isn't reported sooner.
Alex
On Mon, 1 Jan 2024 at 14:00, Alexandre Belloni
<alexandre.belloni@bootlin.com> wrote:
>
> Hello,
>
> I've been carrying the series for a while without any issue but got this
> yesterday:
> https://autobuilder.yoctoproject.org/typhoon/#/builders/87/builds/6262/steps/14/logs/stdio
>
>
> On 18/12/2023 09:43:58+0100, Alexander Kanavin wrote:
> > Other than the formatting changes, there are two functional ones:
> >
> > - use perlcross instead of quilt, as quilt is special in the sense
> > of being excluded from task hash calculcations. perlcross is a full
> > participant.
> >
> > - run the full test (local + sstate) for gcc do_preconfiure change
> > as the necessary fix has been implemented
> > (sstatesig/find_siginfo: special-case gcc-source when looking in sstate caches)
> >
> > Note that when several tasks are found to have changed (as is the case
> > when base do_configure is adjusted), find_siginfo() runs
> > glob.glob("*/*/*taskname*") against autobuilder sstate cache for each
> > of those tasks (six or seven times). This is an expensive operation
> > taking several minutes. I left it in for now, but if it's proven too slow
> > the test would have to be reduced to checking a specific base recipe
> > (e.g. zstd-native) rather than a distant image target.
> >
> > [YOCTO #15289]
> >
> > Signed-off-by: Alexander Kanavin <alex@linutronix.de>
> > ---
> > .../perlcross_%.bbappend} | 0
> > meta/lib/oeqa/selftest/cases/sstatetests.py | 22 +++++++++++--------
> > 2 files changed, 13 insertions(+), 9 deletions(-)
> > rename meta-selftest/recipes-test/{quilt-native/quilt-native_%.bbappend => perlcross/perlcross_%.bbappend} (100%)
> >
> > diff --git a/meta-selftest/recipes-test/quilt-native/quilt-native_%.bbappend b/meta-selftest/recipes-test/perlcross/perlcross_%.bbappend
> > similarity index 100%
> > rename from meta-selftest/recipes-test/quilt-native/quilt-native_%.bbappend
> > rename to meta-selftest/recipes-test/perlcross/perlcross_%.bbappend
> > diff --git a/meta/lib/oeqa/selftest/cases/sstatetests.py b/meta/lib/oeqa/selftest/cases/sstatetests.py
> > index f827615ba1b..6af3c8f2178 100644
> > --- a/meta/lib/oeqa/selftest/cases/sstatetests.py
> > +++ b/meta/lib/oeqa/selftest/cases/sstatetests.py
> > @@ -824,14 +824,16 @@ TMPDIR = "${{TOPDIR}}/tmp-sstateprintdiff-difftmp-{}"
> >
> >
> > # Check if printdiff walks the full dependency chain from the image target to where the change is in a specific recipe
> > - def test_image_minimal_vs_quilt(self):
> > - expected_output = ("Task quilt-native:do_install couldn't be used from the cache because:",
> > + def test_image_minimal_vs_perlcross(self):
> > + expected_output = ("Task perlcross-native:do_install couldn't be used from the cache because:",
> > "We need hash",
> > "most recent matching task was")
> > - expected_sametmp_output = expected_output + ("Variable do_install value changed",'+ echo "this changes the task signature"')
> > + expected_sametmp_output = expected_output + (
> > +"Variable do_install value changed",
> > +'+ echo "this changes the task signature"')
> > expected_difftmp_output = expected_output
> >
> > - self.run_test_printdiff_changerecipe("core-image-minimal", "quilt-native", "-c do_install quilt-native",
> > + self.run_test_printdiff_changerecipe("core-image-minimal", "perlcross", "-c do_install perlcross-native",
> > """
> > do_install:append() {
> > echo "this changes the task signature"
> > @@ -846,10 +848,10 @@ expected_sametmp_output, expected_difftmp_output)
> > expected_output = ("Task {}:do_preconfigure couldn't be used from the cache because:".format(gcc_source_pn),
> > "We need hash",
> > "most recent matching task was")
> > - expected_sametmp_output = expected_output + ("Variable do_preconfigure value changed",'+ print("this changes the task signature")')
> > - #FIXME: printdiff is supposed to find at least one preconfigure task signature in the sstate cache, but isn't able to
> > - #expected_difftmp_output = expected_output
> > - expected_difftmp_output = ()
> > + expected_sametmp_output = expected_output + (
> > +"Variable do_preconfigure value changed",
> > +'+ print("this changes the task signature")')
> > + expected_difftmp_output = expected_output
> >
> > self.run_test_printdiff_changerecipe("gcc-runtime", "gcc-source", "-c do_preconfigure {}".format(gcc_source_pn),
> > """
> > @@ -873,7 +875,9 @@ expected_sametmp_output, expected_difftmp_output)
> > "Task gnu-config-native:do_configure couldn't be used from the cache because:",
> > "We need hash",
> > "most recent matching task was")
> > - expected_sametmp_output = expected_output + ("Variable base_do_configure value changed",'+ echo "this changes base_do_configure() definiton "')
> > + expected_sametmp_output = expected_output + (
> > +"Variable base_do_configure value changed",
> > +'+ echo "this changes base_do_configure() definiton "')
> > expected_difftmp_output = expected_output
> >
> > self.run_test_printdiff_changeconfig("core-image-minimal",
> > --
> > 2.39.2
> >
>
> >
> > -=-=-=-=-=-=-=-=-=-=-=-
> > Links: You receive all messages sent to this group.
> > View/Reply Online (#192613): https://lists.openembedded.org/g/openembedded-core/message/192613
> > Mute This Topic: https://lists.openembedded.org/mt/103239347/3617179
> > Group Owner: openembedded-core+owner@lists.openembedded.org
> > Unsubscribe: https://lists.openembedded.org/g/openembedded-core/unsub [alexandre.belloni@bootlin.com]
> > -=-=-=-=-=-=-=-=-=-=-=-
> >
>
>
> --
> Alexandre Belloni, co-owner and COO, Bootlin
> Embedded Linux and Kernel engineering
> https://bootlin.com
^ permalink raw reply [flat|nested] 13+ messages in thread
* Re: [OE-core] [PATCH 2/7] selftest/sstatetests: fix up printdiff test to match rework of printdiff logic
[not found] ` <17A64C894AA0CBF1.19767@lists.openembedded.org>
@ 2024-01-02 14:51 ` Alexander Kanavin
0 siblings, 0 replies; 13+ messages in thread
From: Alexander Kanavin @ 2024-01-02 14:51 UTC (permalink / raw)
To: openembedded-core; +Cc: Alexandre Belloni, Alexander Kanavin, Richard Purdie
I just sent a patch for this:
"lib/sstatesig/find_siginfo: raise an error instead of returning None
when obtaining mtime"
It will not fix the issue, but it will get better diagnostics (the
error can be suppressed, but it's something that shouldn't be
happening, so I want to see what is really the issue).
Alex
On Mon, 1 Jan 2024 at 19:27, Alexander Kanavin via
lists.openembedded.org <alex.kanavin=gmail.com@lists.openembedded.org>
wrote:
>
> RP has reported the same issue elsewhere:
> https://autobuilder.yoctoproject.org/typhoon/#/builders/86/builds/6254/steps/14/logs/stdio
>
> File "/home/pokybuild/yocto-worker/oe-selftest-ubuntu/build/bitbake/lib/bb/runqueue.py",
> line 1799, in RunQueue.write_diffscenetasks(invalidtasks={'/home/pokybuild/yocto-worker/oe-selftest-ubuntu/build/meta/recipes-core/gettext/gettext-minimal-native_0.22.4.bb:do_configure',
> 'virtual:native:/home/pokybuild/yocto-worker/oe-selftest-ubuntu/build/meta/recipes-devtools/gnu-config/gnu-config_git.bb:do_configure',
> 'virtual:native:/home/pokybuild/yocto-worker/oe-selftest-ubuntu/build/meta/recipes-extended/zstd/zstd_1.5.5.bb:do_configure',
> '/home/pokybuild/yocto-worker/oe-selftest-ubuntu/build/meta/recipes-core/glibc/ldconfig-native_2.12.1.bb:do_configure',
> 'virtual:native:/home/pokybuild/yocto-worker/oe-selftest-ubuntu/build/meta/recipes-extended/unzip/unzip_6.0.bb:do_configure',
> '/home/pokybuild/yocto-worker/oe-selftest-ubuntu/build/meta/recipes-extended/texinfo-dummy-native/texinfo-dummy-native.bb:do_configure',
> 'virtual:native:/home/pokybuild/yocto-worker/oe-selftest-ubuntu/build/meta/recipes-core/update-rc.d/update-rc.d_0.8.bb:do_configure',
> 'virtual:native:/home/pokybuild/yocto-worker/oe-selftest-ubuntu/build/meta/recipes-extended/pigz/pigz_2.8.bb:do_configure',
> 'virtual:native:/home/pokybuild/yocto-worker/oe-selftest-ubuntu/build/meta/recipes-devtools/makedevs/makedevs_1.0.1.bb:do_configure',
> '/home/pokybuild/yocto-worker/oe-selftest-ubuntu/build/meta/recipes-extended/timezone/tzcode-native.bb:do_configure'}):
> if matches:
> > latestmatch = matches[sorted(matches.keys(),
> key=lambda h: matches[h]['time'])[-1]]['path']
> prevh = __find_sha256__.search(latestmatch).group(0)
> TypeError: '<' not supported between instances of 'NoneType' and 'float'
>
> It seems as though some of the entries lack timestamp information,
> probably because obtaining it from the filesystem had failed and the
> code placed 'None' into the data structure instead. I'll take a look
> at why that isn't reported sooner.
>
> Alex
>
> On Mon, 1 Jan 2024 at 14:00, Alexandre Belloni
> <alexandre.belloni@bootlin.com> wrote:
> >
> > Hello,
> >
> > I've been carrying the series for a while without any issue but got this
> > yesterday:
> > https://autobuilder.yoctoproject.org/typhoon/#/builders/87/builds/6262/steps/14/logs/stdio
> >
> >
> > On 18/12/2023 09:43:58+0100, Alexander Kanavin wrote:
> > > Other than the formatting changes, there are two functional ones:
> > >
> > > - use perlcross instead of quilt, as quilt is special in the sense
> > > of being excluded from task hash calculcations. perlcross is a full
> > > participant.
> > >
> > > - run the full test (local + sstate) for gcc do_preconfiure change
> > > as the necessary fix has been implemented
> > > (sstatesig/find_siginfo: special-case gcc-source when looking in sstate caches)
> > >
> > > Note that when several tasks are found to have changed (as is the case
> > > when base do_configure is adjusted), find_siginfo() runs
> > > glob.glob("*/*/*taskname*") against autobuilder sstate cache for each
> > > of those tasks (six or seven times). This is an expensive operation
> > > taking several minutes. I left it in for now, but if it's proven too slow
> > > the test would have to be reduced to checking a specific base recipe
> > > (e.g. zstd-native) rather than a distant image target.
> > >
> > > [YOCTO #15289]
> > >
> > > Signed-off-by: Alexander Kanavin <alex@linutronix.de>
> > > ---
> > > .../perlcross_%.bbappend} | 0
> > > meta/lib/oeqa/selftest/cases/sstatetests.py | 22 +++++++++++--------
> > > 2 files changed, 13 insertions(+), 9 deletions(-)
> > > rename meta-selftest/recipes-test/{quilt-native/quilt-native_%.bbappend => perlcross/perlcross_%.bbappend} (100%)
> > >
> > > diff --git a/meta-selftest/recipes-test/quilt-native/quilt-native_%.bbappend b/meta-selftest/recipes-test/perlcross/perlcross_%.bbappend
> > > similarity index 100%
> > > rename from meta-selftest/recipes-test/quilt-native/quilt-native_%.bbappend
> > > rename to meta-selftest/recipes-test/perlcross/perlcross_%.bbappend
> > > diff --git a/meta/lib/oeqa/selftest/cases/sstatetests.py b/meta/lib/oeqa/selftest/cases/sstatetests.py
> > > index f827615ba1b..6af3c8f2178 100644
> > > --- a/meta/lib/oeqa/selftest/cases/sstatetests.py
> > > +++ b/meta/lib/oeqa/selftest/cases/sstatetests.py
> > > @@ -824,14 +824,16 @@ TMPDIR = "${{TOPDIR}}/tmp-sstateprintdiff-difftmp-{}"
> > >
> > >
> > > # Check if printdiff walks the full dependency chain from the image target to where the change is in a specific recipe
> > > - def test_image_minimal_vs_quilt(self):
> > > - expected_output = ("Task quilt-native:do_install couldn't be used from the cache because:",
> > > + def test_image_minimal_vs_perlcross(self):
> > > + expected_output = ("Task perlcross-native:do_install couldn't be used from the cache because:",
> > > "We need hash",
> > > "most recent matching task was")
> > > - expected_sametmp_output = expected_output + ("Variable do_install value changed",'+ echo "this changes the task signature"')
> > > + expected_sametmp_output = expected_output + (
> > > +"Variable do_install value changed",
> > > +'+ echo "this changes the task signature"')
> > > expected_difftmp_output = expected_output
> > >
> > > - self.run_test_printdiff_changerecipe("core-image-minimal", "quilt-native", "-c do_install quilt-native",
> > > + self.run_test_printdiff_changerecipe("core-image-minimal", "perlcross", "-c do_install perlcross-native",
> > > """
> > > do_install:append() {
> > > echo "this changes the task signature"
> > > @@ -846,10 +848,10 @@ expected_sametmp_output, expected_difftmp_output)
> > > expected_output = ("Task {}:do_preconfigure couldn't be used from the cache because:".format(gcc_source_pn),
> > > "We need hash",
> > > "most recent matching task was")
> > > - expected_sametmp_output = expected_output + ("Variable do_preconfigure value changed",'+ print("this changes the task signature")')
> > > - #FIXME: printdiff is supposed to find at least one preconfigure task signature in the sstate cache, but isn't able to
> > > - #expected_difftmp_output = expected_output
> > > - expected_difftmp_output = ()
> > > + expected_sametmp_output = expected_output + (
> > > +"Variable do_preconfigure value changed",
> > > +'+ print("this changes the task signature")')
> > > + expected_difftmp_output = expected_output
> > >
> > > self.run_test_printdiff_changerecipe("gcc-runtime", "gcc-source", "-c do_preconfigure {}".format(gcc_source_pn),
> > > """
> > > @@ -873,7 +875,9 @@ expected_sametmp_output, expected_difftmp_output)
> > > "Task gnu-config-native:do_configure couldn't be used from the cache because:",
> > > "We need hash",
> > > "most recent matching task was")
> > > - expected_sametmp_output = expected_output + ("Variable base_do_configure value changed",'+ echo "this changes base_do_configure() definiton "')
> > > + expected_sametmp_output = expected_output + (
> > > +"Variable base_do_configure value changed",
> > > +'+ echo "this changes base_do_configure() definiton "')
> > > expected_difftmp_output = expected_output
> > >
> > > self.run_test_printdiff_changeconfig("core-image-minimal",
> > > --
> > > 2.39.2
> > >
> >
> > >
> > >
> > >
> >
> >
> > --
> > Alexandre Belloni, co-owner and COO, Bootlin
> > Embedded Linux and Kernel engineering
> > https://bootlin.com
>
> -=-=-=-=-=-=-=-=-=-=-=-
> Links: You receive all messages sent to this group.
> View/Reply Online (#193189): https://lists.openembedded.org/g/openembedded-core/message/193189
> Mute This Topic: https://lists.openembedded.org/mt/103239347/1686489
> Group Owner: openembedded-core+owner@lists.openembedded.org
> Unsubscribe: https://lists.openembedded.org/g/openembedded-core/unsub [alex.kanavin@gmail.com]
> -=-=-=-=-=-=-=-=-=-=-=-
>
^ permalink raw reply [flat|nested] 13+ messages in thread
* Re: [OE-core] [PATCH 3/7] sstatesig/find_siginfo: unify a disjointed API
2023-12-18 8:43 ` [PATCH 3/7] sstatesig/find_siginfo: unify a disjointed API Alexander Kanavin
@ 2024-01-05 11:22 ` Richard Purdie
2024-01-05 11:42 ` Alexander Kanavin
0 siblings, 1 reply; 13+ messages in thread
From: Richard Purdie @ 2024-01-05 11:22 UTC (permalink / raw)
To: Alexander Kanavin, openembedded-core; +Cc: Alexander Kanavin
On Mon, 2023-12-18 at 09:43 +0100, Alexander Kanavin wrote:
> find_siginfo() returns two different data structures depending
> on whether its third argument (list of hashes to find) is empty or
> not:
> - a dict of timestamps keyed by path
> - a dict of paths keyed by hash
>
> This is not a good API design; it's much better to return
> a dict of dicts that include both timestamp and path, keyed by
> hash. Then the API consumer can decide how they want to use these
> fields, particularly for additional diagnostics or informational
> output.
>
> I also took the opportunity to add a binary field that
> tells if the match came from sstate or local stamps dir, which
> will help prioritize local stamps when looking up most
> recent task signatures.
>
> Signed-off-by: Alexander Kanavin <alex@linutronix.de>
> ---
> meta/lib/oe/buildhistory_analysis.py | 2 +-
> meta/lib/oe/sstatesig.py | 31 +++++++++------------
> meta/lib/oeqa/selftest/cases/sstatetests.py | 10 +++----
> 3 files changed, 19 insertions(+), 24 deletions(-)
I can see why you've done this. I had thought this might have been a
compatibility issue but it wasn't, it was just bad design from the
start (and I wasn't responsible for it for a change!).
It gives me a real headache for merging though since it requires OE-
Core and bitbake to change in lockstep.
There is a risk people might just update bitbake but not OE-Core and
also vice versa, they update OE-Core but not bitbake. This can happen
for all kinds of reasons, e.g. mixing a newer bitbake with an older
release.
The latter is easy to address with a bitbake version check bit the
former is not really possible to detect with our current code as
bitbake can't know OE-Core doesn't support what it needs.
With other changes in the pipeline like inherit_defer and the fact
there is a bug related to this on a stable branch, it makes it all the
more likely people will try and mix/match different versions.
I've a few ideas on how we might be able to detect potential problems,
I'll continue to try and work something out but I want to make it clear
there are some things it is hard to change :/.
Cheers,
Richard
^ permalink raw reply [flat|nested] 13+ messages in thread
* Re: [OE-core] [PATCH 3/7] sstatesig/find_siginfo: unify a disjointed API
2024-01-05 11:22 ` [OE-core] " Richard Purdie
@ 2024-01-05 11:42 ` Alexander Kanavin
2024-01-05 12:02 ` Richard Purdie
0 siblings, 1 reply; 13+ messages in thread
From: Alexander Kanavin @ 2024-01-05 11:42 UTC (permalink / raw)
To: Richard Purdie; +Cc: openembedded-core, Alexander Kanavin
On Fri, 5 Jan 2024 at 12:22, Richard Purdie
<richard.purdie@linuxfoundation.org> wrote:
> I've a few ideas on how we might be able to detect potential problems,
> I'll continue to try and work something out but I want to make it clear
> there are some things it is hard to change :/.
There's the option of adding another function (find_siginfo_v2) and
leaving this one as it was, this is how the kernel does things. They
don't shy away from adding v3, v4 and so on either. But I thought less
code is better than more code.
Alex
^ permalink raw reply [flat|nested] 13+ messages in thread
* Re: [OE-core] [PATCH 3/7] sstatesig/find_siginfo: unify a disjointed API
2024-01-05 11:42 ` Alexander Kanavin
@ 2024-01-05 12:02 ` Richard Purdie
0 siblings, 0 replies; 13+ messages in thread
From: Richard Purdie @ 2024-01-05 12:02 UTC (permalink / raw)
To: Alexander Kanavin; +Cc: openembedded-core, Alexander Kanavin
On Fri, 2024-01-05 at 12:42 +0100, Alexander Kanavin wrote:
> On Fri, 5 Jan 2024 at 12:22, Richard Purdie
> <richard.purdie@linuxfoundation.org> wrote:
>
> > I've a few ideas on how we might be able to detect potential problems,
> > I'll continue to try and work something out but I want to make it clear
> > there are some things it is hard to change :/.
>
> There's the option of adding another function (find_siginfo_v2) and
> leaving this one as it was, this is how the kernel does things. They
> don't shy away from adding v3, v4 and so on either. But I thought less
> code is better than more code.
That is effectively what I just merged, except I did break
compatibility by dropping the v1. We need to give the user good
messages about how to fix their problem which is why a number is needed
rather than just a function name.
Cheers,
Richard
^ permalink raw reply [flat|nested] 13+ messages in thread
end of thread, other threads:[~2024-01-05 12:02 UTC | newest]
Thread overview: 13+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2023-12-18 8:43 [PATCH 1/7] bitbake/runqueue: rework 'bitbake -S printdiff' logic Alexander Kanavin
2023-12-18 8:43 ` [PATCH 2/7] selftest/sstatetests: fix up printdiff test to match rework of printdiff logic Alexander Kanavin
2024-01-01 13:00 ` [OE-core] " Alexandre Belloni
2024-01-01 18:27 ` Alexander Kanavin
[not found] ` <17A64C894AA0CBF1.19767@lists.openembedded.org>
2024-01-02 14:51 ` Alexander Kanavin
2023-12-18 8:43 ` [PATCH 3/7] sstatesig/find_siginfo: unify a disjointed API Alexander Kanavin
2024-01-05 11:22 ` [OE-core] " Richard Purdie
2024-01-05 11:42 ` Alexander Kanavin
2024-01-05 12:02 ` Richard Purdie
2023-12-18 8:44 ` [PATCH 4/7] bitbake-diffsigs/runqueue: adapt to reworked find_siginfo() Alexander Kanavin
2023-12-18 8:44 ` [PATCH 5/7] bitbake/runqueue: prioritize local stamps over sstate signatures in printdiff Alexander Kanavin
2023-12-18 8:44 ` [PATCH 6/7] bitbake/runqueue: add debugging for find_siginfo() calls Alexander Kanavin
2023-12-18 8:44 ` [PATCH 7/7] selftest/sstatetest: re-enable gcc printdiff test Alexander Kanavin
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.