migrate: Share common MigrationParameters struct

It is rather verbose, and slightly error-prone, to repeat
the same set of parameters for input (migrate-set-parameters)
as for output (query-migrate-parameters), where the only
difference is whether the members are optional.  We can just
document that the optional members will always be present
on output, and then share a common struct between both
commands.  The next patch can then reduce the amount of
code needed on input.

Also, we made a mistake in qemu 2.7 of returning an empty
string during 'query-migrate-parameters' when there is no
TLS, rather than omitting TLS details entirely.  Technically,
this change risks breaking any 2.7 client that is hard-coded
to expect the parameter's existence; on the other hand, clients
that are portable to 2.6 already must be prepared for those
members to not be present.

And this gets rid of yet one more place where the QMP output
visitor is silently converting a NULL string into "" (which
is a hack I ultimately want to kill off).

Signed-off-by: Eric Blake <eblake@redhat.com>
Reviewed-by: Marc-André Lureau <marcandre.lureau@redhat.com>
Reviewed-by: Juan Quintela <quintela@redhat.com>
Signed-off-by: Juan Quintela <quintela@redhat.com>
This commit is contained in:
Eric Blake 2016-09-08 22:14:15 -05:00 committed by Juan Quintela
parent bb2b777cf9
commit de63ab6124
3 changed files with 41 additions and 60 deletions

9
hmp.c
View File

@ -284,27 +284,32 @@ void hmp_info_migrate_parameters(Monitor *mon, const QDict *qdict)
if (params) { if (params) {
monitor_printf(mon, "parameters:"); monitor_printf(mon, "parameters:");
assert(params->has_compress_level);
monitor_printf(mon, " %s: %" PRId64, monitor_printf(mon, " %s: %" PRId64,
MigrationParameter_lookup[MIGRATION_PARAMETER_COMPRESS_LEVEL], MigrationParameter_lookup[MIGRATION_PARAMETER_COMPRESS_LEVEL],
params->compress_level); params->compress_level);
assert(params->has_compress_threads);
monitor_printf(mon, " %s: %" PRId64, monitor_printf(mon, " %s: %" PRId64,
MigrationParameter_lookup[MIGRATION_PARAMETER_COMPRESS_THREADS], MigrationParameter_lookup[MIGRATION_PARAMETER_COMPRESS_THREADS],
params->compress_threads); params->compress_threads);
assert(params->has_decompress_threads);
monitor_printf(mon, " %s: %" PRId64, monitor_printf(mon, " %s: %" PRId64,
MigrationParameter_lookup[MIGRATION_PARAMETER_DECOMPRESS_THREADS], MigrationParameter_lookup[MIGRATION_PARAMETER_DECOMPRESS_THREADS],
params->decompress_threads); params->decompress_threads);
assert(params->has_cpu_throttle_initial);
monitor_printf(mon, " %s: %" PRId64, monitor_printf(mon, " %s: %" PRId64,
MigrationParameter_lookup[MIGRATION_PARAMETER_CPU_THROTTLE_INITIAL], MigrationParameter_lookup[MIGRATION_PARAMETER_CPU_THROTTLE_INITIAL],
params->cpu_throttle_initial); params->cpu_throttle_initial);
assert(params->has_cpu_throttle_increment);
monitor_printf(mon, " %s: %" PRId64, monitor_printf(mon, " %s: %" PRId64,
MigrationParameter_lookup[MIGRATION_PARAMETER_CPU_THROTTLE_INCREMENT], MigrationParameter_lookup[MIGRATION_PARAMETER_CPU_THROTTLE_INCREMENT],
params->cpu_throttle_increment); params->cpu_throttle_increment);
monitor_printf(mon, " %s: '%s'", monitor_printf(mon, " %s: '%s'",
MigrationParameter_lookup[MIGRATION_PARAMETER_TLS_CREDS], MigrationParameter_lookup[MIGRATION_PARAMETER_TLS_CREDS],
params->tls_creds ? : ""); params->has_tls_creds ? params->tls_creds : "");
monitor_printf(mon, " %s: '%s'", monitor_printf(mon, " %s: '%s'",
MigrationParameter_lookup[MIGRATION_PARAMETER_TLS_HOSTNAME], MigrationParameter_lookup[MIGRATION_PARAMETER_TLS_HOSTNAME],
params->tls_hostname ? : ""); params->has_tls_hostname ? params->tls_hostname : "");
monitor_printf(mon, "\n"); monitor_printf(mon, "\n");
} }

View File

@ -559,12 +559,19 @@ MigrationParameters *qmp_query_migrate_parameters(Error **errp)
MigrationState *s = migrate_get_current(); MigrationState *s = migrate_get_current();
params = g_malloc0(sizeof(*params)); params = g_malloc0(sizeof(*params));
params->has_compress_level = true;
params->compress_level = s->parameters.compress_level; params->compress_level = s->parameters.compress_level;
params->has_compress_threads = true;
params->compress_threads = s->parameters.compress_threads; params->compress_threads = s->parameters.compress_threads;
params->has_decompress_threads = true;
params->decompress_threads = s->parameters.decompress_threads; params->decompress_threads = s->parameters.decompress_threads;
params->has_cpu_throttle_initial = true;
params->cpu_throttle_initial = s->parameters.cpu_throttle_initial; params->cpu_throttle_initial = s->parameters.cpu_throttle_initial;
params->has_cpu_throttle_increment = true;
params->cpu_throttle_increment = s->parameters.cpu_throttle_increment; params->cpu_throttle_increment = s->parameters.cpu_throttle_increment;
params->has_tls_creds = !!s->parameters.tls_creds;
params->tls_creds = g_strdup(s->parameters.tls_creds); params->tls_creds = g_strdup(s->parameters.tls_creds);
params->has_tls_hostname = !!s->parameters.tls_hostname;
params->tls_hostname = g_strdup(s->parameters.tls_hostname); params->tls_hostname = g_strdup(s->parameters.tls_hostname);
return params; return params;

View File

@ -668,75 +668,45 @@
# #
# @migrate-set-parameters # @migrate-set-parameters
# #
# Set the following migration parameters # Set various migration parameters. See MigrationParameters for details.
#
# @compress-level: compression level
#
# @compress-threads: compression thread count
#
# @decompress-threads: decompression thread count
#
# @cpu-throttle-initial: Initial percentage of time guest cpus are throttled
# when migration auto-converge is activated. The
# default value is 20. (Since 2.7)
#
# @cpu-throttle-increment: throttle percentage increase each time
# auto-converge detects that migration is not making
# progress. The default value is 10. (Since 2.7)
#
# @tls-creds: ID of the 'tls-creds' object that provides credentials for
# establishing a TLS connection over the migration data channel.
# On the outgoing side of the migration, the credentials must
# be for a 'client' endpoint, while for the incoming side the
# credentials must be for a 'server' endpoint. Setting this
# will enable TLS for all migrations. The default is unset,
# resulting in unsecured migration at the QEMU level. (Since 2.7)
#
# @tls-hostname: hostname of the target host for the migration. This is
# required when using x509 based TLS credentials and the
# migration URI does not already include a hostname. For
# example if using fd: or exec: based migration, the
# hostname must be provided so that the server's x509
# certificate identity can be validated. (Since 2.7)
# #
# Since: 2.4 # Since: 2.4
## ##
{ 'command': 'migrate-set-parameters', { 'command': 'migrate-set-parameters',
'data': { '*compress-level': 'int', 'data': 'MigrationParameters' }
'*compress-threads': 'int',
'*decompress-threads': 'int',
'*cpu-throttle-initial': 'int',
'*cpu-throttle-increment': 'int',
'*tls-creds': 'str',
'*tls-hostname': 'str'} }
# #
# @MigrationParameters # @MigrationParameters
# #
# @compress-level: compression level # Optional members can be omitted on input ('migrate-set-parameters')
# but most members will always be present on output
# ('query-migrate-parameters'), with the exception of tls-creds and
# tls-hostname.
# #
# @compress-threads: compression thread count # @compress-level: #optional compression level
# #
# @decompress-threads: decompression thread count # @compress-threads: #optional compression thread count
# #
# @cpu-throttle-initial: Initial percentage of time guest cpus are throttled # @decompress-threads: #optional decompression thread count
# when migration auto-converge is activated. The
# default value is 20. (Since 2.7)
# #
# @cpu-throttle-increment: throttle percentage increase each time # @cpu-throttle-initial: #optional Initial percentage of time guest cpus are
# throttledwhen migration auto-converge is activated.
# The default value is 20. (Since 2.7)
#
# @cpu-throttle-increment: #optional throttle percentage increase each time
# auto-converge detects that migration is not making # auto-converge detects that migration is not making
# progress. The default value is 10. (Since 2.7) # progress. The default value is 10. (Since 2.7)
# #
# @tls-creds: ID of the 'tls-creds' object that provides credentials for # @tls-creds: #optional ID of the 'tls-creds' object that provides credentials
# establishing a TLS connection over the migration data channel. # for establishing a TLS connection over the migration data
# On the outgoing side of the migration, the credentials must # channel. On the outgoing side of the migration, the credentials
# be for a 'client' endpoint, while for the incoming side the # must be for a 'client' endpoint, while for the incoming side the
# credentials must be for a 'server' endpoint. Setting this # credentials must be for a 'server' endpoint. Setting this
# will enable TLS for all migrations. The default is unset, # will enable TLS for all migrations. The default is unset,
# resulting in unsecured migration at the QEMU level. (Since 2.7) # resulting in unsecured migration at the QEMU level. (Since 2.7)
# #
# @tls-hostname: hostname of the target host for the migration. This is # @tls-hostname: #optional hostname of the target host for the migration. This
# required when using x509 based TLS credentials and the # is required when using x509 based TLS credentials and the
# migration URI does not already include a hostname. For # migration URI does not already include a hostname. For
# example if using fd: or exec: based migration, the # example if using fd: or exec: based migration, the
# hostname must be provided so that the server's x509 # hostname must be provided so that the server's x509
@ -745,14 +715,13 @@
# Since: 2.4 # Since: 2.4
## ##
{ 'struct': 'MigrationParameters', { 'struct': 'MigrationParameters',
'data': { 'compress-level': 'int', 'data': { '*compress-level': 'int',
'compress-threads': 'int', '*compress-threads': 'int',
'decompress-threads': 'int', '*decompress-threads': 'int',
'cpu-throttle-initial': 'int', '*cpu-throttle-initial': 'int',
'cpu-throttle-increment': 'int', '*cpu-throttle-increment': 'int',
'tls-creds': 'str', '*tls-creds': 'str',
'tls-hostname': 'str'} } '*tls-hostname': 'str'} }
## ##
# @query-migrate-parameters # @query-migrate-parameters
# #