From: Eugene Nikanorov Date: Wed, 5 Feb 2014 21:52:35 +0000 (+0400) Subject: Fix race condition in network scheduling to dhcp agent X-Git-Url: https://review.fuel-infra.org/gitweb?a=commitdiff_plain;h=f89816d4c9ae3c1db6634282224daa14dccbc268;p=openstack-build%2Fneutron-build.git 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 --- diff --git a/neutron/scheduler/dhcp_agent_scheduler.py b/neutron/scheduler/dhcp_agent_scheduler.py index 5134bca64..20632c587 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,