aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorkaf24@firebug.cl.cam.ac.uk <kaf24@firebug.cl.cam.ac.uk>2005-08-11 21:02:51 +0000
committerkaf24@firebug.cl.cam.ac.uk <kaf24@firebug.cl.cam.ac.uk>2005-08-11 21:02:51 +0000
commitf1e7438c3516cf3f98964b172b2da59567d93971 (patch)
treee7951fb366b23539c676f0a7cde584d667e6d071
parent55aaa284cf2c175c98c8f88249a804733e355735 (diff)
downloadxen-f1e7438c3516cf3f98964b172b2da59567d93971.tar.gz
xen-f1e7438c3516cf3f98964b172b2da59567d93971.tar.bz2
xen-f1e7438c3516cf3f98964b172b2da59567d93971.zip
Handle VMX domains correctly across xend restarts
This patch remembers the device model pid across xend restarts and avoids creating duplicate device model processes. Also, device models don't inherit socket fds from xend (which are closed on exec now), which used to prevent xend restarting. Signed-off-by: Yunhong Jiang <yunhong.jiang@intel.com> Signed-off-by: Xiaohui Xin <xiaohui.xin@intel.com> Signed-off-by: Arun Sharma <arun.sharma@intel.com>
-rw-r--r--tools/python/xen/web/connection.py4
-rw-r--r--tools/python/xen/web/reactor.py2
-rw-r--r--tools/python/xen/web/tcp.py3
-rw-r--r--tools/python/xen/xend/XendDomainInfo.py7
-rw-r--r--tools/python/xen/xend/image.py6
-rw-r--r--tools/python/xen/xend/server/relocate.py3
6 files changed, 21 insertions, 4 deletions
diff --git a/tools/python/xen/web/connection.py b/tools/python/xen/web/connection.py
index 73607d3a60..9c526bd341 100644
--- a/tools/python/xen/web/connection.py
+++ b/tools/python/xen/web/connection.py
@@ -20,6 +20,7 @@ import sys
import threading
import select
import socket
+import fcntl
from errno import EAGAIN, EINTR, EWOULDBLOCK
@@ -152,6 +153,9 @@ class SocketListener:
def createSocket(self):
raise NotImplementedError()
+ def setCloExec(self):
+ fcntl.fcntl(self.sock.fileno(), fcntl.F_SETFD, fcntl.FD_CLOEXEC)
+
def acceptConnection(self, sock, protocol, addr):
return SocketServerConnection(sock, protocol, addr, self)
diff --git a/tools/python/xen/web/reactor.py b/tools/python/xen/web/reactor.py
index 540354f27b..2be9126988 100644
--- a/tools/python/xen/web/reactor.py
+++ b/tools/python/xen/web/reactor.py
@@ -16,4 +16,4 @@
#============================================================================
from unix import listenUNIX, connectUNIX
-from tcp import listenTCP, connectTCP
+from tcp import listenTCP, connectTCP, SetCloExec
diff --git a/tools/python/xen/web/tcp.py b/tools/python/xen/web/tcp.py
index ce3c12ec57..ed57d45159 100644
--- a/tools/python/xen/web/tcp.py
+++ b/tools/python/xen/web/tcp.py
@@ -85,6 +85,9 @@ def listenTCP(port, factory, interface='', backlog=None):
l.startListening()
return l
+def SetCloExec(SocketListener):
+ SocketListener.SetCloExec()
+
def connectTCP(host, port, factory, timeout=None, bindAddress=None):
c = TCPConnector(host, port, factory, timeout=timeout, bindAddress=bindAddress)
c.connect()
diff --git a/tools/python/xen/xend/XendDomainInfo.py b/tools/python/xen/xend/XendDomainInfo.py
index 1ec8ce2d60..52fba1c4ca 100644
--- a/tools/python/xen/xend/XendDomainInfo.py
+++ b/tools/python/xen/xend/XendDomainInfo.py
@@ -231,6 +231,7 @@ class XendDomainInfo:
DBVar('restart_time', ty='float'),
DBVar('restart_count', ty='int'),
DBVar('target', ty='long', path="memory/target"),
+ DBVar('device_model_pid', ty='int'),
]
def __init__(self, db):
@@ -275,6 +276,7 @@ class XendDomainInfo:
self.vcpus = 1
self.vcpusdb = {}
self.bootloader = None
+ self.device_model_pid = 0
def setDB(self, db):
self.db = db
@@ -457,6 +459,8 @@ class XendDomainInfo:
sxpr.append(devs)
if self.config:
sxpr.append(['config', self.config])
+ if self.device_model_pid:
+ sxpr.append(['device_model_pid',self.device_model_pid])
return sxpr
def sxpr_devices(self):
@@ -739,7 +743,8 @@ class XendDomainInfo:
ctrl.initController(reboot=True)
else:
self.create_configured_devices()
- self.image.createDeviceModel()
+ if not self.device_model_pid:
+ self.device_model_pid = self.image.createDeviceModel()
def device_create(self, dev_config):
"""Create a new device.
diff --git a/tools/python/xen/xend/image.py b/tools/python/xen/xend/image.py
index 908299d626..afa6d1da99 100644
--- a/tools/python/xen/xend/image.py
+++ b/tools/python/xen/xend/image.py
@@ -262,7 +262,7 @@ class VmxImageHandler(ImageHandler):
memmap = None
memmap_value = []
device_channel = None
-
+ pid = 0
def createImage(self):
"""Create a VM for the VMX environment.
"""
@@ -379,6 +379,7 @@ class VmxImageHandler(ImageHandler):
log.info("spawning device models: %s %s", device_model, args)
self.pid = os.spawnve(os.P_NOWAIT, device_model, args, env)
log.info("device model pid: %d", self.pid)
+ return self.pid
def vncParams(self):
# see if a vncviewer was specified
@@ -398,8 +399,11 @@ class VmxImageHandler(ImageHandler):
def destroy(self):
channel.eventChannelClose(self.device_channel)
import signal
+ if not self.pid:
+ self.pid = self.vm.device_model_pid
os.kill(self.pid, signal.SIGKILL)
(pid, status) = os.waitpid(self.pid, 0)
+ self.pid = 0
def getDomainMemory(self, mem_mb):
# for ioreq_t and xenstore
diff --git a/tools/python/xen/xend/server/relocate.py b/tools/python/xen/xend/server/relocate.py
index d19ec7c29e..01995193c9 100644
--- a/tools/python/xen/xend/server/relocate.py
+++ b/tools/python/xen/xend/server/relocate.py
@@ -140,7 +140,8 @@ def listenRelocation():
if xroot.get_xend_relocation_server():
port = xroot.get_xend_relocation_port()
interface = xroot.get_xend_relocation_address()
- reactor.listenTCP(port, factory, interface=interface)
+ l = reactor.listenTCP(port, factory, interface=interface)
+ l.setCloExec()
def setupRelocation(dst, port):
try: