Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Appearance settings

Commit 02e6c32

Browse filesBrowse files
yinghsienwucopybara-github
authored andcommitted
fix: Retry async when seeing aiohttp ClientConnectorError, ClientOSError, ServerDisconnectedError
FUTURE_COPYBARA_INTEGRATE_REVIEW=#1139 from googleapis:release-please--branches--main 14f1afe PiperOrigin-RevId: 785532164
1 parent efbe769 commit 02e6c32
Copy full SHA for 02e6c32

File tree

Expand file treeCollapse file tree

1 file changed

+75
-20
lines changed
Open diff view settings
Filter options
Expand file treeCollapse file tree

1 file changed

+75
-20
lines changed
Open diff view settings
Collapse file

‎google/genai/_api_client.py‎

Copy file name to clipboardExpand all lines: google/genai/_api_client.py
+75-20Lines 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 (0)
Morty Proxy This is a proxified and sanitized view of the page, visit original site.