summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--nova/network/manager.py22
-rw-r--r--nova/tests/network/test_manager.py5
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,