Source code for gwcelery.tasks.legacy_gracedb
"""Communication with GraceDB using the legacy GraceDB client."""
import functools
from http.client import HTTPException
from socket import gaierror
from ligo.gracedb import rest
from .. import app
from ..util import PromiseProxy
client = PromiseProxy(rest.GraceDb,
('https://' + app.conf.gracedb_host + '/api/',),
{'fail_if_noauth': True, 'reload_certificate': True})
[docs]class RetryableHTTPError(rest.HTTPError):
"""Exception class for server-side HTTP errors that we should retry."""
[docs]def catch_retryable_http_errors(f):
"""Decorator to capture server-side errors that we should retry.
We retry HTTP status 502 (Bad Gateway), 503 (Service Unavailable), and
504 (Gateway Timeout).
"""
@functools.wraps(f)
def wrapper(*args, **kwargs):
try:
return f(*args, **kwargs)
except rest.HTTPError as e:
if e.status in {408, 409, 429, 502, 503, 504}:
raise RetryableHTTPError(e.status, e.reason, e.message)
else:
raise
return wrapper
[docs]def task(*args, **kwargs):
return app.task(*args, **kwargs,
autoretry_for=(gaierror, RetryableHTTPError,
TimeoutError, HTTPException),
default_retry_delay=20.0, retry_backoff=True,
retry_kwargs=dict(max_retries=10))