During concurent allocation/deallocation/update multiple ips in ipam_pluggable_backend deadlock can be raised [1]. It causes rollback actions to be performed in [2], but because of raising deadlock exception database is not in operatable state unless full transaction restart. So it cause rollback action to fail and raise another exception 'InternalError'.
As a result original exception DeadLock was replaced with InternalError and db_retry wrapper does not restart transaction in this case.
Resulting exception as seen in logs[3]:
2016-04-13 12:15:04.685 18292 ERROR oslo_db.sqlalchemy.exc_filters [req-15281429-cfa8-4b9f-a904-0105fc947933 admin -] DBAPIError exception wrapped from (pymysql.err.InternalError) (1305, u'SAVEPOINT sa_savepoint_3 does not exist') [SQL: u'ROLLBACK TO SAVEPOINT sa_savepoint_3']
2016-04-13 12:15:04.685 18292 ERROR oslo_db.sqlalchemy.exc_filters Traceback (most recent call last):
2016-04-13 12:15:04.685 18292 ERROR oslo_db.sqlalchemy.exc_filters File "/usr/local/lib/python2.7/dist-packages/sqlalchemy/engine/base.py", line 1139, in _execute_context
2016-04-13 12:15:04.685 18292 ERROR oslo_db.sqlalchemy.exc_filters context)
2016-04-13 12:15:04.685 18292 ERROR oslo_db.sqlalchemy.exc_filters File "/usr/local/lib/python2.7/dist-packages/sqlalchemy/engine/default.py", line 450, in do_execute
2016-04-13 12:15:04.685 18292 ERROR oslo_db.sqlalchemy.exc_filters cursor.execute(statement, parameters)
2016-04-13 12:15:04.685 18292 ERROR oslo_db.sqlalchemy.exc_filters File "/usr/local/lib/python2.7/dist-packages/pymysql/cursors.py", line 158, in execute
2016-04-13 12:15:04.685 18292 ERROR oslo_db.sqlalchemy.exc_filters result = self._query(query)
2016-04-13 12:15:04.685 18292 ERROR oslo_db.sqlalchemy.exc_filters File "/usr/local/lib/python2.7/dist-packages/pymysql/cursors.py", line 308, in _query
2016-04-13 12:15:04.685 18292 ERROR oslo_db.sqlalchemy.exc_filters conn.query(q)
2016-04-13 12:15:04.685 18292 ERROR oslo_db.sqlalchemy.exc_filters File "/usr/local/lib/python2.7/dist-packages/pymysql/connections.py", line 820, in query
2016-04-13 12:15:04.685 18292 ERROR oslo_db.sqlalchemy.exc_filters self._affected_rows = self._read_query_result(unbuffered=unbuffered)
2016-04-13 12:15:04.685 18292 ERROR oslo_db.sqlalchemy.exc_filters File "/usr/local/lib/python2.7/dist-packages/pymysql/connections.py", line 1002, in _read_query_result
2016-04-13 12:15:04.685 18292 ERROR oslo_db.sqlalchemy.exc_filters result.read()
2016-04-13 12:15:04.685 18292 ERROR oslo_db.sqlalchemy.exc_filters File "/usr/local/lib/python2.7/dist-packages/pymysql/connections.py", line 1285, in read
2016-04-13 12:15:04.685 18292 ERROR oslo_db.sqlalchemy.exc_filters first_packet = self.connection._read_packet()
2016-04-13 12:15:04.685 18292 ERROR oslo_db.sqlalchemy.exc_filters File "/usr/local/lib/python2.7/dist-packages/pymysql/connections.py", line 966, in _read_packet
2016-04-13 12:15:04.685 18292 ERROR oslo_db.sqlalchemy.exc_filters packet.check_error()
2016-04-13 12:15:04.685 18292 ERROR oslo_db.sqlalchemy.exc_filters File "/usr/local/lib/python2.7/dist-packages/pymysql/connections.py", line 394, in check_error
2016-04-13 12:15:04.685 18292 ERROR oslo_db.sqlalchemy.exc_filters err.raise_mysql_exception(self._data)
2016-04-13 12:15:04.685 18292 ERROR oslo_db.sqlalchemy.exc_filters File "/usr/local/lib/python2.7/dist-packages/pymysql/err.py", line 120, in raise_mysql_exception
2016-04-13 12:15:04.685 18292 ERROR oslo_db.sqlalchemy.exc_filters _check_mysql_exception(errinfo)
2016-04-13 12:15:04.685 18292 ERROR oslo_db.sqlalchemy.exc_filters File "/usr/local/lib/python2.7/dist-packages/pymysql/err.py", line 115, in _check_mysql_exception
2016-04-13 12:15:04.685 18292 ERROR oslo_db.sqlalchemy.exc_filters raise InternalError(errno, errorvalue)
2016-04-13 12:15:04.685 18292 ERROR oslo_db.sqlalchemy.exc_filters InternalError: (1305, u'SAVEPOINT sa_savepoint_3 does not exist')
2016-04-13 12:15:04.685 18292 ERROR oslo_db.sqlalchemy.exc_filters
2016-04-13 12:15:04.687 18294 DEBUG oslo_messaging._drivers.amqpdriver [req-56495b4e-29c9-4360-8609-f5b3ded6ed8f - -] sending reply msg_id: ee2f4dd536fb48e79bee32a668e3cc1d reply queue: reply_d2a1789c66c141888838b059e322350c time elapsed: 0.006736069s _send_reply /usr/local/lib/python2.7/dist-packages/oslo_messaging/_drivers/amqpdriver.py:74
/usr/local/lib/python2.7/dist-packages/sqlalchemy/util/langhelpers.py:68: SAWarning: An exception has occurred during handling of a previous exception. The previous exception is:
<class 'oslo_db.exception.DBDeadlock'> (pymysql.err.InternalError) (1213, u'Deadlock found when trying to get lock; try restarting transaction') [SQL: u'INSERT INTO ipamallocations (ip_address, status, ipam_subnet_id) VALUES (%(ip_address)s, %(status)s, %(ipam_subnet_id)s)'] [parameters: {'status': 'ALLOCATED', 'ip_address': u'2001:db8::4e', 'ipam_subnet_id': u'1c084441-cec0-4865-848a-a75f01711e36'}]
"is:\n %s %s\n" % (self._exc_info[0], self._exc_info[1]))
2016-04-13 12:15:04.688 18292 ERROR oslo_db.sqlalchemy.exc_filters [req-15281429-cfa8-4b9f-a904-0105fc947933 admin -] DBAPIError exception wrapped from (pymysql.err.InternalError) (1305, u'SAVEPOINT sa_savepoint_3 does not exist') [SQL: u'ROLLBACK TO SAVEPOINT sa_savepoint_3']
2016-04-13 12:15:04.688 18292 ERROR oslo_db.sqlalchemy.exc_filters Traceback (most recent call last):
2016-04-13 12:15:04.688 18292 ERROR oslo_db.sqlalchemy.exc_filters File "/usr/local/lib/python2.7/dist-packages/sqlalchemy/engine/base.py", line 1139, in _execute_context
2016-04-13 12:15:04.688 18292 ERROR oslo_db.sqlalchemy.exc_filters context)
2016-04-13 12:15:04.688 18292 ERROR oslo_db.sqlalchemy.exc_filters File "/usr/local/lib/python2.7/dist-packages/sqlalchemy/engine/default.py", line 450, in do_execute
2016-04-13 12:15:04.688 18292 ERROR oslo_db.sqlalchemy.exc_filters cursor.execute(statement, parameters)
2016-04-13 12:15:04.688 18292 ERROR oslo_db.sqlalchemy.exc_filters File "/usr/local/lib/python2.7/dist-packages/pymysql/cursors.py", line 158, in execute
2016-04-13 12:15:04.688 18292 ERROR oslo_db.sqlalchemy.exc_filters result = self._query(query)
2016-04-13 12:15:04.688 18292 ERROR oslo_db.sqlalchemy.exc_filters File "/usr/local/lib/python2.7/dist-packages/pymysql/cursors.py", line 308, in _query
2016-04-13 12:15:04.688 18292 ERROR oslo_db.sqlalchemy.exc_filters conn.query(q)
2016-04-13 12:15:04.688 18292 ERROR oslo_db.sqlalchemy.exc_filters File "/usr/local/lib/python2.7/dist-packages/pymysql/connections.py", line 820, in query
2016-04-13 12:15:04.688 18292 ERROR oslo_db.sqlalchemy.exc_filters self._affected_rows = self._read_query_result(unbuffered=unbuffered)
2016-04-13 12:15:04.688 18292 ERROR oslo_db.sqlalchemy.exc_filters File "/usr/local/lib/python2.7/dist-packages/pymysql/connections.py", line 1002, in _read_query_result
2016-04-13 12:15:04.688 18292 ERROR oslo_db.sqlalchemy.exc_filters result.read()
2016-04-13 12:15:04.688 18292 ERROR oslo_db.sqlalchemy.exc_filters File "/usr/local/lib/python2.7/dist-packages/pymysql/connections.py", line 1285, in read
2016-04-13 12:15:04.688 18292 ERROR oslo_db.sqlalchemy.exc_filters first_packet = self.connection._read_packet()
2016-04-13 12:15:04.688 18292 ERROR oslo_db.sqlalchemy.exc_filters File "/usr/local/lib/python2.7/dist-packages/pymysql/connections.py", line 966, in _read_packet
2016-04-13 12:15:04.688 18292 ERROR oslo_db.sqlalchemy.exc_filters packet.check_error()
2016-04-13 12:15:04.688 18292 ERROR oslo_db.sqlalchemy.exc_filters File "/usr/local/lib/python2.7/dist-packages/pymysql/connections.py", line 394, in check_error
2016-04-13 12:15:04.688 18292 ERROR oslo_db.sqlalchemy.exc_filters err.raise_mysql_exception(self._data)
2016-04-13 12:15:04.688 18292 ERROR oslo_db.sqlalchemy.exc_filters File "/usr/local/lib/python2.7/dist-packages/pymysql/err.py", line 120, in raise_mysql_exception
2016-04-13 12:15:04.688 18292 ERROR oslo_db.sqlalchemy.exc_filters _check_mysql_exception(errinfo)
2016-04-13 12:15:04.688 18292 ERROR oslo_db.sqlalchemy.exc_filters File "/usr/local/lib/python2.7/dist-packages/pymysql/err.py", line 115, in _check_mysql_exception
2016-04-13 12:15:04.688 18292 ERROR oslo_db.sqlalchemy.exc_filters raise InternalError(errno, errorvalue)
2016-04-13 12:15:04.688 18292 ERROR oslo_db.sqlalchemy.exc_filters InternalError: (1305, u'SAVEPOINT sa_savepoint_3 does not exist')
2016-04-13 12:15:04.688 18292 ERROR oslo_db.sqlalchemy.exc_filters
[1] https://github.com/openstack/neutron/blob/2a305c563073a3066aac3f07aab3c895ec2cd2fb/neutron/db/ipam_pluggable_backend.py#L59
[2] https://github.com/openstack/neutron/blob/2a305c563073a3066aac3f07aab3c895ec2cd2fb/neutron/db/ipam_pluggable_backend.py#L69
[3] http://logs.openstack.org/23/181023/64/check/gate-tempest-dsvm-neutron-dvr/f503538/logs/screen-q-svc.txt.gz#_2016-04-13_12_15_04_685
Looks like my initial analysis in not fully correct. So now it looks like this error is observed due to using nested transaction in allocate block of reference ipam driver [1]:
Resulting error: sqlalchemy. exc_filters [req-15281429- cfa8-4b9f- a904-0105fc9479 33 admin -] DBAPIError exception wrapped from (pymysql. err.InternalErr or) (1305, u'SAVEPOINT sa_savepoint_3 does not exist') [SQL: u'ROLLBACK TO SAVEPOINT sa_savepoint_3']
2016-04-13 12:15:04.685 18292 ERROR oslo_db.
Original error: exception. DBDeadlock' > (pymysql. err.InternalErr or) (1213, u'Deadlock found when trying to get lock; try restarting transaction') [SQL: u'INSERT INTO ipamallocations (ip_address, status, ipam_subnet_id) VALUES (%(ip_address)s, %(status)s, %(ipam_ subnet_ id)s)'] [parameters: {'status': 'ALLOCATED', 'ip_address': u'2001:db8::4e', 'ipam_subnet_id': u'1c084441- cec0-4865- 848a-a75f01711e 36'}]
<class 'oslo_db.
When DBDeadlock is raised inside nested transaction block, nested transaction wrapper tries to rollback to safepoint where nested transaction was initiated. But looks like in DBDeadlock case this is not possible.
[1] https:/ /github. com/openstack/ neutron/ blob/2dc9d67f6e 0fbec8272dc1dfd b594d05378536d5 /neutron/ ipam/drivers/ neutrondb_ ipam/driver. py#L338