Change in vdsm[master]: StorageDomainManifest: deleteImage and deps
alitke at redhat.com
alitke at redhat.com
Fri Jun 12 09:59:37 UTC 2015
Adam Litke has uploaded a new change for review.
Change subject: StorageDomainManifest: deleteImage and deps
......................................................................
StorageDomainManifest: deleteImage and deps
Change-Id: I7e418262d70ed50b45fdddf2fc77eb80a03a3811
Signed-off-by: Adam Litke <alitke at redhat.com>
---
M vdsm/storage/blockSD.py
M vdsm/storage/fileSD.py
M vdsm/storage/sd.py
3 files changed, 98 insertions(+), 85 deletions(-)
git pull ssh://gerrit.ovirt.org:29418/vdsm refs/changes/68/42268/1
diff --git a/vdsm/storage/blockSD.py b/vdsm/storage/blockSD.py
index caa7baf..273cf51 100644
--- a/vdsm/storage/blockSD.py
+++ b/vdsm/storage/blockSD.py
@@ -570,6 +570,64 @@
newsize = self.metaSize(self.sdUUID)
lvm.extendLV(self.sdUUID, sd.METADATA, newsize)
+ def _getImgExclusiveVols(self, imgUUID, volsImgs):
+ """Filter vols belonging to imgUUID only."""
+ exclusives = dict((vName, v) for vName, v in volsImgs.iteritems()
+ if v.imgs[0] == imgUUID)
+ return exclusives
+
+ def _markForDelVols(self, sdUUID, imgUUID, volUUIDs, opTag):
+ """
+ Mark volumes that will be zeroed or removed.
+
+ Mark for delete just in case that lvremove [lvs] success partialy.
+ Mark for zero just in case that zero process is interrupted.
+
+ Tagging is preferable to rename since it can be done in a single lvm
+ operation and is resilient to open LVs, etc.
+ """
+ try:
+ lvm.changelv(sdUUID, volUUIDs,
+ (("-a", "y"),
+ ("--deltag", blockVolume.TAG_PREFIX_IMAGE + imgUUID),
+ ("--addtag", blockVolume.TAG_PREFIX_IMAGE +
+ opTag + imgUUID)))
+ except se.StorageException as e:
+ log.error("Can't activate or change LV tags in SD %s. "
+ "failing Image %s %s operation for vols: %s. %s",
+ sdUUID, imgUUID, opTag, volUUIDs, e)
+ raise
+
+ def _rmDCVolLinks(self, imgPath, volsImgs):
+ for vol in volsImgs:
+ lPath = os.path.join(imgPath, vol)
+ removedPaths = []
+ try:
+ os.unlink(lPath)
+ except OSError as e:
+ self.log.warning("Can't unlink %s. %s", lPath, e)
+ else:
+ removedPaths.append(lPath)
+ self.log.debug("removed: %s", removedPaths)
+ return tuple(removedPaths)
+
+ def rmDCImgDir(self, imgUUID, volsImgs):
+ imgPath = os.path.join(self.domaindir, sd.DOMAIN_IMAGES, imgUUID)
+ self._rmDCVolLinks(imgPath, volsImgs)
+ try:
+ os.rmdir(imgPath)
+ except OSError:
+ self.log.warning("Can't rmdir %s", imgPath, exc_info=True)
+ else:
+ self.log.debug("removed image dir: %s", imgPath)
+ return imgPath
+
+ def deleteImage(self, sdUUID, imgUUID, volsImgs):
+ toDel = self._getImgExclusiveVols(imgUUID, volsImgs)
+ self._markForDelVols(sdUUID, imgUUID, toDel, sd.REMOVED_IMAGE_PREFIX)
+ deleteVolumes(sdUUID, toDel)
+ self.rmDCImgDir(imgUUID, volsImgs)
+
class BlockStorageDomain(sd.StorageDomain):
manifestClass = BlockStorageDomainManifest
@@ -972,62 +1030,14 @@
images.update(imgs)
return images
- def rmDCVolLinks(self, imgPath, volsImgs):
- for vol in volsImgs:
- lPath = os.path.join(imgPath, vol)
- removedPaths = []
- try:
- os.unlink(lPath)
- except OSError as e:
- self.log.warning("Can't unlink %s. %s", lPath, e)
- else:
- removedPaths.append(lPath)
- self.log.debug("removed: %s", removedPaths)
- return tuple(removedPaths)
-
def rmDCImgDir(self, imgUUID, volsImgs):
- imgPath = os.path.join(self.domaindir, sd.DOMAIN_IMAGES, imgUUID)
- self.rmDCVolLinks(imgPath, volsImgs)
- try:
- os.rmdir(imgPath)
- except OSError:
- self.log.warning("Can't rmdir %s", imgPath, exc_info=True)
- else:
- self.log.debug("removed image dir: %s", imgPath)
- return imgPath
+ return self._manifest.rmDCImgDir(imgUUID, volsImgs)
def _getImgExclusiveVols(self, imgUUID, volsImgs):
- """Filter vols belonging to imgUUID only."""
- exclusives = dict((vName, v) for vName, v in volsImgs.iteritems()
- if v.imgs[0] == imgUUID)
- return exclusives
+ return self._manifest._getImgExclusiveVols(imgUUID, volsImgs)
def __markForDelVols(self, sdUUID, imgUUID, volUUIDs, opTag):
- """
- Mark volumes that will be zeroed or removed.
-
- Mark for delete just in case that lvremove [lvs] success partialy.
- Mark for zero just in case that zero process is interrupted.
-
- Tagging is preferable to rename since it can be done in a single lvm
- operation and is resilient to open LVs, etc.
- """
- try:
- lvm.changelv(sdUUID, volUUIDs, (("-a", "y"),
- ("--deltag", blockVolume.TAG_PREFIX_IMAGE + imgUUID),
- ("--addtag", blockVolume.TAG_PREFIX_IMAGE +
- opTag + imgUUID)))
- except se.StorageException as e:
- log.error("Can't activate or change LV tags in SD %s. "
- "failing Image %s %s operation for vols: %s. %s",
- sdUUID, imgUUID, opTag, volUUIDs, e)
- raise
-
- def deleteImage(self, sdUUID, imgUUID, volsImgs):
- toDel = self._getImgExclusiveVols(imgUUID, volsImgs)
- self.__markForDelVols(sdUUID, imgUUID, toDel, sd.REMOVED_IMAGE_PREFIX)
- deleteVolumes(sdUUID, toDel)
- self.rmDCImgDir(imgUUID, volsImgs)
+ return self._manifest._markForDelVols(sdUUID, imgUUID, volUUIDs, opTag)
def zeroImage(self, sdUUID, imgUUID, volsImgs):
toZero = self._getImgExclusiveVols(imgUUID, volsImgs)
diff --git a/vdsm/storage/fileSD.py b/vdsm/storage/fileSD.py
index ff083cd..9f44342 100644
--- a/vdsm/storage/fileSD.py
+++ b/vdsm/storage/fileSD.py
@@ -179,6 +179,40 @@
def getIdsFilePath(self):
return os.path.join(self.getMDPath(), sd.IDS)
+ def getImagePath(self, imgUUID):
+ return os.path.join(self.domaindir, sd.DOMAIN_IMAGES, imgUUID)
+
+ def deleteImage(self, sdUUID, imgUUID, volsImgs):
+ currImgDir = self.getImagePath(imgUUID)
+ dirName, baseName = os.path.split(currImgDir)
+ toDelDir = os.path.join(dirName, sd.REMOVED_IMAGE_PREFIX + baseName)
+ self.log.debug("Renaming dir %s to %s", currImgDir, toDelDir)
+ try:
+ self.oop.os.rename(currImgDir, toDelDir)
+ except OSError as e:
+ self.log.error("image: %s can't be moved", currImgDir)
+ raise se.ImageDeleteError("%s %s" % (imgUUID, str(e)))
+ for volUUID in volsImgs:
+ volPath = os.path.join(toDelDir, volUUID)
+ try:
+ self.log.debug("Removing file: %s", volPath)
+ self.oop.os.remove(volPath)
+ metaFile = volPath + '.meta'
+ self.log.debug("Removing file: %s", metaFile)
+ self.oop.os.remove(metaFile)
+ leaseFile = volPath + '.lease'
+ self.log.debug("Removing file: %s", leaseFile)
+ self.oop.os.remove(leaseFile)
+ except OSError:
+ self.log.error("vol: %s can't be removed.",
+ volPath, exc_info=True)
+ self.log.debug("Removing directory: %s", toDelDir)
+ try:
+ self.oop.os.rmdir(toDelDir)
+ except OSError as e:
+ self.log.error("removed image dir: %s can't be removed", toDelDir)
+ raise se.ImageDeleteError("%s %s" % (imgUUID, str(e)))
+
class FileStorageDomain(sd.StorageDomain):
manifestClass = FileStorageDomainManifest
@@ -373,40 +407,6 @@
if self.oop.os.path.isdir(i):
images.add(os.path.basename(i))
return images
-
- def getImagePath(self, imgUUID):
- return os.path.join(self.domaindir, sd.DOMAIN_IMAGES, imgUUID)
-
- def deleteImage(self, sdUUID, imgUUID, volsImgs):
- currImgDir = self.getImagePath(imgUUID)
- dirName, baseName = os.path.split(currImgDir)
- toDelDir = os.path.join(dirName, sd.REMOVED_IMAGE_PREFIX + baseName)
- self.log.debug("Renaming dir %s to %s", currImgDir, toDelDir)
- try:
- self.oop.os.rename(currImgDir, toDelDir)
- except OSError as e:
- self.log.error("image: %s can't be moved", currImgDir)
- raise se.ImageDeleteError("%s %s" % (imgUUID, str(e)))
- for volUUID in volsImgs:
- volPath = os.path.join(toDelDir, volUUID)
- try:
- self.log.debug("Removing file: %s", volPath)
- self.oop.os.remove(volPath)
- metaFile = volPath + '.meta'
- self.log.debug("Removing file: %s", metaFile)
- self.oop.os.remove(metaFile)
- leaseFile = volPath + '.lease'
- self.log.debug("Removing file: %s", leaseFile)
- self.oop.os.remove(leaseFile)
- except OSError:
- self.log.error("vol: %s can't be removed.",
- volPath, exc_info=True)
- self.log.debug("Removing directory: %s", toDelDir)
- try:
- self.oop.os.rmdir(toDelDir)
- except OSError as e:
- self.log.error("removed image dir: %s can't be removed", toDelDir)
- raise se.ImageDeleteError("%s %s" % (imgUUID, str(e)))
def zeroImage(self, sdUUID, imgUUID, volsImgs):
self.log.warning("image %s on a fileSD %s won't be zeroed." %
diff --git a/vdsm/storage/sd.py b/vdsm/storage/sd.py
index c5dd224..873c8fa 100644
--- a/vdsm/storage/sd.py
+++ b/vdsm/storage/sd.py
@@ -404,6 +404,9 @@
def getVSize(self, imgUUID, volUUID):
return self._manifest.getVSize(imgUUID, volUUID)
+ def deleteImage(self, sdUUID, imgUUID, volsImgs):
+ self._manifest.deleteImage(sdUUID, imgUUID, volsImgs)
+
def prepareMailbox(self):
"""
This method has been introduced in order to prepare the mailbox
--
To view, visit https://gerrit.ovirt.org/42268
To unsubscribe, visit https://gerrit.ovirt.org/settings
Gerrit-MessageType: newchange
Gerrit-Change-Id: I7e418262d70ed50b45fdddf2fc77eb80a03a3811
Gerrit-PatchSet: 1
Gerrit-Project: vdsm
Gerrit-Branch: master
Gerrit-Owner: Adam Litke <alitke at redhat.com>
More information about the vdsm-patches
mailing list