From b536e193a2fcaea0e2a48c4288dda64a10c97376 Mon Sep 17 00:00:00 2001 From: "Daniel P. Berrange" Date: Wed, 18 Jul 2012 16:50:02 +0100 Subject: [PATCH] Process all pending I/O for a RPC client before checking EOF 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 --- 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 aba58ec1a2..b210a72e09 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("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,