summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--bitbake/lib/bb/runqueue.py69
-rw-r--r--bitbake/lib/bb/siggen.py24
2 files changed, 67 insertions, 26 deletions
diff --git a/bitbake/lib/bb/runqueue.py b/bitbake/lib/bb/runqueue.py
index cb499a1cba6..ed895073e6d 100644
--- a/bitbake/lib/bb/runqueue.py
+++ b/bitbake/lib/bb/runqueue.py
@@ -1711,6 +1711,7 @@ class RunQueueExecute:
self.runq_buildable = set()
self.runq_running = set()
self.runq_complete = set()
+ self.runq_covered = set()
self.build_stamps = {}
self.build_stamps2 = []
@@ -1908,7 +1909,7 @@ class RunQueueExecute:
if self.rqdata.taskData[''].abort:
self.rq.state = runQueueCleanUp
- def task_skip(self, task, reason):
+ def _task_skip(self, task, reason):
self.runq_running.add(task)
self.setbuildable(task)
bb.event.fire(runQueueTaskSkipped(task, self.stats, self.rq, reason), self.cfgData)
@@ -1916,6 +1917,13 @@ class RunQueueExecute:
self.stats.taskSkipped()
self.stats.taskCompleted()
+ def task_skip_covered(self, task):
+ self._task_skip(task, "covered")
+ self.runq_covered.add(task)
+
+ def task_skip_current(self, task):
+ self._task_skip(task, "current")
+
def summarise_scenequeue_errors(self):
err = False
if not self.sqdone:
@@ -2083,13 +2091,12 @@ class RunQueueExecute:
if task in self.tasks_covered:
logger.debug(2, "Setscene covered task %s", task)
- self.task_skip(task, "covered")
+ self.task_skip_covered(task)
return True
if self.rq.check_stamp_task(task, taskname, cache=self.stampcache):
logger.debug(2, "Stamp current task %s", task)
-
- self.task_skip(task, "existing")
+ self.task_skip_current(task)
return True
taskdep = self.rqdata.dataCaches[mc].task_deps[taskfn]
@@ -2270,6 +2277,7 @@ class RunQueueExecute:
next |= self.rqdata.runtaskentries[ntid].revdeps
next.difference_update(total)
+ uncover = set()
# Now iterate those tasks in dependency order to regenerate their taskhash/unihash
done = set()
next = set(self.rqdata.runtaskentries[tid].revdeps)
@@ -2286,17 +2294,26 @@ class RunQueueExecute:
newhash = bb.parse.siggen.get_taskhash(tid, procdep, self.rqdata.dataCaches[mc_from_tid(tid)])
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:
+ if newuni != origuni and tid in self.scenequeue_covered or tid in self.sq_live:
+ # Already ran this setscene task or it running. Report the new taskhash
+ serveruni = 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 serveruni is not None:
+ if serveruni == newuni:
+ bb.note('Task %s unihash %s unchanged by server' % (tid, serveruni))
+ uncover |= (self.rqdata.runtaskentries[tid].depends & self.runq_covered)
+ elif serveruni == origuni:
+ bb.note('Task %s unihash changed %s -> %s as wanted' % (tid, newuni, serveruni))
+ bb.parse.siggen.set_unihash(tid, serveruni)
+ else:
+ bb.note('Task %s unihash reported as unwanted hash %s' % (tid, serveruni))
+ uncover |= (self.rqdata.runtaskentries[tid].depends & self.runq_covered)
+
+ newuni = serveruni
+
+ if newuni != origuni:
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
@@ -2306,6 +2323,30 @@ class RunQueueExecute:
total.remove(tid)
next.intersection_update(total)
+ # Uncover any tasks previously covered by setsecene that
+ while uncover:
+ next_uncover = set()
+ for tid in uncover:
+ if not tid in self.runq_complete:
+ logger.warn("Covered task %s has not completed!" % tid)
+ continue
+
+ self.runq_buildable.remove(tid)
+ self.runq_running.remove(tid)
+ self.runq_complete.remove(tid)
+
+ uncovered_deps = (self.rqdata.runtaskentries[tid].depends & self.runq_covered)
+ for dep in self.rqdata.runtaskentries[tid].depends:
+ if dep not in self.runq_complete or dep in uncovered_deps:
+ break
+ else:
+ self.setbuildable(tid)
+ logger.info("Previously covered task %s now buildable", tid)
+
+ next_uncover |= uncovered_deps
+
+ uncover = next_uncover
+
if changed:
for mc in self.rq.worker:
self.rq.worker[mc].process.stdin.write(b"<newtaskhashes>" + pickle.dumps(bb.parse.siggen.get_taskhashes()) + b"</newtaskhashes>")
diff --git a/bitbake/lib/bb/siggen.py b/bitbake/lib/bb/siggen.py
index dbf510238f4..f893fdbba73 100644
--- a/bitbake/lib/bb/siggen.py
+++ b/bitbake/lib/bb/siggen.py
@@ -538,24 +538,24 @@ class SignatureGeneratorUniHashMixIn(object):
if data is None:
bb.warn("Server unable to handle unihash report")
- return False
+ return None
- finalunihash = data['unihash']
+ return 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))
+ #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
+ return None
#
# Dummy class used for bitbake-selftest