summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--keystone/common/sql/core.py11
-rw-r--r--tests/test_sql_core.py8
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)