diff options
| author | opapy <opapy.worker@gmail.com> | 2018-07-26 17:00:39 +0900 |
|---|---|---|
| committer | opapy <opapy.worker@gmail.com> | 2018-07-26 17:00:39 +0900 |
| commit | 8d1bc90bd688cf311aeebd2d709b90dbe09b7f9a (patch) | |
| tree | 52c2552f20dde575b24db377badf73aeb6883024 /pymemcache/client | |
| parent | 1d99958432ceee039d026abed87bd5f88255ad77 (diff) | |
| download | pymemcache-8d1bc90bd688cf311aeebd2d709b90dbe09b7f9a.tar.gz | |
add validation code with NOT_STORED
Diffstat (limited to 'pymemcache/client')
| -rw-r--r-- | pymemcache/client/base.py | 30 | ||||
| -rw-r--r-- | pymemcache/client/hash.py | 17 |
2 files changed, 33 insertions, 14 deletions
diff --git a/pymemcache/client/base.py b/pymemcache/client/base.py index 5694c6b..bc9be55 100644 --- a/pymemcache/client/base.py +++ b/pymemcache/client/base.py @@ -311,12 +311,17 @@ class Client(object): Returns: Empty list """ - # TODO: make this more performant by sending all the values first, then # waiting for all the responses. + if noreply is None: + noreply = self.default_noreply + + failed = [] for key, value in six.iteritems(values): - self.set(key, value, expire, noreply) - return [] + result = self._store_cmd(b'set', key, expire, noreply, value, None, (b'STORED', b'NOT_STORED')) + if not result: + failed.append(key) + return failed set_multi = set_many @@ -763,7 +768,15 @@ class Client(object): return {} raise - def _store_cmd(self, name, key, expire, noreply, data, cas=None): + def _store_cmd( + self, + name, + key, + expire, + noreply, + data, + cas=None, + validate_store_results=None): key = self.check_key(key) if not self.sock: self._connect() @@ -801,7 +814,10 @@ class Client(object): buf, line = _readline(self.sock, buf) self._raise_errors(line, name) - if line in VALID_STORE_RESULTS[name]: + if validate_store_results is None: + validate_store_results = VALID_STORE_RESULTS[name] + + if line in validate_store_results: if line == b'STORED': return True if line == b'NOT_STORED': @@ -927,8 +943,8 @@ class PooledClient(object): def set_many(self, values, expire=0, noreply=None): with self.client_pool.get_and_release(destroy_on_fail=True) as client: - client.set_many(values, expire=expire, noreply=noreply) - return [] + failed = client.set_many(values, expire=expire, noreply=noreply) + return failed set_multi = set_many diff --git a/pymemcache/client/hash.py b/pymemcache/client/hash.py index d78dfc1..d3778e0 100644 --- a/pymemcache/client/hash.py +++ b/pymemcache/client/hash.py @@ -257,13 +257,16 @@ class HashClient(object): for server, values in client_batches.items(): client = self.clients['%s:%s' % server] - new_args = list(args) - new_args.insert(0, values) - result = self._safely_run_func( - client, - client.set_many, values.keys(), *new_args, **kwargs - ) - failed.extend(result) + + for value in values: + new_args = list(args) + new_args.insert(0, value) + result = self._safely_run_func( + client, + client.set, False, *new_args, **kwargs + ) + if not result: + failed.extend(result) return failed |
