Fix module loading in multi-threading environments #13823
Closed
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.
When ansible loads a module from disk for a plugin, it first checks
to see if the module has already been loaded (i.e., exists in
sys.modules), and if it does, it returns that reference rather than
loading the module again (which, as described in issue #13110, must
not happen because repeating the module load may re-initialize
module global variables).
When a module is loaded, the reference is immediately added to
sys.modules, even before the module initialization is complete.
Therefore, if two threads race the module loading code, the first
will begin loading the module from disk, and the second will see
the module in sys.modules. It might begin using that module before
it is even fully loaded, resulting in AttributeErrors on objects
which should be defined in the module.
This change wraps the method which checks for existence in
sys.modules and loads modules from disk in a global mutex so that
more than one module is never loaded from disk at a time.
Fixes #13822