Allow the migrate and migrate_incoming commands to pass the migration
configuration options all at once, dispensing the use of
migrate-set-parameters and migrate-set-capabilities.
The motivation of this is to simplify the interface with the
management layer and avoid the usage of several command invocations to
configure a migration. It also avoids stale parameters from a previous
migration to influence the current migration.
The options that are changed during the migration can still be set
with the existing commands.
The order of precedence is:
'config' argument > -global migration cmdline > migrate-set-parameters
> defaults (migration_properties)
I.e. the config takes precedence over all, values not present in the
config assume the default values. The -global migration command line
option allows the defaults to be overridden for debug.
Signed-off-by: Fabiano Rosas <farosas@suse.de>
---
migration/migration-hmp-cmds.c | 5 +++--
migration/migration.c | 28 +++++++++++++++++++++++++---
migration/options.c | 19 +++++++++++++++++++
migration/options.h | 4 +++-
qapi/migration.json | 16 ++++++++++++++++
system/vl.c | 3 ++-
6 files changed, 68 insertions(+), 7 deletions(-)
diff --git a/migration/migration-hmp-cmds.c b/migration/migration-hmp-cmds.c
index 7f234d5aa8..2075d6c6e5 100644
--- a/migration/migration-hmp-cmds.c
+++ b/migration/migration-hmp-cmds.c
@@ -583,7 +583,7 @@ void hmp_migrate_incoming(Monitor *mon, const QDict *qdict)
}
QAPI_LIST_PREPEND(caps, g_steal_pointer(&channel));
- qmp_migrate_incoming(NULL, true, caps, true, false, &err);
+ qmp_migrate_incoming(NULL, true, caps, NULL, true, false, &err);
qapi_free_MigrationChannelList(caps);
end:
@@ -960,7 +960,8 @@ void hmp_migrate(Monitor *mon, const QDict *qdict)
}
QAPI_LIST_PREPEND(caps, g_steal_pointer(&channel));
- qmp_migrate(NULL, true, caps, false, false, true, resume, &err);
+ qmp_migrate(NULL, true, caps, NULL, false, false, true, resume,
+ &err);
if (hmp_handle_error(mon, err)) {
return;
}
diff --git a/migration/migration.c b/migration/migration.c
index 13b70dbb94..42a2a6e8f2 100644
--- a/migration/migration.c
+++ b/migration/migration.c
@@ -1917,13 +1917,24 @@ void migrate_del_blocker(Error **reasonp)
void qmp_migrate_incoming(const char *uri, bool has_channels,
MigrationChannelList *channels,
- bool has_exit_on_error, bool exit_on_error,
- Error **errp)
+ MigrationParameters *config, bool has_exit_on_error,
+ bool exit_on_error, Error **errp)
{
Error *local_err = NULL;
static bool once = true;
+ MigrationState *s = migrate_get_current();
MigrationIncomingState *mis = migration_incoming_get_current();
+ if (config) {
+ /*
+ * If a config was provided, all options set previously by
+ * migrate-set-parameters get ignored.
+ */
+ if (!migrate_params_override(s, config, errp)) {
+ return;
+ }
+ }
+
if (!once) {
error_setg(errp, "The incoming migration has already been started");
return;
@@ -2183,7 +2194,8 @@ static gboolean qmp_migrate_finish_cb(QIOChannel *channel,
}
void qmp_migrate(const char *uri, bool has_channels,
- MigrationChannelList *channels, bool has_detach, bool detach,
+ MigrationChannelList *channels,
+ bool has_detach, bool detach, MigrationParameters *config,
bool has_resume, bool resume, Error **errp)
{
bool resume_requested;
@@ -2194,6 +2206,16 @@ void qmp_migrate(const char *uri, bool has_channels,
MigrationChannel *channelv[MIGRATION_CHANNEL_TYPE__MAX] = { NULL };
MigrationChannel *cpr_channel = NULL;
+ if (config) {
+ /*
+ * If a config was provided, all options set previously by
+ * migrate-set-parameters get ignored.
+ */
+ if (!migrate_params_override(s, config, errp)) {
+ return;
+ }
+ }
+
/*
* Having preliminary checks for uri and channel
*/
diff --git a/migration/options.c b/migration/options.c
index 2f6ccefa21..0f6d021093 100644
--- a/migration/options.c
+++ b/migration/options.c
@@ -1398,6 +1398,25 @@ void migrate_params_store_defaults(MigrationState *s)
s->initial_params = QAPI_CLONE(MigrationParameters, &s->parameters);
}
+bool migrate_params_override(MigrationState *s, MigrationParameters *new,
+ Error **errp)
+{
+ ERRP_GUARD();
+
+ assert(bql_locked());
+
+ /* reset to initial parameters */
+ migrate_params_apply(s->initial_params);
+
+ /* apply the new ones on top */
+ qmp_migrate_set_parameters(new, errp);
+ if (*errp) {
+ return false;
+ }
+
+ return true;
+}
+
void qmp_migrate_set_parameters(MigrationParameters *params, Error **errp)
{
MigrationState *s = migrate_get_current();
diff --git a/migration/options.h b/migration/options.h
index 91154c4322..fa56c977a6 100644
--- a/migration/options.h
+++ b/migration/options.h
@@ -83,6 +83,8 @@ void migrate_capability_set_compat(MigrationParameters *params, int i,
bool val);
void migrate_capabilities_set_compat(MigrationParameters *params,
MigrationCapabilityStatusList *caps);
-bool migrate_caps_check(const MigrationParameters *const new, Error **errp);
+bool migrate_caps_check(const MigrationParameters *new, Error **errp);
void migrate_params_store_defaults(MigrationState *s);
+bool migrate_params_override(MigrationState *s, MigrationParameters *new,
+ Error **errp);
#endif
diff --git a/qapi/migration.json b/qapi/migration.json
index c5e6ea1a2d..11b7d7ebec 100644
--- a/qapi/migration.json
+++ b/qapi/migration.json
@@ -1456,6 +1456,13 @@
#
# @resume: resume one paused migration, default "off". (since 3.0)
#
+# @config: migration configuration options, previously set via
+# @migrate-set-parameters and @migrate-set-capabilities. Setting
+# this argument causes all migration configuration options
+# previously set via @migrate-set-parameters to be ignored.
+# Configuration options not set will assume their default
+# values. (since 10.1)
+#
# Features:
#
# @deprecated: Argument @detach is deprecated.
@@ -1520,6 +1527,7 @@
'data': {'*uri': 'str',
'*channels': [ 'MigrationChannel' ],
'*detach': { 'type': 'bool', 'features': [ 'deprecated' ] },
+ '*config': 'MigrationParameters',
'*resume': 'bool' } }
##
@@ -1539,6 +1547,13 @@
# error details could be retrieved with query-migrate.
# (since 9.1)
#
+# @config: migration configuration options, previously set via
+# @migrate-set-parameters and @migrate-set-capabilities. Setting
+# this argument causes all migration configuration options
+# previously set via @migrate-set-parameters to be ignored.
+# Configuration options not set will assume their default
+# values. (since 10.1)
+#
# Since: 2.3
#
# .. admonition:: Notes
@@ -1592,6 +1607,7 @@
{ 'command': 'migrate-incoming',
'data': {'*uri': 'str',
'*channels': [ 'MigrationChannel' ],
+ '*config': 'MigrationParameters',
'*exit-on-error': 'bool' } }
##
diff --git a/system/vl.c b/system/vl.c
index 3b7057e6c6..b29fd24d08 100644
--- a/system/vl.c
+++ b/system/vl.c
@@ -2823,7 +2823,8 @@ void qmp_x_exit_preconfig(Error **errp)
g_new0(MigrationChannelList, 1);
channels->value = incoming_channels[MIGRATION_CHANNEL_TYPE_MAIN];
- qmp_migrate_incoming(NULL, true, channels, true, true, &local_err);
+ qmp_migrate_incoming(NULL, true, channels, NULL, true, true,
+ &local_err);
if (local_err) {
error_reportf_err(local_err, "-incoming %s: ", incoming);
exit(1);
--
2.35.3