Issue32710
Created on 2018-01-29 12:43 by vstinner, last changed 2022-04-11 14:58 by admin. This issue is now closed.
| Files | ||||
|---|---|---|---|---|
| File name | Uploaded | Description | Edit | |
| test_aiosend.py | vstinner, 2019-01-08 03:07 | |||
| Pull Requests | |||
|---|---|---|---|
| URL | Status | Linked | Edit |
| PR 11461 | merged | vstinner, 2019-01-07 22:35 | |
| PR 11461 | merged | vstinner, 2019-01-07 22:35 | |
| PR 11461 | merged | vstinner, 2019-01-07 22:35 | |
| PR 11469 | merged | vstinner, 2019-01-08 13:03 | |
| PR 11469 | merged | vstinner, 2019-01-08 13:03 | |
| PR 11469 | merged | vstinner, 2019-01-08 13:03 | |
| PR 11471 | merged | miss-islington, 2019-01-08 13:23 | |
| PR 11471 | merged | miss-islington, 2019-01-08 13:23 | |
| PR 11471 | merged | miss-islington, 2019-01-08 13:23 | |
| PR 11489 | merged | vstinner, 2019-01-10 00:17 | |
| PR 11489 | merged | vstinner, 2019-01-10 00:17 | |
| PR 11489 | merged | vstinner, 2019-01-10 00:17 | |
| PR 11519 | merged | miss-islington, 2019-01-11 13:35 | |
| PR 11519 | merged | miss-islington, 2019-01-11 13:35 | |
| PR 11519 | merged | miss-islington, 2019-01-11 13:35 | |
| Messages (17) | |||
|---|---|---|---|
| msg311116 - (view) | Author: STINNER Victor (vstinner) * ![]() |
Date: 2018-01-29 12:43 | |
AMD64 Windows8.1 Refleaks 3.x: http://buildbot.python.org/all/#/builders/80/builds/118 test_asyncio leaked [4, 4, 3] memory blocks, sum=11 I reproduced the issue. I'm running test.bisect to try to isolate this bug. |
|||
| msg311122 - (view) | Author: STINNER Victor (vstinner) * ![]() |
Date: 2018-01-29 12:56 | |
It seems to be related to sendfile():
C:\vstinner\python\master>python -m test -R 3:3 test_asyncio -m test.test_asyncio.test_events.ProactorEventLoopTests.test_sendfile_close_peer_in_middle_of_receiving
Running Debug|x64 interpreter...
Run tests sequentially
0:00:00 [1/1] test_asyncio
beginning 6 repetitions
123456
......
test_asyncio leaked [1, 2, 1] memory blocks, sum=4
test_asyncio failed
1 test failed:
test_asyncio
Total duration: 1 sec
Tests result: FAILURE
|
|||
| msg311151 - (view) | Author: Yury Selivanov (yselivanov) * ![]() |
Date: 2018-01-29 17:04 | |
Andrew, please take a look. I'll have very limited (to no at all) time to work on Python in the next 2 weeks. |
|||
| msg315727 - (view) | Author: STINNER Victor (vstinner) * ![]() |
Date: 2018-04-25 13:24 | |
The test is still leaking memory blocks. Any progress on investigating the issue? |
|||
| msg320157 - (view) | Author: STINNER Victor (vstinner) * ![]() |
Date: 2018-06-21 11:00 | |
Oh, I found again this bug while working on my PR 7827 (detect handle leaks on Windows in regrtest). |
|||
| msg321007 - (view) | Author: STINNER Victor (vstinner) * ![]() |
Date: 2018-07-03 22:59 | |
See also bpo-33735: my commit 23401fb960bb94e6ea62d2999527968d53d3fc65 fixes a false alarm in regrtest when hunting leaks in test_multiprocessing_spawn or test_multiprocessing_forkserver. |
|||
| msg333188 - (view) | Author: STINNER Victor (vstinner) * ![]() |
Date: 2019-01-07 22:56 | |
New changeset df8e1fb4e388e18430a9be8c6ceeb03c330f166c by Victor Stinner in branch 'master': bpo-32710: test_asyncio: test_sendfile reset policy (GH-11461) https://github.com/python/cpython/commit/df8e1fb4e388e18430a9be8c6ceeb03c330f166c |
|||
| msg333193 - (view) | Author: STINNER Victor (vstinner) * ![]() |
Date: 2019-01-08 01:08 | |
Update: * test.test_asyncio.test_sendfile.ProactorEventLoopTests.test_sendfile_close_peer_in_the_middle_of_receiving leaks 1 reference per run: this bug is caused by bpo-35682 and fixed by PR 11462 * test.test_asyncio.test_sendfile.ProactorEventLoopTests.test_sendfile_fallback_close_peer_in_the_middle_of_receiving leaks 1 reference per run: I don't understand why. I spent a lot of time to investigate test_sendfile_fallback_close_peer_in_the_middle_of_receiving() leak and I don't understand the issue. The main loop is BaseEventLoop._sendfile_fallback(). For the specific case of this test, the loop can be simplified to: proto = _SendfileFallbackProtocol(transp) try: while True: data = b'x' * (1024 * 64) await proto.drain() transp.write(data) finally: await proto.restore() The server closes the connection after it gets 1024 bytes. The client socket gets a ConnectionAbortedError exception in _ProactorBaseWritePipeTransport._loop_writing() which calls _fatal_error(): except OSError as exc: self._fatal_error(exc, 'Fatal write error on pipe transport') _fatal_error() calls _force_close() which sets _closing to True and calls protocol.connection_lost(). In the meanwhile, drain() raises ConnectionError because is_closing() is true: async def drain(self): if self._transport.is_closing(): raise ConnectionError("Connection closed by peer") ... |
|||
| msg333198 - (view) | Author: STINNER Victor (vstinner) * ![]() |
Date: 2019-01-08 01:48 | |
Interesting commit. No idea if it's related. commit 79790bc35fe722a49977b52647f9b5fe1deda2b7 Author: Victor Stinner <vstinner@redhat.com> Date: Fri Jun 8 00:25:52 2018 +0200 bpo-33694: Fix race condition in asyncio proactor (GH-7498) The cancellation of an overlapped WSARecv() has a race condition which causes data loss because of the current implementation of proactor in asyncio. No longer cancel overlapped WSARecv() in _ProactorReadPipeTransport to work around the race condition. Remove the optimized recv_into() implementation to get simple implementation of pause_reading() using the single _pending_data attribute. Move _feed_data_to_bufferred_proto() to protocols.py. Remove set_protocol() method which became useless. |
|||
| msg333207 - (view) | Author: STINNER Victor (vstinner) * ![]() |
Date: 2019-01-08 03:07 | |
Attached test_aiosend.py is a simplified version of test to trigger the reference leak. Copy it to Lib/test/ and run: vstinner@WIN C:\vstinner\python\master>python -m test test_aiosend -R 3:3 Running Debug|x64 interpreter... Run tests sequentially 0:00:00 [1/1] test_aiosend beginning 6 repetitions 123456 ...... test_aiosend leaked [1, 1, 1] references, sum=3 test_aiosend leaked [1, 2, 1] memory blocks, sum=4 test_aiosend failed == Tests result: FAILURE == 1 test failed: test_aiosend Total duration: 548 ms Tests result: FAILURE |
|||
| msg333227 - (view) | Author: STINNER Victor (vstinner) * ![]() |
Date: 2019-01-08 13:12 | |
It took me 1 year, a few sleepless nights, multiple attempts to understand the leak, but I eventually found it! WSASend() doesn't release the memory if it fails immediately. I wrote PR 11469 to fix the memory leak. ReadFile() has the same bug, I also fixed it. By the way, the _overlapped.Overlapped type has no traverse function: it may help the garbage collector to add once, since asyncio is famous for building reference cycles by design (Future.set_exception()). |
|||
| msg333228 - (view) | Author: STINNER Victor (vstinner) * ![]() |
Date: 2019-01-08 13:23 | |
New changeset a234e148394c2c7419372ab65b773d53a57f3625 by Victor Stinner in branch 'master': bpo-32710: Fix leak in Overlapped_WSASend() (GH-11469) https://github.com/python/cpython/commit/a234e148394c2c7419372ab65b773d53a57f3625 |
|||
| msg333229 - (view) | Author: STINNER Victor (vstinner) * ![]() |
Date: 2019-01-08 13:33 | |
I ran test_asyncio refleak hunting on Windows, and there is no more leak! vstinner@WIN C:\vstinner\python\master>python -m test test_asyncio -R 3:3 (...) Total duration: 13 min 24 sec Tests result: SUCCESS I will close this PR once the 3.7 backport is merged. |
|||
| msg333230 - (view) | Author: miss-islington (miss-islington) | Date: 2019-01-08 13:40 | |
New changeset 88ad48bc98980a40591cc5521703dbb0ad3a9b17 by Miss Islington (bot) in branch '3.7': bpo-32710: Fix leak in Overlapped_WSASend() (GH-11469) https://github.com/python/cpython/commit/88ad48bc98980a40591cc5521703dbb0ad3a9b17 |
|||
| msg333467 - (view) | Author: STINNER Victor (vstinner) * ![]() |
Date: 2019-01-11 13:35 | |
New changeset 5485085b324a45307c1ff4ec7d85b5998d7d5e0d by Victor Stinner in branch 'master': bpo-32710: Fix _overlapped.Overlapped memory leaks (GH-11489) https://github.com/python/cpython/commit/5485085b324a45307c1ff4ec7d85b5998d7d5e0d |
|||
| msg333470 - (view) | Author: miss-islington (miss-islington) | Date: 2019-01-11 14:01 | |
New changeset 059997d78ed1a1a5a364b1846ac972c98c704927 by Miss Islington (bot) in branch '3.7': bpo-32710: Fix _overlapped.Overlapped memory leaks (GH-11489) https://github.com/python/cpython/commit/059997d78ed1a1a5a364b1846ac972c98c704927 |
|||
| msg333472 - (view) | Author: STINNER Victor (vstinner) * ![]() |
Date: 2019-01-11 14:11 | |
Ok, _overlapped.Overlapped should now have a few less memory leaks :-) |
|||
| History | |||
|---|---|---|---|
| Date | User | Action | Args |
| 2022-04-11 14:58:57 | admin | set | github: 76891 |
| 2019-01-11 14:11:20 | vstinner | set | keywords:
patch, patch, patch messages: + msg333472 |
| 2019-01-11 14:01:53 | miss-islington | set | messages: + msg333470 |
| 2019-01-11 13:35:55 | miss-islington | set | pull_requests: + pull_request11094 |
| 2019-01-11 13:35:47 | miss-islington | set | pull_requests: + pull_request11093 |
| 2019-01-11 13:35:38 | miss-islington | set | pull_requests: + pull_request11092 |
| 2019-01-11 13:35:17 | vstinner | set | messages: + msg333467 |
| 2019-01-10 00:18:10 | vstinner | set | pull_requests: + pull_request11006 |
| 2019-01-10 00:18:01 | vstinner | set | pull_requests: + pull_request11005 |
| 2019-01-10 00:17:52 | vstinner | set | pull_requests: + pull_request11004 |
| 2019-01-08 13:46:28 | vstinner | set | keywords:
patch, patch, patch status: open -> closed resolution: fixed stage: patch review -> resolved |
| 2019-01-08 13:40:52 | miss-islington | set | nosy:
+ miss-islington messages: + msg333230 |
| 2019-01-08 13:33:15 | vstinner | set | keywords:
patch, patch, patch messages: + msg333229 |
| 2019-01-08 13:23:51 | miss-islington | set | pull_requests: + pull_request10967 |
| 2019-01-08 13:23:42 | miss-islington | set | pull_requests: + pull_request10966 |
| 2019-01-08 13:23:33 | miss-islington | set | pull_requests: + pull_request10965 |
| 2019-01-08 13:23:19 | vstinner | set | messages: + msg333228 |
| 2019-01-08 13:12:47 | vstinner | set | keywords:
patch, patch, patch messages: + msg333227 |
| 2019-01-08 13:03:49 | vstinner | set | pull_requests: + pull_request10964 |
| 2019-01-08 13:03:40 | vstinner | set | pull_requests: + pull_request10963 |
| 2019-01-08 13:03:34 | vstinner | set | pull_requests: + pull_request10962 |
| 2019-01-08 03:07:28 | vstinner | set | keywords:
patch, patch, patch files: + test_aiosend.py messages: + msg333207 |
| 2019-01-08 01:48:44 | vstinner | set | keywords:
patch, patch, patch messages: + msg333198 |
| 2019-01-08 01:08:40 | vstinner | set | keywords:
patch, patch, patch messages: + msg333193 |
| 2019-01-08 00:58:10 | vstinner | set | keywords:
patch, patch, patch title: test_asyncio: ProactorEventLoopTests.test_sendfile_close_peer_in_middle_of_receiving() leaked [4, 4, 3] memory blocks on AMD64 Windows8.1 Refleaks 3.x -> test_asyncio: ProactorEventLoopTests sendfile tests leak references on Windows |
| 2019-01-07 22:56:10 | vstinner | set | messages: + msg333188 |
| 2019-01-07 22:35:24 | vstinner | set | keywords:
+ patch stage: patch review pull_requests: + pull_request10939 |
| 2019-01-07 22:35:15 | vstinner | set | keywords:
+ patch stage: (no value) pull_requests: + pull_request10938 |
| 2019-01-07 22:35:08 | vstinner | set | keywords:
+ patch stage: (no value) pull_requests: + pull_request10937 |
| 2018-07-03 22:59:50 | vstinner | set | messages: + msg321007 |
| 2018-07-03 22:58:18 | vstinner | set | title: test_asyncio leaked [4, 4, 3] memory blocks, sum=11 on AMD64 Windows8.1 Refleaks 3.x -> test_asyncio: ProactorEventLoopTests.test_sendfile_close_peer_in_middle_of_receiving() leaked [4, 4, 3] memory blocks on AMD64 Windows8.1 Refleaks 3.x |
| 2018-06-21 11:00:03 | vstinner | set | messages: + msg320157 |
| 2018-05-23 13:05:05 | giampaolo.rodola | set | nosy:
+ giampaolo.rodola |
| 2018-04-25 13:24:27 | vstinner | set | versions: + Python 3.8 |
| 2018-04-25 13:24:17 | vstinner | set | messages: + msg315727 |
| 2018-01-29 17:04:09 | yselivanov | set | messages: + msg311151 |
| 2018-01-29 12:56:37 | vstinner | set | messages: + msg311122 |
| 2018-01-29 12:43:38 | vstinner | create | |
