summaryrefslogtreecommitdiffstats
path: root/bitbake
diff options
context:
space:
mode:
authorRichard Purdie <richard.purdie@linuxfoundation.org>2016-07-22 11:28:57 +0100
committerRichard Purdie <richard.purdie@linuxfoundation.org>2016-07-26 08:10:35 +0100
commit7f6b6b2ab907cbf3c2811740bf9ad562e02dccaa (patch)
tree1e365617f0ac7d7138565acf6f2639737fc6ea86 /bitbake
parent5d41200113c32d61c2495aae72525e3f7a84715b (diff)
downloadpoky-7f6b6b2ab907cbf3c2811740bf9ad562e02dccaa.tar.gz
bitbake: cache: Don't interleave pickle cache file writing
For some reason the data written in this way is coming back out the files out of order. I've not been able to simplify the test case to a point where this was standalone reproducible. Simplify the code and write out the cache files sequentially since this seems to avoid the errors and makes the code more readable. (Bitbake rev: 14ec47f5f0566dbd280fae8a03160c8500ad3929) Signed-off-by: Richard Purdie <richard.purdie@linuxfoundation.org>
Diffstat (limited to 'bitbake')
-rw-r--r--bitbake/lib/bb/cache.py27
1 files changed, 10 insertions, 17 deletions
diff --git a/bitbake/lib/bb/cache.py b/bitbake/lib/bb/cache.py
index 439565f5a6..c09f9296bd 100644
--- a/bitbake/lib/bb/cache.py
+++ b/bitbake/lib/bb/cache.py
@@ -601,26 +601,19 @@ class Cache(object):
601 logger.debug(2, "Cache is clean, not saving.") 601 logger.debug(2, "Cache is clean, not saving.")
602 return 602 return
603 603
604 file_dict = {}
605 pickler_dict = {}
606 for cache_class in self.caches_array: 604 for cache_class in self.caches_array:
607 cache_class_name = cache_class.__name__ 605 cache_class_name = cache_class.__name__
608 cachefile = getCacheFile(self.cachedir, cache_class.cachefile, self.data_hash) 606 cachefile = getCacheFile(self.cachedir, cache_class.cachefile, self.data_hash)
609 file_dict[cache_class_name] = open(cachefile, "wb") 607 with open(cachefile, "wb") as f:
610 pickler_dict[cache_class_name] = pickle.Pickler(file_dict[cache_class_name], pickle.HIGHEST_PROTOCOL) 608 p = pickle.Pickler(f, pickle.HIGHEST_PROTOCOL)
611 pickler_dict[cache_class_name].dump(__cache_version__) 609 p.dump(__cache_version__)
612 pickler_dict[cache_class_name].dump(bb.__version__) 610 p.dump(bb.__version__)
613 611
614 try: 612 for key, info_array in self.depends_cache.items():
615 for key, info_array in self.depends_cache.items(): 613 for info in info_array:
616 for info in info_array: 614 if isinstance(info, RecipeInfoCommon) and info.__class__.__name__ == cache_class_name:
617 cache_class_name = info.__class__.__name__ 615 p.dump(key)
618 pickler_dict[cache_class_name].dump(key) 616 p.dump(info)
619 pickler_dict[cache_class_name].dump(info)
620 finally:
621 for cache_class in self.caches_array:
622 cache_class_name = cache_class.__name__
623 file_dict[cache_class_name].close()
624 617
625 del self.depends_cache 618 del self.depends_cache
626 619