Fix #487 reference cycles in Local #508
Open
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.
Fix reference cycles in Local. A more detailed description is available in the issue.
Fix #487
Explanation
When Django tries to reference a database connection that is not yet established, it executes something like this (paraphrasing):
Now, internally, asgiref's Local does this:
Now, putting everything together:
Local
object_lock_storage
context manager is enteredasyncio.get_running_loop()
, which raises aRuntimeError
yields self._storage
(at this point, we're still in the exception handler inside the context manager)Local
executesgetattr
onstorage
, which raises anAttributeError
AttributeError
is propagated back to the context manager and since it's in the exception handler, it's linked to the previousRuntimeError
(Python assumes theAttributeError
was raised while attempting to handle theRuntimeError
)