migration: Route errors down through migration_channel_connect
Route async errors (especially from sockets) down through migration_channel_connect and on to migrate_fd_connect where they can be cleaned up. Signed-off-by: Dr. David Alan Gilbert <dgilbert@redhat.com> Reviewed-by: Juan Quintela <quintela@redhat.com> Signed-off-by: Juan Quintela <quintela@redhat.com> Signed-off-by: Dr. David Alan Gilbert <dgilbert@redhat.com>
This commit is contained in:
parent
cce8040bb0
commit
688a3dcba9
@ -55,29 +55,29 @@ void migration_channel_process_incoming(QIOChannel *ioc)
|
|||||||
* @s: Current migration state
|
* @s: Current migration state
|
||||||
* @ioc: Channel to which we are connecting
|
* @ioc: Channel to which we are connecting
|
||||||
* @hostname: Where we want to connect
|
* @hostname: Where we want to connect
|
||||||
|
* @error: Error indicating failure to connect, free'd here
|
||||||
*/
|
*/
|
||||||
void migration_channel_connect(MigrationState *s,
|
void migration_channel_connect(MigrationState *s,
|
||||||
QIOChannel *ioc,
|
QIOChannel *ioc,
|
||||||
const char *hostname)
|
const char *hostname,
|
||||||
|
Error *error)
|
||||||
{
|
{
|
||||||
trace_migration_set_outgoing_channel(
|
trace_migration_set_outgoing_channel(
|
||||||
ioc, object_get_typename(OBJECT(ioc)), hostname);
|
ioc, object_get_typename(OBJECT(ioc)), hostname, error);
|
||||||
|
|
||||||
|
if (!error) {
|
||||||
|
if (s->parameters.tls_creds &&
|
||||||
|
*s->parameters.tls_creds &&
|
||||||
|
!object_dynamic_cast(OBJECT(ioc),
|
||||||
|
TYPE_QIO_CHANNEL_TLS)) {
|
||||||
|
migration_tls_channel_connect(s, ioc, hostname, &error);
|
||||||
|
} else {
|
||||||
|
QEMUFile *f = qemu_fopen_channel_output(ioc);
|
||||||
|
|
||||||
|
s->to_dst_file = f;
|
||||||
|
|
||||||
if (s->parameters.tls_creds &&
|
|
||||||
*s->parameters.tls_creds &&
|
|
||||||
!object_dynamic_cast(OBJECT(ioc),
|
|
||||||
TYPE_QIO_CHANNEL_TLS)) {
|
|
||||||
Error *local_err = NULL;
|
|
||||||
migration_tls_channel_connect(s, ioc, hostname, &local_err);
|
|
||||||
if (local_err) {
|
|
||||||
migrate_fd_error(s, local_err);
|
|
||||||
error_free(local_err);
|
|
||||||
}
|
}
|
||||||
} else {
|
|
||||||
QEMUFile *f = qemu_fopen_channel_output(ioc);
|
|
||||||
|
|
||||||
s->to_dst_file = f;
|
|
||||||
|
|
||||||
migrate_fd_connect(s, NULL);
|
|
||||||
}
|
}
|
||||||
|
migrate_fd_connect(s, error);
|
||||||
|
error_free(error);
|
||||||
}
|
}
|
||||||
|
@ -22,5 +22,6 @@ void migration_channel_process_incoming(QIOChannel *ioc);
|
|||||||
|
|
||||||
void migration_channel_connect(MigrationState *s,
|
void migration_channel_connect(MigrationState *s,
|
||||||
QIOChannel *ioc,
|
QIOChannel *ioc,
|
||||||
const char *hostname);
|
const char *hostname,
|
||||||
|
Error *error_in);
|
||||||
#endif
|
#endif
|
||||||
|
@ -39,7 +39,7 @@ void exec_start_outgoing_migration(MigrationState *s, const char *command, Error
|
|||||||
}
|
}
|
||||||
|
|
||||||
qio_channel_set_name(ioc, "migration-exec-outgoing");
|
qio_channel_set_name(ioc, "migration-exec-outgoing");
|
||||||
migration_channel_connect(s, ioc, NULL);
|
migration_channel_connect(s, ioc, NULL, NULL);
|
||||||
object_unref(OBJECT(ioc));
|
object_unref(OBJECT(ioc));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -39,7 +39,7 @@ void fd_start_outgoing_migration(MigrationState *s, const char *fdname, Error **
|
|||||||
}
|
}
|
||||||
|
|
||||||
qio_channel_set_name(QIO_CHANNEL(ioc), "migration-fd-outgoing");
|
qio_channel_set_name(QIO_CHANNEL(ioc), "migration-fd-outgoing");
|
||||||
migration_channel_connect(s, ioc, NULL);
|
migration_channel_connect(s, ioc, NULL, NULL);
|
||||||
object_unref(OBJECT(ioc));
|
object_unref(OBJECT(ioc));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -79,12 +79,10 @@ static void socket_outgoing_migration(QIOTask *task,
|
|||||||
|
|
||||||
if (qio_task_propagate_error(task, &err)) {
|
if (qio_task_propagate_error(task, &err)) {
|
||||||
trace_migration_socket_outgoing_error(error_get_pretty(err));
|
trace_migration_socket_outgoing_error(error_get_pretty(err));
|
||||||
migrate_fd_error(data->s, err);
|
|
||||||
error_free(err);
|
|
||||||
} else {
|
} else {
|
||||||
trace_migration_socket_outgoing_connected(data->hostname);
|
trace_migration_socket_outgoing_connected(data->hostname);
|
||||||
migration_channel_connect(data->s, sioc, data->hostname);
|
|
||||||
}
|
}
|
||||||
|
migration_channel_connect(data->s, sioc, data->hostname, err);
|
||||||
object_unref(OBJECT(sioc));
|
object_unref(OBJECT(sioc));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -118,11 +118,10 @@ 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);
|
|
||||||
} 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, err);
|
||||||
object_unref(OBJECT(ioc));
|
object_unref(OBJECT(ioc));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -114,7 +114,7 @@ migrate_transferred(uint64_t tranferred, uint64_t time_spent, double bandwidth,
|
|||||||
process_incoming_migration_co_end(int ret, int ps) "ret=%d postcopy-state=%d"
|
process_incoming_migration_co_end(int ret, int ps) "ret=%d postcopy-state=%d"
|
||||||
process_incoming_migration_co_postcopy_end_main(void) ""
|
process_incoming_migration_co_postcopy_end_main(void) ""
|
||||||
migration_set_incoming_channel(void *ioc, const char *ioctype) "ioc=%p ioctype=%s"
|
migration_set_incoming_channel(void *ioc, const char *ioctype) "ioc=%p ioctype=%s"
|
||||||
migration_set_outgoing_channel(void *ioc, const char *ioctype, const char *hostname) "ioc=%p ioctype=%s hostname=%s"
|
migration_set_outgoing_channel(void *ioc, const char *ioctype, const char *hostname, void *err) "ioc=%p ioctype=%s hostname=%s err=%p"
|
||||||
|
|
||||||
# migration/rdma.c
|
# migration/rdma.c
|
||||||
qemu_rdma_accept_incoming_migration(void) ""
|
qemu_rdma_accept_incoming_migration(void) ""
|
||||||
|
Loading…
Reference in New Issue
Block a user