[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[Xen-changelog] [xen-unstable] xend: Receive error message of migration from destination server



# HG changeset patch
# User Keir Fraser <keir.fraser@xxxxxxxxxx>
# Date 1253002847 -3600
# Node ID 045b2b8b522708093b91f883f1b7e7c1805f71e3
# Parent  848193b1ec26ccee37ffc7f953dce0ded04f90e0
xend: Receive error message of migration from destination server

The following error message was shown by xm migrate command.
In fact, I caused the command error by intention.  I prepared a
destination server where free memory was insufficient, and then
I tried to migrate a VM to the destination server.  As I had
expected, the command error occurred.  However the error message
was different from my expectation.  I would like to show an error
message from the destination server if an error occurred on the
destination server.

# xm migrate --live vm3 bx339
Error: (107, 'Transport endpoint is not connected')
Usage: xm migrate <Domain> <Host>

Migrate a domain to another machine.

Options:

-h, --help           Print this help.
-l, --live           Use live migration.
-p=3Dportnum, --port=3Dportnum
                     Use specified port for migration.
-n=3Dnodenum, --node=3Dnodenum
                     Use specified NUMA node on target.
-s, --ssl            Use ssl connection for migration.

If a destination server sends an error message, this patch shows=20
the error message.  For example, the following error message is=20
shown if free memory of the destination server is insufficient.

# xm migrate --live vm3 bx339
Error: I need 262144 KiB, but dom0_min_mem is 716800 and shrinking
to=20
716800 KiB would leave only 50368 KiB free. (from bx339)
Usage: xm migrate <Domain> <Host>

Migrate a domain to another machine.

Options:

-h, --help           Print this help.
-l, --live           Use live migration.
-p=3Dportnum, --port=3Dportnum
                     Use specified port for migration.
-n=3Dnodenum, --node=3Dnodenum
                     Use specified NUMA node on target.
-s, --ssl            Use ssl connection for migration.

Signed-off-by: Masaki Kanno <kanno.masaki@xxxxxxxxxxxxxx>
---
 tools/python/xen/xend/XendDomain.py |   73 +++++++++++++++++++++++++++++++++---
 1 files changed, 67 insertions(+), 6 deletions(-)

diff -r 848193b1ec26 -r 045b2b8b5227 tools/python/xen/xend/XendDomain.py
--- a/tools/python/xen/xend/XendDomain.py       Tue Sep 15 09:19:23 2009 +0100
+++ b/tools/python/xen/xend/XendDomain.py       Tue Sep 15 09:20:47 2009 +0100
@@ -28,6 +28,7 @@ import socket
 import socket
 import tempfile
 import threading
+import re
 
 import xen.lowlevel.xc
 
@@ -1350,10 +1351,40 @@ class XendDomain:
                              args=(sock, p2cread)).start()
 
             try:
-                XendCheckpoint.save(p2cwrite, dominfo, True, live, dst,
-                                    node=node)
+                try:
+                    XendCheckpoint.save(p2cwrite, dominfo, True, live, dst,
+                                        node=node)
+                except Exception, ex:
+                    m_dsterr = None
+                    try:
+                        sock.settimeout(3.0)
+                        dsterr = sock.recv(1024)
+                        sock.settimeout(None)
+                        if dsterr:
+                            # See send_error@xxxxxxxxxxxx If an error occurred
+                            # in a destination side, an error message with the
+                            # following form is returned from the destination
+                            # side.
+                            m_dsterr = \
+                                
re.match(r"^\(err\s\(type\s(.+)\)\s\(value\s'(.+)'\)\)", dsterr)
+                    except:
+                        # Probably socket.timeout exception occurred.
+                        # Ignore the exception because it has nothing to do 
with
+                        # an exception of XendCheckpoint.save.
+                        pass
+
+                    if m_dsterr:
+                        raise XendError("%s (from %s)" % (m_dsterr.group(2), 
dst))
+                    raise
             finally:
-                sock.shutdown(2)
+                try:
+                    sock.shutdown(2)
+                except:
+                    # Probably the socket is already disconnected by sock.close
+                    # in the destination side.
+                    # Ignore the exception because it has nothing to do with
+                    # an exception of XendCheckpoint.save.
+                    pass
                 sock.close()
 
             os.close(p2cread)
@@ -1376,10 +1407,40 @@ class XendDomain:
                 raise XendError("can't connect: %s" % err)
 
             try:
-                XendCheckpoint.save(sock.fileno(), dominfo, True, live,
-                                    dst, node=node)
+                try:
+                    XendCheckpoint.save(sock.fileno(), dominfo, True, live,
+                                        dst, node=node)
+                except Exception, ex:
+                    m_dsterr = None
+                    try:
+                        sock.settimeout(3.0)
+                        dsterr = sock.recv(1024)
+                        sock.settimeout(None)
+                        if dsterr:
+                            # See send_error@xxxxxxxxxxxx If an error occurred
+                            # in a destination side, an error message with the
+                            # following form is returned from the destination
+                            # side.
+                            m_dsterr = \
+                                
re.match(r"^\(err\s\(type\s(.+)\)\s\(value\s'(.+)'\)\)", dsterr)
+                    except:
+                        # Probably socket.timeout exception occurred.
+                        # Ignore the exception because it has nothing to do 
with
+                        # an exception of XendCheckpoint.save.
+                        pass
+
+                    if m_dsterr:
+                        raise XendError("%s (from %s)" % (m_dsterr.group(2), 
dst))
+                    raise
             finally:
-                sock.shutdown(2)
+                try:
+                    sock.shutdown(2)
+                except:
+                    # Probably the socket is already disconnected by sock.close
+                    # in the destination side.
+                    # Ignore the exception because it has nothing to do with
+                    # an exception of XendCheckpoint.save.
+                    pass
                 sock.close()
 
     def domain_save(self, domid, dst, checkpoint=False):

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


 


Rackspace

Lists.xenproject.org is hosted with RackSpace, monitoring our
servers 24x7x365 and backed by RackSpace's Fanatical Support®.