Skip to content

Commit 2be3b22

Browse files
author
rodrigo.nogueira
committed
Avoid redundant response release-connection calls
1 parent b8aee4a commit 2be3b22

File tree

3 files changed

+28
-3
lines changed

3 files changed

+28
-3
lines changed

CHANGES/10089.bugfix.rst

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
Reduced redundant ``ClientResponse._release_connection()`` invocations so
2+
successful requests now trigger a single release-path call per response.

aiohttp/client_reqrep.py

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -510,7 +510,8 @@ def release(self) -> None:
510510
self._closed = True
511511

512512
self._cleanup_writer()
513-
self._release_connection()
513+
if self._connection is not None:
514+
self._release_connection()
514515

515516
@property
516517
def ok(self) -> bool:
@@ -558,7 +559,8 @@ async def _wait_released(self) -> None:
558559
and task.cancelling()
559560
):
560561
raise
561-
self._release_connection()
562+
if self._connection is not None:
563+
self._release_connection()
562564

563565
def _cleanup_writer(self) -> None:
564566
if self.__writer is not None:
@@ -583,7 +585,8 @@ async def wait_for_close(self) -> None:
583585
and task.cancelling()
584586
):
585587
raise
586-
self.release()
588+
if not self._released:
589+
self.release()
587590

588591
async def read(self) -> bytes:
589592
"""Read response payload."""

tests/test_client_functional.py

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -370,6 +370,26 @@ async def handler(request: web.Request) -> web.Response:
370370
assert 1 == len(client._session.connector._conns)
371371

372372

373+
async def test_release_connection_called_once_per_request(
374+
aiohttp_client: AiohttpClient, mocker: MockerFixture
375+
) -> None:
376+
async def handler(request: web.Request) -> web.Response:
377+
await request.read()
378+
return web.Response(body=b"OK")
379+
380+
app = web.Application()
381+
app.router.add_route("GET", "/", handler)
382+
client = await aiohttp_client(app)
383+
384+
spy = mocker.spy(aiohttp.client_reqrep.ClientResponse, "_release_connection")
385+
for _ in range(3):
386+
async with client.get("/") as resp:
387+
await resp.read()
388+
await asyncio.sleep(0)
389+
390+
assert spy.call_count == 3
391+
392+
373393
async def test_HTTP_304(aiohttp_client: AiohttpClient) -> None:
374394
async def handler(request: web.Request) -> web.Response:
375395
body = await request.read()

0 commit comments

Comments
 (0)