WARNING - OLD ARCHIVES

This is an archived copy of the Xen.org mailing list, which we have preserved to ensure that existing links to archives are not broken. The live archive, which contains the latest emails, can be found at http://lists.xen.org/
   
 
 
Xen 
 
Home Products Support Community News
 
   
 

xen-changelog

[Xen-changelog] XendDomain.py:

To: xen-changelog@xxxxxxxxxxxxxxxxxxx
Subject: [Xen-changelog] XendDomain.py:
From: BitKeeper Bot <riel@xxxxxxxxxxx>
Date: Wed, 25 May 2005 10:32:53 +0000
Delivery-date: Wed, 25 May 2005 11:01:24 +0000
Envelope-to: www-data@xxxxxxxxxxxxxxxxxxx
List-help: <mailto:xen-changelog-request@lists.xensource.com?subject=help>
List-id: BK change log <xen-changelog.lists.xensource.com>
List-post: <mailto:xen-changelog@lists.xensource.com>
List-subscribe: <http://lists.xensource.com/cgi-bin/mailman/listinfo/xen-changelog>, <mailto:xen-changelog-request@lists.xensource.com?subject=subscribe>
List-unsubscribe: <http://lists.xensource.com/cgi-bin/mailman/listinfo/xen-changelog>, <mailto:xen-changelog-request@lists.xensource.com?subject=unsubscribe>
Reply-to: Xen Development List <xen-devel@xxxxxxxxxxxxxxxxxxx>
Sender: xen-changelog-bounces@xxxxxxxxxxxxxxxxxxx
ChangeSet 1.1547, 2005/05/25 11:32:53+01:00, cl349@xxxxxxxxxxxxxxxxxxxx

        XendDomain.py:
          Improve error handling.
        XendCheckpoint.py:
          Switch restore to use os functions to read from the state file.
          Simplify code.
        Signed-off-by: Christian Limpach <Christian.Limpach@xxxxxxxxxxxx>



 XendCheckpoint.py |  145 ++++++++++++++++++++++++++----------------------------
 XendDomain.py     |   20 +++----
 2 files changed, 81 insertions(+), 84 deletions(-)


diff -Nru a/tools/python/xen/xend/XendCheckpoint.py 
b/tools/python/xen/xend/XendCheckpoint.py
--- a/tools/python/xen/xend/XendCheckpoint.py   2005-05-25 07:02:10 -04:00
+++ b/tools/python/xen/xend/XendCheckpoint.py   2005-05-25 07:02:10 -04:00
@@ -23,15 +23,23 @@
 sizeof_int = calcsize("i")
 sizeof_unsigned_long = calcsize("L")
 
+def write_exact(fd, buf, errmsg):
+    if os.write(fd, buf) != len(buf):
+        raise XendError(errmsg)
+
+def read_exact(fd, size, errmsg):
+    buf = os.read(fd, size)
+    if len(buf) != size:
+        raise XendError(errmsg)
+    return buf
+
 def save(xd, fd, dominfo):
-    if os.write(fd, SIGNATURE) != len(SIGNATURE):
-        raise XendError("could not write guest state file: signature")
+    write_exact(fd, SIGNATURE, "could not write guest state file: signature")
 
     config = sxp.to_string(dominfo.sxpr())
-    if os.write(fd, pack("!i", len(config))) != sizeof_int:
-        raise XendError("could not write guest state file: config len")
-    if os.write(fd, config) != len(config):
-        raise XendError("could not write guest state file: config")
+    write_exact(fd, pack("!i", len(config)),
+                "could not write guest state file: config len")
+    write_exact(fd, config, "could not write guest state file: config")
 
     cmd = [PATH_XC_SAVE, str(xc.handle()), str(fd),
            dominfo.id]
@@ -72,72 +80,61 @@
     return None
 
 def restore(xd, fd):
