[libvirt] [PATCH] Fix tracking of RPC messages wrt streams
Guannan Ren
gren at redhat.com
Thu Sep 1 07:10:39 UTC 2011
On 09/01/2011 12:48 AM, Daniel P. Berrange wrote:
> From: "Daniel P. Berrange"<berrange at redhat.com>
>
> 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 | 2 +-
> daemon/stream.c | 10 +++++-----
> src/rpc/virnetclientprogram.c | 2 +-
> src/rpc/virnetclientstream.c | 4 ++--
> src/rpc/virnetmessage.c | 14 ++++++++++++--
> src/rpc/virnetmessage.h | 6 +++++-
> src/rpc/virnetserverclient.c | 12 +++++-------
> src/rpc/virnetserverprogram.c | 2 +-
> 8 files changed, 32 insertions(+), 20 deletions(-)
>
>
I tested it ,the fix resolved the problem.
More information about the libvir-list
mailing list