[NEW PATCH] BZ#717952 - Fix race in moveImage with overwrite of VM with several disks on NFS domains (via gerrit-bot)
Igor Lvovsky
ilvovsky at redhat.com
Sun Jul 3 15:14:33 UTC 2011
New patch submitted by Igor Lvovsky (ilvovsky at redhat.com)
You can review this change at: http://gerrit.usersys.redhat.com/646
commit 98ae8a04f3c055d648527e885a683ee79bd6d089
Author: Igor Lvovsky <ilvovsky at redhat.com>
Date: Thu Jun 30 18:01:27 2011 +0300
BZ#717952 - Fix race in moveImage with overwrite of VM with several disks on NFS domains
Change-Id: I367e83a700e84be0e4cb0ca5b7a02416cb54ac25
diff --git a/vdsm/storage/image.py b/vdsm/storage/image.py
index 714f725..1e39052 100644
--- a/vdsm/storage/image.py
+++ b/vdsm/storage/image.py
@@ -55,7 +55,7 @@ class Image:
Consist from chain of volumes.
"""
log = logging.getLogger('Storage.Image')
- _lock = threading.Lock()
+ _fakeTemplateLock = threading.Lock()
@classmethod
def createImageRollback(cls, taskObj, imageDir):
@@ -384,15 +384,18 @@ class Image:
self.log.error("Unexpected error", exc_info=True)
raise se.CouldNotValideTemplateOnTargetDomain("Template %s Destination domain %s: %s" % (pimg, dstSdUUID, str(e)))
- def __templateRelink(self, sdUUID, imgUUID, volUUID):
+ def __templateRelink(self, destDom, imgUUID, volUUID):
"""
Relink all hardlinks of the template 'volUUID' in all VMs based on it
"""
- destDom = SDF.produce(sdUUID)
# Avoid relink templates for SAN domains
if destDom.getStorageType() in [ sd.NFS_DOMAIN ]:
vol = destDom.produceVolume(imgUUID=imgUUID, volUUID=volUUID)
- chList = vol.getAllChildrenList(self.repoPath, sdUUID, imgUUID, volUUID)
+ # Relink templates only
+ if not vol.isShared():
+ self.log.debug("Doesn't relink regular volume %s of image %s", volUUID, imgUUID)
+ return
+ chList = vol.getAllChildrenList(self.repoPath, destDom.sdUUID, imgUUID, volUUID)
for ch in chList:
# Remove hardlink of this template
v = destDom.produceVolume(imgUUID=ch['imgUUID'], volUUID=volUUID)
@@ -400,7 +403,7 @@ class Image:
# Now we should re-link deleted hardlink, if exists
newVol = destDom.produceVolume(imgUUID=imgUUID, volUUID=volUUID)
- imageDir = self.getImageDir(sdUUID, ch['imgUUID'])
+ imageDir = self.getImageDir(destDom.sdUUID, ch['imgUUID'])
newVol.share(imageDir)
else:
self.log.debug("Doesn't relink templates non-NFS domain %s", destDom.sdUUID)
@@ -409,8 +412,7 @@ class Image:
"""
Create fake template (relevant for Backup domain only)
"""
- try:
- self._lock.acquire()
+ with self._fakeTemplateLock:
try:
destDom = SDF.produce(sdUUID)
volclass = destDom.getVolumeClass()
@@ -430,14 +432,12 @@ class Image:
# Mark fake volume as shared
vol.setShared()
# Now we should re-link all hardlinks of this template in all VMs based on it
- self.__templateRelink(sdUUID, volParams['imgUUID'], volParams['volUUID'])
+ self.__templateRelink(destDom, volParams['imgUUID'], volParams['volUUID'])
self.log.debug("Succeeded to create fake image %s in domain %s", volParams['imgUUID'], destDom.sdUUID)
except Exception:
self.log.error("Failure to create fake image %s in domain %s", volParams['imgUUID'],
destDom.sdUUID, exc_info=True)
- finally:
- self._lock.release()
def isLegal(self, sdUUID, imgUUID):
"""
@@ -806,7 +806,7 @@ class Image:
if force:
# Now we should re-link all deleted hardlinks, if exists
- self.__templateRelink(dstSdUUID, dstImgUUID, dstVolUUID)
+ self.__templateRelink(destDom, dstImgUUID, dstVolUUID)
except se.StorageException, e:
self.log.error("Unexpected error", exc_info=True)
raise
More information about the vdsm-patches
mailing list