discarded overflow connections not explicitly closed

Issue #2102 resolved
Mike Bayer repo owner created an issue
diff -r 39c465ecf3f45bbebb37c5d5ed7e1a0fccf5641c lib/sqlalchemy/pool.py
--- a/lib/sqlalchemy/pool.py    Mon Mar 21 11:49:43 2011 -0400
+++ b/lib/sqlalchemy/pool.py    Tue Mar 22 23:22:10 2011 -0400
@@ -655,6 +655,7 @@
         try:
             self._pool.put(conn, False)
         except sqla_queue.Full:
+            conn.close()
             if self._overflow_lock is None:
                 self._overflow -= 1
             else:
diff -r 39c465ecf3f45bbebb37c5d5ed7e1a0fccf5641c test/engine/test_pool.py
--- a/test/engine/test_pool.py  Mon Mar 21 11:49:43 2011 -0400
+++ b/test/engine/test_pool.py  Tue Mar 22 23:22:10 2011 -0400
@@ -804,6 +804,24 @@
         lazy_gc()
         assert not pool._refs

+    def test_overflow_no_gc(self):
+        p = self._queuepool_fixture(pool_size=2,
+                           max_overflow=2)
+
+        strong_refs = set()
+        def _conn():
+            c = p.connect()
+            strong_refs.add(c.connection)
+            return c
+
+        for j in xrange(5):
+            conns = [for i in xrange(4)](_conn())
+            for c in conns:
+                c.close()
+
+        still_opened = len([for c in strong_refs if not c.closed](c))
+        eq_(still_opened, 2)
+
     def test_weakref_kaboom(self):
         p = self._queuepool_fixture(pool_size=3,
                            max_overflow=-1, use_threadlocal=True)

Comments (2)

  1. Log in to comment