summaryrefslogtreecommitdiff
path: root/django/core/cache
diff options
context:
space:
mode:
authorRussell Keith-Magee <russell@keith-magee.com>2010-02-11 13:09:56 +0000
committerRussell Keith-Magee <russell@keith-magee.com>2010-02-11 13:09:56 +0000
commit3792b2cd9f0c84f29ec4300eba7bd443452c4a25 (patch)
treec83137e1250c8b5c991d0b5fd509a03ebda88d8d /django/core/cache
parentad08f077229450df0386bcab407f5953f3869fb8 (diff)
[1.1.X] Fixed #12399 -- Added handling for memcache timeouts longer than 30 days. Thanks to houdinihound for the report, and gciotta for the patch.
Backport of r12408 from trunk. git-svn-id: http://code.djangoproject.com/svn/django/branches/releases/1.1.X@12412 bcc190cf-cafb-0310-a4f2-bffc1f526a37
Diffstat (limited to 'django/core/cache')
-rw-r--r--django/core/cache/backends/memcached.py22
1 files changed, 20 insertions, 2 deletions
diff --git a/django/core/cache/backends/memcached.py b/django/core/cache/backends/memcached.py
index 0ff0da32ae..15f3cc0bf8 100644
--- a/django/core/cache/backends/memcached.py
+++ b/django/core/cache/backends/memcached.py
@@ -1,5 +1,7 @@
"Memcached cache backend"
+import time
+
from django.core.cache.backends.base import BaseCache, InvalidCacheBackendError
from django.utils.encoding import smart_unicode, smart_str
@@ -16,10 +18,26 @@ class CacheClass(BaseCache):
BaseCache.__init__(self, params)
self._cache = memcache.Client(server.split(';'))
+ def _get_memcache_timeout(self, timeout):
+ """
+ Memcached deals with long (> 30 days) timeouts in a special
+ way. Call this function to obtain a safe value for your timeout.
+ """
+ timeout = timeout or self.default_timeout
+ if timeout > 2592000: # 60*60*24*30, 30 days
+ # See http://code.google.com/p/memcached/wiki/FAQ
+ # "You can set expire times up to 30 days in the future. After that
+ # memcached interprets it as a date, and will expire the item after
+ # said date. This is a simple (but obscure) mechanic."
+ #
+ # This means that we have to switch to absolute timestamps.
+ timeout += int(time.time())
+ return timeout
+
def add(self, key, value, timeout=0):
if isinstance(value, unicode):
value = value.encode('utf-8')
- return self._cache.add(smart_str(key), value, timeout or self.default_timeout)
+ return self._cache.add(smart_str(key), value, self._get_memcache_timeout(timeout))
def get(self, key, default=None):
val = self._cache.get(smart_str(key))
@@ -34,7 +52,7 @@ class CacheClass(BaseCache):
def set(self, key, value, timeout=0):
if isinstance(value, unicode):
value = value.encode('utf-8')
- self._cache.set(smart_str(key), value, timeout or self.default_timeout)
+ self._cache.set(smart_str(key), value, self._get_memcache_timeout(timeout))
def delete(self, key):
self._cache.delete(smart_str(key))