mirror of
https://gitlab.com/allianceauth/allianceauth.git
synced 2025-07-09 12:30:15 +02:00
Improve support for milliseconds backoff
This commit is contained in:
parent
168ab569b9
commit
ef26cdbbee
@ -1,6 +1,7 @@
|
|||||||
import requests
|
import requests
|
||||||
import json
|
import json
|
||||||
import re
|
import re
|
||||||
|
import math
|
||||||
from django.conf import settings
|
from django.conf import settings
|
||||||
from requests_oauthlib import OAuth2Session
|
from requests_oauthlib import OAuth2Session
|
||||||
from functools import wraps
|
from functools import wraps
|
||||||
@ -49,12 +50,20 @@ class DiscordApiTooBusy(DiscordApiException):
|
|||||||
|
|
||||||
class DiscordApiBackoff(DiscordApiException):
|
class DiscordApiBackoff(DiscordApiException):
|
||||||
def __init__(self, retry_after, global_ratelimit):
|
def __init__(self, retry_after, global_ratelimit):
|
||||||
|
"""
|
||||||
|
:param retry_after: int time to retry after in milliseconds
|
||||||
|
:param global_ratelimit: bool Is the API under a global backoff
|
||||||
|
"""
|
||||||
super(DiscordApiException, self).__init__()
|
super(DiscordApiException, self).__init__()
|
||||||
self.retry_after = retry_after
|
self.retry_after = retry_after
|
||||||
self.global_ratelimit = global_ratelimit
|
self.global_ratelimit = global_ratelimit
|
||||||
|
|
||||||
|
@property
|
||||||
|
def retry_after_seconds(self):
|
||||||
|
return math.ceil(self.retry_after / 1000)
|
||||||
|
|
||||||
cache_time_format = '%Y-%m-%d %H:%M:%S'
|
|
||||||
|
cache_time_format = '%Y-%m-%d %H:%M:%S.%f'
|
||||||
|
|
||||||
|
|
||||||
def api_backoff(func):
|
def api_backoff(func):
|
||||||
@ -137,7 +146,7 @@ def api_backoff(func):
|
|||||||
# Sleep if we're blocking
|
# Sleep if we're blocking
|
||||||
if blocking:
|
if blocking:
|
||||||
logger.info("Blocking Back off from API calls for %s seconds" % bo.retry_after)
|
logger.info("Blocking Back off from API calls for %s seconds" % bo.retry_after)
|
||||||
time.sleep(10 if bo.retry_after > 10 else bo.retry_after)
|
time.sleep((10 if bo.retry_after > 10 else bo.retry_after) / 1000)
|
||||||
else:
|
else:
|
||||||
# Otherwise raise exception and let caller handle the backoff
|
# Otherwise raise exception and let caller handle the backoff
|
||||||
raise DiscordApiBackoff(retry_after=bo.retry_after, global_ratelimit=bo.global_ratelimit)
|
raise DiscordApiBackoff(retry_after=bo.retry_after, global_ratelimit=bo.global_ratelimit)
|
||||||
|
@ -72,8 +72,8 @@ class DiscordTasks:
|
|||||||
DiscordOAuthManager.update_groups(user.discord.uid, groups)
|
DiscordOAuthManager.update_groups(user.discord.uid, groups)
|
||||||
except DiscordApiBackoff as bo:
|
except DiscordApiBackoff as bo:
|
||||||
logger.info("Discord group sync API back off for %s, "
|
logger.info("Discord group sync API back off for %s, "
|
||||||
"retrying in %s seconds" % (user, bo.retry_after))
|
"retrying in %s seconds" % (user, bo.retry_after_seconds))
|
||||||
raise task_self.retry(countdown=bo.retry_after)
|
raise task_self.retry(countdown=bo.retry_after_seconds)
|
||||||
except Exception as e:
|
except Exception as e:
|
||||||
if task_self:
|
if task_self:
|
||||||
logger.exception("Discord group sync failed for %s, retrying in 10 mins" % user)
|
logger.exception("Discord group sync failed for %s, retrying in 10 mins" % user)
|
||||||
|
Loading…
x
Reference in New Issue
Block a user