Message ID | 20180502104740.12123-24-peterx@redhat.com |
---|---|
State | New |
Headers | show |
Series | Migration: postcopy failure recovery | expand |
* Peter Xu (peterx@redhat.com) wrote: > It pauses an ongoing migration. Currently it only supports postcopy. > Note that this command will work on either side of the migration. > Basically when we trigger this on one side, it'll interrupt the other > side as well since the other side will get notified on the disconnect > event. > > However, it's still possible that the other side is not notified, for > example, when the network is totally broken, or due to some firewall > configuration changes. In that case, we will also need to run the same > command on the other side so both sides will go into the paused state. > > Signed-off-by: Peter Xu <peterx@redhat.com> Reviewed-by: Dr. David Alan Gilbert <dgilbert@redhat.com> (I don't really like the name 'pause' but I can't think of a better one) > --- > qapi/migration.json | 16 ++++++++++++++++ > migration/migration.c | 29 +++++++++++++++++++++++++++++ > 2 files changed, 45 insertions(+) > > diff --git a/qapi/migration.json b/qapi/migration.json > index a1c2c238ab..bf403d2dd2 100644 > --- a/qapi/migration.json > +++ b/qapi/migration.json > @@ -1211,3 +1211,19 @@ > ## > { 'command': 'migrate-recover', 'data': { 'uri': 'str' }, > 'allow-oob': true } > + > +## > +# @migrate-pause: > +# > +# Pause a migration. Currently it only supports postcopy. > +# > +# Returns: nothing. > +# > +# Example: > +# > +# -> { "execute": "migrate-pause" } > +# <- { "return": {} } > +# > +# Since: 2.12 > +## > +{ 'command': 'migrate-pause', 'allow-oob': true } > diff --git a/migration/migration.c b/migration/migration.c > index 25f26052d2..03e4950976 100644 > --- a/migration/migration.c > +++ b/migration/migration.c > @@ -1502,6 +1502,35 @@ void qmp_migrate_recover(const char *uri, Error **errp) > qemu_start_incoming_migration(uri, errp); > } > > +void qmp_migrate_pause(Error **errp) > +{ > + MigrationState *ms = migrate_get_current(); > + MigrationIncomingState *mis = migration_incoming_get_current(); > + int ret; > + > + if (ms->state == MIGRATION_STATUS_POSTCOPY_ACTIVE) { > + /* Source side, during postcopy */ > + qemu_mutex_lock(&ms->qemu_file_lock); > + ret = qemu_file_shutdown(ms->to_dst_file); > + qemu_mutex_unlock(&ms->qemu_file_lock); > + if (ret) { > + error_setg(errp, "Failed to pause source migration"); > + } > + return; > + } > + > + if (mis->state == MIGRATION_STATUS_POSTCOPY_ACTIVE) { > + ret = qemu_file_shutdown(mis->from_src_file); > + if (ret) { > + error_setg(errp, "Failed to pause destination migration"); > + } > + return; > + } > + > + error_setg(errp, "migrate-pause is currently only supported " > + "during postcopy-active state"); > +} > + > bool migration_is_blocked(Error **errp) > { > if (qemu_savevm_state_blocked(errp)) { > -- > 2.14.3 > -- Dr. David Alan Gilbert / dgilbert@redhat.com / Manchester, UK
diff --git a/qapi/migration.json b/qapi/migration.json index a1c2c238ab..bf403d2dd2 100644 --- a/qapi/migration.json +++ b/qapi/migration.json @@ -1211,3 +1211,19 @@ ## { 'command': 'migrate-recover', 'data': { 'uri': 'str' }, 'allow-oob': true } + +## +# @migrate-pause: +# +# Pause a migration. Currently it only supports postcopy. +# +# Returns: nothing. +# +# Example: +# +# -> { "execute": "migrate-pause" } +# <- { "return": {} } +# +# Since: 2.12 +## +{ 'command': 'migrate-pause', 'allow-oob': true } diff --git a/migration/migration.c b/migration/migration.c index 25f26052d2..03e4950976 100644 --- a/migration/migration.c +++ b/migration/migration.c @@ -1502,6 +1502,35 @@ void qmp_migrate_recover(const char *uri, Error **errp) qemu_start_incoming_migration(uri, errp); } +void qmp_migrate_pause(Error **errp) +{ + MigrationState *ms = migrate_get_current(); + MigrationIncomingState *mis = migration_incoming_get_current(); + int ret; + + if (ms->state == MIGRATION_STATUS_POSTCOPY_ACTIVE) { + /* Source side, during postcopy */ + qemu_mutex_lock(&ms->qemu_file_lock); + ret = qemu_file_shutdown(ms->to_dst_file); + qemu_mutex_unlock(&ms->qemu_file_lock); + if (ret) { + error_setg(errp, "Failed to pause source migration"); + } + return; + } + + if (mis->state == MIGRATION_STATUS_POSTCOPY_ACTIVE) { + ret = qemu_file_shutdown(mis->from_src_file); + if (ret) { + error_setg(errp, "Failed to pause destination migration"); + } + return; + } + + error_setg(errp, "migrate-pause is currently only supported " + "during postcopy-active state"); +} + bool migration_is_blocked(Error **errp) { if (qemu_savevm_state_blocked(errp)) {
It pauses an ongoing migration. Currently it only supports postcopy. Note that this command will work on either side of the migration. Basically when we trigger this on one side, it'll interrupt the other side as well since the other side will get notified on the disconnect event. However, it's still possible that the other side is not notified, for example, when the network is totally broken, or due to some firewall configuration changes. In that case, we will also need to run the same command on the other side so both sides will go into the paused state. Signed-off-by: Peter Xu <peterx@redhat.com> --- qapi/migration.json | 16 ++++++++++++++++ migration/migration.c | 29 +++++++++++++++++++++++++++++ 2 files changed, 45 insertions(+)