diff options
Diffstat (limited to 'tools')
-rw-r--r-- | tools/python/xen/xend/XendCheckpoint.py | 2 | ||||
-rw-r--r-- | tools/python/xen/xend/XendDomainInfo.py | 25 |
2 files changed, 26 insertions, 1 deletions
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 # |