Fix memory leak in logging.enable#152
Merged
SergeyKanzhelev merged 3 commits intomicrosoft:developfrom Mar 18, 2019
CatalystCode:weakref
Merged
Fix memory leak in logging.enable#152SergeyKanzhelev merged 3 commits intomicrosoft:developfrom CatalystCode:weakref
SergeyKanzhelev merged 3 commits intomicrosoft:developfrom
CatalystCode:weakref
Conversation
The `logging.enable` function caches references to the LoggingHandler instances that it creates in a dictionary private to the module. This means that references to the handler objects survive even if they were removed from all loggers that referenced them, causing two undesirable side-effects: 1) The LoggingHandler instances created by `logging.enable` can never be reclaimed by the garbage collector. 2) Removing all references to the LoggingHandler from the logger doesn't mark the instrumentation key as "no longer used". This change fixes these issues by replacing the cache with a WeakValueDictionary: as soon as the last reference to the LoggingHandler is removed (e.g. when `some_logger.removeHandler(...)` is called), the WeakValueDictionary will also evict its cached entry.
SergeyKanzhelev
approved these changes
Mar 18, 2019
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
The
logging.enablefunction caches references to theLoggingHandlerinstances that it creates in a dictionary private to the module.This means that references to the handler objects survive even if they were removed from all loggers that referenced them, causing two undesirable side-effects:
The
LoggingHandlerinstances created bylogging.enablecan never be reclaimed by the garbage collector.Removing all references to the
LoggingHandlerfrom the logger doesn't mark the instrumentation key as "no longer used" in thelogging.enablemodule.This change fixes these issues by replacing the cache with a
WeakValueDictionary: as soon as the last reference to theLoggingHandleris removed (e.g. whensome_logger.removeHandler(...)is called), theWeakValueDictionarywill also evict its cached entry.