diff options
-rw-r--r-- | keystone/common/sql/core.py | 11 | ||||
-rw-r--r-- | tests/test_sql_core.py | 8 |
2 files changed, 16 insertions, 3 deletions
diff --git a/keystone/common/sql/core.py b/keystone/common/sql/core.py index 7978fcc5..2d3114f2 100644 --- a/keystone/common/sql/core.py +++ b/keystone/common/sql/core.py @@ -243,9 +243,10 @@ class Base(object): def get_session(self, autocommit=True, expire_on_commit=False): """Return a SQLAlchemy session.""" - self._engine = self._engine or self.get_engine() - self._sessionmaker = self._sessionmaker or self.get_sessionmaker( - self._engine) + if not self._engine: + self._engine = self.get_engine() + self._sessionmaker = self.get_sessionmaker(self._engine) + register_global_engine_callback(self.clear_engine) return self._sessionmaker(autocommit=autocommit, expire_on_commit=expire_on_commit) @@ -300,6 +301,10 @@ class Base(object): autocommit=autocommit, expire_on_commit=expire_on_commit) + def clear_engine(self): + self._engine = None + self._sessionmaker = None + def handle_conflicts(type='object'): """Converts IntegrityError into HTTP 409 Conflict.""" diff --git a/tests/test_sql_core.py b/tests/test_sql_core.py index bb413485..e60005f5 100644 --- a/tests/test_sql_core.py +++ b/tests/test_sql_core.py @@ -172,3 +172,11 @@ class TestBase(test.TestCase): self.assertFalse(session.autocommit) self.assertTrue(session.expire_on_commit) + + def test_get_session_invalidated(self): + # If clear the global engine, a new engine is used for get_session(). + base = sql.Base() + session1 = base.get_session() + sql.set_global_engine(None) + session2 = base.get_session() + self.assertIsNot(session1.bind, session2.bind) |