summaryrefslogtreecommitdiff
path: root/pymemcache/client/hash.py
diff options
context:
space:
mode:
authorJohn Anderson <sontek@gmail.com>2015-07-02 15:38:43 -0700
committerJohn Anderson <sontek@gmail.com>2015-07-02 15:38:43 -0700
commitb7c02a3c2d29e4d017c78d9525a96da8a2aacb0f (patch)
tree489a28f4ee4b7ee91938b6f2fb87d526d4bb9adc /pymemcache/client/hash.py
parentd6fc5ce0edeffe5f89d814c7b21ef57d76529662 (diff)
downloadpymemcache-b7c02a3c2d29e4d017c78d9525a96da8a2aacb0f.tar.gz
Make ignoring exceptions optional
Diffstat (limited to 'pymemcache/client/hash.py')
-rw-r--r--pymemcache/client/hash.py52
1 files changed, 34 insertions, 18 deletions
diff --git a/pymemcache/client/hash.py b/pymemcache/client/hash.py
index 8a79672..7ef0710 100644
--- a/pymemcache/client/hash.py
+++ b/pymemcache/client/hash.py
@@ -29,6 +29,7 @@ class HashClient(object):
retry_timeout=1,
dead_timeout=60,
use_pooling=False,
+ ignore_exc=False,
):
"""
Constructor.
@@ -64,6 +65,7 @@ class HashClient(object):
self.dead_timeout = dead_timeout
self.use_pooling = use_pooling
self.key_prefix = key_prefix
+ self.ignore_exc = ignore_exc
self._failed_clients = {}
self._dead_clients = {}
self._last_dead_check_time = time.time()
@@ -132,7 +134,7 @@ class HashClient(object):
client = self.clients[server]
return client
- def _safely_run_func(self, client, func, *args, **kwargs):
+ def _safely_run_func(self, client, func, default_val, *args, **kwargs):
try:
if client.server in self._failed_clients:
# This server is currently failing, lets check if it is in
@@ -152,7 +154,7 @@ class HashClient(object):
# clients
self._failed_clients.pop(client.server)
return result
- return
+ return default_val
else:
# We've reached our max retry attempts, we need to mark
# the sever as dead
@@ -194,24 +196,38 @@ class HashClient(object):
failed_metadata['failed_time'] = time.time()
self._failed_clients[client.server] = failed_metadata
- def _run_cmd(self, cmd, key, *args, **kwargs):
+ # if we haven't enabled ignore_exc, don't move on gracefully, just
+ # raise the exception
+ if not self.ignore_exc:
+ raise
+
+ return default_val
+ except:
+ # any exceptions that aren't socket.error we need to handle
+ # gracefully as well
+ if not self.ignore_exc:
+ raise
+
+ return default_val
+
+ def _run_cmd(self, cmd, key, default_val, *args, **kwargs):
client = self._get_client(key)
func = getattr(client, cmd)
args = list(args)
args.insert(0, key)
- return self._safely_run_func(client, func, *args, **kwargs)
+ return self._safely_run_func(client, func, default_val, *args, **kwargs)
def set(self, key, *args, **kwargs):
- return self._run_cmd('set', key, *args, **kwargs)
+ return self._run_cmd('set', key, False, *args, **kwargs)
def get(self, key, *args, **kwargs):
- return self._run_cmd('get', key, *args, **kwargs)
+ return self._run_cmd('get', key, None, *args, **kwargs)
def incr(self, key, *args, **kwargs):
- return self._run_cmd('incr', key, *args, **kwargs)
+ return self._run_cmd('incr', key, False, *args, **kwargs)
def decr(self, key, *args, **kwargs):
- return self._run_cmd('decr', key, *args, **kwargs)
+ return self._run_cmd('decr', key, False, *args, **kwargs)
def set_many(self, values, *args, **kwargs):
client_batches = {}
@@ -230,7 +246,7 @@ class HashClient(object):
new_args.insert(0, values)
result = self._safely_run_func(
client,
- client.set_many, *new_args, **kwargs
+ client.set_many, False, *new_args, **kwargs
)
end.append(result)
@@ -253,33 +269,33 @@ class HashClient(object):
new_args.insert(0, keys)
result = self._safely_run_func(
client,
- client.get_many, *new_args, **kwargs
+ client.get_many, {}, *new_args, **kwargs
)
end.update(result)
return end
def gets(self, key, *args, **kwargs):
- return self._run_cmd('gets', key, *args, **kwargs)
+ return self._run_cmd('gets', key, None, *args, **kwargs)
def add(self, key, *args, **kwargs):
- return self._run_cmd('add', key, *args, **kwargs)
+ return self._run_cmd('add', key, False, *args, **kwargs)
def prepend(self, key, *args, **kwargs):
- return self._run_cmd('prepend', key, *args, **kwargs)
+ return self._run_cmd('prepend', key, False, *args, **kwargs)
def append(self, key, *args, **kwargs):
- return self._run_cmd('append', key, *args, **kwargs)
+ return self._run_cmd('append', key, False, *args, **kwargs)
def delete(self, key, *args, **kwargs):
- return self._run_cmd('delete', key, *args, **kwargs)
+ return self._run_cmd('delete', key, False, *args, **kwargs)
def cas(self, key, *args, **kwargs):
- return self._run_cmd('cas', key, *args, **kwargs)
+ return self._run_cmd('cas', key, False, *args, **kwargs)
def replace(self, key, *args, **kwargs):
- return self._run_cmd('replace', key, *args, **kwargs)
+ return self._run_cmd('replace', key, False, *args, **kwargs)
def flush_all(self):
for _, client in self.clients.items():
- self._safely_run_func(client, client.flush_all)
+ self._safely_run_func(client, client.flush_all, False)