From c9e3a237d72805c022b098345d1c4b39b2371570 Mon Sep 17 00:00:00 2001 From: "mjw@wray-m-3.hpl.hp.com" Date: Tue, 10 Aug 2004 10:14:28 +0000 Subject: [PATCH 1/3] bitkeeper revision 1.1159.13.1 (4118a004V4kwgoMR9dGS7kTWxK4rmg) Fix restart problem caused by old info in domain object. --- tools/python/xen/xend/XendDomainInfo.py | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/tools/python/xen/xend/XendDomainInfo.py b/tools/python/xen/xend/XendDomainInfo.py index dee5c1cdb2..04792c48eb 100644 --- a/tools/python/xen/xend/XendDomainInfo.py +++ b/tools/python/xen/xend/XendDomainInfo.py @@ -643,7 +643,11 @@ class XendDomainInfo: """ self.release_vifs() self.release_vbds() + self.devices = {} + self.device_index = {} + self.configs = [] + self.ipaddrs = [] def release_vifs(self): """Release vm virtual network devices (vifs). @@ -851,7 +855,7 @@ class XendDomainInfo: def restart_check(self): """Check if domain restart is OK. - To prevent restart loops, raise an error it is + To prevent restart loops, raise an error if it is less than MINIMUM_RESTART_TIME seconds since the last restart. """ tnow = time.time() From 32f81b2eea4aac91628808be50be189aaa207d55 Mon Sep 17 00:00:00 2001 From: "mjw@wray-m-3.hpl.hp.com" Date: Tue, 10 Aug 2004 10:15:57 +0000 Subject: [PATCH 2/3] bitkeeper revision 1.1159.13.2 (4118a05d8c-7rVahMVITdEqi_yjy1Q) Modify domain events, add an event when a suspend completes. --- tools/python/xen/xend/XendDomain.py | 15 +++++++++------ 1 file changed, 9 insertions(+), 6 deletions(-) diff --git a/tools/python/xen/xend/XendDomain.py b/tools/python/xen/xend/XendDomain.py index 72fa81f56c..dbf0ce6e90 100644 --- a/tools/python/xen/xend/XendDomain.py +++ b/tools/python/xen/xend/XendDomain.py @@ -199,7 +199,7 @@ class XendDomain: self.domain_db[info.id] = info.sxpr() self.domain_by_name[info.name] = info self.sync_domain(info.id) - if notify: eserver.inject('xend.domain.created', info.name) + if notify: eserver.inject('xend.domain.created', [info.name, info.id]) def _delete_domain(self, id, notify=1): """Remove a domain from the tables. @@ -209,7 +209,7 @@ class XendDomain: """ if id in self.domain_by_id: info = self.domain_by_id[id] - if notify: eserver.inject('xend.domain.died', info.name) + if notify: eserver.inject('xend.domain.died', [info.name, info.id]) if info.name in self.domain_by_name: del self.domain_by_name[info.name] del self.domain_by_id[id] @@ -239,6 +239,9 @@ class XendDomain: reason = XendDomainInfo.shutdown_reason(d['shutdown_reason']) log.debug('XendDomain>reap> shutdown id=%s reason=%s', id, reason) if reason in ['suspend']: + dominfo = self.domain_by_id.get(id) + name = (dominfo and dominfo.name) or '??' + eserver.inject('xend.domain.suspended', [name, id]) continue if reason in ['poweroff', 'reboot']: self.domain_restart_schedule(id, reason) @@ -421,7 +424,7 @@ class XendDomain: @param id: domain id """ dominfo = self.domain_lookup(id) - eserver.inject('xend.domain.unpause', dominfo.name) + eserver.inject('xend.domain.unpause', [dominfo.name, dominfo.id]) try: return xc.domain_unpause(dom=dominfo.dom) except Exception, ex: @@ -433,7 +436,7 @@ class XendDomain: @param id: domain id """ dominfo = self.domain_lookup(id) - eserver.inject('xend.domain.pause', dominfo.name) + eserver.inject('xend.domain.pause', [dominfo.name, dominfo.id]) try: return xc.domain_pause(dom=dominfo.dom) except Exception, ex: @@ -455,7 +458,7 @@ class XendDomain: self.domain_restart_cancel(dominfo.id) else: self.domain_restart_schedule(dominfo.id, reason, force=1) - eserver.inject('xend.domain.shutdown', [dominfo.name, reason]) + eserver.inject('xend.domain.shutdown', [dominfo.name, dominfo.id, reason]) if reason == 'halt': reason = 'poweroff' val = xend.domain_shutdown(dominfo.id, reason) @@ -535,7 +538,7 @@ class XendDomain: """ dominfo = self.domain_lookup(id) log.info('Destroying domain: name=%s', dominfo.name) - eserver.inject('xend.domain.destroy', dominfo.name) + eserver.inject('xend.domain.destroy', [dominfo.name, dominfo.id]) if dominfo: val = dominfo.destroy() else: From 65b26b87a2364deebb6503a4aa6fa536606d5025 Mon Sep 17 00:00:00 2001 From: "mjw@wray-m-3.hpl.hp.com" Date: Tue, 10 Aug 2004 10:26:00 +0000 Subject: [PATCH 3/3] bitkeeper revision 1.1159.13.3 (4118a2b8Vq29DYYv3u6Iy7NHB25wRw) Make the suspend callback for migrate/save wait until the domain is suspended. --- tools/python/xen/xend/XendMigrate.py | 52 +++++++++++++++++++++++----- 1 file changed, 44 insertions(+), 8 deletions(-) diff --git a/tools/python/xen/xend/XendMigrate.py b/tools/python/xen/xend/XendMigrate.py index 2e10cb8f75..6eaf0d1fba 100644 --- a/tools/python/xen/xend/XendMigrate.py +++ b/tools/python/xen/xend/XendMigrate.py @@ -107,6 +107,15 @@ class XfrdInfo: self.deferred.errback(err) def dispatch(self, xfrd, val): + + def cbok(v): + if v is None: return + sxp.show(v, out=xfrd.transport) + + def cberr(err): + v = ['xfr.err', errno.EINVAL] + sxp.show(v, out=xfrd.transport) + op = sxp.name(val) op = op.replace('.', '_') if op.startswith('xfr_'): @@ -114,8 +123,11 @@ class XfrdInfo: else: fn = self.unknown val = fn(xfrd, val) - if val is not None: - sxp.show(val, out=xfrd.transport) + if isinstance(val, defer.Deferred): + val.addCallback(cbok) + val.addErrback(cberr) + else: + cbok(val) def unknown(self, xfrd, val): print 'unknown>', val @@ -164,11 +176,40 @@ class XfrdInfo: return ['xfr.err', val] def xfr_vm_suspend(self, xfrd, val): + """Suspend a domain. Suspending takes time, so we return + a Deferred that is called when the suspend completes. + """ print 'xfr_vm_suspend>', val try: vmid = sxp.child0(val) + d = defer.Deferred() + # Subscribe to 'suspended' events so we can tell when the + # suspend completes. Subscribe to 'died' events so we can tell if + # the domain died. + def onSuspended(e, v): + print 'onSuspended>', e, v + if v[1] != vmid: return + subscribe(on=0) + d.callback(v) + + def onDied(e, v): + print 'onDied>', e, v + if v[1] != vmid: return + subscribe(on=0) + d.errback(XendError('Domain died')) + + def subscribe(on=1): + if on: + action = eserver.subscribe + else: + action = eserver.unsubscribe + action('xend.domain.suspended', onSuspended) + action('xend.domain.died', onDied) + + subscribe() val = self.xd.domain_shutdown(vmid, reason='suspend') self.suspended[vmid] = 1 + return d except: val = errno.EINVAL return ['xfr.err', val] @@ -216,8 +257,6 @@ class XendMigrateInfo(XfrdInfo): if not vmconfig: xfrd.loseConnection() return - self.xd.domain_pause(self.src_dom) - self.paused[self.src_dom] = 1 xfrd.request(['xfr.migrate', self.src_dom, vmconfig, @@ -266,14 +305,11 @@ class XendSaveInfo(XfrdInfo): if not vmconfig: xfrd.loseConnection() return - self.xd.domain_pause(self.src_dom) - self.paused[self.src_dom] = 1 xfrd.request(['xfr.save', self.src_dom, vmconfig, self.file ]) def xfr_save_ok(self, xfrd, val): - dom = int(sxp.child0(val)) self.state = 'ok' - self.xd_domain_destroy(self.src_dom) + self.xd.domain_destroy(self.src_dom) if not self.deferred.called: self.deferred.callback(self)