diff options
author | Juan Quintela <quintela@redhat.com> | 2017-09-05 12:50:22 +0200 |
---|---|---|
committer | Juan Quintela <quintela@redhat.com> | 2017-10-23 18:03:43 +0200 |
commit | 87db1a7d89677e3dbc8b3763e417b9376009bdbb (patch) | |
tree | 0fd3fcbae6a9c1dfd3f92402ce364e5522b9c7f9 /migration/migration.c | |
parent | 40a5532f820e26f98d081a49aff9283cd63bd5fa (diff) |
migration: Improve migration thread error handling
We now report errors also when we finish migration, not only on info
migrate. We plan to use this error from several places, and we want
the first error to happen to win, so we add an mutex to order it.
Signed-off-by: Juan Quintela <quintela@redhat.com>
Reviewed-by: Dr. David Alan Gilbert <dgilbert@redhat.com>
Diffstat (limited to 'migration/migration.c')
-rw-r--r-- | migration/migration.c | 19 |
1 files changed, 16 insertions, 3 deletions
diff --git a/migration/migration.c b/migration/migration.c index a058f8b46d..62761d5705 100644 --- a/migration/migration.c +++ b/migration/migration.c @@ -1084,19 +1084,30 @@ static void migrate_fd_cleanup(void *opaque) MIGRATION_STATUS_CANCELLED); } + if (s->error) { + /* It is used on info migrate. We can't free it */ + error_report_err(error_copy(s->error)); + } notifier_list_notify(&migration_state_notifiers, s); block_cleanup_parameters(s); } +void migrate_set_error(MigrationState *s, const Error *error) +{ + qemu_mutex_lock(&s->error_mutex); + if (!s->error) { + s->error = error_copy(error); + } + qemu_mutex_unlock(&s->error_mutex); +} + void migrate_fd_error(MigrationState *s, const Error *error) { trace_migrate_fd_error(error_get_pretty(error)); assert(s->to_dst_file == NULL); migrate_set_state(&s->state, MIGRATION_STATUS_SETUP, MIGRATION_STATUS_FAILED); - if (!s->error) { - s->error = error_copy(error); - } + migrate_set_error(s, error); notifier_list_notify(&migration_state_notifiers, s); block_cleanup_parameters(s); } @@ -2427,6 +2438,7 @@ static void migration_instance_finalize(Object *obj) MigrationState *ms = MIGRATION_OBJ(obj); MigrationParameters *params = &ms->parameters; + qemu_mutex_destroy(&ms->error_mutex); g_free(params->tls_hostname); g_free(params->tls_creds); qemu_sem_destroy(&ms->pause_sem); @@ -2441,6 +2453,7 @@ static void migration_instance_init(Object *obj) ms->xbzrle_cache_size = DEFAULT_MIGRATE_CACHE_SIZE; ms->mbps = -1; qemu_sem_init(&ms->pause_sem, 0); + qemu_mutex_init(&ms->error_mutex); params->tls_hostname = g_strdup(""); params->tls_creds = g_strdup(""); |