Check item cache hash before unpacking content

Prevents warning messages, when the cache layout is changed.
This commit is contained in:
Unrud 2017-09-17 14:03:47 +02:00
parent 1065c0b359
commit a9e5e00624

View File

@ -1317,14 +1317,15 @@ class Collection(BaseCollection):
if not lock.in_use(): if not lock.in_use():
del self._cache_locks[lock_id] del self._cache_locks[lock_id]
def _load_item_cache(self, href): def _load_item_cache(self, href, input_hash):
cache_folder = os.path.join(self._filesystem_path, ".Radicale.cache", cache_folder = os.path.join(self._filesystem_path, ".Radicale.cache",
"item") "item")
cache_hash = uid = etag = text = name = tag = start = end = None cache_hash = uid = etag = text = name = tag = start = end = None
try: try:
with open(os.path.join(cache_folder, href), "rb") as f: with open(os.path.join(cache_folder, href), "rb") as f:
cache_hash, uid, etag, text, name, tag, start, end = \ cache_hash, *content = pickle.load(f)
pickle.load(f) if cache_hash == input_hash:
uid, etag, text, name, tag, start, end = content
except FileNotFoundError as e: except FileNotFoundError as e:
pass pass
except (pickle.UnpicklingError, ValueError) as e: except (pickle.UnpicklingError, ValueError) as e:
@ -1365,7 +1366,7 @@ class Collection(BaseCollection):
# if the entry in the cache is still valid. # if the entry in the cache is still valid.
input_hash = self._item_cache_hash(raw_text) input_hash = self._item_cache_hash(raw_text)
cache_hash, uid, etag, text, name, tag, start, end = \ cache_hash, uid, etag, text, name, tag, start, end = \
self._load_item_cache(href) self._load_item_cache(href, input_hash)
vobject_item = None vobject_item = None
if input_hash != cache_hash: if input_hash != cache_hash:
with contextlib.ExitStack() as lock_stack: with contextlib.ExitStack() as lock_stack:
@ -1376,7 +1377,7 @@ class Collection(BaseCollection):
lock_stack.enter_context(self._acquire_cache_lock("item")) lock_stack.enter_context(self._acquire_cache_lock("item"))
# Check if another process created the file in the meantime # Check if another process created the file in the meantime
cache_hash, uid, etag, text, name, tag, start, end = \ cache_hash, uid, etag, text, name, tag, start, end = \
self._load_item_cache(href) self._load_item_cache(href, input_hash)
if input_hash != cache_hash: if input_hash != cache_hash:
try: try:
vobject_items = tuple(vobject.readComponents( vobject_items = tuple(vobject.readComponents(