mirror of
https://git.yoctoproject.org/poky
synced 2026-04-04 23:02:22 +02:00
bitbake: runqueue/siggen: Allow handling of equivalent hashes
Based on the hashserv's new ability to accept hash mappings, update runqueue to use this through a helper function in siggen. This addresses problems with meta-extsdk-toolchain and its dependency on gdb-cross which caused errors when building eSDK. See the previous commit for more details. (Bitbake rev: 39098b4ba2133f4d9229a0aa4fcf4c3e1291286a) Signed-off-by: Richard Purdie <richard.purdie@linuxfoundation.org>
This commit is contained in:
@@ -2283,12 +2283,26 @@ class RunQueueExecute:
|
||||
for dep in self.rqdata.runtaskentries[tid].depends:
|
||||
procdep.append(dep)
|
||||
orighash = self.rqdata.runtaskentries[tid].hash
|
||||
self.rqdata.runtaskentries[tid].hash = bb.parse.siggen.get_taskhash(tid, procdep, self.rqdata.dataCaches[mc_from_tid(tid)])
|
||||
newhash = bb.parse.siggen.get_taskhash(tid, procdep, self.rqdata.dataCaches[mc_from_tid(tid)])
|
||||
origuni = self.rqdata.runtaskentries[tid].unihash
|
||||
self.rqdata.runtaskentries[tid].unihash = bb.parse.siggen.get_unihash(tid)
|
||||
logger.debug(1, "Task %s hash changes: %s->%s %s->%s" % (tid, orighash, self.rqdata.runtaskentries[tid].hash, origuni, self.rqdata.runtaskentries[tid].unihash))
|
||||
newuni = bb.parse.siggen.get_unihash(tid)
|
||||
# FIXME, need to check it can come from sstate at all for determinism?
|
||||
remapped = False
|
||||
if newuni == origuni:
|
||||
# Nothing to do, we match, skip code below
|
||||
remapped = True
|
||||
elif tid in self.scenequeue_covered or tid in self.sq_live:
|
||||
# Already ran this setscene task or it running. Report the new taskhash
|
||||
remapped = bb.parse.siggen.report_unihash_equiv(tid, newhash, origuni, newuni, self.rqdata.dataCaches)
|
||||
logger.info("Already covered setscene for %s so ignoring rehash (remap)" % (tid))
|
||||
|
||||
if not remapped:
|
||||
logger.debug(1, "Task %s hash changes: %s->%s %s->%s" % (tid, orighash, newhash, origuni, newuni))
|
||||
self.rqdata.runtaskentries[tid].hash = newhash
|
||||
self.rqdata.runtaskentries[tid].unihash = newuni
|
||||
changed.add(tid)
|
||||
|
||||
next |= self.rqdata.runtaskentries[tid].revdeps
|
||||
changed.add(tid)
|
||||
total.remove(tid)
|
||||
next.intersection_update(total)
|
||||
|
||||
@@ -2307,18 +2321,11 @@ class RunQueueExecute:
|
||||
self.pending_migrations.add(tid)
|
||||
|
||||
for tid in self.pending_migrations.copy():
|
||||
if tid in self.runq_running:
|
||||
if tid in self.runq_running or tid in self.sq_live:
|
||||
# Too late, task already running, not much we can do now
|
||||
self.pending_migrations.remove(tid)
|
||||
continue
|
||||
|
||||
if tid in self.scenequeue_covered or tid in self.sq_live:
|
||||
# Already ran this setscene task or it running
|
||||
# Potentially risky, should we report this hash as a match?
|
||||
logger.info("Already covered setscene for %s so ignoring rehash" % (tid))
|
||||
self.pending_migrations.remove(tid)
|
||||
continue
|
||||
|
||||
valid = True
|
||||
# Check no tasks this covers are running
|
||||
for dep in self.sqdata.sq_covered_tasks[tid]:
|
||||
|
||||
@@ -525,6 +525,32 @@ class SignatureGeneratorUniHashMixIn(object):
|
||||
except OSError:
|
||||
pass
|
||||
|
||||
def report_unihash_equiv(self, tid, taskhash, wanted_unihash, current_unihash, datacaches):
|
||||
try:
|
||||
extra_data = {}
|
||||
data = self.client().report_unihash_equiv(taskhash, self.method, wanted_unihash, extra_data)
|
||||
bb.note('Reported task %s as unihash %s to %s (%s)' % (tid, wanted_unihash, self.server, str(data)))
|
||||
|
||||
if data is None:
|
||||
bb.warn("Server unable to handle unihash report")
|
||||
return False
|
||||
|
||||
finalunihash = data['unihash']
|
||||
|
||||
if finalunihash == current_unihash:
|
||||
bb.note('Task %s unihash %s unchanged by server' % (tid, finalunihash))
|
||||
elif finalunihash == wanted_unihash:
|
||||
bb.note('Task %s unihash changed %s -> %s as wanted' % (tid, current_unihash, finalunihash))
|
||||
self.set_unihash(tid, finalunihash)
|
||||
return True
|
||||
else:
|
||||
# TODO: What to do here?
|
||||
bb.note('Task %s unihash reported as unwanted hash %s' % (tid, finalunihash))
|
||||
|
||||
except hashserv.client.HashConnectionError as e:
|
||||
bb.warn('Error contacting Hash Equivalence Server %s: %s' % (self.server, str(e)))
|
||||
|
||||
return False
|
||||
|
||||
#
|
||||
# Dummy class used for bitbake-selftest
|
||||
|
||||
Reference in New Issue
Block a user