]> git.ipfire.org Git - thirdparty/psycopg.git/commitdiff
Add separate setup_timeout param for pool
authorDaniele Varrazzo <daniele.varrazzo@gmail.com>
Sun, 21 Feb 2021 03:47:20 +0000 (04:47 +0100)
committerDaniele Varrazzo <daniele.varrazzo@gmail.com>
Fri, 12 Mar 2021 04:07:25 +0000 (05:07 +0100)
Allow 0 too, which would fill the pool in background.

psycopg3/psycopg3/pool.py
tests/test_pool.py

index 33d2bd85b530e48184033288be1cee15139622d4..8c62faaa320c3d999f21a0cc7fb27f1ede3079a7 100644 (file)
@@ -46,6 +46,7 @@ class ConnectionPool:
         maxconn: Optional[int] = None,
         name: Optional[str] = None,
         timeout: float = 30.0,
+        setup_timeout: float = 30.0,
         max_idle: float = 10 * 60.0,
         reconnect_timeout: float = 5 * 60.0,
         reconnect_failed: Optional[Callable[["ConnectionPool"], None]] = None,
@@ -100,16 +101,21 @@ class ConnectionPool:
         self._sched_runner.start()
 
         # Populate the pool with initial minconn connections
-        event = threading.Event()
-        for i in range(self._nconns):
-            self.add_task(AddInitialConnection(self, event))
-
-        # Wait for the pool to be full or throw an error
-        if not event.wait(timeout=timeout):
-            self.close()  # stop all the threads
-            raise PoolTimeout(
-                f"pool initialization incomplete after {timeout} sec"
-            )
+        # Block if setup_timeout is > 0, otherwise fill the pool in background
+        if setup_timeout > 0:
+            event = threading.Event()
+            for i in range(self._nconns):
+                self.add_task(AddInitialConnection(self, event))
+
+            # Wait for the pool to be full or throw an error
+            if not event.wait(timeout=setup_timeout):
+                self.close()  # stop all the threads
+                raise PoolTimeout(
+                    f"pool initialization incomplete after {setup_timeout} sec"
+                )
+        else:
+            for i in range(self._nconns):
+                self.add_task(AddConnection(self))
 
     def __repr__(self) -> str:
         return (
index a623d816281973ff48c2032f5a937a79728f0149..14e68c0ec98a335a083d3a6221055dc0e0188efb 100644 (file)
@@ -73,17 +73,35 @@ def test_concurrent_filling(dsn, monkeypatch):
 
 
 @pytest.mark.slow
-def test_init_timeout(dsn, monkeypatch):
+def test_setup_timeout(dsn, monkeypatch):
     delay_connection(monkeypatch, 0.1)
     with pytest.raises(pool.PoolTimeout):
-        pool.ConnectionPool(dsn, minconn=4, num_workers=1, timeout=0.3)
+        pool.ConnectionPool(dsn, minconn=4, num_workers=1, setup_timeout=0.3)
 
-    p = pool.ConnectionPool(dsn, minconn=4, num_workers=1, timeout=0.5)
+    p = pool.ConnectionPool(dsn, minconn=4, num_workers=1, setup_timeout=0.5)
     p.close()
-    p = pool.ConnectionPool(dsn, minconn=4, num_workers=2, timeout=0.3)
+    p = pool.ConnectionPool(dsn, minconn=4, num_workers=2, setup_timeout=0.3)
     p.close()
 
 
+@pytest.mark.slow
+def test_setup_no_timeout(dsn, proxy):
+    with pytest.raises(pool.PoolTimeout):
+        pool.ConnectionPool(
+            proxy.client_dsn, minconn=1, num_workers=1, setup_timeout=0.2
+        )
+
+    p = pool.ConnectionPool(
+        proxy.client_dsn, minconn=1, num_workers=1, setup_timeout=0
+    )
+    sleep(0.5)
+    assert not p._pool
+    proxy.start()
+
+    with p.connection() as conn:
+        conn.execute("select 1")
+
+
 @pytest.mark.slow
 def test_queue(dsn):
     p = pool.ConnectionPool(dsn, minconn=2)
@@ -446,7 +464,7 @@ def test_reconnect(proxy, caplog, monkeypatch):
     monkeypatch.setattr(pool.AddConnection, "DELAY_JITTER", 0.0)
 
     proxy.start()
-    p = pool.ConnectionPool(proxy.client_dsn, minconn=1, timeout=2)
+    p = pool.ConnectionPool(proxy.client_dsn, minconn=1, setup_timeout=2.0)
     proxy.stop()
 
     with pytest.raises(psycopg3.OperationalError):
@@ -486,7 +504,7 @@ def test_reconnect_failure(proxy):
         proxy.client_dsn,
         name="this-one",
         minconn=1,
-        timeout=2,
+        setup_timeout=2.0,
         reconnect_timeout=1.0,
         reconnect_failed=failed,
     )