[PATCH] Qemu: migration: Not bind RAM info with active migration status

Daniel P. Berrangé berrange at redhat.com
Tue Jul 28 10:32:43 UTC 2020


On Wed, Jul 15, 2020 at 02:18:01PM +0800, Keqian Zhu wrote:
> For that Qemu supports returning incoming migration info since its commit
> 65ace0604551 (migration: add postcopy total blocktime into query-migrate),
> which may contains active status, but without RAM info. Drop this binding
> relationship check in libvirt.

I'm not clear from this description what the actual bug in libvirt
is ?   What currently fails in libvirt that this patch fixes ?

> 
> Signed-off-by: Keqian Zhu <zhukeqian1 at huawei.com>
> ---
>  src/qemu/qemu_monitor_json.c | 88 +++++++++++++++++-------------------
>  1 file changed, 42 insertions(+), 46 deletions(-)
> 
> diff --git a/src/qemu/qemu_monitor_json.c b/src/qemu/qemu_monitor_json.c
> index d808c4b55b..ba8e340742 100644
> --- a/src/qemu/qemu_monitor_json.c
> +++ b/src/qemu/qemu_monitor_json.c
> @@ -3547,56 +3547,52 @@ qemuMonitorJSONGetMigrationStatsReply(virJSONValuePtr reply,
>      case QEMU_MONITOR_MIGRATION_STATUS_PRE_SWITCHOVER:
>      case QEMU_MONITOR_MIGRATION_STATUS_DEVICE:
>          ram = virJSONValueObjectGetObject(ret, "ram");
> -        if (!ram) {
> -            virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
> -                           _("migration was active, but no RAM info was set"));
> -            return -1;
> -        }
> +        if (ram) {
> +            if (virJSONValueObjectGetNumberUlong(ram, "transferred",
> +                                                 &stats->ram_transferred) < 0) {
> +                virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
> +                               _("migration was active, but RAM 'transferred' "
> +                                 "data was missing"));
> +                return -1;
> +            }
> +            if (virJSONValueObjectGetNumberUlong(ram, "remaining",
> +                                                 &stats->ram_remaining) < 0) {
> +                virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
> +                               _("migration was active, but RAM 'remaining' "
> +                                 "data was missing"));
> +                return -1;
> +            }
> +            if (virJSONValueObjectGetNumberUlong(ram, "total",
> +                                                 &stats->ram_total) < 0) {
> +                virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
> +                               _("migration was active, but RAM 'total' "
> +                                 "data was missing"));
> +                return -1;
> +            }
>  
> -        if (virJSONValueObjectGetNumberUlong(ram, "transferred",
> -                                             &stats->ram_transferred) < 0) {
> -            virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
> -                           _("migration was active, but RAM 'transferred' "
> -                             "data was missing"));
> -            return -1;
> -        }
> -        if (virJSONValueObjectGetNumberUlong(ram, "remaining",
> -                                             &stats->ram_remaining) < 0) {
> -            virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
> -                           _("migration was active, but RAM 'remaining' "
> -                             "data was missing"));
> -            return -1;
> -        }
> -        if (virJSONValueObjectGetNumberUlong(ram, "total",
> -                                             &stats->ram_total) < 0) {
> -            virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
> -                           _("migration was active, but RAM 'total' "
> -                             "data was missing"));
> -            return -1;
> -        }
> +            if (virJSONValueObjectGetNumberDouble(ram, "mbps", &mbps) == 0 &&
> +                mbps > 0) {
> +                /* mpbs from QEMU reports Mbits/s (M as in 10^6 not Mi as 2^20) */
> +                stats->ram_bps = mbps * (1000 * 1000 / 8);
> +            }
>  
> -        if (virJSONValueObjectGetNumberDouble(ram, "mbps", &mbps) == 0 &&
> -            mbps > 0) {
> -            /* mpbs from QEMU reports Mbits/s (M as in 10^6 not Mi as 2^20) */
> -            stats->ram_bps = mbps * (1000 * 1000 / 8);
> +            if (virJSONValueObjectGetNumberUlong(ram, "duplicate",
> +                                                 &stats->ram_duplicate) == 0)
> +                stats->ram_duplicate_set = true;
> +            ignore_value(virJSONValueObjectGetNumberUlong(ram, "normal",
> +                                                          &stats->ram_normal));
> +            ignore_value(virJSONValueObjectGetNumberUlong(ram, "normal-bytes",
> +                                                          &stats->ram_normal_bytes));
> +            ignore_value(virJSONValueObjectGetNumberUlong(ram, "dirty-pages-rate",
> +                                                          &stats->ram_dirty_rate));
> +            ignore_value(virJSONValueObjectGetNumberUlong(ram, "page-size",
> +                                                          &stats->ram_page_size));
> +            ignore_value(virJSONValueObjectGetNumberUlong(ram, "dirty-sync-count",
> +                                                          &stats->ram_iteration));
> +            ignore_value(virJSONValueObjectGetNumberUlong(ram, "postcopy-requests",
> +                                                          &stats->ram_postcopy_reqs));
>          }
>  
> -        if (virJSONValueObjectGetNumberUlong(ram, "duplicate",
> -                                             &stats->ram_duplicate) == 0)
> -            stats->ram_duplicate_set = true;
> -        ignore_value(virJSONValueObjectGetNumberUlong(ram, "normal",
> -                                                      &stats->ram_normal));
> -        ignore_value(virJSONValueObjectGetNumberUlong(ram, "normal-bytes",
> -                                                      &stats->ram_normal_bytes));
> -        ignore_value(virJSONValueObjectGetNumberUlong(ram, "dirty-pages-rate",
> -                                                      &stats->ram_dirty_rate));
> -        ignore_value(virJSONValueObjectGetNumberUlong(ram, "page-size",
> -                                                      &stats->ram_page_size));
> -        ignore_value(virJSONValueObjectGetNumberUlong(ram, "dirty-sync-count",
> -                                                      &stats->ram_iteration));
> -        ignore_value(virJSONValueObjectGetNumberUlong(ram, "postcopy-requests",
> -                                                      &stats->ram_postcopy_reqs));
> -
>          disk = virJSONValueObjectGetObject(ret, "disk");
>          if (disk) {
>              rc = virJSONValueObjectGetNumberUlong(disk, "transferred",
> -- 
> 2.19.1
> 

Regards,
Daniel
-- 
|: https://berrange.com      -o-    https://www.flickr.com/photos/dberrange :|
|: https://libvirt.org         -o-            https://fstop138.berrange.com :|
|: https://entangle-photo.org    -o-    https://www.instagram.com/dberrange :|




More information about the libvir-list mailing list