From 20917c591848792932dfebbe6580276a885385a5 Mon Sep 17 00:00:00 2001 From: Federico Caselli Date: Thu, 15 Sep 2022 22:42:08 +0200 Subject: [PATCH] Ignore max_overflow when pool_size is 0 The :class:`_pool.QueuePool` now ignores ``max_overflow`` when ``pool_size=0``, properly making the pool unlimited in all cases. Fixes: #8523 Change-Id: Ifc32eb47a281c4b3acf357352f07b9b8a73d1b6f --- doc/build/changelog/unreleased_20/8523.rst | 6 ++++++ lib/sqlalchemy/pool/impl.py | 4 ++-- test/engine/test_pool.py | 10 ++++++++++ 3 files changed, 18 insertions(+), 2 deletions(-) create mode 100644 doc/build/changelog/unreleased_20/8523.rst diff --git a/doc/build/changelog/unreleased_20/8523.rst b/doc/build/changelog/unreleased_20/8523.rst new file mode 100644 index 0000000000..2663dffd17 --- /dev/null +++ b/doc/build/changelog/unreleased_20/8523.rst @@ -0,0 +1,6 @@ +.. change:: + :tags: bug, pool + :tickets: 8523 + + The :class:`_pool.QueuePool` now ignores ``max_overflow`` when + ``pool_size=0``, properly making the pool unlimited in all cases. diff --git a/lib/sqlalchemy/pool/impl.py b/lib/sqlalchemy/pool/impl.py index 15ff8c75f5..8b328236e8 100644 --- a/lib/sqlalchemy/pool/impl.py +++ b/lib/sqlalchemy/pool/impl.py @@ -126,7 +126,7 @@ class QueuePool(Pool): Pool.__init__(self, creator, **kw) self._pool = self._queue_class(pool_size, use_lifo=use_lifo) self._overflow = 0 - pool_size - self._max_overflow = max_overflow + self._max_overflow = -1 if pool_size == 0 else max_overflow self._timeout = timeout self._overflow_lock = threading.Lock() @@ -241,7 +241,7 @@ class QueuePool(Pool): return self._pool.qsize() def overflow(self) -> int: - return self._overflow + return self._overflow if self._pool.maxsize else 0 def checkedout(self) -> int: return self._pool.maxsize - self._pool.qsize() + self._overflow diff --git a/test/engine/test_pool.py b/test/engine/test_pool.py index 39f86e280f..f28da14be3 100644 --- a/test/engine/test_pool.py +++ b/test/engine/test_pool.py @@ -1373,6 +1373,16 @@ class QueuePoolTest(PoolTestBase): def test_max_overflow(self): self._test_overflow(40, 5) + @testing.combinations(42, 0, -5, 1) + def test_unlimited(self, max_overflow): + p = self._queuepool_fixture(pool_size=0, max_overflow=max_overflow) + eq_(p.overflow(), 0) + c1 = p.connect() + c2 = p.connect() + eq_(p.overflow(), 0) + c1.close() + c2.close() + def test_overflow_no_gc(self): p = self._queuepool_fixture(pool_size=2, max_overflow=2) -- 2.47.2