]> git.ipfire.org Git - thirdparty/sqlalchemy/sqlalchemy.git/commit
ensure event handlers called for all do_ping
authorMike Bayer <mike_mp@zzzcomputing.com>
Fri, 24 Feb 2023 21:15:21 +0000 (16:15 -0500)
committerMike Bayer <mike_mp@zzzcomputing.com>
Sat, 4 Mar 2023 16:00:48 +0000 (11:00 -0500)
commit5132237f8ddaab1a8c6bfcaa03aca6487434ae95
tree71a92b356920a7ecfc4fffcea04f16f42da971e5
parent8b108297d075ae68178cd18a9cb4d06feee7e075
ensure event handlers called for all do_ping

The support for pool ping listeners to receive exception events via the
:meth:`.ConnectionEvents.handle_error` event added in 2.0.0b1 for
:ticket:`5648` failed to take into account dialect-specific ping routines
such as that of MySQL and PostgreSQL. The dialect feature has been reworked
so that all dialects participate within event handling.   Additionally,
a new boolean element :attr:`.ExceptionContext.is_pre_ping` is added
which identifies if this operation is occurring within the pre-ping
operation.

For this release, third party dialects which implement a custom
:meth:`_engine.Dialect.do_ping` method can opt in to the newly improved
behavior by having their method no longer catch exceptions or check
exceptions for "is_disconnect", instead just propagating all exceptions
outwards. Checking the exception for "is_disconnect" is now done by an
enclosing method on the default dialect, which ensures that the event hook
is invoked for all exception scenarios before testing the exception as a
"disconnect" exception. If an existing ``do_ping()`` method continues to
catch exceptions and check "is_disconnect", it will continue to work as it
did previously, but ``handle_error`` hooks will not have access to the
exception if it isn't propagated outwards.

Fixes: #5648
Change-Id: I6535d5cb389e1a761aad8c37cfeb332c548b876d
doc/build/changelog/unreleased_20/5648.rst [new file with mode: 0644]
lib/sqlalchemy/dialects/mysql/mysqlconnector.py
lib/sqlalchemy/dialects/mysql/mysqldb.py
lib/sqlalchemy/dialects/postgresql/_psycopg_common.py
lib/sqlalchemy/dialects/postgresql/asyncpg.py
lib/sqlalchemy/engine/base.py
lib/sqlalchemy/engine/default.py
lib/sqlalchemy/engine/interfaces.py
lib/sqlalchemy/pool/base.py
lib/sqlalchemy/testing/engines.py
test/engine/test_reconnect.py