diff options
Diffstat (limited to 'bitbake/lib')
-rw-r--r-- | bitbake/lib/bb/runqueue.py | 31 | ||||
-rw-r--r-- | bitbake/lib/bb/siggen.py | 26 |
2 files changed, 45 insertions, 12 deletions
diff --git a/bitbake/lib/bb/runqueue.py b/bitbake/lib/bb/runqueue.py index bd7f03f981..a869ba527a 100644 --- a/bitbake/lib/bb/runqueue.py +++ b/bitbake/lib/bb/runqueue.py | |||
@@ -2283,12 +2283,26 @@ class RunQueueExecute: | |||
2283 | for dep in self.rqdata.runtaskentries[tid].depends: | 2283 | for dep in self.rqdata.runtaskentries[tid].depends: |
2284 | procdep.append(dep) | 2284 | procdep.append(dep) |
2285 | orighash = self.rqdata.runtaskentries[tid].hash | 2285 | orighash = self.rqdata.runtaskentries[tid].hash |
2286 | self.rqdata.runtaskentries[tid].hash = bb.parse.siggen.get_taskhash(tid, procdep, self.rqdata.dataCaches[mc_from_tid(tid)]) | 2286 | newhash = bb.parse.siggen.get_taskhash(tid, procdep, self.rqdata.dataCaches[mc_from_tid(tid)]) |
2287 | origuni = self.rqdata.runtaskentries[tid].unihash | 2287 | origuni = self.rqdata.runtaskentries[tid].unihash |
2288 | self.rqdata.runtaskentries[tid].unihash = bb.parse.siggen.get_unihash(tid) | 2288 | newuni = bb.parse.siggen.get_unihash(tid) |
2289 | logger.debug(1, "Task %s hash changes: %s->%s %s->%s" % (tid, orighash, self.rqdata.runtaskentries[tid].hash, origuni, self.rqdata.runtaskentries[tid].unihash)) | 2289 | # FIXME, need to check it can come from sstate at all for determinism? |
2290 | remapped = False | ||
2291 | if newuni == origuni: | ||
2292 | # Nothing to do, we match, skip code below | ||
2293 | remapped = True | ||
2294 | elif tid in self.scenequeue_covered or tid in self.sq_live: | ||
2295 | # Already ran this setscene task or it running. Report the new taskhash | ||
2296 | remapped = bb.parse.siggen.report_unihash_equiv(tid, newhash, origuni, newuni, self.rqdata.dataCaches) | ||
2297 | logger.info("Already covered setscene for %s so ignoring rehash (remap)" % (tid)) | ||
2298 | |||
2299 | if not remapped: | ||
2300 | logger.debug(1, "Task %s hash changes: %s->%s %s->%s" % (tid, orighash, newhash, origuni, newuni)) | ||
2301 | self.rqdata.runtaskentries[tid].hash = newhash | ||
2302 | self.rqdata.runtaskentries[tid].unihash = newuni | ||
2303 | changed.add(tid) | ||
2304 | |||
2290 | next |= self.rqdata.runtaskentries[tid].revdeps | 2305 | next |= self.rqdata.runtaskentries[tid].revdeps |
2291 | changed.add(tid) | ||
2292 | total.remove(tid) | 2306 | total.remove(tid) |
2293 | next.intersection_update(total) | 2307 | next.intersection_update(total) |
2294 | 2308 | ||
@@ -2307,18 +2321,11 @@ class RunQueueExecute: | |||
2307 | self.pending_migrations.add(tid) | 2321 | self.pending_migrations.add(tid) |
2308 | 2322 | ||
2309 | for tid in self.pending_migrations.copy(): | 2323 | for tid in self.pending_migrations.copy(): |
2310 | if tid in self.runq_running: | 2324 | if tid in self.runq_running or tid in self.sq_live: |
2311 | # Too late, task already running, not much we can do now | 2325 | # Too late, task already running, not much we can do now |
2312 | self.pending_migrations.remove(tid) | 2326 | self.pending_migrations.remove(tid) |
2313 | continue | 2327 | continue |
2314 | 2328 | ||
2315 | if tid in self.scenequeue_covered or tid in self.sq_live: | ||
2316 | # Already ran this setscene task or it running | ||
2317 | # Potentially risky, should we report this hash as a match? | ||
2318 | logger.info("Already covered setscene for %s so ignoring rehash" % (tid)) | ||
2319 | self.pending_migrations.remove(tid) | ||
2320 | continue | ||
2321 | |||
2322 | valid = True | 2329 | valid = True |
2323 | # Check no tasks this covers are running | 2330 | # Check no tasks this covers are running |
2324 | for dep in self.sqdata.sq_covered_tasks[tid]: | 2331 | for dep in self.sqdata.sq_covered_tasks[tid]: |
diff --git a/bitbake/lib/bb/siggen.py b/bitbake/lib/bb/siggen.py index e19812b17c..edf10105f9 100644 --- a/bitbake/lib/bb/siggen.py +++ b/bitbake/lib/bb/siggen.py | |||
@@ -525,6 +525,32 @@ class SignatureGeneratorUniHashMixIn(object): | |||
525 | except OSError: | 525 | except OSError: |
526 | pass | 526 | pass |
527 | 527 | ||
528 | def report_unihash_equiv(self, tid, taskhash, wanted_unihash, current_unihash, datacaches): | ||
529 | try: | ||
530 | extra_data = {} | ||
531 | data = self.client().report_unihash_equiv(taskhash, self.method, wanted_unihash, extra_data) | ||
532 | bb.note('Reported task %s as unihash %s to %s (%s)' % (tid, wanted_unihash, self.server, str(data))) | ||
533 | |||
534 | if data is None: | ||
535 | bb.warn("Server unable to handle unihash report") | ||
536 | return False | ||
537 | |||
538 | finalunihash = data['unihash'] | ||
539 | |||
540 | if finalunihash == current_unihash: | ||
541 | bb.note('Task %s unihash %s unchanged by server' % (tid, finalunihash)) | ||
542 | elif finalunihash == wanted_unihash: | ||
543 | bb.note('Task %s unihash changed %s -> %s as wanted' % (tid, current_unihash, finalunihash)) | ||
544 | self.set_unihash(tid, finalunihash) | ||
545 | return True | ||
546 | else: | ||
547 | # TODO: What to do here? | ||
548 | bb.note('Task %s unihash reported as unwanted hash %s' % (tid, finalunihash)) | ||
549 | |||
550 | except hashserv.client.HashConnectionError as e: | ||
551 | bb.warn('Error contacting Hash Equivalence Server %s: %s' % (self.server, str(e))) | ||
552 | |||
553 | return False | ||
528 | 554 | ||
529 | # | 555 | # |
530 | # Dummy class used for bitbake-selftest | 556 | # Dummy class used for bitbake-selftest |