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

Reply via email to