Deepak C Shetty has uploaded a new change for review.

Change subject: WIP: Introduce prepareForBackup vdsm verb
......................................................................

WIP: Introduce prepareForBackup vdsm verb

This patch introduces prepareForBackup vdsm verb which will export
the given volume (assumed to be a snapshot) as a NBD over unix socket.

It uses qemu-nbd to export the volume as NBD.
It returns the unix socket path on which qemu-nbd is serving the volume.

TODO: Investigate how Change Block Tracking info can be returned.
NOTE: This is a WIP patch... posted for getting early review comments.

FeaturePage : http://www.ovirt.org/Features/Backup-Restore_API_Integration

Change-Id: I8ccacda2b09810a71f445ed65de6a09336ea3fb1
Signed-off-by: Deepak C Shetty <[email protected]>
---
M configure.ac
M lib/vdsm/constants.py.in
M vdsm/API.py
M vdsm/BindingXMLRPC.py
M vdsm/storage/hsm.py
M vdsm/storage/storage_exception.py
M vdsm/storage/volume.py
7 files changed, 73 insertions(+), 1 deletion(-)


  git pull ssh://gerrit.ovirt.org:29418/vdsm refs/changes/03/14403/1

diff --git a/configure.ac b/configure.ac
index 3bc4cc8..a070929 100644
--- a/configure.ac
+++ b/configure.ac
@@ -173,6 +173,7 @@
 AC_PATH_PROG([PERSIST_PATH], [persist], [/usr/sbin/persist])
 AC_PATH_PROG([PGREP_PATH], [pgrep], [/usr/bin/pgrep])
 AC_PATH_PROG([QEMUIMG_PATH], [qemu-img], [/usr/bin/qemu-img])
+AC_PATH_PROG([QEMUNBD_PATH], [qemu-nbd], [/usr/bin/qemu-nbd])
 AC_PATH_PROG([REBOOT_PATH], [reboot], [/usr/bin/reboot])
 AC_PATH_PROG([RPM_PATH], [rpm], [/bin/rpm])
 AC_PATH_PROG([RSYNC_PATH], [rsync], [/usr/bin/rsync])
diff --git a/lib/vdsm/constants.py.in b/lib/vdsm/constants.py.in
index e7e2f83..d663f34 100644
--- a/lib/vdsm/constants.py.in
+++ b/lib/vdsm/constants.py.in
@@ -123,6 +123,7 @@
 EXT_PYTHON = '@PYTHON@'
 
 EXT_QEMUIMG = '@QEMUIMG_PATH@'
+EXT_QEMUNBD = '@QEMUNBD_PATH@'
 
 EXT_REBOOT = '@REBOOT_PATH@'
 EXT_RSYNC = '@RSYNC_PATH@'
diff --git a/vdsm/API.py b/vdsm/API.py
index ee72116..e3539ff 100644
--- a/vdsm/API.py
+++ b/vdsm/API.py
@@ -741,6 +741,10 @@
         return self._irs.teardownVolume(self._sdUUID, self._spUUID,
                                         self._imgUUID, self._UUID)
 
+    def prepareForBackup(self):
+        return self._irs.prepareBackupDisk(self._sdUUID, self._spUUID,
+                                           self._imgUUID, self._UUID)
+
 
 class Image(APIBase):
     ctorArgs = ['imageID', 'storagepoolID', 'storagedomainID']
diff --git a/vdsm/BindingXMLRPC.py b/vdsm/BindingXMLRPC.py
index 9a4db12..c53af97 100644
--- a/vdsm/BindingXMLRPC.py
+++ b/vdsm/BindingXMLRPC.py
@@ -676,6 +676,10 @@
         volume = API.Volume(volUUID, spUUID, sdUUID, imgUUID)
         return volume.tearDown()
 
+    def volumeBackupPrepare(self, sdUUID, spUUID, imgUUID, volUUID):
+        volume = API.Volume(volUUID, spUUID, sdUUID, imgUUID)
+        volume.prepareForBackup()
+
     def taskClear(self, taskId):
         task = API.Task(taskId)
         return task.clear()
@@ -878,6 +882,7 @@
                 (self.volumeSetDescription, 'setVolumeDescription'),
                 (self.volumeSetLegality, 'setVolumeLegality'),
                 (self.volumeTearDown, 'teardownVolume'),
+                (self.volumeBackupPrepare, 'prepareBackupDisk'),
                 (self.tasksGetAllInfo, 'getAllTasksInfo'),
                 (self.tasksGetAllStatuses, 'getAllTasksStatuses'),
                 (self.tasksGetAll, 'getAllTasks'),
diff --git a/vdsm/storage/hsm.py b/vdsm/storage/hsm.py
index ae35b11..3b36594 100644
--- a/vdsm/storage/hsm.py
+++ b/vdsm/storage/hsm.py
@@ -3069,6 +3069,15 @@
             self.log.warn("Problem tearing down volume", exc_info=True)
 
     @public
