From a59136f3b126cfbcaa13a44fbdaf8df6e3d1885f Mon Sep 17 00:00:00 2001 From: "Dr. David Alan Gilbert" Date: Wed, 21 Apr 2021 12:28:33 +0100 Subject: [PATCH] migration/socket: Close the listener at the end MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Delay closing the listener until the cleanup hook at the end; mptcp needs the listener to stay open while the other paths come in. Signed-off-by: Dr. David Alan Gilbert Reviewed-by: Daniel P. Berrangé Message-Id: <20210421112834.107651-5-dgilbert@redhat.com> Signed-off-by: Dr. David Alan Gilbert --- migration/multifd.c | 5 +++++ migration/socket.c | 24 ++++++++++++++++++------ 2 files changed, 23 insertions(+), 6 deletions(-) diff --git a/migration/multifd.c b/migration/multifd.c index 2e8f001bc0..ab41590e71 100644 --- a/migration/multifd.c +++ b/migration/multifd.c @@ -1166,6 +1166,11 @@ bool multifd_recv_all_channels_created(void) return true; } + if (!multifd_recv_state) { + /* Called before any connections created */ + return false; + } + return thread_count == qatomic_read(&multifd_recv_state->count); } diff --git a/migration/socket.c b/migration/socket.c index 6016642e04..05705a32d8 100644 --- a/migration/socket.c +++ b/migration/socket.c @@ -126,22 +126,31 @@ static void socket_accept_incoming_migration(QIONetListener *listener, { trace_migration_socket_incoming_accepted(); + if (migration_has_all_channels()) { + error_report("%s: Extra incoming migration connection; ignoring", + __func__); + return; + } + qio_channel_set_name(QIO_CHANNEL(cioc), "migration-socket-incoming"); migration_channel_process_incoming(QIO_CHANNEL(cioc)); - - if (migration_has_all_channels()) { - /* Close listening socket as its no longer needed */ - qio_net_listener_disconnect(listener); - object_unref(OBJECT(listener)); - } } +static void +socket_incoming_migration_end(void *opaque) +{ + QIONetListener *listener = opaque; + + qio_net_listener_disconnect(listener); + object_unref(OBJECT(listener)); +} static void socket_start_incoming_migration_internal(SocketAddress *saddr, Error **errp) { QIONetListener *listener = qio_net_listener_new(); + MigrationIncomingState *mis = migration_incoming_get_current(); size_t i; int num = 1; @@ -156,6 +165,9 @@ socket_start_incoming_migration_internal(SocketAddress *saddr, return; } + mis->transport_data = listener; + mis->transport_cleanup = socket_incoming_migration_end; + qio_net_listener_set_client_func_full(listener, socket_accept_incoming_migration, NULL, NULL,