From e36d0b0d060d336e38c4897b9f10f2e55ed940a7 Mon Sep 17 00:00:00 2001 From: Keir Fraser Date: Thu, 12 Mar 2009 11:00:52 +0000 Subject: [PATCH] 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 --- tools/python/xen/xend/XendCheckpoint.py | 2 +- tools/python/xen/xend/XendDomainInfo.py | 25 +++++++++++++++++++++++++ 2 files changed, 26 insertions(+), 1 deletion(-) diff --git a/tools/python/xen/xend/XendCheckpoint.py b/tools/python/xen/xend/XendCheckpoint.py index a333b581e6..a0ea011665 100644 --- a/tools/python/xen/xend/XendCheckpoint.py +++ b/tools/python/xen/xend/XendCheckpoint.py @@ -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) diff --git a/tools/python/xen/xend/XendDomainInfo.py b/tools/python/xen/xend/XendDomainInfo.py index 88a2c2f5eb..4ec5679fb8 100644 --- a/tools/python/xen/xend/XendDomainInfo.py +++ b/tools/python/xen/xend/XendDomainInfo.py @@ -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 # -- 2.30.2