[libvirt PATCH v4 2/4] qemu_monitor: add support for get qemu migration blockers
Laine Stump
laine at redhat.com
Thu Jul 21 05:09:51 UTC 2022
On 7/20/22 12:05 PM, Eugenio Pérez wrote:
> since qemu 6.0, if migration is blocked for some reason, 'query-migrate'
> will return an array of error strings describing the migration blockers.
> This can be used to check whether there are any devices blocking
> migration, etc.
>
> Enable qemu monitor to send this query. This will allow
> qemuMigrationSrcIsAllowed to dynamically ask for migration blockers,
> reducing duplication.
I reworded this commit log a bit - see the branch I linked in my
response to the cover letter and let me know if you approve.
>
> Signed-off-by: Eugenio Pérez <eperezma at redhat.com>
> Reviewed-by: Jiri Denemark <jdenemar at redhat.com>
> ---
> v4:
> * Separate return type into its own line
>
> v3:
> * Squash some patches
> * Return ok in qemuMonitorJSONGetMigrationBlockers is there are no
> blockers.
> * Move note to function doc.
> ---
> src/qemu/qemu_monitor.c | 11 +++++++++
> src/qemu/qemu_monitor.h | 4 ++++
> src/qemu/qemu_monitor_json.c | 44 ++++++++++++++++++++++++++++++++++++
> src/qemu/qemu_monitor_json.h | 3 +++
> 4 files changed, 62 insertions(+)
>
> diff --git a/src/qemu/qemu_monitor.c b/src/qemu/qemu_monitor.c
> index 109107eaae..e0939beecd 100644
> --- a/src/qemu/qemu_monitor.c
> +++ b/src/qemu/qemu_monitor.c
> @@ -4486,3 +4486,14 @@ qemuMonitorMigrateRecover(qemuMonitor *mon,
>
> return qemuMonitorJSONMigrateRecover(mon, uri);
> }
> +
> +int
> +qemuMonitorGetMigrationBlockers(qemuMonitor *mon,
> + char ***blockers)
We try to keep 2 blank lines between each function. I added in the extra
blank lines before and after this function.
> +{
> + VIR_DEBUG("blockers=%p", blockers);
> +
> + QEMU_CHECK_MONITOR(mon);
> +
> + return qemuMonitorJSONGetMigrationBlockers(mon, blockers);
> +}
> diff --git a/src/qemu/qemu_monitor.h b/src/qemu/qemu_monitor.h
> index cc1a0bc8c9..b82f198285 100644
> --- a/src/qemu/qemu_monitor.h
> +++ b/src/qemu/qemu_monitor.h
> @@ -1543,3 +1543,7 @@ qemuMonitorChangeMemoryRequestedSize(qemuMonitor *mon,
> int
> qemuMonitorMigrateRecover(qemuMonitor *mon,
> const char *uri);
> +
> +int
> +qemuMonitorGetMigrationBlockers(qemuMonitor *mon,
> + char ***blockers);
> diff --git a/src/qemu/qemu_monitor_json.c b/src/qemu/qemu_monitor_json.c
> index 5e4a86e5ad..6b26dfcb54 100644
> --- a/src/qemu/qemu_monitor_json.c
> +++ b/src/qemu/qemu_monitor_json.c
> @@ -3338,6 +3338,50 @@ int qemuMonitorJSONMigrate(qemuMonitor *mon,
> return 0;
> }
>
> +/*
> + * Get the exposed migration blockers.
> + *
> + * This function assume qemu has the capability of request them.
> + *
> + * It returns a NULL terminated array on blockers if there are any, or it set
> + * it to NULL otherwise.
> + */
> +int
> +qemuMonitorJSONGetMigrationBlockers(qemuMonitor *mon,
> + char ***blockers)
> +{
> + g_autoptr(virJSONValue) cmd = NULL;
> + g_autoptr(virJSONValue) reply = NULL;
> + virJSONValue *data;
> + virJSONValue *jblockers;
> + size_t i;
> +
> + *blockers = NULL;
> + if (!(cmd = qemuMonitorJSONMakeCommand("query-migrate", NULL)))
> + return -1;
> +
> + if (qemuMonitorJSONCommand(mon, cmd, &reply) < 0)
> + return -1;
> +
> + if (qemuMonitorJSONCheckReply(cmd, reply, VIR_JSON_TYPE_OBJECT) < 0)
> + return -1;
> +
> + data = virJSONValueObjectGetObject(reply, "return");
> +
> + if (!(jblockers = virJSONValueObjectGetArray(data, "blocked-reasons")))
> + return 0;
> +
> + *blockers = g_new0(char *, virJSONValueArraySize(jblockers) + 1);
> + for (i = 0; i < virJSONValueArraySize(jblockers); i++) {
> + virJSONValue *jblocker = virJSONValueArrayGet(jblockers, i);
> + const char *blocker = virJSONValueGetString(jblocker);
> +
> + (*blockers)[i] = g_strdup(blocker);
> + }
> +
> + return 0;
> +}
> +
> int qemuMonitorJSONMigrateCancel(qemuMonitor *mon)
> {
> g_autoptr(virJSONValue) cmd = qemuMonitorJSONMakeCommand("migrate_cancel", NULL);
> diff --git a/src/qemu/qemu_monitor_json.h b/src/qemu/qemu_monitor_json.h
> index 2759566892..e4c65e250e 100644
> --- a/src/qemu/qemu_monitor_json.h
> +++ b/src/qemu/qemu_monitor_json.h
> @@ -184,6 +184,9 @@ qemuMonitorJSONMigrate(qemuMonitor *mon,
> unsigned int flags,
> const char *uri);
> int
> +qemuMonitorJSONGetMigrationBlockers(qemuMonitor *mon,
> + char ***blockers);
> +int
> qemuMonitorJSONGetSpiceMigrationStatus(qemuMonitor *mon,
> bool *spice_migrated);
>
More information about the libvir-list
mailing list