diff options
author | Wangpan <hzwangpan@corp.netease.com> | 2013-01-08 13:54:19 +0800 |
---|---|---|
committer | Wangpan <hzwangpan@corp.netease.com> | 2013-01-09 19:05:51 +0800 |
commit | 6344bff494758e0d7d7d25f43a3b56d82447441e (patch) | |
tree | c8deb240befcdc8a4a087fd45e75a5c09171a55e | |
parent | 1db4b13d86d748d9619ea9ce37bb4663285468b5 (diff) | |
download | nova-6344bff494758e0d7d7d25f43a3b56d82447441e.tar.gz nova-6344bff494758e0d7d7d25f43a3b56d82447441e.tar.xz nova-6344bff494758e0d7d7d25f43a3b56d82447441e.zip |
Fix double reboot issue during soft reboot
Using the ID of domain in Libvirt to recognize the hard reboot has been
implemented or not, if the ID changed, we believe the domain has been rebooted,
return True and break from soft reboot.
Fixes: bug #1046356
Change-Id: Iec2f9e8225cfe2779f84d2095667f3c0e621e935
-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 8d9561c7e..59de990cb 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'] @@ -516,6 +520,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 b79a2ba92..635076ebc 100644 --- a/nova/virt/libvirt/driver.py +++ b/nova/virt/libvirt/driver.py @@ -871,6 +871,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: @@ -879,8 +880,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]: @@ -891,6 +894,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 |