From: Mike Bayer Date: Fri, 16 Jul 2021 15:34:13 +0000 (-0400) Subject: guard against unexpected weakref cleanups X-Git-Tag: rel_1_4_22~7 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=a25d6ead9cf6d2d51ae67e53eac50f642a0bb432;p=thirdparty%2Fsqlalchemy%2Fsqlalchemy.git 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 --- diff --git a/doc/build/changelog/unreleased_14/6740.rst b/doc/build/changelog/unreleased_14/6740.rst new file mode 100644 index 0000000000..62ac3c83fb --- /dev/null +++ b/doc/build/changelog/unreleased_14/6740.rst @@ -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. + diff --git a/lib/sqlalchemy/event/registry.py b/lib/sqlalchemy/event/registry.py index 1f7cc43f11..ca85f33684 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: