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@xensource.com>
This commit is contained in:
emellor@ewan committed 2005-10-06 11:09:14 +01:00
1 parent 435cc5366c
commit 0465a697d3
1 file changed
+22 -11
+22 -11
View File
@@ -97,6 +97,7 @@ SHUTDOWN_TIMEOUT = 30
DOMROOT = '/local/domain/'
VMROOT = '/vm/'
ZOMBIE_PREFIX = 'Zombie-'
xc = xen.lowlevel.xc.new()
xroot = XendRoot.instance()
@@ -997,8 +998,6 @@ class XendDomainInfo:
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 @@ class XendDomainInfo:
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,24 +1130,16 @@ class XendDomainInfo:
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 @@ class XendDomainInfo:
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
Reference in new issue
Block a user
Blocking a user prevents them from interacting with repositories, such as opening or commenting on pull requests or issues. Learn more about blocking a user.