Skip to content

Commit b0d18de

Browse files
yinghsienwucopybara-github
authored andcommitted
fix: Retry async when seeing aiohttp ClientConnectorError, ClientOSError, ServerDisconnectedError
PiperOrigin-RevId: 786465736
1 parent 7c6101c commit b0d18de

1 file changed

Lines changed: 75 additions & 20 deletions

File tree

google/genai/_api_client.py

Lines changed: 75 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,7 @@
3232
import math
3333
import os
3434
import ssl
35+
import random
3536
import sys
3637
import threading
3738
import time
@@ -994,14 +995,40 @@ async def _async_request_once(
994995
headers=http_request.headers,
995996
trust_env=True,
996997
)
997-
response = await session.request(
998-
method=http_request.method,
999-
url=http_request.url,
1000-
headers=http_request.headers,
1001-
data=data,
1002-
timeout=aiohttp.ClientTimeout(connect=http_request.timeout),
1003-
**self._async_client_session_request_args,
1004-
)
998+
try:
999+
response = await session.request(
1000+
method=http_request.method,
1001+
url=http_request.url,
1002+
headers=http_request.headers,
1003+
data=data,
1004+
timeout=aiohttp.ClientTimeout(connect=http_request.timeout),
1005+
**self._async_client_session_request_args,
1006+
)
1007+
except (
1008+
aiohttp.ClientConnectorError,
1009+
aiohttp.ClientConnectorDNSError,
1010+
aiohttp.ClientOSError,
1011+
aiohttp.ServerDisconnectedError,
1012+
) as e:
1013+
await asyncio.sleep(1 + random.randint(0, 9))
1014+
logger.info('Retrying due to aiohttp error: %s' % e)
1015+
# Retrieve the SSL context from the session.
1016+
self._async_client_session_request_args = (
1017+
self._ensure_aiohttp_ssl_ctx(self._http_options)
1018+
)
1019+
# Instantiate a new session with the updated SSL context.
1020+
session = aiohttp.ClientSession(
1021+
headers=http_request.headers,
1022+
trust_env=True,
1023+
)
1024+
response = await session.request(
1025+
method=http_request.method,
1026+
url=http_request.url,
1027+
headers=http_request.headers,
1028+
data=data,
1029+
timeout=aiohttp.ClientTimeout(connect=http_request.timeout),
1030+
**self._async_client_session_request_args,
1031+
)
10051032

10061033
await errors.APIError.raise_for_async_response(response)
10071034
return HttpResponse(response.headers, response, session=session)
@@ -1022,20 +1049,48 @@ async def _async_request_once(
10221049
return HttpResponse(client_response.headers, client_response)
10231050
else:
10241051
if self._use_aiohttp():
1025-
async with aiohttp.ClientSession(
1026-
headers=http_request.headers,
1027-
trust_env=True,
1028-
) as session:
1029-
response = await session.request(
1030-
method=http_request.method,
1031-
url=http_request.url,
1052+
try:
1053+
async with aiohttp.ClientSession(
10321054
headers=http_request.headers,
1033-
data=data,
1034-
timeout=aiohttp.ClientTimeout(connect=http_request.timeout),
1035-
**self._async_client_session_request_args,
1055+
trust_env=True,
1056+
) as session:
1057+
response = await session.request(
1058+
method=http_request.method,
1059+
url=http_request.url,
1060+
headers=http_request.headers,
1061+
data=data,
1062+
timeout=aiohttp.ClientTimeout(connect=http_request.timeout),
1063+
**self._async_client_session_request_args,
1064+
)
1065+
await errors.APIError.raise_for_async_response(response)
1066+
return HttpResponse(response.headers, [await response.text()])
1067+
except (
1068+
aiohttp.ClientConnectorError,
1069+
aiohttp.ClientConnectorDNSError,
1070+
aiohttp.ClientOSError,
1071+
aiohttp.ServerDisconnectedError,
1072+
) as e:
1073+
await asyncio.sleep(1 + random.randint(0, 9))
1074+
logger.info('Retrying due to aiohttp error: %s' % e)
1075+
# Retrieve the SSL context from the session.
1076+
self._async_client_session_request_args = (
1077+
self._ensure_aiohttp_ssl_ctx(self._http_options)
10361078
)
1037-
await errors.APIError.raise_for_async_response(response)
1038-
return HttpResponse(response.headers, [await response.text()])
1079+
# Instantiate a new session with the updated SSL context.
1080+
async with aiohttp.ClientSession(
1081+
headers=http_request.headers,
1082+
trust_env=True,
1083+
) as session:
1084+
response = await session.request(
1085+
method=http_request.method,
1086+
url=http_request.url,
1087+
headers=http_request.headers,
1088+
data=data,
1089+
timeout=aiohttp.ClientTimeout(connect=http_request.timeout),
1090+
**self._async_client_session_request_args,
1091+
)
1092+
await errors.APIError.raise_for_async_response(response)
1093+
return HttpResponse(response.headers, [await response.text()])
10391094
else:
10401095
# aiohttp is not available. Fall back to httpx.
10411096
client_response = await self._async_httpx_client.request(

0 commit comments

Comments
 (0)