summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJoe Gordon <jogo@pinterest.com>2017-03-24 16:39:33 -0700
committerJoe Gordon <jogo@pinterest.com>2017-03-29 11:04:31 -0700
commit7351bdb331c32e42ce817ffad216dc875b25b912 (patch)
tree5042cb96d761433b302d527417748857c3c977b0
parent082f0745421a10bf834759e87ef46c2212698ec4 (diff)
downloadpymemcache-7351bdb331c32e42ce817ffad216dc875b25b912.tar.gz
Add support for stats cachedump
Stats cachedump has a different input and output format compared to most stats commands. Previously this would fail with a cryptic error. Fixes issue #103
-rw-r--r--pymemcache/client/base.py14
-rw-r--r--pymemcache/test/test_client.py8
2 files changed, 20 insertions, 2 deletions
diff --git a/pymemcache/client/base.py b/pymemcache/client/base.py
index 3578058..6c47ffd 100644
--- a/pymemcache/client/base.py
+++ b/pymemcache/client/base.py
@@ -705,8 +705,14 @@ class Client(object):
raise MemcacheServerError(error)
def _fetch_cmd(self, name, keys, expect_cas):
- checked_keys = dict((self.check_key(k), k) for k in keys)
- cmd = name + b' ' + b' '.join(checked_keys) + b'\r\n'
+ if name == b'stats':
+ # stats commands can have multiple arguments
+ # `stats cachedump 1 1`
+ checked_keys = [self.check_key(k) for k in keys]
+ cmd = name + b' ' + b' '.join(checked_keys) + b'\r\n'
+ else:
+ checked_keys = dict((self.check_key(k), k) for k in keys)
+ cmd = name + b' ' + b' '.join(checked_keys) + b'\r\n'
try:
if not self.sock:
@@ -744,6 +750,10 @@ class Client(object):
elif name == b'stats' and line.startswith(b'STAT'):
key_value = line.split()
result[key_value[1]] = key_value[2]
+ elif name == b'stats' and line.startswith(b'ITEM'):
+ # For 'stats cachedump' commands
+ key_value = line.split()
+ result[key_value[1]] = b' '.join(key_value[2:])
else:
raise MemcacheUnknownError(line[:32])
except Exception:
diff --git a/pymemcache/test/test_client.py b/pymemcache/test/test_client.py
index 606a950..6cd683c 100644
--- a/pymemcache/test/test_client.py
+++ b/pymemcache/test/test_client.py
@@ -664,6 +664,14 @@ class TestClient(ClientTestMixin, unittest.TestCase):
}
assert result == expected
+ def test_stats_cachedump(self):
+ client = self.make_client([b'ITEM bob [7 b; 0 s]\r\n', b'END\r\n'])
+ result = client.stats('cachedump', '1', '1')
+ assert client.sock.send_bufs == [
+ b'stats cachedump 1 1\r\n'
+ ]
+ assert result == {b'bob': b'[7 b; 0 s]'}
+
def test_python_dict_set_is_supported(self):
client = self.make_client([b'STORED\r\n'])
client[b'key'] = b'value'