[libvirt] [PATCH v2] stream: Check for stream EOF

Daniel P. Berrange berrange at redhat.com
Thu Jan 12 10:13:40 UTC 2012


On Thu, Jan 12, 2012 at 09:54:15AM +0100, Michal Privoznik wrote:
> If client stream does not have any data to sink and neither received
> EOF, a dummy packet is sent to the daemon signalising client is ready to
> sink some data. However, after we added event loop to client a race may
> occur:
> 
> Thread 1 calls virNetClientStreamRecvPacket and since no data are cached
> nor stream has EOF, it decides to send dummy packet to server which will
> sent some data in turn. However, during this decision and actual message
> exchange with server -
> 
> Thread 2 receives last stream data from server. Therefore an EOF is set
> on stream and if there is a call waiting (which is not yet) it is woken
> up. However, Thread 1 haven't sent anything so far, so there is no call
> to be woken up. So this thread sent dummy packet to daemon, which
> ignores that as no stream is associated with such packet and therefore
> no reply will ever come.
> 
> This race causes client to hang indefinitely.
> ---
> diff to v1:
> -moved client locking one level higher
> -checking for stream EOF one level higher too
> 
>  src/rpc/virnetclient.c       |   51 +++++++++++++++++++++++++++++++++++++-----
>  src/rpc/virnetclient.h       |    3 ++
>  src/rpc/virnetclientstream.c |    7 +++++-
>  src/rpc/virnetclientstream.h |    2 +
>  4 files changed, 56 insertions(+), 7 deletions(-)

ACK


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