[libvirt] [PATCH v3 3/9] rpc: set listen backlog on FDs as well as on other sockets
Daniel P. Berrange
berrange at redhat.com
Wed Aug 13 15:11:17 UTC 2014
On Wed, Aug 13, 2014 at 05:05:26PM +0200, Martin Kletzander wrote:
> On Wed, Aug 13, 2014 at 03:54:02PM +0100, Daniel P. Berrange wrote:
> >On Wed, Jul 23, 2014 at 04:27:07PM +0200, Martin Kletzander wrote:
> >>Signed-off-by: Martin Kletzander <mkletzan at redhat.com>
> >>---
> >> src/locking/lock_daemon.c | 2 +-
> >> src/rpc/virnetserverservice.c | 5 +++++
> >> src/rpc/virnetserverservice.h | 1 +
> >> 3 files changed, 7 insertions(+), 1 deletion(-)
> >>
> >>diff --git a/src/locking/lock_daemon.c b/src/locking/lock_daemon.c
> >>index e9219d5..02d77e3 100644
> >>--- a/src/locking/lock_daemon.c
> >>+++ b/src/locking/lock_daemon.c
> >>@@ -614,7 +614,7 @@ virLockDaemonSetupNetworkingSystemD(virNetServerPtr srv)
> >> #if WITH_GNUTLS
> >> NULL,
> >> #endif
> >>- false, 1)))
> >>+ false, 0, 1)))
> >> return -1;
> >>
> >> if (virNetServerAddService(srv, svc, NULL) < 0) {
> >>diff --git a/src/rpc/virnetserverservice.c b/src/rpc/virnetserverservice.c
> >>index e85889b..fea05c3 100644
> >>--- a/src/rpc/virnetserverservice.c
> >>+++ b/src/rpc/virnetserverservice.c
> >>@@ -133,6 +133,7 @@ virNetServerServiceNewFDOrUNIX(const char *path,
> >> tls,
> >> #endif
> >> readonly,
> >>+ max_queued_clients,
> >> nrequests_client_max);
> >> }
> >> }
> >>@@ -265,6 +266,7 @@ virNetServerServicePtr virNetServerServiceNewFD(int fd,
> >> virNetTLSContextPtr tls,
> >> #endif
> >> bool readonly,
> >>+ size_t max_queued_clients,
> >> size_t nrequests_client_max)
> >> {
> >> virNetServerServicePtr svc;
> >>@@ -292,6 +294,9 @@ virNetServerServicePtr virNetServerServiceNewFD(int fd,
> >> goto error;
> >>
> >> for (i = 0; i < svc->nsocks; i++) {
> >>+ if (virNetSocketListen(svc->socks[i], max_queued_clients) < 0)
> >>+ goto error;
> >
> >Hmm, systemd should have already called listen() on the socket FD it
> >passes to us. I wonder if it is better than we do the same when
> >auto-spawning libvirtd passing it a listening socket. You kind of
> >need to listen() to avoid a race condition I believe when spawning
> >libvirtd twice. eg if libvirt.so calls listen() and it fails then
> >we know there's another libvirtd in the process of being started
> >on that socket, so we can go back to trying to connect() until it
> >succeeeds.
> >
>
> Yes, it does, but we call listen() here to adjust the backlog value.
> It still works, no clients get disconnected, but kernel knows what
> backlog we want from now on. Because of this and other settings that
> must be done by systemd (or virsh), there is a new comment in the
> configuration file saying that systemd should be set the same way
> libvirt is (socket permissions, backlog, etc.)
ACK, and it was actually 'bind' I was getting confused with which
fails if already previously invoked.
Regards,
Daniel
--
|: http://berrange.com -o- http://www.flickr.com/photos/dberrange/ :|
|: http://libvirt.org -o- http://virt-manager.org :|
|: http://autobuild.org -o- http://search.cpan.org/~danberr/ :|
|: http://entangle-photo.org -o- http://live.gnome.org/gtk-vnc :|
More information about the libvir-list
mailing list