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

This commit is contained in:
DevilXD committed 2024-12-30 22:38:21 +01:00
1 parent 1dac01b141
commit f5690a0396
1 file changed
+23 -13
+23 -13
View File
@@ -1353,6 +1353,8 @@ class Twitch:
) -> JsonType | list[JsonType]: ) -> JsonType | list[JsonType]:
gql_logger.debug(f"GQL Request: {ops}") gql_logger.debug(f"GQL Request: {ops}")
backoff = ExponentialBackoff(maximum=60) 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: for delay in backoff:
async with self._qgl_limiter: async with self._qgl_limiter:
auth_state = await self.get_auth() auth_state = await self.get_auth()
@@ -1371,21 +1373,29 @@ class Twitch:
response_list = [response_json] response_list = [response_json]
force_retry: bool = False force_retry: bool = False
for response_json in response_list: for response_json in response_list:
# GQL errors handling # GQL error handling
if "errors" in response_json: if "errors" in response_json:
for error_dict in response_json["errors"]: for error_dict in response_json["errors"]:
if ( if "message" in error_dict:
"message" in error_dict if error_dict["message"] == "service error" and service_error_retry:
and error_dict["message"] in ( logger.error(
# "server error", "Retrying a \"service error\" for "
# "service error", f"{response_json['extensions']['operationName']}"
"service unavailable", )
"service timeout", service_error_retry = False
"context deadline exceeded", delay = 5 # overwrite delay
) force_retry = True
): break
force_retry = True elif (
break error_dict["message"] in (
# "server error",
"service unavailable",
"service timeout",
"context deadline exceeded",
)
):
force_retry = True
break
else: else:
raise GQLException(response_json['errors']) raise GQLException(response_json['errors'])
# Other error handling # Other error handling