summaryrefslogtreecommitdiff
path: root/lib
diff options
context:
space:
mode:
authorMike Bayer <mike_mp@zzzcomputing.com>2021-07-16 11:34:13 -0400
committerMike Bayer <mike_mp@zzzcomputing.com>2021-07-16 11:34:13 -0400
commita25d6ead9cf6d2d51ae67e53eac50f642a0bb432 (patch)
treea6fbc2a44f2c768773ec8da961afc89725bdf7b3 /lib
parent42d747f72efd776a575ea776ebb5c768282f44eb (diff)
downloadsqlalchemy-a25d6ead9cf6d2d51ae67e53eac50f642a0bb432.tar.gz
guard against unexpected weakref cleanups
Added some guards against ``KeyError`` in the event system to accommodate the case that the interpreter is shutting down at the same time :meth:`_engine.Engine.dispose` is being called, which would cause stack trace warnings. Fixes: #6740 Change-Id: I2c42e9edac2371e68b39d8360494c5fddfd6cd8c
Diffstat (limited to 'lib')
-rw-r--r--lib/sqlalchemy/event/registry.py14
1 files changed, 12 insertions, 2 deletions
diff --git a/lib/sqlalchemy/event/registry.py b/lib/sqlalchemy/event/registry.py
index 1f7cc43f1..ca85f3368 100644
--- a/lib/sqlalchemy/event/registry.py
+++ b/lib/sqlalchemy/event/registry.py
@@ -112,8 +112,18 @@ def _stored_in_collection_multi(newowner, oldowner, elements):
for listen_fn in elements:
listen_ref = weakref.ref(listen_fn)
- key = old_listener_to_key[listen_ref]
- dispatch_reg = _key_to_collection[key]
+ try:
+ key = old_listener_to_key[listen_ref]
+ except KeyError:
+ # can occur during interpreter shutdown.
+ # see #6740
+ continue
+
+ try:
+ dispatch_reg = _key_to_collection[key]
+ except KeyError:
+ continue
+
if newowner in dispatch_reg:
assert dispatch_reg[newowner] == listen_ref
else: