From: Mike Bayer Date: Wed, 26 Mar 2014 20:52:04 +0000 (-0400) Subject: try to liberalize the pool._refs assertion a bit X-Git-Tag: rel_0_9_4~21 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=99d07abe1704c67f76e67afc225dcf0b90fa768b;p=thirdparty%2Fsqlalchemy%2Fsqlalchemy.git try to liberalize the pool._refs assertion a bit --- diff --git a/lib/sqlalchemy/testing/assertions.py b/lib/sqlalchemy/testing/assertions.py index a0b5ed0c9f..0a65a1b7c2 100644 --- a/lib/sqlalchemy/testing/assertions.py +++ b/lib/sqlalchemy/testing/assertions.py @@ -128,7 +128,6 @@ def expect_deprecated(*messages): resetwarnings() - def global_cleanup_assertions(): """Check things that have to be finalized at the end of a test suite. @@ -137,9 +136,42 @@ def global_cleanup_assertions(): dropped, etc. """ + _assert_no_stray_pool_connections() + +_STRAY_CONNECTION_FAILURES = 0 +def _assert_no_stray_pool_connections(): + global _STRAY_CONNECTION_FAILURES + # lazy gc on cPython means "do nothing." pool connections + # shouldn't be in cycles, should go away. testutil.lazy_gc() - assert not pool._refs, str(pool._refs) + + # however, once in awhile, on an EC2 machine usually, + # there's a ref in there. usually just one. + if pool._refs: + # OK, let's be somewhat forgiving. Increment a counter, + # we'll allow a couple of these at most. + _STRAY_CONNECTION_FAILURES += 1 + + util.warn("Encountered a stray connection in test cleanup: %s" + % str(pool._refs)) + # then do a real GC sweep. We shouldn't even be here + # so a single sweep should really be doing it, otherwise + # there's probably a real unreachable cycle somewhere. + testutil.gc_collect() + + # if we've already had two of these occurrences, or + # after a hard gc sweep we still have pool._refs?! + # now we have to raise. + if _STRAY_CONNECTION_FAILURES >= 2 or pool._refs: + err = str(pool._refs) + + # but clean out the pool refs collection directly, + # reset the counter, + # so the error doesn't at least keep happening. + pool._refs.clear() + _STRAY_CONNECTION_FAILURES = 0 + assert False, err def eq_(a, b, msg=None):