<div dir="ltr">That's great!<br><br>I would add that many Windows Proactor bugs were found after implementing sendfile support.<br>If sendfile is not available for some reason asyncio uses a fallback to send a file content chunk-by-chunk reading it in memory.<br>The fallback code was easy and straightforward, it worked just fine on Linux but the same code failed on proactor.<br><br>Thank you very much, Victor, for finally pinning the problem down.</div><br><div class="gmail_quote"><div dir="ltr">On Wed, Jan 9, 2019 at 7:51 PM Brett Cannon <<a href="mailto:brett@python.org">brett@python.org</a>> wrote:<br></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex"><div dir="ltr">Thanks for tracking that down! Been bugging me as well and the one time I tried to figure it out I got no where, so kudos for sticking with it!<br></div><br><div class="gmail_quote"><div dir="ltr">On Wed, 9 Jan 2019 at 09:13, Victor Stinner <<a href="mailto:vstinner@redhat.com" target="_blank">vstinner@redhat.com</a>> wrote:<br></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex">Hi,<br>
<br>
The "AMD64 Windows 8.1 Refleaks 3.x" buildbot (which hunts reference<br>
leaks and memory leaks) was failing on test_asyncio for 1 year:<br>
<br>
   <a href="https://bugs.python.org/issue32710" rel="noreferrer" target="_blank">https://bugs.python.org/issue32710</a><br>
<br>
It was a leak of a single reference:<br>
<br>
   test_aiosend leaked [1, 1, 1] references, sum=3<br>
<br>
I tried multiple times since last year (January 2018) to understand<br>
the leak: it didn't make any sense (well, as any bug at the beginning,<br>
no?). I checked several times the complex asyncio code: all transports<br>
are cleanly closed, the event loop is properly closed, etc. The code<br>
looks correct.<br>
<br>
After a long sleepness night... I still failed to reproduce the bug<br>
:-( But I succeeded to get a way shorter reproducer script. Thanks to<br>
this script, I was able to loop to get 100 reference leaks instead of<br>
leaking a single reference. Using tracemalloc, I found the faulty<br>
line... but it still didn't make sense to me. After additional several<br>
hours of debug, I found that an overlapped object wasn't released<br>
properly: an asynchronous WSASend().<br>
<br>
The problem was when an overlapped WSASend() failed immediately, the<br>
internal buffer was not released, whereas it holds a reference to the<br>
input byte string. **It means that an asyncio send() failure using the<br>
ProactorEventLoop can cause a memory leak**... I'm very surprised that<br>
nobody noticed such **huge** memory leak previously!<br>
<br>
The _overlapped bugfix:<br>
<br>
<a href="https://github.com/python/cpython/commit/a234e148394c2c7419372ab65b773d53a57f3625" rel="noreferrer" target="_blank">https://github.com/python/cpython/commit/a234e148394c2c7419372ab65b773d53a57f3625</a><br>
<br>
Eventually, the "AMD64 Windows 8.1 Refleaks 3.x" buildbot is back to green!<br>
<br>
   <a href="https://buildbot.python.org/all/#/builders/80" rel="noreferrer" target="_blank">https://buildbot.python.org/all/#/builders/80</a><br>
<br>
It means that it will be easier and faster to spot reference or memory<br>
leak regressions (specific to Windows, the Gentoo Refleaks buildbot<br>
was already green for several months!).<br>
<br>
Since ProactorEventLoop became the default event loop in Python 3.8<br>
(on Windows, it's specific to Windows), I hope that we fixed all most<br>
obvious bugs!<br>
<br>
This story also means that any very tiny buildbot failure (a single<br>
test method failure on a single very specific buildbot) can hide a<br>
giant bug ;-) Sadly, we have to fix *all* buildbots failures to find<br>
them... Hopefully, almost all buildbots are green currently.<br>
<br>
Victor<br>
-- <br>
Night gathers, and now my watch begins. It shall not end until my death.<br>
_______________________________________________<br>
Python-Dev mailing list<br>
<a href="mailto:Python-Dev@python.org" target="_blank">Python-Dev@python.org</a><br>
<a href="https://mail.python.org/mailman/listinfo/python-dev" rel="noreferrer" target="_blank">https://mail.python.org/mailman/listinfo/python-dev</a><br>
Unsubscribe: <a href="https://mail.python.org/mailman/options/python-dev/brett%40python.org" rel="noreferrer" target="_blank">https://mail.python.org/mailman/options/python-dev/brett%40python.org</a><br>
</blockquote></div>
_______________________________________________<br>
Python-Dev mailing list<br>
<a href="mailto:Python-Dev@python.org" target="_blank">Python-Dev@python.org</a><br>
<a href="https://mail.python.org/mailman/listinfo/python-dev" rel="noreferrer" target="_blank">https://mail.python.org/mailman/listinfo/python-dev</a><br>
Unsubscribe: <a href="https://mail.python.org/mailman/options/python-dev/andrew.svetlov%40gmail.com" rel="noreferrer" target="_blank">https://mail.python.org/mailman/options/python-dev/andrew.svetlov%40gmail.com</a><br>
</blockquote></div><br clear="all"><div><br></div>-- <br><div dir="ltr" class="gmail_signature">Thanks,<br>Andrew Svetlov</div>