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,
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 (
@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)
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):
proxy.client_dsn,
name="this-one",
minconn=1,
- timeout=2,
+ setup_timeout=2.0,
reconnect_timeout=1.0,
reconnect_failed=failed,
)