summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMike Bayer <mike_mp@zzzcomputing.com>2015-11-11 16:26:40 -0500
committerMike Bayer <mike_mp@zzzcomputing.com>2015-11-11 16:33:48 -0500
commit52d576437abaa55f5fd3d721280656c5f0800d80 (patch)
treeb40f4fc44ad6e6ad5021323a7fd65fe8781ae007
parent7cc914fc1d7cb63439361b8323bafb3ba8fcd61c (diff)
downloadoslo-db-52d576437abaa55f5fd3d721280656c5f0800d80.tar.gz
Detect not-started _TransactionFactory in legacy3.2.0
When LegacyEngineFacade is passed a _TransactionFactory that is not started, or one that fails to start, the _start() method should be called again each time the factory is called upon; this ensures that the failed start either can be made to succeed, or at least re-raises the same error as earlier, instead of falling into attribute access for non-existent attributes. Change-Id: I7484f837d455c1f69c448e5ccadc277d19af47e7 Closes-Bug: #1515326
-rw-r--r--oslo_db/sqlalchemy/enginefacade.py7
-rw-r--r--oslo_db/tests/sqlalchemy/test_enginefacade.py25
2 files changed, 32 insertions, 0 deletions
diff --git a/oslo_db/sqlalchemy/enginefacade.py b/oslo_db/sqlalchemy/enginefacade.py
index 111f033..7f64acc 100644
--- a/oslo_db/sqlalchemy/enginefacade.py
+++ b/oslo_db/sqlalchemy/enginefacade.py
@@ -952,6 +952,10 @@ class LegacyEngineFacade(object):
_conf, connection=sql_connection,
slave_connection=slave_connection)
+ def _check_factory_started(self):
+ if not self._factory._started:
+ self._factory._start()
+
def get_engine(self, use_slave=False):
"""Get the engine instance (note, that it's shared).
@@ -962,6 +966,7 @@ class LegacyEngineFacade(object):
:type use_slave: bool
"""
+ self._check_factory_started()
if use_slave:
return self._factory._reader_engine
else:
@@ -982,6 +987,7 @@ class LegacyEngineFacade(object):
was created). See SQLAlchemy Session docs for details.
"""
+ self._check_factory_started()
if use_slave:
return self._factory._reader_maker(**kwargs)
else:
@@ -994,6 +1000,7 @@ class LegacyEngineFacade(object):
be temporarily injected with some state such as a specific connection.
"""
+ self._check_factory_started()
if use_slave:
return self._factory._reader_maker
else:
diff --git a/oslo_db/tests/sqlalchemy/test_enginefacade.py b/oslo_db/tests/sqlalchemy/test_enginefacade.py
index 62e3fa9..9226c05 100644
--- a/oslo_db/tests/sqlalchemy/test_enginefacade.py
+++ b/oslo_db/tests/sqlalchemy/test_enginefacade.py
@@ -997,6 +997,31 @@ class LegacyIntegrationtest(test_base.DbTestCase):
self.assertNotEqual(legacy1, legacy2)
+ def test_legacy_not_started(self):
+
+ factory = enginefacade._TransactionFactory()
+
+ self.assertRaises(
+ exception.CantStartEngineError,
+ factory.get_legacy_facade
+ )
+
+ legacy_facade = factory.get_legacy_facade()
+ self.assertRaises(
+ exception.CantStartEngineError,
+ legacy_facade.get_session
+ )
+
+ self.assertRaises(
+ exception.CantStartEngineError,
+ legacy_facade.get_session
+ )
+
+ self.assertRaises(
+ exception.CantStartEngineError,
+ legacy_facade.get_engine
+ )
+
class ThreadingTest(test_base.DbTestCase):
"""Test copy/pickle on new threads using real connections and sessions."""