net: add explicit info about connecting/listening state
When running 'info network', if the stream backend is still in the process of connecting, or waiting for an incoming connection, no information is displayed. There is also no way to distinguish whether the server is still in the process of setting up the listener socket, or whether it is ready to accept incoming client connections. This leads to a race condition in the netdev-socket qtest which launches a server process followed by a client process. Under high load conditions it is possible for the client to attempt to connect before the server is accepting clients. For the scenarios which do not set the 'reconnect' option, this opens up a race which can lead to the test scenario failing to reach the expected state. Now that 'info network' can distinguish between initialization phase and the listening phase, the netdev-socket qtest will correctly synchronize, such that the client QEMU is not spawned until the server is ready. This should solve the non-deterministic failures seen with the netdev-socket qtest. Signed-off-by: "Daniel P. Berrangé" <berrange@redhat.com> Message-ID: <20240104162942.211458-5-berrange@redhat.com> Reviewed-by: Stefan Hajnoczi <stefanha@redhat.com> Signed-off-by: Thomas Huth <thuth@redhat.com>
This commit is contained in:
parent
a298293866
commit
cc91ca64d8
@ -173,7 +173,7 @@ static gboolean net_stream_send(QIOChannel *ioc,
|
|||||||
|
|
||||||
net_socket_rs_init(&s->rs, net_stream_rs_finalize, false);
|
net_socket_rs_init(&s->rs, net_stream_rs_finalize, false);
|
||||||
s->nc.link_down = true;
|
s->nc.link_down = true;
|
||||||
qemu_set_info_str(&s->nc, "%s", "");
|
qemu_set_info_str(&s->nc, "listening");
|
||||||
|
|
||||||
qapi_event_send_netdev_stream_disconnected(s->nc.name);
|
qapi_event_send_netdev_stream_disconnected(s->nc.name);
|
||||||
net_stream_arm_reconnect(s);
|
net_stream_arm_reconnect(s);
|
||||||
@ -292,6 +292,7 @@ static void net_stream_server_listening(QIOTask *task, gpointer opaque)
|
|||||||
s->nc.link_down = true;
|
s->nc.link_down = true;
|
||||||
s->listener = qio_net_listener_new();
|
s->listener = qio_net_listener_new();
|
||||||
|
|
||||||
|
qemu_set_info_str(&s->nc, "listening");
|
||||||
net_socket_rs_init(&s->rs, net_stream_rs_finalize, false);
|
net_socket_rs_init(&s->rs, net_stream_rs_finalize, false);
|
||||||
qio_net_listener_set_client_func(s->listener, net_stream_listen, s, NULL);
|
qio_net_listener_set_client_func(s->listener, net_stream_listen, s, NULL);
|
||||||
qio_net_listener_add(s->listener, listen_sioc);
|
qio_net_listener_add(s->listener, listen_sioc);
|
||||||
@ -309,6 +310,7 @@ static int net_stream_server_init(NetClientState *peer,
|
|||||||
|
|
||||||
nc = qemu_new_net_client(&net_stream_info, peer, model, name);
|
nc = qemu_new_net_client(&net_stream_info, peer, model, name);
|
||||||
s = DO_UPCAST(NetStreamState, nc, nc);
|
s = DO_UPCAST(NetStreamState, nc, nc);
|
||||||
|
qemu_set_info_str(&s->nc, "initializing");
|
||||||
|
|
||||||
s->listen_ioc = QIO_CHANNEL(listen_sioc);
|
s->listen_ioc = QIO_CHANNEL(listen_sioc);
|
||||||
qio_channel_socket_listen_async(listen_sioc, addr, 0,
|
qio_channel_socket_listen_async(listen_sioc, addr, 0,
|
||||||
@ -400,6 +402,7 @@ static int net_stream_client_init(NetClientState *peer,
|
|||||||
|
|
||||||
nc = qemu_new_net_client(&net_stream_info, peer, model, name);
|
nc = qemu_new_net_client(&net_stream_info, peer, model, name);
|
||||||
s = DO_UPCAST(NetStreamState, nc, nc);
|
s = DO_UPCAST(NetStreamState, nc, nc);
|
||||||
|
qemu_set_info_str(&s->nc, "connecting");
|
||||||
|
|
||||||
s->ioc = QIO_CHANNEL(sioc);
|
s->ioc = QIO_CHANNEL(sioc);
|
||||||
s->nc.link_down = true;
|
s->nc.link_down = true;
|
||||||
|
@ -127,7 +127,7 @@ static void test_stream_inet_ipv4(void)
|
|||||||
"addr.ipv4=on,addr.ipv6=off,"
|
"addr.ipv4=on,addr.ipv6=off,"
|
||||||
"addr.host=127.0.0.1,addr.port=%d", port);
|
"addr.host=127.0.0.1,addr.port=%d", port);
|
||||||
|
|
||||||
EXPECT_STATE(qts0, "st0: index=0,type=stream,\r\n", 0);
|
EXPECT_STATE(qts0, "st0: index=0,type=stream,listening\r\n", 0);
|
||||||
|
|
||||||
qts1 = qtest_initf("-nodefaults -M none "
|
qts1 = qtest_initf("-nodefaults -M none "
|
||||||
"-netdev stream,server=false,id=st0,addr.type=inet,"
|
"-netdev stream,server=false,id=st0,addr.type=inet,"
|
||||||
@ -200,7 +200,7 @@ static void test_stream_unix_reconnect(void)
|
|||||||
"-netdev stream,id=st0,server=true,addr.type=unix,"
|
"-netdev stream,id=st0,server=true,addr.type=unix,"
|
||||||
"addr.path=%s", path);
|
"addr.path=%s", path);
|
||||||
|
|
||||||
EXPECT_STATE(qts0, "st0: index=0,type=stream,\r\n", 0);
|
EXPECT_STATE(qts0, "st0: index=0,type=stream,listening\r\n", 0);
|
||||||
|
|
||||||
qts1 = qtest_initf("-nodefaults -M none "
|
qts1 = qtest_initf("-nodefaults -M none "
|
||||||
"-netdev stream,server=false,id=st0,addr.type=unix,"
|
"-netdev stream,server=false,id=st0,addr.type=unix,"
|
||||||
@ -250,7 +250,7 @@ static void test_stream_inet_ipv6(void)
|
|||||||
"addr.ipv4=off,addr.ipv6=on,"
|
"addr.ipv4=off,addr.ipv6=on,"
|
||||||
"addr.host=::1,addr.port=%d", port);
|
"addr.host=::1,addr.port=%d", port);
|
||||||
|
|
||||||
EXPECT_STATE(qts0, "st0: index=0,type=stream,\r\n", 0);
|
EXPECT_STATE(qts0, "st0: index=0,type=stream,listening\r\n", 0);
|
||||||
|
|
||||||
qts1 = qtest_initf("-nodefaults -M none "
|
qts1 = qtest_initf("-nodefaults -M none "
|
||||||
"-netdev stream,server=false,id=st0,addr.type=inet,"
|
"-netdev stream,server=false,id=st0,addr.type=inet,"
|
||||||
@ -282,7 +282,7 @@ static void test_stream_unix(void)
|
|||||||
"addr.type=unix,addr.path=%s,",
|
"addr.type=unix,addr.path=%s,",
|
||||||
path);
|
path);
|
||||||
|
|
||||||
EXPECT_STATE(qts0, "st0: index=0,type=stream,\r\n", 0);
|
EXPECT_STATE(qts0, "st0: index=0,type=stream,listening\r\n", 0);
|
||||||
|
|
||||||
qts1 = qtest_initf("-nodefaults -M none "
|
qts1 = qtest_initf("-nodefaults -M none "
|
||||||
"-netdev stream,id=st0,server=false,"
|
"-netdev stream,id=st0,server=false,"
|
||||||
@ -314,7 +314,7 @@ static void test_stream_unix_abstract(void)
|
|||||||
"addr.abstract=on",
|
"addr.abstract=on",
|
||||||
path);
|
path);
|
||||||
|
|
||||||
EXPECT_STATE(qts0, "st0: index=0,type=stream,\r\n", 0);
|
EXPECT_STATE(qts0, "st0: index=0,type=stream,listening\r\n", 0);
|
||||||
|
|
||||||
qts1 = qtest_initf("-nodefaults -M none "
|
qts1 = qtest_initf("-nodefaults -M none "
|
||||||
"-netdev stream,id=st0,server=false,"
|
"-netdev stream,id=st0,server=false,"
|
||||||
|
Loading…
Reference in New Issue
Block a user