diff options
| author | Anthony Young <sleepsonthefloor@gmail.com> | 2012-03-16 16:51:03 -0700 |
|---|---|---|
| committer | Anthony Young <sleepsonthefloor@gmail.com> | 2012-03-16 18:18:46 -0700 |
| commit | fe7055a5bd25bef33fe10f4fee858ad8cd30a6ea (patch) | |
| tree | 25caf16d823f19f4c10b443e69df9f77759bfd76 /nova/virt | |
| parent | eb42e7fcd7bb67ab951c9bc6c80a78cd23011458 (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.py | 12 | ||||
| -rw-r--r-- | nova/virt/libvirt/firewall.py | 7 |
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) |
