Skip to content

Commit a59136f

Browse files
committed
migration/socket: Close the listener at the end
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 <[email protected]> Reviewed-by: Daniel P. Berrangé <[email protected]> Message-Id: <[email protected]> Signed-off-by: Dr. David Alan Gilbert <[email protected]>
1 parent 1df6ddb commit a59136f

File tree

2 files changed

+23
-6
lines changed

2 files changed

+23
-6
lines changed

migration/multifd.c

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1166,6 +1166,11 @@ bool multifd_recv_all_channels_created(void)
11661166
return true;
11671167
}
11681168

1169+
if (!multifd_recv_state) {
1170+
/* Called before any connections created */
1171+
return false;
1172+
}
1173+
11691174
return thread_count == qatomic_read(&multifd_recv_state->count);
11701175
}
11711176

migration/socket.c

Lines changed: 18 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -126,22 +126,31 @@ static void socket_accept_incoming_migration(QIONetListener *listener,
126126
{
127127
trace_migration_socket_incoming_accepted();
128128

129-
qio_channel_set_name(QIO_CHANNEL(cioc), "migration-socket-incoming");
130-
migration_channel_process_incoming(QIO_CHANNEL(cioc));
131-
132129
if (migration_has_all_channels()) {
133-
/* Close listening socket as its no longer needed */
134-
qio_net_listener_disconnect(listener);
135-
object_unref(OBJECT(listener));
130+
error_report("%s: Extra incoming migration connection; ignoring",
131+
__func__);
132+
return;
136133
}
134+
135+
qio_channel_set_name(QIO_CHANNEL(cioc), "migration-socket-incoming");
136+
migration_channel_process_incoming(QIO_CHANNEL(cioc));
137137
}
138138

139+
static void
140+
socket_incoming_migration_end(void *opaque)
141+
{
142+
QIONetListener *listener = opaque;
143+
144+
qio_net_listener_disconnect(listener);
145+
object_unref(OBJECT(listener));
146+
}
139147

140148
static void
141149
socket_start_incoming_migration_internal(SocketAddress *saddr,
142150
Error **errp)
143151
{
144152
QIONetListener *listener = qio_net_listener_new();
153+
MigrationIncomingState *mis = migration_incoming_get_current();
145154
size_t i;
146155
int num = 1;
147156

@@ -156,6 +165,9 @@ socket_start_incoming_migration_internal(SocketAddress *saddr,
156165
return;
157166
}
158167

168+
mis->transport_data = listener;
169+
mis->transport_cleanup = socket_incoming_migration_end;
170+
159171
qio_net_listener_set_client_func_full(listener,
160172
socket_accept_incoming_migration,
161173
NULL, NULL,

0 commit comments

Comments
 (0)