diff options
Diffstat (limited to 'bitbake/lib')
-rw-r--r-- | bitbake/lib/bb/siggen.py | 50 |
1 files changed, 32 insertions, 18 deletions
diff --git a/bitbake/lib/bb/siggen.py b/bitbake/lib/bb/siggen.py index ded1da020f..209a342883 100644 --- a/bitbake/lib/bb/siggen.py +++ b/bitbake/lib/bb/siggen.py | |||
@@ -44,6 +44,7 @@ class SignatureGenerator(object): | |||
44 | self.file_checksum_values = {} | 44 | self.file_checksum_values = {} |
45 | self.taints = {} | 45 | self.taints = {} |
46 | self.unitaskhashes = {} | 46 | self.unitaskhashes = {} |
47 | self.tidtopn = {} | ||
47 | self.setscenetasks = set() | 48 | self.setscenetasks = set() |
48 | 49 | ||
49 | def finalise(self, fn, d, varient): | 50 | def finalise(self, fn, d, varient): |
@@ -79,19 +80,19 @@ class SignatureGenerator(object): | |||
79 | return | 80 | return |
80 | 81 | ||
81 | def get_taskdata(self): | 82 | def get_taskdata(self): |
82 | return (self.runtaskdeps, self.taskhash, self.file_checksum_values, self.taints, self.basehash, self.unitaskhashes, self.setscenetasks) | 83 | return (self.runtaskdeps, self.taskhash, self.file_checksum_values, self.taints, self.basehash, self.unitaskhashes, self.tidtopn, self.setscenetasks) |
83 | 84 | ||
84 | def set_taskdata(self, data): | 85 | def set_taskdata(self, data): |
85 | self.runtaskdeps, self.taskhash, self.file_checksum_values, self.taints, self.basehash, self.unitaskhashes, self.setscenetasks = data | 86 | self.runtaskdeps, self.taskhash, self.file_checksum_values, self.taints, self.basehash, self.unitaskhashes, self.tidtopn, self.setscenetasks = data |
86 | 87 | ||
87 | def reset(self, data): | 88 | def reset(self, data): |
88 | self.__init__(data) | 89 | self.__init__(data) |
89 | 90 | ||
90 | def get_taskhashes(self): | 91 | def get_taskhashes(self): |
91 | return self.taskhash, self.unitaskhashes | 92 | return self.taskhash, self.unitaskhashes, self.tidtopn |
92 | 93 | ||
93 | def set_taskhashes(self, hashes): | 94 | def set_taskhashes(self, hashes): |
94 | self.taskhash, self.unitaskhashes = hashes | 95 | self.taskhash, self.unitaskhashes, self.tidtopn = hashes |
95 | 96 | ||
96 | def save_unitaskhashes(self): | 97 | def save_unitaskhashes(self): |
97 | return | 98 | return |
@@ -124,9 +125,10 @@ class SignatureGeneratorBasic(SignatureGenerator): | |||
124 | else: | 125 | else: |
125 | self.checksum_cache = None | 126 | self.checksum_cache = None |
126 | 127 | ||
127 | self.unihash_cache = bb.cache.SimpleCache("1") | 128 | self.unihash_cache = bb.cache.SimpleCache("3") |
128 | self.unitaskhashes = self.unihash_cache.init_cache(data, "bb_unihashes.dat", {}) | 129 | self.unitaskhashes = self.unihash_cache.init_cache(data, "bb_unihashes.dat", {}) |
129 | self.localdirsexclude = (data.getVar("BB_SIGNATURE_LOCAL_DIRS_EXCLUDE") or "CVS .bzr .git .hg .osc .p4 .repo .svn").split() | 130 | self.localdirsexclude = (data.getVar("BB_SIGNATURE_LOCAL_DIRS_EXCLUDE") or "CVS .bzr .git .hg .osc .p4 .repo .svn").split() |
131 | self.tidtopn = {} | ||
130 | 132 | ||
131 | def init_rundepcheck(self, data): | 133 | def init_rundepcheck(self, data): |
132 | self.taskwhitelist = data.getVar("BB_HASHTASK_WHITELIST") or None | 134 | self.taskwhitelist = data.getVar("BB_HASHTASK_WHITELIST") or None |
@@ -210,6 +212,9 @@ class SignatureGeneratorBasic(SignatureGenerator): | |||
210 | self.runtaskdeps[tid] = [] | 212 | self.runtaskdeps[tid] = [] |
211 | self.file_checksum_values[tid] = [] | 213 | self.file_checksum_values[tid] = [] |
212 | recipename = dataCache.pkg_fn[fn] | 214 | recipename = dataCache.pkg_fn[fn] |
215 | |||
216 | self.tidtopn[tid] = recipename | ||
217 | |||
213 | for dep in sorted(deps, key=clean_basepath): | 218 | for dep in sorted(deps, key=clean_basepath): |
214 | (depmc, _, deptaskname, depfn) = bb.runqueue.split_tid_mcfn(dep) | 219 | (depmc, _, deptaskname, depfn) = bb.runqueue.split_tid_mcfn(dep) |
215 | if mc != depmc: | 220 | if mc != depmc: |
@@ -407,24 +412,35 @@ class SignatureGeneratorUniHashMixIn(object): | |||
407 | self._client = hashserv.create_client(self.server) | 412 | self._client = hashserv.create_client(self.server) |
408 | return self._client | 413 | return self._client |
409 | 414 | ||
410 | def __get_task_unihash_key(self, tid): | ||
411 | # TODO: The key only *needs* to be the taskhash, the tid is just | ||
412 | # convenient | ||
413 | return '%s:%s' % (tid.rsplit("/", 1)[1], self.taskhash[tid]) | ||
414 | |||
415 | def get_stampfile_hash(self, tid): | 415 | def get_stampfile_hash(self, tid): |
416 | if tid in self.taskhash: | 416 | if tid in self.taskhash: |
417 | # If a unique hash is reported, use it as the stampfile hash. This | 417 | # If a unique hash is reported, use it as the stampfile hash. This |
418 | # ensures that if a task won't be re-run if the taskhash changes, | 418 | # ensures that if a task won't be re-run if the taskhash changes, |
419 | # but it would result in the same output hash | 419 | # but it would result in the same output hash |
420 | unihash = self.unitaskhashes.get(self.__get_task_unihash_key(tid), None) | 420 | unihash = self._get_unihash(tid) |
421 | if unihash is not None: | 421 | if unihash is not None: |
422 | return unihash | 422 | return unihash |
423 | 423 | ||
424 | return super().get_stampfile_hash(tid) | 424 | return super().get_stampfile_hash(tid) |
425 | 425 | ||
426 | def set_unihash(self, tid, unihash): | 426 | def set_unihash(self, tid, unihash): |
427 | self.unitaskhashes[self.__get_task_unihash_key(tid)] = unihash | 427 | (mc, fn, taskname, taskfn) = bb.runqueue.split_tid_mcfn(tid) |
428 | key = mc + ":" + self.tidtopn[tid] + ":" + taskname | ||
429 | self.unitaskhashes[key] = (self.taskhash[tid], unihash) | ||
430 | |||
431 | def _get_unihash(self, tid, checkkey=None): | ||
432 | if tid not in self.tidtopn: | ||
433 | return None | ||
434 | (mc, fn, taskname, taskfn) = bb.runqueue.split_tid_mcfn(tid) | ||
435 | key = mc + ":" + self.tidtopn[tid] + ":" + taskname | ||
436 | if key not in self.unitaskhashes: | ||
437 | return None | ||
438 | if not checkkey: | ||
439 | checkkey = self.taskhash[tid] | ||
440 | (key, unihash) = self.unitaskhashes[key] | ||
441 | if key != checkkey: | ||
442 | return None | ||
443 | return unihash | ||
428 | 444 | ||
429 | def get_unihash(self, tid): | 445 | def get_unihash(self, tid): |
430 | taskhash = self.taskhash[tid] | 446 | taskhash = self.taskhash[tid] |
@@ -433,11 +449,9 @@ class SignatureGeneratorUniHashMixIn(object): | |||
433 | if self.setscenetasks and tid not in self.setscenetasks: | 449 | if self.setscenetasks and tid not in self.setscenetasks: |
434 | return taskhash | 450 | return taskhash |
435 | 451 | ||
436 | key = self.__get_task_unihash_key(tid) | ||
437 | |||
438 | # TODO: This cache can grow unbounded. It probably only needs to keep | 452 | # TODO: This cache can grow unbounded. It probably only needs to keep |
439 | # for each task | 453 | # for each task |
440 | unihash = self.unitaskhashes.get(key, None) | 454 | unihash = self._get_unihash(tid) |
441 | if unihash is not None: | 455 | if unihash is not None: |
442 | return unihash | 456 | return unihash |
443 | 457 | ||
@@ -472,7 +486,7 @@ class SignatureGeneratorUniHashMixIn(object): | |||
472 | except hashserv.client.HashConnectionError as e: | 486 | except hashserv.client.HashConnectionError as e: |
473 | bb.warn('Error contacting Hash Equivalence Server %s: %s' % (self.server, str(e))) | 487 | bb.warn('Error contacting Hash Equivalence Server %s: %s' % (self.server, str(e))) |
474 | 488 | ||
475 | self.unitaskhashes[key] = unihash | 489 | self.set_unihash(tid, unihash) |
476 | return unihash | 490 | return unihash |
477 | 491 | ||
478 | def report_unihash(self, path, task, d): | 492 | def report_unihash(self, path, task, d): |
@@ -484,13 +498,13 @@ class SignatureGeneratorUniHashMixIn(object): | |||
484 | tempdir = d.getVar('T') | 498 | tempdir = d.getVar('T') |
485 | fn = d.getVar('BB_FILENAME') | 499 | fn = d.getVar('BB_FILENAME') |
486 | tid = fn + ':do_' + task | 500 | tid = fn + ':do_' + task |
487 | key = tid.rsplit("/", 1)[1] + ':' + taskhash | 501 | key = tid + ':' + taskhash |
488 | 502 | ||
489 | if self.setscenetasks and tid not in self.setscenetasks: | 503 | if self.setscenetasks and tid not in self.setscenetasks: |
490 | return | 504 | return |
491 | 505 | ||
492 | # Sanity checks | 506 | # Sanity checks |
493 | cache_unihash = self.unitaskhashes.get(key, None) | 507 | cache_unihash = self._get_unihash(tid, checkkey=taskhash) |
494 | if cache_unihash is None: | 508 | if cache_unihash is None: |
495 | bb.fatal('%s not in unihash cache. Please report this error' % key) | 509 | bb.fatal('%s not in unihash cache. Please report this error' % key) |
496 | 510 | ||