[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: RFC: towards systemd socket activation in q-s-d
From: |
Richard W.M. Jones |
Subject: |
Re: RFC: towards systemd socket activation in q-s-d |
Date: |
Sat, 28 Jan 2023 07:49:35 +0000 |
User-agent: |
Mutt/1.5.21 (2010-09-15) |
On Fri, Jan 27, 2023 at 03:26:15PM -0600, Eric Blake wrote:
> In https://bugzilla.redhat.com/show_bug.cgi?id=2055229, the question
> was raised on how to make qemu-storage-daemon sufficiently powerful to
> be a full-blown replacement to qemu-nbd. One of the features still
> lacking is the ability to do systemd socket activation (qemu-nbd does
> this, qemu-storage-daemon needs a way to do it).
>
> But that bug further noted that systemd supports LISTEN_FDNAMES to
> supply names to a passed-in fd (right now, qemu-nbd does not use
> names, but merely expects one fd in LISTEN_FDS). Dan had the idea
> that it would be nice to write a systemd file that passes in a socket
> name for a QMP socket, as in:
>
> [Socket]
> ListenStream=/var/run/myapp/qsd.qmp
> FileDescriptorName=qmp
> Service=myapp-qsd.service
>
> and further notes that QAPI SocketAddressType supports @fd which is a
> name in QMP (a previously-added fd passed through the older 'getfd'
> command, rather than the newer 'add-fd' command), but an integer on
> the command line. With LISTEN_FDNAMES, we could mix systemd socket
> activation with named fds for any command line usage that already
> supports SocketAddressType (not limited to just q-s-d usage).
I couldn't find a good description of LISTEN_FDNAMES anywhere, and we
don't use it in libnbd / nbdkit / qemu-nbd right now. So here's my
interpretation of what this environment variable means ...
Currently systemd socket activation in qemu-nbd or nbdkit uses only
LISTEN_PID and LISTEN_FDS, usually with a single fd being passed.
(I'll ignore LISTEN_PID.) So:
LISTEN_FDS=1
fd 3 --> NBD socket
This works because there's only one NBD protocol, it doesn't need to
be named.
However if we imagine that a superserver wants to run a webserver, it
might need to pass two sockets carrying distinct protocols (HTTP and
HTTPS). In this case it would use:
LISTEN_FDS=2
fd 3 --> HTTP socket
fd 4 --> HTTPS socket
LISTEN_FDNAMES=http:https
LISTEN_FDNAMES is telling the webserver that the first socket is HTTP
and the second is HTTPS, so it knows which protocol to negotiate on
each socket.
I believe what you're saying above is that you'd like to have the
ability to pass multiple sockets to q-s-d carrying distinct protocols,
with the obvious ones being NBD + QMP (although other combinations
could be possible, eg. NBD + vhost + QMP?):
LISTEN_FDS=2
fd 3 --> NBD socket
fd 4 --> QMP socket
LISTEN_FDNAMES=nbd:qmp
If my understanding is correct, then this makes sense. We might also
modify libnbd to pass LISTEN_FDNAMES=nbd in:
https://gitlab.com/nbdkit/libnbd/-/blob/master/generator/states-connect-socket-activation.c
(Current servers would ignore the new environment variable.)
> I'm at a point where I can take a shot at implementing this, but want
> some feedback on whether it is better to try to shoehorn a generic
> solution into the existing @fd member of the SocketAddressType union,
> or whether it would be better to add yet another union member
> @systemd-fd or some similar name to make it explicit when a command
> line parameter wants to refer to an fd being passed through systemd
> socket activation LISTEN_FDS and friends.
It sounds like the q-s-d command lines will be even more convoluted
and inelegant than before.
That's fine, but please keep qemu-nbd around as a sane alternative.
It might in the end just be a wrapper that translates the command line
to q-s-d. I don't believe it's ever going to be possible or desirable
to deprecate or remove qemu-nbd.
Rich.
--
Richard Jones, Virtualization Group, Red Hat http://people.redhat.com/~rjones
Read my programming and virtualization blog: http://rwmj.wordpress.com
virt-builder quickly builds VMs from scratch
http://libguestfs.org/virt-builder.1.html