[libvirt] [PATCH 3/3] Fix release of filtered stream messages

Daniel P. Berrange berrange at redhat.com
Thu Jun 30 11:29:51 UTC 2011


The stream code was reusing a stream message object before
it was removed from the linked list of filtered messages.
This caused any later queued messages to be completely lost.

* daemon/stream.c: Delay reuse of stream message until
  after it is removed from the queue
---
 daemon/stream.c |   20 ++++++++++++++++----
 1 files changed, 16 insertions(+), 4 deletions(-)

diff --git a/daemon/stream.c b/daemon/stream.c
index e4fcf90..685cee2 100644
--- a/daemon/stream.c
+++ b/daemon/stream.c
@@ -456,10 +456,6 @@ daemonStreamHandleWriteData(virNetServerClientPtr client,
         /* Partial write, so indicate we have more todo later */
         if (msg->bufferOffset < msg->bufferLength)
             return 1;
-
-        /* A dummy 'send' just to free up 'msg' object */
-        memset(msg, 0, sizeof(*msg));
-        return virNetServerClientSendMessage(client, msg);
     } else if (ret == -2) {
         /* Blocking, so indicate we have more todo later */
         return 1;
@@ -603,6 +599,22 @@ daemonStreamHandleWrite(virNetServerClientPtr client,
             virNetServerClientMarkClose(client);
             return -1;
         }
+
+        /* 'CONTINUE' messages don't send a reply (unless error
+         * occurred), so to release the 'msg' object we need to
+         * send a fake zero-length reply. Nothing actually gets
+         * onto the wire, but this causes the client to reset
+         * its active request count / throttling
+         */
+        if (msg->header.status == VIR_NET_CONTINUE) {
+            memset(msg, 0, sizeof(*msg));
+            msg->header.type = VIR_NET_REPLY;
+            if (virNetServerClientSendMessage(client, msg) < 0) {
+                virNetMessageFree(msg);
+                virNetServerClientMarkClose(client);
+                return -1;
+            }
+        }
     }
 
     return 0;
-- 
1.7.4.4




More information about the libvir-list mailing list