diff options
| author | Russell Keith-Magee <russell@keith-magee.com> | 2010-02-11 13:09:56 +0000 |
|---|---|---|
| committer | Russell Keith-Magee <russell@keith-magee.com> | 2010-02-11 13:09:56 +0000 |
| commit | 3792b2cd9f0c84f29ec4300eba7bd443452c4a25 (patch) | |
| tree | c83137e1250c8b5c991d0b5fd509a03ebda88d8d /django/core/cache | |
| parent | ad08f077229450df0386bcab407f5953f3869fb8 (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.py | 22 |
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)) |
