- kvm-nbd-server-Silence-server-warnings-on-port-probes.patch [RHEL-67863] - kvm-vhost-Add-stubs-for-the-migration-state-transfer-int.patch [RHEL-78372] - kvm-virtio-net-vhost-user-Implement-internal-migration.patch [RHEL-78372] - Resolves: RHEL-67863 (Ensure qemu as NBD server does not flood logs [rhel 9.6]) - Resolves: RHEL-78372 (Add vhost-user internal migration for passt [rhel-9])
106 lines
4.2 KiB
Diff
106 lines
4.2 KiB
Diff
From 908997de5fa9470549347d66f7c8e125989fa4b1 Mon Sep 17 00:00:00 2001
|
|
From: Eric Blake <eblake@redhat.com>
|
|
Date: Fri, 15 Nov 2024 13:55:53 -0600
|
|
Subject: [PATCH 1/3] nbd-server: Silence server warnings on port probes
|
|
|
|
RH-Author: Eric Blake <eblake@redhat.com>
|
|
RH-MergeRequest: 333: nbd-server: Silence server warnings on port probes
|
|
RH-Jira: RHEL-67863
|
|
RH-Acked-by: Stefan Hajnoczi <stefanha@redhat.com>
|
|
RH-Acked-by: Miroslav Rezanina <mrezanin@redhat.com>
|
|
RH-Commit: [1/1] c09db866ba3028702996ab1db459061cbf9e8bfa (ebblake/centos-qemu-kvm)
|
|
|
|
While testing the use of qemu-nbd in a Pod of a Kubernetes cluster, I
|
|
got LOTS of log messages of the forms:
|
|
|
|
qemu-nbd: option negotiation failed: Failed to read flags: Unexpected end-of-file before all data were read
|
|
qemu-nbd: option negotiation failed: Failed to read flags: Unable to read from socket: Connection reset by peer
|
|
|
|
While it is nice to warn about clients that aren't following protocol
|
|
(in case it helps diagnosing bugs in those clients), a mere port probe
|
|
(where the client never write()s any bytes, and where we might even
|
|
hit EPIPE in trying to send our greeting to the client) is NOT
|
|
abnormal, but merely serves to pollute the log. And Kubernetes
|
|
_really_ likes to do port probes to determine whether a given Pod is
|
|
up and running.
|
|
|
|
Easy ways to demonstrate the above port probes:
|
|
$ qemu-nbd -r -f raw path/to/file &
|
|
$ nc localhost 10809 </dev/null
|
|
$ bash -c 'exec </dev/tcp/localhost/10809'
|
|
$ kill $!
|
|
|
|
Silence the noise by not capturing errors until after our first
|
|
successful read() from a client.
|
|
|
|
Signed-off-by: Eric Blake <eblake@redhat.com>
|
|
Message-ID: <20241115195638.1132007-2-eblake@redhat.com>
|
|
Reviewed-by: Vladimir Sementsov-Ogievskiy <vsementsov@yandex-team.ru>
|
|
(cherry picked from commit efd3dda312129b91986f85976afbda58d40f757f)
|
|
Signed-off-by: Eric Blake <eblake@redhat.com>
|
|
---
|
|
nbd/server.c | 26 +++++++++++++++++---------
|
|
1 file changed, 17 insertions(+), 9 deletions(-)
|
|
|
|
diff --git a/nbd/server.c b/nbd/server.c
|
|
index c30e687fc8..f64e47270c 100644
|
|
--- a/nbd/server.c
|
|
+++ b/nbd/server.c
|
|
@@ -1150,8 +1150,8 @@ nbd_negotiate_meta_queries(NBDClient *client, Error **errp)
|
|
* Return:
|
|
* -errno on error, errp is set
|
|
* 0 on successful negotiation, errp is not set
|
|
- * 1 if client sent NBD_OPT_ABORT, i.e. on valid disconnect,
|
|
- * errp is not set
|
|
+ * 1 if client sent NBD_OPT_ABORT (i.e. on valid disconnect) or never
|
|
+ * wrote anything (i.e. port probe); errp is not set
|
|
*/
|
|
static coroutine_fn int
|
|
nbd_negotiate_options(NBDClient *client, Error **errp)
|
|
@@ -1175,8 +1175,13 @@ nbd_negotiate_options(NBDClient *client, Error **errp)
|
|
... Rest of request
|
|
*/
|
|
|
|
- if (nbd_read32(client->ioc, &flags, "flags", errp) < 0) {
|
|
- return -EIO;
|
|
+ /*
|
|
+ * Intentionally ignore errors on this first read - we do not want
|
|
+ * to be noisy about a mere port probe, but only for clients that
|
|
+ * start talking the protocol and then quit abruptly.
|
|
+ */
|
|
+ if (nbd_read32(client->ioc, &flags, "flags", NULL) < 0) {
|
|
+ return 1;
|
|
}
|
|
client->mode = NBD_MODE_EXPORT_NAME;
|
|
trace_nbd_negotiate_options_flags(flags);
|
|
@@ -1383,8 +1388,8 @@ nbd_negotiate_options(NBDClient *client, Error **errp)
|
|
* Return:
|
|
* -errno on error, errp is set
|
|
* 0 on successful negotiation, errp is not set
|
|
- * 1 if client sent NBD_OPT_ABORT, i.e. on valid disconnect,
|
|
- * errp is not set
|
|
+ * 1 if client sent NBD_OPT_ABORT (i.e. on valid disconnect) or never
|
|
+ * wrote anything (i.e. port probe); errp is not set
|
|
*/
|
|
static coroutine_fn int nbd_negotiate(NBDClient *client, Error **errp)
|
|
{
|
|
@@ -1415,9 +1420,12 @@ static coroutine_fn int nbd_negotiate(NBDClient *client, Error **errp)
|
|
stq_be_p(buf + 8, NBD_OPTS_MAGIC);
|
|
stw_be_p(buf + 16, NBD_FLAG_FIXED_NEWSTYLE | NBD_FLAG_NO_ZEROES);
|
|
|
|
- if (nbd_write(client->ioc, buf, 18, errp) < 0) {
|
|
- error_prepend(errp, "write failed: ");
|
|
- return -EINVAL;
|
|
+ /*
|
|
+ * Be silent about failure to write our greeting: there is nothing
|
|
+ * wrong with a client testing if our port is alive.
|
|
+ */
|
|
+ if (nbd_write(client->ioc, buf, 18, NULL) < 0) {
|
|
+ return 1;
|
|
}
|
|
ret = nbd_negotiate_options(client, errp);
|
|
if (ret != 0) {
|
|
--
|
|
2.48.1
|
|
|