summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJenkins <jenkins@review.openstack.org>2013-01-25 03:53:41 +0000
committerGerrit Code Review <review@openstack.org>2013-01-25 03:53:41 +0000
commitfa0431c35091dc4bab818dbdab2c82e49bc917b4 (patch)
tree90aaf1f2b7d41633c0ff8929e139970087ec8fbd
parentf24cfa8093913466658a3ce2d9dc907c0c813239 (diff)
parent6344bff494758e0d7d7d25f43a3b56d82447441e (diff)
downloadnova-fa0431c35091dc4bab818dbdab2c82e49bc917b4.tar.gz
nova-fa0431c35091dc4bab818dbdab2c82e49bc917b4.tar.xz
nova-fa0431c35091dc4bab818dbdab2c82e49bc917b4.zip
Merge "Fix double reboot issue during soft reboot"
-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 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