diff options
author | Jenkins <jenkins@review.openstack.org> | 2013-01-25 03:53:41 +0000 |
---|---|---|
committer | Gerrit Code Review <review@openstack.org> | 2013-01-25 03:53:41 +0000 |
commit | fa0431c35091dc4bab818dbdab2c82e49bc917b4 (patch) | |
tree | 90aaf1f2b7d41633c0ff8929e139970087ec8fbd | |
parent | f24cfa8093913466658a3ce2d9dc907c0c813239 (diff) | |
parent | 6344bff494758e0d7d7d25f43a3b56d82447441e (diff) | |
download | nova-fa0431c35091dc4bab818dbdab2c82e49bc917b4.tar.gz nova-fa0431c35091dc4bab818dbdab2c82e49bc917b4.tar.xz nova-fa0431c35091dc4bab818dbdab2c82e49bc917b4.zip |
Merge "Fix double reboot issue during soft reboot"
-rw-r--r-- | nova/tests/fakelibvirt.py | 6 | ||||
-rw-r--r-- | nova/virt/libvirt/driver.py | 7 |
2 files changed, 13 insertions, 0 deletions
diff --git a/nova/tests/fakelibvirt.py b/nova/tests/fakelibvirt.py index a573b7d1c..259d192cb 100644 --- a/nova/tests/fakelibvirt.py +++ b/nova/tests/fakelibvirt.py @@ -179,6 +179,7 @@ class Domain(object): self._def = self._parse_definition(xml) self._has_saved_state = False self._snapshots = {} + self._id = self._connection._id_counter def _parse_definition(self, xml): try: @@ -299,6 +300,9 @@ class Domain(object): self._state = VIR_DOMAIN_SHUTOFF self._connection._mark_not_running(self) + def ID(self): + return self._id + def name(self): return self._def['name'] @@ -517,6 +521,8 @@ class Connection(object): if dom._transient: self._undefine(dom) + dom._id = -1 + for (k, v) in self._running_vms.iteritems(): if v == dom: del self._running_vms[k] diff --git a/nova/virt/libvirt/driver.py b/nova/virt/libvirt/driver.py index c113c9ae2..4ee42a0ce 100644 --- a/nova/virt/libvirt/driver.py +++ b/nova/virt/libvirt/driver.py @@ -874,6 +874,7 @@ class LibvirtDriver(driver.ComputeDriver): dom = self._lookup_by_name(instance["name"]) (state, _max_mem, _mem, _cpus, _t) = dom.info() state = LIBVIRT_POWER_STATE[state] + old_domid = dom.ID() # NOTE(vish): This check allows us to reboot an instance that # is already shutdown. if state == power_state.RUNNING: @@ -882,8 +883,10 @@ class LibvirtDriver(driver.ComputeDriver): # FLAG defines depending on how long the get_info # call takes to return. for x in xrange(CONF.libvirt_wait_soft_reboot_seconds): + dom = self._lookup_by_name(instance["name"]) (state, _max_mem, _mem, _cpus, _t) = dom.info() state = LIBVIRT_POWER_STATE[state] + new_domid = dom.ID() if state in [power_state.SHUTDOWN, power_state.CRASHED]: @@ -894,6 +897,10 @@ class LibvirtDriver(driver.ComputeDriver): instance) timer.start(interval=0.5).wait() return True + elif old_domid != new_domid: + LOG.info(_("Instance may have been rebooted during soft " + "reboot, so return now."), instance=instance) + return True greenthread.sleep(1) return False |