[libvirt] [PATCHv3] qemu: reduce file padding requirements

Eric Blake eblake at redhat.com
Wed Oct 20 22:18:43 UTC 2010


On 06/10/2010 06:31 AM, Eric Blake wrote:
> Followup to https://bugzilla.redhat.com/show_bug.cgi?id=599091,
> commit 20206a4b, to reduce disk waste in padding.
>
> * src/qemu/qemu_monitor.h (QEMU_MONITOR_MIGRATE_TO_FILE_BS): Drop
> back to 512.
> (QEMU_MONITOR_MIGRATE_TO_FILE_TRANSFER_SIZE): New macro.
> * src/qemu/qemu_driver.c (qemudDomainSaveFlag): Update comment.
> * src/qemu/qemu_monitor_text.c (qemuMonitorTextMigrateToFile): Use
> two invocations of dd to output non-aligned large blocks.
> * src/qemu/qemu_monitor_json.c (qemuMonitorJSONMigrateToFile):
> Likewise.

> -    if (virAsprintf(&dest, "exec:%s | dd of=%s bs=%llu seek=%llu",
> -                    argstr, safe_target,
> -                    QEMU_MONITOR_MIGRATE_TO_FILE_BS,
> -                    offset / QEMU_MONITOR_MIGRATE_TO_FILE_BS)<  0) {
> +    /* Two dd processes, sharing the same stdout, are necessary to
> +     * allow starting at an alignment of 512, but without wasting
> +     * padding to get to the larger alignment useful for speed.  Use
> +     *<>  redirection to avoid truncating a regular file.  */
> +    if (virAsprintf(&dest, "exec:%s | { dd bs=%llu seek=%llu if=/dev/null&&  "
> +                    "dd bs=%llu; } 1<>%s",
> +                    argstr, QEMU_MONITOR_MIGRATE_TO_FILE_BS,
> +                    offset / QEMU_MONITOR_MIGRATE_TO_FILE_BS,
> +                    QEMU_MONITOR_MIGRATE_TO_FILE_TRANSFER_SIZE,
> +                    safe_target)<  0) {

On IRC, Matthias pointed out that stock dash 0.5.5 has a bug where using 
the '1<>file' redirection operator mistakenly truncates file.  I hadn't 
seen it in my testing, because I was on a system where /bin/sh is bash, 
and bash is immune, as is zsh 4.3.10 and Solaris /bin/sh.

However, when /bin/sh is a buggy dash, then this mistaken truncation 
clobbers the header, breaking managed save of qemu guests.

The redirection bug has since been fixed in dash 0.5.6, and that fix has 
been backported to at least Ubuntu's dash 0.5.5 build.  However, it 
raises the question - should libvirt be testing for this shell bug for 
the benefit of people hand-building new libvirt on systems with buggy 
/bin/sh (such as Ubuntu 10.04), and if so, should I work on a patch to 
provide a workaround?

-- 
Eric Blake   eblake at redhat.com    +1-801-349-2682
Libvirt virtualization library http://libvirt.org




More information about the libvir-list mailing list