From f5690a0396991cf615cf8d338aec856affba22cf Mon Sep 17 00:00:00 2001 From: DevilXD <4180725+DevilXD@users.noreply.github.com> Date: Mon, 30 Dec 2024 22:38:21 +0100 Subject: [PATCH] Implement a single-time retry logic for "service error" --- twitch.py | 36 +++++++++++++++++++++++------------- 1 file changed, 23 insertions(+), 13 deletions(-) diff --git a/twitch.py b/twitch.py index 2805637..d13d766 100644 --- a/twitch.py +++ b/twitch.py @@ -1353,6 +1353,8 @@ class Twitch: ) -> JsonType | list[JsonType]: gql_logger.debug(f"GQL Request: {ops}") backoff = ExponentialBackoff(maximum=60) + # Use a flag to retry the request a single time, if a "service error" is encountered + service_error_retry: bool = True for delay in backoff: async with self._qgl_limiter: auth_state = await self.get_auth() @@ -1371,21 +1373,29 @@ class Twitch: response_list = [response_json] force_retry: bool = False for response_json in response_list: - # GQL errors handling + # GQL error handling if "errors" in response_json: for error_dict in response_json["errors"]: - if ( - "message" in error_dict - and error_dict["message"] in ( - # "server error", - # "service error", - "service unavailable", - "service timeout", - "context deadline exceeded", - ) - ): - force_retry = True - break + if "message" in error_dict: + if error_dict["message"] == "service error" and service_error_retry: + logger.error( + "Retrying a \"service error\" for " + f"{response_json['extensions']['operationName']}" + ) + service_error_retry = False + delay = 5 # overwrite delay + force_retry = True + break + elif ( + error_dict["message"] in ( + # "server error", + "service unavailable", + "service timeout", + "context deadline exceeded", + ) + ): + force_retry = True + break else: raise GQLException(response_json['errors']) # Other error handling