diff --git a/neutron/plugins/ml2/drivers/ovn/mech_driver/ovsdb/ovn_db_sync.py b/neutron/plugins/ml2/drivers/ovn/mech_driver/ovsdb/ovn_db_sync.py index 6d8544180d1..08fee14d8c7 100644 --- a/neutron/plugins/ml2/drivers/ovn/mech_driver/ovsdb/ovn_db_sync.py +++ b/neutron/plugins/ml2/drivers/ovn/mech_driver/ovsdb/ovn_db_sync.py @@ -24,6 +24,7 @@ from neutron_lib.plugins import constants as plugin_constants from neutron_lib.plugins import directory from neutron_lib.utils import helpers from oslo_log import log +from ovsdbapp.backend.ovs_idl import idlutils import six from neutron.common.ovn import acl as acl_utils @@ -93,7 +94,6 @@ class OvnNbSynchronizer(OvnDbSynchronizer): LOG.debug("Starting OVN-Northbound DB sync process") ctx = context.get_admin_context() - self.sync_port_groups(ctx) self.sync_networks_ports_and_dhcp_opts(ctx) self.sync_port_dns_records(ctx) @@ -275,11 +275,32 @@ class OvnNbSynchronizer(OvnDbSynchronizer): 'remove': num_acls_to_remove}) if self.mode == SYNC_MODE_REPAIR: - with self.ovn_api.transaction(check_error=True) as txn: - for acla in neutron_acls: - LOG.warning('ACL found in Neutron but not in ' - 'OVN DB for port group %s', acla['port_group']) - txn.add(self.ovn_api.pg_acl_add(**acla, may_exist=True)) + pg_resync_count = 0 + while True: + try: + with self.ovn_api.transaction(check_error=True) as txn: + for acla in neutron_acls: + LOG.warning('ACL found in Neutron but not in ' + 'OVN DB for port group %s', + acla['port_group']) + txn.add(self.ovn_api.pg_acl_add( + **acla, may_exist=True)) + except idlutils.RowNotFound as row_err: + if row_err.msg.startswith("Cannot find Port_Group"): + if pg_resync_count < 1: + LOG.warning('Port group row was not found during ' + 'ACLs sync. Will attempt to sync port ' + 'groups one more time. The caught ' + 'exception is: %s', row_err) + self.sync_port_groups(ctx) + pg_resync_count += 1 + continue + LOG.error('Port group exception during ACL sync ' + 'even after one more port group resync. ' + 'The caught exception is: %s', row_err) + else: + raise + break with self.ovn_api.transaction(check_error=True) as txn: for aclr in ovn_acls: