"""
Return a connection to the pool after usage.
"""
+ self._reset_connection(conn)
if from_getconn:
if conn.pgconn.transaction_status == TransactionStatus.UNKNOWN:
self._stats[self._CONNECTIONS_LOST] += 1
self.run_task(AddConnection(self))
logger.info("not serving connection found broken")
return
- else:
- self._reset_connection(conn)
- if conn.pgconn.transaction_status == TransactionStatus.UNKNOWN:
- self._stats[self._RETURNS_BAD] += 1
- # Connection no more in working state: create a new one.
- self.run_task(AddConnection(self))
- logger.warning("discarding closed connection: %s", conn)
- return
+ elif conn.pgconn.transaction_status == TransactionStatus.UNKNOWN:
+ self._stats[self._RETURNS_BAD] += 1
+ # Connection no more in working state: create a new one.
+ self.run_task(AddConnection(self))
+ logger.warning("discarding closed connection: %s", conn)
+ return
# Check if the connection is past its best before date
if conn._expire_at <= monotonic():
"""
Return a connection to the pool after usage.
"""
+ await self._reset_connection(conn)
if from_getconn:
if conn.pgconn.transaction_status == TransactionStatus.UNKNOWN:
self._stats[self._CONNECTIONS_LOST] += 1
return
else:
- await self._reset_connection(conn)
if conn.pgconn.transaction_status == TransactionStatus.UNKNOWN:
self._stats[self._RETURNS_BAD] += 1
# Connection no more in working state: create a new one.
for delta in deltas:
assert delta == pytest.approx(want, 0.05), deltas
want *= 2
+
+
+@pytest.mark.slow
+@pytest.mark.parametrize("status", ["ERROR", "INTRANS"])
+def test_check_returns_an_ok_connection(dsn, status):
+
+ def check(conn):
+ if status == "ERROR":
+ conn.execute("wat")
+ elif status == "INTRANS":
+ conn.execute("select 1")
+ 1 / 0
+ else:
+ assert False
+
+ with pool.ConnectionPool(dsn, min_size=1, check=check) as p:
+ p.wait(1.0)
+ with pytest.raises(pool.PoolTimeout):
+ conn = p.getconn(0.5)
+
+ conn = list(p._pool)[0]
+ assert conn.info.transaction_status == TransactionStatus.IDLE
for delta in deltas:
assert delta == pytest.approx(want, 0.05), deltas
want *= 2
+
+
+@pytest.mark.slow
+@pytest.mark.parametrize("status", ["ERROR", "INTRANS"])
+async def test_check_returns_an_ok_connection(dsn, status):
+ async def check(conn):
+ if status == "ERROR":
+ await conn.execute("wat")
+ elif status == "INTRANS":
+ await conn.execute("select 1")
+ 1 / 0
+ else:
+ assert False
+
+ async with pool.AsyncConnectionPool(dsn, min_size=1, check=check) as p:
+ await p.wait(1.0)
+ with pytest.raises(pool.PoolTimeout):
+ conn = await p.getconn(0.5)
+
+ conn = list(p._pool)[0]
+ assert conn.info.transaction_status == TransactionStatus.IDLE