From fe7055a5bd25bef33fe10f4fee858ad8cd30a6ea Mon Sep 17 00:00:00 2001 From: Anthony Young Date: Fri, 16 Mar 2012 16:51:03 -0700 Subject: Fix run/terminate race conditions. * synchronize run,terminate,stop,start on instance_uuid * don't surpress error when unfiltering instance, which can result in a zombified instance. * Fixes bug 956719 * Remove debug raise Change-Id: I8b2eaffdabfd5c1a9414adb1b5ed11e4c48711fc --- nova/virt/libvirt/connection.py | 12 ++++++++++-- nova/virt/libvirt/firewall.py | 7 ++++++- 2 files changed, 16 insertions(+), 3 deletions(-) (limited to 'nova/virt') diff --git a/nova/virt/libvirt/connection.py b/nova/virt/libvirt/connection.py index 2f35c664c..79cfd1652 100644 --- a/nova/virt/libvirt/connection.py +++ b/nova/virt/libvirt/connection.py @@ -406,8 +406,16 @@ class LibvirtConnection(driver.ComputeDriver): timer = utils.LoopingCall(_wait_for_destroy) timer.start(interval=0.5, now=True) - self.firewall_driver.unfilter_instance(instance, - network_info=network_info) + try: + self.firewall_driver.unfilter_instance(instance, + network_info=network_info) + except libvirt.libvirtError as e: + errcode = e.get_error_code() + LOG.warning(_("Error from libvirt during unfilter. " + "Code=%(errcode)s Error=%(e)s") % + locals(), instance=instance) + reason = "Error unfiltering instance." + raise exception.InstanceTerminationFailure(reason=reason) # NOTE(vish): we disconnect from volumes regardless block_device_mapping = driver.block_device_info_get_mapping( diff --git a/nova/virt/libvirt/firewall.py b/nova/virt/libvirt/firewall.py index 04b3cf42a..93f03d6df 100644 --- a/nova/virt/libvirt/firewall.py +++ b/nova/virt/libvirt/firewall.py @@ -156,7 +156,12 @@ class NWFilterFirewall(base_firewall.FirewallDriver): try: _nw = self._conn.nwfilterLookupByName(instance_filter_name) _nw.undefine() - except libvirt.libvirtError: + except libvirt.libvirtError as e: + errcode = e.get_error_code() + if errcode == libvirt.VIR_ERR_OPERATION_INVALID: + # This happens when the instance filter is still in + # use (ie. when the instance has not terminated properly) + raise LOG.debug(_('The nwfilter(%(instance_filter_name)s) ' 'is not found.') % locals(), instance=instance) -- cgit