[bitbake-devel] [PATCH] cache: Don't interleave pickle cache file writing

Richard Purdie richard.purdie at linuxfoundation.org
Fri Jul 22 10:28:57 UTC 2016


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.

Signed-off-by: Richard Purdie <richard.purdie at linuxfoundation.org>

diff --git a/bitbake/lib/bb/cache.py b/bitbake/lib/bb/cache.py
index 439565f..c09f929 100644
--- a/bitbake/lib/bb/cache.py
+++ b/bitbake/lib/bb/cache.py
@@ -601,26 +601,19 @@ class Cache(object):
             logger.debug(2, "Cache is clean, not saving.")
             return
 
-        file_dict = {}
-        pickler_dict = {}
         for cache_class in self.caches_array:
             cache_class_name = cache_class.__name__
             cachefile = getCacheFile(self.cachedir, cache_class.cachefile, self.data_hash)
-            file_dict[cache_class_name] = open(cachefile, "wb")
-            pickler_dict[cache_class_name] =  pickle.Pickler(file_dict[cache_class_name], pickle.HIGHEST_PROTOCOL)
-            pickler_dict[cache_class_name].dump(__cache_version__)
-            pickler_dict[cache_class_name].dump(bb.__version__)
-
-        try:
-            for key, info_array in self.depends_cache.items():
-                for info in info_array:
-                    cache_class_name = info.__class__.__name__
-                    pickler_dict[cache_class_name].dump(key)
-                    pickler_dict[cache_class_name].dump(info)
-        finally:
-            for cache_class in self.caches_array:
-                cache_class_name = cache_class.__name__
-                file_dict[cache_class_name].close()
+            with open(cachefile, "wb") as f:
+                p = pickle.Pickler(f, pickle.HIGHEST_PROTOCOL)
+                p.dump(__cache_version__)
+                p.dump(bb.__version__)
+
+                for key, info_array in self.depends_cache.items():
+                    for info in info_array:
+                        if isinstance(info, RecipeInfoCommon) and info.__class__.__name__ == cache_class_name:
+                            p.dump(key)
+                            p.dump(info)
 
         del self.depends_cache
 





More information about the bitbake-devel mailing list