Re: [PATCH v8 20/21] backup: qemu: Wire up qemu full push backup commands over QMP

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



On Wed, Apr 17, 2019 at 09:09:20 -0500, Eric Blake wrote:
> Update the code to support push backups; for now, the destination file
> still has to be local, although the XML could be extended into
> supporting remote destinations (where we will have to use the full
> power of blockdev-add). This also touches up the event handling to
> inform the user when the job is complete. (However, there are probably
> bugs lurking in the event code; pull mode is more tested than push
> mode at the time I write this).
> 
> Signed-off-by: Eric Blake <eblake@xxxxxxxxxx>
> ---
>  src/qemu/qemu_driver.c | 81 +++++++++++++++++++++++++++++-------------
>  1 file changed, 56 insertions(+), 25 deletions(-)

This patch splitting doesn't make that much sense.

> @@ -17749,16 +17748,17 @@ qemuDomainBackupDiskCleanup(virQEMUDriverPtr driver, virDomainObjPtr vm,
>      }
>      if (disk->state >= VIR_DOMAIN_BACKUP_DISK_STATE_READY &&
>          qemuMonitorBlockdevDel(priv->mon, disk->store->nodeformat) < 0) {
> -        VIR_WARN("Unable to remove temp disk %s after backup",
> -                 disk->name);
> +        VIR_WARN("Unable to remove %s disk %s after backup",
> +                 push ? "target" : "scratch", disk->name);
>          ret = -1;
>      }
>      if (disk->state >= VIR_DOMAIN_BACKUP_DISK_STATE_LABEL)
>          qemuDomainDiskChainElementRevoke(driver, vm, disk->store);
> -    if (disk->state >= VIR_DOMAIN_BACKUP_DISK_STATE_CREATED &&
> +    if ((!push || !completed) &&
> +        disk->state >= VIR_DOMAIN_BACKUP_DISK_STATE_CREATED &&
>          disk->store->detected && unlink(disk->store->path) < 0) {
> -        VIR_WARN("Unable to unlink temp disk %s after backup",
> -                 disk->store->path);
> +        VIR_WARN("Unable to unlink %s disk %s after backup",
> +                 push ? "failed target" : "scratch", disk->store->path);

We tend to stay away from warnings now. Almost nobody reads that, it
doesn't notify the user right away and they are not translated.

> @@ -18126,23 +18130,50 @@ static int qemuDomainBackupEnd(virDomainPtr domain, int id, unsigned int flags)
>          goto cleanup;
>      }
> 
> -    if (priv->backup->type != VIR_DOMAIN_BACKUP_TYPE_PUSH)
> -        want_abort = false;
>      def = priv->backup;
> +    if (def->type != VIR_DOMAIN_BACKUP_TYPE_PUSH) {
> +        want_abort = false;
> +        push = false;
> +    }
> 
>      /* We are going to modify the domain below. */
>      if (qemuDomainObjBeginJob(driver, vm, QEMU_JOB_MODIFY) < 0)
>          goto cleanup;
> 
>      qemuDomainObjEnterMonitor(driver, vm);
> -    if (def->type == VIR_DOMAIN_BACKUP_TYPE_PULL)
> +    if (push) {
> +        for (i = 0; i < def->ndisks; i++) {
> +            virDomainBackupDiskDef *disk = &def->disks[i];
> +
> +            if (!disk->store)
> +                continue;
> +            if (disk->state != VIR_DOMAIN_BACKUP_DISK_STATE_COMPLETE)

I probably missed something. Where is this updated?

> +                completed = false;
> +        }
> +    } else {
>          ret = qemuMonitorNBDServerStop(priv->mon);
> -    for (i = 0; i < def->ndisks; i++) {
> -        if (qemuMonitorBlockJobCancel(priv->mon,
> -                                      def->disks[i].name) < 0 ||
> -            qemuDomainBackupDiskCleanup(driver, vm, &def->disks[i],
> -                                        !!def->incremental) < 0)
> -            ret = -1;
> +    }
> +    if (!completed && !want_abort) {
> +        virReportError(VIR_ERR_OPERATION_INVALID,
> +                       _("backup job id '%d' not complete yet"), id);
> +    } else {
> +        for (i = 0; i < def->ndisks; i++) {
> +            virDomainBackupDiskDef *disk = &def->disks[i];
> +
> +            if (!disk->store)
> +                continue;
> +            if (!push || disk->state < VIR_DOMAIN_BACKUP_DISK_STATE_COMPLETE) {
> +                if (qemuMonitorBlockJobCancel(priv->mon,
> +                                              disk->name) < 0 &&

There were problems with other block jobs that Cancel is possibly long
running. Does it not happen with the backup job?

> +                    !want_abort) {
> +                    ret = -1;
> +                    continue;

Attachment: signature.asc
Description: PGP signature

--
libvir-list mailing list
libvir-list@xxxxxxxxxx
https://www.redhat.com/mailman/listinfo/libvir-list

[Index of Archives]     [Virt Tools]     [Libvirt Users]     [Lib OS Info]     [Fedora Users]     [Fedora Desktop]     [Fedora SELinux]     [Big List of Linux Books]     [Yosemite News]     [KDE Users]     [Fedora Tools]

  Powered by Linux