# 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
|