All of lore.kernel.org
 help / color / mirror / Atom feed
* [Qemu-devel] Multiple QMP socket clients
@ 2016-10-11 10:26 Samuel Ortiz
  2016-10-11 13:11 ` Daniel P. Berrange
  0 siblings, 1 reply; 6+ messages in thread
From: Samuel Ortiz @ 2016-10-11 10:26 UTC (permalink / raw)
  To: qemu-devel

Hi,

On a qemu instance started with a qmp unix socket:

-qmp unix:/tmp/ctrl.sock,server,nowait

I am trying to have multiple clients working on that socket but
although the qmp server seems to accept the connections, only the first
connected client gets his request processed. The next client requests
will just hang until the first one exits.

Is that an intended behaviour ?

Thanks in advance for your answers.

Cheers,
Samuel.

^ permalink raw reply	[flat|nested] 6+ messages in thread

* Re: [Qemu-devel] Multiple QMP socket clients
  2016-10-11 10:26 [Qemu-devel] Multiple QMP socket clients Samuel Ortiz
@ 2016-10-11 13:11 ` Daniel P. Berrange
  2016-10-11 14:08   ` Dr. David Alan Gilbert
  0 siblings, 1 reply; 6+ messages in thread
From: Daniel P. Berrange @ 2016-10-11 13:11 UTC (permalink / raw)
  To: Samuel Ortiz; +Cc: qemu-devel

On Tue, Oct 11, 2016 at 12:26:37PM +0200, Samuel Ortiz wrote:
> Hi,
> 
> On a qemu instance started with a qmp unix socket:
> 
> -qmp unix:/tmp/ctrl.sock,server,nowait
> 
> I am trying to have multiple clients working on that socket but
> although the qmp server seems to accept the connections, only the first
> connected client gets his request processed. The next client requests
> will just hang until the first one exits.
> 
> Is that an intended behaviour ?

Yes, the character device code is designed around the idea of a single
endpoint.

In the case of the monitor you could work around it by adding multiple
-qmp arguemnts, each with different socket. Of course you have to make
sure each client doesn't trample on the other client when doing this.


Regards,
Daniel
-- 
|: http://berrange.com      -o-    http://www.flickr.com/photos/dberrange/ :|
|: http://libvirt.org              -o-             http://virt-manager.org :|
|: http://entangle-photo.org       -o-    http://search.cpan.org/~danberr/ :|

^ permalink raw reply	[flat|nested] 6+ messages in thread

* Re: [Qemu-devel] Multiple QMP socket clients
  2016-10-11 13:11 ` Daniel P. Berrange
@ 2016-10-11 14:08   ` Dr. David Alan Gilbert
  2016-10-11 14:17     ` Daniel P. Berrange
  0 siblings, 1 reply; 6+ messages in thread
From: Dr. David Alan Gilbert @ 2016-10-11 14:08 UTC (permalink / raw)
  To: Daniel P. Berrange; +Cc: Samuel Ortiz, qemu-devel

* Daniel P. Berrange (berrange@redhat.com) wrote:
> On Tue, Oct 11, 2016 at 12:26:37PM +0200, Samuel Ortiz wrote:
> > Hi,
> > 
> > On a qemu instance started with a qmp unix socket:
> > 
> > -qmp unix:/tmp/ctrl.sock,server,nowait
> > 
> > I am trying to have multiple clients working on that socket but
> > although the qmp server seems to accept the connections, only the first
> > connected client gets his request processed. The next client requests
> > will just hang until the first one exits.
> > 
> > Is that an intended behaviour ?
> 
> Yes, the character device code is designed around the idea of a single
> endpoint.
> 
> In the case of the monitor you could work around it by adding multiple
> -qmp arguemnts, each with different socket. Of course you have to make
> sure each client doesn't trample on the other client when doing this.

But why does it accept the connection?
I thought you could say only accept a single connection on a socket.
(The backlog parameter to listen(2) but I can't find out listen.)

Dave

> 
> 
> Regards,
> Daniel
> -- 
> |: http://berrange.com      -o-    http://www.flickr.com/photos/dberrange/ :|
> |: http://libvirt.org              -o-             http://virt-manager.org :|
> |: http://entangle-photo.org       -o-    http://search.cpan.org/~danberr/ :|
> 
--
Dr. David Alan Gilbert / dgilbert@redhat.com / Manchester, UK

^ permalink raw reply	[flat|nested] 6+ messages in thread

* Re: [Qemu-devel] Multiple QMP socket clients
  2016-10-11 14:08   ` Dr. David Alan Gilbert
@ 2016-10-11 14:17     ` Daniel P. Berrange
  2016-10-11 14:26       ` Daniel P. Berrange
  0 siblings, 1 reply; 6+ messages in thread
From: Daniel P. Berrange @ 2016-10-11 14:17 UTC (permalink / raw)
  To: Dr. David Alan Gilbert; +Cc: Samuel Ortiz, qemu-devel

On Tue, Oct 11, 2016 at 03:08:34PM +0100, Dr. David Alan Gilbert wrote:
> * Daniel P. Berrange (berrange@redhat.com) wrote:
> > On Tue, Oct 11, 2016 at 12:26:37PM +0200, Samuel Ortiz wrote:
> > > Hi,
> > > 
> > > On a qemu instance started with a qmp unix socket:
> > > 
> > > -qmp unix:/tmp/ctrl.sock,server,nowait
> > > 
> > > I am trying to have multiple clients working on that socket but
> > > although the qmp server seems to accept the connections, only the first
> > > connected client gets his request processed. The next client requests
> > > will just hang until the first one exits.
> > > 
> > > Is that an intended behaviour ?
> > 
> > Yes, the character device code is designed around the idea of a single
> > endpoint.
> > 
> > In the case of the monitor you could work around it by adding multiple
> > -qmp arguemnts, each with different socket. Of course you have to make
> > sure each client doesn't trample on the other client when doing this.
> 
> But why does it accept the connection?
> I thought you could say only accept a single connection on a socket.
> (The backlog parameter to listen(2) but I can't find out listen.)

QEMU won't accept the connection, as while it is still listen()ing on
the socket, it is not poll()ing for incoming clients, so will never
trigger accept(). The kernel will queue the incoming connection until
QEMU starts polling for clients again. From the client POV this is
indistinguishable from QEMU accepting the client, but not processing
I/O on it.

Regards,
Daniel
-- 
|: http://berrange.com      -o-    http://www.flickr.com/photos/dberrange/ :|
|: http://libvirt.org              -o-             http://virt-manager.org :|
|: http://entangle-photo.org       -o-    http://search.cpan.org/~danberr/ :|

^ permalink raw reply	[flat|nested] 6+ messages in thread

* Re: [Qemu-devel] Multiple QMP socket clients
  2016-10-11 14:17     ` Daniel P. Berrange
@ 2016-10-11 14:26       ` Daniel P. Berrange
  2016-10-11 15:12         ` Dr. David Alan Gilbert
  0 siblings, 1 reply; 6+ messages in thread
From: Daniel P. Berrange @ 2016-10-11 14:26 UTC (permalink / raw)
  To: Dr. David Alan Gilbert; +Cc: Samuel Ortiz, qemu-devel

On Tue, Oct 11, 2016 at 03:17:04PM +0100, Daniel P. Berrange wrote:
> On Tue, Oct 11, 2016 at 03:08:34PM +0100, Dr. David Alan Gilbert wrote:
> > * Daniel P. Berrange (berrange@redhat.com) wrote:
> > > On Tue, Oct 11, 2016 at 12:26:37PM +0200, Samuel Ortiz wrote:
> > > > Hi,
> > > > 
> > > > On a qemu instance started with a qmp unix socket:
> > > > 
> > > > -qmp unix:/tmp/ctrl.sock,server,nowait
> > > > 
> > > > I am trying to have multiple clients working on that socket but
> > > > although the qmp server seems to accept the connections, only the first
> > > > connected client gets his request processed. The next client requests
> > > > will just hang until the first one exits.
> > > > 
> > > > Is that an intended behaviour ?
> > > 
> > > Yes, the character device code is designed around the idea of a single
> > > endpoint.
> > > 
> > > In the case of the monitor you could work around it by adding multiple
> > > -qmp arguemnts, each with different socket. Of course you have to make
> > > sure each client doesn't trample on the other client when doing this.
> > 
> > But why does it accept the connection?
> > I thought you could say only accept a single connection on a socket.
> > (The backlog parameter to listen(2) but I can't find out listen.)
> 
> QEMU won't accept the connection, as while it is still listen()ing on
> the socket, it is not poll()ing for incoming clients, so will never
> trigger accept(). The kernel will queue the incoming connection until
> QEMU starts polling for clients again. From the client POV this is
> indistinguishable from QEMU accepting the client, but not processing
> I/O on it.

Oh, and the backlog parameter to listen() is fairly useless - it won't
stop new clients getting into an established socket state

   https://veithen.github.io/2014/01/01/how-tcp-backlog-works-in-linux.html

QEMU could just accept() all incoming connections and explicitly close
them if something is already connected, but this just burns CPU really.

Regards,
Daniel
-- 
|: http://berrange.com      -o-    http://www.flickr.com/photos/dberrange/ :|
|: http://libvirt.org              -o-             http://virt-manager.org :|
|: http://entangle-photo.org       -o-    http://search.cpan.org/~danberr/ :|

^ permalink raw reply	[flat|nested] 6+ messages in thread

* Re: [Qemu-devel] Multiple QMP socket clients
  2016-10-11 14:26       ` Daniel P. Berrange
@ 2016-10-11 15:12         ` Dr. David Alan Gilbert
  0 siblings, 0 replies; 6+ messages in thread
From: Dr. David Alan Gilbert @ 2016-10-11 15:12 UTC (permalink / raw)
  To: Daniel P. Berrange; +Cc: Samuel Ortiz, qemu-devel

* Daniel P. Berrange (berrange@redhat.com) wrote:
> On Tue, Oct 11, 2016 at 03:17:04PM +0100, Daniel P. Berrange wrote:
> > On Tue, Oct 11, 2016 at 03:08:34PM +0100, Dr. David Alan Gilbert wrote:
> > > * Daniel P. Berrange (berrange@redhat.com) wrote:
> > > > On Tue, Oct 11, 2016 at 12:26:37PM +0200, Samuel Ortiz wrote:
> > > > > Hi,
> > > > > 
> > > > > On a qemu instance started with a qmp unix socket:
> > > > > 
> > > > > -qmp unix:/tmp/ctrl.sock,server,nowait
> > > > > 
> > > > > I am trying to have multiple clients working on that socket but
> > > > > although the qmp server seems to accept the connections, only the first
> > > > > connected client gets his request processed. The next client requests
> > > > > will just hang until the first one exits.
> > > > > 
> > > > > Is that an intended behaviour ?
> > > > 
> > > > Yes, the character device code is designed around the idea of a single
> > > > endpoint.
> > > > 
> > > > In the case of the monitor you could work around it by adding multiple
> > > > -qmp arguemnts, each with different socket. Of course you have to make
> > > > sure each client doesn't trample on the other client when doing this.
> > > 
> > > But why does it accept the connection?
> > > I thought you could say only accept a single connection on a socket.
> > > (The backlog parameter to listen(2) but I can't find out listen.)
> > 
> > QEMU won't accept the connection, as while it is still listen()ing on
> > the socket, it is not poll()ing for incoming clients, so will never
> > trigger accept(). The kernel will queue the incoming connection until
> > QEMU starts polling for clients again. From the client POV this is
> > indistinguishable from QEMU accepting the client, but not processing
> > I/O on it.
> 
> Oh, and the backlog parameter to listen() is fairly useless - it won't
> stop new clients getting into an established socket state
> 
>    https://veithen.github.io/2014/01/01/how-tcp-backlog-works-in-linux.html

Oh, that's annoying; ok, if that's all we can do that's fine; and I did check with
an strace and we do have a :

[pid 22661] listen(9, 1)                = 0

and I do only see a single call to accept4() even though the 2nd telnet
apparently shows it connected.

> QEMU could just accept() all incoming connections and explicitly close
> them if something is already connected, but this just burns CPU really.

It might make failures more obvious than a non-responsive socket.

Dave

> 
> Regards,
> Daniel
> -- 
> |: http://berrange.com      -o-    http://www.flickr.com/photos/dberrange/ :|
> |: http://libvirt.org              -o-             http://virt-manager.org :|
> |: http://entangle-photo.org       -o-    http://search.cpan.org/~danberr/ :|
--
Dr. David Alan Gilbert / dgilbert@redhat.com / Manchester, UK

^ permalink raw reply	[flat|nested] 6+ messages in thread

end of thread, other threads:[~2016-10-11 15:12 UTC | newest]

Thread overview: 6+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2016-10-11 10:26 [Qemu-devel] Multiple QMP socket clients Samuel Ortiz
2016-10-11 13:11 ` Daniel P. Berrange
2016-10-11 14:08   ` Dr. David Alan Gilbert
2016-10-11 14:17     ` Daniel P. Berrange
2016-10-11 14:26       ` Daniel P. Berrange
2016-10-11 15:12         ` Dr. David Alan Gilbert

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.