[libvirt] [PATCH 01/11] Process all pending I/O for a RPC client before checking EOF

Daniel P. Berrange berrange at redhat.com
Tue Jul 24 13:22:43 UTC 2012


From: "Daniel P. Berrange" <berrange at redhat.com>

In the socket event handler for the RPC client we must deal
with read/write events, before checking for EOF, otherwise
we might close the socket before we've read & acted upon the
last RPC messages

Signed-off-by: Daniel P. Berrange <berrange at redhat.com>
---
 src/rpc/virnetclient.c |   20 ++++++++++----------
 1 file changed, 10 insertions(+), 10 deletions(-)

diff --git a/src/rpc/virnetclient.c b/src/rpc/virnetclient.c
index aba58ec..f5d8189 100644
--- a/src/rpc/virnetclient.c
+++ b/src/rpc/virnetclient.c
@@ -1694,16 +1694,6 @@ void virNetClientIncomingEvent(virNetSocketPtr sock,
 
     VIR_DEBUG("Event fired %p %d", sock, events);
 
-    if (events & (VIR_EVENT_HANDLE_HANGUP | VIR_EVENT_HANDLE_ERROR)) {
-        VIR_DEBUG("%s : VIR_EVENT_HANDLE_HANGUP or "
-                  "VIR_EVENT_HANDLE_ERROR encountered", __FUNCTION__);
-        virNetClientMarkClose(client,
-                              (events & VIR_EVENT_HANDLE_HANGUP) ?
-                              VIR_CONNECT_CLOSE_REASON_EOF :
-                              VIR_CONNECT_CLOSE_REASON_ERROR);
-        goto done;
-    }
-
     if (events & VIR_EVENT_HANDLE_WRITABLE) {
         if (virNetClientIOHandleOutput(client) < 0)
             virNetClientMarkClose(client, VIR_CONNECT_CLOSE_REASON_ERROR);
@@ -1714,6 +1704,16 @@ void virNetClientIncomingEvent(virNetSocketPtr sock,
             virNetClientMarkClose(client, VIR_CONNECT_CLOSE_REASON_ERROR);
     }
 
+    if (events & (VIR_EVENT_HANDLE_HANGUP | VIR_EVENT_HANDLE_ERROR)) {
+        VIR_DEBUG("%s : VIR_EVENT_HANDLE_HANGUP or "
+                  "VIR_EVENT_HANDLE_ERROR encountered", __FUNCTION__);
+        virNetClientMarkClose(client,
+                              (events & VIR_EVENT_HANDLE_HANGUP) ?
+                              VIR_CONNECT_CLOSE_REASON_EOF :
+                              VIR_CONNECT_CLOSE_REASON_ERROR);
+        goto done;
+    }
+
     /* Remove completed calls or signal their threads. */
     virNetClientCallRemovePredicate(&client->waitDispatch,
                                     virNetClientIOEventLoopRemoveDone,
-- 
1.7.10.4




More information about the libvir-list mailing list