]> git.ipfire.org Git - thirdparty/sqlalchemy/sqlalchemy.git/commitdiff
Ignore max_overflow when pool_size is 0
authorFederico Caselli <cfederico87@gmail.com>
Thu, 15 Sep 2022 20:42:08 +0000 (22:42 +0200)
committerFederico Caselli <cfederico87@gmail.com>
Thu, 15 Sep 2022 20:42:08 +0000 (22:42 +0200)
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 [new file with mode: 0644]
lib/sqlalchemy/pool/impl.py
test/engine/test_pool.py

diff --git a/doc/build/changelog/unreleased_20/8523.rst b/doc/build/changelog/unreleased_20/8523.rst
new file mode 100644 (file)
index 0000000..2663dff
--- /dev/null
@@ -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.
index 15ff8c75f5fa68950df2dfe90a60ae3610829471..8b328236e88df25506087df75b1cacaebc91a991 100644 (file)
@@ -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
index 39f86e280fe13d0b331fbd1ef123be50ce850771..f28da14be336a0c796f288b2a4f04f3b413ed128 100644 (file)
@@ -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)