Public bug reported: Under some conditions, Neutron tries to create a record in the Database a few times and fails with an unexpected exception that should be handled by existing code.
Neutron mode: ovs+dvr How to reproduce: 1. Tenant network connected to distributed router 2. VM with tenant network created or migrated to an empty hypervisor When VM is placed to empty node L3-agent notifies neutron-server to bind router distributed port to node and we get ERROR traceback in neutron-server log: ``` ERROR oslo_messaging.rpc.server [parameters: {'port_id': 'f269cf3d-8a00-4b5b-99c2-63cae0968f42', 'host': 'gm-os-hv-017', 'router_id': 'e3fb6ba3-7cd5-40d4-bb24-4544e1319ea3', 'vif_type': 'unbound', 'vif_details': '', 'vnic_type': 'normal', 'profile': '', 'status': 'DOWN'}] ERROR oslo_messaging.rpc.server [SQL: INSERT INTO ml2_distributed_port_bindings (port_id, host, router_id, vif_type, vif_details, vnic_type, profile, status) VALUES (%(port_id)s, %(host)s, %(router_id)s, %(vif_type)s, %(vif_details)s, %(vnic_type)s, %(profile)s, %(status)s)] ERROR oslo_messaging.rpc.server sqlalchemy.exc.PendingRollbackError: This Session's transaction has been rolled back due to a previous exception during flush. To begin a new transaction with this Session, first issue Session.rollback(). Original exception was: (pymysql.err.IntegrityError) (1062, "Duplicate entry 'f269cf3d-8a00-4b5b-99c2-63cae0968f42-gm-os-hv-017' for key 'PRIMARY'") ERROR oslo_messaging.rpc.server raise sa_exc.PendingRollbackError( ERROR oslo_messaging.rpc.server File "/usr/lib64/python3.9/site-packages/sqlalchemy/orm/session.py", line 601, in _assert_active ERROR oslo_messaging.rpc.server self._assert_active() ERROR oslo_messaging.rpc.server File "/usr/lib64/python3.9/site-packages/sqlalchemy/orm/session.py", line 721, in _connection_for_bind ERROR oslo_messaging.rpc.server return self._transaction._connection_for_bind( ERROR oslo_messaging.rpc.server File "/usr/lib64/python3.9/site-packages/sqlalchemy/orm/session.py", line 1552, in _connection_for_bind ERROR oslo_messaging.rpc.server conn = self._connection_for_bind(bind, close_with_result=True) ERROR oslo_messaging.rpc.server File "/usr/lib64/python3.9/site-packages/sqlalchemy/orm/session.py", line 1708, in execute ERROR oslo_messaging.rpc.server result = self.session.execute( ERROR oslo_messaging.rpc.server File "/usr/lib64/python3.9/site-packages/sqlalchemy/orm/query.py", line 2916, in _iter ERROR oslo_messaging.rpc.server return self._iter().one() ERROR oslo_messaging.rpc.server File "/usr/lib64/python3.9/site-packages/sqlalchemy/orm/query.py", line 2870, in one ERROR oslo_messaging.rpc.server return (context.session.query(models.DistributedPortBinding). ERROR oslo_messaging.rpc.server File "/usr/lib/python3.9/site-packages/neutron/plugins/ml2/db.py", line 114, in ensure_distributed_port_binding ERROR oslo_messaging.rpc.server binding = db.ensure_distributed_port_binding( ERROR oslo_messaging.rpc.server File "/usr/lib/python3.9/site-packages/neutron/plugins/ml2/plugin.py", line 2010, in update_distributed_port_binding ERROR oslo_messaging.rpc.server return f(*dup_args, **dup_kwargs) ERROR oslo_messaging.rpc.server File "/usr/lib/python3.9/site-packages/neutron_lib/db/api.py", line 179, in wrapped ERROR oslo_messaging.rpc.server raise self.value ERROR oslo_messaging.rpc.server File "/usr/lib/python3.9/site-packages/oslo_utils/excutils.py", line 200, in force_reraise ERROR oslo_messaging.rpc.server self.force_reraise() ERROR oslo_messaging.rpc.server File "/usr/lib/python3.9/site-packages/oslo_utils/excutils.py", line 227, in __exit__ ERROR oslo_messaging.rpc.server LOG.debug("Retry wrapper got retriable exception: %s", e) ERROR oslo_messaging.rpc.server File "/usr/lib/python3.9/site-packages/neutron_lib/db/api.py", line 183, in wrapped ERROR oslo_messaging.rpc.server return f(*args, **kwargs) ERROR oslo_messaging.rpc.server File "/usr/lib/python3.9/site-packages/oslo_db/api.py", line 142, in wrapper ERROR oslo_messaging.rpc.server raise self.value ERROR oslo_messaging.rpc.server File "/usr/lib/python3.9/site-packages/oslo_utils/excutils.py", line 200, in force_reraise ERROR oslo_messaging.rpc.server self.force_reraise() ERROR oslo_messaging.rpc.server File "/usr/lib/python3.9/site-packages/oslo_utils/excutils.py", line 227, in __exit__ ERROR oslo_messaging.rpc.server ectxt.value = e.inner_exc ERROR oslo_messaging.rpc.server File "/usr/lib/python3.9/site-packages/oslo_db/api.py", line 154, in wrapper ERROR oslo_messaging.rpc.server return f(*args, **kwargs) ERROR oslo_messaging.rpc.server File "/usr/lib/python3.9/site-packages/neutron_lib/db/api.py", line 135, in wrapped ERROR oslo_messaging.rpc.server raise self.value ERROR oslo_messaging.rpc.server File "/usr/lib/python3.9/site-packages/oslo_utils/excutils.py", line 200, in force_reraise ERROR oslo_messaging.rpc.server self.force_reraise() ERROR oslo_messaging.rpc.server File "/usr/lib/python3.9/site-packages/oslo_utils/excutils.py", line 227, in __exit__ ERROR oslo_messaging.rpc.server setattr(e, '_RETRY_EXCEEDED', True) ERROR oslo_messaging.rpc.server File "/usr/lib/python3.9/site-packages/neutron_lib/db/api.py", line 139, in wrapped ERROR oslo_messaging.rpc.server return method(*args, **kwargs) ERROR oslo_messaging.rpc.server File "/usr/lib/python3.9/site-packages/neutron_lib/db/api.py", line 218, in wrapped ERROR oslo_messaging.rpc.server return f(*args, **kwargs) ERROR oslo_messaging.rpc.server File "/usr/lib/python3.9/site-packages/neutron/common/utils.py", line 701, in inner ERROR oslo_messaging.rpc.server self.plugin.update_distributed_port_binding( ERROR oslo_messaging.rpc.server File "/usr/lib/python3.9/site-packages/neutron/api/rpc/handlers/l3_rpc.py", line 253, in _ensure_host_set_on_port ERROR oslo_messaging.rpc.server self._ensure_host_set_on_port( ERROR oslo_messaging.rpc.server File "/usr/lib/python3.9/site-packages/neutron/api/rpc/handlers/l3_rpc.py", line 178, in _ensure_host_set_on_ports ERROR oslo_messaging.rpc.server self._ensure_host_set_on_ports(context, host, routers) ERROR oslo_messaging.rpc.server File "/usr/lib/python3.9/site-packages/neutron/api/rpc/handlers/l3_rpc.py", line 131, in sync_routers ERROR oslo_messaging.rpc.server return f(*dup_args, **dup_kwargs) ERROR oslo_messaging.rpc.server File "/usr/lib/python3.9/site-packages/neutron_lib/db/api.py", line 179, in wrapped ERROR oslo_messaging.rpc.server raise self.value ERROR oslo_messaging.rpc.server File "/usr/lib/python3.9/site-packages/oslo_utils/excutils.py", line 200, in force_reraise ERROR oslo_messaging.rpc.server self.force_reraise() ERROR oslo_messaging.rpc.server File "/usr/lib/python3.9/site-packages/oslo_utils/excutils.py", line 227, in __exit__ ERROR oslo_messaging.rpc.server LOG.debug("Retry wrapper got retriable exception: %s", e) ERROR oslo_messaging.rpc.server File "/usr/lib/python3.9/site-packages/neutron_lib/db/api.py", line 183, in wrapped ERROR oslo_messaging.rpc.server return f(*args, **kwargs) ERROR oslo_messaging.rpc.server File "/usr/lib/python3.9/site-packages/oslo_db/api.py", line 142, in wrapper ERROR oslo_messaging.rpc.server raise self.value ERROR oslo_messaging.rpc.server File "/usr/lib/python3.9/site-packages/oslo_utils/excutils.py", line 200, in force_reraise ERROR oslo_messaging.rpc.server self.force_reraise() ERROR oslo_messaging.rpc.server File "/usr/lib/python3.9/site-packages/oslo_utils/excutils.py", line 227, in __exit__ ERROR oslo_messaging.rpc.server ectxt.value = e.inner_exc ERROR oslo_messaging.rpc.server File "/usr/lib/python3.9/site-packages/oslo_db/api.py", line 154, in wrapper ERROR oslo_messaging.rpc.server return f(*args, **kwargs) ERROR oslo_messaging.rpc.server File "/usr/lib/python3.9/site-packages/neutron_lib/db/api.py", line 135, in wrapped ERROR oslo_messaging.rpc.server raise self.value ERROR oslo_messaging.rpc.server File "/usr/lib/python3.9/site-packages/oslo_utils/excutils.py", line 200, in force_reraise ERROR oslo_messaging.rpc.server self.force_reraise() ERROR oslo_messaging.rpc.server File "/usr/lib/python3.9/site-packages/oslo_utils/excutils.py", line 227, in __exit__ ERROR oslo_messaging.rpc.server setattr(e, '_RETRY_EXCEEDED', True) ERROR oslo_messaging.rpc.server File "/usr/lib/python3.9/site-packages/neutron_lib/db/api.py", line 139, in wrapped ERROR oslo_messaging.rpc.server result = func(ctxt, **new_args) ERROR oslo_messaging.rpc.server File "/usr/lib/python3.9/site-packages/oslo_messaging/rpc/dispatcher.py", line 229, in _do_dispatch ERROR oslo_messaging.rpc.server return self._do_dispatch(endpoint, method, ctxt, args) ERROR oslo_messaging.rpc.server File "/usr/lib/python3.9/site-packages/oslo_messaging/rpc/dispatcher.py", line 309, in dispatch ERROR oslo_messaging.rpc.server res = self.dispatcher.dispatch(message) ERROR oslo_messaging.rpc.server File "/usr/lib/python3.9/site-packages/oslo_messaging/rpc/server.py", line 165, in _process_incoming ERROR oslo_messaging.rpc.server Traceback (most recent call last): ERROR oslo_messaging.rpc.server ERROR oslo_messaging.rpc.server During handling of the above exception, another exception occurred: ERROR oslo_messaging.rpc.server ERROR oslo_messaging.rpc.server (Background on this error at: https://sqlalche.me/e/14/gkpj) ERROR oslo_messaging.rpc.server [parameters: {'port_id': 'f269cf3d-8a00-4b5b-99c2-63cae0968f42', 'host': 'gm-os-hv-017', 'router_id': 'e3fb6ba3-7cd5-40d4-bb24-4544e1319ea3', 'vif_type': 'unbound', 'vif_details': '', 'vnic_type': 'normal', 'profile': '', 'status': 'DOWN'}] ERROR oslo_messaging.rpc.server [SQL: INSERT INTO ml2_distributed_port_bindings (port_id, host, router_id, vif_type, vif_details, vnic_type, profile, status) VALUES (%(port_id)s, %(host)s, %(router_id)s, %(vif_type)s, %(vif_details)s, %(vnic_type)s, %(profile)s, %(status)s)] ERROR oslo_messaging.rpc.server oslo_db.exception.DBDuplicateEntry: (pymysql.err.IntegrityError) (1062, "Duplicate entry 'f269cf3d-8a00-4b5b-99c2-63cae0968f42-gm-os-hv-017' for key 'PRIMARY'") ERROR oslo_messaging.rpc.server raise errorclass(errno, errval) ERROR oslo_messaging.rpc.server File "/usr/lib/python3.9/site-packages/pymysql/err.py", line 107, in raise_mysql_exception ERROR oslo_messaging.rpc.server err.raise_mysql_exception(self._data) ERROR oslo_messaging.rpc.server File "/usr/lib/python3.9/site-packages/pymysql/protocol.py", line 223, in raise_for_error ERROR oslo_messaging.rpc.server packet.raise_for_error() ERROR oslo_messaging.rpc.server File "/usr/lib/python3.9/site-packages/pymysql/connections.py", line 676, in _read_packet ERROR oslo_messaging.rpc.server first_packet = self.connection._read_packet() ERROR oslo_messaging.rpc.server File "/usr/lib/python3.9/site-packages/pymysql/connections.py", line 1069, in read ERROR oslo_messaging.rpc.server result.read() ERROR oslo_messaging.rpc.server File "/usr/lib/python3.9/site-packages/pymysql/connections.py", line 724, in _read_query_result ERROR oslo_messaging.rpc.server self._affected_rows = self._read_query_result(unbuffered=unbuffered) ERROR oslo_messaging.rpc.server File "/usr/lib/python3.9/site-packages/pymysql/connections.py", line 505, in query ERROR oslo_messaging.rpc.server conn.query(q) ERROR oslo_messaging.rpc.server File "/usr/lib/python3.9/site-packages/pymysql/cursors.py", line 321, in _query ERROR oslo_messaging.rpc.server result = self._query(query) ERROR oslo_messaging.rpc.server File "/usr/lib/python3.9/site-packages/pymysql/cursors.py", line 163, in execute ERROR oslo_messaging.rpc.server cursor.execute(statement, parameters) ERROR oslo_messaging.rpc.server File "/usr/lib64/python3.9/site-packages/sqlalchemy/engine/default.py", line 736, in do_execute ERROR oslo_messaging.rpc.server self.dialect.do_execute( ERROR oslo_messaging.rpc.server File "/usr/lib64/python3.9/site-packages/sqlalchemy/engine/base.py", line 1900, in _execute_context ERROR oslo_messaging.rpc.server raise exception ERROR oslo_messaging.rpc.server File "/usr/lib64/python3.9/site-packages/sqlalchemy/util/compat.py", line 211, in raise_ ERROR oslo_messaging.rpc.server util.raise_(newraise, with_traceback=exc_info[2], from_=e) ERROR oslo_messaging.rpc.server File "/usr/lib64/python3.9/site-packages/sqlalchemy/engine/base.py", line 2122, in _handle_dbapi_exception ERROR oslo_messaging.rpc.server self._handle_dbapi_exception( ERROR oslo_messaging.rpc.server File "/usr/lib64/python3.9/site-packages/sqlalchemy/engine/base.py", line 1943, in _execute_context ERROR oslo_messaging.rpc.server ret = self._execute_context( ERROR oslo_messaging.rpc.server File "/usr/lib64/python3.9/site-packages/sqlalchemy/engine/base.py", line 1572, in _execute_clauseelement ERROR oslo_messaging.rpc.server return connection._execute_clauseelement( ERROR oslo_messaging.rpc.server File "/usr/lib64/python3.9/site-packages/sqlalchemy/sql/elements.py", line 334, in _execute_on_connection ERROR oslo_messaging.rpc.server return meth(self, args_10style, kwargs_10style, execution_options) ERROR oslo_messaging.rpc.server File "/usr/lib64/python3.9/site-packages/sqlalchemy/engine/base.py", line 1705, in _execute_20 ERROR oslo_messaging.rpc.server c = connection._execute_20( ERROR oslo_messaging.rpc.server File "/usr/lib64/python3.9/site-packages/sqlalchemy/orm/persistence.py", line 1097, in _emit_insert_statements ERROR oslo_messaging.rpc.server _emit_insert_statements( ERROR oslo_messaging.rpc.server File "/usr/lib64/python3.9/site-packages/sqlalchemy/orm/persistence.py", line 245, in save_obj ERROR oslo_messaging.rpc.server util.preloaded.orm_persistence.save_obj( ERROR oslo_messaging.rpc.server File "/usr/lib64/python3.9/site-packages/sqlalchemy/orm/unitofwork.py", line 630, in execute ERROR oslo_messaging.rpc.server rec.execute(self) ERROR oslo_messaging.rpc.server File "/usr/lib64/python3.9/site-packages/sqlalchemy/orm/unitofwork.py", line 456, in execute ERROR oslo_messaging.rpc.server flush_context.execute() ERROR oslo_messaging.rpc.server File "/usr/lib64/python3.9/site-packages/sqlalchemy/orm/session.py", line 3544, in _flush ERROR oslo_messaging.rpc.server raise exception ERROR oslo_messaging.rpc.server File "/usr/lib64/python3.9/site-packages/sqlalchemy/util/compat.py", line 211, in raise_ ERROR oslo_messaging.rpc.server compat.raise_( ERROR oslo_messaging.rpc.server File "/usr/lib64/python3.9/site-packages/sqlalchemy/util/langhelpers.py", line 70, in __exit__ ERROR oslo_messaging.rpc.server transaction.rollback(_capture_exception=True) ERROR oslo_messaging.rpc.server File "/usr/lib64/python3.9/site-packages/sqlalchemy/orm/session.py", line 3584, in _flush ERROR oslo_messaging.rpc.server self._flush(objects) ERROR oslo_messaging.rpc.server File "/usr/lib64/python3.9/site-packages/sqlalchemy/orm/session.py", line 3444, in flush ERROR oslo_messaging.rpc.server self.session.flush() ERROR oslo_messaging.rpc.server File "/usr/lib/python3.9/site-packages/oslo_db/sqlalchemy/enginefacade.py", line 676, in _session ERROR oslo_messaging.rpc.server next(self.gen) ERROR oslo_messaging.rpc.server File "/usr/lib64/python3.9/contextlib.py", line 126, in __exit__ ERROR oslo_messaging.rpc.server yield resource ERROR oslo_messaging.rpc.server File "/usr/lib/python3.9/site-packages/oslo_db/sqlalchemy/enginefacade.py", line 1060, in _transaction_scope ERROR oslo_messaging.rpc.server next(self.gen) ERROR oslo_messaging.rpc.server File "/usr/lib64/python3.9/contextlib.py", line 126, in __exit__ ERROR oslo_messaging.rpc.server return record ERROR oslo_messaging.rpc.server File "/usr/lib/python3.9/site-packages/neutron/plugins/ml2/db.py", line 110, in ensure_distributed_port_binding ERROR oslo_messaging.rpc.server Traceback (most recent call last): ERROR oslo_messaging.rpc.server ERROR oslo_messaging.rpc.server The above exception was the direct cause of the following exception: ERROR oslo_messaging.rpc.server ERROR oslo_messaging.rpc.server pymysql.err.IntegrityError: (1062, "Duplicate entry 'f269cf3d-8a00-4b5b-99c2-63cae0968f42-gm-os-hv-017' for key 'PRIMARY'") ERROR oslo_messaging.rpc.server raise errorclass(errno, errval) ERROR oslo_messaging.rpc.server File "/usr/lib/python3.9/site-packages/pymysql/err.py", line 107, in raise_mysql_exception ERROR oslo_messaging.rpc.server err.raise_mysql_exception(self._data) ERROR oslo_messaging.rpc.server File "/usr/lib/python3.9/site-packages/pymysql/protocol.py", line 223, in raise_for_error ERROR oslo_messaging.rpc.server packet.raise_for_error() ERROR oslo_messaging.rpc.server File "/usr/lib/python3.9/site-packages/pymysql/connections.py", line 676, in _read_packet ERROR oslo_messaging.rpc.server first_packet = self.connection._read_packet() ERROR oslo_messaging.rpc.server File "/usr/lib/python3.9/site-packages/pymysql/connections.py", line 1069, in read ERROR oslo_messaging.rpc.server result.read() ERROR oslo_messaging.rpc.server File "/usr/lib/python3.9/site-packages/pymysql/connections.py", line 724, in _read_query_result ERROR oslo_messaging.rpc.server self._affected_rows = self._read_query_result(unbuffered=unbuffered) ERROR oslo_messaging.rpc.server File "/usr/lib/python3.9/site-packages/pymysql/connections.py", line 505, in query ERROR oslo_messaging.rpc.server conn.query(q) ERROR oslo_messaging.rpc.server File "/usr/lib/python3.9/site-packages/pymysql/cursors.py", line 321, in _query ERROR oslo_messaging.rpc.server result = self._query(query) ERROR oslo_messaging.rpc.server File "/usr/lib/python3.9/site-packages/pymysql/cursors.py", line 163, in execute ERROR oslo_messaging.rpc.server cursor.execute(statement, parameters) ERROR oslo_messaging.rpc.server File "/usr/lib64/python3.9/site-packages/sqlalchemy/engine/default.py", line 736, in do_execute ERROR oslo_messaging.rpc.server self.dialect.do_execute( ERROR oslo_messaging.rpc.server File "/usr/lib64/python3.9/site-packages/sqlalchemy/engine/base.py", line 1900, in _execute_context ERROR oslo_messaging.rpc.server Traceback (most recent call last): ERROR oslo_messaging.rpc.server [req-1112fb3c-05bc-4754-b4d9-e0813bba902c - - - - -] Exception during message handling: sqlalchemy.exc.PendingRollbackError: This Session's transaction has been rolled back due to a previous exception during flush. To begin a new transaction with this Session, first issue Session.rollback(). Original exception was: (pymysql.err.IntegrityError) (1062, "Duplicate entry 'f269cf3d-8a00-4b5b-99c2-63cae0968f42-gm-os-hv-017' for key 'PRIMARY'") ``` As you can see neutron-server should handle exception for `DuplicateEntry` and return existing record: https://github.com/openstack/neutron/blob/20.3.1/neutron/plugins/ml2/db.py#L111 But this code is not doing it and failed with: ``` sqlalchemy.exc.PendingRollbackError: This Session's transaction has been rolled back due to a previous exception during flush. To begin a new transaction with this Session, first issue Session.rollback(). Original exception was: (pymysql.err.IntegrityError) (1062, "Duplicate entry ..." ``` It seems that this part of the code is not covered by tests and not work correctly. It is reproduced on our side only in one production system and we can not reproduce it on our lab env. Environment =========== AlmaLinux 9.5 ``` openstack-neutron-20.3.1-1.el9s python-oslo-db-11.2.0-1.el9s python-oslo-messaging-12.13.3-1.el9s python-sqlalchemy-1.4.45-3.el9 ``` ** Affects: neutron Importance: Undecided Status: New ** Description changed: Under some conditions, Neutron tries to create a record in the Database a few times and fails with an unexpected exception that should be handled by existing code. Neutron mode: ovs+dvr How to reproduce: 1. Tenant network connected to distributed router 2. VM with tenant network created or migrated to an empty hypervisor When VM is placed to empty node L3-agent notifies neutron-server to bind router distributed port to node and we get ERROR traceback in neutron-server log: ``` ERROR oslo_messaging.rpc.server [parameters: {'port_id': 'f269cf3d-8a00-4b5b-99c2-63cae0968f42', 'host': 'gm-os-hv-017', 'router_id': 'e3fb6ba3-7cd5-40d4-bb24-4544e1319ea3', 'vif_type': 'unbound', 'vif_details': '', 'vnic_type': 'normal', 'profile': '', 'status': 'DOWN'}] ERROR oslo_messaging.rpc.server [SQL: INSERT INTO ml2_distributed_port_bindings (port_id, host, router_id, vif_type, vif_details, vnic_type, profile, status) VALUES (%(port_id)s, %(host)s, %(router_id)s, %(vif_type)s, %(vif_details)s, %(vnic_type)s, %(profile)s, %(status)s)] ERROR oslo_messaging.rpc.server sqlalchemy.exc.PendingRollbackError: This Session's transaction has been rolled back due to a previous exception during flush. To begin a new transaction with this Session, first issue Session.rollback(). Original exception was: (pymysql.err.IntegrityError) (1062, "Duplicate entry 'f269cf3d-8a00-4b5b-99c2-63cae0968f42-gm-os-hv-017' for key 'PRIMARY'") ERROR oslo_messaging.rpc.server raise sa_exc.PendingRollbackError( ERROR oslo_messaging.rpc.server File "/usr/lib64/python3.9/site-packages/sqlalchemy/orm/session.py", line 601, in _assert_active ERROR oslo_messaging.rpc.server self._assert_active() ERROR oslo_messaging.rpc.server File "/usr/lib64/python3.9/site-packages/sqlalchemy/orm/session.py", line 721, in _connection_for_bind ERROR oslo_messaging.rpc.server return self._transaction._connection_for_bind( ERROR oslo_messaging.rpc.server File "/usr/lib64/python3.9/site-packages/sqlalchemy/orm/session.py", line 1552, in _connection_for_bind ERROR oslo_messaging.rpc.server conn = self._connection_for_bind(bind, close_with_result=True) ERROR oslo_messaging.rpc.server File "/usr/lib64/python3.9/site-packages/sqlalchemy/orm/session.py", line 1708, in execute ERROR oslo_messaging.rpc.server result = self.session.execute( ERROR oslo_messaging.rpc.server File "/usr/lib64/python3.9/site-packages/sqlalchemy/orm/query.py", line 2916, in _iter ERROR oslo_messaging.rpc.server return self._iter().one() ERROR oslo_messaging.rpc.server File "/usr/lib64/python3.9/site-packages/sqlalchemy/orm/query.py", line 2870, in one ERROR oslo_messaging.rpc.server return (context.session.query(models.DistributedPortBinding). ERROR oslo_messaging.rpc.server File "/usr/lib/python3.9/site-packages/neutron/plugins/ml2/db.py", line 114, in ensure_distributed_port_binding ERROR oslo_messaging.rpc.server binding = db.ensure_distributed_port_binding( ERROR oslo_messaging.rpc.server File "/usr/lib/python3.9/site-packages/neutron/plugins/ml2/plugin.py", line 2010, in update_distributed_port_binding ERROR oslo_messaging.rpc.server return f(*dup_args, **dup_kwargs) ERROR oslo_messaging.rpc.server File "/usr/lib/python3.9/site-packages/neutron_lib/db/api.py", line 179, in wrapped ERROR oslo_messaging.rpc.server raise self.value ERROR oslo_messaging.rpc.server File "/usr/lib/python3.9/site-packages/oslo_utils/excutils.py", line 200, in force_reraise ERROR oslo_messaging.rpc.server self.force_reraise() ERROR oslo_messaging.rpc.server File "/usr/lib/python3.9/site-packages/oslo_utils/excutils.py", line 227, in __exit__ ERROR oslo_messaging.rpc.server LOG.debug("Retry wrapper got retriable exception: %s", e) ERROR oslo_messaging.rpc.server File "/usr/lib/python3.9/site-packages/neutron_lib/db/api.py", line 183, in wrapped ERROR oslo_messaging.rpc.server return f(*args, **kwargs) ERROR oslo_messaging.rpc.server File "/usr/lib/python3.9/site-packages/oslo_db/api.py", line 142, in wrapper ERROR oslo_messaging.rpc.server raise self.value ERROR oslo_messaging.rpc.server File "/usr/lib/python3.9/site-packages/oslo_utils/excutils.py", line 200, in force_reraise ERROR oslo_messaging.rpc.server self.force_reraise() ERROR oslo_messaging.rpc.server File "/usr/lib/python3.9/site-packages/oslo_utils/excutils.py", line 227, in __exit__ ERROR oslo_messaging.rpc.server ectxt.value = e.inner_exc ERROR oslo_messaging.rpc.server File "/usr/lib/python3.9/site-packages/oslo_db/api.py", line 154, in wrapper ERROR oslo_messaging.rpc.server return f(*args, **kwargs) ERROR oslo_messaging.rpc.server File "/usr/lib/python3.9/site-packages/neutron_lib/db/api.py", line 135, in wrapped ERROR oslo_messaging.rpc.server raise self.value ERROR oslo_messaging.rpc.server File "/usr/lib/python3.9/site-packages/oslo_utils/excutils.py", line 200, in force_reraise ERROR oslo_messaging.rpc.server self.force_reraise() ERROR oslo_messaging.rpc.server File "/usr/lib/python3.9/site-packages/oslo_utils/excutils.py", line 227, in __exit__ ERROR oslo_messaging.rpc.server setattr(e, '_RETRY_EXCEEDED', True) ERROR oslo_messaging.rpc.server File "/usr/lib/python3.9/site-packages/neutron_lib/db/api.py", line 139, in wrapped ERROR oslo_messaging.rpc.server return method(*args, **kwargs) ERROR oslo_messaging.rpc.server File "/usr/lib/python3.9/site-packages/neutron_lib/db/api.py", line 218, in wrapped ERROR oslo_messaging.rpc.server return f(*args, **kwargs) ERROR oslo_messaging.rpc.server File "/usr/lib/python3.9/site-packages/neutron/common/utils.py", line 701, in inner ERROR oslo_messaging.rpc.server self.plugin.update_distributed_port_binding( ERROR oslo_messaging.rpc.server File "/usr/lib/python3.9/site-packages/neutron/api/rpc/handlers/l3_rpc.py", line 253, in _ensure_host_set_on_port ERROR oslo_messaging.rpc.server self._ensure_host_set_on_port( ERROR oslo_messaging.rpc.server File "/usr/lib/python3.9/site-packages/neutron/api/rpc/handlers/l3_rpc.py", line 178, in _ensure_host_set_on_ports ERROR oslo_messaging.rpc.server self._ensure_host_set_on_ports(context, host, routers) ERROR oslo_messaging.rpc.server File "/usr/lib/python3.9/site-packages/neutron/api/rpc/handlers/l3_rpc.py", line 131, in sync_routers ERROR oslo_messaging.rpc.server return f(*dup_args, **dup_kwargs) ERROR oslo_messaging.rpc.server File "/usr/lib/python3.9/site-packages/neutron_lib/db/api.py", line 179, in wrapped ERROR oslo_messaging.rpc.server raise self.value ERROR oslo_messaging.rpc.server File "/usr/lib/python3.9/site-packages/oslo_utils/excutils.py", line 200, in force_reraise ERROR oslo_messaging.rpc.server self.force_reraise() ERROR oslo_messaging.rpc.server File "/usr/lib/python3.9/site-packages/oslo_utils/excutils.py", line 227, in __exit__ ERROR oslo_messaging.rpc.server LOG.debug("Retry wrapper got retriable exception: %s", e) ERROR oslo_messaging.rpc.server File "/usr/lib/python3.9/site-packages/neutron_lib/db/api.py", line 183, in wrapped ERROR oslo_messaging.rpc.server return f(*args, **kwargs) ERROR oslo_messaging.rpc.server File "/usr/lib/python3.9/site-packages/oslo_db/api.py", line 142, in wrapper ERROR oslo_messaging.rpc.server raise self.value ERROR oslo_messaging.rpc.server File "/usr/lib/python3.9/site-packages/oslo_utils/excutils.py", line 200, in force_reraise ERROR oslo_messaging.rpc.server self.force_reraise() ERROR oslo_messaging.rpc.server File "/usr/lib/python3.9/site-packages/oslo_utils/excutils.py", line 227, in __exit__ ERROR oslo_messaging.rpc.server ectxt.value = e.inner_exc ERROR oslo_messaging.rpc.server File "/usr/lib/python3.9/site-packages/oslo_db/api.py", line 154, in wrapper ERROR oslo_messaging.rpc.server return f(*args, **kwargs) ERROR oslo_messaging.rpc.server File "/usr/lib/python3.9/site-packages/neutron_lib/db/api.py", line 135, in wrapped ERROR oslo_messaging.rpc.server raise self.value ERROR oslo_messaging.rpc.server File "/usr/lib/python3.9/site-packages/oslo_utils/excutils.py", line 200, in force_reraise ERROR oslo_messaging.rpc.server self.force_reraise() ERROR oslo_messaging.rpc.server File "/usr/lib/python3.9/site-packages/oslo_utils/excutils.py", line 227, in __exit__ ERROR oslo_messaging.rpc.server setattr(e, '_RETRY_EXCEEDED', True) ERROR oslo_messaging.rpc.server File "/usr/lib/python3.9/site-packages/neutron_lib/db/api.py", line 139, in wrapped ERROR oslo_messaging.rpc.server result = func(ctxt, **new_args) ERROR oslo_messaging.rpc.server File "/usr/lib/python3.9/site-packages/oslo_messaging/rpc/dispatcher.py", line 229, in _do_dispatch ERROR oslo_messaging.rpc.server return self._do_dispatch(endpoint, method, ctxt, args) ERROR oslo_messaging.rpc.server File "/usr/lib/python3.9/site-packages/oslo_messaging/rpc/dispatcher.py", line 309, in dispatch ERROR oslo_messaging.rpc.server res = self.dispatcher.dispatch(message) ERROR oslo_messaging.rpc.server File "/usr/lib/python3.9/site-packages/oslo_messaging/rpc/server.py", line 165, in _process_incoming ERROR oslo_messaging.rpc.server Traceback (most recent call last): ERROR oslo_messaging.rpc.server ERROR oslo_messaging.rpc.server During handling of the above exception, another exception occurred: ERROR oslo_messaging.rpc.server ERROR oslo_messaging.rpc.server (Background on this error at: https://sqlalche.me/e/14/gkpj) ERROR oslo_messaging.rpc.server [parameters: {'port_id': 'f269cf3d-8a00-4b5b-99c2-63cae0968f42', 'host': 'gm-os-hv-017', 'router_id': 'e3fb6ba3-7cd5-40d4-bb24-4544e1319ea3', 'vif_type': 'unbound', 'vif_details': '', 'vnic_type': 'normal', 'profile': '', 'status': 'DOWN'}] ERROR oslo_messaging.rpc.server [SQL: INSERT INTO ml2_distributed_port_bindings (port_id, host, router_id, vif_type, vif_details, vnic_type, profile, status) VALUES (%(port_id)s, %(host)s, %(router_id)s, %(vif_type)s, %(vif_details)s, %(vnic_type)s, %(profile)s, %(status)s)] ERROR oslo_messaging.rpc.server oslo_db.exception.DBDuplicateEntry: (pymysql.err.IntegrityError) (1062, "Duplicate entry 'f269cf3d-8a00-4b5b-99c2-63cae0968f42-gm-os-hv-017' for key 'PRIMARY'") ERROR oslo_messaging.rpc.server raise errorclass(errno, errval) ERROR oslo_messaging.rpc.server File "/usr/lib/python3.9/site-packages/pymysql/err.py", line 107, in raise_mysql_exception ERROR oslo_messaging.rpc.server err.raise_mysql_exception(self._data) ERROR oslo_messaging.rpc.server File "/usr/lib/python3.9/site-packages/pymysql/protocol.py", line 223, in raise_for_error ERROR oslo_messaging.rpc.server packet.raise_for_error() ERROR oslo_messaging.rpc.server File "/usr/lib/python3.9/site-packages/pymysql/connections.py", line 676, in _read_packet ERROR oslo_messaging.rpc.server first_packet = self.connection._read_packet() ERROR oslo_messaging.rpc.server File "/usr/lib/python3.9/site-packages/pymysql/connections.py", line 1069, in read ERROR oslo_messaging.rpc.server result.read() ERROR oslo_messaging.rpc.server File "/usr/lib/python3.9/site-packages/pymysql/connections.py", line 724, in _read_query_result ERROR oslo_messaging.rpc.server self._affected_rows = self._read_query_result(unbuffered=unbuffered) ERROR oslo_messaging.rpc.server File "/usr/lib/python3.9/site-packages/pymysql/connections.py", line 505, in query ERROR oslo_messaging.rpc.server conn.query(q) ERROR oslo_messaging.rpc.server File "/usr/lib/python3.9/site-packages/pymysql/cursors.py", line 321, in _query ERROR oslo_messaging.rpc.server result = self._query(query) ERROR oslo_messaging.rpc.server File "/usr/lib/python3.9/site-packages/pymysql/cursors.py", line 163, in execute ERROR oslo_messaging.rpc.server cursor.execute(statement, parameters) ERROR oslo_messaging.rpc.server File "/usr/lib64/python3.9/site-packages/sqlalchemy/engine/default.py", line 736, in do_execute ERROR oslo_messaging.rpc.server self.dialect.do_execute( ERROR oslo_messaging.rpc.server File "/usr/lib64/python3.9/site-packages/sqlalchemy/engine/base.py", line 1900, in _execute_context ERROR oslo_messaging.rpc.server raise exception ERROR oslo_messaging.rpc.server File "/usr/lib64/python3.9/site-packages/sqlalchemy/util/compat.py", line 211, in raise_ ERROR oslo_messaging.rpc.server util.raise_(newraise, with_traceback=exc_info[2], from_=e) ERROR oslo_messaging.rpc.server File "/usr/lib64/python3.9/site-packages/sqlalchemy/engine/base.py", line 2122, in _handle_dbapi_exception ERROR oslo_messaging.rpc.server self._handle_dbapi_exception( ERROR oslo_messaging.rpc.server File "/usr/lib64/python3.9/site-packages/sqlalchemy/engine/base.py", line 1943, in _execute_context ERROR oslo_messaging.rpc.server ret = self._execute_context( ERROR oslo_messaging.rpc.server File "/usr/lib64/python3.9/site-packages/sqlalchemy/engine/base.py", line 1572, in _execute_clauseelement ERROR oslo_messaging.rpc.server return connection._execute_clauseelement( ERROR oslo_messaging.rpc.server File "/usr/lib64/python3.9/site-packages/sqlalchemy/sql/elements.py", line 334, in _execute_on_connection ERROR oslo_messaging.rpc.server return meth(self, args_10style, kwargs_10style, execution_options) ERROR oslo_messaging.rpc.server File "/usr/lib64/python3.9/site-packages/sqlalchemy/engine/base.py", line 1705, in _execute_20 ERROR oslo_messaging.rpc.server c = connection._execute_20( ERROR oslo_messaging.rpc.server File "/usr/lib64/python3.9/site-packages/sqlalchemy/orm/persistence.py", line 1097, in _emit_insert_statements ERROR oslo_messaging.rpc.server _emit_insert_statements( ERROR oslo_messaging.rpc.server File "/usr/lib64/python3.9/site-packages/sqlalchemy/orm/persistence.py", line 245, in save_obj ERROR oslo_messaging.rpc.server util.preloaded.orm_persistence.save_obj( ERROR oslo_messaging.rpc.server File "/usr/lib64/python3.9/site-packages/sqlalchemy/orm/unitofwork.py", line 630, in execute ERROR oslo_messaging.rpc.server rec.execute(self) ERROR oslo_messaging.rpc.server File "/usr/lib64/python3.9/site-packages/sqlalchemy/orm/unitofwork.py", line 456, in execute ERROR oslo_messaging.rpc.server flush_context.execute() ERROR oslo_messaging.rpc.server File "/usr/lib64/python3.9/site-packages/sqlalchemy/orm/session.py", line 3544, in _flush ERROR oslo_messaging.rpc.server raise exception ERROR oslo_messaging.rpc.server File "/usr/lib64/python3.9/site-packages/sqlalchemy/util/compat.py", line 211, in raise_ ERROR oslo_messaging.rpc.server compat.raise_( ERROR oslo_messaging.rpc.server File "/usr/lib64/python3.9/site-packages/sqlalchemy/util/langhelpers.py", line 70, in __exit__ ERROR oslo_messaging.rpc.server transaction.rollback(_capture_exception=True) ERROR oslo_messaging.rpc.server File "/usr/lib64/python3.9/site-packages/sqlalchemy/orm/session.py", line 3584, in _flush ERROR oslo_messaging.rpc.server self._flush(objects) ERROR oslo_messaging.rpc.server File "/usr/lib64/python3.9/site-packages/sqlalchemy/orm/session.py", line 3444, in flush ERROR oslo_messaging.rpc.server self.session.flush() ERROR oslo_messaging.rpc.server File "/usr/lib/python3.9/site-packages/oslo_db/sqlalchemy/enginefacade.py", line 676, in _session ERROR oslo_messaging.rpc.server next(self.gen) ERROR oslo_messaging.rpc.server File "/usr/lib64/python3.9/contextlib.py", line 126, in __exit__ ERROR oslo_messaging.rpc.server yield resource ERROR oslo_messaging.rpc.server File "/usr/lib/python3.9/site-packages/oslo_db/sqlalchemy/enginefacade.py", line 1060, in _transaction_scope ERROR oslo_messaging.rpc.server next(self.gen) ERROR oslo_messaging.rpc.server File "/usr/lib64/python3.9/contextlib.py", line 126, in __exit__ ERROR oslo_messaging.rpc.server return record ERROR oslo_messaging.rpc.server File "/usr/lib/python3.9/site-packages/neutron/plugins/ml2/db.py", line 110, in ensure_distributed_port_binding ERROR oslo_messaging.rpc.server Traceback (most recent call last): ERROR oslo_messaging.rpc.server ERROR oslo_messaging.rpc.server The above exception was the direct cause of the following exception: ERROR oslo_messaging.rpc.server ERROR oslo_messaging.rpc.server pymysql.err.IntegrityError: (1062, "Duplicate entry 'f269cf3d-8a00-4b5b-99c2-63cae0968f42-gm-os-hv-017' for key 'PRIMARY'") ERROR oslo_messaging.rpc.server raise errorclass(errno, errval) ERROR oslo_messaging.rpc.server File "/usr/lib/python3.9/site-packages/pymysql/err.py", line 107, in raise_mysql_exception ERROR oslo_messaging.rpc.server err.raise_mysql_exception(self._data) ERROR oslo_messaging.rpc.server File "/usr/lib/python3.9/site-packages/pymysql/protocol.py", line 223, in raise_for_error ERROR oslo_messaging.rpc.server packet.raise_for_error() ERROR oslo_messaging.rpc.server File "/usr/lib/python3.9/site-packages/pymysql/connections.py", line 676, in _read_packet ERROR oslo_messaging.rpc.server first_packet = self.connection._read_packet() ERROR oslo_messaging.rpc.server File "/usr/lib/python3.9/site-packages/pymysql/connections.py", line 1069, in read ERROR oslo_messaging.rpc.server result.read() ERROR oslo_messaging.rpc.server File "/usr/lib/python3.9/site-packages/pymysql/connections.py", line 724, in _read_query_result ERROR oslo_messaging.rpc.server self._affected_rows = self._read_query_result(unbuffered=unbuffered) ERROR oslo_messaging.rpc.server File "/usr/lib/python3.9/site-packages/pymysql/connections.py", line 505, in query ERROR oslo_messaging.rpc.server conn.query(q) ERROR oslo_messaging.rpc.server File "/usr/lib/python3.9/site-packages/pymysql/cursors.py", line 321, in _query ERROR oslo_messaging.rpc.server result = self._query(query) ERROR oslo_messaging.rpc.server File "/usr/lib/python3.9/site-packages/pymysql/cursors.py", line 163, in execute ERROR oslo_messaging.rpc.server cursor.execute(statement, parameters) ERROR oslo_messaging.rpc.server File "/usr/lib64/python3.9/site-packages/sqlalchemy/engine/default.py", line 736, in do_execute ERROR oslo_messaging.rpc.server self.dialect.do_execute( ERROR oslo_messaging.rpc.server File "/usr/lib64/python3.9/site-packages/sqlalchemy/engine/base.py", line 1900, in _execute_context ERROR oslo_messaging.rpc.server Traceback (most recent call last): ERROR oslo_messaging.rpc.server [req-1112fb3c-05bc-4754-b4d9-e0813bba902c - - - - -] Exception during message handling: sqlalchemy.exc.PendingRollbackError: This Session's transaction has been rolled back due to a previous exception during flush. To begin a new transaction with this Session, first issue Session.rollback(). Original exception was: (pymysql.err.IntegrityError) (1062, "Duplicate entry 'f269cf3d-8a00-4b5b-99c2-63cae0968f42-gm-os-hv-017' for key 'PRIMARY'") ``` As you can see neutron-server should handle exception for `DuplicateEntry` and return existing record: https://github.com/openstack/neutron/blob/20.3.1/neutron/plugins/ml2/db.py#L111 But this code is not doing it and failed with: ``` sqlalchemy.exc.PendingRollbackError: This Session's transaction has been rolled back due to a previous exception during flush. To begin a new transaction with this Session, first issue Session.rollback(). Original exception was: (pymysql.err.IntegrityError) (1062, "Duplicate entry ..." ``` It seems that this part of the code is not covered by tests and not work correctly. It is reproduced on our side only in one production system and we can not reproduce it on our lab env. - versions: + Environment + =========== + AlmaLinux 9.5 ``` openstack-neutron-20.3.1-1.el9s python-oslo-db-11.2.0-1.el9s python-oslo-messaging-12.13.3-1.el9s python-sqlalchemy-1.4.45-3.el9 ``` -- You received this bug notification because you are a member of Yahoo! Engineering Team, which is subscribed to neutron. https://bugs.launchpad.net/bugs/2106374 Title: neutron-server error with ml2_distributed_port_bindings Status in neutron: New Bug description: Under some conditions, Neutron tries to create a record in the Database a few times and fails with an unexpected exception that should be handled by existing code. Neutron mode: ovs+dvr How to reproduce: 1. Tenant network connected to distributed router 2. VM with tenant network created or migrated to an empty hypervisor When VM is placed to empty node L3-agent notifies neutron-server to bind router distributed port to node and we get ERROR traceback in neutron-server log: ``` ERROR oslo_messaging.rpc.server [parameters: {'port_id': 'f269cf3d-8a00-4b5b-99c2-63cae0968f42', 'host': 'gm-os-hv-017', 'router_id': 'e3fb6ba3-7cd5-40d4-bb24-4544e1319ea3', 'vif_type': 'unbound', 'vif_details': '', 'vnic_type': 'normal', 'profile': '', 'status': 'DOWN'}] ERROR oslo_messaging.rpc.server [SQL: INSERT INTO ml2_distributed_port_bindings (port_id, host, router_id, vif_type, vif_details, vnic_type, profile, status) VALUES (%(port_id)s, %(host)s, %(router_id)s, %(vif_type)s, %(vif_details)s, %(vnic_type)s, %(profile)s, %(status)s)] ERROR oslo_messaging.rpc.server sqlalchemy.exc.PendingRollbackError: This Session's transaction has been rolled back due to a previous exception during flush. To begin a new transaction with this Session, first issue Session.rollback(). Original exception was: (pymysql.err.IntegrityError) (1062, "Duplicate entry 'f269cf3d-8a00-4b5b-99c2-63cae0968f42-gm-os-hv-017' for key 'PRIMARY'") ERROR oslo_messaging.rpc.server raise sa_exc.PendingRollbackError( ERROR oslo_messaging.rpc.server File "/usr/lib64/python3.9/site-packages/sqlalchemy/orm/session.py", line 601, in _assert_active ERROR oslo_messaging.rpc.server self._assert_active() ERROR oslo_messaging.rpc.server File "/usr/lib64/python3.9/site-packages/sqlalchemy/orm/session.py", line 721, in _connection_for_bind ERROR oslo_messaging.rpc.server return self._transaction._connection_for_bind( ERROR oslo_messaging.rpc.server File "/usr/lib64/python3.9/site-packages/sqlalchemy/orm/session.py", line 1552, in _connection_for_bind ERROR oslo_messaging.rpc.server conn = self._connection_for_bind(bind, close_with_result=True) ERROR oslo_messaging.rpc.server File "/usr/lib64/python3.9/site-packages/sqlalchemy/orm/session.py", line 1708, in execute ERROR oslo_messaging.rpc.server result = self.session.execute( ERROR oslo_messaging.rpc.server File "/usr/lib64/python3.9/site-packages/sqlalchemy/orm/query.py", line 2916, in _iter ERROR oslo_messaging.rpc.server return self._iter().one() ERROR oslo_messaging.rpc.server File "/usr/lib64/python3.9/site-packages/sqlalchemy/orm/query.py", line 2870, in one ERROR oslo_messaging.rpc.server return (context.session.query(models.DistributedPortBinding). ERROR oslo_messaging.rpc.server File "/usr/lib/python3.9/site-packages/neutron/plugins/ml2/db.py", line 114, in ensure_distributed_port_binding ERROR oslo_messaging.rpc.server binding = db.ensure_distributed_port_binding( ERROR oslo_messaging.rpc.server File "/usr/lib/python3.9/site-packages/neutron/plugins/ml2/plugin.py", line 2010, in update_distributed_port_binding ERROR oslo_messaging.rpc.server return f(*dup_args, **dup_kwargs) ERROR oslo_messaging.rpc.server File "/usr/lib/python3.9/site-packages/neutron_lib/db/api.py", line 179, in wrapped ERROR oslo_messaging.rpc.server raise self.value ERROR oslo_messaging.rpc.server File "/usr/lib/python3.9/site-packages/oslo_utils/excutils.py", line 200, in force_reraise ERROR oslo_messaging.rpc.server self.force_reraise() ERROR oslo_messaging.rpc.server File "/usr/lib/python3.9/site-packages/oslo_utils/excutils.py", line 227, in __exit__ ERROR oslo_messaging.rpc.server LOG.debug("Retry wrapper got retriable exception: %s", e) ERROR oslo_messaging.rpc.server File "/usr/lib/python3.9/site-packages/neutron_lib/db/api.py", line 183, in wrapped ERROR oslo_messaging.rpc.server return f(*args, **kwargs) ERROR oslo_messaging.rpc.server File "/usr/lib/python3.9/site-packages/oslo_db/api.py", line 142, in wrapper ERROR oslo_messaging.rpc.server raise self.value ERROR oslo_messaging.rpc.server File "/usr/lib/python3.9/site-packages/oslo_utils/excutils.py", line 200, in force_reraise ERROR oslo_messaging.rpc.server self.force_reraise() ERROR oslo_messaging.rpc.server File "/usr/lib/python3.9/site-packages/oslo_utils/excutils.py", line 227, in __exit__ ERROR oslo_messaging.rpc.server ectxt.value = e.inner_exc ERROR oslo_messaging.rpc.server File "/usr/lib/python3.9/site-packages/oslo_db/api.py", line 154, in wrapper ERROR oslo_messaging.rpc.server return f(*args, **kwargs) ERROR oslo_messaging.rpc.server File "/usr/lib/python3.9/site-packages/neutron_lib/db/api.py", line 135, in wrapped ERROR oslo_messaging.rpc.server raise self.value ERROR oslo_messaging.rpc.server File "/usr/lib/python3.9/site-packages/oslo_utils/excutils.py", line 200, in force_reraise ERROR oslo_messaging.rpc.server self.force_reraise() ERROR oslo_messaging.rpc.server File "/usr/lib/python3.9/site-packages/oslo_utils/excutils.py", line 227, in __exit__ ERROR oslo_messaging.rpc.server setattr(e, '_RETRY_EXCEEDED', True) ERROR oslo_messaging.rpc.server File "/usr/lib/python3.9/site-packages/neutron_lib/db/api.py", line 139, in wrapped ERROR oslo_messaging.rpc.server return method(*args, **kwargs) ERROR oslo_messaging.rpc.server File "/usr/lib/python3.9/site-packages/neutron_lib/db/api.py", line 218, in wrapped ERROR oslo_messaging.rpc.server return f(*args, **kwargs) ERROR oslo_messaging.rpc.server File "/usr/lib/python3.9/site-packages/neutron/common/utils.py", line 701, in inner ERROR oslo_messaging.rpc.server self.plugin.update_distributed_port_binding( ERROR oslo_messaging.rpc.server File "/usr/lib/python3.9/site-packages/neutron/api/rpc/handlers/l3_rpc.py", line 253, in _ensure_host_set_on_port ERROR oslo_messaging.rpc.server self._ensure_host_set_on_port( ERROR oslo_messaging.rpc.server File "/usr/lib/python3.9/site-packages/neutron/api/rpc/handlers/l3_rpc.py", line 178, in _ensure_host_set_on_ports ERROR oslo_messaging.rpc.server self._ensure_host_set_on_ports(context, host, routers) ERROR oslo_messaging.rpc.server File "/usr/lib/python3.9/site-packages/neutron/api/rpc/handlers/l3_rpc.py", line 131, in sync_routers ERROR oslo_messaging.rpc.server return f(*dup_args, **dup_kwargs) ERROR oslo_messaging.rpc.server File "/usr/lib/python3.9/site-packages/neutron_lib/db/api.py", line 179, in wrapped ERROR oslo_messaging.rpc.server raise self.value ERROR oslo_messaging.rpc.server File "/usr/lib/python3.9/site-packages/oslo_utils/excutils.py", line 200, in force_reraise ERROR oslo_messaging.rpc.server self.force_reraise() ERROR oslo_messaging.rpc.server File "/usr/lib/python3.9/site-packages/oslo_utils/excutils.py", line 227, in __exit__ ERROR oslo_messaging.rpc.server LOG.debug("Retry wrapper got retriable exception: %s", e) ERROR oslo_messaging.rpc.server File "/usr/lib/python3.9/site-packages/neutron_lib/db/api.py", line 183, in wrapped ERROR oslo_messaging.rpc.server return f(*args, **kwargs) ERROR oslo_messaging.rpc.server File "/usr/lib/python3.9/site-packages/oslo_db/api.py", line 142, in wrapper ERROR oslo_messaging.rpc.server raise self.value ERROR oslo_messaging.rpc.server File "/usr/lib/python3.9/site-packages/oslo_utils/excutils.py", line 200, in force_reraise ERROR oslo_messaging.rpc.server self.force_reraise() ERROR oslo_messaging.rpc.server File "/usr/lib/python3.9/site-packages/oslo_utils/excutils.py", line 227, in __exit__ ERROR oslo_messaging.rpc.server ectxt.value = e.inner_exc ERROR oslo_messaging.rpc.server File "/usr/lib/python3.9/site-packages/oslo_db/api.py", line 154, in wrapper ERROR oslo_messaging.rpc.server return f(*args, **kwargs) ERROR oslo_messaging.rpc.server File "/usr/lib/python3.9/site-packages/neutron_lib/db/api.py", line 135, in wrapped ERROR oslo_messaging.rpc.server raise self.value ERROR oslo_messaging.rpc.server File "/usr/lib/python3.9/site-packages/oslo_utils/excutils.py", line 200, in force_reraise ERROR oslo_messaging.rpc.server self.force_reraise() ERROR oslo_messaging.rpc.server File "/usr/lib/python3.9/site-packages/oslo_utils/excutils.py", line 227, in __exit__ ERROR oslo_messaging.rpc.server setattr(e, '_RETRY_EXCEEDED', True) ERROR oslo_messaging.rpc.server File "/usr/lib/python3.9/site-packages/neutron_lib/db/api.py", line 139, in wrapped ERROR oslo_messaging.rpc.server result = func(ctxt, **new_args) ERROR oslo_messaging.rpc.server File "/usr/lib/python3.9/site-packages/oslo_messaging/rpc/dispatcher.py", line 229, in _do_dispatch ERROR oslo_messaging.rpc.server return self._do_dispatch(endpoint, method, ctxt, args) ERROR oslo_messaging.rpc.server File "/usr/lib/python3.9/site-packages/oslo_messaging/rpc/dispatcher.py", line 309, in dispatch ERROR oslo_messaging.rpc.server res = self.dispatcher.dispatch(message) ERROR oslo_messaging.rpc.server File "/usr/lib/python3.9/site-packages/oslo_messaging/rpc/server.py", line 165, in _process_incoming ERROR oslo_messaging.rpc.server Traceback (most recent call last): ERROR oslo_messaging.rpc.server ERROR oslo_messaging.rpc.server During handling of the above exception, another exception occurred: ERROR oslo_messaging.rpc.server ERROR oslo_messaging.rpc.server (Background on this error at: https://sqlalche.me/e/14/gkpj) ERROR oslo_messaging.rpc.server [parameters: {'port_id': 'f269cf3d-8a00-4b5b-99c2-63cae0968f42', 'host': 'gm-os-hv-017', 'router_id': 'e3fb6ba3-7cd5-40d4-bb24-4544e1319ea3', 'vif_type': 'unbound', 'vif_details': '', 'vnic_type': 'normal', 'profile': '', 'status': 'DOWN'}] ERROR oslo_messaging.rpc.server [SQL: INSERT INTO ml2_distributed_port_bindings (port_id, host, router_id, vif_type, vif_details, vnic_type, profile, status) VALUES (%(port_id)s, %(host)s, %(router_id)s, %(vif_type)s, %(vif_details)s, %(vnic_type)s, %(profile)s, %(status)s)] ERROR oslo_messaging.rpc.server oslo_db.exception.DBDuplicateEntry: (pymysql.err.IntegrityError) (1062, "Duplicate entry 'f269cf3d-8a00-4b5b-99c2-63cae0968f42-gm-os-hv-017' for key 'PRIMARY'") ERROR oslo_messaging.rpc.server raise errorclass(errno, errval) ERROR oslo_messaging.rpc.server File "/usr/lib/python3.9/site-packages/pymysql/err.py", line 107, in raise_mysql_exception ERROR oslo_messaging.rpc.server err.raise_mysql_exception(self._data) ERROR oslo_messaging.rpc.server File "/usr/lib/python3.9/site-packages/pymysql/protocol.py", line 223, in raise_for_error ERROR oslo_messaging.rpc.server packet.raise_for_error() ERROR oslo_messaging.rpc.server File "/usr/lib/python3.9/site-packages/pymysql/connections.py", line 676, in _read_packet ERROR oslo_messaging.rpc.server first_packet = self.connection._read_packet() ERROR oslo_messaging.rpc.server File "/usr/lib/python3.9/site-packages/pymysql/connections.py", line 1069, in read ERROR oslo_messaging.rpc.server result.read() ERROR oslo_messaging.rpc.server File "/usr/lib/python3.9/site-packages/pymysql/connections.py", line 724, in _read_query_result ERROR oslo_messaging.rpc.server self._affected_rows = self._read_query_result(unbuffered=unbuffered) ERROR oslo_messaging.rpc.server File "/usr/lib/python3.9/site-packages/pymysql/connections.py", line 505, in query ERROR oslo_messaging.rpc.server conn.query(q) ERROR oslo_messaging.rpc.server File "/usr/lib/python3.9/site-packages/pymysql/cursors.py", line 321, in _query ERROR oslo_messaging.rpc.server result = self._query(query) ERROR oslo_messaging.rpc.server File "/usr/lib/python3.9/site-packages/pymysql/cursors.py", line 163, in execute ERROR oslo_messaging.rpc.server cursor.execute(statement, parameters) ERROR oslo_messaging.rpc.server File "/usr/lib64/python3.9/site-packages/sqlalchemy/engine/default.py", line 736, in do_execute ERROR oslo_messaging.rpc.server self.dialect.do_execute( ERROR oslo_messaging.rpc.server File "/usr/lib64/python3.9/site-packages/sqlalchemy/engine/base.py", line 1900, in _execute_context ERROR oslo_messaging.rpc.server raise exception ERROR oslo_messaging.rpc.server File "/usr/lib64/python3.9/site-packages/sqlalchemy/util/compat.py", line 211, in raise_ ERROR oslo_messaging.rpc.server util.raise_(newraise, with_traceback=exc_info[2], from_=e) ERROR oslo_messaging.rpc.server File "/usr/lib64/python3.9/site-packages/sqlalchemy/engine/base.py", line 2122, in _handle_dbapi_exception ERROR oslo_messaging.rpc.server self._handle_dbapi_exception( ERROR oslo_messaging.rpc.server File "/usr/lib64/python3.9/site-packages/sqlalchemy/engine/base.py", line 1943, in _execute_context ERROR oslo_messaging.rpc.server ret = self._execute_context( ERROR oslo_messaging.rpc.server File "/usr/lib64/python3.9/site-packages/sqlalchemy/engine/base.py", line 1572, in _execute_clauseelement ERROR oslo_messaging.rpc.server return connection._execute_clauseelement( ERROR oslo_messaging.rpc.server File "/usr/lib64/python3.9/site-packages/sqlalchemy/sql/elements.py", line 334, in _execute_on_connection ERROR oslo_messaging.rpc.server return meth(self, args_10style, kwargs_10style, execution_options) ERROR oslo_messaging.rpc.server File "/usr/lib64/python3.9/site-packages/sqlalchemy/engine/base.py", line 1705, in _execute_20 ERROR oslo_messaging.rpc.server c = connection._execute_20( ERROR oslo_messaging.rpc.server File "/usr/lib64/python3.9/site-packages/sqlalchemy/orm/persistence.py", line 1097, in _emit_insert_statements ERROR oslo_messaging.rpc.server _emit_insert_statements( ERROR oslo_messaging.rpc.server File "/usr/lib64/python3.9/site-packages/sqlalchemy/orm/persistence.py", line 245, in save_obj ERROR oslo_messaging.rpc.server util.preloaded.orm_persistence.save_obj( ERROR oslo_messaging.rpc.server File "/usr/lib64/python3.9/site-packages/sqlalchemy/orm/unitofwork.py", line 630, in execute ERROR oslo_messaging.rpc.server rec.execute(self) ERROR oslo_messaging.rpc.server File "/usr/lib64/python3.9/site-packages/sqlalchemy/orm/unitofwork.py", line 456, in execute ERROR oslo_messaging.rpc.server flush_context.execute() ERROR oslo_messaging.rpc.server File "/usr/lib64/python3.9/site-packages/sqlalchemy/orm/session.py", line 3544, in _flush ERROR oslo_messaging.rpc.server raise exception ERROR oslo_messaging.rpc.server File "/usr/lib64/python3.9/site-packages/sqlalchemy/util/compat.py", line 211, in raise_ ERROR oslo_messaging.rpc.server compat.raise_( ERROR oslo_messaging.rpc.server File "/usr/lib64/python3.9/site-packages/sqlalchemy/util/langhelpers.py", line 70, in __exit__ ERROR oslo_messaging.rpc.server transaction.rollback(_capture_exception=True) ERROR oslo_messaging.rpc.server File "/usr/lib64/python3.9/site-packages/sqlalchemy/orm/session.py", line 3584, in _flush ERROR oslo_messaging.rpc.server self._flush(objects) ERROR oslo_messaging.rpc.server File "/usr/lib64/python3.9/site-packages/sqlalchemy/orm/session.py", line 3444, in flush ERROR oslo_messaging.rpc.server self.session.flush() ERROR oslo_messaging.rpc.server File "/usr/lib/python3.9/site-packages/oslo_db/sqlalchemy/enginefacade.py", line 676, in _session ERROR oslo_messaging.rpc.server next(self.gen) ERROR oslo_messaging.rpc.server File "/usr/lib64/python3.9/contextlib.py", line 126, in __exit__ ERROR oslo_messaging.rpc.server yield resource ERROR oslo_messaging.rpc.server File "/usr/lib/python3.9/site-packages/oslo_db/sqlalchemy/enginefacade.py", line 1060, in _transaction_scope ERROR oslo_messaging.rpc.server next(self.gen) ERROR oslo_messaging.rpc.server File "/usr/lib64/python3.9/contextlib.py", line 126, in __exit__ ERROR oslo_messaging.rpc.server return record ERROR oslo_messaging.rpc.server File "/usr/lib/python3.9/site-packages/neutron/plugins/ml2/db.py", line 110, in ensure_distributed_port_binding ERROR oslo_messaging.rpc.server Traceback (most recent call last): ERROR oslo_messaging.rpc.server ERROR oslo_messaging.rpc.server The above exception was the direct cause of the following exception: ERROR oslo_messaging.rpc.server ERROR oslo_messaging.rpc.server pymysql.err.IntegrityError: (1062, "Duplicate entry 'f269cf3d-8a00-4b5b-99c2-63cae0968f42-gm-os-hv-017' for key 'PRIMARY'") ERROR oslo_messaging.rpc.server raise errorclass(errno, errval) ERROR oslo_messaging.rpc.server File "/usr/lib/python3.9/site-packages/pymysql/err.py", line 107, in raise_mysql_exception ERROR oslo_messaging.rpc.server err.raise_mysql_exception(self._data) ERROR oslo_messaging.rpc.server File "/usr/lib/python3.9/site-packages/pymysql/protocol.py", line 223, in raise_for_error ERROR oslo_messaging.rpc.server packet.raise_for_error() ERROR oslo_messaging.rpc.server File "/usr/lib/python3.9/site-packages/pymysql/connections.py", line 676, in _read_packet ERROR oslo_messaging.rpc.server first_packet = self.connection._read_packet() ERROR oslo_messaging.rpc.server File "/usr/lib/python3.9/site-packages/pymysql/connections.py", line 1069, in read ERROR oslo_messaging.rpc.server result.read() ERROR oslo_messaging.rpc.server File "/usr/lib/python3.9/site-packages/pymysql/connections.py", line 724, in _read_query_result ERROR oslo_messaging.rpc.server self._affected_rows = self._read_query_result(unbuffered=unbuffered) ERROR oslo_messaging.rpc.server File "/usr/lib/python3.9/site-packages/pymysql/connections.py", line 505, in query ERROR oslo_messaging.rpc.server conn.query(q) ERROR oslo_messaging.rpc.server File "/usr/lib/python3.9/site-packages/pymysql/cursors.py", line 321, in _query ERROR oslo_messaging.rpc.server result = self._query(query) ERROR oslo_messaging.rpc.server File "/usr/lib/python3.9/site-packages/pymysql/cursors.py", line 163, in execute ERROR oslo_messaging.rpc.server cursor.execute(statement, parameters) ERROR oslo_messaging.rpc.server File "/usr/lib64/python3.9/site-packages/sqlalchemy/engine/default.py", line 736, in do_execute ERROR oslo_messaging.rpc.server self.dialect.do_execute( ERROR oslo_messaging.rpc.server File "/usr/lib64/python3.9/site-packages/sqlalchemy/engine/base.py", line 1900, in _execute_context ERROR oslo_messaging.rpc.server Traceback (most recent call last): ERROR oslo_messaging.rpc.server [req-1112fb3c-05bc-4754-b4d9-e0813bba902c - - - - -] Exception during message handling: sqlalchemy.exc.PendingRollbackError: This Session's transaction has been rolled back due to a previous exception during flush. To begin a new transaction with this Session, first issue Session.rollback(). Original exception was: (pymysql.err.IntegrityError) (1062, "Duplicate entry 'f269cf3d-8a00-4b5b-99c2-63cae0968f42-gm-os-hv-017' for key 'PRIMARY'") ``` As you can see neutron-server should handle exception for `DuplicateEntry` and return existing record: https://github.com/openstack/neutron/blob/20.3.1/neutron/plugins/ml2/db.py#L111 But this code is not doing it and failed with: ``` sqlalchemy.exc.PendingRollbackError: This Session's transaction has been rolled back due to a previous exception during flush. To begin a new transaction with this Session, first issue Session.rollback(). Original exception was: (pymysql.err.IntegrityError) (1062, "Duplicate entry ..." ``` It seems that this part of the code is not covered by tests and not work correctly. It is reproduced on our side only in one production system and we can not reproduce it on our lab env. Environment =========== AlmaLinux 9.5 ``` openstack-neutron-20.3.1-1.el9s python-oslo-db-11.2.0-1.el9s python-oslo-messaging-12.13.3-1.el9s python-sqlalchemy-1.4.45-3.el9 ``` To manage notifications about this bug go to: https://bugs.launchpad.net/neutron/+bug/2106374/+subscriptions -- Mailing list: https://launchpad.net/~yahoo-eng-team Post to : yahoo-eng-team@lists.launchpad.net Unsubscribe : https://launchpad.net/~yahoo-eng-team More help : https://help.launchpad.net/ListHelp