[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [Xen-changelog] Fix nasty tools race between barking xu_autoreap() and xpopen3.wait() -
# 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
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |