Skip to content

Commit

Permalink
Bugfix/timeout and sleep (#53)
Browse files Browse the repository at this point in the history
* Client.status uses timeout & no final sleep

* Result update and delete use timeout
  • Loading branch information
LukeJones123 authored Feb 28, 2023
1 parent 893dbd6 commit 30f4521
Showing 1 changed file with 25 additions and 27 deletions.
52 changes: 25 additions & 27 deletions cdsapi/api.py
Original file line number Diff line number Diff line change
Expand Up @@ -204,7 +204,8 @@ def update(self, request_id=None):
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()

Expand All @@ -218,7 +219,8 @@ def delete(self):
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:
Expand Down Expand Up @@ -389,7 +391,7 @@ def workflow(self, code, *args, **kwargs):

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()

Expand Down Expand Up @@ -607,40 +609,36 @@ def retriable(code, reason):

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

0 comments on commit 30f4521

Please sign in to comment.