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
This commit is contained in:
Eugene Nikanorov 2014-02-06 01:52:35 +04:00
parent c4e7ae64c6
commit eed1b7cbdb

View File

@ -22,6 +22,7 @@ from oslo.config import cfg
from neutron.common import constants from neutron.common import constants
from neutron.db import agents_db from neutron.db import agents_db
from neutron.db import agentschedulers_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 from neutron.openstack.common import log as logging
@ -35,10 +36,17 @@ class ChanceScheduler(object):
""" """
def _schedule_bind_network(self, context, agent, network_id): def _schedule_bind_network(self, context, agent, network_id):
binding = agentschedulers_db.NetworkDhcpAgentBinding() try:
binding.dhcp_agent = agent binding = agentschedulers_db.NetworkDhcpAgentBinding()
binding.network_id = network_id binding.dhcp_agent = agent
context.session.add(binding) 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 ' LOG.debug(_('Network %(network_id)s is scheduled to be hosted by '
'DHCP agent %(agent_id)s'), 'DHCP agent %(agent_id)s'),
{'network_id': network_id, {'network_id': network_id,