# HG changeset patch
# User kaf24@xxxxxxxxxxxxxxxxxxxx
# Node ID 3233e7ecfa9f98616a0b5514eabf58dd56b5052b
# Parent 55bc6698c889e8b9b2c85269f142821088cab2ea
# Parent 2f11c5b3c5866e6ee160ba0685fe0d31e68153dd
merge?
diff -r 55bc6698c889 -r 3233e7ecfa9f
linux-2.6-xen-sparse/arch/xen/configs/xen_defconfig_x86_32
--- a/linux-2.6-xen-sparse/arch/xen/configs/xen_defconfig_x86_32 Thu Sep
15 00:00:23 2005
+++ b/linux-2.6-xen-sparse/arch/xen/configs/xen_defconfig_x86_32 Thu Sep
15 07:38:53 2005
@@ -372,7 +372,7 @@
#
CONFIG_ISAPNP=y
# CONFIG_PNPBIOS is not set
-CONFIG_PNPACPI=y
+# CONFIG_PNPACPI is not set
#
# Block devices
diff -r 55bc6698c889 -r 3233e7ecfa9f
linux-2.6-xen-sparse/include/asm-xen/asm-x86_64/mmu_context.h
--- a/linux-2.6-xen-sparse/include/asm-xen/asm-x86_64/mmu_context.h Thu Sep
15 00:00:23 2005
+++ b/linux-2.6-xen-sparse/include/asm-xen/asm-x86_64/mmu_context.h Thu Sep
15 07:38:53 2005
@@ -35,7 +35,7 @@
* of cr3/ldt (i.e., not in __switch_to).
*/
__asm__ __volatile__ (
- "movl %%es,%0 ; movl %%ds,%1 ; movl %%fs,%2 ; movl %%gs,%3"
+ "mov %%es,%0 ; mov %%ds,%1 ; mov %%fs,%2 ; mov %%gs,%3"
: "=m" (current->thread.es),
"=m" (current->thread.ds),
"=m" (current->thread.fsindex),
diff -r 55bc6698c889 -r 3233e7ecfa9f tools/misc/xend
--- a/tools/misc/xend Thu Sep 15 00:00:23 2005
+++ b/tools/misc/xend Thu Sep 15 07:38:53 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 55bc6698c889 -r 3233e7ecfa9f tools/python/xen/lowlevel/xc/xc.c
--- a/tools/python/xen/lowlevel/xc/xc.c Thu Sep 15 00:00:23 2005
+++ b/tools/python/xen/lowlevel/xc/xc.c Thu Sep 15 07:38:53 2005
@@ -220,6 +220,9 @@
return PyErr_NoMemory();
nr_doms = xc_domain_getinfo(xc->xc_handle, first_dom, max_doms, info);
+
+ if (nr_doms < 0)
+ return PyErr_SetFromErrno(xc_error);
list = PyList_New(nr_doms);
for ( i = 0 ; i < nr_doms; i++ )
diff -r 55bc6698c889 -r 3233e7ecfa9f tools/python/xen/web/httpserver.py
--- a/tools/python/xen/web/httpserver.py Thu Sep 15 00:00:23 2005
+++ b/tools/python/xen/web/httpserver.py Thu Sep 15 07:38:53 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 55bc6698c889 -r 3233e7ecfa9f tools/python/xen/web/tcp.py
--- a/tools/python/xen/web/tcp.py Thu Sep 15 00:00:23 2005
+++ b/tools/python/xen/web/tcp.py Thu Sep 15 07:38:53 2005
@@ -18,6 +18,7 @@
import sys
import socket
import types
+import time
from connection import *
from protocol import *
@@ -35,8 +36,25 @@
def createSocket(self):
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
- addr = (self.interface, self.port)
- sock.bind(addr)
+
+ # SO_REUSEADDR does not always ensure that we do not get an address
+ # in use error when restarted quickly
+ # we implement a timeout to try and avoid failing unnecessarily
+
+ timeout = time.time() + 30
+ again = True
+ while again and time.time() < timeout:
+ again = False
+ try:
+ sock.bind((self.interface, self.port))
+ except socket.error, (errno, strerrno):
+ if errno == 98:
+ again = True
+ else:
+ raise socket.error(errno, strerrno)
+ if again:
+ raise socket.error(98, "address in use")
+
return sock
def acceptConnection(self, sock, protocol, addr):
diff -r 55bc6698c889 -r 3233e7ecfa9f tools/python/xen/xend/XendDomainInfo.py
--- a/tools/python/xen/xend/XendDomainInfo.py Thu Sep 15 00:00:23 2005
+++ b/tools/python/xen/xend/XendDomainInfo.py Thu Sep 15 07:38:53 2005
@@ -110,9 +110,13 @@
@param dom: domain id
@return: info or None
"""
- domlist = xc.domain_getinfo(dom, 1)
- if domlist and dom == domlist[0]['dom']:
- return domlist[0]
+ try:
+ domlist = xc.domain_getinfo(dom, 1)
+ if domlist and dom == domlist[0]['dom']:
+ return domlist[0]
+ except Exception, err:
+ # ignore missing domain
+ log.exception("domain_getinfo(%d) failed, ignoring", dom)
return None
class XendDomainInfo:
@@ -349,7 +353,12 @@
def update(self, info=None):
"""Update with info from xc.domain_getinfo().
"""
- self.info = info or dom_get(self.domid)
+ if info:
+ self.info = info
+ else:
+ di = dom_get(self.domid)
+ if not di:
+ return
self.memory = self.info['mem_kb'] / 1024
self.ssidref = self.info['ssidref']
diff -r 55bc6698c889 -r 3233e7ecfa9f tools/python/xen/xend/server/SrvDaemon.py
--- a/tools/python/xen/xend/server/SrvDaemon.py Thu Sep 15 00:00:23 2005
+++ b/tools/python/xen/xend/server/SrvDaemon.py Thu Sep 15 07:38:53 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 55bc6698c889 -r 3233e7ecfa9f tools/python/xen/xend/server/SrvServer.py
--- a/tools/python/xen/xend/server/SrvServer.py Thu Sep 15 00:00:23 2005
+++ b/tools/python/xen/xend/server/SrvServer.py Thu Sep 15 07:38:53 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
|