]> xenbits.xensource.com Git - libvirt.git/commitdiff
Process all pending I/O for a RPC client before checking EOF
authorDaniel P. Berrange <berrange@redhat.com>
Wed, 18 Jul 2012 15:50:02 +0000 (16:50 +0100)
committerDaniel P. Berrange <berrange@redhat.com>
Mon, 30 Jul 2012 11:35:08 +0000 (12:35 +0100)
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@redhat.com>
src/rpc/virnetclient.c

index aba58ec1a2a97c07cf436c6ec772b5bfc744e788..b210a72e099d246e3072c36f0fdf8b2ab2a651e1 100644 (file)
@@ -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("VIR_EVENT_HANDLE_HANGUP or "
+                  "VIR_EVENT_HANDLE_ERROR encountered");
+        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,