Deliver the downtime breakdown also via `query-migrate` to allow users to understand what their downtime value represents.
Signed-off-by: Joao Martins <joao.m.mart...@oracle.com> --- qapi/migration.json | 22 ++++++++++++++++++++++ migration/migration.c | 14 ++++++++++++++ 2 files changed, 36 insertions(+) diff --git a/qapi/migration.json b/qapi/migration.json index 2d91fbcb22ff..088e1b2bf440 100644 --- a/qapi/migration.json +++ b/qapi/migration.json @@ -217,6 +217,27 @@ 'data': [ 'start', 'stop', 'precopy-iterable', 'precopy-noniterable', 'resume-return-path' ] } +## +# @DowntimeStats: +# +# Detailed migration downtime statistics. +# +# @stop: Time taken to stop the VM during switchover. +# +# @precopy: Time taken to save all precopy state during switchover. +# +# @precopy-iterable: Time taken to save all precopy iterable state. +# +# @precopy-noniterable: Time taken to save all precopy non iterable state. +# +# @resume-return-path: Time taken to resume if return path is enabled, +# otherwise zero. +# +# Since: 8.2 +## +{ 'struct': 'DowntimeStats', + 'data': {'stop': 'int64', 'precopy': 'int64', 'precopy-iterable': 'int64', + 'precopy-noniterable': 'int64', 'resume-return-path': 'int64' } } ## # @MigrationInfo: @@ -308,6 +329,7 @@ '*total-time': 'int', '*expected-downtime': 'int', '*downtime': 'int', + '*downtime-stats': 'DowntimeStats', '*setup-time': 'int', '*cpu-throttle-percentage': 'int', '*error-desc': 'str', diff --git a/migration/migration.c b/migration/migration.c index 4b5bed3eb09b..dec6c88fbff9 100644 --- a/migration/migration.c +++ b/migration/migration.c @@ -921,6 +921,19 @@ static int64_t migrate_get_downtime_resume_rp(MigrationState *s) return 0; } +static void populate_downtime_info(MigrationInfo *info, MigrationState *s) +{ + DowntimeStats *stats; + + info->downtime_stats = g_malloc0(sizeof(*info->downtime_stats)); + stats = info->downtime_stats; + stats->stop = migrate_get_downtime_stop(s); + stats->precopy_iterable = migrate_get_downtime_precopy_iterable(s); + stats->precopy_noniterable = migrate_get_downtime_precopy_noniterable(s); + stats->precopy = stats->precopy_iterable + stats->precopy_noniterable; + stats->resume_return_path = migrate_get_downtime_resume_rp(s); +} + static void populate_time_info(MigrationInfo *info, MigrationState *s) { info->has_status = true; @@ -939,6 +952,7 @@ static void populate_time_info(MigrationInfo *info, MigrationState *s) if (migrate_show_downtime(s)) { info->has_downtime = true; info->downtime = s->downtime; + populate_downtime_info(info, s); } else { info->has_expected_downtime = true; info->expected_downtime = s->expected_downtime; -- 2.39.3