Message ID | 20230630212902.19925-5-farosas@suse.de |
---|---|
State | New |
Headers | show |
Series | [v3,1/6] tests/qtest: migration: Expose migrate_set_capability | expand |
On Fri, Jun 30, 2023 at 06:29:00PM -0300, Fabiano Rosas wrote: > We are sending a migration event of MIGRATION_STATUS_SETUP at > qemu_start_incoming_migration but never actually setting the state. > > This creates a window between qmp_migrate_incoming and > process_incoming_migration_co where the migration status is still > MIGRATION_STATUS_NONE. Calling query-migrate during this time will > return an empty response even though the incoming migration command > has already been issued. > > Commit 7cf1fe6d68 ("migration: Add migration events on target side") > has added support to the 'events' capability to the incoming part of > migration, but chose to send the SETUP event without setting the > state. I'm assuming this was a mistake. > > This introduces a change in behavior, any QMP client waiting for the > SETUP event will hang, unless it has previously enabled the 'events' > capability. Having the capability enabled is sufficient to continue to > receive the event. > > Signed-off-by: Fabiano Rosas <farosas@suse.de> Reviewed-by: Peter Xu <peterx@redhat.com>
diff --git a/migration/migration.c b/migration/migration.c index 92ad9f2470..f2d2782101 100644 --- a/migration/migration.c +++ b/migration/migration.c @@ -425,13 +425,16 @@ void migrate_add_address(SocketAddress *address) static void qemu_start_incoming_migration(const char *uri, Error **errp) { const char *p = NULL; + MigrationIncomingState *mis = migration_incoming_get_current(); /* URI is not suitable for migration? */ if (!migration_channels_and_uri_compatible(uri, errp)) { return; } - qapi_event_send_migration(MIGRATION_STATUS_SETUP); + migrate_set_state(&mis->state, MIGRATION_STATUS_NONE, + MIGRATION_STATUS_SETUP); + if (strstart(uri, "tcp:", &p) || strstart(uri, "unix:", NULL) || strstart(uri, "vsock:", NULL)) { @@ -525,7 +528,7 @@ process_incoming_migration_co(void *opaque) mis->largest_page_size = qemu_ram_pagesize_largest(); postcopy_state_set(POSTCOPY_INCOMING_NONE); - migrate_set_state(&mis->state, MIGRATION_STATUS_NONE, + migrate_set_state(&mis->state, MIGRATION_STATUS_SETUP, MIGRATION_STATUS_ACTIVE); mis->loadvm_co = qemu_coroutine_self();
We are sending a migration event of MIGRATION_STATUS_SETUP at qemu_start_incoming_migration but never actually setting the state. This creates a window between qmp_migrate_incoming and process_incoming_migration_co where the migration status is still MIGRATION_STATUS_NONE. Calling query-migrate during this time will return an empty response even though the incoming migration command has already been issued. Commit 7cf1fe6d68 ("migration: Add migration events on target side") has added support to the 'events' capability to the incoming part of migration, but chose to send the SETUP event without setting the state. I'm assuming this was a mistake. This introduces a change in behavior, any QMP client waiting for the SETUP event will hang, unless it has previously enabled the 'events' capability. Having the capability enabled is sufficient to continue to receive the event. Signed-off-by: Fabiano Rosas <farosas@suse.de> --- migration/migration.c | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-)