aboutsummaryrefslogtreecommitdiffstats
path: root/tools/xenmgr/lib/XendDomain.py
diff options
context:
space:
mode:
Diffstat (limited to 'tools/xenmgr/lib/XendDomain.py')
-rw-r--r--tools/xenmgr/lib/XendDomain.py32
1 files changed, 29 insertions, 3 deletions
diff --git a/tools/xenmgr/lib/XendDomain.py b/tools/xenmgr/lib/XendDomain.py
index 106af33b61..5c31079b2e 100644
--- a/tools/xenmgr/lib/XendDomain.py
+++ b/tools/xenmgr/lib/XendDomain.py
@@ -42,8 +42,13 @@ class XendDomain:
if xroot.get_rebooted():
print 'XendDomain> rebooted: removing all domain info'
self.rm_all()
+ eserver.subscribe('xend.virq', self.onVirq)
self.initial_refresh()
+ def onVirq(self, event, val):
+ print 'XendDomain> virq', val
+ self.reap()
+
def rm_all(self):
"""Remove all domain info. Used after reboot.
"""
@@ -136,13 +141,33 @@ class XendDomain:
def _delete_domain(self, id, notify=1):
if id in self.domain:
- self.domain[id].died()
if notify: eserver.inject('xend.domain.died', id)
del self.domain[id]
if id in self.domain_db:
del self.domain_db[id]
self.db.delete(id)
+ def reap(self):
+ print 'reap>'
+ domlist = xc.domain_getinfo()
+ casualties = []
+ for d in domlist:
+ print 'dom', d
+ dead = 0
+ dead = dead or (d['crashed'] or d['shutdown'])
+ dead = dead or (d['dying'] and
+ not(d['running'] or d['paused'] or d['blocked']))
+ if dead:
+ casualties.append(d)
+ for d in casualties:
+ id = str(d['dom'])
+ print 'died> id=', id, d
+ dominfo = self.domain.get(id)
+ if not dominfo: continue
+ dominfo.died()
+ self.domain_destroy(id, refresh=0)
+ print 'reap<'
+
def refresh(self):
"""Refresh domain list from Xen.
"""
@@ -169,6 +194,7 @@ class XendDomain:
d.update(dominfo)
else:
self._delete_domain(d.id)
+ self.reap()
def refresh_domain(self, id):
dom = int(id)
@@ -232,7 +258,7 @@ class XendDomain:
self.refresh()
return val
- def domain_destroy(self, id):
+ def domain_destroy(self, id, refresh=1):
"""Terminate domain immediately.
"""
dom = int(id)
@@ -240,7 +266,7 @@ class XendDomain:
return 0
eserver.inject('xend.domain.destroy', id)
val = xc.domain_destroy(dom=dom)
- self.refresh()
+ if refresh: self.refresh()
return val
def domain_migrate(self, id, dst):