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>
This commit is contained in:
parent
40a5532f82
commit
87db1a7d89
@ -1084,19 +1084,30 @@ static void migrate_fd_cleanup(void *opaque)
|
|||||||
MIGRATION_STATUS_CANCELLED);
|
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);
|
notifier_list_notify(&migration_state_notifiers, s);
|
||||||
block_cleanup_parameters(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)
|
void migrate_fd_error(MigrationState *s, const Error *error)
|
||||||
{
|
{
|
||||||
trace_migrate_fd_error(error_get_pretty(error));
|
trace_migrate_fd_error(error_get_pretty(error));
|
||||||
assert(s->to_dst_file == NULL);
|
assert(s->to_dst_file == NULL);
|
||||||
migrate_set_state(&s->state, MIGRATION_STATUS_SETUP,
|
migrate_set_state(&s->state, MIGRATION_STATUS_SETUP,
|
||||||
MIGRATION_STATUS_FAILED);
|
MIGRATION_STATUS_FAILED);
|
||||||
if (!s->error) {
|
migrate_set_error(s, error);
|
||||||
s->error = error_copy(error);
|
|
||||||
}
|
|
||||||
notifier_list_notify(&migration_state_notifiers, s);
|
notifier_list_notify(&migration_state_notifiers, s);
|
||||||
block_cleanup_parameters(s);
|
block_cleanup_parameters(s);
|
||||||
}
|
}
|
||||||
@ -2427,6 +2438,7 @@ static void migration_instance_finalize(Object *obj)
|
|||||||
MigrationState *ms = MIGRATION_OBJ(obj);
|
MigrationState *ms = MIGRATION_OBJ(obj);
|
||||||
MigrationParameters *params = &ms->parameters;
|
MigrationParameters *params = &ms->parameters;
|
||||||
|
|
||||||
|
qemu_mutex_destroy(&ms->error_mutex);
|
||||||
g_free(params->tls_hostname);
|
g_free(params->tls_hostname);
|
||||||
g_free(params->tls_creds);
|
g_free(params->tls_creds);
|
||||||
qemu_sem_destroy(&ms->pause_sem);
|
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->xbzrle_cache_size = DEFAULT_MIGRATE_CACHE_SIZE;
|
||||||
ms->mbps = -1;
|
ms->mbps = -1;
|
||||||
qemu_sem_init(&ms->pause_sem, 0);
|
qemu_sem_init(&ms->pause_sem, 0);
|
||||||
|
qemu_mutex_init(&ms->error_mutex);
|
||||||
|
|
||||||
params->tls_hostname = g_strdup("");
|
params->tls_hostname = g_strdup("");
|
||||||
params->tls_creds = g_strdup("");
|
params->tls_creds = g_strdup("");
|
||||||
|
@ -132,8 +132,12 @@ struct MigrationState
|
|||||||
int64_t colo_checkpoint_time;
|
int64_t colo_checkpoint_time;
|
||||||
QEMUTimer *colo_delay_timer;
|
QEMUTimer *colo_delay_timer;
|
||||||
|
|
||||||
/* The last error that occurred */
|
/* The first error that has occurred.
|
||||||
|
We used the mutex to be able to return the 1st error message */
|
||||||
Error *error;
|
Error *error;
|
||||||
|
/* mutex to protect errp */
|
||||||
|
QemuMutex error_mutex;
|
||||||
|
|
||||||
/* Do we have to clean up -b/-i from old migrate parameters */
|
/* Do we have to clean up -b/-i from old migrate parameters */
|
||||||
/* This feature is deprecated and will be removed */
|
/* This feature is deprecated and will be removed */
|
||||||
bool must_remove_block_options;
|
bool must_remove_block_options;
|
||||||
@ -162,6 +166,7 @@ bool migration_has_all_channels(void);
|
|||||||
|
|
||||||
uint64_t migrate_max_downtime(void);
|
uint64_t migrate_max_downtime(void);
|
||||||
|
|
||||||
|
void migrate_set_error(MigrationState *s, const Error *error);
|
||||||
void migrate_fd_error(MigrationState *s, const Error *error);
|
void migrate_fd_error(MigrationState *s, const Error *error);
|
||||||
|
|
||||||
void migrate_fd_connect(MigrationState *s);
|
void migrate_fd_connect(MigrationState *s);
|
||||||
|
@ -119,7 +119,6 @@ static void migration_tls_outgoing_handshake(QIOTask *task,
|
|||||||
if (qio_task_propagate_error(task, &err)) {
|
if (qio_task_propagate_error(task, &err)) {
|
||||||
trace_migration_tls_outgoing_handshake_error(error_get_pretty(err));
|
trace_migration_tls_outgoing_handshake_error(error_get_pretty(err));
|
||||||
migrate_fd_error(s, err);
|
migrate_fd_error(s, err);
|
||||||
error_free(err);
|
|
||||||
} else {
|
} else {
|
||||||
trace_migration_tls_outgoing_handshake_complete();
|
trace_migration_tls_outgoing_handshake_complete();
|
||||||
migration_channel_connect(s, ioc, NULL);
|
migration_channel_connect(s, ioc, NULL);
|
||||||
|
Loading…
Reference in New Issue
Block a user