# HG changeset patch
# User shand@xxxxxxxxxxxxxxxxxxxxxxxxxxx
# Node ID b26d8e1b443690049282c909a1ed41c3ba33bf5c
# Parent fb2fae2cc003e24bbfccedb8f8419ecc759e1a3b
Fix nasty tools race between barking xu_autoreap() and xpopen3.wait() -
save/restore now seems more robust from a tools pov at least.
Signed-off-by: Steven Hand <steven@xxxxxxxxxxxxx>
diff -r fb2fae2cc003 -r b26d8e1b4436 tools/libxc/xc_linux_save.c
--- a/tools/libxc/xc_linux_save.c Sun Aug 28 14:21:08 2005
+++ b/tools/libxc/xc_linux_save.c Mon Aug 29 05:40:36 2005
@@ -763,8 +763,6 @@
batch++;
}
-// DPRINTF("batch %d:%d (n=%d)\n", iter, batch, n);
-
if ( batch == 0 )
goto skip; /* vanishingly unlikely... */
@@ -915,7 +913,7 @@
continue;
}
- if ( last_iter ) break;
+ if ( last_iter ) break;
if ( live )
{
diff -r fb2fae2cc003 -r b26d8e1b4436 tools/python/xen/xend/XendCheckpoint.py
--- a/tools/python/xen/xend/XendCheckpoint.py Sun Aug 28 14:21:08 2005
+++ b/tools/python/xen/xend/XendCheckpoint.py Mon Aug 29 05:40:36 2005
@@ -51,7 +51,7 @@
p = select.poll()
p.register(child.fromchild.fileno())
p.register(child.childerr.fileno())
- while True:
+ while True:
r = p.poll()
for (fd, event) in r:
if not event & select.POLLIN:
@@ -69,8 +69,9 @@
try:
dominfo.db.releaseDomain(dominfo.id)
except Exception, ex:
- log.warning("error in domain release on xenstore:
%s",
- ex)
+ log.warning(
+ "error in domain release on xenstore: %s",
+ ex)
pass
dominfo.state_wait("suspended")
log.info("suspend %d done" % dominfo.id)
diff -r fb2fae2cc003 -r b26d8e1b4436 tools/python/xen/xend/server/SrvDaemon.py
--- a/tools/python/xen/xend/server/SrvDaemon.py Sun Aug 28 14:21:08 2005
+++ b/tools/python/xen/xend/server/SrvDaemon.py Mon Aug 29 05:40:36 2005
@@ -42,7 +42,8 @@
self.traceon = 0
self.tracefile = None
self.traceindent = 0
-
+ self.child = 0
+
def daemon_pids(self):
pids = []
pidex = '(?P<pid>\d+)'
@@ -140,15 +141,12 @@
else:
return 0
- def install_child_reaper(self):
- #signal.signal(signal.SIGCHLD, self.onSIGCHLD)
- # Ensure that zombie children are automatically reaped.
- xu.autoreap()
-
def onSIGCHLD(self, signum, frame):
- code = 1
- while code > 0:
- code = os.waitpid(-1, os.WNOHANG)
+ if self.child > 0:
+ try:
+ pid, sts = os.waitpid(self.child, os.WNOHANG)
+ except os.error, ex:
+ pass
def fork_pid(self, pidfile):
"""Fork and write the pid of the child to 'pidfile'.
@@ -156,13 +154,16 @@
@param pidfile: pid file
@return: pid of child in parent, 0 in child
"""
- pid = os.fork()
- if pid:
+
+ self.child = os.fork()
+
+ if self.child:
# Parent
pidfile = open(pidfile, 'w')
- pidfile.write(str(pid))
+ pidfile.write(str(self.child))
pidfile.close()
- return pid
+
+ return self.child
def daemonize(self):
if not XEND_DAEMONIZE: return
@@ -203,8 +204,7 @@
# Trying to run an already-running service is a success.
return 0
- self.install_child_reaper()
-
+ signal.signal(signal.SIGCHLD, self.onSIGCHLD)
if self.fork_pid(XEND_PID_FILE):
#Parent. Sleep to give child time to start.
time.sleep(1)
@@ -309,7 +309,7 @@
print >>sys.stderr, 'Exception starting xend:', ex
if XEND_DEBUG:
traceback.print_exc()
- log.exception("Exception starting xend")
+ log.exception("Exception starting xend (%s)" % ex)
self.exit(1)
def createFactories(self):
_______________________________________________
Xen-changelog mailing list
Xen-changelog@xxxxxxxxxxxxxxxxxxx
http://lists.xensource.com/xen-changelog
|