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>
This commit is contained in:
adsharma@los-vmm.sc.intel.com committed 2005-08-09 11:06:44 -08:00
1 parent 886d6d4581
commit c7876d9e88
6 files changed
+21 -4

No files matched your search

+4
View File
@@ -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)
+1 -1
View File
@@ -16,4 +16,4 @@
#============================================================================
from unix import listenUNIX, connectUNIX
from tcp import listenTCP, connectTCP
from tcp import listenTCP, connectTCP, SetCloExec
+3
View File
@@ -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()
+6 -1
View File
@@ -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.
+5 -1
View File
@@ -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.
"""
@@ -369,6 +369,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
@@ -388,8 +389,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):
return (mem_mb * 1024) + self.getPageTableSize(mem_mb)
+2 -1
View File
@@ -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:
Reference in new issue
Block a user
Blocking a user prevents them from interacting with repositories, such as opening or commenting on pull requests or issues. Learn more about blocking a user.