[libvirt] [PATCH v2 23/25] qemu: blockjob: Implement concluded blockjob handler for backup blockjobs

Eric Blake eblake at redhat.com
Mon Dec 9 18:15:27 UTC 2019


On 12/3/19 11:17 AM, Peter Krempa wrote:
> After the individual sub-blockjobs of a backup libvirt job finish we
> must detect it and notify the parent job, so that it can be properly
> terminated.
> 
> Since we update job information to determine success of an blockjob we

s/an/a/

> can directly report back also statistics of the blockjob.
> 
> Signed-off-by: Peter Krempa <pkrempa at redhat.com>
> ---
>   src/qemu/qemu_blockjob.c | 74 ++++++++++++++++++++++++++++++++++++++--
>   1 file changed, 72 insertions(+), 2 deletions(-)
> 

> +static void
> +qemuBlockJobProcessEventConcludedBackup(virQEMUDriverPtr driver,
> +                                        virDomainObjPtr vm,
> +                                        qemuBlockJobDataPtr job,
> +                                        qemuDomainAsyncJob asyncJob,
> +                                        qemuBlockjobState newstate,
> +                                        unsigned long long progressCurrent,
> +                                        unsigned long long progressTotal)
> +{
> +    g_autoptr(virQEMUDriverConfig) cfg = virQEMUDriverGetConfig(driver);
> +    uid_t uid;
> +    gid_t gid;
> +    g_autoptr(qemuBlockStorageSourceAttachData) backend = NULL;
> +    g_autoptr(virJSONValue) actions = NULL;
> +
> +    qemuBackupNotifyBlockjobEnd(vm, job->disk, newstate, progressCurrent, progressTotal);
> +
> +    if (job->data.backup.store &&
> +        !(backend = qemuBlockStorageSourceDetachPrepare(job->data.backup.store, NULL)))
> +        return;
> +
> +    if (job->data.backup.bitmap) {
> +        if (!(actions = virJSONValueNewArray()))
> +            return;
> +
> +        if (qemuMonitorTransactionBitmapRemove(actions,
> +                                               job->disk->src->nodeformat,
> +                                               job->data.backup.bitmap) < 0)
> +            return;
> +    }

The late-breaking qemu fix for deleting persistent bitmaps in a 
transaction should be in 4.2-rc5.  Phew.

> +
> +    if (qemuDomainObjEnterMonitorAsync(driver, vm, asyncJob) < 0)
> +        return;
> +
> +    if (backend)
> +        qemuBlockStorageSourceAttachRollback(qemuDomainGetMonitor(vm), backend);
> +
> +    if (actions)
> +        qemuMonitorTransaction(qemuDomainGetMonitor(vm), &actions);
> +
> +    if (qemuDomainObjExitMonitor(driver, vm) < 0)
> +        return;
> +
> +    if (job->data.backup.store) {
> +        qemuDomainStorageSourceAccessRevoke(driver, vm, job->data.backup.store);
> +
> +        if (job->data.backup.deleteStore &&
> +            job->data.backup.store->type == VIR_STORAGE_TYPE_FILE) {
> +            qemuDomainGetImageIds(cfg, vm, job->data.backup.store, NULL, &uid, &gid);
> +
> +            if (virFileRemove(job->data.backup.store->path, uid, gid) < 0)
> +                VIR_WARN("failed to remove scratch file '%s'",
> +                         job->data.backup.store->path);
> +        }
> +    }
> +}

Reviewed-by: Eric Blake <eblake at redhat.com>

-- 
Eric Blake, Principal Software Engineer
Red Hat, Inc.           +1-919-301-3226
Virtualization:  qemu.org | libvirt.org




More information about the libvir-list mailing list