diff options
author | Angus Lees <gus@inodes.org> | 2014-07-15 13:53:45 +1000 |
---|---|---|
committer | Angus Lees <gus@inodes.org> | 2014-07-22 11:33:48 +1000 |
commit | 1814bf80cd9ce332370833ec4dc8b2feed6120a1 (patch) | |
tree | f354104ade51c9b8867f47cbcfe0a9c0f8fdbb7b | |
parent | bf4eff9ffd577c519846c98251942a3d998311e5 (diff) | |
download | oslo-db-1814bf80cd9ce332370833ec4dc8b2feed6120a1.tar.gz |
Make MySQL regexes generic across MySQL drivers
Note that mysqlconnector raises InternalError whereas mysqldb raises
OperationalError when a deadlock is found. The reported error codes and
messages are identical, however.
Change-Id: Iac9167e0777e0bf4361bcf6a8722923cce052b90
-rw-r--r-- | oslo/db/sqlalchemy/exc_filters.py | 11 | ||||
-rw-r--r-- | tests/sqlalchemy/test_exc_filters.py | 13 |
2 files changed, 20 insertions, 4 deletions
diff --git a/oslo/db/sqlalchemy/exc_filters.py b/oslo/db/sqlalchemy/exc_filters.py index 3ec19cc..e971d5c 100644 --- a/oslo/db/sqlalchemy/exc_filters.py +++ b/oslo/db/sqlalchemy/exc_filters.py @@ -57,7 +57,8 @@ def filters(dbname, exception_type, regex): # psycopg2.extensions.TransactionRollbackError(OperationalError), # as well as sqlalchemy.exc.DBAPIError, as SQLAlchemy will reraise it # as this until issue #3075 is fixed. -@filters("mysql", sqla_exc.OperationalError, r"^.*\(1213, 'Deadlock.*") +@filters("mysql", sqla_exc.OperationalError, r"^.*\b1213\b.*Deadlock found.*") +@filters("mysql", sqla_exc.InternalError, r"^.*\b1213\b.*Deadlock found.*") @filters("postgresql", sqla_exc.OperationalError, r"^.*deadlock detected.*") @filters("postgresql", sqla_exc.DBAPIError, r"^.*deadlock detected.*") @filters("ibm_db_sa", sqla_exc.DBAPIError, r"^.*SQL0911N.*") @@ -67,10 +68,14 @@ def _deadlock_error(operational_error, match, engine_name, is_disconnect): NOTE(comstud): In current versions of DB backends, Deadlock violation messages follow the structure: - mysql: + mysql+mysqldb: (OperationalError) (1213, 'Deadlock found when trying to get lock; try ' 'restarting transaction') <query_str> <query_args> + mysql+mysqlconnector: + (InternalError) 1213 (40001): Deadlock found when trying to get lock; try + restarting transaction + postgresql: (TransactionRollbackError) deadlock detected <deadlock_details> @@ -174,7 +179,7 @@ def _db2_dupe_key_error(integrity_error, match, engine_name, is_disconnect): raise exception.DBDuplicateEntry([], integrity_error) -@filters("mysql", sqla_exc.DBAPIError, r".*\(1146") +@filters("mysql", sqla_exc.DBAPIError, r".*\b1146\b") def _raise_mysql_table_doesnt_exist_asis( error, match, engine_name, is_disconnect): """Raise MySQL error 1146 as is, so that it does not conflict with diff --git a/tests/sqlalchemy/test_exc_filters.py b/tests/sqlalchemy/test_exc_filters.py index 649716c..7c3b250 100644 --- a/tests/sqlalchemy/test_exc_filters.py +++ b/tests/sqlalchemy/test_exc_filters.py @@ -41,6 +41,9 @@ class TestsExceptionFilter(test_base.DbTestCase): class InterfaceError(Error): pass + class InternalError(Error): + pass + class IntegrityError(Error): pass @@ -287,7 +290,7 @@ class TestDeadlock(TestsExceptionFilter): str(matched) ) - def test_mysql_deadlock(self): + def test_mysql_mysqldb_deadlock(self): self._run_deadlock_detect_test( "mysql", "(1213, 'Deadlock found when trying " @@ -295,6 +298,14 @@ class TestDeadlock(TestsExceptionFilter): "transaction')" ) + def test_mysql_mysqlconnector_deadlock(self): + self._run_deadlock_detect_test( + "mysql", + "1213 (40001): Deadlock found when trying to get lock; try " + "restarting transaction", + orig_exception_cls=self.InternalError + ) + def test_mysql_not_deadlock(self): self._not_deadlock_test( "mysql", |