From 30f452163784369571b2d1b478eaae8427461623 Mon Sep 17 00:00:00 2001 From: LukeJones123 <95484041+LukeJones123@users.noreply.github.com> Date: Tue, 28 Feb 2023 16:04:19 +0000 Subject: Bugfix/timeout and sleep (#53) * Client.status uses timeout & no final sleep * Result update and delete use timeout --- cdsapi/api.py | 52 +++++++++++++++++++++++++--------------------------- 1 file changed, 25 insertions(+), 27 deletions(-) diff --git a/cdsapi/api.py b/cdsapi/api.py index 0211856..47dce4f 100644 --- a/cdsapi/api.py +++ b/cdsapi/api.py @@ -204,7 +204,8 @@ class Result(object): task_url = "%s/tasks/%s" % (self._url, request_id) self.debug("GET %s", task_url) - result = self.robust(self.session.get)(task_url, verify=self.verify) + result = self.robust(self.session.get)(task_url, verify=self.verify, + timeout=self.timeout) result.raise_for_status() self.reply = result.json() @@ -218,7 +219,8 @@ class Result(object): task_url = "%s/tasks/%s" % (self._url, rid) self.debug("DELETE %s", task_url) - delete = self.session.delete(task_url, verify=self.verify) + delete = self.session.delete(task_url, verify=self.verify, + timeout=self.timeout) self.debug("DELETE returns %s %s", delete.status_code, delete.reason) try: @@ -389,7 +391,7 @@ class Client(object): def status(self, context=None): url = "%s/status.json" % (self.url,) - r = self.session.get(url, verify=self.verify) + r = self.session.get(url, verify=self.verify, timeout=self.timeout) r.raise_for_status() return r.json() @@ -607,40 +609,36 @@ class Client(object): def wrapped(*args, **kwargs): tries = 0 - while tries < self.retry_max: + while True: + + txt = "Error" try: - r = call(*args, **kwargs) + resp = call(*args, **kwargs) except ( requests.exceptions.ConnectionError, requests.exceptions.ReadTimeout, ) as e: - r = None - self.warning( - "Recovering from connection error [%s], attemps %s of %s", - e, - tries, - self.retry_max, - ) - - if r is not None: - if not retriable(r.status_code, r.reason): - return r + resp = None + txt = f"Connection error: [{e}]" + + if resp is not None: + if not retriable(resp.status_code, resp.reason): + break try: - self.warning(r.json()["reason"]) + self.warning(resp.json()["reason"]) except Exception: pass - self.warning( - "Recovering from HTTP error [%s %s], attemps %s of %s", - r.status_code, - r.reason, - tries, - self.retry_max, - ) + txt = f"HTTP error: [{resp.status_code} {resp.reason}]" tries += 1 + self.warning(txt + f". Attempt {tries} of {self.retry_max}.") + if tries < self.retry_max: + self.warning(f"Retrying in {self.sleep_max} seconds") + time.sleep(self.sleep_max) + self.info("Retrying now...") + else: + raise Exception('Could not connect') - self.warning("Retrying in %s seconds", self.sleep_max) - time.sleep(self.sleep_max) - self.info("Retrying now...") + return resp return wrapped -- cgit v1.2.3