mirror of
https://github.com/xen-project/xen.git
synced 2026-10-29 10:40:03 +01:00
xend: Time-out if guest fails to suspend
If a guest fails to re-write control/shutdown node within a minute, fail the suspend operation. Signed-off-by: John Levon <john.levon@sun.com>
This commit is contained in:
1 parent
f87a6848fc
commit
e36d0b0d06
2 files changed
+26
-1
No files matched your search
@@ -114,7 +114,7 @@ def save(fd, dominfo, network, live, dst, checkpoint=False, node=-1):
|
||||
if line == "suspend":
|
||||
log.debug("Suspending %d ...", dominfo.getDomid())
|
||||
dominfo.shutdown('suspend')
|
||||
dominfo.waitForShutdown()
|
||||
dominfo.waitForSuspend()
|
||||
if line in ('suspend', 'suspended'):
|
||||
dominfo.migrateDevices(network, dst, DEV_MIGRATE_STEP2,
|
||||
domain_name)
|
||||
|
||||
@@ -2544,6 +2544,31 @@ class XendDomainInfo:
|
||||
finally:
|
||||
self.state_updated.release()
|
||||
|
||||
def waitForSuspend(self):
|
||||
"""Wait for the guest to respond to a suspend request by
|
||||
shutting down. If the guest hasn't re-written control/shutdown
|
||||
after a certain amount of time, it's obviously not listening and
|
||||
won't suspend, so we give up. HVM guests with no PV drivers
|
||||
should already be shutdown.
|
||||
"""
|
||||
state = "suspend"
|
||||
nr_tries = 60
|
||||
|
||||
self.state_updated.acquire()
|
||||
try:
|
||||
while self._stateGet() in (DOM_STATE_RUNNING,DOM_STATE_PAUSED):
|
||||
self.state_updated.wait(1.0)
|
||||
if state == "suspend":
|
||||
if nr_tries == 0:
|
||||
msg = ('Timeout waiting for domain %s to suspend'
|
||||
% self.domid)
|
||||
self._writeDom('control/shutdown', '')
|
||||
raise XendError(msg)
|
||||
state = self.readDom('control/shutdown')
|
||||
nr_tries -= 1
|
||||
finally:
|
||||
self.state_updated.release()
|
||||
|
||||
#
|
||||
# TODO: recategorise - called from XendCheckpoint
|
||||
#
|
||||
|
||||