97 lines
3.8 KiB
Diff
97 lines
3.8 KiB
Diff
From 1107799dade18adccfca5097341b6dfb4977e69e Mon Sep 17 00:00:00 2001
|
|
From: Eric Blake <eblake@redhat.com>
|
|
Date: Mon, 22 Feb 2021 21:34:55 -0500
|
|
Subject: [PATCH 19/54] qemu-nbd: Use SOMAXCONN for socket listen() backlog
|
|
MIME-Version: 1.0
|
|
Content-Type: text/plain; charset=UTF-8
|
|
Content-Transfer-Encoding: 8bit
|
|
|
|
RH-Author: Eric Blake <eblake@redhat.com>
|
|
Message-id: <20210222213455.320104-2-eblake@redhat.com>
|
|
Patchwork-id: 101192
|
|
O-Subject: [RHEL-AV-8.4.0 qemu-kvm PATCH 1/1] qemu-nbd: Use SOMAXCONN for socket listen() backlog
|
|
Bugzilla: 1925345
|
|
RH-Acked-by: Richard Jones <rjones@redhat.com>
|
|
RH-Acked-by: Sergio Lopez Pascual <slp@redhat.com>
|
|
RH-Acked-by: Daniel P. Berrange <berrange@redhat.com>
|
|
|
|
Our default of a backlog of 1 connection is rather puny; it gets in
|
|
the way when we are explicitly allowing multiple clients (such as
|
|
qemu-nbd -e N [--shared], or nbd-server-start with its default
|
|
"max-connections":0 for unlimited), but is even a problem when we
|
|
stick to qemu-nbd's default of only 1 active client but use -t
|
|
[--persistent] where a second client can start using the server once
|
|
the first finishes. While the effects are less noticeable on TCP
|
|
sockets (since the client can poll() to learn when the server is ready
|
|
again), it is definitely observable on Unix sockets, where on Linux, a
|
|
client will fail with EAGAIN and no recourse but to sleep an arbitrary
|
|
amount of time before retrying if the server backlog is already full.
|
|
|
|
Since QMP nbd-server-start is always persistent, it now always
|
|
requests a backlog of SOMAXCONN; meanwhile, qemu-nbd will request
|
|
SOMAXCONN if persistent, otherwise its backlog should be based on the
|
|
expected number of clients.
|
|
|
|
See https://bugzilla.redhat.com/1925045 for a demonstration of where
|
|
our low backlog prevents libnbd from connecting as many parallel
|
|
clients as it wants.
|
|
|
|
Reported-by: Richard W.M. Jones <rjones@redhat.com>
|
|
Signed-off-by: Eric Blake <eblake@redhat.com>
|
|
CC: qemu-stable@nongnu.org
|
|
Message-Id: <20210209152759.209074-2-eblake@redhat.com>
|
|
Tested-by: Richard W.M. Jones <rjones@redhat.com>
|
|
Reviewed-by: Daniel P. Berrangé <berrange@redhat.com>
|
|
Signed-off-by: Eric Blake <eblake@redhat.com>
|
|
(cherry picked from commit 582d4210eb2f2ab5baac328fe4b479cd86da1647)
|
|
Signed-off-by: Eric Blake <eblake@redhat.com>
|
|
Signed-off-by: Danilo C. L. de Paula <ddepaula@redhat.com>
|
|
---
|
|
blockdev-nbd.c | 7 ++++++-
|
|
qemu-nbd.c | 10 +++++++++-
|
|
2 files changed, 15 insertions(+), 2 deletions(-)
|
|
|
|
diff --git a/blockdev-nbd.c b/blockdev-nbd.c
|
|
index d8443d235b..b264620b98 100644
|
|
--- a/blockdev-nbd.c
|
|
+++ b/blockdev-nbd.c
|
|
@@ -134,7 +134,12 @@ void nbd_server_start(SocketAddress *addr, const char *tls_creds,
|
|
qio_net_listener_set_name(nbd_server->listener,
|
|
"nbd-listener");
|
|
|
|
- if (qio_net_listener_open_sync(nbd_server->listener, addr, 1, errp) < 0) {
|
|
+ /*
|
|
+ * Because this server is persistent, a backlog of SOMAXCONN is
|
|
+ * better than trying to size it to max_connections.
|
|
+ */
|
|
+ if (qio_net_listener_open_sync(nbd_server->listener, addr, SOMAXCONN,
|
|
+ errp) < 0) {
|
|
goto error;
|
|
}
|
|
|
|
diff --git a/qemu-nbd.c b/qemu-nbd.c
|
|
index 1d337b7504..ce1dc43d69 100644
|
|
--- a/qemu-nbd.c
|
|
+++ b/qemu-nbd.c
|
|
@@ -970,8 +970,16 @@ int main(int argc, char **argv)
|
|
|
|
server = qio_net_listener_new();
|
|
if (socket_activation == 0) {
|
|
+ int backlog;
|
|
+
|
|
+ if (persistent) {
|
|
+ backlog = SOMAXCONN;
|
|
+ } else {
|
|
+ backlog = MIN(shared, SOMAXCONN);
|
|
+ }
|
|
saddr = nbd_build_socket_address(sockpath, bindto, port);
|
|
- if (qio_net_listener_open_sync(server, saddr, 1, &local_err) < 0) {
|
|
+ if (qio_net_listener_open_sync(server, saddr, backlog,
|
|
+ &local_err) < 0) {
|
|
object_unref(OBJECT(server));
|
|
error_report_err(local_err);
|
|
exit(EXIT_FAILURE);
|
|
--
|
|
2.27.0
|
|
|