From: Daniele Varrazzo Date: Sat, 19 Feb 2022 14:39:37 +0000 (+0100) Subject: test(pool): add test to show deadlock on logging X-Git-Tag: pool-3.1.1~2^2~1 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=3131f714bd202d163b0efd77b3a708aa08c274c6;p=thirdparty%2Fpsycopg.git test(pool): add test to show deadlock on logging This deadlock seems reproducible at least on Python 3.8 and 3.10 on Linux. It is caused by the logging statement in ``MaintenanceTask.__init__``: even just a ``print()`` there causes the lock. See https://github.com/psycopg/psycopg/issues/230 for more details. --- diff --git a/tests/pool/test_pool.py b/tests/pool/test_pool.py index b3b67392e..84954fe2f 100644 --- a/tests/pool/test_pool.py +++ b/tests/pool/test_pool.py @@ -1151,6 +1151,25 @@ def test_spike(dsn, monkeypatch): assert len(p._pool) < 7 +def test_debug_deadlock(dsn): + # https://github.com/psycopg/psycopg/issues/230 + logger = logging.getLogger("psycopg") + handler = logging.StreamHandler() + old_level = logger.level + logger.setLevel(logging.DEBUG) + handler.setLevel(logging.DEBUG) + logger.addHandler(handler) + try: + with pool.ConnectionPool(dsn, min_size=4, open=True) as p: + try: + p.wait(timeout=2) + finally: + print(p.get_stats()) + finally: + logger.removeHandler(handler) + logger.setLevel(old_level) + + def delay_connection(monkeypatch, sec): """ Return a _connect_gen function delayed by the amount of seconds diff --git a/tests/pool/test_pool_async.py b/tests/pool/test_pool_async.py index 436e5dcb2..3a26a98f0 100644 --- a/tests/pool/test_pool_async.py +++ b/tests/pool/test_pool_async.py @@ -1087,6 +1087,22 @@ async def test_spike(dsn, monkeypatch): assert len(p._pool) < 7 +async def test_debug_deadlock(dsn): + # https://github.com/psycopg/psycopg/issues/230 + logger = logging.getLogger("psycopg") + handler = logging.StreamHandler() + old_level = logger.level + logger.setLevel(logging.DEBUG) + handler.setLevel(logging.DEBUG) + logger.addHandler(handler) + try: + async with pool.AsyncConnectionPool(dsn, min_size=4, open=True) as p: + await p.wait(timeout=2) + finally: + logger.removeHandler(handler) + logger.setLevel(old_level) + + def delay_connection(monkeypatch, sec): """ Return a _connect_gen function delayed by the amount of seconds