summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorWangpan <hzwangpan@corp.netease.com>2013-01-08 13:54:19 +0800
committerWangpan <hzwangpan@corp.netease.com>2013-01-09 19:05:51 +0800
commit6344bff494758e0d7d7d25f43a3b56d82447441e (patch)
treec8deb240befcdc8a4a087fd45e75a5c09171a55e
parent1db4b13d86d748d9619ea9ce37bb4663285468b5 (diff)
downloadnova-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.py6
-rw-r--r--nova/virt/libvirt/driver.py7
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