[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[PULL 18/18] migration: Read state once
From: |
Dr. David Alan Gilbert (git) |
Subject: |
[PULL 18/18] migration: Read state once |
Date: |
Thu, 21 Apr 2022 19:40:52 +0100 |
From: "Dr. David Alan Gilbert" <dgilbert@redhat.com>
The 'status' field for the migration is updated normally using
an atomic operation from the migration thread.
Most readers of it aren't that careful, and in most cases it doesn't
matter.
In query_migrate->fill_source_migration_info the 'state'
is read twice; the first time to decide which state fields to fill in,
and then secondly to copy the state to the status field; that can end up
with a status that's inconsistent; e.g. setting up the fields
for 'setup' and then having an 'active' status. In that case
libvirt gets upset by the lack of ram info.
The symptom is:
libvirt.libvirtError: internal error: migration was active, but no RAM info
was set
Read the state exactly once in fill_source_migration_info.
This is a possible fix for:
https://bugzilla.redhat.com/show_bug.cgi?id=2074205
Signed-off-by: Dr. David Alan Gilbert <dgilbert@redhat.com>
Message-Id: <20220413113329.103696-1-dgilbert@redhat.com>
Reviewed-by: Juan Quintela <quintela@redhat.com>
Reviewed-by: Peter Xu <peterx@redhat.com>
Signed-off-by: Dr. David Alan Gilbert <dgilbert@redhat.com>
---
migration/migration.c | 5 +++--
1 file changed, 3 insertions(+), 2 deletions(-)
diff --git a/migration/migration.c b/migration/migration.c
index cc00b344a9..5a31b23bd6 100644
--- a/migration/migration.c
+++ b/migration/migration.c
@@ -1084,6 +1084,7 @@ static void populate_disk_info(MigrationInfo *info)
static void fill_source_migration_info(MigrationInfo *info)
{
MigrationState *s = migrate_get_current();
+ int state = qatomic_read(&s->state);
GSList *cur_blocker = migration_blockers;
info->blocked_reasons = NULL;
@@ -1103,7 +1104,7 @@ static void fill_source_migration_info(MigrationInfo
*info)
}
info->has_blocked_reasons = info->blocked_reasons != NULL;
- switch (s->state) {
+ switch (state) {
case MIGRATION_STATUS_NONE:
/* no migration has happened ever */
/* do not overwrite destination migration status */
@@ -1148,7 +1149,7 @@ static void fill_source_migration_info(MigrationInfo
*info)
info->has_status = true;
break;
}
- info->status = s->state;
+ info->status = state;
}
typedef enum WriteTrackingSupport {
--
2.35.1
- [PULL 10/18] migration: Postpone releasing MigrationState.hostname, (continued)
- [PULL 10/18] migration: Postpone releasing MigrationState.hostname, Dr. David Alan Gilbert (git), 2022/04/21
- [PULL 15/18] migration: Move channel setup out of postcopy_try_recover(), Dr. David Alan Gilbert (git), 2022/04/21
- [PULL 14/18] migration: Export ram_load_postcopy(), Dr. David Alan Gilbert (git), 2022/04/21
- [PULL 16/18] migration: Allow migrate-recover to run multiple times, Dr. David Alan Gilbert (git), 2022/04/21
- [PULL 09/18] tests: expand the migration precopy helper to support failures, Dr. David Alan Gilbert (git), 2022/04/21
- [PULL 07/18] tests: introduce ability to provide hooks for migration precopy test, Dr. David Alan Gilbert (git), 2022/04/21
- [PULL 06/18] tests: merge code for UNIX and TCP migration pre-copy tests, Dr. David Alan Gilbert (git), 2022/04/21
- [PULL 03/18] tests: print newline after QMP response in qtest logs, Dr. David Alan Gilbert (git), 2022/04/21
- [PULL 11/18] migration: Drop multifd tls_hostname cache, Dr. David Alan Gilbert (git), 2022/04/21
- [PULL 13/18] migration: Move migrate_allow_multifd and helpers into migration.c, Dr. David Alan Gilbert (git), 2022/04/21
- [PULL 18/18] migration: Read state once,
Dr. David Alan Gilbert (git) <=
- [PULL 12/18] migration: Add pss.postcopy_requested status, Dr. David Alan Gilbert (git), 2022/04/21
- [PULL 17/18] migration: Fix operator type, Dr. David Alan Gilbert (git), 2022/04/21
- Re: [PULL 00/18] migration queue, Richard Henderson, 2022/04/22