Skip to content

Commit 5893d43

Browse files
committed
Revert "gh-86802: Fix asyncio memory leak; shielded task exceptions log once through the exception handler (gh-134331)"
This reverts commit f695eca.
1 parent 39f4654 commit 5893d43

File tree

3 files changed

+7
-72
lines changed

3 files changed

+7
-72
lines changed

Lib/asyncio/tasks.py

Lines changed: 7 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -908,25 +908,6 @@ def _done_callback(fut, cur_task=cur_task):
908908
return outer
909909

910910

911-
def _log_on_exception(fut):
912-
if fut.cancelled():
913-
return
914-
915-
exc = fut.exception()
916-
if exc is None:
917-
return
918-
919-
context = {
920-
'message':
921-
f'{exc.__class__.__name__} exception in shielded future',
922-
'exception': exc,
923-
'future': fut,
924-
}
925-
if fut._source_traceback:
926-
context['source_traceback'] = fut._source_traceback
927-
fut._loop.call_exception_handler(context)
928-
929-
930911
def shield(arg):
931912
"""Wait for a future, shielding it from cancellation.
932913
@@ -972,11 +953,14 @@ def shield(arg):
972953
else:
973954
cur_task = None
974955

975-
def _clear_awaited_by_callback(inner):
976-
futures.future_discard_from_awaited_by(inner, cur_task)
956+
def _inner_done_callback(inner, cur_task=cur_task):
957+
if cur_task is not None:
958+
futures.future_discard_from_awaited_by(inner, cur_task)
977959

978-
def _inner_done_callback(inner):
979960
if outer.cancelled():
961+
if not inner.cancelled():
962+
# Mark inner's result as retrieved.
963+
inner.exception()
980964
return
981965

982966
if inner.cancelled():
@@ -988,16 +972,10 @@ def _inner_done_callback(inner):
988972
else:
989973
outer.set_result(inner.result())
990974

975+
991976
def _outer_done_callback(outer):
992977
if not inner.done():
993978
inner.remove_done_callback(_inner_done_callback)
994-
# Keep only one callback to log on cancel
995-
inner.remove_done_callback(_log_on_exception)
996-
inner.add_done_callback(_log_on_exception)
997-
998-
if cur_task is not None:
999-
inner.add_done_callback(_clear_awaited_by_callback)
1000-
1001979

1002980
inner.add_done_callback(_inner_done_callback)
1003981
outer.add_done_callback(_outer_done_callback)

Lib/test/test_asyncio/test_tasks.py

Lines changed: 0 additions & 40 deletions
Original file line numberDiff line numberDiff line change
@@ -2116,46 +2116,6 @@ def test_shield_cancel_outer(self):
21162116
self.assertTrue(outer.cancelled())
21172117
self.assertEqual(0, 0 if outer._callbacks is None else len(outer._callbacks))
21182118

2119-
def test_shield_cancel_outer_result(self):
2120-
mock_handler = mock.Mock()
2121-
self.loop.set_exception_handler(mock_handler)
2122-
inner = self.new_future(self.loop)
2123-
outer = asyncio.shield(inner)
2124-
test_utils.run_briefly(self.loop)
2125-
outer.cancel()
2126-
test_utils.run_briefly(self.loop)
2127-
inner.set_result(1)
2128-
test_utils.run_briefly(self.loop)
2129-
mock_handler.assert_not_called()
2130-
2131-
def test_shield_cancel_outer_exception(self):
2132-
mock_handler = mock.Mock()
2133-
self.loop.set_exception_handler(mock_handler)
2134-
inner = self.new_future(self.loop)
2135-
outer = asyncio.shield(inner)
2136-
test_utils.run_briefly(self.loop)
2137-
outer.cancel()
2138-
test_utils.run_briefly(self.loop)
2139-
inner.set_exception(Exception('foo'))
2140-
test_utils.run_briefly(self.loop)
2141-
mock_handler.assert_called_once()
2142-
2143-
def test_shield_duplicate_log_once(self):
2144-
mock_handler = mock.Mock()
2145-
self.loop.set_exception_handler(mock_handler)
2146-
inner = self.new_future(self.loop)
2147-
outer = asyncio.shield(inner)
2148-
test_utils.run_briefly(self.loop)
2149-
outer.cancel()
2150-
test_utils.run_briefly(self.loop)
2151-
outer = asyncio.shield(inner)
2152-
test_utils.run_briefly(self.loop)
2153-
outer.cancel()
2154-
test_utils.run_briefly(self.loop)
2155-
inner.set_exception(Exception('foo'))
2156-
test_utils.run_briefly(self.loop)
2157-
mock_handler.assert_called_once()
2158-
21592119
def test_shield_shortcut(self):
21602120
fut = self.new_future(self.loop)
21612121
fut.set_result(42)

Misc/NEWS.d/next/Library/2025-05-20-15-13-43.gh-issue-86802.trF7TM.rst

Lines changed: 0 additions & 3 deletions
This file was deleted.

0 commit comments

Comments
 (0)