Adam Litke has uploaded a new change for review. Change subject: Live Merge: Get volume chain for multiple drives ......................................................................
Live Merge: Get volume chain for multiple drives A future patch wants to get volume chain information for all drives in one call. Rather than getting the domXML once per drive, allow _driveGetActualVolumeChain to accept a list of drives and parse the information all at once. Change-Id: I93d5a641b0814e3764c70bea8a6c1910a821adcc Bug-Url: https://bugzilla.redhat.com/show_bug.cgi?id=1109920 Signed-off-by: Adam Litke <[email protected]> --- M vdsm/virt/vm.py 1 file changed, 37 insertions(+), 28 deletions(-) git pull ssh://gerrit.ovirt.org:29418/vdsm refs/changes/66/31366/1 diff --git a/vdsm/virt/vm.py b/vdsm/virt/vm.py index 3bb9ce0..1347568 100644 --- a/vdsm/virt/vm.py +++ b/vdsm/virt/vm.py @@ -5352,8 +5352,9 @@ return errCode['imageErr'] # Check that libvirt exposes full volume chain information - ret = self._driveGetActualVolumeChain(drive) - if ret is None: + try: + ret = self._driveGetActualVolumeChain([drive])[drive['alias']] + except KeyError: self.log.error("merge: libvirt does not support volume chain " "monitoring. Unable to perform live merge.") return errCode['mergeErr'] @@ -5444,14 +5445,13 @@ return {'status': doneCode} - def _lookupDeviceXMLByAlias(self, targetAlias): - domXML = self._getUnderlyingVmInfo() - for deviceXML, alias in _devicesWithAlias(domXML): - if alias == targetAlias: - return deviceXML - return None + def _driveGetActualVolumeChain(self, drives): + def lookupDeviceXMLByAlias(domXML, targetAlias): + for deviceXML, alias in _devicesWithAlias(domXML): + if alias == targetAlias: + return deviceXML + return None - def _driveGetActualVolumeChain(self, drive): def pathToVolID(drive, path): for vol in drive.volumeChain: if os.path.realpath(vol['path']) == os.path.realpath(path): @@ -5464,23 +5464,31 @@ return child return None - diskXML = self._lookupDeviceXMLByAlias(drive['alias']) - if not diskXML: - return None - volChain = [] - while True: - sourceXML = findElement(diskXML, 'source') - if not sourceXML: - break - sourceAttr = ('file', 'dev')[drive.blockDev] - path = sourceXML.getAttribute(sourceAttr) - info = {'id': pathToVolID(drive, path), 'path': path} - volChain.insert(0, info) - bsXML = findElement(diskXML, 'backingStore') - if not bsXML: - break - diskXML = bsXML - return volChain + ret = {} + domXML = self._getUnderlyingVmInfo() + for drive in drives: + alias = drive['alias'] + diskXML = lookupDeviceXMLByAlias(domXML, alias) + if not diskXML: + continue + volChain = [] + while True: + sourceXML = findElement(diskXML, 'source') + if not sourceXML: + break + sourceAttr = ('file', 'dev')[drive.blockDev] + path = sourceXML.getAttribute(sourceAttr) + info = {'id': pathToVolID(drive, path), 'path': path} + bsXML = findElement(diskXML, 'backingStore') + if not bsXML: + self.log.debug("<backingStore/> missing from backing " + "chain for block device %s", drive.name) + break + diskXML = bsXML + volChain.insert(0, info) + if volChain: + ret[alias] = volChain + return ret def _syncVolumeChain(self, drive): def getVolumeInfo(device, volumeID): @@ -5494,8 +5502,9 @@ return curVols = [x['volumeID'] for x in drive.volumeChain] - ret = self._driveGetActualVolumeChain(drive) - if ret is None: + try: + ret = self._driveGetActualVolumeChain([drive])[drive['alias']] + except KeyError: self.log.debug("Unable to determine volume chain. Skipping volume " "chain synchronization for drive %s", drive.name) return -- To view, visit http://gerrit.ovirt.org/31366 To unsubscribe, visit http://gerrit.ovirt.org/settings Gerrit-MessageType: newchange Gerrit-Change-Id: I93d5a641b0814e3764c70bea8a6c1910a821adcc 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
