[CONPY-255] ConnectionPool.get_connection does not raise mariadb.PoolError Created: 2023-03-28  Updated: 2023-04-11  Resolved: 2023-04-11

Status: Closed
Project: MariaDB Connector/Python
Component/s: Connection Pooling
Affects Version/s: 1.1.5, 1.1.6
Fix Version/s: 1.1.7

Type: Bug Priority: Minor
Reporter: G.Mech Assignee: Georg Richter
Resolution: Fixed Votes: 0
Labels: None
Environment:

Win10 21H2, MariaDB Server 10.6.11 (official docker image)


Attachments: File test_raises_pool_error.py    
Python Version: 3.10.4

 Description   

Steps to reproduce

  1. set enviroment variables to allow login to server (see attached file)
  2. Run python example

The example code initializes a ConnectionPool with 3 connections and calls get_connection() 4 times.

Expected outcome

As the documentation says, get_connection should raise a PoolError, because no connection is available:

ConnectionPool.get_connection()
Returns a connection from the connection pool or raises a PoolError exception if a connection is not available.

Actual outcome

get_connection() does not raise PoolError but returns None

Workaround

Do not catch PoolError but test return value:

 
conn = pool.get_connection()
if not conn:
    # put error handling here

Remarks

There is probably much code which relies on the current implementation, so its probably better to change the documentation.

There is a test case test_connection_pool_maxconn in .\testing\test\integration\test_pooling.py but it does not assert that a PoolError is raised.



 Comments   
Comment by G.Mech [ 2023-03-28 ]

I can reproduce the issue by changing test_connection_pool_maxconn as follows:

    def test_connection_pool_maxconn(self):
        default_conf = conf()
        pool = mariadb.ConnectionPool(pool_name="test_max_size",
                                      **default_conf)
        connections = []
        for i in range(1, 6):
            connections.append(pool.get_connection())
        try:
            with self.assertRaises(mariadb.PoolError):
                pool.get_connection()
        finally:
            for c in connections:
                c.close()
            pool.get_connection()
            pool.close()

Comment by Georg Richter [ 2023-04-11 ]

Thanks for your bug report.
I just checked other python database drivers, they all raise an exception - so we should do the same.

Generated at Thu Feb 08 03:31:24 UTC 2024 using Jira 8.20.16#820016-sha1:9d11dbea5f4be3d4cc21f03a88dd11d8c8687422.