]> git.ipfire.org Git - thirdparty/libvirt.git/commit
Fix tracking of RPC messages wrt streams
authorDaniel P. Berrange <berrange@redhat.com>
Wed, 31 Aug 2011 16:42:58 +0000 (17:42 +0100)
committerDaniel P. Berrange <berrange@redhat.com>
Thu, 1 Sep 2011 09:52:35 +0000 (10:52 +0100)
commitb3fb288e52b7d0a0e58ab0e0bcac970436832d04
tree4fad167ba8e586bec696f880818c1d5ac733f8f4
parent1b72ad2eaa0c84b2cd56c9e86e614f79a643a0b3
Fix tracking of RPC messages wrt streams

Commit 2c85644b0b51fbe5b6244e6773531af29933a727 attempted to
fix a problem with tracking RPC messages from streams by doing

-            if (msg->header.type == VIR_NET_REPLY) {
+            if (msg->header.type == VIR_NET_REPLY ||
+                (msg->header.type == VIR_NET_STREAM &&
+                 msg->header.status != VIR_NET_CONTINUE)) {
                 client->nrequests--;

In other words any stream packet, with status NET_OK or NET_ERROR
would cause nrequests to be decremented. This is great if the
packet from from a synchronous virStreamFinish or virStreamAbort
API call, but wildly wrong if from a server initiated abort.
The latter resulted in 'nrequests' being decremented below zero.
This then causes all I/O for that client to be stopped.

Instead of trying to infer whether we need to decrement the
nrequests field, from the message type/status, introduce an
explicit 'bool tracked' field to mark whether the virNetMessagePtr
object is subject to tracking.

Also add a virNetMessageClear function to allow a message
contents to be cleared out, without adversely impacting the
'tracked' field as a naive memset() would do

* src/rpc/virnetmessage.c, src/rpc/virnetmessage.h: Add
  a 'bool tracked' field and virNetMessageClear() API
* daemon/remote.c, daemon/stream.c, src/rpc/virnetclientprogram.c,
  src/rpc/virnetclientstream.c, src/rpc/virnetserverclient.c,
  src/rpc/virnetserverprogram.c: Switch over to use
  virNetMessageClear() and pass in the 'bool tracked' value
  when creating messages.
daemon/remote.c
daemon/stream.c
src/rpc/virnetclientprogram.c
src/rpc/virnetclientstream.c
src/rpc/virnetmessage.c
src/rpc/virnetmessage.h
src/rpc/virnetserverclient.c
src/rpc/virnetserverprogram.c