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 <[email protected]> --- 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 <[email protected]> _______________________________________________ vdsm-patches mailing list [email protected] https://lists.fedorahosted.org/mailman/listinfo/vdsm-patches
