* [PATCH 0/2] nbd: Allow debugging tuning of handshake limit @ 2025-02-03 22:26 Eric Blake 2025-02-03 22:26 ` [PATCH 1/2] qemu-nbd: Allow users to adjust " Eric Blake 2025-02-03 22:26 ` [PATCH 2/2] nbd/server: Allow users to adjust handshake limit in QMP Eric Blake 0 siblings, 2 replies; 16+ messages in thread From: Eric Blake @ 2025-02-03 22:26 UTC (permalink / raw) To: qemu-devel; +Cc: qemu-block Reviving a patch that has been sitting in my tree for a while. It's mostly useful for low-level integration testing (such as debugging libnbd as an NBD client). Eric Blake (2): qemu-nbd: Allow users to adjust handshake limit nbd/server: Allow users to adjust handshake limit in QMP docs/tools/qemu-nbd.rst | 5 +++++ qapi/block-export.json | 10 +++++++++ include/block/nbd.h | 6 ++--- block/monitor/block-hmp-cmds.c | 4 ++-- blockdev-nbd.c | 26 ++++++++++++++------- qemu-nbd.c | 41 +++++++++++++++++++++------------- 6 files changed, 64 insertions(+), 28 deletions(-) -- 2.48.1 ^ permalink raw reply [flat|nested] 16+ messages in thread
* [PATCH 1/2] qemu-nbd: Allow users to adjust handshake limit 2025-02-03 22:26 [PATCH 0/2] nbd: Allow debugging tuning of handshake limit Eric Blake @ 2025-02-03 22:26 ` Eric Blake 2025-02-06 7:02 ` Vladimir Sementsov-Ogievskiy 2025-02-03 22:26 ` [PATCH 2/2] nbd/server: Allow users to adjust handshake limit in QMP Eric Blake 1 sibling, 1 reply; 16+ messages in thread From: Eric Blake @ 2025-02-03 22:26 UTC (permalink / raw) To: qemu-devel; +Cc: qemu-block, Vladimir Sementsov-Ogievskiy Although defaulting the handshake limit to 10 seconds was a nice QoI change to weed out intentionally slow clients, it can interfere with integration testing done with manual NBD_OPT commands over 'nbdsh --opt-mode'. Expose a command line option to allow the user to alter the timeout away from the default. This option is unlikely to be used in enough scenarios to warrant a short option letter. The option --handshake-limit intentionally differs from the name of the constant added in commit fb1c2aaa98 (limit instead of max_secs) and the QMP name to be added in the next commit; this is because typing a longer command-line name is undesirable and there is sufficient --help text to document the units. Signed-off-by: Eric Blake <eblake@redhat.com> --- docs/tools/qemu-nbd.rst | 5 +++++ qemu-nbd.c | 41 ++++++++++++++++++++++++++--------------- 2 files changed, 31 insertions(+), 15 deletions(-) diff --git a/docs/tools/qemu-nbd.rst b/docs/tools/qemu-nbd.rst index 4f21b7904ac..f82ea5fd77b 100644 --- a/docs/tools/qemu-nbd.rst +++ b/docs/tools/qemu-nbd.rst @@ -156,6 +156,11 @@ driver options if :option:`--image-opts` is specified. Set the NBD volume export description, as a human-readable string. +.. option:: --handshake-limit=N + + Set the timeout for a client to successfully complete its handshake + to N seconds (default 10), or 0 for no limit. + .. option:: -L, --list Connect as a client and list all details about the exports exposed by diff --git a/qemu-nbd.c b/qemu-nbd.c index e7a961a5562..2eb32bc700c 100644 --- a/qemu-nbd.c +++ b/qemu-nbd.c @@ -57,19 +57,20 @@ #define HAVE_NBD_DEVICE 0 #endif -#define SOCKET_PATH "/var/lock/qemu-nbd-%s" -#define QEMU_NBD_OPT_CACHE 256 -#define QEMU_NBD_OPT_AIO 257 -#define QEMU_NBD_OPT_DISCARD 258 -#define QEMU_NBD_OPT_DETECT_ZEROES 259 -#define QEMU_NBD_OPT_OBJECT 260 -#define QEMU_NBD_OPT_TLSCREDS 261 -#define QEMU_NBD_OPT_IMAGE_OPTS 262 -#define QEMU_NBD_OPT_FORK 263 -#define QEMU_NBD_OPT_TLSAUTHZ 264 -#define QEMU_NBD_OPT_PID_FILE 265 -#define QEMU_NBD_OPT_SELINUX_LABEL 266 -#define QEMU_NBD_OPT_TLSHOSTNAME 267 +#define SOCKET_PATH "/var/lock/qemu-nbd-%s" +#define QEMU_NBD_OPT_CACHE 256 +#define QEMU_NBD_OPT_AIO 257 +#define QEMU_NBD_OPT_DISCARD 258 +#define QEMU_NBD_OPT_DETECT_ZEROES 259 +#define QEMU_NBD_OPT_OBJECT 260 +#define QEMU_NBD_OPT_TLSCREDS 261 +#define QEMU_NBD_OPT_IMAGE_OPTS 262 +#define QEMU_NBD_OPT_FORK 263 +#define QEMU_NBD_OPT_TLSAUTHZ 264 +#define QEMU_NBD_OPT_PID_FILE 265 +#define QEMU_NBD_OPT_SELINUX_LABEL 266 +#define QEMU_NBD_OPT_TLSHOSTNAME 267 +#define QEMU_NBD_OPT_HANDSHAKE_LIMIT 268 #define MBR_SIZE 512 @@ -80,6 +81,7 @@ static int nb_fds; static QIONetListener *server; static QCryptoTLSCreds *tlscreds; static const char *tlsauthz; +static int handshake_limit = NBD_DEFAULT_HANDSHAKE_MAX_SECS; static void usage(const char *name) { @@ -101,6 +103,7 @@ static void usage(const char *name) " -v, --verbose display extra debugging information\n" " -x, --export-name=NAME expose export by name (default is empty string)\n" " -D, --description=TEXT export a human-readable description\n" +" --handshake-limit=N limit client's handshake to N seconds (default 10)\n" "\n" "Exposing part of the image:\n" " -o, --offset=OFFSET offset into the image\n" @@ -390,8 +393,7 @@ static void nbd_accept(QIONetListener *listener, QIOChannelSocket *cioc, nb_fds++; nbd_update_server_watch(); - /* TODO - expose handshake timeout as command line option */ - nbd_client_new(cioc, NBD_DEFAULT_HANDSHAKE_MAX_SECS, + nbd_client_new(cioc, handshake_limit, tlscreds, tlsauthz, nbd_client_closed, NULL); } @@ -569,6 +571,8 @@ int main(int argc, char **argv) { "object", required_argument, NULL, QEMU_NBD_OPT_OBJECT }, { "export-name", required_argument, NULL, 'x' }, { "description", required_argument, NULL, 'D' }, + { "handshake-limit", required_argument, NULL, + QEMU_NBD_OPT_HANDSHAKE_LIMIT }, { "tls-creds", required_argument, NULL, QEMU_NBD_OPT_TLSCREDS }, { "tls-hostname", required_argument, NULL, QEMU_NBD_OPT_TLSHOSTNAME }, { "tls-authz", required_argument, NULL, QEMU_NBD_OPT_TLSAUTHZ }, @@ -815,6 +819,13 @@ int main(int argc, char **argv) case QEMU_NBD_OPT_SELINUX_LABEL: selinux_label = optarg; break; + case QEMU_NBD_OPT_HANDSHAKE_LIMIT: + if (qemu_strtoi(optarg, NULL, 0, &handshake_limit) < 0 || + handshake_limit < 0) { + error_report("Invalid handshake limit '%s'", optarg); + exit(EXIT_FAILURE); + } + break; } } -- 2.48.1 ^ permalink raw reply related [flat|nested] 16+ messages in thread
* Re: [PATCH 1/2] qemu-nbd: Allow users to adjust handshake limit 2025-02-03 22:26 ` [PATCH 1/2] qemu-nbd: Allow users to adjust " Eric Blake @ 2025-02-06 7:02 ` Vladimir Sementsov-Ogievskiy 0 siblings, 0 replies; 16+ messages in thread From: Vladimir Sementsov-Ogievskiy @ 2025-02-06 7:02 UTC (permalink / raw) To: Eric Blake, qemu-devel; +Cc: qemu-block On 04.02.25 01:26, Eric Blake wrote: > Although defaulting the handshake limit to 10 seconds was a nice QoI > change to weed out intentionally slow clients, it can interfere with > integration testing done with manual NBD_OPT commands over 'nbdsh > --opt-mode'. Expose a command line option to allow the user to alter > the timeout away from the default. This option is unlikely to be used > in enough scenarios to warrant a short option letter. > > The option --handshake-limit intentionally differs from the name of > the constant added in commit fb1c2aaa98 (limit instead of max_secs) > and the QMP name to be added in the next commit; this is because > typing a longer command-line name is undesirable and there is > sufficient --help text to document the units. > > Signed-off-by: Eric Blake<eblake@redhat.com> Reviewed-by: Vladimir Sementsov-Ogievskiy <vsementsov@yandex-team.ru> -- Best regards, Vladimir ^ permalink raw reply [flat|nested] 16+ messages in thread
* [PATCH 2/2] nbd/server: Allow users to adjust handshake limit in QMP 2025-02-03 22:26 [PATCH 0/2] nbd: Allow debugging tuning of handshake limit Eric Blake 2025-02-03 22:26 ` [PATCH 1/2] qemu-nbd: Allow users to adjust " Eric Blake @ 2025-02-03 22:26 ` Eric Blake 2025-02-05 6:55 ` Markus Armbruster 2025-02-06 7:20 ` Vladimir Sementsov-Ogievskiy 1 sibling, 2 replies; 16+ messages in thread From: Eric Blake @ 2025-02-03 22:26 UTC (permalink / raw) To: qemu-devel Cc: qemu-block, Kevin Wolf, Hanna Reitz, Vladimir Sementsov-Ogievskiy, Markus Armbruster Although defaulting the handshake limit to 10 seconds was a nice QoI change to weed out intentionally slow clients, it can interfere with integration testing done with manual NBD_OPT commands over 'nbdsh --opt-mode'. Expose a QMP knob 'handshake-max-secs' to allow the user to alter the timeout away from the default. The parameter name here intentionally matches the spelling of the constant added in commit fb1c2aaa98, and not the command-line spelling added in the previous patch for qemu-nbd; that's because in QMP, longer names serve as good self-documentation, and unlike the command line, machines don't have problems generating longer spellings. Signed-off-by: Eric Blake <eblake@redhat.com> --- qapi/block-export.json | 10 ++++++++++ include/block/nbd.h | 6 +++--- block/monitor/block-hmp-cmds.c | 4 ++-- blockdev-nbd.c | 26 ++++++++++++++++++-------- 4 files changed, 33 insertions(+), 13 deletions(-) diff --git a/qapi/block-export.json b/qapi/block-export.json index ce33fe378df..58ae6a5e1d7 100644 --- a/qapi/block-export.json +++ b/qapi/block-export.json @@ -17,6 +17,10 @@ # # @addr: Address on which to listen. # +# @handshake-max-secs: Time limit, in seconds, at which a client that +# has not completed the negotiation handshake will be disconnected, +# or 0 for no limit (since 10.0; default: 10). +# # @tls-creds: ID of the TLS credentials object (since 2.6). # # @tls-authz: ID of the QAuthZ authorization object used to validate @@ -34,6 +38,7 @@ ## { 'struct': 'NbdServerOptions', 'data': { 'addr': 'SocketAddress', + '*handshake-max-secs': 'uint32', '*tls-creds': 'str', '*tls-authz': 'str', '*max-connections': 'uint32' } } @@ -52,6 +57,10 @@ # # @addr: Address on which to listen. # +# @handshake-max-secs: Time limit, in seconds, at which a client that +# has not completed the negotiation handshake will be disconnected, +# or 0 for no limit (since 10.0; default: 10). +# # @tls-creds: ID of the TLS credentials object (since 2.6). # # @tls-authz: ID of the QAuthZ authorization object used to validate @@ -72,6 +81,7 @@ ## { 'command': 'nbd-server-start', 'data': { 'addr': 'SocketAddressLegacy', + '*handshake-max-secs': 'uint32', '*tls-creds': 'str', '*tls-authz': 'str', '*max-connections': 'uint32' }, diff --git a/include/block/nbd.h b/include/block/nbd.h index d4f8b21aecc..92987c76fd6 100644 --- a/include/block/nbd.h +++ b/include/block/nbd.h @@ -428,9 +428,9 @@ void nbd_client_put(NBDClient *client); void nbd_server_is_qemu_nbd(int max_connections); bool nbd_server_is_running(void); int nbd_server_max_connections(void); -void nbd_server_start(SocketAddress *addr, const char *tls_creds, - const char *tls_authz, uint32_t max_connections, - Error **errp); +void nbd_server_start(SocketAddress *addr, uint32_t handshake_max_secs, + const char *tls_creds, const char *tls_authz, + uint32_t max_connections, Error **errp); void nbd_server_start_options(NbdServerOptions *arg, Error **errp); /* nbd_read diff --git a/block/monitor/block-hmp-cmds.c b/block/monitor/block-hmp-cmds.c index 1d312513fc4..0cfcbfe7c21 100644 --- a/block/monitor/block-hmp-cmds.c +++ b/block/monitor/block-hmp-cmds.c @@ -402,8 +402,8 @@ void hmp_nbd_server_start(Monitor *mon, const QDict *qdict) goto exit; } - nbd_server_start(addr, NULL, NULL, NBD_DEFAULT_MAX_CONNECTIONS, - &local_err); + nbd_server_start(addr, NBD_DEFAULT_HANDSHAKE_MAX_SECS, NULL, NULL, + NBD_DEFAULT_MAX_CONNECTIONS, &local_err); qapi_free_SocketAddress(addr); if (local_err != NULL) { goto exit; diff --git a/blockdev-nbd.c b/blockdev-nbd.c index 9e61fbaf2b2..e9f53e83d48 100644 --- a/blockdev-nbd.c +++ b/blockdev-nbd.c @@ -28,6 +28,7 @@ typedef struct NBDConn { typedef struct NBDServerData { QIONetListener *listener; + uint32_t handshake_max_secs; QCryptoTLSCreds *tlscreds; char *tlsauthz; uint32_t max_connections; @@ -84,8 +85,7 @@ static void nbd_accept(QIONetListener *listener, QIOChannelSocket *cioc, nbd_update_server_watch(nbd_server); qio_channel_set_name(QIO_CHANNEL(cioc), "nbd-server"); - /* TODO - expose handshake timeout as QMP option */ - nbd_client_new(cioc, NBD_DEFAULT_HANDSHAKE_MAX_SECS, + nbd_client_new(cioc, nbd_server->handshake_max_secs, nbd_server->tlscreds, nbd_server->tlsauthz, nbd_blockdev_client_closed, conn); } @@ -162,9 +162,9 @@ static QCryptoTLSCreds *nbd_get_tls_creds(const char *id, Error **errp) } -void nbd_server_start(SocketAddress *addr, const char *tls_creds, - const char *tls_authz, uint32_t max_connections, - Error **errp) +void nbd_server_start(SocketAddress *addr, uint32_t handshake_max_secs, + const char *tls_creds, const char *tls_authz, + uint32_t max_connections, Error **errp) { if (nbd_server) { error_setg(errp, "NBD server already running"); @@ -173,6 +173,7 @@ void nbd_server_start(SocketAddress *addr, const char *tls_creds, nbd_server = g_new0(NBDServerData, 1); nbd_server->max_connections = max_connections; + nbd_server->handshake_max_secs = handshake_max_secs; nbd_server->listener = qio_net_listener_new(); qio_net_listener_set_name(nbd_server->listener, @@ -210,12 +211,17 @@ void nbd_server_start_options(NbdServerOptions *arg, Error **errp) if (!arg->has_max_connections) { arg->max_connections = NBD_DEFAULT_MAX_CONNECTIONS; } + if (!arg->has_handshake_max_secs) { + arg->handshake_max_secs = NBD_DEFAULT_HANDSHAKE_MAX_SECS; + } - nbd_server_start(arg->addr, arg->tls_creds, arg->tls_authz, - arg->max_connections, errp); + nbd_server_start(arg->addr, arg->handshake_max_secs, arg->tls_creds, + arg->tls_authz, arg->max_connections, errp); } void qmp_nbd_server_start(SocketAddressLegacy *addr, + bool has_handshake_max_secs, + uint32_t handshake_max_secs, const char *tls_creds, const char *tls_authz, bool has_max_connections, uint32_t max_connections, @@ -226,8 +232,12 @@ void qmp_nbd_server_start(SocketAddressLegacy *addr, if (!has_max_connections) { max_connections = NBD_DEFAULT_MAX_CONNECTIONS; } + if (!has_handshake_max_secs) { + handshake_max_secs = NBD_DEFAULT_HANDSHAKE_MAX_SECS; + } - nbd_server_start(addr_flat, tls_creds, tls_authz, max_connections, errp); + nbd_server_start(addr_flat, handshake_max_secs, tls_creds, tls_authz, + max_connections, errp); qapi_free_SocketAddress(addr_flat); } -- 2.48.1 ^ permalink raw reply related [flat|nested] 16+ messages in thread
* Re: [PATCH 2/2] nbd/server: Allow users to adjust handshake limit in QMP 2025-02-03 22:26 ` [PATCH 2/2] nbd/server: Allow users to adjust handshake limit in QMP Eric Blake @ 2025-02-05 6:55 ` Markus Armbruster 2025-02-05 20:36 ` Eric Blake 2025-02-06 7:20 ` Vladimir Sementsov-Ogievskiy 1 sibling, 1 reply; 16+ messages in thread From: Markus Armbruster @ 2025-02-05 6:55 UTC (permalink / raw) To: Eric Blake Cc: qemu-devel, qemu-block, Kevin Wolf, Hanna Reitz, Vladimir Sementsov-Ogievskiy Eric Blake <eblake@redhat.com> writes: > Although defaulting the handshake limit to 10 seconds was a nice QoI > change to weed out intentionally slow clients, it can interfere with > integration testing done with manual NBD_OPT commands over 'nbdsh > --opt-mode'. Expose a QMP knob 'handshake-max-secs' to allow the user > to alter the timeout away from the default. > > The parameter name here intentionally matches the spelling of the > constant added in commit fb1c2aaa98, and not the command-line spelling > added in the previous patch for qemu-nbd; that's because in QMP, > longer names serve as good self-documentation, and unlike the command > line, machines don't have problems generating longer spellings. > > Signed-off-by: Eric Blake <eblake@redhat.com> > --- > qapi/block-export.json | 10 ++++++++++ > include/block/nbd.h | 6 +++--- > block/monitor/block-hmp-cmds.c | 4 ++-- > blockdev-nbd.c | 26 ++++++++++++++++++-------- > 4 files changed, 33 insertions(+), 13 deletions(-) > > diff --git a/qapi/block-export.json b/qapi/block-export.json > index ce33fe378df..58ae6a5e1d7 100644 > --- a/qapi/block-export.json > +++ b/qapi/block-export.json > @@ -17,6 +17,10 @@ > # > # @addr: Address on which to listen. > # > +# @handshake-max-secs: Time limit, in seconds, at which a client that > +# has not completed the negotiation handshake will be disconnected, > +# or 0 for no limit (since 10.0; default: 10). > +# > # @tls-creds: ID of the TLS credentials object (since 2.6). > # > # @tls-authz: ID of the QAuthZ authorization object used to validate > @@ -34,6 +38,7 @@ > ## > { 'struct': 'NbdServerOptions', > 'data': { 'addr': 'SocketAddress', > + '*handshake-max-secs': 'uint32', > '*tls-creds': 'str', > '*tls-authz': 'str', > '*max-connections': 'uint32' } } Standard question on time: are we confident the granularity will suffice? On naming... We use "seconds" (StatsUnit in qapi/stats.json), and "sec" (SnapshotInfo in qapi/block-core.json), but not "secs". Do we care? > @@ -52,6 +57,10 @@ > # > # @addr: Address on which to listen. > # > +# @handshake-max-secs: Time limit, in seconds, at which a client that > +# has not completed the negotiation handshake will be disconnected, > +# or 0 for no limit (since 10.0; default: 10). > +# > # @tls-creds: ID of the TLS credentials object (since 2.6). > # > # @tls-authz: ID of the QAuthZ authorization object used to validate > @@ -72,6 +81,7 @@ > ## > { 'command': 'nbd-server-start', > 'data': { 'addr': 'SocketAddressLegacy', > + '*handshake-max-secs': 'uint32', > '*tls-creds': 'str', > '*tls-authz': 'str', > '*max-connections': 'uint32' }, [...] ^ permalink raw reply [flat|nested] 16+ messages in thread
* Re: [PATCH 2/2] nbd/server: Allow users to adjust handshake limit in QMP 2025-02-05 6:55 ` Markus Armbruster @ 2025-02-05 20:36 ` Eric Blake 2025-02-06 5:54 ` Markus Armbruster 0 siblings, 1 reply; 16+ messages in thread From: Eric Blake @ 2025-02-05 20:36 UTC (permalink / raw) To: Markus Armbruster Cc: qemu-devel, qemu-block, Kevin Wolf, Hanna Reitz, Vladimir Sementsov-Ogievskiy On Wed, Feb 05, 2025 at 07:55:56AM +0100, Markus Armbruster wrote: > Eric Blake <eblake@redhat.com> writes: > > > Although defaulting the handshake limit to 10 seconds was a nice QoI > > change to weed out intentionally slow clients, it can interfere with > > integration testing done with manual NBD_OPT commands over 'nbdsh > > --opt-mode'. Expose a QMP knob 'handshake-max-secs' to allow the user > > to alter the timeout away from the default. > > > > The parameter name here intentionally matches the spelling of the > > constant added in commit fb1c2aaa98, and not the command-line spelling > > added in the previous patch for qemu-nbd; that's because in QMP, > > longer names serve as good self-documentation, and unlike the command > > line, machines don't have problems generating longer spellings. > > > > { 'struct': 'NbdServerOptions', > > 'data': { 'addr': 'SocketAddress', > > + '*handshake-max-secs': 'uint32', > > '*tls-creds': 'str', > > '*tls-authz': 'str', > > '*max-connections': 'uint32' } } > > Standard question on time: are we confident the granularity will > suffice? The default if this is unspecified is 10 seconds. Anything subsecond requires a fast negotiation between client and server; the more likely use of this parameter is setting it extremely large (or to 0 to disable) in order to allow lengthy gdb sessions without the timeout cutting things short. So I think seconds is okay. > > On naming... We use "seconds" (StatsUnit in qapi/stats.json), and "sec" > (SnapshotInfo in qapi/block-core.json), but not "secs". Do we care? Avoiding abbreviations and using 'seconds' is fine by me, especially since this won't be typed by many users but remains more of a tool for use in a debugging arsenel. I can respin with the longer name, but will wait for any other review comments first. -- Eric Blake, Principal Software Engineer Red Hat, Inc. Virtualization: qemu.org | libguestfs.org ^ permalink raw reply [flat|nested] 16+ messages in thread
* Re: [PATCH 2/2] nbd/server: Allow users to adjust handshake limit in QMP 2025-02-05 20:36 ` Eric Blake @ 2025-02-06 5:54 ` Markus Armbruster 0 siblings, 0 replies; 16+ messages in thread From: Markus Armbruster @ 2025-02-06 5:54 UTC (permalink / raw) To: Eric Blake Cc: qemu-devel, qemu-block, Kevin Wolf, Hanna Reitz, Vladimir Sementsov-Ogievskiy Eric Blake <eblake@redhat.com> writes: > On Wed, Feb 05, 2025 at 07:55:56AM +0100, Markus Armbruster wrote: >> Eric Blake <eblake@redhat.com> writes: >> >> > Although defaulting the handshake limit to 10 seconds was a nice QoI >> > change to weed out intentionally slow clients, it can interfere with >> > integration testing done with manual NBD_OPT commands over 'nbdsh >> > --opt-mode'. Expose a QMP knob 'handshake-max-secs' to allow the user >> > to alter the timeout away from the default. >> > >> > The parameter name here intentionally matches the spelling of the >> > constant added in commit fb1c2aaa98, and not the command-line spelling >> > added in the previous patch for qemu-nbd; that's because in QMP, >> > longer names serve as good self-documentation, and unlike the command >> > line, machines don't have problems generating longer spellings. >> > > >> > { 'struct': 'NbdServerOptions', >> > 'data': { 'addr': 'SocketAddress', >> > + '*handshake-max-secs': 'uint32', >> > '*tls-creds': 'str', >> > '*tls-authz': 'str', >> > '*max-connections': 'uint32' } } >> >> Standard question on time: are we confident the granularity will >> suffice? > > The default if this is unspecified is 10 seconds. Anything subsecond > requires a fast negotiation between client and server; the more likely > use of this parameter is setting it extremely large (or to 0 to > disable) in order to allow lengthy gdb sessions without the timeout > cutting things short. So I think seconds is okay. ACK >> On naming... We use "seconds" (StatsUnit in qapi/stats.json), and "sec" >> (SnapshotInfo in qapi/block-core.json), but not "secs". Do we care? > > Avoiding abbreviations and using 'seconds' is fine by me, especially > since this won't be typed by many users but remains more of a tool for > use in a debugging arsenel. I can respin with the longer name, but > will wait for any other review comments first. I like "seconds". Thanks! ^ permalink raw reply [flat|nested] 16+ messages in thread
* Re: [PATCH 2/2] nbd/server: Allow users to adjust handshake limit in QMP 2025-02-03 22:26 ` [PATCH 2/2] nbd/server: Allow users to adjust handshake limit in QMP Eric Blake 2025-02-05 6:55 ` Markus Armbruster @ 2025-02-06 7:20 ` Vladimir Sementsov-Ogievskiy 2025-02-10 21:46 ` Eric Blake 1 sibling, 1 reply; 16+ messages in thread From: Vladimir Sementsov-Ogievskiy @ 2025-02-06 7:20 UTC (permalink / raw) To: Eric Blake, qemu-devel Cc: qemu-block, Kevin Wolf, Hanna Reitz, Markus Armbruster On 04.02.25 01:26, Eric Blake wrote: > Although defaulting the handshake limit to 10 seconds was a nice QoI > change to weed out intentionally slow clients, it can interfere with > integration testing done with manual NBD_OPT commands over 'nbdsh > --opt-mode'. Expose a QMP knob 'handshake-max-secs' to allow the user > to alter the timeout away from the default. > > The parameter name here intentionally matches the spelling of the > constant added in commit fb1c2aaa98, and not the command-line spelling > added in the previous patch for qemu-nbd; that's because in QMP, > longer names serve as good self-documentation, and unlike the command > line, machines don't have problems generating longer spellings. > > Signed-off-by: Eric Blake <eblake@redhat.com> Reviewed-by: Vladimir Sementsov-Ogievskiy <vsementsov@yandex-team.ru> (renaming to -seconds is, of course, OK) > --- > qapi/block-export.json | 10 ++++++++++ > include/block/nbd.h | 6 +++--- [..] > @@ -52,6 +57,10 @@ > # > # @addr: Address on which to listen. > # > +# @handshake-max-secs: Time limit, in seconds, at which a client that > +# has not completed the negotiation handshake will be disconnected, > +# or 0 for no limit (since 10.0; default: 10). > +# Hmm. [not about the series], shouldn't we finally deprecate older interface? > # @tls-creds: ID of the TLS credentials object (since 2.6). > # > # @tls-authz: ID of the QAuthZ authorization object used to validate > @@ -72,6 +81,7 @@ > ## > { 'command': 'nbd-server-start', > 'data': { 'addr': 'SocketAddressLegacy', [..] -- Best regards, Vladimir ^ permalink raw reply [flat|nested] 16+ messages in thread
* Re: [PATCH 2/2] nbd/server: Allow users to adjust handshake limit in QMP 2025-02-06 7:20 ` Vladimir Sementsov-Ogievskiy @ 2025-02-10 21:46 ` Eric Blake 2025-02-12 14:33 ` Vladimir Sementsov-Ogievskiy 0 siblings, 1 reply; 16+ messages in thread From: Eric Blake @ 2025-02-10 21:46 UTC (permalink / raw) To: Vladimir Sementsov-Ogievskiy Cc: qemu-devel, qemu-block, Kevin Wolf, Hanna Reitz, Markus Armbruster, devel On Thu, Feb 06, 2025 at 10:20:09AM +0300, Vladimir Sementsov-Ogievskiy wrote: > > --- > > qapi/block-export.json | 10 ++++++++++ > > include/block/nbd.h | 6 +++--- > > [..] > > > @@ -52,6 +57,10 @@ > > # > > # @addr: Address on which to listen. > > # > > +# @handshake-max-secs: Time limit, in seconds, at which a client that > > +# has not completed the negotiation handshake will be disconnected, > > +# or 0 for no limit (since 10.0; default: 10). > > +# > > Hmm. [not about the series], shouldn't we finally deprecate older interface? By older interface, you are asking about the QMP command 'nbd-server-start' as compared to struct NbdServerOptions. But the struct is not directly present in any QMP commands; rather, it only appears to be used by qemu-storage-daemon as one of its command line options that needs to set up an NBD server with a JSON-like syntax that has less nesting than QMP nbd-server-start. blockdev-nbd.c has two functions [nbd_server_start_options(NbdServerOPtions *arg...) and qmp_nbd_server_start(args...)] that both unpack their slightly different forms and pass them as parameters to nbd_server_start() that is then agnostic to whether the older QMP command or newer q-s-d CLI option was specified. It looks like libvirt is still using QMP nbd-server-start. If we were to start the deprecation process for qemu 10.0, what would the new command look like? What would everyone be required to use by qemu 10.2? -- Eric Blake, Principal Software Engineer Red Hat, Inc. Virtualization: qemu.org | libguestfs.org ^ permalink raw reply [flat|nested] 16+ messages in thread
* Re: [PATCH 2/2] nbd/server: Allow users to adjust handshake limit in QMP 2025-02-10 21:46 ` Eric Blake @ 2025-02-12 14:33 ` Vladimir Sementsov-Ogievskiy 0 siblings, 0 replies; 16+ messages in thread From: Vladimir Sementsov-Ogievskiy @ 2025-02-12 14:33 UTC (permalink / raw) To: Eric Blake Cc: qemu-devel, qemu-block, Kevin Wolf, Hanna Reitz, Markus Armbruster, devel On 11.02.25 00:46, Eric Blake wrote: > On Thu, Feb 06, 2025 at 10:20:09AM +0300, Vladimir Sementsov-Ogievskiy wrote: >>> --- >>> qapi/block-export.json | 10 ++++++++++ >>> include/block/nbd.h | 6 +++--- >> >> [..] >> >>> @@ -52,6 +57,10 @@ >>> # >>> # @addr: Address on which to listen. >>> # >>> +# @handshake-max-secs: Time limit, in seconds, at which a client that >>> +# has not completed the negotiation handshake will be disconnected, >>> +# or 0 for no limit (since 10.0; default: 10). >>> +# >> >> Hmm. [not about the series], shouldn't we finally deprecate older interface? > > By older interface, you are asking about the QMP command > 'nbd-server-start' as compared to struct NbdServerOptions. But the > struct is not directly present in any QMP commands; rather, it only > appears to be used by qemu-storage-daemon as one of its command line > options that needs to set up an NBD server with a JSON-like syntax > that has less nesting than QMP nbd-server-start. blockdev-nbd.c has > two functions [nbd_server_start_options(NbdServerOPtions *arg...) and > qmp_nbd_server_start(args...)] that both unpack their slightly > different forms and pass them as parameters to nbd_server_start() that > is then agnostic to whether the older QMP command or newer q-s-d CLI > option was specified. > > It looks like libvirt is still using QMP nbd-server-start. If we were > to start the deprecation process for qemu 10.0, what would the new > command look like? What would everyone be required to use by qemu > 10.2? > Oh you are right, I was inattentive. So, probably thing to be deprecated is actually SocketAddressLegacy, which is the only difference. And why just not move common part of the structures to common base? I'll send a patch with a try. -- Best regards, Vladimir ^ permalink raw reply [flat|nested] 16+ messages in thread
* [PATCH for-9.2 0/2] NBD: tune handshake timeout @ 2024-08-09 16:14 Eric Blake 2024-08-09 16:14 ` [PATCH 2/2] nbd/server: Allow users to adjust handshake limit in QMP Eric Blake 0 siblings, 1 reply; 16+ messages in thread From: Eric Blake @ 2024-08-09 16:14 UTC (permalink / raw) To: qemu-devel Cc: kwolf, hreitz, berrange, qemu-block, den, andrey.drobyshev, alexander.ivanov, vsementsov Originally posted as the tail part of this v4 series: https://lists.gnu.org/archive/html/qemu-devel/2024-08/msg01154.html but not deemed necessary for 9.1 as it is a feature addition that was not proposed before soft freeze (even if the point of the feature is to enable interop testing to revert back to 9.0 behavior allowing for unlimited time when debuging an NBD_OPT interchange under gdb). As part of closing out the CVE, where the v4 patches used handshake_limit, the actual pull request used handshake_max_secs (a bit more self-documenting); I rebased that rename into the QMP code, but prefer to keep the qemu-nbd command-line spelling shorter. But I'm open to any arguments on why the names should be the same, or on any other better spellings to expose to the user. Eric Blake (2): qemu-nbd: Allow users to adjust handshake limit nbd/server: Allow users to adjust handshake limit in QMP docs/tools/qemu-nbd.rst | 5 +++++ qapi/block-export.json | 10 +++++++++ include/block/nbd.h | 6 ++--- block/monitor/block-hmp-cmds.c | 4 ++-- blockdev-nbd.c | 26 ++++++++++++++------- qemu-nbd.c | 41 +++++++++++++++++++++------------- 6 files changed, 64 insertions(+), 28 deletions(-) -- 2.46.0 ^ permalink raw reply [flat|nested] 16+ messages in thread
* [PATCH 2/2] nbd/server: Allow users to adjust handshake limit in QMP 2024-08-09 16:14 [PATCH for-9.2 0/2] NBD: tune handshake timeout Eric Blake @ 2024-08-09 16:14 ` Eric Blake 2024-10-02 13:18 ` Vladimir Sementsov-Ogievskiy 2024-10-02 13:49 ` Markus Armbruster 0 siblings, 2 replies; 16+ messages in thread From: Eric Blake @ 2024-08-09 16:14 UTC (permalink / raw) To: qemu-devel Cc: kwolf, hreitz, berrange, qemu-block, den, andrey.drobyshev, alexander.ivanov, vsementsov, Markus Armbruster Although defaulting the handshake limit to 10 seconds was a nice QoI change to weed out intentionally slow clients, it can interfere with integration testing done with manual NBD_OPT commands over 'nbdsh --opt-mode'. Expose a QMP knob 'handshake-max-secs' to allow the user to alter the timeout away from the default. The parameter name here intentionally matches the spelling of the constant added in commit fb1c2aaa98, and not the command-line spelling added in the previous patch for qemu-nbd; that's because in QMP, longer names serve as good self-documentation, and unlike the command line, machines don't have problems generating longer spellings. Signed-off-by: Eric Blake <eblake@redhat.com> --- qapi/block-export.json | 10 ++++++++++ include/block/nbd.h | 6 +++--- block/monitor/block-hmp-cmds.c | 4 ++-- blockdev-nbd.c | 26 ++++++++++++++++++-------- 4 files changed, 33 insertions(+), 13 deletions(-) diff --git a/qapi/block-export.json b/qapi/block-export.json index ce33fe378df..c110dd375ad 100644 --- a/qapi/block-export.json +++ b/qapi/block-export.json @@ -17,6 +17,10 @@ # # @addr: Address on which to listen. # +# @handshake-max-secs: Time limit, in seconds, at which a client that +# has not completed the negotiation handshake will be disconnected, +# or 0 for no limit (since 9.2; default: 10). +# # @tls-creds: ID of the TLS credentials object (since 2.6). # # @tls-authz: ID of the QAuthZ authorization object used to validate @@ -34,6 +38,7 @@ ## { 'struct': 'NbdServerOptions', 'data': { 'addr': 'SocketAddress', + '*handshake-max-secs': 'uint32', '*tls-creds': 'str', '*tls-authz': 'str', '*max-connections': 'uint32' } } @@ -52,6 +57,10 @@ # # @addr: Address on which to listen. # +# @handshake-max-secs: Time limit, in seconds, at which a client that +# has not completed the negotiation handshake will be disconnected, +# or 0 for no limit (since 9.2; default: 10). +# # @tls-creds: ID of the TLS credentials object (since 2.6). # # @tls-authz: ID of the QAuthZ authorization object used to validate @@ -72,6 +81,7 @@ ## { 'command': 'nbd-server-start', 'data': { 'addr': 'SocketAddressLegacy', + '*handshake-max-secs': 'uint32', '*tls-creds': 'str', '*tls-authz': 'str', '*max-connections': 'uint32' }, diff --git a/include/block/nbd.h b/include/block/nbd.h index d4f8b21aecc..92987c76fd6 100644 --- a/include/block/nbd.h +++ b/include/block/nbd.h @@ -428,9 +428,9 @@ void nbd_client_put(NBDClient *client); void nbd_server_is_qemu_nbd(int max_connections); bool nbd_server_is_running(void); int nbd_server_max_connections(void); -void nbd_server_start(SocketAddress *addr, const char *tls_creds, - const char *tls_authz, uint32_t max_connections, - Error **errp); +void nbd_server_start(SocketAddress *addr, uint32_t handshake_max_secs, + const char *tls_creds, const char *tls_authz, + uint32_t max_connections, Error **errp); void nbd_server_start_options(NbdServerOptions *arg, Error **errp); /* nbd_read diff --git a/block/monitor/block-hmp-cmds.c b/block/monitor/block-hmp-cmds.c index bdf2eb50b68..cae6e3064a0 100644 --- a/block/monitor/block-hmp-cmds.c +++ b/block/monitor/block-hmp-cmds.c @@ -402,8 +402,8 @@ void hmp_nbd_server_start(Monitor *mon, const QDict *qdict) goto exit; } - nbd_server_start(addr, NULL, NULL, NBD_DEFAULT_MAX_CONNECTIONS, - &local_err); + nbd_server_start(addr, NBD_DEFAULT_HANDSHAKE_MAX_SECS, NULL, NULL, + NBD_DEFAULT_MAX_CONNECTIONS, &local_err); qapi_free_SocketAddress(addr); if (local_err != NULL) { goto exit; diff --git a/blockdev-nbd.c b/blockdev-nbd.c index f73409ae494..0cdabfbd82c 100644 --- a/blockdev-nbd.c +++ b/blockdev-nbd.c @@ -28,6 +28,7 @@ typedef struct NBDConn { typedef struct NBDServerData { QIONetListener *listener; + uint32_t handshake_max_secs; QCryptoTLSCreds *tlscreds; char *tlsauthz; uint32_t max_connections; @@ -84,8 +85,7 @@ static void nbd_accept(QIONetListener *listener, QIOChannelSocket *cioc, nbd_update_server_watch(nbd_server); qio_channel_set_name(QIO_CHANNEL(cioc), "nbd-server"); - /* TODO - expose handshake timeout as QMP option */ - nbd_client_new(cioc, NBD_DEFAULT_HANDSHAKE_MAX_SECS, + nbd_client_new(cioc, nbd_server->handshake_max_secs, nbd_server->tlscreds, nbd_server->tlsauthz, nbd_blockdev_client_closed, conn); } @@ -158,9 +158,9 @@ static QCryptoTLSCreds *nbd_get_tls_creds(const char *id, Error **errp) } -void nbd_server_start(SocketAddress *addr, const char *tls_creds, - const char *tls_authz, uint32_t max_connections, - Error **errp) +void nbd_server_start(SocketAddress *addr, uint32_t handshake_max_secs, + const char *tls_creds, const char *tls_authz, + uint32_t max_connections, Error **errp) { if (nbd_server) { error_setg(errp, "NBD server already running"); @@ -169,6 +169,7 @@ void nbd_server_start(SocketAddress *addr, const char *tls_creds, nbd_server = g_new0(NBDServerData, 1); nbd_server->max_connections = max_connections; + nbd_server->handshake_max_secs = handshake_max_secs; nbd_server->listener = qio_net_listener_new(); qio_net_listener_set_name(nbd_server->listener, @@ -206,12 +207,17 @@ void nbd_server_start_options(NbdServerOptions *arg, Error **errp) if (!arg->has_max_connections) { arg->max_connections = NBD_DEFAULT_MAX_CONNECTIONS; } + if (!arg->has_handshake_max_secs) { + arg->handshake_max_secs = NBD_DEFAULT_HANDSHAKE_MAX_SECS; + } - nbd_server_start(arg->addr, arg->tls_creds, arg->tls_authz, - arg->max_connections, errp); + nbd_server_start(arg->addr, arg->handshake_max_secs, arg->tls_creds, + arg->tls_authz, arg->max_connections, errp); } void qmp_nbd_server_start(SocketAddressLegacy *addr, + bool has_handshake_max_secs, + uint32_t handshake_max_secs, const char *tls_creds, const char *tls_authz, bool has_max_connections, uint32_t max_connections, @@ -222,8 +228,12 @@ void qmp_nbd_server_start(SocketAddressLegacy *addr, if (!has_max_connections) { max_connections = NBD_DEFAULT_MAX_CONNECTIONS; } + if (!has_handshake_max_secs) { + handshake_max_secs = NBD_DEFAULT_HANDSHAKE_MAX_SECS; + } - nbd_server_start(addr_flat, tls_creds, tls_authz, max_connections, errp); + nbd_server_start(addr_flat, handshake_max_secs, tls_creds, tls_authz, + max_connections, errp); qapi_free_SocketAddress(addr_flat); } -- 2.46.0 ^ permalink raw reply related [flat|nested] 16+ messages in thread
* Re: [PATCH 2/2] nbd/server: Allow users to adjust handshake limit in QMP 2024-08-09 16:14 ` [PATCH 2/2] nbd/server: Allow users to adjust handshake limit in QMP Eric Blake @ 2024-10-02 13:18 ` Vladimir Sementsov-Ogievskiy 2024-10-02 13:49 ` Markus Armbruster 1 sibling, 0 replies; 16+ messages in thread From: Vladimir Sementsov-Ogievskiy @ 2024-10-02 13:18 UTC (permalink / raw) To: Eric Blake, qemu-devel Cc: kwolf, hreitz, berrange, qemu-block, den, andrey.drobyshev, alexander.ivanov, Markus Armbruster On 09.08.24 19:14, Eric Blake wrote: > Although defaulting the handshake limit to 10 seconds was a nice QoI > change to weed out intentionally slow clients, it can interfere with > integration testing done with manual NBD_OPT commands over 'nbdsh > --opt-mode'. Expose a QMP knob 'handshake-max-secs' to allow the user > to alter the timeout away from the default. > > The parameter name here intentionally matches the spelling of the > constant added in commit fb1c2aaa98, and not the command-line spelling > added in the previous patch for qemu-nbd; that's because in QMP, > longer names serve as good self-documentation, and unlike the command > line, machines don't have problems generating longer spellings. > > Signed-off-by: Eric Blake <eblake@redhat.com> Reviewed-by: Vladimir Sementsov-Ogievskiy <vsementsov@yandex-team.ru> > --- > qapi/block-export.json | 10 ++++++++++ > include/block/nbd.h | 6 +++--- > block/monitor/block-hmp-cmds.c | 4 ++-- > blockdev-nbd.c | 26 ++++++++++++++++++-------- > 4 files changed, 33 insertions(+), 13 deletions(-) > > diff --git a/qapi/block-export.json b/qapi/block-export.json > index ce33fe378df..c110dd375ad 100644 > --- a/qapi/block-export.json > +++ b/qapi/block-export.json > @@ -17,6 +17,10 @@ > # > # @addr: Address on which to listen. > # > +# @handshake-max-secs: Time limit, in seconds, at which a client that > +# has not completed the negotiation handshake will be disconnected, > +# or 0 for no limit (since 9.2; default: 10). > +# > # @tls-creds: ID of the TLS credentials object (since 2.6). > # > # @tls-authz: ID of the QAuthZ authorization object used to validate > @@ -34,6 +38,7 @@ > ## > { 'struct': 'NbdServerOptions', > 'data': { 'addr': 'SocketAddress', > + '*handshake-max-secs': 'uint32', > '*tls-creds': 'str', > '*tls-authz': 'str', > '*max-connections': 'uint32' } } > @@ -52,6 +57,10 @@ > # > # @addr: Address on which to listen. > # > +# @handshake-max-secs: Time limit, in seconds, at which a client that > +# has not completed the negotiation handshake will be disconnected, > +# or 0 for no limit (since 9.2; default: 10). > +# > # @tls-creds: ID of the TLS credentials object (since 2.6). > # > # @tls-authz: ID of the QAuthZ authorization object used to validate > @@ -72,6 +81,7 @@ > ## > { 'command': 'nbd-server-start', > 'data': { 'addr': 'SocketAddressLegacy', > + '*handshake-max-secs': 'uint32', > '*tls-creds': 'str', > '*tls-authz': 'str', > '*max-connections': 'uint32' }, Hmm, can we make common base for these two structures, to avoid adding things always in two places? At some point would be good to somehow deprecate old syntax and finally remove it. SocketAddressLegacy is marked as deprecated in comment in qapi/sockets.json, but no word in deprecated.rst, and I'm unsure how is it possible to deprecate this.. May be, the only way is introducing new command, and deprecate nbd-server-start altogether. Aha, that should happen when add a possibility to start multiple nbd servers. -- Best regards, Vladimir ^ permalink raw reply [flat|nested] 16+ messages in thread
* Re: [PATCH 2/2] nbd/server: Allow users to adjust handshake limit in QMP 2024-08-09 16:14 ` [PATCH 2/2] nbd/server: Allow users to adjust handshake limit in QMP Eric Blake 2024-10-02 13:18 ` Vladimir Sementsov-Ogievskiy @ 2024-10-02 13:49 ` Markus Armbruster 2024-10-02 13:58 ` Vladimir Sementsov-Ogievskiy 1 sibling, 1 reply; 16+ messages in thread From: Markus Armbruster @ 2024-10-02 13:49 UTC (permalink / raw) To: Eric Blake Cc: qemu-devel, kwolf, hreitz, berrange, qemu-block, den, andrey.drobyshev, alexander.ivanov, vsementsov Eric Blake <eblake@redhat.com> writes: > Although defaulting the handshake limit to 10 seconds was a nice QoI > change to weed out intentionally slow clients, it can interfere with > integration testing done with manual NBD_OPT commands over 'nbdsh > --opt-mode'. Expose a QMP knob 'handshake-max-secs' to allow the user > to alter the timeout away from the default. > > The parameter name here intentionally matches the spelling of the > constant added in commit fb1c2aaa98, and not the command-line spelling > added in the previous patch for qemu-nbd; that's because in QMP, > longer names serve as good self-documentation, and unlike the command > line, machines don't have problems generating longer spellings. > > Signed-off-by: Eric Blake <eblake@redhat.com> > --- > qapi/block-export.json | 10 ++++++++++ > include/block/nbd.h | 6 +++--- > block/monitor/block-hmp-cmds.c | 4 ++-- > blockdev-nbd.c | 26 ++++++++++++++++++-------- > 4 files changed, 33 insertions(+), 13 deletions(-) > > diff --git a/qapi/block-export.json b/qapi/block-export.json > index ce33fe378df..c110dd375ad 100644 > --- a/qapi/block-export.json > +++ b/qapi/block-export.json > @@ -17,6 +17,10 @@ > # > # @addr: Address on which to listen. > # > +# @handshake-max-secs: Time limit, in seconds, at which a client that > +# has not completed the negotiation handshake will be disconnected, > +# or 0 for no limit (since 9.2; default: 10). > +# > # @tls-creds: ID of the TLS credentials object (since 2.6). > # > # @tls-authz: ID of the QAuthZ authorization object used to validate > @@ -34,6 +38,7 @@ > ## > { 'struct': 'NbdServerOptions', > 'data': { 'addr': 'SocketAddress', > + '*handshake-max-secs': 'uint32', > '*tls-creds': 'str', > '*tls-authz': 'str', > '*max-connections': 'uint32' } } > @@ -52,6 +57,10 @@ > # > # @addr: Address on which to listen. > # > +# @handshake-max-secs: Time limit, in seconds, at which a client that > +# has not completed the negotiation handshake will be disconnected, > +# or 0 for no limit (since 9.2; default: 10). > +# > # @tls-creds: ID of the TLS credentials object (since 2.6). > # > # @tls-authz: ID of the QAuthZ authorization object used to validate > @@ -72,6 +81,7 @@ > ## > { 'command': 'nbd-server-start', > 'data': { 'addr': 'SocketAddressLegacy', > + '*handshake-max-secs': 'uint32', > '*tls-creds': 'str', > '*tls-authz': 'str', > '*max-connections': 'uint32' }, Are we confident we'll never need less than a full second? [...] ^ permalink raw reply [flat|nested] 16+ messages in thread
* Re: [PATCH 2/2] nbd/server: Allow users to adjust handshake limit in QMP 2024-10-02 13:49 ` Markus Armbruster @ 2024-10-02 13:58 ` Vladimir Sementsov-Ogievskiy 2024-10-02 15:14 ` Markus Armbruster 0 siblings, 1 reply; 16+ messages in thread From: Vladimir Sementsov-Ogievskiy @ 2024-10-02 13:58 UTC (permalink / raw) To: Markus Armbruster, Eric Blake Cc: qemu-devel, kwolf, hreitz, berrange, qemu-block, den, andrey.drobyshev, alexander.ivanov On 02.10.24 16:49, Markus Armbruster wrote: > Eric Blake <eblake@redhat.com> writes: > >> Although defaulting the handshake limit to 10 seconds was a nice QoI >> change to weed out intentionally slow clients, it can interfere with >> integration testing done with manual NBD_OPT commands over 'nbdsh >> --opt-mode'. Expose a QMP knob 'handshake-max-secs' to allow the user >> to alter the timeout away from the default. >> >> The parameter name here intentionally matches the spelling of the >> constant added in commit fb1c2aaa98, and not the command-line spelling >> added in the previous patch for qemu-nbd; that's because in QMP, >> longer names serve as good self-documentation, and unlike the command >> line, machines don't have problems generating longer spellings. >> >> Signed-off-by: Eric Blake <eblake@redhat.com> >> --- >> qapi/block-export.json | 10 ++++++++++ >> include/block/nbd.h | 6 +++--- >> block/monitor/block-hmp-cmds.c | 4 ++-- >> blockdev-nbd.c | 26 ++++++++++++++++++-------- >> 4 files changed, 33 insertions(+), 13 deletions(-) >> >> diff --git a/qapi/block-export.json b/qapi/block-export.json >> index ce33fe378df..c110dd375ad 100644 >> --- a/qapi/block-export.json >> +++ b/qapi/block-export.json >> @@ -17,6 +17,10 @@ >> # >> # @addr: Address on which to listen. >> # >> +# @handshake-max-secs: Time limit, in seconds, at which a client that >> +# has not completed the negotiation handshake will be disconnected, >> +# or 0 for no limit (since 9.2; default: 10). >> +# >> # @tls-creds: ID of the TLS credentials object (since 2.6). >> # >> # @tls-authz: ID of the QAuthZ authorization object used to validate >> @@ -34,6 +38,7 @@ >> ## >> { 'struct': 'NbdServerOptions', >> 'data': { 'addr': 'SocketAddress', >> + '*handshake-max-secs': 'uint32', >> '*tls-creds': 'str', >> '*tls-authz': 'str', >> '*max-connections': 'uint32' } } >> @@ -52,6 +57,10 @@ >> # >> # @addr: Address on which to listen. >> # >> +# @handshake-max-secs: Time limit, in seconds, at which a client that >> +# has not completed the negotiation handshake will be disconnected, >> +# or 0 for no limit (since 9.2; default: 10). >> +# >> # @tls-creds: ID of the TLS credentials object (since 2.6). >> # >> # @tls-authz: ID of the QAuthZ authorization object used to validate >> @@ -72,6 +81,7 @@ >> ## >> { 'command': 'nbd-server-start', >> 'data': { 'addr': 'SocketAddressLegacy', >> + '*handshake-max-secs': 'uint32', >> '*tls-creds': 'str', >> '*tls-authz': 'str', >> '*max-connections': 'uint32' }, > > Are we confident we'll never need less than a full second? > Hmm, recent "[PATCH v2] chardev: introduce 'reconnect-ms' and deprecate 'reconnect'" shows that at least sometimes second is not enough precision. Maybe, using milliseconds consistently for all relatively short time intervals in QAPI would be a good rule? -- Best regards, Vladimir ^ permalink raw reply [flat|nested] 16+ messages in thread
* Re: [PATCH 2/2] nbd/server: Allow users to adjust handshake limit in QMP 2024-10-02 13:58 ` Vladimir Sementsov-Ogievskiy @ 2024-10-02 15:14 ` Markus Armbruster 2024-10-02 15:20 ` Eric Blake 0 siblings, 1 reply; 16+ messages in thread From: Markus Armbruster @ 2024-10-02 15:14 UTC (permalink / raw) To: Vladimir Sementsov-Ogievskiy Cc: Eric Blake, qemu-devel, kwolf, hreitz, berrange, qemu-block, den, andrey.drobyshev, alexander.ivanov Vladimir Sementsov-Ogievskiy <vsementsov@yandex-team.ru> writes: > On 02.10.24 16:49, Markus Armbruster wrote: >> Eric Blake <eblake@redhat.com> writes: >> >>> Although defaulting the handshake limit to 10 seconds was a nice QoI >>> change to weed out intentionally slow clients, it can interfere with >>> integration testing done with manual NBD_OPT commands over 'nbdsh >>> --opt-mode'. Expose a QMP knob 'handshake-max-secs' to allow the user >>> to alter the timeout away from the default. >>> >>> The parameter name here intentionally matches the spelling of the >>> constant added in commit fb1c2aaa98, and not the command-line spelling >>> added in the previous patch for qemu-nbd; that's because in QMP, >>> longer names serve as good self-documentation, and unlike the command >>> line, machines don't have problems generating longer spellings. >>> >>> Signed-off-by: Eric Blake <eblake@redhat.com> [...] >> Are we confident we'll never need less than a full second? > > Hmm, recent "[PATCH v2] chardev: introduce 'reconnect-ms' and deprecate 'reconnect'" shows that at least sometimes second is not enough precision. > > Maybe, using milliseconds consistently for all relatively short time intervals in QAPI would be a good rule? Ideally, we'd use a single unit for time: nanoseconds. But we missed that chance long ago, and now are stuck with a mix of seconds, milliseconds, microseconds, and nanoseconds. I think a good rule is to pick the first from this list that will surely provide all the precision we'll ever need. In this case, milliseconds should do. ^ permalink raw reply [flat|nested] 16+ messages in thread
* Re: [PATCH 2/2] nbd/server: Allow users to adjust handshake limit in QMP 2024-10-02 15:14 ` Markus Armbruster @ 2024-10-02 15:20 ` Eric Blake 0 siblings, 0 replies; 16+ messages in thread From: Eric Blake @ 2024-10-02 15:20 UTC (permalink / raw) To: Markus Armbruster Cc: Vladimir Sementsov-Ogievskiy, qemu-devel, kwolf, hreitz, berrange, qemu-block, den, andrey.drobyshev, alexander.ivanov On Wed, Oct 02, 2024 at 05:14:42PM GMT, Markus Armbruster wrote: > >> Are we confident we'll never need less than a full second? > > > > Hmm, recent "[PATCH v2] chardev: introduce 'reconnect-ms' and deprecate 'reconnect'" shows that at least sometimes second is not enough precision. > > > > Maybe, using milliseconds consistently for all relatively short time intervals in QAPI would be a good rule? > > Ideally, we'd use a single unit for time: nanoseconds. But we missed > that chance long ago, and now are stuck with a mix of seconds, > milliseconds, microseconds, and nanoseconds. > > I think a good rule is to pick the first from this list that will surely > provide all the precision we'll ever need. > > In this case, milliseconds should do. I'll use milliseconds in the next revision. -- Eric Blake, Principal Software Engineer Red Hat, Inc. Virtualization: qemu.org | libguestfs.org ^ permalink raw reply [flat|nested] 16+ messages in thread
end of thread, other threads:[~2025-02-12 14:35 UTC | newest] Thread overview: 16+ messages (download: mbox.gz follow: Atom feed -- links below jump to the message on this page -- 2025-02-03 22:26 [PATCH 0/2] nbd: Allow debugging tuning of handshake limit Eric Blake 2025-02-03 22:26 ` [PATCH 1/2] qemu-nbd: Allow users to adjust " Eric Blake 2025-02-06 7:02 ` Vladimir Sementsov-Ogievskiy 2025-02-03 22:26 ` [PATCH 2/2] nbd/server: Allow users to adjust handshake limit in QMP Eric Blake 2025-02-05 6:55 ` Markus Armbruster 2025-02-05 20:36 ` Eric Blake 2025-02-06 5:54 ` Markus Armbruster 2025-02-06 7:20 ` Vladimir Sementsov-Ogievskiy 2025-02-10 21:46 ` Eric Blake 2025-02-12 14:33 ` Vladimir Sementsov-Ogievskiy -- strict thread matches above, loose matches on Subject: below -- 2024-08-09 16:14 [PATCH for-9.2 0/2] NBD: tune handshake timeout Eric Blake 2024-08-09 16:14 ` [PATCH 2/2] nbd/server: Allow users to adjust handshake limit in QMP Eric Blake 2024-10-02 13:18 ` Vladimir Sementsov-Ogievskiy 2024-10-02 13:49 ` Markus Armbruster 2024-10-02 13:58 ` Vladimir Sementsov-Ogievskiy 2024-10-02 15:14 ` Markus Armbruster 2024-10-02 15:20 ` Eric Blake
This is a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inbox; as well as URLs for NNTP newsgroup(s).