diff --git a/django/core/cache/backends/filebased.py b/django/core/cache/backends/filebased.py
index 57bb63e..9cbd8b0 100644
a
|
b
|
import hashlib
|
4 | 4 | import os |
5 | 5 | import shutil |
6 | 6 | import time |
| 7 | import random |
7 | 8 | try: |
8 | 9 | import cPickle as pickle |
9 | 10 | except ImportError: |
… |
… |
class FileBasedCache(BaseCache):
|
113 | 114 | return |
114 | 115 | |
115 | 116 | try: |
116 | | filelist = sorted(os.listdir(self._dir)) |
| 117 | filelist = os.listdir(self._dir) |
117 | 118 | except (IOError, OSError): |
118 | 119 | return |
119 | 120 | |
120 | 121 | if self._cull_frequency == 0: |
121 | | doomed = filelist |
122 | | else: |
123 | | doomed = [os.path.join(self._dir, k) for (i, k) in enumerate(filelist) if i % self._cull_frequency == 0] |
| 122 | self.clear() |
| 123 | return |
| 124 | |
| 125 | ranno = random.randint(0, self._cull_frequency) |
| 126 | doomed = [ |
| 127 | os.path.join(self._dir, k) |
| 128 | for (i, k) in enumerate(filelist) |
| 129 | if i % self._cull_frequency == ranno] |
124 | 130 | |
125 | 131 | for topdir in doomed: |
126 | 132 | try: |
127 | | for root, _, files in os.walk(topdir): |
128 | | for f in files: |
129 | | self._delete(os.path.join(root, f)) |
| 133 | shutil.rmtree(topdir) |
130 | 134 | except (IOError, OSError): |
131 | 135 | pass |
132 | 136 | |
diff --git a/tests/regressiontests/cache/tests.py b/tests/regressiontests/cache/tests.py
index c5349d5..a0acb75 100644
a
|
b
|
class BaseCacheTests(object):
|
408 | 408 | self.assertEqual(self.cache.get('key3'), 'sausage') |
409 | 409 | self.assertEqual(self.cache.get('key4'), 'lobster bisque') |
410 | 410 | |
411 | | def perform_cull_test(self, initial_count, final_count): |
| 411 | def perform_cull_test(self, initial_count, final_count, cache=None): |
412 | 412 | """This is implemented as a utility method, because only some of the backends |
413 | 413 | implement culling. The culling algorithm also varies slightly, so the final |
414 | 414 | number of entries will vary between backends""" |
| 415 | if cache is None: |
| 416 | cache = self.cache |
| 417 | |
415 | 418 | # Create initial cache key entries. This will overflow the cache, causing a cull |
416 | 419 | for i in range(1, initial_count): |
417 | | self.cache.set('cull%d' % i, 'value', 1000) |
| 420 | cache.set('cull-%d' % i, 'value', 1000) |
418 | 421 | count = 0 |
419 | 422 | # Count how many keys are left in the cache. |
420 | 423 | for i in range(1, initial_count): |
421 | | if self.cache.has_key('cull%d' % i): |
| 424 | if cache.has_key('cull-%d' % i): |
422 | 425 | count = count + 1 |
423 | 426 | self.assertEqual(count, final_count) |
424 | 427 | |
… |
… |
class FileBasedCacheTests(unittest.TestCase, BaseCacheTests):
|
848 | 851 | def setUp(self): |
849 | 852 | self.dirname = tempfile.mkdtemp() |
850 | 853 | self.cache = get_cache(self.backend_name, LOCATION=self.dirname, OPTIONS={'MAX_ENTRIES': 30}) |
| 854 | self.full_cull_cache = get_cache(self.backend_name, |
| 855 | LOCATION=self.dirname, |
| 856 | OPTIONS={'MAX_ENTRIES': 30, 'CULL_FREQUENCY': 0}) |
851 | 857 | self.prefix_cache = get_cache(self.backend_name, LOCATION=self.dirname, KEY_PREFIX='cacheprefix') |
852 | 858 | self.v2_cache = get_cache(self.backend_name, LOCATION=self.dirname, VERSION=2) |
853 | 859 | self.custom_key_cache = get_cache(self.backend_name, LOCATION=self.dirname, KEY_FUNCTION=custom_key_func) |
… |
… |
class FileBasedCacheTests(unittest.TestCase, BaseCacheTests):
|
879 | 885 | self.assertTrue(not os.path.exists(os.path.dirname(keypath))) |
880 | 886 | self.assertTrue(not os.path.exists(os.path.dirname(os.path.dirname(keypath)))) |
881 | 887 | |
| 888 | def test_full_cull(self): |
| 889 | self.perform_cull_test(32, 1, self.full_cull_cache) |
| 890 | |
882 | 891 | def test_cull(self): |
883 | | self.perform_cull_test(50, 29) |
| 892 | self.perform_cull_test(35, 24) |
884 | 893 | |
885 | 894 | def test_old_initialization(self): |
886 | 895 | self.cache = get_cache('file://%s?max_entries=30' % self.dirname) |
887 | | self.perform_cull_test(50, 29) |
| 896 | self.perform_cull_test(35, 24) |
888 | 897 | |
889 | 898 | class CustomCacheKeyValidationTests(unittest.TestCase): |
890 | 899 | """ |