+    def prepareBackupDisk(self, sdUUID, spUUID, imgUUID, volUUID):
+        # TODO: Is excl. lock the right thing ?
+        vars.task.getExclusiveLock(STORAGE, sdUUID)
+        snapVol = sdCache.produce(
+            sdUUID=sdUUID).produceVolume( imgUUID=imgUUID, volUUID=volUUID)
+        nbdPath = snapVol.exportAsNbd()
+        return dict(path=nbdPath)
+
+    @public
     def prepareImage(self, sdUUID, spUUID, imgUUID, volUUID=None):
         """
         Prepare an image activating the needed volumes.
diff --git a/vdsm/storage/storage_exception.py 
b/vdsm/storage/storage_exception.py
index c2c3dc8..d044022 100644
--- a/vdsm/storage/storage_exception.py
+++ b/vdsm/storage/storage_exception.py
@@ -337,6 +337,11 @@
     message = "Incorrect Volume Preallocate Type"
 
 
+class VolumeExportAsNbdError(StorageException):
+    code = 232
+    message = "Error exporting Volume as NBD"
+
+
 #################################################
 #  Images Exceptions
 #################################################
diff --git a/vdsm/storage/volume.py b/vdsm/storage/volume.py
index c639703..73e4d71 100644
--- a/vdsm/storage/volume.py
+++ b/vdsm/storage/volume.py
@@ -18,7 +18,7 @@
 # Refer to the README and COPYING files for full details of the license
 #
 
-import os.path
+import os
 import logging
 import time
 import signal
@@ -36,6 +36,7 @@
 from threadLocal import vars
 import resourceFactories
 import resourceManager as rm
+import tempfile
 rmanager = rm.ResourceManager.getInstance()
 
 
@@ -130,6 +131,7 @@
         if not volUUID or volUUID == BLANK_UUID:
             raise se.InvalidParameterException("volUUID", volUUID)
         self.voltype = None
+        self.nbdInfo = None
         self.validate()
 
     @classmethod
@@ -922,6 +924,21 @@
         volParams['legality'] = self.getLegality()
         return volParams
 
+    def exportAsNbd(self):
+        volPath = self.getVolumePath()
+        rc, ret1, ret2 = qemuExportNbdOverSocket(volPath)
+        if rc != None:
+            self.log.error("Error exporting volume as NBD, out=%s, err=%s",
+                           (ret1, ret2))
+            raise se.VolumeExportAsNbdError()
+
+        self.nbdSockFd = ret1
+        self.nbdSockPath = ret2
+
+        # TODO: Update MD to indicate volume is exported as NBD for backup ?
+        # TODO : return CBT info - from here or a new VDSM verb ?
+        return self.nbdSockPath
+
 
 def createVolume(parent, parent_format, volume, size, format, prealloc):
     """
@@ -1045,3 +1062,33 @@
 
     log.debug('(qemuConvert): COPY %s to %s DONE' % (src, dst))
     return (rc, out, err)
+
+def qemuExportNbdOverSocket(diskPath, persistent=True, snapFile=True, 
numClients=1):
+    """
+    Export a volume/disk using qemu-nbd over a unix socket
+    """
+    (sockFd, sockPath) = tempfile.mkstemp(suffix=".sock", prefix="nbd", 
dir=constants.P_VDSM_RUN)
+
+    cmd = [constants.EXT_QEMUNBD, "-k", sockPath, "-e", numClients]
+    if persistent:
+        cmd.extend("-t")
+    if snapFile:
+        cmd.extend("-s")
+    cmd.append(diskPath)
+
+    # qemu-nbd starts as a user space nbd server, doesn't return, until killed.
+    proc = misc.execCmd(cmd, sync=False)
+    rc = None
+
+    if proc.returncode != None:
+        # qemu-nbd bad happened
+        os.unlink(sockPath)
+
+        rc = proc.returncode
+        out = misc.stripNewLines(proc.stdout)
+        err = misc.stripNewLines(proc.stderr)
+
+        return (rc, out, err)
+
+    log.debug('(qemuExportNbdOverSocket): NBD EXPORT at %s DONE' % (sockPath))
+    return (rc, sockFd, sockName)


--
To view, visit http://gerrit.ovirt.org/14403
To unsubscribe, visit http://gerrit.ovirt.org/settings

Gerrit-MessageType: newchange
Gerrit-Change-Id: I8ccacda2b09810a71f445ed65de6a09336ea3fb1
Gerrit-PatchSet: 1
Gerrit-Project: vdsm
Gerrit-Branch: master
Gerrit-Owner: Deepak C Shetty <[email protected]>
_______________________________________________
vdsm-patches mailing list
[email protected]
https://lists.fedorahosted.org/mailman/listinfo/vdsm-patches

Reply via email to