From c96e75d6804d016da7c6356bf593eb86dcb2f257 Mon Sep 17 00:00:00 2001 From: Vishvananda Ishaya Date: Tue, 3 Apr 2012 10:07:05 -0700 Subject: Grab the vif directly on release instead of lookup * adds extra error handling and logging * safer fix for bug 968457 Change-Id: I6d8c27c642e70dc701548550c0d94a8e0e64ce99 --- nova/network/manager.py | 22 ++++++++++++++++++---- nova/tests/network/test_manager.py | 5 ++--- 2 files changed, 20 insertions(+), 7 deletions(-) diff --git a/nova/network/manager.py b/nova/network/manager.py index 86a7a3b04..ffecf89b0 100644 --- a/nova/network/manager.py +++ b/nova/network/manager.py @@ -1219,12 +1219,26 @@ class NetworkManager(manager.SchedulerDependentManager): if FLAGS.force_dhcp_release: dev = self.driver.get_dev(network) - vif = self.db.virtual_interface_get_by_instance_and_network( - context, instance_id, network['id']) + vif_id = fixed_ip_ref['virtual_interface_id'] + + # NOTE(vish): The below errors should never happen, but there may + # be a race condition that is causing them per + # https://code.launchpad.net/bugs/968457, so we log + # an error to help track down the possible race. + msg = _("Unable to release %s because vif doesn't exist.") + if not vif_id: + LOG.error(msg % address) + return + + vif = self.db.virtual_interface_get(context, vif_id) + + if not vif: + LOG.error(msg % address) + return + # NOTE(vish): This forces a packet so that the release_fixed_ip # callback will get called by nova-dhcpbridge. - if vif: - self.driver.release_dhcp(dev, address, vif['address']) + self.driver.release_dhcp(dev, address, vif['address']) def lease_fixed_ip(self, context, address): """Called by dhcp-bridge when ip is leased.""" diff --git a/nova/tests/network/test_manager.py b/nova/tests/network/test_manager.py index ef1e6b70c..7ef5a9d33 100644 --- a/nova/tests/network/test_manager.py +++ b/nova/tests/network/test_manager.py @@ -883,11 +883,10 @@ class VlanNetworkTestCase(test.TestCase): self.stubs.Set(db, 'network_get', network_get) - def vif_get(_context, _instance_id, _network_id): + def vif_get(_context, _vif_id): return None - self.stubs.Set(db, 'virtual_interface_get_by_instance_and_network', - vif_get) + self.stubs.Set(db, 'virtual_interface_get', vif_get) context1 = context.RequestContext('user', 'project1') instance = db.instance_create(context1, -- cgit