[AIM] suppress the DBDuplicateEntry error caused by concurrent transactions

Change-Id: I953d2a676bbafd7450059b2c8c951c537950c91d
(cherry picked from commit dde2fa0ea0)
(cherry picked from commit 9872c53514)
This commit is contained in:
Kent Wu 2017-05-18 16:09:40 -07:00 committed by Sumit Naiksatam
parent 924c47ff2c
commit 05bd9180e4
1 changed files with 45 additions and 36 deletions

View File

@ -48,6 +48,7 @@ from neutron.plugins.ml2 import models
from opflexagent import constants as ofcst
from opflexagent import rpc as ofrpc
from oslo_config import cfg
from oslo_db import exception as db_exc
from oslo_log import log
import oslo_messaging
@ -2354,30 +2355,34 @@ class ApicMechanismDriver(api_plus.MechanismDriver):
hd_mapping = aim_infra.HostDomainMapping(host_name=host_id)
aim_hd_mapping = self.aim.get(aim_ctx, hd_mapping)
domain = None
if is_vmm:
if aim_hd_mapping:
domain = aim_hd_mapping.vmm_domain_name
if not domain:
vmms, phys = self.get_aim_domains(aim_ctx)
self.aim.update(aim_ctx, epg,
openstack_vmm_domain_names=vmms)
elif domain not in aim_epg.openstack_vmm_domain_names:
aim_epg.openstack_vmm_domain_names.append(domain)
vmms = aim_epg.openstack_vmm_domain_names
self.aim.update(aim_ctx, epg,
openstack_vmm_domain_names=vmms)
else:
if aim_hd_mapping:
domain = aim_hd_mapping.physical_domain_name
if not domain:
vmms, phys = self.get_aim_domains(aim_ctx)
self.aim.update(aim_ctx, epg,
physical_domain_names=phys)
elif domain not in aim_epg.physical_domain_names:
aim_epg.physical_domain_names.append(domain)
phys = aim_epg.physical_domain_names
self.aim.update(aim_ctx, epg,
physical_domain_names=phys)
try:
if is_vmm:
if aim_hd_mapping:
domain = aim_hd_mapping.vmm_domain_name
if not domain:
vmms, phys = self.get_aim_domains(aim_ctx)
self.aim.update(aim_ctx, epg,
openstack_vmm_domain_names=vmms)
elif domain not in aim_epg.openstack_vmm_domain_names:
aim_epg.openstack_vmm_domain_names.append(domain)
vmms = aim_epg.openstack_vmm_domain_names
self.aim.update(aim_ctx, epg,
openstack_vmm_domain_names=vmms)
else:
if aim_hd_mapping:
domain = aim_hd_mapping.physical_domain_name
if not domain:
vmms, phys = self.get_aim_domains(aim_ctx)
self.aim.update(aim_ctx, epg,
physical_domain_names=phys)
elif domain not in aim_epg.physical_domain_names:
aim_epg.physical_domain_names.append(domain)
phys = aim_epg.physical_domain_names
self.aim.update(aim_ctx, epg,
physical_domain_names=phys)
# this could be caused by concurrent transactions
except db_exc.DBDuplicateEntry as e:
LOG.debug(e)
# public interface for aim_mapping also
def disassociate_domain(self, port_context, use_original=False):
@ -2453,18 +2458,22 @@ class ApicMechanismDriver(api_plus.MechanismDriver):
'tenant_id']
bd, epg = self._map_network(session, network, None)
aim_epg = self.aim.get(aim_ctx, epg)
if self._is_opflex_type(btm[api.NETWORK_TYPE]):
if domain in aim_epg.openstack_vmm_domain_names:
aim_epg.openstack_vmm_domain_names.remove(domain)
vmms = aim_epg.openstack_vmm_domain_names
self.aim.update(aim_ctx, epg,
openstack_vmm_domain_names=vmms)
else:
if domain in aim_epg.physical_domain_names:
aim_epg.physical_domain_names.remove(domain)
phys = aim_epg.physical_domain_names
self.aim.update(aim_ctx, epg,
physical_domain_names=phys)
try:
if self._is_opflex_type(btm[api.NETWORK_TYPE]):
if domain in aim_epg.openstack_vmm_domain_names:
aim_epg.openstack_vmm_domain_names.remove(domain)
vmms = aim_epg.openstack_vmm_domain_names
self.aim.update(aim_ctx, epg,
openstack_vmm_domain_names=vmms)
else:
if domain in aim_epg.physical_domain_names:
aim_epg.physical_domain_names.remove(domain)
phys = aim_epg.physical_domain_names
self.aim.update(aim_ctx, epg,
physical_domain_names=phys)
# this could be caused by concurrent transactions
except db_exc.DBDuplicateEntry as e:
LOG.debug(e)
LOG.info(_LI('Releasing domain %(d)s for port %(p)s'),
{'d': domain, 'p': port['id']})