Skip to content

Commit 306ccfd

Browse files
authored
Merge pull request gusdan#10 from uncovertruth/bug/disconnect_all
add close method
2 parents 13a6125 + 45158a1 commit 306ccfd

File tree

2 files changed

+47
-4
lines changed

2 files changed

+47
-4
lines changed

django_elastipymemcache/memcached.py

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,11 @@
55
import socket
66
from functools import wraps
77

8+
try:
9+
import cPickle as pickle
10+
except ImportError:
11+
import pickle
12+
813
from django.core.cache import InvalidCacheBackendError
914
from django.core.cache.backends.memcached import BaseMemcachedCache
1015

@@ -15,6 +20,19 @@
1520
logger = logging.getLogger(__name__)
1621

1722

23+
def serialize_pickle(key, value):
24+
if isinstance(value, str):
25+
return value, 1
26+
return pickle.dumps(value), 2
27+
28+
29+
def deserialize_pickle(key, value, flags):
30+
if flags == 1:
31+
return value
32+
if flags == 2:
33+
return pickle.loads(value)
34+
35+
1836
def invalidate_cache_after_error(f):
1937
"""
2038
catch any exception and invalidate internal cache with list of nodes
@@ -83,6 +101,8 @@ def _cache(self):
83101
if getattr(self, '_client', None) is None:
84102

85103
options = self._options
104+
options['serializer'] = serialize_pickle
105+
options['deserializer'] = deserialize_pickle
86106
options.setdefault('ignore_exc', True)
87107
options.pop('cluster_timeout', None)
88108

@@ -91,6 +111,11 @@ def _cache(self):
91111

92112
return self._client
93113

114+
def close(self, **kwargs):
115+
# libmemcached manages its own connections. Don't call disconnect_all()
116+
# as it resets the failover state and creates unnecessary reconnects.
117+
pass
118+
94119
@invalidate_cache_after_error
95120
def get(self, *args, **kwargs):
96121
return super(ElastiPyMemCache, self).get(*args, **kwargs)

tests/test_backend.py

Lines changed: 22 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,11 @@
1818
@patch('django.conf.settings', global_settings)
1919
@patch('django_elastipymemcache.memcached.get_cluster_info')
2020
def test_split_servers(get_cluster_info):
21-
from django_elastipymemcache.memcached import ElastiPyMemCache
21+
from django_elastipymemcache.memcached import (
22+
ElastiPyMemCache,
23+
deserialize_pickle,
24+
serialize_pickle,
25+
)
2226
backend = ElastiPyMemCache('h:0', {})
2327
servers = [('h1', 0), ('h2', 0)]
2428
get_cluster_info.return_value = {
@@ -28,13 +32,22 @@ def test_split_servers(get_cluster_info):
2832
assert backend._cache
2933
get_cluster_info.assert_called_once_with(
3034
'h', '0', socket._GLOBAL_DEFAULT_TIMEOUT)
31-
backend._lib.Client.assert_called_once_with(servers, ignore_exc=True)
35+
backend._lib.Client.assert_called_once_with(
36+
servers,
37+
deserializer=deserialize_pickle,
38+
ignore_exc=True,
39+
serializer=serialize_pickle
40+
)
3241

3342

3443
@patch('django.conf.settings', global_settings)
3544
@patch('django_elastipymemcache.memcached.get_cluster_info')
3645
def test_node_info_cache(get_cluster_info):
37-
from django_elastipymemcache.memcached import ElastiPyMemCache
46+
from django_elastipymemcache.memcached import (
47+
ElastiPyMemCache,
48+
deserialize_pickle,
49+
serialize_pickle,
50+
)
3851
servers = [('h1', 0), ('h2', 0)]
3952
get_cluster_info.return_value = {
4053
'nodes': servers
@@ -46,7 +59,12 @@ def test_node_info_cache(get_cluster_info):
4659
backend.get('key1')
4760
backend.set('key2', 'val')
4861
backend.get('key2')
49-
backend._lib.Client.assert_called_once_with(servers, ignore_exc=True)
62+
backend._lib.Client.assert_called_once_with(
63+
servers,
64+
deserializer=deserialize_pickle,
65+
ignore_exc=True,
66+
serializer=serialize_pickle
67+
)
5068
eq_(backend._cache.get.call_count, 2)
5169
eq_(backend._cache.set.call_count, 2)
5270

0 commit comments

Comments
 (0)