From 1c1a22963236c6015724bfbf43dd56dbe40a6cf9 Mon Sep 17 00:00:00 2001 From: Jannis Leidel Date: Thu, 10 May 2012 18:29:34 +0200 Subject: [PATCH] Set the post process cache when finished instead of one by one. This should prevent a race condition if running collectstatic is canceled or its cache is accessed from other processes, leaving the cache in a corrupt state. --- django/contrib/staticfiles/storage.py | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/django/contrib/staticfiles/storage.py b/django/contrib/staticfiles/storage.py index ea18497d53..7b5866a699 100644 --- a/django/contrib/staticfiles/storage.py +++ b/django/contrib/staticfiles/storage.py @@ -189,8 +189,8 @@ class CachedFilesMixin(object): if dry_run: return - # delete cache of all handled paths - self.cache.delete_many([self.cache_key(path) for path in paths]) + # where to store the new paths + hashed_paths = {} # build a list of adjustable files matches = lambda path: matches_patterns(path, self._patterns.keys()) @@ -239,9 +239,12 @@ class CachedFilesMixin(object): hashed_name = force_unicode(saved_name.replace('\\', '/')) # and then set the cache accordingly - self.cache.set(self.cache_key(name), hashed_name) + hashed_paths[self.cache_key(name)] = hashed_name yield name, hashed_name, processed + # Finally set the cache + self.cache.set_many(hashed_paths) + class CachedStaticFilesStorage(CachedFilesMixin, StaticFilesStorage): """