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 | ||||
|  * @ioc: Channel to which we are connecting | ||||
|  * @hostname: Where we want to connect | ||||
|  * @error: Error indicating failure to connect, free'd here | ||||
|  */ | ||||
| void migration_channel_connect(MigrationState *s, | ||||
|                                QIOChannel *ioc, | ||||
|                                const char *hostname) | ||||
|                                const char *hostname, | ||||
|                                Error *error) | ||||
| { | ||||
|     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, | ||||
|                                QIOChannel *ioc, | ||||
|                                const char *hostname); | ||||
|                                const char *hostname, | ||||
|                                Error *error_in); | ||||
| #endif | ||||
|  | ||||
| @ -39,7 +39,7 @@ void exec_start_outgoing_migration(MigrationState *s, const char *command, Error | ||||
|     } | ||||
| 
 | ||||
|     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)); | ||||
| } | ||||
| 
 | ||||
|  | ||||
| @ -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"); | ||||
|     migration_channel_connect(s, ioc, NULL); | ||||
|     migration_channel_connect(s, ioc, NULL, NULL); | ||||
|     object_unref(OBJECT(ioc)); | ||||
| } | ||||
| 
 | ||||
|  | ||||
| @ -79,12 +79,10 @@ static void socket_outgoing_migration(QIOTask *task, | ||||
| 
 | ||||
|     if (qio_task_propagate_error(task, &err)) { | ||||
|         trace_migration_socket_outgoing_error(error_get_pretty(err)); | ||||
|         migrate_fd_error(data->s, err); | ||||
|         error_free(err); | ||||
|     } else { | ||||
|         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)); | ||||
| } | ||||
| 
 | ||||
|  | ||||
| @ -118,11 +118,10 @@ static void migration_tls_outgoing_handshake(QIOTask *task, | ||||
| 
 | ||||
|     if (qio_task_propagate_error(task, &err)) { | ||||
|         trace_migration_tls_outgoing_handshake_error(error_get_pretty(err)); | ||||
|         migrate_fd_error(s, err); | ||||
|     } else { | ||||
|         trace_migration_tls_outgoing_handshake_complete(); | ||||
|         migration_channel_connect(s, ioc, NULL); | ||||
|     } | ||||
|     migration_channel_connect(s, ioc, NULL, err); | ||||
|     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_postcopy_end_main(void) "" | ||||
| 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 | ||||
| qemu_rdma_accept_incoming_migration(void) "" | ||||
|  | ||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user
	 Dr. David Alan Gilbert
						Dr. David Alan Gilbert