[libvirt] [PATCH v2.1 08/11] qemu_migration: Implement qemuMigrationStartNBDServer()

Jiri Denemark jdenemar at redhat.com
Thu Jan 17 23:14:42 UTC 2013


On Fri, Jan 11, 2013 at 17:52:20 +0100, Michal Privoznik wrote:
> We need to start NBD server and feed it with all non-<shared/> disks.
> However, after qemuDomainObjEnterMonitorAsync the domain object
> is unlocked so we cannot touch its disk definitions. Therefore,
> we must prepare the list of disk IDs prior entering monitor.
> ---
>  src/qemu/qemu_migration.c | 59 +++++++++++++++++++++++++++++++++++++++++++++--
>  1 file changed, 57 insertions(+), 2 deletions(-)
> 
> diff --git a/src/qemu/qemu_migration.c b/src/qemu/qemu_migration.c
> index 367747c..fc410c0 100644
> --- a/src/qemu/qemu_migration.c
> +++ b/src/qemu/qemu_migration.c
> @@ -35,6 +35,7 @@
>  #include "qemu_domain.h"
>  #include "qemu_process.h"
>  #include "qemu_capabilities.h"
> +#include "qemu_command.h"
>  #include "qemu_cgroup.h"
>  
>  #include "domain_audit.h"
> @@ -1116,8 +1117,62 @@ qemuMigrationStartNBDServer(virQEMUDriverPtr driver ATTRIBUTE_UNUSED,
>                              virDomainObjPtr vm ATTRIBUTE_UNUSED,
>                              int *nbdPort ATTRIBUTE_UNUSED)
>  {
> -    /* do nothing for now */
> -    return 0;
> +    int ret = -1;
> +    qemuDomainObjPrivatePtr priv = vm->privateData;
> +    int port = qemuMigrationNextPort();
> +    const char *listen = "0.0.0.0";

Does nbd-server-start support IPv6?

> +    char **disks = NULL;
> +    size_t i, ndisks = 0;
> +
> +    for (i = 0; i < vm->def->ndisks; i++) {
> +        virDomainDiskDefPtr disk = vm->def->disks[i];
> +
> +        /* skip shared disks */
> +        if (disk->shared)
> +            continue;
> +
> +        if (VIR_REALLOC_N(disks, ndisks + 1) < 0) {
> +            virReportOOMError();
> +            goto cleanup;
> +        }

Personally, I'd just preallocate the array for vm->def->ndisks elements
rather than doing several allocations in a loop.

> +
> +        if (virAsprintf(&disks[ndisks++], "%s%s",
> +                        QEMU_DRIVE_HOST_PREFIX, disk->info.alias) < 0) {
> +            virReportOOMError();
> +            goto cleanup;
> +        }
> +    }
> +
> +    if (!ndisks) {
> +        /* Hooray! Nothing to care about */
> +        ret = 0;
> +        goto cleanup;
> +    }
> +
> +    if (qemuDomainObjEnterMonitorAsync(driver, vm,
> +                                       QEMU_ASYNC_JOB_MIGRATION_IN) < 0)
> +        goto cleanup;
> +
> +    if (qemuMonitorNBDServerStart(priv->mon, listen, port) < 0)
> +        goto endjob;
> +
> +    for (i = 0; i < ndisks; i++) {
> +        if (qemuMonitorNBDServerAdd(priv->mon, disks[i], true) < 0) {
> +            VIR_WARN("Unable to add '%s' to NDB server", disks[i]);
> +            goto endjob;
> +        }
> +    }
> +
> +    *nbdPort = port;
> +    ret = 0;
> +
> +endjob:
> +    qemuDomainObjExitMonitorWithDriver(driver, vm);
> +cleanup:
> +    for (i = 0; i < ndisks; i++)
> +        VIR_FREE(disks[i]);
> +    VIR_FREE(disks);
> +    return ret;
>  }

And definitely squash this patch into 6/11.

Jirka




More information about the libvir-list mailing list