summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--bitbake/lib/bb/runqueue.py17
-rw-r--r--bitbake/lib/bb/siggen.py20
-rw-r--r--bitbake/lib/hashserv/server.py59
3 files changed, 38 insertions, 58 deletions
diff --git a/bitbake/lib/bb/runqueue.py b/bitbake/lib/bb/runqueue.py
index 2813462489a..f505488768a 100644
--- a/bitbake/lib/bb/runqueue.py
+++ b/bitbake/lib/bb/runqueue.py
@@ -2289,12 +2289,13 @@ class RunQueueExecute:
newuni = bb.parse.siggen.get_unihash(tid)
# FIXME, need to check it can come from sstate at all for determinism?
remapped = False
- if tid in self.scenequeue_covered or tid in self.sq_live:
- # Already ran this setscene task or it running
- remapped = bb.parse.siggen.report_unihash_equiv(tid, origuni, newuni, self.rqdata.dataCaches)
- logger.info("Already covered setscene for %s so ignoring rehash" % (tid))
+ if (tid in self.scenequeue_covered or tid in self.sq_live) and newuni != origuni:
+ # 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, self.rqdata.runtaskentries[tid].hash, origuni, self.rqdata.runtaskentries[tid].unihash))
+ 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
self.rehashes[tid] = origuni
@@ -2331,9 +2332,9 @@ class RunQueueExecute:
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
- bb.parse.siggen.report_unihash_equiv(tid, self.rehashes[tid], self.rqdata.runtaskentries[tid].unihash, self.rqdata.dataCaches)
- logger.info("Already covered setscene for %s so ignoring rehash" % (tid))
+ # "Force" the new taskhash to be equivalent to the old unihash
+ bb.parse.siggen.report_unihash_equiv(tid, self.rqdata.runtaskentries[tid].hash, self.rehashes[tid], self.rqdata.runtaskentries[tid].unihash, self.rqdata.dataCaches)
+ logger.info("Already covered setscene for %s so ignoring rehash (pending migration)" % (tid))
self.pending_migrations.remove(tid)
continue
diff --git a/bitbake/lib/bb/siggen.py b/bitbake/lib/bb/siggen.py
index bc912032664..bc8bdeeceab 100644
--- a/bitbake/lib/bb/siggen.py
+++ b/bitbake/lib/bb/siggen.py
@@ -525,29 +525,33 @@ class SignatureGeneratorUniHashMixIn(object):
except OSError:
pass
- def report_unihash_equiv(self, tid, oldunihash, newunihash, datacaches):
+ def report_unihash_equiv(self, tid, taskhash, wanted_unihash, current_unihash, datacaches):
try:
extra_data = {}
- data = self.client().report_unihash_equiv(newunihash, self.method, oldunihash, extra_data)
- bb.note('Reported task %s as unihash %s to %s (%s)' % (tid, newunihash, self.server, str(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
+ return False
finalunihash = data['unihash']
- if newunihash != finalunihash:
- bb.note('Task %s unihash changed %s -> %s (%s)' % (tid, newunihash, finalunihash, oldunihash))
+ 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:
- bb.note('Task %s unihash %s unchanged by server' % (tid, finalunihash))
- return False
+ # 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
#
diff --git a/bitbake/lib/hashserv/server.py b/bitbake/lib/hashserv/server.py
index 0a7d932f023..cc7e48233ba 100644
--- a/bitbake/lib/hashserv/server.py
+++ b/bitbake/lib/hashserv/server.py
@@ -306,60 +306,35 @@ class ServerClient(object):
async def handle_equivreport(self, data):
with closing(self.db.cursor()) as cursor:
- cursor.execute('''
- -- Find the task entry for the matching taskhash
- SELECT unihash, outhash FROM tasks_v2 WHERE method=:method AND taskhash=:unihash
-
- -- Only return one row
- LIMIT 1
- ''', {k: data[k] for k in ('method', 'unihash')})
-
- row = cursor.fetchone()
-
- if row is None:
- self.write_message(None)
- return
-
insert_data = {
'method': data['method'],
- 'outhash': row['outhash'],
+ 'outhash': "",
'taskhash': data['taskhash'],
- 'unihash': row['unihash'],
+ 'unihash': data['unihash'],
'created': datetime.now()
}
+ for k in ('owner', 'PN', 'PV', 'PR', 'task', 'outhash_siginfo'):
+ if k in data:
+ insert_data[k] = data[k]
- cursor.execute('''
- -- Find the task entry for the matching taskhash
- SELECT outhash FROM tasks_v2 WHERE method=:method AND taskhash=:taskhash AND outhash=:outhash
+ cursor.execute('''INSERT OR IGNORE INTO tasks_v2 (%s) VALUES (%s)''' % (
+ ', '.join(sorted(insert_data.keys())),
+ ', '.join(':' + k for k in sorted(insert_data.keys()))),
+ insert_data)
- -- Only return one row
- LIMIT 1
- ''', {k: insert_data[k] for k in ('method', 'taskhash', 'outhash')})
+ self.db.commit()
- row2 = cursor.fetchone()
+ # Fetch the unihash that will be reported for the taskhash. If the
+ # unihash matches, it means this row was inserted (or the mapping
+ # was already valid)
+ row = self.query_equivalent(data['method'], data['taskhash'])
- if row2 is None:
- for k in ('owner', 'PN', 'PV', 'PR', 'task', 'outhash_siginfo'):
- if k in data:
- insert_data[k] = data[k]
-
- cursor.execute('''INSERT INTO tasks_v2 (%s) VALUES (%s)''' % (
- ', '.join(sorted(insert_data.keys())),
- ', '.join(':' + k for k in sorted(insert_data.keys()))),
- insert_data)
-
- self.db.commit()
-
- logger.info('Adding taskhash equivaence for %s with unihash %s',
+ if row['unihash'] == data['unihash']:
+ logger.info('Adding taskhash equivalence for %s with unihash %s',
data['taskhash'], row['unihash'])
- d = {
- 'taskhash': data['taskhash'],
- 'method': data['method'],
- 'unihash': row['unihash'],
- 'outhash': row['outhash'],
- }
+ d = {k: row[k] for k in ('taskhash', 'method', 'unihash')}
self.write_message(d)