mirror of
https://github.com/xen-project/xen.git
synced 2026-10-29 10:40:03 +01:00
merge?
This commit is contained in:
commit
2ba4b43df9
9 files changed
+86
-26
No files matched your search
@@ -220,6 +220,9 @@ static PyObject *pyxc_domain_getinfo(PyObject *self,
|
||||
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++ )
|
||||
|
||||
@@ -273,6 +273,9 @@ class HttpServer:
|
||||
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 @@ class HttpServer:
|
||||
def run(self):
|
||||
self.bind()
|
||||
self.listen()
|
||||
self.ready = True
|
||||
self.requestLoop()
|
||||
|
||||
def stop(self):
|
||||
|
||||
@@ -18,6 +18,7 @@
|
||||
import sys
|
||||
import socket
|
||||
import types
|
||||
import time
|
||||
|
||||
from connection import *
|
||||
from protocol import *
|
||||
@@ -35,8 +36,25 @@ class TCPListener(SocketListener):
|
||||
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):
|
||||
|
||||
@@ -110,9 +110,13 @@ def dom_get(dom):
|
||||
@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 @@ class XendDomainInfo:
|
||||
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']
|
||||
|
||||
|
||||
@@ -137,13 +137,6 @@ class Daemon:
|
||||
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 @@ class Daemon:
|
||||
# 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 @@ class Daemon:
|
||||
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 @@ class Daemon:
|
||||
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):
|
||||
|
||||
@@ -48,6 +48,7 @@ from xen.xend import XendRoot; xroot = XendRoot.instance()
|
||||
from xen.xend import Vifctl
|
||||
from xen.xend.XendLogging import log
|
||||
from xen.web.SrvDir import SrvDir
|
||||
import time
|
||||
|
||||
from SrvRoot import SrvRoot
|
||||
|
||||
@@ -59,7 +60,7 @@ class XendServers:
|
||||
def add(self, server):
|
||||
self.servers.append(server)
|
||||
|
||||
def start(self):
|
||||
def start(self, status):
|
||||
Vifctl.network('start')
|
||||
threads = []
|
||||
for server in self.servers:
|
||||
@@ -67,6 +68,25 @@ class XendServers:
|
||||
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()
|
||||
|
||||
|
||||