Implement a single-time retry logic for "service error"

This commit is contained in:
DevilXD
2024-12-30 22:38:21 +01:00
parent 1dac01b141
commit f5690a0396

View File

@@ -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