Browse Source

Memcache backend fixes

Ask Solem 11 years ago
parent
commit
d40612c33c
3 changed files with 10 additions and 5 deletions
  1. 5 1
      celery/backends/base.py
  2. 2 2
      celery/backends/cache.py
  3. 3 2
      celery/tests/backends/test_cache.py

+ 5 - 1
celery/backends/base.py

@@ -331,8 +331,12 @@ class KeyValueStoreBackend(BaseBackend):
     implements_incr = False
 
     def __init__(self, *args, **kwargs):
+        if hasattr(self.key_t, '__func__'):
+            self.key_t = self.key_t.__func__  # remove binding
+        self._encode_prefixes()
         super(KeyValueStoreBackend, self).__init__(*args, **kwargs)
-        self.key_t = self.__class__.key_t.__func__  # remove binding
+
+    def _encode_prefixes(self):
         self.task_keyprefix = self.key_t(self.task_keyprefix)
         self.group_keyprefix = self.key_t(self.group_keyprefix)
         self.chord_keyprefix = self.key_t(self.chord_keyprefix)

+ 2 - 2
celery/backends/cache.py

@@ -45,8 +45,7 @@ def import_best_memcache():
                 import memcache  # noqa
             except ImportError:
                 raise ImproperlyConfigured(REQUIRES_BACKEND)
-            else:
-                memcache_key_t = bytes_to_str if PY3 else ensure_bytes
+            memcache_key_t = bytes_to_str if PY3 else ensure_bytes
         _imp[0] = (is_pylibmc, memcache, memcache_key_t)
     return _imp[0]
 
@@ -114,6 +113,7 @@ class CacheBackend(KeyValueStoreBackend):
         except KeyError:
             raise ImproperlyConfigured(UNKNOWN_BACKEND.format(
                 self.backend, ', '.join(backends)))
+        self._encode_prefixes()  # rencode the keyprefixes
 
     def get(self, key):
         return self.client.get(key)

+ 3 - 2
celery/tests/backends/test_cache.py

@@ -195,8 +195,9 @@ class test_get_best_memcache(AppCase, MockCacheMixin):
 
     def test_backends(self):
         from celery.backends.cache import backends
-        for name, fun in items(backends):
-            self.assertTrue(fun())
+        with self.mock_memcache():
+            for name, fun in items(backends):
+                self.assertTrue(fun())
 
 
 class test_memcache_key(AppCase, MockCacheMixin):