-
-
Notifications
You must be signed in to change notification settings - Fork 30.8k
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
GH-106176, GH-104702: Fix reference leak when importing across multiple threads #108497
GH-106176, GH-104702: Fix reference leak when importing across multiple threads #108497
Conversation
!buildbot .*Windows11.*Refleaks |
🤖 New build scheduled with the buildbot fleet by @brettcannon for commit 50e4c5d 🤖 The command will test the builders whose names match following regular expression: The builders matched are:
|
This is probably what we should have done. |
FYI the Windows 11 refleak builder has not come back yet, so the green CI is a little misleading until we can get confirmation this PR doesn't leak under Windows. |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I'm now curious if it does fix the issue.
I'm still able to reproduce the leak in the main branch:
And with this PR: this is no leak, it works!
Well done @brettcannon and @Eclips4! |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
LGTM since it does fix the leak :-) I left a review, feel free to address it, or ignore my remarks ;-) Thanks for fixing Windows Refleaks buildbots!
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
+1 to all of Victor's words.
LGTM!
(I've check it on my windows setup and this solution seems fine, refleaks are gone)
I would prefer to backport it to 3.12, because:
|
This also solves the #104702. |
Thanks for the reviews and verification! I should be able to get this merged at worst by Friday, but hopefully sooner. |
I addressed the review comments from Victor, updated against |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
LGTM. Thanks for the update!
Thanks @brettcannon for the PR, and @vstinner for merging it 🌮🎉.. I'm working now to backport this PR to: 3.12. |
GH-108612 is a backport of this pull request to the 3.12 branch. |
…cross multiple threads (pythonGH-108497) (cherry picked from commit 5f85b44) Co-authored-by: Brett Cannon <[email protected]>
Thanks. I took the freedom of merging your PR. It became difficult to read buildbot results these days, since there are more and more known failures. This fix should reduce the number of failed buildbots! |
Again, thanks for the fix @brettcannon and @Eclips4! |
|
# Dictionary protected by the global import lock | ||
# For a list that can have a weakref to it. | ||
class _List(list): | ||
pass |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
FWIW, I think it would be nice to use __slots__
for this class, to reduce the size of each instance (especially since the setdefault call creates one each time, even when it isn't necessary).
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
As in you're going to make a PR to make that change, or you're hoping someone else will open an issue on your behalf to track the idea?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
The latter (although not on my behalf) -- I don't know if there's a reason not to do it, and I don't have the spare cycles to dig in and find out.
FWIW, this does not seem to have resolved the refleak in test_import in 3.12 (see e.g. https://buildbot.python.org/all/#/builders/1125/builds/115) even though it does seem to have fixed them in main. Does anyone want to take a look at why test_import is still leaking in 3.12? |
Nevermind, the leak was from a different issue (still not resolved on main, but more cleverly hidden). |
When importing, import deadlock detection tracks which threads are importing which modules in a list. Prior to this change, a list was created per thread but never disposed of. Now, the list is disposed of properly using weakrefs to guarantee GC doesn't interrupt the cleanup.
Co-Authored-By: Kirill Podoprigora [email protected]
test_import.test_concurrency
leaks ref on Windows #106176