[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