From: Mike Bayer Date: Fri, 22 Jun 2012 16:42:01 +0000 (-0400) Subject: - [bug] Fixed bug whereby if a database restart X-Git-Tag: rel_0_8_0b1~360 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=e597d3d14527eb163c6fd78e5e135525fc14c3c8;p=thirdparty%2Fsqlalchemy%2Fsqlalchemy.git - [bug] Fixed bug whereby if a database restart affected multiple connections, each connection would individually invoke a new disposal of the pool, even though only one disposal is needed. [ticket:2522] --- diff --git a/CHANGES b/CHANGES index 9721775f7b..bed5bd1fa7 100644 --- a/CHANGES +++ b/CHANGES @@ -157,6 +157,12 @@ underneath "0.7.xx". the new pool. This fix may or may not be ported to 0.7. [ticket:2522] + - [bug] Fixed bug whereby if a database restart + affected multiple connections, each + connection would individually invoke a new + disposal of the pool, even though only + one disposal is needed. [ticket:2522] + - [feature] Added a new system for registration of new dialects in-process without using an entrypoint. See the diff --git a/lib/sqlalchemy/engine/base.py b/lib/sqlalchemy/engine/base.py index 75f6ac29a6..2972752232 100644 --- a/lib/sqlalchemy/engine/base.py +++ b/lib/sqlalchemy/engine/base.py @@ -1833,8 +1833,11 @@ class Connection(Connectable): if is_disconnect: + dbapi_conn_wrapper = self.connection self.invalidate(e) - self.engine.dispose() + if not hasattr(dbapi_conn_wrapper, '_pool') or \ + dbapi_conn_wrapper._pool is self.engine.pool: + self.engine.dispose() else: if cursor: self._safe_close_cursor(cursor) diff --git a/test/engine/test_reconnect.py b/test/engine/test_reconnect.py index b545aca523..da9e542925 100644 --- a/test/engine/test_reconnect.py +++ b/test/engine/test_reconnect.py @@ -264,6 +264,33 @@ class RealReconnectTest(fixtures.TestBase): conn.close() + def test_multiple_invalidate(self): + c1 = engine.connect() + c2 = engine.connect() + + eq_(c1.execute(select([1])).scalar(), 1) + + p1 = engine.pool + engine.test_shutdown() + + try: + c1.execute(select([1])) + assert False + except tsa.exc.DBAPIError, e: + assert e.connection_invalidated + + p2 = engine.pool + + try: + c2.execute(select([1])) + assert False + except tsa.exc.DBAPIError, e: + assert e.connection_invalidated + + # pool isn't replaced + assert engine.pool is p2 + + def test_ensure_is_disconnect_gets_connection(self): def is_disconnect(e, conn, cursor): # connection is still present