Adam Litke has uploaded a new change for review. Change subject: ImageManifest: move getChain ......................................................................
ImageManifest: move getChain The implementation of getChain instantiates storagedomain and volume objects. This must be fixed. We must fix all callers of getChain to work with VolumeMetadata objects instead of Volume objects. Change-Id: Iffd24be3ba74ccdea8dfc744b579c0cf63771cdb Signed-off-by: Adam Litke <ali...@redhat.com> --- M vdsm/storage/image.py 1 file changed, 71 insertions(+), 66 deletions(-) git pull ssh://gerrit.ovirt.org:29418/vdsm refs/changes/49/44049/1 diff --git a/vdsm/storage/image.py b/vdsm/storage/image.py index bd79f6e..f852f3c 100644 --- a/vdsm/storage/image.py +++ b/vdsm/storage/image.py @@ -89,6 +89,8 @@ class ImageManifest(object): + log = logging.getLogger('Storage.ImageManifest') + def __init__(self, repoPath): self.repoPath = repoPath @@ -105,6 +107,74 @@ log.info("Create placeholder %s for image's volumes", img_dir) os.mkdir(img_dir) return img_dir + + def getChain(self, sdUUID, imgUUID, volUUID=None): + """ + Return the chain of volumes of image as a sorted list + (not including a shared base (template) if any) + """ + chain = [] + volclass = sdCache.produce(sdUUID).getVolumeClass() + + # Use volUUID when provided + if volUUID: + srcVol = volclass(self.repoPath, sdUUID, imgUUID, volUUID) + + # For template images include only one volume (the template itself) + # NOTE: this relies on the fact that in a template there is only + # one volume + if srcVol.isShared(): + return [srcVol] + + # Find all the volumes when volUUID is not provided + else: + # Find all volumes of image + uuidlist = volclass.getImageVolumes(self.repoPath, sdUUID, imgUUID) + + if not uuidlist: + raise se.ImageDoesNotExistInSD(imgUUID, sdUUID) + + srcVol = volclass(self.repoPath, sdUUID, imgUUID, uuidlist[0]) + + # For template images include only one volume (the template itself) + if len(uuidlist) == 1 and srcVol.isShared(): + return [srcVol] + + # Searching for the leaf + for vol in uuidlist: + srcVol = volclass(self.repoPath, sdUUID, imgUUID, vol) + + if srcVol.isLeaf(): + break + + srcVol = None + + if not srcVol: + self.log.error("There is no leaf in the image %s", imgUUID) + raise se.ImageIsNotLegalChain(imgUUID) + + # We have seen corrupted chains that cause endless loops here. + # https://bugzilla.redhat.com/1125197 + seen = set() + + # Build up the sorted parent -> child chain + while not srcVol.isShared(): + chain.insert(0, srcVol) + seen.add(srcVol.volUUID) + + parentUUID = srcVol.getParentId() + if parentUUID == volume.BLANK_UUID: + break + + if parentUUID in seen: + self.log.error("Image %s volume %s has invalid parent UUID %s", + imgUUID, srcVol.volUUID, parentUUID) + raise se.ImageIsNotLegalChain(imgUUID) + + srcVol = srcVol.produceParent() + + self.log.info("sdUUID=%s imgUUID=%s chain=%s ", sdUUID, imgUUID, chain) + return chain class Image: @@ -179,72 +249,7 @@ return newsize def getChain(self, sdUUID, imgUUID, volUUID=None): - """ - Return the chain of volumes of image as a sorted list - (not including a shared base (template) if any) - """ - chain = [] - volclass = sdCache.produce(sdUUID).getVolumeClass() - - # Use volUUID when provided - if volUUID: - srcVol = volclass(self.repoPath, sdUUID, imgUUID, volUUID) - - # For template images include only one volume (the template itself) - # NOTE: this relies on the fact that in a template there is only - # one volume - if srcVol.isShared(): - return [srcVol] - - # Find all the volumes when volUUID is not provided - else: - # Find all volumes of image - uuidlist = volclass.getImageVolumes(self.repoPath, sdUUID, imgUUID) - - if not uuidlist: - raise se.ImageDoesNotExistInSD(imgUUID, sdUUID) - - srcVol = volclass(self.repoPath, sdUUID, imgUUID, uuidlist[0]) - - # For template images include only one volume (the template itself) - if len(uuidlist) == 1 and srcVol.isShared(): - return [srcVol] - - # Searching for the leaf - for vol in uuidlist: - srcVol = volclass(self.repoPath, sdUUID, imgUUID, vol) - - if srcVol.isLeaf(): - break - - srcVol = None - - if not srcVol: - self.log.error("There is no leaf in the image %s", imgUUID) - raise se.ImageIsNotLegalChain(imgUUID) - - # We have seen corrupted chains that cause endless loops here. - # https://bugzilla.redhat.com/1125197 - seen = set() - - # Build up the sorted parent -> child chain - while not srcVol.isShared(): - chain.insert(0, srcVol) - seen.add(srcVol.volUUID) - - parentUUID = srcVol.getParentId() - if parentUUID == volume.BLANK_UUID: - break - - if parentUUID in seen: - self.log.error("Image %s volume %s has invalid parent UUID %s", - imgUUID, srcVol.volUUID, parentUUID) - raise se.ImageIsNotLegalChain(imgUUID) - - srcVol = srcVol.produceParent() - - self.log.info("sdUUID=%s imgUUID=%s chain=%s ", sdUUID, imgUUID, chain) - return chain + return self.manifest.getChain(sdUUID, imgUUID, volUUID) def getTemplate(self, sdUUID, imgUUID): """ -- To view, visit https://gerrit.ovirt.org/44049 To unsubscribe, visit https://gerrit.ovirt.org/settings Gerrit-MessageType: newchange Gerrit-Change-Id: Iffd24be3ba74ccdea8dfc744b579c0cf63771cdb Gerrit-PatchSet: 1 Gerrit-Project: vdsm Gerrit-Branch: master Gerrit-Owner: Adam Litke <ali...@redhat.com> _______________________________________________ vdsm-patches mailing list vdsm-patches@lists.fedorahosted.org https://lists.fedorahosted.org/mailman/listinfo/vdsm-patches