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

[Xen-changelog] Rename all dying domains to be prefixed with Zombie. This allows a new domain



# HG changeset patch
# User emellor@ewan
# Node ID 0bc466c255605d0efeb4803626b72415839b9e6c
# Parent  1cfe0875658d5f83d38a5d96abe7a66e0d5db508
Rename all dying domains to be prefixed with Zombie.  This allows a new domain
to be created with the same name, fixing the race condition inside XendDomain
that caused bug #278.

Move the state_set(TERMINATED) call onto the end of cleanupDomain rather than
destroyDomain, so that this flag is set when XendDomain cleans up a domain
that was killed without going through Xend.

Remove is_terminated, as this check is no longer necessary, since we are using
Zombie prefixes instead.

Signed-off-by: Ewan Mellor <ewan@xxxxxxxxxxxxx>

diff -r 1cfe0875658d -r 0bc466c25560 tools/python/xen/xend/XendDomainInfo.py
--- a/tools/python/xen/xend/XendDomainInfo.py   Thu Oct  6 10:04:49 2005
+++ b/tools/python/xen/xend/XendDomainInfo.py   Thu Oct  6 10:09:14 2005
@@ -97,6 +97,7 @@
 DOMROOT = '/local/domain/'
 VMROOT  = '/vm/'
 
+ZOMBIE_PREFIX = 'Zombie-'
 
 xc = xen.lowlevel.xc.new()
 xroot = XendRoot.instance()
@@ -997,8 +998,6 @@
         dominfo = domain_by_name(name)
         if not dominfo:
             return
-        if dominfo.is_terminated():
-            return
         if self.domid is None:
             raise VmError("VM name '%s' already in use by domain %d" %
                           (name, dominfo.domid))
@@ -1100,6 +1099,14 @@
         except:
             log.exception("Removing domain path failed.")
 
+        try:
+            if not self.info['name'].startswith(ZOMBIE_PREFIX):
+                self.info['name'] = self.generateZombieName()
+        except:
+            log.exception("Renaming Zombie failed.")
+
+        self.state_set(STATE_VM_TERMINATED)
+
 
     def cleanupVm(self):
         """Cleanup VM resources.  Idempotent.  Nothrow guarantee."""
@@ -1123,23 +1130,15 @@
         log.debug("XendDomainInfo.destroyDomain(%s)", str(self.domid))
 
         self.cleanupDomain()
-        
+
         try:
             if self.domid is not None:
                 xc.domain_destroy(dom=self.domid)
         except:
             log.exception("XendDomainInfo.destroy: xc.domain_destroy failed.")
 
-        self.state_set(STATE_VM_TERMINATED)
-
 
     ## private:
-
-    def is_terminated(self):
-        """Check if a domain has been terminated.
-        """
-        return self.state == STATE_VM_TERMINATED
-
 
     def release_devices(self):
         """Release all domain's devices.  Nothrow guarantee."""
@@ -1353,6 +1352,18 @@
                 n += 1
 
 
+    def generateZombieName(self):
+        n = 0
+        name = ZOMBIE_PREFIX + self.info['name']
+        while True:
+            try:
+                self.check_name(name)
+                return name
+            except VmError:
+                n += 1
+                name = "%s%d-%s" % (ZOMBIE_PREFIX, n, self.info['name'])
+
+
     def configure_bootloader(self):
         if not self.info['bootloader']:
             return

_______________________________________________
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®.