]> git.ipfire.org Git - thirdparty/sqlalchemy/sqlalchemy.git/commitdiff
- try to work around a race that can occur in STP when
authorMike Bayer <mike_mp@zzzcomputing.com>
Thu, 27 Apr 2017 19:26:35 +0000 (15:26 -0400)
committerMike Bayer <mike_mp@zzzcomputing.com>
Thu, 27 Apr 2017 19:26:35 +0000 (15:26 -0400)
used in this intentionally broken scenario

Change-Id: I88ea6fa710da2189e6d47e2d12f5f0fd6f6bb7d4

test/engine/test_pool.py

index 1fbaf59654cc9cc1c06aeb33ef6808014fb422ea..ffbb5f2822c54bc77fbcb47fb2759226af3bb943 100644 (file)
@@ -2016,12 +2016,21 @@ class SingletonThreadPoolTest(PoolTestBase):
                 return dbapi.connect()
         p = pool.SingletonThreadPool(creator=creator, pool_size=3)
 
+        # there's an obvious race in STP which is that one thread
+        # creates a connection, another one calls cleanup and closes
+        # it before it ever gets returned.  This is of course if you're
+        # using more threads than the pool can connect to.
+
         if strong_refs:
             sr = set()
 
             def _conn():
                 c = p.connect()
-                sr.add(c.connection)
+                if not c.connection.close.call_count:
+                    sr.add(c.connection)
+                # otherwise the connection is already closed, which
+                # is because you're using 10 threads but only a pool
+                # of size 3 :).
                 return c
         else:
             def _conn():
@@ -2042,7 +2051,7 @@ class SingletonThreadPoolTest(PoolTestBase):
             threads.append(th)
         for th in threads:
             th.join(join_timeout)
-        assert len(p._all_conns) == 3
+        eq_(len(p._all_conns), 3)
 
         if strong_refs:
             still_opened = len([c for c in sr if not c.close.call_count])