Fixed #34209 -- Prevented FileBasedCache.has_key() crash caused by a race condition.

This commit is contained in:
Marti Raudsepp 2022-12-13 11:20:25 +02:00 committed by Mariusz Felisiak
parent 1d0fa848e0
commit 32268456d6
2 changed files with 9 additions and 2 deletions

View File

@ -90,10 +90,11 @@ class FileBasedCache(BaseCache):
def has_key(self, key, version=None):
fname = self._key_to_file(key, version)
if os.path.exists(fname):
try:
with open(fname, "rb") as f:
return not self._is_expired(f)
return False
except FileNotFoundError:
return False
def _cull(self):
"""

View File

@ -1762,6 +1762,12 @@ class FileBasedCacheTests(BaseCacheTests, TestCase):
with open(cache_file, "rb") as fh:
self.assertIs(cache._is_expired(fh), True)
def test_has_key_race_handling(self):
self.assertIs(cache.add("key", "value"), True)
with mock.patch("builtins.open", side_effect=FileNotFoundError) as mocked_open:
self.assertIs(cache.has_key("key"), False)
mocked_open.assert_called_once()
@unittest.skipUnless(RedisCache_params, "Redis backend not configured")
@override_settings(