diff --git a/eventlet/db_pool.py b/eventlet/db_pool.py index 9874c2f..2664a95 100644 --- a/eventlet/db_pool.py +++ b/eventlet/db_pool.py @@ -228,7 +228,9 @@ class BaseConnectionPool(Pool): if self._expiration_timer: self._expiration_timer.cancel() free_items, self.free_items = self.free_items, deque() - for _last_used, _created_at, conn in free_items: + for item in free_items: + # Free items created using min_size>0 are not tuples. + conn = item[2] if isinstance(item, tuple) else item self._safe_close(conn, quiet=True) def __del__(self): diff --git a/tests/db_pool_test.py b/tests/db_pool_test.py index ed6f09b..2a316b0 100644 --- a/tests/db_pool_test.py +++ b/tests/db_pool_test.py @@ -247,6 +247,12 @@ class DBConnectionPool(DBTester): self.pool.clear() self.assertEqual(len(self.pool.free_items), 0) + def test_clear_warmup(self): + """Clear implicitly created connections (min_size > 0)""" + self.pool = self.create_pool(min_size=1) + self.pool.clear() + self.assertEqual(len(self.pool.free_items), 0) + def test_unwrap_connection(self): self.assert_(isinstance(self.connection, db_pool.GenericConnectionWrapper)) @@ -438,12 +444,12 @@ class RaisingDBModule(object): class TpoolConnectionPool(DBConnectionPool): __test__ = False # so that nose doesn't try to execute this directly - def create_pool(self, max_size=1, max_idle=10, max_age=10, + def create_pool(self, min_size=0, max_size=1, max_idle=10, max_age=10, connect_timeout=0.5, module=None): if module is None: module = self._dbmodule return db_pool.TpooledConnectionPool(module, - min_size=0, max_size=max_size, + min_size=min_size, max_size=max_size, max_idle=max_idle, max_age=max_age, connect_timeout = connect_timeout, **self._auth) @@ -462,12 +468,12 @@ class TpoolConnectionPool(DBConnectionPool): class RawConnectionPool(DBConnectionPool): __test__ = False # so that nose doesn't try to execute this directly - def create_pool(self, max_size=1, max_idle=10, max_age=10, + def create_pool(self, min_size=0, max_size=1, max_idle=10, max_age=10, connect_timeout=0.5, module=None): if module is None: module = self._dbmodule return db_pool.RawConnectionPool(module, - min_size=0, max_size=max_size, + min_size=min_size, max_size=max_size, max_idle=max_idle, max_age=max_age, connect_timeout=connect_timeout, **self._auth)