Skip to contentSkip to conversation

restore name/uuid uniqueness check

PATCH In review Zhigang Wang 3 participants 5 messages Jan 23, 2008 – Jan 30, 2008

lore
Share & tools
lore
#0 lore raw

PATCH 1/1 restore name/uuid uniqueness check

hi all,

currently, if I restore a vm when the vm is running, it will cause two running vms with the same name/uuid (the second vm is not functional due to disk image in use).

# xm create OVM_EL5U1_X86_64_PVM_4GB
# xm list
Name                                        ID   Mem VCPUs      State   Time(s)
Domain-0                                     0   543     2     r-----    400.1
OVM_EL5U1_X86_64_PVM_4GB                     3   128     1     -b----     14.2
# xm save 3 /tmp/s1
# xm create OVM_EL5U1_X86_64_PVM_4GB
# xm restore /tmp/s1
# xm list
Name                                        ID   Mem VCPUs      State   Time(s)
Domain-0                                     0   543     2     r-----    411.6
OVM_EL5U1_X86_64_PVM_4GB                     4   128     1     -b----     15.3
OVM_EL5U1_X86_64_PVM_4GB                     5   128     1     -b----      0.7
# xm log
--snip--
[2008-01-23 05:13:57 2502] DEBUG (DevController:603) hotplugStatusCallback 5.
[2008-01-23 05:13:57 2502] ERROR (XendCheckpoint:286) Device 768 (vbd) could not be connected.
File /share/vm/OVM_EL5U1_X86_64_PVM_4GB/system.img is loopback-mounted through /dev/loop0,
which is mounted in a guest domain,
and so cannot be mounted now.
Traceback (most recent call last):
 File "/usr/lib/python2.4/site-packages/xen/xend/XendCheckpoint.py", line 284, in restore
   dominfo.waitForDevices() # Wait for backends to set up
 File "/usr/lib/python2.4/site-packages/xen/xend/XendDomainInfo.py", line 565, in waitForDevices
   self.getDeviceController(devclass).waitForDevices()
 File "/usr/lib/python2.4/site-packages/xen/xend/server/DevController.py", line 151, in waitForDevices
   return map(self.waitForDevice, self.deviceIDs())
 File "/usr/lib/python2.4/site-packages/xen/xend/server/DevController.py", line 186, in waitForDevice
   raise VmError("Device %s (%s) could not be connected.\n%s" %
VmError: Device 768 (vbd) could not be connected.
File /share/vm/OVM_EL5U1_X86_64_PVM_4GB/system.img is loopback-mounted through /dev/loop0,
which is mounted in a guest domain,
and so cannot be mounted now.
--snip--

if set the disk emulation mode to 'w!', both vms will be functional, but the filesystem will crash soon.

local live migration has this issue two.

this patch makes name/uuid uniqueness check when restore. but it will disable local migration.

please give some advice on resolving this problem while don't break local migration. if cannot find one, I prefer disable local migration.

thanks,

zhigang

tools/python/xen/xend/XendCheckpoint.py +7 -0
@@ -170,6 +170,13 @@ def restore(xd, fd, dominfo = None, paus
 
     vmconfig = p.get_val()
 
+    domconfig = XendConfig(sxp_obj = vmconfig)
+    othervm = xd.domain_lookup_nr(domconfig["name_label"])
+    if othervm is None or othervm.domid is None:
+        othervm = xd.domain_lookup_nr(domconfig["uuid"])
+    if othervm is not None and othervm.domid is not None: 
+        raise VmError("Domain '%s' already exists with ID '%d'" % (domconfig["name_label"], othervm.domid))
+
     if dominfo:
         dominfo.resume()
     else:

_______________________________________________
Xen-devel mailing list
[email protected]
http://lists.xensource.com/xen-devel

#1 lore raw
Quoted 7 lines · Zhigang Wang

local live migration has this issue two.

this patch makes name/uuid uniqueness check when restore. but it will disable local migration.

please give some advice on resolving this problem while don't break local migration. if cannot find one, I prefer disable local migration.

Since local migration is the sum total of our automated per-changeset testing of migration, disabling it is not going to happen.

Perhaps you can disable your uniqueness checks on migration?

-- Keir

#2 lore raw
Quoted 1 line · Keir Fraser

Perhaps you can disable your uniqueness checks on migration?

This is quite sensible actually, because a migration does not create or restart a new domain. It just relocates an already-running domain, to which uniqueness checks should already have been applied.

-- Keir

#3 lore raw
Quoted 11 lines · Keir Fraser
Quoted 1 line · Keir Fraser

Perhaps you can disable your uniqueness checks on migration?

This is quite sensible actually, because a migration does not create or restart a new domain. It just relocates an already-running domain, to which uniqueness checks should already have been applied.

-- Keir

this is a revised patch. I disable the uniqueness check by adding a extra parameter to domain_restore_fd.

have tested on xen-3.1-testing.

regards,

zhigang

tools/python/xen/xend/XendDomain.py +2 -2
@@ -1081,7 +1081,7 @@ class XendDomain:
             raise XendError("can't read guest state file %s: %s" %
                             (src, ex[1]))
 
-    def domain_restore_fd(self, fd, paused=False):
+    def domain_restore_fd(self, fd, paused=False, relocating=False):
         """Restore a domain from the given file descriptor.
 
         @param fd: file descriptor of the checkpoint file
@@ -1091,7 +1091,7 @@ class XendDomain:
         """
 
         try:
-            return XendCheckpoint.restore(self, fd, paused=paused)
+            return XendCheckpoint.restore(self, fd, paused=paused, relocating=relocating)
         except XendError, e:
             log.exception("Restore failed")
             raise
tools/python/xen/xend/XendCheckpoint.py +9 -1
@@ -150,7 +150,7 @@ def save(fd, dominfo, network, live, dst
         raise exn
 
 
-def restore(xd, fd, dominfo = None, paused = False):
+def restore(xd, fd, dominfo = None, paused = False, relocating = False):
     signature = read_exact(fd, len(SIGNATURE),
         "not a valid guest state file: signature read")
     if signature != SIGNATURE:
@@ -170,6 +170,14 @@ def restore(xd, fd, dominfo = None, paus
 
     vmconfig = p.get_val()
 
+    if not relocating:
+        domconfig = XendConfig(sxp_obj = vmconfig)
+        othervm = xd.domain_lookup_nr(domconfig["name_label"])
+        if othervm is None or othervm.domid is None:
+            othervm = xd.domain_lookup_nr(domconfig["uuid"])
+        if othervm is not None and othervm.domid is not None: 
+            raise VmError("Domain '%s' already exists with ID '%d'" % (domconfig["name_label"], othervm.domid))
+
     if dominfo:
         dominfo.resume()
     else:
tools/python/xen/xend/server/relocate.py +1 -1
@@ -108,7 +108,7 @@ class RelocationProtocol(protocol.Protoc
             self.send_reply(["ready", name])
             try:
                 XendDomain.instance().domain_restore_fd(
-                    self.transport.sock.fileno())
+                    self.transport.sock.fileno(), relocating=True)
             except:
                 self.send_error()
                 self.close()

_______________________________________________
Xen-devel mailing list
[email protected]
http://lists.xensource.com/xen-devel

#4 lore raw

what work does analysis_phase( ) do?

In reply to Zhigang Wang

hi
I read the code of xc_domain_save(), and i am confused about the
function of analysis_phase(xc_handle, dom, p2m_size, to_skip, 0) , what work does it do ?
could someone give me a help?

Thanks in advance