Mailing List Archive

Refresh domain list periodically.
ChangeSet 1.1327.2.8, 2005/04/25 14:04:17+01:00, mjw@wray-m-3.hpl.hp.com

Refresh domain list periodically.
Signed-off-by: Mike Wray <mike.wray@hp.com>



XendDomain.py | 33 +++++++++++----------------------
server/SrvDaemon.py | 6 +++++-
server/channel.py | 8 ++++++++
3 files changed, 24 insertions(+), 23 deletions(-)


diff -Nru a/tools/python/xen/xend/XendDomain.py b/tools/python/xen/xend/XendDomain.py
--- a/tools/python/xen/xend/XendDomain.py 2005-05-13 16:04:15 -04:00
+++ b/tools/python/xen/xend/XendDomain.py 2005-05-13 16:04:15 -04:00
@@ -109,7 +109,7 @@
"""Event handler for virq.
"""
print 'onVirq>', val
- self.reap()
+ self.refresh_schedule(delay=0)

def schedule_later(self, _delay, _name, _fn, *args):
"""Schedule a function to be called later (if not already scheduled).
@@ -128,18 +128,6 @@
"""
self.scheduler.cancel(name)

- def reap_schedule(self, delay=1):
- """Schedule reap to be called later.
-
- @param delay: delay in seconds
- """
- self.schedule_later(delay, 'reap', self.reap)
-
- def reap_cancel(self):
- """Cancel any scheduled reap.
- """
- self.schedule_cancel('reap')
-
def refresh_schedule(self, delay=1):
"""Schedule refresh to be called later.

@@ -289,7 +277,6 @@
"""Look for domains that have crashed or stopped.
Tidy them up.
"""
- self.reap_cancel()
casualties = []
doms = self.xen_domains()
for d in doms.values():
@@ -311,7 +298,7 @@
log.debug('XendDomain>reap> domain died name=%s id=%s', name, id)
if d['shutdown']:
reason = XendDomainInfo.shutdown_reason(d['shutdown_reason'])
- log.debug('XendDomain>reap> shutdown id=%s reason=%s', id, reason)
+ log.debug('XendDomain>reap> shutdown name=%s id=%s reason=%s', name, id, reason)
if reason in ['suspend']:
if dominfo and dominfo.is_terminated():
log.debug('XendDomain>reap> Suspended domain died id=%s', id)
@@ -327,21 +314,24 @@
self.final_domain_destroy(id)
if self.domain_restarts_exist():
self.domain_restarts_schedule()
- if destroyed:
- self.refresh_schedule(delay=5)

def refresh(self):
"""Refresh domain list from Xen.
"""
self.refresh_cancel()
+ self.refresh_schedule(delay=10)
+ self.reap()
doms = self.xen_domains()
# Add entries for any domains we don't know about.
for (id, d) in doms.items():
if id not in self.domain_by_id:
- log.warning("Created entry for unknown domain: %s", id)
+ log.info("Creating entry for unknown domain: id=%s", id)
savedinfo = None
- dominfo = XendDomainInfo.vm_recreate(savedinfo, d)
- self._add_domain(dominfo)
+ try:
+ dominfo = XendDomainInfo.vm_recreate(savedinfo, d)
+ self._add_domain(dominfo)
+ except Exception, ex:
+ log.exception("Error creating domain info: id=%s", id)
# Remove entries for domains that no longer exist.
# Update entries for existing domains.
for d in self.domain_by_id.values():
@@ -352,7 +342,6 @@
pass
else:
self._delete_domain(d.id)
- self.reap_schedule(delay=1)

def update_domain(self, id):
"""Update the saved info for a domain.
@@ -416,7 +405,7 @@

@param dominfo: domain object
"""
- log.info("Restarting domain: id=%s name=%s", dominfo.id, dominfo.name)
+ log.info("Restarting domain: name=%s id=%s", dominfo.name, dominfo.id)
eserver.inject("xend.domain.restart",
[dominfo.name, dominfo.id, "begin"])
try:
diff -Nru a/tools/python/xen/xend/server/SrvDaemon.py b/tools/python/xen/xend/server/SrvDaemon.py
--- a/tools/python/xen/xend/server/SrvDaemon.py 2005-05-13 16:04:15 -04:00
+++ b/tools/python/xen/xend/server/SrvDaemon.py 2005-05-13 16:04:15 -04:00
@@ -41,8 +41,11 @@
"""The xend daemon.
"""
def __init__(self):
+ self.channelF = None
self.shutdown = 0
self.traceon = 0
+ self.tracefile = None
+ self.traceindent = 0

def daemon_pids(self):
pids = []
@@ -352,7 +355,8 @@

def exit(self, rc=0):
#reactor.disconnectAll()
- self.channelF.stop()
+ if self.channelF:
+ self.channelF.stop()
# Calling sys.exit() raises a SystemExit exception, which only
# kills the current thread. Calling os._exit() makes the whole
# Python process exit immediately. There doesn't seem to be another
diff -Nru a/tools/python/xen/xend/server/channel.py b/tools/python/xen/xend/server/channel.py
--- a/tools/python/xen/xend/server/channel.py 2005-05-13 16:04:15 -04:00
+++ b/tools/python/xen/xend/server/channel.py 2005-05-13 16:04:15 -04:00
@@ -6,6 +6,8 @@
import xen.lowlevel.xc; xc = xen.lowlevel.xc.new()
from xen.lowlevel import xu

+from xen.xend.XendLogging import log
+
from messages import *

VIRQ_MISDIRECT = 0 # Catch-all interrupt for unbound VIRQs.
@@ -74,6 +76,7 @@
def bind_virq(self, virq):
port = self.notifier.bind_virq(virq)
self.virqPorts[port] = virq
+ log.info("Virq %s on port %s", virq, port)

def virq(self):
self.notifier.virq_send(self.virqPort)
@@ -112,16 +115,21 @@
# Note we use keyword args to lambda to save the values -
# otherwise lambda will use the variables, which will get
# assigned by the loop and the lambda will get the changed values.
+ received = 0
for chan in self.channels.values():
if self.thread == None: return
msg = chan.readResponse()
if msg:
+ received += 1
chan.responseReceived(msg)
for chan in self.channels.values():
if self.thread == None: return
msg = chan.readRequest()
if msg:
+ received += 1
self.runInThread(lambda chan=chan, msg=msg: chan.requestReceived(msg))
+ if port and received == 0:
+ log.warning("Port %s notified, but no messages found", port)

def runInThread(self, thunk):
thread = threading.Thread(target = thunk)

_______________________________________________
Xen-changelog mailing list
Xen-changelog@lists.xensource.com
http://lists.xensource.com/xen-changelog