From eed1b7cbdb00a3fbac9f19bab1a2d7366833b753 Mon Sep 17 00:00:00 2001 From: Eugene Nikanorov Date: Thu, 6 Feb 2014 01:52:35 +0400 Subject: [PATCH] Fix race condition in network scheduling to dhcp agent Rarely dhcp agent rpc call get_active_networks_info() can interleave with network scheduling initiated by create.port.end notification. In this case scheduling raises and port creation returns 500. Need to synchronize on DhcpNetworkBindings table. Closes-Bug: #1276552 Change-Id: I52d94a40772a99c7032dba15b200bf0f21362f93 --- neutron/scheduler/dhcp_agent_scheduler.py | 16 ++++++++++++---- 1 file changed, 12 insertions(+), 4 deletions(-) diff --git a/neutron/scheduler/dhcp_agent_scheduler.py b/neutron/scheduler/dhcp_agent_scheduler.py index 5134bca64c..20632c5872 100644 --- a/neutron/scheduler/dhcp_agent_scheduler.py +++ b/neutron/scheduler/dhcp_agent_scheduler.py @@ -22,6 +22,7 @@ from oslo.config import cfg from neutron.common import constants from neutron.db import agents_db from neutron.db import agentschedulers_db +from neutron.openstack.common.db import exception as db_exc from neutron.openstack.common import log as logging @@ -35,10 +36,17 @@ class ChanceScheduler(object): """ def _schedule_bind_network(self, context, agent, network_id): - binding = agentschedulers_db.NetworkDhcpAgentBinding() - binding.dhcp_agent = agent - binding.network_id = network_id - context.session.add(binding) + try: + binding = agentschedulers_db.NetworkDhcpAgentBinding() + binding.dhcp_agent = agent + binding.network_id = network_id + context.session.add(binding) + # try to actually write the changes and catch integrity + # DBDuplicateEntry + context.session.flush() + except db_exc.DBDuplicateEntry: + # it's totally ok, someone just did our job! + pass LOG.debug(_('Network %(network_id)s is scheduled to be hosted by ' 'DHCP agent %(agent_id)s'), {'network_id': network_id,