Change in vdsm[master]: [WIP] BZ#748386 - refactor qemuConvert to only use qemu-img ...
lyarwood at redhat.com
lyarwood at redhat.com
Mon Oct 22 16:01:20 UTC 2012
Lee Yarwood has uploaded a new change for review.
Change subject: [WIP] BZ#748386 - refactor qemuConvert to only use qemu-img convert.
......................................................................
[WIP] BZ#748386 - refactor qemuConvert to only use qemu-img convert.
This change refactors the qemuConvert method, dropping the use of dd with RAW volumes in favour of qemu-img
convert thus preserving sparseness. The change also introduces the use of the backing_file and backing_fmt
options when converting COW volumes.
Change-Id: I7adc41e8a9f5d4b9faa58a8cf5bec685b66e303e
Signed-off-by: Lee Yarwood <lyarwood at redhat.com>
---
M vdsm/storage/image.py
M vdsm/storage/volume.py
2 files changed, 25 insertions(+), 38 deletions(-)
git pull ssh://gerrit.ovirt.org:29418/vdsm refs/changes/28/8728/1
diff --git a/vdsm/storage/image.py b/vdsm/storage/image.py
index e86d94c..69ab6b6 100644
--- a/vdsm/storage/image.py
+++ b/vdsm/storage/image.py
@@ -788,19 +788,9 @@
try:
# Start the actual copy image procedure
- srcVol.prepare(rw=False)
+ srcVol.prepare(rw=True, chainrw=True, setrw=True)
dstVol.prepare(rw=True, setrw=True)
-
- try:
- (rc, out, err) = volume.qemuConvert(volParams['path'], dstPath,
- volParams['volFormat'], dstVolFormat, vars.task.aborting,
- size=srcVol.getVolumeSize(bs=1), dstvolType=dstVol.getType())
- if rc:
- raise se.StorageException("rc: %s, err: %s" % (rc, err))
- except se.ActionStopped, e:
- raise e
- except se.StorageException, e:
- raise se.CopyImageError(str(e))
+ (rc, out, err) = volume.qemuConvert(srcVol, dstVol, self.idle, vars.task.aborting)
# Mark volume as SHARED
if volType == volume.SHARED_VOL:
@@ -997,12 +987,12 @@
# Step 2: Convert successor to new volume
# qemu-img convert -f qcow2 successor -O raw newUUID
- (rc, out, err) = volume.qemuConvert(srcVolParams['path'], newVol.getVolumePath(),
- srcVolParams['volFormat'], volParams['volFormat'], vars.task.aborting,
- size=volParams['apparentsize'], dstvolType=newVol.getType())
- if rc:
- self.log.error("qemu-img convert failed: rc=%s, out=%s, err=%s",
- rc, out, err)
+ try:
+ (rc, out, err) = volume.qemuConvert(srcVol, newVol, self.idle, vars.task.aborting)
+ except se.ActionStopped:
+ raise
+ except se.StorageException:
+ self.log.error("Unexpected error", exc_info=True)
raise se.MergeSnapshotsError(newUUID)
newVol.teardown(sdUUID=newVol.sdUUID, volUUID=newVol.volUUID)
diff --git a/vdsm/storage/volume.py b/vdsm/storage/volume.py
index b9eb356..875b59a 100644
--- a/vdsm/storage/volume.py
+++ b/vdsm/storage/volume.py
@@ -960,28 +960,25 @@
log.debug('(qemuRebase): REBASE %s DONE' % (src))
return (rc, out, err)
+def qemuConvert(src, dst, idle, stop):
+ """
+ Copy the src image into the new dst.
+ """
+ cmd = constants.CMD_LOWPRIO + [constants.EXT_QEMUIMG, "convert", "-t", "none",
+ "-f", fmt2str(src.getFormat()), "-O", fmt2str(dst.getFormat())]
-def qemuConvert(src, dst, src_fmt, dst_fmt, stop, size, dstvolType):
- """
- Convert the 'src' image (or chain of images) into a new single 'dst'
- """
- src_fmt = fmt2str(src_fmt)
- dst_fmt = fmt2str(dst_fmt)
- log.debug('(qemuConvert): COPY %s (%s) to %s (%s) START' %
- (src, src_fmt, dst, dst_fmt))
+ # backing_file only used when src has a parent and both volumes are COW.
+ if src.getParentVolume() and src.getFormat() == COW_FORMAT and dst.getFormat() == COW_FORMAT :
+ cmd += ["-o", "backing_file=%s,backing_fmt=%s" % (src.getParentVolume().getVolumePath(),
+ fmt2str(src.getParentVolume().getFormat()))]
- if (src_fmt == "raw" and dst_fmt == "raw" and
- dstvolType == PREALLOCATED_VOL):
- (rc, out, err) = misc.ddWatchCopy(
- src=src, dst=dst,
- stop=stop, size=size,
- recoveryCallback=baseAsyncTasksRollback)
- else:
- cmd = constants.CMD_LOWPRIO + [constants.EXT_QEMUIMG, "convert",
- "-t", "none", "-f", src_fmt, src,
- "-O", dst_fmt, dst]
- (rc, out, err) = misc.watchCmd(cmd, stop=stop,
+ cmd += [src.getVolumePath(), dst.getVolumePath()]
+
+ (rc, out, err) = misc.watchCmd(cmd, stop=stop, idle=idle, sudo=False,
recoveryCallback=baseAsyncTasksRollback)
- log.debug('(qemuConvert): COPY %s to %s DONE' % (src, dst))
+ if rc:
+ raise se.StorageException
+
return (rc, out, err)
+
--
To view, visit http://gerrit.ovirt.org/8728
To unsubscribe, visit http://gerrit.ovirt.org/settings
Gerrit-MessageType: newchange
Gerrit-Change-Id: I7adc41e8a9f5d4b9faa58a8cf5bec685b66e303e
Gerrit-PatchSet: 1
Gerrit-Project: vdsm
Gerrit-Branch: master
Gerrit-Owner: Lee Yarwood <lyarwood at redhat.com>
More information about the vdsm-patches
mailing list