mirror of
https://github.com/xen-project/xen.git
synced 2026-10-29 10:40:03 +01:00
Remove the watch on the /vm/<uuid> path when rebooting or migrating. We don't
want to end up with multiple watches on the same path, otherwise we get a watch event storm after many such reboots or migrates. Signed-off-by: Ewan Mellor <ewan@xensource.com>
This commit is contained in:
1 parent
6d3895e243
commit
13b9e071a3
1 file changed
+27
-8
@@ -775,7 +775,10 @@ class XendDomainInfo:
|
||||
if reason == 'suspend':
|
||||
self.state_set(STATE_DOM_SHUTDOWN)
|
||||
# Don't destroy the domain. XendCheckpoint will do
|
||||
# this once it has finished.
|
||||
# this once it has finished. However, stop watching
|
||||
# the VM path now, otherwise we will end up with one
|
||||
# watch for the old domain, and one for the new.
|
||||
self.unwatchVm()
|
||||
elif reason in ['poweroff', 'reboot']:
|
||||
restart_reason = reason
|
||||
else:
|
||||
@@ -1185,19 +1188,32 @@ class XendDomainInfo:
|
||||
def cleanupVm(self):
|
||||
"""Cleanup VM resources. Idempotent. Nothrow guarantee."""
|
||||
|
||||
try:
|
||||
try:
|
||||
if self.vmWatch:
|
||||
self.vmWatch.unwatch()
|
||||
self.vmWatch = None
|
||||
except:
|
||||
log.exception("Unwatching VM path failed.")
|
||||
self.unwatchVm()
|
||||
|
||||
try:
|
||||
self.removeVm()
|
||||
except:
|
||||
log.exception("Removing VM path failed.")
|
||||
|
||||
|
||||
## private:
|
||||
|
||||
def unwatchVm(self):
|
||||
"""Remove the watch on the VM path, if any. Idempotent. Nothrow
|
||||
guarantee."""
|
||||
|
||||
try:
|
||||
try:
|
||||
if self.vmWatch:
|
||||
self.vmWatch.unwatch()
|
||||
finally:
|
||||
self.vmWatch = None
|
||||
except:
|
||||
log.exception("Unwatching VM path failed.")
|
||||
|
||||
|
||||
## public:
|
||||
|
||||
def destroy(self):
|
||||
"""Cleanup VM and destroy domain. Nothrow guarantee."""
|
||||
|
||||
@@ -1351,6 +1367,7 @@ class XendDomainInfo:
|
||||
if rename:
|
||||
self.preserveForRestart()
|
||||
else:
|
||||
self.unwatchVm()
|
||||
self.destroyDomain()
|
||||
|
||||
# new_dom's VM will be the same as this domain's VM, except where
|
||||
@@ -1387,6 +1404,7 @@ class XendDomainInfo:
|
||||
log.info("Renaming dead domain %s (%d, %s) to %s (%s).",
|
||||
self.info['name'], self.domid, self.info['uuid'],
|
||||
new_name, new_uuid)
|
||||
self.unwatchVm()
|
||||
self.release_devices()
|
||||
self.info['name'] = new_name
|
||||
self.info['uuid'] = new_uuid
|
||||
@@ -1398,6 +1416,7 @@ class XendDomainInfo:
|
||||
def preserve(self):
|
||||
log.info("Preserving dead domain %s (%d).", self.info['name'],
|
||||
self.domid)
|
||||
self.unwatchVm()
|
||||
self.storeDom('xend/shutdown_completed', 'True')
|
||||
self.state_set(STATE_DOM_SHUTDOWN)
|
||||
|
||||
|
||||