[libvirt] [PATCH 14/14] qemu: Implement virDomainMigrate*CompressionCache

Peter Krempa pkrempa at redhat.com
Fri Feb 22 08:46:14 UTC 2013


On 02/19/13 13:35, Jiri Denemark wrote:
> ---
>   src/qemu/qemu_driver.c       | 94 ++++++++++++++++++++++++++++++++++++++++++++
>   src/qemu/qemu_monitor.c      | 43 ++++++++++++++++++++
>   src/qemu/qemu_monitor.h      |  5 +++
>   src/qemu/qemu_monitor_json.c | 63 +++++++++++++++++++++++++++++
>   src/qemu/qemu_monitor_json.h |  5 +++
>   5 files changed, 210 insertions(+)
>
> diff --git a/src/qemu/qemu_driver.c b/src/qemu/qemu_driver.c
> index 07f7061..5aef22d 100644
> --- a/src/qemu/qemu_driver.c
> +++ b/src/qemu/qemu_driver.c
> @@ -10359,6 +10359,98 @@ cleanup:
>   }
>
>   static int
> +qemuDomainMigrateGetCompressionCache(virDomainPtr dom,
> +                                     unsigned long long *cacheSize,
> +                                     unsigned int flags)
> +{
> +    virQEMUDriverPtr driver = dom->conn->privateData;
> +    virDomainObjPtr vm;
> +    qemuDomainObjPrivatePtr priv;
> +    int ret = -1;
> +
> +    virCheckFlags(0, -1);
> +
> +    if (!(vm = qemuDomObjFromDomain(dom)))
> +        goto cleanup;
> +
> +    if (qemuDomainObjBeginJob(driver, vm, QEMU_JOB_QUERY) < 0)
> +        goto cleanup;
> +
> +    if (!virDomainObjIsActive(vm)) {
> +        virReportError(VIR_ERR_OPERATION_INVALID,
> +                       "%s", _("domain is not running"));
> +        goto endjob;
> +    }
> +
> +    priv = vm->privateData;
> +
> +    qemuDomainObjEnterMonitor(driver, vm);
> +
> +    ret = qemuMonitorGetMigrationCapability(
> +                priv->mon,
> +                QEMU_MONITOR_MIGRATION_CAPS_XBZRLE);
> +    if (ret == 0) {
> +        virReportError(VIR_ERR_OPERATION_UNSUPPORTED, "%s",
> +                       _("Compressed migration is not supported by "
> +                         "QEMU binary"));
> +    } else if (ret > 0) {
> +        ret = qemuMonitorGetMigrationCacheSize(priv->mon, cacheSize);
> +    }
> +
> +    qemuDomainObjExitMonitor(driver, vm);
> +
> +endjob:
> +    if (qemuDomainObjEndJob(driver, vm) == 0)
> +        vm = NULL;
> +
> +cleanup:
> +    if (vm)
> +        virObjectUnlock(vm);
> +    return ret;
> +}
> +
> +static int
> +qemuDomainMigrateSetCompressionCache(virDomainPtr dom,
> +                                     unsigned long long cacheSize,
> +                                     unsigned int flags)
> +{
> +    virQEMUDriverPtr driver = dom->conn->privateData;
> +    virDomainObjPtr vm;
> +    qemuDomainObjPrivatePtr priv;
> +    int ret = -1;
> +
> +    virCheckFlags(0, -1);
> +
> +    if (!(vm = qemuDomObjFromDomain(dom)))
> +        goto cleanup;
> +
> +    if (qemuDomainObjBeginJob(driver, vm, QEMU_JOB_MIGRATION_OP) < 0)
> +        goto cleanup;
> +
> +    if (!virDomainObjIsActive(vm)) {
> +        virReportError(VIR_ERR_OPERATION_INVALID,
> +                       "%s", _("domain is not running"));
> +        goto endjob;
> +    }
> +

Wouldn't it be better to check the xbzrle migration capability here too? 
To be able to provide better errors?

> +    priv = vm->privateData;
> +
> +    VIR_DEBUG("Setting compression cache to %llu B", cacheSize);
> +    qemuDomainObjEnterMonitor(driver, vm);
> +    ret = qemuMonitorSetMigrationCacheSize(priv->mon, cacheSize);
> +    qemuDomainObjExitMonitor(driver, vm);
> +
> +endjob:
> +    if (qemuDomainObjEndJob(driver, vm) == 0)
> +        vm = NULL;
> +
> +cleanup:
> +    if (vm)
> +        virObjectUnlock(vm);
> +    return ret;
> +}
> +
> +static int
>   qemuDomainMigrateSetMaxSpeed(virDomainPtr dom,
>                                unsigned long bandwidth,
>                                unsigned int flags)

ACK with or without my suggestion implemented as I don't have a strong 
opinion on this.

Peter




More information about the libvir-list mailing list