]> git.ipfire.org Git - thirdparty/sqlalchemy/sqlalchemy.git/commitdiff
guard against unexpected weakref cleanups
authorMike Bayer <mike_mp@zzzcomputing.com>
Fri, 16 Jul 2021 15:34:13 +0000 (11:34 -0400)
committerMike Bayer <mike_mp@zzzcomputing.com>
Fri, 16 Jul 2021 15:34:13 +0000 (11:34 -0400)
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

doc/build/changelog/unreleased_14/6740.rst [new file with mode: 0644]
lib/sqlalchemy/event/registry.py

diff --git a/doc/build/changelog/unreleased_14/6740.rst b/doc/build/changelog/unreleased_14/6740.rst
new file mode 100644 (file)
index 0000000..62ac3c8
--- /dev/null
@@ -0,0 +1,9 @@
+.. change::
+    :tags: bug, engine
+    :tickets: 6740
+
+    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.
+
index 1f7cc43f11b438bec3a1dac69cb870b8365b42c0..ca85f33684ea4e7e4a930d95c2c35ab9fdd80152 100644 (file)
@@ -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: