migration: Fix migrate-set-parameters argument validation

Commit 741d4086c8 "migration: Use proper types in json" (v2.12.0)
switched MigrationParameters to narrower integer types, and removed
the simplified qmp_migrate_set_parameters()'s argument checking
accordingly.

Good idea, except qmp_migrate_set_parameters() takes
MigrateSetParameters, not MigrationParameters.  Its job is updating
migrate_get_current()->parameters (which *is* of type
MigrationParameters) according to its argument.  The integers now get
truncated silently.  Reproducer:

    ---> {'execute': 'query-migrate-parameters'}
    <--- {"return": {[...] "compress-threads": 8, [...]}}
    ---> {"execute": "migrate-set-parameters", "arguments": {"compress-threads": 257}}
    <--- {"return": {}}
    ---> {'execute': 'query-migrate-parameters'}
    <--- {"return": {[...] "compress-threads": 1, [...]}}

Fix by resynchronizing MigrateSetParameters with MigrationParameters.

Fixes: 741d4086c8
Signed-off-by: Markus Armbruster <armbru@redhat.com>
Reviewed-by: Dr. David Alan Gilbert <dgilbert@redhat.com>
Message-Id: <20210202141734.2488076-2-armbru@redhat.com>
Signed-off-by: Dr. David Alan Gilbert <dgilbert@redhat.com>
This commit is contained in:
Markus Armbruster 2021-02-02 15:17:31 +01:00 committed by Dr. David Alan Gilbert
parent c7243566d0
commit ec17de0ac0
2 changed files with 26 additions and 26 deletions

View File

@ -1294,11 +1294,11 @@ void hmp_migrate_set_parameter(Monitor *mon, const QDict *qdict)
switch (val) { switch (val) {
case MIGRATION_PARAMETER_COMPRESS_LEVEL: case MIGRATION_PARAMETER_COMPRESS_LEVEL:
p->has_compress_level = true; p->has_compress_level = true;
visit_type_int(v, param, &p->compress_level, &err); visit_type_uint8(v, param, &p->compress_level, &err);
break; break;
case MIGRATION_PARAMETER_COMPRESS_THREADS: case MIGRATION_PARAMETER_COMPRESS_THREADS:
p->has_compress_threads = true; p->has_compress_threads = true;
visit_type_int(v, param, &p->compress_threads, &err); visit_type_uint8(v, param, &p->compress_threads, &err);
break; break;
case MIGRATION_PARAMETER_COMPRESS_WAIT_THREAD: case MIGRATION_PARAMETER_COMPRESS_WAIT_THREAD:
p->has_compress_wait_thread = true; p->has_compress_wait_thread = true;
@ -1306,19 +1306,19 @@ void hmp_migrate_set_parameter(Monitor *mon, const QDict *qdict)
break; break;
case MIGRATION_PARAMETER_DECOMPRESS_THREADS: case MIGRATION_PARAMETER_DECOMPRESS_THREADS:
p->has_decompress_threads = true; p->has_decompress_threads = true;
visit_type_int(v, param, &p->decompress_threads, &err); visit_type_uint8(v, param, &p->decompress_threads, &err);
break; break;
case MIGRATION_PARAMETER_THROTTLE_TRIGGER_THRESHOLD: case MIGRATION_PARAMETER_THROTTLE_TRIGGER_THRESHOLD:
p->has_throttle_trigger_threshold = true; p->has_throttle_trigger_threshold = true;
visit_type_int(v, param, &p->throttle_trigger_threshold, &err); visit_type_uint8(v, param, &p->throttle_trigger_threshold, &err);
break; break;
case MIGRATION_PARAMETER_CPU_THROTTLE_INITIAL: case MIGRATION_PARAMETER_CPU_THROTTLE_INITIAL:
p->has_cpu_throttle_initial = true; p->has_cpu_throttle_initial = true;
visit_type_int(v, param, &p->cpu_throttle_initial, &err); visit_type_uint8(v, param, &p->cpu_throttle_initial, &err);
break; break;
case MIGRATION_PARAMETER_CPU_THROTTLE_INCREMENT: case MIGRATION_PARAMETER_CPU_THROTTLE_INCREMENT:
p->has_cpu_throttle_increment = true; p->has_cpu_throttle_increment = true;
visit_type_int(v, param, &p->cpu_throttle_increment, &err); visit_type_uint8(v, param, &p->cpu_throttle_increment, &err);
break; break;
case MIGRATION_PARAMETER_CPU_THROTTLE_TAILSLOW: case MIGRATION_PARAMETER_CPU_THROTTLE_TAILSLOW:
p->has_cpu_throttle_tailslow = true; p->has_cpu_throttle_tailslow = true;
@ -1326,7 +1326,7 @@ void hmp_migrate_set_parameter(Monitor *mon, const QDict *qdict)
break; break;
case MIGRATION_PARAMETER_MAX_CPU_THROTTLE: case MIGRATION_PARAMETER_MAX_CPU_THROTTLE:
p->has_max_cpu_throttle = true; p->has_max_cpu_throttle = true;
visit_type_int(v, param, &p->max_cpu_throttle, &err); visit_type_uint8(v, param, &p->max_cpu_throttle, &err);
break; break;
case MIGRATION_PARAMETER_TLS_CREDS: case MIGRATION_PARAMETER_TLS_CREDS:
p->has_tls_creds = true; p->has_tls_creds = true;
@ -1362,11 +1362,11 @@ void hmp_migrate_set_parameter(Monitor *mon, const QDict *qdict)
break; break;
case MIGRATION_PARAMETER_DOWNTIME_LIMIT: case MIGRATION_PARAMETER_DOWNTIME_LIMIT:
p->has_downtime_limit = true; p->has_downtime_limit = true;
visit_type_int(v, param, &p->downtime_limit, &err); visit_type_size(v, param, &p->downtime_limit, &err);
break; break;
case MIGRATION_PARAMETER_X_CHECKPOINT_DELAY: case MIGRATION_PARAMETER_X_CHECKPOINT_DELAY:
p->has_x_checkpoint_delay = true; p->has_x_checkpoint_delay = true;
visit_type_int(v, param, &p->x_checkpoint_delay, &err); visit_type_uint32(v, param, &p->x_checkpoint_delay, &err);
break; break;
case MIGRATION_PARAMETER_BLOCK_INCREMENTAL: case MIGRATION_PARAMETER_BLOCK_INCREMENTAL:
p->has_block_incremental = true; p->has_block_incremental = true;
@ -1374,7 +1374,7 @@ void hmp_migrate_set_parameter(Monitor *mon, const QDict *qdict)
break; break;
case MIGRATION_PARAMETER_MULTIFD_CHANNELS: case MIGRATION_PARAMETER_MULTIFD_CHANNELS:
p->has_multifd_channels = true; p->has_multifd_channels = true;
visit_type_int(v, param, &p->multifd_channels, &err); visit_type_uint8(v, param, &p->multifd_channels, &err);
break; break;
case MIGRATION_PARAMETER_MULTIFD_COMPRESSION: case MIGRATION_PARAMETER_MULTIFD_COMPRESSION:
p->has_multifd_compression = true; p->has_multifd_compression = true;
@ -1383,11 +1383,11 @@ void hmp_migrate_set_parameter(Monitor *mon, const QDict *qdict)
break; break;
case MIGRATION_PARAMETER_MULTIFD_ZLIB_LEVEL: case MIGRATION_PARAMETER_MULTIFD_ZLIB_LEVEL:
p->has_multifd_zlib_level = true; p->has_multifd_zlib_level = true;
visit_type_int(v, param, &p->multifd_zlib_level, &err); visit_type_uint8(v, param, &p->multifd_zlib_level, &err);
break; break;
case MIGRATION_PARAMETER_MULTIFD_ZSTD_LEVEL: case MIGRATION_PARAMETER_MULTIFD_ZSTD_LEVEL:
p->has_multifd_zstd_level = true; p->has_multifd_zstd_level = true;
visit_type_int(v, param, &p->multifd_zstd_level, &err); visit_type_uint8(v, param, &p->multifd_zstd_level, &err);
break; break;
case MIGRATION_PARAMETER_XBZRLE_CACHE_SIZE: case MIGRATION_PARAMETER_XBZRLE_CACHE_SIZE:
p->has_xbzrle_cache_size = true; p->has_xbzrle_cache_size = true;

View File

@ -890,28 +890,28 @@
'*announce-max': 'size', '*announce-max': 'size',
'*announce-rounds': 'size', '*announce-rounds': 'size',
'*announce-step': 'size', '*announce-step': 'size',
'*compress-level': 'int', '*compress-level': 'uint8',
'*compress-threads': 'int', '*compress-threads': 'uint8',
'*compress-wait-thread': 'bool', '*compress-wait-thread': 'bool',
'*decompress-threads': 'int', '*decompress-threads': 'uint8',
'*throttle-trigger-threshold': 'int', '*throttle-trigger-threshold': 'uint8',
'*cpu-throttle-initial': 'int', '*cpu-throttle-initial': 'uint8',
'*cpu-throttle-increment': 'int', '*cpu-throttle-increment': 'uint8',
'*cpu-throttle-tailslow': 'bool', '*cpu-throttle-tailslow': 'bool',
'*tls-creds': 'StrOrNull', '*tls-creds': 'StrOrNull',
'*tls-hostname': 'StrOrNull', '*tls-hostname': 'StrOrNull',
'*tls-authz': 'StrOrNull', '*tls-authz': 'StrOrNull',
'*max-bandwidth': 'int', '*max-bandwidth': 'size',
'*downtime-limit': 'int', '*downtime-limit': 'uint64',
'*x-checkpoint-delay': 'int', '*x-checkpoint-delay': 'uint32',
'*block-incremental': 'bool', '*block-incremental': 'bool',
'*multifd-channels': 'int', '*multifd-channels': 'uint8',
'*xbzrle-cache-size': 'size', '*xbzrle-cache-size': 'size',
'*max-postcopy-bandwidth': 'size', '*max-postcopy-bandwidth': 'size',
'*max-cpu-throttle': 'int', '*max-cpu-throttle': 'uint8',
'*multifd-compression': 'MultiFDCompression', '*multifd-compression': 'MultiFDCompression',
'*multifd-zlib-level': 'int', '*multifd-zlib-level': 'uint8',
'*multifd-zstd-level': 'int', '*multifd-zstd-level': 'uint8',
'*block-bitmap-mapping': [ 'BitmapMigrationNodeAlias' ] } } '*block-bitmap-mapping': [ 'BitmapMigrationNodeAlias' ] } }
## ##