Skip to content

Commit 1fcef94

Browse files
Fix handler waiting on shutdown (#8611)
1 parent 49bd25a commit 1fcef94

File tree

2 files changed

+9
-3
lines changed

2 files changed

+9
-3
lines changed

CHANGES/8611.bugfix.rst

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
Fixed an edge case where shutdown would wait for timeout when handler was already completed -- by :user:`Dreamsorcerer`.

aiohttp/web_protocol.py

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -163,6 +163,7 @@ class RequestHandler(BaseProtocol):
163163
"_lingering_time",
164164
"_messages",
165165
"_message_tail",
166+
"_handler_waiter",
166167
"_waiter",
167168
"_task_handler",
168169
"_upgrade",
@@ -215,6 +216,7 @@ def __init__(
215216
self._message_tail = b""
216217

217218
self._waiter: Optional[asyncio.Future[None]] = None
219+
self._handler_waiter: Optional[asyncio.Future[None]] = None
218220
self._task_handler: Optional[asyncio.Task[None]] = None
219221

220222
self._upgrade = False
@@ -278,11 +280,11 @@ async def shutdown(self, timeout: Optional[float] = 15.0) -> None:
278280
if self._waiter:
279281
self._waiter.cancel()
280282

281-
# Wait for graceful disconnection
282-
if self._current_request is not None:
283+
# Wait for graceful handler completion
284+
if self._handler_waiter is not None:
283285
with suppress(asyncio.CancelledError, asyncio.TimeoutError):
284286
async with ceil_timeout(timeout):
285-
await self._current_request.wait_for_disconnection()
287+
await self._handler_waiter
286288
# Then cancel handler and wait
287289
with suppress(asyncio.CancelledError, asyncio.TimeoutError):
288290
async with ceil_timeout(timeout):
@@ -466,6 +468,7 @@ async def _handle_request(
466468
start_time: float,
467469
request_handler: Callable[[BaseRequest], Awaitable[StreamResponse]],
468470
) -> Tuple[StreamResponse, bool]:
471+
self._handler_waiter = self._loop.create_future()
469472
try:
470473
try:
471474
self._current_request = request
@@ -489,6 +492,8 @@ async def _handle_request(
489492
reset = await self.finish_response(request, resp, start_time)
490493
else:
491494
reset = await self.finish_response(request, resp, start_time)
495+
finally:
496+
self._handler_waiter.set_result(None)
492497

493498
return resp, reset
494499

0 commit comments

Comments
 (0)