-    try:
-        signature = fd.read_exact(len(SIGNATURE),
-            "not a valid guest state file: signature read")
-        if signature != SIGNATURE:
-            raise XendError("not a valid guest state file: found '%s'" %
-                            signature)
-    
-        l = fd.read_exact(sizeof_int,
-                          "not a valid guest state file: config size read")
-        vmconfig_size = unpack("!i", l)[0]
-        vmconfig_buf = fd.read_exact(vmconfig_size,
-            "not a valid guest state file: config read")
-    
-        p = sxp.Parser()
-        p.input(vmconfig_buf)
-        if not p.ready:
-            raise XendError("not a valid guest state file: config parse")
-    
-        vmconfig = p.get_val()
-        dominfo = xd.domain_configure(vmconfig)
-    
-        l = fd.read_exact(sizeof_unsigned_long,
-                          "not a valid guest state file: pfn count read")
-        nr_pfns = unpack("=L", l)[0]   # XXX endianess
-        if nr_pfns > 1024*1024:     # XXX
-            raise XendError(
-                "not a valid guest state file: pfn count out of range")
-    
-        # XXXcl hack: fd.tell will sync up the object and
-        #             underlying file descriptor
-        ignore = fd.tell()
-    
-        cmd = [PATH_XC_RESTORE, str(xc.handle()), str(fd.fileno()),
-               dominfo.id, str(nr_pfns)]
-        log.info("[xc_restore] " + join(cmd))
-        child = xPopen3(cmd, True, -1, [fd.fileno(), xc.handle()])
-        child.tochild.close()
-    
-        lasterr = ""
-        p = select.poll()
-        p.register(child.fromchild.fileno())
-        p.register(child.childerr.fileno())
-        while True:
-            r = p.poll()
-            for (fd, event) in r:
-                if not event & select.POLLIN:
-                    continue
-                if fd == child.childerr.fileno():
-                    l = child.childerr.readline()
-                    log.error(l.rstrip())
-                    lasterr = l.rstrip()
-                if fd == child.fromchild.fileno():
-                    l = child.fromchild.readline()
-                    log.info(l.rstrip())
-            if filter(lambda (fd, event): event & select.POLLHUP, r):
-                break
-    
-        if child.wait() >> 8 == 127:
-            lasterr = "popen %s failed" % PATH_XC_RESTORE
-        if child.wait() != 0:
-            raise XendError("xc_restore failed: %s" % lasterr)
-    
-        return dominfo
+    signature = read_exact(fd, len(SIGNATURE),
+        "not a valid guest state file: signature read")
+    if signature != SIGNATURE:
+        raise XendError("not a valid guest state file: found '%s'" %
+                        signature)
+
+    l = read_exact(fd, sizeof_int,
+                   "not a valid guest state file: config size read")
+    vmconfig_size = unpack("!i", l)[0]
+    vmconfig_buf = read_exact(fd, vmconfig_size,
+        "not a valid guest state file: config read")
+
+    p = sxp.Parser()
+    p.input(vmconfig_buf)
+    if not p.ready:
+        raise XendError("not a valid guest state file: config parse")
+
+    vmconfig = p.get_val()
+    dominfo = xd.domain_configure(vmconfig)
+
+    l = read_exact(fd, sizeof_unsigned_long,
+                   "not a valid guest state file: pfn count read")
+    nr_pfns = unpack("=L", l)[0]   # XXX endianess
+    if nr_pfns > 1024*1024:     # XXX
+        raise XendError(
+            "not a valid guest state file: pfn count out of range")
+
+    cmd = [PATH_XC_RESTORE, str(xc.handle()), str(fd),
+           dominfo.id, str(nr_pfns)]
+    log.info("[xc_restore] " + join(cmd))
+    child = xPopen3(cmd, True, -1, [fd, xc.handle()])
+    child.tochild.close()
+
+    lasterr = ""
+    p = select.poll()
+    p.register(child.fromchild.fileno())
+    p.register(child.childerr.fileno())
+    while True:
+        r = p.poll()
+        for (fd, event) in r:
+            if not event & select.POLLIN:
+                continue
+            if fd == child.childerr.fileno():
+                l = child.childerr.readline()
+                log.error(l.rstrip())
+                lasterr = l.rstrip()
+            if fd == child.fromchild.fileno():
+                l = child.fromchild.readline()
+                log.info(l.rstrip())
+        if filter(lambda (fd, event): event & select.POLLHUP, r):
+            break
+
+    if child.wait() >> 8 == 127:
+        lasterr = "popen %s failed" % PATH_XC_RESTORE
+    if child.wait() != 0:
+        raise XendError("xc_restore failed: %s" % lasterr)
 
-    except IOError, ex:
-        if ex.errno == errno.ENOENT:
-            raise XendError("can't open guest state file %s" % src)
-        else:
-            raise
+    return dominfo
diff -Nru a/tools/python/xen/xend/XendDomain.py 
b/tools/python/xen/xend/XendDomain.py
--- a/tools/python/xen/xend/XendDomain.py       2005-05-25 07:02:10 -04:00
+++ b/tools/python/xen/xend/XendDomain.py       2005-05-25 07:02:10 -04:00
@@ -5,6 +5,7 @@
  Nothing here is persistent (across reboots).
  Needs to be persistent for one uptime.
 """
+import errno
 import os
 import scheduler
 import sys
@@ -323,16 +324,14 @@
         @param progress: output progress if true
         """
 
-        class XendFile(file):
-            def read_exact(self, size, error_msg):
-                buf = self.read(size)
-                if len(buf) != size:
-                    raise XendError(error_msg)
-                return buf
+        try:
+            fd = os.open(src, os.O_RDONLY)
 
-        fd = XendFile(src, 'rb')
+            return XendCheckpoint.restore(self, fd)
 
-        return XendCheckpoint.restore(self, fd)
+        except OSError, ex:
+            raise XendError("can't read guest state file %s: %s" %
+                            (src, ex[1]))
 
     def domain_get(self, id):
         """Get up-to-date info about a domain.
@@ -530,8 +529,9 @@
 
             return XendCheckpoint.save(self, fd, dominfo)
 
-        except:
-            raise
+        except OSError, ex:
+            raise XendError("can't write guest state file %s: %s" %
+                            (dst, ex[1]))
 
     def domain_pincpu(self, id, vcpu, cpumap):
         """Set which cpus vcpu can use

_______________________________________________
Xen-changelog mailing list
Xen-changelog@xxxxxxxxxxxxxxxxxxx
http://lists.xensource.com/xen-changelog

<Prev in Thread] Current Thread [Next in Thread>