# HG changeset patch
# User cl349@xxxxxxxxxxxxxxxxxxxx
# Node ID c2558a2fe6585ec87db5f2f47595efcb13b6858b
# Parent 68c4eb06a6aa538ce3f318d01541cc032f50fd34
Switch to IntroduceDomain, move xend info into xend subdirectory in store.
Also switch store/console event channel and page reference store
entries over to xstransact.
Signed-off-by: Christian Limpach <Christian.Limpach@xxxxxxxxxxxx>
diff -r 68c4eb06a6aa -r c2558a2fe658 tools/python/xen/xend/XendCheckpoint.py
--- a/tools/python/xen/xend/XendCheckpoint.py Tue Sep 13 15:19:39 2005
+++ b/tools/python/xen/xend/XendCheckpoint.py Tue Sep 13 15:21:53 2005
@@ -13,6 +13,7 @@
from struct import pack, unpack, calcsize
from xen.util.xpopen import xPopen3
import xen.lowlevel.xc; xc = xen.lowlevel.xc.new()
+from xen.xend.xenstore.xsutil import IntroduceDomain
from XendError import XendError
from XendLogging import log
@@ -72,14 +73,6 @@
xd.domain_shutdown(dominfo.id, reason='suspend')
dominfo.state_wait("suspended")
log.info("suspend %d done" % dominfo.id)
- if dominfo.store_channel:
- try:
- dominfo.db.releaseDomain(dominfo.id)
- except Exception, ex:
- log.warning(
- "error in domain release on xenstore: %s",
- ex)
- pass
child.tochild.write("done\n")
child.tochild.flush()
if filter(lambda (fd, event): event & select.POLLHUP, r):
@@ -90,11 +83,7 @@
if child.wait() != 0:
raise XendError("xc_save failed: %s" % lasterr)
- if dominfo.store_channel:
- dominfo.store_channel.close()
- dominfo.db['store_channel'].delete()
- dominfo.db.saveDB(save=True)
- dominfo.store_channel = None
+ dominfo.setStoreChannel(None)
xd.domain_destroy(dominfo.id)
return None
@@ -163,16 +152,15 @@
m = re.match(r"^(store-mfn) (\d+)\n$", l)
if m:
if dominfo.store_channel:
- dominfo.store_mfn = int(m.group(2))
+ dominfo.setStoreRef(int(m.group(2)))
if dominfo.store_mfn >= 0:
- dominfo.db.introduceDomain(dominfo.id,
- dominfo.store_mfn,
-
dominfo.store_channel)
- dominfo.exportToDB(save=True, sync=True)
+ IntroduceDomain(dominfo.id,
+ dominfo.store_mfn,
+ dominfo.store_channel.port1,
+ dominfo.path)
m = re.match(r"^(console-mfn) (\d+)\n$", l)
if m:
- dominfo.console_mfn = int(m.group(2))
- dominfo.exportToDB(save=True, sync=True)
+ dominfo.setConsoleRef(int(m.group(2)))
try:
l = child.fromchild.readline()
except:
diff -r 68c4eb06a6aa -r c2558a2fe658 tools/python/xen/xend/XendDomain.py
--- a/tools/python/xen/xend/XendDomain.py Tue Sep 13 15:19:39 2005
+++ b/tools/python/xen/xend/XendDomain.py Tue Sep 13 15:21:53 2005
@@ -139,7 +139,7 @@
domdb.delete()
elif domid in doms:
try:
- self._new_domain(domdb, doms[domid])
+ self._new_domain(domdb['uuid'], domdb, doms[domid])
except Exception, ex:
log.exception("Error recreating domain info: id=%d", domid)
self._delete_domain(domid)
@@ -155,14 +155,14 @@
def close(self):
pass
- def _new_domain(self, db, info):
+ def _new_domain(self, uuid, db, info):
"""Create a domain entry from saved info.
@param db: saved info from the db
@param info: domain info from xen
@return: domain
"""
- dominfo = XendDomainInfo.recreate(db, info)
+ dominfo = XendDomainInfo.recreate(uuid, db, info)
self.domains[dominfo.id] = dominfo
return dominfo
@@ -355,8 +355,8 @@
log.info(
"Creating entry for unknown domain: id=%d uuid=%s",
id, uuid)
- db = self.dbmap.addChild(uuid)
- dominfo = XendDomainInfo.recreate(db, info)
+ db = self.dbmap.addChild("%s/xend" % uuid)
+ dominfo = XendDomainInfo.recreate(uuid, db, info)
dominfo.setdom(id)
self._add_domain(dominfo)
return dominfo
diff -r 68c4eb06a6aa -r c2558a2fe658 tools/python/xen/xend/XendDomainInfo.py
--- a/tools/python/xen/xend/XendDomainInfo.py Tue Sep 13 15:19:39 2005
+++ b/tools/python/xen/xend/XendDomainInfo.py Tue Sep 13 15:21:53 2005
@@ -48,6 +48,7 @@
from xen.xend.uuid import getUuid
from xen.xend.xenstore import DBVar, XenNode, DBMap
from xen.xend.xenstore.xstransact import xstransact
+from xen.xend.xenstore.xsutil import IntroduceDomain
"""Shutdown code for poweroff."""
DOMAIN_POWEROFF = 0
@@ -156,7 +157,7 @@
@raise: VmError for invalid configuration
"""
uuid = getUuid()
- db = parentdb.addChild(uuid)
+ db = parentdb.addChild("%s/xend" % uuid)
path = parentdb.getPath()
vm = cls(uuid, path, db)
vm.construct(config)
@@ -166,17 +167,19 @@
create = classmethod(create)
- def recreate(cls, db, info):
+ def recreate(cls, uuid, db, info):
"""Create the VM object for an existing domain.
@param db: domain db
@param info: domain info from xc
"""
dom = info['dom']
- path = "/".join(db.getPath().split("/")[0:-1])
- vm = cls(db.getName(), path, db)
+ path = "/".join(db.getPath().split("/")[0:-2])
+ vm = cls(uuid, path, db)
vm.setdom(dom)
- db.readDB()
+ try:
+ db.readDB()
+ except: pass
vm.importFromDB()
config = vm.config
log.debug('info=' + str(info))
@@ -208,7 +211,7 @@
"""
if not uuid:
uuid = getUuid()
- db = parentdb.addChild(uuid)
+ db = parentdb.addChild("%s/xend" % uuid)
path = parentdb.getPath()
vm = cls(uuid, path, db)
ssidref = int(sxp.child_value(config, 'ssidref'))
@@ -233,8 +236,6 @@
DBVar('config', ty='sxpr'),
DBVar('start_time', ty='float'),
DBVar('state', ty='str'),
- DBVar('store_mfn', ty='long'),
- DBVar('console_mfn', ty='long', path="console/ring-ref"),
DBVar('restart_mode', ty='str'),
DBVar('restart_state', ty='str'),
DBVar('restart_time', ty='float'),
@@ -299,18 +300,13 @@
self.db.saveDB(save=save, sync=sync)
def exportToDB(self, save=False, sync=False):
- if self.store_channel:
- self.store_channel.saveToDB(self.db.addChild("store_channel"),
- save=save)
- if self.console_channel:
- self.db['console/port'] = "%i" % self.console_channel.port1
if self.image:
self.image.exportToDB(save=save, sync=sync)
self.db.exportToDB(self, fields=self.__exports__, save=save, sync=sync)
def importFromDB(self):
self.db.importFromDB(self, fields=self.__exports__)
- self.store_channel = self.eventChannelOld("store_channel")
+ self.store_channel = self.eventChannel("store/port")
def setdom(self, dom):
"""Set the domain id.
@@ -330,11 +326,28 @@
def getName(self):
return self.name
- def getStoreChannel(self):
- return self.store_channel
-
- def getConsoleChannel(self):
- return self.console_channel
+ def setStoreRef(self, ref):
+ self.store_mfn = ref
+ if ref:
+ xstransact.Write(self.path, "store/ring-ref", "%i" % ref)
+ else:
+ xstransact.Remove(self.path, "store/ring-ref")
+
+ def setStoreChannel(self, channel):
+ if self.store_channel and self.store_channel != channel:
+ self.store_channel.close()
+ self.store_channel = channel
+ if channel:
+ xstransact.Write(self.path, "store/port", "%i" % channel.port1)
+ else:
+ xstransact.Remove(self.path, "store/port")
+
+ def setConsoleRef(self, ref):
+ self.console_mfn = ref
+ if ref:
+ xstransact.Write(self.path, "console/ring-ref", "%i" % ref)
+ else:
+ xstransact.Remove(self.path, "console/ring-ref")
def update(self, info=None):
"""Update with info from xc.domain_getinfo().
@@ -702,9 +715,8 @@
self.image.createImage()
self.exportToDB()
if self.store_channel and self.store_mfn >= 0:
- self.db.introduceDomain(self.id,
- self.store_mfn,
- self.store_channel)
+ IntroduceDomain(self.id, self.store_mfn, self.store_channel.port1,
+ self.path)
# get the configured value of vcpus and update store
self.exportVCPUSToDB(self.vcpus)
@@ -742,16 +754,7 @@
self.state = STATE_VM_TERMINATED
self.release_devices()
if self.store_channel:
- try:
- self.store_channel.close()
- self.store_channel = None
- except:
- pass
- try:
- self.db.releaseDomain(self.id)
- except Exception, ex:
- log.warning("error in domain release on xenstore: %s", ex)
- pass
+ self.setStoreChannel(None)
if self.console_channel:
# notify processes using this cosole?
try:
@@ -820,36 +823,27 @@
id, self.name, self.memory)
self.setdom(id)
- def eventChannelOld(self, key):
- """Create an event channel to the domain.
- If saved info is available recreate the channel.
-
- @param key db key for the saved data (if any)
- """
- db = self.db.addChild(key)
- return EventChannel.restoreFromDB(db, 0, self.id)
-
- def eventChannel(self, path=None, key=None):
+ def eventChannel(self, path=None):
"""Create an event channel to the domain.
@param path under which port is stored in db
"""
port = 0
- try:
- if path and key:
- if path:
- db = self.db.addChild(path)
- else:
- db = self.db
- port = int(db[key].getData())
- except: pass
- return EventChannel.interdomain(0, self.id, port1=port, port2=0)
+ if path:
+ try:
+ port = int(xstransact.Read(self.path, path))
+ except:
+ # if anything goes wrong, assume the port was not yet set
+ pass
+ ret = EventChannel.interdomain(0, self.id, port1=port, port2=0)
+ xstransact.Write(self.path, path, "%i" % ret.port1)
+ return ret
def create_channel(self):
"""Create the channels to the domain.
"""
- self.store_channel = self.eventChannelOld("store_channel")
- self.console_channel = self.eventChannel("console", "port")
+ self.store_channel = self.eventChannel("store/port")
+ self.console_channel = self.eventChannel("console/port")
def create_configured_devices(self):
devices = sxp.children(self.config, 'device')
@@ -1129,12 +1123,11 @@
def dom0_init_store(self):
if not self.store_channel:
- self.store_channel = self.eventChannelOld("store_channel")
+ self.store_channel = self.eventChannel("store/port")
self.store_mfn = xc.init_store(self.store_channel.port2)
if self.store_mfn >= 0:
- self.db.introduceDomain(self.id, self.store_mfn,
- self.store_channel)
- self.exportToDB(save=True, sync=True)
+ IntroduceDomain(self.id, self.store_mfn, self.store_channel.port1,
+ self.path)
# get run-time value of vcpus and update store
self.exportVCPUSToDB(dom_get(self.id)['vcpus'])
diff -r 68c4eb06a6aa -r c2558a2fe658 tools/python/xen/xend/image.py
--- a/tools/python/xen/xend/image.py Tue Sep 13 15:19:39 2005
+++ b/tools/python/xen/xend/image.py Tue Sep 13 15:21:53 2005
@@ -23,6 +23,7 @@
from xen.xend.XendError import VmError
from xen.xend.XendLogging import log
from xen.xend.xenstore import DBVar
+from xen.xend.xenstore.xstransact import xstransact
from xen.xend.server import channel
@@ -236,6 +237,12 @@
"""Extra cleanup on domain destroy (define in subclass if needed)."""
pass
+ def set_vminfo(self, d):
+ if d.has_key('store_mfn'):
+ self.vm.setStoreRef(d.get('store_mfn'))
+ if d.has_key('console_mfn'):
+ self.vm.setConsoleRef(d.get('console_mfn'))
+
addImageHandlerClass = ImageHandler.addImageHandlerClass
class LinuxImageHandler(ImageHandler):
@@ -270,8 +277,7 @@
flags = self.flags,
vcpus = self.vm.vcpus)
if isinstance(ret, dict):
- self.vm.store_mfn = ret.get('store_mfn')
- self.vm.console_mfn = ret.get('console_mfn')
+ self.set_vminfo(ret)
return 0
return ret
@@ -314,7 +320,7 @@
flags = self.flags,
vcpus = self.vm.vcpus)
if isinstance(ret, dict):
- self.vm.store_mfn = ret.get('store_mfn')
+ self.set_vminfo(ret)
return 0
return ret
_______________________________________________
Xen-changelog mailing list
Xen-changelog@xxxxxxxxxxxxxxxxxxx
http://lists.xensource.com/xen-changelog
|