[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [Xen-changelog] Make sure xend start doesn't return until xend is ready to accept connections.
# HG changeset patch # User shand@xxxxxxxxxxxxxxxxxxxxxxxxxxx # Node ID 7985a4d8bae9e8f618215d8da427320a8943b507 # Parent 3a79e8b289996d9ca7c9aca10d4792a214976c9f Make sure xend start doesn't return until xend is ready to accept connections. This means xend start && xm list actually works now (instead of throwing an exception). Signed-off-by: Anthony Liguori <aliguori@xxxxxxxxxx> diff -r 3a79e8b28999 -r 7985a4d8bae9 tools/misc/xend --- a/tools/misc/xend Thu Sep 15 01:07:33 2005 +++ b/tools/misc/xend Thu Sep 15 01:45:51 2005 @@ -86,9 +86,6 @@ daemon = SrvDaemon.instance() if not sys.argv[1:]: print 'usage: %s {start|stop|restart}' % sys.argv[0] - elif os.fork(): - pid, status = os.wait() - return status >> 8 elif sys.argv[1] == 'start': start_xenstored() start_consoled() diff -r 3a79e8b28999 -r 7985a4d8bae9 tools/python/xen/web/httpserver.py --- a/tools/python/xen/web/httpserver.py Thu Sep 15 01:07:33 2005 +++ b/tools/python/xen/web/httpserver.py Thu Sep 15 01:45:51 2005 @@ -273,6 +273,9 @@ self.interface = interface self.port = port self.root = root + # ready indicates when we are ready to begin accept connections + # it should be set after a successful bind + self.ready = False def getRoot(self): return self.root @@ -283,6 +286,7 @@ def run(self): self.bind() self.listen() + self.ready = True self.requestLoop() def stop(self): diff -r 3a79e8b28999 -r 7985a4d8bae9 tools/python/xen/xend/server/SrvDaemon.py --- a/tools/python/xen/xend/server/SrvDaemon.py Thu Sep 15 01:07:33 2005 +++ b/tools/python/xen/xend/server/SrvDaemon.py Thu Sep 15 01:45:51 2005 @@ -137,13 +137,6 @@ else: return 0 - def onSIGCHLD(self, signum, frame): - 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'. @@ -200,15 +193,29 @@ # Trying to run an already-running service is a success. return 0 - signal.signal(signal.SIGCHLD, self.onSIGCHLD) + ret = 0 + + # we use a pipe to communicate between the parent and the child process + # this way we know when the child has actually initialized itself so + # we can avoid a race condition during startup + + r,w = os.pipe() if self.fork_pid(XEND_PID_FILE): - #Parent. Sleep to give child time to start. - time.sleep(1) + os.close(w) + r = os.fdopen(r, 'r') + s = r.read() + r.close() + if not len(s): + ret = 1 + else: + ret = int(s) else: + os.close(r) # Child self.tracing(trace) - self.run() - return 0 + self.run(os.fdopen(w, 'w')) + + return ret def tracing(self, traceon): """Turn tracing on or off. @@ -290,7 +297,7 @@ def stop(self): return self.cleanup(kill=True) - def run(self): + def run(self, status): _enforce_dom0_cpus() try: log.info("Xend Daemon started") @@ -298,12 +305,14 @@ relocate.listenRelocation() servers = SrvServer.create() self.daemonize() - servers.start() + servers.start(status) except Exception, ex: print >>sys.stderr, 'Exception starting xend:', ex if XEND_DEBUG: traceback.print_exc() log.exception("Exception starting xend (%s)" % ex) + status.write('1') + status.close() self.exit(1) def exit(self, rc=0): diff -r 3a79e8b28999 -r 7985a4d8bae9 tools/python/xen/xend/server/SrvServer.py --- a/tools/python/xen/xend/server/SrvServer.py Thu Sep 15 01:07:33 2005 +++ b/tools/python/xen/xend/server/SrvServer.py Thu Sep 15 01:45:51 2005 @@ -48,6 +48,7 @@ from xen.xend import Vifctl from xen.xend.XendLogging import log from xen.web.SrvDir import SrvDir +import time from SrvRoot import SrvRoot @@ -59,13 +60,32 @@ def add(self, server): self.servers.append(server) - def start(self): + def start(self, status): Vifctl.network('start') threads = [] for server in self.servers: thread = Thread(target=server.run) thread.start() threads.append(thread) + + + # check for when all threads have initialized themselves and then + # close the status pipe + + threads_left = True + while threads_left: + threads_left = False + + for server in self.servers: + if not server.ready: + threads_left = True + break + + if threads_left: + time.sleep(.5) + + status.write('0') + status.close() for t in threads: t.join() _______________________________________________ Xen-changelog mailing list Xen-changelog@xxxxxxxxxxxxxxxxxxx http://lists.xensource.com/xen-changelog
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |