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

Daniel P. Berrange berrange at redhat.com
Wed Jul 18 16:32:27 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 |   15 ++++++++-------
 1 file changed, 8 insertions(+), 7 deletions(-)

diff --git a/src/rpc/virnetclient.c b/src/rpc/virnetclient.c
index 326efb2..ec82da7 100644
--- a/src/rpc/virnetclient.c
+++ b/src/rpc/virnetclient.c
@@ -1653,13 +1653,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__);
-        virNetSocketRemoveIOCallback(sock);
-        goto eof;
-    }
-
     if (events & VIR_EVENT_HANDLE_WRITABLE) {
         if (virNetClientIOHandleOutput(client) < 0) {
             virNetSocketRemoveIOCallback(sock);
@@ -1674,6 +1667,13 @@ void virNetClientIncomingEvent(virNetSocketPtr sock,
         }
     }
 
+    if (events & (VIR_EVENT_HANDLE_HANGUP | VIR_EVENT_HANDLE_ERROR)) {
+        VIR_DEBUG("%s : VIR_EVENT_HANDLE_HANGUP or "
+                  "VIR_EVENT_HANDLE_ERROR encountered", __FUNCTION__);
+        virNetSocketRemoveIOCallback(sock);
+        goto eof;
+    }
+
     /* Remove completed calls or signal their threads. */
     virNetClientCallRemovePredicate(&client->waitDispatch,
                                     virNetClientIOEventLoopRemoveDone,
@@ -1687,6 +1687,7 @@ done:
 
 eof:
     if (client->eofCb) {
+        VIR_DEBUG("EOF %p %d", sock, events);
         virNetClientEOFCallback eofCb = client->eofCb;
         void *eofOpaque = client->eofOpaque;
         virNetClientUnlock(client);
-- 
1.7.10.4




More information about the libvir-list mailing list