summaryrefslogtreecommitdiffstats
path: root/nova/virt
diff options
context:
space:
mode:
authorAnthony Young <sleepsonthefloor@gmail.com>2012-03-16 16:51:03 -0700
committerAnthony Young <sleepsonthefloor@gmail.com>2012-03-16 18:18:46 -0700
commitfe7055a5bd25bef33fe10f4fee858ad8cd30a6ea (patch)
tree25caf16d823f19f4c10b443e69df9f77759bfd76 /nova/virt
parenteb42e7fcd7bb67ab951c9bc6c80a78cd23011458 (diff)
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
Diffstat (limited to 'nova/virt')
-rw-r--r--nova/virt/libvirt/connection.py12
-rw-r--r--nova/virt/libvirt/firewall.py7
2 files changed, 16 insertions, 3 deletions
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)