[libvirt] [PATCH v2] stream: Check for stream EOF
Michal Privoznik
mprivozn at redhat.com
Thu Jan 12 11:11:55 UTC 2012
On 12.01.2012 11:13, Daniel P. Berrange wrote:
> 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
Thanks, pushed.
Michal
More information about the libvir-list
mailing list