mirror of
https://github.com/django/django.git
synced 2025-08-03 18:38:50 +00:00
Fixed #20536 -- rewrite of the file based cache backend
* Safer for use in multiprocess environments * Better random culling * Cache files use less disk space * Safer delete behavior Also fixed #15806, fixed #15825.
This commit is contained in:
parent
ac2d86f8d3
commit
7be638390e
3 changed files with 143 additions and 145 deletions
48
tests/cache/tests.py
vendored
48
tests/cache/tests.py
vendored
|
@ -1076,33 +1076,35 @@ class FileBasedCacheTests(unittest.TestCase, BaseCacheTests):
|
|||
|
||||
def tearDown(self):
|
||||
self.cache.clear()
|
||||
|
||||
def test_hashing(self):
|
||||
"""Test that keys are hashed into subdirectories correctly"""
|
||||
self.cache.set("foo", "bar")
|
||||
key = self.cache.make_key("foo")
|
||||
keyhash = hashlib.md5(key.encode()).hexdigest()
|
||||
keypath = os.path.join(self.dirname, keyhash[:2], keyhash[2:4], keyhash[4:])
|
||||
self.assertTrue(os.path.exists(keypath))
|
||||
|
||||
def test_subdirectory_removal(self):
|
||||
"""
|
||||
Make sure that the created subdirectories are correctly removed when empty.
|
||||
"""
|
||||
self.cache.set("foo", "bar")
|
||||
key = self.cache.make_key("foo")
|
||||
keyhash = hashlib.md5(key.encode()).hexdigest()
|
||||
keypath = os.path.join(self.dirname, keyhash[:2], keyhash[2:4], keyhash[4:])
|
||||
self.assertTrue(os.path.exists(keypath))
|
||||
|
||||
self.cache.delete("foo")
|
||||
self.assertTrue(not os.path.exists(keypath))
|
||||
self.assertTrue(not os.path.exists(os.path.dirname(keypath)))
|
||||
self.assertTrue(not os.path.exists(os.path.dirname(os.path.dirname(keypath))))
|
||||
os.rmdir(self.dirname)
|
||||
|
||||
def test_cull(self):
|
||||
self.perform_cull_test(50, 29)
|
||||
|
||||
def test_ignores_non_cache_files(self):
|
||||
fname = os.path.join(self.dirname, 'not-a-cache-file')
|
||||
with open(fname, 'w'):
|
||||
os.utime(fname, None)
|
||||
self.cache.clear()
|
||||
self.assertTrue(os.path.exists(fname),
|
||||
'Expected cache.clear to ignore non cache files')
|
||||
os.remove(fname)
|
||||
|
||||
def test_clear_does_not_remove_cache_dir(self):
|
||||
self.cache.clear()
|
||||
self.assertTrue(os.path.exists(self.dirname),
|
||||
'Expected cache.clear to keep the cache dir')
|
||||
|
||||
def test_creates_cache_dir_if_nonexistent(self):
|
||||
os.rmdir(self.dirname)
|
||||
self.cache.set('foo', 'bar')
|
||||
os.path.exists(self.dirname)
|
||||
|
||||
def test_zero_cull(self):
|
||||
# Regression test for #15806
|
||||
self.cache = get_cache(self.backend_name, LOCATION=self.dirname, OPTIONS={'MAX_ENTRIES': 30, 'CULL_FREQUENCY': 0})
|
||||
self.perform_cull_test(50, 19)
|
||||
|
||||
|
||||
class CustomCacheKeyValidationTests(unittest.TestCase):
|
||||
"""
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue