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
