[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