X-Git-Url: https://git.arvados.org/arvados.git/blobdiff_plain/a942e37250873d383bd885ba0dba70c63b3c073d..e158f485053be1e840073b321033d60d686a55a8:/sdk/python/arvados/retry.py diff --git a/sdk/python/arvados/retry.py b/sdk/python/arvados/retry.py index 5dc31aefa7..52a68faa6f 100644 --- a/sdk/python/arvados/retry.py +++ b/sdk/python/arvados/retry.py @@ -1,5 +1,7 @@ #!/usr/bin/env python +import functools +import inspect import time from collections import deque @@ -108,11 +110,11 @@ class RetryLoop(object): def check_http_response_success(result): - """Convert an httplib2 request result to a loop control flag. + """Convert a 'requests' response to a loop control flag. - Pass this method the 2-tuple returned by httplib2.Http.request. It - returns True if the response indicates success, None if it indicates - temporary failure, and False otherwise. You can use this as the + Pass this method a requests.Response object. It returns True if + the response indicates success, None if it indicates temporary + failure, and False otherwise. You can use this as the success_check for a RetryLoop. Implementation details: @@ -127,7 +129,7 @@ def check_http_response_success(result): retry those requests verbatim. """ try: - status = int(result[0].status) + status = result.status_code except Exception: return None if status in _HTTP_SUCCESSES: @@ -138,3 +140,19 @@ def check_http_response_success(result): return False else: return None # Get well soon, server. + +def retry_method(orig_func): + """Provide a default value for a method's num_retries argument. + + This is a decorator for instance and class methods that accept a + num_retries argument, with a None default. When the method is called + without a value for num_retries, it will be set from the underlying + instance or class' num_retries attribute. + """ + @functools.wraps(orig_func) + def num_retries_setter(self, *args, **kwargs): + arg_vals = inspect.getcallargs(orig_func, self, *args, **kwargs) + if arg_vals['num_retries'] is None: + kwargs['num_retries'] = self.num_retries + return orig_func(self, *args, **kwargs) + return num_retries_setter