summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorEmre Yilmaz <emre.yilmaz@markafoni.com>2015-12-02 12:34:31 +0200
committerTim Graham <timograham@gmail.com>2015-12-04 12:22:17 -0500
commit8e838d9c869083597dc9e161ae2fe37acaa90de9 (patch)
tree51143d2305901aa59d5b957655665dffdef9ef50
parent25f5b5c19dc23c6c09877c9c652a934e9669573d (diff)
Fixed #25840 -- Fixed BaseCache.get_or_set() on the DummyCache backend.
This also fixes a possible data eviction race condition between setting and getting a key. Another thread could remove the key before get_and_set() accesses it again. In this case, now the default value will be returned instead of None.
-rw-r--r--django/core/cache/backends/base.py2
-rw-r--r--docs/releases/1.9.1.txt3
-rw-r--r--tests/cache/tests.py9
3 files changed, 12 insertions, 2 deletions
diff --git a/django/core/cache/backends/base.py b/django/core/cache/backends/base.py
index 186a45ddd6..af262fecdd 100644
--- a/django/core/cache/backends/base.py
+++ b/django/core/cache/backends/base.py
@@ -165,7 +165,7 @@ class BaseCache(object):
default = default()
val = self.add(key, default, timeout=timeout, version=version)
if val:
- return self.get(key, version=version)
+ return self.get(key, default, version)
return val
def has_key(self, key, version=None):
diff --git a/docs/releases/1.9.1.txt b/docs/releases/1.9.1.txt
index cdf7bb35ca..91a0f33a2a 100644
--- a/docs/releases/1.9.1.txt
+++ b/docs/releases/1.9.1.txt
@@ -9,4 +9,5 @@ Django 1.9.1 fixes several bugs in 1.9.
Bugfixes
========
-* ...
+* Fixed ``BaseCache.get_or_set()`` with the ``DummyCache`` backend
+ (:ticket:`25840`).
diff --git a/tests/cache/tests.py b/tests/cache/tests.py
index ba3745847b..cd61690d34 100644
--- a/tests/cache/tests.py
+++ b/tests/cache/tests.py
@@ -202,6 +202,15 @@ class DummyCacheTests(SimpleTestCase):
self.assertRaises(ValueError, cache.decr_version, 'answer')
self.assertRaises(ValueError, cache.decr_version, 'does_not_exist')
+ def test_get_or_set(self):
+ self.assertEqual(cache.get_or_set('mykey', 'default'), 'default')
+
+ def test_get_or_set_callable(self):
+ def my_callable():
+ return 'default'
+
+ self.assertEqual(cache.get_or_set('mykey', my_callable), 'default')
+
def custom_key_func(key, key_prefix, version):
"A customized cache key function"