On Thu, Aug 25, 2011 at 10:07:36PM +0800, Guannan Ren wrote:
The value of nrequests should always be zero or positive
but in the case of stream, when error occurrs, it could be negative
and makes the client socket fd neither writable nor readable. The
case will lead to hang on libvirt client side.
This patch aim to fix the problem.
What is the scenario you use to demonstrate the original problem ?
IMHO the fix below is not right, because it is merely patching
up the problems caused by the bug, rather than actually fixing
the bug.
---
src/rpc/virnetserverclient.c | 8 ++++++--
1 files changed, 6 insertions(+), 2 deletions(-)
diff --git a/src/rpc/virnetserverclient.c b/src/rpc/virnetserverclient.c
index a73b06d..882ba77 100644
--- a/src/rpc/virnetserverclient.c
+++ b/src/rpc/virnetserverclient.c
@@ -78,8 +78,8 @@ struct _virNetServerClient
* ie RPC calls in progress. Does not count
* async events which are not used for
* throttling calculations */
- size_t nrequests;
- size_t nrequests_max;
+ ssize_t nrequests;
+ ssize_t nrequests_max;
/* Zero or one messages being received. Zero if
* nrequests >= max_clients and throttling */
virNetMessagePtr rx;
@@ -889,6 +889,10 @@ virNetServerClientDispatchWrite(virNetServerClientPtr client)
(msg->header.type == VIR_NET_STREAM &&
msg->header.status != VIR_NET_CONTINUE)) {
client->nrequests--;
+
+ if (client->nrequests < 0)
+ client->nrequests = 0;
+
/* See if the recv queue is currently throttled */
if (!client->rx &&
client->nrequests < client->nrequests_max) {
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 :|