From a25d6ead9cf6d2d51ae67e53eac50f642a0bb432 Mon Sep 17 00:00:00 2001 From: Mike Bayer Date: Fri, 16 Jul 2021 11:34:13 -0400 Subject: 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 --- lib/sqlalchemy/event/registry.py | 14 ++++++++++++-- 1 file changed, 12 insertions(+), 2 deletions(-) (limited to 'lib') 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: -- cgit v1.2.1