mirror of
				https://github.com/django/django.git
				synced 2025-10-31 09:41:08 +00:00 
			
		
		
		
	[3.1.x] Fixed #31728 -- Fixed cache culling when no key is found for deletion.
DatabaseCache._cull implementation could fail if no key was found to
perform a deletion in the table. This prevented the new cache key/value
from being correctly added.
Backport of f386454d13 from master
			
			
This commit is contained in:
		
				
					committed by
					
						 Mariusz Felisiak
						Mariusz Felisiak
					
				
			
			
				
	
			
			
			
						parent
						
							ac7f7eab0f
						
					
				
				
					commit
					b2e2489d80
				
			
							
								
								
									
										9
									
								
								django/core/cache/backends/db.py
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										9
									
								
								django/core/cache/backends/db.py
									
									
									
									
										vendored
									
									
								
							| @@ -267,9 +267,12 @@ class DatabaseCache(BaseDatabaseCache): | ||||
|                 cursor.execute( | ||||
|                     connection.ops.cache_key_culling_sql() % table, | ||||
|                     [cull_num]) | ||||
|                 cursor.execute("DELETE FROM %s " | ||||
|                                "WHERE cache_key < %%s" % table, | ||||
|                                [cursor.fetchone()[0]]) | ||||
|                 last_cache_key = cursor.fetchone() | ||||
|                 if last_cache_key: | ||||
|                     cursor.execute( | ||||
|                         'DELETE FROM %s WHERE cache_key < %%s' % table, | ||||
|                         [last_cache_key[0]], | ||||
|                     ) | ||||
|  | ||||
|     def clear(self): | ||||
|         db = router.db_for_write(self.cache_model_class) | ||||
|   | ||||
							
								
								
									
										14
									
								
								tests/cache/tests.py
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										14
									
								
								tests/cache/tests.py
									
									
									
									
										vendored
									
									
								
							| @@ -621,6 +621,20 @@ class BaseCacheTests: | ||||
|     def test_zero_cull(self): | ||||
|         self._perform_cull_test('zero_cull', 50, 19) | ||||
|  | ||||
|     def test_cull_delete_when_store_empty(self): | ||||
|         try: | ||||
|             cull_cache = caches['cull'] | ||||
|         except InvalidCacheBackendError: | ||||
|             self.skipTest("Culling isn't implemented.") | ||||
|         old_max_entries = cull_cache._max_entries | ||||
|         # Force _cull to delete on first cached record. | ||||
|         cull_cache._max_entries = -1 | ||||
|         try: | ||||
|             cull_cache.set('force_cull_delete', 'value', 1000) | ||||
|             self.assertIs(cull_cache.has_key('force_cull_delete'), True) | ||||
|         finally: | ||||
|             cull_cache._max_entries = old_max_entries | ||||
|  | ||||
|     def _perform_invalid_key_test(self, key, expected_warning): | ||||
|         """ | ||||
|         All the builtin backends should warn (except memcached that should | ||||
|   | ||||
		Reference in New Issue
	
	Block a user